patcito-maruku 0.6.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.
- data/AUTHORS +23 -0
- data/LICENSE +340 -0
- data/README.md +73 -0
- data/bin/maruku +196 -0
- data/bin/marutex +4 -0
- data/data/entities.xml +261 -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/docs/website/src/bluecloth.md +25 -0
- data/docs/website/src/download.md +31 -0
- data/docs/website/src/maruku.md +261 -0
- data/docs/website/src/proposal.md +271 -0
- data/lib/maruku.rb +132 -0
- data/lib/maruku/attributes.rb +138 -0
- data/lib/maruku/defaults.rb +69 -0
- data/lib/maruku/errors.rb +89 -0
- data/lib/maruku/ext/div.rb +121 -0
- data/lib/maruku/ext/fenced_code.rb +78 -0
- data/lib/maruku/ext/math.rb +37 -0
- data/lib/maruku/ext/math/elements.rb +21 -0
- data/lib/maruku/ext/math/latex_fix.rb +12 -0
- data/lib/maruku/ext/math/mathml_engines/blahtex.rb +93 -0
- data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +39 -0
- data/lib/maruku/ext/math/mathml_engines/none.rb +21 -0
- data/lib/maruku/ext/math/mathml_engines/ritex.rb +24 -0
- data/lib/maruku/ext/math/parsing.rb +125 -0
- data/lib/maruku/ext/math/to_html.rb +237 -0
- data/lib/maruku/ext/math/to_latex.rb +36 -0
- data/lib/maruku/ext/yaml.rb +43 -0
- data/lib/maruku/helpers.rb +214 -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 +608 -0
- data/lib/maruku/input/parse_doc.rb +240 -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 +31 -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 +994 -0
- data/lib/maruku/output/to_latex.rb +580 -0
- data/lib/maruku/output/to_latex_entities.rb +101 -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 +54 -0
- data/lib/maruku/string_utils.rb +185 -0
- data/lib/maruku/structures.rb +143 -0
- data/lib/maruku/structures_inspect.rb +51 -0
- data/lib/maruku/structures_iterators.rb +48 -0
- data/lib/maruku/textile2.rb +1 -0
- data/lib/maruku/toc.rb +214 -0
- data/lib/maruku/usage/example1.rb +33 -0
- data/lib/maruku/version +0 -0
- data/lib/maruku/version.rb +54 -0
- data/spec/block_docs/abbreviations.md +52 -0
- data/spec/block_docs/alt.md +17 -0
- data/spec/block_docs/attributes/att2.md +20 -0
- data/spec/block_docs/attributes/att3.md +28 -0
- data/spec/block_docs/attributes/attributes.md +57 -0
- data/spec/block_docs/attributes/circular.md +26 -0
- data/spec/block_docs/attributes/default.md +22 -0
- data/spec/block_docs/blank.md +24 -0
- data/spec/block_docs/blanks_in_code.md +75 -0
- data/spec/block_docs/bug_def.md +16 -0
- data/spec/block_docs/bug_table.md +46 -0
- data/spec/block_docs/code.md +34 -0
- data/spec/block_docs/code2.md +28 -0
- data/spec/block_docs/code3.md +71 -0
- data/spec/block_docs/data_loss.md +25 -0
- data/spec/block_docs/divs/div1.md +167 -0
- data/spec/block_docs/divs/div2.md +21 -0
- data/spec/block_docs/divs/div3_nest.md +45 -0
- data/spec/block_docs/easy.md +15 -0
- data/spec/block_docs/email.md +20 -0
- data/spec/block_docs/encoding/iso-8859-1.md +23 -0
- data/spec/block_docs/encoding/utf-8.md +18 -0
- data/spec/block_docs/entities.md +94 -0
- data/spec/block_docs/escaping.md +67 -0
- data/spec/block_docs/extra_dl.md +52 -0
- data/spec/block_docs/extra_header_id.md +63 -0
- data/spec/block_docs/extra_table1.md +37 -0
- data/spec/block_docs/footnotes.md +97 -0
- data/spec/block_docs/headers.md +37 -0
- data/spec/block_docs/hex_entities.md +37 -0
- data/spec/block_docs/hrule.md +39 -0
- data/spec/block_docs/html2.md +22 -0
- data/spec/block_docs/html3.md +31 -0
- data/spec/block_docs/html4.md +25 -0
- data/spec/block_docs/html5.md +23 -0
- data/spec/block_docs/ie.md +49 -0
- data/spec/block_docs/images.md +90 -0
- data/spec/block_docs/images2.md +31 -0
- data/spec/block_docs/inline_html.md +152 -0
- data/spec/block_docs/inline_html2.md +21 -0
- data/spec/block_docs/links.md +152 -0
- data/spec/block_docs/links2.md +22 -0
- data/spec/block_docs/list1.md +46 -0
- data/spec/block_docs/list12.md +28 -0
- data/spec/block_docs/list2.md +56 -0
- data/spec/block_docs/list3.md +64 -0
- data/spec/block_docs/list4.md +89 -0
- data/spec/block_docs/lists.md +192 -0
- data/spec/block_docs/lists10.md +34 -0
- data/spec/block_docs/lists11.md +23 -0
- data/spec/block_docs/lists6.md +41 -0
- data/spec/block_docs/lists9.md +64 -0
- data/spec/block_docs/lists_after_paragraph.md +208 -0
- data/spec/block_docs/lists_ol.md +262 -0
- data/spec/block_docs/loss.md +16 -0
- data/spec/block_docs/math/equations.md +45 -0
- data/spec/block_docs/math/inline.md +46 -0
- data/spec/block_docs/math/math2.md +45 -0
- data/spec/block_docs/math/notmath.md +25 -0
- data/spec/block_docs/math/table.md +25 -0
- data/spec/block_docs/math/table2.md +42 -0
- data/spec/block_docs/misc_sw.md +525 -0
- data/spec/block_docs/notyet/escape.md +21 -0
- data/spec/block_docs/notyet/header_after_par.md +58 -0
- data/spec/block_docs/notyet/ticks.md +18 -0
- data/spec/block_docs/notyet/triggering.md +157 -0
- data/spec/block_docs/olist.md +45 -0
- data/spec/block_docs/one.md +15 -0
- data/spec/block_docs/paragraph.md +16 -0
- data/spec/block_docs/paragraph_rules/dont_merge_ref.md +42 -0
- data/spec/block_docs/paragraph_rules/tab_is_blank.md +24 -0
- data/spec/block_docs/paragraphs.md +46 -0
- data/spec/block_docs/pending/amps.md +15 -0
- data/spec/block_docs/pending/empty_cells.md +37 -0
- data/spec/block_docs/pending/link.md +72 -0
- data/spec/block_docs/pending/ref.md +21 -0
- data/spec/block_docs/recover/recover_links.md +15 -0
- data/spec/block_docs/red_tests/abbrev.md +679 -0
- data/spec/block_docs/red_tests/lists7.md +32 -0
- data/spec/block_docs/red_tests/lists7b.md +65 -0
- data/spec/block_docs/red_tests/lists8.md +42 -0
- data/spec/block_docs/red_tests/ref.md +23 -0
- data/spec/block_docs/red_tests/xml.md +35 -0
- data/spec/block_docs/references/long_example.md +71 -0
- data/spec/block_docs/references/spaces_and_numbers.md +15 -0
- data/spec/block_docs/smartypants.md +114 -0
- data/spec/block_docs/syntax_hl.md +52 -0
- data/spec/block_docs/table_attributes.md +34 -0
- data/spec/block_docs/test.md +19 -0
- data/spec/block_docs/underscore_in_words.md +15 -0
- data/spec/block_docs/wrapping.md +67 -0
- data/spec/block_docs/xml2.md +19 -0
- data/spec/block_docs/xml3.md +26 -0
- data/spec/block_docs/xml_instruction.md +52 -0
- data/spec/block_spec.rb +49 -0
- data/spec/span_spec.rb +254 -0
- data/spec/spec_helper.rb +6 -0
- metadata +247 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
# Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
|
2
|
+
#
|
3
|
+
# This file is part of Maruku.
|
4
|
+
#
|
5
|
+
# Maruku is free software; you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation; either version 2 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Maruku is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with Maruku; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
|
20
|
+
module MaRuKu
|
21
|
+
|
22
|
+
Globals = {
|
23
|
+
:unsafe_features => false,
|
24
|
+
:on_error => :warning,
|
25
|
+
|
26
|
+
:yaml_frontmatter => false,
|
27
|
+
|
28
|
+
:use_numbered_headers => false,
|
29
|
+
|
30
|
+
:maruku_signature => false,
|
31
|
+
:code_background_color => '#fef',
|
32
|
+
:code_show_spaces => false,
|
33
|
+
|
34
|
+
:filter_html => false,
|
35
|
+
|
36
|
+
:html_math_output_mathjax => true,
|
37
|
+
:html_math_output_span_equations => false,
|
38
|
+
|
39
|
+
:html_math_output_mathml => true, # also set :html_math_engine
|
40
|
+
:html_math_engine => 'none', #ritex, itex2mml
|
41
|
+
|
42
|
+
:html_math_output_png => false,
|
43
|
+
:html_png_engine => 'none',
|
44
|
+
:html_png_dir => 'pngs',
|
45
|
+
:html_png_url => 'pngs/',
|
46
|
+
:html_png_resolution => 200,
|
47
|
+
|
48
|
+
:html_use_syntax => false,
|
49
|
+
|
50
|
+
:latex_use_listings => false,
|
51
|
+
:latex_cjk => false,
|
52
|
+
:latex_cache_file => "blahtex_cache.pstore", # cache file for blahtex filter
|
53
|
+
|
54
|
+
:debug_keep_ials => false,
|
55
|
+
:doc_prefix => ''
|
56
|
+
}
|
57
|
+
|
58
|
+
class MDElement
|
59
|
+
def get_setting(sym)
|
60
|
+
return attributes[sym] if attributes.has_key?(sym)
|
61
|
+
return doc.attributes[sym] if doc && doc.attributes.has_key?(sym)
|
62
|
+
return MaRuKu::Globals[sym] if MaRuKu::Globals.has_key?(sym)
|
63
|
+
|
64
|
+
$stderr.puts "Bug: no default for #{sym.inspect}"
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
|
2
|
+
#
|
3
|
+
# This file is part of Maruku.
|
4
|
+
#
|
5
|
+
# Maruku is free software; you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation; either version 2 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Maruku is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with Maruku; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
|
20
|
+
module MaRuKu
|
21
|
+
class Exception < RuntimeError; end
|
22
|
+
|
23
|
+
module Errors
|
24
|
+
FRAME_WIDTH = 75
|
25
|
+
|
26
|
+
# Properly handles a formatting error.
|
27
|
+
# All such errors go through this method.
|
28
|
+
#
|
29
|
+
# The behavior depends on {MaRuKu::Globals `MaRuKu::Globals[:on_error]`}.
|
30
|
+
# If this is `:warning`, this prints the error to stderr
|
31
|
+
# (or `@error_stream if` it's defined) and tries to continue.
|
32
|
+
# If `:on_error` is `:ignore`, this doesn't print anything
|
33
|
+
# and tries to continue. If it's `:raise`, this raises a {MaRuKu::Exception}.
|
34
|
+
#
|
35
|
+
# By default, `:on_error` is set to `:warning`.
|
36
|
+
#
|
37
|
+
# @overload def maruku_error(s, src = nil, con = nil)
|
38
|
+
# @param s [String] The text of the error
|
39
|
+
# @param src [#describe, nil] The source of the error
|
40
|
+
# @param con [#describe, nil] The context of the error
|
41
|
+
# @raise [MaRuKu::Exception] If `:on_error` is set to `:raise`
|
42
|
+
def maruku_error(*args)
|
43
|
+
policy = get_setting(:on_error)
|
44
|
+
|
45
|
+
case policy
|
46
|
+
when :ignore
|
47
|
+
when :raise
|
48
|
+
raise_error create_frame(describe_error(*args))
|
49
|
+
when :warning
|
50
|
+
tell_user create_frame(describe_error(*args))
|
51
|
+
else
|
52
|
+
raise "Unknown on_error policy: #{policy.inspect}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def maruku_recover(*args)
|
57
|
+
tell_user create_frame(describe_error(*args))
|
58
|
+
end
|
59
|
+
alias error maruku_error
|
60
|
+
|
61
|
+
def raise_error(s)
|
62
|
+
raise MaRuKu::Exception, s, caller
|
63
|
+
end
|
64
|
+
|
65
|
+
def tell_user(s)
|
66
|
+
(self.attributes[:error_stream] || $stderr) << s
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def create_frame(s)
|
72
|
+
"\n" + <<FRAME
|
73
|
+
#{"_" * FRAME_WIDTH}
|
74
|
+
| Maruku tells you:
|
75
|
+
+#{"-" * FRAME_WIDTH}
|
76
|
+
#{s.gsub(/^/, '| ').rstrip}
|
77
|
+
+#{"-" * FRAME_WIDTH}
|
78
|
+
#{caller[0...5].join("\n").gsub(/^/, '!')}
|
79
|
+
\\#{"_" * FRAME_WIDTH}
|
80
|
+
FRAME
|
81
|
+
end
|
82
|
+
|
83
|
+
def describe_error(s, src = nil, con = nil)
|
84
|
+
s += "\n#{src.describe}\n" if src
|
85
|
+
s += "\n#{con.describe}\n" if con
|
86
|
+
s
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
#+-----------------------------------{.warning}------
|
2
|
+
#| this is the last warning!
|
3
|
+
#|
|
4
|
+
#| please, go away!
|
5
|
+
#|
|
6
|
+
#| +------------------------------------- {.menace} --
|
7
|
+
#| | or else terrible things will happen
|
8
|
+
#| +--------------------------------------------------
|
9
|
+
#+---------------------------------------------------
|
10
|
+
|
11
|
+
# TODO: Scope these properly
|
12
|
+
OpenDiv = /^[ ]{0,3}\+\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
|
13
|
+
CloseDiv = /^[ ]{0,3}\=\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
|
14
|
+
StartPipe = /^[ ]{0,3}\|(.*)$/ # $1 is rest of line
|
15
|
+
DecorativeClosing = OpenDiv
|
16
|
+
|
17
|
+
MaRuKu::In::Markdown.register_block_extension(
|
18
|
+
:regexp => OpenDiv,
|
19
|
+
:handler => lambda do |doc, src, context|
|
20
|
+
first = src.shift_line
|
21
|
+
ial_at_beginning = first[OpenDiv, 1]
|
22
|
+
ial_at_end = nil
|
23
|
+
|
24
|
+
lines = []
|
25
|
+
# if second line starts with "|"
|
26
|
+
if src.cur_line =~ StartPipe
|
27
|
+
# then we read until no more "|"
|
28
|
+
while src.cur_line && src.cur_line =~ StartPipe
|
29
|
+
lines.push $1
|
30
|
+
src.shift_line
|
31
|
+
end
|
32
|
+
if src.cur_line =~ DecorativeClosing
|
33
|
+
ial_at_end = $1
|
34
|
+
src.shift_line
|
35
|
+
end
|
36
|
+
else
|
37
|
+
# else we read until CloseDiv
|
38
|
+
divs_open = 1
|
39
|
+
while src.cur_line && divs_open > 0
|
40
|
+
if src.cur_line =~ CloseDiv
|
41
|
+
divs_open -= 1
|
42
|
+
if divs_open == 0
|
43
|
+
ial_at_end = $1
|
44
|
+
src.shift_line
|
45
|
+
break
|
46
|
+
else
|
47
|
+
lines.push src.shift_line
|
48
|
+
end
|
49
|
+
else
|
50
|
+
if src.cur_line =~ OpenDiv
|
51
|
+
divs_open += 1
|
52
|
+
end
|
53
|
+
lines.push src.shift_line
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if divs_open > 0
|
58
|
+
doc.maruku_error("At end of input, I still have #{divs_open} DIVs open.",
|
59
|
+
src, context)
|
60
|
+
next true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
ial_at_beginning = nil unless ial_at_beginning && ial_at_beginning.size > 0
|
65
|
+
ial_at_end = nil unless ial_at_end && ial_at_end.size > 0
|
66
|
+
|
67
|
+
if ial_at_beginning && ial_at_end
|
68
|
+
doc.maruku_error("Found two conflicting IALs: #{ial_at_beginning.inspect} and #{ial_at_end.inspect}",
|
69
|
+
src, context)
|
70
|
+
end
|
71
|
+
|
72
|
+
al_string = ial_at_beginning || ial_at_end
|
73
|
+
al = nil
|
74
|
+
|
75
|
+
if al_string =~ /^\{(.*)\}\s*$/
|
76
|
+
al = al_string && doc.read_attribute_list(
|
77
|
+
MaRuKu::In::Markdown::SpanLevelParser::CharSource.new($1),
|
78
|
+
nil, [nil])
|
79
|
+
end
|
80
|
+
|
81
|
+
context.push(
|
82
|
+
doc.md_div(
|
83
|
+
doc.parse_blocks(
|
84
|
+
MaRuKu::In::Markdown::BlockLevelParser::LineSource.new(lines)),
|
85
|
+
al))
|
86
|
+
true
|
87
|
+
end)
|
88
|
+
|
89
|
+
module MaRuKu
|
90
|
+
class MDElement
|
91
|
+
def md_div(children, al = nil)
|
92
|
+
type = label = num = nil
|
93
|
+
doc.refid2ref ||= {}
|
94
|
+
if al
|
95
|
+
al.each do |k, v|
|
96
|
+
case k
|
97
|
+
when :class; type = $1 if v =~ /^num_(\w*)/
|
98
|
+
when :id; label = v
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
if type
|
104
|
+
doc.refid2ref[type] ||= {}
|
105
|
+
num = doc.refid2ref[type].length + 1
|
106
|
+
end
|
107
|
+
|
108
|
+
e = self.md_el(:div, children, {:label => label, :type => type, :num => num}, al)
|
109
|
+
doc.refid2ref[type].update(label => e) if type && label
|
110
|
+
e
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
module Out
|
115
|
+
module HTML
|
116
|
+
def to_html_div
|
117
|
+
add_ws wrap_as_element('div')
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# fenced_code.rb -- Maruku extension for fenced code blocks
|
2
|
+
#
|
3
|
+
# Copyright (C) 2009 Jason R. Blevins
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
8
|
+
#
|
9
|
+
# * Redistributions of source code must retain the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer.
|
11
|
+
#
|
12
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
14
|
+
# and/or other materials provided with the distribution.
|
15
|
+
#
|
16
|
+
# * Neither the names of the copyright holders nor the names of any
|
17
|
+
# contributors may be used to endorse or promote products derived from this
|
18
|
+
# software without specific prior written permission.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
#
|
32
|
+
# Fenced code blocks begin with three or more tildes and are terminated
|
33
|
+
# by a closing line with at least as many tildes as the opening line.
|
34
|
+
# Optionally, an attribute list may appear at the end of the opening
|
35
|
+
# line. For example:
|
36
|
+
#
|
37
|
+
# ~~~~~~~~~~~~~ {: lang=ruby }
|
38
|
+
# puts 'Hello world'
|
39
|
+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
40
|
+
|
41
|
+
OpenFence = /^(~~~+?)\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*$/
|
42
|
+
|
43
|
+
MaRuKu::In::Markdown::register_block_extension(
|
44
|
+
:regexp => OpenFence,
|
45
|
+
:handler => lambda { |doc, src, context|
|
46
|
+
|
47
|
+
first = src.shift_line
|
48
|
+
first =~ OpenFence
|
49
|
+
close_fence = /^#{$1}~*$/
|
50
|
+
ial = $2
|
51
|
+
|
52
|
+
lines = []
|
53
|
+
|
54
|
+
# read until CloseFence
|
55
|
+
while src.cur_line
|
56
|
+
if src.cur_line =~ close_fence
|
57
|
+
src.shift_line
|
58
|
+
break
|
59
|
+
else
|
60
|
+
lines.push src.shift_line
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
ial = nil unless (ial && ial.size > 0)
|
65
|
+
al = nil
|
66
|
+
|
67
|
+
if ial =~ /^\{(.*?)\}\s*$/
|
68
|
+
inside = $1
|
69
|
+
cs = MaRuKu::In::Markdown::SpanLevelParser::CharSource
|
70
|
+
al = ial &&
|
71
|
+
doc.read_attribute_list(cs.new(inside),
|
72
|
+
its_context=nil, break_on=[nil])
|
73
|
+
end
|
74
|
+
|
75
|
+
source = lines.join("\n")
|
76
|
+
context.push doc.md_codeblock(source, al)
|
77
|
+
true
|
78
|
+
})
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'maruku/ext/math/elements'
|
2
|
+
require 'maruku/ext/math/parsing'
|
3
|
+
require 'maruku/ext/math/to_latex'
|
4
|
+
require 'maruku/ext/math/to_html'
|
5
|
+
|
6
|
+
require 'maruku/ext/math/mathml_engines/none'
|
7
|
+
require 'maruku/ext/math/mathml_engines/ritex'
|
8
|
+
require 'maruku/ext/math/mathml_engines/itex2mml'
|
9
|
+
require 'maruku/ext/math/mathml_engines/blahtex'
|
10
|
+
|
11
|
+
=begin maruku_doc
|
12
|
+
Attribute: math_enabled
|
13
|
+
Scope: global, document
|
14
|
+
Summary: Enables parsing of LaTeX math
|
15
|
+
|
16
|
+
To explicitly disable the math parsing:
|
17
|
+
|
18
|
+
Maruku.new(string, {:math_enabled => false})
|
19
|
+
{:ruby}
|
20
|
+
|
21
|
+
=end
|
22
|
+
|
23
|
+
MaRuKu::Globals[:math_enabled] = true
|
24
|
+
|
25
|
+
|
26
|
+
=begin maruku_doc
|
27
|
+
Attribute: math_numbered
|
28
|
+
Scope: global, document
|
29
|
+
Summary: Math openings which should be numerated
|
30
|
+
|
31
|
+
Array containing any of `'\\['`, `'\\begin{equation}'`, `'$$'`.
|
32
|
+
|
33
|
+
MaRuKu::Globals[:math_numbered] = ['\\[']
|
34
|
+
|
35
|
+
=end
|
36
|
+
|
37
|
+
MaRuKu::Globals[:math_numbered] = []
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module MaRuKu
|
2
|
+
class MDElement
|
3
|
+
def md_inline_math(math)
|
4
|
+
self.md_el(:inline_math, [], :math => math)
|
5
|
+
end
|
6
|
+
|
7
|
+
def md_equation(math, label, numerate)
|
8
|
+
reglabel = /\\label\{(\w+)\}/
|
9
|
+
math = math.gsub(reglabel, '') if label = math[reglabel, 1]
|
10
|
+
num = nil
|
11
|
+
if (label || numerate) && @doc # take number
|
12
|
+
@doc.eqid2eq ||= {}
|
13
|
+
num = @doc.eqid2eq.size + 1
|
14
|
+
label = "eq#{num}" if not label # TODO do id for document
|
15
|
+
end
|
16
|
+
e = self.md_el(:equation, [], :math => math, :label => label, :num => num)
|
17
|
+
@doc.eqid2eq[label] = e if label && @doc # take number
|
18
|
+
e
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class String
|
2
|
+
# fix some LaTeX command-name clashes
|
3
|
+
def fix_latex
|
4
|
+
if #{html_math_engine} == 'itex2mml'
|
5
|
+
s = self.gsub("\\mathop{", "\\operatorname{")
|
6
|
+
s.gsub!(/\\begin\{svg\}.*?\\end\{svg\}/m, " ")
|
7
|
+
s.gsub("\\space{", "\\itexspace{")
|
8
|
+
else
|
9
|
+
self
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'digest/md5'
|
4
|
+
require 'pstore'
|
5
|
+
|
6
|
+
module MaRuKu
|
7
|
+
module Out
|
8
|
+
module HTML
|
9
|
+
PNG = Struct.new(:src, :depth, :height)
|
10
|
+
|
11
|
+
def convert_to_png_blahtex(kind, tex)
|
12
|
+
FileUtils.mkdir_p get_setting(:html_png_dir)
|
13
|
+
|
14
|
+
# first, we check whether this image has already been processed
|
15
|
+
md5sum = Digest::MD5.hexdigest(tex + " params: ")
|
16
|
+
result_file = File.join(get_setting(:html_png_dir), md5sum + ".txt")
|
17
|
+
|
18
|
+
if not File.exists?(result_file)
|
19
|
+
Tempfile.open('maruku_blahtex') do |tmp_in|
|
20
|
+
tmp_in.write tex
|
21
|
+
tmp_in.close
|
22
|
+
|
23
|
+
# It's important taht we don't replace *all* newlines,
|
24
|
+
# because newlines in arguments get escaped as "'\n'".
|
25
|
+
system <<COMMAND.gsub("\n ", " ")
|
26
|
+
blahtex --png --use-preview-package
|
27
|
+
--shell-dvipng #{shellescape("dvipng -D #{shellescape(get_setting(:html_png_resolution).to_s)}")}
|
28
|
+
#{'--displaymath' if kind == :equation}
|
29
|
+
--temp-directory #{shellescape(get_setting(:html_png_dir))}
|
30
|
+
--png-directory #{shellescape(get_setting(:html_png_dir))}
|
31
|
+
< #{shellescape(tmp_in.path)}
|
32
|
+
> #{shellescape(result_file)}
|
33
|
+
COMMAND
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
result = File.read(result_file)
|
38
|
+
if result.nil? || result.empty?
|
39
|
+
maruku_error "Blahtex error: empty output"
|
40
|
+
return
|
41
|
+
end
|
42
|
+
|
43
|
+
doc = Document.new(result, :respect_whitespace => :all)
|
44
|
+
png = doc.root.elements[1]
|
45
|
+
if png.name != 'png'
|
46
|
+
maruku_error "Blahtex error: \n#{doc}"
|
47
|
+
return
|
48
|
+
end
|
49
|
+
|
50
|
+
raise "No depth element in:\n #{doc}" unless depth = png.elements['depth']
|
51
|
+
raise "No height element in:\n #{doc}" unless height = png.elements['height']
|
52
|
+
raise "No md5 element in:\n #{doc}" unless md5 = png.elements['md5']
|
53
|
+
|
54
|
+
depth = depth.text.to_f
|
55
|
+
height = height.text.to_f # TODO: check != 0
|
56
|
+
md5 = md5.text
|
57
|
+
|
58
|
+
PNG.new("#{get_setting(:html_png_url)}#{md5}.png", depth, height)
|
59
|
+
rescue Exception => e
|
60
|
+
maruku_error "Error: #{e}"
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def convert_to_mathml_blahtex(kind, tex)
|
65
|
+
@@BlahtexCache ||= PStore.new(get_setting(:latex_cache_file))
|
66
|
+
|
67
|
+
@@BlahtexCache.transaction do
|
68
|
+
if @@BlahtexCache[tex].nil?
|
69
|
+
Tempfile.open('maruku_blahtex') do |tmp_in|
|
70
|
+
tmp_in.write tex
|
71
|
+
|
72
|
+
Tempfile.new('maruku_blahtex') do |tmp_out|
|
73
|
+
system "blahtex --mathml < #{shellescape(tmp_in.path)} > #{shellescape(tmp_out.path)}"
|
74
|
+
@@BlahtexCache[tex] = tmp_out.read
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
blahtex = @@BlahtexCache[tex]
|
80
|
+
doc = Document.new(blahtex, :respect_whitespace => :all)
|
81
|
+
unless mathml = doc.root.elements['mathml']
|
82
|
+
maruku_error "Blahtex error: \n#{doc}"
|
83
|
+
return
|
84
|
+
end
|
85
|
+
|
86
|
+
return mathml
|
87
|
+
end
|
88
|
+
rescue Exception => e
|
89
|
+
maruku_error "Error: #{e}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|