changeset 281:ee512932d603

Make "\T" and "\E" aliases for "\TEXT" and "\EXPRESSION"
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 20 May 2026 17:23:41 +0200
parents 1b0e58f60f73
children 90946f87d77d
files docs/lexer-algpseudocode.rst pygments_lexer_pseudocode2/lexers/algpseudocode.py tests/test_algpseudo.py
diffstat 3 files changed, 32 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/docs/lexer-algpseudocode.rst	Wed May 20 12:54:06 2026 +0200
+++ b/docs/lexer-algpseudocode.rst	Wed May 20 17:23:41 2026 +0200
@@ -61,7 +61,7 @@
     triple-double-quote, `Python`_ style)
   - Numbers (also `Python`_ style)
   - (Mathematical) operators and symbols
-  - ``\TEXT{...}``
+  - ``\TEXT{...}`` or ``\T{...}``
 
     Used to switch to a text-mode that prohibits automatic expression
     highlighting.
@@ -69,7 +69,7 @@
     A closing curly brace can be quoted with ``\}`` to not end the
     text mode prematurely.
 
-  - ``\EXPR`` or ``\EXPRESSION`` as nested construct
+  - ``\EXPR``, ``\EXPRESSION`` or ``\E`` as nested construct
 
   - ``\NAME``, ``\CALL`` and ``\GETS``
 
@@ -85,14 +85,14 @@
 
   In `text` context it recognizes:
 
-  - ``\EXPR`` or ``\EXPRESSION``
+  - ``\EXPRESSION``, ``\EXPR`` or ``\E``
 
     Use to switch to expression-mode.
 
     A closing curly brace can be quoted with ``\}`` to not end the expression
     mode prematurely.
 
-  - ``\TEXT`` as nested construct
+  - ``\TEXT`` (aka ``\T``) as nested construct
 
   - ``\REM`` and ``\REMARK`` for remarks (aka comments)
 
--- a/pygments_lexer_pseudocode2/lexers/algpseudocode.py	Wed May 20 12:54:06 2026 +0200
+++ b/pygments_lexer_pseudocode2/lexers/algpseudocode.py	Wed May 20 17:23:41 2026 +0200
@@ -364,11 +364,11 @@
             include("py-numbers"),
             (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]*\{",
+            (r"(?i)\\e(?:xpr(?:ession)?)?[ \t]*\{",
              LexBase.op_ignore,
              "block-expr"),
             include("explicit-tokentype"),
+            (r"(?i)\\t(?:ext)?[ \t]*\{", LexBase.op_ignore, "text-statement"),
             include("remark"),
             include("keyword-constants"),
             include("word-operators"),
@@ -384,11 +384,11 @@
             include("py-numbers"),
             (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]*\{",
+            (r"(?i)\\e(?:xpr(?:ession)?)?[ \t]*\{",
              LexBase.op_ignore,
              "block-expr"),
             include("explicit-tokentype"),
+            (r"(?i)\\t(?:ext)?[ \t]*\{", LexBase.op_ignore, "text-statement"),
             include("remark"),
             include("keyword-constants"),
             include("word-operators"),
@@ -411,11 +411,11 @@
             (r"\}", LexBase.op_ignore, "#pop"),
             (r"\n", Whitespace),
             (r"\\\}", LexBase.op_fixed(Text, "}")),
-            (r"(?i)\\expr(?:ession)?[ \t]*\{",
+            (r"(?i)\\e(?:xpr(?:ession)?)?[ \t]*\{",
              LexBase.op_ignore,
              "block-expr"),
-            (r"(?i)\\text[ \t]*\{", LexBase.op_ignore, "#push"),
             include("explicit-tokentype"),
+            (r"(?i)\\t(?:ext)?[ \t]*\{", LexBase.op_ignore, "#push"),
             include("remark"),
             (r"\\\\", LexBase.op_fixed(Text, "\\")),
             (r"\\", LexBase.op_fixed(Text, "\\")),  # in text-mode: leave Text
--- a/tests/test_algpseudo.py	Wed May 20 12:54:06 2026 +0200
+++ b/tests/test_algpseudo.py	Wed May 20 17:23:41 2026 +0200
@@ -365,6 +365,17 @@
                 """\\TEXT{the text  \\rem the remark\nthe next text line}""",
                 self.lexer))
 
+    def test_text_short_alias(self):
+        self.assertTokenStreamEqualComplete(
+            [("Text", "the text "),
+             ("Text", "nested"),
+             ("Text", " trailer"),
+             ("Text.Whitespace", "\n"),
+             ],
+            pygments.lex(
+                """\\T{the text \\t{nested} trailer}""",
+                self.lexer))
+
     def test_comment_single_1(self):
         self.assertTokenStreamEqualComplete(
             [("Comment.Single", "// foo bar"),
@@ -535,6 +546,17 @@
              ],
             pygments.lex(r"\tstate{a 1.2 \\expr{x in X\} c}", self.lexer))
 
+    def test_expr_short_alias(self):
+        self.assertTokenStreamEqualComplete(
+            [("Name.Entity", "foo"),
+             ("Text", " "),
+             ("Name.Entity", "bar"),
+             ("Text", " "),
+             ("Text", "bar +"),
+             ("Text.Whitespace", "\n"),
+             ],
+            pygments.lex(r"foo \e{bar} \t{bar +}", self.lexer))
+
     def test_text_in_expr(self):
         self.assertTokenStreamEqualComplete(
             [("Name.Entity", "first"),