motion-kramdown 0.6.0 → 1.16.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +6 -2
  3. data/lib/kramdown.rb +1 -1
  4. data/lib/kramdown/converter.rb +10 -11
  5. data/lib/kramdown/converter/base.rb +19 -12
  6. data/lib/kramdown/converter/hash_ast.rb +38 -0
  7. data/lib/kramdown/converter/html.rb +71 -39
  8. data/lib/kramdown/converter/kramdown.rb +19 -10
  9. data/lib/kramdown/converter/latex.rb +28 -10
  10. data/lib/kramdown/converter/man.rb +303 -0
  11. data/lib/kramdown/converter/math_engine/itex2mml.rb +2 -2
  12. data/lib/kramdown/converter/math_engine/mathjax.rb +13 -3
  13. data/lib/kramdown/converter/math_engine/mathjaxnode.rb +56 -0
  14. data/lib/kramdown/converter/math_engine/ritex.rb +2 -2
  15. data/lib/kramdown/converter/math_engine/sskatex.rb +97 -0
  16. data/lib/kramdown/converter/pdf.rb +6 -6
  17. data/lib/kramdown/converter/remove_html_tags.rb +5 -3
  18. data/lib/kramdown/converter/syntax_highlighter.rb +5 -2
  19. data/lib/kramdown/converter/syntax_highlighter/coderay.rb +8 -5
  20. data/lib/kramdown/converter/syntax_highlighter/minted.rb +35 -0
  21. data/lib/kramdown/converter/syntax_highlighter/rouge.rb +48 -10
  22. data/lib/kramdown/converter/toc.rb +2 -2
  23. data/lib/kramdown/document.rb +16 -19
  24. data/lib/kramdown/element.rb +5 -1
  25. data/lib/kramdown/error.rb +1 -1
  26. data/lib/kramdown/options.rb +103 -7
  27. data/lib/kramdown/parser.rb +1 -1
  28. data/lib/kramdown/parser/base.rb +12 -18
  29. data/lib/kramdown/parser/gfm.rb +142 -11
  30. data/lib/kramdown/parser/html.rb +28 -18
  31. data/lib/kramdown/parser/kramdown.rb +45 -36
  32. data/lib/kramdown/parser/kramdown/abbreviation.rb +1 -1
  33. data/lib/kramdown/parser/kramdown/autolink.rb +2 -8
  34. data/lib/kramdown/parser/kramdown/blank_line.rb +2 -2
  35. data/lib/kramdown/parser/kramdown/block_boundary.rb +4 -4
  36. data/lib/kramdown/parser/kramdown/blockquote.rb +4 -4
  37. data/lib/kramdown/parser/kramdown/codeblock.rb +11 -8
  38. data/lib/kramdown/parser/kramdown/codespan.rb +1 -1
  39. data/lib/kramdown/parser/kramdown/emphasis.rb +2 -2
  40. data/lib/kramdown/parser/kramdown/eob.rb +1 -1
  41. data/lib/kramdown/parser/kramdown/escaped_chars.rb +1 -1
  42. data/lib/kramdown/parser/kramdown/extensions.rb +6 -3
  43. data/lib/kramdown/parser/kramdown/footnote.rb +4 -5
  44. data/lib/kramdown/parser/kramdown/header.rb +2 -2
  45. data/lib/kramdown/parser/kramdown/horizontal_rule.rb +1 -1
  46. data/lib/kramdown/parser/kramdown/html.rb +8 -8
  47. data/lib/kramdown/parser/kramdown/html_entity.rb +2 -2
  48. data/lib/kramdown/parser/kramdown/line_break.rb +1 -1
  49. data/lib/kramdown/parser/kramdown/link.rb +5 -4
  50. data/lib/kramdown/parser/kramdown/list.rb +17 -10
  51. data/lib/kramdown/parser/kramdown/math.rb +2 -2
  52. data/lib/kramdown/parser/kramdown/paragraph.rb +19 -8
  53. data/lib/kramdown/parser/kramdown/smart_quotes.rb +3 -3
  54. data/lib/kramdown/parser/kramdown/table.rb +10 -12
  55. data/lib/kramdown/parser/kramdown/typographic_symbol.rb +1 -1
  56. data/lib/kramdown/parser/markdown.rb +2 -2
  57. data/lib/kramdown/utils.rb +2 -1
  58. data/lib/kramdown/utils/configurable.rb +2 -2
  59. data/lib/kramdown/utils/entities.rb +1 -1
  60. data/lib/kramdown/utils/html.rb +2 -2
  61. data/lib/kramdown/utils/lru_cache.rb +40 -0
  62. data/lib/kramdown/utils/ordered_hash.rb +2 -71
  63. data/lib/kramdown/utils/string_scanner.rb +2 -2
  64. data/lib/kramdown/utils/unidecoder.rb +2 -2
  65. data/lib/kramdown/version.rb +2 -2
  66. data/lib/rubymotion/require_override.rb +9 -0
  67. data/lib/rubymotion/version.rb +1 -1
  68. data/spec/{helpers → motion-kramdown/_helpers}/it_behaves_like.rb +0 -0
  69. data/spec/{helpers → motion-kramdown/_helpers}/option_file.rb +2 -2
  70. data/spec/{helpers → motion-kramdown/_helpers}/tidy.rb +0 -0
  71. data/spec/motion-kramdown/bench_mark.rb +37 -0
  72. data/spec/{document_tree.rb → motion-kramdown/document_tree.rb} +11 -1
  73. data/spec/{gfm_to_html.rb → motion-kramdown/gfm_to_html.rb} +51 -18
  74. data/spec/{html_to_html.rb → motion-kramdown/html_to_html.rb} +27 -9
  75. data/spec/{html_to_kramdown_to_html.rb → motion-kramdown/html_to_kramdown_to_html.rb} +35 -16
  76. data/spec/motion-kramdown/kramdown_to_xxx.rb +75 -0
  77. data/spec/{test_location.rb → motion-kramdown/test_location.rb} +0 -0
  78. data/spec/{test_string_scanner_kramdown.rb → motion-kramdown/test_string_scanner_kramdown.rb} +0 -0
  79. data/spec/motion-kramdown/text_manpage.rb +11 -0
  80. data/spec/{text_to_kramdown_to_html.rb → motion-kramdown/text_to_kramdown_to_html.rb} +30 -19
  81. data/spec/{text_to_latex.rb → motion-kramdown/text_to_latex.rb} +0 -0
  82. data/spec/{helpers/spec_options.rb → spec_helper.rb} +13 -2
  83. metadata +54 -33
  84. data/lib/kramdown/compatibility.rb +0 -36
  85. data/spec/bench_mark.rb +0 -43
  86. data/spec/kramdown_to_xxx.rb +0 -42
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a9577c71875ad433ef83f571aabd8d174ecc7f3e
4
- data.tar.gz: c62c562508e488a2acdccc73b11103f5819e790f
2
+ SHA256:
3
+ metadata.gz: 60142424142433a2b5ffdb6d598820aa55a3cb3e1f1f75aa5a9ce177b6ba41ba
4
+ data.tar.gz: 6c7371fbba67b2996585abbcdc1957d8e4600c3507055d58833265a17522ddb4
5
5
  SHA512:
