qiita-markdown 0.44.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +2 -2
  3. data/.rubocop.yml +0 -4
  4. data/.rubocop_todo.yml +15 -239
  5. data/CHANGELOG.md +15 -0
  6. data/README.md +5 -3
  7. data/lib/qiita/markdown/filters/checkbox.rb +5 -1
  8. data/lib/qiita/markdown/filters/code_block.rb +13 -13
  9. data/lib/qiita/markdown/filters/custom_block.rb +8 -6
  10. data/lib/qiita/markdown/filters/external_link.rb +2 -0
  11. data/lib/qiita/markdown/filters/final_sanitizer.rb +126 -120
  12. data/lib/qiita/markdown/filters/footnote.rb +2 -0
  13. data/lib/qiita/markdown/filters/group_mention.rb +2 -2
  14. data/lib/qiita/markdown/filters/heading_anchor.rb +44 -0
  15. data/lib/qiita/markdown/filters/html_toc.rb +67 -0
  16. data/lib/qiita/markdown/filters/image_link.rb +6 -6
  17. data/lib/qiita/markdown/filters/inline_code_color.rb +8 -8
  18. data/lib/qiita/markdown/filters/mention.rb +11 -9
  19. data/lib/qiita/markdown/filters/qiita_marker.rb +55 -0
  20. data/lib/qiita/markdown/filters/simplify.rb +1 -0
  21. data/lib/qiita/markdown/filters/syntax_highlight.rb +4 -4
  22. data/lib/qiita/markdown/filters/truncate.rb +1 -3
  23. data/lib/qiita/markdown/filters/user_input_sanitizer.rb +34 -29
  24. data/lib/qiita/markdown/processor.rb +2 -1
  25. data/lib/qiita/markdown/summary_processor.rb +1 -1
  26. data/lib/qiita/markdown/transformers/filter_attributes.rb +1 -0
  27. data/lib/qiita/markdown/transformers/filter_iframe.rb +1 -2
  28. data/lib/qiita/markdown/transformers/filter_script.rb +1 -1
  29. data/lib/qiita/markdown/transformers/strip_invalid_node.rb +1 -3
  30. data/lib/qiita/markdown/version.rb +1 -1
  31. data/lib/qiita/markdown.rb +4 -5
  32. data/qiita-markdown.gemspec +7 -8
  33. data/spec/qiita/markdown/filters/checkbox_spec.rb +28 -0
  34. data/spec/qiita/markdown/filters/heading_anchor_spec.rb +73 -0
  35. data/spec/qiita/markdown/filters/html_toc_spec.rb +223 -0
  36. data/spec/qiita/markdown/filters/qiita_marker_spec.rb +60 -0
  37. data/spec/qiita/markdown/processor_spec.rb +64 -70
  38. data/spec/qiita/markdown/summary_processor_spec.rb +4 -4
  39. metadata +80 -102
  40. data/benchmark/heading_anchor_rendering.rb +0 -248
  41. data/benchmark/sample.md +0 -317
  42. data/lib/qiita/markdown/filters/greenmat.rb +0 -38
  43. data/lib/qiita/markdown/greenmat/heading_rendering.rb +0 -61
  44. data/lib/qiita/markdown/greenmat/html_renderer.rb +0 -60
  45. data/lib/qiita/markdown/greenmat/html_toc_renderer.rb +0 -78
  46. data/spec/qiita/markdown/filters/greenmat_spec.rb +0 -15
  47. data/spec/qiita/markdown/greenmat/html_toc_renderer_spec.rb +0 -156
@@ -1,36 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Qiita
2
4
  module Markdown
3
5
  module Filters
4
6
  # Sanitizes user input if :strict context is given.
