# HG changeset patch # User Franz Glasner # Date 1778736638 -7200 # Node ID 18553f595b34b16e41673101b5ea074fc8aa8a36 # Parent 33a722c8ae1795bd2a5e1dc7c5ec51f2e3f3e307 Allow nested \TEXT and \EXPR commands. \TEXT within \TEXT and \EXPR within \EXPR is allowed! diff -r 33a722c8ae17 -r 18553f595b34 docs/lexer-algpseudocode.rst --- a/docs/lexer-algpseudocode.rst Wed May 13 21:22:33 2026 +0200 +++ b/docs/lexer-algpseudocode.rst Thu May 14 07:30:38 2026 +0200 @@ -59,6 +59,8 @@ A closing curly brace can be quoted with ``\}`` to not end the text mode prematurely. + - ``\EXPR`` or ``\EXPRESSION`` as nested construct + - ``\NAME``, ``\CALL`` and ``\GETS`` - ``\REM`` and ``\REMARK`` for remarks (aka comments) @@ -80,6 +82,8 @@ A closing curly brace can be quoted with ``\}`` to not end the expression mode prematurely. + - ``\TEXT`` as nested construct + - ``\REM`` and ``\REMARK`` for remarks (aka comments) - :ref:`explicit-token-types` @@ -113,7 +117,7 @@ **Type:** :py:class:`str` or :py:obj:`None` - **Default:** :py:obj:`None` (yields ``←``) + **Default:** :py:obj:`None` (yields ``⟵``) The operator symbol to be printed by the command ``\GETS``. diff -r 33a722c8ae17 -r 18553f595b34 pygments_lexer_pseudocode2/lexers/algpseudocode.py --- a/pygments_lexer_pseudocode2/lexers/algpseudocode.py Wed May 13 21:22:33 2026 +0200 +++ b/pygments_lexer_pseudocode2/lexers/algpseudocode.py Thu May 14 07:30:38 2026 +0200 @@ -365,6 +365,9 @@ (r"(?i)\\(call|name)[ \t]*(\{)", LexBase.op_ignore, "entity-name"), (r"(?i)\\gets\b", op_gets), (r"(?i)\\text[ \t]*\{", LexBase.op_ignore, "text-statement"), + (r"(?i)\\expr(?:ession)?[ \t]*\{", + LexBase.op_ignore, + "block-expr"), include("explicit-tokentype"), include("remark"), include("keyword-constants"), @@ -382,6 +385,9 @@ (r"(?i)\\(call|name)[ \t]*(\{)", LexBase.op_ignore, "entity-name"), (r"(?i)\\gets\b", op_gets), (r"(?i)\\text[ \t]*\{", LexBase.op_ignore, "text-statement"), + (r"(?i)\\expr(?:ession)?[ \t]*\{", + LexBase.op_ignore, + "block-expr"), include("explicit-tokentype"), include("remark"), include("keyword-constants"), @@ -408,6 +414,7 @@ (r"(?i)\\expr(?:ession)?[ \t]*\{", LexBase.op_ignore, "block-expr"), + (r"(?i)\\text[ \t]*\{", LexBase.op_ignore, "#push"), include("explicit-tokentype"), include("remark"), (r"\\\\", LexBase.op_fixed(Text, "\\")), diff -r 33a722c8ae17 -r 18553f595b34 tests/test_algpseudo.py --- a/tests/test_algpseudo.py Wed May 13 21:22:33 2026 +0200 +++ b/tests/test_algpseudo.py Thu May 14 07:30:38 2026 +0200 @@ -1032,6 +1032,58 @@ ], pygments.lex(r"....", self.lexer)) + def test_nested_expr(self): + self.assertTokenStreamEqualComplete( + [("Name.Entity", "foo"), + ("Text", " "), + ("Operator", "+"), + ("Text", " "), + ("Name.Entity", "bar"), + ("Text", " "), + ("Operator", "*"), + ("Text", " "), + ("Number.Integer", '7'), + ("Text.Whitespace", "\n"), + ], + pygments.lex(r"\EXPR{\EXPR{foo + bar} * 7}", self.lexer)) + + def test_nested_expr_in_block(self): + self.assertTokenStreamEqualComplete( + [("Text", u"◆"), + ("Text.Whitespace", " "), + ("Name.Entity", "foo"), + ("Text", " "), + ("Operator", "+"), + ("Text", " "), + ("Name.Entity", "bar"), + ("Text", " "), + ("Operator", "*"), + ("Text", " "), + ("Number.Integer", '7'), + ("Text.Whitespace", "\n"), + ], + pygments.lex(u"\\BLOCK{\\EXPR{\\EXPR{foo + bar} * 7}}", + self.lexer)) + + def test_nested_text(self): + self.assertTokenStreamEqualComplete( + [("Text", "foo + bar"), + ("Text", " * 7"), + ("Text.Whitespace", "\n"), + ], + pygments.lex(r"\TEXT{\TEXT{foo + bar} * 7}", self.lexer)) + + def test_nested_text_in_tblock(self): + self.assertTokenStreamEqualComplete( + [("Text", u"▪"), + ("Text.Whitespace", " "), + ("Text", "bar + Foo"), + ("Text", " * 7"), + ("Text.Whitespace", "\n"), + ], + pygments.lex(u"\\TBLOCK{\\TEXT{\\TEXT{bar + Foo} * 7}}", + self.lexer)) + class PygmentizeCompletely(unittest.TestCase): diff -r 33a722c8ae17 -r 18553f595b34 tests/test_filter.py --- a/tests/test_filter.py Wed May 13 21:22:33 2026 +0200 +++ b/tests/test_filter.py Thu May 14 07:30:38 2026 +0200 @@ -36,7 +36,7 @@ self.assertTokenStreamEqual( [("Error", "\\"), ], - pygments.lex(r"\EXPR{", lexer)) + pygments.lex(r"\nonexisting{", lexer)) def test_error_to_genericerror_filter(self): # @@ -54,7 +54,7 @@ self.assertTokenStreamEqual( [("Generic.Error", "\\"), ], - pygments.lex(r"\EXPR{", lexer)) + pygments.lex(r"\nonexisting{", lexer)) if __name__ == "__main__":