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()