maiku 0.6.1.maiku

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 (44) hide show
  1. data/lib/maruku.rb +141 -0
  2. data/lib/maruku/attributes.rb +175 -0
  3. data/lib/maruku/defaults.rb +71 -0
  4. data/lib/maruku/errors_management.rb +92 -0
  5. data/lib/maruku/ext/div.rb +133 -0
  6. data/lib/maruku/ext/math.rb +41 -0
  7. data/lib/maruku/ext/math/elements.rb +27 -0
  8. data/lib/maruku/ext/math/latex_fix.rb +12 -0
  9. data/lib/maruku/ext/math/mathml_engines/blahtex.rb +107 -0
  10. data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +29 -0
  11. data/lib/maruku/ext/math/mathml_engines/none.rb +20 -0
  12. data/lib/maruku/ext/math/mathml_engines/ritex.rb +24 -0
  13. data/lib/maruku/ext/math/parsing.rb +119 -0
  14. data/lib/maruku/ext/math/to_html.rb +187 -0
  15. data/lib/maruku/ext/math/to_latex.rb +26 -0
  16. data/lib/maruku/helpers.rb +260 -0
  17. data/lib/maruku/input/charsource.rb +326 -0
  18. data/lib/maruku/input/extensions.rb +69 -0
  19. data/lib/maruku/input/html_helper.rb +189 -0
  20. data/lib/maruku/input/linesource.rb +111 -0
  21. data/lib/maruku/input/parse_block.rb +616 -0
  22. data/lib/maruku/input/parse_doc.rb +232 -0
  23. data/lib/maruku/input/parse_span_better.rb +746 -0
  24. data/lib/maruku/input/rubypants.rb +225 -0
  25. data/lib/maruku/input/type_detection.rb +147 -0
  26. data/lib/maruku/input_textile2/t2_parser.rb +163 -0
  27. data/lib/maruku/maruku.rb +33 -0
  28. data/lib/maruku/output/s5/fancy.rb +756 -0
  29. data/lib/maruku/output/s5/to_s5.rb +138 -0
  30. data/lib/maruku/output/to_html.rb +991 -0
  31. data/lib/maruku/output/to_latex.rb +590 -0
  32. data/lib/maruku/output/to_latex_entities.rb +367 -0
  33. data/lib/maruku/output/to_latex_strings.rb +64 -0
  34. data/lib/maruku/output/to_markdown.rb +164 -0
  35. data/lib/maruku/output/to_s.rb +56 -0
  36. data/lib/maruku/string_utils.rb +201 -0
  37. data/lib/maruku/structures.rb +167 -0
  38. data/lib/maruku/structures_inspect.rb +87 -0
  39. data/lib/maruku/structures_iterators.rb +61 -0
  40. data/lib/maruku/textile2.rb +1 -0
  41. data/lib/maruku/toc.rb +199 -0
  42. data/lib/maruku/usage/example1.rb +33 -0
  43. data/lib/maruku/version.rb +39 -0
  44. metadata +167 -0
