From 579a68362d90f8188e9b654a4249e74e0eeb76e3 Mon Sep 17 00:00:00 2001 From: Skia Date: Tue, 27 Dec 2016 19:40:31 +0100 Subject: [PATCH] Add some rules --- core/markdown.py | 159 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 137 insertions(+), 22 deletions(-) diff --git a/core/markdown.py b/core/markdown.py index 11bda419..abe1d177 100644 --- a/core/markdown.py +++ b/core/markdown.py @@ -7,9 +7,102 @@ 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 + +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^ + r'|' + r'^\^(\S*)' # ^word + ) + indice = re.compile( # XXX FIXME: don't work with inline code + r'^_([\s\S]+?)_(?!_)' # _text_ + r'|' + r'^_(\S*)' # _word + ) + class SithInlineLexer(InlineLexer): + grammar_class = SithInlineGrammar + + default_rules = [ + 'escape', + 'inline_html', + 'autolink', + 'url', + 'footnote', + 'link', + 'reflink', + 'nolink', + 'double_emphasis', + 'emphasis', + 'underline', + # 'indice', + 'exposant', + 'code', + 'linebreak', + 'strikethrough', + 'text', + ] + inline_html_rules = [ + 'escape', + 'autolink', + 'url', + 'link', + 'reflink', + 'nolink', + 'double_emphasis', + 'emphasis', + 'underline', + # 'indice', + 'exposant', + '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) or m.group(2) + return self.renderer.exposant(text) + + def output_indice(self, m): + text = m.group(1) or m.group(2) + 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: + try: # Add page:// support for links page = re.compile( r'^page://(\S*)' # page://nom_de_ma_page ) @@ -17,7 +110,7 @@ class SithInlineLexer(InlineLexer): page = match.group(1) or "" link = reverse('core:page', kwargs={'page_name': page}) except: pass - try: + try: # Add file:// support for links file_link = re.compile( r'^file://(\d*)/?(\S*)?' # file://4000/download ) @@ -28,30 +121,52 @@ class SithInlineLexer(InlineLexer): except: pass return super(SithInlineLexer, self)._process_link(m, link, title) - # def enable_file_link(self): - # # add file_link rules - # self.rules.file_link = re.compile( - # r'dfile://(\d*)/?(\S*)?' # dfile://4000/download - # ) - # # Add file_link parser to default rules - # # you can insert it some place you like - # # but place matters, maybe 2 is not good - # self.default_rules.insert(0, 'file_link') - - # def output_file_link(self, m): - # id = m.group(1) - # suffix = m.group(2) or "" - # # you can create an custom render - # # you can also return the html if you like - # # return directly html like this: - # # return reverse('core:file_detail', kwargs={'file_id': id}) + suffix - # return self.renderer.file_link(id, suffix) - renderer = SithRenderer() inline = SithInlineLexer(renderer) # enable the features -# inline.enable_file_link() +# inline.enable_indice() +# inline.enable_exposant() +# inline.enable_underline() + markdown = Markdown(renderer, inline=inline) +if __name__ == "__main__": + print(markdown.inline.default_rules) + print(markdown.inline.inline_html_rules) + text = """ +## Basique + +* Mettre le texte en **gras** : `**texte**` + +* Mettre le texte en *italique* : `*texte*` + +* __Souligner__ le texte : `__texte__` + +* ~~Barrer du texte~~ : `~~texte~~` + +* ^Mettre du texte^ en ^exposant : `^mot` ou `^texte^` +just ^another test + +* _Mettre du texte_ en _indice : `_mot` ou `_texte_` + +* Pied de page [^en pied de page] + +## Blocs de citations + +Un bloc de citation se crée ainsi : +``` +> Ceci est +> un bloc de +> citation +``` + + > Ceci est + > un bloc de + > citation + +Il est possible d'intégrer de la syntaxe Markdown-AE dans un tel bloc. + +""" + print(markdown(text))