# -*- coding:utf-8 -* # # Copyright 2016,2017 # - Skia # # Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, # http://ae.utbm.fr. # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License a 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 General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple # Place - Suite 330, Boston, MA 02111-1307, USA. # # import os import re from mistune import Renderer, InlineGrammar, InlineLexer, Markdown, escape, escape_link from django.urls import reverse class SithRenderer(Renderer): def file_link(self, id, suffix): return reverse("core:file_detail", kwargs={"file_id": id}) + suffix def exposant(self, text): return """%s""" % text def indice(self, text): return """%s""" % text def underline(self, text): return """%s""" % text def image(self, original_src, title, text): """Rendering a image with title and text. :param src: source link of the image. :param title: title text of the image. :param text: alt text of the image. """ style = None if "?" in original_src: src, params = original_src.rsplit("?", maxsplit=1) m = re.search(r"(\d+%?)(x(\d+%?))?", params) if not m: src = original_src else: width = m.group(1) if not width.endswith("%"): width += "px" style = "width: %s; " % width try: height = m.group(3) if not height.endswith("%"): height += "px" style += "height: %s; " % height except: pass else: params = None src = original_src src = escape_link(src) text = escape(text, quote=True) if title: title = escape(title, quote=True) html = '%s" % html return "%s>" % html class SithInlineGrammar(InlineGrammar): double_emphasis = re.compile(r"^\*{2}([\s\S]+?)\*{2}(?!\*)") # **word** emphasis = re.compile(r"^\*((?:\*\*|[^\*])+?)\*(?!\*)") # *word* underline = re.compile(r"^_{2}([\s\S]+?)_{2}(?!_)") # __word__ exposant = re.compile(r"^([\s\S]+?)") # text indice = re.compile(r"^([\s\S]+?)") # text class SithInlineLexer(InlineLexer): grammar_class = SithInlineGrammar default_rules = [ "escape", # 'inline_html', "autolink", "url", "footnote", "link", "reflink", "nolink", "exposant", "double_emphasis", "emphasis", "underline", "indice", "code", "linebreak", "strikethrough", "text", ] inline_html_rules = [ "escape", "autolink", "url", "link", "reflink", "nolink", "exposant", "double_emphasis", "emphasis", "underline", "indice", "code", "linebreak", "strikethrough", "text", ] def output_underline(self, m): text = m.group(1) return self.renderer.underline(text) def output_exposant(self, m): text = m.group(1) return self.renderer.exposant(text) def output_indice(self, m): text = m.group(1) return self.renderer.indice(text) # Double emphasis rule changed def output_double_emphasis(self, m): text = m.group(1) text = self.output(text) return self.renderer.double_emphasis(text) # Emphasis rule changed def output_emphasis(self, m): text = m.group(1) text = self.output(text) return self.renderer.emphasis(text) def _process_link(self, m, link, title=None): try: # Add page:// support for links page = re.compile(r"^page://(\S*)") # page://nom_de_ma_page match = page.search(link) page = match.group(1) or "" link = reverse("core:page", kwargs={"page_name": page}) except: pass try: # Add file:// support for links file_link = re.compile(r"^file://(\d*)/?(\S*)?") # file://4000/download match = file_link.search(link) id = match.group(1) suffix = match.group(2) or "" link = reverse("core:file_detail", kwargs={"file_id": id}) + suffix except: pass return super(SithInlineLexer, self)._process_link(m, link, title) renderer = SithRenderer(escape=True) inline = SithInlineLexer(renderer) markdown = Markdown(renderer, inline=inline) if __name__ == "__main__": root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) with open(os.path.join(root_path) + "/doc/SYNTAX.md", "r") as md: result = markdown(md.read()) print(result, end="")