7#include <QtCore/QBuffer>
8#include <QtCore/QStringList>
17 const qsizetype length = string.length();
19 buffer.reserve(length + 2);
21 buffer.append(string);
23 buffer.replace(
'\\',
"\\\\").replace(
'"',
"\\\"");
25 buffer[buffer.length() - 1] =
'"';
31 return string.visit([](
auto data) {
33 return enquoteByteArray(view);
38QQmlJSStreamWriter::QQmlJSStreamWriter(QByteArray *array)
40 , m_pendingLineLength(0)
41 , m_maybeOneline(
false)
42 , m_stream(
new QBuffer(array))
44 m_stream->open(QIODevice::WriteOnly);
47void QQmlJSStreamWriter::writeStartDocument()
51void QQmlJSStreamWriter::writeEndDocument()
55void QQmlJSStreamWriter::writeLibraryImport(
56 QByteArrayView uri,
int majorVersion,
int minorVersion, QByteArrayView as)
58 m_stream->write(
"import ");
59 m_stream->write(uri.data(), uri.length());
61 m_stream->write(QByteArray::number(majorVersion));
63 m_stream->write(QByteArray::number(minorVersion));
65 m_stream->write(
" as ");
66 m_stream->write(as.data(), as.length());
68 m_stream->write(
"\n");
71void QQmlJSStreamWriter::writeStartObject(QByteArrayView component)
73 flushPotentialLinesWithNewlines();
75 m_stream->write(component.data(), component.length());
76 m_stream->write(
" {");
78 m_maybeOneline =
true;
81void QQmlJSStreamWriter::writeEndObject()
85 for (
int i = 0; i < m_pendingLines.size(); ++i) {
87 m_stream->write(m_pendingLines.at(i).trimmed());
88 if (i != m_pendingLines.size() - 1)
92 if (!m_pendingLines.isEmpty())
93 m_stream->write(
" }\n");
95 m_stream->write(
"}\n");
97 m_pendingLines.clear();
98 m_pendingLineLength = 0;
99 m_maybeOneline =
false;
101 flushPotentialLinesWithNewlines();
104 m_stream->write(
"}\n");
108void QQmlJSStreamWriter::writeScriptBinding(QByteArrayView name, QByteArrayView rhs)
111 buffer.reserve(name.length() + 2 + rhs.length());
115 writePotentialLine(buffer);
118void QQmlJSStreamWriter::writeStringBinding(QByteArrayView name, QAnyStringView value)
120 writeScriptBinding(name, enquoteAnyString(value));
123void QQmlJSStreamWriter::writeNumberBinding(QByteArrayView name, qint64 value)
125 writeScriptBinding(name, QByteArray::number(value));
128void QQmlJSStreamWriter::writeBooleanBinding(QByteArrayView name,
bool value)
130 writeScriptBinding(name, value ?
"true" :
"false");
133template<
typename String,
typename ElementHandler>
134void QQmlJSStreamWriter::doWriteArrayBinding(
135 QByteArrayView name,
const QList<String> &elements, ElementHandler &&handler)
137 flushPotentialLinesWithNewlines();
141 QByteArray singleLine(name.data(), name.length());
143 for (
int i = 0; i < elements.size(); ++i) {
145 singleLine += handler(element);
147 if (i != elements.size() - 1)
151 if (singleLine.size() + m_indentDepth * 4 < 80) {
152 m_stream->write(singleLine);
157 m_stream->write(name.data(), name.length());
158 m_stream->write(
": [\n");
160 for (
int i = 0; i < elements.size(); ++i) {
163 const auto handled = handler(element);
164 m_stream->write(handled.data(), handled.length());
166 if (i != elements.size() - 1) {
167 m_stream->write(
",\n");
169 m_stream->write(
"\n");
174 m_stream->write(
"]\n");
177void QQmlJSStreamWriter::writeArrayBinding(QByteArrayView name,
const QByteArrayList &elements)
179 doWriteArrayBinding(name, elements, [](QByteArrayView view) {
return view; });
182void QQmlJSStreamWriter::writeStringListBinding(
183 QByteArrayView name,
const QList<QAnyStringView> &elements)
185 doWriteArrayBinding(name, elements, enquoteByteArray);
188void QQmlJSStreamWriter::write(QByteArrayView data)
190 flushPotentialLinesWithNewlines();
191 m_stream->write(data.data(), data.length());
194void QQmlJSStreamWriter::writeEnumObjectLiteralBinding(
195 QByteArrayView name,
const QList<std::pair<QAnyStringView,
int> > &keyValue)
197 flushPotentialLinesWithNewlines();
199 m_stream->write(name.data(), name.length());
200 m_stream->write(
": {\n");
202 for (
int i = 0, end = keyValue.size(); i != end; ++i) {
204 const auto &entry = keyValue[i];
205 m_stream->write(enquoteAnyString(entry.first));
206 m_stream->write(
": ");
207 m_stream->write(QByteArray::number(entry.second));
209 m_stream->write(
",\n");
211 m_stream->write(
"\n");
215 m_stream->write(
"}\n");
218void QQmlJSStreamWriter::writeIndent()
220 for (
int i = 0; i < m_indentDepth; ++i)
221 m_stream->write(
" ");
224void QQmlJSStreamWriter::writePotentialLine(
const QByteArray &line)
226 m_pendingLines.append(line);
227 m_pendingLineLength += line.size();
228 if (m_pendingLineLength >= 80) {
229 flushPotentialLinesWithNewlines();
233void QQmlJSStreamWriter::flushPotentialLinesWithNewlines()
236 m_stream->write(
"\n");
237 for (
const QByteArray &line : std::as_const(m_pendingLines)) {
239 m_stream->write(line);
240 m_stream->write(
"\n");
242 m_pendingLines.clear();
243 m_pendingLineLength = 0;
244 m_maybeOneline =
false;
static QT_BEGIN_NAMESPACE QByteArray enquoteByteArray(QByteArrayView string)
static QByteArray enquoteAnyString(QAnyStringView string)