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.
Files changed (162) hide show
  1. data/AUTHORS +23 -0
  2. data/LICENSE +340 -0
  3. data/README.md +73 -0
  4. data/bin/maruku +196 -0
  5. data/bin/marutex +4 -0
  6. data/data/entities.xml +261 -0
  7. data/docs/changelog.md +334 -0
  8. data/docs/div_syntax.md +36 -0
  9. data/docs/entity_test.md +23 -0
  10. data/docs/markdown_syntax.md +899 -0
  11. data/docs/maruku.md +346 -0
  12. data/docs/math.md +194 -0
  13. data/docs/other_stuff.md +51 -0
  14. data/docs/proposal.md +309 -0
  15. data/docs/website/src/bluecloth.md +25 -0
  16. data/docs/website/src/download.md +31 -0
  17. data/docs/website/src/maruku.md +261 -0
  18. data/docs/website/src/proposal.md +271 -0
  19. data/lib/maruku.rb +132 -0
  20. data/lib/maruku/attributes.rb +138 -0
  21. data/lib/maruku/defaults.rb +69 -0
  22. data/lib/maruku/errors.rb +89 -0
  23. data/lib/maruku/ext/div.rb +121 -0
  24. data/lib/maruku/ext/fenced_code.rb +78 -0
  25. data/lib/maruku/ext/math.rb +37 -0
  26. data/lib/maruku/ext/math/elements.rb +21 -0
  27. data/lib/maruku/ext/math/latex_fix.rb +12 -0
  28. data/lib/maruku/ext/math/mathml_engines/blahtex.rb +93 -0
  29. data/lib/maruku/ext/math/mathml_engines/itex2mml.rb +39 -0
  30. data/lib/maruku/ext/math/mathml_engines/none.rb +21 -0
  31. data/lib/maruku/ext/math/mathml_engines/ritex.rb +24 -0
  32. data/lib/maruku/ext/math/parsing.rb +125 -0
  33. data/lib/maruku/ext/math/to_html.rb +237 -0
  34. data/lib/maruku/ext/math/to_latex.rb +36 -0
  35. data/lib/maruku/ext/yaml.rb +43 -0
  36. data/lib/maruku/helpers.rb +214 -0
  37. data/lib/maruku/input/charsource.rb +326 -0
  38. data/lib/maruku/input/extensions.rb +69 -0
  39. data/lib/maruku/input/html_helper.rb +189 -0
  40. data/lib/maruku/input/linesource.rb +111 -0
  41. data/lib/maruku/input/parse_block.rb +608 -0
  42. data/lib/maruku/input/parse_doc.rb +240 -0
  43. data/lib/maruku/input/parse_span_better.rb +746 -0
  44. data/lib/maruku/input/rubypants.rb +225 -0
  45. data/lib/maruku/input/type_detection.rb +147 -0
  46. data/lib/maruku/input_textile2/t2_parser.rb +163 -0
  47. data/lib/maruku/maruku.rb +31 -0
  48. data/lib/maruku/output/s5/fancy.rb +756 -0
  49. data/lib/maruku/output/s5/to_s5.rb +138 -0
  50. data/lib/maruku/output/to_html.rb +994 -0
  51. data/lib/maruku/output/to_latex.rb +580 -0
  52. data/lib/maruku/output/to_latex_entities.rb +101 -0
  53. data/lib/maruku/output/to_latex_strings.rb +64 -0
  54. data/lib/maruku/output/to_markdown.rb +164 -0
  55. data/lib/maruku/output/to_s.rb +54 -0
  56. data/lib/maruku/string_utils.rb +185 -0
  57. data/lib/maruku/structures.rb +143 -0
  58. data/lib/maruku/structures_inspect.rb +51 -0
  59. data/lib/maruku/structures_iterators.rb +48 -0
  60. data/lib/maruku/textile2.rb +1 -0
  61. data/lib/maruku/toc.rb +214 -0
  62. data/lib/maruku/usage/example1.rb +33 -0
  63. data/lib/maruku/version +0 -0
  64. data/lib/maruku/version.rb +54 -0
  65. data/spec/block_docs/abbreviations.md +52 -0
  66. data/spec/block_docs/alt.md +17 -0
  67. data/spec/block_docs/attributes/att2.md +20 -0
  68. data/spec/block_docs/attributes/att3.md +28 -0
  69. data/spec/block_docs/attributes/attributes.md +57 -0
  70. data/spec/block_docs/attributes/circular.md +26 -0
  71. data/spec/block_docs/attributes/default.md +22 -0
  72. data/spec/block_docs/blank.md +24 -0
  73. data/spec/block_docs/blanks_in_code.md +75 -0
  74. data/spec/block_docs/bug_def.md +16 -0
  75. data/spec/block_docs/bug_table.md +46 -0
  76. data/spec/block_docs/code.md +34 -0
  77. data/spec/block_docs/code2.md +28 -0
  78. data/spec/block_docs/code3.md +71 -0
  79. data/spec/block_docs/data_loss.md +25 -0
  80. data/spec/block_docs/divs/div1.md +167 -0
  81. data/spec/block_docs/divs/div2.md +21 -0
  82. data/spec/block_docs/divs/div3_nest.md +45 -0
  83. data/spec/block_docs/easy.md +15 -0
  84. data/spec/block_docs/email.md +20 -0
  85. data/spec/block_docs/encoding/iso-8859-1.md +23 -0
  86. data/spec/block_docs/encoding/utf-8.md +18 -0
  87. data/spec/block_docs/entities.md +94 -0
  88. data/spec/block_docs/escaping.md +67 -0
  89. data/spec/block_docs/extra_dl.md +52 -0
  90. data/spec/block_docs/extra_header_id.md +63 -0
  91. data/spec/block_docs/extra_table1.md +37 -0
  92. data/spec/block_docs/footnotes.md +97 -0
  93. data/spec/block_docs/headers.md +37 -0
  94. data/spec/block_docs/hex_entities.md +37 -0
  95. data/spec/block_docs/hrule.md +39 -0
  96. data/spec/block_docs/html2.md +22 -0
  97. data/spec/block_docs/html3.md +31 -0
  98. data/spec/block_docs/html4.md +25 -0
  99. data/spec/block_docs/html5.md +23 -0
  100. data/spec/block_docs/ie.md +49 -0
  101. data/spec/block_docs/images.md +90 -0
  102. data/spec/block_docs/images2.md +31 -0
  103. data/spec/block_docs/inline_html.md +152 -0
  104. data/spec/block_docs/inline_html2.md +21 -0
  105. data/spec/block_docs/links.md +152 -0
  106. data/spec/block_docs/links2.md +22 -0
  107. data/spec/block_docs/list1.md +46 -0
  108. data/spec/block_docs/list12.md +28 -0
  109. data/spec/block_docs/list2.md +56 -0
  110. data/spec/block_docs/list3.md +64 -0
  111. data/spec/block_docs/list4.md +89 -0
  112. data/spec/block_docs/lists.md +192 -0
  113. data/spec/block_docs/lists10.md +34 -0
  114. data/spec/block_docs/lists11.md +23 -0
  115. data/spec/block_docs/lists6.md +41 -0
  116. data/spec/block_docs/lists9.md +64 -0
  117. data/spec/block_docs/lists_after_paragraph.md +208 -0
  118. data/spec/block_docs/lists_ol.md +262 -0
  119. data/spec/block_docs/loss.md +16 -0
  120. data/spec/block_docs/math/equations.md +45 -0
  121. data/spec/block_docs/math/inline.md +46 -0
  122. data/spec/block_docs/math/math2.md +45 -0
  123. data/spec/block_docs/math/notmath.md +25 -0
  124. data/spec/block_docs/math/table.md +25 -0
  125. data/spec/block_docs/math/table2.md +42 -0
  126. data/spec/block_docs/misc_sw.md +525 -0
  127. data/spec/block_docs/notyet/escape.md +21 -0
  128. data/spec/block_docs/notyet/header_after_par.md +58 -0
  129. data/spec/block_docs/notyet/ticks.md +18 -0
  130. data/spec/block_docs/notyet/triggering.md +157 -0
  131. data/spec/block_docs/olist.md +45 -0
  132. data/spec/block_docs/one.md +15 -0
  133. data/spec/block_docs/paragraph.md +16 -0
  134. data/spec/block_docs/paragraph_rules/dont_merge_ref.md +42 -0
  135. data/spec/block_docs/paragraph_rules/tab_is_blank.md +24 -0
  136. data/spec/block_docs/paragraphs.md +46 -0
  137. data/spec/block_docs/pending/amps.md +15 -0
  138. data/spec/block_docs/pending/empty_cells.md +37 -0
  139. data/spec/block_docs/pending/link.md +72 -0
  140. data/spec/block_docs/pending/ref.md +21 -0
  141. data/spec/block_docs/recover/recover_links.md +15 -0
  142. data/spec/block_docs/red_tests/abbrev.md +679 -0
  143. data/spec/block_docs/red_tests/lists7.md +32 -0
  144. data/spec/block_docs/red_tests/lists7b.md +65 -0
  145. data/spec/block_docs/red_tests/lists8.md +42 -0
  146. data/spec/block_docs/red_tests/ref.md +23 -0
  147. data/spec/block_docs/red_tests/xml.md +35 -0
  148. data/spec/block_docs/references/long_example.md +71 -0
  149. data/spec/block_docs/references/spaces_and_numbers.md +15 -0
  150. data/spec/block_docs/smartypants.md +114 -0
  151. data/spec/block_docs/syntax_hl.md +52 -0
  152. data/spec/block_docs/table_attributes.md +34 -0
  153. data/spec/block_docs/test.md +19 -0
  154. data/spec/block_docs/underscore_in_words.md +15 -0
  155. data/spec/block_docs/wrapping.md +67 -0
  156. data/spec/block_docs/xml2.md +19 -0
  157. data/spec/block_docs/xml3.md +26 -0
  158. data/spec/block_docs/xml_instruction.md +52 -0
  159. data/spec/block_spec.rb +49 -0
  160. data/spec/span_spec.rb +254 -0
  161. data/spec/spec_helper.rb +6 -0
  162. metadata +247 -0
