plugin text syntaxes: various improvments:

- syntaxes and default_syntax are now class attribute instead of members of params_data
    - removed local exception UnknownSyntax in favor of exceptions.NotFound
    - syntaxes are now saved with a key which is name in lower case and stripped, unmodified name is put in syntax's data
    - new getSyntax (syntaxGet in bridge) method to get syntax key and raise an error if not found. Can be used by frontends to check that a syntax is known.
This commit is contained in:
Goffi 2017-07-13 20:53:51 +02:00
commit 85d58f902b

View file

@ -63,8 +63,6 @@ PLUGIN_INFO = {
C.PI_DESCRIPTION: _("""Management of various text syntaxes (XHTML-IM, Markdown, etc)""")
}
class UnknownSyntax(Exception):
pass
class TextSyntaxes(object):
""" Text conversion class
@ -77,6 +75,8 @@ class TextSyntaxes(object):
SYNTAX_XHTML = _SYNTAX_XHTML
SYNTAX_MARKDOWN = "markdown"
SYNTAX_TEXT = "text"
syntaxes = {}
default_syntax = SYNTAX_XHTML
params = """
<params>
@ -95,13 +95,12 @@ class TextSyntaxes(object):
'category_label': _(CATEGORY),
'name': NAME,
'label': _(NAME),
'syntaxes': {},
'syntaxes': syntaxes,
}
def __init__(self, host):
log.info(_("Text syntaxes plugin initialization"))
self.host = host
self.syntaxes = {}
self.addSyntax(self.SYNTAX_XHTML, lambda xhtml: defer.succeed(xhtml), lambda xhtml: defer.succeed(xhtml),
TextSyntaxes.OPT_NO_THREAD)
# TODO: text => XHTML should add <a/> to url like in frontends
@ -120,10 +119,12 @@ class TextSyntaxes(object):
log.info(u"You can download/install them from https://pythonhosted.org/Markdown/ and https://github.com/Alir3z4/html2text/")
host.bridge.addMethod("syntaxConvert", ".plugin", in_sign='sssbs', out_sign='s',
async=True, method=self.convert)
host.bridge.addMethod("syntaxGet", ".plugin", in_sign='s', out_sign='s',
method=self.getSyntax)
def _updateParamOptions(self):
data_synt = TextSyntaxes.params_data['syntaxes']
default_synt = TextSyntaxes.params_data.get('default', _SYNTAX_XHTML)
data_synt = TextSyntaxes.syntaxes
default_synt = TextSyntaxes.default_syntax
syntaxes = []
for syntax in data_synt.keys():
@ -216,13 +217,17 @@ class TextSyntaxes(object):
if syntax_from == _SYNTAX_CURRENT:
syntax_from = self.getCurrentSyntax(profile)
else:
syntax_from = syntax_from.lower().strip()
if syntax_to == _SYNTAX_CURRENT:
syntax_to = self.getCurrentSyntax(profile)
syntaxes = TextSyntaxes.params_data['syntaxes']
else:
syntax_to = syntax_to.lower().strip()
syntaxes = TextSyntaxes.syntaxes
if syntax_from not in syntaxes:
raise UnknownSyntax(syntax_from)
raise exceptions.NotFound(syntax_from)
if syntax_to not in syntaxes:
raise UnknownSyntax(syntax_to)
raise exceptions.NotFound(syntax_to)
d = None
if TextSyntaxes.OPT_NO_THREAD in syntaxes[syntax_from]["flags"]:
@ -259,18 +264,29 @@ class TextSyntaxes(object):
if TextSyntaxes.OPT_HIDDEN in flags and TextSyntaxes.OPT_DEFAULT in flags:
raise ValueError(u"{} and {} are mutually exclusive".format(TextSyntaxes.OPT_HIDDEN, TextSyntaxes.OPT_DEFAULT))
syntaxes = TextSyntaxes.params_data['syntaxes']
if name in syntaxes:
raise exceptions.ConflictError(u"This syntax name already exists: {}".format(name))
syntaxes[name] = {"to": to_xhtml_cb, "from": from_xhtml_cb, "flags": flags}
syntaxes = TextSyntaxes.syntaxes
key = name.lower().strip()
if key in syntaxes:
raise exceptions.ConflictError(u"This syntax key already exists: {}".format(key))
syntaxes[key] = {"name": name, "to": to_xhtml_cb, "from": from_xhtml_cb, "flags": flags}
if TextSyntaxes.OPT_DEFAULT in flags:
TextSyntaxes.params_data['default'] = name
TextSyntaxes.default_syntaxe = key
self._updateParamOptions()
def _removeMarkups(self, xhtml):
def getSyntax(self, name):
"""get syntax key corresponding to a name
@raise exceptions.NotFound: syntax doesn't exist
"""
Remove XHTML markups from the given string.
key = name.lower().strip()
if key in self.syntaxes:
return key
raise exceptions.NotFound
def _removeMarkups(self, xhtml):
"""Remove XHTML markups from the given string.
@param xhtml: the XHTML string to be cleaned
@return: the cleaned string
"""