maruku 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/docs/markdown_syntax.md +9 -21
- data/lib/maruku/defaults.rb +1 -1
- data/lib/maruku/element.rb +18 -3
- data/lib/maruku/ext/fenced_code.rb +1 -1
- data/lib/maruku/ext/math/mathml_engines/blahtex.rb +1 -1
- data/lib/maruku/ext/math/to_html.rb +2 -9
- data/lib/maruku/html.rb +5 -8
- data/lib/maruku/input/html_helper.rb +94 -81
- data/lib/maruku/input/mdline.rb +6 -4
- data/lib/maruku/input/parse_block.rb +145 -37
- data/lib/maruku/input/parse_span.rb +7 -8
- data/lib/maruku/input/rubypants.rb +22 -9
- data/lib/maruku/maruku.rb +5 -0
- data/lib/maruku/output/to_html.rb +15 -6
- data/lib/maruku/output/to_latex.rb +9 -3
- data/lib/maruku/output/to_s.rb +0 -1
- data/lib/maruku/string_utils.rb +2 -2
- data/lib/maruku/version.rb +1 -1
- data/spec/block_docs/abbrev.md +18 -18
- data/spec/block_docs/attribute_sanitize.md +22 -0
- data/spec/block_docs/auto_cdata.md +48 -0
- data/spec/block_docs/bug_table.md +4 -4
- data/spec/block_docs/code4.md +79 -0
- data/spec/block_docs/div_without_newline.md +16 -0
- data/spec/block_docs/empty_cells.md +3 -9
- data/spec/block_docs/entities.md +6 -12
- data/spec/block_docs/extra_table1.md +6 -6
- data/spec/block_docs/fenced_code_blocks.md +12 -20
- data/spec/block_docs/fenced_code_blocks_highlighted.md +1 -2
- data/spec/block_docs/footnotes2.md +4 -1
- data/spec/block_docs/ignore_bad_header.md +9 -0
- data/spec/block_docs/issue106.md +78 -0
- data/spec/block_docs/issue115.md +20 -0
- data/spec/block_docs/issue117.md +13 -0
- data/spec/block_docs/issue120.md +48 -0
- data/spec/block_docs/issue123.md +11 -0
- data/spec/block_docs/issue124.md +16 -0
- data/spec/block_docs/issue40.md +24 -12
- data/spec/block_docs/issue89.md +1 -1
- data/spec/block_docs/lists_nested_blankline.md +14 -8
- data/spec/block_docs/lists_ol.md +5 -5
- data/spec/block_docs/lists_paraindent.md +6 -11
- data/spec/block_docs/math-blahtex/equations.md +12 -13
- data/spec/block_docs/math-blahtex/math2.md +9 -2
- data/spec/block_docs/math/embedded_invalid_svg.md +31 -2
- data/spec/block_docs/math/embedded_svg.md +41 -2
- data/spec/block_docs/math/equations.md +7 -2
- data/spec/block_docs/math/inline.md +2 -2
- data/spec/block_docs/math/math2.md +9 -1
- data/spec/block_docs/math/spaces_after_inline_math.md +17 -0
- data/spec/block_docs/math/table.md +2 -2
- data/spec/block_docs/math/table2.md +6 -6
- data/spec/block_docs/table_attributes.md +4 -6
- data/spec/block_docs/table_colspan.md +41 -0
- data/spec/block_docs/tables.md +10 -21
- data/spec/block_docs/tables2.md +74 -0
- data/spec/block_docs/xml_comments.md +32 -0
- data/spec/span_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- metadata +42 -28
- metadata.gz.sig +3 -3
- data/spec/block_docs/xml2.md +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 683162dc0e147b79e1df24f79949ba8521f4ca68
|
4
|
+
data.tar.gz: 6fa761f0e28fa67213236f05c07a97937cd98101
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8d53ba730189a09d616f91ed91635701334454ff114737769f2e5189db2e52c647ca5815bce72c6faa43f83c9c1daf0a1a115cc0a00916c152004c537c8fbeb
|
7
|
+
data.tar.gz: 8330490c4b4787cc1bbc27f470f21c985df7f1847db2238732cb48a73e60374a52910e1a4c49c66b6edb995087cf08080cf41b2b2e1a0f2cf740631983edf6e6
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/docs/markdown_syntax.md
CHANGED
@@ -1,17 +1,6 @@
|
|
1
|
-
css: style.css
|
2
|
-
|
3
1
|
Markdown: Syntax
|
4
2
|
================
|
5
3
|
|
6
|
-
<ul id="ProjectSubmenu">
|
7
|
-
<li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li>
|
8
|
-
<li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li>
|
9
|
-
<li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li>
|
10
|
-
<li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li>
|
11
|
-
<li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li>
|
12
|
-
</ul>
|
13
|
-
|
14
|
-
|
15
4
|
* [Overview](#overview)
|
16
5
|
* [Philosophy](#philosophy)
|
17
6
|
* [Inline HTML](#html)
|
@@ -256,7 +245,7 @@ wrap the text and put a `>` before every line:
|
|
256
245
|
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
|
257
246
|
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
|
258
247
|
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
|
259
|
-
>
|
248
|
+
>
|
260
249
|
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
|
261
250
|
> id sem consectetuer libero luctus adipiscing.
|
262
251
|
|
@@ -283,12 +272,12 @@ Blockquotes can contain other Markdown elements, including headers, lists,
|
|
283
272
|
and code blocks:
|
284
273
|
|
285
274
|
> ## This is a header.
|
286
|
-
>
|
275
|
+
>
|
287
276
|
> 1. This is the first list item.
|
288
277
|
> 2. This is the second list item.
|
289
|
-
>
|
278
|
+
>
|
290
279
|
> Here's some example code:
|
291
|
-
>
|
280
|
+
>
|
292
281
|
> return shell_exec("echo $input | $markdown_script");
|
293
282
|
|
294
283
|
Any decent text editor should make email-style quoting easy. For
|
@@ -569,7 +558,7 @@ Will produce:
|
|
569
558
|
If you're referring to a local resource on the same server, you can
|
570
559
|
use relative paths:
|
571
560
|
|
572
|
-
See my [About](/about/) page for details.
|
561
|
+
See my [About](/about/) page for details.
|
573
562
|
|
574
563
|
Reference-style links use a second set of square brackets, inside
|
575
564
|
which you place a label of your choosing to identify the link:
|
@@ -643,7 +632,7 @@ multiple words in the link text:
|
|
643
632
|
Visit [Daring Fireball][] for more information.
|
644
633
|
|
645
634
|
And then define the link:
|
646
|
-
|
635
|
+
|
647
636
|
[Daring Fireball]: http://daringfireball.net/
|
648
637
|
|
649
638
|
Link definitions can be placed anywhere in your Markdown document. I
|
@@ -767,13 +756,13 @@ one after the opening, one before the closing. This allows you to place
|
|
767
756
|
literal backtick characters at the beginning or end of a code span:
|
768
757
|
|
769
758
|
A single backtick in a code span: `` ` ``
|
770
|
-
|
759
|
+
|
771
760
|
A backtick-delimited string in a code span: `` `foo` ``
|
772
761
|
|
773
762
|
will produce:
|
774
763
|
|
775
764
|
<p>A single backtick in a code span: <code>`</code></p>
|
776
|
-
|
765
|
+
|
777
766
|
<p>A backtick-delimited string in a code span: <code>`foo`</code></p>
|
778
767
|
|
779
768
|
With a code span, ampersands and angle brackets are encoded as HTML
|
@@ -844,7 +833,7 @@ use regular HTML `<img>` tags.
|
|
844
833
|
Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:
|
845
834
|
|
846
835
|
<http://example.com/>
|
847
|
-
|
836
|
+
|
848
837
|
Markdown will turn this into:
|
849
838
|
|
850
839
|
<a href="http://example.com/">http://example.com/</a>
|
@@ -896,4 +885,3 @@ Markdown provides backslash escapes for the following characters:
|
|
896
885
|
- minus sign (hyphen)
|
897
886
|
. dot
|
898
887
|
! exclamation mark
|
899
|
-
|
data/lib/maruku/defaults.rb
CHANGED
data/lib/maruku/element.rb
CHANGED
@@ -82,9 +82,24 @@ module MaRuKu
|
|
82
82
|
# If `e_node_type` is specified, only yields nodes of that type.
|
83
83
|
def each_element(e_node_type=nil, &block)
|
84
84
|
@children.each do |c|
|
85
|
-
|
86
|
-
|
87
|
-
|
85
|
+
if c.is_a? MDElement then
|
86
|
+
yield c if e_node_type.nil? || c.node_type == e_node_type
|
87
|
+
c.each_element(e_node_type, &block)
|
88
|
+
#
|
89
|
+
# This handles the case where the children of an
|
90
|
+
# element are arranged in a multi-dimensional array
|
91
|
+
# (as in the case of a table)
|
92
|
+
elsif c.is_a? Array then
|
93
|
+
c.each do |cc|
|
94
|
+
# A recursive call to each_element will ignore the current element
|
95
|
+
# so we handle this case inline
|
96
|
+
if cc.is_a? MDElement then
|
97
|
+
yield cc if e_node_type.nil? || cc.node_type == e_node_type
|
98
|
+
cc.each_element(e_node_type, &block)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
88
103
|
end
|
89
104
|
end
|
90
105
|
|
@@ -53,7 +53,7 @@ module MaRuKu
|
|
53
53
|
end
|
54
54
|
|
55
55
|
# TODO: Warn here
|
56
|
-
|
56
|
+
raise "A method called #{method} should be defined."
|
57
57
|
convert_to_mathml_none(kind, tex)
|
58
58
|
end
|
59
59
|
|
@@ -68,7 +68,7 @@ module MaRuKu
|
|
68
68
|
method = "convert_to_png_#{engine}".to_sym
|
69
69
|
return self.send(method, kind, tex) if self.respond_to? method
|
70
70
|
|
71
|
-
|
71
|
+
raise "A method called #{method} should be defined."
|
72
72
|
nil
|
73
73
|
end
|
74
74
|
|
@@ -143,13 +143,6 @@ module MaRuKu
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
-
source_span = xelem('span')
|
147
|
-
add_class_to(source_span, 'maruku-eq-tex')
|
148
|
-
code = convert_to_mathml_none(:equation, self.math.strip)
|
149
|
-
code['style'] = 'display: none'
|
150
|
-
source_span << code
|
151
|
-
div << source_span
|
152
|
-
|
153
146
|
div
|
154
147
|
end
|
155
148
|
|
data/lib/maruku/html.rb
CHANGED
@@ -5,7 +5,7 @@ $warned_nokogiri = false
|
|
5
5
|
module MaRuKu
|
6
6
|
HTML_INLINE_ELEMS = Set.new %w[a abbr acronym audio b bdi bdo big br button canvas caption cite code
|
7
7
|
col colgroup command datalist del details dfn dir em fieldset font form i img input ins
|
8
|
-
kbd label legend mark meter optgroup option progress q rp rt ruby s samp
|
8
|
+
kbd label legend mark meter optgroup option progress q rp rt ruby s samp select small
|
9
9
|
source span strike strong sub summary sup tbody td tfoot th thead time tr track tt u var video wbr
|
10
10
|
animate animateColor animateMotion animateTransform circle clipPath defs desc ellipse
|
11
11
|
feGaussianBlur filter font-face font-face-name font-face-src foreignObject g glyph hkern
|
@@ -16,7 +16,7 @@ module MaRuKu
|
|
16
16
|
mtd mtext mtr munder munderover none semantics]
|
17
17
|
|
18
18
|
# Parse block-level markdown elements in these HTML tags
|
19
|
-
BLOCK_TAGS = %w
|
19
|
+
BLOCK_TAGS = Set.new %w[div section]
|
20
20
|
|
21
21
|
# This gets mixed into HTML MDElement nodes to hold the parsed document fragment
|
22
22
|
module HTMLElement
|
@@ -94,7 +94,7 @@ module MaRuKu
|
|
94
94
|
|
95
95
|
# Select all text children of e
|
96
96
|
e.xpath("./text()").each do |original_text|
|
97
|
-
s =
|
97
|
+
s = MaRuKu::Out::HTML.escapeHTML(original_text.text)
|
98
98
|
unless s.strip.empty?
|
99
99
|
parsed = parse_blocks ? doc.parse_text_as_markdown(s) : doc.parse_span(s)
|
100
100
|
|
@@ -172,9 +172,6 @@ module MaRuKu
|
|
172
172
|
# Process markdown within the contents of some elements and
|
173
173
|
# replace their contents with the processed version.
|
174
174
|
def process_markdown_inside_elements(doc)
|
175
|
-
# parse block-level markdown elements in these HTML tags
|
176
|
-
block_tags = ['div']
|
177
|
-
|
178
175
|
elts = []
|
179
176
|
@fragment.each_element('//*[@markdown]') do |e|
|
180
177
|
elts << e
|
@@ -193,11 +190,11 @@ module MaRuKu
|
|
193
190
|
e.attributes.delete('markdown')
|
194
191
|
|
195
192
|
next if "0" == how # user requests no markdown parsing inside
|
196
|
-
parse_blocks = (how == 'block') ||
|
193
|
+
parse_blocks = (how == 'block') || BLOCK_TAGS.include?(e.name)
|
197
194
|
|
198
195
|
# Select all text children of e
|
199
196
|
e.texts.each do |original_text|
|
200
|
-
s =
|
197
|
+
s = MaRuKu::Out::HTML.escapeHTML(original_text.value)
|
201
198
|
unless s.strip.empty?
|
202
199
|
# TODO extract common functionality
|
203
200
|
parsed = parse_blocks ? doc.parse_text_as_markdown(s) : doc.parse_span(s)
|
@@ -10,14 +10,10 @@ module MaRuKu::In::Markdown::SpanLevelParser
|
|
10
10
|
EverythingElse = %r{^[^<]+}m
|
11
11
|
CommentStart = %r{^<!--}x
|
12
12
|
CommentEnd = %r{-->}
|
13
|
-
TO_SANITIZE = ['img','hr','br']
|
13
|
+
TO_SANITIZE = ['img', 'hr', 'br']
|
14
14
|
|
15
15
|
attr_reader :rest, :first_tag
|
16
16
|
|
17
|
-
def my_debug(s)
|
18
|
-
# puts "---" * 10 + "\n" + inspect + "\t>>>\t" + s
|
19
|
-
end
|
20
|
-
|
21
17
|
def initialize
|
22
18
|
@rest = ""
|
23
19
|
@tag_stack = []
|
@@ -26,7 +22,7 @@ module MaRuKu::In::Markdown::SpanLevelParser
|
|
26
22
|
self.state = :inside_element
|
27
23
|
end
|
28
24
|
|
29
|
-
attr_accessor :state # = :inside_element, :inside_tag, :inside_comment, :inside_cdata
|
25
|
+
attr_accessor :state # = :inside_element, :inside_tag, :inside_comment, :inside_cdata
|
30
26
|
|
31
27
|
def eat_this(line)
|
32
28
|
@rest = line + @rest
|
@@ -35,40 +31,44 @@ module MaRuKu::In::Markdown::SpanLevelParser
|
|
35
31
|
case self.state
|
36
32
|
when :inside_comment
|
37
33
|
if @m = CommentEnd.match(@rest)
|
38
|
-
|
39
|
-
|
34
|
+
debug_state 'Comment End'
|
35
|
+
# Workaround for https://bugs.ruby-lang.org/issues/9277 and another bug in 1.9.2 where even a
|
36
|
+
# single dash in a comment will cause REXML to error.
|
37
|
+
@already << @m.pre_match.gsub(/-(?![^\-])/, '- ') << @m.to_s
|
40
38
|
@rest = @m.post_match
|
41
39
|
self.state = :inside_element
|
42
40
|
else
|
43
|
-
@already << @rest
|
41
|
+
@already << @rest.gsub(/-(?![^\-])/, '- ') # Workaround for https://bugs.ruby-lang.org/issues/9277
|
44
42
|
@rest = ""
|
45
43
|
self.state = :inside_comment
|
46
44
|
end
|
47
45
|
when :inside_element
|
48
46
|
if @m = CommentStart.match(@rest)
|
49
|
-
|
47
|
+
debug_state 'Comment'
|
50
48
|
things_read += 1
|
51
49
|
@already << @m.pre_match << @m.to_s
|
52
50
|
@rest = @m.post_match
|
53
51
|
self.state = :inside_comment
|
54
52
|
elsif @m = Tag.match(@rest)
|
55
|
-
|
53
|
+
debug_state 'Tag'
|
56
54
|
things_read += 1
|
57
55
|
self.state = :inside_element
|
58
56
|
handle_tag
|
59
57
|
elsif @m = CData.match(@rest)
|
60
|
-
|
61
|
-
@already << @m.pre_match
|
58
|
+
debug_state 'CDATA'
|
59
|
+
@already << @m.pre_match
|
60
|
+
close_script_style if script_style?
|
61
|
+
@already << @m.to_s
|
62
62
|
@rest = @m.post_match
|
63
63
|
self.state = :inside_cdata
|
64
64
|
elsif @m = PartialTag.match(@rest)
|
65
|
-
|
65
|
+
debug_state 'PartialTag'
|
66
66
|
@already << @m.pre_match
|
67
67
|
@rest = @m.post_match
|
68
68
|
@partial_tag = @m.to_s
|
69
69
|
self.state = :inside_tag
|
70
70
|
elsif @m = EverythingElse.match(@rest)
|
71
|
-
|
71
|
+
debug_state 'EverythingElse'
|
72
72
|
@already << @m.pre_match << @m.to_s
|
73
73
|
@rest = @m.post_match
|
74
74
|
self.state = :inside_element
|
@@ -77,12 +77,14 @@ module MaRuKu::In::Markdown::SpanLevelParser
|
|
77
77
|
end
|
78
78
|
when :inside_tag
|
79
79
|
if @m = /^[^>]*>/.match(@rest)
|
80
|
-
my_debug "#{@state}: matched #{@m.to_s.inspect}"
|
81
80
|
@partial_tag << @m.to_s
|
82
|
-
my_debug "#{@state}: matched TOTAL: #{@partial_tag.to_s.inspect}"
|
83
81
|
@rest = @partial_tag + @m.post_match
|
84
82
|
@partial_tag = nil
|
85
83
|
self.state = :inside_element
|
84
|
+
if @m = Tag.match(@rest)
|
85
|
+
things_read += 1
|
86
|
+
handle_tag
|
87
|
+
end
|
86
88
|
else
|
87
89
|
@partial_tag << @rest
|
88
90
|
@rest = ""
|
@@ -90,60 +92,25 @@ module MaRuKu::In::Markdown::SpanLevelParser
|
|
90
92
|
end
|
91
93
|
when :inside_cdata
|
92
94
|
if @m = CDataEnd.match(@rest)
|
93
|
-
|
95
|
+
self.state = :inside_element
|
94
96
|
@already << @m.pre_match << @m.to_s
|
95
97
|
@rest = @m.post_match
|
96
|
-
|
98
|
+
start_script_style if script_style?
|
97
99
|
else
|
98
100
|
@already << @rest
|
99
101
|
@rest = ""
|
100
102
|
self.state = :inside_cdata
|
101
103
|
end
|
102
|
-
when :inside_script_style
|
103
|
-
if @m = CData.match(@rest)
|
104
|
-
if @already.rstrip.end_with?('<![CDATA[')
|
105
|
-
@already << @m.pre_match
|
106
|
-
@rest = @m.post_match
|
107
|
-
else
|
108
|
-
my_debug "#{@state}: CDATA: #{@m.to_s.inspect}"
|
109
|
-
@already << @m.pre_match << @m.to_s
|
110
|
-
@rest = @m.post_match
|
111
|
-
self.state = :inside_cdata
|
112
|
-
end
|
113
|
-
elsif @m = Tag.match(@rest)
|
114
|
-
is_closing = !!@m[1]
|
115
|
-
tag = @m[2]
|
116
|
-
if is_closing && tag == @tag_stack.last
|
117
|
-
my_debug "#{@state}: matched #{@m.to_s.inspect}"
|
118
|
-
@already << @m.pre_match
|
119
|
-
@rest = @m.post_match
|
120
|
-
# This is necessary to properly parse
|
121
|
-
# script tags
|
122
|
-
@already << "]]>" unless @already.rstrip.end_with?("]]>")
|
123
|
-
self.state = :inside_element
|
124
|
-
handle_tag false # don't double-add pre_match
|
125
|
-
else
|
126
|
-
@already << @rest
|
127
|
-
@rest = ""
|
128
|
-
end
|
129
|
-
elsif @m = EverythingElse.match(@rest)
|
130
|
-
my_debug "#{@state}: Everything: #{@m.to_s.inspect}"
|
131
|
-
@already << @m.pre_match << @m.to_s
|
132
|
-
@rest = @m.post_match
|
133
|
-
else
|
134
|
-
@already << @rest
|
135
|
-
@rest = ""
|
136
|
-
end
|
137
104
|
else
|
138
105
|
raise "Bug bug: state = #{self.state.inspect}"
|
139
|
-
end
|
106
|
+
end
|
140
107
|
|
141
108
|
break if is_finished? && things_read > 0
|
142
109
|
end
|
143
110
|
end
|
144
111
|
|
145
|
-
def handle_tag
|
146
|
-
@already << @m.pre_match
|
112
|
+
def handle_tag
|
113
|
+
@already << @m.pre_match
|
147
114
|
@rest = @m.post_match
|
148
115
|
|
149
116
|
is_closing = !!@m[1]
|
@@ -157,44 +124,50 @@ module MaRuKu::In::Markdown::SpanLevelParser
|
|
157
124
|
is_single = true
|
158
125
|
end
|
159
126
|
|
160
|
-
my_debug "Attributes: #{attributes.inspect}"
|
161
|
-
my_debug "READ TAG #{@m.to_s.inspect} tag = #{tag} closing? #{is_closing} single = #{is_single}"
|
162
|
-
|
163
127
|
if TO_SANITIZE.include? tag
|
164
128
|
attributes.strip!
|
165
|
-
# puts "Attributes: #{attributes.inspect}"
|
166
129
|
if attributes.size > 0
|
167
|
-
@already <<
|
130
|
+
@already << '<%s %s />' % [tag, attributes]
|
168
131
|
else
|
169
|
-
@already <<
|
132
|
+
@already << '<%s />' % [tag]
|
170
133
|
end
|
171
134
|
elsif is_closing
|
172
135
|
if @tag_stack.empty?
|
173
136
|
error "Malformed: closing tag #{tag.inspect} in empty list"
|
174
|
-
|
175
|
-
if @tag_stack.last != tag
|
137
|
+
elsif @tag_stack.last != tag
|
176
138
|
error "Malformed: tag <#{tag}> closes <#{@tag_stack.last}>"
|
177
139
|
end
|
178
140
|
|
141
|
+
close_script_style if script_style?
|
142
|
+
|
179
143
|
@already << @m.to_s
|
180
144
|
@tag_stack.pop
|
181
145
|
else
|
182
146
|
@already << @m.to_s
|
147
|
+
@tag_stack.push(tag) unless is_single
|
183
148
|
|
184
|
-
if
|
185
|
-
@tag_stack.push(tag)
|
186
|
-
my_debug "Pushing #{tag.inspect} when read #{@m.to_s.inspect}"
|
187
|
-
end
|
188
|
-
|
189
|
-
if %w(script style).include?(@tag_stack.last)
|
190
|
-
# This is necessary to properly parse
|
191
|
-
# script tags
|
192
|
-
@already << "<![CDATA["
|
193
|
-
self.state = :inside_script_style
|
194
|
-
end
|
149
|
+
start_script_style if script_style?
|
195
150
|
end
|
196
151
|
end
|
197
152
|
|
153
|
+
def stuff_you_read
|
154
|
+
@already
|
155
|
+
end
|
156
|
+
|
157
|
+
def is_finished?
|
158
|
+
self.state == :inside_element && @tag_stack.empty?
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def debug_state(note)
|
164
|
+
my_debug "#{@state}: #{note}: #{@m.to_s.inspect}"
|
165
|
+
end
|
166
|
+
|
167
|
+
def my_debug(s)
|
168
|
+
# puts "---" * 10 + "\n" + inspect + "\t>>>\t" + s
|
169
|
+
end
|
170
|
+
|
198
171
|
def error(s)
|
199
172
|
raise "Error: #{s} \n" + inspect, caller
|
200
173
|
end
|
@@ -209,12 +182,52 @@ module MaRuKu::In::Markdown::SpanLevelParser
|
|
209
182
|
@rest.gsub(/^/, '|') + "\n"
|
210
183
|
end
|
211
184
|
|
212
|
-
|
213
|
-
|
185
|
+
# Script and style tag handling
|
186
|
+
# -----------------------------
|
187
|
+
#
|
188
|
+
# XHTML, and XML parsers like REXML, require that certain characters be
|
189
|
+
# escaped within script or style tags. However, there are conflicts between
|
190
|
+
# documents served as XHTML vs HTML. So we need to be extra careful about
|
191
|
+
# how we escape these tags so they will even parse correctly. However, we
|
192
|
+
# also try to avoid adding that escaping unnecessarily.
|
193
|
+
#
|
194
|
+
# See http://dorward.me.uk/www/comments-cdata/ for a good explanation.
|
195
|
+
|
196
|
+
# Are we within a script or style tag?
|
197
|
+
def script_style?
|
198
|
+
%w(script style).include?(@tag_stack.last)
|
214
199
|
end
|
215
200
|
|
216
|
-
|
217
|
-
|
201
|
+
# Save our @already buffer elsewhere, and switch to using @already for the
|
202
|
+
# contents of this script or style tag.
|
203
|
+
def start_script_style
|
204
|
+
@before_already, @already = @already, ""
|
205
|
+
end
|
206
|
+
|
207
|
+
# Finish script or style tag content, wrapping it in CDATA if necessary,
|
208
|
+
# and add it to our original @already buffer.
|
209
|
+
def close_script_style
|
210
|
+
tag = @tag_stack.last
|
211
|
+
|
212
|
+
# See http://www.w3.org/TR/xhtml1/#C_4 for character sequences not allowed within an element body.
|
213
|
+
if @already =~ /<|&|\]\]>|--/
|
214
|
+
new_already = script_style_cdata_start(tag)
|
215
|
+
new_already << "\n" unless @already.start_with?("\n")
|
216
|
+
new_already << @already
|
217
|
+
new_already << "\n" unless @already.end_with?("\n")
|
218
|
+
new_already << script_style_cdata_end(tag)
|
219
|
+
@already = new_already
|
220
|
+
end
|
221
|
+
@before_already << @already
|
222
|
+
@already = @before_already
|
223
|
+
end
|
224
|
+
|
225
|
+
def script_style_cdata_start(tag)
|
226
|
+
(tag == 'script') ? "//<![CDATA[" : "/*<![CDATA[*/"
|
227
|
+
end
|
228
|
+
|
229
|
+
def script_style_cdata_end(tag)
|
230
|
+
(tag == 'script') ? "//]]>" : "/*]]>*/"
|
218
231
|
end
|
219
|
-
end
|
232
|
+
end
|
220
233
|
end
|