home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_262 / win32rcparser.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-09-09  |  17.1 KB  |  591 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.7)
  3.  
  4. __author__ = 'Adam Walker'
  5. __version__ = '0.11'
  6. import sys
  7. import os
  8. import shlex
  9. import stat
  10. import pprint
  11. import win32con
  12. import commctrl
  13. _controlMap = {
  14.     'DEFPUSHBUTTON': 128,
  15.     'PUSHBUTTON': 128,
  16.     'Button': 128,
  17.     'GROUPBOX': 128,
  18.     'Static': 130,
  19.     'CTEXT': 130,
  20.     'RTEXT': 130,
  21.     'LTEXT': 130,
  22.     'LISTBOX': 131,
  23.     'SCROLLBAR': 132,
  24.     'COMBOBOX': 133,
  25.     'EDITTEXT': 129,
  26.     'ICON': 130,
  27.     'RICHEDIT': 'RichEdit20A' }
  28. _addDefaults = {
  29.     'EDITTEXT': win32con.WS_BORDER | win32con.WS_TABSTOP,
  30.     'GROUPBOX': win32con.BS_GROUPBOX,
  31.     'LTEXT': win32con.SS_LEFT,
  32.     'DEFPUSHBUTTON': win32con.BS_DEFPUSHBUTTON | win32con.WS_TABSTOP,
  33.     'PUSHBUTTON': win32con.WS_TABSTOP,
  34.     'CTEXT': win32con.SS_CENTER,
  35.     'RTEXT': win32con.SS_RIGHT,
  36.     'ICON': win32con.SS_ICON,
  37.     'LISTBOX': win32con.LBS_NOTIFY }
  38. defaultControlStyle = win32con.WS_CHILD | win32con.WS_VISIBLE
  39. defaultControlStyleEx = 0
  40.  
  41. class DialogDef:
  42.     name = ''
  43.     id = 0
  44.     style = 0
  45.     styleEx = None
  46.     caption = ''
  47.     font = 'MS Sans Serif'
  48.     fontSize = 8
  49.     x = 0
  50.     y = 0
  51.     w = 0
  52.     h = 0
  53.     template = None
  54.     
  55.     def __init__(self, n, i):
  56.         self.name = n
  57.         self.id = i
  58.         self.styles = []
  59.         self.stylesEx = []
  60.         self.controls = []
  61.  
  62.     
  63.     def createDialogTemplate(self):
  64.         t = None
  65.         self.template = [
  66.             [
  67.                 self.caption,
  68.                 (self.x, self.y, self.w, self.h),
  69.                 self.style,
  70.                 self.styleEx,
  71.                 (self.fontSize, self.font)]]
  72.         for control in self.controls:
  73.             self.template.append(control.createDialogTemplate())
  74.         
  75.         return self.template
  76.  
  77.  
  78.  
  79. class ControlDef:
  80.     id = ''
  81.     controlType = ''
  82.     subType = ''
  83.     idNum = 0
  84.     style = defaultControlStyle
  85.     styleEx = defaultControlStyleEx
  86.     label = ''
  87.     x = 0
  88.     y = 0
  89.     w = 0
  90.     h = 0
  91.     
  92.     def __init__(self):
  93.         self.styles = []
  94.         self.stylesEx = []
  95.  
  96.     
  97.     def toString(self):
  98.         s = '<Control id:' + self.id + ' controlType:' + self.controlType + ' subType:' + self.subType + ' idNum:' + str(self.idNum) + ' style:' + str(self.style) + ' styles:' + str(self.styles) + ' label:' + self.label + ' x:' + str(self.x) + ' y:' + str(self.y) + ' w:' + str(self.w) + ' h:' + str(self.h) + '>'
  99.         return s
  100.  
  101.     
  102.     def createDialogTemplate(self):
  103.         ct = self.controlType
  104.         if 'CONTROL' == ct:
  105.             ct = self.subType
  106.         if ct in _controlMap:
  107.             ct = _controlMap[ct]
  108.         t = [
  109.             ct,
  110.             self.label,
  111.             self.idNum,
  112.             (self.x, self.y, self.w, self.h),
  113.             self.style,
  114.             self.styleEx]
  115.         return t
  116.  
  117.  
  118.  
  119. class StringDef:
  120.     
  121.     def __init__(self, id, idNum, value):
  122.         self.id = id
  123.         self.idNum = idNum
  124.         self.value = value
  125.  
  126.     
  127.     def __repr__(self):
  128.         return 'StringDef(%r, %r, %r)' % (self.id, self.idNum, self.value)
  129.  
  130.  
  131.  
  132. class RCParser:
  133.     next_id = 1001
  134.     dialogs = { }
  135.     _dialogs = { }
  136.     debugEnabled = False
  137.     token = ''
  138.     
  139.     def __init__(self):
  140.         self.ungot = False
  141.         self.ids = {
  142.             'IDC_STATIC': -1 }
  143.         self.names = {
  144.             -1: 'IDC_STATIC' }
  145.         self.bitmaps = { }
  146.         self.stringTable = { }
  147.         self.icons = { }
  148.  
  149.     
  150.     def debug(self, *args):
  151.         if self.debugEnabled:
  152.             print args
  153.  
  154.     
  155.     def getToken(self):
  156.         if self.ungot:
  157.             self.ungot = False
  158.             self.debug('getToken returns (ungot):', self.token)
  159.             return self.token
  160.         self.token = None.lex.get_token()
  161.         self.debug('getToken returns:', self.token)
  162.         if self.token == '':
  163.             self.token = None
  164.         return self.token
  165.  
  166.     
  167.     def ungetToken(self):
  168.         self.ungot = True
  169.  
  170.     
  171.     def getCheckToken(self, expected):
  172.         tok = self.getToken()
  173.         return tok
  174.  
  175.     
  176.     def getCommaToken(self):
  177.         return self.getCheckToken(',')
  178.  
  179.     
  180.     def currentNumberToken(self):
  181.         mult = 1
  182.         if self.token == '-':
  183.             mult = -1
  184.             self.getToken()
  185.         return int(self.token) * mult
  186.  
  187.     
  188.     def currentQuotedString(self):
  189.         bits = [
  190.             self.token]
  191.         while None:
  192.             tok = self.getToken()
  193.             if not tok.startswith('"'):
  194.                 self.ungetToken()
  195.                 break
  196.             continue
  197.             sval = ''.join(bits)[1:-1]
  198.             for i, o in (('""', '"'), ('\\r', '\r'), ('\\n', '\n'), ('\\t', '\t')):
  199.                 sval = sval.replace(i, o)
  200.             
  201.         return sval
  202.  
  203.     
  204.     def load(self, rcstream):
  205.         self.open(rcstream)
  206.         self.getToken()
  207.         while self.token != None:
  208.             self.parse()
  209.             self.getToken()
  210.  
  211.     
  212.     def open(self, rcstream):
  213.         self.lex = shlex.shlex(rcstream)
  214.         self.lex.commenters = '//#'
  215.  
  216.     
  217.     def parseH(self, file):
  218.         lex = shlex.shlex(file)
  219.         lex.commenters = '//'
  220.         token = ' '
  221.         while token is not None:
  222.             token = lex.get_token()
  223.             if token == '' or token is None:
  224.                 token = None
  225.                 continue
  226.             if token == 'define':
  227.                 n = lex.get_token()
  228.                 i = int(lex.get_token())
  229.                 self.ids[n] = i
  230.                 if i in self.names:
  231.                     pass
  232.                 else:
  233.                     self.names[i] = n
  234.             if self.next_id <= i:
  235.                 self.next_id = i + 1
  236.             
  237.  
  238.     
  239.     def parse(self):
  240.         noid_parsers = {
  241.             'STRINGTABLE': self.parse_stringtable }
  242.         id_parsers = {
  243.             'DIALOG': self.parse_dialog,
  244.             'DIALOGEX': self.parse_dialog,
  245.             'BITMAP': self.parse_bitmap,
  246.             'ICON': self.parse_icon }
  247.         deep = 0
  248.         base_token = self.token
  249.         rp = noid_parsers.get(base_token)
  250.         if rp is not None:
  251.             rp()
  252.         else:
  253.             resource_id = self.token
  254.             self.getToken()
  255.             if self.token is None:
  256.                 return None
  257.             if None == self.token:
  258.                 deep = 1
  259.                 while deep != 0 and self.token is not None:
  260.                     self.getToken()
  261.                     self.debug('Zooming over', self.token)
  262.                     if 'BEGIN' == self.token:
  263.                         deep += 1
  264.                         continue
  265.                     if 'END' == self.token:
  266.                         deep -= 1
  267.                         continue
  268.             rp = id_parsers.get(self.token)
  269.             if rp is not None:
  270.                 self.debug("Dispatching '%s'" % (self.token,))
  271.                 rp(resource_id)
  272.             else:
  273.                 self.debug("Skipping top-level '%s'" % base_token)
  274.                 self.ungetToken()
  275.  
  276.     
  277.     def addId(self, id_name):
  278.         return id
  279.  
  280.     
  281.     def lang(self):
  282.         while self.token[0:4] == 'LANG' and self.token[0:7] == 'SUBLANG' or self.token == ',':
  283.             self.getToken()
  284.  
  285.     
  286.     def parse_textinclude(self, res_id):
  287.         while self.getToken() != 'BEGIN':
  288.             pass
  289.         while self.token == 'END':
  290.             break
  291.         s = self.getToken()
  292.         continue
  293.  
  294.     
  295.     def parse_stringtable(self):
  296.         while self.getToken() != 'BEGIN':
  297.             pass
  298.         while None:
  299.             if self.token == 'END':
  300.                 break
  301.             sid = self.token
  302.             self.getToken()
  303.             sd = StringDef(sid, self.addId(sid), self.currentQuotedString())
  304.             self.stringTable[sid] = sd
  305.             continue
  306.             return None
  307.  
  308.     
  309.     def parse_bitmap(self, name):
  310.         return self.parse_bitmap_or_icon(name, self.bitmaps)
  311.  
  312.     
  313.     def parse_icon(self, name):
  314.         return self.parse_bitmap_or_icon(name, self.icons)
  315.  
  316.     
  317.     def parse_bitmap_or_icon(self, name, dic):
  318.         self.getToken()
  319.         while not self.token.startswith('"'):
  320.             self.getToken()
  321.         bmf = self.token[1:-1]
  322.         dic[name] = bmf
  323.  
  324.     
  325.     def parse_dialog(self, name):
  326.         dlg = DialogDef(name, self.addId(name))
  327.         self._dialogs[name] = dlg
  328.         extras = []
  329.         self.getToken()
  330.         while not self.token.isdigit():
  331.             self.debug('extra', self.token)
  332.             extras.append(self.token)
  333.             self.getToken()
  334.         dlg.x = int(self.token)
  335.         self.getCommaToken()
  336.         self.getToken()
  337.         dlg.y = int(self.token)
  338.         self.getCommaToken()
  339.         self.getToken()
  340.         dlg.w = int(self.token)
  341.         self.getCommaToken()
  342.         self.getToken()
  343.         dlg.h = int(self.token)
  344.         self.getToken()
  345.         while not self.token == None and self.token == '' or self.token == 'END':
  346.             if self.token == 'STYLE':
  347.                 self.dialogStyle(dlg)
  348.                 continue
  349.             if self.token == 'EXSTYLE':
  350.                 self.dialogExStyle(dlg)
  351.                 continue
  352.             if self.token == 'CAPTION':
  353.                 self.dialogCaption(dlg)
  354.                 continue
  355.             if self.token == 'FONT':
  356.                 self.dialogFont(dlg)
  357.                 continue
  358.             if self.token == 'BEGIN':
  359.                 self.controls(dlg)
  360.                 continue
  361.             break
  362.         self.dialogs[name] = dlg.createDialogTemplate()
  363.  
  364.     
  365.     def dialogStyle(self, dlg):
  366.         (dlg.style, dlg.styles) = self.styles([], win32con.DS_SETFONT)
  367.  
  368.     
  369.     def dialogExStyle(self, dlg):
  370.         self.getToken()
  371.         (dlg.styleEx, dlg.stylesEx) = self.styles([], 0)
  372.  
  373.     
  374.     def styles(self, defaults, defaultStyle):
  375.         list = defaults
  376.         style = defaultStyle
  377.         if 'STYLE' == self.token:
  378.             self.getToken()
  379.         i = 0
  380.         Not = False
  381.         while ((i % 2 == 1 or '|' == self.token) and 'NOT' == self.token or i % 2 == 0) and not (self.token == None):
  382.             Not = False
  383.             if 'NOT' == self.token:
  384.                 Not = True
  385.                 self.getToken()
  386.             i += 1
  387.             if self.token != '|':
  388.                 if self.token in win32con.__dict__:
  389.                     value = getattr(win32con, self.token)
  390.                 elif self.token in commctrl.__dict__:
  391.                     value = getattr(commctrl, self.token)
  392.                 else:
  393.                     value = 0
  394.                 if Not:
  395.                     list.append('NOT ' + self.token)
  396.                     self.debug('styles add Not', self.token, value)
  397.                     style &= ~value
  398.                 else:
  399.                     list.append(self.token)
  400.                     self.debug('styles add', self.token, value)
  401.                     style |= value
  402.             self.getToken()
  403.         self.debug('style is ', style)
  404.         return (style, list)
  405.  
  406.     
  407.     def dialogCaption(self, dlg):
  408.         if 'CAPTION' == self.token:
  409.             self.getToken()
  410.         self.token = self.token[1:-1]
  411.         self.debug('Caption is:', self.token)
  412.         dlg.caption = self.token
  413.         self.getToken()
  414.  
  415.     
  416.     def dialogFont(self, dlg):
  417.         if 'FONT' == self.token:
  418.             self.getToken()
  419.         dlg.fontSize = int(self.token)
  420.         self.getCommaToken()
  421.         self.getToken()
  422.         dlg.font = self.token[1:-1]
  423.         self.getToken()
  424.         while 'BEGIN' != self.token:
  425.             self.getToken()
  426.  
  427.     
  428.     def controls(self, dlg):
  429.         if self.token == 'BEGIN':
  430.             self.getToken()
  431.         without_text = [
  432.             'EDITTEXT',
  433.             'COMBOBOX',
  434.             'LISTBOX',
  435.             'SCROLLBAR']
  436.         while self.token != 'END':
  437.             control = ControlDef()
  438.             control.controlType = self.token
  439.             self.getToken()
  440.             if control.controlType not in without_text:
  441.                 if self.token[0:1] == '"':
  442.                     control.label = self.currentQuotedString()
  443.                 elif self.token == '-' or self.token.isdigit():
  444.                     control.label = str(self.currentNumberToken())
  445.                 else:
  446.                     control.label = str(self.addId(self.token))
  447.                 self.getCommaToken()
  448.                 self.getToken()
  449.             if self.token == '-' or self.token.isdigit():
  450.                 control.id = self.currentNumberToken()
  451.                 control.idNum = control.id
  452.             else:
  453.                 control.id = self.token
  454.                 control.idNum = self.addId(control.id)
  455.             self.getCommaToken()
  456.             if control.controlType == 'CONTROL':
  457.                 self.getToken()
  458.                 control.subType = self.token[1:-1]
  459.                 thisDefaultStyle = defaultControlStyle | _addDefaults.get(control.subType, 0)
  460.                 self.getCommaToken()
  461.                 self.getToken()
  462.                 (control.style, control.styles) = self.styles([], thisDefaultStyle)
  463.             else:
  464.                 thisDefaultStyle = defaultControlStyle | _addDefaults.get(control.controlType, 0)
  465.                 control.style = thisDefaultStyle
  466.             control.x = int(self.getToken())
  467.             self.getCommaToken()
  468.             control.y = int(self.getToken())
  469.             self.getCommaToken()
  470.             control.w = int(self.getToken())
  471.             self.getCommaToken()
  472.             self.getToken()
  473.             control.h = int(self.token)
  474.             self.getToken()
  475.             if self.token == ',':
  476.                 self.getToken()
  477.                 (control.style, control.styles) = self.styles([], thisDefaultStyle)
  478.             if self.token == ',':
  479.                 self.getToken()
  480.                 (control.styleEx, control.stylesEx) = self.styles([], defaultControlStyleEx)
  481.             dlg.controls.append(control)
  482.  
  483.  
  484.  
  485. def ParseStreams(rc_file, h_file):
  486.     rcp = RCParser()
  487.     if h_file:
  488.         rcp.parseH(h_file)
  489.     
  490.     try:
  491.         rcp.load(rc_file)
  492.     except:
  493.         lex = getattr(rcp, 'lex', None)
  494.         if lex:
  495.             print 'ERROR parsing dialogs at line', lex.lineno
  496.             print 'Next 10 tokens are:'
  497.             for i in range(10):
  498.                 print lex.get_token(),
  499.             
  500.             print 
  501.         raise 
  502.  
  503.     return rcp
  504.  
  505.  
  506. def Parse(rc_name, h_name = None):
  507.     if h_name:
  508.         h_file = open(h_name, 'rU')
  509.     else:
  510.         h_name = rc_name[:-2] + 'h'
  511.         
  512.         try:
  513.             h_file = open(h_name, 'rU')
  514.         except IOError:
  515.             h_name = os.path.join(os.path.dirname(rc_name), 'resource.h')
  516.             
  517.             try:
  518.                 h_file = open(h_name, 'rU')
  519.             except IOError:
  520.                 h_file = None
  521.             
  522.  
  523.  
  524.     rc_file = open(rc_name, 'rU')
  525.     
  526.     try:
  527.         return ParseStreams(rc_file, h_file)
  528.     finally:
  529.         if h_file is not None:
  530.             h_file.close()
  531.         rc_file.close()
  532.  
  533.     return rcp
  534.  
  535.  
  536. def GenerateFrozenResource(rc_name, output_name, h_name = None):
  537.     rcp = Parse(rc_name, h_name)
  538.     in_stat = os.stat(rc_name)
  539.     out = open(output_name, 'wt')
  540.     out.write('#%s\n' % output_name)
  541.     out.write('#This is a generated file. Please edit %s instead.\n' % rc_name)
  542.     out.write('__version__=%r\n' % __version__)
  543.     out.write('_rc_size_=%d\n_rc_mtime_=%d\n' % (in_stat[stat.ST_SIZE], in_stat[stat.ST_MTIME]))
  544.     out.write('class StringDef:\n')
  545.     out.write('\tdef __init__(self, id, idNum, value):\n')
  546.     out.write('\t\tself.id = id\n')
  547.     out.write('\t\tself.idNum = idNum\n')
  548.     out.write('\t\tself.value = value\n')
  549.     out.write('\tdef __repr__(self):\n')
  550.     out.write('\t\treturn "StringDef(%r, %r, %r)" % (self.id, self.idNum, self.value)\n')
  551.     out.write('class FakeParser:\n')
  552.     for name in ('dialogs', 'ids', 'names', 'bitmaps', 'icons', 'stringTable'):
  553.         out.write('\t%s = \\\n' % (name,))
  554.         pprint.pprint(getattr(rcp, name), out)
  555.         out.write('\n')
  556.     
  557.     out.write('def Parse(s):\n')
  558.     out.write('\treturn FakeParser()\n')
  559.     out.close()
  560.  
  561. if __name__ == '__main__':
  562.     if len(sys.argv) <= 1:
  563.         print __doc__
  564.         print 
  565.         print 'See test_win32rcparser.py, and the win32rcparser directory (both'
  566.         print "in the test suite) for an example of this module's usage."
  567.     else:
  568.         import pprint
  569.         filename = sys.argv[1]
  570.         if '-v' in sys.argv:
  571.             RCParser.debugEnabled = 1
  572.         print "Dumping all resources in '%s'" % filename
  573.         resources = Parse(filename)
  574.         for id, ddef in resources.dialogs.iteritems():
  575.             print 'Dialog %s (%d controls)' % (id, len(ddef))
  576.             pprint.pprint(ddef)
  577.             print 
  578.         
  579.         for id, sdef in resources.stringTable.iteritems():
  580.             print 'String %s=%r' % (id, sdef.value)
  581.             print 
  582.         
  583.         for id, sdef in resources.bitmaps.iteritems():
  584.             print 'Bitmap %s=%r' % (id, sdef)
  585.             print 
  586.         
  587.         for id, sdef in resources.icons.iteritems():
  588.             print 'Icon %s=%r' % (id, sdef)
  589.             print 
  590.         
  591.