maruku 0.4.2.1 → 0.5.0

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.
Files changed (85) hide show
  1. data/bin/maruku +66 -20
  2. data/bin/marutest +12 -2
  3. data/docs/changelog.html +188 -23
  4. data/docs/changelog.md +128 -5
  5. data/docs/entity_test.html +245 -240
  6. data/docs/entity_test.md +2 -0
  7. data/docs/exd.html +181 -23
  8. data/docs/index.html +130 -349
  9. data/docs/markdown_syntax.html +55 -51
  10. data/docs/maruku.html +130 -349
  11. data/docs/maruku.md +154 -339
  12. data/docs/math.md +143 -0
  13. data/docs/proposal.html +16 -12
  14. data/lib/maruku.rb +6 -3
  15. data/lib/maruku/attributes.rb +7 -2
  16. data/lib/maruku/defaults.rb +27 -27
  17. data/lib/maruku/errors_management.rb +10 -9
  18. data/lib/maruku/ext/diagrams/diagrams.rb +8 -0
  19. data/lib/maruku/ext/diagrams/grid.rb +78 -0
  20. data/lib/maruku/ext/diagrams/inspect.rb +11 -0
  21. data/lib/maruku/ext/diagrams/layout.rb +105 -0
  22. data/lib/maruku/ext/diagrams/parser.rb +219 -0
  23. data/lib/maruku/ext/diagrams/structures.rb +168 -0
  24. data/lib/maruku/ext/diagrams/to_html.rb +37 -0
  25. data/lib/maruku/ext/diagrams/to_latex.rb +308 -0
  26. data/lib/maruku/ext/diagrams/unittest.rb +123 -0
  27. data/lib/maruku/ext/math.rb +11 -0
  28. data/lib/maruku/ext/math/elements.rb +26 -0
  29. data/lib/maruku/ext/math/mathml_engines/blahtex.rb +108 -0
  30. data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +29 -0
  31. data/lib/maruku/ext/math/mathml_engines/none.rb +20 -0
  32. data/lib/maruku/ext/math/mathml_engines/ritex.rb +24 -0
  33. data/lib/maruku/ext/math/parsing.rb +82 -0
  34. data/lib/maruku/ext/math/to_html.rb +178 -0
  35. data/lib/maruku/ext/math/to_latex.rb +21 -0
  36. data/lib/maruku/helpers.rb +11 -0
  37. data/lib/maruku/input/charsource.rb +1 -1
  38. data/lib/maruku/input/extensions.rb +68 -0
  39. data/lib/maruku/input/html_helper.rb +91 -60
  40. data/lib/maruku/input/parse_block.rb +10 -9
  41. data/lib/maruku/input/parse_doc.rb +21 -13
  42. data/lib/maruku/input/parse_span_better.rb +19 -8
  43. data/lib/maruku/input/type_detection.rb +5 -3
  44. data/lib/maruku/output/to_html.rb +236 -67
  45. data/lib/maruku/output/to_latex.rb +69 -26
  46. data/lib/maruku/output/to_latex_entities.rb +14 -2
  47. data/lib/maruku/output/to_s.rb +8 -0
  48. data/lib/maruku/structures.rb +1 -1
  49. data/lib/maruku/tests/benchmark.rb +2 -2
  50. data/lib/maruku/tests/new_parser.rb +13 -5
  51. data/lib/maruku/version.rb +1 -1
  52. data/lib/sort_prof.rb +22 -0
  53. data/tests/diagrams/diagrams.md +54 -0
  54. data/tests/math/syntax.md +46 -0
  55. data/tests/math_usage/document.md +13 -0
  56. data/tests/unittest/attributes/attributes.md +50 -6
  57. data/tests/unittest/easy.md +1 -1
  58. data/tests/unittest/email.md +3 -3
  59. data/tests/unittest/entities.md +12 -7
  60. data/tests/unittest/escaping.md +4 -4
  61. data/tests/unittest/extra_table1.md +3 -1
  62. data/tests/unittest/footnotes.md +5 -5
  63. data/tests/unittest/headers.md +3 -3
  64. data/tests/unittest/images.md +7 -7
  65. data/tests/unittest/inline_html.md +51 -5
  66. data/tests/unittest/links.md +7 -7
  67. data/tests/unittest/list2.md +1 -1
  68. data/tests/unittest/lists.md +1 -1
  69. data/tests/unittest/lists_after_paragraph.md +1 -1
  70. data/tests/unittest/lists_ol.md +1 -1
  71. data/tests/unittest/math/equations.md +82 -0
  72. data/tests/unittest/math/inline.md +80 -0
  73. data/tests/unittest/math/table.md +51 -0
  74. data/tests/unittest/math/table2.md +67 -0
  75. data/tests/unittest/misc_sw.md +24 -24
  76. data/tests/unittest/notyet/ticks.md +1 -1
  77. data/tests/unittest/references/long_example.md +2 -2
  78. data/tests/unittest/smartypants.md +4 -4
  79. data/tests/unittest/xml.md +68 -0
  80. data/tests/unittest/xml2.md +36 -0
  81. data/tests/unittest/xml3.md +52 -0
  82. data/tests/unittest/xml_instruction.md +5 -5
  83. metadata +33 -4
  84. data/docs/a.html +0 -6
  85. data/docs/char.html +0 -1924
