Skip to content

Commit

Permalink
Refactor JSInterpreter._separate
Browse files Browse the repository at this point in the history
yt-dlp/yt-dlp/@06dfe0a, improve _MATCHING_PARENS
  • Loading branch information
dirkf committed Jun 27, 2022
1 parent 1961a1b commit 4d0647c
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions youtube_dl/jsinterp.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class Nonlocal:

_NAME_RE = r'[a-zA-Z_$][a-zA-Z_$0-9]*'

_MATCHING_PARENS = dict(zip(*zip('()', '{}', '[]')))


class JS_Break(ExtractorError):
def __init__(self):
Expand Down Expand Up @@ -100,26 +102,24 @@ def _named_object(self, namespace, obj):
def _separate(expr, delim=',', max_split=None):
if not expr:
return
parens = {'(': 0, '{': 0, '[': 0, ']': 0, '}': 0, ')': 0}
start, splits, pos, max_pos = 0, 0, 0, len(delim) - 1
counters = {k: 0 for k in _MATCHING_PARENS.values()}
start, splits, pos, delim_len = 0, 0, 0, len(delim) - 1
for idx, char in enumerate(expr):
if char in parens:
parens[char] += 1
is_in_parens = (parens['['] - parens[']']
or parens['('] - parens[')']
or parens['{'] - parens['}'])
if char == delim[pos] and not is_in_parens:
if pos == max_pos:
pos = 0
yield expr[start: idx - max_pos]
start = idx + 1
splits += 1
if max_split and splits >= max_split:
break
else:
pos += 1
else:
if char in _MATCHING_PARENS:
counters[_MATCHING_PARENS[char]] += 1
elif char in counters:
counters[char] -= 1
if char != delim[pos] or any(counters.values()):
pos = 0
continue
elif pos != delim_len:
pos += 1
continue
yield expr[start: idx - delim_len]
start, pos = idx + 1, 0
splits += 1
if max_split and splits >= max_split:
break
yield expr[start:]

@staticmethod
Expand Down

0 comments on commit 4d0647c

Please sign in to comment.