From da73cd90eceb46ccec4dbfc2bfdf756da31277e8 Mon Sep 17 00:00:00 2001 From: sulyi Date: Fri, 25 Nov 2016 22:31:58 +0100 Subject: [PATCH] [jsinterp] Quick regex fixes (thx to yan12125) --- test/test_jsinterp.py | 8 ++++++-- youtube_dl/jsinterp.py | 7 ++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py index 632105f68..ceaf36d30 100644 --- a/test/test_jsinterp.py +++ b/test/test_jsinterp.py @@ -111,8 +111,12 @@ class TestJSInterpreter(unittest.TestCase): function z() { return y(3); } ''') self.assertEqual(jsi.call_function('z'), 5) - jsi = JSInterpreter('function w(a) { return a.split(""); }', objects={'a': 'abc'}) - self.assertEqual(jsi.call_function('w'), ["a", "b", "c"]) + jsi = JSInterpreter('function x(a) { return a.split(""); }', objects={'a': 'abc'}) + self.assertEqual(jsi.call_function('x'), ["a", "b", "c"]) + + def test_getfield(self): + jsi = JSInterpreter('function c() { return a.var; }', objects={'a': {'var': 3}}) + self.assertEqual(jsi.call_function('c'), 3) if __name__ == '__main__': unittest.main() diff --git a/youtube_dl/jsinterp.py b/youtube_dl/jsinterp.py index 6a735597b..86b4f5488 100644 --- a/youtube_dl/jsinterp.py +++ b/youtube_dl/jsinterp.py @@ -39,12 +39,14 @@ _DOUBLE_QUOTED = r'''"(?:[^"\\\\]*(?:\\\\\\\\|\\\\['"nurtbfx/\\n]))*[^"\\\\]*"'' _STRING_RE = r'%s|%s' % (_SINGLE_QUOTED, _DOUBLE_QUOTED) _INTEGER_RE = r'%(hex)s|%(dec)s|%(oct)s' % {'hex': __HEXADECIMAL_RE, 'dec': __DECIMAL_RE, 'oct': __OCTAL_RE} -_FLOAT_RE = r'%(dec)s\.%(dec)s' % {'dec': __DECIMAL_RE} +_FLOAT_RE = r'(%(dec)s)?\.%(dec)s' % {'dec': __DECIMAL_RE} _BOOL_RE = r'true|false' # XXX: it seams group cannot be refed this way # r'/(?=[^*])[^/\n]*/(?![gimy]*(?P[gimy])[gimy]*\g)[gimy]{0,4}' -_REGEX_RE = r'/(?=[^*])[^/\n]*/[gimy]{0,4}' +_REGEX_RE = r'''/(?=[^*]) + ((\\([tnvfr0.\\+*?^$\[\]{}()|/]|[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Z]|))| + [^/\n])*/[gimy]{0,4}''' _LITERAL_RE = r'((?P%(int)s)|(?P%(float)s)|(?P%(str)s)|(?P%(bool)s)|(?P%(regex)s))' % { 'int': _INTEGER_RE, @@ -88,7 +90,6 @@ class JSInterpreter(object): @staticmethod def _next_statement(code, pos=0): - def parse_expression(_pos, allowrecursion=100): expr = '' while _pos < len(code):