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.

Files changed (196) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTERS +4 -2
  3. data/VERSION +1 -1
  4. data/bin/kramdown +13 -14
  5. data/lib/kramdown.rb +2 -2
  6. data/lib/kramdown/converter.rb +6 -7
  7. data/lib/kramdown/converter/base.rb +18 -29
  8. data/lib/kramdown/converter/hash_ast.rb +4 -4
  9. data/lib/kramdown/converter/html.rb +82 -67
  10. data/lib/kramdown/converter/kramdown.rb +83 -78
  11. data/lib/kramdown/converter/latex.rb +53 -47
  12. data/lib/kramdown/converter/man.rb +22 -25
  13. data/lib/kramdown/converter/math_engine/mathjax.rb +10 -10
  14. data/lib/kramdown/converter/remove_html_tags.rb +2 -2
  15. data/lib/kramdown/converter/syntax_highlighter.rb +2 -2
  16. data/lib/kramdown/converter/syntax_highlighter/minted.rb +2 -2
  17. data/lib/kramdown/converter/syntax_highlighter/rouge.rb +5 -5
  18. data/lib/kramdown/converter/toc.rb +5 -5
  19. data/lib/kramdown/document.rb +9 -11
  20. data/lib/kramdown/element.rb +11 -9
  21. data/lib/kramdown/error.rb +2 -2
  22. data/lib/kramdown/options.rb +258 -384
  23. data/lib/kramdown/parser.rb +2 -3
  24. data/lib/kramdown/parser/base.rb +7 -6
  25. data/lib/kramdown/parser/html.rb +103 -95
  26. data/lib/kramdown/parser/kramdown.rb +32 -36
  27. data/lib/kramdown/parser/kramdown/abbreviation.rb +13 -10
  28. data/lib/kramdown/parser/kramdown/autolink.rb +3 -3
  29. data/lib/kramdown/parser/kramdown/blank_line.rb +2 -2
  30. data/lib/kramdown/parser/kramdown/block_boundary.rb +2 -2
  31. data/lib/kramdown/parser/kramdown/blockquote.rb +4 -5
  32. data/lib/kramdown/parser/kramdown/codeblock.rb +4 -5
  33. data/lib/kramdown/parser/kramdown/codespan.rb +5 -5
  34. data/lib/kramdown/parser/kramdown/emphasis.rb +6 -6
  35. data/lib/kramdown/parser/kramdown/eob.rb +2 -2
  36. data/lib/kramdown/parser/kramdown/escaped_chars.rb +2 -2
  37. data/lib/kramdown/parser/kramdown/extensions.rb +31 -26
  38. data/lib/kramdown/parser/kramdown/footnote.rb +7 -6
  39. data/lib/kramdown/parser/kramdown/header.rb +6 -6
  40. data/lib/kramdown/parser/kramdown/horizontal_rule.rb +3 -3
  41. data/lib/kramdown/parser/kramdown/html.rb +31 -26
  42. data/lib/kramdown/parser/kramdown/html_entity.rb +6 -5
  43. data/lib/kramdown/parser/kramdown/line_break.rb +3 -3
  44. data/lib/kramdown/parser/kramdown/link.rb +13 -11
  45. data/lib/kramdown/parser/kramdown/list.rb +38 -40
  46. data/lib/kramdown/parser/kramdown/math.rb +4 -5
  47. data/lib/kramdown/parser/kramdown/paragraph.rb +5 -5
  48. data/lib/kramdown/parser/kramdown/smart_quotes.rb +23 -23
  49. data/lib/kramdown/parser/kramdown/table.rb +18 -17
  50. data/lib/kramdown/parser/kramdown/typographic_symbol.rb +8 -8
  51. data/lib/kramdown/parser/markdown.rb +9 -8
  52. data/lib/kramdown/utils.rb +5 -6
  53. data/lib/kramdown/utils/configurable.rb +7 -6
  54. data/lib/kramdown/utils/entities.rb +286 -289
  55. data/lib/kramdown/utils/html.rb +10 -12
  56. data/lib/kramdown/utils/lru_cache.rb +3 -2
  57. data/lib/kramdown/utils/string_scanner.rb +2 -3
  58. data/lib/kramdown/utils/unidecoder.rb +8 -6
  59. data/lib/kramdown/version.rb +3 -3
  60. data/man/man1/kramdown.1 +3 -107
  61. data/test/run_tests.rb +6 -6
  62. data/test/test_files.rb +122 -298
  63. data/test/test_location.rb +8 -30
  64. data/test/test_string_scanner_kramdown.rb +6 -9
  65. data/test/testcases/block/06_codeblock/highlighting-opts.html +6 -6
  66. data/test/testcases/block/06_codeblock/highlighting.html +5 -6
  67. data/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options +1 -1
  68. data/test/testcases/block/07_horizontal_rule/error.html +2 -2
  69. data/test/testcases/block/09_html/html5_attributes.html +2 -0
  70. data/test/testcases/block/09_html/html5_attributes.text +2 -0
  71. data/test/testcases/block/09_html/html_to_native/typography.html +1 -1
  72. data/test/testcases/block/09_html/simple.html +1 -1
  73. data/test/testcases/block/12_extension/options3.html +7 -6
  74. data/test/testcases/block/12_extension/options3.text +2 -2
  75. data/test/testcases/span/01_link/inline.html +1 -1
  76. data/test/testcases/span/01_link/reference.html +3 -3
  77. data/test/testcases/span/03_codespan/highlighting.html +1 -1
  78. data/test/testcases/span/text_substitutions/entities_as_char.html +1 -1
  79. metadata +5 -234
  80. data/Rakefile +0 -341
  81. data/benchmark/benchmark.rb +0 -43
  82. data/benchmark/benchmark.sh +0 -74
  83. data/benchmark/generate_data.rb +0 -119
  84. data/benchmark/mdbasics.text +0 -306
  85. data/benchmark/mdsyntax.text +0 -888
  86. data/benchmark/testing.sh +0 -12
  87. data/benchmark/timing.sh +0 -10
  88. data/doc/_design.scss +0 -441
  89. data/doc/bg.png +0 -0
  90. data/doc/default.scss +0 -217
  91. data/doc/default.template +0 -62
  92. data/doc/documentation.page +0 -84
  93. data/doc/documentation.template +0 -36
  94. data/doc/index.page +0 -113
  95. data/doc/installation.page +0 -88
  96. data/doc/links.markdown +0 -6
  97. data/doc/metainfo +0 -13
  98. data/doc/news.feed +0 -9
  99. data/doc/news.page +0 -29
  100. data/doc/options.page +0 -49
  101. data/doc/quickref.page +0 -603
  102. data/doc/sidebar.template +0 -22
  103. data/doc/sitemap.sitemap +0 -5
  104. data/doc/syntax.page +0 -1799
  105. data/doc/tests.page +0 -104
  106. data/doc/virtual +0 -14
  107. data/lib/kramdown/converter/math_engine/itex2mml.rb +0 -39
  108. data/lib/kramdown/converter/math_engine/katex.rb +0 -35
  109. data/lib/kramdown/converter/math_engine/mathjaxnode.rb +0 -56
  110. data/lib/kramdown/converter/math_engine/ritex.rb +0 -38
  111. data/lib/kramdown/converter/math_engine/sskatex.rb +0 -97
  112. data/lib/kramdown/converter/pdf.rb +0 -625
  113. data/lib/kramdown/converter/syntax_highlighter/coderay.rb +0 -81
  114. data/lib/kramdown/parser/gfm.rb +0 -188
  115. data/lib/kramdown/utils/ordered_hash.rb +0 -18
  116. data/setup.rb +0 -1585
  117. data/test/testcases/block/07_horizontal_rule/error.html.19 +0 -7
  118. data/test/testcases/block/09_html/html_to_native/typography.html.19 +0 -1
  119. data/test/testcases/block/09_html/simple.html.19 +0 -60
  120. data/test/testcases/block/15_math/itex2mml.html +0 -1
  121. data/test/testcases/block/15_math/itex2mml.options +0 -1
  122. data/test/testcases/block/15_math/itex2mml.text +0 -1
  123. data/test/testcases/block/15_math/katex.html.19 +0 -2
  124. data/test/testcases/block/15_math/katex.options +0 -1
  125. data/test/testcases/block/15_math/katex.text +0 -2
  126. data/test/testcases/block/15_math/mathjaxnode.html.19 +0 -27
  127. data/test/testcases/block/15_math/mathjaxnode.options +0 -1
  128. data/test/testcases/block/15_math/mathjaxnode.text +0 -1
  129. data/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 +0 -23
  130. data/test/testcases/block/15_math/mathjaxnode_notexhints.options +0 -3
  131. data/test/testcases/block/15_math/mathjaxnode_notexhints.text +0 -1
  132. data/test/testcases/block/15_math/mathjaxnode_semantics.html.19 +0 -32
  133. data/test/testcases/block/15_math/mathjaxnode_semantics.options +0 -3
  134. data/test/testcases/block/15_math/mathjaxnode_semantics.text +0 -1
  135. data/test/testcases/block/15_math/ritex.html +0 -1
  136. data/test/testcases/block/15_math/ritex.options +0 -1
  137. data/test/testcases/block/15_math/ritex.text +0 -1
  138. data/test/testcases/block/15_math/sskatex.html.19 +0 -2
  139. data/test/testcases/block/15_math/sskatex.options +0 -1
  140. data/test/testcases/block/15_math/sskatex.text +0 -2
  141. data/test/testcases/span/01_link/inline.html.19 +0 -46
  142. data/test/testcases/span/01_link/reference.html.19 +0 -37
  143. data/test/testcases/span/math/itex2mml.html +0 -1
  144. data/test/testcases/span/math/itex2mml.options +0 -1
  145. data/test/testcases/span/math/itex2mml.text +0 -1
  146. data/test/testcases/span/math/katex.html.19 +0 -1
  147. data/test/testcases/span/math/katex.options +0 -1
  148. data/test/testcases/span/math/katex.text +0 -1
  149. data/test/testcases/span/math/mathjaxnode.html.19 +0 -27
  150. data/test/testcases/span/math/mathjaxnode.options +0 -1
  151. data/test/testcases/span/math/mathjaxnode.text +0 -1
  152. data/test/testcases/span/math/ritex.html +0 -1
  153. data/test/testcases/span/math/ritex.options +0 -1
  154. data/test/testcases/span/math/ritex.text +0 -1
  155. data/test/testcases/span/math/sskatex.html.19 +0 -1
  156. data/test/testcases/span/math/sskatex.options +0 -1
  157. data/test/testcases/span/math/sskatex.text +0 -1
  158. data/test/testcases/span/text_substitutions/entities_as_char.html.19 +0 -1
  159. data/test/testcases_gfm/atx_header.html +0 -3
  160. data/test/testcases_gfm/atx_header.text +0 -3
  161. data/test/testcases_gfm/backticks_disable_highlighting.html +0 -2
  162. data/test/testcases_gfm/backticks_disable_highlighting.options +0 -1
  163. data/test/testcases_gfm/backticks_disable_highlighting.text +0 -3
  164. data/test/testcases_gfm/backticks_syntax.html +0 -20
  165. data/test/testcases_gfm/backticks_syntax.text +0 -19
  166. data/test/testcases_gfm/codeblock_fenced.html +0 -20
  167. data/test/testcases_gfm/codeblock_fenced.options +0 -1
  168. data/test/testcases_gfm/codeblock_fenced.text +0 -21
  169. data/test/testcases_gfm/hard_line_breaks.html +0 -3
  170. data/test/testcases_gfm/hard_line_breaks.text +0 -3
  171. data/test/testcases_gfm/hard_line_breaks_off.html +0 -2
  172. data/test/testcases_gfm/hard_line_breaks_off.options +0 -1
  173. data/test/testcases_gfm/hard_line_breaks_off.text +0 -2
  174. data/test/testcases_gfm/header_ids.html +0 -27
  175. data/test/testcases_gfm/header_ids.html.19 +0 -27
  176. data/test/testcases_gfm/header_ids.options +0 -1
  177. data/test/testcases_gfm/header_ids.text +0 -27
  178. data/test/testcases_gfm/header_ids_with_prefix.html +0 -3
  179. data/test/testcases_gfm/header_ids_with_prefix.options +0 -2
  180. data/test/testcases_gfm/header_ids_with_prefix.text +0 -3
  181. data/test/testcases_gfm/no_typographic.html +0 -3
  182. data/test/testcases_gfm/no_typographic.html.19 +0 -3
  183. data/test/testcases_gfm/no_typographic.options +0 -1
  184. data/test/testcases_gfm/no_typographic.text +0 -3
  185. data/test/testcases_gfm/paragraph_end-disabled.html +0 -31
  186. data/test/testcases_gfm/paragraph_end-disabled.options +0 -1
  187. data/test/testcases_gfm/paragraph_end-disabled.text +0 -27
  188. data/test/testcases_gfm/paragraph_end.html +0 -38
  189. data/test/testcases_gfm/paragraph_end.text +0 -27
  190. data/test/testcases_gfm/strikethrough.html +0 -27
  191. data/test/testcases_gfm/strikethrough.html.19 +0 -27
  192. data/test/testcases_gfm/strikethrough.text +0 -27
  193. data/test/testcases_gfm/task_list.html +0 -40
  194. data/test/testcases_gfm/task_list.text +0 -26
  195. data/test/testcases_gfm/two_para_hard_line_breaks.html +0 -4
  196. 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-2016 Thomas Leitner <t_leitner@gmx.at>
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
  #++
