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 299 of file kis_cos_parser.cpp.

300{
301 QVariant root;
302 QBuffer dev(ba);
303 if (dev.open(QIODevice::ReadOnly)) {
304
305 eatSpace(dev);
306 char c;
307 dev.peek(&c, 1);
308 if (c == BeginObject) {
309 if (!parseValue(dev, root)) {
310 qWarning() << "dev not at end";
311 }
312 } else {
313 QVariantHash b;
314 if (!parseObject(dev, b, false)) {
315 qWarning() << "txt2 dev not at end";
316 }
317 root = b;
318 }
319 dev.close();
320 }
321 return root.toHash();
322}
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() == QVariant::String && 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 QByteArray t;
266 dev.read(t.data(), 3);
267 if (t[0] == 'r' && t[1] == 'u' && t[2] == 'e') {
268 val = true;
269 } else {
270 return false;
271 }
272
273 } else if (c == 'f') {
274 QByteArray t;
275 dev.read(t.data(), 4);
276 if (t[0] == 'a' && t[1] == 'l' && t[2] == 's' && t[3] == 'e') {
277 val = false;
278 } else {
279 return false;
280 }
281 } else if (c == 'n') {
282 QByteArray t;
283 dev.read(t.data(), 3);
284 if (t[0] == 'u' && t[1] == 'l' && t[2] == 'l') {
285 val = QVariant();
286 } else {
287 return false;
288 }
289 } else {
290 dev.ungetChar(c);
291 if (!parseNumber(dev, val)) {
292 return false;
293 }
294 }
295
296 return true;
297}
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: