patcito-maruku 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. data/AUTHORS +23 -0
  2. data/LICENSE +340 -0
  3. data/README.md +73 -0
  4. data/bin/maruku +196 -0
  5. data/bin/marutex +4 -0
  6. data/data/entities.xml +261 -0
  7. data/docs/changelog.md +334 -0
  8. data/docs/div_syntax.md +36 -0
  9. data/docs/entity_test.md +23 -0
  10. data/docs/markdown_syntax.md +899 -0
  11. data/docs/maruku.md +346 -0
  12. data/docs/math.md +194 -0
  13. data/docs/other_stuff.md +51 -0
  14. data/docs/proposal.md +309 -0
  15. data/docs/website/src/bluecloth.md +25 -0
  16. data/docs/website/src/download.md +31 -0
  17. data/docs/website/src/maruku.md +261 -0
  18. data/docs/website/src/proposal.md +271 -0
  19. data/lib/maruku.rb +132 -0
  20. data/lib/maruku/attributes.rb +138 -0
  21. data/lib/maruku/defaults.rb +69 -0
  22. data/lib/maruku/errors.rb +89 -0
  23. data/lib/maruku/ext/div.rb +121 -0
  24. data/lib/maruku/ext/fenced_code.rb +78 -0
  25. data/lib/maruku/ext/math.rb +37 -0
  26. data/lib/maruku/ext/math/elements.rb +21 -0
  27. data/lib/maruku/ext/math/latex_fix.rb +12 -0
  28. data/lib/maruku/ext/math/mathml_engines/blahtex.rb +93 -0
  29. data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +39 -0
  30. data/lib/maruku/ext/math/mathml_engines/none.rb +21 -0
  31. data/lib/maruku/ext/math/mathml_engines/ritex.rb +24 -0
  32. data/lib/maruku/ext/math/parsing.rb +125 -0
  33. data/lib/maruku/ext/math/to_html.rb +237 -0
  34. data/lib/maruku/ext/math/to_latex.rb +36 -0
  35. data/lib/maruku/ext/yaml.rb +43 -0
  36. data/lib/maruku/helpers.rb +214 -0
  37. data/lib/maruku/input/charsource.rb +326 -0
  38. data/lib/maruku/input/extensions.rb +69 -0
  39. data/lib/maruku/input/html_helper.rb +189 -0
  40. data/lib/maruku/input/linesource.rb +111 -0
  41. data/lib/maruku/input/parse_block.rb +608 -0
  42. data/lib/maruku/input/parse_doc.rb +240 -0
  43. data/lib/maruku/input/parse_span_better.rb +746 -0
  44. data/lib/maruku/input/rubypants.rb +225 -0
  45. data/lib/maruku/input/type_detection.rb +147 -0
  46. data/lib/maruku/input_textile2/t2_parser.rb +163 -0
  47. data/lib/maruku/maruku.rb +31 -0
  48. data/lib/maruku/output/s5/fancy.rb +756 -0
  49. data/lib/maruku/output/s5/to_s5.rb +138 -0
  50. data/lib/maruku/output/to_html.rb +994 -0
  51. data/lib/maruku/output/to_latex.rb +580 -0
  52. data/lib/maruku/output/to_latex_entities.rb +101 -0
  53. data/lib/maruku/output/to_latex_strings.rb +64 -0
  54. data/lib/maruku/output/to_markdown.rb +164 -0
  55. data/lib/maruku/output/to_s.rb +54 -0
  56. data/lib/maruku/string_utils.rb +185 -0
  57. data/lib/maruku/structures.rb +143 -0
  58. data/lib/maruku/structures_inspect.rb +51 -0
  59. data/lib/maruku/structures_iterators.rb +48 -0
  60. data/lib/maruku/textile2.rb +1 -0
  61. data/lib/maruku/toc.rb +214 -0
  62. data/lib/maruku/usage/example1.rb +33 -0
  63. data/lib/maruku/version +0 -0
  64. data/lib/maruku/version.rb +54 -0
  65. data/spec/block_docs/abbreviations.md +52 -0
  66. data/spec/block_docs/alt.md +17 -0
  67. data/spec/block_docs/attributes/att2.md +20 -0
  68. data/spec/block_docs/attributes/att3.md +28 -0
  69. data/spec/block_docs/attributes/attributes.md +57 -0
  70. data/spec/block_docs/attributes/circular.md +26 -0
  71. data/spec/block_docs/attributes/default.md +22 -0
  72. data/spec/block_docs/blank.md +24 -0
  73. data/spec/block_docs/blanks_in_code.md +75 -0
  74. data/spec/block_docs/bug_def.md +16 -0
  75. data/spec/block_docs/bug_table.md +46 -0
  76. data/spec/block_docs/code.md +34 -0
  77. data/spec/block_docs/code2.md +28 -0
  78. data/spec/block_docs/code3.md +71 -0
  79. data/spec/block_docs/data_loss.md +25 -0
  80. data/spec/block_docs/divs/div1.md +167 -0
  81. data/spec/block_docs/divs/div2.md +21 -0
  82. data/spec/block_docs/divs/div3_nest.md +45 -0
  83. data/spec/block_docs/easy.md +15 -0
  84. data/spec/block_docs/email.md +20 -0
  85. data/spec/block_docs/encoding/iso-8859-1.md +23 -0
  86. data/spec/block_docs/encoding/utf-8.md +18 -0
  87. data/spec/block_docs/entities.md +94 -0
  88. data/spec/block_docs/escaping.md +67 -0
  89. data/spec/block_docs/extra_dl.md +52 -0
  90. data/spec/block_docs/extra_header_id.md +63 -0
  91. data/spec/block_docs/extra_table1.md +37 -0
  92. data/spec/block_docs/footnotes.md +97 -0
  93. data/spec/block_docs/headers.md +37 -0
  94. data/spec/block_docs/hex_entities.md +37 -0
  95. data/spec/block_docs/hrule.md +39 -0
  96. data/spec/block_docs/html2.md +22 -0
  97. data/spec/block_docs/html3.md +31 -0
  98. data/spec/block_docs/html4.md +25 -0
  99. data/spec/block_docs/html5.md +23 -0
  100. data/spec/block_docs/ie.md +49 -0
  101. data/spec/block_docs/images.md +90 -0
  102. data/spec/block_docs/images2.md +31 -0
  103. data/spec/block_docs/inline_html.md +152 -0
  104. data/spec/block_docs/inline_html2.md +21 -0
  105. data/spec/block_docs/links.md +152 -0
  106. data/spec/block_docs/links2.md +22 -0
  107. data/spec/block_docs/list1.md +46 -0
  108. data/spec/block_docs/list12.md +28 -0
  109. data/spec/block_docs/list2.md +56 -0
  110. data/spec/block_docs/list3.md +64 -0
  111. data/spec/block_docs/list4.md +89 -0
  112. data/spec/block_docs/lists.md +192 -0
  113. data/spec/block_docs/lists10.md +34 -0
  114. data/spec/block_docs/lists11.md +23 -0
  115. data/spec/block_docs/lists6.md +41 -0
  116. data/spec/block_docs/lists9.md +64 -0
  117. data/spec/block_docs/lists_after_paragraph.md +208 -0
  118. data/spec/block_docs/lists_ol.md +262 -0
  119. data/spec/block_docs/loss.md +16 -0
  120. data/spec/block_docs/math/equations.md +45 -0
  121. data/spec/block_docs/math/inline.md +46 -0
  122. data/spec/block_docs/math/math2.md +45 -0
  123. data/spec/block_docs/math/notmath.md +25 -0
  124. data/spec/block_docs/math/table.md +25 -0
  125. data/spec/block_docs/math/table2.md +42 -0
  126. data/spec/block_docs/misc_sw.md +525 -0
  127. data/spec/block_docs/notyet/escape.md +21 -0
  128. data/spec/block_docs/notyet/header_after_par.md +58 -0
  129. data/spec/block_docs/notyet/ticks.md +18 -0
  130. data/spec/block_docs/notyet/triggering.md +157 -0
  131. data/spec/block_docs/olist.md +45 -0
  132. data/spec/block_docs/one.md +15 -0
  133. data/spec/block_docs/paragraph.md +16 -0
  134. data/spec/block_docs/paragraph_rules/dont_merge_ref.md +42 -0
  135. data/spec/block_docs/paragraph_rules/tab_is_blank.md +24 -0
  136. data/spec/block_docs/paragraphs.md +46 -0
  137. data/spec/block_docs/pending/amps.md +15 -0
  138. data/spec/block_docs/pending/empty_cells.md +37 -0
  139. data/spec/block_docs/pending/link.md +72 -0
  140. data/spec/block_docs/pending/ref.md +21 -0
  141. data/spec/block_docs/recover/recover_links.md +15 -0
  142. data/spec/block_docs/red_tests/abbrev.md +679 -0
  143. data/spec/block_docs/red_tests/lists7.md +32 -0
  144. data/spec/block_docs/red_tests/lists7b.md +65 -0
  145. data/spec/block_docs/red_tests/lists8.md +42 -0
  146. data/spec/block_docs/red_tests/ref.md +23 -0
  147. data/spec/block_docs/red_tests/xml.md +35 -0
  148. data/spec/block_docs/references/long_example.md +71 -0
  149. data/spec/block_docs/references/spaces_and_numbers.md +15 -0
  150. data/spec/block_docs/smartypants.md +114 -0
  151. data/spec/block_docs/syntax_hl.md +52 -0
  152. data/spec/block_docs/table_attributes.md +34 -0
  153. data/spec/block_docs/test.md +19 -0
  154. data/spec/block_docs/underscore_in_words.md +15 -0
  155. data/spec/block_docs/wrapping.md +67 -0
  156. data/spec/block_docs/xml2.md +19 -0
  157. data/spec/block_docs/xml3.md +26 -0
  158. data/spec/block_docs/xml_instruction.md +52 -0
  159. data/spec/block_spec.rb +49 -0
  160. data/spec/span_spec.rb +254 -0
  161. data/spec/spec_helper.rb +6 -0
  162. metadata +247 -0
@@ -0,0 +1,34 @@
1
+ Write a comment here
2
+ *** Parameters: ***
3
+ {} # params
4
+ *** Markdown input: ***
5
+
6
+ h | h
7
+ ----------|--
8
+ {:t} c1 | c2
9
+ {: summary="Table summary" .class1 style="color:red" border=3 width="50%" frame=lhs rules=cols cellspacing=2em cellpadding=4px}
10
+
11
+ {:t: scope="row"}
12
+ *** Output of inspect ***
13
+ md_el(:document,[
14
+ md_el(:table,[
15
+ md_el(:head_cell,["h"],{},[]),
16
+ md_el(:head_cell,["h"],{},[]),
17
+ md_el(:cell,[" c1"],{},[[:ref, "t"]]),
18
+ md_el(:cell,["c2"],{},[])
19
+ ],{:align=>[:left, :left]},[["summary", "Table summary"], [:class, "class1"], ["style", "color:red"], ["border", "3"], ["width", "50%"], ["frame", "lhs"], ["rules", "cols"], ["cellspacing", "2em"], ["cellpadding", "4px"]]),
20
+ md_el(:ald,[],{:ald=>[["scope", "row"]],:ald_id=>"t"},[])
21
+ ],{},[])
22
+ *** Output of to_html ***
23
+ <table class='class1' cellspacing='2em' rules='cols' border='3' frame='lhs' summary='Table summary' cellpadding='4px' width='50%' style='color:red'><thead><tr><th>h</th><th>h</th></tr></thead><tbody><tr><th scope='row' style='text-align: left;'> c1</th><td style='text-align: left;'>c2</td>
24
+ </tr></tbody></table>
25
+ *** Output of to_latex ***
26
+ \begin{tabular}{l|l}
27
+ h&h\\
28
+ \hline
29
+ c1&c2\\
30
+ \end{tabular}
31
+ *** Output of to_md ***
32
+ hh c1c2
33
+ *** Output of to_s ***
34
+ hh c1c2
@@ -0,0 +1,19 @@
1
+ Write a comment abouth the test here.
2
+ *** Parameters: ***
3
+ {}
4
+ *** Markdown input: ***
5
+
6
+ $ python
7
+
8
+
9
+
10
+ *** Output of inspect ***
11
+ md_el(:document,[md_el(:code,[],{:raw_code=>" $ python "},[])],{},[])
12
+ *** Output of to_html ***
13
+ <pre><code> $ python </code></pre>
14
+ *** Output of to_latex ***
15
+ \begin{verbatim} $ python \end{verbatim}
16
+ *** Output of to_md ***
17
+
18
+ *** Output of to_s ***
19
+
@@ -0,0 +1,15 @@
1
+ Note that Markdown.pl gives incorrect result here.
2
+ *** Parameters: ***
3
+ {} # params
4
+ *** Markdown input: ***
5
+ Ok, this_was a_really_old bug
6
+ *** Output of inspect ***
7
+ md_el(:document,[md_par(["Ok, this_was a_really_old bug"])],{},[])
8
+ *** Output of to_html ***
9
+ <p>Ok, this_was a_really_old bug</p>
10
+ *** Output of to_latex ***
11
+ Ok, this\_was a\_really\_old bug
12
+ *** Output of to_md ***
13
+ Ok, this_was a_really_old bug
14
+ *** Output of to_s ***
15
+ Ok, this_was a_really_old bug
@@ -0,0 +1,67 @@
1
+ Write a comment abouth the test here.
2
+ *** Parameters: ***
3
+ {}
4
+ *** Markdown input: ***
5
+ Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Break:
6
+ Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet.
7
+
8
+ * Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet
9
+ Lorem ipsum Break:
10
+ Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet
11
+ * Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet
12
+
13
+ *** Output of inspect ***
14
+ md_el(:document,[
15
+ md_par([
16
+ "Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Break:",
17
+ md_el(:linebreak,[],{},[]),
18
+ "Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet."
19
+ ]),
20
+ md_el(:ul,[
21
+ md_el(:li_span,[
22
+ "Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet Lorem ipsum Break:",
23
+ md_el(:linebreak,[],{},[]),
24
+ "Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet"
25
+ ],{:want_my_paragraph=>false},[]),
26
+ md_el(:li_span,[
27
+ "Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet"
28
+ ],{:want_my_paragraph=>false},[])
29
+ ],{},[])
30
+ ],{},[])
31
+ *** Output of to_html ***
32
+ <p>Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Break:<br />Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet.</p>
33
+
34
+ <ul>
35
+ <li>Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet Lorem ipsum Break:<br />Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet</li>
36
+
37
+ <li>Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet</li>
38
+ </ul>
39
+ *** Output of to_latex ***
40
+ Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Break:\newline Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet.
41
+
42
+ \begin{itemize}%
43
+ \item Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet Lorem ipsum Break:\newline Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet
44
+ \item Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet
45
+
46
+ \end{itemize}
47
+ *** Output of to_md ***
48
+ Lorem ipsum dolor amet. Lorem ipsum
49
+ dolor amet. Lorem ipsum dolor amet.
50
+ Lorem ipsum dolor amet. Lorem ipsum
51
+ dolor amet. Lorem ipsum dolor amet.
52
+ Lorem ipsum dolor amet. Break:
53
+ Lorem ipsum dolor amet. Lorem ipsum
54
+ dolor amet. Lorem ipsum dolor amet.
55
+ Lorem ipsum dolor amet.
56
+
57
+ -orem ipsum dolor amet. Lorem ipsum
58
+ dolor amet. Lorem ipsum dolor amet.
59
+ Lorem ipsum dolor amet Lorem ipsum
60
+ Break:
61
+ Lorem ipsum dolor amet. Lorem ipsum
62
+ dolor amet. Lorem ipsum dolor amet
63
+ -orem ipsum dolor amet. Lorem ipsum
64
+ dolor amet. Lorem ipsum dolor amet.
65
+ Lorem ipsum dolor amet
66
+ *** Output of to_s ***
67
+ Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Break:Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet.Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet Lorem ipsum Break:Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor ametLorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet. Lorem ipsum dolor amet
@@ -0,0 +1,19 @@
1
+ Write a comment here
2
+ *** Parameters: ***
3
+ {}
4
+ *** Markdown input: ***
5
+ <!--
6
+ <
7
+ -->
8
+ *** Output of inspect ***
9
+ md_el(:document,[md_html("<!--\n<\n-->")],{},[])
10
+ *** Output of to_html ***
11
+ <!--
12
+ <
13
+ -->
14
+ *** Output of to_latex ***
15
+
16
+ *** Output of to_md ***
17
+
18
+ *** Output of to_s ***
19
+
@@ -0,0 +1,26 @@
1
+ Write a comment here
2
+ *** Parameters: ***
3
+ {}
4
+ *** Markdown input: ***
5
+ <table markdown='1'>
6
+ Blah
7
+ <thead>
8
+ <td>*em*</td>
9
+ </thead>
10
+ </table>
11
+
12
+ *** Output of inspect ***
13
+ md_el(:document,[
14
+ md_html("<table markdown='1'>\n\tBlah\n\t<thead>\n\t\t<td>*em*</td>\n\t</thead>\n</table>")
15
+ ],{},[])
16
+ *** Output of to_html ***
17
+ <table>Blah<thead>
18
+ <td><em>em</em></td>
19
+ </thead>
20
+ </table>
21
+ *** Output of to_latex ***
22
+
23
+ *** Output of to_md ***
24
+
25
+ *** Output of to_s ***
26
+
@@ -0,0 +1,52 @@
1
+ Directives should be preserved.
2
+ *** Parameters: ***
3
+ {}
4
+ *** Markdown input: ***
5
+
6
+ <? noTarget?>
7
+ <?php ?>
8
+ <?xml ?>
9
+ <?mrk ?>
10
+
11
+ Targets <? noTarget?> <?php ?> <?xml ?> <?mrk ?>
12
+
13
+ Inside: <?mrk puts "Inside: Hello" ?> last
14
+
15
+
16
+ *** Output of inspect ***
17
+ md_el(:document,[
18
+ md_el(:xml_instr,[],{:code=>" noTarget",:target=>""},[]),
19
+ md_el(:xml_instr,[],{:code=>"",:target=>"php"},[]),
20
+ md_el(:xml_instr,[],{:code=>"",:target=>"xml"},[]),
21
+ md_el(:xml_instr,[],{:code=>"",:target=>"mrk"},[]),
22
+ md_par([
23
+ "Targets ",
24
+ md_el(:xml_instr,[],{:code=>"noTarget",:target=>""},[]),
25
+ " ",
26
+ md_el(:xml_instr,[],{:code=>"",:target=>"php"},[]),
27
+ " ",
28
+ md_el(:xml_instr,[],{:code=>"",:target=>"xml"},[]),
29
+ " ",
30
+ md_el(:xml_instr,[],{:code=>"",:target=>"mrk"},[])
31
+ ]),
32
+ md_par([
33
+ "Inside: ",
34
+ md_el(:xml_instr,[],{:code=>"puts \"Inside: Hello\"",:target=>"mrk"},[]),
35
+ " last"
36
+ ])
37
+ ],{},[])
38
+ *** Output of to_html ***
39
+ <? noTarget?><?php ?><?xml ?><?mrk ?>
40
+ <p>Targets <? noTarget?> <?php ?> <?xml ?> <?mrk ?></p>
41
+
42
+ <p>Inside: <?mrk puts "Inside: Hello"?> last</p>
43
+ *** Output of to_latex ***
44
+ Targets
45
+
46
+ Inside: last
47
+ *** Output of to_md ***
48
+ Targets
49
+
50
+ Inside: last
51
+ *** Output of to_s ***
52
+ Targets Inside: last
@@ -0,0 +1,49 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ METHODS = [:to_html, :to_latex, :to_md, :to_s]
4
+
5
+ describe "A Maruku document" do
6
+ before(:all) do
7
+ @old_stderr = $stderr
8
+ $stderr = StringIO.new
9
+ end
10
+
11
+ after(:all) do
12
+ $stderr = @old_stderr
13
+ end
14
+
15
+ Dir[File.dirname(__FILE__) + "/block_docs/**/*.md"].each do |md|
16
+ describe " for the #{md} file" do
17
+ input = File.read(md).split(/\n\*{3}[^*\n]+\*{3}\n/m)
18
+ input = ["Write a comment here", "{}", input.first] if input.size == 1
19
+ comment = input.shift
20
+ params = eval(input.shift)
21
+ markdown = input.shift
22
+ ast = input.shift
23
+
24
+ before(:each) do
25
+ pending if md =~ Regexp.new("^" + Regexp.quote(File.dirname(__FILE__) + "/block_docs/red_tests"))
26
+
27
+ $already_warned_itex2mml = false
28
+ @doc = Maruku.new(markdown, params)
29
+ @expected = METHODS.zip(input).inject({}) {|h, (k, v)| h[k] = v.strip; h}
30
+ end
31
+
32
+ it "should read in the output of #inspect as the same document" do
33
+ Maruku.new.instance_eval(@doc.inspect).should == @doc
34
+ end
35
+
36
+ it "should read in the given AST as the same document" do
37
+ Maruku.new.instance_eval(ast).should == @doc
38
+ end
39
+
40
+ METHODS.each do |m|
41
+ it "should have the expected ##{m} output" do
42
+ res = @doc.send(m).strip
43
+ pending "install itex2mml" if m == :to_html && $already_warned_itex2mml
44
+ res.should == @expected[m]
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,254 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ EXPECTATIONS = Maruku.new.instance_eval do
4
+ [
5
+ ["", [], 'Empty string gives empty list'],
6
+ ["a", ["a"], 'Easy char'],
7
+ [" a", ["a"], 'First space in the paragraph is ignored'],
8
+ ["a\n \n", ["a"], 'Last spaces in the paragraphs are ignored'],
9
+ [' ', [], 'One char => nothing'],
10
+ [' ', [], 'Two chars => nothing'],
11
+ ['a b', ['a b'], 'Spaces are compressed'],
12
+ ['a b', ['a b'], 'Newlines are spaces'],
13
+ ["a\nb", ['a b'], 'Newlines are spaces'],
14
+ ["a\n b", ['a b'], 'Compress newlines 1'],
15
+ ["a \nb", ['a b'], 'Compress newlines 2'],
16
+ [" \nb", ['b'], 'Compress newlines 3'],
17
+ ["\nb", ['b'], 'Compress newlines 4'],
18
+ ["b\n", ['b'], 'Compress newlines 5'],
19
+ ["\n", [], 'Compress newlines 6'],
20
+ ["\n\n\n", [], 'Compress newlines 7'],
21
+
22
+ [nil, :raise, "Should throw on nil input"],
23
+
24
+ # Code blocks
25
+ ["`" , :raise, 'Unclosed single ticks'],
26
+ ["``" , :raise, 'Unclosed double ticks'],
27
+ ["`a`" , [md_code('a')], 'Simple inline code'],
28
+ ["`` ` ``" , [md_code('`')], ],
29
+ ["`` \\` ``" , [md_code('\\`')], ],
30
+ ["``a``" , [md_code('a')], ],
31
+ ["`` a ``" , [md_code('a')], ],
32
+
33
+ # Newlines
34
+ ["a \n", ['a',md_el(:linebreak)], 'Two spaces give br.'],
35
+ ["a \n", ['a'], 'Newlines 2'],
36
+ [" \n", [md_el(:linebreak)], 'Newlines 3'],
37
+ [" \n \n", [md_el(:linebreak),md_el(:linebreak)],'Newlines 3'],
38
+ [" \na \n", [md_el(:linebreak),'a',md_el(:linebreak)],'Newlines 3'],
39
+
40
+ # Inline HTML
41
+ ["a < b", ['a < b'], '< can be on itself'],
42
+ ["<hr>", [md_html('<hr />')], 'HR will be sanitized'],
43
+ ["<hr/>", [md_html('<hr />')], 'Closed tag is ok'],
44
+ ["<hr />", [md_html('<hr />')], 'Closed tag is ok 2'],
45
+ ["<hr/>a", [md_html('<hr />'),'a'], 'Closed tag is ok 2'],
46
+ ["<em></em>a", [md_html('<em></em>'),'a'], 'Inline HTML 1'],
47
+ ["<em>e</em>a", [md_html('<em>e</em>'),'a'], 'Inline HTML 2'],
48
+ ["a<em>e</em>b", ['a',md_html('<em>e</em>'),'b'], 'Inline HTML 3'],
49
+ ["<em>e</em>a<em>f</em>",
50
+ [md_html('<em>e</em>'),'a',md_html('<em>f</em>')],
51
+ 'Inline HTML 4'],
52
+ ["<em>e</em><em>f</em>a",
53
+ [md_html('<em>e</em>'),md_html('<em>f</em>'),'a'],
54
+ 'Inline HTML 5'],
55
+
56
+ ["<img src='a' />", [md_html("<img src='a' />")], 'Attributes'],
57
+ ["<img src='a'/>"],
58
+
59
+ # emphasis
60
+ ["**", :raise, 'Unclosed double **'],
61
+ ["\\*", ['*'], 'Escaping of *'],
62
+ ["a *b* ", ['a ', md_em('b')], 'Emphasis 1'],
63
+ ["a *b*", ['a ', md_em('b')], 'Emphasis 2'],
64
+ ["a * b", ['a * b'], 'Emphasis 3'],
65
+ ["a * b*", :raise, 'Unclosed emphasis'],
66
+ # same with underscore
67
+ ["__", :raise, 'Unclosed double __'],
68
+ ["\\_", ['_'], 'Escaping of _'],
69
+ ["a _b_ ", ['a ', md_em('b')], 'Emphasis 4'],
70
+ ["a _b_", ['a ', md_em('b')], 'Emphasis 5'],
71
+ ["a _ b", ['a _ b'], 'Emphasis 6'],
72
+ ["a _ b_", :raise, 'Unclosed emphasis'],
73
+ ["_b_", [md_em('b')], 'Emphasis 7'],
74
+ ["_b_ _c_", [md_em('b'),' ',md_em('c')], 'Emphasis 8'],
75
+ ["_b__c_", [md_em('b'),md_em('c')], 'Emphasis 9'],
76
+ # underscores in word
77
+ ["mod_ruby", ['mod_ruby'], 'Word with underscore'],
78
+ # strong
79
+ ["**a*", :raise, 'Unclosed double ** 2'],
80
+ ["\\**a*", ['*', md_em('a')], 'Escaping of *'],
81
+ ["a **b** ", ['a ', md_strong('b')], 'Emphasis 1'],
82
+ ["a **b**", ['a ', md_strong('b')], 'Emphasis 2'],
83
+ ["a ** b", ['a ** b'], 'Emphasis 3'],
84
+ ["a ** b**", :raise, 'Unclosed emphasis'],
85
+ ["**b****c**", [md_strong('b'),md_strong('c')], 'Emphasis 9'],
86
+ # strong (with underscore)
87
+ ["__a_", :raise, 'Unclosed double __ 2'],
88
+
89
+ # ["\\__a_", ['_', md_em('a')], 'Escaping of _'],
90
+ ["a __b__ ", ['a ', md_strong('b')], 'Emphasis 1'],
91
+ ["a __b__", ['a ', md_strong('b')], 'Emphasis 2'],
92
+ ["a __ b", ['a __ b'], 'Emphasis 3'],
93
+ ["a __ b__", :raise, 'Unclosed emphasis'],
94
+ ["__b____c__", [md_strong('b'),md_strong('c')], 'Emphasis 9'],
95
+ # extra strong
96
+ ["***a**", :raise, 'Unclosed triple *** '],
97
+ ["\\***a**", ['*', md_strong('a')], 'Escaping of *'],
98
+ ["a ***b*** ", ['a ', md_emstrong('b')], 'Strong elements'],
99
+ ["a ***b***", ['a ', md_emstrong('b')]],
100
+ ["a *** b", ['a *** b']],
101
+ ["a ** * b", ['a ** * b']],
102
+ ["***b******c***", [md_emstrong('b'),md_emstrong('c')]],
103
+ ["a *** b***", :raise, 'Unclosed emphasis'],
104
+ # same with underscores
105
+ ["___a__", :raise, 'Unclosed triple *** '],
106
+ # ["\\___a__", ['_', md_strong('a')], 'Escaping of _'],
107
+ ["a ___b___ ", ['a ', md_emstrong('b')], 'Strong elements'],
108
+ ["a ___b___", ['a ', md_emstrong('b')]],
109
+ ["a ___ b", ['a ___ b']],
110
+ ["a __ _ b", ['a __ _ b']],
111
+ ["___b______c___", [md_emstrong('b'),md_emstrong('c')]],
112
+ ["a ___ b___", :raise, 'Unclosed emphasis'],
113
+ # mixing is bad
114
+ ["*a_", :raise, 'Mixing is bad'],
115
+ ["_a*", :raise],
116
+ ["**a__", :raise],
117
+ ["__a**", :raise],
118
+ ["___a***", :raise],
119
+ ["***a___", :raise],
120
+ # links of the form [text][ref]
121
+ ["\\[a]", ["[a]"], 'Escaping 1'],
122
+ ["\\[a\\]", ["[a]"], 'Escaping 2'],
123
+ # This is valid in the new Markdown version
124
+ # ["[a]", ["a"], 'Not a link'],
125
+ ["[a]", [ md_link(["a"],'a')], 'Empty link'],
126
+ ["[a][]", ],
127
+ ["[a][]b", [ md_link(["a"],'a'),'b'], 'Empty link'],
128
+ ["[a\\]][]", [ md_link(["a]"],'a')], 'Escape inside link (throw ?] away)'],
129
+
130
+ ["[a", :raise, 'Link not closed'],
131
+ ["[a][", :raise, 'Ref not closed'],
132
+
133
+ # links of the form [text](url)
134
+ ["\\[a](b)", ["[a](b)"], 'Links'],
135
+ ["[a](url)c", [md_im_link(['a'],'url'),'c'], 'url'],
136
+ ["[a]( url )c" ],
137
+ ["[a] ( url )c" ],
138
+ ["[a] ( url)c" ],
139
+
140
+ ["[a](ur:/l/ 'Title')", [md_im_link(['a'],'ur:/l/','Title')],
141
+ 'url and title'],
142
+ ["[a] ( ur:/l/ \"Title\")" ],
143
+ ["[a] ( ur:/l/ \"Title\")" ],
144
+ ["[a]( ur:/l/ Title)", :raise, "Must quote title" ],
145
+
146
+ ["[a](url 'Tit\\\"l\\\\e')", [md_im_link(['a'],'url','Tit"l\\e')],
147
+ 'url and title escaped'],
148
+ ["[a] ( url \"Tit\\\"l\\\\e\")" ],
149
+ ["[a] ( url \"Tit\\\"l\\\\e\" )" ],
150
+ ['[a] ( url "Tit\\"l\\\\e" )' ],
151
+ ["[a]()", [md_im_link(['a'],'')], 'No URL is OK'],
152
+
153
+ ["[a](\"Title\")", :raise, "No url specified" ],
154
+ ["[a](url \"Title)", :raise, "Unclosed quotes" ],
155
+ ["[a](url \"Title\\\")", :raise],
156
+ ["[a](url \"Title\" ", :raise],
157
+
158
+ ["[a](url \'Title\")", :raise, "Mixing is bad" ],
159
+ ["[a](url \"Title\')"],
160
+
161
+ ["[a](/url)", [md_im_link(['a'],'/url')], 'Funny chars in url'],
162
+ ["[a](#url)", [md_im_link(['a'],'#url')]],
163
+ ["[a](</script?foo=1&bar=2>)", [md_im_link(['a'],'/script?foo=1&bar=2')]],
164
+
165
+
166
+ # Images
167
+ ["\\![a](url)", ['!', md_im_link(['a'],'url') ], 'Escaping images'],
168
+
169
+ ["![a](url)", [md_im_image(['a'],'url')], 'Image no title'],
170
+ ["![a]( url )" ],
171
+ ["![a] ( url )" ],
172
+ ["![a] ( url)" ],
173
+
174
+ ["![a](url 'ti\"tle')", [md_im_image(['a'],'url','ti"tle')], 'Image with title'],
175
+ ['![a]( url "ti\\"tle")' ],
176
+
177
+ ["![a](url", :raise, 'Invalid images'],
178
+ ["![a( url )" ],
179
+ ["![a] ('url )" ],
180
+
181
+ ["![a][imref]", [md_image(['a'],'imref')], 'Image with ref'],
182
+ ["![a][ imref]"],
183
+ ["![a][ imref ]"],
184
+ ["![a][\timref\t]"],
185
+
186
+
187
+ ['<http://example.com/?foo=1&bar=2>',
188
+ [md_url('http://example.com/?foo=1&bar=2')], 'Immediate link'],
189
+ ['a<http://example.com/?foo=1&bar=2>b',
190
+ ['a',md_url('http://example.com/?foo=1&bar=2'),'b'] ],
191
+ ['<andrea@censi.org>',
192
+ [md_email('andrea@censi.org')], 'Email address'],
193
+ ['<mailto:andrea@censi.org>'],
194
+ ["Developmen <http://rubyforge.org/projects/maruku/>",
195
+ ["Developmen ", md_url("http://rubyforge.org/projects/maruku/")]],
196
+ ["a<!-- -->b", ['a',md_html('<!-- -->'),'b'],
197
+ 'HTML Comment'],
198
+
199
+ ["a<!--", :raise, 'Bad HTML Comment'],
200
+ ["a<!-- ", :raise, 'Bad HTML Comment'],
201
+
202
+ ["<?xml <?!--!`3 ?>", [md_xml_instr('xml','<?!--!`3')], 'XML processing instruction'],
203
+ ["<? <?!--!`3 ?>", [md_xml_instr('','<?!--!`3')] ],
204
+
205
+ ["<? ", :raise, 'Bad Server directive'],
206
+
207
+ ["a <b", :raise, 'Bad HTML 1'],
208
+ ["<b", :raise, 'Bad HTML 2'],
209
+ ["<b!", :raise, 'Bad HTML 3'],
210
+ ['`<div>`, `<table>`, `<pre>`, `<p>`',
211
+ [md_code('<div>'),', ',md_code('<table>'),', ',
212
+ md_code('<pre>'),', ',md_code('<p>')],
213
+ 'Multiple HTML tags'],
214
+
215
+ ["&andrea", ["&andrea"], 'Parsing of entities'],
216
+ # no escaping is allowed
217
+ # ["\\&andrea;", ["&andrea;"]],
218
+ ["l&andrea;", ["l", md_entity('andrea')] ],
219
+ ["&&andrea;", ["&", md_entity('andrea')] ],
220
+ ["&123;;&amp;",[md_entity('123'),';',md_entity('amp')]],
221
+
222
+ ["a\nThe [syntax page] [s] provides",
223
+ ['a The ', md_link(['syntax page'],'s'), ' provides'], 'Regression'],
224
+
225
+ ['![a](url "ti"tle")', [md_im_image(['a'],'url','ti"tle')],
226
+ "Image with quotes"],
227
+ ['![a](url \'ti"tle\')' ],
228
+
229
+ ['[bar](/url/ "Title with "quotes" inside")',
230
+ [md_im_link(["bar"],'/url/', 'Title with "quotes" inside')],
231
+ "Link with quotes"],
232
+ ]
233
+ end
234
+
235
+ EXPECTATIONS.each_cons(2) {|l, r| r[1] ||= l[1]}
236
+
237
+ describe "The Maruku span parser" do
238
+ before(:each) do
239
+ @doc = Maruku.new
240
+ @doc.attributes[:on_error] = :raise
241
+ end
242
+
243
+ EXPECTATIONS.each do |md, res, comment|
244
+ if res == :raise
245
+ it "should raise an error for \"#{md}\"" do
246
+ lambda {@doc.parse_span_better(md)}.should raise_error(Maruku::Exception)
247
+ end
248
+ else
249
+ it "should parse \"#{md}\" as #{res.inspect}" do
250
+ @doc.parse_span_better(md).should == res
251
+ end
252
+ end
253
+ end
254
+ end