lib/markdown2: introduce Github extended mode
authorAlexandre Terrasa <alexandre@moz-code.org>
Wed, 30 May 2018 02:15:16 +0000 (22:15 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Thu, 21 Jun 2018 00:58:45 +0000 (20:58 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

lib/markdown2/markdown_github.nit [new file with mode: 0644]
lib/markdown2/markdown_html_rendering.nit
lib/markdown2/markdown_latex_rendering.nit
lib/markdown2/markdown_man_rendering.nit
lib/markdown2/markdown_md_rendering.nit
lib/markdown2/tests/test_markdown_github.nit [new file with mode: 0644]

diff --git a/lib/markdown2/markdown_github.nit b/lib/markdown2/markdown_github.nit
new file mode 100644 (file)
index 0000000..2239953
--- /dev/null
@@ -0,0 +1,117 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Markdown Github mode
+#
+# Enables:
+# * strike processing: ~strike~
+# * super processing: ^super^
+#
+# TODO table
+# TODO todo lists
+module markdown_github
+
+intrude import markdown_inline_parsing
+intrude import markdown_block_parsing
+
+redef class MdParser
+
+       # Enable Github mode
+       var github_mode = false is writable
+
+       redef var inline_parser is lazy do
+               var parser = super
+               parser.github_mode = github_mode
+               return parser
+       end
+end
+
+redef class MdInlineParser
+
+       # Enable Github mode
+       private var github_mode = false
+
+       redef var delimiter_processors is lazy do
+               var delimiters = super
+               if github_mode then
+                       delimiters.add new MdStrikeProcessor
+                       delimiters.add new MdSuperProcessor
+               end
+               return delimiters
+       end
+end
+
+# Strike processor
+class MdStrikeProcessor
+       super MdEmphasisDelimiterProcessor
+       noautoinit
+
+       redef var delimiter_char = '~'
+       redef var min_length = 1
+       redef fun delimiter_use(opener, closer) do return opener.original_length
+
+       redef fun process(opener, closer, delimiter_use) do
+               var node = new MdStrike(
+                               new MdLocation(
+                                       opener.location.line_start,
+                                       opener.location.column_start,
+                                       closer.location.line_end,
+                                       closer.location.column_end),
+                       opening_delimiter.to_s * delimiter_use)
+               var tmp = opener.next
+               while tmp != null and tmp != closer do
+                       var next = tmp.next
+                       node.append_child(tmp)
+                       tmp = next
+               end
+               opener.insert_after(node)
+       end
+end
+
+#  Striked text
+class MdStrike
+       super MdDelimited
+end
+
+# Super processor
+class MdSuperProcessor
+       super MdEmphasisDelimiterProcessor
+       noautoinit
+
+       redef var delimiter_char = '^'
+       redef var min_length = 1
+       redef fun delimiter_use(opener, closer) do return opener.original_length
+
+       redef fun process(opener, closer, delimiter_use) do
+               var node = new MdSuper(
+                       new MdLocation(
+                               opener.location.line_start,
+                               opener.location.column_start,
+                               closer.location.line_end,
+                               closer.location.column_end),
+                       opening_delimiter.to_s * delimiter_use)
+               var tmp = opener.next
+               while tmp != null and tmp != closer do
+                       var next = tmp.next
+                       node.append_child(tmp)
+                       tmp = next
+               end
+               opener.insert_after(node)
+       end
+end
+
+# Super text
+class MdSuper
+       super MdDelimited
+end
index b8a88e3..e76fd2d 100644 (file)
@@ -16,6 +16,7 @@
 module markdown_html_rendering
 
 import markdown_rendering
+import markdown_github
 
 # Markdown document renderer to HTML
 class HtmlRenderer
@@ -422,3 +423,21 @@ redef class MdText
                v.add_text literal
        end
 end
+
+# Github mode
+
+redef class MdStrike
+       redef fun render_html(v) do
+               v.add_raw "<del>"
+               visit_all(v)
+               v.add_raw "</del>"
+       end
+end
+
+redef class MdSuper
+       redef fun render_html(v) do
+               v.add_raw "<sup>"
+               visit_all(v)
+               v.add_raw "</sup>"
+       end
+end
index 8cd5e33..a19be27 100644 (file)
@@ -16,6 +16,7 @@
 module markdown_latex_rendering
 
 import markdown_rendering
+import markdown_github
 
 # Markdown document renderer to LaTeX
 class LatexRenderer
@@ -402,3 +403,21 @@ redef class MdText
                v.add_text literal
        end
 end
+
+# Github mode
+
+redef class MdStrike
+       redef fun render_latex(v) do
+               v.add_raw "\\sout\{"
+               visit_all(v)
+               v.add_raw "\}"
+       end
+end
+
+redef class MdSuper
+       redef fun render_latex(v) do
+               v.add_raw "\\textsuperscript\{"
+               visit_all(v)
+               v.add_raw "\}"
+       end
+end
index b2ee9eb..14ed34b 100644 (file)
@@ -16,6 +16,7 @@
 module markdown_man_rendering
 
 import markdown_rendering
+import markdown_github
 
 # Markdown document renderer to Manpage
 class ManRenderer
@@ -230,3 +231,13 @@ redef class MdText
                v.add literal
        end
 end
+
+# Github
+
+redef class MdStrike
+       redef fun render_man(v) do
+               v.add "[STRIKEOUT:"
+               visit_all(v)
+               v.add "]"
+       end
+end
index 02439e1..f8fe7ec 100644 (file)
@@ -16,6 +16,7 @@
 module markdown_md_rendering
 
 import markdown_rendering
+import markdown_github
 
 # Markdown document renderer to Markdown
 class MarkdownRenderer
diff --git a/lib/markdown2/tests/test_markdown_github.nit b/lib/markdown2/tests/test_markdown_github.nit
new file mode 100644 (file)
index 0000000..04c04a4
--- /dev/null
@@ -0,0 +1,313 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Tests for markdown Github mode
+module test_markdown_github is test
+
+import test_markdown
+import test_markdown_location
+import test_markdown_md
+import test_markdown_man
+import test_markdown_latex
+
+redef class TestMarkdown
+       redef var md_parser is lazy do
+               var parser = super
+               parser.github_mode = true
+               return parser
+       end
+end
+
+class TestGithubLocation
+       super TestMarkdownLocation
+       test
+
+       fun test_github_strike is test do
+               var md = """
+A ~striked~ text.
+"""
+               var loc = """
+MdDocument: 1,1--1,17
+  MdParagraph: 1,1--1,17
+    MdText: 1,1--1,2
+    MdStrike: 1,3--1,11
+      MdText: 1,4--1,10
+    MdText: 1,12--1,17
+"""
+               assert md_to_loc(md) == loc
+       end
+
+       fun test_github_strike2 is test do
+               var md = """
+A ~~striked~~ text.
+"""
+               var loc = """
+MdDocument: 1,1--1,19
+  MdParagraph: 1,1--1,19
+    MdText: 1,1--1,2
+    MdStrike: 1,3--1,13
+      MdText: 1,5--1,11
+    MdText: 1,14--1,19
+"""
+               assert md_to_loc(md) == loc
+       end
+
+       fun test_github_super is test do
+               var md = """
+A ^supered^ text.
+"""
+               var loc = """
+MdDocument: 1,1--1,17
+  MdParagraph: 1,1--1,17
+    MdText: 1,1--1,2
+    MdSuper: 1,3--1,11
+      MdText: 1,4--1,10
+    MdText: 1,12--1,17
+"""
+               assert md_to_loc(md) == loc
+       end
+
+       fun test_github_super2 is test do
+               var md = """
+A ^^supered^^ text.
+"""
+               var loc = """
+MdDocument: 1,1--1,19
+  MdParagraph: 1,1--1,19
+    MdText: 1,1--1,2
+    MdSuper: 1,3--1,13
+      MdText: 1,5--1,11
+    MdText: 1,14--1,19
+"""
+               assert md_to_loc(md) == loc
+       end
+end
+
+class TestGithubHtml
+       super TestMarkdownHtml
+       test
+
+       fun test_strike1 is test do
+               var md = """foo ~bar~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike2 is test do
+               var md = """foo ~~bar~~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike3 is test do
+               var md = """foo ~~~bar~~~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike4 is test do
+               var md = """foo ~~~~bar~~~~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike5 is test do
+               var md = """foo ~~~~~bar~~~~~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike6 is test do
+               var md = """foo ~~~~~~bar~~~~~~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike_bad is test do
+               var md = """foo ~bar baz\n"""
+               var html = """<p>foo ~bar baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike_bad2 is test do
+               var md = """foo ~~bar~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike_bad3 is test do
+               var md = """foo ~~~bar~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike_bad4 is test do
+               var md = """foo ~~~~bar~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike_bad5 is test do
+               var md = """foo ~~~~~bar~ baz\n"""
+               var html = """<p>foo <del>bar</del> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike_bad6 is test do
+               var md = """foo bar~ baz\n"""
+               var html = """<p>foo bar~ baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_strike_bad7 is test do
+               var md = """foo ~bar~~~~ baz\n"""
+               var html = """<p>foo <del>bar</del>~~~ baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super1 is test do
+               var md = """foo ^bar^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super2 is test do
+               var md = """foo ^^bar^^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super3 is test do
+               var md = """foo ^^^bar^^^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super4 is test do
+               var md = """foo ^^^^bar^^^^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super5 is test do
+               var md = """foo ^^^^^bar^^^^^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super6 is test do
+               var md = """foo ^^^^^^bar^^^^^^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super_bad1 is test do
+               var md = """foo ^bar baz\n"""
+               var html = """<p>foo ^bar baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super_bad is test do
+               var md = """foo ^^bar^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super_bad3 is test do
+               var md = """foo ^^^bar^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super_bad4 is test do
+               var md = """foo ^^^^bar^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super_bad5 is test do
+               var md = """foo ^^^^^bar^ baz\n"""
+               var html = """<p>foo <sup>bar</sup> baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super_bad6 is test do
+               var md = """foo bar^ baz\n"""
+               var html = """<p>foo bar^ baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+
+       fun test_super_bad7 is test do
+               var md = """foo ^bar^^^^ baz\n"""
+               var html = """<p>foo <sup>bar</sup>^^^ baz</p>\n"""
+               assert md_to_html(md) == html
+       end
+end
+
+class TestGithubMd
+       super TestMarkdownMd
+       test
+
+       fun test_strike_md is test do
+               var md = """~~foo~~\n"""
+               assert md_to_md(md) == md
+       end
+
+       fun test_super_md is test do
+               var md = """^^foo^^\n"""
+               assert md_to_md(md) == md
+       end
+end
+
+class TestGithubMan
+       super TestMarkdownMan
+       test
+
+       fun test_strike_man is test do
+               var md = """~~foo~~\n"""
+               var man = """\n[STRIKEOUT:foo]\n"""
+               assert md_to_man(md) == man
+       end
+
+       fun test_super_man is test do
+               var md = """^foo^\n"""
+               var man = """\nfoo\n"""
+               assert md_to_man(md) == man
+       end
+end
+
+class TestGithubLatex
+       super TestMarkdownLatex
+       test
+
+       fun test_strike_latex is test do
+               var md = """
+A ~~super~~ text.
+"""
+               var tex = """
+A \\sout{super} text.
+"""
+               assert md_to_tex(md) == tex
+       end
+
+       fun test_super_latex is test do
+               var md = """
+A ^super^ text.
+"""
+               var tex = """
+A \\textsuperscript{super} text.
+"""
+               assert md_to_tex(md) == tex
+       end
+end