@@ -20,7 +20,6 @@ module Kramdown
20
20
  autoload :Kramdown, 'kramdown/parser/kramdown'
21
21
  autoload :Html, 'kramdown/parser/html'
22
22
  autoload :Markdown, 'kramdown/parser/markdown'
23
- autoload :GFM, 'kramdown/parser/gfm'
24
23
 
25
24
  end
26
25
 
@@ -1,7 +1,7 @@
1
- # -*- coding: utf-8 -*-
1
+ # -*- coding: utf-8; frozen_string_literal: true -*-
2
2
  #
3
3
  #--
4
- # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
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
  #++
@@ -52,8 +52,8 @@ module Kramdown
52
52
  def initialize(source, options)
53
53
  @source = source
54
54
  @options = Kramdown::Options.merge(options)
55
- @root = Element.new(:root, nil, nil, :encoding => (source.encoding rescue nil), :location => 1,
56
- :options => {}, :abbrev_defs => {}, :abbrev_attr => {})
55
+ @root = Element.new(:root, nil, nil, encoding: (source.encoding rescue nil), location: 1,
56
+ options: {}, abbrev_defs: {}, abbrev_attr: {})
57
57
  @warnings = []
58
58
  @text_type = :text
59
59
  end
@@ -83,7 +83,7 @@ module Kramdown
83
83
  # Add the given warning +text+ to the warning array.
