Krita Source Code Documentation
Loading...
Searching...
No Matches
KisCosParser Class Reference

The KisCosParser class. More...

#include <kis_cos_parser.h>

Public Member Functions

QVariantHash parseCosToJson (QByteArray *ba)
 

Private Member Functions

bool parseArray (QIODevice &dev, QVariantList &array)
 
bool parseObject (QIODevice &dev, QVariantHash &object, bool checkEnd=true)
 
bool parseValue (QIODevice &dev, QVariant &val)
 

Detailed Description

The KisCosParser class.

PSD text engine data is written in PDF's Carousel Object Structure, a format not unsimilar to (might be a precursor) to JSON. JSON however doesn't differentiate between ints and doubles, so we use QVariantHash instead.

This parser tries to parse the ByteArray as a QVariantHash, though not every data type is interpreted as such:

For one, 'name' objects are interpreted as strings prepended with / Hex strings are kept inside their < and >

Code was based off qjsonparser.cpp

Definition at line 31 of file kis_cos_parser.h.

Member Function Documentation

◆ parseArray()

bool KisCosParser::parseArray ( QIODevice & dev,
QVariantList & array )
private

Definition at line 207 of file kis_cos_parser.cpp.

208{
209 eatSpace(dev);
210
211 QVariant val;
212 while (parseValue(dev, val)) {
213 array.append(val);
214 }
215 char c;
216 dev.getChar(&c);
217 if (c == EndArray) {
218 return true;
219 } else {
220 return false;
221 }
222
223 return true;
224}
bool parseValue(QIODevice &dev, QVariant &val)
void eatSpace(QIODevice &dev)
@ EndArray

References eatSpace(), EndArray, and parseValue().

◆ parseCosToJson()

QVariantHash KisCosParser::parseCosToJson ( QByteArray * ba)

Definition at line 296 of file kis_cos_parser.cpp.

297{
298 QVariant root;
299 QBuffer dev(ba);
300 if (dev.open(QIODevice::ReadOnly)) {
301
302 eatSpace(dev);
303 char c;
304 dev.peek(&c, 1);
305 if (c == BeginObject) {
306 if (!parseValue(dev, root)) {
307 qWarning() << "dev not at end";
308 }
309 } else {
310 QVariantHash b;
311 if (!parseObject(dev, b, false)) {
312 qWarning() << "txt2 dev not at end";
313 }
314 root = b;
315 }
316 dev.close();
317 }
318 return root.toHash();
319}
bool parseObject(QIODevice &dev, QVariantHash &object, bool checkEnd=true)
@ BeginObject

References BeginObject, eatSpace(), parseObject(), and parseValue().

◆ parseObject()

bool KisCosParser::parseObject ( QIODevice & dev,
QVariantHash & object,
bool checkEnd = true )
private

Definition at line 182 of file kis_cos_parser.cpp.

182 {
183 eatSpace(dev);
184
185 QVariant key;
186 QVariant val;
187 while (parseValue(dev, key)) {
188 object.insert(key.toString(), QVariant());
189 if (key.type() == QMetaType::QString && parseValue(dev, val)) {
190 object.insert(key.toString(), val);
191 } else {
192 return false;
193 }
194 }
195 char c;
196 dev.getChar(&c);
197 if (c == EndObject) {
198 dev.skip(1);
199 return true;
200 } else if (checkEnd) {
201 return false;
202 }
203
204 return true;
205}
@ EndObject

References eatSpace(), EndObject, and parseValue().

◆ parseValue()

bool KisCosParser::parseValue ( QIODevice & dev,
QVariant & val )
private

Definition at line 226 of file kis_cos_parser.cpp.

226 {
227
228 eatSpace(dev);
229 char c;
230 dev.getChar(&c);
231
232 if (c == BeginObject) {
233 char c2;
234 dev.peek(&c2, 1);
235 if (c2 == BeginObject) {
236 QVariantHash object = QVariantHash();
237 dev.skip(1);
238 if (!parseObject(dev, object)) {
239 return false;
240 }
241 val = object;
242 } else {
243 if (!parseHexString(dev, val)) {
244 return false;
245 }
246 }
247 } else if (c == BeginArray) {
248 QVariantList array = QVariantList();
249 if (!parseArray(dev, array)) {
250 return false;
251 }
252 val = array;
253 } else if (c == BeginName) {
254 if (!parseName(dev, val)) {
255 return false;
256 }
257 } else if (c == BeginString) {
258 if (!parseString(dev, val)) {
259 return false;
260 }
261 } else if (c == EndObject || c == EndArray) {
262 dev.ungetChar(c);
263 return false;
264 } else if (c == 't') {
265 const QByteArray t = dev.read(3);
266 if (t == "rue") {
267 val = true;
268 } else {
269 return false;
270 }
271
272 } else if (c == 'f') {
273 const QByteArray t = dev.read(4);
274 if (t == "alse") {
275 val = false;
276 } else {
277 return false;
278 }
279 } else if (c == 'n') {
280 const QByteArray t = dev.read(3);
281 if (t == "ull") {
282 val = QVariant();
283 } else {
284 return false;
285 }
286 } else {
287 dev.ungetChar(c);
288 if (!parseNumber(dev, val)) {
289 return false;
290 }
291 }
292
293 return true;
294}
bool parseArray(QIODevice &dev, QVariantList &array)
bool parseName(QIODevice &dev, QVariant &val)
bool parseString(QIODevice &dev, QVariant &val)
bool parseHexString(QIODevice &dev, QVariant &val)
bool parseNumber(QIODevice &dev, QVariant &val)
@ BeginArray
@ BeginString
@ BeginName

References BeginArray, BeginName, BeginObject, BeginString, eatSpace(), EndArray, EndObject, parseArray(), parseHexString(), parseName(), parseNumber(), parseObject(), and parseString().


The documentation for this class was generated from the following files: