comparison pygments_lexer_pseudocode2/algpseudocode.py @ 57:e8f4af9e20a8

Some "ENDxxx" commands
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 27 Apr 2026 16:56:57 +0200
parents 39151225fb84
children be065e5c8042
comparison
equal deleted inserted replaced
56:661461fb4dfc 57:e8f4af9e20a8
13 "AlgPseudocodeLexer_DE", "AlgPseudocodeLexer_FR"] 13 "AlgPseudocodeLexer_DE", "AlgPseudocodeLexer_FR"]
14 14
15 15
16 import re 16 import re
17 17
18 import pygments.util
18 from pygments.lexer import include, bygroups 19 from pygments.lexer import include, bygroups
19 from pygments.token import (Comment, Keyword, Name, Text, Whitespace) 20 from pygments.token import (Comment, Keyword, Name, Text, Whitespace)
20 21
21 # 22 #
22 # Relative imports do not work with pygments.lexers.load_lexer_from_file() 23 # Relative imports do not work with pygments.lexers.load_lexer_from_file()
51 "FUNC": "FUNCTION", 52 "FUNC": "FUNCTION",
52 "FUNCTION": "FUNCTION", 53 "FUNCTION": "FUNCTION",
53 "FN": "FUNCTION", 54 "FN": "FUNCTION",
54 "CLASS": "CLASS", 55 "CLASS": "CLASS",
55 } 56 }
57 END_TRANSLATIONS = {
58 "PROG": "END OF PROGRAM",
59 "PROGRAM": "END OF PROGRAM",
60 "ALGO": "END OF ALGORITHM",
61 "ALGORITHM": "END OF ALGORITHM",
62 "PROC": "END OF PROCEDURE",
63 "PROCEDURE": "END OF PROCEDURE",
64 "FUNC": "END OF FUNCTION",
65 "FUNCTION": "END OF FUNCTION",
66 "FN": "END OF FUNCTION",
67 "CLASS": "END OF CLASS",
68 }
69 DEFAULT_END_PREFIX = "END OF "
56 SYMBOLS = { 70 SYMBOLS = {
57 "REMARK": "▷", # U+25B7: Unicode 1.0 (Arrows) 71 "REMARK": "▷", # U+25B7: Unicode 1.0 (Arrows)
58 "Remark": "▷", 72 "Remark": "▷",
59 "remark": "▷", 73 "remark": "▷",
60 "REM": "▷", 74 "REM": "▷",
72 def _op_translate(lexer, match, ctx=None): 86 def _op_translate(lexer, match, ctx=None):
73 kw = match.group().upper() 87 kw = match.group().upper()
74 yield match.start(), toktype, lexer.TRANSLATIONS.get(kw, kw) 88 yield match.start(), toktype, lexer.TRANSLATIONS.get(kw, kw)
75 89
76 return _op_translate 90 return _op_translate
91
92 def op_opt_end_translate(toktype):
93
94 def _op_end_translate(lexer, match, ctx=None):
95 if not lexer.no_end:
96 kw = match.group().upper()
97 yield (match.start(),
98 toktype,
99 lexer.END_TRANSLATIONS.get(
100 kw,
101 lexer.DEFAULT_END_PREFIX + kw))
102
103 return _op_end_translate
77 104
78 def op_symbol(toktype): 105 def op_symbol(toktype):
79 106
80 def _op_symbol(lexer, match, ctx=None): 107 def _op_symbol(lexer, match, ctx=None):
81 kw = match.group() 108 kw = match.group()
100 r"|(?:func(?:tion)?|(?:fn))" 127 r"|(?:func(?:tion)?|(?:fn))"
101 r"|(?:class)" 128 r"|(?:class)"
102 r")(\s*)(\{)", 129 r")(\s*)(\{)",
103 bygroups(op_translate(Keyword), Whitespace, Name.Entity), 130 bygroups(op_translate(Keyword), Whitespace, Name.Entity),
104 "entity-name"), 131 "entity-name"),
132 # ENDxxx keywords with optional entity name
133 # with name
134 (r"(?i)\\end(?:_|-)?("
135 r"(?:prog(?:ram)?)"
136 r"|(?:algo(?:rithm)?)"
137 r"|(?:proc(?:edure)?)"
138 r"|(?:func(?:tion)?)"
139 r"|(?:class)"
140 r")(\s*)(\{)",
141 bygroups(op_opt_end_translate(Keyword), Whitespace, Name.Entity),
142 "entity-name"),
143 # without name
144 (r"(?i)\\end(?:_|-)?("
145 r"(?:prog(?:ram)?)"
146 r"|(?:algo(?:rithm)?)"
147 r"|(?:proc(?:edure)?)"
148 r"|(?:func(?:tion)?)"
149 r"|(?:class)"
150 r")((\s*)(\{))?",
151 bygroups(op_opt_end_translate(Keyword))),
105 include("expr"), 152 include("expr"),
106 (r"\s+", Text), 153 (r"\s+", Text),
107 ], 154 ],
108 "entity-name": [ # may be multiline 155 "entity-name": [ # may be multiline
109 (r"[^\\}]+", Name.Entity), 156 (r"[^\\}]+", Name.Entity),
116 include("py-numbers"), 163 include("py-numbers"),
117 include("py-name"), 164 include("py-name"),
118 ] 165 ]
119 } 166 }
120 167
168 def __init__(self, **options):
169 val = pygments.util.get_bool_opt(options, "no_end", default=False)
170 self.no_end = val
171 LexBase.__init__(self, **options)
172
121 173
122 class AlgPseudocodeLexer_DE(AlgPseudocodeLexer): 174 class AlgPseudocodeLexer_DE(AlgPseudocodeLexer):
123 175
124 name = "AlgPseudocodeDE" 176 name = "AlgPseudocodeDE"
125 aliases = ["algpseudocode-de", "algpseudo-de"] 177 aliases = ["algpseudocode-de", "algpseudo-de"]
137 "FUNC": "FUNKTION", 189 "FUNC": "FUNKTION",
138 "FUNCTION": "FUNKTION", 190 "FUNCTION": "FUNKTION",
139 "FN": "FUNKTION", 191 "FN": "FUNKTION",
140 "CLASS": "KLASSE", 192 "CLASS": "KLASSE",
141 }) 193 })
194 END_TRANSLATIONS = AlgPseudocodeLexer.END_TRANSLATIONS.copy()
195 END_TRANSLATIONS.update({
196 "PROG": "ENDE DES PROGRAMMS",
197 "PROGRAM": "ENDE VON PROGRAMMS",
198 "ALGO": "ENDE DES ALGORITHMUS",
199 "ALGORITHM": "ENDE DES ALGORITHMUS",
200 "PROC": "ENDE DER PROZEDUR",
201 "PROCEDURE": "ENDE DER PROZEDUR",
202 "FUNC": "ENDE DER FUNKTION",
203 "FUNCTION": "ENDE DER FUNKTION",
204 "FN": "ENDE DER FUNKTION",
205 "CLASS": "ENDE DER KLASSE",
206 })
207 DEFAULT_END_PREFIX = "ENDE VON "
142 208
143 209
144 class AlgPseudocodeLexer_FR(AlgPseudocodeLexer): 210 class AlgPseudocodeLexer_FR(AlgPseudocodeLexer):
145 211
146 name = "AlgPseudocodeFR" 212 name = "AlgPseudocodeFR"
159 "FUNC": "FONCTION", 225 "FUNC": "FONCTION",
160 "FUNCTION": "FOUNCTION", 226 "FUNCTION": "FOUNCTION",
161 "FN": "FONCTION", 227 "FN": "FONCTION",
162 "CLASS": "CLASSE", 228 "CLASS": "CLASSE",
163 }) 229 })
230 END_TRANSLATIONS = AlgPseudocodeLexer.END_TRANSLATIONS.copy()
231 END_TRANSLATIONS.update({
232 "PROG": "FIN DE PROGRAMME",
233 "PROGRAM": "FIN DE PROGRAMME",
234 "ALGO": "FIN D'ALGORITHME",
235 "ALGORITHM": "FIN D'ALGORITHME",
236 "PROC": "FIN DE PROCÉDURE",
237 "PROCEDURE": "FIN DE PROCÉDURE",
238 "FUNC": "FIN DE FONCTION",
239 "FUNCTION": "FIN DE FOUNCTION",
240 "FN": "FIN DE FONCTION",
241 "CLASS": "FIN DE CLASSE",
242 })
243 DEFAULT_END_PREFIX = "FIN DE "