8#include <QtCore/QBuffer>
9#include <QtCore/QStringList>
18 const qsizetype length = string.length();
20 buffer.reserve(length + 2);
22 buffer.append(string);
24 buffer.replace(
'\\',
"\\\\").replace(
'"',
"\\\"");
26 buffer[buffer.length() - 1] =
'"';
32 return string.visit([](
auto data) {
34 return enquoteByteArray(view);
39QQmlJSStreamWriter::QQmlJSStreamWriter(QByteArray *array)
41 , m_pendingLineLength(0)
42 , m_maybeOneline(
false)
43 , m_stream(
new QBuffer(array))
45 m_stream->open(QIODevice::WriteOnly);
48void QQmlJSStreamWriter::writeStartDocument()
52void QQmlJSStreamWriter::writeEndDocument()
56void QQmlJSStreamWriter::writeLibraryImport(
57 QByteArrayView uri,
int majorVersion,
int minorVersion, QByteArrayView as)
59 m_stream->write(
"import ");
60 m_stream->write(uri.data(), uri.length());
62 m_stream->write(QByteArray::number(majorVersion));
64 m_stream->write(QByteArray::number(minorVersion));
66 m_stream->write(
" as ");
67 m_stream->write(as.data(), as.length());
69 m_stream->write(
"\n");
72void QQmlJSStreamWriter::writeStartObject(QByteArrayView component)
74 flushPotentialLinesWithNewlines();
76 m_stream->write(component.data(), component.length());
77 m_stream->write(
" {");
79 m_maybeOneline =
true;
82void QQmlJSStreamWriter::writeEndObject()
86 for (
int i = 0; i < m_pendingLines.size(); ++i) {
88 m_stream->write(m_pendingLines.at(i).trimmed());
89 if (i != m_pendingLines.size() - 1)
93 if (!m_pendingLines.isEmpty())
94 m_stream->write(
" }\n");
96 m_stream->write(
"}\n");
98 m_pendingLines.clear();
99 m_pendingLineLength = 0;
100 m_maybeOneline =
false;
102 flushPotentialLinesWithNewlines();
105 m_stream->write(
"}\n");
109void QQmlJSStreamWriter::writeScriptBinding(QByteArrayView name, QByteArrayView rhs)
112 buffer.reserve(name.length() + 2 + rhs.length());
116 writePotentialLine(buffer);
119void QQmlJSStreamWriter::writeStringBinding(QByteArrayView name, QAnyStringView value)
121 writeScriptBinding(name, enquoteAnyString(value));
124void QQmlJSStreamWriter::writeNumberBinding(QByteArrayView name, qint64 value)
126 writeScriptBinding(name, QByteArray::number(value));
129void QQmlJSStreamWriter::writeBooleanBinding(QByteArrayView name,
bool value)
131 writeScriptBinding(name, value ?
"true" :
"false");
134template<
typename String,
typename ElementHandler>
135void QQmlJSStreamWriter::doWriteArrayBinding(
136 QByteArrayView name,
const QList<String> &elements, ElementHandler &&handler)
138 flushPotentialLinesWithNewlines();
142 QByteArray singleLine(name.data(), name.length());
144 for (
int i = 0; i < elements.size(); ++i) {
146 singleLine += handler(element);
148 if (i != elements.size() - 1)
152 if (singleLine.size() + m_indentDepth * 4 < 80) {
153 m_stream->write(singleLine);
158 m_stream->write(name.data(), name.length());
159 m_stream->write(
": [\n");
161 for (
int i = 0; i < elements.size(); ++i) {
164 const auto handled = handler(element);
165 m_stream->write(handled.data(), handled.length());
167 if (i != elements.size() - 1) {
168 m_stream->write(
",\n");
170 m_stream->write(
"\n");
175 m_stream->write(
"]\n");
178void QQmlJSStreamWriter::writeArrayBinding(QByteArrayView name,
const QByteArrayList &elements)
180 doWriteArrayBinding(name, elements, [](QByteArrayView view) {
return view; });
183void QQmlJSStreamWriter::writeStringListBinding(
184 QByteArrayView name,
const QList<QAnyStringView> &elements)
186 doWriteArrayBinding(name, elements, enquoteByteArray);
189void QQmlJSStreamWriter::write(QByteArrayView data)
191 flushPotentialLinesWithNewlines();
192 m_stream->write(data.data(), data.length());
195void QQmlJSStreamWriter::writeEnumObjectLiteralBinding(
196 QByteArrayView name,
const QList<std::pair<QAnyStringView,
int> > &keyValue)
198 flushPotentialLinesWithNewlines();
200 m_stream->write(name.data(), name.length());
201 m_stream->write(
": {\n");
203 for (
int i = 0, end = keyValue.size(); i != end; ++i) {
205 const auto &entry = keyValue[i];
206 m_stream->write(enquoteAnyString(entry.first));
207 m_stream->write(
": ");
208 m_stream->write(QByteArray::number(entry.second));
210 m_stream->write(
",\n");
212 m_stream->write(
"\n");
216 m_stream->write(
"}\n");
219void QQmlJSStreamWriter::writeIndent()
221 for (
int i = 0; i < m_indentDepth; ++i)
222 m_stream->write(
" ");
225void QQmlJSStreamWriter::writePotentialLine(
const QByteArray &line)
227 m_pendingLines.append(line);
228 m_pendingLineLength += line.size();
229 if (m_pendingLineLength >= 80) {
230 flushPotentialLinesWithNewlines();
234void QQmlJSStreamWriter::flushPotentialLinesWithNewlines()
237 m_stream->write(
"\n");
238 for (
const QByteArray &line : std::as_const(m_pendingLines)) {
240 m_stream->write(line);
241 m_stream->write(
"\n");
243 m_pendingLines.clear();
244 m_pendingLineLength = 0;
245 m_maybeOneline =
false;
Combined button and popup list for selecting options.
static QT_BEGIN_NAMESPACE QByteArray enquoteByteArray(QByteArrayView string)
static QByteArray enquoteAnyString(QAnyStringView string)