kramdown 2.1.0 → 2.2.0

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTERS +11 -3
  3. data/VERSION +1 -1
  4. data/lib/kramdown/converter/base.rb +2 -1
  5. data/lib/kramdown/converter/html.rb +22 -14
  6. data/lib/kramdown/converter/kramdown.rb +9 -4
  7. data/lib/kramdown/converter/math_engine/mathjax.rb +7 -33
  8. data/lib/kramdown/converter/syntax_highlighter.rb +1 -1
  9. data/lib/kramdown/element.rb +16 -0
  10. data/lib/kramdown/options.rb +35 -8
  11. data/lib/kramdown/parser/base.rb +3 -1
  12. data/lib/kramdown/parser/html.rb +8 -8
  13. data/lib/kramdown/parser/kramdown.rb +8 -1
  14. data/lib/kramdown/parser/kramdown/autolink.rb +2 -2
  15. data/lib/kramdown/parser/kramdown/codespan.rb +12 -2
  16. data/lib/kramdown/parser/kramdown/emphasis.rb +1 -1
  17. data/lib/kramdown/parser/kramdown/header.rb +1 -1
  18. data/lib/kramdown/parser/kramdown/html.rb +2 -2
  19. data/lib/kramdown/parser/kramdown/list.rb +36 -9
  20. data/lib/kramdown/parser/kramdown/math.rb +1 -1
  21. data/lib/kramdown/parser/kramdown/table.rb +2 -2
  22. data/lib/kramdown/utils/html.rb +7 -0
  23. data/lib/kramdown/version.rb +1 -1
  24. data/man/man1/kramdown.1 +7 -0
  25. data/test/test_files.rb +12 -11
  26. data/test/testcases/block/04_header/atx_header.html +6 -0
  27. data/test/testcases/block/04_header/atx_header.text +6 -0
  28. data/test/testcases/block/09_html/standalone_image_in_div.htmlinput +7 -0
  29. data/test/testcases/block/09_html/standalone_image_in_div.text +8 -0
  30. data/test/testcases/block/12_extension/options.html +4 -4
  31. data/test/testcases/block/12_extension/options2.html +4 -4
  32. data/test/testcases/block/14_table/table_with_footnote.html +4 -4
  33. data/test/testcases/block/15_math/gh_128.html +1 -2
  34. data/test/testcases/block/15_math/normal.html +16 -15
  35. data/test/testcases/block/16_toc/toc_exclude.html +1 -1
  36. data/test/testcases/block/16_toc/toc_levels.html +1 -1
  37. data/test/testcases/block/16_toc/toc_with_footnotes.html +5 -5
  38. data/test/testcases/block/16_toc/toc_with_links.html +1 -1
  39. data/test/testcases/cjk-line-break.html +4 -0
  40. data/test/testcases/cjk-line-break.options +1 -0
  41. data/test/testcases/cjk-line-break.text +12 -0
  42. data/test/testcases/span/02_emphasis/normal.html +4 -0
  43. data/test/testcases/span/02_emphasis/normal.text +4 -0
  44. data/test/testcases/span/04_footnote/backlink_inline.html +21 -21
  45. data/test/testcases/span/04_footnote/backlink_text.html +4 -4
  46. data/test/testcases/span/04_footnote/footnote_nr.html +6 -6
  47. data/test/testcases/span/04_footnote/footnote_prefix.html +6 -6
  48. data/test/testcases/span/04_footnote/inside_footnote.html +9 -9
  49. data/test/testcases/span/04_footnote/markers.html +16 -16
  50. data/test/testcases/span/04_footnote/placement.html +4 -4
  51. data/test/testcases/span/04_footnote/regexp_problem.html +4 -4
  52. data/test/testcases/span/04_footnote/without_backlink.html +3 -3
  53. data/test/testcases/span/abbreviations/in_footnote.html +4 -4
  54. data/test/testcases/span/math/normal.html +4 -4
  55. metadata +22 -13
  56. data/test/testcases/block/15_math/mathjax_preview.html +0 -4
  57. data/test/testcases/block/15_math/mathjax_preview.options +0 -2
  58. data/test/testcases/block/15_math/mathjax_preview.text +0 -5
  59. data/test/testcases/block/15_math/mathjax_preview_as_code.html +0 -4
  60. data/test/testcases/block/15_math/mathjax_preview_as_code.options +0 -3
  61. data/test/testcases/block/15_math/mathjax_preview_as_code.text +0 -5
  62. data/test/testcases/block/15_math/mathjax_preview_simple.html +0 -4
  63. data/test/testcases/block/15_math/mathjax_preview_simple.options +0 -2
  64. data/test/testcases/block/15_math/mathjax_preview_simple.text +0 -5