84
84
  def warning(text)
85
85
  @warnings << text
86
- #TODO: add position information
86
+ # TODO: add position information
87
87
  end
88
88
 
89
89
  # Modify the string +source+ to be usable by the parser (unifies line ending characters to
@@ -103,7 +103,8 @@ module Kramdown
103
103
  if last && last.type == type
104
104
  last.value << text
105
105
  elsif !text.empty?
106
- tree.children << Element.new(type, text, nil, :location => (last && last.options[:location] || tree.options[:location]))
106
+ location = (last && last.options[:location] || tree.options[:location])
107
+ tree.children << Element.new(type, text, nil, location: location)
107
108
  end
108
109
  end
109
110
 
@@ -1,7 +1,7 @@
1
- # -*- coding: utf-8 -*-
1
+ # -*- coding: utf-8; frozen_string_literal: true -*-
2
2
  #
3
3
  #--
4
- # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
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
  #++
@@ -29,36 +29,39 @@ module Kramdown
29
29
  HTML_DOCTYPE_RE = /<!DOCTYPE.*?>/im
30
30
  HTML_COMMENT_RE = /<!--(.*?)-->/m
31
31
  HTML_INSTRUCTION_RE = /<\?(.*?)\?>/m
32
- HTML_ATTRIBUTE_RE = /\s*(#{REXML::Parsers::BaseParser::UNAME_STR})(?:\s*=\s*(["'])(.*?)\2)?/m
33
- HTML_TAG_RE = /<((?>#{REXML::Parsers::BaseParser::UNAME_STR}))\s*((?>\s+#{REXML::Parsers::BaseParser::UNAME_STR}(?:\s*=\s*(["']).*?\3)?)*)\s*(\/)?>/m
32
+ HTML_ATTRIBUTE_RE = /\s*(#{REXML::Parsers::BaseParser::UNAME_STR})(?:\s*=\s*(?:(\p{Word}+)|("|')(.*?)\3))?/m
33
+ HTML_TAG_RE = /<((?>#{REXML::Parsers::BaseParser::UNAME_STR}))\s*((?>\s+#{REXML::Parsers::BaseParser::UNAME_STR}(?:\s*=\s*(?:\p{Word}+|("|').*?\3))?)*)\s*(\/)?>/m
34
34
  HTML_TAG_CLOSE_RE = /<\/(#{REXML::Parsers::BaseParser::UNAME_STR})\s*>/m
35
35
  HTML_ENTITY_RE = /&([\w:][\-\w\.:]*);|&#(\d+);|&\#x([0-9a-fA-F]+);/
36
36
 
37
- HTML_CONTENT_MODEL_BLOCK = %w{address applet article aside blockquote body
38
- dd details div dl fieldset figure figcaption footer form header hgroup iframe li main
39
- map menu nav noscript object section summary td}
40
- HTML_CONTENT_MODEL_SPAN = %w{a abbr acronym b bdo big button cite caption del dfn dt em
41
- h1 h2 h3 h4 h5 h6 i ins label legend optgroup p q rb rbc
42
- rp rt rtc ruby select small span strong sub sup th tt}
43
- HTML_CONTENT_MODEL_RAW = %w{script style math option textarea pre code kbd samp var}
37
+ HTML_CONTENT_MODEL_BLOCK = %w[address applet article aside blockquote body
38
+ dd details div dl fieldset figure figcaption
39
+ footer form header hgroup iframe li main
40
+ map menu nav noscript object section summary td]
41
+ HTML_CONTENT_MODEL_SPAN = %w[a abbr acronym b bdo big button cite caption del dfn dt em
42
+ h1 h2 h3 h4 h5 h6 i ins label legend optgroup p q rb rbc
43
+ rp rt rtc ruby select small span strong sub sup th tt]
44
+ HTML_CONTENT_MODEL_RAW = %w[script style math option textarea pre code kbd samp var]
44
45
  # The following elements are also parsed as raw since they need child elements that cannot
45
46
  # be expressed using kramdown syntax: colgroup table tbody thead tfoot tr ul ol
46
47
 
47
- HTML_CONTENT_MODEL = Hash.new {|h,k| h[k] = :raw}
48
- HTML_CONTENT_MODEL_BLOCK.each {|i| HTML_CONTENT_MODEL[i] = :block}
49
- HTML_CONTENT_MODEL_SPAN.each {|i| HTML_CONTENT_MODEL[i] = :span}
50
- HTML_CONTENT_MODEL_RAW.each {|i| HTML_CONTENT_MODEL[i] = :raw}
48
+ HTML_CONTENT_MODEL = Hash.new {|h, k| h[k] = :raw }
49
+ HTML_CONTENT_MODEL_BLOCK.each {|i| HTML_CONTENT_MODEL[i] = :block }
50
+ HTML_CONTENT_MODEL_SPAN.each {|i| HTML_CONTENT_MODEL[i] = :span }
51
+ HTML_CONTENT_MODEL_RAW.each {|i| HTML_CONTENT_MODEL[i] = :raw }
51
52
 
52
53
  # Some HTML elements like script belong to both categories (i.e. are valid in block and
53
54
  # span HTML) and don't appear therefore!
54
55
  # script, textarea
55
- HTML_SPAN_ELEMENTS = %w{a abbr acronym b big bdo br button cite code del dfn em i img input
56
- ins kbd label mark option q rb rbc rp rt rtc ruby samp select small span
57
- strong sub sup tt u var}
58
- HTML_BLOCK_ELEMENTS = %w{address article aside applet body blockquote caption col colgroup dd div dl dt fieldset
59
- figcaption footer form h1 h2 h3 h4 h5 h6 header hgroup hr html head iframe legend menu
60
- li main map nav ol optgroup p pre section summary table tbody td th thead tfoot tr ul}
61
- HTML_ELEMENTS_WITHOUT_BODY = %w{area base br col command embed hr img input keygen link meta param source track wbr}
56
+ HTML_SPAN_ELEMENTS = %w[a abbr acronym b big bdo br button cite code del dfn em i img input
57
+ ins kbd label mark option q rb rbc rp rt rtc ruby samp select small
58
+ span strong sub sup tt u var]
59
+ HTML_BLOCK_ELEMENTS = %w[address article aside applet body blockquote caption col colgroup
60
+ dd div dl dt fieldset figcaption footer form h1 h2 h3 h4 h5 h6
61
+ header hgroup hr html head iframe legend menu li main map nav ol
62
+ optgroup p pre section summary table tbody td th thead tfoot tr ul]
63
+ HTML_ELEMENTS_WITHOUT_BODY = %w[area base br col command embed hr img input keygen link
64
+ meta param source track wbr]
62
65
 
63
66
  HTML_ELEMENT = Hash.new(false)
64
67
  (HTML_SPAN_ELEMENTS + HTML_BLOCK_ELEMENTS + HTML_ELEMENTS_WITHOUT_BODY +
@@ -67,7 +70,6 @@ module Kramdown
67
70
  end
68
71
  end
69
72
 
70
-
71
73
  # Contains the parsing methods. This module can be mixed into any parser to get HTML parsing
72
74
  # functionality. The only thing that must be provided by the class are instance variable
73
75
  # @stack for storing the needed state and @src (instance of StringScanner) for the actual
@@ -88,7 +90,7 @@ module Kramdown
88
90
  closed = !@src[4].nil?
89
91
  attrs = parse_html_attributes(@src[2], line, HTML_ELEMENT[name])
90
92
 
91
- el = Element.new(:html_element, name, attrs, :category => :block)
93
+ el = Element.new(:html_element, name, attrs, category: :block)
92
94
  el.options[:location] = line if line
93
95
  @tree.children << el
94
96
 
@@ -110,13 +112,13 @@ module Kramdown
110
112
  # If the optional +in_html_tag+ parameter is set to +false+, attributes are not modified to
111
113
  # contain only lowercase letters.
112
114
  def parse_html_attributes(str, line = nil, in_html_tag = true)
113
- attrs = Utils::OrderedHash.new
114
- str.scan(HTML_ATTRIBUTE_RE).each do |attr, sep, val|
115
+ attrs = {}
116
+ str.scan(HTML_ATTRIBUTE_RE).each do |attr, val, _sep, quoted_val|
115
117
  attr.downcase! if in_html_tag
116
- if attrs.has_key?(attr)
118
+ if attrs.key?(attr)
117
119
  warning("Duplicate HTML attribute '#{attr}' on line #{line || '?'} - overwriting previous one")
118
120
  end
119
- attrs[attr] = val || ""
121
+ attrs[attr] = val || quoted_val || ""
120
122
  end
121
123
  attrs
122
124
  end
@@ -151,13 +153,13 @@ module Kramdown
151
153
 
152
154
  done = false
153
155
  while !@src.eos? && !done
154
- if result = @src.scan_until(HTML_RAW_START)
156
+ if (result = @src.scan_until(HTML_RAW_START))
155
157
  add_text(result, @tree, :text)
156
158
  line = @src.current_line_number
157
- if result = @src.scan(HTML_COMMENT_RE)
158
- @tree.children << Element.new(:xml_comment, result, nil, :category => :block, :location => line)
159
- elsif result = @src.scan(HTML_INSTRUCTION_RE)
160
- @tree.children << Element.new(:xml_pi, result, nil, :category => :block, :location => line)
159
+ if (result = @src.scan(HTML_COMMENT_RE))
160
+ @tree.children << Element.new(:xml_comment, result, nil, category: :block, location: line)
161
+ elsif (result = @src.scan(HTML_INSTRUCTION_RE))
162
+ @tree.children << Element.new(:xml_pi, result, nil, category: :block, location: line)
161
163
  elsif @src.scan(HTML_TAG_RE)
162
164
  if method(:handle_html_start_tag).arity.abs >= 1
163
165
  handle_html_start_tag(line, &block)
@@ -169,7 +171,8 @@ module Kramdown
169
171
  done = true
170
172
  else
171
173
  add_text(@src.matched, @tree, :text)
172
- warning("Found invalidly used HTML closing tag for '#{@src[1]}' on line #{line} - ignoring it")
174
+ warning("Found invalidly used HTML closing tag for '#{@src[1]}' on " \
175
+ "line #{line} - ignoring it")
173
176
  end
174
177
  else
175
178
  add_text(@src.getch, @tree, :text)
@@ -177,7 +180,10 @@ module Kramdown
177
180
  else
178
181
  add_text(@src.rest, @tree, :text)
179
182
  @src.terminate
180
- warning("Found no end tag for '#{@tree.value}' on line #{@tree.options[:location]} - auto-closing it") if @tree.type == :html_element
183
+ if @tree.type == :html_element
184
+ warning("Found no end tag for '#{@tree.value}' on line " \
185
+ "#{@tree.options[:location]} - auto-closing it")
186
+ end
181
187
  done = true
182
188
  end
183
189
  end
@@ -187,7 +193,6 @@ module Kramdown
187
193
 
188
194
  end
189
195
 
190
-
191
196
  # Converts HTML elements to native elements if possible.
192
197
  class ElementConverter
193
198
 
@@ -196,14 +201,17 @@ module Kramdown
196
201
  include Constants
197
202
  include ::Kramdown::Utils::Entities
198
203
 
199
- REMOVE_TEXT_CHILDREN = %w{html head hgroup ol ul dl table colgroup tbody thead tfoot tr select optgroup}
200
- WRAP_TEXT_CHILDREN = %w{body section nav article aside header footer address div li dd blockquote figure
201
- figcaption fieldset form}
202
- REMOVE_WHITESPACE_CHILDREN = %w{body section nav article aside header footer address
203
- div li dd blockquote figure figcaption td th fieldset form}
204
- STRIP_WHITESPACE = %w{address article aside blockquote body caption dd div dl dt fieldset figcaption form footer
205
- header h1 h2 h3 h4 h5 h6 legend li nav p section td th}
206
- SIMPLE_ELEMENTS = %w{em strong blockquote hr br img p thead tbody tfoot tr td th ul ol dl li dl dt dd}
204
+ REMOVE_TEXT_CHILDREN = %w[html head hgroup ol ul dl table colgroup tbody thead tfoot tr
205
+ select optgroup]
206
+ WRAP_TEXT_CHILDREN = %w[body section nav article aside header footer address div li dd
207
+ blockquote figure figcaption fieldset form]
208
+ REMOVE_WHITESPACE_CHILDREN = %w[body section nav article aside header footer address
209
+ div li dd blockquote figure figcaption td th fieldset form]
210
+ STRIP_WHITESPACE = %w[address article aside blockquote body caption dd div dl dt fieldset
211
+ figcaption form footer header h1 h2 h3 h4 h5 h6 legend li nav p
212
+ section td th]
213
+ SIMPLE_ELEMENTS = %w[em strong blockquote hr br img p thead tbody tfoot tr td th ul ol dl
214
+ li dl dt dd]
207
215
 
208
216
  def initialize(root)
209
217
  @root = root
@@ -228,11 +236,11 @@ module Kramdown
228
236
  else parent.type.to_s
229
237
  end
230
238
  end
231
- el.options.replace({:category => (HTML_CONTENT_MODEL[ptype] == :span ? :span : :block)})
239
+ el.options.replace(category: (HTML_CONTENT_MODEL[ptype] == :span ? :span : :block))
232
240
  return
233
241
  when :html_element
234
242
  when :root
235
- el.children.each {|c| process(c)}
243
+ el.children.each {|c| process(c) }
236
244
  remove_whitespace_children(el)
237
245
  return
238
246
  else return
@@ -277,18 +285,18 @@ module Kramdown
277
285
  raw.gsub!(/\s+/, ' ') unless preserve
278
286
  src = Kramdown::Utils::StringScanner.new(raw)
279
287
  result = []
280
- while !src.eos?
281
- if tmp = src.scan_until(/(?=#{HTML_ENTITY_RE})/)
288
+ until src.eos?
289
+ if (tmp = src.scan_until(/(?=#{HTML_ENTITY_RE})/))
282
290
  result << Element.new(:text, tmp)
283
291
  src.scan(HTML_ENTITY_RE)
284
- val = src[1] || (src[2] && src[2].to_i) || src[3].hex
285
- result << if %w{lsquo rsquo ldquo rdquo}.include?(val)
292
+ val = src[1] || (src[2]&.to_i) || src[3].hex
293
+ result << if %w[lsquo rsquo ldquo rdquo].include?(val)
286
294
  Element.new(:smart_quote, val.intern)
287
- elsif %w{mdash ndash hellip laquo raquo}.include?(val)
295
+ elsif %w[mdash ndash hellip laquo raquo].include?(val)
288
296
  Element.new(:typographic_sym, val.intern)
289
297
  else
290
298
  begin
291
- Element.new(:entity, entity(val), nil, :original => src.matched)
299
+ Element.new(:entity, entity(val), nil, original: src.matched)
292
300
  rescue ::Kramdown::Error
293
301
  src.pos -= src.matched_size - 1
294
302
  Element.new(:entity, ::Kramdown::Utils::Entities.entity('amp'))
@@ -303,13 +311,13 @@ module Kramdown
303
311
  end
304
312
 
305
313
  def process_html_element(el, do_conversion = true, preserve_text = false)
306
- el.options.replace(:category => HTML_SPAN_ELEMENTS.include?(el.value) ? :span : :block,
307
- :content_model => (do_conversion ? HTML_CONTENT_MODEL[el.value] : :raw))
314
+ el.options.replace(category: HTML_SPAN_ELEMENTS.include?(el.value) ? :span : :block,
315
+ content_model: (do_conversion ? HTML_CONTENT_MODEL[el.value] : :raw))
308
316
  process_children(el, do_conversion, preserve_text)
309
317
  end
310
318
 
311
319
  def remove_text_children(el)
312
- el.children.delete_if {|c| c.type == :text}
320
+ el.children.delete_if {|c| c.type == :text }
313
321
  end
314
322
 
315
323
  def wrap_text_children(el)
@@ -317,8 +325,8 @@ module Kramdown
317
325
  last_is_p = false
318
326
  el.children.each do |c|
319
327
  if Element.category(c) != :block || c.type == :text
320
- if !last_is_p
321
- tmp << Element.new(:p, nil, nil, :transparent => true)
328
+ unless last_is_p
329
+ tmp << Element.new(:p, nil, nil, transparent: true)
322
330
  last_is_p = true
323
331
  end
324
332
  tmp.last.children << c
@@ -346,8 +354,8 @@ module Kramdown
346
354
  el.children = el.children.reject do |c|
347
355
  i += 1
348
356
  c.type == :text && c.value.strip.empty? &&
349
- (i == 0 || i == el.children.length - 1 || (Element.category(el.children[i-1]) == :block &&
350
- Element.category(el.children[i+1]) == :block))
357
+ (i == 0 || i == el.children.length - 1 || (Element.category(el.children[i - 1]) == :block &&
358
+ Element.category(el.children[i + 1]) == :block))
351
359
  end
352
360
  end
353
361
 
@@ -359,7 +367,7 @@ module Kramdown
359
367
 
360
368
  def extract_text(el, raw)
361
369
  raw << el.value.to_s if el.type == :text
362
- el.children.each {|c| extract_text(c, raw)}
370
+ el.children.each {|c| extract_text(c, raw) }
363
371
  end
364
372
 
365
373
  def convert_textarea(el)
@@ -377,7 +385,7 @@ module Kramdown
377
385
 
378
386
  EMPHASIS_TYPE_MAP = {'em' => :em, 'i' => :em, 'strong' => :strong, 'b' => :strong}
379
387
  def convert_em(el)
380
- text = ''
388
+ text = +''
381
389
  extract_text(el, text)
382
390
  if text =~ /\A\s/ || text =~ /\s\z/
383
391
  process_html_element(el, false)
@@ -386,33 +394,33 @@ module Kramdown
386
394
  process_children(el)
387
395
  end
388
396
  end
389
- %w{b strong i}.each do |i|
397
+ %w[b strong i].each do |i|
390
398
  alias_method("convert_#{i}".to_sym, :convert_em)
391
399
  end
392
400
 
393
401
  def convert_h1(el)
394
- set_basics(el, :header, :level => el.value[1..1].to_i)
395
- extract_text(el, el.options[:raw_text] = '')
402
+ set_basics(el, :header, level: el.value[1..1].to_i)
403
+ extract_text(el, el.options[:raw_text] = +'')
396
404
  process_children(el)
397
405
  end
398
- %w{h2 h3 h4 h5 h6}.each do |i|
406
+ %w[h2 h3 h4 h5 h6].each do |i|
399
407
  alias_method("convert_#{i}".to_sym, :convert_h1)
400
408
  end
401
409
 
402
410
  def convert_code(el)
403
- raw = ''
411
+ raw = +''
404
412
  extract_text(el, raw)
405
413
  result = process_text(raw, true)
406
414
  begin
407
- str = result.inject('') do |mem, c|
415
+ str = result.inject(+'') do |mem, c|
408
416
  if c.type == :text
409
417
  mem << c.value
410
418
  elsif c.type == :entity
411
- if [60, 62, 34, 38].include?(c.value.code_point)
412
- mem << c.value.code_point.chr
413
- else
414
- mem << c.value.char
415
- end
419
+ mem << if [60, 62, 34, 38].include?(c.value.code_point)
420
+ c.value.code_point.chr
421
+ else
422
+ c.value.char
423
+ end
416
424
  elsif c.type == :smart_quote || c.type == :typographic_sym
417
425
  mem << entity(c.value.to_s).char
418
426
  else
@@ -421,14 +429,14 @@ module Kramdown
421
429
  end
422
430
  result.clear
423
431
  result << Element.new(:text, str)
424
- rescue
432
+ rescue StandardError
425
433
  end
426
434
  if result.length > 1 || result.first.type != :text
427
435
  process_html_element(el, false, true)
428
436
  else
429
437
  if el.value == 'code'
430
438
  set_basics(el, :codespan)
431
- el.attr['class'].gsub!(/\s+\bhighlighter-\w+\b|\bhighlighter-\w+\b\s*/, '') if el.attr['class']
439
+ el.attr['class']&.gsub!(/\s+\bhighlighter-\w+\b|\bhighlighter-\w+\b\s*/, '')
432
440
  else
433
441
  set_basics(el, :codeblock)
434
442
  if el.children.size == 1 && el.children.first.value == 'code'
@@ -440,10 +448,10 @@ module Kramdown
440
448
  el.children.clear
441
449
  end
442
450
  end
443
- alias :convert_pre :convert_code
451
+ alias convert_pre convert_code
444
452
 
445
453
  def convert_table(el)
446
- if !is_simple_table?(el)
454
+ unless is_simple_table?(el)
447
455
  process_html_element(el, false)
448
456
  return
449
457
  end
@@ -463,17 +471,17 @@ module Kramdown
463
471
  end
464
472
  end
465
473
  else
466
- c.children.each {|cc| calc_alignment.call(cc)}
474
+ c.children.each {|cc| calc_alignment.call(cc) }
467
475
  end
468
476
  end
469
477
  calc_alignment.call(el)
470
- el.children.delete_if {|c| c.type == :html_element}
478
+ el.children.delete_if {|c| c.type == :html_element }
471
479
 
472
480
  change_th_type = lambda do |c|
473
481
  if c.type == :th
474
482
  c.type = :td
475
483
  else
476
- c.children.each {|cc| change_th_type.call(cc)}
484
+ c.children.each {|cc| change_th_type.call(cc) }
477
485
  end
478
486
  end
479
487
  change_th_type.call(el)
@@ -491,11 +499,11 @@ module Kramdown
491
499
  (cc.type == :text || !HTML_BLOCK_ELEMENTS.include?(cc.value)) && only_phrasing_content.call(cc)
492
500
  end
493
501
  end
494
- check_cells = Proc.new do |c|
502
+ check_cells = proc do |c|
495
503
  if c.value == 'th' || c.value == 'td'
496
- return false if !only_phrasing_content.call(c)
504
+ return false unless only_phrasing_content.call(c)
497
505
  else
498
- c.children.each {|cc| check_cells.call(cc)}
506
+ c.children.each {|cc| check_cells.call(cc) }
499
507
  end
500
508
  end
501
509
  check_cells.call(el)
@@ -503,7 +511,7 @@ module Kramdown
503
511
  nr_cells = 0
504
512
  check_nr_cells = lambda do |t|
505
513
  if t.value == 'tr'
506
- count = t.children.select {|cc| cc.value == 'th' || cc.value == 'td'}.length
514
+ count = t.children.select {|cc| cc.value == 'th' || cc.value == 'td' }.length
507
515
  if count != nr_cells
508
516
  if nr_cells == 0
509
517
  nr_cells = count
@@ -513,16 +521,16 @@ module Kramdown
513
521
  end
514
522
  end
515
523
  else
516
- t.children.each {|cc| check_nr_cells.call(cc)}
524
+ t.children.each {|cc| check_nr_cells.call(cc) }
517
525
  end
518
526
  end
519
527
  check_nr_cells.call(el)
520
528
  return false if nr_cells == -1
521
529
 
522
530
  alignment = nil
523
- check_alignment = Proc.new do |t|
531
+ check_alignment = proc do |t|
524
532
  if t.value == 'tr'
525
- cur_alignment = t.children.select {|cc| cc.value == 'th' || cc.value == 'td'}.map do |cell|
533
+ cur_alignment = t.children.select {|cc| cc.value == 'th' || cc.value == 'td' }.map do |cell|
526
534
  md = /text-align:\s+(center|left|right|justify|inherit)/.match(cell.attr['style'].to_s)
527
535
  return false if md && (md[1] == 'justify' || md[1] == 'inherit')
528
536
  md.nil? ? :default : md[1]
@@ -530,19 +538,19 @@ module Kramdown
530
538
  alignment = cur_alignment if alignment.nil?
531
539
  return false if alignment != cur_alignment
532
540
  else
533
- t.children.each {|cc| check_alignment.call(cc)}
541
+ t.children.each {|cc| check_alignment.call(cc) }
534
542
  end
535
543
  end
536
544
  check_alignment.call(el)
537
545
 
538
546
  check_rows = lambda do |t, type|
539
- t.children.all? {|r| (r.value == 'tr' || r.type == :text) && r.children.all? {|c| c.value == type || c.type == :text}}
547
+ t.children.all? {|r| (r.value == 'tr' || r.type == :text) && r.children.all? {|c| c.value == type || c.type == :text }}
540
548
  end
541
549
  check_rows.call(el, 'td') ||
542
550
  (el.children.all? do |t|
543
551
  t.type == :text || (t.value == 'thead' && check_rows.call(t, 'th')) ||
544
552
  ((t.value == 'tfoot' || t.value == 'tbody') && check_rows.call(t, 'td'))
545
- end && el.children.any? {|t| t.value == 'tbody'})
553
+ end && el.children.any? {|t| t.value == 'tbody' })
546
554
  end
547
555
 
548
556
  def convert_script(el)
@@ -558,7 +566,7 @@ module Kramdown
558
566
  end
559
567
 
560
568
  def handle_math_tag(el)
561
- set_basics(el, :math, :category => (el.attr['type'] =~ /mode=display/ ? :block : :span))
569
+ set_basics(el, :math, category: (el.attr['type'] =~ /mode=display/ ? :block : :span))
562
570
  el.value = el.children.shift.value.sub(/\A(?:%\s*)?<!\[CDATA\[\n?(.*?)(?:\s%)?\]\]>\z/m, '\1')
563
571
  el.attr.delete('type')
564
572
  end
@@ -573,12 +581,12 @@ module Kramdown
573
581
  @src = Kramdown::Utils::StringScanner.new(adapt_source(source))
574
582
 
575
583
  while true
576
- if result = @src.scan(/\s*#{HTML_INSTRUCTION_RE}/)
577
- @tree.children << Element.new(:xml_pi, result.strip, nil, :category => :block)
578
- elsif result = @src.scan(/\s*#{HTML_DOCTYPE_RE}/)
584
+ if (result = @src.scan(/\s*#{HTML_INSTRUCTION_RE}/))
585
+ @tree.children << Element.new(:xml_pi, result.strip, nil, category: :block)
586
+ elsif (result = @src.scan(/\s*#{HTML_DOCTYPE_RE}/))
579
587
  # ignore the doctype
580
- elsif result = @src.scan(/\s*#{HTML_COMMENT_RE}/)
581
- @tree.children << Element.new(:xml_comment, result.strip, nil, :category => :block)
588
+ elsif (result = @src.scan(/\s*#{HTML_COMMENT_RE}/))
589
+ @tree.children << Element.new(:xml_comment, result.strip, nil, category: :block)
582
590
  else
583
591
  break
584
592
  end