# HG changeset patch # User Franz Glasner # Date 1777459408 -7200 # Node ID 711f8d19e27a73cde4a7f3efa0f1c217eb08b85c # Parent c1357674622d65ea8fe1963e74530db7b2bca50f New implementation of "STATEMENT" (also aliased to "STATE" and "BLOCK"). Now this needs curly braces. diff -r c1357674622d -r 711f8d19e27a pygments_lexer_pseudocode2/algpseudocode.py --- a/pygments_lexer_pseudocode2/algpseudocode.py Tue Apr 28 20:27:46 2026 +0200 +++ b/pygments_lexer_pseudocode2/algpseudocode.py Wed Apr 29 12:43:28 2026 +0200 @@ -16,8 +16,9 @@ import re import pygments.util -from pygments.lexer import include, bygroups -from pygments.token import (Comment, Keyword, Name, Text, Whitespace) +from pygments.lexer import bygroups, include, words +from pygments.token import (Comment, Keyword, Name, Operator, Punctuation, + Text, Whitespace) # # Relative imports do not work with pygments.lexers.load_lexer_from_file() @@ -73,15 +74,22 @@ SYMBOL_BLOCK = "◆" # U+25C6: Unicode 1.0 (Geometric Shapes) # SYMBOL_BLOCK = "┃" # U+2503: Unicode 1.0 (Bow Drawing) # SYMBOL_BLOCK = "●" # U+25CF: Unicode 1.0 (Geometric Shapes) - SYMBOL_TEXTSTATEMENT = "■" # U+25A0: Unicode 1.0 (Geometric Shapes) + SYMBOL_TEXTSTATEMENT = "▪" # U+25AA: Unicode 1.0 (Geometric Shapes) + # SYMBOL_TEXTSTATEMENT = "■" # U+25A0: Unicode 1.0 (Geometric Shapes) SYMBOLS = { + # Group REMARK "REMARK": SYMBOL_REMARK, "REM": SYMBOL_REMARK, + # Group STATEMENT + "STATEMENT": SYMBOL_BLOCK, + "STATE": SYMBOL_BLOCK, "BLOCK": SYMBOL_BLOCK, + # Group TEXTSTATEMENT "TEXTSTATEMENT": SYMBOL_TEXTSTATEMENT, "TSTATEMENT": SYMBOL_TEXTSTATEMENT, "TSTATE": SYMBOL_TEXTSTATEMENT, - "TEXT": SYMBOL_TEXTSTATEMENT, + "TEXTBLOCK": SYMBOL_TEXTSTATEMENT, + "TBLOCK": SYMBOL_TEXTSTATEMENT, } def op_translate(toktype): @@ -138,10 +146,10 @@ (r"\n", Whitespace), (r"/\*", Comment.Multiline, "multiline-nested-comment"), (r"//.*$", Comment.Single), - (r"(?i)\\(remark|rem)\b(.*)$", - bygroups(op_symbol(Comment.Single), Comment.Single)), - (r"(?i)\\(block)\b(.*)$", - bygroups(op_symbol(Text), Text)), + include("remark"), + (r"(?i)\\(block|state(?:ment)?)\s*(\{)", + bygroups(op_symbol(Text), LexBase.op_fixed(Whitespace, " ")), + "block-expr"), (r"\\\n", Text), (r"(?i)\\(" r"(?:prog(?:ram)?)" @@ -182,6 +190,10 @@ include("expr"), (r"\s+", Text), ], + "remark": [ + (r"(?i)\\(remark|rem)\b(.*)$", + bygroups(op_symbol(Comment.Single), Comment.Single)), + ], "entity-name": [ # may be multiline (r"[^\\}]+", Name.Entity), (r"\\\}", LexBase.op_fixed(Name.Entity, "}")), @@ -195,17 +207,58 @@ (r"\}", LexBase.op_ignore, "#pop"), ], "expr": [ + include("punctuation"), include("py-strings"), include("py-numbers"), - (r"(?i)\\text\s*\{", LexBase.op_ignore, "expr-text"), + (r"(?i)\\text\s*\{", LexBase.op_ignore, "text-in-expr"), + include("remark"), + include("text-operators"), + include("math-builtins"), include("py-name"), ], - "expr-text": [ + "block-expr": [ # somewhat similar to "root" + (r"\}", LexBase.op_ignore, "#pop"), + (r"\n", Whitespace), + include("expr-in-braces"), + (r"\s+", Text), + ], + "expr-in-braces": [ + include("punctuation-in-braces"), + include("py-strings"), + include("py-numbers"), + (r"(?i)\\text\s*\{", LexBase.op_ignore, "text-in-expr"), + include("remark"), + include("text-operators"), + include("math-builtins"), + include("py-name"), + ], + "text-in-expr": [ (r"[^\\}]+", Text), (r"\\\}", LexBase.op_fixed(Text, "}")), (r"\\", LexBase.op_fixed(Text, "\\")), (r"\}", LexBase.op_ignore, "#pop"), ], + "math-builtins": [ + (words(("sqrt", "pow", "cos", "sin", "tan", "arcos", "arcsin", + "arctan", "arctan2", "mod", "exp", "ln", "log"), + prefix=r"(?