@@ -0,0 +1,37 @@
1
+ require 'rexml/document'
2
+
3
+ module Diagrams
4
+
5
+ class Diagram
6
+
7
+
8
+ include REXML
9
+ def to_html
10
+ div = Element.new 'div'
11
+ div.add_element 'div', {'style'=>'width: 1em', 'id'=>'emtest'}
12
+ div.attributes['style'] =
13
+ "position:relative; display: block; width: #{@width}em; height: #{@height}em;"
14
+ div.attributes['class'] = 'diagram'
15
+ @boxes.each_with_index do |b, i|
16
+ box = Element.new 'div'
17
+ box.attributes['class'] = 'box'
18
+
19
+ w = b.width
20
+ box.attributes['id'] = "box#{i}"
21
+ box.attributes['style'] =
22
+ "position:absolute; left:#{b.x}em; top:#{b.y}em; border:solid 1px black;"
23
+ content = Element.new 'div', box
24
+ content.attributes['class'] = 'inner'
25
+ content << Text.new( b.content )
26
+ div << box
27
+ div << Text.new("\n")
28
+ end
29
+ div
30
+ end
31
+
32
+
33
+ end
34
+
35
+
36
+
37
+ end
@@ -0,0 +1,308 @@
1
+
2
+ module Diagrams
3
+
4
+ class Diagram
5
+
6
+ def write_tex_discovery(diag_id, output_file)
7
+ fid = 10
8
+ s = ("\\immediate\\openout%d=%s\n" % [fid, output_file])
9
+ @boxes.each_with_index do |b, i|
10
+ s += ("\\setbox0=\\hbox{%s}\n" % b.content)
11
+ s += "\\immediate\\write%d{%s,%d,\\the\\wd0,\\the\\ht0,\\the\\dp0 ,%s}\n" %
12
+ [fid, diag_id, i, b.content]
13
+ end
14
+ s += "\\end\n"
15
+ s
16
+ end
17
+
18
+ def write_latex_discovery(diag_id, output_file)
19
+ fid = 10
20
+ s=""
21
+ # s +="\\documentclass{article}\\begin{document}"
22
+ s += ("\\immediate\\openout%d=%s\n" % [fid, output_file])
23
+ # s+= "\\ifx\\already\\empty"
24
+ # s+="\\def\\already{1}"
25
+ # s+= "\\newlength{\\mywd}\n"
26
+ # s+= "\\newlength{\\myht}\n"
27
+ # s+= "\\newlength{\\mydp}\n"
28
+ # s+="\\fi"
29
+ @boxes.each_with_index do |b, i|
30
+ s += ("\\settowidth{\\mywd}{\\hbox{%s}}\n" % b.content)
31
+ s += ("\\settoheight{\\myht}{\\hbox{%s}}\n" % b.content)
32
+ s += ("\\settodepth{\\mydp}{\\hbox{%s}}\n" % b.content)
33
+ s += "\\immediate\\write%d{%s,%d,\\the\\mywd,\\the\\myht,\\the\\mydp}\n" %
34
+ [fid, diag_id, i]
35
+ end
36
+ s+=("\\immediate\\closeout%d\n" % fid)
37
+ # s+="\\end{document}"
38
+ s
39
+ end
40
+
41
+ def read_tex_discovery(my_diag_id, s)
42
+ s.split("\n").each do |l|
43
+ diag_id, box_index, wd, ht, dp, text = l.split(",")
44
+ if diag_id == my_diag_id
45
+ puts "found box #{box_index}: #{wd} #{ht} #{dp}"
46
+ wd,ht,dp = wd.to_f,ht.to_f,dp.to_f
47
+ width = wd
48
+ height = ht+dp
49
+ puts "found box #{box_index}: #{width}x#{height}"
50
+ i = box_index.to_i
51
+ @boxes[i].hs.min = width
52
+ @boxes[i].hs.shrink = 1
53
+ @boxes[i].hs.pref = width*1.2
54
+ @boxes[i].hs.stretch = 0.1
55
+ @boxes[i].hs.max = 1000
56
+ @boxes[i].vs.min = height
57
+ @boxes[i].vs.shrink = 1
58
+ @boxes[i].vs.pref = height*1.2
59
+ @boxes[i].vs.stretch = 0.1
60
+ @boxes[i].vs.max = 1000
61
+ end
62
+ end
63
+ end
64
+
65
+ def to_latex(job="anon_diagram")
66
+ do_discovery = true
67
+
68
+ tmp_out = "#{job}.dia"
69
+
70
+ diag_id = "dia"
71
+ s = write_latex_discovery(diag_id, tmp_out)
72
+
73
+ if File.exist?(tmp_out)
74
+ File.open(tmp_out, 'r') do |f|
75
+ read_tex_discovery(diag_id, f.read)
76
+ end
77
+ end
78
+
79
+ do_layout(job)
80
+
81
+ @boxes.each_with_index do |b, i|
82
+ width = b.hs.min
83
+ height = b.vs.min
84
+ s << ("\\framebox[%fpt]{\\rule{10pt}{%fpt}%s}"% [width,height, b.content])
85
+ end
86
+
87
+ s+="\n\nCiao\n\n"
88
+ s
89
+ end
90
+
91
+ class Layout
92
+ def initialize
93
+ @hlink,@vlink = {},{}
94
+ @hsprings,@vsprings={},{}
95
+ end
96
+
97
+ def to_dot()
98
+ return to_dot_links(@hlink,@hsprings), to_dot_links(@vlink,@vsprings)
99
+ end
100
+
101
+ def to_dot_links(links, springs)
102
+ s = "digraph diagram {\n"
103
+ links.each do |var, to_other|
104
+ if not to_other.empty?
105
+ var_ = var.gsub(/^[^_]+_/,'')
106
+ s += "\t#{var} [label = \"#{var_}\" ];\n"
107
+ to_other.each do |v2, spring|
108
+ s += "\t #{var} -> #{v2} [ label = \"#{spring.inspect}\"];\n"
109
+ end
110
+ end
111
+ end
112
+ s += "}\n"
113
+ end
114
+
115
+ def add_var(s)
116
+ @hlink[s]=[] if not @hlink[s]
117
+ @vlink[s]=[] if not @vlink[s]
118
+ end
119
+
120
+ # var2-var1 = spring
121
+ def add_con_h(var1,var2,hspring)
122
+ add_var var1; add_var var2;
123
+ @hlink[var1].push [var2, hspring]
124
+ @hsprings[[var1,var2]] = hspring
125
+ end
126
+
127
+ def add_con_v(var1,var2,vspring)
128
+ add_var var1; add_var var2;
129
+ @vlink[var1].push [var2, vspring]
130
+ @vsprings[[var1,var2]] = vspring
131
+ end
132
+
133
+ def get_preferred(var1, var2)
134
+ hpaths = rec_paths(@hlink, var1, var2)
135
+ vpaths = rec_paths(@vlink, var1, var2)
136
+ puts inspect
137
+ hpaths.each do |h|
138
+ puts "H: #{h.inspect}"
139
+ end
140
+ vpaths.each do |v|
141
+ puts "V: #{v.inspect}"
142
+ end
143
+
144
+ hsprings =
145
+ hpaths.map do |h|
146
+ ss = []
147
+ for i in 0..(h.size-2)
148
+ v1,v2 = h[i],h[i+1]
149
+ ss.push @hsprings[[v1,v2]]
150
+ end
151
+ ss
152
+ end
153
+ vsprings =
154
+ vpaths.map do |h|
155
+ ss = []
156
+ for i in 0..(h.size-2)
157
+ v1,v2 = h[i],h[i+1]
158
+ ss.push @vsprings[[v1,v2]]
159
+ end
160
+ ss
161
+ end
162
+
163
+
164
+ def go_up_parallel(par)
165
+ final = par[0]
166
+ for i in 1..(par.size-1)
167
+ final = Spring.parallel(final, par[i])
168
+ end
169
+ final
170
+ end
171
+
172
+ def go_up_series(series)
173
+ tot = series[0]
174
+ for i in 1..(series.size-1)
175
+ tot = Spring.series(tot, series[i])
176
+ end
177
+ tot
178
+ end
179
+
180
+ def compress(x)
181
+ t = x.map do |s| go_up_series(s) end
182
+ final = go_up_parallel(t)
183
+ end
184
+
185
+ def sum_of_shrink(series)
186
+ sum = 0
187
+ series.each do |s| sum += s.shrink end
188
+ sum
189
+ end
190
+
191
+ def sum_of_stretch(series)
192
+ sum = 0
193
+ series.each do |s| sum += s.stretch end
194
+ sum
195
+ end
196
+
197
+ def go_back(imposed, series)
198
+ pref = go_up_series(series)
199
+ if pref.pref > imposed
200
+ # must shrink
201
+ shrink = pref.pref - imposed
202
+ sum = sum_of_shrink(series)
203
+ series.each do |s|
204
+ its_shrink = (s.shrink / sum) * shrink
205
+ its_imposed = s.pref - its_shrink
206
+ if s.imposed
207
+ s.imposed = (its_imposed+ s.imposed)*0.5
208
+ else
209
+ s.imposed = its_imposed
210
+ end
211
+ s.pref = s.pref*0.5 + s.imposed*0.5
212
+ end
213
+ else
214
+ # must stretch
215
+ stretch = imposed - pref.pref
216
+ sum = sum_of_stretch(series)
217
+ series.each do |s|
218
+ its_stretch = (s.stretch / sum) * stretch
219
+ its_imposed = s.pref + its_stretch
220
+ if s.imposed
221
+ s.imposed = (its_imposed+ s.imposed)*0.5
222
+ else
223
+ s.imposed = its_imposed
224
+ end
225
+ s.pref = s.pref*0.5 + s.imposed*0.5
226
+ end
227
+ end
228
+ end
229
+
230
+ for i in 0..100
231
+ hpref = compress(hsprings)
232
+ vpref = compress(vsprings)
233
+
234
+ width = hpref.pref
235
+ height = vpref.pref
236
+
237
+ hsprings.each do |series| go_back(height, series) end
238
+ vsprings.each do |series| go_back(width, series) end
239
+ end
240
+
241
+ hpaths.each do |h|
242
+ ss = []
243
+ len = 0
244
+ for i in 0..(h.size-2)
245
+ v1,v2 = h[i],h[i+1]
246
+ this = @hsprings[[v1,v2]].imposed
247
+ puts "#{v1} - #{v2} | "+ ("%0.2f" % this)
248
+ len += this
249
+ end
250
+ puts "LEN: #{len}"
251
+ ss
252
+ end
253
+
254
+ return hpref,vpref
255
+ end
256
+
257
+ # returns [] if there isn't one
258
+ def rec_paths(links, var1, var2)
259
+ all_paths = []
260
+ (links[var1] || []).each do |v, spring|
261
+ if v == var2
262
+ all_paths.push [var2]
263
+ else
264
+ all_paths = all_paths + rec_paths(links, v, var2)
265
+ end
266
+ end
267
+ all_paths.map{|x| [var1]+x}
268
+ end
269
+
270
+ def inspect
271
+ s = ""
272
+ @hlink.each do |v1,a|
273
+ a.each do |v2, spring|
274
+ s += "#{v1.inspect} -> #{v2.inspect} (#{spring.inspect})\n"
275
+ end
276
+ end
277
+ s
278
+ end
279
+ end
280
+
281
+ def top_right(i); "#{@diag_id}_b#{i}_tr"; end
282
+
283
+ def assign_variables(diag_id)
284
+ @boxes.each_with_index do |b, i|
285
+ b.v_tl = "#{diag_id}_b#{i}_tl"
286
+ b.v_br = "#{diag_id}_b#{i}_br"
287
+ end
288
+ @arrows.each_with_index do |a, i|
289
+ a.v_start = "#{diag_id}_a#{i}_start"
290
+ a.v_end = "#{diag_id}_a#{i}_end"
291
+ end
292
+ @points.each_with_index do |p, i|
293
+ p.v_p = "#{diag_id}_p#{i}_p"
294
+ end
295
+ end
296
+
297
+ # in points
298
+ def to_dev(x)
299
+ x * 10
300
+ end
301
+
302
+
303
+ end
304
+
305
+ end
306
+
307
+
308
+
@@ -0,0 +1,123 @@
1
+
2
+ Test0 = <<-EOF
3
+ +-+
4
+ |A|
5
+ +-+
6
+
7
+ +-++
8
+ |AB|
9
+ +-++
10
+
11
+ +---+
12
+ |ABC|
13
+ +---+
14
+
15
+ +----+
16
+ |ABCD|
17
+ +----+
18
+ EOF
19
+
20
+ Test1 = <<-EOF
21
+ /---------\\
22
+ | Start |
23
+ \\----+----/
24
+ |
25
+ V
26
+ +----+----+
27
+ | Init |
28
+ +----+----+
29
+ |
30
+ +<-----------+
31
+ | ^
32
+ V |
33
+ +----+----+ |
34
+ | Process | |
35
+ +----+----+ |
36
+ | |
37
+ V |
38
+ +----+----+ yes |
39
+ | more? +-------+
40
+ +----+----+
41
+ | no
42
+ V
43
+ /----+----\\
44
+ | End |
45
+ \\---------/
46
+ EOF
47
+
48
+ Test2=<<-EOF
49
+ +---------+ +---------+ +---------+
50
+ | Shape | | Line | | Point |
51
+ +---------+ +---------+ 2 +---------+
52
+ | draw +<--------+ start +----O+ x |
53
+ | move +<-+ | end | | y |
54
+ +---------+ \\ +---------+ +---------+
55
+ \\
56
+ \\ +---------+
57
+ +--+ Circle |
58
+ +---------+
59
+ | center |
60
+ | radius |
61
+ +---------+
62
+ EOF
63
+
64
+ Test3=(<<-EOF
65
+ /-----------M yes /----------M
66
+ +-->| then this |--->*--->| and this |
67
+ / M-----------/ |no M----------/
68
+ /------------M / |
69
+ | First this |-->+ |
70
+ M------------/ M |
71
+ M /---------M V /------M
72
+ +-->| or that |----->*------->| Done |
73
+ M---------/ M------/
74
+ EOF
75
+ ).gsub(/M/,"\\")
76
+
77
+ require 'diagrams'
78
+
79
+ include Diagrams
80
+
81
+
82
+ Tests = [Test0, Test1 , Test3]
83
+
84
+ diagrams = Tests.map{|s| Diagram.new(s)}
85
+
86
+
87
+
88
+ require 'rexml/document'
89
+ include REXML
90
+
91
+ doc = Document.new
92
+ html = Element.new 'html', doc
93
+ head = Element.new 'head', html
94
+ body = Element.new 'body', html
95
+ title = Element.new 'title', head
96
+ title << Text.new("Titolo")
97
+ style=Element.new 'link', head
98
+ style.attributes['href'] = 'style.css'
99
+ style.attributes['rel'] = 'stylesheet'
100
+ style.attributes['type'] = 'text/css'
101
+ head.add_element 'script', {'src'=>'adjust.js', 'type'=>"text/javascript"}
102
+
103
+ diagrams.each do |d|
104
+ body << Text.new("Diagram ")
105
+ body << d.to_html
106
+ #\ body.add_element 'hr', {'style'=>'clear:both'}
107
+ end
108
+
109
+ File.open("tests.html",'w') do |f|
110
+ f.write '<?xml version="1.0" encoding="utf-8"?>
111
+ <!DOCTYPE html PUBLIC
112
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
113
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">' unless true
114
+ doc.write(f)
115
+ end
116
+
117
+
118
+
119
+ diagrams.each_with_index do |d, i|
120
+ File.open("test#{i}.tex", 'w') do |f|
121
+ f.write d.to_latex
122
+ end
123
+ end