kramdown 1.17.0 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of kramdown might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CONTRIBUTERS +4 -2
- data/VERSION +1 -1
- data/bin/kramdown +13 -14
- data/lib/kramdown.rb +2 -2
- data/lib/kramdown/converter.rb +6 -7
- data/lib/kramdown/converter/base.rb +18 -29
- data/lib/kramdown/converter/hash_ast.rb +4 -4
- data/lib/kramdown/converter/html.rb +82 -67
- data/lib/kramdown/converter/kramdown.rb +83 -78
- data/lib/kramdown/converter/latex.rb +53 -47
- data/lib/kramdown/converter/man.rb +22 -25
- data/lib/kramdown/converter/math_engine/mathjax.rb +10 -10
- data/lib/kramdown/converter/remove_html_tags.rb +2 -2
- data/lib/kramdown/converter/syntax_highlighter.rb +2 -2
- data/lib/kramdown/converter/syntax_highlighter/minted.rb +2 -2
- data/lib/kramdown/converter/syntax_highlighter/rouge.rb +5 -5
- data/lib/kramdown/converter/toc.rb +5 -5
- data/lib/kramdown/document.rb +9 -11
- data/lib/kramdown/element.rb +11 -9
- data/lib/kramdown/error.rb +2 -2
- data/lib/kramdown/options.rb +258 -384
- data/lib/kramdown/parser.rb +2 -3
- data/lib/kramdown/parser/base.rb +7 -6
- data/lib/kramdown/parser/html.rb +103 -95
- data/lib/kramdown/parser/kramdown.rb +32 -36
- data/lib/kramdown/parser/kramdown/abbreviation.rb +13 -10
- data/lib/kramdown/parser/kramdown/autolink.rb +3 -3
- data/lib/kramdown/parser/kramdown/blank_line.rb +2 -2
- data/lib/kramdown/parser/kramdown/block_boundary.rb +2 -2
- data/lib/kramdown/parser/kramdown/blockquote.rb +4 -5
- data/lib/kramdown/parser/kramdown/codeblock.rb +4 -5
- data/lib/kramdown/parser/kramdown/codespan.rb +5 -5
- data/lib/kramdown/parser/kramdown/emphasis.rb +6 -6
- data/lib/kramdown/parser/kramdown/eob.rb +2 -2
- data/lib/kramdown/parser/kramdown/escaped_chars.rb +2 -2
- data/lib/kramdown/parser/kramdown/extensions.rb +31 -26
- data/lib/kramdown/parser/kramdown/footnote.rb +7 -6
- data/lib/kramdown/parser/kramdown/header.rb +6 -6
- data/lib/kramdown/parser/kramdown/horizontal_rule.rb +3 -3
- data/lib/kramdown/parser/kramdown/html.rb +31 -26
- data/lib/kramdown/parser/kramdown/html_entity.rb +6 -5
- data/lib/kramdown/parser/kramdown/line_break.rb +3 -3
- data/lib/kramdown/parser/kramdown/link.rb +13 -11
- data/lib/kramdown/parser/kramdown/list.rb +38 -40
- data/lib/kramdown/parser/kramdown/math.rb +4 -5
- data/lib/kramdown/parser/kramdown/paragraph.rb +5 -5
- data/lib/kramdown/parser/kramdown/smart_quotes.rb +23 -23
- data/lib/kramdown/parser/kramdown/table.rb +18 -17
- data/lib/kramdown/parser/kramdown/typographic_symbol.rb +8 -8
- data/lib/kramdown/parser/markdown.rb +9 -8
- data/lib/kramdown/utils.rb +5 -6
- data/lib/kramdown/utils/configurable.rb +7 -6
- data/lib/kramdown/utils/entities.rb +286 -289
- data/lib/kramdown/utils/html.rb +10 -12
- data/lib/kramdown/utils/lru_cache.rb +3 -2
- data/lib/kramdown/utils/string_scanner.rb +2 -3
- data/lib/kramdown/utils/unidecoder.rb +8 -6
- data/lib/kramdown/version.rb +3 -3
- data/man/man1/kramdown.1 +3 -107
- data/test/run_tests.rb +6 -6
- data/test/test_files.rb +122 -298
- data/test/test_location.rb +8 -30
- data/test/test_string_scanner_kramdown.rb +6 -9
- data/test/testcases/block/06_codeblock/highlighting-opts.html +6 -6
- data/test/testcases/block/06_codeblock/highlighting.html +5 -6
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options +1 -1
- data/test/testcases/block/07_horizontal_rule/error.html +2 -2
- data/test/testcases/block/09_html/html5_attributes.html +2 -0
- data/test/testcases/block/09_html/html5_attributes.text +2 -0
- data/test/testcases/block/09_html/html_to_native/typography.html +1 -1
- data/test/testcases/block/09_html/simple.html +1 -1
- data/test/testcases/block/12_extension/options3.html +7 -6
- data/test/testcases/block/12_extension/options3.text +2 -2
- data/test/testcases/span/01_link/inline.html +1 -1
- data/test/testcases/span/01_link/reference.html +3 -3
- data/test/testcases/span/03_codespan/highlighting.html +1 -1
- data/test/testcases/span/text_substitutions/entities_as_char.html +1 -1
- metadata +5 -234
- data/Rakefile +0 -341
- data/benchmark/benchmark.rb +0 -43
- data/benchmark/benchmark.sh +0 -74
- data/benchmark/generate_data.rb +0 -119
- data/benchmark/mdbasics.text +0 -306
- data/benchmark/mdsyntax.text +0 -888
- data/benchmark/testing.sh +0 -12
- data/benchmark/timing.sh +0 -10
- data/doc/_design.scss +0 -441
- data/doc/bg.png +0 -0
- data/doc/default.scss +0 -217
- data/doc/default.template +0 -62
- data/doc/documentation.page +0 -84
- data/doc/documentation.template +0 -36
- data/doc/index.page +0 -113
- data/doc/installation.page +0 -88
- data/doc/links.markdown +0 -6
- data/doc/metainfo +0 -13
- data/doc/news.feed +0 -9
- data/doc/news.page +0 -29
- data/doc/options.page +0 -49
- data/doc/quickref.page +0 -603
- data/doc/sidebar.template +0 -22
- data/doc/sitemap.sitemap +0 -5
- data/doc/syntax.page +0 -1799
- data/doc/tests.page +0 -104
- data/doc/virtual +0 -14
- data/lib/kramdown/converter/math_engine/itex2mml.rb +0 -39
- data/lib/kramdown/converter/math_engine/katex.rb +0 -35
- data/lib/kramdown/converter/math_engine/mathjaxnode.rb +0 -56
- data/lib/kramdown/converter/math_engine/ritex.rb +0 -38
- data/lib/kramdown/converter/math_engine/sskatex.rb +0 -97
- data/lib/kramdown/converter/pdf.rb +0 -625
- data/lib/kramdown/converter/syntax_highlighter/coderay.rb +0 -81
- data/lib/kramdown/parser/gfm.rb +0 -188
- data/lib/kramdown/utils/ordered_hash.rb +0 -18
- data/setup.rb +0 -1585
- data/test/testcases/block/07_horizontal_rule/error.html.19 +0 -7
- data/test/testcases/block/09_html/html_to_native/typography.html.19 +0 -1
- data/test/testcases/block/09_html/simple.html.19 +0 -60
- data/test/testcases/block/15_math/itex2mml.html +0 -1
- data/test/testcases/block/15_math/itex2mml.options +0 -1
- data/test/testcases/block/15_math/itex2mml.text +0 -1
- data/test/testcases/block/15_math/katex.html.19 +0 -2
- data/test/testcases/block/15_math/katex.options +0 -1
- data/test/testcases/block/15_math/katex.text +0 -2
- data/test/testcases/block/15_math/mathjaxnode.html.19 +0 -27
- data/test/testcases/block/15_math/mathjaxnode.options +0 -1
- data/test/testcases/block/15_math/mathjaxnode.text +0 -1
- data/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 +0 -23
- data/test/testcases/block/15_math/mathjaxnode_notexhints.options +0 -3
- data/test/testcases/block/15_math/mathjaxnode_notexhints.text +0 -1
- data/test/testcases/block/15_math/mathjaxnode_semantics.html.19 +0 -32
- data/test/testcases/block/15_math/mathjaxnode_semantics.options +0 -3
- data/test/testcases/block/15_math/mathjaxnode_semantics.text +0 -1
- data/test/testcases/block/15_math/ritex.html +0 -1
- data/test/testcases/block/15_math/ritex.options +0 -1
- data/test/testcases/block/15_math/ritex.text +0 -1
- data/test/testcases/block/15_math/sskatex.html.19 +0 -2
- data/test/testcases/block/15_math/sskatex.options +0 -1
- data/test/testcases/block/15_math/sskatex.text +0 -2
- data/test/testcases/span/01_link/inline.html.19 +0 -46
- data/test/testcases/span/01_link/reference.html.19 +0 -37
- data/test/testcases/span/math/itex2mml.html +0 -1
- data/test/testcases/span/math/itex2mml.options +0 -1
- data/test/testcases/span/math/itex2mml.text +0 -1
- data/test/testcases/span/math/katex.html.19 +0 -1
- data/test/testcases/span/math/katex.options +0 -1
- data/test/testcases/span/math/katex.text +0 -1
- data/test/testcases/span/math/mathjaxnode.html.19 +0 -27
- data/test/testcases/span/math/mathjaxnode.options +0 -1
- data/test/testcases/span/math/mathjaxnode.text +0 -1
- data/test/testcases/span/math/ritex.html +0 -1
- data/test/testcases/span/math/ritex.options +0 -1
- data/test/testcases/span/math/ritex.text +0 -1
- data/test/testcases/span/math/sskatex.html.19 +0 -1
- data/test/testcases/span/math/sskatex.options +0 -1
- data/test/testcases/span/math/sskatex.text +0 -1
- data/test/testcases/span/text_substitutions/entities_as_char.html.19 +0 -1
- data/test/testcases_gfm/atx_header.html +0 -3
- data/test/testcases_gfm/atx_header.text +0 -3
- data/test/testcases_gfm/backticks_disable_highlighting.html +0 -2
- data/test/testcases_gfm/backticks_disable_highlighting.options +0 -1
- data/test/testcases_gfm/backticks_disable_highlighting.text +0 -3
- data/test/testcases_gfm/backticks_syntax.html +0 -20
- data/test/testcases_gfm/backticks_syntax.text +0 -19
- data/test/testcases_gfm/codeblock_fenced.html +0 -20
- data/test/testcases_gfm/codeblock_fenced.options +0 -1
- data/test/testcases_gfm/codeblock_fenced.text +0 -21
- data/test/testcases_gfm/hard_line_breaks.html +0 -3
- data/test/testcases_gfm/hard_line_breaks.text +0 -3
- data/test/testcases_gfm/hard_line_breaks_off.html +0 -2
- data/test/testcases_gfm/hard_line_breaks_off.options +0 -1
- data/test/testcases_gfm/hard_line_breaks_off.text +0 -2
- data/test/testcases_gfm/header_ids.html +0 -27
- data/test/testcases_gfm/header_ids.html.19 +0 -27
- data/test/testcases_gfm/header_ids.options +0 -1
- data/test/testcases_gfm/header_ids.text +0 -27
- data/test/testcases_gfm/header_ids_with_prefix.html +0 -3
- data/test/testcases_gfm/header_ids_with_prefix.options +0 -2
- data/test/testcases_gfm/header_ids_with_prefix.text +0 -3
- data/test/testcases_gfm/no_typographic.html +0 -3
- data/test/testcases_gfm/no_typographic.html.19 +0 -3
- data/test/testcases_gfm/no_typographic.options +0 -1
- data/test/testcases_gfm/no_typographic.text +0 -3
- data/test/testcases_gfm/paragraph_end-disabled.html +0 -31
- data/test/testcases_gfm/paragraph_end-disabled.options +0 -1
- data/test/testcases_gfm/paragraph_end-disabled.text +0 -27
- data/test/testcases_gfm/paragraph_end.html +0 -38
- data/test/testcases_gfm/paragraph_end.text +0 -27
- data/test/testcases_gfm/strikethrough.html +0 -27
- data/test/testcases_gfm/strikethrough.html.19 +0 -27
- data/test/testcases_gfm/strikethrough.text +0 -27
- data/test/testcases_gfm/task_list.html +0 -40
- data/test/testcases_gfm/task_list.text +0 -26
- data/test/testcases_gfm/two_para_hard_line_breaks.html +0 -4
- data/test/testcases_gfm/two_para_hard_line_breaks.text +0 -4
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -22,9 +22,11 @@ module Kramdown
|
|
22
22
|
start_line_number = @src.current_line_number
|
23
23
|
@src.pos += @src.matched_size
|
24
24
|
|
25
|
-
el = Element.new(:footnote_def, nil, nil, :
|
25
|
+
el = Element.new(:footnote_def, nil, nil, location: start_line_number)
|
26
26
|
parse_blocks(el, @src[2].gsub(INDENT, ''))
|
27
|
-
|
27
|
+
if @footnotes[@src[1]]
|
28
|
+
warning("Duplicate footnote name '#{@src[1]}' on line #{start_line_number} - overwriting")
|
29
|
+
end
|
28
30
|
@tree.children << new_block_el(:eob, :footnote_def)
|
29
31
|
(@footnotes[@src[1]] = {})[:content] = el
|
30
32
|
@footnotes[@src[1]][:eob] = @tree.children.last
|
@@ -32,7 +34,6 @@ module Kramdown
|
|
32
34
|
end
|
33
35
|
define_parser(:footnote_definition, FOOTNOTE_DEFINITION_START)
|
34
36
|
|
35
|
-
|
36
37
|
FOOTNOTE_MARKER_START = /\[\^(#{ALD_ID_NAME})\]/
|
37
38
|
|
38
39
|
# Parse the footnote marker at the current location.
|
@@ -49,7 +50,7 @@ module Kramdown
|
|
49
50
|
end
|
50
51
|
fn_def[:marker] ||= []
|
51
52
|
fn_def[:marker].push(Element.new(:footnote, fn_def[:content], fn_def[:attr],
|
52
|
-
fn_def[:options].merge(:
|
53
|
+
fn_def[:options].merge(name: @src[1], location: start_line_number)))
|
53
54
|
@tree.children << fn_def[:marker].last
|
54
55
|
else
|
55
56
|
warning("Footnote definition for '#{@src[1]}' not found on line #{start_line_number}")
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -17,7 +17,7 @@ module Kramdown
|
|
17
17
|
|
18
18
|
# Parse the Setext header at the current location.
|
19
19
|
def parse_setext_header
|
20
|
-
return false
|
20
|
+
return false unless after_block_boundary?
|
21
21
|
text, id = parse_header_contents
|
22
22
|
return false if text.empty?
|
23
23
|
add_header(@src["level"] == '-' ? 2 : 1, text, id)
|
@@ -25,12 +25,11 @@ module Kramdown
|
|
25
25
|
end
|
26
26
|
define_parser(:setext_header, SETEXT_HEADER_START)
|
27
27
|
|
28
|
-
|
29
28
|
ATX_HEADER_START = /^(?<level>\#{1,6})[\t ]*(?<contents>[^ \t].*)\n/
|
30
29
|
|
31
30
|
# Parse the Atx header at the current location.
|
32
31
|
def parse_atx_header
|
33
|
-
return false
|
32
|
+
return false unless after_block_boundary?
|
34
33
|
text, id = parse_header_contents
|
35
34
|
text.sub!(/[\t ]#+\z/, '') && text.rstrip!
|
36
35
|
return false if text.empty?
|
@@ -59,11 +58,12 @@ module Kramdown
|
|
59
58
|
def add_header(level, text, id)
|
60
59
|
start_line_number = @src.current_line_number
|
61
60
|
@src.pos += @src.matched_size
|
62
|
-
el = new_block_el(:header, nil, nil, :
|
61
|
+
el = new_block_el(:header, nil, nil, level: level, raw_text: text, location: start_line_number)
|
63
62
|
add_text(text, el)
|
64
63
|
el.attr['id'] = id if id
|
65
64
|
@tree.children << el
|
66
65
|
end
|
66
|
+
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -17,7 +17,7 @@ module Kramdown
|
|
17
17
|
def parse_horizontal_rule
|
18
18
|
start_line_number = @src.current_line_number
|
19
19
|
@src.pos += @src.matched_size
|
20
|
-
@tree.children << new_block_el(:hr, nil, nil, :
|
20
|
+
@tree.children << new_block_el(:hr, nil, nil, location: start_line_number)
|
21
21
|
true
|
22
22
|
end
|
23
23
|
define_parser(:horizontal_rule, HR_START)
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -33,7 +33,7 @@ module Kramdown
|
|
33
33
|
else
|
34
34
|
:raw
|
35
35
|
end
|
36
|
-
if val = HTML_MARKDOWN_ATTR_MAP[el.attr.delete('markdown')]
|
36
|
+
if (val = HTML_MARKDOWN_ATTR_MAP[el.attr.delete('markdown')])
|
37
37
|
content_model = (val == :default ? HTML_CONTENT_MODEL[el.value] : val)
|
38
38
|
end
|
39
39
|
|
@@ -43,7 +43,7 @@ module Kramdown
|
|
43
43
|
|
44
44
|
if !closed && handle_body
|
45
45
|
if content_model == :block
|
46
|
-
|
46
|
+
unless parse_blocks(el)
|
47
47
|
warning("Found no end tag for '#{el.value}' (line #{el.options[:location]}) - auto-closing it")
|
48
48
|
end
|
49
49
|
elsif content_model == :span
|
@@ -59,31 +59,32 @@ module Kramdown
|
|
59
59
|
else
|
60
60
|
parse_raw_html(el, &method(:handle_kramdown_html_tag))
|
61
61
|
end
|
62
|
-
|
62
|
+
unless @tree.type == :html_element && @tree.options[:content_model] == :raw
|
63
|
+
@src.scan(TRAILING_WHITESPACE)
|
64
|
+
end
|
63
65
|
end
|
64
66
|
end
|
65
67
|
|
66
|
-
|
67
68
|
HTML_BLOCK_START = /^#{OPT_SPACE}<(#{REXML::Parsers::BaseParser::UNAME_STR}|\?|!--|\/)/
|
68
69
|
|
69
70
|
# Parse the HTML at the current position as block-level HTML.
|
70
71
|
def parse_block_html
|
71
72
|
line = @src.current_line_number
|
72
|
-
if result = @src.scan(HTML_COMMENT_RE)
|
73
|
-
@tree.children << Element.new(:xml_comment, result, nil, :
|
73
|
+
if (result = @src.scan(HTML_COMMENT_RE))
|
74
|
+
@tree.children << Element.new(:xml_comment, result, nil, category: :block, location: line)
|
74
75
|
@src.scan(TRAILING_WHITESPACE)
|
75
76
|
true
|
76
|
-
elsif result = @src.scan(HTML_INSTRUCTION_RE)
|
77
|
-
@tree.children << Element.new(:xml_pi, result, nil, :
|
77
|
+
elsif (result = @src.scan(HTML_INSTRUCTION_RE))
|
78
|
+
@tree.children << Element.new(:xml_pi, result, nil, category: :block, location: line)
|
78
79
|
@src.scan(TRAILING_WHITESPACE)
|
79
80
|
true
|
80
81
|
else
|
81
|
-
if
|
82
|
+
if @src.check(/^#{OPT_SPACE}#{HTML_TAG_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
|
82
83
|
@src.pos += @src.matched_size
|
83
84
|
handle_html_start_tag(line, &method(:handle_kramdown_html_tag))
|
84
85
|
Kramdown::Parser::Html::ElementConverter.convert(@root, @tree.children.last) if @options[:html_to_native]
|
85
86
|
true
|
86
|
-
elsif
|
87
|
+
elsif @src.check(/^#{OPT_SPACE}#{HTML_TAG_CLOSE_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
|
87
88
|
name = @src[1].downcase
|
88
89
|
|
89
90
|
if @tree.type == :html_element && @tree.value == name
|
@@ -99,20 +100,19 @@ module Kramdown
|
|
99
100
|
end
|
100
101
|
define_parser(:block_html, HTML_BLOCK_START)
|
101
102
|
|
102
|
-
|
103
103
|
HTML_SPAN_START = /<(#{REXML::Parsers::BaseParser::UNAME_STR}|\?|!--|\/)/
|
104
104
|
|
105
105
|
# Parse the HTML at the current position as span-level HTML.
|
106
106
|
def parse_span_html
|
107
107
|
line = @src.current_line_number
|
108
|
-
if result = @src.scan(HTML_COMMENT_RE)
|
109
|
-
@tree.children << Element.new(:xml_comment, result, nil, :
|
110
|
-
elsif result = @src.scan(HTML_INSTRUCTION_RE)
|
111
|
-
@tree.children << Element.new(:xml_pi, result, nil, :
|
112
|
-
elsif result = @src.scan(HTML_TAG_CLOSE_RE)
|
108
|
+
if (result = @src.scan(HTML_COMMENT_RE))
|
109
|
+
@tree.children << Element.new(:xml_comment, result, nil, category: :span, location: line)
|
110
|
+
elsif (result = @src.scan(HTML_INSTRUCTION_RE))
|
111
|
+
@tree.children << Element.new(:xml_pi, result, nil, category: :span, location: line)
|
112
|
+
elsif (result = @src.scan(HTML_TAG_CLOSE_RE))
|
113
113
|
warning("Found invalidly used HTML closing tag for '#{@src[1]}' on line #{line}")
|
114
114
|
add_text(result)
|
115
|
-
elsif result = @src.scan(HTML_TAG_RE)
|
115
|
+
elsif (result = @src.scan(HTML_TAG_RE))
|
116
116
|
tag_name = @src[1]
|
117
117
|
tag_name.downcase! if HTML_ELEMENT[tag_name.downcase]
|
118
118
|
if HTML_BLOCK_ELEMENTS.include?(tag_name)
|
@@ -122,12 +122,17 @@ module Kramdown
|
|
122
122
|
end
|
123
123
|
|
124
124
|
attrs = parse_html_attributes(@src[2], line, HTML_ELEMENT[tag_name])
|
125
|
-
attrs.
|
126
|
-
|
127
|
-
do_parsing =
|
128
|
-
|
125
|
+
attrs.each_value {|value| value.gsub!(/\n+/, ' ') unless value.empty? }
|
126
|
+
|
127
|
+
do_parsing = if HTML_CONTENT_MODEL[tag_name] == :raw || @tree.options[:content_model] == :raw
|
128
|
+
false
|
129
|
+
else
|
130
|
+
@options[:parse_span_html]
|
131
|
+
end
|
132
|
+
if (val = HTML_MARKDOWN_ATTR_MAP[attrs.delete('markdown')])
|
129
133
|
if val == :block
|
130
|
-
warning("Cannot use block-level parsing in span-level HTML tag (line #{line})
|
134
|
+
warning("Cannot use block-level parsing in span-level HTML tag (line #{line}) " \
|
135
|
+
"- using default mode")
|
131
136
|
elsif val == :span
|
132
137
|
do_parsing = true
|
133
138
|
elsif val == :default
|
@@ -137,8 +142,8 @@ module Kramdown
|
|
137
142
|
end
|
138
143
|
end
|
139
144
|
|
140
|
-
el = Element.new(:html_element, tag_name, attrs, :
|
141
|
-
:
|
145
|
+
el = Element.new(:html_element, tag_name, attrs, category: :span, location: line,
|
146
|
+
content_model: (do_parsing ? :span : :raw), is_closed: !!@src[4])
|
142
147
|
@tree.children << el
|
143
148
|
stop_re = /<\/#{Regexp.escape(tag_name)}\s*>/
|
144
149
|
stop_re = Regexp.new(stop_re.source, Regexp::IGNORECASE) if HTML_ELEMENT[tag_name]
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -18,11 +18,12 @@ module Kramdown
|
|
18
18
|
start_line_number = @src.current_line_number
|
19
19
|
@src.pos += @src.matched_size
|
20
20
|
begin
|
21
|
-
|
22
|
-
|
21
|
+
value = ::Kramdown::Utils::Entities.entity(@src[1] || (@src[2]&.to_i) || @src[3].hex)
|
22
|
+
@tree.children << Element.new(:entity, value,
|
23
|
+
nil, original: @src.matched, location: start_line_number)
|
23
24
|
rescue ::Kramdown::Error
|
24
25
|
@tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('amp'),
|
25
|
-
nil, :
|
26
|
+
nil, location: start_line_number)
|
26
27
|
add_text(@src.matched[1..-1])
|
27
28
|
end
|
28
29
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -15,7 +15,7 @@ module Kramdown
|
|
15
15
|
|
16
16
|
# Parse the line break at the current location.
|
17
17
|
def parse_line_break
|
18
|
-
@tree.children << Element.new(:br, nil, nil, :
|
18
|
+
@tree.children << Element.new(:br, nil, nil, location: @src.current_line_number)
|
19
19
|
@src.pos += @src.matched_size
|
20
20
|
end
|
21
21
|
define_parser(:line_break, LINE_BREAK, '( |\\\\)(?=\n)')
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -25,14 +25,15 @@ module Kramdown
|
|
25
25
|
return false if @src[3].to_s =~ /[ \t]+["']/
|
26
26
|
@src.pos += @src.matched_size
|
27
27
|
link_id, link_url, link_title = normalize_link_id(@src[1]), @src[2] || @src[3], @src[5]
|
28
|
-
|
28
|
+
if @link_defs[link_id]
|
29
|
+
warning("Duplicate link ID '#{link_id}' on line #{@src.current_line_number} - overwriting")
|
30
|
+
end
|
29
31
|
@tree.children << new_block_el(:eob, :link_def)
|
30
32
|
@link_defs[link_id] = [link_url, link_title, @tree.children.last]
|
31
33
|
true
|
32
34
|
end
|
33
35
|
define_parser(:link_definition, LINK_DEFINITION_START)
|
34
36
|
|
35
|
-
|
36
37
|
# This helper methods adds the approriate attributes to the element +el+ of type +a+ or +img+
|
37
38
|
# and the element itself to the @tree.
|
38
39
|
def add_link(el, href, title, alt_text = nil, ial = nil)
|
@@ -66,16 +67,17 @@ module Kramdown
|
|
66
67
|
link_type = (result =~ /^!/ ? :img : :a)
|
67
68
|
|
68
69
|
# no nested links allowed
|
69
|
-
if link_type == :a && (@tree.type == :img || @tree.type == :a ||
|
70
|
+
if link_type == :a && (@tree.type == :img || @tree.type == :a ||
|
71
|
+
@stack.any? {|t, _| t && (t.type == :img || t.type == :a) })
|
70
72
|
add_text(result)
|
71
73
|
return
|
72
74
|
end
|
73
|
-
el = Element.new(link_type, nil, nil, :
|
75
|
+
el = Element.new(link_type, nil, nil, location: start_line_number)
|
74
76
|
|
75
77
|
count = 1
|
76
78
|
found = parse_spans(el, LINK_BRACKET_STOP_RE) do
|
77
|
-
count
|
78
|
-
count - el.children.select {|c| c.type == :img}.size == 0
|
79
|
+
count += (@src[1] ? -1 : 1)
|
80
|
+
count - el.children.select {|c| c.type == :img }.size == 0
|
79
81
|
end
|
80
82
|
unless found
|
81
83
|
@src.revert_pos(saved_pos)
|
@@ -89,7 +91,7 @@ module Kramdown
|
|
89
91
|
if @src.scan(LINK_INLINE_ID_RE) || !@src.check(/\(/)
|
90
92
|
emit_warning = !@src[1]
|
91
93
|
link_id = normalize_link_id(@src[1] || alt_text)
|
92
|
-
if @link_defs.
|
94
|
+
if @link_defs.key?(link_id)
|
93
95
|
add_link(el, @link_defs[link_id][0], @link_defs[link_id][1], alt_text,
|
94
96
|
@link_defs[link_id][2] && @link_defs[link_id][2].options[:ial])
|
95
97
|
else
|
@@ -110,9 +112,9 @@ module Kramdown
|
|
110
112
|
return
|
111
113
|
end
|
112
114
|
else
|
113
|
-
link_url = ''
|
115
|
+
link_url = +''
|
114
116
|
nr_of_brackets = 0
|
115
|
-
while temp = @src.scan_until(LINK_PAREN_STOP_RE)
|
117
|
+
while (temp = @src.scan_until(LINK_PAREN_STOP_RE))
|
116
118
|
link_url << temp
|
117
119
|
if @src[2]
|
118
120
|
nr_of_brackets -= 1
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
5
|
#
|
6
6
|
# This file is part of kramdown which is licensed under the MIT.
|
7
7
|
#++
|
@@ -35,7 +35,7 @@ module Kramdown
|
|
35
35
|
else
|
36
36
|
while content =~ /^ *\t/
|
37
37
|
temp = content.scan(/^ */).first.length + indentation
|
38
|
-
content.sub!(/^( *)(\t+)/) {$1 << " "*(4 - (temp % 4) + ($2.length - 1)*4)}
|
38
|
+
content.sub!(/^( *)(\t+)/) { $1 << " " * (4 - (temp % 4) + ($2.length - 1) * 4) }
|
39
39
|
end
|
40
40
|
indentation += content[/^ */].length
|
41
41
|
end
|
@@ -44,7 +44,6 @@ module Kramdown
|
|
44
44
|
[content, indentation, *PARSE_FIRST_LIST_LINE_REGEXP_CACHE[indentation]]
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
47
|
LIST_START_UL = /^(#{OPT_SPACE}[+*-])([\t| ].*?\n)/
|
49
48
|
LIST_START_OL = /^(#{OPT_SPACE}\d+\.)([\t| ].*?\n)/
|
50
49
|
LIST_START = /#{LIST_START_UL}|#{LIST_START_OL}/
|
@@ -53,14 +52,14 @@ module Kramdown
|
|
53
52
|
def parse_list
|
54
53
|
start_line_number = @src.current_line_number
|
55
54
|
type, list_start_re = (@src.check(LIST_START_UL) ? [:ul, LIST_START_UL] : [:ol, LIST_START_OL])
|
56
|
-
list = new_block_el(type, nil, nil, :
|
55
|
+
list = new_block_el(type, nil, nil, location: start_line_number)
|
57
56
|
|
58
57
|
item = nil
|
59
58
|
content_re, lazy_re, indent_re = nil
|
60
59
|
eob_found = false
|
61
60
|
nested_list_found = false
|
62
61
|
last_is_blank = false
|
63
|
-
|
62
|
+
until @src.eos?
|
64
63
|
start_line_number = @src.current_line_number
|
65
64
|
if last_is_blank && @src.check(HR_START)
|
66
65
|
break
|
@@ -68,17 +67,21 @@ module Kramdown
|
|
68
67
|
eob_found = true
|
69
68
|
break
|
70
69
|
elsif @src.scan(list_start_re)
|
71
|
-
item = Element.new(:li, nil, nil, :
|
72
|
-
item.value, indentation, content_re, lazy_re, indent_re =
|
70
|
+
item = Element.new(:li, nil, nil, location: start_line_number)
|
71
|
+
item.value, indentation, content_re, lazy_re, indent_re =
|
72
|
+
parse_first_list_line(@src[1].length, @src[2])
|
73
73
|
list.children << item
|
74
74
|
|
75
|
-
item.value.sub!(self.class::LIST_ITEM_IAL) do |
|
75
|
+
item.value.sub!(self.class::LIST_ITEM_IAL) do |_match|
|
76
76
|
parse_attribute_list($1, item.options[:ial] ||= {})
|
77
77
|
''
|
78
78
|
end
|
79
79
|
|
80
|
-
list_start_re =
|
81
|
-
|
80
|
+
list_start_re = if type == :ul
|
81
|
+
/^( {0,#{[3, indentation - 1].min}}[+*-])([\t| ].*?\n)/
|
82
|
+
else
|
83
|
+
/^( {0,#{[3, indentation - 1].min}}\d+\.)([\t| ].*?\n)/
|
84
|
+
end
|
82
85
|
nested_list_found = (item.value =~ LIST_START)
|
83
86
|
last_is_blank = false
|
84
87
|
item.value = [item.value]
|
@@ -86,14 +89,14 @@ module Kramdown
|
|
86
89
|
result.sub!(/^(\t+)/) { " " * 4 * $1.length }
|
87
90
|
indentation_found = result.sub!(indent_re, '')
|
88
91
|
if !nested_list_found && indentation_found && result =~ LIST_START
|
89
|
-
item.value << ''
|
92
|
+
item.value << +''
|
90
93
|
nested_list_found = true
|
91
94
|
elsif nested_list_found && !indentation_found && result =~ LIST_START
|
92
95
|
result = " " * (indentation + 4) << result
|
93
96
|
end
|
94
97
|
item.value.last << result
|
95
98
|
last_is_blank = false
|
96
|
-
elsif result = @src.scan(BLANK_LINE)
|
99
|
+
elsif (result = @src.scan(BLANK_LINE))
|
97
100
|
nested_list_found = true
|
98
101
|
last_is_blank = true
|
99
102
|
item.value.last << result
|
@@ -106,7 +109,7 @@ module Kramdown
|
|
106
109
|
|
107
110
|
last = nil
|
108
111
|
list.children.each do |it|
|
109
|
-
temp = Element.new(:temp, nil, nil, :
|
112
|
+
temp = Element.new(:temp, nil, nil, location: it.options[:location])
|
110
113
|
|
111
114
|
env = save_env
|
112
115
|
location = it.options[:location]
|
@@ -119,7 +122,7 @@ module Kramdown
|
|
119
122
|
|
120
123
|
it.children = temp.children
|
121
124
|
it.value = nil
|
122
|
-
next if it.children.
|
125
|
+
next if it.children.empty?
|
123
126
|
|
124
127
|
# Handle the case where an EOB marker is inserted by a block IAL for the first paragraph
|
125
128
|
it.children.delete_at(1) if it.children.first.type == :p &&
|
@@ -129,16 +132,12 @@ module Kramdown
|
|
129
132
|
(it.children.length < 2 || it.children[1].type != :blank ||
|
130
133
|
(it == list.children.last && it.children.length == 2 && !eob_found)) &&
|
131
134
|
(list.children.last != it || list.children.size == 1 ||
|
132
|
-
list.children[0..-2].any? {|cit| !cit.children.first || cit.children.first.type != :p || cit.children.first.options[:transparent]})
|
135
|
+
list.children[0..-2].any? {|cit| !cit.children.first || cit.children.first.type != :p || cit.children.first.options[:transparent] })
|
133
136
|
it.children.first.children.first.value << "\n" if it.children.size > 1 && it.children[1].type != :blank
|
134
137
|
it.children.first.options[:transparent] = true
|
135
138
|
end
|
136
139
|
|
137
|
-
|
138
|
-
last = it.children.pop
|
139
|
-
else
|
140
|
-
last = nil
|
141
|
-
end
|
140
|
+
last = (it.children.last.type == :blank ? it.children.pop : nil)
|
142
141
|
end
|
143
142
|
|
144
143
|
@tree.children << last if !last.nil? && !eob_found
|
@@ -147,14 +146,14 @@ module Kramdown
|
|
147
146
|
end
|
148
147
|
define_parser(:list, LIST_START)
|
149
148
|
|
150
|
-
|
151
149
|
DEFINITION_LIST_START = /^(#{OPT_SPACE}:)([\t| ].*?\n)/
|
152
150
|
|
153
151
|
# Parse the ordered or unordered list at the current location.
|
154
152
|
def parse_definition_list
|
155
153
|
children = @tree.children
|
156
|
-
if !children.last || (children.length == 1 && children.last.type != :p
|
157
|
-
(children.length >= 2 && children[-1].type != :p &&
|
154
|
+
if !children.last || (children.length == 1 && children.last.type != :p) ||
|
155
|
+
(children.length >= 2 && children[-1].type != :p &&
|
156
|
+
(children[-1].type != :blank || children[-1].value != "\n" || children[-2].type != :p))
|
158
157
|
return false
|
159
158
|
end
|
160
159
|
|
@@ -165,9 +164,10 @@ module Kramdown
|
|
165
164
|
para = @tree.children.pop
|
166
165
|
first_as_para = true
|
167
166
|
end
|
168
|
-
|
167
|
+
# take location from preceding para which is the first definition term
|
168
|
+
deflist.options[:location] = para.options[:location]
|
169
169
|
para.children.first.value.split(/\n/).each do |term|
|
170
|
-
el = Element.new(:dt, nil, nil, :
|
170
|
+
el = Element.new(:dt, nil, nil, location: @src.current_line_number)
|
171
171
|
term.sub!(self.class::LIST_ITEM_IAL) do
|
172
172
|
parse_attribute_list($1, el.options[:ial] ||= {})
|
173
173
|
''
|
@@ -182,15 +182,16 @@ module Kramdown
|
|
182
182
|
content_re, lazy_re, indent_re = nil
|
183
183
|
def_start_re = DEFINITION_LIST_START
|
184
184
|
last_is_blank = false
|
185
|
-
|
185
|
+
until @src.eos?
|
186
186
|
start_line_number = @src.current_line_number
|
187
187
|
if @src.scan(def_start_re)
|
188
|
-
item = Element.new(:dd, nil, nil, :
|
188
|
+
item = Element.new(:dd, nil, nil, location: start_line_number)
|
189
189
|
item.options[:first_as_para] = first_as_para
|
190
|
-
item.value, indentation, content_re, lazy_re, indent_re =
|
190
|
+
item.value, indentation, content_re, lazy_re, indent_re =
|
191
|
+
parse_first_list_line(@src[1].length, @src[2])
|
191
192
|
deflist.children << item
|
192
193
|
|
193
|
-
item.value.sub!(self.class::LIST_ITEM_IAL) do |
|
194
|
+
item.value.sub!(self.class::LIST_ITEM_IAL) do |_match|
|
194
195
|
parse_attribute_list($1, item.options[:ial] ||= {})
|
195
196
|
''
|
196
197
|
end
|
@@ -201,12 +202,12 @@ module Kramdown
|
|
201
202
|
elsif @src.check(EOB_MARKER)
|
202
203
|
break
|
203
204
|
elsif (result = @src.scan(content_re)) || (!last_is_blank && (result = @src.scan(lazy_re)))
|
204
|
-
result.sub!(/^(\t+)/) { " "*($1 ? 4
|
205
|
+
result.sub!(/^(\t+)/) { " " * ($1 ? 4 * $1.length : 0) }
|
205
206
|
result.sub!(indent_re, '')
|
206
207
|
item.value << result
|
207
208
|
first_as_para = false
|
208
209
|
last_is_blank = false
|
209
|
-
elsif result = @src.scan(BLANK_LINE)
|
210
|
+
elsif (result = @src.scan(BLANK_LINE))
|
210
211
|
first_as_para = true
|
211
212
|
item.value << result
|
212
213
|
last_is_blank = true
|
@@ -221,13 +222,9 @@ module Kramdown
|
|
221
222
|
|
222
223
|
parse_blocks(it, it.value)
|
223
224
|
it.value = nil
|
224
|
-
next if it.children.
|
225
|
+
next if it.children.empty?
|
225
226
|
|
226
|
-
|
227
|
-
last = it.children.pop
|
228
|
-
else
|
229
|
-
last = nil
|
230
|
-
end
|
227
|
+
last = (it.children.last.type == :blank ? it.children.pop : nil)
|
231
228
|
|
232
229
|
if it.children.first && it.children.first.type == :p && !it.options.delete(:first_as_para)
|
233
230
|
it.children.first.children.first.value << "\n" if it.children.size > 1
|
@@ -237,14 +234,15 @@ module Kramdown
|
|
237
234
|
|
238
235
|
if @tree.children.length >= 1 && @tree.children.last.type == :dl
|
239
236
|
@tree.children[-1].children.concat(deflist.children)
|
240
|
-
elsif @tree.children.length >= 2 && @tree.children[-1].type == :blank &&
|
237
|
+
elsif @tree.children.length >= 2 && @tree.children[-1].type == :blank &&
|
238
|
+
@tree.children[-2].type == :dl
|
241
239
|
@tree.children.pop
|
242
240
|
@tree.children[-1].children.concat(deflist.children)
|
243
241
|
else
|
244
242
|
@tree.children << deflist
|
245
243
|
end
|
246
244
|
|
247
|
-
@tree.children << last if
|
245
|
+
@tree.children << last if last
|
248
246
|
|
249
247
|
true
|
250
248
|
end
|