changeset 40:df08226a6984

Names for some entities (program, algorithm, function, procedure, class). Also test for "class".
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 24 Apr 2026 10:48:00 +0200
parents a3151d837258
children 4ccf9a8d0bf2
files pygments_lexer_pseudocode2/pseudocode.py tests/test_pseudo.py
diffstat 2 files changed, 52 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/pygments_lexer_pseudocode2/pseudocode.py	Fri Apr 24 09:44:34 2026 +0200
+++ b/pygments_lexer_pseudocode2/pseudocode.py	Fri Apr 24 10:48:00 2026 +0200
@@ -14,7 +14,7 @@
 import re
 
 from pygments.lexer import include, bygroups
-from pygments.token import (Comment, Keyword, Text, Whitespace)
+from pygments.token import (Comment, Keyword, Name, Text, Whitespace)
 
 #
 # Relative imports do not work with pygments.lexers.load_lexer_from_file()
@@ -67,8 +67,8 @@
 
     def op_translate(toktype):
 
-        def _op_translate(lexer, match):
-            kw = match.group(1).upper()
+        def _op_translate(lexer, match, ctx=None):
+            kw = match.group().upper()
             yield match.start(), toktype, lexer.TRANSLATIONS.get(kw, kw)
 
         return _op_translate
@@ -97,10 +97,17 @@
              r"|(?:proc(?:edure)?)"
              r"|(?:func(?:tion)?|(?:fn))"
              r"|(?:class)"
-             r")\b",
-             op_translate(Keyword)),
+             r")(\s*)(\{)",
+             bygroups(op_translate(Keyword), Whitespace, Name.Entity),
+             "entity-name"),
             include("expr"),
         ],
+        "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"),
--- a/tests/test_pseudo.py	Fri Apr 24 09:44:34 2026 +0200
+++ b/tests/test_pseudo.py	Fri Apr 24 10:48:00 2026 +0200
@@ -146,39 +146,74 @@
     def test_proc(self):
         self.assertTokenStreamEqualComplete(
             [("Keyword", "PROCEDURE"),
+             ("Text.Whitespace", " "),
+             ("Name.Entity", "{"),
+             ("Name.Entity", "the name"),
+             ("Name.Entity", "}"),
              ("Text.Whitespace", "\n"),
              ],
-            pygments.lex("\\PROC", self.lexer))
+            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", lexer))
+            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", self.lexer))
+            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", self.lexer))
+            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", self.lexer))
+            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_remark_1(self):
         self.assertTokenStreamEqualComplete(