5
- class UserInputSanitizer < HTML::Pipeline::Filter
7
+ class UserInputSanitizer < ::HTML::Pipeline::Filter
6
8
  RULE = {
7
9
  elements: %w[
8
- a b blockquote br code dd del details div dl dt em font h1 h2 h3 h4 h5 h6
9
- hr i img ins kbd li ol p pre q rp rt ruby s samp script iframe strike strong sub
10
+ a b blockquote br caption code dd del details div dl dt em font h1 h2 h3 h4 h5 h6
11
+ hr i img ins kbd li ol p pre q rp rt ruby s samp script iframe section strike strong sub
10
12
  summary sup table tbody td tfoot th thead tr ul var
11
13
  ],
12
14
  attributes: {
13
- "a" => %w[class href rel title],
15
+ "a" => %w[class href rel title id],
14
16
  "blockquote" => %w[cite] + Embed::Tweet::ATTRIBUTES,
15
- "code" => %w[data-metadata],
16
- "div" => %w[class data-type data-metadata],
17
- "font" => %w[color],
18
- "h1" => %w[id],
19
- "h2" => %w[id],
20
- "h3" => %w[id],
21
- "h4" => %w[id],
22
- "h5" => %w[id],
23
- "h6" => %w[id],
24
- "img" => %w[alt height src title width],
25
- "ins" => %w[cite datetime],
26
- "li" => %w[id],
27
- "p" => Embed::CodePen::ATTRIBUTES,
28
- "q" => %w[cite],
29
- "script" => %w[async src id].concat(Embed::SpeekerDeck::ATTRIBUTES, Embed::Docswell::ATTRIBUTES),
30
- "iframe" => %w[
17
+ "code" => %w[data-metadata],
18
+ "div" => %w[class data-type data-metadata],
19
+ "font" => %w[color],
20
+ "h1" => %w[id],
21
+ "h2" => %w[id],
22
+ "h3" => %w[id],
23
+ "h4" => %w[id],
24
+ "h5" => %w[id],
25
+ "h6" => %w[id],
26
+ "img" => %w[alt height src title width],
27
+ "ins" => %w[cite datetime],
28
+ "li" => %w[id],
29
+ "p" => Embed::CodePen::ATTRIBUTES,
30
+ "q" => %w[cite],
31
+ "section" => %w[class],
32
+ "script" => %w[async src id].concat(
33
+ Embed::SpeekerDeck::ATTRIBUTES,
34
+ Embed::Docswell::ATTRIBUTES,
35
+ ),
36
+ "iframe" => %w[
31
37
  allowfullscreen
32
38
  frameborder
33
39
  height
40
+ loading
34
41
  marginheight
35
42
  marginwidth
36
43
  scrolling
@@ -38,20 +45,18 @@ module Qiita
38
45
  style
39
46
  width
40
47
  ],
41
- "sup" => %w[id],
42
- "td" => %w[colspan rowspan style],
43
- "th" => %w[colspan rowspan style],
48
+ "sup" => %w[id],
49
+ "td" => %w[colspan rowspan style],
50
+ "th" => %w[colspan rowspan style],
51
+ all: %w[data-sourcepos],
44
52
  },
45
53
  protocols: {
46
- "a" => { "href" => ["http", "https", "mailto", :relative] },
54
+ "a" => { "href" => ["http", "https", "mailto", :relative] },
47
55
  "blockquote" => { "cite" => ["http", "https", :relative] },
48
- "q" => { "cite" => ["http", "https", :relative] },
56
+ "q" => { "cite" => ["http", "https", :relative] },
49
57
  },
50
58
  css: {
51
- properties: %w[
52
- text-align
53
- border
54
- ],
59
+ properties: %w[text-align border],
55
60
  },
56
61
  transformers: [
57
62
  Transformers::FilterAttributes,
@@ -9,7 +9,8 @@ module Qiita
9
9
 
10
10
  def self.default_filters
11
11
  [
12
- Filters::Greenmat,
12
+ Filters::QiitaMarker,
13
+ Filters::HeadingAnchor,
13
14
  Filters::UserInputSanitizer,
14
15
  Filters::ImageLink,
15
16
  Filters::Footnote,
@@ -15,7 +15,7 @@ module Qiita
15
15
 
16
16
  def self.default_filters
17
17
  [
18
- Filters::Greenmat,
18
+ Filters::QiitaMarker,
19
19
  Filters::UserInputSanitizer,
20
20
  Filters::Simplify,
21
21
  Filters::Emoji,
@@ -37,6 +37,7 @@ module Qiita
37
37
 
38
38
  def transform
39
39
  return unless FILTERS.key?(name)
40
+
40
41
  FILTERS[name].each_pair do |attr, pattern|
41
42
  filter_attribute(attr, pattern) if node.attributes.key?(attr)
42
43
  end
@@ -2,8 +2,7 @@ module Qiita
2
2
  module Markdown
3
3
  module Transformers
4
4
  class FilterIframe
5
- URL_WHITE_LIST = [
6
- ].flatten.freeze
5
+ URL_WHITE_LIST = [].flatten.freeze
7
6
 
8
7
  HOST_WHITE_LIST = [
9
8
  Embed::Youtube::SCRIPT_HOSTS,
@@ -45,7 +45,7 @@ module Qiita
45
45
  def host_of(url)
46
46
  if url
47
47
  scheme = URI.parse(url).scheme
48
- Addressable::URI.parse(url).host if ["http", "https"].include? scheme
48
+ Addressable::URI.parse(url).host if %w[http https].include? scheme
49
49
  end
50
50
  rescue Addressable::URI::InvalidURIError, URI::InvalidURIError
51
51
  nil
@@ -12,9 +12,7 @@ module Qiita
12
12
  end
13
13
 
14
14
  def transform
15
- if has_invalid_list_node? || has_invalid_table_node?
16
- node.replace(node.children)
17
- end
15
+ node.replace(node.children) if has_invalid_list_node? || has_invalid_table_node?
18
16
  end
19
17
 
20
18
  private
@@ -1,5 +1,5 @@
1
1
  module Qiita
2
2
  module Markdown
3
- VERSION = "0.44.0"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -1,9 +1,9 @@
1
1
  require "cgi"
2
- require "greenmat"
3
2
  require "html/pipeline"
4
3
  require "linguist"
5
4
  require "mem"
6
5
  require "nokogiri"
6
+ require "qiita_marker"
7
7
  require "rouge"
8
8
  require "sanitize"
9
9
 
@@ -27,19 +27,18 @@ require "qiita/markdown/filters/emoji"
27
27
  require "qiita/markdown/filters/external_link"
28
28
  require "qiita/markdown/filters/final_sanitizer"
29
29
  require "qiita/markdown/filters/footnote"
30
- require "qiita/markdown/filters/greenmat"
31
30
  require "qiita/markdown/filters/group_mention"
31
+ require "qiita/markdown/filters/heading_anchor"
32
+ require "qiita/markdown/filters/html_toc"
32
33
  require "qiita/markdown/filters/image_link"
33
34
  require "qiita/markdown/filters/inline_code_color"
34
35
  require "qiita/markdown/filters/mention"
36
+ require "qiita/markdown/filters/qiita_marker"
35
37
  require "qiita/markdown/filters/simplify"
36
38
  require "qiita/markdown/filters/syntax_highlight"
37
39
  require "qiita/markdown/filters/toc"
38
40
  require "qiita/markdown/filters/truncate"
39
41
  require "qiita/markdown/filters/user_input_sanitizer"
40
- require "qiita/markdown/greenmat/heading_rendering"
41
- require "qiita/markdown/greenmat/html_renderer"
42
- require "qiita/markdown/greenmat/html_toc_renderer"
43
42
  require "qiita/markdown/base_processor"
44
43
  require "qiita/markdown/processor"
45
44
  require "qiita/markdown/summary_processor"
@@ -1,4 +1,4 @@
1
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path("lib", __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require "qiita/markdown/version"
4
4
 
@@ -13,26 +13,25 @@ Gem::Specification.new do |spec|
13
13
 
14
14
  spec.files = `git ls-files -z`.split("\x0")
15
15
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
16
  spec.require_paths = ["lib"]
18
17
 
19
- spec.required_ruby_version = ">= 2.6.0"
18
+ spec.required_ruby_version = ">= 2.7.0"
20
19
 
20
+ spec.add_dependency "addressable"
21
21
  spec.add_dependency "gemoji"
22
22
  spec.add_dependency "github-linguist", "~> 4.0"
23
23
  spec.add_dependency "html-pipeline", "~> 2.0"
24
24
  spec.add_dependency "mem"
25
25
  spec.add_dependency "rouge", "3.26.0"
26
- spec.add_dependency "greenmat", "3.5.1.4"
27
26
  spec.add_dependency "sanitize"
28
- spec.add_dependency "addressable"
29
27
  spec.add_development_dependency "activesupport", "~> 5.2.7"
30
- spec.add_development_dependency "benchmark-ips", "~> 1.2"
31
28
  spec.add_development_dependency "bundler"
32
29
  spec.add_development_dependency "codeclimate-test-reporter", "0.4.4"
33
- spec.add_development_dependency "simplecov", "!= 0.18.0", "!= 0.18.1", "!= 0.18.2", "!= 0.18.3", "!= 0.18.4", "!= 0.18.5", "!= 0.19.0", "!= 0.19.1"
34
30
  spec.add_development_dependency "pry"
31
+ spec.add_development_dependency "qiita_marker", "~> 0.23.6"
35
32
  spec.add_development_dependency "rake", "~> 10.0"
36
33
  spec.add_development_dependency "rspec", "~> 3.1"
37
- spec.add_development_dependency "rubocop", "~> 1.27.0"
34
+ spec.add_development_dependency "rubocop", "~> 1.39.0"
35
+ spec.add_development_dependency "simplecov", "!= 0.18.0", "!= 0.18.1", "!= 0.18.2", "!= 0.18.3", "!= 0.18.4", "!= 0.18.5", "!= 0.19.0", "!= 0.19.1"
36
+ spec.metadata["rubygems_mfa_required"] = "true"
38
37
  end
@@ -26,6 +26,34 @@ describe Qiita::Markdown::Filters::Checkbox do
26
26
  expect(filter.call.to_s).to eq(output_html)
27
27
  end
28
28
 
29
+ context "when list is loose" do
30
+ let(:input_html) do
31
+ <<~HTML
32
+ <li>
33
+ <p>[ ] a</p>
34
+ </li>
35
+ <li>
36
+ <p>[x] b</p>
37
+ </li>
38
+ HTML
39
+ end
40
+
41
+ let(:output_html) do
42
+ <<~HTML
43
+ <li class="task-list-item">
44
+ <p><input type="checkbox" class="task-list-item-checkbox" disabled>a</p>
45
+ </li>
46
+ <li class="task-list-item">
47
+ <p><input type="checkbox" class="task-list-item-checkbox" checked disabled>b</p>
48
+ </li>
49
+ HTML
50
+ end
51
+
52
+ it "replaces checkboxes" do
53
+ expect(filter.call.to_s).to eq(output_html)
54
+ end
55
+ end
56
+
29
57
  context "when input html has many spaces after checkbox mark" do
30
58
  let(:input_html) do
31
59
  <<~HTML
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Qiita::Markdown::Filters::HeadingAnchor do
4
+ subject(:filter) { described_class.new(html) }
5
+
6
+ let(:html) do
7
+ <<~HTML
8
+ <h1>foo</h1>
9
+ <h2>bar</h2>
10
+ <h3>fizz</h3>
11
+ <p>paragraph</p>
12
+ <h4>buzz</h4>
13
+ <h5>hoge</h5>
14
+ <h6>fuga</h6>
15
+ <code>code</code>
16
+ HTML
17
+ end
18
+
19
+ it "renders ids" do
20
+ expect(filter.call.to_s).to eq(<<~HTML)
21
+ <h1 id="foo">foo</h1>
22
+ <h2 id="bar">bar</h2>
23
+ <h3 id="fizz">fizz</h3>
24
+ <p>paragraph</p>
25
+ <h4 id="buzz">buzz</h4>
26
+ <h5 id="hoge">hoge</h5>
27
+ <h6 id="fuga">fuga</h6>
28
+ <code>code</code>
29
+ HTML
30
+ end
31
+
32
+ context "with headings text is same" do
33
+ let(:html) do
34
+ <<~HTML
35
+ <h1>foo</h1>
36
+ <h2>foo</h2>
37
+ <h3>foo</h3>
38
+ <p>paragraph</p>
39
+ <h4>foo</h4>
40
+ <h5>foo</h5>
41
+ <h6>foo</h6>
42
+ <code>code</code>
43
+ HTML
44
+ end
45
+
46
+ it "renders suffixed ids" do
47
+ expect(filter.call.to_s).to eq(<<~HTML)
48
+ <h1 id="foo">foo</h1>
49
+ <h2 id="foo-1">foo</h2>
50
+ <h3 id="foo-2">foo</h3>
51
+ <p>paragraph</p>
52
+ <h4 id="foo-3">foo</h4>
53
+ <h5 id="foo-4">foo</h5>
54
+ <h6 id="foo-5">foo</h6>
55
+ <code>code</code>
56
+ HTML
57
+ end
58
+ end
59
+
60
+ context "with characters that cannot included" do
61
+ let(:html) do
62
+ <<~HTML
63
+ <h1>test [foo-bar]</h1>
64
+ HTML
65
+ end
66
+
67
+ it "renders id with omitted characters" do
68
+ expect(filter.call.to_s).to eq(<<~HTML)
69
+ <h1 id="test-foo-bar">test [foo-bar]</h1>
70
+ HTML
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Qiita::Markdown::Filters::HtmlToc do
4
+ subject(:filter) { described_class.new(html) }
5
+
6
+ context "with headings h1, h2, h3, h4, h5, h6" do
7
+ let(:html) do
8
+ <<~HTML
9
+ <h1 id="foo">foo</h1>
10
+ <h2 id="bar">bar</h2>
11
+ <h3 id="fizz">fizz</h3>
12
+ <p>paragraph</p>
13
+ <h4 id="buzz">buzz</h4>
14
+ <h5 id="hoge">hoge</h5>
15
+ <h6 id="fuga">fuga</h6>
16
+ <code>code</code>
17
+ HTML
18
+ end
19
+
20
+ let(:result) do
21
+ <<~HTML
22
+ <ul>
23
+ <li>
24
+ <a href="#foo">foo</a>
25
+ <ul>
26
+ <li>
27
+ <a href="#bar">bar</a>
28
+ <ul>
29
+ <li>
30
+ <a href="#fizz">fizz</a>
31
+ <ul>
32
+ <li>
33
+ <a href="#buzz">buzz</a>
34
+ <ul>
35
+ <li>
36
+ <a href="#hoge">hoge</a>
37
+ <ul>
38
+ <li>
39
+ <a href="#fuga">fuga</a>
40
+ </li>
41
+ </ul>
42
+ </li>
43
+ </ul>
44
+ </li>
45
+ </ul>
46
+ </li>
47
+ </ul>
48
+ </li>
49
+ </ul>
50
+ </li>
51
+ </ul>
52
+ HTML
53
+ end
54
+
55
+ it "renders nested toc" do
56
+ expect(filter.call).to eq(result)
57
+ end
58
+ end
59
+
60
+ context "headings are same rank" do
61
+ let(:html) do
62
+ <<~HTML
63
+ <h1 id="foo">foo</h1>
64
+ <h1 id="bar">bar</h1>
65
+ <h1 id="fizz">fizz</h1>
66
+ HTML
67
+ end
68
+
69
+ let(:result) do
70
+ <<~HTML
71
+ <ul>
72
+ <li>
73
+ <a href="#foo">foo</a>
74
+ </li>
75
+ <li>
76
+ <a href="#bar">bar</a>
77
+ </li>
78
+ <li>
79
+ <a href="#fizz">fizz</a>
80
+ </li>
81
+ </ul>
82
+ HTML
83
+ end
84
+
85
+ it "renders toc of same level" do
86
+ expect(filter.call).to eq(result)
87
+ end
88
+ end
89
+
90
+ context "with heading rank going up" do
91
+ let(:html) do
92
+ <<~HTML
93
+ <h1 id="foo">foo</h1>
94
+ <h3 id="bar">bar</h3>
95
+ <h1 id="bazz">bazz</h1>
96
+ HTML
97
+ end
98
+
99
+ let(:result) do
100
+ <<~HTML
101
+ <ul>
102
+ <li>
103
+ <a href="#foo">foo</a>
104
+ <ul>
105
+ <li>
106
+ <ul>
107
+ <li>
108
+ <a href="#bar">bar</a>
109
+ </li>
110
+ </ul>
111
+ </li>
112
+ </ul>
113
+ </li>
114
+ <li>
115
+ <a href="#bazz">bazz</a>
116
+ </li>
117
+ </ul>
118
+ HTML
119
+ end
120
+
121
+ it "renders toc that the depth goes up" do
122
+ expect(filter.call).to eq(result)
123
+ end
124
+ end
125
+
126
+ context "with starting from h2" do
127
+ let(:html) do
128
+ <<~HTML
129
+ <h2 id="bar">bar</h2>
130
+ <h3 id="fizz">fizz</h3>
131
+ HTML
132
+ end
133
+
134
+ let(:result) do
135
+ <<~HTML
136
+ <ul>
137
+ <li>
138
+ <a href="#bar">bar</a>
139
+ <ul>
140
+ <li>
141
+ <a href="#fizz">fizz</a>
142
+ </li>
143
+ </ul>
144
+ </li>
145
+ </ul>
146
+ HTML
147
+ end
148
+
149
+ it "renders h2 as top level" do
150
+ expect(filter.call).to eq(result)
151
+ end
152
+ end
153
+
154
+ context "with some heading rank is higher than first heading" do
155
+ let(:html) do
156
+ <<~HTML
157
+ <h2 id="foo">foo</h2>
158
+ <h3 id="bar">bar</h3>
159
+ <h1 id="fizz">fizz</h1>
160
+ <h2 id="bazz">bazz</h2>
161
+ HTML
162
+ end
163
+
164
+ let(:result) do
165
+ <<~HTML
166
+ <ul>
167
+ <li>
168
+ <a href="#foo">foo</a>
169
+ <ul>
170
+ <li>
171
+ <a href="#bar">bar</a>
172
+ </li>
173
+ </ul>
174
+ </li>
175
+ <li>
176
+ <a href="#fizz">fizz</a>
177
+ </li>
178
+ <li>
179
+ <a href="#bazz">bazz</a>
180
+ </li>
181
+ </ul>
182
+ HTML
183
+ end
184
+
185
+ it "renders higher rank headings at the same level as the first heading" do
186
+ expect(filter.call).to eq(result)
187
+ end
188
+ end
189
+
190
+ context "with include html tag" do
191
+ let(:html) do
192
+ <<~HTML
193
+ <h2 id="foo"><strong>foo</strong></h2>
194
+ HTML
195
+ end
196
+
197
+ let(:result) do
198
+ <<~HTML
199
+ <ul>
200
+ <li>
201
+ <a href="#foo">foo</a>
202
+ </li>
203
+ </ul>
204
+ HTML
205
+ end
206
+
207
+ it "anchor text does not include html tag" do
208
+ expect(filter.call).to eq(result)
209
+ end
210
+ end
211
+
212
+ context "without headings" do
213
+ let(:html) do
214
+ <<~HTML
215
+ <p>paragraph</p>
216
+ HTML
217
+ end
218
+
219
+ it "renders empty string" do
220
+ expect(filter.call.to_s).to eq("")
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Qiita::Markdown::Filters::QiitaMarker do
4
+ subject(:filter) { described_class.new(markdown, context) }
5
+
6
+ let(:context) { nil }
7
+
8
+ context "with footnotes" do
9
+ let(:markdown) do
10
+ <<~MD
11
+ foo [^1]
12
+ [^1]: bar
13
+ MD
14
+ end
15
+
16
+ it "renders footnotes" do
17
+ expect(filter.call.to_s).to include('class="footnotes"')
18
+ end
19
+
20
+ context "and disable footnotes option" do
21
+ let(:context) do
22
+ {
23
+ markdown: {
24
+ footnotes: false,
25
+ },
26
+ }
27
+ end
28
+
29
+ it "does not render footnotes" do
30
+ expect(filter.call.to_s).not_to include('class="footnotes"')
31
+ end
32
+ end
33
+ end
34
+
35
+ context "with sourcepos" do
36
+ let(:markdown) do
37
+ <<~MD
38
+ foo bar
39
+ MD
40
+ end
41
+
42
+ it "does not render HTML containing data-sourcepos" do
43
+ expect(filter.call.to_s).not_to include("data-sourcepos")
44
+ end
45
+
46
+ context "and enable sourcepos option" do
47
+ let(:context) do
48
+ {
49
+ markdown: {
50
+ sourcepos: true,
51
+ },
52
+ }
53
+ end
54
+
55
+ it "renders HTML containing data-sourcepos" do
56
+ expect(filter.call.to_s).to include("data-sourcepos")
57
+ end
58
+ end
59
+ end
60
+ end