comparison pygments_lexer_pseudocode2/algpseudocode.py @ 62:7153e945a3d6

Implement ignoring of \ENDxxx including its optional name parts
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 28 Apr 2026 10:09:17 +0200
parents 392745b66969
children 05c53e431c88
comparison
equal deleted inserted replaced
61:392745b66969 62:7153e945a3d6
119 kw, 119 kw,
120 lexer.DEFAULT_END_PREFIX + kw)) 120 lexer.DEFAULT_END_PREFIX + kw))
121 121
122 return _op_end_translate 122 return _op_end_translate
123 123
124 def op_opt_ignore(toktype):
125
126 def _op_opt_ignore(lexer, match, ctx=None):
127 if not lexer.no_end:
128 yield match.start(), toktype, match.group()
129
130 return _op_opt_ignore
131
124 def op_symbol(toktype): 132 def op_symbol(toktype):
125 133
126 def _op_symbol(lexer, match, ctx=None): 134 def _op_symbol(lexer, match, ctx=None):
127 kw = match.group() 135 kw = match.group()
128 yield match.start(), toktype, lexer.SYMBOLS.get(kw, kw) 136 yield match.start(), toktype, lexer.SYMBOLS.get(kw, kw)
144 r"|(?:algo(?:rithm)?)" 152 r"|(?:algo(?:rithm)?)"
145 r"|(?:proc(?:edure)?)" 153 r"|(?:proc(?:edure)?)"
146 r"|(?:func(?:tion)?|(?:fn))" 154 r"|(?:func(?:tion)?|(?:fn))"
147 r"|(?:class)" 155 r"|(?:class)"
148 r")(\s*)(\{)", 156 r")(\s*)(\{)",
149 bygroups(op_translate(Keyword), Whitespace, Name.Entity), 157 bygroups(op_translate(Keyword), Whitespace, LexBase.op_ignore),
150 "entity-name"), 158 "entity-name"),
151 # ENDxxx keywords with optional entity name 159 # ENDxxx keywords with optional entity name
152 # with name 160 # with name
153 (r"(?i)\\end(?:_|-)?(" 161 (r"(?i)\\end(?:_|-)?("
154 r"(?:prog(?:ram)?)" 162 r"(?:prog(?:ram)?)"
155 r"|(?:algo(?:rithm)?)" 163 r"|(?:algo(?:rithm)?)"
156 r"|(?:proc(?:edure)?)" 164 r"|(?:proc(?:edure)?)"
157 r"|(?:func(?:tion)?)" 165 r"|(?:func(?:tion)?)"
158 r"|(?:class)" 166 r"|(?:class)"
159 r")(\s*)(\{)", 167 r")(\s*)(\{)",
160 bygroups(op_opt_end_translate(Keyword), Whitespace, Name.Entity), 168 bygroups(op_opt_end_translate(Keyword),
161 "entity-name"), 169 op_opt_ignore(Whitespace),
170 LexBase.op_ignore),
171 "entity-name-end"),
162 # without name 172 # without name
163 (r"(?i)\\end(?:_|-)?(" 173 (r"(?i)\\end(?:_|-)?("
164 r"(?:prog(?:ram)?)" 174 r"(?:prog(?:ram)?)"
165 r"|(?:algo(?:rithm)?)" 175 r"|(?:algo(?:rithm)?)"
166 r"|(?:proc(?:edure)?)" 176 r"|(?:proc(?:edure)?)"
167 r"|(?:func(?:tion)?)" 177 r"|(?:func(?:tion)?)"
168 r"|(?:class)" 178 r"|(?:class)"
169 r")((\s*)(\{))?", 179 r")\b",
170 bygroups(op_opt_end_translate(Keyword))), 180 bygroups(op_opt_end_translate(Keyword))),
171 # Keywords 181 # Keywords
172 (r"(?i)\\(" 182 (r"(?i)\\("
173 r"(?:is)" 183 r"(?:is)"
174 r")\b", 184 r")\b",
175 bygroups(op_translate(Keyword))), 185 bygroups(op_translate(Keyword))),
176 include("expr"), 186 include("expr"),
177 (r"\s+", Text), 187 (r"\s+", Text),
178 ], 188 ],
179 "entity-name": [ # may be multiline 189 "entity-name": [ # may be multiline
180 (r"[^\\}]+", Name.Entity), 190 (r"[^\\}]+", Name.Entity),
181 (r"\\\}", Name.Entity), 191 (r"\\\}", Name.Entity),
182 (r"\\", Name.Entity), 192 (r"\\", Name.Entity),
183 (r"\}", Name.Entity, "#pop"), 193 (r"\}", LexBase.op_ignore, "#pop"),
194 ],
195 "entity-name-end": [ # may be multiline -- suppressed if no_end
196 (r"[^\\}]+", op_opt_ignore(Name.Entity)),
197 (r"\\\}", op_opt_ignore(Name.Entity)),
198 (r"\\", op_opt_ignore(Name.Entity)),
199 (r"\}", LexBase.op_ignore, "#pop"),
184 ], 200 ],
185 "expr": [ 201 "expr": [
186 include("py-strings"), 202 include("py-strings"),
187 include("py-numbers"), 203 include("py-numbers"),
188 include("py-name"), 204 include("py-name"),