diff options
| author | Matthäus G. Chajdas <dev@anteru.net> | 2021-08-08 15:30:43 +0200 |
|---|---|---|
| committer | Matthäus G. Chajdas <dev@anteru.net> | 2021-08-08 15:30:43 +0200 |
| commit | b5bf0f1fc79f0e6aec5e47dbdc0e31e147cecfde (patch) | |
| tree | 7f72ed25d0026b070b80d99f8636370b3e22ac6e | |
| parent | 1f2ab0496366932e4cbf450875bddf12907d0930 (diff) | |
| parent | fbdcfa8066f98d896c2a746aa4fc6d5869f7e8d2 (diff) | |
| download | pygments-git-b5bf0f1fc79f0e6aec5e47dbdc0e31e147cecfde.tar.gz | |
Merge branch 'master' of https://github.com/cltrudeau/pygments into cltrudeau-master
| -rw-r--r-- | pygments/lexers/_mapping.py | 1 | ||||
| -rw-r--r-- | pygments/lexers/javascript.py | 75 | ||||
| -rw-r--r-- | tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl | 20 | ||||
| -rw-r--r-- | tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl.output | 112 |
4 files changed, 202 insertions, 6 deletions
diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index f4eb8416..4c6fb013 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -322,6 +322,7 @@ LEXERS = { 'NimrodLexer': ('pygments.lexers.nimrod', 'Nimrod', ('nimrod', 'nim'), ('*.nim', '*.nimrod'), ('text/x-nim',)), 'NitLexer': ('pygments.lexers.nit', 'Nit', ('nit',), ('*.nit',), ()), 'NixLexer': ('pygments.lexers.nix', 'Nix', ('nixos', 'nix'), ('*.nix',), ('text/x-nix',)), + 'NodeConsoleLexer': ('pygments.lexers.javascript', 'Node.js REPL console session', ('nodejsrepl',), (), ('text/x-nodejsrepl',)), 'NotmuchLexer': ('pygments.lexers.textfmts', 'Notmuch', ('notmuch',), (), ()), 'NuSMVLexer': ('pygments.lexers.smv', 'NuSMV', ('nusmv',), ('*.smv',), ()), 'NumPyLexer': ('pygments.lexers.python', 'NumPy', ('numpy',), (), ()), diff --git a/pygments/lexers/javascript.py b/pygments/lexers/javascript.py index 485fc4cf..7ddd1148 100644 --- a/pygments/lexers/javascript.py +++ b/pygments/lexers/javascript.py @@ -10,16 +10,17 @@ import re -from pygments.lexer import RegexLexer, include, bygroups, default, inherit, using, \ - this, words, combined +from pygments.lexer import bygroups, combined, default, do_insertions, include, \ + inherit, Lexer, RegexLexer, this, using, words from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ - Number, Punctuation, Other + Number, Punctuation, Other, Generic from pygments.util import get_bool_opt import pygments.unistring as uni -__all__ = ['JavascriptLexer', 'TypeScriptLexer', 'KalLexer', 'LiveScriptLexer', - 'DartLexer', 'LassoLexer', 'ObjectiveJLexer', 'CoffeeScriptLexer', - 'MaskLexer', 'EarlGreyLexer', 'JuttleLexer'] +__all__ = ['JavascriptLexer', 'KalLexer', 'LiveScriptLexer', 'DartLexer', + 'TypeScriptLexer', 'LassoLexer', 'ObjectiveJLexer', + 'CoffeeScriptLexer', 'MaskLexer', 'EarlGreyLexer', 'JuttleLexer', + 'NodeConsoleLexer'] JS_IDENT_START = ('(?:[$_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + ']|\\\\u[a-fA-F0-9]{4})') @@ -28,6 +29,7 @@ JS_IDENT_PART = ('(?:[$' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl', '\u200c\u200d]|\\\\u[a-fA-F0-9]{4})') JS_IDENT = JS_IDENT_START + '(?:' + JS_IDENT_PART + ')*' +line_re = re.compile('.*?\n') class JavascriptLexer(RegexLexer): """ @@ -1489,3 +1491,64 @@ class JuttleLexer(RegexLexer): ] } + + +class NodeConsoleLexer(Lexer): + """ + For parsing within an interactive Node.js REPL, such as: + + .. sourcecode:: nodejsrepl + + > let a = 3 + undefined + > a + 3 + > let b = '4' + undefined + > b + '4' + > b == a + false + + .. versionadded: 2.10 + """ + name = 'Node.js REPL console session' + aliases = ['nodejsrepl', ] + mimetypes = ['text/x-nodejsrepl', ] + + def get_tokens_unprocessed(self, text): + jslexer = JavascriptLexer(**self.options) + + curcode = '' + insertions = [] + + for match in line_re.finditer(text): + line = match.group() + if line.startswith('> '): + insertions.append((len(curcode), + [(0, Generic.Prompt, line[:2])])) + + curcode += line[2:] + elif line.startswith('...'): + # node does a nested ... thing depending on depth + code = line.lstrip('.') + lead = len(line) - len(code) + + insertions.append((len(curcode), + [(0, Generic.Prompt, line[:lead])])) + + curcode += code + else: + if curcode: + yield from do_insertions(insertions, + jslexer.get_tokens_unprocessed(curcode)) + + curcode = '' + insertions = [] + + yield from do_insertions([], + jslexer.get_tokens_unprocessed(line)) + + if curcode: + yield from do_insertions(insertions, + jslexer.get_tokens_unprocessed(curcode)) diff --git a/tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl b/tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl new file mode 100644 index 00000000..7679d9ce --- /dev/null +++ b/tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl @@ -0,0 +1,20 @@ +// Node.js REPL Session +> let a = 3 +undefined +> a +3 +> let b = '4' +undefined +> b +'4' +> b == a +false +> b === a +false +> if(a) { +... console.log(a) +... } +3 +undefined +> c +Uncaught ReferenceError: c is not defined diff --git a/tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl.output b/tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl.output new file mode 100644 index 00000000..3e9ae5c0 --- /dev/null +++ b/tests/examplefiles/nodejsrepl/nodejsrepl_test.nodejsrepl.output @@ -0,0 +1,112 @@ +'' Text +'// Node.js REPL Session\n' Comment.Single + +'> ' Generic.Prompt +'let' Keyword.Declaration +' ' Text +'a' Name.Other +' ' Text +'=' Operator +' ' Text +'3' Literal.Number.Float +'\n' Text + +'undefined' Keyword.Constant +'\n' Text + +'> ' Generic.Prompt +'a' Name.Other +'\n' Text + +'3' Literal.Number.Float +'\n' Text + +'> ' Generic.Prompt +'let' Keyword.Declaration +' ' Text +'b' Name.Other +' ' Text +'=' Operator +' ' Text +"'4'" Literal.String.Single +'\n' Text + +'undefined' Keyword.Constant +'\n' Text + +'> ' Generic.Prompt +'b' Name.Other +'\n' Text + +"'4'" Literal.String.Single +'\n' Text + +'> ' Generic.Prompt +'b' Name.Other +' ' Text +'==' Operator +' ' Text +'a' Name.Other +'\n' Text + +'false' Keyword.Constant +'\n' Text + +'> ' Generic.Prompt +'b' Name.Other +' ' Text +'===' Operator +' ' Text +'a' Name.Other +'\n' Text + +'false' Keyword.Constant +'\n' Text + +'> ' Generic.Prompt +'if' Keyword +'(' Punctuation +'a' Name.Other +')' Punctuation +' ' Text +'{' Punctuation +'\n' Text + +'...' Generic.Prompt +' ' Text +'console' Name.Other +'.' Punctuation +'log' Name.Other +'(' Punctuation +'a' Name.Other +')' Punctuation +'\n' Text + +'...' Generic.Prompt +' ' Text +'}' Punctuation +'\n' Text + +'3' Literal.Number.Float +'\n' Text + +'undefined' Keyword.Constant +'\n' Text + +'> ' Generic.Prompt +'c' Name.Other +'\n' Text + +'Uncaught' Name.Other +' ' Text +'ReferenceError' Name.Exception +':' Operator +' ' Text +'c' Name.Other +' ' Text +'is' Name.Other +' ' Text +'not' Name.Other +' ' Text +'defined' Name.Other +'\n' Text |
