mmarkdown 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +1 -1
- data/Gemfile +2 -0
- data/Rakefile +1 -86
- data/Readme.md +1 -26
- data/bin/mmarkdown +5 -2
- data/lib/mmarkdown.rb +8 -104
- data/lib/mmarkdown/helper.rb +26 -0
- data/lib/mmarkdown/mmarkdown.rb +109 -0
- data/lib/mmarkdown/toc_html_converter.rb +14 -0
- data/lib/mmarkdown/version.rb +3 -3
- data/mmarkdown.gemspec +24 -0
- data/test/test.html +37 -40
- data/test/test.mmd +6 -7
- data/test/test_helper.rb +34 -0
- data/test/test_mmarkdown.rb +15 -29
- data/test/test_with_title.html +37 -40
- metadata +24 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b512b221fde7387c2dee72f53eed9c1618719187a083ff867f8c563eb38f8532
|
4
|
+
data.tar.gz: 05fcd60d8705c92dddcdd252f7c14353a9864d14198c6f2266919332e5d12810
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 951f875085477a113dc83c51acf82a794ed745f8515bccbda355cc458b65c4d89bda06c684d010d59d319fefd73d4faa69874f93be0d0116d2ef9379655f94e0
|
7
|
+
data.tar.gz: 99941978d9207e35de27a6dfcf7d6a0144dcd39b88d1f12d013a6793a4ea08d76f4c19df5e149844a619bc2869134910f74d206e9fe19b5bdb96671ad7b75ae3
|
data/.gitignore
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
pkg
|
2
|
-
|
2
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/testtask'
|
3
|
+
require 'bundler/gem_tasks'
|
3
4
|
|
4
5
|
require "#{__dir__}/lib/mmarkdown"
|
5
6
|
|
@@ -11,89 +12,3 @@ Rake::TestTask.new('test') do |t|
|
|
11
12
|
t.warning = false
|
12
13
|
end
|
13
14
|
|
14
|
-
begin
|
15
|
-
require 'jeweler'
|
16
|
-
Jeweler::Tasks.new do |gem|
|
17
|
-
gem.name = "mmarkdown"
|
18
|
-
gem.summary = "Markdown with MathML"
|
19
|
-
gem.author = "Hiroyuki Tanaka"
|
20
|
-
gem.email = "hryktnk@gmail.com"
|
21
|
-
gem.version = MMarkdown::VERSION
|
22
|
-
gem.files = `git ls-files`.split("\n")
|
23
|
-
gem.test_files = `git ls-files -- test/*`.split("\n")
|
24
|
-
gem.licenses = ["MIT License"]
|
25
|
-
gem.homepage = "http://github.com/tanahiro/mmarkdown"
|
26
|
-
gem.add_dependency("redcarpet", "~> 3.0")
|
27
|
-
gem.add_dependency("math_ml", "~> 0.14")
|
28
|
-
gem.add_development_dependency("nokogiri", "~> 1.0")
|
29
|
-
gem.add_development_dependency("jeweler", "~> 2.0")
|
30
|
-
gem.description = <<-EOF
|
31
|
-
Convert Markdown to HTML with MathML
|
32
|
-
EOF
|
33
|
-
end
|
34
|
-
rescue LoadError
|
35
|
-
puts "Jeweler not installed"
|
36
|
-
end
|
37
|
-
|
38
|
-
require 'rdoc/task'
|
39
|
-
require 'rdoc/generator/darkfish'
|
40
|
-
|
41
|
-
#module RDoc::Generator::Markup
|
42
|
-
# alias :org_formatter :formatter
|
43
|
-
# def formatter
|
44
|
-
# org_formatter
|
45
|
-
#
|
46
|
-
# @formatter.add_tag(:Math, "<math>", "</math>")
|
47
|
-
# @formatter
|
48
|
-
# end
|
49
|
-
#end
|
50
|
-
|
51
|
-
require 'rdoc'
|
52
|
-
class RDoc::RDoc
|
53
|
-
alias_method :org_document, :document
|
54
|
-
def document options
|
55
|
-
|
56
|
-
m = RDoc::Markup.new
|
57
|
-
m.add_html("math", :MathML)
|
58
|
-
m.add_html("msup", :MathML_msup)
|
59
|
-
m.add_html("mi", :MathML_mi)
|
60
|
-
m.add_html("mn", :MathML_mn)
|
61
|
-
m.add_html("mo", :MathML_mo)
|
62
|
-
|
63
|
-
h = RDoc::Markup::ToHtml.new(nil, m)
|
64
|
-
h.add_tag(:MathML,
|
65
|
-
"<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'>",
|
66
|
-
"</math>")
|
67
|
-
h.add_tag(:MathML_msup, "<msup>", "</msup>")
|
68
|
-
h.add_tag(:MathML_mi, "<mi>", "</mi>")
|
69
|
-
h.add_tag(:MathML_mn, "<mn>", "</mn>")
|
70
|
-
h.add_tag(:MathML_mo, "<mo stretchy='false'>", "</mo>")
|
71
|
-
|
72
|
-
rdoc_options = load_options
|
73
|
-
rdoc_options.parse(options)
|
74
|
-
rdoc_options.formatter = h
|
75
|
-
|
76
|
-
org_document(rdoc_options)
|
77
|
-
|
78
|
-
#p @generator.store.rdoc
|
79
|
-
|
80
|
-
#str = "<math>"
|
81
|
-
#str += " <msup><mi>x</mi><mn>2</mn></msup>"
|
82
|
-
#str += " <mo>+</mo>"
|
83
|
-
#str += " <msup><mi>y</mi><mn>2</mn></msup>"
|
84
|
-
#str += " <mo>=</mo>"
|
85
|
-
#str += " <msup><mi>r</mi><mn>2</mn></msup>"
|
86
|
-
#str += "</math>\n"
|
87
|
-
|
88
|
-
#puts h.convert(str)
|
89
|
-
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
RDoc::Task.new do |rdoc|
|
94
|
-
rdoc.main = "Readme.md"
|
95
|
-
rdoc.rdoc_files.include("Readme.md", "lib/**/*.rb")
|
96
|
-
rdoc.rdoc_dir = "rdoc"
|
97
|
-
rdoc.title = "MMarkdown"
|
98
|
-
end
|
99
|
-
|
data/Readme.md
CHANGED
@@ -1,29 +1,5 @@
|
|
1
1
|
# MMarkdown
|
2
|
-
Markdown with math equations
|
3
|
-
|
4
|
-
## Markdown with Equations
|
5
|
-
LaTeX style equations in the areas surrounded by <code>\\(</code> and
|
6
|
-
<code>\\)</code> are converted to inline equations.
|
7
|
-
|
8
|
-
\( x^2 + y^2 = r^2 \)
|
9
|
-
generates
|
10
|
-
|
11
|
-
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'>
|
12
|
-
<msup>
|
13
|
-
<mi>x</mi><mn>2</mn></msup>
|
14
|
-
<mo stretchy='false'>+</mo>
|
15
|
-
<msup><mi>y</mi><mn>2</mn></msup>
|
16
|
-
<mo stretchy='false'>=</mo><msup>
|
17
|
-
<mi>r</mi><mn>2</mn>
|
18
|
-
</msup>
|
19
|
-
</math>
|
20
|
-
|
21
|
-
and shown as
|
22
|
-
<math>
|
23
|
-
<msup><mi>x</mi><mn>2</mn></msup>
|
24
|
-
<mo>+</mo><msup><mi>y</mi><mn>2</mn></msup>
|
25
|
-
<mo>=</mo><msup><mi>r</mi><mn>2</mn></msup>
|
26
|
-
</math>
|
2
|
+
Markdown with math equations
|
27
3
|
|
28
4
|
## Install
|
29
5
|
gem install mmarkdown
|
@@ -32,7 +8,6 @@ and shown as
|
|
32
8
|
mmarkdown <file.md>
|
33
9
|
|
34
10
|
----
|
35
|
-
|
36
11
|
## Author
|
37
12
|
Hiroyuki Tanaka
|
38
13
|
|
data/bin/mmarkdown
CHANGED
data/lib/mmarkdown.rb
CHANGED
@@ -1,110 +1,14 @@
|
|
1
|
-
require "
|
2
|
-
require "redcarpet"
|
1
|
+
require "#{__dir__}/mmarkdown/mmarkdown"
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def self.load_file filename
|
8
|
-
str = File.open(filename).read
|
9
|
-
|
10
|
-
return self.new(str)
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize md_string, title: nil, style: nil, footer: nil
|
14
|
-
@md_mathml = equations_to_mathml(md_string)
|
15
|
-
|
16
|
-
@md_mathml.gsub!(/%%.*$/, '')
|
17
|
-
|
18
|
-
parse_extensions = {no_intra_emphasis: true,
|
19
|
-
tables: true,
|
20
|
-
fenced_code_blocks: true,
|
21
|
-
autolink: true,
|
22
|
-
disable_indented_code_blocks: false,
|
23
|
-
superscript: true,
|
24
|
-
underline: true,
|
25
|
-
highlight: true,
|
26
|
-
footnotes: true}
|
27
|
-
|
28
|
-
render_extensions = {with_toc_data: true}
|
29
|
-
|
30
|
-
render = Redcarpet::Render::HTML.new(render_extensions)
|
31
|
-
|
32
|
-
@md = Redcarpet::Markdown.new(render, parse_extensions).render(@md_mathml)
|
33
|
-
|
34
|
-
if title or style or footer
|
35
|
-
@header = "<!DOCTYPE html>\n"
|
36
|
-
@header += "<html>\n"
|
37
|
-
@header += "<head>\n"
|
38
|
-
|
39
|
-
if title
|
40
|
-
@header += " <title>" + title + "</title>\n"
|
41
|
-
end
|
42
|
-
|
43
|
-
if style
|
44
|
-
style_str = " <style type=\"text/css\">\n"
|
45
|
-
File.open(style).each_line {|line|
|
46
|
-
style_str += (" " + line)
|
47
|
-
}
|
48
|
-
|
49
|
-
@header += style_str
|
50
|
-
@header += " </style>\n"
|
51
|
-
end
|
52
|
-
|
53
|
-
@header += "</head>\n"
|
54
|
-
@header += "<body>\n"
|
55
|
-
|
56
|
-
@footer = ""
|
57
|
-
if footer
|
58
|
-
@footer += "<footer>\n"
|
59
|
-
@footer += File.open(footer).read
|
60
|
-
@footer += "</footer>\n"
|
61
|
-
end
|
62
|
-
@footer += "</body>\n</html>\n"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
##
|
67
|
-
# Converts equations to MathML format
|
68
|
-
def equations_to_mathml string
|
69
|
-
equations = []
|
70
|
-
|
71
|
-
string_mathml = string.clone
|
72
|
-
string.scan(/\\\[(.*?)\\\]/) {|m|
|
73
|
-
string_mathml.gsub!("\\[" + m.first + "\\]", m.first.to_mathml(true).to_s)
|
74
|
-
}
|
75
|
-
|
76
|
-
string.scan(/\\\((.*?)\\\)/) {|m|
|
77
|
-
string_mathml.gsub!("\\(" + m.first + "\\)", m.first.to_mathml.to_s)
|
78
|
-
}
|
79
|
-
|
80
|
-
return string_mathml
|
3
|
+
module MMarkdown
|
4
|
+
def new md_string, opts = {}
|
5
|
+
return MMarkdown.new(md_string, opts)
|
81
6
|
end
|
7
|
+
module_function :new
|
82
8
|
|
83
|
-
|
84
|
-
|
85
|
-
def toc_html nesting_level = 3
|
86
|
-
render_toc = Redcarpet::Render::HTML_TOC.new(nesting_level: nesting_level)
|
87
|
-
toc_html = Redcarpet::Markdown.new(render_toc).render(@md_mathml)
|
88
|
-
|
89
|
-
return toc_html
|
90
|
-
end
|
91
|
-
|
92
|
-
##
|
93
|
-
# Returns HTML
|
94
|
-
def to_str
|
95
|
-
str = ""
|
96
|
-
if @header
|
97
|
-
str += @header
|
98
|
-
end
|
99
|
-
|
100
|
-
str += @md.to_str
|
101
|
-
|
102
|
-
if @footer
|
103
|
-
str += @footer
|
104
|
-
end
|
105
|
-
|
106
|
-
return str
|
9
|
+
def load_file filename
|
10
|
+
return MMarkdown.load_file(filename)
|
107
11
|
end
|
108
|
-
|
12
|
+
module_function :load_file
|
109
13
|
end
|
110
14
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module MMarkdown
|
2
|
+
module Helper
|
3
|
+
def to_kramdown_math_block str
|
4
|
+
str_kr = str.clone
|
5
|
+
|
6
|
+
str.scan(/(\s*\\\[\s*)(.*?)(\s*\\\]\s*)/) {|m|
|
7
|
+
str_kr.gsub!(m.join,
|
8
|
+
"\n\n$$\n" + m[1] + "\n$$\n\n")
|
9
|
+
}
|
10
|
+
|
11
|
+
return str_kr
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_kramdown_math_inline str
|
15
|
+
str_kr = str.clone
|
16
|
+
|
17
|
+
str.scan(/(\\\(\s*)(.*?)(\s*\\\))/) {|m|
|
18
|
+
str_kr.gsub!(m.join,
|
19
|
+
"$$ " + m[1] + " $$")
|
20
|
+
}
|
21
|
+
|
22
|
+
return str_kr
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require "kramdown"
|
2
|
+
require "#{__dir__}/helper"
|
3
|
+
require "#{__dir__}/toc_html_converter"
|
4
|
+
|
5
|
+
module MMarkdown
|
6
|
+
class MMarkdown
|
7
|
+
include Helper
|
8
|
+
|
9
|
+
def self.load_file filename
|
10
|
+
str = File.open(filename).read
|
11
|
+
|
12
|
+
return self.new(str)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize md_string, title: nil, style: nil, footer: nil
|
16
|
+
## Math equation
|
17
|
+
@mmd = convert_math_boundaries(md_string)
|
18
|
+
|
19
|
+
## Comment out
|
20
|
+
@mmd.gsub!(/%%.*$/, '')
|
21
|
+
|
22
|
+
@md = Kramdown::Document.new(@mmd, math_engine: "itex2mml")
|
23
|
+
|
24
|
+
if title or style or footer
|
25
|
+
@header = "<!DOCTYPE html>\n"
|
26
|
+
@header += "<html>\n"
|
27
|
+
@header += "<head>\n"
|
28
|
+
|
29
|
+
if title
|
30
|
+
@header += " <title>" + title + "</title>\n"
|
31
|
+
end
|
32
|
+
|
33
|
+
if style
|
34
|
+
style_str = " <style type=\"text/css\">\n"
|
35
|
+
File.open(style).each_line {|line|
|
36
|
+
style_str += (" " + line)
|
37
|
+
}
|
38
|
+
|
39
|
+
@header += style_str
|
40
|
+
@header += " </style>\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
@header += "</head>\n"
|
44
|
+
@header += "<body>\n"
|
45
|
+
|
46
|
+
@footer = ""
|
47
|
+
if footer
|
48
|
+
@footer += "<footer>\n"
|
49
|
+
@footer += File.open(footer).read
|
50
|
+
@footer += "</footer>\n"
|
51
|
+
end
|
52
|
+
@footer += "</body>\n</html>\n"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Converts Math boundaries for Kramdown
|
58
|
+
def convert_math_boundaries string
|
59
|
+
string_mathml = string.clone
|
60
|
+
|
61
|
+
## Block equation
|
62
|
+
string_mathml = to_kramdown_math_block(string_mathml)
|
63
|
+
|
64
|
+
## Inline equation
|
65
|
+
string_mathml = to_kramdown_math_inline(string_mathml)
|
66
|
+
|
67
|
+
return string_mathml
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# Returns list of table of contetns
|
72
|
+
def toc_html nesting_level = 3
|
73
|
+
toc = @md.to_toc
|
74
|
+
toc_array = []
|
75
|
+
toc_to_array(toc, toc_array, nesting_level)
|
76
|
+
|
77
|
+
return Kramdown::Converter::Html.convert_toc(toc_array)
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Returns HTML
|
82
|
+
def to_str
|
83
|
+
str = ""
|
84
|
+
if @header
|
85
|
+
str += @header
|
86
|
+
end
|
87
|
+
|
88
|
+
str += @md.to_html
|
89
|
+
|
90
|
+
if @footer
|
91
|
+
str += @footer
|
92
|
+
end
|
93
|
+
|
94
|
+
return str
|
95
|
+
end
|
96
|
+
alias :to_html :to_str
|
97
|
+
|
98
|
+
def toc_to_array toc, ary, nesting_level
|
99
|
+
toc.children.each do |t|
|
100
|
+
ary << [t.value.options[:level], t.attr[:id], t.value.children]
|
101
|
+
|
102
|
+
if t.value.options[:level] < nesting_level
|
103
|
+
toc_to_array(t, ary, nesting_level)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'kramdown/converter/html'
|
2
|
+
|
3
|
+
module Kramdown
|
4
|
+
module Converter
|
5
|
+
class Html
|
6
|
+
def self.convert_toc toc, option = {}
|
7
|
+
converter = new(Element.new(:root), ::Kramdown::Options.merge(option))
|
8
|
+
toc_tree = converter.generate_toc_tree(toc, :ul, {})
|
9
|
+
return converter.convert(toc_tree, 0)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
data/lib/mmarkdown/version.rb
CHANGED
data/mmarkdown.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "mmarkdown/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "mmarkdown"
|
7
|
+
spec.version = MMarkdown::VERSION
|
8
|
+
spec.authors = ["Hiroyuki Tanaka"]
|
9
|
+
spec.email = ["hryktnk@gmail.com"]
|
10
|
+
spec.summary = "Kramdown based markdown parser and HTML generator"
|
11
|
+
spec.description = "Kramdown based markdown to HTML tool with math rendering"
|
12
|
+
spec.homepage = "https://github.com/tanahiro/mmarkdown"
|
13
|
+
spec.licenses = ["MIT"]
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split("\n")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f) }
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_dependency "kramdown", "~> 1.0"
|
20
|
+
spec.add_dependency "itextomml", "~> 1.0"
|
21
|
+
|
22
|
+
spec.add_development_dependency "nokogiri", "~> 1.8"
|
23
|
+
end
|
24
|
+
|
data/test/test.html
CHANGED
@@ -3,78 +3,75 @@
|
|
3
3
|
<p>This is a test data</p>
|
4
4
|
|
5
5
|
<h2 id="equation">Equation</h2>
|
6
|
-
|
7
|
-
<
|
8
|
-
(<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mi>x</mi><mo stretchy='false'>=</mo><mi>r</mi><mi>cos</mi><mi>θ</mi></math> and <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mi>y</mi><mo stretchy='false'>=</mo><mi>r</mi><mi>sin</mi><mi>θ</mi></math>).</p>
|
6
|
+
<p>This is an equation. <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msup><mi>x</mi> <mn>2</mn></msup><mo>+</mo><msup><mi>y</mi> <mn>2</mn></msup><mo>=</mo><msup><mi>r</mi> <mn>2</mn></msup></mrow><annotation encoding='application/x-tex'>x^2 + y^2 = r^2</annotation></semantics></math>,
|
7
|
+
(<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><mi>x</mi><mo>=</mo><mi>r</mi><mi>cos</mi><mi>θ</mi></mrow><annotation encoding='application/x-tex'>x = r \cos \theta</annotation></semantics></math> and <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><mi>y</mi><mo>=</mo><mi>r</mi><mi>sin</mi><mi>θ</mi></mrow><annotation encoding='application/x-tex'>y = r \sin \theta</annotation></semantics></math>).</p>
|
9
8
|
|
10
9
|
<p>And this is the second
|
11
|
-
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><msup><mi>sin</mi
|
10
|
+
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msup><mi>sin</mi> <mn>2</mn></msup><mi>θ</mi><mo>+</mo><msup><mi>cos</mi> <mn>2</mn></msup><mi>θ</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding='application/x-tex'>\sin^2 \theta + \cos^2 \theta = 1</annotation></semantics></math>.</p>
|
11
|
+
|
12
|
+
<p>日本語の後の数式 <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msubsup><mo lspace="thinmathspace" rspace="thinmathspace">∑</mo> <mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow> <mi>N</mi></msubsup><msub><mi>x</mi> <mi>i</mi></msub></mrow><annotation encoding='application/x-tex'>\sum_{i = 0}^{N} x_i</annotation></semantics></math></p>
|
12
13
|
|
13
|
-
<p
|
14
|
+
<p>Block style</p>
|
14
15
|
|
15
|
-
<
|
16
|
-
<math xmlns='http://www.w3.org/1998/Math/MathML' display='block'><msubsup><mo stretchy='false'>∫</mo><mrow><mo stretchy='false'>-</mo><mn>∞</mn></mrow><mrow><mn>∞</mn></mrow></msubsup><mi>f</mi><mfenced open='(' close=')'><mrow><mi>x</mi></mrow></mfenced><mspace width='0.167em' /><mi>d</mi><mi>x</mi></math></p>
|
16
|
+
<math xmlns='http://www.w3.org/1998/Math/MathML' display='block'><semantics><mrow><msubsup><mo>∫</mo> <mrow><mo lspace="verythinmathspace" rspace="0em">−</mo><mn>∞</mn></mrow> <mn>∞</mn></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mspace width="thinmathspace"/><mi>dx</mi></mrow><annotation encoding='application/x-tex'>\int_{-\infty}^{\infty} f \left( x \right) \, dx</annotation></semantics></math>
|
17
17
|
|
18
|
-
<p>Same equation again <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><msup><mi>sin</mi
|
18
|
+
<p>Same equation again <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msup><mi>sin</mi> <mn>2</mn></msup><mi>θ</mi><mo>+</mo><msup><mi>cos</mi> <mn>2</mn></msup><mi>θ</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding='application/x-tex'>\sin^2 \theta + \cos^2 \theta = 1</annotation></semantics></math>.</p>
|
19
19
|
|
20
20
|
<p>vector:
|
21
|
-
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><
|
21
|
+
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><mover><mi>x</mi><mo stretchy="false">→</mo></mover><mo>+</mo><mover><mi>y</mi><mo stretchy="false">→</mo></mover><mo>=</mo><mover><mi>p</mi><mo stretchy="false">→</mo></mover></mrow><annotation encoding='application/x-tex'>\vec{x} + \vec{y} = \vec{p}</annotation></semantics></math></p>
|
22
22
|
|
23
23
|
<h2 id="markdown">Markdown</h2>
|
24
|
-
|
25
24
|
<p><em>italic</em></p>
|
26
25
|
|
27
|
-
<p><u>underline</u></p>
|
28
|
-
|
29
26
|
<p><strong>bold</strong></p>
|
30
27
|
|
31
28
|
<p><strong><em>bold italic</em></strong></p>
|
32
29
|
|
33
30
|
<h3 id="list">List</h3>
|
34
|
-
|
35
31
|
<ul>
|
36
|
-
<li>item1</li>
|
37
|
-
<li>item2
|
38
|
-
|
39
|
-
<
|
40
|
-
<li>nested item2-
|
41
|
-
|
42
|
-
</
|
32
|
+
<li>item1</li>
|
33
|
+
<li>item2
|
34
|
+
<ul>
|
35
|
+
<li>nested item2-1</li>
|
36
|
+
<li>nested item2-2</li>
|
37
|
+
</ul>
|
38
|
+
</li>
|
43
39
|
</ul>
|
44
40
|
|
45
41
|
<ol>
|
46
|
-
<li>item3</li>
|
47
|
-
<li>item4</li>
|
42
|
+
<li>item3</li>
|
43
|
+
<li>item4</li>
|
48
44
|
</ol>
|
49
45
|
|
50
46
|
<h3 id="quote">Quote</h3>
|
51
|
-
|
52
47
|
<blockquote>
|
53
|
-
<p>quote</p>
|
48
|
+
<p>quote</p>
|
54
49
|
</blockquote>
|
55
50
|
|
56
51
|
<h3 id="table">Table</h3>
|
57
52
|
|
58
|
-
<table
|
59
|
-
<
|
60
|
-
<
|
61
|
-
<th style="text-align:
|
62
|
-
<th style="text-align:
|
63
|
-
</
|
64
|
-
</
|
65
|
-
|
66
|
-
<
|
67
|
-
<
|
68
|
-
<td style="text-align:
|
69
|
-
</
|
70
|
-
</
|
53
|
+
<table>
|
54
|
+
<thead>
|
55
|
+
<tr>
|
56
|
+
<th style="text-align: left">head1</th>
|
57
|
+
<th style="text-align: center">head2</th>
|
58
|
+
<th style="text-align: right">head3</th>
|
59
|
+
</tr>
|
60
|
+
</thead>
|
61
|
+
<tbody>
|
62
|
+
<tr>
|
63
|
+
<td style="text-align: left">item</td>
|
64
|
+
<td style="text-align: center">item</td>
|
65
|
+
<td style="text-align: right">item</td>
|
66
|
+
</tr>
|
67
|
+
</tbody>
|
68
|
+
</table>
|
71
69
|
|
72
70
|
<h3 id="syntax-highlight">Syntax highlight</h3>
|
73
|
-
|
74
|
-
<pre><code class="ruby">a = [1, 2, 3]
|
71
|
+
<pre><code class="language-ruby">a = [1, 2, 3]
|
75
72
|
a.reduce(0, :+)
|
76
73
|
</code></pre>
|
77
74
|
|
78
75
|
<h3 id="link">Link</h3>
|
79
|
-
|
80
76
|
<p><a href="http://google.com">google</a></p>
|
77
|
+
|
data/test/test.mmd
CHANGED
@@ -22,8 +22,6 @@ vector:
|
|
22
22
|
## Markdown
|
23
23
|
*italic*
|
24
24
|
|
25
|
-
_underline_
|
26
|
-
|
27
25
|
**bold**
|
28
26
|
|
29
27
|
***bold italic***
|
@@ -41,15 +39,16 @@ _underline_
|
|
41
39
|
> quote
|
42
40
|
|
43
41
|
### Table
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
|
43
|
+
| head1 | head2 | head3 |
|
44
|
+
|:------|:-----:|------:|
|
45
|
+
| item | item | item |
|
47
46
|
|
48
47
|
### Syntax highlight
|
49
|
-
|
48
|
+
~~~ruby
|
50
49
|
a = [1, 2, 3]
|
51
50
|
a.reduce(0, :+)
|
52
|
-
|
51
|
+
~~~
|
53
52
|
|
54
53
|
### Link
|
55
54
|
[google](http://google.com)
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
|
3
|
+
require "#{__dir__}/../lib/mmarkdown/helper"
|
4
|
+
|
5
|
+
class MMarkdownHelperTest < MiniTest::Test
|
6
|
+
include MMarkdown::Helper
|
7
|
+
|
8
|
+
def test_to_kramdown_math_block
|
9
|
+
expected = "\n\n$$\n" +
|
10
|
+
%q"\int_{-\infty}^{\infty} f \left( x \right) \, dx" +
|
11
|
+
"\n$$\n\n"
|
12
|
+
|
13
|
+
str = %q"\[ \int_{-\infty}^{\infty} f \left( x \right) \, dx \]"
|
14
|
+
assert_equal(expected, to_kramdown_math_block(str))
|
15
|
+
|
16
|
+
str = "\n" +
|
17
|
+
%q"\[ \int_{-\infty}^{\infty} f \left( x \right) \, dx \]" +
|
18
|
+
"\n"
|
19
|
+
assert_equal(expected, to_kramdown_math_block(str))
|
20
|
+
|
21
|
+
str = "\n\\[\n" +
|
22
|
+
%q"\int_{-\infty}^{\infty} f \left( x \right) \, dx" +
|
23
|
+
"\n\\]\n"
|
24
|
+
assert_equal(expected, to_kramdown_math_block(str))
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_to_kramdown_math_inline
|
28
|
+
expected = "$$ x^2 + y^2 = r^2 $$"
|
29
|
+
|
30
|
+
str = %q"\( x^2 + y^2 = r^2 \)"
|
31
|
+
assert_equal(expected, to_kramdown_math_inline(str))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
data/test/test_mmarkdown.rb
CHANGED
@@ -34,41 +34,27 @@ class MMarkdownTest < MiniTest::Test
|
|
34
34
|
mmarkdown = MMarkdown.new(md_string)
|
35
35
|
toc_actual = mmarkdown.toc_html
|
36
36
|
|
37
|
+
toc_expected = nil
|
37
38
|
toc_expected = <<EOF
|
38
|
-
<ul>
|
39
|
-
<li>
|
40
|
-
<a href="#
|
41
|
-
<ul>
|
42
|
-
<li>
|
43
|
-
<a href="#
|
44
|
-
</li>
|
45
|
-
<li>
|
46
|
-
<a href="#markdown">
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
</li>
|
51
|
-
<li>
|
52
|
-
<a href="#quote">Quote</a>
|
53
|
-
</li>
|
54
|
-
<li>
|
55
|
-
<a href="#table">Table</a>
|
56
|
-
</li>
|
57
|
-
<li>
|
58
|
-
<a href="#syntax-highlight">Syntax highlight</a>
|
59
|
-
</li>
|
60
|
-
<li>
|
61
|
-
<a href="#link">Link</a>
|
62
|
-
</li>
|
63
|
-
</ul>
|
64
|
-
</li>
|
65
|
-
</ul>
|
66
|
-
</li>
|
39
|
+
<ul id="markdown-toc">
|
40
|
+
<li><a href="#test" id="markdown-toc-test">Test</a> <ul>
|
41
|
+
<li><a href="#equation" id="markdown-toc-equation">Equation</a></li>
|
42
|
+
<li><a href="#markdown" id="markdown-toc-markdown">Markdown</a> <ul>
|
43
|
+
<li><a href="#list" id="markdown-toc-list">List</a></li>
|
44
|
+
<li><a href="#quote" id="markdown-toc-quote">Quote</a></li>
|
45
|
+
<li><a href="#table" id="markdown-toc-table">Table</a></li>
|
46
|
+
<li><a href="#syntax-highlight" id="markdown-toc-syntax-highlight">Syntax highlight</a></li>
|
47
|
+
<li><a href="#link" id="markdown-toc-link">Link</a></li>
|
48
|
+
</ul>
|
49
|
+
</li>
|
50
|
+
</ul>
|
51
|
+
</li>
|
67
52
|
</ul>
|
68
53
|
EOF
|
69
54
|
|
70
55
|
assert_equal(toc_expected, toc_actual)
|
71
56
|
|
72
57
|
end
|
58
|
+
|
73
59
|
end
|
74
60
|
|
data/test/test_with_title.html
CHANGED
@@ -13,81 +13,78 @@
|
|
13
13
|
<p>This is a test data</p>
|
14
14
|
|
15
15
|
<h2 id="equation">Equation</h2>
|
16
|
-
|
17
|
-
<
|
18
|
-
(<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mi>x</mi><mo stretchy='false'>=</mo><mi>r</mi><mi>cos</mi><mi>θ</mi></math> and <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mi>y</mi><mo stretchy='false'>=</mo><mi>r</mi><mi>sin</mi><mi>θ</mi></math>).</p>
|
16
|
+
<p>This is an equation. <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msup><mi>x</mi> <mn>2</mn></msup><mo>+</mo><msup><mi>y</mi> <mn>2</mn></msup><mo>=</mo><msup><mi>r</mi> <mn>2</mn></msup></mrow><annotation encoding='application/x-tex'>x^2 + y^2 = r^2</annotation></semantics></math>,
|
17
|
+
(<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><mi>x</mi><mo>=</mo><mi>r</mi><mi>cos</mi><mi>θ</mi></mrow><annotation encoding='application/x-tex'>x = r \cos \theta</annotation></semantics></math> and <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><mi>y</mi><mo>=</mo><mi>r</mi><mi>sin</mi><mi>θ</mi></mrow><annotation encoding='application/x-tex'>y = r \sin \theta</annotation></semantics></math>).</p>
|
19
18
|
|
20
19
|
<p>And this is the second
|
21
|
-
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><msup><mi>sin</mi
|
20
|
+
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msup><mi>sin</mi> <mn>2</mn></msup><mi>θ</mi><mo>+</mo><msup><mi>cos</mi> <mn>2</mn></msup><mi>θ</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding='application/x-tex'>\sin^2 \theta + \cos^2 \theta = 1</annotation></semantics></math>.</p>
|
21
|
+
|
22
|
+
<p>日本語の後の数式 <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msubsup><mo lspace="thinmathspace" rspace="thinmathspace">∑</mo> <mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow> <mi>N</mi></msubsup><msub><mi>x</mi> <mi>i</mi></msub></mrow><annotation encoding='application/x-tex'>\sum_{i = 0}^{N} x_i</annotation></semantics></math></p>
|
22
23
|
|
23
|
-
<p
|
24
|
+
<p>Block style</p>
|
24
25
|
|
25
|
-
<
|
26
|
-
<math xmlns='http://www.w3.org/1998/Math/MathML' display='block'><msubsup><mo stretchy='false'>∫</mo><mrow><mo stretchy='false'>-</mo><mn>∞</mn></mrow><mrow><mn>∞</mn></mrow></msubsup><mi>f</mi><mfenced open='(' close=')'><mrow><mi>x</mi></mrow></mfenced><mspace width='0.167em' /><mi>d</mi><mi>x</mi></math></p>
|
26
|
+
<math xmlns='http://www.w3.org/1998/Math/MathML' display='block'><semantics><mrow><msubsup><mo>∫</mo> <mrow><mo lspace="verythinmathspace" rspace="0em">−</mo><mn>∞</mn></mrow> <mn>∞</mn></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mspace width="thinmathspace"/><mi>dx</mi></mrow><annotation encoding='application/x-tex'>\int_{-\infty}^{\infty} f \left( x \right) \, dx</annotation></semantics></math>
|
27
27
|
|
28
|
-
<p>Same equation again <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><msup><mi>sin</mi
|
28
|
+
<p>Same equation again <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><msup><mi>sin</mi> <mn>2</mn></msup><mi>θ</mi><mo>+</mo><msup><mi>cos</mi> <mn>2</mn></msup><mi>θ</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding='application/x-tex'>\sin^2 \theta + \cos^2 \theta = 1</annotation></semantics></math>.</p>
|
29
29
|
|
30
30
|
<p>vector:
|
31
|
-
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><
|
31
|
+
<math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><mover><mi>x</mi><mo stretchy="false">→</mo></mover><mo>+</mo><mover><mi>y</mi><mo stretchy="false">→</mo></mover><mo>=</mo><mover><mi>p</mi><mo stretchy="false">→</mo></mover></mrow><annotation encoding='application/x-tex'>\vec{x} + \vec{y} = \vec{p}</annotation></semantics></math></p>
|
32
32
|
|
33
33
|
<h2 id="markdown">Markdown</h2>
|
34
|
-
|
35
34
|
<p><em>italic</em></p>
|
36
35
|
|
37
|
-
<p><u>underline</u></p>
|
38
|
-
|
39
36
|
<p><strong>bold</strong></p>
|
40
37
|
|
41
38
|
<p><strong><em>bold italic</em></strong></p>
|
42
39
|
|
43
40
|
<h3 id="list">List</h3>
|
44
|
-
|
45
41
|
<ul>
|
46
|
-
<li>item1</li>
|
47
|
-
<li>item2
|
48
|
-
|
49
|
-
<
|
50
|
-
<li>nested item2-
|
51
|
-
|
52
|
-
</
|
42
|
+
<li>item1</li>
|
43
|
+
<li>item2
|
44
|
+
<ul>
|
45
|
+
<li>nested item2-1</li>
|
46
|
+
<li>nested item2-2</li>
|
47
|
+
</ul>
|
48
|
+
</li>
|
53
49
|
</ul>
|
54
50
|
|
55
51
|
<ol>
|
56
|
-
<li>item3</li>
|
57
|
-
<li>item4</li>
|
52
|
+
<li>item3</li>
|
53
|
+
<li>item4</li>
|
58
54
|
</ol>
|
59
55
|
|
60
56
|
<h3 id="quote">Quote</h3>
|
61
|
-
|
62
57
|
<blockquote>
|
63
|
-
<p>quote</p>
|
58
|
+
<p>quote</p>
|
64
59
|
</blockquote>
|
65
60
|
|
66
61
|
<h3 id="table">Table</h3>
|
67
62
|
|
68
|
-
<table
|
69
|
-
<
|
70
|
-
<
|
71
|
-
<th style="text-align:
|
72
|
-
<th style="text-align:
|
73
|
-
</
|
74
|
-
</
|
75
|
-
|
76
|
-
<
|
77
|
-
<
|
78
|
-
<td style="text-align:
|
79
|
-
</
|
80
|
-
</
|
63
|
+
<table>
|
64
|
+
<thead>
|
65
|
+
<tr>
|
66
|
+
<th style="text-align: left">head1</th>
|
67
|
+
<th style="text-align: center">head2</th>
|
68
|
+
<th style="text-align: right">head3</th>
|
69
|
+
</tr>
|
70
|
+
</thead>
|
71
|
+
<tbody>
|
72
|
+
<tr>
|
73
|
+
<td style="text-align: left">item</td>
|
74
|
+
<td style="text-align: center">item</td>
|
75
|
+
<td style="text-align: right">item</td>
|
76
|
+
</tr>
|
77
|
+
</tbody>
|
78
|
+
</table>
|
81
79
|
|
82
80
|
<h3 id="syntax-highlight">Syntax highlight</h3>
|
83
|
-
|
84
|
-
<pre><code class="ruby">a = [1, 2, 3]
|
81
|
+
<pre><code class="language-ruby">a = [1, 2, 3]
|
85
82
|
a.reduce(0, :+)
|
86
83
|
</code></pre>
|
87
84
|
|
88
85
|
<h3 id="link">Link</h3>
|
89
|
-
|
90
86
|
<p><a href="http://google.com">google</a></p>
|
87
|
+
|
91
88
|
<footer>
|
92
89
|
footer test
|
93
90
|
</footer>
|
metadata
CHANGED
@@ -1,51 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mmarkdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroyuki Tanaka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: kramdown
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '3.0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: math_ml
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.14'
|
19
|
+
version: '1.0'
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0
|
26
|
+
version: '1.0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
28
|
+
name: itextomml
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
33
|
version: '1.0'
|
48
|
-
type: :
|
34
|
+
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
@@ -53,42 +39,48 @@ dependencies:
|
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '1.0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
42
|
+
name: nokogiri
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
45
|
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
47
|
+
version: '1.8'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
52
|
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
69
|
-
description:
|
70
|
-
|
71
|
-
|
54
|
+
version: '1.8'
|
55
|
+
description: Kramdown based markdown to HTML tool with math rendering
|
56
|
+
email:
|
57
|
+
- hryktnk@gmail.com
|
72
58
|
executables:
|
73
59
|
- mmarkdown
|
74
60
|
extensions: []
|
75
61
|
extra_rdoc_files: []
|
76
62
|
files:
|
77
63
|
- ".gitignore"
|
64
|
+
- Gemfile
|
78
65
|
- Rakefile
|
79
66
|
- Readme.md
|
80
67
|
- bin/mmarkdown
|
81
68
|
- lib/mmarkdown.rb
|
69
|
+
- lib/mmarkdown/helper.rb
|
70
|
+
- lib/mmarkdown/mmarkdown.rb
|
71
|
+
- lib/mmarkdown/toc_html_converter.rb
|
82
72
|
- lib/mmarkdown/version.rb
|
73
|
+
- mmarkdown.gemspec
|
83
74
|
- test/footer.html
|
84
75
|
- test/test.css
|
85
76
|
- test/test.html
|
86
77
|
- test/test.mmd
|
78
|
+
- test/test_helper.rb
|
87
79
|
- test/test_mmarkdown.rb
|
88
80
|
- test/test_with_title.html
|
89
|
-
homepage:
|
81
|
+
homepage: https://github.com/tanahiro/mmarkdown
|
90
82
|
licenses:
|
91
|
-
- MIT
|
83
|
+
- MIT
|
92
84
|
metadata: {}
|
93
85
|
post_install_message:
|
94
86
|
rdoc_options: []
|
@@ -106,14 +98,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
98
|
version: '0'
|
107
99
|
requirements: []
|
108
100
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.7.6
|
110
102
|
signing_key:
|
111
103
|
specification_version: 4
|
112
|
-
summary:
|
113
|
-
test_files:
|
114
|
-
- test/footer.html
|
115
|
-
- test/test.css
|
116
|
-
- test/test.html
|
117
|
-
- test/test.mmd
|
118
|
-
- test/test_mmarkdown.rb
|
119
|
-
- test/test_with_title.html
|
104
|
+
summary: Kramdown based markdown parser and HTML generator
|
105
|
+
test_files: []
|