[cleanup] Refactor JSInterpreter._seperate

This commit is contained in:
pukkandan 2021-11-29 02:54:34 +05:30
parent 75b725a7cc
commit 06dfe0a0a2
No known key found for this signature in database
GPG Key ID: 0F00D95A001F4698

View File

@ -25,6 +25,8 @@
_NAME_RE = r'[a-zA-Z_$][a-zA-Z_$0-9]*' _NAME_RE = r'[a-zA-Z_$][a-zA-Z_$0-9]*'
_MATCHING_PARENS = dict(zip('({[', ')}]'))
class JS_Break(ExtractorError): class JS_Break(ExtractorError):
def __init__(self): def __init__(self):
@ -88,26 +90,24 @@ def _named_object(self, namespace, obj):
def _seperate(expr, delim=',', max_split=None): def _seperate(expr, delim=',', max_split=None):
if not expr: if not expr:
return return
parens = {'(': 0, '{': 0, '[': 0, ']': 0, '}': 0, ')': 0} counters = {k: 0 for k in _MATCHING_PARENS.values()}
start, splits, pos, max_pos = 0, 0, 0, len(delim) - 1 start, splits, pos, delim_len = 0, 0, 0, len(delim) - 1
for idx, char in enumerate(expr): for idx, char in enumerate(expr):
if char in parens: if char in _MATCHING_PARENS:
parens[char] += 1 counters[_MATCHING_PARENS[char]] += 1
is_in_parens = (parens['['] - parens[']'] elif char in counters:
or parens['('] - parens[')'] counters[char] -= 1
or parens['{'] - parens['}']) if char != delim[pos] or any(counters.values()):
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:
pos = 0 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:] yield expr[start:]
@staticmethod @staticmethod