OLD | NEW |
(Empty) | |
| 1 #!/usr/local/bin/python |
| 2 # coding: utf-8 |
| 3 |
| 4 import sys |
| 5 import re |
| 6 |
| 7 # TODO(edisonn): put processed part of file in a new file |
| 8 # put unprocessed part, in a new file, so we see what we miss |
| 9 # keep blank lines, and generate a version without the blank lines |
| 10 |
| 11 #TODO (edisonn): deal manually with tables that don't have "KEY TYPE VALUE' head
er, e.g. |
| 12 # TABLE 7.11 Restrictions on the entries in a soft-mask image dictionary |
| 13 #KEY RESTRICTION |
| 14 |
| 15 |
| 16 |
| 17 lines = 0 |
| 18 table = '' |
| 19 tableHeaderFound = False |
| 20 tableLine = 0 |
| 21 tableRow = 0 |
| 22 columnWidth = [] |
| 23 columnValues = None |
| 24 mustFollowTableHeader = False |
| 25 emitedDitionaryName = '' |
| 26 |
| 27 knownTypes = { |
| 28 '(any)', |
| 29 unicode('undefined', 'utf8'), |
| 30 '(undefined)', |
| 31 '(various)', |
| 32 'array', |
| 33 'or', |
| 34 'boolean', |
| 35 'date', |
| 36 'dictionary', |
| 37 'function', |
| 38 'integer', |
| 39 unicode('file', 'utf8'), |
| 40 'file', |
| 41 unicode('specification', 'utf8'), |
| 42 'specification', |
| 43 'name', |
| 44 'tree', |
| 45 'number', |
| 46 'rectangle', |
| 47 'stream', |
| 48 'string', |
| 49 'text', |
| 50 ',', |
| 51 ' ' |
| 52 } |
| 53 |
| 54 # TODO(edisonn): add a third element in the vector, the base class, by default i
t is Dictionary |
| 55 # TODO(edisonn): add overrides for types map<field_name, type_name> |
| 56 # e.g. ,{'Resources', 'ResourceDictionary'} |
| 57 # TODO(edisonn): can be added one by one, or extracted from documentation |
| 58 |
| 59 tableToClassName = { |
| 60 'TABLE 3.4': ['StreamCommonDictionary', 'Entries common to all stream dictionari
es'], |
| 61 'TABLE 3.7': ['LzwdecodeAndFlatedecodeFiltersDictionary', 'Optional parameters f
or LZWDecode and FlateDecode filters'], |
| 62 'TABLE 3.9': ['CcittfaxdecodeFilterDictionary', 'Optional parameters for the CCI
TTFaxDecode filter'], |
| 63 'TABLE 3.10': ['Jbig2DecodeFilterDictionary', 'Optional parameter for the JBIG2D
ecode filter'], |
| 64 'TABLE 3.11': ['DctdecodeFilterDictionary', 'Optional parameter for the DCTDecod
e filter'], |
| 65 'TABLE 3.12': ['FileTrailerDictionary', 'Entries in the file trailer dictionary'
], |
| 66 'TABLE 3.13': ['EncryptionCommonDictionary', 'Entries common to all encryption d
ictionaries'], |
| 67 'TABLE 3.14': ['StandardSecurityHandlerDictionary', 'Additional encryption dicti
onary entries for the standard security handler'], |
| 68 'TABLE 3.16': ['CatalogDictionary', 'Entries in the catalog dictionary'], |
| 69 'TABLE 3.17': ['PageTreeNodeDictionary', 'Required entries in a page tree node']
, |
| 70 'TABLE 3.18': ['PageObjectDictionary', 'Entries in a page object'], |
| 71 'TABLE 3.19': ['NameDictionary', 'Entries in the name dictionary'], |
| 72 'TABLE 3.21': ['ResourceDictionary', 'Entries in a resource dictionary'], |
| 73 'TABLE 3.23': ['NameTreeNodeDictionary', 'Entries in a name tree node dictionary
'], |
| 74 'TABLE 3.25': ['NumberTreeNodeDictionary', 'Entries in a number tree node dictio
nary'], |
| 75 'TABLE 3.26': ['FunctionCommonDictionary', 'Entries common to all function dicti
onaries'], |
| 76 'TABLE 3.27': ['Type0FunctionDictionary', 'Additional entries specific to a type
0 function dictionary'], |
| 77 'TABLE 3.28': ['Type2FunctionDictionary', 'Additional entries specific to a type
2 function dictionary'], |
| 78 'TABLE 3.29': ['Type3FunctionDictionary', 'Additional entries specific to a type
3 function dictionary'], |
| 79 'TABLE 3.32': ['FileSpecificationDictionary', 'Entries in a file specification d
ictionary'], |
| 80 'TABLE 3.33': ['EmbeddedFileStreamDictionary', 'Additional entries in an embedde
d file stream dictionary'], |
| 81 'TABLE 3.34': ['EmbeddedFileParameterDictionary', 'Entries in an embedded file p
arameter dictionary'], |
| 82 'TABLE 3.35': ['MacOsFileInformationDictionary', 'Entries in a Mac OS file infor
mation dictionary'], |
| 83 'TABLE 4.8': ['GraphicsStateDictionary', 'Entries in a graphics state parameter
dictionary'], |
| 84 'TABLE 4.13': ['CalgrayColorSpaceDictionary', 'Entries in a CalGray color space
dictionary'], |
| 85 'TABLE 4.14': ['CalrgbColorSpaceDictionary', 'Entries in a CalRGB color space di
ctionary'], |
| 86 'TABLE 4.15': ['LabColorSpaceDictionary', 'Entries in a Lab color space dictiona
ry'], |
| 87 'TABLE 4.16': ['IccProfileStreamDictionary', 'Additional entries specific to an
ICC profile stream dictionary'], |
| 88 'TABLE 4.20': ['DeviceNColorSpaceDictionary', 'Entry in a DeviceN color space at
tributes dictionary'], |
| 89 'TABLE 4.22': ['Type1PatternDictionary', 'Additional entries specific to a type
1 pattern dictionary'], |
| 90 'TABLE 4.23': ['Type2PatternDictionary', 'Entries in a type 2 pattern dictionary
'], |
| 91 'TABLE 4.25': ['ShadingDictionary', 'Entries common to all shading dictionaries'
], |
| 92 'TABLE 4.26': ['Type1ShadingDictionary', 'Additional entries specific to a type
1 shading dictionary', 'ShadingDictionary'], |
| 93 'TABLE 4.27': ['Type2ShadingDictionary', 'Additional entries specific to a type
2 shading dictionary', 'ShadingDictionary'], |
| 94 'TABLE 4.28': ['Type3ShadingDictionary', 'Additional entries specific to a type
3 shading dictionary', 'ShadingDictionary'], |
| 95 'TABLE 4.29': ['Type4ShadingDictionary', 'Additional entries specific to a type
4 shading dictionary', 'ShadingDictionary'], |
| 96 'TABLE 4.30': ['Type5ShadingDictionary', 'Additional entries specific to a type
5 shading dictionary', 'ShadingDictionary'], |
| 97 'TABLE 4.31': ['Type6ShadingDictionary', 'Additional entries specific to a type
6 shading dictionary', 'ShadingDictionary'], |
| 98 'TABLE 4.35': ['ImageDictionary', 'Additional entries specific to an image dicti
onary', 'XObjectDictionary', {'Subtype': '[datatypes.PdfName(\'Image\')]'}], |
| 99 'TABLE 4.37': ['AlternateImageDictionary', 'Entries in an alternate image dictio
nary'], |
| 100 'TABLE 4.41': ['Type1FormDictionary', 'Additional entries specific to a type 1 f
orm dictionary', 'XObjectDictionary', {'Subtype': '[datatypes.PdfName(\'Form\')]
'}], |
| 101 'TABLE 4.42': ['GroupAttributesDictionary', 'Entries common to all group attribu
tes dictionaries'], |
| 102 'TABLE 4.43': ['ReferenceDictionary', 'Entries in a reference dictionary'], |
| 103 'TABLE 4.44': ['PSXobjectDictionary', 'Additional entries specific to a PostScri
pt XObject dictionary'], |
| 104 'TABLE 5.8': ['Type1FontDictionary', 'Entries in a Type 1 font dictionary', 'Fon
tDictionary', {'Subtype': '[datatypes.PdfName(\'Type1\')]'}], |
| 105 'TABLE 5.9': ['Type3FontDictionary', 'Entries in a Type 3 font dictionary', 'Typ
e1FontDictionary', {'Subtype': '[datatypes.PdfName(\'Type3\')]'}], |
| 106 'TABLE 5.11': ['EncodingDictionary', 'Entries in an encoding dictionary'], |
| 107 'TABLE 5.12': ['CIDSystemInfoDictionary', 'Entries in a CIDSystemInfo dictionary
'], |
| 108 'TABLE 5.13': ['CIDFontDictionary', 'Entries in a CIDFont dictionary', 'FontDict
ionary', {'Subtype': '[datatypes.PdfName(\'CIDFontType0\'), datatypes.PdfName(\'
CIDFontType2\')]'}], |
| 109 'TABLE 5.16': ['CMapDictionary', 'Additional entries in a CMap dictionary'], |
| 110 'TABLE 5.17': ['Type0FontDictionary', 'Entries in a Type 0 font dictionary', 'Fo
ntDictionary', {'Subtype': '[datatypes.PdfName(\'Type0\')]'}], |
| 111 'TABLE 5.18': ['FontDescriptorDictionary', 'Entries common to all font descripto
rs'], |
| 112 'TABLE 5.20': ['CIDFontDescriptorDictionary', 'Additional font descriptor entrie
s for CIDFonts'], |
| 113 'TABLE 5.23': ['EmbeddedFontStreamDictionary', 'Additional entries in an embedde
d font stream dictionary'], |
| 114 'TABLE 6.3': ['Type1HalftoneDictionary', 'Entries in a type 1 halftone dictionar
y'], |
| 115 'TABLE 6.4': ['Type6HalftoneDictionary', 'Additional entries specific to a type
6 halftone dictionary'], |
| 116 'TABLE 6.5': ['Type10HalftoneDictionary', 'Additional entries specific to a type
10 halftone dictionary'], |
| 117 'TABLE 6.6': ['Type16HalftoneDictionary', 'Additional entries specific to a type
16 halftone dictionary'], |
| 118 'TABLE 6.7': ['Type5HalftoneDictionary', 'Entries in a type 5 halftone dictionar
y'], |
| 119 'TABLE 7.10': ['SoftMaskDictionary', 'Entries in a soft-mask dictionary'], |
| 120 'TABLE 7.12': ['SoftMaskImageDictionary', 'Additional entry in a soft-mask image
dictionary'], |
| 121 'TABLE 7.13': ['TransparencyGroupDictionary', 'Additional entries specific to a
transparency group attributes dictionary'], |
| 122 'TABLE 8.1': ['ViewerPreferencesDictionary', 'Entries in a viewer preferences di
ctionary'], |
| 123 'TABLE 8.3': ['OutlineDictionary', 'Entries in the outline dictionary'], |
| 124 'TABLE 8.4': ['OutlineItemDictionary', 'Entries in an outline item dictionary'], |
| 125 'TABLE 8.6': ['PageLabelDictionary', 'Entries in a page label dictionary'], |
| 126 'TABLE 8.7': ['ThreadDictionary', 'Entries in a thread dictionary'], |
| 127 'TABLE 8.8': ['BeadDictionary', 'Entries in a bead dictionary'], |
| 128 'TABLE 8.9': ['TransitionDictionary', 'Entries in a transition dictionary'], |
| 129 'TABLE 8.10': ['AnnotationDictionary', 'Entries common to all annotation diction
aries'], |
| 130 'TABLE 8.12': ['BorderStyleDictionary', 'Entries in a border style dictionary'], |
| 131 'TABLE 8.13': ['AppearanceDictionary', 'Entries in an appearance dictionary'], |
| 132 'TABLE 8.15': ['TextAnnotationDictionary', 'Additional entries specific to a tex
t annotation'], |
| 133 'TABLE 8.16': ['ALinkAnnotationDictionary', 'Additional entries specific to a li
nk annotation'], |
| 134 'TABLE 8.17': ['FreeTextAnnotationDictionary', 'Additional entries specific to a
free text annotation'], |
| 135 'TABLE 8.18': ['LineAnnotationDictionary', 'Additional entries specific to a lin
e annotation'], |
| 136 'TABLE 8.20': ['SquareOrCircleAnnotation', 'Additional entries specific to a squ
are or circle annotation'], |
| 137 'TABLE 8.21': ['MarkupAnnotationsDictionary', 'Additional entries specific to ma
rkup annotations'], |
| 138 'TABLE 8.22': ['RubberStampAnnotationDictionary', 'Additional entries specific t
o a rubber stamp annotation'], |
| 139 'TABLE 8.23': ['InkAnnotationDictionary', 'Additional entries specific to an ink
annotation'], |
| 140 'TABLE 8.24': ['PopUpAnnotationDictionary', 'Additional entries specific to a po
p-up annotation'], |
| 141 'TABLE 8.25': ['FileAttachmentAnnotationDictionary', 'Additional entries specifi
c to a file attachment annotation'], |
| 142 'TABLE 8.26': ['SoundAnnotationDictionary', 'Additional entries specific to a so
und annotation'], |
| 143 'TABLE 8.27': ['MovieAnnotationDictionary', 'Additional entries specific to a mo
vie annotation'], |
| 144 'TABLE 8.28': ['WidgetAnnotationDictionary', 'Additional entries specific to a w
idget annotation'], |
| 145 'TABLE 8.29': ['ActionDictionary', 'Entries common to all action dictionaries'], |
| 146 'TABLE 8.30': ['AnnotationActionsDictionary', 'Entries in an annotation\'s addit
ional-actions dictionary'], |
| 147 'TABLE 8.31': ['PageObjectActionsDictionary', 'Entries in a page object\'s addit
ional-actions dictionary'], |
| 148 'TABLE 8.32': ['FormFieldActionsDictionary', 'Entries in a form field\'s additio
nal-actions dictionary'], |
| 149 'TABLE 8.33': ['DocumentCatalogActionsDictionary', 'Entries in the document cata
log\'s additional-actions dictionary'], |
| 150 'TABLE 8.35': ['GoToActionDictionary', 'Additional entries specific to a go-to a
ction'], |
| 151 'TABLE 8.36': ['RemoteGoToActionDictionary', 'Additional entries specific to a r
emote go-to action'], |
| 152 'TABLE 8.37': ['LaunchActionDictionary', 'Additional entries specific to a launc
h action'], |
| 153 'TABLE 8.38': ['WindowsLaunchActionDictionary', 'Entries in a Windows launch par
ameter dictionary'], |
| 154 'TABLE 8.39': ['ThreadActionDictionary', 'Additional entries specific to a threa
d action'], |
| 155 'TABLE 8.40': ['URIActionDictionary', 'Additional entries specific to a URI acti
on'], |
| 156 'TABLE 8.41': ['URIDictionary', 'Entry in a URI dictionary'], |
| 157 'TABLE 8.42': ['SoundActionDictionary', 'Additional entries specific to a sound
action'], |
| 158 'TABLE 8.43': ['MovieActionDictionary', 'Additional entries specific to a movie
action'], |
| 159 'TABLE 8.44': ['HideActionDictionary', 'Additional entries specific to a hide ac
tion'], |
| 160 'TABLE 8.46': ['NamedActionsDictionary', 'Additional entries specific to named a
ctions'], |
| 161 'TABLE 8.47': ['InteractiveFormDictionary', 'Entries in the interactive form dic
tionary'], |
| 162 'TABLE 8.49': ['FieldDictionary', 'Entries common to all field dictionaries'], |
| 163 'TABLE 8.51': ['VariableTextFieldDictionary', 'Additional entries common to all
fields containing variable text'], |
| 164 'TABLE 8.52': ['AppearanceCharacteristicsDictionary', 'Entries in an appearance
characteristics dictionary'], |
| 165 'TABLE 8.54': ['CheckboxFieldDictionary', 'Additional entry specific to a checkb
ox field'], |
| 166 'TABLE 8.55': ['RadioButtonFieldDictionary', 'Additional entry specific to a rad
io button field'], |
| 167 'TABLE 8.57': ['TextFieldDictionary', 'Additional entry specific to a text field
'], |
| 168 'TABLE 8.59': ['ChoiceFieldDictionary', 'Additional entries specific to a choice
field'], |
| 169 'TABLE 8.60': ['SignatureDictionary', 'Entries in a signature dictionary'], |
| 170 'TABLE 8.61': ['SubmitFormActionDictionary', 'Additional entries specific to a s
ubmit-form action'], |
| 171 'TABLE 8.63': ['ResetFormActionDictionary', 'Additional entries specific to a re
set-form action'], |
| 172 'TABLE 8.65': ['ImportDataActionDictionary', 'Additional entries specific to an
import-data action'], |
| 173 'TABLE 8.66': ['JavascriptActionDictionary', 'Additional entries specific to a J
avaScript action'], |
| 174 'TABLE 8.67': ['FDFTrailerDictionary', 'Entry in the FDF trailer dictionary'], |
| 175 'TABLE 8.68': ['FDFCatalogDictionary', 'Entries in the FDF catalog dictionary'], |
| 176 'TABLE 8.69': ['FDFDictionary', 'Entries in the FDF dictionary'], |
| 177 'TABLE 8.70': ['EncryptedEmbeddedFileStreamDictionary', 'Additional entry in an
embedded file stream dictionary for an encrypted FDF file'], |
| 178 'TABLE 8.71': ['JavascriptDictionary', 'Entries in the JavaScript dictionary'], |
| 179 'TABLE 8.72': ['FDFFieldDictionary', 'Entries in an FDF field dictionary'], |
| 180 'TABLE 8.73': ['IconFitDictionary', 'Entries in an icon fit dictionary'], |
| 181 'TABLE 8.74': ['FDFPageDictionary', 'Entries in an FDF page dictionary'], |
| 182 'TABLE 8.75': ['FDFTemplateDictionary', 'Entries in an FDF template dictionary']
, |
| 183 'TABLE 8.76': ['FDFNamedPageReferenceDictionary', 'Entries in an FDF named page
reference dictionary'], |
| 184 'TABLE 8.77': ['FDFFileAnnotationDictionary', 'Additional entry for annotation d
ictionaries in an FDF file'], |
| 185 'TABLE 8.78': ['SoundObjectDictionary', 'Additional entries specific to a sound
object'], |
| 186 'TABLE 8.79': ['MovieDictionary', 'Entries in a movie dictionary'], |
| 187 'TABLE 8.80': ['MovieActivationDictionary', 'Entries in a movie activation dicti
onary'], |
| 188 'TABLE 9.2': ['DocumentInformationDictionary', 'Entries in the document informat
ion dictionary'], |
| 189 'TABLE 9.3': ['MetadataStreamDictionary', 'Additional entries in a metadata stre
am dictionary'], |
| 190 'TABLE 9.4': ['ComponentsWithMetadataDictionary', 'Additional entry for componen
ts having metadata'], |
| 191 'TABLE 9.6': ['PagePieceDictionary', 'Entries in a page-piece dictionary'], |
| 192 'TABLE 9.7': ['ApplicationDataDictionary', 'Entries in an application data dicti
onary'], |
| 193 'TABLE 9.9': ['StructureTreeRootDictionary', 'Entries in the structure tree root
'], |
| 194 'TABLE 9.10': ['StructureElementDictionary', 'Entries in a structure element dic
tionary'], |
| 195 'TABLE 9.11': ['MarkedContentReferenceDictionary', 'Entries in a marked-content
reference dictionary'], |
| 196 'TABLE 9.12': ['ObjectReferenceDictionary', 'Entries in an object reference dict
ionary'], |
| 197 'TABLE 9.13': ['StructureElementAccessDictionary', 'Additional dictionary entrie
s for structure element access'], |
| 198 'TABLE 9.14': ['AttributeObjectDictionary', 'Entry common to all attribute objec
ts'], |
| 199 'TABLE 9.15': ['MarkInformationDictionary', 'Entry in the mark information dicti
onary'], |
| 200 'TABLE 9.16': ['ArtifactsDictionary', 'Property list entries for artifacts'], |
| 201 'TABLE 9.27': ['StandardStructureDictionary', 'Standard layout attributes common
to all standard structure types'], |
| 202 'TABLE 9.28': ['BlockLevelStructureElementsDictionary', 'Additional standard lay
out attributes specific to block-level structure elements'], |
| 203 'TABLE 9.29': ['InlineLevelStructureElementsDictionary', 'Standard layout attrib
utes specific to inline-level structure elements'], |
| 204 'TABLE 9.30': ['ListAttributeDictionary', 'Standard list attribute'], |
| 205 'TABLE 9.31': ['TableAttributesDictionary', 'Standard table attributes'], |
| 206 'TABLE 9.32': ['WebCaptureInformationDictionary', 'Entries in the Web Capture in
formation dictionary'], |
| 207 'TABLE 9.33': ['WebCaptureDictionary', 'Entries common to all Web Capture conten
t sets'], |
| 208 'TABLE 9.34': ['WebCapturePageSetDictionary', 'Additional entries specific to a
Web Capture page set'], |
| 209 'TABLE 9.35': ['WebCaptureImageSetDictionary', 'Additional entries specific to a
Web Capture image set'], |
| 210 'TABLE 9.36': ['SourceInformationDictionary', 'Entries in a source information d
ictionary'], |
| 211 'TABLE 9.37': ['URLAliasDictionary', 'Entries in a URL alias dictionary'], |
| 212 'TABLE 9.38': ['WebCaptureCommandDictionary', 'Entries in a Web Capture command
dictionary'], |
| 213 'TABLE 9.40': ['WebCaptureCommandSettingsDictionary', 'Entries in a Web Capture
command settings dictionary'], |
| 214 'TABLE 9.41': ['BoxColorInformationDictionary', 'Entries in a box color informat
ion dictionary'], |
| 215 'TABLE 9.42': ['BoxStyleDictionary', 'Entries in a box style dictionary'], |
| 216 'TABLE 9.43': ['PrinterMarkAnnotationDictionary', 'Additional entries specific t
o a printer\'s mark annotation'], |
| 217 'TABLE 9.44': ['PrinterMarkFormDictionary', 'Additional entries specific to a pr
inter\'s mark form dictionary'], |
| 218 'TABLE 9.45': ['SeparationDictionary', 'Entries in a separation dictionary'], |
| 219 'TABLE 9.46': ['PDF_XOutputIntentDictionary', 'Entries in a PDF/X output intent
dictionary'], |
| 220 'TABLE 9.47': ['TrapNetworkAnnotationDictionary', 'Additional entries specific t
o a trap network annotation'], |
| 221 'TABLE 9.48': ['TrapNetworkAppearanceStreamDictionary', 'Additional entries spec
ific to a trap network appearance stream'], |
| 222 'TABLE 9.49': ['OpiVersionDictionary', 'Entry in an OPI version dictionary'], |
| 223 } |
| 224 |
| 225 def buildKnownDictionaries(): |
| 226 global tableToClassName |
| 227 global knownTypes |
| 228 |
| 229 ret = {} |
| 230 for e in tableToClassName: |
| 231 ret[tableToClassName[e][0]] = '' |
| 232 knownTypes.add(tableToClassName[e][0]) |
| 233 |
| 234 return ret |
| 235 |
| 236 knownDictionaries = buildKnownDictionaries() |
| 237 |
| 238 def acceptType(val): |
| 239 global knownTypes |
| 240 |
| 241 ret = val |
| 242 |
| 243 for item in knownTypes: |
| 244 ret = ret.replace(item, '') |
| 245 |
| 246 return ret == '' |
| 247 |
| 248 |
| 249 def inTable(): |
| 250 global tableHeaderFound |
| 251 return tableHeaderFound |
| 252 |
| 253 def tableDescriptionFound(desc): |
| 254 global table |
| 255 table = desc.strip() |
| 256 |
| 257 def tableHasHeader(): |
| 258 global table |
| 259 global tableHeaderFound |
| 260 |
| 261 tableHeaderFound = True |
| 262 #print table |
| 263 |
| 264 def fix(val): |
| 265 ret = val |
| 266 |
| 267 # fix unicode chars |
| 268 ret = ret.replace(unicode('fi', 'utf8'), 'fi') |
| 269 ret = ret.replace(u'\u201c', '\"') |
| 270 ret = ret.replace(u'\u201d', '\"') |
| 271 ret = ret.replace(u'\u2019', '\'') |
| 272 ret = ret.replace(u'\ufb02', 'fl') |
| 273 ret = ret.replace(u'\xae', '(R)') |
| 274 ret = ret.replace(u'\u2026', '...') |
| 275 ret = ret.replace(u'\xd7', 'x') |
| 276 ret = ret.replace(u'\u2212', '-') |
| 277 ret = ret.replace(u'\u2264', '<=') |
| 278 ret = ret.replace(u'\u2014', '-') |
| 279 ret = ret.replace(u'\u2013', '\'') |
| 280 ret = ret.replace(u'\u2022', '*') |
| 281 ret = ret.replace(u'\xb5', 'mu') |
| 282 ret = ret.replace(u'\xf7', '/') |
| 283 ret = ret.replace(u'\xc4', 'A') |
| 284 ret = ret.replace(u'\xc5', 'A') |
| 285 ret = ret.replace(u'\u2122', '(TM)') |
| 286 |
| 287 |
| 288 # how enable to emit this a python string |
| 289 ret = ret.replace('\'', '\\\'') |
| 290 ret = ret.replace('\n', '\\n') |
| 291 |
| 292 |
| 293 return ret |
| 294 |
| 295 def commitRow(): |
| 296 global columnValues |
| 297 global emitedDitionaryName |
| 298 global table |
| 299 global tableToClassName |
| 300 |
| 301 if columnValues == None: |
| 302 return |
| 303 |
| 304 #print columnValues |
| 305 |
| 306 lastClosed = columnValues[2].find(')') |
| 307 if lastClosed < 0: |
| 308 print 'ERRRRRRRRRRRRRRROR' |
| 309 print columnValues |
| 310 return |
| 311 |
| 312 spec = columnValues[2][:lastClosed + 1] |
| 313 spec = spec.replace('(', ';') |
| 314 spec = spec.replace(')', ';') |
| 315 spec = spec.strip(';') |
| 316 |
| 317 specs = spec.split(';') |
| 318 |
| 319 # clearly required, but it can be required with conditions. don't handle this
ones here, but manually |
| 320 required = specs[0] == 'Required' |
| 321 |
| 322 inheritable = False |
| 323 version = '' |
| 324 for s in specs: |
| 325 if s.strip() == 'inheritable' or s.strip() == 'Inheritable': |
| 326 inheritable = True |
| 327 elif re.match('^PDF [0-9]*[\.[0-9]*]*', s.strip()): |
| 328 version = s.strip() |
| 329 elif s != 'Required': |
| 330 required = False |
| 331 |
| 332 #print spec |
| 333 #print specs |
| 334 #print required |
| 335 #print inheritable |
| 336 #print version |
| 337 #print columnValues |
| 338 |
| 339 columnValues = [fix(columnValues[0]), fix(columnValues[1]), fix(columnValues[2
])] |
| 340 |
| 341 tableKey = re.search('(TABLE [0-9].[0-9][0-9]?)', table).group(1) |
| 342 |
| 343 if emitedDitionaryName == '': |
| 344 table = fix(table) |
| 345 |
| 346 #print table |
| 347 emitedDitionaryName = 'foo' |
| 348 e = re.search('[Entries|Entry] in [a-z]* (.* dictionary)', table) |
| 349 a = re.search('Additional [a-z]* in a[n]? (.* dictionary)', table) |
| 350 s = re.search('Additional [a-z]* (.*)', table) |
| 351 c = re.search('[Entries|Entry] common to all (.*)', table) |
| 352 o1 = re.search('Optional parameter[s]? for the (.*)', table) |
| 353 o2 = re.search('Optional parameter[s]? for (.*)', table) |
| 354 t = re.search('.*ntries in [a-z]* (.*)', table) |
| 355 |
| 356 r = re.search('Property list entries for (.*)', table) |
| 357 st = re.search('Standard (.*)', table) |
| 358 |
| 359 if e: |
| 360 emitedDitionaryName = e.group(1).title().replace(' ', '') |
| 361 #print emitedDitionaryName |
| 362 elif a: |
| 363 emitedDitionaryName = a.group(1).title().replace(' ', '') |
| 364 #print emitedDitionaryName |
| 365 elif s: |
| 366 emitedDitionaryName = s.group(1).title().replace(' ', '') |
| 367 #print emitedDitionaryName |
| 368 elif c: |
| 369 emitedDitionaryName = c.group(1).title().replace(' ', '') + 'Common' |
| 370 #print emitedDitionaryName |
| 371 elif o1: |
| 372 emitedDitionaryName = o1.group(1).title().replace(' ', '') + 'OptionalPara
meters' |
| 373 #print emitedDitionaryName |
| 374 elif o2: |
| 375 emitedDitionaryName = o2.group(1).title().replace(' ', '') + 'OptionalPara
meters' |
| 376 #print emitedDitionaryName |
| 377 elif t: |
| 378 emitedDitionaryName = t.group(1).title().replace(' ', '') + 'Dictionary' |
| 379 #print emitedDitionaryName |
| 380 elif r: |
| 381 emitedDitionaryName = r.group(1).title().replace(' ', '') + 'Dictionary' |
| 382 #print emitedDitionaryName |
| 383 elif st: |
| 384 emitedDitionaryName = st.group(1).title().replace(' ', '') + 'Dictionary' |
| 385 #print emitedDitionaryName |
| 386 #else: |
| 387 #print table |
| 388 |
| 389 #print tableKey |
| 390 #print('\'' + tableKey + '\': [\'' + emitedDitionaryName + '\', \'' + table[
len(tableKey) + 1:] + '\'],') |
| 391 |
| 392 emitedDitionaryName = tableToClassName[tableKey][0] |
| 393 comment = fix(tableToClassName[tableKey][1]) |
| 394 |
| 395 if len(tableToClassName[tableKey]) >= 3 and tableToClassName[tableKey][2] !=
'': |
| 396 print(' pdfspec.addClass(\'' + emitedDitionaryName + '\', \'' + tableToCl
assName[tableKey][2] + '\', \'' + comment + '\')\\') |
| 397 else: |
| 398 print(' pdfspec.addClass(\'' + emitedDitionaryName + '\', \'Dictionary\',
\'' + comment + '\')\\') |
| 399 |
| 400 if len(tableToClassName[tableKey]) >= 4 and columnValues[0] in tableToClassNam
e[tableKey][3]: |
| 401 required = True |
| 402 |
| 403 if required: |
| 404 print(' .required(\'NULL\')\\') |
| 405 else: |
| 406 print(' .optional()\\') |
| 407 |
| 408 print(' .field(\'' + columnValues[0] + '\')\\') |
| 409 print(' .name(\'' + columnValues[0] + '\')\\') |
| 410 print(' .type(\'' + columnValues[1] + '\')\\') |
| 411 print(' .comment(\'' + columnValues[2] + '\')\\') |
| 412 |
| 413 if len(tableToClassName[tableKey]) >= 4 and columnValues[0] in tableToClassNam
e[tableKey][3]: |
| 414 print(' .must(' + tableToClassName[tableKey][3][columnValues[0]] +
')\\') |
| 415 |
| 416 print(' .done().done()\\') |
| 417 |
| 418 |
| 419 columnValues = None |
| 420 |
| 421 def newRow(first, second, third): |
| 422 global columnValues |
| 423 columnValues = [first.rstrip(), second.rstrip(), third.rstrip()] |
| 424 |
| 425 def appendRow(second, third): |
| 426 global columnValues |
| 427 if second.rstrip() != '': |
| 428 columnValues[1] = columnValues[1] + ' ' + second.rstrip() |
| 429 if third.rstrip() != '': |
| 430 columnValues[2] = columnValues[2] + '\n' + third.rstrip() |
| 431 |
| 432 def rebaseTable(line): |
| 433 global knownTypes |
| 434 global columnWidth |
| 435 |
| 436 line2 = line.replace(',', ' , ') |
| 437 |
| 438 words = line2.split() |
| 439 |
| 440 if len(words) < 3: |
| 441 return False |
| 442 |
| 443 i = 1 |
| 444 while i < len(words) - 1 and words[i] in knownTypes: |
| 445 i = i + 1 |
| 446 |
| 447 if words[i].startswith('(Optional') or words[i].startswith('(Required'): |
| 448 commitRow() |
| 449 |
| 450 columnWidth[0] = line.find(words[1]) |
| 451 |
| 452 if words[i].startswith('(Optional'): |
| 453 columnWidth[1] = line.find('(Optional') - columnWidth[0] |
| 454 if words[i].startswith('(Required'): |
| 455 columnWidth[1] = line.find('(Required') - columnWidth[0] |
| 456 return True |
| 457 |
| 458 return False |
| 459 |
| 460 |
| 461 def stopTable(): |
| 462 global tableHeaderFound |
| 463 global emitedDitionaryName |
| 464 |
| 465 if not inTable(): |
| 466 return |
| 467 |
| 468 commitRow() |
| 469 tableHeaderFound = False |
| 470 emitedDitionaryName = '' |
| 471 print(' .done()') |
| 472 print |
| 473 |
| 474 |
| 475 def killTable(): |
| 476 return |
| 477 |
| 478 def processLineCore(line): |
| 479 global lines |
| 480 global tableLine |
| 481 global tableRow |
| 482 global columnWidth |
| 483 global columnValues |
| 484 global mustFollowTableHeader |
| 485 |
| 486 global fnewspec |
| 487 |
| 488 lines = lines + 1 |
| 489 |
| 490 line = unicode(line, 'utf8') |
| 491 |
| 492 striped = line.rstrip() |
| 493 |
| 494 words = line.split() |
| 495 if len(words) == 0: |
| 496 stopTable() |
| 497 return False |
| 498 |
| 499 isTableHeader = re.search('^[\s]*(TABLE [0-9].[0-9][0-9]?)', striped) |
| 500 if isTableHeader: |
| 501 stopTable() |
| 502 tableDescriptionFound(striped) |
| 503 mustFollowTableHeader = True |
| 504 return False |
| 505 |
| 506 if mustFollowTableHeader: |
| 507 mustFollowTableHeader = False |
| 508 if len(words) != 3: |
| 509 killTable() |
| 510 return False |
| 511 |
| 512 # TODO(edisonn): support for generic table! |
| 513 if words[0] != 'KEY' or words[1] != 'TYPE' or words[2] != 'VALUE': |
| 514 killTable() |
| 515 return False |
| 516 |
| 517 tableHasHeader() |
| 518 columnWidth = [0, 0, 0] |
| 519 columnWidth[0] = striped.index('TYPE') |
| 520 columnWidth[1] = striped.index('VALUE') - striped.index('TYPE') |
| 521 columnWidth[2] = 0 |
| 522 return True |
| 523 |
| 524 if inTable(): |
| 525 tableLine = tableLine + 1 |
| 526 first = striped[0 : columnWidth[0]] |
| 527 second = striped[columnWidth[0] : columnWidth[0] + columnWidth[1]] |
| 528 third = striped[columnWidth[0] + columnWidth[1] :] |
| 529 |
| 530 if tableLine == 1: |
| 531 if third[0] != '(': |
| 532 killTable() |
| 533 return False |
| 534 |
| 535 newRow(first, second, third) |
| 536 return True |
| 537 |
| 538 if rebaseTable(striped): |
| 539 first = striped[0 : columnWidth[0]] |
| 540 second = striped[columnWidth[0] : columnWidth[0] + columnWidth[1]] |
| 541 third = striped[columnWidth[0] + columnWidth[1] :] |
| 542 |
| 543 first = first.rstrip() |
| 544 second = second.rstrip() |
| 545 third = third.rstrip() |
| 546 |
| 547 if first == '' and second == '' and third != '': |
| 548 appendRow(second, third) |
| 549 return True |
| 550 |
| 551 if len(first.split()) > 1: |
| 552 stopTable() |
| 553 return False |
| 554 |
| 555 if first != '' and first[0] == ' ': |
| 556 stopTable() |
| 557 return False |
| 558 |
| 559 if first != '' and second != '' and third == '': |
| 560 stopTable() |
| 561 return False |
| 562 |
| 563 if first == '' and second != '' and second[0] != ' ': |
| 564 if acceptType(second): |
| 565 appendRow(second, third) |
| 566 return True |
| 567 else: |
| 568 stopTable() |
| 569 return False |
| 570 |
| 571 if first != '' and second != '' and third[0] != '(': |
| 572 stopTable() |
| 573 return False |
| 574 |
| 575 if first == '' and second != '' and second[0] == ' ': |
| 576 stopTable() |
| 577 return False |
| 578 |
| 579 if first != '' and second != '' and third[0] == '(': |
| 580 commitRow() |
| 581 newRow(first, second, third) |
| 582 return True |
| 583 |
| 584 return False |
| 585 return False |
| 586 |
| 587 def processLine(line): |
| 588 global fnewspec |
| 589 |
| 590 inSpec = processLineCore(line) |
| 591 |
| 592 #just return, use the next lines if you wish to rewrite spec |
| 593 #return |
| 594 |
| 595 if inSpec: |
| 596 #resize colum with types |
| 597 line = line[:columnWidth[0] + columnWidth[1]] + (' ' * (60 - columnWidth[1])
) + line[columnWidth[0] + columnWidth[1]:] |
| 598 line = line[:columnWidth[0]] + (' ' * (40 - columnWidth[0])) + line[columnWi
dth[0]:] |
| 599 |
| 600 fnewspec.write(line) |
| 601 |
| 602 |
| 603 def generateDef(): |
| 604 global lines |
| 605 global fnewspec |
| 606 |
| 607 fnewspec = open('PdfReference-okular-2.txt', 'w') |
| 608 |
| 609 print 'import datatypes' |
| 610 print |
| 611 |
| 612 print 'def buildPdfSpec(pdfspec):' |
| 613 |
| 614 for line in sys.stdin: |
| 615 processLine(line) |
| 616 |
| 617 # close last table if it was not closed already |
| 618 stopTable() |
| 619 |
| 620 print |
| 621 |
| 622 print 'def addDictionaryTypesTo(knowTypes):' |
| 623 for e in tableToClassName: |
| 624 print(' knowTypes[\'' + tableToClassName[e][0] + '\'] = [\'SkPdf' + tableTo
ClassName[e][0] + '*\', \'DictionaryFromDictionary2\', datatypes.CppNull(), \'re
t->podofo()->GetDataType() == ePdfDataType_Dictionary\']') |
| 625 print |
| 626 print |
| 627 |
| 628 |
| 629 #print lines |
| 630 fnewspec.close() |
| 631 |
| 632 if '__main__' == __name__: |
| 633 sys.exit(generateDef()) |
OLD | NEW |