OLD | NEW |
1 import sys | 1 import sys |
2 | 2 |
3 class PdfName: | 3 class PdfName: |
4 def __init__(self, name, abr=''): | 4 def __init__(self, name, abr=''): |
5 self.fName = name | 5 self.fName = name |
6 self.fAbr = abr | 6 self.fAbr = abr |
7 | 7 |
8 class PdfInteger: | 8 class PdfInteger: |
9 def __init__(self, value): | 9 def __init__(self, value): |
10 self.fValue = value | 10 self.fValue = value |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 return self.fParent | 81 return self.fParent |
82 | 82 |
83 class PdfClass: | 83 class PdfClass: |
84 def __init__(self, name, base): | 84 def __init__(self, name, base): |
85 self.fFields = [] | 85 self.fFields = [] |
86 self.fIncludes = [] | 86 self.fIncludes = [] |
87 self.fCC = [] | 87 self.fCC = [] |
88 self.fName = name | 88 self.fName = name |
89 self.fBase = base | 89 self.fBase = base |
90 | 90 |
| 91 self.fEnumSubclasses = [] |
| 92 |
| 93 self.fEnum = '!UNDEFINED' |
| 94 self.fEnumEnd = '!UNDEFINED' |
| 95 |
91 def required(self): | 96 def required(self): |
92 field = PdfClassField(self, True) | 97 field = PdfClassField(self, True) |
93 self.fFields.append(field) | 98 self.fFields.append(field) |
94 return field | 99 return field |
95 | 100 |
96 def optional(self): | 101 def optional(self): |
97 field = PdfClassField(self, False) | 102 field = PdfClassField(self, False) |
98 self.fFields.append(field) | 103 self.fFields.append(field) |
99 return field | 104 return field |
100 | 105 |
101 def include(self, path): | 106 def include(self, path): |
102 self.fIncludes.append(path) | 107 self.fIncludes.append(path) |
103 return self | 108 return self |
104 | 109 |
105 def carbonCopy(self, cc): | 110 def carbonCopy(self, cc): |
106 self.fCC.append(cc) | 111 self.fCC.append(cc) |
107 return self | 112 return self |
108 | 113 |
109 class PdfClassManager: | 114 class PdfClassManager: |
110 def __init__(self): | 115 def __init__(self): |
111 self.fClasses = [] | 116 self.fClasses = {} |
112 | 117 |
113 def addClass(self, name, base=''): | 118 def addClass(self, name, base=''): |
114 cls = PdfClass(name, base) | 119 cls = PdfClass(name, base) |
115 self.fClasses.append(cls) | 120 self.fClasses[name] = cls |
116 return cls | 121 return cls |
117 | 122 |
| 123 def longName(self, name): |
| 124 ret = '' |
| 125 while name != '': |
| 126 cls = self.fClasses[name] |
| 127 ret = name + ret |
| 128 name = cls.fBase |
| 129 |
| 130 return ret |
| 131 |
| 132 |
| 133 def writeEnum(self, enum, enumToCls): |
| 134 print(' ' + enum + ',') |
| 135 cls = enumToCls[enum] |
| 136 cls.fEnumSubclasses.sort() |
| 137 |
| 138 cnt = 0 |
| 139 for sub in cls.fEnumSubclasses: |
| 140 self.writeEnum(cls.fEnumSubclasses[cnt], enumToCls) |
| 141 cnt = cnt + 1 |
| 142 |
| 143 if cnt != 0: |
| 144 print(' ' + cls.fEnumEnd + ',') |
| 145 |
118 def write(self): | 146 def write(self): |
| 147 # generate enum |
| 148 enumsRoot = [] |
| 149 |
| 150 enumToCls = {} |
| 151 |
| 152 for name in self.fClasses: |
| 153 cls = self.fClasses[name] |
| 154 enum = self.longName(name) |
| 155 cls.fEnum = 'k' + enum + '_PdfObjectType' |
| 156 cls.fEnumEnd = 'k' + enum + '__End_PdfObjectType' |
| 157 |
| 158 if cls.fBase != '': |
| 159 self.fClasses[cls.fBase].fEnumSubclasses.append(cls.fEnum) |
| 160 |
| 161 if cls.fBase == '': |
| 162 enumsRoot.append(cls.fEnum) |
| 163 |
| 164 enumToCls[cls.fEnum] = cls |
| 165 |
| 166 enumsRoot.sort() |
| 167 |
| 168 # write enums |
| 169 print('enum PdfObjectType {') |
| 170 for enum in enumsRoot: |
| 171 self.writeEnum(enum, enumToCls) |
| 172 print('};') |
| 173 |
| 174 # generate each class |
| 175 # generate parser |
119 return | 176 return |
120 | 177 |
121 def generateCode(): | 178 def generateCode(): |
122 all = PdfClassManager() | 179 all = PdfClassManager() |
123 | 180 |
124 all.addClass('Object') | 181 all.addClass('Object') |
125 all.addClass('Null') | 182 all.addClass('Null') |
126 all.addClass('Boolean') | 183 all.addClass('Boolean') |
127 all.addClass('Integer') | 184 all.addClass('Integer') |
128 all.addClass('Real') | 185 all.addClass('Real') |
(...skipping 20 matching lines...) Expand all Loading... |
149 all.addClass('Form', 'XObject').required().hasField('/Type').must('/XObject').
done()\ | 206 all.addClass('Form', 'XObject').required().hasField('/Type').must('/XObject').
done()\ |
150 .required().hasField('/Subtype').must('/Form').
done() | 207 .required().hasField('/Subtype').must('/Form').
done() |
151 | 208 |
152 | 209 |
153 all.write() | 210 all.write() |
154 | 211 |
155 return 1 | 212 return 1 |
156 | 213 |
157 if '__main__' == __name__: | 214 if '__main__' == __name__: |
158 sys.exit(generateCode()) | 215 sys.exit(generateCode()) |
OLD | NEW |