6
- metadata.gz: cc144943f6ef46416d7f5aa286966f0dbbb055a3a1d7c937e8c9f4a6cfa726abdf77add761eb9a05cb5256e42970d4df3ec299373add3de0e701fabc009162ce
7
- data.tar.gz: 1b081491e595b664f22f060a0bb44da88874629b8d8f2a973de5548befc5ed5387553c59f0e0d9e011e5169b2f079b27aed697a139a640dc01742f6f43204c65
6
+ metadata.gz: fb1786361e980d753ac54bc88cbc206361f8d7486886bdd6f14fbb54eb04029ea9bf64fcce02328eb978490e5aba81957df6d3387d5259e72bdc6aec2bcf8537
7
+ data.tar.gz: d0c0d4212fda52d3e3faa7c8a98ddfda404894977d81375f41223bbe38324b313d4a6f88c6f769eda652f48135a2c25ccb51d68d5a24175a170b5444dc9618cf
data/README.md CHANGED
@@ -1,10 +1,13 @@
1
1
  # motion-kramdown
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/motion-kramdown.svg)](http://badge.fury.io/rb/motion-kramdown)
4
+ [![Build Status](https://travis-ci.org/digitalmoksha/motion-kramdown.svg?branch=master)](https://travis-ci.org/digitalmoksha/motion-kramdown)
5
+ [![Platform](https://img.shields.io/badge/platform-macos%20|%20ios-lightgrey.svg)](https://shields.io/)
6
+ [![Language](https://img.shields.io/badge/language-RubyMotion-red.svg)](http://www.rubymotion.com)
4
7
 
5
8
  [kramdown](https://github.com/gettalong/kramdown) Markdown parser, for use with RubyMotion on iOS and OS X.
6
9
 
7
- Currently implements: _kramdown_ 1.6
10
+ Currently implements: _kramdown_ 1.16.2
8
11
 
9
12
  ## Introduction
10
13
 
@@ -83,4 +86,5 @@ All credit for _kramdown_ belongs to Thomas Leitner. _motion-kramdown_ is a sim
83
86
 
84
87
  _motion-kramdown_ is released under the MIT license (see the **COPYING** file) and therefore can easily be used in commercial projects.
85
88
 
86
- However, if you use _motion-kramdown_ in a commercial setting, please consider **contributing back any changes** for the benefit of the community and/or **making a donation** (see the links in the sidebar on the [kramdown homepage](http://kramdown.gettalong.org/).
89
+ However, if you use _motion-kramdown_ in a commercial setting, please consider **contributing back any changes** for the benefit of the community and/or
90
+ [**becoming a patron**](https://www.patreon.com/gettalong) - thanks!
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  #--
4
- # Copyright (C) 2009-2015 Thomas Leitner <t_leitner@gmx.at>
4
+ # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
5
5
  #
6
6
  # This file is part of kramdown which is licensed under the MIT.
7
7
  #++
@@ -1,13 +1,13 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  #--
4
- # Copyright (C) 2009-2015 Thomas Leitner <t_leitner@gmx.at>
4
+ # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
5
5
  #
6
6
  # This file is part of kramdown which is licensed under the MIT.
7
7
  #++
8
8
  #
9
9
 
10
- # RM require 'kramdown/utils'
10
+ require 'kramdown/utils'
11
11
 
12
12
  module Kramdown
13
13
 
@@ -26,17 +26,19 @@ module Kramdown
26
26
  # RM autoload :Toc, 'kramdown/converter/toc'
27
27
  # RM autoload :RemoveHtmlTags, 'kramdown/converter/remove_html_tags'
28
28
  # RM autoload :Pdf, 'kramdown/converter/pdf'
29
+ # RM autoload :HashAST, 'kramdown/converter/hash_ast'
30
+ # RM autoload :Man, 'kramdown/converter/man'
29
31
 
30
32
  extend ::Kramdown::Utils::Configurable
31
33
 
32
34
  configurable(:syntax_highlighter)
33
35
 
34
- # RM ["Coderay", "Rouge"].each do |klass_name|
36
+ # RM ["Minted", "Coderay", "Rouge"].each do |klass_name|
35
37
  # RM kn_down = klass_name.downcase.intern
36
38
  # RM add_syntax_highlighter(kn_down) do |converter, text, lang, type, opts|
37
39
  # RM require "kramdown/converter/syntax_highlighter/#{kn_down}"
38
40
  # RM klass = ::Kramdown::Utils.deep_const_get("::Kramdown::Converter::SyntaxHighlighter::#{klass_name}")
39
- # RM if klass::AVAILABLE
41
+ # RM. if !klass.const_defined?(:AVAILABLE) || klass::AVAILABLE
40
42
  # RM add_syntax_highlighter(kn_down, klass)
41
43
  # RM else
42
44
  # RM add_syntax_highlighter(kn_down) {|*args| nil}
@@ -44,18 +46,15 @@ module Kramdown
44
46
  # RM syntax_highlighter(kn_down).call(converter, text, lang, type, opts)
45
47
  # RM end
46
48
  # RM end
47
- # RM
49
+ # RM
48
50
  # RM configurable(:math_engine)
49
- # RM
50
- # RM require 'kramdown/converter/math_engine/mathjax'
51
- # RM add_math_engine(:mathjax, ::Kramdown::Converter::MathEngine::Mathjax)
52
- # RM
53
- # RM ["Ritex", "Itex2MML"].each do |klass_name|
51
+ # RM
52
+ # RM ['Mathjax', "MathjaxNode", "SsKaTeX", "Ritex", "Itex2MML"].each do |klass_name|
54
53
  # RM kn_down = klass_name.downcase.intern
55
54
  # RM add_math_engine(kn_down) do |converter, el, opts|
56
55
  # RM require "kramdown/converter/math_engine/#{kn_down}"
57
56
  # RM klass = ::Kramdown::Utils.deep_const_get("::Kramdown::Converter::MathEngine::#{klass_name}")
58
- # RM if klass::AVAILABLE
57
+ # RM if !klass.const_defined?(:AVAILABLE) || klass::AVAILABLE
59
58
  # RM add_math_engine(kn_down, klass)
60
59
  # RM else
61
60
  # RM add_math_engine(kn_down) {|*args| nil}
@@ -1,15 +1,15 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  #--
4
- # Copyright (C) 2009-2015 Thomas Leitner <t_leitner@gmx.at>
4
+ # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
5
5
  #
6
6
  # This file is part of kramdown which is licensed under the MIT.
7
7
  #++
8
8
  #
9
9
 
10
- # RM require 'erb'
11
- # RM require 'kramdown/utils'
12
- # RM require 'kramdown/document'
10
+ require 'erb'
11
+ require 'kramdown/utils'
12
+ require 'kramdown/document'
13
13
 
14
14
  module Kramdown
15
15
 
@@ -67,7 +67,7 @@ module Kramdown
67
67
  false
68
68
  end
69
69
 
70
- # Returns whether the template should be applied ater the conversion of the tree.
70
+ # Returns whether the template should be applied after the conversion of the tree.
71
71
  #
72
72
  # Defaults to true.
73
73
  def apply_template_after?
@@ -182,8 +182,8 @@ module Kramdown
182
182
 
183
183
  # Extract the code block/span language from the attributes.
184
184
  def extract_code_language(attr)
185
- if attr['class'] && attr['class'] =~ /\blanguage-\w+\b/
186
- attr['class'].scan(/\blanguage-(\w+)\b/).first.first
185
+ if attr['class'] && attr['class'] =~ /\blanguage-\S+/
186
+ attr['class'].scan(/\blanguage-(\S+)/).first.first
187
187
  end
188
188
  end
189
189
 
@@ -192,7 +192,7 @@ module Kramdown
192
192
  # *Warning*: This version will modify the given attributes if a language is present.
193
193
  def extract_code_language!(attr)
194
194
  lang = extract_code_language(attr)
195
- attr['class'] = attr['class'].sub(/\blanguage-\w+\b/, '').strip if lang
195
+ attr['class'] = attr['class'].sub(/\blanguage-\S+/, '').strip if lang
196
196
  attr.delete('class') if lang && attr['class'].empty?
197
197
  lang
198
198
  end
@@ -231,10 +231,7 @@ module Kramdown
231
231
  # ID.
232
232
  def generate_id(str)
233
233
  str = ::Kramdown::Utils::Unidecoder.decode(str) if @options[:transliterated_header_ids]
234
- gen_id = str.gsub(/^[^a-zA-Z]+/, '')
235
- gen_id.tr!('^a-zA-Z0-9 -', '')
236
- gen_id.tr!(' ', '-')
237
- gen_id.downcase!
234
+ gen_id = basic_generate_id(str)
238
235
  gen_id = 'section' if gen_id.length == 0
239
236
  @used_ids ||= {}
240
237
  if @used_ids.has_key?(gen_id)
@@ -245,6 +242,16 @@ module Kramdown
245
242
  @options[:auto_id_prefix] + gen_id
246
243
  end
247
244
 
245
+ # The basic version of the ID generator, without any special provisions for empty or unique
246
+ # IDs.
247
+ def basic_generate_id(str)
248
+ gen_id = str.gsub(/^[^a-zA-Z]+/, '')
249
+ gen_id.tr!('^a-zA-Z0-9 -', '')
250
+ gen_id.tr!(' ', '-')
251
+ gen_id.downcase!
252
+ gen_id
253
+ end
254
+
248
255
  SMART_QUOTE_INDICES = {:lsquo => 0, :rsquo => 1, :ldquo => 2, :rdquo => 3} # :nodoc:
249
256
 
250
257
  # Return the entity that represents the given smart_quote element.
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of kramdown which is licensed under the MIT.
7
+ #++
8
+ #
9
+
10
+ require 'kramdown/parser'
11
+ require 'kramdown/converter'
12
+ require 'kramdown/utils'
13
+
14
+ module Kramdown
15
+
16
+ module Converter
17
+
18
+ # Converts a Kramdown::Document to a nested hash for further processing or debug output.
19
+ class HashAST < Base
20
+
21
+ def convert(el)
22
+ hash = {:type => el.type}
23
+ hash[:attr] = el.attr unless el.attr.empty?
24
+ hash[:value] = el.value unless el.value.nil?
25
+ hash[:options] = el.options unless el.options.empty?
26
+ unless el.children.empty?
27
+ hash[:children] = []
28
+ el.children.each {|child| hash[:children] << convert(child)}
29
+ end
30
+ hash
31
+ end
32
+
33
+ end
34
+
35
+ HashAst = HashAST
36
+
37
+ end
38
+ end
@@ -1,15 +1,15 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  #--
4
- # Copyright (C) 2009-2015 Thomas Leitner <t_leitner@gmx.at>
4
+ # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
5
5
  #
6
6
  # This file is part of kramdown which is licensed under the MIT.
7
7
  #++
8
8
  #
9
9
 
10
- # RM require 'kramdown/parser'
11
- # RM require 'kramdown/converter'
12
- # RM require 'kramdown/utils'
10
+ require 'kramdown/parser'
11
+ require 'kramdown/converter'
12
+ require 'kramdown/utils'
13
13
 
14
14
  module Kramdown
15
15
 
@@ -92,10 +92,11 @@ module Kramdown
92
92
  def convert_codeblock(el, indent)
93
93
  attr = el.attr.dup
94
94
  lang = extract_code_language!(attr)
95
- highlighted_code = highlight_code(el.value, lang, :block)
95
+ hl_opts = {}
96
+ highlighted_code = highlight_code(el.value, el.options[:lang] || lang, :block, hl_opts)
96
97
 
97
98
  if highlighted_code
98
- add_syntax_highlighter_to_class_attr(attr)
99
+ add_syntax_highlighter_to_class_attr(attr, lang || hl_opts[:default_lang])
99
100
  "#{' '*indent}<div#{html_attributes(attr)}>#{highlighted_code}#{' '*indent}</div>\n"
100
101
  else
101
102
  result = escape_html(el.value)
@@ -164,7 +165,14 @@ module Kramdown
164
165
  alias :convert_dd :convert_li
165
166
 
166
167
  def convert_dt(el, indent)
167
- format_as_block_html(el.type, el.attr, inner(el, indent), indent)
168
+ attr = el.attr.dup
169
+ @stack.last.options[:ial][:refs].each do |ref|
170
+ if ref =~ /\Aauto_ids(?:-([\w-]+))?/
171
+ attr['id'] = ($1 ? $1 : '') << basic_generate_id(el.options[:raw_text])
172
+ break
173
+ end
174
+ end if !attr['id'] && @stack.last.options[:ial] && @stack.last.options[:ial][:refs]
175
+ format_as_block_html(el.type, attr, inner(el, indent), indent)
168
176
  end
169
177
 
170
178
  def convert_html_element(el, indent)
@@ -235,14 +243,7 @@ module Kramdown
235
243
  end
236
244
 
237
245
  def convert_a(el, indent)
238
- res = inner(el, indent)
239
- attr = el.attr.dup
240
- if attr['href'].start_with?('mailto:')
241
- mail_addr = attr['href'][7..-1]
242
- attr['href'] = obfuscate('mailto') << ":" << obfuscate(mail_addr)
243
- res = obfuscate(res) if res == mail_addr
244
- end
245
- format_as_span_html(el.type, attr, res)
246
+ format_as_span_html(el.type, el.attr, inner(el, indent))
246
247
  end
247
248
 
248
249
  def convert_img(el, indent)
@@ -252,9 +253,10 @@ module Kramdown
252
253
  def convert_codespan(el, indent)
253
254
  attr = el.attr.dup
254
255
  lang = extract_code_language(attr)
255
- result = highlight_code(el.value, lang, :span)
256
+ hl_opts = {}
257
+ result = highlight_code(el.value, lang, :span, hl_opts)
256
258
  if result
257
- add_syntax_highlighter_to_class_attr(attr)
259
+ add_syntax_highlighter_to_class_attr(attr, hl_opts[:default_lang])
258
260
  else
259
261
  result = escape_html(el.value)
260
262
  end
@@ -303,7 +305,11 @@ module Kramdown
303
305
  :raquo => [::Kramdown::Utils::Entities.entity('raquo')]
304
306
  } # :nodoc:
305
307
  def convert_typographic_sym(el, indent)
306
- TYPOGRAPHIC_SYMS[el.value].map {|e| entity_to_str(e)}.join('')
308
+ if (result = @options[:typographic_symbols][el.value])
309
+ escape_html(result, :text)
310
+ else
311
+ TYPOGRAPHIC_SYMS[el.value].map {|e| entity_to_str(e)}.join('')
312
+ end
307
313
  end
308
314
 
309
315
  def convert_smart_quote(el, indent)
@@ -313,10 +319,14 @@ module Kramdown
313
319
  def convert_math(el, indent)
314
320
  if (result = format_math(el, :indent => indent))
315
321
  result
316
- elsif el.options[:category] == :block
317
- format_as_block_html('pre', el.attr, "$$\n#{el.value}\n$$", indent)
318
322
  else
319
- format_as_span_html('span', el.attr, "$#{el.value}$")
323
+ attr = el.attr.dup
324
+ (attr['class'] = (attr['class'] || '') << " kdmath").lstrip!
325
+ if el.options[:category] == :block
326
+ format_as_block_html('div', attr, "$$\n#{el.value}\n$$", indent)
327
+ else
328
+ format_as_span_html('span', attr, "$#{el.value}$")
329
+ end
320
330
  end
321
331
  end
322
332
 
@@ -330,7 +340,7 @@ module Kramdown
330
340
  def convert_root(el, indent)
331
341
  result = inner(el, indent)
332
342
  if @footnote_location
333
- result.sub!(/#{@footnote_location}/, footnote_content)
343
+ result.sub!(/#{@footnote_location}/, footnote_content.gsub(/\\/, "\\\\\\\\"))
334
344
  else
335
345
  result << footnote_content
336
346
  end
@@ -341,7 +351,7 @@ module Kramdown
341
351
  else
342
352
  ''
343
353
  end
344
- result.sub!(/#{@toc_code.last}/, text)
354
+ result.sub!(/#{@toc_code.last}/, text.gsub(/\\/, "\\\\\\\\"))
345
355
  end
346
356
  result
347
357
  end
@@ -362,9 +372,11 @@ module Kramdown
362
372
  "#{' '*indent}<#{name}#{html_attributes(attr)}>\n#{body}#{' '*indent}</#{name}>\n"
363
373
  end
364
374
 
365
- # Add the syntax highlighter name to the 'class' attribute of the given attribute hash.
366
- def add_syntax_highlighter_to_class_attr(attr)
375
+ # Add the syntax highlighter name to the 'class' attribute of the given attribute hash. And
376
+ # overwrites or add a "language-LANG" part using the +lang+ parameter if +lang+ is not nil.
377
+ def add_syntax_highlighter_to_class_attr(attr, lang = nil)
367
378
  (attr['class'] = (attr['class'] || '') + " highlighter-#{@options[:syntax_highlighter]}").lstrip!
379
+ attr['class'].sub!(/\blanguage-\S+|(^)/) { "language-#{lang}#{$1 ? ' ' : ''}" } if lang
368
380
  end
369
381
 
370
382
  # Generate and return an element tree for the table of contents.
@@ -378,7 +390,7 @@ module Kramdown
378
390
  a = Element.new(:a, nil)
379
391
  a.attr['href'] = "##{id}"
380
392
  a.attr['id'] = "#{sections.attr['id']}-#{id}"
381
- a.children.concat(remove_footnotes(Marshal.load(Marshal.dump(children))))
393
+ a.children.concat(fix_for_toc_entry(Marshal.load(Marshal.dump(children))))
382
394
  li.children.last.children << a
383
395
  li.children << Element.new(type)
384
396
 
@@ -405,6 +417,21 @@ module Kramdown
405
417
  sections
406
418
  end
407
419
 
420
+ # Fixes the elements for use in a TOC entry.
421
+ def fix_for_toc_entry(elements)
422
+ remove_footnotes(elements)
423
+ unwrap_links(elements)
424
+ elements
425
+ end
426
+
427
+ # Remove all link elements by unwrapping them.
428
+ def unwrap_links(elements)
429
+ elements.map! do |c|
430
+ unwrap_links(c.children)
431
+ c.type == :a ? c.children : c
432
+ end.flatten!
433
+ end
434
+
408
435
  # Remove all footnotes from the given elements.
409
436
  def remove_footnotes(elements)
410
437
  elements.delete_if do |c|
@@ -419,7 +446,7 @@ module Kramdown
419
446
  text.each_byte do |b|
420
447
  result << (b > 128 ? b.chr : "&#%03d;" % b)
421
448
  end
422
- result.force_encoding(text.encoding) if result.respond_to?(:force_encoding)
449
+ result.force_encoding(text.encoding)
423
450
  result
424
451
  end
425
452
 
@@ -430,28 +457,33 @@ module Kramdown
430
457
  ol = Element.new(:ol)
431
458
  ol.attr['start'] = @footnote_start if @footnote_start != 1
432
459
  i = 0
460
+ backlink_text = escape_html(@options[:footnote_backlink], :text)
433
461
  while i < @footnotes.length
434
462
  name, data, _, repeat = *@footnotes[i]
435
463
  li = Element.new(:li, nil, {'id' => "fn:#{name}"})
436
464
  li.children = Marshal.load(Marshal.dump(data.children))
437
-
438
- #------------------------------------------------------------------------------
439
- # RM Crash due to an object being autoreleased one too many times in RubyMotion.
440
- # pre-initializing `para` before it's assigned in the `if` statement seems to
441
- # fix it.
442
- para = nil
443
465
 
444
- if li.children.last.type == :p
445
- para = li.children.last
466
+ para = nil
467
+ if li.children.last.type == :p || @options[:footnote_backlink_inline]
468
+ parent = li
469
+ while !parent.children.empty? && ![:p, :header].include?(parent.children.last.type)
470
+ parent = parent.children.last
471
+ end
472
+ para = parent.children.last
446
473
  insert_space = true
447
- else
474
+ end
475
+
476
+ unless para
448
477
  li.children << (para = Element.new(:p))
449
478
  insert_space = false
450
479
  end
451
480
 
452
- para.children << Element.new(:raw, FOOTNOTE_BACKLINK_FMT % [insert_space ? ' ' : '', name, "&#8617;"])
453
- (1..repeat).each do |index|
454
- para.children << Element.new(:raw, FOOTNOTE_BACKLINK_FMT % [" ", "#{name}:#{index}", "&#8617;<sup>#{index+1}</sup>"])
481
+ unless @options[:footnote_backlink].empty?
482
+ nbsp = entity_to_str(ENTITY_NBSP)
483
+ para.children << Element.new(:raw, FOOTNOTE_BACKLINK_FMT % [insert_space ? nbsp : '', name, backlink_text])
484
+ (1..repeat).each do |index|
485
+ para.children << Element.new(:raw, FOOTNOTE_BACKLINK_FMT % [nbsp, "#{name}:#{index}", "#{backlink_text}<sup>#{index+1}</sup>"])
486
+ end
455
487
  end
456
488
 
457
489
  ol.children << Element.new(:raw, convert(li, 4))
@@ -1,14 +1,14 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  #--
4
- # Copyright (C) 2009-2015 Thomas Leitner <t_leitner@gmx.at>
4
+ # Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
5
5
  #
6
6
  # This file is part of kramdown which is licensed under the MIT.
7
7
  #++
8
8
  #
9
9
 
10
- # RM require 'kramdown/converter'
11
- # RM require 'kramdown/utils'
10
+ require 'kramdown/converter'
11
+ require 'kramdown/utils'
12
12
 
13
13
  module Kramdown
14
14
 
@@ -31,7 +31,7 @@ module Kramdown
31
31
 
32
32
  def convert(el, opts = {:indent => 0})
33
33
  res = send("convert_#{el.type}", el, opts)
34
- if ![:html_element, :li, :dd, :td].include?(el.type) && (ial = ial_for_element(el))
34
+ if ![:html_element, :li, :dt, :dd, :td].include?(el.type) && (ial = ial_for_element(el))
35
35
  res << ial
36
36
  res << "\n\n" if Element.category(el) == :block
37
37
  elsif [:ul, :dl, :ol, :codeblock].include?(el.type) && opts[:next] &&
@@ -174,7 +174,11 @@ module Kramdown
174
174
  end
175
175
 
176
176
  def convert_dt(el, opts)
177
- inner(el, opts) << "\n"
177
+ result = ''
178
+ if ial = ial_for_element(el)
179
+ result << ial << " "
180
+ end
181
+ result << inner(el, opts) << "\n"
178
182
  end
179
183
 
180
184
  HTML_TAGS_WITH_BODY=['div', 'script', 'iframe', 'textarea']
@@ -288,14 +292,15 @@ module Kramdown
288
292
 
289
293
  def convert_img(el, opts)
290
294
  alt_text = el.attr['alt'].to_s.gsub(ESCAPED_CHAR_RE) { $1 ? "\\#{$1}" : $2 }
291
- if el.attr['src'].empty?
295
+ src = el.attr['src'].to_s
296
+ if src.empty?
292
297
  "![#{alt_text}]()"
293
298
  else
294
299
  title = parse_title(el.attr['title'])
295
- link = if el.attr['src'].count("()") > 0
296
- "<#{el.attr['src']}>"
300
+ link = if src.count("()") > 0
301
+ "<#{src}>"
297
302
  else
298
- el.attr['src']
303
+ src
299
304
  end
300
305
  "![#{alt_text}](#{link}#{title})"
301
306
  end
@@ -402,7 +407,7 @@ module Kramdown
402
407
  next if el.type == :header && k == 'id' && !v.strip.empty?
403
408
  if v.nil?
404
409
  ''
405
- elsif k == 'class' && !v.empty?
410
+ elsif k == 'class' && !v.empty? && !v.index(/[\.#]/)
406
411
  " " + v.split(/\s+/).map {|w| ".#{w}"}.join(" ")
407
412
  elsif k == 'id' && !v.strip.empty?
408
413
  " ##{v}"
@@ -414,6 +419,10 @@ module Kramdown
414
419
  (el.options[:ial] && (el.options[:ial][:refs] || []).include?('toc')) # RM can't use rescue nil
415
420
  res = "footnotes" << (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) &&
416
421
  (el.options[:ial] && (el.options[:ial][:refs] || []).include?('footnotes')) # RM can't use rescue nil
422
+ if el.type == :dl && el.options[:ial] && el.options[:ial][:refs]
423
+ auto_ids = el.options[:ial][:refs].select {|ref| ref =~ /\Aauto_ids/}.join(" ")
424
+ res = auto_ids << (res.strip.empty? ? '' : " #{res}") unless auto_ids.empty?
425
+ end
417
426
  res.strip.empty? ? nil : "{:#{res}}"
418
427
  end
419
428