[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",]')
 | 
					        on = js_to_json('["abc", "def",]')
 | 
				
			||||||
        self.assertEqual(json.loads(on), ['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",}')
 | 
					        on = js_to_json('{"abc": "def",}')
 | 
				
			||||||
        self.assertEqual(json.loads(on), {'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 */ ",]" , }')
 | 
					        on = js_to_json('{ 0: /* " \n */ ",]" , }')
 | 
				
			||||||
        self.assertEqual(json.loads(on), {'0': ',]'})
 | 
					        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 }')
 | 
					        on = js_to_json('{ 0: // comment\n1 }')
 | 
				
			||||||
        self.assertEqual(json.loads(on), {'0': 1})
 | 
					        self.assertEqual(json.loads(on), {'0': 1})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -803,15 +815,27 @@ class TestUtil(unittest.TestCase):
 | 
				
			|||||||
        on = js_to_json("['a\\\nb']")
 | 
					        on = js_to_json("['a\\\nb']")
 | 
				
			||||||
        self.assertEqual(json.loads(on), ['ab'])
 | 
					        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}')
 | 
					        on = js_to_json('{0xff:0xff}')
 | 
				
			||||||
        self.assertEqual(json.loads(on), {'255': 255})
 | 
					        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}')
 | 
					        on = js_to_json('{077:077}')
 | 
				
			||||||
        self.assertEqual(json.loads(on), {'63': 63})
 | 
					        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}')
 | 
					        on = js_to_json('{42:42}')
 | 
				
			||||||
        self.assertEqual(json.loads(on), {'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):
 | 
					    def test_extract_attributes(self):
 | 
				
			||||||
        self.assertEqual(extract_attributes('<e x="y">'), {'x': 'y'})
 | 
					        self.assertEqual(extract_attributes('<e x="y">'), {'x': 'y'})
 | 
				
			||||||
        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):
 | 
					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):
 | 
					    def fix_kv(m):
 | 
				
			||||||
        v = m.group(0)
 | 
					        v = m.group(0)
 | 
				
			||||||
        if v in ('true', 'false', 'null'):
 | 
					        if v in ('true', 'false', 'null'):
 | 
				
			||||||
@@ -2118,11 +2125,6 @@ def js_to_json(code):
 | 
				
			|||||||
                '\\x': '\\u00',
 | 
					                '\\x': '\\u00',
 | 
				
			||||||
            }.get(m.group(0), m.group(0)), v[1:-1])
 | 
					            }.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:
 | 
					        for regex, base in INTEGER_TABLE:
 | 
				
			||||||
            im = re.match(regex, v)
 | 
					            im = re.match(regex, v)
 | 
				
			||||||
            if im:
 | 
					            if im:
 | 
				
			||||||
@@ -2134,11 +2136,11 @@ def js_to_json(code):
 | 
				
			|||||||
    return re.sub(r'''(?sx)
 | 
					    return re.sub(r'''(?sx)
 | 
				
			||||||
        "(?:[^"\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^"\\]*"|
 | 
					        "(?:[^"\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^"\\]*"|
 | 
				
			||||||
        '(?:[^'\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^'\\]*'|
 | 
					        '(?:[^'\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^'\\]*'|
 | 
				
			||||||
        /\*.*?\*/|//[^\n]*|,(?=\s*[\]}])|
 | 
					        {comment}|,(?={skip}[\]}}])|
 | 
				
			||||||
        [a-zA-Z_][.a-zA-Z_0-9]*|
 | 
					        [a-zA-Z_][.a-zA-Z_0-9]*|
 | 
				
			||||||
        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:\s*:)?|
 | 
					        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:{skip}:)?|
 | 
				
			||||||
        [0-9]+(?=\s*:)
 | 
					        [0-9]+(?={skip}:)
 | 
				
			||||||
        ''', fix_kv, code)
 | 
					        '''.format(comment=COMMENT_RE, skip=SKIP_RE), fix_kv, code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def qualities(quality_ids):
 | 
					def qualities(quality_ids):
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user