| Index: experimental/PdfViewer/spec2def.py
|
| ===================================================================
|
| --- experimental/PdfViewer/spec2def.py (revision 0)
|
| +++ experimental/PdfViewer/spec2def.py (revision 0)
|
| @@ -0,0 +1,271 @@
|
| +#!/usr/local/bin/python
|
| +# coding: utf-8
|
| +
|
| +import sys
|
| +import re
|
| +
|
| +# TODO(edisonn): put processed part of file in a new file
|
| +# put unprocessed part, in a new file, so we see what we miss
|
| +# keep blank lines, and generate a version without the blank lines
|
| +
|
| +#TODO (edisonn): deal manually with
|
| +# TABLE 7.11 Restrictions on the entries in a soft-mask image dictionary
|
| +#KEY RESTRICTION
|
| +
|
| +
|
| +
|
| +lines = 0
|
| +table = ''
|
| +tableHeaderFound = False
|
| +tableLine = 0
|
| +tableRow = 0
|
| +columnWidth = []
|
| +columnValues = ['', '', '']
|
| +mustFollowTableHeader = False
|
| +
|
| +knownTypes = {
|
| +'(any)',
|
| +unicode('undefined', 'utf8'),
|
| +'(undefined)',
|
| +'(various)',
|
| +'array',
|
| +'or',
|
| +'boolean',
|
| +'date',
|
| +'dictionary',
|
| +'function',
|
| +'integer',
|
| +unicode('file', 'utf8'),
|
| +'file',
|
| +unicode('specification', 'utf8'),
|
| +'specification',
|
| +'name',
|
| +'tree',
|
| +'number',
|
| +'rectangle',
|
| +'stream',
|
| +'string',
|
| +'text',
|
| +',',
|
| +' '
|
| +}
|
| +
|
| +def acceptType(val):
|
| + global knownTypes
|
| +
|
| + ret = val
|
| +
|
| + for item in knownTypes:
|
| + ret = ret.replace(item, '')
|
| +
|
| + return ret == ''
|
| +
|
| +
|
| +def inTable():
|
| + global tableHeaderFound
|
| + return tableHeaderFound
|
| +
|
| +def tableDescriptionFound(desc):
|
| + global table
|
| + table = desc.strip()
|
| +
|
| +def tableHasHeader():
|
| + global table
|
| + global tableHeaderFound
|
| +
|
| + tableHeaderFound = True
|
| + #print table
|
| +
|
| +
|
| +def commitRow():
|
| + global columnValues
|
| + #print columnValues
|
| +
|
| + lastClosed = columnValues[2].find(')')
|
| + if lastClosed < 0:
|
| + print 'ERRRRRRRRRRRRRRROR'
|
| + print columnValues
|
| + return
|
| +
|
| + spec = columnValues[2][:lastClosed + 1]
|
| + spec = spec.replace('(', ';')
|
| + spec = spec.replace(')', ';')
|
| + spec = spec.strip(';')
|
| +
|
| + specs = spec.split(';')
|
| +
|
| + # clearly required, but it can be required with conditions. don't handle this ones here, but manually
|
| + required = specs[0] == 'Required'
|
| +
|
| + inheritable = False
|
| + version = ''
|
| + for s in specs:
|
| + if s.strip() == 'inheritable' or s.strip() == 'Inheritable':
|
| + inheritable = True
|
| + elif re.match('^PDF [0-9]*[\.[0-9]*]*', s.strip()):
|
| + version = s.strip()
|
| + elif s != 'Required':
|
| + required = False
|
| +
|
| + print spec
|
| + print specs
|
| + print required
|
| + print inheritable
|
| + print version
|
| + print columnValues
|
| +
|
| +def newRow(first, second, third):
|
| + global columnValues
|
| + columnValues = [first.rstrip(), second.rstrip(), third.rstrip()]
|
| +
|
| +def appendRow(second, third):
|
| + global columnValues
|
| + if second.rstrip() != '':
|
| + columnValues[1] = columnValues[1] + ' ' + second.rstrip()
|
| + if third.rstrip() != '':
|
| + columnValues[2] = columnValues[2] + ' ' + third.rstrip()
|
| +
|
| +def rebaseTable(line):
|
| + global knownTypes
|
| + global columnWidth
|
| +
|
| + words = line.split()
|
| +
|
| + if len(words) < 3:
|
| + return False
|
| +
|
| + i = 1
|
| + while i < len(words) - 1 and words[i] in knownTypes:
|
| + i = i + 1
|
| +
|
| + if words[i].startswith('(Optional') or words[i].startswith('(Required'):
|
| + commitRow()
|
| +
|
| + columnWidth[0] = line.find(words[1])
|
| +
|
| + if words[i].startswith('(Optional'):
|
| + columnWidth[1] = line.find('(Optional') - columnWidth[0]
|
| + if words[i].startswith('(Required'):
|
| + columnWidth[1] = line.find('(Required') - columnWidth[0]
|
| + return True
|
| +
|
| + return False
|
| +
|
| +
|
| +def stopTable():
|
| + global tableHeaderFound
|
| + commitRow()
|
| + tableHeaderFound = False
|
| +
|
| +
|
| +def killTable():
|
| + return
|
| +
|
| +def processLine(line):
|
| + global lines
|
| + global tableLine
|
| + global tableRow
|
| + global columnWidth
|
| + global columnValues
|
| + global mustFollowTableHeader
|
| +
|
| + lines = lines + 1
|
| +
|
| + line = unicode(line, 'utf8')
|
| +
|
| + striped = line.rstrip()
|
| +
|
| + words = line.split()
|
| + if len(words) == 0:
|
| + return
|
| +
|
| + if words[0] == 'TABLE':
|
| + tableDescriptionFound(striped)
|
| + mustFollowTableHeader = True
|
| + return
|
| +
|
| + if mustFollowTableHeader:
|
| + mustFollowTableHeader = False
|
| + if len(words) != 3:
|
| + killTable()
|
| +
|
| + # TODO(edisonn): support for generic table!
|
| + if words[0] != 'KEY' or words[1] != 'TYPE' or words[2] != 'VALUE':
|
| + killTable()
|
| + return
|
| +
|
| + tableHasHeader()
|
| + columnWidth = [0, 0, 0]
|
| + columnWidth[0] = striped.index('TYPE')
|
| + columnWidth[1] = striped.index('VALUE') - striped.index('TYPE')
|
| + columnWidth[2] = 0
|
| + return
|
| +
|
| + if inTable():
|
| + tableLine = tableLine + 1
|
| + first = striped[0 : columnWidth[0]]
|
| + second = striped[columnWidth[0] : columnWidth[0] + columnWidth[1]]
|
| + third = striped[columnWidth[0] + columnWidth[1] :]
|
| +
|
| + if tableLine == 1:
|
| + if third[0] != '(':
|
| + killTable()
|
| + return
|
| +
|
| + newRow(first, second, third)
|
| + return
|
| +
|
| + if rebaseTable(striped):
|
| + first = striped[0 : columnWidth[0]]
|
| + second = striped[columnWidth[0] : columnWidth[0] + columnWidth[1]]
|
| + third = striped[columnWidth[0] + columnWidth[1] :]
|
| +
|
| + first = first.rstrip()
|
| + second = second.rstrip()
|
| + third = third.rstrip()
|
| +
|
| + if first == '' and second == '' and third != '':
|
| + appendRow(second, third)
|
| + return
|
| +
|
| + if len(first.split()) > 1:
|
| + stopTable()
|
| + return
|
| +
|
| + if first != '' and first[0] == ' ':
|
| + stopTable()
|
| + return
|
| +
|
| + if first != '' and second != '' and third == '':
|
| + stopTable()
|
| + return
|
| +
|
| + if first == '' and second != '' and second[0] != ' ':
|
| + if acceptType(second):
|
| + appendRow(second, third)
|
| + else:
|
| + stopTable()
|
| + return
|
| +
|
| + if first != '' and second != '' and third[0] != '(':
|
| + stopTable()
|
| + return
|
| +
|
| + if first == '' and second != '' and second[0] == ' ':
|
| + stopTable()
|
| + return
|
| +
|
| + if first != '' and second != '' and third[0] == '(':
|
| + commitRow()
|
| + newRow(first, second, third)
|
| + return
|
| +
|
| +
|
| +def generateDef():
|
| + global lines
|
| + for line in sys.stdin:
|
| + processLine(line)
|
| + print lines
|
| +
|
| +if '__main__' == __name__:
|
| + sys.exit(generateDef())
|
|
|