home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1124 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  29.9 KB  |  813 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import re
  6. import tempfile
  7. from calibre.ebooks.rtf2xml import copy, check_brackets
  8.  
  9. class ProcessTokens:
  10.     
  11.     def __init__(self, in_file, exception_handler, bug_handler, copy = None, run_level = 1):
  12.         self._ProcessTokens__file = in_file
  13.         self._ProcessTokens__bug_handler = bug_handler
  14.         self._ProcessTokens__copy = copy
  15.         self._ProcessTokens__run_level = run_level
  16.         self._ProcessTokens__write_to = tempfile.mktemp()
  17.         self.initiate_token_dict()
  18.         self.compile_expressions()
  19.         self._ProcessTokens__bracket_count = 0
  20.         self._ProcessTokens__exception_handler = exception_handler
  21.         self._ProcessTokens__bug_handler = bug_handler
  22.  
  23.     
  24.     def compile_expressions(self):
  25.         self._ProcessTokens__num_exp = re.compile('([a-zA-Z]+)(.*)')
  26.         self._ProcessTokens__utf_exp = re.compile('(&.*?;)')
  27.  
  28.     
  29.     def initiate_token_dict(self):
  30.         self._ProcessTokens__return_code = 0
  31.         self.dict_token = {
  32.             'mshex': ('nu', '__________', self._ProcessTokens__ms_hex_func),
  33.             '{': ('nu', '{', self.ob_func),
  34.             '}': ('nu', '}', self.cb_func),
  35.             'ldblquote': ('mc', 'ldblquote', self.ms_sub_func),
  36.             'rdblquote': ('mc', 'rdblquote', self.ms_sub_func),
  37.             'rquote': ('mc', 'rquote', self.ms_sub_func),
  38.             'lquote': ('mc', 'lquote', self.ms_sub_func),
  39.             'emdash': ('mc', 'emdash', self.ms_sub_func),
  40.             'endash': ('mc', 'endash', self.ms_sub_func),
  41.             'bullet': ('mc', 'bullet', self.ms_sub_func),
  42.             '~': ('mc', '~', self.ms_sub_func),
  43.             'tab': ('mc', 'tab', self.ms_sub_func),
  44.             '_': ('mc', '_', self.ms_sub_func),
  45.             ';': ('mc', ';', self.ms_sub_func),
  46.             '-': ('mc', '-', self.ms_sub_func),
  47.             '*': ('ml', 'asterisk__', self.default_func),
  48.             ':': ('ml', 'colon_____', self.default_func),
  49.             'backslash': ('nu', '\\', self.text_func),
  50.             'ob': ('nu', '{', self.text_func),
  51.             'cb': ('nu', '}', self.text_func),
  52.             'line': ('nu', 'hard-lineb', self.default_func),
  53.             'page': ('pf', 'page-break', self.default_func),
  54.             'par': ('pf', 'par-end___', self.default_func),
  55.             'pard': ('pf', 'par-def___', self.default_func),
  56.             'keepn': ('pf', 'keep-w-nex', self.bool_st_func),
  57.             'widctlpar': ('pf', 'widow-cntl', self.bool_st_func),
  58.             'adjustright': ('pf', 'adjust-rgt', self.bool_st_func),
  59.             'lang': ('pf', 'language__', self._ProcessTokens__language_func),
  60.             'ri': ('pf', 'right-inde', self.divide_by_20),
  61.             'fi': ('pf', 'fir-ln-ind', self.divide_by_20),
  62.             'li': ('pf', 'left-inden', self.divide_by_20),
  63.             'sb': ('pf', 'space-befo', self.divide_by_20),
  64.             'sa': ('pf', 'space-afte', self.divide_by_20),
  65.             'sl': ('pf', 'line-space', self.divide_by_20),
  66.             'deftab': ('pf', 'default-ta', self.divide_by_20),
  67.             'ql': ('pf', 'align_____<left', self.two_part_func),
  68.             'qc': ('pf', 'align_____<cent', self.two_part_func),
  69.             'qj': ('pf', 'align_____<just', self.two_part_func),
  70.             'qr': ('pf', 'align_____<right', self.two_part_func),
  71.             'nowidctlpar': ('pf', 'widow-cntr<false', self.two_part_func),
  72.             'tx': ('pf', 'tab-stop__', self.divide_by_20),
  73.             'tb': ('pf', 'tab-bar-st', self.divide_by_20),
  74.             'tqr': ('pf', 'tab-right_', self.default_func),
  75.             'tqdec': ('pf', 'tab-dec___', self.default_func),
  76.             'tqc': ('pf', 'tab-center', self.default_func),
  77.             'tlul': ('pf', 'leader-und', self.default_func),
  78.             'tlhyph': ('pf', 'leader-hyp', self.default_func),
  79.             'tldot': ('pf', 'leader-dot', self.default_func),
  80.             'stylesheet': ('ss', 'style-shet', self.default_func),
  81.             'sbasedon': ('ss', 'based-on__', self.default_func),
  82.             'snext': ('ss', 'next-style', self.default_func),
  83.             'cs': ('ss', 'char-style', self.default_func),
  84.             's': ('ss', 'para-style', self.default_func),
  85.             'pict': ('gr', 'picture___', self.default_func),
  86.             'objclass': ('gr', 'obj-class_', self.default_func),
  87.             'macpict': ('gr', 'mac-pic___', self.default_func),
  88.             'sect': ('sc', 'section___', self.default_func),
  89.             'sectd': ('sc', 'sect-defin', self.default_func),
  90.             'endhere': ('sc', 'sect-note_', self.default_func),
  91.             'pntext': ('ls', 'list-text_', self.default_func),
  92.             'listtext': ('ls', 'list-text_', self.default_func),
  93.             'pn': ('ls', 'list______', self.default_func),
  94.             'pnseclvl': ('ls', 'list-level', self.default_func),
  95.             'pncard': ('ls', 'list-cardi', self.bool_st_func),
  96.             'pndec': ('ls', 'list-decim', self.bool_st_func),
  97.             'pnucltr': ('ls', 'list-up-al', self.bool_st_func),
  98.             'pnucrm': ('ls', 'list-up-ro', self.bool_st_func),
  99.             'pnord': ('ls', 'list-ord__', self.bool_st_func),
  100.             'pnordt': ('ls', 'list-ordte', self.bool_st_func),
  101.             'pnlvlblt': ('ls', 'list-bulli', self.bool_st_func),
  102.             'pnlvlbody': ('ls', 'list-simpi', self.bool_st_func),
  103.             'pnlvlcont': ('ls', 'list-conti', self.bool_st_func),
  104.             'pnhang': ('ls', 'list-hang_', self.bool_st_func),
  105.             'pntxtb': ('ls', 'list-tebef', self.bool_st_func),
  106.             'ilvl': ('ls', 'list-level', self.default_func),
  107.             'ls': ('ls', 'list-id___', self.default_func),
  108.             'pnstart': ('ls', 'list-start', self.default_func),
  109.             'itap': ('ls', 'nest-level', self.default_func),
  110.             'leveltext': ('ls', 'level-text', self.default_func),
  111.             'levelnumbers': ('ls', 'level-numb', self.default_func),
  112.             'list': ('ls', 'list-in-tb', self.default_func),
  113.             'listlevel': ('ls', 'list-tb-le', self.default_func),
  114.             'listname': ('ls', 'list-name_', self.default_func),
  115.             'listtemplateid': ('ls', 'ls-tem-id_', self.default_func),
  116.             'leveltemplateid': ('ls', 'lv-tem-id_', self.default_func),
  117.             'listhybrid': ('ls', 'list-hybri', self.default_func),
  118.             'levelstartat': ('ls', 'level-star', self.default_func),
  119.             'levelspace': ('ls', 'level-spac', self.divide_by_20),
  120.             'levelindent': ('ls', 'level-inde', self.default_func),
  121.             'levelnfc': ('ls', 'level-type', self._ProcessTokens__list_type_func),
  122.             'levelnfcn': ('ls', 'level-type', self._ProcessTokens__list_type_func),
  123.             'listid': ('ls', 'lis-tbl-id', self.default_func),
  124.             'listoverride': ('ls', 'lis-overid', self.default_func),
  125.             'pnlvl': ('ls', 'list-level', self.default_func),
  126.             'rtf': ('ri', 'rtf_______', self.default_func),
  127.             'deff': ('ri', 'deflt-font', self.default_func),
  128.             'mac': ('ri', 'macintosh_', self.default_func),
  129.             'ansi': ('ri', 'ansi______', self.default_func),
  130.             'ansicpg': ('ri', 'ansi-codpg', self.default_func),
  131.             'footnote': ('nt', 'footnote__', self.default_func),
  132.             'ftnalt': ('nt', 'type______<endnote', self.two_part_func),
  133.             'tc': ('an', 'toc_______', self.default_func),
  134.             'bkmkstt': ('an', 'book-mk-st', self.default_func),
  135.             'bkmkstart': ('an', 'book-mk-st', self.default_func),
  136.             'bkmkend': ('an', 'book-mk-en', self.default_func),
  137.             'xe': ('an', 'index-mark', self.default_func),
  138.             'rxe': ('an', 'place_____', self.default_func),
  139.             'bxe': ('in', 'index-bold', self.default_func),
  140.             'ixe': ('in', 'index-ital', self.default_func),
  141.             'txe': ('in', 'index-see_', self.default_func),
  142.             'tcl': ('tc', 'toc-level_', self.default_func),
  143.             'tcn': ('tc', 'toc-sup-nu', self.default_func),
  144.             'field': ('fd', 'field_____', self.default_func),
  145.             'fldinst': ('fd', 'field-inst', self.default_func),
  146.             'fldrslt': ('fd', 'field-rslt', self.default_func),
  147.             'datafield': ('fd', 'datafield_', self.default_func),
  148.             'fonttbl': ('it', 'font-table', self.default_func),
  149.             'colortbl': ('it', 'colr-table', self.default_func),
  150.             'listoverridetable': ('it', 'lovr-table', self.default_func),
  151.             'listtable': ('it', 'listtable_', self.default_func),
  152.             'revtbl': ('it', 'revi-table', self.default_func),
  153.             'b': ('ci', 'bold______', self.bool_st_func),
  154.             'blue': ('ci', 'blue______', self.color_func),
  155.             'caps': ('ci', 'caps______', self.bool_st_func),
  156.             'cf': ('ci', 'font-color', self.default_func),
  157.             'chftn': ('ci', 'footnot-mk', self.bool_st_func),
  158.             'dn': ('ci', 'font-down_', self.divide_by_2),
  159.             'embo': ('ci', 'emboss____', self.bool_st_func),
  160.             'f': ('ci', 'font-style', self.default_func),
  161.             'fs': ('ci', 'font-size_', self.divide_by_2),
  162.             'green': ('ci', 'green_____', self.color_func),
  163.             'i': ('ci', 'italics___', self.bool_st_func),
  164.             'impr': ('ci', 'engrave___', self.bool_st_func),
  165.             'outl': ('ci', 'outline___', self.bool_st_func),
  166.             'plain': ('ci', 'plain_____', self.bool_st_func),
  167.             'red': ('ci', 'red_______', self.color_func),
  168.             'scaps': ('ci', 'small-caps', self.bool_st_func),
  169.             'shad': ('ci', 'shadow____', self.bool_st_func),
  170.             'strike': ('ci', 'strike-thr', self.bool_st_func),
  171.             'striked': ('ci', 'dbl-strike', self.bool_st_func),
  172.             'sub': ('ci', 'subscript_', self.bool_st_func),
  173.             'super': ('ci', 'superscrip', self.bool_st_func),
  174.             'nosupersub': ('ci', 'no-su-supe', self._ProcessTokens__no_sup_sub_func),
  175.             'up': ('ci', 'font-up___', self.divide_by_2),
  176.             'v': ('ci', 'hidden____', self.default_func),
  177.             'trowd': ('tb', 'row-def___', self.default_func),
  178.             'cell': ('tb', 'cell______', self.default_func),
  179.             'row': ('tb', 'row_______', self.default_func),
  180.             'intbl': ('tb', 'in-table__', self.default_func),
  181.             'cols': ('tb', 'columns___', self.default_func),
  182.             'trleft': ('tb', 'row-pos-le', self.divide_by_20),
  183.             'cellx': ('tb', 'cell-posit', self.divide_by_20),
  184.             'trhdr': ('tb', 'row-header', self.default_func),
  185.             'info': ('di', 'doc-info__', self.default_func),
  186.             'author': ('di', 'author____', self.default_func),
  187.             'operator': ('di', 'operator__', self.default_func),
  188.             'title': ('di', 'title_____', self.default_func),
  189.             'keywords': ('di', 'keywords__', self.default_func),
  190.             'doccomm': ('di', 'doc-notes_', self.default_func),
  191.             'comment': ('di', 'doc-notes_', self.default_func),
  192.             'subject': ('di', 'subject___', self.default_func),
  193.             'creatim': ('di', 'create-tim', self.default_func),
  194.             'yr': ('di', 'year______', self.default_func),
  195.             'mo': ('di', 'month_____', self.default_func),
  196.             'dy': ('di', 'day_______', self.default_func),
  197.             'min': ('di', 'minute____', self.default_func),
  198.             'revtim': ('di', 'revis-time', self.default_func),
  199.             'nofwords': ('di', 'num-of-wor', self.default_func),
  200.             'nofchars': ('di', 'num-of-chr', self.default_func),
  201.             'nofpages': ('di', 'num-of-pag', self.default_func),
  202.             'edmins': ('di', 'edit-time_', self.default_func),
  203.             'headerf': ('hf', 'head-first', self.default_func),
  204.             'headerl': ('hf', 'head-left_', self.default_func),
  205.             'headerr': ('hf', 'head-right', self.default_func),
  206.             'footerf': ('hf', 'foot-first', self.default_func),
  207.             'footerl': ('hf', 'foot-left_', self.default_func),
  208.             'footerr': ('hf', 'foot-right', self.default_func),
  209.             'header': ('hf', 'header____', self.default_func),
  210.             'footer': ('hf', 'footer____', self.default_func),
  211.             'margl': ('pa', 'margin-lef', self.divide_by_20),
  212.             'margr': ('pa', 'margin-rig', self.divide_by_20),
  213.             'margb': ('pa', 'margin-bot', self.divide_by_20),
  214.             'margt': ('pa', 'margin-top', self.divide_by_20),
  215.             'gutter': ('pa', 'gutter____', self.divide_by_20),
  216.             'paperw': ('pa', 'paper-widt', self.divide_by_20),
  217.             'paperh': ('pa', 'paper-hght', self.divide_by_20),
  218.             'annotation': ('an', 'annotation', self.default_func),
  219.             'ul': ('ul', 'underlined<continous', self.two_part_func),
  220.             'uld': ('ul', 'underlined<dotted', self.two_part_func),
  221.             'uldash': ('ul', 'underlined<dash', self.two_part_func),
  222.             'uldashd': ('ul', 'underlined<dash-dot', self.two_part_func),
  223.             'uldashdd': ('ul', 'underlined<dash-dot-dot', self.two_part_func),
  224.             'uldb': ('ul', 'underlined<double', self.two_part_func),
  225.             'ulhwave': ('ul', 'underlined<heavy-wave', self.two_part_func),
  226.             'ulldash': ('ul', 'underlined<long-dash', self.two_part_func),
  227.             'ulth': ('ul', 'underlined<thich', self.two_part_func),
  228.             'ulthd': ('ul', 'underlined<thick-dotted', self.two_part_func),
  229.             'ulthdash': ('ul', 'underlined<thick-dash', self.two_part_func),
  230.             'ulthdashd': ('ul', 'underlined<thick-dash-dot', self.two_part_func),
  231.             'ulthdashdd': ('ul', 'underlined<thick-dash-dot-dot', self.two_part_func),
  232.             'ulthldash': ('ul', 'underlined<thick-long-dash', self.two_part_func),
  233.             'ululdbwave': ('ul', 'underlined<double-wave', self.two_part_func),
  234.             'ulw': ('ul', 'underlined<word', self.two_part_func),
  235.             'ulwave': ('ul', 'underlined<wave', self.two_part_func),
  236.             'ulnone': ('ul', 'underlined<false', self.two_part_func),
  237.             'trbrdrh': ('bd', 'bor-t-r-hi', self.default_func),
  238.             'trbrdrv': ('bd', 'bor-t-r-vi', self.default_func),
  239.             'trbrdrt': ('bd', 'bor-t-r-to', self.default_func),
  240.             'trbrdrl': ('bd', 'bor-t-r-le', self.default_func),
  241.             'trbrdrb': ('bd', 'bor-t-r-bo', self.default_func),
  242.             'trbrdrr': ('bd', 'bor-t-r-ri', self.default_func),
  243.             'clbrdrb': ('bd', 'bor-cel-bo', self.default_func),
  244.             'clbrdrt': ('bd', 'bor-cel-to', self.default_func),
  245.             'clbrdrl': ('bd', 'bor-cel-le', self.default_func),
  246.             'clbrdrr': ('bd', 'bor-cel-ri', self.default_func),
  247.             'brdrb': ('bd', 'bor-par-bo', self.default_func),
  248.             'brdrt': ('bd', 'bor-par-to', self.default_func),
  249.             'brdrl': ('bd', 'bor-par-le', self.default_func),
  250.             'brdrr': ('bd', 'bor-par-ri', self.default_func),
  251.             'box': ('bd', 'bor-par-bx', self.default_func),
  252.             'chbrdr': ('bd', 'bor-par-bo', self.default_func),
  253.             'brdrbtw': ('bd', 'bor-for-ev', self.default_func),
  254.             'brdrbar': ('bd', 'bor-outsid', self.default_func),
  255.             'brdrnone': ('bd', 'bor-none__<false', self.two_part_func),
  256.             'brdrs': ('bt', 'bdr-single', self.default_func),
  257.             'brdrth': ('bt', 'bdr-doubtb', self.default_func),
  258.             'brdrsh': ('bt', 'bdr-shadow', self.default_func),
  259.             'brdrdb': ('bt', 'bdr-double', self.default_func),
  260.             'brdrdot': ('bt', 'bdr-dotted', self.default_func),
  261.             'brdrdash': ('bt', 'bdr-dashed', self.default_func),
  262.             'brdrhair': ('bt', 'bdr-hair__', self.default_func),
  263.             'brdrinset': ('bt', 'bdr-inset_', self.default_func),
  264.             'brdrdashsm': ('bt', 'bdr-das-sm', self.default_func),
  265.             'brdrdashd': ('bt', 'bdr-dot-sm', self.default_func),
  266.             'brdrdashdd': ('bt', 'bdr-dot-do', self.default_func),
  267.             'brdroutset': ('bt', 'bdr-outset', self.default_func),
  268.             'brdrtriple': ('bt', 'bdr-trippl', self.default_func),
  269.             'brdrtnthsg': ('bt', 'bdr-thsm__', self.default_func),
  270.             'brdrthtnsg': ('bt', 'bdr-htsm__', self.default_func),
  271.             'brdrtnthtnsg': ('bt', 'bdr-hthsm_', self.default_func),
  272.             'brdrtnthmg': ('bt', 'bdr-thm___', self.default_func),
  273.             'brdrthtnmg': ('bt', 'bdr-htm___', self.default_func),
  274.             'brdrtnthtnmg': ('bt', 'bdr-hthm__', self.default_func),
  275.             'brdrtnthlg': ('bt', 'bdr-thl___', self.default_func),
  276.             'brdrtnthtnlg': ('bt', 'bdr-hthl__', self.default_func),
  277.             'brdrwavy': ('bt', 'bdr-wavy__', self.default_func),
  278.             'brdrwavydb': ('bt', 'bdr-d-wav_', self.default_func),
  279.             'brdrdashdotstr': ('bt', 'bdr-strip_', self.default_func),
  280.             'brdremboss': ('bt', 'bdr-embos_', self.default_func),
  281.             'brdrengrave': ('bt', 'bdr-engra_', self.default_func),
  282.             'brdrframe': ('bt', 'bdr-frame_', self.default_func),
  283.             'brdrw': ('bt', 'bdr-li-wid', self.divide_by_20),
  284.             'brsp': ('bt', 'bdr-sp-wid', self.divide_by_20),
  285.             'brdrcf': ('bt', 'bdr-color_', self.default_func) }
  286.         self._ProcessTokens__number_type_dict = {
  287.             0: 'Arabic',
  288.             1: 'uppercase Roman numeral',
  289.             2: 'lowercase Roman numeral',
  290.             3: 'uppercase letter',
  291.             4: 'lowercase letter',
  292.             5: 'ordinal number',
  293.             6: 'cardianl text number',
  294.             7: 'ordinal text number',
  295.             10: 'Kanji numbering without the digit character',
  296.             11: 'Kanji numbering with the digit character',
  297.             1246: 'phonetic Katakana characters in aiueo order',
  298.             1346: 'phonetic katakana characters in iroha order',
  299.             14: 'double byte character',
  300.             15: 'single byte character',
  301.             16: 'Kanji numbering 3',
  302.             17: 'Kanji numbering 4',
  303.             18: 'Circle numbering',
  304.             19: 'double-byte Arabic numbering',
  305.             2046: 'phonetic double-byte Katakana characters',
  306.             2146: 'phonetic double-byte katakana characters',
  307.             22: 'Arabic with leading zero',
  308.             23: 'bullet',
  309.             24: 'Korean numbering 2',
  310.             25: 'Korean numbering 1',
  311.             26: 'Chinese numbering 1',
  312.             27: 'Chinese numbering 2',
  313.             28: 'Chinese numbering 3',
  314.             29: 'Chinese numbering 4',
  315.             30: 'Chinese Zodiac numbering 1',
  316.             31: 'Chinese Zodiac numbering 2',
  317.             32: 'Chinese Zodiac numbering 3',
  318.             33: 'Taiwanese double-byte numbering 1',
  319.             34: 'Taiwanese double-byte numbering 2',
  320.             35: 'Taiwanese double-byte numbering 3',
  321.             36: 'Taiwanese double-byte numbering 4',
  322.             37: 'Chinese double-byte numbering 1',
  323.             38: 'Chinese double-byte numbering 2',
  324.             39: 'Chinese double-byte numbering 3',
  325.             40: 'Chinese double-byte numbering 4',
  326.             41: 'Korean double-byte numbering 1',
  327.             42: 'Korean double-byte numbering 2',
  328.             43: 'Korean double-byte numbering 3',
  329.             44: 'Korean double-byte numbering 4',
  330.             45: 'Hebrew non-standard decimal',
  331.             46: 'Arabic Alif Ba Tah',
  332.             47: 'Hebrew Biblical standard',
  333.             48: 'Arabic Abjad style',
  334.             255: 'No number' }
  335.         self._ProcessTokens__language_dict = {
  336.             1078: 'Afrikaans',
  337.             1052: 'Albanian',
  338.             1025: 'Arabic',
  339.             5121: 'Arabic Algeria',
  340.             15361: 'Arabic Bahrain',
  341.             3073: 'Arabic Egypt',
  342.             1: 'Arabic General',
  343.             2049: 'Arabic Iraq',
  344.             11265: 'Arabic Jordan',
  345.             13313: 'Arabic Kuwait',
  346.             12289: 'Arabic Lebanon',
  347.             4097: 'Arabic Libya',
  348.             6145: 'Arabic Morocco',
  349.             8193: 'Arabic Oman',
  350.             16385: 'Arabic Qatar',
  351.             10241: 'Arabic Syria',
  352.             7169: 'Arabic Tunisia',
  353.             14337: 'Arabic U.A.E.',
  354.             9217: 'Arabic Yemen',
  355.             1067: 'Armenian',
  356.             1101: 'Assamese',
  357.             2092: 'Azeri Cyrillic',
  358.             1068: 'Azeri Latin',
  359.             1069: 'Basque',
  360.             1093: 'Bengali',
  361.             4122: 'Bosnia Herzegovina',
  362.             1026: 'Bulgarian',
  363.             1109: 'Burmese',
  364.             1059: 'Byelorussian',
  365.             1027: 'Catalan',
  366.             2052: 'Chinese China',
  367.             4: 'Chinese General',
  368.             3076: 'Chinese Hong Kong',
  369.             4100: 'Chinese Singapore',
  370.             1028: 'Chinese Taiwan',
  371.             1050: 'Croatian',
  372.             1029: 'Czech',
  373.             1030: 'Danish',
  374.             2067: 'Dutch Belgium',
  375.             1043: 'Dutch Standard',
  376.             3081: 'English Australia',
  377.             10249: 'English Belize',
  378.             2057: 'English British',
  379.             4105: 'English Canada',
  380.             9225: 'English Caribbean',
  381.             9: 'English General',
  382.             6153: 'English Ireland',
  383.             8201: 'English Jamaica',
  384.             5129: 'English New Zealand',
  385.             13321: 'English Philippines',
  386.             7177: 'English South Africa',
  387.             11273: 'English Trinidad',
  388.             1033: 'English United States',
  389.             1061: 'Estonian',
  390.             1080: 'Faerose',
  391.             1065: 'Farsi',
  392.             1035: 'Finnish',
  393.             1036: 'French',
  394.             2060: 'French Belgium',
  395.             11276: 'French Cameroon',
  396.             3084: 'French Canada',
  397.             12300: "French Cote d'Ivoire",
  398.             5132: 'French Luxembourg',
  399.             13324: 'French Mali',
  400.             6156: 'French Monaco',
  401.             8204: 'French Reunion',
  402.             10252: 'French Senegal',
  403.             4108: 'French Swiss',
  404.             7180: 'French West Indies',
  405.             9228: 'French Democratic Republic of the Congo',
  406.             1122: 'Frisian',
  407.             1084: 'Gaelic',
  408.             2108: 'Gaelic Ireland',
  409.             1110: 'Galician',
  410.             1079: 'Georgian',
  411.             1031: 'German',
  412.             3079: 'German Austrian',
  413.             5127: 'German Liechtenstein',
  414.             4103: 'German Luxembourg',
  415.             2055: 'German Switzerland',
  416.             1032: 'Greek',
  417.             1095: 'Gujarati',
  418.             1037: 'Hebrew',
  419.             1081: 'Hindi',
  420.             1038: 'Hungarian',
  421.             1039: 'Icelandic',
  422.             1057: 'Indonesian',
  423.             1040: 'Italian',
  424.             2064: 'Italian Switzerland',
  425.             1041: 'Japanese',
  426.             1099: 'Kannada',
  427.             1120: 'Kashmiri',
  428.             2144: 'Kashmiri India',
  429.             1087: 'Kazakh',
  430.             1107: 'Khmer',
  431.             1088: 'Kirghiz',
  432.             1111: 'Konkani',
  433.             1042: 'Korean',
  434.             2066: 'Korean Johab',
  435.             1108: 'Lao',
  436.             1062: 'Latvian',
  437.             1063: 'Lithuanian',
  438.             2087: 'Lithuanian Classic',
  439.             1086: 'Malay',
  440.             2110: 'Malay Brunei Darussalam',
  441.             1100: 'Malayalam',
  442.             1082: 'Maltese',
  443.             1112: 'Manipuri',
  444.             1102: 'Marathi',
  445.             1104: 'Mongolian',
  446.             1121: 'Nepali',
  447.             2145: 'Nepali India',
  448.             1044: 'Norwegian Bokmal',
  449.             2068: 'Norwegian Nynorsk',
  450.             1096: 'Oriya',
  451.             1045: 'Polish',
  452.             1046: 'Portuguese (Brazil)',
  453.             2070: 'Portuguese (Portugal)',
  454.             1094: 'Punjabi',
  455.             1047: 'Rhaeto-Romanic',
  456.             1048: 'Romanian',
  457.             2072: 'Romanian Moldova',
  458.             1049: 'Russian',
  459.             2073: 'Russian Moldova',
  460.             1083: 'Sami Lappish',
  461.             1103: 'Sanskrit',
  462.             3098: 'Serbian Cyrillic',
  463.             2074: 'Serbian Latin',
  464.             1113: 'Sindhi',
  465.             1051: 'Slovak',
  466.             1060: 'Slovenian',
  467.             1070: 'Sorbian',
  468.             11274: 'Spanish Argentina',
  469.             16394: 'Spanish Bolivia',
  470.             13322: 'Spanish Chile',
  471.             9226: 'Spanish Colombia',
  472.             5130: 'Spanish Costa Rica',
  473.             7178: 'Spanish Dominican Republic',
  474.             12298: 'Spanish Ecuador',
  475.             17418: 'Spanish El Salvador',
  476.             4106: 'Spanish Guatemala',
  477.             18442: 'Spanish Honduras',
  478.             2058: 'Spanish Mexico',
  479.             3082: 'Spanish Modern',
  480.             19466: 'Spanish Nicaragua',
  481.             6154: 'Spanish Panama',
  482.             15370: 'Spanish Paraguay',
  483.             10250: 'Spanish Peru',
  484.             20490: 'Spanish Puerto Rico',
  485.             1034: 'Spanish Traditional',
  486.             14346: 'Spanish Uruguay',
  487.             8202: 'Spanish Venezuela',
  488.             1072: 'Sutu',
  489.             1089: 'Swahili',
  490.             1053: 'Swedish',
  491.             2077: 'Swedish Finland',
  492.             1064: 'Tajik',
  493.             1097: 'Tamil',
  494.             1092: 'Tatar',
  495.             1098: 'Telugu',
  496.             1054: 'Thai',
  497.             1105: 'Tibetan',
  498.             1073: 'Tsonga',
  499.             1074: 'Tswana',
  500.             1055: 'Turkish',
  501.             1090: 'Turkmen',
  502.             1058: 'Ukranian',
  503.             1056: 'Urdu',
  504.             2080: 'Urdu India',
  505.             2115: 'Uzbek Cyrillic',
  506.             1091: 'Uzbek Latin',
  507.             1075: 'Venda',
  508.             1066: 'Vietnamese',
  509.             1106: 'Welsh',
  510.             1076: 'Xhosa',
  511.             1085: 'Yiddish',
  512.             1077: 'Zulu',
  513.             1024: 'Unkown',
  514.             255: 'Unkown' }
  515.  
  516.     
  517.     def __ms_hex_func(self, pre, token, num):
  518.         num = num[1:]
  519.         num = num.upper()
  520.         return "tx<hx<__________<'%s\n" % num
  521.  
  522.     
  523.     def ms_sub_func(self, pre, token, num):
  524.         return 'tx<mc<__________<%s\n' % token
  525.  
  526.     
  527.     def default_func(self, pre, token, num):
  528.         if num == None:
  529.             num = 'true'
  530.         
  531.         return 'cw<%s<%s<nu<%s\n' % (pre, token, num)
  532.  
  533.     
  534.     def __list_type_func(self, pre, token, num):
  535.         type = 'arabic'
  536.         if num == None:
  537.             type = 'Arabic'
  538.         else:
  539.             
  540.             try:
  541.                 num = int(num)
  542.             except ValueError:
  543.                 if self._ProcessTokens__run_level > 3:
  544.                     msg = 'number "%s" cannot be converted to integer\n' % num
  545.                     raise self._ProcessTokens__bug_handler, msg
  546.                 self._ProcessTokens__run_level > 3
  547.  
  548.             type = self._ProcessTokens__number_type_dict.get(num)
  549.             if type == None:
  550.                 if self._ProcessTokens__run_level > 3:
  551.                     msg = 'No type for "%s" in self.__number_type_dict\n'
  552.                     raise self._ProcessTokens__bug_handler
  553.                 self._ProcessTokens__run_level > 3
  554.                 type = 'Arabic'
  555.             
  556.         return 'cw<%s<%s<nu<%s\n' % (pre, token, type)
  557.  
  558.     
  559.     def __language_func(self, pre, token, num):
  560.         lang_name = self._ProcessTokens__language_dict.get(int(re.search('[0-9]+', num).group()))
  561.         if not lang_name:
  562.             lang_name = 'not defined'
  563.             if self._ProcessTokens__run_level > 3:
  564.                 msg = 'No entry for number "%s"' % num
  565.                 raise self._ProcessTokens__bug_handler, msg
  566.             self._ProcessTokens__run_level > 3
  567.         
  568.         return 'cw<%s<%s<nu<%s\n' % (pre, token, lang_name)
  569.  
  570.     
  571.     def two_part_func(self, pre, token, num):
  572.         list = token.split('<')
  573.         token = list[0]
  574.         num = list[1]
  575.         return 'cw<%s<%s<nu<%s\n' % (pre, token, num)
  576.  
  577.     
  578.     def divide_by_2(self, pre, token, num):
  579.         num = self.divide_num(num, 2)
  580.         return 'cw<%s<%s<nu<%s\n' % (pre, token, num)
  581.  
  582.     
  583.     def divide_by_20(self, pre, token, num):
  584.         num = self.divide_num(num, 20)
  585.         return 'cw<%s<%s<nu<%s\n' % (pre, token, num)
  586.  
  587.     
  588.     def text_func(self, pre, token, num = None):
  589.         return 'tx<nu<__________<%s\n' % token
  590.  
  591.     
  592.     def ob_func(self, pre, token, num = None):
  593.         self._ProcessTokens__bracket_count += 1
  594.         return 'ob<nu<open-brack<%04d\n' % self._ProcessTokens__bracket_count
  595.  
  596.     
  597.     def cb_func(self, pre, token, num = None):
  598.         line = 'cb<nu<clos-brack<%04d\n' % self._ProcessTokens__bracket_count
  599.         self._ProcessTokens__bracket_count -= 1
  600.         return line
  601.  
  602.     
  603.     def color_func(self, pre, token, num):
  604.         third_field = 'nu'
  605.         if num[-1] == ';':
  606.             num = num[:-1]
  607.             third_field = 'en'
  608.         
  609.         num = str('%X' % int(num))
  610.         if len(num) != 2:
  611.             num = '0' + num
  612.         
  613.         return 'cw<%s<%s<%s<%s\n' % (pre, token, third_field, num)
  614.  
  615.     
  616.     def bool_st_func(self, pre, token, num):
  617.         if num is None and num == '' or num == '1':
  618.             return 'cw<%s<%s<nu<true\n' % (pre, token)
  619.         if num == '0':
  620.             return 'cw<%s<%s<nu<false\n' % (pre, token)
  621.         msg = 'boolean should have some value module process tokens\n'
  622.         msg += 'token is ' + token + '\n'
  623.         msg += "'" + num + "'" + '\n'
  624.         raise self._ProcessTokens__bug_handler, msg
  625.  
  626.     
  627.     def __no_sup_sub_func(self, pre, token, num):
  628.         the_string = 'cw<ci<subscript_<nu<false\n'
  629.         the_string += 'cw<ci<superscrip<nu<false\n'
  630.         return the_string
  631.  
  632.     
  633.     def divide_num(self, numerator, denominator):
  634.         
  635.         try:
  636.             numerator = float(re.search('[0-9.]+', numerator).group())
  637.         except TypeError:
  638.             msg = None
  639.             if self._ProcessTokens__run_level > 3:
  640.                 msg = 'no number to process?\n'
  641.                 msg += 'this indicates that the token '
  642.                 msg += ' \\(\\li\\) should have a number and does not\n'
  643.                 msg += 'numerator is "%s"\n' % numerator
  644.                 msg += 'denominator is "%s"\n' % denominator
  645.                 raise self._ProcessTokens__bug_handler, msg
  646.             self._ProcessTokens__run_level > 3
  647.             if 5 > self._ProcessTokens__return_code:
  648.                 self._ProcessTokens__return_code = 5
  649.             
  650.             return 0
  651.  
  652.         num = '%0.2f' % round(numerator / denominator, 2)
  653.         return num
  654.         string_num = str(num)
  655.         if string_num[-2:] == '.0':
  656.             string_num = string_num[:-2]
  657.         
  658.         return string_num
  659.  
  660.     
  661.     def split_let_num(self, token):
  662.         match_obj = re.search(self._ProcessTokens__num_exp, token)
  663.         if match_obj != None:
  664.             first = match_obj.group(1)
  665.             second = match_obj.group(2)
  666.             if not second:
  667.                 if self._ProcessTokens__run_level > 3:
  668.                     msg = "token is '%s' \n" % token
  669.                     raise self._ProcessTokens__bug_handler, msg
  670.                 self._ProcessTokens__run_level > 3
  671.                 return (first, 0)
  672.         elif self._ProcessTokens__run_level > 3:
  673.             msg = "token is '%s' \n" % token
  674.             raise self._ProcessTokens__bug_handler
  675.         
  676.         return (token, 0)
  677.         return (first, second)
  678.  
  679.     
  680.     def convert_to_hex(self, number):
  681.         num = int(number)
  682.         
  683.         try:
  684.             hex_num = '%X' % num
  685.             return hex_num
  686.         except:
  687.             raise self._ProcessTokens__bug_handler
  688.  
  689.  
  690.     
  691.     def process_cw(self, token):
  692.         special = [
  693.             '*',
  694.             ':',
  695.             '}',
  696.             '{',
  697.             '~',
  698.             '_',
  699.             '-',
  700.             ';']
  701.         token = token[1:]
  702.         token = token.replace(' ', '')
  703.         only_alpha = token.isalpha()
  704.         num = None
  705.         if not only_alpha and token not in special:
  706.             (token, num) = self.split_let_num(token)
  707.         
  708.         (pre, token, action) = self.dict_token.get(token, (None, None, None))
  709.         if action:
  710.             return action(pre, token, num)
  711.  
  712.     
  713.     def initiate_token_actions(self):
  714.         self.action_for_token = {
  715.             '{': self.ob_func,
  716.             '}': self.cb_func,
  717.             '\\': self.process_cw }
  718.  
  719.     
  720.     def evaluate_token(self, token):
  721.         (token, action) = self.dict_token.get(token[0:1])
  722.         if action:
  723.             line = action(token)
  724.             return line
  725.         return 'tx<nu<nu<nu<nu<%s\n' % token
  726.  
  727.     
  728.     def __check_brackets(self, in_file):
  729.         self._ProcessTokens__check_brack_obj = check_brackets.CheckBrackets(file = in_file)
  730.         good_br = self._ProcessTokens__check_brack_obj.check_brackets()[0]
  731.         if not good_br:
  732.             return 1
  733.  
  734.     
  735.     def process_tokens(self):
  736.         first_token = 0
  737.         second_token = 0
  738.         read_obj = open(self._ProcessTokens__file, 'r')
  739.         write_obj = open(self._ProcessTokens__write_to, 'w')
  740.         line_to_read = 'dummy'
  741.         line_count = 0
  742.         while line_to_read:
  743.             line_to_read = read_obj.readline()
  744.             token = line_to_read
  745.             token = token.replace('\n', '')
  746.             if not token:
  747.                 continue
  748.             
  749.             line_count += 1
  750.             
  751.             try:
  752.                 token.decode('us-ascii')
  753.             except UnicodeError:
  754.                 msg = None
  755.                 msg = str(msg)
  756.                 msg += 'Invalid RTF: File not ascii encoded.\n'
  757.                 raise self._ProcessTokens__exception_handler, msg
  758.  
  759.             if not first_token:
  760.                 if token != '\\{':
  761.                     msg = "Invalid RTF: document doesn't start with {\n"
  762.                     raise self._ProcessTokens__exception_handler, msg
  763.                 token != '\\{'
  764.                 first_token = 1
  765.             elif first_token and not second_token:
  766.                 if token[0:4] != '\\rtf':
  767.                     msg = "Invalid RTF: document doesn't start with \\rtf \n"
  768.                     raise self._ProcessTokens__exception_handler, msg
  769.                 token[0:4] != '\\rtf'
  770.                 second_token = 1
  771.             
  772.             the_index = token.find('\\ ')
  773.             if token != None and the_index > -1:
  774.                 msg = 'Invalid RTF: token "\\ " not valid. \n'
  775.                 raise self._ProcessTokens__exception_handler, msg
  776.             the_index > -1
  777.             if token[0:1] == '\\':
  778.                 line = self.process_cw(token)
  779.                 if line != None:
  780.                     write_obj.write(line)
  781.                 
  782.             line != None
  783.             fields = re.split(self._ProcessTokens__utf_exp, token)
  784.             for field in fields:
  785.                 if not field:
  786.                     continue
  787.                 
  788.                 if field[0:1] == '&':
  789.                     write_obj.write('tx<ut<__________<%s\n' % field)
  790.                     continue
  791.                 write_obj.write('tx<nu<__________<%s\n' % field)
  792.             
  793.         read_obj.close()
  794.         write_obj.close()
  795.         if not line_count:
  796.             msg = 'Invalid RTF: file appears to be empty. \n'
  797.             raise self._ProcessTokens__exception_handler, msg
  798.         line_count
  799.         copy_obj = copy.Copy(bug_handler = self._ProcessTokens__bug_handler)
  800.         if self._ProcessTokens__copy:
  801.             copy_obj.copy_file(self._ProcessTokens__write_to, 'processed_tokens.data')
  802.         
  803.         copy_obj.rename(self._ProcessTokens__write_to, self._ProcessTokens__file)
  804.         os.remove(self._ProcessTokens__write_to)
  805.         bad_brackets = self._ProcessTokens__check_brackets(self._ProcessTokens__file)
  806.         if bad_brackets:
  807.             msg = 'Invalid RTF: document does not have matching brackets.\n'
  808.             raise self._ProcessTokens__exception_handler, msg
  809.         bad_brackets
  810.         return self._ProcessTokens__return_code
  811.  
  812.  
  813.