mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	[utils] js_to_json: Implement template strings (#6623)
				
					
				
			Authored by: Grub4K
This commit is contained in:
		| @@ -1190,6 +1190,13 @@ class TestUtil(unittest.TestCase): | ||||
|         self.assertEqual(js_to_json('42a1'), '42"a1"') | ||||
|         self.assertEqual(js_to_json('42a-1'), '42"a"-1') | ||||
| 
 | ||||
|     def test_js_to_json_template_literal(self): | ||||
|         self.assertEqual(js_to_json('`Hello ${name}`', {'name': '"world"'}), '"Hello world"') | ||||
|         self.assertEqual(js_to_json('`${name}${name}`', {'name': '"X"'}), '"XX"') | ||||
|         self.assertEqual(js_to_json('`${name}${name}`', {'name': '5'}), '"55"') | ||||
|         self.assertEqual(js_to_json('`${name}"${name}"`', {'name': '5'}), '"5\\"5\\""') | ||||
|         self.assertEqual(js_to_json('`${name}`', {}), '"name"') | ||||
| 
 | ||||
|     def test_extract_attributes(self): | ||||
|         self.assertEqual(extract_attributes('<e x="y">'), {'x': 'y'}) | ||||
|         self.assertEqual(extract_attributes("<e x='y'>"), {'x': 'y'}) | ||||
|   | ||||
| @@ -3366,7 +3366,7 @@ def strip_jsonp(code): | ||||
| 
 | ||||
| def js_to_json(code, vars={}, *, strict=False): | ||||
|     # vars is a dict of var, val pairs to substitute | ||||
|     STRING_QUOTES = '\'"' | ||||
|     STRING_QUOTES = '\'"`' | ||||
|     STRING_RE = '|'.join(rf'{q}(?:\\.|[^\\{q}])*{q}' for q in STRING_QUOTES) | ||||
|     COMMENT_RE = r'/\*(?:(?!\*/).)*?\*/|//[^\n]*\n' | ||||
|     SKIP_RE = fr'\s*(?:{COMMENT_RE})?\s*' | ||||
| @@ -3384,6 +3384,12 @@ def js_to_json(code, vars={}, *, strict=False): | ||||
|                 else '' if escape == '\n' | ||||
|                 else escape) | ||||
| 
 | ||||
|     def template_substitute(match): | ||||
|         evaluated = js_to_json(match.group(1), vars, strict=strict) | ||||
|         if evaluated[0] == '"': | ||||
|             return json.loads(evaluated) | ||||
|         return evaluated | ||||
| 
 | ||||
|     def fix_kv(m): | ||||
|         v = m.group(0) | ||||
|         if v in ('true', 'false', 'null'): | ||||
| @@ -3394,7 +3400,8 @@ def js_to_json(code, vars={}, *, strict=False): | ||||
|             return '' | ||||
| 
 | ||||
|         if v[0] in STRING_QUOTES: | ||||
|             escaped = re.sub(r'(?s)(")|\\(.)', process_escape, v[1:-1]) | ||||
|             v = re.sub(r'(?s)\${([^}]+)}', template_substitute, v[1:-1]) if v[0] == '`' else v[1:-1] | ||||
|             escaped = re.sub(r'(?s)(")|\\(.)', process_escape, v) | ||||
|             return f'"{escaped}"' | ||||
| 
 | ||||
|         for regex, base in INTEGER_TABLE: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Simon Sawicki
					Simon Sawicki