comparison sat/plugins/plugin_misc_text_syntaxes.py @ 3620:f568f304c982

plugin text syntaxes: remove side effect on init: When text syntaxes was initialised, `syntaxes` dict was filled, but it was a class attribute. As a result, re-initialising it (which may happen for tests, and maybe in the future dynamically), was not starting with an empty dict, but with an already-filled one, resulting in conflicts. This patch fixes it by moving `syntaxes` to an instance attribute.
author Goffi <goffi@goffi.org>
date Mon, 02 Aug 2021 21:52:17 +0200
parents be6d91572633
children 09f5ac48ffe3
comparison
equal deleted inserted replaced
3619:32181a45d54b 3620:f568f304c982
154 OPT_HIDDEN = "HIDDEN" 154 OPT_HIDDEN = "HIDDEN"
155 OPT_NO_THREAD = "NO_THREAD" 155 OPT_NO_THREAD = "NO_THREAD"
156 SYNTAX_XHTML = _SYNTAX_XHTML 156 SYNTAX_XHTML = _SYNTAX_XHTML
157 SYNTAX_MARKDOWN = "markdown" 157 SYNTAX_MARKDOWN = "markdown"
158 SYNTAX_TEXT = "text" 158 SYNTAX_TEXT = "text"
159 syntaxes = {}
160 # default_syntax must be lower case 159 # default_syntax must be lower case
161 default_syntax = SYNTAX_XHTML 160 default_syntax = SYNTAX_XHTML
162 161
163 params = """
164 <params>
165 <individual>
166 <category name="%(category_name)s" label="%(category_label)s">
167 <param name="%(name)s" label="%(label)s" type="list" security="0">
168 %(options)s
169 </param>
170 </category>
171 </individual>
172 </params>
173 """
174
175 params_data = {
176 "category_name": CATEGORY,
177 "category_label": _(CATEGORY),
178 "name": NAME,
179 "label": _(NAME),
180 "syntaxes": syntaxes,
181 }
182 162
183 def __init__(self, host): 163 def __init__(self, host):
184 log.info(_("Text syntaxes plugin initialization")) 164 log.info(_("Text syntaxes plugin initialization"))
185 self.host = host 165 self.host = host
166 self.syntaxes = {}
167
168 self.params = """
169 <params>
170 <individual>
171 <category name="%(category_name)s" label="%(category_label)s">
172 <param name="%(name)s" label="%(label)s" type="list" security="0">
173 %(options)s
174 </param>
175 </category>
176 </individual>
177 </params>
178 """
179
180 self.params_data = {
181 "category_name": CATEGORY,
182 "category_label": _(CATEGORY),
183 "name": NAME,
184 "label": _(NAME),
185 "syntaxes": self.syntaxes,
186 }
187
186 self.addSyntax( 188 self.addSyntax(
187 self.SYNTAX_XHTML, 189 self.SYNTAX_XHTML,
188 lambda xhtml: defer.succeed(xhtml), 190 lambda xhtml: defer.succeed(xhtml),
189 lambda xhtml: defer.succeed(xhtml), 191 lambda xhtml: defer.succeed(xhtml),
190 TextSyntaxes.OPT_NO_THREAD, 192 TextSyntaxes.OPT_NO_THREAD,
251 if xml_tools.cleanXHTML is None: 253 if xml_tools.cleanXHTML is None:
252 log.debug("Installing cleaning method") 254 log.debug("Installing cleaning method")
253 xml_tools.cleanXHTML = self.cleanXHTML 255 xml_tools.cleanXHTML = self.cleanXHTML
254 256
255 def _updateParamOptions(self): 257 def _updateParamOptions(self):
256 data_synt = TextSyntaxes.syntaxes 258 data_synt = self.syntaxes
257 default_synt = TextSyntaxes.default_syntax 259 default_synt = TextSyntaxes.default_syntax
258 syntaxes = [] 260 syntaxes = []
259 261
260 for syntax in list(data_synt.keys()): 262 for syntax in list(data_synt.keys()):
261 flags = data_synt[syntax]["flags"] 263 flags = data_synt[syntax]["flags"]
267 269
268 for syntax in syntaxes: 270 for syntax in syntaxes:
269 selected = 'selected="true"' if syntax == default_synt else "" 271 selected = 'selected="true"' if syntax == default_synt else ""
270 options.append('<option value="%s" %s/>' % (syntax, selected)) 272 options.append('<option value="%s" %s/>' % (syntax, selected))
271 273
272 TextSyntaxes.params_data["options"] = "\n".join(options) 274 self.params_data["options"] = "\n".join(options)
273 self.host.memory.updateParams(TextSyntaxes.params % TextSyntaxes.params_data) 275 self.host.memory.updateParams(self.params % self.params_data)
274 276
275 def getCurrentSyntax(self, profile): 277 def getCurrentSyntax(self, profile):
276 """ Return the selected syntax for the given profile 278 """ Return the selected syntax for the given profile
277 279
278 @param profile: %(doc_profile)s 280 @param profile: %(doc_profile)s
370 syntax_from = syntax_from.lower().strip() 372 syntax_from = syntax_from.lower().strip()
371 if syntax_to == _SYNTAX_CURRENT: 373 if syntax_to == _SYNTAX_CURRENT:
372 syntax_to = self.getCurrentSyntax(profile) 374 syntax_to = self.getCurrentSyntax(profile)
373 else: 375 else:
374 syntax_to = syntax_to.lower().strip() 376 syntax_to = syntax_to.lower().strip()
375 syntaxes = TextSyntaxes.syntaxes 377 syntaxes = self.syntaxes
376 if syntax_from not in syntaxes: 378 if syntax_from not in syntaxes:
377 raise exceptions.NotFound(syntax_from) 379 raise exceptions.NotFound(syntax_from)
378 if syntax_to not in syntaxes: 380 if syntax_to not in syntaxes:
379 raise exceptions.NotFound(syntax_to) 381 raise exceptions.NotFound(syntax_to)
380 d = None 382 d = None
415 "{} and {} are mutually exclusive".format( 417 "{} and {} are mutually exclusive".format(
416 TextSyntaxes.OPT_HIDDEN, TextSyntaxes.OPT_DEFAULT 418 TextSyntaxes.OPT_HIDDEN, TextSyntaxes.OPT_DEFAULT
417 ) 419 )
418 ) 420 )
419 421
420 syntaxes = TextSyntaxes.syntaxes 422 syntaxes = self.syntaxes
421 key = name.lower().strip() 423 key = name.lower().strip()
422 if key in syntaxes: 424 if key in syntaxes:
423 raise exceptions.ConflictError( 425 raise exceptions.ConflictError(
424 "This syntax key already exists: {}".format(key) 426 "This syntax key already exists: {}".format(key)
425 ) 427 )