diff pygments_lexer_pseudocode2/algpseudocode.py @ 57:e8f4af9e20a8

Some "ENDxxx" commands
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 27 Apr 2026 16:56:57 +0200
parents 39151225fb84
children be065e5c8042
line wrap: on
line diff
--- a/pygments_lexer_pseudocode2/algpseudocode.py	Mon Apr 27 12:37:27 2026 +0200
+++ b/pygments_lexer_pseudocode2/algpseudocode.py	Mon Apr 27 16:56:57 2026 +0200
@@ -15,6 +15,7 @@
 
 import re
 
+import pygments.util
 from pygments.lexer import include, bygroups
 from pygments.token import (Comment, Keyword, Name, Text, Whitespace)
 
@@ -53,6 +54,19 @@
         "FN": "FUNCTION",
         "CLASS": "CLASS",
     }
+    END_TRANSLATIONS = {
+        "PROG": "END OF PROGRAM",
+        "PROGRAM": "END OF PROGRAM",
+        "ALGO": "END OF ALGORITHM",
+        "ALGORITHM": "END OF ALGORITHM",
+        "PROC": "END OF PROCEDURE",
+        "PROCEDURE": "END OF PROCEDURE",
+        "FUNC": "END OF FUNCTION",
+        "FUNCTION": "END OF FUNCTION",
+        "FN": "END OF FUNCTION",
+        "CLASS": "END OF CLASS",
+    }
+    DEFAULT_END_PREFIX = "END OF "
     SYMBOLS = {
         "REMARK": "▷",  # U+25B7: Unicode 1.0 (Arrows)
         "Remark": "▷",
@@ -75,6 +89,19 @@
 
         return _op_translate
 
+    def op_opt_end_translate(toktype):
+
+        def _op_end_translate(lexer, match, ctx=None):
+            if not lexer.no_end:
+                kw = match.group().upper()
+                yield (match.start(),
+                       toktype,
+                       lexer.END_TRANSLATIONS.get(
+                           kw,
+                           lexer.DEFAULT_END_PREFIX + kw))
+
+        return _op_end_translate
+
     def op_symbol(toktype):
 
         def _op_symbol(lexer, match, ctx=None):
@@ -102,6 +129,26 @@
              r")(\s*)(\{)",
              bygroups(op_translate(Keyword), Whitespace, Name.Entity),
              "entity-name"),
+            # ENDxxx keywords with optional entity name
+            #   with name
+            (r"(?i)\\end(?:_|-)?("
+             r"(?:prog(?:ram)?)"
+             r"|(?:algo(?:rithm)?)"
+             r"|(?:proc(?:edure)?)"
+             r"|(?:func(?:tion)?)"
+             r"|(?:class)"
+             r")(\s*)(\{)",
+             bygroups(op_opt_end_translate(Keyword), Whitespace, Name.Entity),
+             "entity-name"),
+            #   without name
+            (r"(?i)\\end(?:_|-)?("
+             r"(?:prog(?:ram)?)"
+             r"|(?:algo(?:rithm)?)"
+             r"|(?:proc(?:edure)?)"
+             r"|(?:func(?:tion)?)"
+             r"|(?:class)"
+             r")((\s*)(\{))?",
+             bygroups(op_opt_end_translate(Keyword))),
             include("expr"),
             (r"\s+", Text),
         ],
@@ -118,6 +165,11 @@
         ]
     }
 
+    def __init__(self, **options):
+        val = pygments.util.get_bool_opt(options, "no_end", default=False)
+        self.no_end = val
+        LexBase.__init__(self, **options)
+
 
 class AlgPseudocodeLexer_DE(AlgPseudocodeLexer):
 
@@ -139,6 +191,20 @@
         "FN": "FUNKTION",
         "CLASS": "KLASSE",
     })
+    END_TRANSLATIONS = AlgPseudocodeLexer.END_TRANSLATIONS.copy()
+    END_TRANSLATIONS.update({
+        "PROG": "ENDE DES PROGRAMMS",
+        "PROGRAM": "ENDE VON PROGRAMMS",
+        "ALGO": "ENDE DES ALGORITHMUS",
+        "ALGORITHM": "ENDE DES ALGORITHMUS",
+        "PROC": "ENDE DER PROZEDUR",
+        "PROCEDURE": "ENDE DER PROZEDUR",
+        "FUNC": "ENDE DER FUNKTION",
+        "FUNCTION": "ENDE DER FUNKTION",
+        "FN": "ENDE DER FUNKTION",
+        "CLASS": "ENDE DER KLASSE",
+    })
+    DEFAULT_END_PREFIX = "ENDE VON "
 
 
 class AlgPseudocodeLexer_FR(AlgPseudocodeLexer):
@@ -161,3 +227,17 @@
         "FN": "FONCTION",
         "CLASS": "CLASSE",
     })
+    END_TRANSLATIONS = AlgPseudocodeLexer.END_TRANSLATIONS.copy()
+    END_TRANSLATIONS.update({
+        "PROG": "FIN DE PROGRAMME",
+        "PROGRAM": "FIN DE PROGRAMME",
+        "ALGO": "FIN D'ALGORITHME",
+        "ALGORITHM": "FIN D'ALGORITHME",
+        "PROC": "FIN DE PROCÉDURE",
+        "PROCEDURE": "FIN DE PROCÉDURE",
+        "FUNC": "FIN DE FONCTION",
+        "FUNCTION": "FIN DE FOUNCTION",
+        "FN": "FIN DE FONCTION",
+        "CLASS": "FIN DE CLASSE",
+    })
+    DEFAULT_END_PREFIX = "FIN DE "