[utils] Improve comments processing in js_to_json (closes #11947)
This commit is contained in:
		| @@ -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'}) | ||||
|   | ||||
| @@ -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): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sergey M․
					Sergey M․