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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import re
  5. import sys
  6. from json.scanner import Scanner, pattern
  7.  
  8. try:
  9.     from _json import scanstring as c_scanstring
  10. except ImportError:
  11.     c_scanstring = None
  12.  
  13. __all__ = [
  14.     'JSONDecoder']
  15. FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
  16. NaN = float('nan')
  17. PosInf = float('inf')
  18. NegInf = float('-inf')
  19.  
  20. def linecol(doc, pos):
  21.     lineno = doc.count('\n', 0, pos) + 1
  22.     if lineno == 1:
  23.         colno = pos
  24.     else:
  25.         colno = pos - doc.rindex('\n', 0, pos)
  26.     return (lineno, colno)
  27.  
  28.  
  29. def errmsg(msg, doc, pos, end = None):
  30.     (lineno, colno) = linecol(doc, pos)
  31.     if end is None:
  32.         fmt = '{0}: line {1} column {2} (char {3})'
  33.         return fmt.format(msg, lineno, colno, pos)
  34.     (endlineno, endcolno) = linecol(doc, end)
  35.     fmt = '{0}: line {1} column {2} - line {3} column {4} (char {5} - {6})'
  36.     return fmt.format(msg, lineno, colno, endlineno, endcolno, pos, end)
  37.  
  38. _CONSTANTS = {
  39.     '-Infinity': NegInf,
  40.     'Infinity': PosInf,
  41.     'NaN': NaN,
  42.     'true': True,
  43.     'false': False,
  44.     'null': None }
  45.  
  46. def JSONConstant(match, context, c = _CONSTANTS):
  47.     s = match.group(0)
  48.     fn = getattr(context, 'parse_constant', None)
  49.     if fn is None:
  50.         rval = c[s]
  51.     else:
  52.         rval = fn(s)
  53.     return (rval, None)
  54.  
  55. pattern('(-?Infinity|NaN|true|false|null)')(JSONConstant)
  56.  
  57. def JSONNumber(match, context):
  58.     match = JSONNumber.regex.match(match.string, *match.span())
  59.     (integer, frac, exp) = match.groups()
  60.     if frac or exp:
  61.         if not getattr(context, 'parse_float', None):
  62.             pass
  63.         fn = float
  64.         if not frac:
  65.             pass
  66.         if not exp:
  67.             pass
  68.         res = fn(integer + '' + '')
  69.     elif not getattr(context, 'parse_int', None):
  70.         pass
  71.     fn = int
  72.     res = fn(integer)
  73.     return (res, None)
  74.  
  75. pattern('(-?(?:0|[1-9]\\d*))(\\.\\d+)?([eE][-+]?\\d+)?')(JSONNumber)
  76. STRINGCHUNK = re.compile('(.*?)(["\\\\\\x00-\\x1f])', FLAGS)
  77. BACKSLASH = {
  78.     '"': u'"',
  79.     '\\': u'\\',
  80.     '/': u'/',
  81.     'b': u'\x08',
  82.     'f': u'\x0c',
  83.     'n': u'\n',
  84.     'r': u'\r',
  85.     't': u'\t' }
  86. DEFAULT_ENCODING = 'utf-8'
  87.  
  88. def py_scanstring(s, end, encoding = None, strict = True, _b = BACKSLASH, _m = STRINGCHUNK.match):
  89.     if encoding is None:
  90.         encoding = DEFAULT_ENCODING
  91.     
  92.     chunks = []
  93.     _append = chunks.append
  94.     begin = end - 1
  95.     while None:
  96.         chunk = _m(s, end)
  97.         if chunk is None:
  98.             raise ValueError(errmsg('Unterminated string starting at', s, begin))
  99.         end = chunk.end()
  100.         (content, terminator) = chunk.groups()
  101.         if content:
  102.             if not isinstance(content, unicode):
  103.                 content = unicode(content, encoding)
  104.             
  105.             _append(content)
  106.         
  107.         if terminator == '"':
  108.             break
  109.         elif terminator != '\\':
  110.             if strict:
  111.                 msg = 'Invalid control character {0!r} at'.format(terminator)
  112.                 raise ValueError(errmsg(msg, s, end))
  113.             strict
  114.             _append(terminator)
  115.             continue
  116.         
  117.         
  118.         try:
  119.             esc = s[end]
  120.         except IndexError:
  121.             raise ValueError(errmsg('Unterminated string starting at', s, begin))
  122.  
  123.         if esc != 'u':
  124.             
  125.             try:
  126.                 m = _b[esc]
  127.             except KeyError:
  128.                 msg = 'Invalid \\escape: {0!r}'.format(esc)
  129.                 raise ValueError(errmsg(msg, s, end))
  130.  
  131.             end += 1
  132.         else:
  133.             esc = s[end + 1:end + 5]
  134.             next_end = end + 5
  135.             msg = 'Invalid \\uXXXX escape'
  136.             
  137.             try:
  138.                 if len(esc) != 4:
  139.                     raise ValueError
  140.                 len(esc) != 4
  141.                 uni = int(esc, 16)
  142.                 if uni <= uni:
  143.                     pass
  144.                 elif uni <= 56319 and sys.maxunicode > 65535:
  145.                     msg = 'Invalid \\uXXXX\\uXXXX surrogate pair'
  146.                     if not s[end + 5:end + 7] == '\\u':
  147.                         raise ValueError
  148.                     s[end + 5:end + 7] == '\\u'
  149.                     esc2 = s[end + 7:end + 11]
  150.                     if len(esc2) != 4:
  151.                         raise ValueError
  152.                     len(esc2) != 4
  153.                     uni2 = int(esc2, 16)
  154.                     uni = 65536 + (uni - 55296 << 10 | uni2 - 56320)
  155.                     next_end += 6
  156.                 
  157.                 m = unichr(uni)
  158.             except ValueError:
  159.                 raise ValueError(errmsg(msg, s, end))
  160.  
  161.             end = next_end
  162.         _append(m)
  163.         continue
  164.         return (u''.join(chunks), end)
  165.  
  166. if c_scanstring is not None:
  167.     scanstring = c_scanstring
  168. else:
  169.     scanstring = py_scanstring
  170.  
  171. def JSONString(match, context):
  172.     encoding = getattr(context, 'encoding', None)
  173.     strict = getattr(context, 'strict', True)
  174.     return scanstring(match.string, match.end(), encoding, strict)
  175.  
  176. pattern('"')(JSONString)
  177. WHITESPACE = re.compile('\\s*', FLAGS)
  178.  
  179. def JSONObject(match, context, _w = WHITESPACE.match):
  180.     pairs = { }
  181.     s = match.string
  182.     end = _w(s, match.end()).end()
  183.     nextchar = s[end:end + 1]
  184.     if nextchar == '}':
  185.         return (pairs, end + 1)
  186.     if nextchar != '"':
  187.         raise ValueError(errmsg('Expecting property name', s, end))
  188.     nextchar != '"'
  189.     end += 1
  190.     encoding = getattr(context, 'encoding', None)
  191.     strict = getattr(context, 'strict', True)
  192.     iterscan = JSONScanner.iterscan
  193.     while True:
  194.         (key, end) = scanstring(s, end, encoding, strict)
  195.         end = _w(s, end).end()
  196.         if s[end:end + 1] != ':':
  197.             raise ValueError(errmsg('Expecting : delimiter', s, end))
  198.         s[end:end + 1] != ':'
  199.         end = _w(s, end + 1).end()
  200.         
  201.         try:
  202.             (value, end) = iterscan(s, idx = end, context = context).next()
  203.         except StopIteration:
  204.             nextchar == '}'
  205.             nextchar == '}'
  206.             raise ValueError(errmsg('Expecting object', s, end))
  207.         except:
  208.             nextchar == '}'
  209.  
  210.         pairs[key] = value
  211.         end = _w(s, end).end()
  212.         nextchar = s[end:end + 1]
  213.         end += 1
  214.         if nextchar == '}':
  215.             break
  216.         
  217.         if nextchar != ',':
  218.             raise ValueError(errmsg('Expecting , delimiter', s, end - 1))
  219.         nextchar != ','
  220.         end = _w(s, end).end()
  221.         nextchar = s[end:end + 1]
  222.         end += 1
  223.         if nextchar != '"':
  224.             raise ValueError(errmsg('Expecting property name', s, end - 1))
  225.         nextchar != '"'
  226.     object_hook = getattr(context, 'object_hook', None)
  227.     if object_hook is not None:
  228.         pairs = object_hook(pairs)
  229.     
  230.     return (pairs, end)
  231.  
  232. pattern('{')(JSONObject)
  233.  
  234. def JSONArray(match, context, _w = WHITESPACE.match):
  235.     values = []
  236.     s = match.string
  237.     end = _w(s, match.end()).end()
  238.     nextchar = s[end:end + 1]
  239.     if nextchar == ']':
  240.         return (values, end + 1)
  241.     iterscan = JSONScanner.iterscan
  242.     while True:
  243.         
  244.         try:
  245.             (value, end) = iterscan(s, idx = end, context = context).next()
  246.         except StopIteration:
  247.             nextchar == ']'
  248.             nextchar == ']'
  249.             raise ValueError(errmsg('Expecting object', s, end))
  250.         except:
  251.             nextchar == ']'
  252.  
  253.         values.append(value)
  254.         end = _w(s, end).end()
  255.         nextchar = s[end:end + 1]
  256.         end += 1
  257.         if nextchar == ']':
  258.             break
  259.         
  260.         if nextchar != ',':
  261.             raise ValueError(errmsg('Expecting , delimiter', s, end))
  262.         nextchar != ','
  263.         end = _w(s, end).end()
  264.     return (values, end)
  265.  
  266. pattern('\\[')(JSONArray)
  267. ANYTHING = [
  268.     JSONObject,
  269.     JSONArray,
  270.     JSONString,
  271.     JSONConstant,
  272.     JSONNumber]
  273. JSONScanner = Scanner(ANYTHING)
  274.  
  275. class JSONDecoder(object):
  276.     _scanner = Scanner(ANYTHING)
  277.     __all__ = [
  278.         '__init__',
  279.         'decode',
  280.         'raw_decode']
  281.     
  282.     def __init__(self, encoding = None, object_hook = None, parse_float = None, parse_int = None, parse_constant = None, strict = True):
  283.         self.encoding = encoding
  284.         self.object_hook = object_hook
  285.         self.parse_float = parse_float
  286.         self.parse_int = parse_int
  287.         self.parse_constant = parse_constant
  288.         self.strict = strict
  289.  
  290.     
  291.     def decode(self, s, _w = WHITESPACE.match):
  292.         (obj, end) = self.raw_decode(s, idx = _w(s, 0).end())
  293.         end = _w(s, end).end()
  294.         if end != len(s):
  295.             raise ValueError(errmsg('Extra data', s, end, len(s)))
  296.         end != len(s)
  297.         return obj
  298.  
  299.     
  300.     def raw_decode(self, s, **kw):
  301.         kw.setdefault('context', self)
  302.         
  303.         try:
  304.             (obj, end) = self._scanner.iterscan(s, **kw).next()
  305.         except StopIteration:
  306.             raise ValueError('No JSON object could be decoded')
  307.  
  308.         return (obj, end)
  309.  
  310.  
  311.