maruku 0.6.1 → 0.7.0.beta1
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/MIT-LICENSE.txt +20 -0
- data/bin/maruku +153 -152
- data/bin/marutex +2 -29
- data/data/entities.xml +261 -0
- data/docs/math.md +14 -18
- data/lib/maruku.rb +65 -77
- data/lib/maruku/attributes.rb +109 -214
- data/lib/maruku/defaults.rb +45 -67
- data/lib/maruku/document.rb +43 -0
- data/lib/maruku/element.rb +112 -0
- data/lib/maruku/errors.rb +71 -0
- data/lib/maruku/ext/div.rb +105 -113
- data/lib/maruku/ext/fenced_code.rb +97 -0
- data/lib/maruku/ext/math.rb +22 -26
- data/lib/maruku/ext/math/elements.rb +20 -26
- data/lib/maruku/ext/math/mathml_engines/blahtex.rb +92 -104
- data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +33 -26
- data/lib/maruku/ext/math/mathml_engines/none.rb +11 -19
- data/lib/maruku/ext/math/mathml_engines/ritex.rb +2 -4
- data/lib/maruku/ext/math/parsing.rb +107 -113
- data/lib/maruku/ext/math/to_html.rb +184 -187
- data/lib/maruku/ext/math/to_latex.rb +30 -21
- data/lib/maruku/helpers.rb +158 -257
- data/lib/maruku/html.rb +254 -0
- data/lib/maruku/input/charsource.rb +272 -319
- data/lib/maruku/input/extensions.rb +62 -63
- data/lib/maruku/input/html_helper.rb +220 -189
- data/lib/maruku/input/linesource.rb +90 -110
- data/lib/maruku/input/mdline.rb +129 -0
- data/lib/maruku/input/parse_block.rb +618 -612
- data/lib/maruku/input/parse_doc.rb +145 -215
- data/lib/maruku/input/parse_span.rb +658 -0
- data/lib/maruku/input/rubypants.rb +200 -128
- data/lib/maruku/inspect_element.rb +60 -0
- data/lib/maruku/maruku.rb +10 -31
- data/lib/maruku/output/entity_table.rb +33 -0
- data/lib/maruku/output/s5/fancy.rb +462 -462
- data/lib/maruku/output/s5/to_s5.rb +115 -135
- data/lib/maruku/output/to_html.rb +898 -983
- data/lib/maruku/output/to_latex.rb +561 -560
- data/lib/maruku/output/to_markdown.rb +207 -162
- data/lib/maruku/output/to_s.rb +11 -52
- data/lib/maruku/string_utils.rb +129 -179
- data/lib/maruku/toc.rb +185 -196
- data/lib/maruku/version.rb +33 -38
- data/spec/block_docs/abbrev.md +776 -0
- data/{tests/unittest → spec/block_docs}/abbreviations.md +11 -20
- data/{tests/unittest → spec/block_docs}/alt.md +2 -14
- data/{tests/unittest/pending → spec/block_docs}/amps.md +1 -13
- data/{tests/unittest → spec/block_docs}/attributes/att2.md +0 -12
- data/{tests/unittest → spec/block_docs}/attributes/att3.md +2 -14
- data/{tests/unittest → spec/block_docs}/attributes/attributes.md +12 -16
- data/{tests/unittest → spec/block_docs}/attributes/circular.md +0 -12
- data/{tests/unittest → spec/block_docs}/attributes/default.md +1 -13
- data/{tests/unittest → spec/block_docs}/blank.md +0 -12
- data/{tests/unittest → spec/block_docs}/blanks_in_code.md +16 -15
- data/{tests/unittest/loss.md → spec/block_docs/bug_def.md} +6 -18
- data/{tests/unittest → spec/block_docs}/bug_table.md +3 -15
- data/{tests/unittest → spec/block_docs}/code.md +7 -14
- data/{tests/unittest → spec/block_docs}/code2.md +4 -14
- data/{tests/unittest → spec/block_docs}/code3.md +12 -16
- data/{tests/unittest → spec/block_docs}/data_loss.md +2 -14
- data/{tests/unittest → spec/block_docs}/divs/div1.md +0 -12
- data/{tests/unittest → spec/block_docs}/divs/div2.md +0 -12
- data/{tests/unittest → spec/block_docs}/divs/div3_nest.md +3 -15
- data/{tests/unittest → spec/block_docs}/easy.md +1 -13
- data/spec/block_docs/email.md +29 -0
- data/{tests/unittest/pending → spec/block_docs}/empty_cells.md +3 -15
- data/{tests/unittest → spec/block_docs}/encoding/iso-8859-1.md +1 -14
- data/{tests/unittest → spec/block_docs}/encoding/utf-8.md +0 -12
- data/{tests/unittest → spec/block_docs}/entities.md +27 -29
- data/{tests/unittest/notyet → spec/block_docs}/escape.md +2 -14
- data/{tests/unittest → spec/block_docs}/escaping.md +11 -22
- data/{tests/unittest → spec/block_docs}/extra_dl.md +2 -13
- data/{tests/unittest → spec/block_docs}/extra_header_id.md +14 -20
- data/{tests/unittest → spec/block_docs}/extra_table1.md +3 -15
- data/spec/block_docs/fenced_code_blocks.md +66 -0
- data/spec/block_docs/fenced_code_blocks_highlighted.md +18 -0
- data/{tests/unittest → spec/block_docs}/footnotes.md +12 -24
- data/spec/block_docs/footnotes2.md +78 -0
- data/spec/block_docs/hard.md +25 -0
- data/spec/block_docs/header_after_par.md +62 -0
- data/{tests/unittest → spec/block_docs}/headers.md +10 -18
- data/{tests/unittest → spec/block_docs}/hex_entities.md +7 -18
- data/{tests/unittest → spec/block_docs}/hrule.md +5 -12
- data/{tests/unittest → spec/block_docs}/html3.md +1 -13
- data/{tests/unittest → spec/block_docs}/html4.md +2 -14
- data/{tests/unittest → spec/block_docs}/html5.md +2 -14
- data/spec/block_docs/html_block_in_para.md +22 -0
- data/spec/block_docs/html_inline.md +25 -0
- data/spec/block_docs/html_trailing.md +31 -0
- data/spec/block_docs/ie.md +62 -0
- data/spec/block_docs/iframe.md +29 -0
- data/{tests/unittest → spec/block_docs}/images.md +22 -28
- data/{tests/unittest → spec/block_docs}/images2.md +7 -17
- data/{tests/unittest → spec/block_docs}/inline_html.md +37 -67
- data/{tests/unittest → spec/block_docs}/inline_html2.md +1 -13
- data/spec/block_docs/inline_html_beginning.md +10 -0
- data/spec/block_docs/issue20.md +9 -0
- data/spec/block_docs/issue26.md +22 -0
- data/spec/block_docs/issue29.md +9 -0
- data/spec/block_docs/issue30.md +30 -0
- data/spec/block_docs/issue31.md +25 -0
- data/spec/block_docs/issue40.md +40 -0
- data/spec/block_docs/issue64.md +55 -0
- data/spec/block_docs/issue67.md +19 -0
- data/spec/block_docs/issue70.md +11 -0
- data/spec/block_docs/issue72.md +17 -0
- data/spec/block_docs/issue74.md +38 -0
- data/spec/block_docs/issue79.md +15 -0
- data/spec/block_docs/issue83.md +13 -0
- data/spec/block_docs/issue85.md +25 -0
- data/spec/block_docs/issue88.md +19 -0
- data/spec/block_docs/issue89.md +12 -0
- data/spec/block_docs/issue90.md +38 -0
- data/{tests/unittest/pending → spec/block_docs}/link.md +21 -18
- data/{tests/unittest → spec/block_docs}/links.md +33 -32
- data/spec/block_docs/links2.md +21 -0
- data/{tests/unittest → spec/block_docs}/list1.md +0 -12
- data/{tests/unittest → spec/block_docs}/list12.md +2 -14
- data/{tests/unittest → spec/block_docs}/list2.md +2 -14
- data/spec/block_docs/list_multipara.md +42 -0
- data/{tests/unittest → spec/block_docs}/lists.md +28 -29
- data/{tests/unittest → spec/block_docs}/lists10.md +2 -14
- data/spec/block_docs/lists11.md +23 -0
- data/spec/block_docs/lists12.md +43 -0
- data/spec/block_docs/lists13.md +55 -0
- data/spec/block_docs/lists14.md +61 -0
- data/spec/block_docs/lists15.md +36 -0
- data/spec/block_docs/lists6.md +88 -0
- data/spec/block_docs/lists7b.md +58 -0
- data/spec/block_docs/lists9.md +53 -0
- data/{tests/unittest → spec/block_docs}/lists_after_paragraph.md +19 -25
- data/spec/block_docs/lists_blank.md +35 -0
- data/{tests/unittest/list3.md → spec/block_docs/lists_blockquote_code.md} +2 -14
- data/{tests/unittest/list4.md → spec/block_docs/lists_need_blank_line.md} +50 -21
- data/spec/block_docs/lists_nested.md +44 -0
- data/spec/block_docs/lists_nested_blankline.md +28 -0
- data/spec/block_docs/lists_nested_deep.md +43 -0
- data/{tests/unittest → spec/block_docs}/lists_ol.md +37 -54
- data/spec/block_docs/lists_paraindent.md +47 -0
- data/spec/block_docs/lists_tab.md +54 -0
- data/spec/block_docs/loss.md +17 -0
- data/spec/block_docs/math-blahtex/equations.md +30 -0
- data/spec/block_docs/math-blahtex/inline.md +48 -0
- data/spec/block_docs/math-blahtex/math2.md +45 -0
- data/spec/block_docs/math-blahtex/table.md +25 -0
- data/spec/block_docs/math/embedded_invalid_svg.md +79 -0
- data/spec/block_docs/math/embedded_svg.md +97 -0
- data/spec/block_docs/math/equations.md +44 -0
- data/{tests/unittest → spec/block_docs}/math/inline.md +7 -19
- data/spec/block_docs/math/math2.md +45 -0
- data/{tests/unittest → spec/block_docs}/math/notmath.md +0 -12
- data/spec/block_docs/math/raw_mathml.md +87 -0
- data/spec/block_docs/math/table.md +25 -0
- data/{tests/unittest → spec/block_docs}/math/table2.md +5 -17
- data/{tests/unittest → spec/block_docs}/misc_sw.md +181 -118
- data/{tests/unittest → spec/block_docs}/olist.md +6 -18
- data/{tests/unittest → spec/block_docs}/one.md +0 -12
- data/{tests/unittest → spec/block_docs}/paragraph.md +0 -12
- data/{tests/unittest → spec/block_docs}/paragraph_rules/dont_merge_ref.md +4 -12
- data/{tests/unittest → spec/block_docs}/paragraph_rules/tab_is_blank.md +0 -12
- data/{tests/unittest → spec/block_docs}/paragraphs.md +1 -13
- data/{tests/unittest → spec/block_docs}/recover/recover_links.md +4 -16
- data/{tests/unittest/pending/ref.md → spec/block_docs/ref_with_period.md} +7 -16
- data/spec/block_docs/ref_with_title.md +22 -0
- data/{tests/unittest → spec/block_docs}/references/long_example.md +16 -23
- data/{tests/unittest → spec/block_docs}/references/spaces_and_numbers.md +0 -12
- data/{tests/unittest → spec/block_docs}/smartypants.md +24 -31
- data/{tests/unittest → spec/block_docs}/syntax_hl.md +13 -17
- data/{tests/unittest → spec/block_docs}/table_attributes.md +2 -14
- data/spec/block_docs/tables.md +58 -0
- data/{tests/unittest → spec/block_docs}/test.md +1 -13
- data/{tests/unittest/notyet → spec/block_docs}/ticks.md +1 -13
- data/spec/block_docs/toc.md +87 -0
- data/{tests/unittest/notyet → spec/block_docs}/triggering.md +14 -25
- data/{tests/unittest → spec/block_docs}/underscore_in_words.md +0 -12
- data/{tests/unittest → spec/block_docs}/wrapping.md +4 -16
- data/spec/block_docs/xml.md +33 -0
- data/{tests/unittest → spec/block_docs}/xml2.md +0 -12
- data/spec/block_docs/xml3.md +24 -0
- data/{tests/unittest → spec/block_docs}/xml_instruction.md +9 -20
- data/spec/block_spec.rb +110 -0
- data/spec/cli_spec.rb +8 -0
- data/spec/span_spec.rb +256 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/to_html_utf8_spec.rb +13 -0
- metadata +205 -243
- metadata.gz.sig +3 -0
- data/Rakefile +0 -48
- data/bin/marudown +0 -29
- data/bin/marutest +0 -345
- data/docs/changelog.md +0 -334
- data/lib/maruku/errors_management.rb +0 -92
- data/lib/maruku/ext/math/latex_fix.rb +0 -12
- data/lib/maruku/input/parse_span_better.rb +0 -746
- data/lib/maruku/input/type_detection.rb +0 -147
- data/lib/maruku/output/to_latex_entities.rb +0 -367
- data/lib/maruku/output/to_latex_strings.rb +0 -64
- data/lib/maruku/structures.rb +0 -167
- data/lib/maruku/structures_inspect.rb +0 -87
- data/lib/maruku/structures_iterators.rb +0 -61
- data/lib/maruku/tests/benchmark.rb +0 -82
- data/lib/maruku/tests/new_parser.rb +0 -373
- data/lib/maruku/tests/tests.rb +0 -136
- data/lib/maruku/usage/example1.rb +0 -33
- data/tests/bugs/code_in_links.md +0 -101
- data/tests/bugs/complex_escaping.md +0 -38
- data/tests/math/syntax.md +0 -46
- data/tests/math_usage/document.md +0 -13
- data/tests/others/abbreviations.md +0 -11
- data/tests/others/blank.md +0 -4
- data/tests/others/code.md +0 -5
- data/tests/others/code2.md +0 -8
- data/tests/others/code3.md +0 -16
- data/tests/others/email.md +0 -4
- data/tests/others/entities.md +0 -19
- data/tests/others/escaping.md +0 -16
- data/tests/others/extra_dl.md +0 -101
- data/tests/others/extra_header_id.md +0 -13
- data/tests/others/extra_table1.md +0 -40
- data/tests/others/footnotes.md +0 -17
- data/tests/others/headers.md +0 -10
- data/tests/others/hrule.md +0 -10
- data/tests/others/images.md +0 -20
- data/tests/others/inline_html.md +0 -42
- data/tests/others/links.md +0 -38
- data/tests/others/list1.md +0 -4
- data/tests/others/list2.md +0 -5
- data/tests/others/list3.md +0 -8
- data/tests/others/lists.md +0 -32
- data/tests/others/lists_after_paragraph.md +0 -44
- data/tests/others/lists_ol.md +0 -39
- data/tests/others/misc_sw.md +0 -105
- data/tests/others/one.md +0 -1
- data/tests/others/paragraphs.md +0 -13
- data/tests/others/sss06.md +0 -352
- data/tests/others/test.md +0 -4
- data/tests/s5/s5profiling.md +0 -48
- data/tests/unittest/bug_def.md +0 -28
- data/tests/unittest/email.md +0 -32
- data/tests/unittest/html2.md +0 -34
- data/tests/unittest/ie.md +0 -61
- data/tests/unittest/links2.md +0 -34
- data/tests/unittest/lists11.md +0 -28
- data/tests/unittest/lists6.md +0 -53
- data/tests/unittest/lists9.md +0 -76
- data/tests/unittest/math/equations.md +0 -86
- data/tests/unittest/math/math2.md +0 -57
- data/tests/unittest/math/table.md +0 -37
- data/tests/unittest/notyet/header_after_par.md +0 -70
- data/tests/unittest/red_tests/abbrev.md +0 -1388
- data/tests/unittest/red_tests/lists7.md +0 -68
- data/tests/unittest/red_tests/lists7b.md +0 -128
- data/tests/unittest/red_tests/lists8.md +0 -76
- data/tests/unittest/red_tests/xml.md +0 -70
- data/tests/unittest/xml3.md +0 -38
- data/tests/utf8-files/simple.md +0 -1
- data/unit_test_block.sh +0 -5
- data/unit_test_span.sh +0 -3
data/lib/maruku/defaults.rb
CHANGED
@@ -1,71 +1,49 @@
|
|
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
|
-
#++
|
1
|
+
module MaRuKu
|
20
2
|
|
3
|
+
Globals = {
|
4
|
+
:unsafe_features => false,
|
5
|
+
:on_error => :warning,
|
21
6
|
|
22
|
-
|
23
|
-
|
24
|
-
Globals = {
|
25
|
-
:unsafe_features => false,
|
26
|
-
:on_error => :warning,
|
27
|
-
|
28
|
-
|
29
|
-
:use_numbered_headers => false,
|
30
|
-
|
31
|
-
:maruku_signature => false,
|
32
|
-
:code_background_color => '#fef',
|
33
|
-
:code_show_spaces => false,
|
34
|
-
|
35
|
-
:filter_html => false,
|
36
|
-
|
37
|
-
:html_math_output_mathml => true, # also set :html_math_engine
|
38
|
-
:html_math_engine => 'none', #ritex, itex2mml
|
39
|
-
|
40
|
-
:html_math_output_png => false,
|
41
|
-
:html_png_engine => 'none',
|
42
|
-
:html_png_dir => 'pngs',
|
43
|
-
:html_png_url => 'pngs/',
|
44
|
-
:html_png_resolution => 200,
|
45
|
-
|
46
|
-
:html_use_syntax => false,
|
47
|
-
|
48
|
-
:latex_use_listings => false,
|
49
|
-
:latex_cjk => false,
|
50
|
-
:latex_cache_file => "blahtex_cache.pstore", # cache file for blahtex filter
|
51
|
-
|
52
|
-
:debug_keep_ials => false,
|
53
|
-
:doc_prefix => ''
|
54
|
-
}
|
7
|
+
:use_numbered_headers => false,
|
55
8
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
9
|
+
:maruku_signature => false,
|
10
|
+
:code_background_color => '#fef',
|
11
|
+
:code_show_spaces => false,
|
12
|
+
|
13
|
+
:filter_html => false,
|
14
|
+
|
15
|
+
:html_parser => 'rexml', # or 'nokogiri'
|
16
|
+
|
17
|
+
:html_math_output_mathml => true, # also set :html_math_engine
|
18
|
+
:html_math_engine => 'none', # none, ritex, itex2mml, blahtex
|
19
|
+
|
20
|
+
:html_math_output_png => false,
|
21
|
+
:html_png_engine => 'none',
|
22
|
+
:html_png_dir => 'pngs',
|
23
|
+
:html_png_url => 'pngs/',
|
24
|
+
:html_png_resolution => 200,
|
70
25
|
|
71
|
-
|
26
|
+
:fenced_code_blocks => false,
|
27
|
+
:html_use_syntax => false,
|
28
|
+
|
29
|
+
:latex_use_listings => false,
|
30
|
+
:latex_cjk => false,
|
31
|
+
|
32
|
+
:debug_keep_ials => false,
|
33
|
+
:doc_prefix => '',
|
34
|
+
|
35
|
+
:ignore_wikilinks => true
|
36
|
+
}
|
37
|
+
|
38
|
+
class MDElement
|
39
|
+
def get_setting(sym)
|
40
|
+
return attributes[sym] if attributes.has_key?(sym)
|
41
|
+
return doc.attributes[sym] if doc && doc.attributes.has_key?(sym)
|
42
|
+
return MaRuKu::Globals[sym] if MaRuKu::Globals.has_key?(sym)
|
43
|
+
|
44
|
+
$stderr.puts "Bug: no default for #{sym.inspect}"
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module MaRuKu
|
2
|
+
# This represents the whole document and holds global data.
|
3
|
+
class MDDocument # < MDElement
|
4
|
+
# @return [{String => {:url => String, :title => String}}]
|
5
|
+
attr_accessor :refs
|
6
|
+
|
7
|
+
# @return [{String => MDElement}]
|
8
|
+
attr_accessor :footnotes
|
9
|
+
|
10
|
+
# @return [{String => String}]
|
11
|
+
attr_accessor :abbreviations
|
12
|
+
|
13
|
+
# Attribute definition lists.
|
14
|
+
#
|
15
|
+
# @return [{String => AttributeList}]
|
16
|
+
attr_accessor :ald
|
17
|
+
|
18
|
+
# The order in which footnotes are used. Contains the id.
|
19
|
+
#
|
20
|
+
# @return [Array<String>]
|
21
|
+
attr_accessor :footnotes_order
|
22
|
+
|
23
|
+
# @return [{String => {String => MDElement}}]
|
24
|
+
attr_accessor :refid2ref
|
25
|
+
|
26
|
+
# A counter for generating unique IDs [Integer]
|
27
|
+
attr_accessor :id_counter
|
28
|
+
|
29
|
+
def initialize(s=nil)
|
30
|
+
super(:document)
|
31
|
+
|
32
|
+
self.doc = self
|
33
|
+
self.refs = {}
|
34
|
+
self.footnotes = {}
|
35
|
+
self.footnotes_order = []
|
36
|
+
self.abbreviations = {}
|
37
|
+
self.ald = {}
|
38
|
+
self.id_counter = 0
|
39
|
+
|
40
|
+
parse_doc(s) if s
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module MaRuKu
|
2
|
+
# Rather than having a separate class for every possible element,
|
3
|
+
# Maruku has a single {MDElement} class
|
4
|
+
# that represents eveything in the document (paragraphs, headers, etc).
|
5
|
+
# The type of each element is available via \{#node\_type}.
|
6
|
+
class MDElement
|
7
|
+
# The type of this node (e.g. `:quote`, `:image`, `:abbr`).
|
8
|
+
# See {Helpers} for a list of possible values.
|
9
|
+
#
|
10
|
+
# @return [Symbol]
|
11
|
+
attr_accessor :node_type
|
12
|
+
|
13
|
+
# The child nodes of this element.
|
14
|
+
#
|
15
|
+
# @return [Array<String or MDElement>]
|
16
|
+
attr_accessor :children
|
17
|
+
|
18
|
+
# An attribute list. May not be nil.
|
19
|
+
#
|
20
|
+
# @return [AttributeList]
|
21
|
+
attr_accessor :al
|
22
|
+
|
23
|
+
# The processed attributes.
|
24
|
+
#
|
25
|
+
# For the {Maruku document root},
|
26
|
+
# this contains properties listed
|
27
|
+
# at the beginning of the document.
|
28
|
+
# The properties will be downcased and any spaces
|
29
|
+
# will be converted to underscores.
|
30
|
+
# For example, if you write in the source document:
|
31
|
+
#
|
32
|
+
# !!!text
|
33
|
+
# Title: test document
|
34
|
+
# My property: value
|
35
|
+
#
|
36
|
+
# content content
|
37
|
+
#
|
38
|
+
# Then \{#attributes} will return:
|
39
|
+
#
|
40
|
+
# {:title => "test document", :my_property => "value"}
|
41
|
+
#
|
42
|
+
# @return [{Symbol => String}]
|
43
|
+
attr_accessor :attributes
|
44
|
+
|
45
|
+
# The root element of the document
|
46
|
+
# to which this element belongs.
|
47
|
+
#
|
48
|
+
# @return [Maruku]
|
49
|
+
attr_accessor :doc
|
50
|
+
|
51
|
+
def initialize(node_type = :unset, children = [], meta = {}, al = nil)
|
52
|
+
self.children = children
|
53
|
+
self.node_type = node_type
|
54
|
+
self.attributes = {}
|
55
|
+
|
56
|
+
# Define a new accessor on the singleton class for this instance
|
57
|
+
# for each metadata key
|
58
|
+
meta.each do |symbol, value|
|
59
|
+
class << self
|
60
|
+
self
|
61
|
+
end.send(:attr_accessor, symbol)
|
62
|
+
|
63
|
+
self.send("#{symbol}=", value)
|
64
|
+
end
|
65
|
+
|
66
|
+
self.al = al || AttributeList.new
|
67
|
+
self.meta_priv = meta
|
68
|
+
end
|
69
|
+
|
70
|
+
# @private
|
71
|
+
attr_accessor :meta_priv
|
72
|
+
|
73
|
+
def ==(o)
|
74
|
+
o.is_a?(MDElement) &&
|
75
|
+
self.node_type == o.node_type &&
|
76
|
+
self.meta_priv == o.meta_priv &&
|
77
|
+
self.children == o.children
|
78
|
+
end
|
79
|
+
|
80
|
+
# Iterates through each {MDElement} child node of this element.
|
81
|
+
# This includes deeply-nested child nodes.
|
82
|
+
# If `e_node_type` is specified, only yields nodes of that type.
|
83
|
+
def each_element(e_node_type=nil, &block)
|
84
|
+
@children.each do |c|
|
85
|
+
next unless c.is_a? MDElement
|
86
|
+
yield c if e_node_type.nil? || c.node_type == e_node_type
|
87
|
+
c.each_element(e_node_type, &block)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Iterates through each String child node of this element,
|
92
|
+
# replacing it with the result of the block.
|
93
|
+
# This includes deeply-nested child nodes.
|
94
|
+
#
|
95
|
+
# This destructively modifies this node and its children.
|
96
|
+
#
|
97
|
+
# @todo Make this non-destructive
|
98
|
+
def replace_each_string(&block)
|
99
|
+
@children.map! do |c|
|
100
|
+
next yield c unless c.is_a?(MDElement)
|
101
|
+
c.replace_each_string(&block)
|
102
|
+
c
|
103
|
+
end.flatten!
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# A specialization of Element that can keep track of
|
108
|
+
# its parsed HTML as an attribute (rather than metadata)
|
109
|
+
class MDHTMLElement < MDElement
|
110
|
+
attr_accessor :parsed_html # HTMLFragment
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module MaRuKu
|
2
|
+
class Exception < RuntimeError; end
|
3
|
+
|
4
|
+
module Errors
|
5
|
+
FRAME_WIDTH = 75
|
6
|
+
|
7
|
+
# Properly handles a formatting error.
|
8
|
+
# All such errors go through this method.
|
9
|
+
#
|
10
|
+
# The behavior depends on {MaRuKu::Globals `MaRuKu::Globals[:on_error]`}.
|
11
|
+
# If this is `:warning`, this prints the error to stderr
|
12
|
+
# (or `@error_stream` if it's defined) and tries to continue.
|
13
|
+
# If `:on_error` is `:ignore`, this doesn't print anything
|
14
|
+
# and tries to continue. If it's `:raise`, this raises a {MaRuKu::Exception}.
|
15
|
+
#
|
16
|
+
# By default, `:on_error` is set to `:warning`.
|
17
|
+
#
|
18
|
+
# @overload def maruku_error(s, src = nil, con = nil)
|
19
|
+
# @param s [String] The text of the error
|
20
|
+
# @param src [#describe, nil] The source of the error
|
21
|
+
# @param con [#describe, nil] The context of the error
|
22
|
+
# @param recover [String, nil] Recovery text
|
23
|
+
# @raise [MaRuKu::Exception] If `:on_error` is set to `:raise`
|
24
|
+
def maruku_error(s, src=nil, con=nil, recover=nil)
|
25
|
+
policy = get_setting(:on_error)
|
26
|
+
|
27
|
+
case policy
|
28
|
+
when :ignore
|
29
|
+
when :raise
|
30
|
+
raise_error create_frame(describe_error(s, src, con, recover))
|
31
|
+
when :warning
|
32
|
+
tell_user create_frame(describe_error(s, src, con, recover))
|
33
|
+
else
|
34
|
+
raise "Unknown on_error policy: #{policy.inspect}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def maruku_recover(s, src=nil, con=nil, recover=nil)
|
39
|
+
tell_user create_frame(describe_error(s, src, con, recover))
|
40
|
+
end
|
41
|
+
|
42
|
+
def raise_error(s)
|
43
|
+
raise MaRuKu::Exception, s, caller
|
44
|
+
end
|
45
|
+
|
46
|
+
def tell_user(s)
|
47
|
+
(self.attributes[:error_stream] || $stderr) << s << "\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def create_frame(s)
|
53
|
+
"\n" + <<FRAME
|
54
|
+
#{"_" * FRAME_WIDTH}
|
55
|
+
| Maruku tells you:
|
56
|
+
+#{"-" * FRAME_WIDTH}
|
57
|
+
#{s.gsub(/^/, '| ').rstrip}
|
58
|
+
+#{"-" * FRAME_WIDTH}
|
59
|
+
#{caller[1...5].join("\n").gsub(/^/, '!')}
|
60
|
+
\\#{"_" * FRAME_WIDTH}
|
61
|
+
FRAME
|
62
|
+
end
|
63
|
+
|
64
|
+
def describe_error(s, src=nil, con=nil, recover=nil)
|
65
|
+
s += "\n#{src.describe}\n" if src
|
66
|
+
s += "\n#{con.describe}\n" if con
|
67
|
+
s += "\nRecovering: #{recover}\n" if recover
|
68
|
+
s
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/maruku/ext/div.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
#+-----------------------------------{.warning}------
|
4
2
|
#| this is the last warning!
|
5
3
|
#|
|
@@ -10,124 +8,118 @@
|
|
10
8
|
#| +--------------------------------------------------
|
11
9
|
#+---------------------------------------------------
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
#OpenDiv = /^[ ]{0,3}\+\-\-+\s*(.*)$/
|
17
|
-
#CloseDiv = /^[ ]{0,3}\=\-\-+\s*(.*)$/
|
11
|
+
# TODO: Scope these properly
|
12
|
+
OpenDiv = /^[ ]{0,3}\+\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
|
13
|
+
CloseDiv = /^[ ]{0,3}\=\-\-+\s*(\{([^{}]*?|".*?"|'.*?')*\})?\s*\-*\s*$/
|
18
14
|
StartPipe = /^[ ]{0,3}\|(.*)$/ # $1 is rest of line
|
19
15
|
DecorativeClosing = OpenDiv
|
20
16
|
|
21
|
-
MaRuKu::In::Markdown
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
74
71
|
|
75
|
-
|
76
|
-
|
77
|
-
doc.maruku_error(e, src, context)
|
78
|
-
end
|
79
|
-
|
80
|
-
al_string = ial_at_beginning || ial_at_end
|
81
|
-
al = nil
|
82
|
-
|
83
|
-
if al_string =~ /^\{(.*)\}\s*$/
|
84
|
-
inside = $1
|
85
|
-
cs = MaRuKu::In::Markdown::SpanLevelParser::CharSource
|
86
|
-
al = al_string &&
|
87
|
-
doc.read_attribute_list(cs.new(inside), its_context=nil, break_on=[nil])
|
88
|
-
end
|
89
|
-
|
90
|
-
src = MaRuKu::In::Markdown::BlockLevelParser::LineSource.new(lines)
|
91
|
-
children = doc.parse_blocks(src)
|
72
|
+
al_string = ial_at_beginning || ial_at_end
|
73
|
+
al = nil
|
92
74
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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
|
97
80
|
|
98
|
-
|
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)
|
99
88
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
if type
|
114
|
-
doc.refid2ref[type] ||= {}
|
115
|
-
num = doc.refid2ref[type].length + 1 || 1
|
116
|
-
end
|
117
|
-
e = self.md_el(:div, children, meta={:label => label, :type => type, :num => num}, al)
|
118
|
-
if type && label
|
119
|
-
doc.refid2ref[type].update({label => e})
|
120
|
-
end
|
121
|
-
e
|
122
|
-
end
|
123
|
-
|
124
|
-
end end
|
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
|
125
102
|
|
103
|
+
if type
|
104
|
+
doc.refid2ref[type] ||= {}
|
105
|
+
num = doc.refid2ref[type].length + 1
|
106
|
+
if !label
|
107
|
+
doc.id_counter += 1
|
108
|
+
label = "div_" + doc.id_counter.to_s
|
109
|
+
end
|
110
|
+
end
|
126
111
|
|
127
|
-
|
112
|
+
e = self.md_el(:div, children, {:label => label, :type => type, :num => num}, al)
|
113
|
+
doc.refid2ref[type].update(label => e) if type && label
|
114
|
+
e
|
115
|
+
end
|
116
|
+
end
|
128
117
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
end
|
118
|
+
module Out
|
119
|
+
module HTML
|
120
|
+
def to_html_div
|
121
|
+
add_ws wrap_as_element('div')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|