diff pygments_lexer_pseudocode2/algpseudocode.py @ 62:7153e945a3d6

Implement ignoring of \ENDxxx including its optional name parts
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 28 Apr 2026 10:09:17 +0200
parents 392745b66969
children 05c53e431c88
line wrap: on
line diff
--- a/pygments_lexer_pseudocode2/algpseudocode.py	Mon Apr 27 19:25:45 2026 +0200
+++ b/pygments_lexer_pseudocode2/algpseudocode.py	Tue Apr 28 10:09:17 2026 +0200
@@ -121,6 +121,14 @@
 
         return _op_end_translate
 
+    def op_opt_ignore(toktype):
+
+        def _op_opt_ignore(lexer, match, ctx=None):
+            if not lexer.no_end:
+                yield match.start(), toktype, match.group()
+
+        return _op_opt_ignore
+
     def op_symbol(toktype):
 
         def _op_symbol(lexer, match, ctx=None):
@@ -146,7 +154,7 @@
              r"|(?:func(?:tion)?|(?:fn))"
              r"|(?:class)"
              r")(\s*)(\{)",
-             bygroups(op_translate(Keyword), Whitespace, Name.Entity),
+             bygroups(op_translate(Keyword), Whitespace, LexBase.op_ignore),
              "entity-name"),
             # ENDxxx keywords with optional entity name
             #   with name
@@ -157,8 +165,10 @@
              r"|(?:func(?:tion)?)"
              r"|(?:class)"
              r")(\s*)(\{)",
-             bygroups(op_opt_end_translate(Keyword), Whitespace, Name.Entity),
-             "entity-name"),
+             bygroups(op_opt_end_translate(Keyword),
+                      op_opt_ignore(Whitespace),
+                      LexBase.op_ignore),
+             "entity-name-end"),
             #   without name
             (r"(?i)\\end(?:_|-)?("
              r"(?:prog(?:ram)?)"
@@ -166,7 +176,7 @@
              r"|(?:proc(?:edure)?)"
              r"|(?:func(?:tion)?)"
              r"|(?:class)"
-             r")((\s*)(\{))?",
+             r")\b",
              bygroups(op_opt_end_translate(Keyword))),
             # Keywords
             (r"(?i)\\("
@@ -176,11 +186,17 @@
             include("expr"),
             (r"\s+", Text),
         ],
-        "entity-name": [       # may be multiline
+        "entity-name": [      # may be multiline
             (r"[^\\}]+", Name.Entity),
             (r"\\\}", Name.Entity),
             (r"\\", Name.Entity),
-            (r"\}", Name.Entity, "#pop"),
+            (r"\}", LexBase.op_ignore, "#pop"),
+        ],
+        "entity-name-end": [  # may be multiline -- suppressed if no_end
+            (r"[^\\}]+", op_opt_ignore(Name.Entity)),
+            (r"\\\}", op_opt_ignore(Name.Entity)),
+            (r"\\", op_opt_ignore(Name.Entity)),
+            (r"\}", LexBase.op_ignore, "#pop"),
         ],
         "expr": [
             include("py-strings"),