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
  #++
@@ -29,14 +29,16 @@ module Kramdown
29
29
  @stack = []
30
30
  end
31
31
 
32
- def convert(el, opts = {:indent => 0})
32
+ def convert(el, opts = {indent: 0})
33
33
  res = send("convert_#{el.type}", el, opts)
34
+ res = res.dup if res.frozen?
34
35
  if ![:html_element, :li, :dt, :dd, :td].include?(el.type) && (ial = ial_for_element(el))
35
36
  res << ial
36
37
  res << "\n\n" if Element.category(el) == :block
37
38
  elsif [:ul, :dl, :ol, :codeblock].include?(el.type) && opts[:next] &&
38
39
  ([el.type, :codeblock].include?(opts[:next].type) ||
39
- (opts[:next].type == :blank && opts[:nnext] && [el.type, :codeblock].include?(opts[:nnext].type)))
40
+ (opts[:next].type == :blank && opts[:nnext] &&
41
+ [el.type, :codeblock].include?(opts[:nnext].type)))
40
42
  res << "^\n\n"
41
43
  elsif Element.category(el) == :block &&
42
44
  ![:li, :dd, :dt, :td, :th, :tr, :thead, :tbody, :tfoot, :blank].include?(el.type) &&
@@ -47,23 +49,23 @@ module Kramdown
47
49
  res
48
50
  end
49
51
 
50
- def inner(el, opts = {:indent => 0})
52
+ def inner(el, opts = {indent: 0})
51
53
  @stack.push(el)
52
- result = ''
54
+ result = +''
53
55
  el.children.each_with_index do |inner_el, index|
54
56
  options = opts.dup
55
57
  options[:index] = index
56
- options[:prev] = (index == 0 ? nil : el.children[index-1])
57
- options[:pprev] = (index <= 1 ? nil : el.children[index-2])
58
- options[:next] = (index == el.children.length - 1 ? nil : el.children[index+1])
59
- options[:nnext] = (index >= el.children.length - 2 ? nil : el.children[index+2])
58
+ options[:prev] = (index == 0 ? nil : el.children[index - 1])
59
+ options[:pprev] = (index <= 1 ? nil : el.children[index - 2])
60
+ options[:next] = (index == el.children.length - 1 ? nil : el.children[index + 1])
61
+ options[:nnext] = (index >= el.children.length - 2 ? nil : el.children[index + 2])
60
62
  result << convert(inner_el, options)
61
63
  end
62
64
  @stack.pop
63
65
  result
64
66
  end
65
67
 
66
- def convert_blank(el, opts)
68
+ def convert_blank(_el, _opts)
67
69
  ""
68
70
  end
69
71
 
@@ -82,8 +84,8 @@ module Kramdown
82
84
  def convert_p(el, opts)
83
85
  w = @options[:line_width] - opts[:indent].to_s.to_i