@@ -79,6 +79,8 @@ module Kramdown
79
79
  @span_parsers = [:emphasis, :codespan, :autolink, :span_html, :footnote_marker, :link,
80
80
  :smart_quotes, :inline_math, :span_extensions, :html_entity,
81
81
  :typographic_syms, :line_break, :escaped_chars]
82
+
83
+ @span_pattern_cache ||= Hash.new { |h, k| h[k] = {} }
82
84
  end
83
85
  private_class_method(:new, :allocate)
84
86
 
@@ -195,6 +197,11 @@ module Kramdown
195
197
  end.flatten!
196
198
  end
197
199
 
200
+ def span_pattern_cache(stop_re, span_start)
201
+ @span_pattern_cache[stop_re][span_start] ||= /(?=#{Regexp.union(stop_re, span_start)})/
202
+ end
203
+ private :span_pattern_cache
204
+
198
205
  # Parse all span-level elements in the source string of @src into +el+.
199
206
  #
200
207
  # If the parameter +stop_re+ (a regexp) is used, parsing is immediately stopped if the regexp
@@ -213,7 +220,7 @@ module Kramdown
213
220
  span_start, span_start_re = span_parser_regexps(parsers) if parsers
214
221
  parsers ||= @span_parsers
215
222
 
216
- used_re = (stop_re.nil? ? span_start_re : /(?=#{Regexp.union(stop_re, span_start)})/)
223
+ used_re = (stop_re.nil? ? span_start_re : span_pattern_cache(stop_re, span_start))
217
224
  stop_re_found = false
218
225
  while !@src.eos? && !stop_re_found
219
226
  if (result = @src.scan_until(used_re))
@@ -11,8 +11,8 @@ module Kramdown
11
11
  module Parser
12
12
  class Kramdown
13
13
 
14
- ACHARS = '[[:alnum:]]_'
15
- AUTOLINK_START_STR = "<((mailto|https?|ftps?):.+?|[-.#{ACHARS}]+@[-#{ACHARS}]+(?:\.[-#{ACHARS}]+)*\.[a-z]+)>"
14
+ ACHARS = '[[:alnum:]]-_.'
15
+ AUTOLINK_START_STR = "<((mailto|https?|ftps?):.+?|[#{ACHARS}]+?@[#{ACHARS}]+?)>"
16
16
  AUTOLINK_START = /#{AUTOLINK_START_STR}/u
17
17
 
18
18
  # Parse the autolink at the current location.
@@ -25,8 +25,18 @@ module Kramdown
25
25
  return
26
26
  end
27
27
 
28
- if (text = @src.scan_until(/#{result}/))
29
- text.sub!(/#{result}\Z/, '')
28
+ # assign static regex to avoid allocating the same on every instance
29
+ # where +result+ equals a single-backtick. Interpolate otherwise.
30
+ if result == '`'
31
+ scan_pattern = /`/
32
+ str_sub_pattern = /`\Z/
33
+ else
34
+ scan_pattern = /#{result}/
35
+ str_sub_pattern = /#{result}\Z/
36
+ end
37
+
38
+ if (text = @src.scan_until(scan_pattern))
39
+ text.sub!(str_sub_pattern, '')
30
40
  unless simple
31
41
  text = text[1..-1] if text[0..0] == ' '
32
42
  text = text[0..-2] if text[-1..-1] == ' '
@@ -22,7 +22,7 @@ module Kramdown
22
22
  element = (result.length == 2 ? :strong : :em)
23
23
  type = result[0..0]
24
24
 
25
- if (type == '_' && @src.pre_match =~ /[[:alpha:]-]\z/) || @src.check(/\s/) ||
25
+ if (type == '_' && @src.pre_match =~ /[[:alpha:]]-?[[:alpha:]]*\z/) || @src.check(/\s/) ||
26
26
  @tree.type == element || @stack.any? {|el, _| el.type == element }
27
27
  add_text(result)
28
28
  return
@@ -31,7 +31,7 @@ module Kramdown
31
31
  def parse_atx_header
32
32
  return false unless after_block_boundary?
33
33
  text, id = parse_header_contents
34
- text.sub!(/[\t ]#+\z/, '') && text.rstrip!
34
+ text.sub!(/(?<!\\)#+\z/, '') && text.rstrip!
35
35
  return false if text.empty?
36
36
  add_header(@src["level"].length, text, id)
37
37
  true
@@ -79,12 +79,12 @@ module Kramdown
79
79
  @src.scan(TRAILING_WHITESPACE)
80
80
  true
81
81
  else
82
- if @src.check(/^#{OPT_SPACE}#{HTML_TAG_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
82
+ if @src.check(/^#{OPT_SPACE}#{HTML_TAG_RE}/o) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
83
83
  @src.pos += @src.matched_size
84
84
  handle_html_start_tag(line, &method(:handle_kramdown_html_tag))
85
85
  Kramdown::Parser::Html::ElementConverter.convert(@root, @tree.children.last) if @options[:html_to_native]
86
86
  true
87
- elsif @src.check(/^#{OPT_SPACE}#{HTML_TAG_CLOSE_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
87
+ elsif @src.check(/^#{OPT_SPACE}#{HTML_TAG_CLOSE_RE}/o) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
88
88
  name = @src[1].downcase
89
89
 
90
90
  if @tree.type == :html_element && @tree.value == name
@@ -44,8 +44,10 @@ module Kramdown
44
44
  [content, indentation, *PARSE_FIRST_LIST_LINE_REGEXP_CACHE[indentation]]
45
45
  end
46
46
 
47
- LIST_START_UL = /^(#{OPT_SPACE}[+*-])([\t| ].*?\n)/
48
- LIST_START_OL = /^(#{OPT_SPACE}\d+\.)([\t| ].*?\n)/
47
+ PATTERN_TAIL = /[\t| ].*?\n/
48
+
49
+ LIST_START_UL = /^(#{OPT_SPACE}[+*-])(#{PATTERN_TAIL})/
50
+ LIST_START_OL = /^(#{OPT_SPACE}\d+\.)(#{PATTERN_TAIL})/
49
51
  LIST_START = /#{LIST_START_UL}|#{LIST_START_OL}/
50
52
 
51
53
  # Parse the ordered or unordered list at the current location.
@@ -77,11 +79,7 @@ module Kramdown
77
79
  ''
78
80
  end
79
81
 
80
- list_start_re = if type == :ul
81
- /^( {0,#{[3, indentation - 1].min}}[+*-])([\t| ].*?\n)/
82
- else
83
- /^( {0,#{[3, indentation - 1].min}}\d+\.)([\t| ].*?\n)/
84
- end
82
+ list_start_re = fetch_pattern(type, indentation)
85
83
  nested_list_found = (item.value =~ LIST_START)
86
84
  last_is_blank = false
87
85
  item.value = [item.value]
@@ -148,7 +146,7 @@ module Kramdown
148
146
  end
149
147
  define_parser(:list, LIST_START)
150
148
 
151
- DEFINITION_LIST_START = /^(#{OPT_SPACE}:)([\t| ].*?\n)/
149
+ DEFINITION_LIST_START = /^(#{OPT_SPACE}:)(#{PATTERN_TAIL})/
152
150
 
153
151
  # Parse the ordered or unordered list at the current location.
154
152
  def parse_definition_list
@@ -198,7 +196,7 @@ module Kramdown
198
196
  ''
199
197
  end
200
198
 
201
- def_start_re = /^( {0,#{[3, indentation - 1].min}}:)([\t| ].*?\n)/
199
+ def_start_re = fetch_pattern(:dl, indentation)
202
200
  first_as_para = false
203
201
  last_is_blank = false
204
202
  elsif @src.check(EOB_MARKER)
@@ -252,6 +250,35 @@ module Kramdown
252
250
  end
253
251
  define_parser(:definition_list, DEFINITION_LIST_START)
254
252
 
253
+ private
254
+
255
+ # precomputed patterns for indentations 1..4 and fallback expression
256
+ # to compute pattern when indentation is outside the 1..4 range.
257
+ def fetch_pattern(type, indentation)
258
+ if type == :ul
259
+ case indentation
260
+ when 1 then %r/^( {0}[+*-])(#{PATTERN_TAIL})/o
261
+ when 2 then %r/^( {0,1}[+*-])(#{PATTERN_TAIL})/o
262
+ when 3 then %r/^( {0,2}[+*-])(#{PATTERN_TAIL})/o
263
+ else %r/^( {0,3}[+*-])(#{PATTERN_TAIL})/o
264
+ end
265
+ elsif type == :ol
266
+ case indentation
267
+ when 1 then %r/^( {0}\d+\.)(#{PATTERN_TAIL})/o
268
+ when 2 then %r/^( {0,1}\d+\.)(#{PATTERN_TAIL})/o
269
+ when 3 then %r/^( {0,2}\d+\.)(#{PATTERN_TAIL})/o
270
+ else %r/^( {0,3}\d+\.)(#{PATTERN_TAIL})/o
271
+ end
272
+ elsif type == :dl
273
+ case indentation
274
+ when 1 then %r/^( {0}:)(#{PATTERN_TAIL})/o
275
+ when 2 then %r/^( {0,1}:)(#{PATTERN_TAIL})/o
276
+ when 3 then %r/^( {0,2}:)(#{PATTERN_TAIL})/o
277
+ else %r/^( {0,3}:)(#{PATTERN_TAIL})/o
278
+ end
279
+ end
280
+ end
281
+
255
282
  end
256
283
  end
257
284
  end
@@ -21,7 +21,7 @@ module Kramdown
21
21
  if !after_block_boundary?
22
22
  return false
23
23
  elsif @src[1]
24
- @src.scan(/^#{OPT_SPACE}\\/) if @src[3]
24
+ @src.scan(/^#{OPT_SPACE}\\/o) if @src[3]
25
25
  return false
26
26
  end
27
27
 
@@ -132,8 +132,8 @@ module Kramdown
132
132
  pipe_on_line = false
133
133
  end
134
134
  else
135
- break if lines.size > 1 && !pipe_on_line && lines.first !~ /^#{TABLE_PIPE_CHECK}/
136
- pipe_on_line = (lines.size > 1 ? false : pipe_on_line) || (lines.last =~ /^#{TABLE_PIPE_CHECK}/)
135
+ break if lines.size > 1 && !pipe_on_line && lines.first !~ /^#{TABLE_PIPE_CHECK}/o
136
+ pipe_on_line = (lines.size > 1 ? false : pipe_on_line) || (lines.last =~ /^#{TABLE_PIPE_CHECK}/o)
137
137
  end
138
138
  end
139
139
  @src.revert_pos(saved_pos) and return false unless pipe_on_line
@@ -68,6 +68,13 @@ module Kramdown
68
68
  str.gsub(ESCAPE_RE_FROM_TYPE[type]) {|m| ESCAPE_MAP[m] || m }
69
69
  end
70
70
 
71
+ REDUNDANT_LINE_BREAK_REGEX = /([\p{Han}\p{Hiragana}\p{Katakana}]+)\n([\p{Han}\p{Hiragana}\p{Katakana}]+)/u
72
+ def fix_cjk_line_break(str)
73
+ while str.gsub!(REDUNDANT_LINE_BREAK_REGEX, '\1\2')
74
+ end
75
+ str
76
+ end
77
+
71
78
  end
72
79
 
73
80
  end
@@ -10,6 +10,6 @@
10
10
  module Kramdown
11
11
 
12
12
  # The kramdown version.
13
- VERSION = '2.1.0'
13
+ VERSION = '2.2.0'
14
14
 
15
15
  end
@@ -214,6 +214,13 @@ If this option is \fBtrue\fP, the RemoveHtmlTags converter removes block HTML ta
214
214
  Default: true Used by: RemoveHtmlTags converter
215
215
  .RE
216
216
  .TP
217
+ \fB\-\-[no\-]remove\-line\-breaks\-for\-cjk\fP
218
+ Specifies whether line breaks should be removed between CJK characters
219
+ .RS
220
+ .P
221
+ Default: false Used by: HTML converter
222
+ .RE
223
+ .TP
217
224
  \fB\-\-[no\-]remove\-span\-html\-tags\fP
218
225
  Remove span HTML tags
219
226
  .RS
@@ -11,6 +11,7 @@ require 'minitest/autorun'
11
11
  require 'kramdown'
12
12
  require 'yaml'
13
13
  require 'tmpdir'
14
+ require 'open3'
14
15
 
15
16
  begin
16
17
  require 'kramdown/converter/syntax_highlighter/rouge'
@@ -111,14 +112,10 @@ class TestFiles < Minitest::Test
111
112
  end
112
113
 
113
114
  def tidy_output(out)
114
- cmd = "tidy -q --doctype omit #{RUBY_VERSION >= '1.9' ? '-utf8' : '-raw'} 2>/dev/null"
115
- result = IO.popen(cmd, 'r+') do |io|
116
- io.write(out)
117
- io.close_write
118
- io.read
119
- end
120
- if $?.exitstatus == 2
121
- raise "Problem using tidy"
115
+ cmd = "tidy -q --doctype omit -utf8"
116
+ result, error, status = Open3.capture3(cmd, stdin_data: out)
117
+ if status.exitstatus == 2
118
+ raise "Problem using tidy: #{error}"
122
119
  end
123
120
  result
124
121
  end
@@ -136,6 +133,7 @@ class TestFiles < Minitest::Test
136
133
  'test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text',
137
134
  'test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text',
138
135
  'test/testcases/block/03_paragraph/standalone_image.text', # bc of standalone image
136
+ 'test/testcases/cjk-line-break.text', # latex unicode support
139
137
  ].compact
140
138
  Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file|
141
139
  next if EXCLUDE_LATEX_FILES.any? {|f| text_file =~ /#{f}$/ }
@@ -180,6 +178,8 @@ class TestFiles < Minitest::Test
180
178
  'test/testcases/block/09_html/xml.text', # bc of tidy
181
179
  'test/testcases/span/05_html/xml.text', # bc of tidy
182
180
  'test/testcases/block/03_paragraph/standalone_image.text', # bc of standalone image
181
+ 'test/testcases/cjk-line-break.text',
182
+ 'test/testcases/block/09_html/standalone_image_in_div.html', # bc of standalone image
183
183
  ].compact
184
184
  Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file|
185
185
  next if EXCLUDE_TEXT_FILES.any? {|f| text_file =~ /#{f}$/ }
@@ -222,14 +222,15 @@ class TestFiles < Minitest::Test
222
222
  'test/testcases/block/16_toc/toc_exclude.html', # bc of different attribute ordering
223
223
  'test/testcases/span/autolinks/url_links.html', # bc of quot entity being converted to char
224
224
  'test/testcases/block/14_table/empty_tag_in_cell.html', # bc of tidy
225
- 'test/testcases/block/15_math/mathjax_preview.html', # bc of mathjax preview
226
- 'test/testcases/block/15_math/mathjax_preview_simple.html', # bc of mathjax preview
227
- 'test/testcases/block/15_math/mathjax_preview_as_code.html', # bc of mathjax preview
228
225
  'test/testcases/span/01_link/link_defs_with_ial.html', # bc of attribute ordering
229
226
  'test/testcases/span/05_html/mark_element.html', # bc of tidy
230
227
  'test/testcases/block/09_html/xml.html', # bc of tidy
231
228
  'test/testcases/span/05_html/xml.html', # bc of tidy
232
229
  'test/testcases/block/03_paragraph/standalone_image.html', # bc of standalone image
230
+ 'test/testcases/block/15_math/normal.html', # bc of mathjax and HTML parser
231
+ 'test/testcases/block/15_math/gh_128.html', # bc of mathjax and HTML parser
232
+ 'test/testcases/span/04_footnote/backlink_inline.html', # bc of mathjax
233
+ 'test/testcases/block/09_html/standalone_image_in_div.html', # bc of standalone image
233
234
  ].compact
234
235
  Dir[File.dirname(__FILE__) + '/testcases/**/*.html'].each do |html_file|
235
236
  next if EXCLUDE_HTML_KD_FILES.any? {|f| html_file =~ /#{f}$/ }
@@ -26,6 +26,12 @@
26
26
  ### not a header</p>
27
27
  </blockquote>
28
28
 
29
+ <h1>header</h1>
30
+
31
+ <h1>header</h1>
32
+
33
+ <h1>header</h1>
34
+
29
35
  <h1>header #</h1>
30
36
 
31
37
  <h1>header</h1>
@@ -23,6 +23,12 @@ paragraph
23
23
  > blockquote
24
24
  ### not a header
25
25
 
26
+ # header #
27
+
28
+ # header#
29
+
30
+ #header#
31
+
26
32
  # header \#
27
33
 
28
34
  # header
@@ -0,0 +1,7 @@
1
+ <div class="example-1">
2
+ <img src="src.png" alt="inside" />
3
+ </div>
4
+
5
+ <div class="example-2">
6
+ <a href="website.html">text</a>
7
+ </div>
@@ -0,0 +1,8 @@
1
+ <div class="example-1" markdown="1">
2
+ ![inside](src.png)
3
+ </div>
4
+
5
+ <div class="example-2" markdown="1">
6
+ [text](website.html)
7
+ </div>
8
+
@@ -10,12 +10,12 @@ some <span>*para*</span>
10
10
  <p>some <span><em>para</em></span></p>
11
11
  </div>
12
12
 
13
- <p>Some text<sup id="fnref:ab"><a href="#fn:ab" class="footnote">10</a></sup>.</p>
13
+ <p>Some text<sup id="fnref:ab" role="doc-noteref"><a href="#fn:ab" class="footnote">10</a></sup>.</p>
14
14
 
15
- <div class="footnotes">
15
+ <div class="footnotes" role="doc-endnotes">
16
16
  <ol start="10">
17
- <li id="fn:ab">
18
- <p>Some text. <a href="#fnref:ab" class="reversefootnote">&#8617;</a></p>
17
+ <li id="fn:ab" role="doc-endnote">
18
+ <p>Some text. <a href="#fnref:ab" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
19
19
  </li>
20
20
  </ol>
21
21
  </div>
@@ -1,10 +1,10 @@
1
1
 
2
- <p>Some text<sup id="fnref:ab"><a href="#fn:ab" class="footnote">1</a></sup>.</p>
2
+ <p>Some text<sup id="fnref:ab" role="doc-noteref"><a href="#fn:ab" class="footnote">1</a></sup>.</p>
3
3
 
4
- <div class="footnotes">
4
+ <div class="footnotes" role="doc-endnotes">
5
5
  <ol>
6
- <li id="fn:ab">
7
- <p>Some text. <a href="#fnref:ab" class="reversefootnote">&#8617;</a></p>
6
+ <li id="fn:ab" role="doc-endnote">
7
+ <p>Some text. <a href="#fnref:ab" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
8
8
  </li>
9
9
  </ol>
10
10
  </div>
@@ -1,7 +1,7 @@
1
1
  <table>
2
2
  <tbody>
3
3
  <tr>
4
- <td>this is <sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup></td>
4
+ <td>this is <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote">1</a></sup></td>
5
5
  <td>a table</td>
6
6
  </tr>
7
7
  <tr>
@@ -11,15 +11,15 @@
11
11
  </tbody>
12
12
  </table>
13
13
 
14
- <div class="footnotes">
14
+ <div class="footnotes" role="doc-endnotes">
15
15
  <ol>
16
- <li id="fn:1">
16
+ <li id="fn:1" role="doc-endnote">
17
17
  <p>Something</p>
18
18
 
19
19
  <blockquote>
20
20
  <p>special here</p>
21
21
  </blockquote>
22
- <p><a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
22
+ <p><a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
23
23
  </li>
24
24
  </ol>
25
25
  </div>
@@ -1,2 +1 @@
1
- <script type="math/tex; mode=display">% <![CDATA[
2
- alert('a') alert('b<') %]]></script>
1
+ \[&lt;script&gt;alert('a')&lt;/script&gt; &lt;script&gt;alert('b&lt;')&lt;/script&gt;\]
@@ -1,29 +1,30 @@
1
1
  <p>This is a para.
2
- <script type="math/tex">\text{LaTeX} \lambda_5</script></p>
2
+ \(\text{LaTeX} \lambda_5\)</p>
3
3
 
4
- <script type="math/tex; mode=display">\lambda_5 = \alpha + 4</script>
4
+ \[\lambda_5 = \alpha + 4\]
5
5
 
6
- <p><script type="math/tex">\lambda_\alpha > 5</script>
6
+ <p>\(\lambda_\alpha &gt; 5\)
7
7
  This is a para.</p>
8
8
 
9
- <script type="math/tex; mode=display">% <![CDATA[
10
- \begin{align*}
11
- &=5 \\
12
- &=6 \\
13
- \end{align*} %]]></script>
9
+ \[\begin{align*}
10
+ &amp;=5 \\
11
+ &amp;=6 \\
12
+ \end{align*}\]
14
13
 
15
- <script type="math/tex; mode=display">5+5</script>
14
+ \[5+5\]
16
15
 
17
- <script type="math/tex; mode=display">5+5</script>
16
+ \[5+5\]
18
17
 
19
- <script type="math/tex; mode=display">5+5</script>
18
+ \[5+5\]
20
19
 
21
- <script type="math/tex; mode=display">5+5</script>
20
+ \[5+5\]
22
21
 
23
22
  <pre><code>$$5+5$$
24
23
  </code></pre>
25
24
 
26
- <script type="math/tex; mode=display">5+5</script>
27
- <script type="math/tex; mode=display">5+5</script>
25
+ <div class="cls">\[5+5\]
26
+ </div>
27
+ <div class="cls">\[5+5\]
28
+ </div>
28
29
 
29
- <script type="math/tex; mode=display">|x| = 5</script>
30
+ \[|x| = 5\]