home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / calibre-0.7.26.msi / file_2360 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-10-31  |  15.5 KB  |  561 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import re
  5. from pygments.filter import apply_filters, Filter
  6. from pygments.filters import get_filter_by_name
  7. from pygments.token import Error, Text, Other, _TokenType
  8. from pygments.util import get_bool_opt, get_int_opt, get_list_opt, make_analysator
  9. __all__ = [
  10.     'Lexer',
  11.     'RegexLexer',
  12.     'ExtendedRegexLexer',
  13.     'DelegatingLexer',
  14.     'LexerContext',
  15.     'include',
  16.     'bygroups',
  17.     'using',
  18.     'this']
  19. _default_analyse = staticmethod((lambda x: 0))
  20.  
  21. class LexerMeta(type):
  22.     
  23.     def __new__(cls, name, bases, d):
  24.         if 'analyse_text' in d:
  25.             d['analyse_text'] = make_analysator(d['analyse_text'])
  26.         
  27.         return type.__new__(cls, name, bases, d)
  28.  
  29.  
  30.  
  31. class Lexer(object):
  32.     name = None
  33.     aliases = []
  34.     filenames = []
  35.     alias_filenames = []
  36.     mimetypes = []
  37.     __metaclass__ = LexerMeta
  38.     
  39.     def __init__(self, **options):
  40.         self.options = options
  41.         self.stripnl = get_bool_opt(options, 'stripnl', True)
  42.         self.stripall = get_bool_opt(options, 'stripall', False)
  43.         self.ensurenl = get_bool_opt(options, 'ensurenl', True)
  44.         self.tabsize = get_int_opt(options, 'tabsize', 0)
  45.         self.encoding = options.get('encoding', 'latin1')
  46.         self.filters = []
  47.         for filter_ in get_list_opt(options, 'filters', ()):
  48.             self.add_filter(filter_)
  49.         
  50.  
  51.     
  52.     def __repr__(self):
  53.         if self.options:
  54.             return '<pygments.lexers.%s with %r>' % (self.__class__.__name__, self.options)
  55.         return '<pygments.lexers.%s>' % self.__class__.__name__
  56.  
  57.     
  58.     def add_filter(self, filter_, **options):
  59.         if not isinstance(filter_, Filter):
  60.             filter_ = get_filter_by_name(filter_, **options)
  61.         
  62.         self.filters.append(filter_)
  63.  
  64.     
  65.     def analyse_text(text):
  66.         pass
  67.  
  68.     
  69.     def get_tokens(self, text, unfiltered = False):
  70.         if not isinstance(text, unicode):
  71.             if self.encoding == 'guess':
  72.                 
  73.                 try:
  74.                     text = text.decode('utf-8')
  75.                     if text.startswith(u'∩╗┐'):
  76.                         text = text[len(u'∩╗┐'):]
  77.                 except UnicodeDecodeError:
  78.                     text = text.decode('latin1')
  79.                 except:
  80.                     None<EXCEPTION MATCH>UnicodeDecodeError
  81.                 
  82.  
  83.             None<EXCEPTION MATCH>UnicodeDecodeError
  84.             if self.encoding == 'chardet':
  85.                 
  86.                 try:
  87.                     import chardet
  88.                 except ImportError:
  89.                     raise ImportError('To enable chardet encoding guessing, please install the chardet library from http://chardet.feedparser.org/')
  90.  
  91.                 enc = chardet.detect(text)
  92.                 text = text.decode(enc['encoding'])
  93.             else:
  94.                 text = text.decode(self.encoding)
  95.         
  96.         text = text.replace('\r\n', '\n')
  97.         text = text.replace('\r', '\n')
  98.         if self.stripall:
  99.             text = text.strip()
  100.         elif self.stripnl:
  101.             text = text.strip('\n')
  102.         
  103.         if self.tabsize > 0:
  104.             text = text.expandtabs(self.tabsize)
  105.         
  106.         if self.ensurenl and not text.endswith('\n'):
  107.             text += '\n'
  108.         
  109.         
  110.         def streamer():
  111.             for i, t, v in self.get_tokens_unprocessed(text):
  112.                 yield (t, v)
  113.             
  114.  
  115.         stream = streamer()
  116.         if not unfiltered:
  117.             stream = apply_filters(stream, self.filters, self)
  118.         
  119.         return stream
  120.  
  121.     
  122.     def get_tokens_unprocessed(self, text):
  123.         raise NotImplementedError
  124.  
  125.  
  126.  
  127. class DelegatingLexer(Lexer):
  128.     
  129.     def __init__(self, _root_lexer, _language_lexer, _needle = Other, **options):
  130.         self.root_lexer = _root_lexer(**options)
  131.         self.language_lexer = _language_lexer(**options)
  132.         self.needle = _needle
  133.         Lexer.__init__(self, **options)
  134.  
  135.     
  136.     def get_tokens_unprocessed(self, text):
  137.         buffered = ''
  138.         insertions = []
  139.         lng_buffer = []
  140.         for i, t, v in self.language_lexer.get_tokens_unprocessed(text):
  141.             if t is self.needle:
  142.                 if lng_buffer:
  143.                     insertions.append((len(buffered), lng_buffer))
  144.                     lng_buffer = []
  145.                 
  146.                 buffered += v
  147.                 continue
  148.             lng_buffer.append((i, t, v))
  149.         
  150.         if lng_buffer:
  151.             insertions.append((len(buffered), lng_buffer))
  152.         
  153.         return do_insertions(insertions, self.root_lexer.get_tokens_unprocessed(buffered))
  154.  
  155.  
  156.  
  157. class include(str):
  158.     pass
  159.  
  160.  
  161. class combined(tuple):
  162.     
  163.     def __new__(cls, *args):
  164.         return tuple.__new__(cls, args)
  165.  
  166.     
  167.     def __init__(self, *args):
  168.         pass
  169.  
  170.  
  171.  
  172. class _PseudoMatch(object):
  173.     
  174.     def __init__(self, start, text):
  175.         self._text = text
  176.         self._start = start
  177.  
  178.     
  179.     def start(self, arg = None):
  180.         return self._start
  181.  
  182.     
  183.     def end(self, arg = None):
  184.         return self._start + len(self._text)
  185.  
  186.     
  187.     def group(self, arg = None):
  188.         if arg:
  189.             raise IndexError('No such group')
  190.         arg
  191.         return self._text
  192.  
  193.     
  194.     def groups(self):
  195.         return (self._text,)
  196.  
  197.     
  198.     def groupdict(self):
  199.         return { }
  200.  
  201.  
  202.  
  203. def bygroups(*args):
  204.     
  205.     def callback(lexer, match, ctx = (None,)):
  206.         for i, action in enumerate(args):
  207.             if action is None:
  208.                 continue
  209.                 continue
  210.             if type(action) is _TokenType:
  211.                 data = match.group(i + 1)
  212.                 if data:
  213.                     yield (match.start(i + 1), action, data)
  214.                 
  215.             data
  216.             if ctx:
  217.                 ctx.pos = match.start(i + 1)
  218.             
  219.             for item in action(lexer, _PseudoMatch(match.start(i + 1), match.group(i + 1)), ctx):
  220.                 if item:
  221.                     yield item
  222.                     continue
  223.             
  224.         
  225.         if ctx:
  226.             ctx.pos = match.end()
  227.         
  228.  
  229.     return callback
  230.  
  231.  
  232. class _This(object):
  233.     pass
  234.  
  235. this = _This()
  236.  
  237. def using(_other, **kwargs):
  238.     gt_kwargs = { }
  239.     if 'state' in kwargs:
  240.         s = kwargs.pop('state')
  241.         if isinstance(s, (list, tuple)):
  242.             gt_kwargs['stack'] = s
  243.         else:
  244.             gt_kwargs['stack'] = ('root', s)
  245.     
  246.     if _other is this:
  247.         
  248.         def callback(lexer, match, ctx = (None, None)):
  249.             if kwargs:
  250.                 kwargs.update(lexer.options)
  251.                 lx = lexer.__class__(**kwargs)
  252.             else:
  253.                 lx = lexer
  254.             s = match.start()
  255.             for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs):
  256.                 yield (i + s, t, v)
  257.             
  258.             if ctx:
  259.                 ctx.pos = match.end()
  260.             
  261.  
  262.     else:
  263.         
  264.         def callback(lexer, match, ctx = (None, None, None)):
  265.             kwargs.update(lexer.options)
  266.             lx = _other(**kwargs)
  267.             s = match.start()
  268.             for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs):
  269.                 yield (i + s, t, v)
  270.             
  271.             if ctx:
  272.                 ctx.pos = match.end()
  273.             
  274.  
  275.     return callback
  276.  
  277.  
  278. class RegexLexerMeta(LexerMeta):
  279.     
  280.     def _process_state(cls, unprocessed, processed, state):
  281.         if state in processed:
  282.             return processed[state]
  283.         rflags = cls.flags
  284.         for tdef in unprocessed[state]:
  285.             
  286.             try:
  287.                 rex = re.compile(tdef[0], rflags).match
  288.             except Exception:
  289.                 None if isinstance(tdef, include) else state in processed
  290.                 err = None if isinstance(tdef, include) else state in processed
  291.                 raise ValueError('uncompilable regex %r in state %r of %r: %s' % (tdef[0], state, cls, err))
  292.             except:
  293.                 None if isinstance(tdef, include) else state in processed
  294.  
  295.             if len(tdef) == 2:
  296.                 new_state = None
  297.             else:
  298.                 tdef2 = tdef[2]
  299.                 if isinstance(tdef2, str):
  300.                     if tdef2 == '#pop':
  301.                         new_state = -1
  302.                     elif tdef2 in unprocessed:
  303.                         new_state = (tdef2,)
  304.                     elif tdef2 == '#push':
  305.                         new_state = tdef2
  306.                     elif tdef2[:5] == '#pop:':
  307.                         new_state = -int(tdef2[5:])
  308.                     
  309.                 elif isinstance(tdef2, combined):
  310.                     new_state = '_tmp_%d' % cls._tmpname
  311.                     cls._tmpname += 1
  312.                     itokens = []
  313.                     for istate in tdef2:
  314.                         itokens.extend(cls._process_state(unprocessed, processed, istate))
  315.                     
  316.                     processed[new_state] = itokens
  317.                     new_state = (new_state,)
  318.                 elif isinstance(tdef2, tuple):
  319.                     for state in tdef2:
  320.                         pass
  321.                     
  322.                     new_state = tdef2
  323.                 
  324.             tokens.append((rex, tdef[1], new_state))
  325.         
  326.         return tokens
  327.  
  328.     
  329.     def process_tokendef(cls, name, tokendefs = None):
  330.         processed = cls._all_tokens[name] = { }
  331.         if not tokendefs:
  332.             pass
  333.         tokendefs = cls.tokens[name]
  334.         for state in tokendefs.keys():
  335.             cls._process_state(tokendefs, processed, state)
  336.         
  337.         return processed
  338.  
  339.     
  340.     def __call__(cls, *args, **kwds):
  341.         if not hasattr(cls, '_tokens'):
  342.             cls._all_tokens = { }
  343.             cls._tmpname = 0
  344.             if hasattr(cls, 'token_variants') and cls.token_variants:
  345.                 pass
  346.             else:
  347.                 cls._tokens = cls.process_tokendef('', cls.tokens)
  348.         
  349.         return type.__call__(cls, *args, **kwds)
  350.  
  351.  
  352.  
  353. class RegexLexer(Lexer):
  354.     __metaclass__ = RegexLexerMeta
  355.     flags = re.MULTILINE
  356.     tokens = { }
  357.     
  358.     def get_tokens_unprocessed(self, text, stack = ('root',)):
  359.         pos = 0
  360.         tokendefs = self._tokens
  361.         statestack = list(stack)
  362.         statetokens = tokendefs[statestack[-1]]
  363.         while None:
  364.             for rexmatch, action, new_state in statetokens:
  365.                 m = rexmatch(text, pos)
  366.                 if m:
  367.                     if type(action) is _TokenType:
  368.                         yield (pos, action, m.group())
  369.                     else:
  370.                         for item in action(self, m):
  371.                             yield item
  372.                         
  373.                     pos = m.end()
  374.                     if new_state is not None:
  375.                         if isinstance(new_state, tuple):
  376.                             for state in new_state:
  377.                                 if state == '#pop':
  378.                                     statestack.pop()
  379.                                     continue
  380.                                 if state == '#push':
  381.                                     statestack.append(statestack[-1])
  382.                                     continue
  383.                                 statestack.append(state)
  384.                             
  385.                         elif isinstance(new_state, int):
  386.                             del statestack[new_state:]
  387.                         elif new_state == '#push':
  388.                             statestack.append(statestack[-1])
  389.                         
  390.                         statetokens = tokendefs[statestack[-1]]
  391.                     
  392.                     break
  393.                     continue
  394.             else:
  395.                 
  396.                 try:
  397.                     if text[pos] == '\n':
  398.                         pos += 1
  399.                         statestack = [
  400.                             'root']
  401.                         statetokens = tokendefs['root']
  402.                         yield (pos, Text, u'\n')
  403.                         continue
  404.                     
  405.                     yield (pos, Error, text[pos])
  406.                     pos += 1
  407.                 continue
  408.                 except IndexError:
  409.                     break
  410.                     continue
  411.                 
  412.  
  413.                 return None
  414.  
  415.  
  416.  
  417. class LexerContext(object):
  418.     
  419.     def __init__(self, text, pos, stack = None, end = None):
  420.         self.text = text
  421.         self.pos = pos
  422.         if not end:
  423.             pass
  424.         self.end = len(text)
  425.         if not stack:
  426.             pass
  427.         self.stack = [
  428.             'root']
  429.  
  430.     
  431.     def __repr__(self):
  432.         return 'LexerContext(%r, %r, %r)' % (self.text, self.pos, self.stack)
  433.  
  434.  
  435.  
  436. class ExtendedRegexLexer(RegexLexer):
  437.     
  438.     def get_tokens_unprocessed(self, text = None, context = None):
  439.         tokendefs = self._tokens
  440.         if not context:
  441.             ctx = LexerContext(text, 0)
  442.             statetokens = tokendefs['root']
  443.         else:
  444.             ctx = context
  445.             statetokens = tokendefs[ctx.stack[-1]]
  446.             text = ctx.text
  447.         while None:
  448.             for rexmatch, action, new_state in statetokens:
  449.                 m = rexmatch(text, ctx.pos, ctx.end)
  450.                 if m:
  451.                     if type(action) is _TokenType:
  452.                         yield (ctx.pos, action, m.group())
  453.                         ctx.pos = m.end()
  454.                     else:
  455.                         for item in action(self, m, ctx):
  456.                             yield item
  457.                         
  458.                         if not new_state:
  459.                             statetokens = tokendefs[ctx.stack[-1]]
  460.                         
  461.                     if new_state is not None:
  462.                         if isinstance(new_state, tuple):
  463.                             ctx.stack.extend(new_state)
  464.                         elif isinstance(new_state, int):
  465.                             del ctx.stack[new_state:]
  466.                         elif new_state == '#push':
  467.                             ctx.stack.append(ctx.stack[-1])
  468.                         
  469.                         statetokens = tokendefs[ctx.stack[-1]]
  470.                     
  471.                     break
  472.                     continue
  473.             else:
  474.                 
  475.                 try:
  476.                     if ctx.pos >= ctx.end:
  477.                         break
  478.                     
  479.                     if text[ctx.pos] == '\n':
  480.                         ctx.pos += 1
  481.                         ctx.stack = [
  482.                             'root']
  483.                         statetokens = tokendefs['root']
  484.                         yield (ctx.pos, Text, u'\n')
  485.                         ctx
  486.                         continue
  487.                     
  488.                     yield (ctx.pos, Error, text[ctx.pos])
  489.                     ctx.pos += 1
  490.                 continue
  491.                 except IndexError:
  492.                     break
  493.                     continue
  494.                 
  495.  
  496.                 return None
  497.  
  498.  
  499.  
  500. def do_insertions(insertions, tokens):
  501.     insertions = iter(insertions)
  502.     
  503.     try:
  504.         (index, itokens) = insertions.next()
  505.     except StopIteration:
  506.         for item in tokens:
  507.             yield item
  508.         
  509.         return None
  510.  
  511.     realpos = None
  512.     insleft = True
  513.     for i, t, v in tokens:
  514.         if realpos is None:
  515.             realpos = i
  516.         
  517.         oldi = 0
  518.         while insleft and i + len(v) >= index:
  519.             tmpval = v[oldi:index - i]
  520.             yield (realpos, t, tmpval)
  521.             realpos += len(tmpval)
  522.             for it_index, it_token, it_value in itokens:
  523.                 yield (realpos, it_token, it_value)
  524.                 realpos += len(it_value)
  525.             
  526.             oldi = index - i
  527.             
  528.             try:
  529.                 (index, itokens) = insertions.next()
  530.             continue
  531.             except StopIteration:
  532.                 insleft = False
  533.                 break
  534.                 continue
  535.             
  536.  
  537.             None<EXCEPTION MATCH>StopIteration
  538.         yield (realpos, t, v[oldi:])
  539.         realpos += len(v) - oldi
  540.     
  541.     while insleft:
  542.         if not realpos:
  543.             pass
  544.         realpos = 0
  545.         for p, t, v in itokens:
  546.             yield (realpos, t, v)
  547.             realpos += len(v)
  548.         
  549.         
  550.         try:
  551.             (index, itokens) = insertions.next()
  552.         continue
  553.         except StopIteration:
  554.             insleft = False
  555.             break
  556.             continue
  557.         
  558.  
  559.         None<EXCEPTION MATCH>StopIteration
  560.  
  561.