@@ -0,0 +1,143 @@
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
+ # Rather than having a separate class for every possible element,
22
+ # Maruku has a single {MDElement} class
23
+ # that represents eveything in the document (paragraphs, headers, etc).
24
+ # The type of each element is available via \{#node\_type}.
25
+ class MDElement
26
+ # The type of this node (e.g. `:quote`, `:image`, `:abbr`).
27
+ # See {Helpers} for a list of possible values.
28
+ #
29
+ # @return [Symbol]
30
+ attr_accessor :node_type
31
+
32
+ # The child nodes of this element.
33
+ #
34
+ # @return [Array<String or MDElement>]
35
+ attr_accessor :children
36
+
37
+ # An attribute list. May not be nil.
38
+ #
39
+ # @return [AttributeList]
40
+ attr_accessor :al
41
+
42
+ # The processed attributes.
43
+ #
44
+ # For the {Maruku document root},
45
+ # this contains properties listed
46
+ # at the beginning of the document.
47
+ # The properties will be downcased and any spaces
48
+ # will be converted to underscores.
49
+ # For example, if you write in the source document:
50
+ #
51
+ # !!!text
52
+ # Title: test document
53
+ # My property: value
54
+ #
55
+ # content content
56
+ #
57
+ # Then \{#attributes} will return:
58
+ #
59
+ # {:title => "test document", :my_property => "value"}
60
+ #
61
+ # @return [{Symbol => String}]
62
+ attr_accessor :attributes
63
+
64
+ # The root element of the document
65
+ # to which this element belongs.
66
+ #
67
+ # @return [Maruku]
68
+ attr_accessor :doc
69
+
70
+ def initialize(node_type = :unset, children = [], meta = {}, al = nil)
71
+ self.children = children
72
+ self.node_type = node_type
73
+ self.attributes = {}
74
+
75
+ meta.each do |symbol, value|
76
+ self.instance_eval <<RUBY
77
+ def #{symbol}; @#{symbol}; end
78
+ def #{symbol}=(val); @#{symbol} = val; end
79
+ RUBY
80
+ self.send "#{symbol}=", value
81
+ end
82
+
83
+ self.al = al || AttributeList.new
84
+ self.meta_priv = meta
85
+ end
86
+
87
+ # @private
88
+ attr_accessor :meta_priv
89
+
90
+ def ==(o)
91
+ o.is_a?(MDElement) &&
92
+ self.node_type == o.node_type &&
93
+ self.meta_priv == o.meta_priv &&
94
+ self.children == o.children
95
+ end
96
+ end
97
+
98
+ # This represents the whole document and holds global data.
99
+ class MDDocument
100
+ # @return [{String => {:url => String, :title => String}}]
101
+ attr_accessor :refs
102
+
103
+ # @return [{String => MDElement}]
104
+ attr_accessor :footnotes
105
+
106
+ # @return [{String => String}]
107
+ attr_accessor :abbreviations
108
+
109
+ # Attribute definition lists.
110
+ #
111
+ # @return [{String => AttributeList}]
112
+ attr_accessor :ald
113
+
114
+ # The order in which footnotes are used. Contains the id.
115
+ #
116
+ # @return [Array<String>]
117
+ attr_accessor :footnotes_order
118
+
119
+ # @return [Array<String>]
120
+ attr_accessor :latex_required_packages
121
+
122
+ # @return [{String => {String => MDElement}}]
123
+ attr_accessor :refid2ref
124
+
125
+ # A counter for generating unique IDs [Integer]
126
+ attr_accessor :id_counter
127
+
128
+ def initialize(s=nil)
129
+ super(:document)
130
+
131
+ self.doc = self
132
+ self.refs = {}
133
+ self.footnotes = {}
134
+ self.footnotes_order = []
135
+ self.abbreviations = {}
136
+ self.ald = {}
137
+ self.latex_required_packages = []
138
+ self.id_counter = 0
139
+
140
+ parse_doc(s) if s
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,51 @@
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 MDElement
22
+ def inspect(compact=true)
23
+ if compact
24
+ i2 = inspect2
25
+ return i2 if i2
26
+ end
27
+
28
+ # Make sure the attributes are lexically ordered
29
+ meta_ordered = "{" + @meta_priv.keys.
30
+ map {|x| x.to_s}.sort.map {|x| x.to_sym}.
31
+ map {|k| k.inspect + "=>" + @meta_priv[k].inspect}.
32
+ join(',') + "}"
33
+
34
+ "md_el(%s,%s,%s,%s)" % [
35
+ self.node_type.inspect,
36
+ children_inspect(compact),
37
+ meta_ordered,
38
+ self.al.inspect
39
+ ]
40
+ end
41
+
42
+ def children_inspect(compact=true)
43
+ kids = @children.map {|x| x.is_a?(MDElement) ? x.inspect(compact) : x.inspect}
44
+ comma = kids.join(", ")
45
+
46
+ return "[#{comma}]" if comma.size < 70
47
+ "[\n\t#{kids.join(",\n\t")}\n]"
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,48 @@
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 MDElement
22
+ # Iterates through each {MDElement} child node of this element.
23
+ # This includes deeply-nested child nodes.
24
+ # If `e_node_type` is specified, only yields nodes of that type.
25
+ def each_element(e_node_type=nil, &block)
26
+ @children.each do |c|
27
+ next unless c.is_a? MDElement
28
+ yield c if e_node_type.nil? || c.node_type == e_node_type
29
+ c.each_element(e_node_type, &block)
30
+ end
31
+ end
32
+
33
+ # Iterates through each String child node of this element,
34
+ # replacing it with the result of the block.
35
+ # This includes deeply-nested child nodes.
36
+ #
37
+ # This destructively modifies this node and its children.
38
+ #
39
+ # @todo Make this non-destructive
40
+ def replace_each_string(&block)
41
+ @children.map! do |c|
42
+ next yield c unless c.is_a?(MDElement)
43
+ c.replace_each_string(&block)
44
+ c
45
+ end.flatten!
46
+ end
47
+ end
48
+ end
@@ -0,0 +1 @@
1
+ require 'maruku/input_textile2/t2_parser'
@@ -0,0 +1,214 @@
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
+ # A section in the table of contents of a document.
22
+ class Section
23
+ # The depth of the section (0 for toplevel).
24
+ #
25
+ # Equivalent to `header_element.level`.
26
+ #
27
+ # @return [Fixnum]
28
+ attr_accessor :section_level
29
+
30
+ # The nested section number, e.g. `[1, 2, 5]` for Section 1.2.5.
31
+ #
32
+ # @return [Array<Fixnum>]
33
+ attr_accessor :section_number
34
+
35
+ # The `:header` node for this section.
36
+ # The value of `meta[:section]` for the header will be this node.
37
+ #
38
+ # @return [MDElement]
39
+ attr_accessor :header_element
40
+
41
+ # The immediate child nodes of this section.
42
+ #
43
+ # @todo Why does this never contain Strings?
44
+ #
45
+ # @return [Array<MDElement>]
46
+ attr_accessor :immediate_children
47
+
48
+ # The subsections of this section.
49
+ #
50
+ # @return [Array<Section>]
51
+ attr_accessor :section_children
52
+
53
+ def initialize
54
+ @immediate_children = []
55
+ @section_children = []
56
+ end
57
+
58
+ def inspect(indent = 1)
59
+ s = ""
60
+
61
+ if @header_element
62
+ s << "\_" * indent <<
63
+ "(#{@section_level})>\t #{@section_number.join('.')} : " <<
64
+ @header_element.children_to_s <<
65
+ " (id: '#{@header_element.attributes[:id]}')\n"
66
+ else
67
+ s << "Master\n"
68
+ end
69
+ @section_children.each {|c| s << c.inspect(indent+1)}
70
+
71
+ s
72
+ end
73
+
74
+ # Assign \{#section\_number section numbers}
75
+ # to this section and its children.
76
+ # This also assigns the section number attribute
77
+ # to the sections' headers.
78
+ #
79
+ # This should only be called on the root section.
80
+ #
81
+ # @overload def numerate
82
+ def numerate(a = [])
83
+ self.section_number = a
84
+ section_children.each_with_index {|c, i| c.numerate(a + [i + 1])}
85
+ if h = self.header_element
86
+ h.attributes[:section_number] = self.section_number
87
+ end
88
+ end
89
+
90
+ include REXML
91
+
92
+ # Returns an HTML representation of the table of contents.
93
+ #
94
+ # This should only be called on the root section.
95
+ def to_html
96
+ div = Element.new 'div'
97
+ div.attributes['class'] = 'maruku_toc'
98
+ div << _to_html
99
+ div
100
+ end
101
+
102
+ # Returns a LaTeX representation of the table of contents.
103
+ #
104
+ # This should only be called on the root section.
105
+ def to_latex
106
+ _to_latex + "\n\n"
107
+ end
108
+
109
+ protected
110
+
111
+ def _to_html
112
+ ul = Element.new 'ul'
113
+ # let's remove the bullets
114
+ ul.attributes['style'] = 'list-style: none;'
115
+ @section_children.each do |c|
116
+ li = Element.new 'li'
117
+ if span = c.header_element.render_section_number
118
+ li << span
119
+ end
120
+
121
+ a = c.header_element.wrap_as_element('a')
122
+ a.delete_attribute 'id'
123
+ a.attributes['href'] = "##{c.header_element.attributes[:id]}"
124
+
125
+ li << a
126
+ li << c._to_html if c.section_children.size > 0
127
+ ul << li
128
+ end
129
+ ul
130
+ end
131
+
132
+ def _to_latex
133
+ s = ""
134
+ @section_children.each do |c|
135
+ s << "\\noindent"
136
+ if number = c.header_element.section_number
137
+ s << number
138
+ end
139
+ id = c.header_element.attributes[:id]
140
+ text = c.header_element.children_to_latex
141
+ s << "\\hyperlink{#{id}}{#{text}}"
142
+ s << "\\dotfill \\pageref*{#{id}} \\linebreak\n"
143
+ s << c._to_latex if c.section_children.size > 0
144
+ end
145
+ s
146
+ end
147
+ end
148
+
149
+ class MDDocument
150
+ # The table of contents for the document.
151
+ #
152
+ # @return [Section]
153
+ attr_accessor :toc
154
+
155
+ def create_toc
156
+ each_element(:header) {|h| h.attributes[:id] ||= h.generate_id}
157
+
158
+ stack = []
159
+
160
+ # The root section
161
+ s = Section.new
162
+ s.section_level = 0
163
+
164
+ stack.push s
165
+
166
+ # TODO: Clean up the logic here once we have better tests
167
+ i = 0
168
+ while i < @children.size
169
+ while i < @children.size
170
+ if @children[i].node_type == :header
171
+ level = @children[i].level
172
+ break if level <= stack.last.section_level + 1
173
+ end
174
+
175
+ stack.last.immediate_children.push @children[i]
176
+ i += 1
177
+ end
178
+
179
+ break if i >= @children.size
180
+
181
+ header = @children[i]
182
+ level = header.level
183
+
184
+ if level > stack.last.section_level
185
+ # this level is inside
186
+
187
+ s2 = Section.new
188
+ s2.section_level = level
189
+ s2.header_element = header
190
+ header.instance_variable_set :@section, s2
191
+
192
+ stack.last.section_children.push s2
193
+ stack.push s2
194
+
195
+ i += 1
196
+ elsif level == stack.last.section_level
197
+ # this level is a sibling
198
+ stack.pop
199
+ else
200
+ # this level is a parent
201
+ stack.pop
202
+ end
203
+ end
204
+
205
+ # If there is only one big header, then assume it is the master
206
+ s = s.section_children.first if s.section_children.size == 1
207
+
208
+ # Assign section numbers
209
+ s.numerate
210
+
211
+ s
212
+ end
213
+ end
214
+ end