Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(608)

Side by Side Diff: experimental/PdfViewer/generate_code.py

Issue 16968007: Pdfviewer: generate isAFoo() and getAsFoo() api for fields that can have multiple types. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « experimental/PdfViewer/datatypes.py ('k') | experimental/PdfViewer/pdf_auto_gen.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 2
3 import sys 3 import sys
4 4
5 import datatypes 5 import datatypes
6 import pdfspec_autogen 6 import pdfspec_autogen
7 7
8 8 knowTypes = {
9 '(any)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'true'],
10 '(undefined)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'tr ue'],
11 '(various)': ['SkPdfObject*', 'ObjectFromDictionary', datatypes.CppNull(), 'true '],
12 'array': ['SkPdfArray', 'ArrayFromDictionary', datatypes.PdfArrayNone(), 'ret->p odofo()->GetDataType() == ePdfDataType_Array'],
13 'boolean': ['bool', 'BoolFromDictionary', datatypes.PdfBoolean('false'), 'ret->p odofo()->GetDataType() == ePdfDataType_Bool'],
14 'date': ['SkPdfDate', 'DateFromDictionary', datatypes.PdfDateNever(), 'ret->podo fo()->GetDataType() == ePdfDataType_Array'],
15 'dictionary': ['SkPdfDictionary*', 'DictionaryFromDictionary', datatypes.CppNull (), 'ret->podofo()->GetDataType() == ePdfDataType_Dictionary'],
16 'function': ['SkPdfFunction', 'FunctionFromDictionary', datatypes.PdfFunctionNon e(), 'ret->podofo()->GetDataType() == ePdfDataType_Reference'],
17 'integer': ['long', 'LongFromDictionary', datatypes.PdfInteger(0), 'ret->podofo( )->GetDataType() == ePdfDataType_Number'],
18 'file_specification': ['SkPdfFileSpec', 'FileSpecFromDictionary', datatypes.File SpecNone(), 'ret->podofo()->GetDataType() == ePdfDataType_Reference'],
19 'name': ['std::string', 'NameFromDictionary', datatypes.PdfString('""'), 'ret->p odofo()->GetDataType() == ePdfDataType_Name'],
20 'tree': ['SkPdfTree*', 'TreeFromDictionary', datatypes.CppNull(), 'ret->podofo() ->GetDataType() == ePdfDataType_Reference'],
21 'number': ['double', 'DoubleFromDictionary', datatypes.PdfNumber(0), 'ret->podof o()->GetDataType() == ePdfDataType_Real'],
22 'rectangle': ['SkRect', 'SkRectFromDictionary', datatypes.PdfEmptyRect(), 'ret-> podofo()->GetDataType() == ePdfDataType_Array'],
23 'stream': ['SkPdfStream', 'StreamFromDictionary', datatypes.PdfEmptyStream(), ' ret->podofo()->HasStream()'],
24 'string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 're t->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType( ) == ePdfDataType_HexString'],
25 'text': ['std::string', 'StringFromDictionary', datatypes.PdfString('""'), 'ret- >podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetDataType() == ePdfDataType_HexString'],
26 'text string': ['std::string', 'StringFromDictionary', datatypes.PdfString('""') , 'ret->podofo()->GetDataType() == ePdfDataType_String || ret->podofo()->GetData Type() == ePdfDataType_HexString'],
27 }
9 28
10 29
11 class PdfField: 30 class PdfField:
12 def __init__(self, parent, name, abr): 31 def __init__(self, parent, name, abr):
13 self.fParent = parent 32 self.fParent = parent
14 self.fName = name 33 self.fName = name
15 self.fAbr = abr 34 self.fAbr = abr
16 35
17 self.fDefault = '' 36 self.fDefault = ''
18 self.fType = '' 37 self.fTypes = ''
19 self.fCppName = '' 38 self.fCppName = ''
20 self.fCppType = '' 39 self.fEnumValues = []
21 self.fCppReader = '' 40 self.fHasMust = False
22 self.fValidOptions = []
23 self.fHasMust = False
24 self.fMustBe = '' 41 self.fMustBe = ''
25 42
26 def must(self, value): 43 def must(self, value):
27 self.fHasMust = True 44 self.fHasMust = True
28 self.fMustBe = value 45 self.fMustBe = value
29 return self 46 return self
30 47
31 def default(self, value): 48 def default(self, value):
32 self.fDefault = value 49 self.fDefault = value
33 return self 50 return self
34 51
35 def number(self, name): 52 def multiple(self, enumValues):
36 self.fType = 'number' 53 self.fEnumValues = enumValues
37 self.fCppName = name
38 self.fCppType = 'double'
39 self.fCppReader = 'DoubleFromDictionary'
40 return self
41
42 def integer(self, name):
43 self.fType = 'integer'
44 self.fCppName = name
45 self.fCppType = 'long'
46 self.fCppReader = 'LongFromDictionary'
47 return self 54 return self
48 55
49 def name(self, name): 56 def name(self, name):
50 self.fType = 'name'
51 self.fCppName = name 57 self.fCppName = name
52 self.fCppType = 'std::string'
53 self.fCppReader = 'NameFromDictionary'
54 return self 58 return self
55 59
56 def string(self, name): 60 def type(self, types):
57 self.fType = 'string' 61 # TODO (edisonn): if simple type, use it, otherwise set it to Dictionary, an d set a mask for valid types, like array or name
58 self.fCppName = name 62 types = types.strip()
59 self.fCppType = 'std::string' 63 types = types.replace('or', ' ')
60 self.fCppReader = 'StringFromDictionary' 64 types = types.replace(',', ' ')
61 return self 65 types = types.replace('text', ' ') # TODO(edisonn): what is the difference b etween 'text string' and 'string'?
66 types = types.replace('file specification', 'file_specification')
62 67
63 def multiple(self, validOptions):
64 self.fValidOptions = validOptions
65 return self
66 68
67 def dictionary(self, name): 69 self.fTypes = types
68 self.fType = 'dictionary'
69 self.fCppName = name
70 self.fDictionaryType = 'Dictionary'
71 self.fCppType = 'SkPdfDictionary*'
72 self.fCppReader = 'DictionaryFromDictionary'
73 self.fDefault = datatypes.CppNull()
74 return self
75
76 def type(self, type):
77 # TODO (edisonn): if simple type, use it, otherwise set it to Dictionary, an d set a mask for valid types, like array or name
78 type = type.replace('or', ' ')
79 type = type.replace(',', ' ')
80 type = type.replace('text', ' ') # TODO(edisonn): what is the difference bet ween 'text string' and 'string'?
81
82 type = type.strip()
83 types = type.split()
84
85 if len(types) == 1:
86 if type == 'integer':
87 self.integer(self.fCppName)
88 self.default(datatypes.PdfInteger(0))
89 return self
90
91 if type == 'number':
92 self.number(self.fCppName)
93 self.default(datatypes.PdfNumber(0))
94 return self
95
96 if type == 'string':
97 self.string(self.fCppName)
98 self.default(datatypes.PdfString('""'))
99 return self
100
101 if type == 'name':
102 self.name(self.fCppName)
103 self.default(datatypes.PdfName('""'))
104 return self
105
106 if type == 'dictionary':
107 self.dictionary(self.fCppName)
108 self.default(datatypes.CppNull())
109 return self
110
111 self.fType = 'object'
112 self.fDictionaryType = 'Object'
113 self.fCppType = 'SkPdfObject*'
114 self.fCppReader = 'ObjectFromDictionary'
115 self.fDefault = datatypes.CppNull()
116 return self 70 return self
117 71
118 def comment(self, comment): 72 def comment(self, comment):
119 return self 73 return self
120 74
121 def done(self): 75 def done(self):
122 return self.fParent 76 return self.fParent
123 77
124 78
125 class PdfClassField: 79 class PdfClassField:
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 base = self.fClasses[cls.fBase] 218 base = self.fClasses[cls.fBase]
265 cnt = 0 219 cnt = 0
266 for sub in base.fEnumSubclasses: 220 for sub in base.fEnumSubclasses:
267 if enumToCls[base.fEnumSubclasses[cnt]].fName != cls.fName: 221 if enumToCls[base.fEnumSubclasses[cnt]].fName != cls.fName:
268 self.writeAsNull(enumToCls[base.fEnumSubclasses[cnt]], enumToCls) 222 self.writeAsNull(enumToCls[base.fEnumSubclasses[cnt]], enumToCls)
269 cnt = cnt + 1 223 cnt = cnt + 1
270 224
271 225
272 226
273 def write(self): 227 def write(self):
228
229 global knowTypes
230
274 # generate enum 231 # generate enum
275 enumsRoot = [] 232 enumsRoot = []
276 233
277 enumToCls = {} 234 enumToCls = {}
278 235
279 for name in self.fClasses: 236 for name in self.fClasses:
280 cls = self.fClasses[name] 237 cls = self.fClasses[name]
281 enum = self.longName(name) 238 enum = self.longName(name)
282 cls.fEnum = 'k' + enum + '_SkPdfObjectType' 239 cls.fEnum = 'k' + enum + '_SkPdfObjectType'
283 cls.fEnumEnd = 'k' + enum + '__End_SkPdfObjectType' 240 cls.fEnumEnd = 'k' + enum + '__End_SkPdfObjectType'
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 print 313 print
357 314
358 print(' SkPdf' + cls.fName + '& operator=(const SkPdf' + cls.fName + '& f rom) {this->fPodofoDoc = from.fPodofoDoc; this->fPodofoObj = from.fPodofoObj; re turn *this;}') 315 print(' SkPdf' + cls.fName + '& operator=(const SkPdf' + cls.fName + '& f rom) {this->fPodofoDoc = from.fPodofoDoc; this->fPodofoObj = from.fPodofoObj; re turn *this;}')
359 print 316 print
360 317
361 for field in cls.fFields: 318 for field in cls.fFields:
362 prop = field.fProp 319 prop = field.fProp
363 if prop.fCppName != '': 320 if prop.fCppName != '':
364 if prop.fCppName[0] == '[': 321 if prop.fCppName[0] == '[':
365 print('/*') # comment code of the atributes that can have any name 322 print('/*') # comment code of the atributes that can have any name
366 323
367 print(' ' + prop.fCppType + ' ' + prop.fCppName + '() const {') 324 # TODO(edisonn): has_foo();
368 print(' ' + prop.fCppType + ' ret;') 325 print(' bool has_' + prop.fCppName + '() const {')
369 print(' if (' + prop.fCppReader + '(fPodofoDoc, fPodofoObj->GetDict ionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;') 326 print(' return (ObjectFromDictionary(fPodofoDoc, fPodofoObj->GetD ictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", NULL));')
370 if field.fRequired == False: 327 print(' }')
371 print(' return ' + prop.fDefault.toCpp() + ';'); 328
372 if field.fRequired == True: 329 if len(prop.fTypes.split()) == 1:
373 print(' // TODO(edisonn): warn about missing required field, asse rt for known good pdfs') 330 t = prop.fTypes.strip()
374 print(' return ' + field.fBadDefault + ';'); 331 print(' ' + knowTypes[t][0] + ' ' + prop.fCppName + '() const {')
375 print(' }') 332 print(' ' + knowTypes[t][0] + ' ret;')
376 print 333 print(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->GetDi ctionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;')
334 if field.fRequired == False and prop.fDefault != '':
335 print(' return ' + prop.fDefault.toCpp() + ';');
336 else:
337 print(' // TODO(edisonn): warn about missing required field, as sert for known good pdfs')
338 print(' return ' + knowTypes[t][2].toCpp() + ';');
339 print(' }')
340 print
341 else:
342 for type in prop.fTypes.split():
343 t = type.strip()
344 print(' bool is' + prop.fCppName + 'A' + t.title() + '() const {' )
345 print(' SkPdfObject* ret = NULL;')
346 print(' if (!ObjectFromDictionary(fPodofoDoc, fPodofoObj->GetDi ctionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return false;' )
347 print(' return ' + knowTypes[t][3] + ';')
348 print(' }')
349 print
350
351 print(' ' + knowTypes[t][0] + ' get' + prop.fCppName + 'As' + t.t itle() + '() const {')
352 print(' ' + knowTypes[t][0] + ' ret = ' + knowTypes[t][2].toCpp () + ';')
353 print(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->Get Dictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;' )
354 print(' // TODO(edisonn): warn about missing required field, as sert for known good pdfs')
355 print(' return ' + knowTypes[t][2].toCpp() + ';')
356 print(' }')
357 print
358
377 359
378 if prop.fCppName[0] == '[': 360 if prop.fCppName[0] == '[':
379 print('*/') # comment code of the atributes that can have any name 361 print('*/') # comment code of the atributes that can have any name
380 362
381 363
382 print('};') 364 print('};')
383 print 365 print
384 print 366 print
385 367
386 368
387 369
388 # generate constructor when knowing the type 370 # generate constructor when knowing the type
389 # later, p2, generate constructor when not knowing the type - very similar with parsing? 371 # later, p2, generate constructor when not knowing the type - very similar with parsing?
390 372
391 # generate parser 373 # generate parser
392 374
393 # TODO(edisonn): fast recognition based on must attributes. 375 # TODO(edisonn): fast recognition based on must attributes.
394 print('class PodofoMapper {') 376 print('class PodofoMapper {')
395 print('public:') 377 print('public:')
396 for name in self.fClassesNamesInOrder: 378 for name in self.fClassesNamesInOrder:
397 cls = self.fClasses[name] 379 cls = self.fClasses[name]
398 380
399 381
400 print(' static bool map(const SkPdfObject& in, SkPdf' + name + '** out) { ') 382 print(' static bool map(const SkPdfObject& in, SkPdf' + name + '** out) { ')
401 print(' return map(*in.doc(), *in.podofo(), out);') 383 print(' return map(*in.doc(), *in.podofo(), out);')
402 print(' }') 384 print(' }')
403 print 385 print
404 386
405 print(' static bool map(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj, SkPdf' + name + '** out) {') 387 print(' static bool map(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj, SkPdf' + name + '** out) {')
406 print(' if (!isA' + name + '(podofoDoc, podofoObj)) return false;') 388 print(' if (!is' + name + '(podofoDoc, podofoObj)) return false;')
407 print 389 print
408 390
409 for sub in cls.fEnumSubclasses: 391 for sub in cls.fEnumSubclasses:
410 print(' if (map(podofoDoc, podofoObj, (SkPdf' + enumToCls[sub].fName + '**)out)) return true;') 392 print(' if (map(podofoDoc, podofoObj, (SkPdf' + enumToCls[sub].fName + '**)out)) return true;')
411 393
412 print 394 print
413 395
414 print(' *out = new SkPdf' + name + '(&podofoDoc, &podofoObj);') 396 print(' *out = new SkPdf' + name + '(&podofoDoc, &podofoObj);')
415 print(' return true;') 397 print(' return true;')
416 print(' }') 398 print(' }')
417 print 399 print
418 400
419 for name in self.fClassesNamesInOrder: 401 for name in self.fClassesNamesInOrder:
420 cls = self.fClasses[name] 402 cls = self.fClasses[name]
421 403
422 print(' static bool isA' + name + '(const PdfMemDocument& podofoDoc, cons t PdfObject& podofoObj) {') 404 print(' static bool is' + name + '(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj) {')
423 405
424 if cls.fCheck != '': 406 if cls.fCheck != '':
425 print(' return ' + cls.fCheck + ';') 407 print(' return ' + cls.fCheck + ';')
426 else: 408 else:
427 cntMust = 0 409 cntMust = 0
428 for field in cls.fFields: 410 for field in cls.fFields:
429 prop = field.fProp 411 prop = field.fProp
430 if prop.fHasMust: 412 if prop.fHasMust:
431 cntMust = cntMust + 1 413 cntMust = cntMust + 1
432 print(' ' + prop.fCppType + ' ' + prop.fCppName + ';') 414 print(' ' + knowTypes[prop.fTypes.strip()][0] + ' ' + prop.fCppNa me + ';')
433 print(' if (!' + prop.fCppReader + '(&podofoDoc, podofoObj.GetDic tionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &' + prop.fCppName + ' )) return false;') 415 print(' if (!' + knowTypes[prop.fTypes.strip()][1] + '(&podofoDoc , podofoObj.GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &' + prop.fCppName + ')) return false;')
434 print(' if (' + prop.fCppName + ' != ' + prop.fMustBe.toCpp() + ' ) return false;') 416 print(' if (' + prop.fCppName + ' != ' + prop.fMustBe.toCpp() + ' ) return false;')
435 print 417 print
436 418
437 print(' return true;') 419 print(' return true;')
438 420
439 print(' }') 421 print(' }')
440 print 422 print
441 423
442 print('};') 424 print('};')
443 print 425 print
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 464
483 465
484 manager.write() 466 manager.write()
485 467
486 return 1 468 return 1
487 469
488 if '__main__' == __name__: 470 if '__main__' == __name__:
489 sys.exit(generateCode()) 471 sys.exit(generateCode())
490 472
491 473
OLDNEW
« no previous file with comments | « experimental/PdfViewer/datatypes.py ('k') | experimental/PdfViewer/pdf_auto_gen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698