@@ -0,0 +1,367 @@
1
+ #--
2
+ # Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
3
+ #
4
+ # This file is part of Maruku.
5
+ #
6
+ # Maruku is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation; either version 2 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Maruku is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Maruku; if not, write to the Free Software
18
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ #++
20
+
21
+
22
+ require 'rexml/document'
23
+
24
+ module MaRuKu; module Out; module Latex
25
+
26
+ include REXML
27
+
28
+ def to_latex_entity
29
+ MaRuKu::Out::Latex.need_entity_table
30
+
31
+ entity_name = self.entity_name
32
+
33
+ entity = ENTITY_TABLE[entity_name]
34
+ if not entity
35
+ maruku_error "I don't know how to translate entity '#{entity_name}' "+
36
+ "to LaTeX."
37
+ return ""
38
+ end
39
+ replace = entity.latex_string
40
+
41
+ entity.latex_packages.each do |p|
42
+ @doc.latex_require_package p
43
+ end
44
+
45
+ # if replace =~ /^\\/
46
+ # replace = replace + " "
47
+ # end
48
+
49
+ if replace
50
+ return replace + "{}"
51
+ else
52
+ tell_user "Cannot translate entity #{entity_name.inspect} to LaTeX."
53
+ return entity_name
54
+ end
55
+ end
56
+
57
+ class LatexEntity
58
+ safe_attr_accessor :html_num, Fixnum
59
+ safe_attr_accessor :html_entity, String
60
+ safe_attr_accessor :latex_string, String
61
+ safe_attr_accessor :latex_packages, Array
62
+ end
63
+
64
+ def Latex.need_entity_table
65
+ Latex.init_entity_table if ENTITY_TABLE.empty?
66
+ end
67
+
68
+ # create hash @@entity_to_latex
69
+ def Latex.init_entity_table
70
+ # $stderr.write "Creating entity table.."
71
+ # $stderr.flush
72
+ doc = Document.new XML_TABLE
73
+ doc.elements.each("//char") do |c|
74
+ num = c.attributes['num'].to_i
75
+ name = c.attributes['name']
76
+ package = c.attributes['package']
77
+
78
+ convert = c.attributes['convertTo']
79
+ convert.gsub!(/@DOUBLEQUOT/,'"')
80
+ convert.gsub!(/@QUOT/,"'")
81
+ convert.gsub!(/@GT/,">")
82
+ convert.gsub!(/@LT/,"<")
83
+ convert.gsub!(/@AMP/,"&")
84
+ convert.freeze
85
+
86
+ e = LatexEntity.new
87
+ e.html_num = num
88
+ e.html_entity = name
89
+ e.latex_string = convert
90
+ e.latex_packages = package ? package.split : []
91
+
92
+ ENTITY_TABLE[num] = e
93
+ ENTITY_TABLE[name] = e
94
+ end
95
+ # $stderr.puts "..done."
96
+ end
97
+
98
+ ENTITY_TABLE = {}
99
+
100
+ # The following is a conversion chart for html elements, courtesy of
101
+ # text2html
102
+
103
+ XML_TABLE ="
104
+ <chars>
105
+ <char num='913' name='Alpha' convertTo='$A$' />
106
+ <char num='914' name='Beta' convertTo='$B$' />
107
+ <char num='915' name='Gamma' convertTo='$\\Gamma$' />
108
+ <char num='916' name='Delta' convertTo='$\\Delta$' />
109
+ <char num='917' name='Epsilon' convertTo='$E$' />
110
+ <char num='918' name='Zeta' convertTo='$Z$' />
111
+ <char num='919' name='Eta' convertTo='$H$' />
112
+ <char num='920' name='Theta' convertTo='$\\Theta$' />
113
+ <char num='921' name='Iota' convertTo='$I$' />
114
+ <char num='922' name='Kappa' convertTo='$K$' />
115
+ <char num='923' name='Lambda' convertTo='$\\Lambda$' />
116
+ <char num='924' name='Mu' convertTo='$M$' />
117
+ <char num='925' name='Nu' convertTo='$N$' />
118
+ <char num='926' name='Xi' convertTo='$\\Xi$' />
119
+ <char num='927' name='Omicron' convertTo='$O$' />
120
+ <char num='928' name='Pi' convertTo='$\\Pi$' />
121
+ <char num='929' name='Rho' convertTo='$P$' />
122
+ <char num='931' name='Sigma' convertTo='$\\Sigma$' />
123
+ <char num='932' name='Tau' convertTo='$T$' />
124
+ <char num='933' name='Upsilon' convertTo='$Y$' />
125
+ <char num='934' name='Phi' convertTo='$\\Phi$' />
126
+ <char num='935' name='Chi' convertTo='$X$' />
127
+ <char num='936' name='Psi' convertTo='$\\Psi$' />
128
+ <char num='937' name='Omega' convertTo='$\\Omega$' />
129
+ <char num='945' name='alpha' convertTo='$\\alpha$' />
130
+ <char num='946' name='beta' convertTo='$\\beta$' />
131
+ <char num='947' name='gamma' convertTo='$\\gamma$' />
132
+ <char num='948' name='delta' convertTo='$\\delta$' />
133
+ <char num='949' name='epsilon' convertTo='$\\epsilon$' />
134
+ <char num='950' name='zeta' convertTo='$\\zeta$' />
135
+ <char num='951' name='eta' convertTo='$\\eta$' />
136
+ <char num='952' name='theta' convertTo='$\\theta$' />
137
+ <char num='953' name='iota' convertTo='$\\iota$' />
138
+ <char num='954' name='kappa' convertTo='$\\kappa$' />
139
+ <char num='955' name='lambda' convertTo='$\\lambda$' />
140
+ <char num='956' name='mu' convertTo='$\\mu$' />
141
+
142
+ <char num='957' name='nu' convertTo='$\\nu$' />
143
+ <char num='958' name='xi' convertTo='$\\xi$' />
144
+ <char num='959' name='omicron' convertTo='$o$' />
145
+ <char num='960' name='pi' convertTo='$\\pi$' />
146
+ <char num='961' name='rho' convertTo='$\\rho$' />
147
+ <char num='963' name='sigma' convertTo='$\\sigma$' />
148
+ <char num='964' name='tau' convertTo='$\\tau$' />
149
+ <char num='965' name='upsilon' convertTo='$\\upsilon$' />
150
+ <char num='966' name='phi' convertTo='$\\phi$' />
151
+
152
+ <char num='967' name='chi' convertTo='$\\chi$' />
153
+ <char num='968' name='psi' convertTo='$\\psi$' />
154
+ <char num='969' name='omega' convertTo='$\\omega$' />
155
+ <char num='962' name='sigmaf' convertTo='$\\varsigma$' />
156
+ <char num='977' name='thetasym' convertTo='$\\vartheta$' />
157
+ <char num='982' name='piv' convertTo='$\\varpi$' />
158
+ <char num='8230' name='hellip' convertTo='\\ldots' />
159
+ <char num='8242' name='prime' convertTo='$\\prime$' />
160
+ <char num='8254' name='oline' convertTo='-' />
161
+
162
+ <char num='8260' name='frasl' convertTo='/' />
163
+ <char num='8472' name='weierp' convertTo='$\\wp$' />
164
+ <char num='8465' name='image' convertTo='$\\Im$' />
165
+ <char num='8476' name='real' convertTo='$\\Re$' />
166
+ <char num='8501' name='alefsym' convertTo='$\\aleph$' />
167
+ <char num='8226' name='bull' convertTo='$\\bullet$' />
168
+ <char num='8482' name='trade' convertTo='$^{\\rm TM}$' /> <!-- \texttrademark -->
169
+ <char num='8592' name='larr' convertTo='$\\leftarrow$' />
170
+
171
+ <char num='8594' name='rarr' convertTo='$\\rightarrow$' />
172
+ <char num='8593' name='uarr' convertTo='$\\uparrow$' />
173
+ <char num='8595' name='darr' convertTo='$\\downarrow$' />
174
+ <char num='8596' name='harr' convertTo='$\\leftrightarrow$' />
175
+ <char num='8629' name='crarr' convertTo='$\\hookleftarrow$' />
176
+ <char num='8657' name='uArr' convertTo='$\\Uparrow$' />
177
+ <char num='8659' name='dArr' convertTo='$\\Downarrow$' />
178
+ <char num='8656' name='lArr' convertTo='$\\Leftarrow$' />
179
+ <char num='8658' name='rArr' convertTo='$\\Rightarrow$' />
180
+
181
+ <char num='8660' name='hArr' convertTo='$\\Leftrightarrow$' />
182
+ <char num='8704' name='forall' convertTo='$\\forall$' />
183
+ <char num='8706' name='part' convertTo='$\\partial$' />
184
+ <char num='8707' name='exist' convertTo='$\\exists$' />
185
+ <char num='8709' name='empty' convertTo='$\\emptyset$' />
186
+ <char num='8711' name='nabla' convertTo='$\\nabla$' />
187
+ <char num='8712' name='isin' convertTo='$\\in$' />
188
+ <char num='8715' name='ni' convertTo='$\\ni$' />
189
+ <char num='8713' name='notin' convertTo='$\\notin$' />
190
+
191
+ <char num='8721' name='sum' convertTo='$\\sum$' />
192
+ <char num='8719' name='prod' convertTo='$\\prod$' />
193
+ <char num='8722' name='minus' convertTo='$-$' />
194
+ <char num='8727' name='lowast' convertTo='$\\ast$' />
195
+ <char num='8730' name='radic' convertTo='$\\surd$' />
196
+ <char num='8733' name='prop' convertTo='$\\propto$' />
197
+ <char num='8734' name='infin' convertTo='$\\infty$' />
198
+ <char num='8736' name='ang' convertTo='$\\angle$' />
199
+ <char num='8743' name='and' convertTo='$\\wedge$' />
200
+
201
+ <char num='8744' name='or' convertTo='$\\vee$' />
202
+ <char num='8745' name='cup' convertTo='$\\cup$' />
203
+ <char num='8746' name='cap' convertTo='$\\cap$' />
204
+ <char num='8747' name='int' convertTo='$\\int$' />
205
+ <char num='8756' name='there4' convertTo='$\\therefore$' package='amssymb' /> <!-- only AMS -->
206
+ <char num='8764' name='sim' convertTo='$\\sim$' />
207
+ <char num='8776' name='asymp' convertTo='$\\approx$' />
208
+ <char num='8773' name='cong' convertTo='$\\cong$' />
209
+
210
+ <char num='8800' name='ne' convertTo='$\\neq$' />
211
+ <char num='8801' name='equiv' convertTo='$\\equiv$' />
212
+ <char num='8804' name='le' convertTo='$\\leq$' />
213
+ <char num='8805' name='ge' convertTo='$\\geq$' />
214
+ <char num='8834' name='sub' convertTo='$\\subset$' />
215
+ <char num='8835' name='sup' convertTo='$\\supset$' />
216
+ <!-- <char num='8838' name='sube' convertTo='$\\subseteq$' />-->
217
+ <char num='8839' name='supe' convertTo='$\\supseteq$' />
218
+ <!-- <char num='8836' name='nsub' convertTo='$\\nsubset$' /> --><!-- only AMS -->
219
+
220
+ <char num='8853' name='oplus' convertTo='$\\oplus$' />
221
+ <char num='8855' name='otimes' convertTo='$\\otimes$' />
222
+ <char num='8869' name='perp' convertTo='$\\perp$' />
223
+ <char num='8901' name='sdot' convertTo='$\\cdot$' />
224
+ <char num='8968' name='rceil' convertTo='$\\rceil$' />
225
+ <char num='8969' name='lceil' convertTo='$\\lceil$' />
226
+ <char num='8970' name='lfloor' convertTo='$\\lfloor$' />
227
+ <char num='8971' name='rfloor' convertTo='$\\rfloor$' />
228
+ <char num='9001' name='rang' convertTo='$\\rangle$' />
229
+
230
+ <char num='9002' name='lang' convertTo='$\\langle$' />
231
+ <char num='9674' name='loz' convertTo='$\\lozenge$' package='amssymb' /> <!-- only AMS -->
232
+ <char num='9824' name='spades' convertTo='$\\spadesuit$' />
233
+ <char num='9827' name='clubs' convertTo='$\\clubsuit$' />
234
+ <char num='9829' name='hearts' convertTo='$\\heartsuit$' />
235
+ <char num='9830' name='diams' convertTo='$\\diamondsuit$' />
236
+ <char num='38' name='amp' convertTo='\\@AMP' />
237
+ <!-- <char num='34' name='quot' convertTo='\\@DOUBLEQUOT' /> XXX -->
238
+ <char num='34' name='quot' convertTo='\"' />
239
+ <char num='39' name='apos' convertTo=\"'\" />
240
+ <char num='169' name='copy' convertTo='\\copyright' />
241
+
242
+ <char num='60' name='lt' convertTo='$@LT$' />
243
+ <char num='62' name='gt' convertTo='$@GT$' />
244
+ <char num='338' name='OElig' convertTo='\\OE' />
245
+ <char num='339' name='oelig' convertTo='\\oe' />
246
+ <char num='352' name='Scaron' convertTo='\\v{S}' />
247
+ <char num='353' name='scaron' convertTo='\\v{s}' />
248
+ <char num='376' name='Yuml' convertTo='\\\"Y' />
249
+ <char num='710' name='circ' convertTo='\\textasciicircum' />
250
+ <char num='732' name='tilde' convertTo='\\textasciitilde' />
251
+
252
+ <char num='8211' name='ndash' convertTo='--' />
253
+ <char num='8212' name='mdash' convertTo='---' />
254
+ <char num='8216' name='lsquo' convertTo='`' />
255
+ <char num='8217' name='rsquo' convertTo=\"'\" /> <!-- XXXX -->
256
+ <char num='8220' name='ldquo' convertTo='``' />
257
+ <char num='8221' name='rdquo' convertTo=\"''\" /> <!-- XXXX -->
258
+ <char num='8224' name='dagger' convertTo='\\dag' />
259
+ <char num='8225' name='Dagger' convertTo='\\ddag' />
260
+ <char num='8240' name='permil' convertTo='\\permil' package='wasysym' /> <!-- wasysym package -->
261
+
262
+ <char num='8364' name='euro' convertTo='\\euro' package='eurosym' /> <!-- eurosym package -->
263
+ <char num='8249' name='lsaquo' convertTo='\\guilsinglleft' package='aeguill'/>
264
+ <char num='8250' name='rsaquo' convertTo='\\guilsinglright' package='aeguill' />
265
+ <!-- <char num='160' name='nbsp' convertTo='\\nolinebreak' />-->
266
+ <char num='160' name='nbsp' convertTo='~' />
267
+ <char num='161' name='iexcl' convertTo='\\textexclamdown' />
268
+ <char num='163' name='pound' convertTo='\\pounds' />
269
+ <char num='164' name='curren' convertTo='\\currency' package='wasysym' /> <!-- wasysym package -->
270
+ <char num='165' name='yen' convertTo='\\textyen' package='textcomp'/> <!-- textcomp -->
271
+
272
+ <char num='166' name='brvbar' convertTo='\\brokenvert' /> <!-- wasysym -->
273
+ <char num='167' name='sect' convertTo='\\S' />
274
+ <char num='171' name='laquo' convertTo='\\guillemotleft' package='aeguill'/>
275
+ <char num='187' name='raquo' convertTo='\\guillemotright' package='aeguill'/>
276
+ <char num='174' name='reg' convertTo='\\textregistered' />
277
+ <char num='170' name='ordf' convertTo='\\textordfeminine' />
278
+ <char num='172' name='not' convertTo='$\\neg$' />
279
+ <!-- <char num='176' name='deg' convertTo='$\\degree$' /> --><!-- mathabx -->
280
+ <char num='176' name='deg' convertTo='\\textdegree' package='textcomp'/>
281
+
282
+ <char num='177' name='plusmn' convertTo='$\\pm$' />
283
+ <char num='180' name='acute' convertTo='@QUOT' />
284
+ <char num='181' name='micro' convertTo='$\\mu$' />
285
+ <char num='182' name='para' convertTo='\\P' />
286
+ <char num='183' name='middot' convertTo='$\\cdot$' />
287
+ <char num='186' name='ordm' convertTo='\\textordmasculine' />
288
+ <char num='162' name='cent' convertTo='\\cent' package='wasysym' />
289
+ <char num='185' name='sup1' convertTo='$^1$' />
290
+
291
+ <char num='178' name='sup2' convertTo='$^2$' />
292
+ <char num='179' name='sup3' convertTo='$^3$' />
293
+ <char num='189' name='frac12' convertTo='$\\frac{1}{2}$' />
294
+ <char num='188' name='frac14' convertTo='$\\frac{1}{4}$' />
295
+ <char num='190' name='frac34' convertTo='$\\frac{3}{4}$' />
296
+ <char num='192' name='Agrave' convertTo='\\`A' />
297
+ <char num='193' name='Aacute' convertTo='\\@QUOTA' />
298
+ <char num='194' name='Acirc' convertTo='\\^A' />
299
+ <char num='195' name='Atilde' convertTo='\\~A' />
300
+
301
+ <char num='196' name='Auml' convertTo='\\@DOUBLEQUOTA' />
302
+ <char num='197' name='Aring' convertTo='\\AA' />
303
+ <char num='198' name='AElig' convertTo='\\AE' />
304
+ <char num='199' name='Ccedil' convertTo='\\c{C}' />
305
+ <char num='200' name='Egrave' convertTo='\\`E' />
306
+ <char num='201' name='Eacute' convertTo='\\@QUOTE' />
307
+ <char num='202' name='Ecirc' convertTo='\\^E' />
308
+ <char num='203' name='Euml' convertTo='\\@DOUBLEQUOTE' />
309
+ <char num='204' name='Igrave' convertTo='\\`I' />
310
+ <char num='205' name='Iacute' convertTo='\\@QUOTI' />
311
+ <char num='206' name='Icirc' convertTo='\\^I' />
312
+ <char num='207' name='Iuml' convertTo='\\\"I' />
313
+ <char num='208' name='ETH' convertTo='$\\eth$' /> <!-- AMS -->
314
+ <char num='209' name='Ntilde' convertTo='\\~N' />
315
+ <char num='210' name='Ograve' convertTo='\\`O' />
316
+ <char num='211' name='Oacute' convertTo='\\@QUOT O' />
317
+ <char num='212' name='Ocirc' convertTo='\\^O' />
318
+ <char num='213' name='Otilde' convertTo='\\~O' />
319
+ <char num='214' name='Ouml' convertTo='\\@DOUBLEQUOTO' />
320
+ <char num='215' name='times' convertTo='$\\times$' />
321
+ <char num='216' name='Oslash' convertTo='\\O' />
322
+ <char num='217' name='Ugrave' convertTo='\\`U' />
323
+ <char num='218' name='Uacute' convertTo='\\@QUOTU' />
324
+ <char num='219' name='Ucirc' convertTo='\\^U' />
325
+ <char num='220' name='Uuml' convertTo='\\@DOUBLEQUOTU' />
326
+ <char num='221' name='Yacute' convertTo='\\@QUOTY' />
327
+ <char num='223' name='szlig' convertTo='\\ss' />
328
+ <char num='224' name='agrave' convertTo='\\`a' />
329
+ <char num='225' name='aacute' convertTo='\\@QUOTa' />
330
+ <char num='226' name='acirc' convertTo='\\^a' />
331
+ <char num='227' name='atilde' convertTo='\\~a' />
332
+ <char num='228' name='auml' convertTo='\\@DOUBLEQUOTa' />
333
+ <char num='229' name='aring' convertTo='\\aa' />
334
+ <char num='230' name='aelig' convertTo='\\ae' />
335
+ <char num='231' name='ccedil' convertTo='\\c{c}' />
336
+ <char num='232' name='egrave' convertTo='\\`e' />
337
+ <char num='233' name='eacute' convertTo='\\@QUOTe' />
338
+ <char num='234' name='ecirc' convertTo='\\^e' />
339
+ <char num='235' name='euml' convertTo='\\@DOUBLEQUOTe' />
340
+ <char num='236' name='igrave' convertTo='\\`i' />
341
+ <char num='237' name='iacute' convertTo='\\@QUOTi' />
342
+ <char num='238' name='icirc' convertTo='\\^i' />
343
+ <char num='239' name='iuml' convertTo='\\@DOUBLEQUOTi' />
344
+ <char num='240' name='eth' convertTo='$\\eth$' package='amssymb'/> <!-- -->
345
+ <char num='241' name='ntilde' convertTo='\\~n' />
346
+ <char num='242' name='ograve' convertTo='\\`o' />
347
+ <char num='243' name='oacute' convertTo='\\@QUOTo' />
348
+ <char num='244' name='ocirc' convertTo='\\^o' />
349
+ <char num='245' name='otilde' convertTo='\\~o' />
350
+ <char num='246' name='ouml' convertTo='\\@DOUBLEQUOTo' />
351
+ <!-- <char num='247' name='divide' convertTo='$\\divide$' /> -->
352
+ <char num='248' name='oslash' convertTo='\\o' />
353
+ <char num='249' name='ugrave' convertTo='\\`u' />
354
+ <char num='250' name='uacute' convertTo='\\@QUOTu' />
355
+ <char num='251' name='ucirc' convertTo='\\^u' />
356
+ <char num='252' name='uuml' convertTo='\\@DOUBLEQUOTu' />
357
+ <char num='253' name='yacute' convertTo='\\@QUOTy' />
358
+
359
+ <char num='255' name='yuml' convertTo='\\@DOUBLEQUOTy' />
360
+
361
+ <char num='222' name='THORN' convertTo='\\Thorn' package='wasysym' />
362
+ <char num='254' name='thorn' convertTo='\\thorn' package='wasysym' />
363
+ </chars>"
364
+
365
+
366
+ end end end
367
+
@@ -0,0 +1,64 @@
1
+ #--
2
+ # Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
3
+ #
4
+ # This file is part of Maruku.
5
+ #
6
+ # Maruku is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation; either version 2 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Maruku is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Maruku; if not, write to the Free Software
18
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ #++
20
+
21
+
22
+
23
+ class String
24
+
25
+ # These are TeX's special characters
26
+ LATEX_ADD_SLASH = [ ?{, ?}, ?$, ?&, ?#, ?_, ?%]
27
+
28
+ # These, we transform to {\tt \char<ascii code>}
29
+ LATEX_TO_CHARCODE = [ ?^, ?~, ?>,?<]
30
+
31
+ def escape_to_latex(s)
32
+ s2 = ""
33
+ s.each_byte do |b|
34
+ if LATEX_TO_CHARCODE.include? b
35
+ s2 += "{\\tt \\char#{b}}"
36
+ elsif LATEX_ADD_SLASH.include? b
37
+ s2 << ?\\ << b
38
+ elsif b == ?\\
39
+ # there is no backslash in cmr10 fonts
40
+ s2 += "$\\backslash$"
41
+ else
42
+ s2 << b
43
+ end
44
+ end
45
+ s2
46
+ end
47
+
48
+ # escapes special characters
49
+ def to_latex
50
+ s = escape_to_latex(self)
51
+ OtherGoodies.each do |k, v|
52
+ s.gsub!(k, v)
53
+ end
54
+ s
55
+ end
56
+
57
+ # other things that are good on the eyes
58
+ OtherGoodies = {
59
+ /(\s)LaTeX/ => '\1\\LaTeX\\xspace ', # XXX not if already \LaTeX
60
+ # 'HTML' => '\\textsc{html}\\xspace ',
61
+ # 'PDF' => '\\textsc{pdf}\\xspace '
62
+ }
63
+
64
+ end
@@ -0,0 +1,164 @@
1
+ #--
2
+ # Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
3
+ #
4
+ # This file is part of Maruku.
5
+ #
6
+ # Maruku is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation; either version 2 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Maruku is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Maruku; if not, write to the Free Software
18
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ #++
20
+
21
+
22
+ class String
23
+ # XXX: markdown escaping
24
+ def to_md(c=nil)
25
+ to_s
26
+ end
27
+
28
+ # " andrea censi " => [" andrea ", "censi "]
29
+ def mysplit
30
+ split.map{|x| x+" "}
31
+ end
32
+ end
33
+
34
+
35
+ module MaRuKu; module Out; module Markdown
36
+
37
+ DefaultLineLength = 40
38
+
39
+ def to_md(context={})
40
+ children_to_md(context)
41
+ end
42
+
43
+ def to_md_paragraph(context)
44
+ line_length = context[:line_length] || DefaultLineLength
45
+ wrap(@children, line_length, context)+"\n"
46
+ end
47
+
48
+ def to_md_li_span(context)
49
+ len = (context[:line_length] || DefaultLineLength) - 2
50
+ s = add_tabs(wrap(@children, len-2, context), 1, ' ')
51
+ s[0] = ?*
52
+ s + "\n"
53
+ end
54
+
55
+ def to_md_abbr_def(context)
56
+ "*[#{self.abbr}]: #{self.text}\n"
57
+ end
58
+
59
+ def to_md_ol(context)
60
+ len = (context[:line_length] || DefaultLineLength) - 2
61
+ md = ""
62
+ self.children.each_with_index do |li, i|
63
+ s = add_tabs(w=wrap(li.children, len-2, context), 1, ' ')+"\n"
64
+ s[0,4] = "#{i+1}. "[0,4]
65
+ # puts w.inspect
66
+ md += s
67
+ end
68
+ md + "\n"
69
+ end
70
+
71
+ def to_md_ul(context)
72
+ len = (context[:line_length] || DefaultLineLength) - 2
73
+ md = ""
74
+ self.children.each_with_index do |li, i|
75
+ w = wrap(li.children, len-2, context)
76
+ # puts "W: "+ w.inspect
77
+ s = add_indent(w)
78
+ # puts "S: " +s.inspect
79
+ s[0,1] = "-"
80
+ md += s
81
+ end
82
+ md + "\n"
83
+ end
84
+
85
+ def add_indent(s,char=" ")
86
+ t = s.split("\n").map{|x| char+x }.join("\n")
87
+ s << ?\n if t[-1] == ?\n
88
+ s
89
+ end
90
+
91
+ # Convert each child to html
92
+ def children_to_md(context)
93
+ array_to_md(@children, context)
94
+ end
95
+
96
+ def wrap(array, line_length, context)
97
+ out = ""
98
+ line = ""
99
+ array.each do |c|
100
+ if c.kind_of?(MDElement) && c.node_type == :linebreak
101
+ out << line.strip << " \n"; line="";
102
+ next
103
+ end
104
+
105
+ pieces =
106
+ if c.kind_of? String
107
+ c.to_md.mysplit
108
+ else
109
+ [c.to_md(context)].flatten
110
+ end
111
+
112
+ # puts "Pieces: #{pieces.inspect}"
113
+ pieces.each do |p|
114
+ if p.size + line.size > line_length
115
+ out << line.strip << "\n";
116
+ line = ""
117
+ end
118
+ line << p
119
+ end
120
+ end
121
+ out << line.strip << "\n" if line.size > 0
122
+ out << ?\n if not out[-1] == ?\n
123
+ out
124
+ end
125
+
126
+
127
+ def array_to_md(array, context, join_char='')
128
+ e = []
129
+ array.each do |c|
130
+ method = c.kind_of?(MDElement) ?
131
+ "to_md_#{c.node_type}" : "to_md"
132
+
133
+ if not c.respond_to?(method)
134
+ #raise "Object does not answer to #{method}: #{c.class} #{c.inspect[0,100]}"
135
+ # tell_user "Using default for #{c.node_type}"
136
+ method = 'to_md'
137
+ end
138
+
139
+ # puts "#{c.inspect} created with method #{method}"
140
+ h = c.send(method, context)
141
+
142
+ if h.nil?
143
+ raise "Nil md for #{c.inspect} created with method #{method}"
144
+ end
145
+
146
+ if h.kind_of?Array
147
+ e = e + h
148
+ else
149
+ e << h
150
+ end
151
+ end
152
+ e.join(join_char)
153
+ end
154
+
155
+ end end end
156
+
157
+ module MaRuKu; class MDDocument
158
+ alias old_md to_md
159
+ def to_md(context={})
160
+ s = old_md(context)
161
+ # puts s
162
+ s
163
+ end
164
+ end end