diff options
| author | Sergey M․ <dstftw@gmail.com> | 2017-02-03 02:55:06 +0700 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2017-02-03 03:04:33 +0700 | 
| commit | 4195096ea8da8237a63e1ba3876dc8856b8605c6 (patch) | |
| tree | 34c71cc23283eeb40e7244cd4cfc27f6a1ed77ad | |
| parent | 0bbcc8a10a4bd339540bf149dd263419fd8b6e66 (diff) | |
[utils] Improve comments processing in js_to_json (closes #11947)
| -rw-r--r-- | test/test_utils.py | 24 | ||||
| -rw-r--r-- | youtube_dl/utils.py | 20 | 
2 files changed, 35 insertions, 9 deletions
diff --git a/test/test_utils.py b/test/test_utils.py index 954bb7d8b..edc712f07 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -785,12 +785,24 @@ class TestUtil(unittest.TestCase):          on = js_to_json('["abc", "def",]')          self.assertEqual(json.loads(on), ['abc', 'def']) +        on = js_to_json('[/*comment\n*/"abc"/*comment\n*/,/*comment\n*/"def",/*comment\n*/]') +        self.assertEqual(json.loads(on), ['abc', 'def']) + +        on = js_to_json('[//comment\n"abc" //comment\n,//comment\n"def",//comment\n]') +        self.assertEqual(json.loads(on), ['abc', 'def']) +          on = js_to_json('{"abc": "def",}')          self.assertEqual(json.loads(on), {'abc': 'def'}) +        on = js_to_json('{/*comment\n*/"abc"/*comment\n*/:/*comment\n*/"def"/*comment\n*/,/*comment\n*/}') +        self.assertEqual(json.loads(on), {'abc': 'def'}) +          on = js_to_json('{ 0: /* " \n */ ",]" , }')          self.assertEqual(json.loads(on), {'0': ',]'}) +        on = js_to_json('{ /*comment\n*/0/*comment\n*/: /* " \n */ ",]" , }') +        self.assertEqual(json.loads(on), {'0': ',]'}) +          on = js_to_json('{ 0: // comment\n1 }')          self.assertEqual(json.loads(on), {'0': 1}) @@ -803,15 +815,27 @@ class TestUtil(unittest.TestCase):          on = js_to_json("['a\\\nb']")          self.assertEqual(json.loads(on), ['ab']) +        on = js_to_json("/*comment\n*/[/*comment\n*/'a\\\nb'/*comment\n*/]/*comment\n*/") +        self.assertEqual(json.loads(on), ['ab']) +          on = js_to_json('{0xff:0xff}')          self.assertEqual(json.loads(on), {'255': 255}) +        on = js_to_json('{/*comment\n*/0xff/*comment\n*/:/*comment\n*/0xff/*comment\n*/}') +        self.assertEqual(json.loads(on), {'255': 255}) +          on = js_to_json('{077:077}')          self.assertEqual(json.loads(on), {'63': 63}) +        on = js_to_json('{/*comment\n*/077/*comment\n*/:/*comment\n*/077/*comment\n*/}') +        self.assertEqual(json.loads(on), {'63': 63}) +          on = js_to_json('{42:42}')          self.assertEqual(json.loads(on), {'42': 42}) +        on = js_to_json('{/*comment\n*/42/*comment\n*/:/*comment\n*/42/*comment\n*/}') +        self.assertEqual(json.loads(on), {'42': 42}) +      def test_extract_attributes(self):          self.assertEqual(extract_attributes('<e x="y">'), {'x': 'y'})          self.assertEqual(extract_attributes("<e x='y'>"), {'x': 'y'}) diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 6c462625b..67a847eba 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -2103,6 +2103,13 @@ def strip_jsonp(code):  def js_to_json(code): +    COMMENT_RE = r'/\*(?:(?!\*/).)*?\*/|//[^\n]*' +    SKIP_RE = r'\s*(?:{comment})?\s*'.format(comment=COMMENT_RE) +    INTEGER_TABLE = ( +        (r'(?s)^(0[xX][0-9a-fA-F]+){skip}:?$'.format(skip=SKIP_RE), 16), +        (r'(?s)^(0+[0-7]+){skip}:?$'.format(skip=SKIP_RE), 8), +    ) +      def fix_kv(m):          v = m.group(0)          if v in ('true', 'false', 'null'): @@ -2118,11 +2125,6 @@ def js_to_json(code):                  '\\x': '\\u00',              }.get(m.group(0), m.group(0)), v[1:-1]) -        INTEGER_TABLE = ( -            (r'^(0[xX][0-9a-fA-F]+)\s*:?$', 16), -            (r'^(0+[0-7]+)\s*:?$', 8), -        ) -          for regex, base in INTEGER_TABLE:              im = re.match(regex, v)              if im: @@ -2134,11 +2136,11 @@ def js_to_json(code):      return re.sub(r'''(?sx)          "(?:[^"\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^"\\]*"|          '(?:[^'\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^'\\]*'| -        /\*.*?\*/|//[^\n]*|,(?=\s*[\]}])| +        {comment}|,(?={skip}[\]}}])|          [a-zA-Z_][.a-zA-Z_0-9]*| -        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:\s*:)?| -        [0-9]+(?=\s*:) -        ''', fix_kv, code) +        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:{skip}:)?| +        [0-9]+(?={skip}:) +        '''.format(comment=COMMENT_RE, skip=SKIP_RE), fix_kv, code)  def qualities(quality_ids):  | 
