changeset 78:abb2e8c65d0f

Implement "TEXTSTATEMENT"
author Franz Glasner <fzglas.hg@dom66.de>
date Thu, 30 Apr 2026 09:28:39 +0200
parents 1a5e192aa950
children c14e5fd4d193
files pygments_lexer_pseudocode2/algpseudocode.py tests/test_algpseudo.py
diffstat 2 files changed, 62 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/pygments_lexer_pseudocode2/algpseudocode.py	Thu Apr 30 09:24:46 2026 +0200
+++ b/pygments_lexer_pseudocode2/algpseudocode.py	Thu Apr 30 09:28:39 2026 +0200
@@ -86,6 +86,7 @@
         "BLOCK": SYMBOL_BLOCK,
         # Group TEXTSTATEMENT
         "TEXTSTATEMENT": SYMBOL_TEXTSTATEMENT,
+        "TEXTSTATE": SYMBOL_TEXTSTATEMENT,
         "TSTATEMENT": SYMBOL_TEXTSTATEMENT,
         "TSTATE": SYMBOL_TEXTSTATEMENT,
         "TEXTBLOCK": SYMBOL_TEXTSTATEMENT,
@@ -150,6 +151,14 @@
             (r"(?i)\\(block|state(?:ment)?)\s*(\{)",
              bygroups(op_symbol(Text), LexBase.op_fixed(Whitespace, " ")),
              "block-expr"),
+            (r"(?i)\\("
+             r"(?:textstate(?:ment)?)"
+             r"|(?:tstate(?:ment)?)"
+             r"|(?:textblock)"
+             r"|(?:tblock)"
+             r")\s*(\{)",
+             bygroups(op_symbol(Text), LexBase.op_fixed(Whitespace, " ")),
+             "text-statement"),
             (r"\\\n", Text),
             (r"(?i)\\("
              r"(?:prog(?:ram)?)"
@@ -226,6 +235,18 @@
             (r"\\", LexBase.op_fixed(Text, "\\")),
             (r"\s+", Text),
         ],
+        "text-statement": [  # like block but default to text-mode
+            (r"[^\\}\n]+", Text),
+            (r"\}", LexBase.op_ignore, "#pop"),
+            (r"\n", Whitespace),
+            (r"\\\}", LexBase.op_fixed(Text, "}")),
+            (r"(?i)\\expr(?:ession)?\s*\{",
+             LexBase.op_ignore,
+             "block-expr"),
+            include("remark"),
+            (r"\\\\", LexBase.op_fixed(Text, "\\")),
+            (r"\\", LexBase.op_fixed(Text, "\\")),
+        ],
         "expr-in-braces": [
             include("punctuation-in-braces"),
             include("py-strings"),
@@ -241,6 +262,10 @@
             (r"\}", LexBase.op_ignore, "#pop"),
             (r"\n", Whitespace),
             (r"\\\}", LexBase.op_fixed(Text, "}")),
+            (r"(?:i)\\(expr(?:ession)?)\s*(\{)",
+             bygroups(LexBase.op_ignore, LexBase.op_ignore),
+             "expr-in-braces"),
+            (r"\\\\", LexBase.op_fixed(Text, "\\")),
             (r"\\", LexBase.op_fixed(Text, "\\")),
         ],
         "math-builtins": [
--- a/tests/test_algpseudo.py	Thu Apr 30 09:24:46 2026 +0200
+++ b/tests/test_algpseudo.py	Thu Apr 30 09:28:39 2026 +0200
@@ -400,6 +400,43 @@
              ],
             pygments.lex(r"\state{a 1.2 {x in X\} c}", self.lexer))
 
+    def test_tstate_empty(self):
+        self.assertTokenStreamEqualComplete(
+            [("Text", "▪"),
+             ("Text.Whitespace", " "),
+             ("Text.Whitespace", "\n"),
+             ],
+            pygments.lex(r"\tstate{}", self.lexer))
+
+    def test_tstate_with_expr(self):
+        self.assertTokenStreamEqualComplete(
+            [("Text", "▪"),
+             ("Text.Whitespace", " "),
+             ("Text", "a 1.2 "),
+             ("Name.Entity", "x"),
+             ("Text", " "),
+             ("Operator.Word", "in"),
+             ("Text", " "),
+             ("Name.Entity", "X"),
+             ("Punctuation", "}"),
+             ("Text", " c"),
+             ("Text.Whitespace", "\n"),
+             ],
+            pygments.lex(r"\tstate{a 1.2 \expr{x in X\}} c}", self.lexer))
+
+    def test_tstate_with_escaped_expr(self):
+        self.assertTokenStreamEqualComplete(
+            [("Text", "▪"),
+             ("Text.Whitespace", " "),
+             ("Text", "a 1.2 "),
+             ("Text", "\\"),
+             ("Text", "expr{x in X"),
+             ("Text", "}"),
+             ("Text", " c"),
+             ("Text.Whitespace", "\n"),
+             ],
+            pygments.lex(r"\tstate{a 1.2 \\expr{x in X\} c}", self.lexer))
+
 
 class PygmentizeCompletely(unittest.TestCase):