Mercurial > hgrepos > Python > libs > pygments-lexer-pseudocode2
changeset 53:39151225fb84
Rename the new pseudocode implementation to AlgPseudocode.
Because it is modelled after CTAN's algpseudocode(x).
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Sun, 26 Apr 2026 19:16:23 +0200 |
| parents | 5bfa9113d3c4 |
| children | d2679e811627 |
| files | pygments_lexer_pseudocode2/algpseudocode.py pygments_lexer_pseudocode2/pseudocode.py tests/_tsetup.py tests/test_algpseudo.py tests/test_pseudo.py |
| diffstat | 5 files changed, 428 insertions(+), 426 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pygments_lexer_pseudocode2/algpseudocode.py Sun Apr 26 19:16:23 2026 +0200 @@ -0,0 +1,163 @@ + +# -*- coding: utf-8 -*- +# :- +# SPDX-FileCopyrightText: © 2026 Franz Glasner +# SPDX-License-Identifier: MIT +# :- +r"""A pseudocode lexer along the lines of CTAN's algpseudocode or +algpseudocodex. + +""" + +__all__ = ["AlgPseudocodeLexer", + "AlgPseudocodeLexer_DE", "AlgPseudocodeLexer_FR"] + + +import re + +from pygments.lexer import include, bygroups +from pygments.token import (Comment, Keyword, Name, Text, Whitespace) + +# +# Relative imports do not work with pygments.lexers.load_lexer_from_file() +# in all of our supported Python releases. +# +from pygments_lexer_pseudocode2.bases import LexBase + + +class AlgPseudocodeLexer(LexBase): + + """A pseudocode lexer along the lines of CTAN's algpseudocode or + algpseudocodex. + + Some ideas (e.g. strings) are borrowed from Pygment's Python lexer. + + """ + + name = "AlgPseudocode" + aliases = ["algpseudocode", "algpseudo"] + filenames = ["*.algpseudo", "*.algpseudocode"] + mimetypes = [] + flags = re.MULTILINE + + LANG = "en" + TRANSLATIONS = { + "PROG": "PROGRAM", + "PROGRAM": "PROGRAM", + "ALGO": "ALGORITHM", + "ALGORITHM": "ALGORITHM", + "PROC": "PROCEDURE", + "PROCEDURE": "PROCEDURE", + "FUNC": "FUNCTION", + "FUNCTION": "FUNCTION", + "FN": "FUNCTION", + "CLASS": "CLASS", + } + SYMBOLS = { + "REMARK": "▷", # U+25B7: Unicode 1.0 (Arrows) + "Remark": "▷", + "remark": "▷", + "REM": "▷", + "Rem": "▷", + "rem": "▷", + "R": "▷", + "r": "▷", + "BLOCK": "┃", # U+2503: Unicode 1.0 (Bow Drawing) + "Block": "┃", + "block": "┃", + } + + def op_translate(toktype): + + def _op_translate(lexer, match, ctx=None): + kw = match.group().upper() + yield match.start(), toktype, lexer.TRANSLATIONS.get(kw, kw) + + return _op_translate + + def op_symbol(toktype): + + def _op_symbol(lexer, match, ctx=None): + kw = match.group() + yield match.start(), toktype, lexer.SYMBOLS.get(kw, kw) + + return _op_symbol + + tokens = { + "root": [ + (r"\n", Whitespace), + (r"/\*", Comment.Multiline, "multiline-nested-comment"), + (r"//.*$", Comment.Single), + (r"(?:\\)(REMARK|Remark|remark|REM|Rem|rem|R|r)\b(.*)$", + bygroups(op_symbol(Comment.Single), Comment.Single)), + (r"(?:\\)(BLOCK|Block|block)\b(.*)$", + bygroups(op_symbol(Text), Text)), + (r"\\\n", Text), + (r"(?i)\\(" + r"(?:prog(?:ram)?)" + r"|(?:algo(?:rithm)?)" + r"|(?:proc(?:edure)?)" + r"|(?:func(?:tion)?|(?:fn))" + r"|(?:class)" + r")(\s*)(\{)", + bygroups(op_translate(Keyword), Whitespace, Name.Entity), + "entity-name"), + include("expr"), + (r"\s+", Text), + ], + "entity-name": [ # may be multiline + (r"[^\\}]+", Name.Entity), + (r"\\\}", Name.Entity), + (r"\\", Name.Entity), + (r"\}", Name.Entity, "#pop"), + ], + "expr": [ + include("py-strings"), + include("py-numbers"), + include("py-name"), + ] + } + + +class AlgPseudocodeLexer_DE(AlgPseudocodeLexer): + + name = "AlgPseudocodeDE" + aliases = ["algpseudocode-de", "algpseudo-de"] + filenames = ["*.algpseudo-de", "*.algpseudocode-de"] + + LANG = "de" + TRANSLATIONS = AlgPseudocodeLexer.TRANSLATIONS.copy() + TRANSLATIONS.update({ + "PROG": "PROGRAMM", + "PROGRAM": "PROGRAMM", + "ALGO": "ALGORITHMUS", + "ALGORITHM": "ALGORITHMUS", + "PROC": "PROZEDUR", + "PROCEDURE": "PROZEDUR", + "FUNC": "FUNKTION", + "FUNCTION": "FUNKTION", + "FN": "FUNKTION", + "CLASS": "KLASSE", + }) + + +class AlgPseudocodeLexer_FR(AlgPseudocodeLexer): + + name = "AlgPseudocodeFR" + aliases = ["algpseudocode-fr", "algpseudo-fr"] + filenames = ["*.algpseudo-fr", "*.algpseudocode-fr"] + + LANG = "de" + TRANSLATIONS = AlgPseudocodeLexer.TRANSLATIONS.copy() + TRANSLATIONS.update({ + "PROG": "PROGRAMME", + "PROGRAM": "PROGRAMME", + "ALGO": "ALGORITHME", + "ALGORITHM": "ALGORITHME", + "PROC": "PROCÉDURE", + "PROCEDURE": "PROCÉDURE", + "FUNC": "FONCTION", + "FUNCTION": "FOUNCTION", + "FN": "FONCTION", + "CLASS": "CLASSE", + })
--- a/pygments_lexer_pseudocode2/pseudocode.py Sun Apr 26 18:58:44 2026 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -# -*- coding: utf-8 -*- -# :- -# SPDX-FileCopyrightText: © 2026 Franz Glasner -# SPDX-License-Identifier: MIT -# :- -r"""A pseudocode lexer along the lines of CTAN's algpseudocode or -algpseudocodex. - -""" - -__all__ = ["PseudocodeLexer", "PseudocodeLexer_DE"] - - -import re - -from pygments.lexer import include, bygroups -from pygments.token import (Comment, Keyword, Name, Text, Whitespace) - -# -# Relative imports do not work with pygments.lexers.load_lexer_from_file() -# in all of our supported Python releases. -# -from pygments_lexer_pseudocode2.bases import LexBase - - -class PseudocodeLexer(LexBase): - - """A pseudocode lexer along the lines of CTAN's algpseudocode or - algpseudocodex. - - Some ideas (e.g. strings) are borrowed from Pygment's Python lexer. - - """ - - name = "Pseudocode" - aliases = ["pseudocode", "pseudo", "algorithm", "algo"] - filenames = ["*.algo", "*.pseudocode"] - mimetypes = [] - flags = re.MULTILINE - - LANG = "en" - TRANSLATIONS = { - "PROG": "PROGRAM", - "PROGRAM": "PROGRAM", - "ALGO": "ALGORITHM", - "ALGORITHM": "ALGORITHM", - "PROC": "PROCEDURE", - "PROCEDURE": "PROCEDURE", - "FUNC": "FUNCTION", - "FUNCTION": "FUNCTION", - "FN": "FUNCTION", - "CLASS": "CLASS", - } - SYMBOLS = { - "REMARK": "▷", # U+25B7: Unicode 1.0 (Arrows) - "Remark": "▷", - "remark": "▷", - "REM": "▷", - "Rem": "▷", - "rem": "▷", - "R": "▷", - "r": "▷", - "BLOCK": "┃", # U+2503: Unicode 1.0 (Bow Drawing) - "Block": "┃", - "block": "┃", - } - - def op_translate(toktype): - - def _op_translate(lexer, match, ctx=None): - kw = match.group().upper() - yield match.start(), toktype, lexer.TRANSLATIONS.get(kw, kw) - - return _op_translate - - def op_symbol(toktype): - - def _op_symbol(lexer, match, ctx=None): - kw = match.group() - yield match.start(), toktype, lexer.SYMBOLS.get(kw, kw) - - return _op_symbol - - tokens = { - "root": [ - (r"\n", Whitespace), - (r"/\*", Comment.Multiline, "multiline-nested-comment"), - (r"//.*$", Comment.Single), - (r"(?:\\)(REMARK|Remark|remark|REM|Rem|rem|R|r)\b(.*)$", - bygroups(op_symbol(Comment.Single), Comment.Single)), - (r"(?:\\)(BLOCK|Block|block)\b(.*)$", - bygroups(op_symbol(Text), Text)), - (r"\\\n", Text), - (r"(?i)\\(" - r"(?:prog(?:ram)?)" - r"|(?:algo(?:rithm)?)" - r"|(?:proc(?:edure)?)" - r"|(?:func(?:tion)?|(?:fn))" - r"|(?:class)" - r")(\s*)(\{)", - bygroups(op_translate(Keyword), Whitespace, Name.Entity), - "entity-name"), - include("expr"), - (r"\s+", Text), - ], - "entity-name": [ # may be multiline - (r"[^\\}]+", Name.Entity), - (r"\\\}", Name.Entity), - (r"\\", Name.Entity), - (r"\}", Name.Entity, "#pop"), - ], - "expr": [ - include("py-strings"), - include("py-numbers"), - include("py-name"), - ] - } - - -class PseudocodeLexer_DE(PseudocodeLexer): - - name = "PseudocodeDE" - aliases = ["pseudocode-de", "pseudo-de", "algorithm-de", "algo-de"] - filenames = ["*.algo-de", "*.pseudocode-de"] - - LANG = "de" - TRANSLATIONS = PseudocodeLexer.TRANSLATIONS.copy() - TRANSLATIONS.update({ - "PROG": "PROGRAMM", - "PROGRAM": "PROGRAMM", - "ALGO": "ALGORITHMUS", - "ALGORITHM": "ALGORITHMUS", - "PROC": "PROZEDUR", - "PROCEDURE": "PROZEDUR", - "FUNC": "FUNKTION", - "FUNCTION": "FUNKTION", - "FN": "FUNKTION", - "CLASS": "KLASSE", - }) - - -class PseudocodeLexer_FR(PseudocodeLexer): - - name = "PseudocodeFR" - aliases = ["pseudocode-fr", "pseudo-fr", "algorithm-fr", "algo-fr"] - filenames = ["*.algo-fr", "*.pseudocode-fr"] - - LANG = "de" - TRANSLATIONS = PseudocodeLexer.TRANSLATIONS.copy() - TRANSLATIONS.update({ - "PROG": "PROGRAMME", - "PROGRAM": "PROGRAMME", - "ALGO": "ALGORITHME", - "ALGORITHM": "ALGORITHME", - "PROC": "PROCÉDURE", - "PROCEDURE": "PROCÉDURE", - "FUNC": "FONCTION", - "FUNCTION": "FOUNCTION", - "FN": "FONCTION", - "CLASS": "CLASSE", - })
--- a/tests/_tsetup.py Sun Apr 26 18:58:44 2026 +0200 +++ b/tests/_tsetup.py Sun Apr 26 19:16:23 2026 +0200 @@ -10,9 +10,9 @@ __all__ = [ "PROJECTDIR", - "LEXERCLASS", + "ALGLEXERCLASS", + "ALGLEXERFILENAME", "FRLEXERCLASS", - "LEXERFILENAME", "FRLEXERFILENAME", "TESTSNIPPETSDIR", ] @@ -30,10 +30,10 @@ "pygments_lexer_pseudocode2", "fr_pseudocode.py") FRLEXERCLASS = "FrPseudocodeLexer" -LEXERFILENAME = os.path.join(PROJECTDIR, - "pygments_lexer_pseudocode2", - "pseudocode.py") -LEXERCLASS = "PseudocodeLexer" +ALGLEXERFILENAME = os.path.join(PROJECTDIR, + "pygments_lexer_pseudocode2", + "algpseudocode.py") +ALGLEXERCLASS = "AlgPseudocodeLexer" TESTSNIPPETSDIR = os.path.join( os.path.abspath(os.path.dirname(__file__)), "snippets")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_algpseudo.py Sun Apr 26 19:16:23 2026 +0200 @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- +# :- +# SPDX-FileCopyrightText: © 2026 Franz Glasner +# SPDX-License-Identifier: MIT +# :- + +from _tsetup import ALGLEXERFILENAME, ALGLEXERCLASS + +import unittest + +import pygments +import pygments.lexers + +import _testhelper + + +class TestSnippets(unittest.TestCase, _testhelper.TokenAssertHelper): + + def setUp(self): + self.lexer = pygments.lexers.load_lexer_from_file( + ALGLEXERFILENAME, ALGLEXERCLASS) + + def test_lf(self): + self.assertTokenStreamEqualComplete( + [("Text.Whitespace", "\n")], + pygments.lex("\n", self.lexer)) + + def test_protected_lf(self): + self.assertTokenStreamEqualComplete( + [("Text", "\\\n")], + pygments.lex("\\\n", self.lexer)) + + def test_number_int(self): + self.assertTokenStreamEqualComplete( + [("Number.Integer", "10"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("10", self.lexer)) + + def test_number_float_1(self): + self.assertTokenStreamEqualComplete( + [("Number.Float", "3.1415926"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("3.1415926", self.lexer)) + + def test_number_float_2(self): + self.assertTokenStreamEqualComplete( + [("Number.Float", "3.14e-12"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("3.14e-12", self.lexer)) + + def test_string_s_1(self): + self.assertTokenStreamEqualComplete( + [("String.Single", "'"), + ("String.Single", "HU"), + ("String.Single", '"'), + ("String.Single", "HE HA"), + ("String.Escape", "\\'"), + ("String.Single", "HO"), + ("String.Single", "'"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("""'HU"HE HA\\'HO'""", self.lexer)) + + def test_string_s_2(self): + self.assertTokenStreamEqual( + [("String.Single", "'"), + ("String.Single", "HUHU"), + ("Error", "\n"), + ], + pygments.lex("'HUHU\nHEHE'", self.lexer)) + + def test_string_ts_1(self): + self.assertTokenStreamEqualComplete( + [("String.Single", "'''"), + ("String.Single", "HUHU HEHE"), + ("String.Single", "'''"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("'''HUHU HEHE'''", self.lexer)) + + def test_string_ts_2(self): + self.assertTokenStreamEqualComplete( + [("String.Single", "'''"), + ("String.Single", "HI"), + ("String.Single", "'"), + ("String.Single", "HU"), + ("String.Single", "\n"), + ("String.Single", "HE"), + ("String.Single", '"'), + ("String.Single", "HA"), + ("String.Single", "'''"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("""'''HI'HU\nHE"HA'''""", self.lexer)) + + def test_string_d_1(self): + self.assertTokenStreamEqualComplete( + [("String.Double", '"'), + ("String.Double", 'HU'), + ("String.Double", "'"), + ("String.Double", 'HE HA'), + ("String.Escape", '\\"'), + ("String.Double", 'HO'), + ("String.Double", '"'), + ("Text.Whitespace", "\n"), + ], + pygments.lex('''"HU'HE HA\\"HO"''', self.lexer)) + + def test_string_d_2(self): + self.assertTokenStreamEqual( + [("String.Double", '"'), + ("String.Double", "HUHU"), + ("Error", "\n"), + ], + pygments.lex('"HUHU\nHEHE"', self.lexer)) + + def test_string_td_1(self): + self.assertTokenStreamEqualComplete( + [("String.Double", '"""'), + ("String.Double", 'HUHU HAHA'), + ("String.Double", '"""'), + ("Text.Whitespace", "\n"), + ], + pygments.lex('"""HUHU HAHA"""', self.lexer)) + + def test_string_td_2(self): + self.assertTokenStreamEqualComplete( + [("String.Double", '"""'), + ("String.Double", 'HU'), + ("String.Double", '"'), + ("String.Double", "HO"), + ("String.Double", "\n"), + ("String.Double", "HE"), + ("String.Double", "'"), + ("String.Double", "HA"), + ("String.Double", '"""'), + ("Text.Whitespace", "\n"), + ], + pygments.lex('''"""HU"HO\nHE'HA"""''', self.lexer)) + + def test_proc(self): + self.assertTokenStreamEqualComplete( + [("Keyword", "PROCEDURE"), + ("Text.Whitespace", " "), + ("Name.Entity", "{"), + ("Name.Entity", "the name"), + ("Name.Entity", "}"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\PROC {the name}", self.lexer)) + + def test_proc_de(self): + lexer = pygments.lexers.load_lexer_from_file( + ALGLEXERFILENAME, "AlgPseudocodeLexer_DE") + self.assertTokenStreamEqualComplete( + [("Keyword", "PROZEDUR"), + ("Text.Whitespace", " "), + ("Name.Entity", "{"), + ("Name.Entity", " also {nichtxs"), + ("Name.Entity", "\\}"), + ("Name.Entity", " hier"), + ("Name.Entity", "}"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\PROC { also {nichtxs\\} hier}", lexer)) + + def test_function_1(self): + self.assertTokenStreamEqualComplete( + [("Keyword", "FUNCTION"), + ("Name.Entity", "{"), + ("Name.Entity", "1"), + ("Name.Entity", "}"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\FUNC{1}", self.lexer)) + + def test_function_2(self): + self.assertTokenStreamEqualComplete( + [("Keyword", "FUNCTION"), + ("Name.Entity", "{"), + ("Name.Entity", "line 1\nline 2\n"), + ("Name.Entity", "}"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\FUNCTION{line 1\nline 2\n}", self.lexer)) + + def test_function_3(self): + self.assertTokenStreamEqualComplete( + [("Keyword", "FUNCTION"), + ("Text.Whitespace", " "), + ("Name.Entity", "{"), + ("Name.Entity", "\\"), + ("Name.Entity", "n"), + ("Name.Entity", "\\}"), + ("Name.Entity", "}"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\FN {\\n\\}}", self.lexer)) + + def test_class(self): + self.assertTokenStreamEqualComplete( + [("Keyword", "CLASS"), + ("Text.Whitespace", " "), + ("Name.Entity", "{"), + ("Name.Entity", "\\"), + ("Name.Entity", "n"), + ("Name.Entity", "\\}"), + ("Name.Entity", "}"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\CLASS {\\n\\}}", self.lexer)) + + def test_class_fr(self): + lexer = pygments.lexers.load_lexer_from_file( + ALGLEXERFILENAME, "AlgPseudocodeLexer_FR") + self.assertTokenStreamEqualComplete( + [("Keyword", "CLASSE"), + ("Text.Whitespace", " "), + ("Name.Entity", "{"), + ("Name.Entity", "\\"), + ("Name.Entity", "n"), + ("Name.Entity", "\\}"), + ("Name.Entity", "}"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\CLASS {\\n\\}}", lexer)) + + def test_remark_1(self): + self.assertTokenStreamEqualComplete( + [("Comment.Single", "▷"), + ("Comment.Single", " the remark"), + ("Text.Whitespace", "\n"), + ], + pygments.lex("\\REMARK the remark\n", self.lexer)) + + def test_remark_2(self): + self.assertTokenStreamEqualComplete( + [("Comment.Single", "▷"), + ("Comment.Single", " the remark 1"), + ("Text.Whitespace", "\n"), + ("Comment.Single", "▷"), + ("Comment.Single", " the remark 2"), + ("Text.Whitespace", "\n"), + ("Comment.Single", "▷"), + ("Comment.Single", " the remark 3"), + ("Text.Whitespace", "\n"), + ], + pygments.lex( + """\\REMARK the remark 1 +\\Rem the remark 2 +\\r the remark 3 +""", self.lexer)) + + +if __name__ == "__main__": + unittest.main()
--- a/tests/test_pseudo.py Sun Apr 26 18:58:44 2026 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ -# -*- coding: utf-8 -*- -# :- -# SPDX-FileCopyrightText: © 2026 Franz Glasner -# SPDX-License-Identifier: MIT -# :- - -from _tsetup import LEXERFILENAME, LEXERCLASS - -import unittest - -import pygments -import pygments.lexers - -import _testhelper - - -class TestSnippets(unittest.TestCase, _testhelper.TokenAssertHelper): - - def setUp(self): - self.lexer = pygments.lexers.load_lexer_from_file( - LEXERFILENAME, LEXERCLASS) - - def test_lf(self): - self.assertTokenStreamEqualComplete( - [("Text.Whitespace", "\n")], - pygments.lex("\n", self.lexer)) - - def test_protected_lf(self): - self.assertTokenStreamEqualComplete( - [("Text", "\\\n")], - pygments.lex("\\\n", self.lexer)) - - def test_number_int(self): - self.assertTokenStreamEqualComplete( - [("Number.Integer", "10"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("10", self.lexer)) - - def test_number_float_1(self): - self.assertTokenStreamEqualComplete( - [("Number.Float", "3.1415926"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("3.1415926", self.lexer)) - - def test_number_float_2(self): - self.assertTokenStreamEqualComplete( - [("Number.Float", "3.14e-12"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("3.14e-12", self.lexer)) - - def test_string_s_1(self): - self.assertTokenStreamEqualComplete( - [("String.Single", "'"), - ("String.Single", "HU"), - ("String.Single", '"'), - ("String.Single", "HE HA"), - ("String.Escape", "\\'"), - ("String.Single", "HO"), - ("String.Single", "'"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("""'HU"HE HA\\'HO'""", self.lexer)) - - def test_string_s_2(self): - self.assertTokenStreamEqual( - [("String.Single", "'"), - ("String.Single", "HUHU"), - ("Error", "\n"), - ], - pygments.lex("'HUHU\nHEHE'", self.lexer)) - - def test_string_ts_1(self): - self.assertTokenStreamEqualComplete( - [("String.Single", "'''"), - ("String.Single", "HUHU HEHE"), - ("String.Single", "'''"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("'''HUHU HEHE'''", self.lexer)) - - def test_string_ts_2(self): - self.assertTokenStreamEqualComplete( - [("String.Single", "'''"), - ("String.Single", "HI"), - ("String.Single", "'"), - ("String.Single", "HU"), - ("String.Single", "\n"), - ("String.Single", "HE"), - ("String.Single", '"'), - ("String.Single", "HA"), - ("String.Single", "'''"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("""'''HI'HU\nHE"HA'''""", self.lexer)) - - def test_string_d_1(self): - self.assertTokenStreamEqualComplete( - [("String.Double", '"'), - ("String.Double", 'HU'), - ("String.Double", "'"), - ("String.Double", 'HE HA'), - ("String.Escape", '\\"'), - ("String.Double", 'HO'), - ("String.Double", '"'), - ("Text.Whitespace", "\n"), - ], - pygments.lex('''"HU'HE HA\\"HO"''', self.lexer)) - - def test_string_d_2(self): - self.assertTokenStreamEqual( - [("String.Double", '"'), - ("String.Double", "HUHU"), - ("Error", "\n"), - ], - pygments.lex('"HUHU\nHEHE"', self.lexer)) - - def test_string_td_1(self): - self.assertTokenStreamEqualComplete( - [("String.Double", '"""'), - ("String.Double", 'HUHU HAHA'), - ("String.Double", '"""'), - ("Text.Whitespace", "\n"), - ], - pygments.lex('"""HUHU HAHA"""', self.lexer)) - - def test_string_td_2(self): - self.assertTokenStreamEqualComplete( - [("String.Double", '"""'), - ("String.Double", 'HU'), - ("String.Double", '"'), - ("String.Double", "HO"), - ("String.Double", "\n"), - ("String.Double", "HE"), - ("String.Double", "'"), - ("String.Double", "HA"), - ("String.Double", '"""'), - ("Text.Whitespace", "\n"), - ], - pygments.lex('''"""HU"HO\nHE'HA"""''', self.lexer)) - - def test_proc(self): - self.assertTokenStreamEqualComplete( - [("Keyword", "PROCEDURE"), - ("Text.Whitespace", " "), - ("Name.Entity", "{"), - ("Name.Entity", "the name"), - ("Name.Entity", "}"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\PROC {the name}", self.lexer)) - - def test_proc_de(self): - lexer = pygments.lexers.load_lexer_from_file( - LEXERFILENAME, "PseudocodeLexer_DE") - self.assertTokenStreamEqualComplete( - [("Keyword", "PROZEDUR"), - ("Text.Whitespace", " "), - ("Name.Entity", "{"), - ("Name.Entity", " also {nichtxs"), - ("Name.Entity", "\\}"), - ("Name.Entity", " hier"), - ("Name.Entity", "}"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\PROC { also {nichtxs\\} hier}", lexer)) - - def test_function_1(self): - self.assertTokenStreamEqualComplete( - [("Keyword", "FUNCTION"), - ("Name.Entity", "{"), - ("Name.Entity", "1"), - ("Name.Entity", "}"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\FUNC{1}", self.lexer)) - - def test_function_2(self): - self.assertTokenStreamEqualComplete( - [("Keyword", "FUNCTION"), - ("Name.Entity", "{"), - ("Name.Entity", "line 1\nline 2\n"), - ("Name.Entity", "}"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\FUNCTION{line 1\nline 2\n}", self.lexer)) - - def test_function_3(self): - self.assertTokenStreamEqualComplete( - [("Keyword", "FUNCTION"), - ("Text.Whitespace", " "), - ("Name.Entity", "{"), - ("Name.Entity", "\\"), - ("Name.Entity", "n"), - ("Name.Entity", "\\}"), - ("Name.Entity", "}"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\FN {\\n\\}}", self.lexer)) - - def test_class(self): - self.assertTokenStreamEqualComplete( - [("Keyword", "CLASS"), - ("Text.Whitespace", " "), - ("Name.Entity", "{"), - ("Name.Entity", "\\"), - ("Name.Entity", "n"), - ("Name.Entity", "\\}"), - ("Name.Entity", "}"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\CLASS {\\n\\}}", self.lexer)) - - def test_class_fr(self): - lexer = pygments.lexers.load_lexer_from_file( - LEXERFILENAME, "PseudocodeLexer_FR") - self.assertTokenStreamEqualComplete( - [("Keyword", "CLASSE"), - ("Text.Whitespace", " "), - ("Name.Entity", "{"), - ("Name.Entity", "\\"), - ("Name.Entity", "n"), - ("Name.Entity", "\\}"), - ("Name.Entity", "}"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\CLASS {\\n\\}}", lexer)) - - def test_remark_1(self): - self.assertTokenStreamEqualComplete( - [("Comment.Single", "▷"), - ("Comment.Single", " the remark"), - ("Text.Whitespace", "\n"), - ], - pygments.lex("\\REMARK the remark\n", self.lexer)) - - def test_remark_2(self): - self.assertTokenStreamEqualComplete( - [("Comment.Single", "▷"), - ("Comment.Single", " the remark 1"), - ("Text.Whitespace", "\n"), - ("Comment.Single", "▷"), - ("Comment.Single", " the remark 2"), - ("Text.Whitespace", "\n"), - ("Comment.Single", "▷"), - ("Comment.Single", " the remark 3"), - ("Text.Whitespace", "\n"), - ], - pygments.lex( - """\\REMARK the remark 1 -\\Rem the remark 2 -\\r the remark 3 -""", self.lexer)) - - -if __name__ == "__main__": - unittest.main()