84
86
  first, second, *rest = inner(el, opts).strip.gsub(/(.{1,#{w}})( +|$\n?)/, "\\1\n").split(/\n/)
85
- first.gsub!(/^(?:(#|>)|(\d+)\.|([+-]\s))/) { $1 || $3 ? "\\#{$1 || $3}" : "#{$2}\\."} if first
86
- second.gsub!(/^([=-]+\s*?)$/, "\\\1") if second
87
+ first&.gsub!(/^(?:(#|>)|(\d+)\.|([+-]\s))/) { $1 || $3 ? "\\#{$1 || $3}" : "#{$2}\\." }
88
+ second&.gsub!(/^([=-]+\s*?)$/, "\\\1")
87
89
  res = [first, second, *rest].compact.join("\n") + "\n"
88
90
  if el.children.length == 1 && el.children.first.type == :math
89
91
  res = "\\#{res}"
@@ -93,41 +95,40 @@ module Kramdown
93
95
  res
94
96
  end
95
97
 
96
-
97
- def convert_codeblock(el, opts)
98
- el.value.split(/\n/).map {|l| l.empty? ? " " : " #{l}"}.join("\n") + "\n"
98
+ def convert_codeblock(el, _opts)
99
+ el.value.split(/\n/).map {|l| l.empty? ? " " : " #{l}" }.join("\n") + "\n"
99
100
  end
100
101
 
101
102
  def convert_blockquote(el, opts)
102
103
  opts[:indent] += 2
103
- inner(el, opts).chomp.split(/\n/).map {|l| "> #{l}"}.join("\n") << "\n"
104
+ inner(el, opts).chomp.split(/\n/).map {|l| "> #{l}" }.join("\n") << "\n"
104
105
  end
105
106
 
106
107
  def convert_header(el, opts)
107
- res = ''
108
+ res = +''
108
109
  res << "#{'#' * output_header_level(el.options[:level])} #{inner(el, opts)}"
109
- res[-1, 1] = "\\#" if res[-1] == ?#
110
+ res[-1, 1] = "\\#" if res[-1] == '#'
110
111
  res << " {##{el.attr['id']}}" if el.attr['id'] && !el.attr['id'].strip.empty?
111
112
  res << "\n"
112
113
  end
113
114
 
114
- def convert_hr(el, opts)
115
+ def convert_hr(_el, _opts)
115
116
  "* * *\n"
116
117
  end
117
118
 
118
119
  def convert_ul(el, opts)
119
120
  inner(el, opts).sub(/\n+\Z/, "\n")
120
121
  end
121
- alias :convert_ol :convert_ul
122
- alias :convert_dl :convert_ul
122
+ alias convert_ol convert_ul
123
+ alias convert_dl convert_ul
123
124
 
124
125
  def convert_li(el, opts)
125
126
  sym, width = if @stack.last.type == :ul
126
- ['* ', el.children.first && el.children.first.type == :codeblock ? 4 : 2]
127
+ [+'* ', el.children.first && el.children.first.type == :codeblock ? 4 : 2]
127
128
  else
128
129
  ["#{opts[:index] + 1}.".ljust(4), 4]
129
130
  end
130
- if ial = ial_for_element(el)
131
+ if (ial = ial_for_element(el))
131
132
  sym << ial << " "
132
133
  end
133
134
 
@@ -135,12 +136,12 @@ module Kramdown
135
136
  text = inner(el, opts)
136
137
  newlines = text.scan(/\n*\Z/).first
137
138
  first, *last = text.split(/\n/)
138
- last = last.map {|l| " "*width + l}.join("\n")
139
+ last = last.map {|l| " " * width + l }.join("\n")
139
140
  text = (first.nil? ? "\n" : first + (last.empty? ? "" : "\n") + last + newlines)
140
141
  if el.children.first && el.children.first.type == :p && !el.children.first.options[:transparent]
141
- res = "#{sym}#{text}"
142
+ res = +"#{sym}#{text}"
142
143
  res << "^\n" if el.children.size == 1 && @stack.last.children.last == el &&
143
- (@stack.last.children.any? {|c| c.children.first.type != :p} || @stack.last.children.size == 1)
144
+ (@stack.last.children.any? {|c| c.children.first.type != :p } || @stack.last.children.size == 1)
144
145
  res
145
146
  elsif el.children.first && el.children.first.type == :codeblock
146
147
  "#{sym}\n #{text}"
@@ -150,8 +151,8 @@ module Kramdown
150
151
  end
151
152
 
152
153
  def convert_dd(el, opts)
153
- sym, width = ": ", (el.children.first && el.children.first.type == :codeblock ? 4 : 2)
154
- if ial = ial_for_element(el)
154
+ sym, width = +": ", (el.children.first && el.children.first.type == :codeblock ? 4 : 2)
155
+ if (ial = ial_for_element(el))
155
156
  sym << ial << " "
156
157
  end
157
158
 
@@ -159,10 +160,10 @@ module Kramdown
159
160
  text = inner(el, opts)
160
161
  newlines = text.scan(/\n*\Z/).first
161
162
  first, *last = text.split(/\n/)
162
- last = last.map {|l| " "*width + l}.join("\n")
163
+ last = last.map {|l| " " * width + l }.join("\n")
163
164
  text = first.to_s + (last.empty? ? "" : "\n") + last + newlines
164
165
  text.chomp! if text =~ /\n\n\Z/ && opts[:next] && opts[:next].type == :dd
165
- text << "\n" if (text !~ /\n\n\Z/ && opts[:next] && opts[:next].type == :dt)
166
+ text << "\n" if text !~ /\n\n\Z/ && opts[:next] && opts[:next].type == :dt
166
167
  text << "\n" if el.children.empty?
167
168
  if el.children.first && el.children.first.type == :p && !el.children.first.options[:transparent]
168
169
  "\n#{sym}#{text}"
@@ -174,34 +175,37 @@ module Kramdown
174
175
  end
175
176
 
176
177
  def convert_dt(el, opts)
177
- result = ''
178
- if ial = ial_for_element(el)
178
+ result = +''
179
+ if (ial = ial_for_element(el))
179
180
  result << ial << " "
180
181
  end
181
182
  result << inner(el, opts) << "\n"
182
183
  end
183
184
 
184
- HTML_TAGS_WITH_BODY=['div', 'script', 'iframe', 'textarea']
185
+ HTML_TAGS_WITH_BODY = ['div', 'script', 'iframe', 'textarea']
185
186
 
186
187
  def convert_html_element(el, opts)
187
188
  markdown_attr = el.options[:category] == :block && el.children.any? do |c|
188
- c.type != :html_element && (c.type != :p || !c.options[:transparent]) && Element.category(c) == :block
189
+ c.type != :html_element && (c.type != :p || !c.options[:transparent]) &&
190
+ Element.category(c) == :block
189
191
  end
190
- opts[:force_raw_text] = true if %w{script pre code}.include?(el.value)
191
- opts[:raw_text] = opts[:force_raw_text] || opts[:block_raw_text] || (el.options[:category] != :span && !markdown_attr)
192
+ opts[:force_raw_text] = true if %w[script pre code].include?(el.value)
193
+ opts[:raw_text] = opts[:force_raw_text] || opts[:block_raw_text] || \
194
+ (el.options[:category] != :span && !markdown_attr)
192
195
  opts[:block_raw_text] = true if el.options[:category] == :block && opts[:raw_text]
193
196
  res = inner(el, opts)
194
197
  if el.options[:category] == :span
195
- "<#{el.value}#{html_attributes(el.attr)}" << (!res.empty? || HTML_TAGS_WITH_BODY.include?(el.value) ? ">#{res}</#{el.value}>" : " />")
198
+ "<#{el.value}#{html_attributes(el.attr)}" + \
199
+ (!res.empty? || HTML_TAGS_WITH_BODY.include?(el.value) ? ">#{res}</#{el.value}>" : " />")
196
200
  else
197
- output = ''
201
+ output = +''
198
202
  attr = el.attr.dup
199
203
  attr['markdown'] = '1' if markdown_attr
200
204
  output << "<#{el.value}#{html_attributes(attr)}"
201
205
  if !res.empty? && el.options[:content_model] != :block
202
206
  output << ">#{res}</#{el.value}>"
203
207
  elsif !res.empty?
204
- output << ">\n#{res}" << "</#{el.value}>"
208
+ output << ">\n#{res}" << "</#{el.value}>"
205
209
  elsif HTML_TAGS_WITH_BODY.include?(el.value)
206
210
  output << "></#{el.value}>"
207
211
  else
@@ -212,14 +216,15 @@ module Kramdown
212
216
  end
213
217
  end
214
218
 
215
- def convert_xml_comment(el, opts)
216
- if el.options[:category] == :block && (@stack.last.type != :html_element || @stack.last.options[:content_model] != :raw)
219
+ def convert_xml_comment(el, _opts)
220
+ if el.options[:category] == :block &&
221
+ (@stack.last.type != :html_element || @stack.last.options[:content_model] != :raw)
217
222
  el.value + "\n"
218
223
  else
219
224
  el.value.dup
220
225
  end
221
226
  end
222
- alias :convert_xml_pi :convert_xml_comment
227
+ alias convert_xml_pi convert_xml_comment
223
228
 
224
229
  def convert_table(el, opts)
225
230
  opts[:alignment] = el.options[:alignment]
@@ -228,10 +233,10 @@ module Kramdown
228
233
 
229
234
  def convert_thead(el, opts)
230
235
  rows = inner(el, opts)
231
- if opts[:alignment].all? {|a| a == :default}
232
- "#{rows}|" << "-"*10 << "\n"
236
+ if opts[:alignment].all? {|a| a == :default }
237
+ "#{rows}|#{'-' * 10}\n"
233
238
  else
234
- "#{rows}| " << opts[:alignment].map do |a|
239
+ "#{rows}| " + opts[:alignment].map do |a|
235
240
  case a
236
241
  when :left then ":-"
237
242
  when :right then "-:"
@@ -243,25 +248,25 @@ module Kramdown
243
248
  end
244
249
 
245
250
  def convert_tbody(el, opts)
246
- res = ''
251
+ res = +''
247
252
  res << inner(el, opts)
248
- res << '|' << '-'*10 << "\n" if opts[:next] && opts[:next].type == :tbody
253
+ res << '|' << '-' * 10 << "\n" if opts[:next] && opts[:next].type == :tbody
249
254
  res
250
255
  end
251
256
 
252
257
  def convert_tfoot(el, opts)
253
- "|" << "="*10 << "\n#{inner(el, opts)}"
258
+ "|#{'=' * 10}\n#{inner(el, opts)}"
254
259
  end
255
260
 
256
261
  def convert_tr(el, opts)
257
- "| " << el.children.map {|c| convert(c, opts)}.join(" | ") << " |\n"
262
+ "| #{el.children.map {|c| convert(c, opts) }.join(' | ')} |\n"
258
263
  end
259
264
 
260
265
  def convert_td(el, opts)
261
266
  inner(el, opts)
262
267
  end
263
268
 
264
- def convert_comment(el, opts)
269
+ def convert_comment(el, _opts)
265
270
  if el.options[:category] == :block
266
271
  "{::comment}\n#{el.value}\n{:/}\n"
267
272
  else
@@ -269,7 +274,7 @@ module Kramdown
269
274
  end
270
275
  end
271
276
 
272
- def convert_br(el, opts)
277
+ def convert_br(_el, _opts)
273
278
  " \n"
274
279
  end
275
280
 
@@ -277,7 +282,7 @@ module Kramdown
277
282
  if el.attr['href'].empty?
278
283
  "[#{inner(el, opts)}]()"
279
284
  elsif el.attr['href'] =~ /^(?:http|ftp)/ || el.attr['href'].count("()") > 0
280
- index = if link_el = @linkrefs.find {|c| c.attr['href'] == el.attr['href']}
285
+ index = if (link_el = @linkrefs.find {|c| c.attr['href'] == el.attr['href'] })
281
286
  @linkrefs.index(link_el) + 1
282
287
  else
283
288
  @linkrefs << el
@@ -290,7 +295,7 @@ module Kramdown
290
295
  end
291
296
  end
292
297
 
293
- def convert_img(el, opts)
298
+ def convert_img(el, _opts)
294
299
  alt_text = el.attr['alt'].to_s.gsub(ESCAPED_CHAR_RE) { $1 ? "\\#{$1}" : $2 }
295
300
  src = el.attr['src'].to_s
296
301
  if src.empty?
@@ -306,19 +311,19 @@ module Kramdown
306
311
  end
307
312
  end
308
313
 
309
- def convert_codespan(el, opts)
314
+ def convert_codespan(el, _opts)
310
315
  delim = (el.value.scan(/`+/).max || '') + '`'
311
316
  "#{delim}#{' ' if delim.size > 1}#{el.value}#{' ' if delim.size > 1}#{delim}"
312
317
  end
313
318
 
314
- def convert_footnote(el, opts)
319
+ def convert_footnote(el, _opts)
315
320
  @footnotes << [el.options[:name], el.value]
316
321
  "[^#{el.options[:name]}]"
317
322
  end
318
323
 
319
- def convert_raw(el, opts)
324
+ def convert_raw(el, _opts)
320
325
  attr = (el.options[:type] || []).join(' ')
321
- attr = " type=\"#{attr}\"" if attr.length > 0
326
+ attr = " type=\"#{attr}\"" unless attr.empty?
322
327
  if @stack.last.type == :html_element
323
328
  el.value
324
329
  elsif el.options[:category] == :block
@@ -338,28 +343,28 @@ module Kramdown
338
343
  (opts[:next] && [:em, :strong].include?(opts[:next].type) && !ial_for_element(el) ? '{::}' : '')
339
344
  end
340
345
 
341
- def convert_entity(el, opts)
346
+ def convert_entity(el, _opts)
342
347
  entity_to_str(el.value, el.options[:original])
343
348
  end
344
349
 
345
350
  TYPOGRAPHIC_SYMS = {
346
- :mdash => '---', :ndash => '--', :hellip => '...',
347
- :laquo_space => '<< ', :raquo_space => ' >>',
348
- :laquo => '<<', :raquo => '>>'
351
+ mdash: '---', ndash: '--', hellip: '...',
352
+ laquo_space: '<< ', raquo_space: ' >>',
353
+ laquo: '<<', raquo: '>>'
349
354
  }
350
- def convert_typographic_sym(el, opts)
355
+ def convert_typographic_sym(el, _opts)
351
356
  TYPOGRAPHIC_SYMS[el.value]
352
357
  end
353
358
 
354
- def convert_smart_quote(el, opts)
359
+ def convert_smart_quote(el, _opts)
355
360
  el.value.to_s =~ /[rl]dquo/ ? "\"" : "'"
356
361
  end
357
362
 
358
- def convert_math(el, opts)
363
+ def convert_math(el, _opts)
359
364
  "$$#{el.value}$$" + (el.options[:category] == :block ? "\n" : '')
360
365
  end
361
366
 
362
- def convert_abbreviation(el, opts)
367
+ def convert_abbreviation(el, _opts)
363
368
  el.value
364
369
  end
365
370
 
@@ -372,27 +377,27 @@ module Kramdown
372
377
  end
373
378
 
374
379
  def create_link_defs
375
- res = ''
376
- res << "\n\n" if @linkrefs.size > 0
380
+ res = +''
381
+ res << "\n\n" unless @linkrefs.empty?
377
382
  @linkrefs.each_with_index do |el, i|
378
383
  title = parse_title(el.attr['title'])
379
- res << "[#{i+1}]: #{el.attr['href']}#{title}\n"
384
+ res << "[#{i + 1}]: #{el.attr['href']}#{title}\n"
380
385
  end
381
386
  res
382
387
  end
383
388
 
384
389
  def create_footnote_defs
385
- res = ''
390
+ res = +''
386
391
  @footnotes.each do |name, data|
387
392
  res << "[^#{name}]:\n"
388
- res << inner(data).chomp.split(/\n/).map {|l| " #{l}"}.join("\n") + "\n\n"
393
+ res << inner(data).chomp.split(/\n/).map {|l| " #{l}" }.join("\n") + "\n\n"
389
394
  end
390
395
  res
391
396
  end
392
397
 
393
398
  def create_abbrev_defs
394
399
  return '' unless @root.options[:abbrev_defs]
395
- res = ''
400
+ res = +''
396
401
  @root.options[:abbrev_defs].each do |name, text|
397
402
  res << "*[#{name}]: #{text}\n"
398
403
  res << ial_for_element(Element.new(:unused, nil, @root.options[:abbrev_attr][name])).to_s << "\n\n"
@@ -402,25 +407,25 @@ module Kramdown
402
407
 
403
408
  # Return the IAL containing the attributes of the element +el+.
404
409
  def ial_for_element(el)
405
- res = el.attr.map do |k,v|
410
+ res = el.attr.map do |k, v|
406
411
  next if [:img, :a].include?(el.type) && ['href', 'src', 'alt', 'title'].include?(k)
407
412
  next if el.type == :header && k == 'id' && !v.strip.empty?
408
413
  if v.nil?
409
414
  ''
410
415
  elsif k == 'class' && !v.empty? && !v.index(/[\.#]/)
411
- " " + v.split(/\s+/).map {|w| ".#{w}"}.join(" ")
416
+ " " + v.split(/\s+/).map {|w| ".#{w}" }.join(" ")
412
417
  elsif k == 'id' && !v.strip.empty?
413
418
  " ##{v}"
414
419
  else
415
- " #{k}=\"#{v.to_s}\""
420
+ " #{k}=\"#{v}\""
416
421
  end
417
422
  end.compact.join('')
418
- res = "toc" << (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) &&
423
+ res = "toc" + (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) &&
419
424
  (el.options[:ial][:refs].include?('toc') rescue nil)
420
- res = "footnotes" << (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) &&
425
+ res = "footnotes" + (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) &&
421
426
  (el.options[:ial][:refs].include?('footnotes') rescue nil)
422
427
  if el.type == :dl && el.options[:ial] && el.options[:ial][:refs]
423
- auto_ids = el.options[:ial][:refs].select {|ref| ref =~ /\Aauto_ids/}.join(" ")
428
+ auto_ids = el.options[:ial][:refs].select {|ref| ref.start_with?('auto_ids') }.join(" ")
424
429
  res = auto_ids << (res.strip.empty? ? '' : " #{res}") unless auto_ids.empty?
425
430
  end
426
431
  res.strip.empty? ? nil : "{:#{res}}"
@@ -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
  #++
@@ -44,8 +44,8 @@ module Kramdown
44
44
 
45
45
  # Return the converted content of the children of +el+ as a string.
46
46
  def inner(el, opts)
47
- result = ''
48
- options = opts.dup.merge(:parent => el)
47
+ result = +''
48
+ options = opts.dup.merge(parent: el)
49
49
  el.children.each_with_index do |inner_el, index|
50
50
  options[:index] = index
51
51
  options[:result] = result
@@ -58,16 +58,17 @@ module Kramdown
58
58
  inner(el, opts)
59
59
  end
60
60
 
61
- def convert_blank(el, opts)
61
+ def convert_blank(_el, opts)
62
62
  opts[:result] =~ /\n\n\Z|\A\Z/ ? "" : "\n"
63
63
  end
64
64
 
65
- def convert_text(el, opts)
65
+ def convert_text(el, _opts)
66
66
  escape(el.value)
67
67
  end
68
68
 
69
69
  def convert_p(el, opts)
70
- if el.children.size == 1 && el.children.first.type == :img && !(img = convert_img(el.children.first, opts)).empty?
70
+ if el.children.size == 1 && el.children.first.type == :img &&
71
+ !(img = convert_img(el.children.first, opts)).empty?
71
72
  convert_standalone_image(el, opts, img)
72
73
  else
73
74
  "#{latex_link_target(el)}#{inner(el, opts)}\n\n"
@@ -76,12 +77,14 @@ module Kramdown
76
77
 
77
78
  # Helper method used by +convert_p+ to convert a paragraph that only contains a single :img
78
79
  # element.
79
- def convert_standalone_image(el, opts, img)
80
+ def convert_standalone_image(el, _opts, img)
80
81
  attrs = attribute_list(el)
81
- "\\begin{figure}#{attrs}\n\\begin{center}\n#{img}\n\\end{center}\n\\caption{#{escape(el.children.first.attr['alt'])}}\n#{latex_link_target(el, true)}\n\\end{figure}#{attrs}\n"
82
+ "\\begin{figure}#{attrs}\n\\begin{center}\n#{img}\n\\end{center}\n" \
83
+ "\\caption{#{escape(el.children.first.attr['alt'])}}\n" \
84
+ "#{latex_link_target(el, true)}\n\\end{figure}#{attrs}\n"
82
85
  end
83
86
 
84
- def convert_codeblock(el, opts)
87
+ def convert_codeblock(el, _opts)
85
88
  show_whitespace = el.attr['class'].to_s =~ /\bshow-whitespaces\b/
86
89
  lang = extract_code_language(el.attr)
87
90
 
@@ -91,13 +94,14 @@ module Kramdown
91
94
  "#{latex_link_target(el)}#{highlighted_code}\n"
92
95
  elsif show_whitespace || lang
93
96
  options = []
94
- options << "showspaces=%s,showtabs=%s" % (show_whitespace ? ['true', 'true'] : ['false', 'false'])
97
+ options << (show_whitespace ? "showspaces=true,showtabs=true" : "showspaces=false,showtabs=false")
95
98
  options << "language=#{lang}" if lang
96
99
  options << "basicstyle=\\ttfamily\\footnotesize,columns=fixed,frame=tlbr"
97
100
  id = el.attr['id']
98
101
  options << "label=#{id}" if id
99
102
  attrs = attribute_list(el)
100
- "#{latex_link_target(el)}\\begin{lstlisting}[#{options.join(',')}]\n#{el.value}\n\\end{lstlisting}#{attrs}\n"
103
+ "#{latex_link_target(el)}\\begin{lstlisting}[#{options.join(',')}]\n" \
104
+ "#{el.value}\n\\end{lstlisting}#{attrs}\n"
101
105
  else
102
106
  "#{latex_link_target(el)}\\begin{verbatim}#{el.value}\\end{verbatim}\n"
103
107
  end
@@ -117,7 +121,7 @@ module Kramdown
117
121
  end
118
122
  end
119
123
 
120
- def convert_hr(el, opts)
124
+ def convert_hr(el, _opts)
121
125
  attrs = attribute_list(el)
122
126
  "#{latex_link_target(el)}\\begin{center}#{attrs}\n\\rule{3in}{0.4pt}\n\\end{center}#{attrs}\n"
123
127
  end
@@ -130,7 +134,7 @@ module Kramdown
130
134
  latex_environment(el.type == :ul ? 'itemize' : 'enumerate', el, inner(el, opts))
131
135
  end
132
136
  end
133
- alias :convert_ol :convert_ul
137
+ alias convert_ol convert_ul
134
138
 
135
139
  def convert_dl(el, opts)
136
140
  latex_environment('description', el, inner(el, opts))
@@ -159,22 +163,23 @@ module Kramdown
159
163
  end
160
164
  end
161
165
 
162
- def convert_xml_comment(el, opts)
163
- el.value.split(/\n/).map {|l| "% #{l}"}.join("\n") + "\n"
166
+ def convert_xml_comment(el, _opts)
167
+ el.value.split(/\n/).map {|l| "% #{l}" }.join("\n") + "\n"
164
168
  end
165
169
 
166
- def convert_xml_pi(el, opts)
170
+ def convert_xml_pi(_el, _opts)
167
171
  warning("Can't convert XML PI")
168
172
  ''
169
173
  end
170
174
 
171
- TABLE_ALIGNMENT_CHAR = {:default => 'l', :left => 'l', :center => 'c', :right => 'r'} # :nodoc:
175
+ TABLE_ALIGNMENT_CHAR = {default: 'l', left: 'l', center: 'c', right: 'r'} # :nodoc:
172
176
 
173
177
  def convert_table(el, opts)
174
178
  @data[:packages] << 'longtable'
175
- align = el.options[:alignment].map {|a| TABLE_ALIGNMENT_CHAR[a]}.join('|')
179
+ align = el.options[:alignment].map {|a| TABLE_ALIGNMENT_CHAR[a] }.join('|')
176
180
  attrs = attribute_list(el)
177
- "#{latex_link_target(el)}\\begin{longtable}{|#{align}|}#{attrs}\n\\hline\n#{inner(el, opts)}\\hline\n\\end{longtable}#{attrs}\n\n"
181
+ "#{latex_link_target(el)}\\begin{longtable}{|#{align}|}#{attrs}\n" \
182
+ "\\hline\n#{inner(el, opts)}\\hline\n\\end{longtable}#{attrs}\n\n"
178
183
  end
179
184
 
180
185
  def convert_thead(el, opts)
@@ -190,33 +195,34 @@ module Kramdown
190
195
  end
191
196
 
192
197
  def convert_tr(el, opts)
193
- el.children.map {|c| send("convert_#{c.type}", c, opts)}.join(' & ') << "\\\\\n"
198
+ el.children.map {|c| send("convert_#{c.type}", c, opts) }.join(' & ') << "\\\\\n"
194
199
  end
195
200
 
196
201
  def convert_td(el, opts)
197
202
  inner(el, opts)
198
203
  end
199
204
 
200
- def convert_comment(el, opts)
201
- el.value.split(/\n/).map {|l| "% #{l}"}.join("\n") << "\n"
205
+ def convert_comment(el, _opts)
206
+ el.value.split(/\n/).map {|l| "% #{l}" }.join("\n") << "\n"
202
207
  end
203
208
 
204
- def convert_br(el, opts)
205
- res = "\\newline"
206
- res << "\n" if (c = opts[:parent].children[opts[:index]+1]) && (c.type != :text || c.value !~ /^\s*\n/)
209
+ def convert_br(_el, opts)
210
+ res = +"\\newline"
211
+ res << "\n" if (c = opts[:parent].children[opts[:index] + 1]) &&
212
+ (c.type != :text || c.value !~ /^\s*\n/)
207
213
  res
208
214
  end
209
215
 
210
216
  def convert_a(el, opts)
211
217
  url = el.attr['href']
212
218
  if url.start_with?('#')
213
- "\\hyperlink{#{url[1..-1].gsub('%', "\\%")}}{#{inner(el, opts)}}"
219
+ "\\hyperlink{#{url[1..-1].gsub('%', '\\%')}}{#{inner(el, opts)}}"
214
220
  else
215
- "\\href{#{url.gsub('%', "\\%")}}{#{inner(el, opts)}}"
221
+ "\\href{#{url.gsub('%', '\\%')}}{#{inner(el, opts)}}"
216
222
  end
217
223
  end
218
224
 
219
- def convert_img(el, opts)
225
+ def convert_img(el, _opts)
220
226
  line = el.options[:location]
221
227
  if el.attr['src'] =~ /^(https?|ftps?):\/\//
222
228
  warning("Cannot include non-local image#{line ? " (line #{line})" : ''}")
@@ -230,7 +236,7 @@ module Kramdown
230
236
  end
231
237
  end
232
238
 
233
- def convert_codespan(el, opts)
239
+ def convert_codespan(el, _opts)
234
240
  lang = extract_code_language(el.attr)
235
241
  if @options[:syntax_highlighter] == :minted &&
236
242
  (highlighted_code = highlight_code(el.value, lang, :span))
@@ -246,7 +252,7 @@ module Kramdown
246
252
  "\\footnote{#{inner(el.value, opts).rstrip}}"
247
253
  end
248
254
 
249
- def convert_raw(el, opts)
255
+ def convert_raw(el, _opts)
250
256
  if !el.options[:type] || el.options[:type].empty? || el.options[:type].include?('latex')
251
257
  el.value + (el.options[:category] == :block ? "\n" : '')
252
258
  else
@@ -511,7 +517,7 @@ module Kramdown
511
517
  8194 => ['\hskip .5em\relax'],
512
518
  8195 => ['\quad'],
513
519
  } # :nodoc:
514
- ENTITY_CONV_TABLE.each {|k,v| ENTITY_CONV_TABLE[k][0].insert(-1, '{}')}
520
+ ENTITY_CONV_TABLE.each_value {|v| v[0] = "{}#{v[0]}" }
515
521
 
516
522
  def entity_to_latex(entity)
517
523
  text, package = ENTITY_CONV_TABLE[entity.code_point]
@@ -524,16 +530,16 @@ module Kramdown
524
530
  end
525
531
  end
526
532
 
527
- def convert_entity(el, opts)
533
+ def convert_entity(el, _opts)
528
534
  entity_to_latex(el.value)
529
535
  end
530
536
 
531
537
  TYPOGRAPHIC_SYMS = {
532
- :mdash => '---', :ndash => '--', :hellip => '\ldots{}',
533
- :laquo_space => '\guillemotleft{}~', :raquo_space => '~\guillemotright{}',
534
- :laquo => '\guillemotleft{}', :raquo => '\guillemotright{}'
538
+ mdash: '---', ndash: '--', hellip: '\ldots{}',
539
+ laquo_space: '\guillemotleft{}~', raquo_space: '~\guillemotright{}',
540
+ laquo: '\guillemotleft{}', raquo: '\guillemotright{}'
535
541
  } # :nodoc:
536
- def convert_typographic_sym(el, opts)
542
+ def convert_typographic_sym(el, _opts)
537
543
  if (result = @options[:typographic_symbols][el.value])
538
544
  escape(result)
539
545
  else
@@ -543,11 +549,11 @@ module Kramdown
543
549
 
544
550
  def convert_smart_quote(el, opts)
545
551
  res = entity_to_latex(smart_quote_entity(el)).chomp('{}')
546
- res << "{}" if ((nel = opts[:parent].children[opts[:index]+1]) && nel.type == :smart_quote) || res =~ /\w$/
552
+ res << "{}" if ((nel = opts[:parent].children[opts[:index] + 1]) && nel.type == :smart_quote) || res =~ /\w$/
547
553
  res
548
554
  end
549
555
 
550
- def convert_math(el, opts)
556
+ def convert_math(el, _opts)
551
557
  @data[:packages] += %w[amssymb amsmath amsthm amsfonts]
552
558
  if el.options[:category] == :block
553
559
  if el.value =~ /\A\s*\\begin\{/
@@ -560,14 +566,14 @@ module Kramdown
560
566
  end
561
567
  end
562
568
 
563
- def convert_abbreviation(el, opts)
569
+ def convert_abbreviation(el, _opts)
564
570
  @data[:packages] += %w[acronym]
565
571
  "\\ac{#{normalize_abbreviation_key(el.value)}}"
566
572
  end
567
573
 
568
574
  # Normalize the abbreviation key so that it only contains allowed ASCII character
569
575
  def normalize_abbreviation_key(key)
570
- key.gsub(/\W/) {|m| m.unpack('H*').first}
576
+ key.gsub(/\W/) {|m| m.unpack('H*').first }
571
577
  end
572
578
 
573
579
  # Wrap the +text+ inside a LaTeX environment of type +type+. The element +el+ is passed on to
@@ -583,7 +589,7 @@ module Kramdown
583
589
  # additionally to the \hypertarget command.
584
590
  def latex_link_target(el, add_label = false)
585
591
  if (id = el.attr['id'])
586
- "\\hypertarget{#{id}}{}" << (add_label ? "\\label{#{id}}" : '')
592
+ "\\hypertarget{#{id}}{}#{add_label ? "\\label{#{id}}" : ''}"
587
593
  else
588
594
  nil
589
595
  end
@@ -591,8 +597,8 @@ module Kramdown
591
597
 
592
598
  # Return a LaTeX comment containing all attributes as 'key="value"' pairs.
593
599
  def attribute_list(el)
594
- attrs = el.attr.map {|k,v| v.nil? ? '' : " #{k}=\"#{v.to_s}\""}.compact.sort.join('')
595
- attrs = " % #{attrs}" if !attrs.empty?
600
+ attrs = el.attr.map {|k, v| v.nil? ? '' : " #{k}=\"#{v}\"" }.compact.sort.join('')
601
+ attrs = " % #{attrs}" unless attrs.empty?
596
602
  attrs
597
603
  end
598
604
 
@@ -605,12 +611,12 @@ module Kramdown
605
611
  ">" => "\\textgreater{}",
606
612
  "[" => "{[}",
607
613
  "]" => "{]}",
608
- }.merge(Hash[*("{}$%&_#".scan(/./).map {|c| [c, "\\#{c}"]}.flatten)]) # :nodoc:
609
- ESCAPE_RE = Regexp.union(*ESCAPE_MAP.collect {|k,v| k}) # :nodoc:
614
+ }.merge(Hash[*("{}$%&_#".each_char.map {|c| [c, "\\#{c}"] }.flatten)]) # :nodoc:
615
+ ESCAPE_RE = Regexp.union(*ESCAPE_MAP.collect {|k, _v| k }) # :nodoc:
610
616
 
611
617
  # Escape the special LaTeX characters in the string +str+.
612
618
  def escape(str)
613
- str.gsub(ESCAPE_RE) {|m| ESCAPE_MAP[m]}
619
+ str.gsub(ESCAPE_RE) {|m| ESCAPE_MAP[m] }
614
620
  end
615
621
 
616
622
  end