bai-maruku 0.5.9
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.
- data/Rakefile +102 -0
- data/bin/marudown +29 -0
- data/bin/maruku +181 -0
- data/bin/marutest +345 -0
- data/bin/marutex +31 -0
- data/docs/changelog.md +334 -0
- data/docs/div_syntax.md +36 -0
- data/docs/entity_test.md +23 -0
- data/docs/markdown_syntax.md +899 -0
- data/docs/maruku.md +346 -0
- data/docs/math.md +194 -0
- data/docs/other_stuff.md +51 -0
- data/docs/proposal.md +309 -0
- data/lib/maruku.rb +141 -0
- data/lib/maruku/attributes.rb +227 -0
- data/lib/maruku/defaults.rb +71 -0
- data/lib/maruku/errors_management.rb +92 -0
- data/lib/maruku/ext/div.rb +133 -0
- data/lib/maruku/ext/math.rb +41 -0
- data/lib/maruku/ext/math/elements.rb +27 -0
- data/lib/maruku/ext/math/latex_fix.rb +12 -0
- data/lib/maruku/ext/math/mathml_engines/blahtex.rb +107 -0
- data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +29 -0
- data/lib/maruku/ext/math/mathml_engines/none.rb +20 -0
- data/lib/maruku/ext/math/mathml_engines/ritex.rb +24 -0
- data/lib/maruku/ext/math/parsing.rb +119 -0
- data/lib/maruku/ext/math/to_html.rb +187 -0
- data/lib/maruku/ext/math/to_latex.rb +26 -0
- data/lib/maruku/helpers.rb +260 -0
- data/lib/maruku/input/charsource.rb +326 -0
- data/lib/maruku/input/extensions.rb +69 -0
- data/lib/maruku/input/html_helper.rb +189 -0
- data/lib/maruku/input/linesource.rb +111 -0
- data/lib/maruku/input/parse_block.rb +614 -0
- data/lib/maruku/input/parse_doc.rb +227 -0
- data/lib/maruku/input/parse_span_better.rb +746 -0
- data/lib/maruku/input/rubypants.rb +225 -0
- data/lib/maruku/input/type_detection.rb +147 -0
- data/lib/maruku/input_textile2/t2_parser.rb +163 -0
- data/lib/maruku/maruku.rb +33 -0
- data/lib/maruku/output/s5/fancy.rb +756 -0
- data/lib/maruku/output/s5/to_s5.rb +138 -0
- data/lib/maruku/output/to_html.rb +991 -0
- data/lib/maruku/output/to_latex.rb +590 -0
- data/lib/maruku/output/to_latex_entities.rb +367 -0
- data/lib/maruku/output/to_latex_strings.rb +64 -0
- data/lib/maruku/output/to_markdown.rb +164 -0
- data/lib/maruku/output/to_s.rb +56 -0
- data/lib/maruku/string_utils.rb +191 -0
- data/lib/maruku/structures.rb +167 -0
- data/lib/maruku/structures_inspect.rb +87 -0
- data/lib/maruku/structures_iterators.rb +61 -0
- data/lib/maruku/tests/benchmark.rb +82 -0
- data/lib/maruku/tests/new_parser.rb +373 -0
- data/lib/maruku/tests/tests.rb +136 -0
- data/lib/maruku/textile2.rb +1 -0
- data/lib/maruku/toc.rb +199 -0
- data/lib/maruku/usage/example1.rb +33 -0
- data/lib/maruku/version.rb +40 -0
- data/maruku.gemspec +32 -0
- data/tests/bugs/code_in_links.md +101 -0
- data/tests/bugs/complex_escaping.md +38 -0
- data/tests/math/syntax.md +46 -0
- data/tests/math_usage/document.md +13 -0
- data/tests/others/abbreviations.md +11 -0
- data/tests/others/blank.md +4 -0
- data/tests/others/code.md +5 -0
- data/tests/others/code2.md +8 -0
- data/tests/others/code3.md +16 -0
- data/tests/others/email.md +4 -0
- data/tests/others/entities.md +19 -0
- data/tests/others/escaping.md +16 -0
- data/tests/others/extra_dl.md +101 -0
- data/tests/others/extra_header_id.md +13 -0
- data/tests/others/extra_table1.md +40 -0
- data/tests/others/footnotes.md +17 -0
- data/tests/others/headers.md +10 -0
- data/tests/others/hrule.md +10 -0
- data/tests/others/images.md +20 -0
- data/tests/others/inline_html.md +42 -0
- data/tests/others/links.md +38 -0
- data/tests/others/list1.md +4 -0
- data/tests/others/list2.md +5 -0
- data/tests/others/list3.md +8 -0
- data/tests/others/lists.md +32 -0
- data/tests/others/lists_after_paragraph.md +44 -0
- data/tests/others/lists_ol.md +39 -0
- data/tests/others/misc_sw.md +105 -0
- data/tests/others/one.md +1 -0
- data/tests/others/paragraphs.md +13 -0
- data/tests/others/sss06.md +352 -0
- data/tests/others/test.md +4 -0
- data/tests/s5/s5profiling.md +48 -0
- data/tests/unittest/abbreviations.md +64 -0
- data/tests/unittest/alt.md +29 -0
- data/tests/unittest/attributes/att2.md +32 -0
- data/tests/unittest/attributes/att3.md +40 -0
- data/tests/unittest/attributes/attributes.md +69 -0
- data/tests/unittest/attributes/circular.md +38 -0
- data/tests/unittest/attributes/default.md +34 -0
- data/tests/unittest/blank.md +36 -0
- data/tests/unittest/blanks_in_code.md +87 -0
- data/tests/unittest/bug_def.md +28 -0
- data/tests/unittest/bug_table.md +58 -0
- data/tests/unittest/code.md +46 -0
- data/tests/unittest/code2.md +40 -0
- data/tests/unittest/code3.md +83 -0
- data/tests/unittest/data_loss.md +37 -0
- data/tests/unittest/divs/div1.md +179 -0
- data/tests/unittest/divs/div2.md +33 -0
- data/tests/unittest/divs/div3_nest.md +57 -0
- data/tests/unittest/easy.md +27 -0
- data/tests/unittest/email.md +32 -0
- data/tests/unittest/encoding/iso-8859-1.md +35 -0
- data/tests/unittest/encoding/utf-8.md +30 -0
- data/tests/unittest/entities.md +106 -0
- data/tests/unittest/escaping.md +79 -0
- data/tests/unittest/extra_dl.md +64 -0
- data/tests/unittest/extra_header_id.md +75 -0
- data/tests/unittest/extra_table1.md +49 -0
- data/tests/unittest/footnotes.md +109 -0
- data/tests/unittest/headers.md +49 -0
- data/tests/unittest/hex_entities.md +49 -0
- data/tests/unittest/hrule.md +51 -0
- data/tests/unittest/html2.md +34 -0
- data/tests/unittest/html3.md +43 -0
- data/tests/unittest/html4.md +37 -0
- data/tests/unittest/html5.md +35 -0
- data/tests/unittest/ie.md +61 -0
- data/tests/unittest/images.md +102 -0
- data/tests/unittest/images2.md +43 -0
- data/tests/unittest/inline_html.md +187 -0
- data/tests/unittest/inline_html2.md +33 -0
- data/tests/unittest/links.md +164 -0
- data/tests/unittest/links2.md +34 -0
- data/tests/unittest/list1.md +58 -0
- data/tests/unittest/list12.md +40 -0
- data/tests/unittest/list2.md +68 -0
- data/tests/unittest/list3.md +76 -0
- data/tests/unittest/list4.md +101 -0
- data/tests/unittest/lists.md +204 -0
- data/tests/unittest/lists10.md +46 -0
- data/tests/unittest/lists11.md +28 -0
- data/tests/unittest/lists6.md +53 -0
- data/tests/unittest/lists9.md +76 -0
- data/tests/unittest/lists_after_paragraph.md +220 -0
- data/tests/unittest/lists_ol.md +274 -0
- data/tests/unittest/loss.md +28 -0
- data/tests/unittest/math/equations.md +86 -0
- data/tests/unittest/math/inline.md +58 -0
- data/tests/unittest/math/math2.md +88 -0
- data/tests/unittest/math/notmath.md +37 -0
- data/tests/unittest/math/table.md +52 -0
- data/tests/unittest/math/table2.md +54 -0
- data/tests/unittest/misc_sw.md +537 -0
- data/tests/unittest/notyet/escape.md +33 -0
- data/tests/unittest/notyet/header_after_par.md +70 -0
- data/tests/unittest/notyet/ticks.md +30 -0
- data/tests/unittest/notyet/triggering.md +169 -0
- data/tests/unittest/olist.md +57 -0
- data/tests/unittest/one.md +27 -0
- data/tests/unittest/paragraph.md +28 -0
- data/tests/unittest/paragraph_rules/dont_merge_ref.md +54 -0
- data/tests/unittest/paragraph_rules/tab_is_blank.md +36 -0
- data/tests/unittest/paragraphs.md +58 -0
- data/tests/unittest/pending/amps.md +27 -0
- data/tests/unittest/pending/empty_cells.md +49 -0
- data/tests/unittest/pending/link.md +84 -0
- data/tests/unittest/pending/ref.md +33 -0
- data/tests/unittest/recover/recover_links.md +27 -0
- data/tests/unittest/red_tests/abbrev.md +1388 -0
- data/tests/unittest/red_tests/lists7.md +68 -0
- data/tests/unittest/red_tests/lists7b.md +128 -0
- data/tests/unittest/red_tests/lists8.md +76 -0
- data/tests/unittest/references/long_example.md +83 -0
- data/tests/unittest/references/spaces_and_numbers.md +27 -0
- data/tests/unittest/smartypants.md +126 -0
- data/tests/unittest/syntax_hl.md +64 -0
- data/tests/unittest/table_attributes.md +46 -0
- data/tests/unittest/test.md +31 -0
- data/tests/unittest/underscore_in_words.md +27 -0
- data/tests/unittest/wrapping.md +79 -0
- data/tests/unittest/xml.md +45 -0
- data/tests/unittest/xml2.md +31 -0
- data/tests/unittest/xml3.md +38 -0
- data/tests/unittest/xml_instruction.md +64 -0
- data/tests/utf8-files/simple.md +1 -0
- data/unit_test_block.sh +5 -0
- data/unit_test_span.sh +3 -0
- metadata +251 -0
data/Rakefile
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
Gem::manage_gems
|
|
3
|
+
require 'rake/gempackagetask'
|
|
4
|
+
|
|
5
|
+
require 'lib/maruku/version'
|
|
6
|
+
spec = Gem::Specification.new do |s|
|
|
7
|
+
s.name = 'maruku'
|
|
8
|
+
s.version = MaRuKu::Version
|
|
9
|
+
s.summary = "Maruku is a Markdown-superset interpreter written in Ruby."
|
|
10
|
+
s.description = %{Maruku is a Markdown interpreter in Ruby.
|
|
11
|
+
It features native export to HTML and PDF (via Latex). The
|
|
12
|
+
output is really beautiful!
|
|
13
|
+
}
|
|
14
|
+
s.files = Dir['lib/**/*.rb'] + Dir['lib/*.rb'] +
|
|
15
|
+
Dir['docs/*.md'] + Dir['docs/*.html'] +
|
|
16
|
+
Dir['tests/**/*.md'] +
|
|
17
|
+
Dir['bin/*'] + Dir['*.sh'] + ['Rakefile', 'maruku.gemspec']
|
|
18
|
+
|
|
19
|
+
s.bindir = 'bin'
|
|
20
|
+
s.executables = ['maruku','marutex']
|
|
21
|
+
|
|
22
|
+
s.require_path = 'lib'
|
|
23
|
+
s.autorequire = 'maruku'
|
|
24
|
+
|
|
25
|
+
s.add_dependency('syntax', '>= 1.0.0')
|
|
26
|
+
|
|
27
|
+
s.author = "Andrea Censi"
|
|
28
|
+
s.email = "andrea@rubyforge.org"
|
|
29
|
+
s.homepage = "http://maruku.rubyforge.org"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
task :default => [:package]
|
|
33
|
+
|
|
34
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
|
35
|
+
pkg.need_zip = true
|
|
36
|
+
pkg.need_tar = true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
PKG_NAME = 'maruku'
|
|
40
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{MaRuKu::Version}"
|
|
41
|
+
RUBY_FORGE_PROJECT = PKG_NAME
|
|
42
|
+
RUBY_FORGE_USER = 'andrea'
|
|
43
|
+
|
|
44
|
+
RELEASE_NAME = MaRuKu::Version
|
|
45
|
+
RUBY_FORGE_GROUPID = '2795'
|
|
46
|
+
RUBY_FORGE_PACKAGEID = '3292'
|
|
47
|
+
|
|
48
|
+
desc "Publish the release files to RubyForge."
|
|
49
|
+
task :release => [:gem, :package] do
|
|
50
|
+
system("rubyforge login --username #{RUBY_FORGE_USER}")
|
|
51
|
+
|
|
52
|
+
gem = "pkg/#{PKG_FILE_NAME}.gem"
|
|
53
|
+
# -n notes/#{Maruku::Version}.txt
|
|
54
|
+
cmd = "rubyforge add_release %s %s \"%s\" %s" %
|
|
55
|
+
[RUBY_FORGE_GROUPID, RUBY_FORGE_PACKAGEID, RELEASE_NAME, gem]
|
|
56
|
+
|
|
57
|
+
puts cmd
|
|
58
|
+
system(cmd)
|
|
59
|
+
|
|
60
|
+
files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
|
|
61
|
+
files.each do |file|
|
|
62
|
+
# system("rubyforge add_file %s %s %s %s" %
|
|
63
|
+
# [RUBY_FORGE_GROUPID, RUBY_FORGE_PACKAGEID, RELEASE_NAME, file])
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
task :test => [:markdown_span_tests, :markdown_block_tests]
|
|
68
|
+
|
|
69
|
+
task :markdown_block_tests do
|
|
70
|
+
tests = Dir['tests/unittest/**/*.md'].join(' ')
|
|
71
|
+
puts "Executing tests #{tests}"
|
|
72
|
+
# ok = marutest(tests)
|
|
73
|
+
ok = system "ruby -Ilib bin/marutest #{tests}"
|
|
74
|
+
raise "Failed block unittest" if not ok
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
task :markdown_span_tests do
|
|
78
|
+
ok = system( "ruby -Ilib lib/maruku/tests/new_parser.rb v b")
|
|
79
|
+
raise "Failed span unittest" if not ok
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
require 'rake/rdoctask'
|
|
83
|
+
|
|
84
|
+
Rake::RDocTask.new do |rdoc|
|
|
85
|
+
files = [#'README', 'LICENSE', 'COPYING',
|
|
86
|
+
'lib/**/*.rb',
|
|
87
|
+
'rdoc/*.rdoc'#, 'test/*.rb'
|
|
88
|
+
]
|
|
89
|
+
rdoc.rdoc_files.add(files)
|
|
90
|
+
rdoc.main = "rdoc/main.rdoc" # page to start on
|
|
91
|
+
rdoc.title = "Maruku Documentation"
|
|
92
|
+
rdoc.template = "jamis.rb"
|
|
93
|
+
rdoc.rdoc_dir = 'doc' # rdoc output folder
|
|
94
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
desc "Generate a gemspec file for GitHub"
|
|
98
|
+
task :gemspec do
|
|
99
|
+
File.open("#{spec.name}.gemspec", 'w') do |f|
|
|
100
|
+
f.write spec.to_ruby
|
|
101
|
+
end
|
|
102
|
+
end
|
data/bin/marudown
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'maruku'
|
|
4
|
+
|
|
5
|
+
# If we are given filenames, convert each file
|
|
6
|
+
if not ARGV.empty?
|
|
7
|
+
ARGV.each do |f|
|
|
8
|
+
puts "Opening #{f}"
|
|
9
|
+
|
|
10
|
+
# read file content
|
|
11
|
+
input = File.open(f,'r').read
|
|
12
|
+
|
|
13
|
+
# create Maruku
|
|
14
|
+
doc = Maruku.new(input, {:on_error=>:warning})
|
|
15
|
+
# convert to a complete html document
|
|
16
|
+
output = doc.to_md
|
|
17
|
+
|
|
18
|
+
# write to file
|
|
19
|
+
dir = File.dirname(f)
|
|
20
|
+
filename = File.basename(f, File.extname(f)) + ".txt"
|
|
21
|
+
|
|
22
|
+
output = File.join(dir, filename)
|
|
23
|
+
File.open(output,'w') do |f| f.puts html end
|
|
24
|
+
end
|
|
25
|
+
else
|
|
26
|
+
# else, act as a filter
|
|
27
|
+
data = $stdin.read
|
|
28
|
+
puts Maruku.new(data, {:on_error=>:warning}).to_md
|
|
29
|
+
end
|
data/bin/maruku
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'maruku'
|
|
4
|
+
require 'optparse'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def cli_puts(s)
|
|
8
|
+
$stderr.puts(s) if MaRuKu::Globals[:verbose]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export = :html
|
|
13
|
+
break_on_error = false
|
|
14
|
+
using_math = false
|
|
15
|
+
using_mathml = false
|
|
16
|
+
output_file = nil
|
|
17
|
+
|
|
18
|
+
opt = OptionParser.new do |opts|
|
|
19
|
+
opts.banner = "Usage: maruku [options] [file1.md [file2.md ..."
|
|
20
|
+
|
|
21
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
|
22
|
+
MaRuKu::Globals[:verbose] = v end
|
|
23
|
+
opts.on("-u", "--[no-]unsafe", "Use unsafe features") do |v|
|
|
24
|
+
MaRuKu::Globals[:unsafe_features] = v end
|
|
25
|
+
|
|
26
|
+
opts.on("-b", "Break on error") do |v|
|
|
27
|
+
break_on_error = true end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
opts.on("-i", "--math-images ENGINE", "Uses ENGINE to render TeX to PNG.") do |s|
|
|
31
|
+
using_math = true
|
|
32
|
+
MaRuKu::Globals[:html_math_output_png] = true
|
|
33
|
+
MaRuKu::Globals[:html_math_output_mathml] = false
|
|
34
|
+
MaRuKu::Globals[:html_png_engine] = s
|
|
35
|
+
cli_puts "Using png engine #{s}."
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
opts.on("-m", "--math-engine ENGINE", "Uses ENGINE to render MathML") do |s|
|
|
39
|
+
MaRuKu::Globals[:html_math_output_png] = false
|
|
40
|
+
MaRuKu::Globals[:html_math_output_mathml] = true
|
|
41
|
+
using_math = true
|
|
42
|
+
using_mathml = true
|
|
43
|
+
MaRuKu::Globals[:html_math_engine] = s
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
opts.on("-o", "--output FILE", "Output filename") do |s|
|
|
47
|
+
output_file = s
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
opts.on_tail("--pdf", "Write PDF","First writes LaTeX, then calls pdflatex." ) do export = :pdf end
|
|
51
|
+
opts.on_tail("--s5", "Write S5 slideshow") do export = :s5 end
|
|
52
|
+
opts.on_tail("--html", "Write HTML") do export = :html end
|
|
53
|
+
opts.on_tail("--html-frag", "Write the contents of the BODY.") do export = :html_frag end
|
|
54
|
+
opts.on_tail("--tex", "Write LaTeX" ) do export = :tex end
|
|
55
|
+
opts.on_tail("--inspect", "Shows the parsing result" ) do export = :inspect end
|
|
56
|
+
|
|
57
|
+
opts.on_tail("--version", "Show version") do
|
|
58
|
+
puts "Maruku #{MaRuKu::Version}"; exit
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
opts.on_tail("--ext EXTENSIONS", "Use maruku extensions (comma separated)" ) do |s|
|
|
62
|
+
s.split(",").each do |e| require "maruku/ext/#{e}"; end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
|
66
|
+
puts opts
|
|
67
|
+
exit
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
begin
|
|
73
|
+
opt.parse!
|
|
74
|
+
rescue OptionParser::InvalidOption=>e
|
|
75
|
+
$stderr.puts e
|
|
76
|
+
$stderr.puts opt
|
|
77
|
+
exit
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
if using_math
|
|
82
|
+
cli_puts "Using Math extensions."
|
|
83
|
+
require 'maruku/ext/math'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
#p ARGV
|
|
87
|
+
#p MaRuKu::Globals
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
inputs =
|
|
91
|
+
# If we are given filenames, convert each file
|
|
92
|
+
if not ARGV.empty?
|
|
93
|
+
ARGV.map do |f|
|
|
94
|
+
# read file content
|
|
95
|
+
cli_puts "Reading from file #{f.inspect}."
|
|
96
|
+
[f, File.open(f,'r').read]
|
|
97
|
+
end
|
|
98
|
+
else
|
|
99
|
+
export = :html_frag if export == :html
|
|
100
|
+
export = :tex_frag if export == :tex
|
|
101
|
+
|
|
102
|
+
cli_puts "Reading from standard input."
|
|
103
|
+
[[nil, $stdin.read]]
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
inputs.each do |f, input|
|
|
107
|
+
|
|
108
|
+
# create Maruku
|
|
109
|
+
params = {}
|
|
110
|
+
params[:on_error] = break_on_error ? :raise : :warning
|
|
111
|
+
|
|
112
|
+
t = Time.now
|
|
113
|
+
doc = Maruku.new(input, params)
|
|
114
|
+
|
|
115
|
+
cli_puts ("Parsing in %.2f seconds." % (Time.now-t))
|
|
116
|
+
|
|
117
|
+
out=""; suffix = "?"
|
|
118
|
+
t = Time.now
|
|
119
|
+
case export
|
|
120
|
+
when :html
|
|
121
|
+
suffix = using_mathml ? '.xhtml' : '.html'
|
|
122
|
+
out = doc.to_html_document( {:indent => -1})
|
|
123
|
+
when :html_frag
|
|
124
|
+
suffix='.html_frag'
|
|
125
|
+
out = doc.to_html( {:indent => -1})
|
|
126
|
+
when :pdf, :tex
|
|
127
|
+
suffix='.tex'
|
|
128
|
+
out = doc.to_latex_document
|
|
129
|
+
when :tex_frag
|
|
130
|
+
suffix='.tex_frag'
|
|
131
|
+
out = doc.to_latex
|
|
132
|
+
when :inspect
|
|
133
|
+
suffix='.txt'
|
|
134
|
+
out = doc.inspect
|
|
135
|
+
when :markdown
|
|
136
|
+
suffix='.pretty_md'
|
|
137
|
+
out = doc.to_markdown
|
|
138
|
+
when :s5
|
|
139
|
+
suffix='_s5slides.html'
|
|
140
|
+
out = doc.to_s5({:content_only => false})
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
cli_puts("Rendering in %.2f seconds." % (Time.now-t))
|
|
144
|
+
|
|
145
|
+
# write to file or stdout
|
|
146
|
+
if f
|
|
147
|
+
|
|
148
|
+
if not output_file
|
|
149
|
+
dir = File.dirname(f)
|
|
150
|
+
job = File.join(dir, File.basename(f, File.extname(f)))
|
|
151
|
+
output_file = job + suffix
|
|
152
|
+
else
|
|
153
|
+
job = File.basename(output_file, File.extname(output_file))
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
if output_file == "-"
|
|
157
|
+
cli_puts "Writing to standard output"
|
|
158
|
+
$stdout.puts out
|
|
159
|
+
else
|
|
160
|
+
|
|
161
|
+
if not (export == :pdf)
|
|
162
|
+
cli_puts "Writing to #{output_file}"
|
|
163
|
+
File.open(output_file,'w') do |f| f.puts out end
|
|
164
|
+
else
|
|
165
|
+
cli_puts "Writing to #{job}.tex"
|
|
166
|
+
File.open("#{job}.tex",'w') do |f| f.puts out end
|
|
167
|
+
cmd = "pdflatex '#{job}.tex' -interaction=nonstopmode "+
|
|
168
|
+
"'-output-directory=#{dir}' "
|
|
169
|
+
cli_puts "maruku: executing $ #{cmd}"
|
|
170
|
+
# run twice for cross references
|
|
171
|
+
system cmd
|
|
172
|
+
system cmd
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
end
|
|
176
|
+
else # write to stdout
|
|
177
|
+
cli_puts "Writing to standard output"
|
|
178
|
+
$stdout.puts out
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
data/bin/marutest
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'maruku'
|
|
4
|
+
require 'maruku/textile2'
|
|
5
|
+
|
|
6
|
+
$marutest_language = :markdown
|
|
7
|
+
|
|
8
|
+
#MARKER = "\n***EOF***\n"
|
|
9
|
+
SPLIT = %r{\n\*\*\*[^\*]+\*\*\*\n}m
|
|
10
|
+
|
|
11
|
+
def marker(x)
|
|
12
|
+
"\n*** Output of #{x} ***\n"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def write_lines(i, j, lines, prefix, i_star)
|
|
16
|
+
i = [i, 0].max
|
|
17
|
+
j = [j, lines.size-1].min
|
|
18
|
+
for a in i..j
|
|
19
|
+
l = lines[a].gsub(/\t/,' ')
|
|
20
|
+
puts( ("%s %3d" % [prefix, a]) +
|
|
21
|
+
(a==i_star ? " -->" : " ")+lines[a])
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# a = expected b = found
|
|
26
|
+
def equals(a, b)
|
|
27
|
+
a = a.split("\n")
|
|
28
|
+
b = b.split("\n")
|
|
29
|
+
|
|
30
|
+
for i in 0..([a.size-1,b.size-1].max)
|
|
31
|
+
la = a[i]
|
|
32
|
+
lb = b[i]
|
|
33
|
+
if la != lb
|
|
34
|
+
puts "\n"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
write_lines(i-3, i+3, a, "expected", i )
|
|
38
|
+
write_lines(i-3, i+3, b, " found", i )
|
|
39
|
+
return false
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
return true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
TOTEST = [:inspect,:to_html,:to_latex,:to_md,:to_s]
|
|
46
|
+
|
|
47
|
+
def run_test(filename, its_ok, verbose=true)
|
|
48
|
+
# read file content
|
|
49
|
+
input = (f=File.open(filename,'r')).read; f.close
|
|
50
|
+
|
|
51
|
+
output_html = File.join(File.dirname(filename),
|
|
52
|
+
File.basename(filename, File.extname(filename)) + ".html")
|
|
53
|
+
|
|
54
|
+
# split the input in sections
|
|
55
|
+
|
|
56
|
+
stuff = input.split(SPLIT)
|
|
57
|
+
if stuff.size == 1
|
|
58
|
+
stuff[2] = stuff[0]
|
|
59
|
+
stuff[0] = "Write a comment here"
|
|
60
|
+
stuff[1] = "{} # params "
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
comment = stuff.shift
|
|
64
|
+
params_s = stuff.shift
|
|
65
|
+
|
|
66
|
+
params = eval(params_s||'{}')
|
|
67
|
+
if params == nil
|
|
68
|
+
raise "Null params? #{params_s.inspect}"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
markdown = stuff.shift
|
|
72
|
+
|
|
73
|
+
# puts "comment: #{markdown.inspect}"
|
|
74
|
+
# puts "markdown: #{markdown.inspect}"
|
|
75
|
+
|
|
76
|
+
failed = []
|
|
77
|
+
relaxed = []
|
|
78
|
+
crashed = []
|
|
79
|
+
actual = {}
|
|
80
|
+
|
|
81
|
+
doc =
|
|
82
|
+
if $marutest_language == :markdown
|
|
83
|
+
Maruku.new(markdown, params)
|
|
84
|
+
else
|
|
85
|
+
MaRuKu.textile2(markdown, params)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
for s in TOTEST
|
|
89
|
+
begin
|
|
90
|
+
if s==:to_html
|
|
91
|
+
actual[s] = doc.to_html
|
|
92
|
+
else
|
|
93
|
+
actual[s] = doc.send s
|
|
94
|
+
raise "Methods #{s} gave nil" if not actual[s]
|
|
95
|
+
end
|
|
96
|
+
rescue Exception => e
|
|
97
|
+
crashed << s
|
|
98
|
+
actual[s] = e.inspect+ "\n"+ e.backtrace.join("\n")
|
|
99
|
+
puts actual[s]
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
File.open(output_html, 'w') do |f|
|
|
104
|
+
f.write doc.to_html_document
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
begin
|
|
108
|
+
m = Maruku.new
|
|
109
|
+
d = m.instance_eval(actual[:inspect])
|
|
110
|
+
rescue Exception => e
|
|
111
|
+
s = e.inspect + e.backtrace.join("\n")
|
|
112
|
+
raise "Inspect is not correct:\n ========\n#{actual[:inspect]}"+
|
|
113
|
+
"============\n #{s}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
expected = {}
|
|
117
|
+
if (stuff.size < TOTEST.size)
|
|
118
|
+
$stdout.write " (first time!) "
|
|
119
|
+
TOTEST.each do |x| expected[x] = actual[x] end
|
|
120
|
+
else
|
|
121
|
+
TOTEST.each_index do |i|
|
|
122
|
+
symbol = TOTEST[i]
|
|
123
|
+
expected[symbol] = stuff[i]
|
|
124
|
+
# puts "symbol: #{symbol.inspect} = #{stuff[i].inspect}"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
m = Maruku.new
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
if not its_ok.include? :inspect
|
|
132
|
+
begin
|
|
133
|
+
d = m.instance_eval(expected[:inspect])
|
|
134
|
+
# puts "Eval: #{d.inspect}"
|
|
135
|
+
expected[:inspect] = d.inspect
|
|
136
|
+
rescue Exception => e
|
|
137
|
+
s = e.inspect + e.backtrace.join("\n")
|
|
138
|
+
raise "Cannot eval user-provided string:\n #{expected[:inspect].to_s}"+
|
|
139
|
+
"\n #{s}"
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# m.instance_eval(actual[:inspect]) != m.instance_eval(expected[:inspect])
|
|
144
|
+
|
|
145
|
+
# actual[:inspect] = m.instance_eval(actual[:inspect])
|
|
146
|
+
# expected[:inspect] = m.instance_eval(expected[:inspect])
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
TOTEST.each do |x|
|
|
150
|
+
expected[x].strip!
|
|
151
|
+
actual[x].strip!
|
|
152
|
+
if not equals(expected[x], actual[x])
|
|
153
|
+
if its_ok.include? x
|
|
154
|
+
expected[x] = actual[x]
|
|
155
|
+
$stdout.write " relax:#{x} "
|
|
156
|
+
relaxed << x
|
|
157
|
+
else
|
|
158
|
+
actual[x] = "-----| WARNING | -----\n" + actual[x].to_s
|
|
159
|
+
failed << x
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
f = File.open(filename, 'w')
|
|
165
|
+
|
|
166
|
+
f.write comment
|
|
167
|
+
f.write "\n*** Parameters: ***\n"
|
|
168
|
+
f.write params_s
|
|
169
|
+
f.write "\n*** Markdown input: ***\n"
|
|
170
|
+
f.write markdown
|
|
171
|
+
|
|
172
|
+
TOTEST.each do |x|
|
|
173
|
+
f.write marker(x)
|
|
174
|
+
f.write expected[x]
|
|
175
|
+
end
|
|
176
|
+
f.write "\n*** EOF ***\n"
|
|
177
|
+
|
|
178
|
+
if not failed.empty? or not crashed.empty?
|
|
179
|
+
|
|
180
|
+
f.puts "\n\n\n\nFailed tests: #{failed.inspect} \n"
|
|
181
|
+
|
|
182
|
+
TOTEST.each do |x|
|
|
183
|
+
f.write marker(x)
|
|
184
|
+
f.write actual[x]
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
else
|
|
188
|
+
f.puts "\n\n\n\tOK!\n\n\n"
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
if false
|
|
193
|
+
md_pl = markdown_pl(markdown)
|
|
194
|
+
|
|
195
|
+
f.write "\n*** Output of Markdown.pl ***\n"
|
|
196
|
+
f.write md_pl
|
|
197
|
+
|
|
198
|
+
f.write "\n*** Output of Markdown.pl (parsed) ***\n"
|
|
199
|
+
begin
|
|
200
|
+
doc = REXML::Document.new("<div>#{md_pl}</div>",{
|
|
201
|
+
:compress_whitespace=>['div','p'],
|
|
202
|
+
:ignore_whitespace_nodes=>['div','p'],
|
|
203
|
+
:respect_whitespace=>['pre','code']
|
|
204
|
+
})
|
|
205
|
+
div = doc.root
|
|
206
|
+
xml =""
|
|
207
|
+
div.write_children(xml,indent=1,transitive=true,ie_hack=false)
|
|
208
|
+
f.write xml
|
|
209
|
+
rescue Exception=>e
|
|
210
|
+
f.puts "Error: #{e.inspect}"
|
|
211
|
+
end
|
|
212
|
+
f.close
|
|
213
|
+
else
|
|
214
|
+
f.write "\n*** Output of Markdown.pl ***\n"
|
|
215
|
+
f.write "(not used anymore)"
|
|
216
|
+
|
|
217
|
+
f.write "\n*** Output of Markdown.pl (parsed) ***\n"
|
|
218
|
+
f.write "(not used anymore)"
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
return failed, relaxed, crashed
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def markdown_pl(markdown)
|
|
225
|
+
tmp1 = "/tmp/marutest1"
|
|
226
|
+
tmp2 = "/tmp/marutest2"
|
|
227
|
+
File.open(tmp1,'w') do |f| f.puts markdown end
|
|
228
|
+
system "Markdown.pl < #{tmp1} > #{tmp2}"
|
|
229
|
+
f = File.open(tmp2,'r')
|
|
230
|
+
s = f.read
|
|
231
|
+
f.close
|
|
232
|
+
s
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def passed?(args, arg)
|
|
236
|
+
if args.include? arg
|
|
237
|
+
args.delete arg
|
|
238
|
+
true
|
|
239
|
+
else
|
|
240
|
+
false
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def marutest(args)
|
|
245
|
+
dont_worry = []
|
|
246
|
+
TOTEST.each do |x|
|
|
247
|
+
arg = "ok:#{x}"
|
|
248
|
+
# puts arg
|
|
249
|
+
if passed?(args, arg)
|
|
250
|
+
dont_worry << x
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
if passed?(args, 'ok')
|
|
255
|
+
dont_worry = TOTEST.clone
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
if dont_worry.size > 0
|
|
259
|
+
puts "Relaxed on #{dont_worry.inspect}"
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
failed = {}
|
|
264
|
+
relaxed = {}
|
|
265
|
+
|
|
266
|
+
args.each do |f|
|
|
267
|
+
$stdout.write f + ' '*(50-f.size) + " "
|
|
268
|
+
$stdout.flush
|
|
269
|
+
tf, tr, tcrashed = run_test(f, dont_worry)
|
|
270
|
+
|
|
271
|
+
tf = tf + tcrashed
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
if tr.size > 0
|
|
275
|
+
$stdout.write " relax #{tr.inspect} "
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
if tf.size>0
|
|
279
|
+
$stdout.write " failed on #{tf.inspect} "
|
|
280
|
+
else
|
|
281
|
+
$stdout.write " OK "
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
if tcrashed.size > 0
|
|
285
|
+
$stdout.write " CRASHED on #{tcrashed.inspect}"
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
$stdout.write "\n"
|
|
289
|
+
|
|
290
|
+
failed[f] = tf
|
|
291
|
+
relaxed[f] = tr
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
num_failed = 0
|
|
295
|
+
failed_cat = {}
|
|
296
|
+
|
|
297
|
+
puts "\n\n\n**** FINAL REPORT ****\n\n"
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
if failed.size > 0
|
|
301
|
+
failed.each do |file, fl|
|
|
302
|
+
num_failed += fl.size
|
|
303
|
+
if fl.size > 0
|
|
304
|
+
puts "\t#{file}\tfailed on #{fl.inspect}"
|
|
305
|
+
end
|
|
306
|
+
fl.each do |x|
|
|
307
|
+
failed_cat[x] = failed_cat[x] || 0
|
|
308
|
+
failed_cat[x] = failed_cat[x] + 1
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
if dont_worry.size > 0
|
|
314
|
+
puts "Relaxed on #{dont_worry.inspect}"
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
if relaxed.size > 0
|
|
318
|
+
relaxed.each do |file, r|
|
|
319
|
+
if r.size > 0
|
|
320
|
+
puts "\t#{file}\t\trelaxed on #{r.inspect}"
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
if failed_cat.size > 0
|
|
326
|
+
puts "\nCategories:\n"
|
|
327
|
+
|
|
328
|
+
failed_cat.each do |x, num|
|
|
329
|
+
puts "\t#{x.inspect} \tfailed #{num}/#{args.size}"
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
return num_failed == 0
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
if File.basename(__FILE__) == 'marutest'
|
|
337
|
+
if ARGV.empty?
|
|
338
|
+
puts "marutest is a tool for running Maruku's unittest."
|
|
339
|
+
exit 1
|
|
340
|
+
end
|
|
341
|
+
ok = marutest(ARGV.clone)
|
|
342
|
+
|
|
343
|
+
exit ok ? 0 : -1
|
|
344
|
+
end
|
|
345
|
+
|