aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authordirkf <[email protected]>2024-12-12 04:21:53 +0000
committerdirkf <[email protected]>2024-12-16 12:38:51 +0000
commitf487b4a02a74bb143a7b8f7cb26819b5b661a40b (patch)
treeb9f84a4b972813ebd9d56fe079841550af9cf581
parent60835ca16c052eb00bb9bccd44f8843edac66a2e (diff)
downloadyoutube-dl-f487b4a02a74bb143a7b8f7cb26819b5b661a40b.tar.gz
youtube-dl-f487b4a02a74bb143a7b8f7cb26819b5b661a40b.zip
[jsinterp] Strip /* comments */ when parsing
* NB: _separate() is looking creaky
-rw-r--r--test/test_jsinterp.py10
-rw-r--r--youtube_dl/jsinterp.py20
2 files changed, 27 insertions, 3 deletions
diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py
index 07ed481d8..12e7b9b94 100644
--- a/test/test_jsinterp.py
+++ b/test/test_jsinterp.py
@@ -160,7 +160,6 @@ class TestJSInterpreter(unittest.TestCase):
self._test('function f(){var x = 20; x += 30 + 1; return x;}', 51)
self._test('function f(){var x = 20; x -= 30 + 1; return x;}', -11)
- @unittest.skip('Not yet fully implemented')
def test_comments(self):
self._test('''
function f() {
@@ -179,6 +178,15 @@ class TestJSInterpreter(unittest.TestCase):
}
''', 3)
+ self._test('''
+ function f() {
+ var x = ( /* 1 + */ 2 +
+ /* 30 * 40 */
+ 50);
+ return x;
+ }
+ ''', 52)
+
def test_precedence(self):
self._test('''
function f() {
diff --git a/youtube_dl/jsinterp.py b/youtube_dl/jsinterp.py
index 0cfae4b28..ec8674936 100644
--- a/youtube_dl/jsinterp.py
+++ b/youtube_dl/jsinterp.py
@@ -488,9 +488,18 @@ class JSInterpreter(object):
skipping = 0
if skip_delims:
skip_delims = variadic(skip_delims)
+ skip_txt = None
for idx, char in enumerate(expr):
+ if skip_txt and idx <= skip_txt[1]:
+ continue
paren_delta = 0
if not in_quote:
+ if char == '/' and expr[idx:idx + 2] == '/*':
+ # skip a comment
+ skip_txt = expr[idx:].find('*/', 2)
+ skip_txt = [idx, idx + skip_txt + 1] if skip_txt >= 2 else None
+ if skip_txt:
+ continue
if char in _MATCHING_PARENS:
counters[_MATCHING_PARENS[char]] += 1
paren_delta = 1
@@ -523,12 +532,19 @@ class JSInterpreter(object):
if pos < delim_len:
pos += 1
continue
- yield expr[start: idx - delim_len]
+ if skip_txt and skip_txt[0] >= start and skip_txt[1] <= idx - delim_len:
+ yield expr[start:skip_txt[0]] + expr[skip_txt[1] + 1: idx - delim_len]
+ else:
+ yield expr[start: idx - delim_len]
+ skip_txt = None
start, pos = idx + 1, 0
splits += 1
if max_split and splits >= max_split:
break
- yield expr[start:]
+ if skip_txt and skip_txt[0] >= start:
+ yield expr[start:skip_txt[0]] + expr[skip_txt[1] + 1:]
+ else:
+ yield expr[start:]
@classmethod
def _separate_at_paren(cls, expr, delim=None):