Mercurial > libervia-backend
view libervia/backend/bridge/bridge_constructor/constructors/mediawiki/constructor.py @ 4288:f46891f2c9cb
plugin XEP-0166: handle `content-add` action + expose `get_transport`:
- `content-add` is now handled at this plugin level (implementation needs to be done in
apps and transports plugins).
- `get_transport` is now exposed.
rel 447
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 29 Jul 2024 03:30:58 +0200 |
parents | 4cf98f506269 |
children |
line wrap: on
line source
#!/usr/bin/env python3 # Libervia: an XMPP client # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. from libervia.backend.bridge.bridge_constructor import base_constructor import sys from datetime import datetime import re class MediawikiConstructor(base_constructor.Constructor): def __init__(self, bridge_template, options): base_constructor.Constructor.__init__(self, bridge_template, options) self.core_template = "mediawiki_template.tpl" self.core_dest = "mediawiki.wiki" def _add_text_decorations(self, text): """Add text decorations like coloration or shortcuts""" def anchor_link(match): link = match.group(1) # we add anchor_link for [method_name] syntax: if link in self.bridge_template.sections(): return "[[#%s|%s]]" % (link, link) print("WARNING: found an anchor link to an unknown method") return link return re.sub(r"\[(\w+)\]", anchor_link, text) def _wiki_parameter(self, name, sig_in): """Format parameters with the wiki syntax @param name: name of the function @param sig_in: signature in @return: string of the formated parameters""" arg_doc = self.get_arguments_doc(name) arg_default = self.get_default(name) args_str = self.get_arguments(sig_in) args = args_str.split(", ") if args_str else [] # ugly but it works :) wiki = [] for i in range(len(args)): if i in arg_doc: name, doc = arg_doc[i] doc = "\n:".join(doc.rstrip("\n").split("\n")) wiki.append("; %s: %s" % (name, self._add_text_decorations(doc))) else: wiki.append("; arg_%d: " % i) if i in arg_default: wiki.append(":''DEFAULT: %s''" % arg_default[i]) return "\n".join(wiki) def _wiki_return(self, name): """Format return doc with the wiki syntax @param name: name of the function """ arg_doc = self.get_arguments_doc(name) wiki = [] if "return" in arg_doc: wiki.append("\n|-\n! scope=row | return value\n|") wiki.append( "<br />\n".join( self._add_text_decorations(arg_doc["return"]).rstrip("\n").split("\n") ) ) return "\n".join(wiki) def generate_core_side(self): signals_part = [] methods_part = [] sections = self.bridge_template.sections() sections.sort() for section in sections: function = self.getValues(section) print(("Adding %s %s" % (section, function["type"]))) async_msg = """<br />'''This method is asynchronous'''""" deprecated_msg = """<br />'''<font color="#FF0000">/!\ WARNING /!\ : This method is deprecated, please don't use it !</font>'''""" signature_signal = ( """\ ! scope=row | signature | %s |-\ """ % function["sig_in"] ) signature_method = """\ ! scope=row | signature in | %s |- ! scope=row | signature out | %s |-\ """ % ( function["sig_in"], function["sig_out"], ) completion = { "signature": ( signature_signal if function["type"] == "signal" else signature_method ), "sig_out": function["sig_out"] or "", "category": function["category"], "name": section, "doc": self.get_doc(section) or "FIXME: No description available", "async": async_msg if "async" in self.getFlags(section) else "", "deprecated": ( deprecated_msg if "deprecated" in self.getFlags(section) else "" ), "parameters": self._wiki_parameter(section, function["sig_in"]), "return": ( self._wiki_return(section) if function["type"] == "method" else "" ), } dest = signals_part if function["type"] == "signal" else methods_part dest.append( """\ == %(name)s == ''%(doc)s'' %(deprecated)s %(async)s {| class="wikitable" style="text-align:left; width:80%%;" ! scope=row | category | %(category)s |- %(signature)s ! scope=row | parameters | %(parameters)s%(return)s |} """ % completion ) # at this point, signals_part, and methods_part should be filled, # we just have to place them in the right part of the template core_bridge = [] template_path = self.get_template_path(self.core_template) try: with open(template_path) as core_template: for line in core_template: if line.lstrip().startswith("##SIGNALS_PART##"): core_bridge.extend(signals_part) elif line.lstrip().startswith("##METHODS_PART##"): core_bridge.extend(methods_part) elif line.lstrip().startswith("##TIMESTAMP##"): core_bridge.append("Generated on %s" % datetime.now()) else: core_bridge.append(line.replace("\n", "")) except IOError: print(("Can't open template file [%s]" % template_path)) sys.exit(1) # now we write to final file self.final_write(self.core_dest, core_bridge)