qiita-markdown 0.44.0 → 0.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +14 -200
- data/CHANGELOG.md +5 -0
- data/README.md +2 -2
- data/benchmark/heading_anchor_rendering.rb +1 -1
- data/lib/qiita/markdown/filters/code_block.rb +13 -13
- data/lib/qiita/markdown/filters/custom_block.rb +1 -0
- data/lib/qiita/markdown/filters/external_link.rb +2 -0
- data/lib/qiita/markdown/filters/final_sanitizer.rb +118 -118
- data/lib/qiita/markdown/filters/footnote.rb +2 -0
- data/lib/qiita/markdown/filters/group_mention.rb +2 -2
- data/lib/qiita/markdown/filters/image_link.rb +6 -6
- data/lib/qiita/markdown/filters/inline_code_color.rb +8 -8
- data/lib/qiita/markdown/filters/mention.rb +11 -9
- data/lib/qiita/markdown/filters/simplify.rb +1 -0
- data/lib/qiita/markdown/filters/syntax_highlight.rb +4 -4
- data/lib/qiita/markdown/filters/truncate.rb +1 -3
- data/lib/qiita/markdown/filters/user_input_sanitizer.rb +22 -22
- data/lib/qiita/markdown/greenmat/heading_rendering.rb +2 -2
- data/lib/qiita/markdown/greenmat/html_toc_renderer.rb +1 -1
- data/lib/qiita/markdown/transformers/filter_attributes.rb +1 -0
- data/lib/qiita/markdown/transformers/filter_iframe.rb +1 -2
- data/lib/qiita/markdown/transformers/filter_script.rb +1 -1
- data/lib/qiita/markdown/transformers/strip_invalid_node.rb +1 -3
- data/lib/qiita/markdown/version.rb +1 -1
- data/qiita-markdown.gemspec +6 -6
- data/spec/qiita/markdown/processor_spec.rb +16 -16
- data/spec/qiita/markdown/summary_processor_spec.rb +2 -2
- metadata +90 -96
@@ -4,12 +4,12 @@ module Qiita
|
|
4
4
|
class ImageLink < HTML::Pipeline::Filter
|
5
5
|
def call
|
6
6
|
doc.search("img").each do |img|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
next if img.ancestors.any? { |ancestor| ancestor.name == "a" }
|
8
|
+
|
9
|
+
outer = Nokogiri::HTML.fragment(%(<a href="#{img['src']}" target="_blank"></a>))
|
10
|
+
inner = img.clone
|
11
|
+
outer.at("a").add_child(inner)
|
12
|
+
img.replace(outer)
|
13
13
|
end
|
14
14
|
doc
|
15
15
|
end
|
@@ -6,15 +6,15 @@ module Qiita
|
|
6
6
|
|
7
7
|
REGEXPS = Regexp.union(
|
8
8
|
/\#(?:\h{3}|\h{6})/,
|
9
|
-
/rgba?\(\s*(?:\d+(
|
10
|
-
/rgba?\(\s*(?:\d+%(
|
11
|
-
/rgba?\(\s*(?:\d
|
12
|
-
|
13
|
-
|
14
|
-
/hsla?\(\s*\d+(?:deg|rad|grad|turn)
|
9
|
+
/rgba?\(\s*(?:\d+(?:,|\s)\s*){2}\d+\s*\)/,
|
10
|
+
/rgba?\(\s*(?:\d+%(?:,|\s)\s*){2}\d+%\s*\)/,
|
11
|
+
/rgba?\(\s*(?:\d+,\s*){3}\d*\.?\d+%?\s*\)/,
|
12
|
+
%r{rgba?\(\s*(?:\d+\s*){2}\d+\s*/\s*\d?\.?\d+%?\s*\)},
|
13
|
+
%r{rgba?\(\s*(?:\d+%\s*){2}\d+%\s*/\s*\d?\.?\d+%?\s*\)},
|
14
|
+
/hsla?\(\s*\d+(?:deg|rad|grad|turn)?,\s*\d+%,\s*\d+%\s*\)/,
|
15
15
|
/hsla?\(\s*\d+(?:deg|rad|grad|turn)?\s+\d+%\s+\d+%\s*\)/,
|
16
|
-
/hsla?\(\s*\d+(?:deg|rad|grad|turn)
|
17
|
-
|
16
|
+
/hsla?\(\s*\d+(?:deg|rad|grad|turn)?,\s*(?:\d+%,\s*){2}\d?\.?\d+%?\s*\)/,
|
17
|
+
%r{hsla?\(\s*\d+(?:deg|rad|grad|turn)?\s+\d+%\s+\d+%\s*/\s*\d?\.?\d+%?\s*\)},
|
18
18
|
)
|
19
19
|
|
20
20
|
COLOR_CODE_PATTERN = /\A\s*(#{REGEXPS})\s*\z/
|
@@ -8,17 +8,17 @@ module Qiita
|
|
8
8
|
class Mention < HTML::Pipeline::MentionFilter
|
9
9
|
IGNORE_PARENTS = ::HTML::Pipeline::MentionFilter::IGNORE_PARENTS + Set["blockquote"]
|
10
10
|
|
11
|
-
MentionPattern =
|
11
|
+
MentionPattern = %r{
|
12
12
|
(?:^|\W)
|
13
|
-
@((
|
14
|
-
(
|
13
|
+
@((?>\w[\w-]{0,30}\w(?:@github)?))
|
14
|
+
(?!/)
|
15
15
|
(?=
|
16
16
|
\.+[ \t\W]|
|
17
17
|
\.+$|
|
18
18
|
[^0-9a-zA-Z_.]|
|
19
19
|
$
|
20
20
|
)
|
21
|
-
|
21
|
+
}ix
|
22
22
|
|
23
23
|
# @note Override to use another IGNORE_PARENTS
|
24
24
|
def call
|
@@ -28,8 +28,10 @@ module Qiita
|
|
28
28
|
content = node.to_html
|
29
29
|
next unless content.include?("@")
|
30
30
|
next if has_ancestor?(node, IGNORE_PARENTS)
|
31
|
+
|
31
32
|
html = mention_link_filter(content, base_url, info_url, username_pattern)
|
32
33
|
next if html == content
|
34
|
+
|
33
35
|
node.replace(html)
|
34
36
|
end
|
35
37
|
doc
|
@@ -38,22 +40,22 @@ module Qiita
|
|
38
40
|
# @note Override to use customized MentionPattern and allowed_usernames logic.
|
39
41
|
def mention_link_filter(text, _, _, _)
|
40
42
|
text.gsub(MentionPattern) do |match|
|
41
|
-
name =
|
43
|
+
name = ::Regexp.last_match(1)
|
42
44
|
case
|
43
45
|
when allowed_usernames && name == "all"
|
44
46
|
result[:mentioned_usernames] |= allowed_usernames
|
45
47
|
match.sub(
|
46
48
|
"@#{name}",
|
47
|
-
%
|
49
|
+
%(<a href="/" class="user-mention" title="#{name}">@#{name}</a>),
|
48
50
|
)
|
49
|
-
when allowed_usernames && !allowed_usernames.include?(name) || name == "all"
|
51
|
+
when (allowed_usernames && !allowed_usernames.include?(name)) || name == "all"
|
50
52
|
match
|
51
53
|
else
|
52
54
|
result[:mentioned_usernames] |= [name]
|
53
55
|
url = File.join(base_url, name)
|
54
56
|
match.sub(
|
55
57
|
"@#{name}",
|
56
|
-
%
|
58
|
+
%(<a href="#{url}" class="user-mention js-hovercard" title="#{name}" data-hovercard-target-type="user" data-hovercard-target-name="#{name}">@#{name}</a>),
|
57
59
|
)
|
58
60
|
end
|
59
61
|
end
|
@@ -66,7 +68,7 @@ module Qiita
|
|
66
68
|
end
|
67
69
|
|
68
70
|
def has_ancestor?(node, tags)
|
69
|
-
super || node.parent.parent && node.parent.parent["class"] == "code-lang"
|
71
|
+
super || (node.parent.parent && node.parent.parent["class"] == "code-lang")
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -54,7 +54,7 @@ module Qiita
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def call
|
57
|
-
outer = Nokogiri::HTML.fragment(%
|
57
|
+
outer = Nokogiri::HTML.fragment(%(<div class="code-frame" data-lang="#{language}">))
|
58
58
|
frame = outer.at("div")
|
59
59
|
frame.add_child(filename_node) if filename
|
60
60
|
frame.add_child(highlighted_node)
|
@@ -72,7 +72,7 @@ module Qiita
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def filename_node
|
75
|
-
%
|
75
|
+
%(<div class="code-lang"><span class="bold">#{filename}</span></div>)
|
76
76
|
end
|
77
77
|
|
78
78
|
def has_inline_php?
|
@@ -87,7 +87,7 @@ module Qiita
|
|
87
87
|
if specific_language && Rouge::Lexer.find(specific_language)
|
88
88
|
begin
|
89
89
|
highlight(specific_language).presence or raise
|
90
|
-
rescue
|
90
|
+
rescue StandardError
|
91
91
|
highlight(@default_language)
|
92
92
|
end
|
93
93
|
else
|
@@ -100,7 +100,7 @@ module Qiita
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def language_node
|
103
|
-
Nokogiri::HTML.fragment(%
|
103
|
+
Nokogiri::HTML.fragment(%(<div class="code-frame" data-lang="#{language}"></div>))
|
104
104
|
end
|
105
105
|
|
106
106
|
def specific_language
|
@@ -51,9 +51,7 @@ module Qiita
|
|
51
51
|
node.content.each_char.with_index do |char, index|
|
52
52
|
current_char_is_blank = char.strip.empty?
|
53
53
|
|
54
|
-
if !@previous_char_was_blank || !current_char_is_blank
|
55
|
-
@current_length += 1
|
56
|
-
end
|
54
|
+
@current_length += 1 if !@previous_char_was_blank || !current_char_is_blank
|
57
55
|
|
58
56
|
@previous_char_was_blank = current_char_is_blank
|
59
57
|
|
@@ -10,24 +10,24 @@ module Qiita
|
|
10
10
|
summary sup table tbody td tfoot th thead tr ul var
|
11
11
|
],
|
12
12
|
attributes: {
|
13
|
-
"a"
|
13
|
+
"a" => %w[class href rel title],
|
14
14
|
"blockquote" => %w[cite] + Embed::Tweet::ATTRIBUTES,
|
15
|
-
"code"
|
16
|
-
"div"
|
17
|
-
"font"
|
18
|
-
"h1"
|
19
|
-
"h2"
|
20
|
-
"h3"
|
21
|
-
"h4"
|
22
|
-
"h5"
|
23
|
-
"h6"
|
24
|
-
"img"
|
25
|
-
"ins"
|
26
|
-
"li"
|
27
|
-
"p"
|
28
|
-
"q"
|
29
|
-
"script"
|
30
|
-
"iframe"
|
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[
|
31
31
|
allowfullscreen
|
32
32
|
frameborder
|
33
33
|
height
|
@@ -38,14 +38,14 @@ module Qiita
|
|
38
38
|
style
|
39
39
|
width
|
40
40
|
],
|
41
|
-
"sup"
|
42
|
-
"td"
|
43
|
-
"th"
|
41
|
+
"sup" => %w[id],
|
42
|
+
"td" => %w[colspan rowspan style],
|
43
|
+
"th" => %w[colspan rowspan style],
|
44
44
|
},
|
45
45
|
protocols: {
|
46
|
-
"a"
|
46
|
+
"a" => { "href" => ["http", "https", "mailto", :relative] },
|
47
47
|
"blockquote" => { "cite" => ["http", "https", :relative] },
|
48
|
-
"q"
|
48
|
+
"q" => { "cite" => ["http", "https", :relative] },
|
49
49
|
},
|
50
50
|
css: {
|
51
51
|
properties: %w[
|
@@ -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 [
|
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
|
data/qiita-markdown.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path("
|
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,26 @@ 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
18
|
spec.required_ruby_version = ">= 2.6.0"
|
20
19
|
|
20
|
+
spec.add_dependency "addressable"
|
21
21
|
spec.add_dependency "gemoji"
|
22
22
|
spec.add_dependency "github-linguist", "~> 4.0"
|
23
|
+
spec.add_dependency "greenmat", "3.5.1.4"
|
23
24
|
spec.add_dependency "html-pipeline", "~> 2.0"
|
24
25
|
spec.add_dependency "mem"
|
25
26
|
spec.add_dependency "rouge", "3.26.0"
|
26
|
-
spec.add_dependency "greenmat", "3.5.1.4"
|
27
27
|
spec.add_dependency "sanitize"
|
28
|
-
spec.add_dependency "addressable"
|
29
28
|
spec.add_development_dependency "activesupport", "~> 5.2.7"
|
30
29
|
spec.add_development_dependency "benchmark-ips", "~> 1.2"
|
31
30
|
spec.add_development_dependency "bundler"
|
32
31
|
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
32
|
spec.add_development_dependency "pry"
|
35
33
|
spec.add_development_dependency "rake", "~> 10.0"
|
36
34
|
spec.add_development_dependency "rspec", "~> 3.1"
|
37
|
-
spec.add_development_dependency "rubocop", "~> 1.
|
35
|
+
spec.add_development_dependency "rubocop", "~> 1.39.0"
|
36
|
+
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"
|
37
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
38
38
|
end
|
@@ -250,7 +250,7 @@ describe Qiita::Markdown::Processor do
|
|
250
250
|
foo
|
251
251
|
|
252
252
|
</code></pre></div></div>
|
253
|
-
|
253
|
+
HTML
|
254
254
|
end
|
255
255
|
end
|
256
256
|
|
@@ -383,7 +383,7 @@ describe Qiita::Markdown::Processor do
|
|
383
383
|
|
384
384
|
context "with @all and allowed_usernames context" do
|
385
385
|
before do
|
386
|
-
context[:allowed_usernames] = [
|
386
|
+
context[:allowed_usernames] = %w[alice bob]
|
387
387
|
end
|
388
388
|
|
389
389
|
let(:markdown) do
|
@@ -400,7 +400,7 @@ describe Qiita::Markdown::Processor do
|
|
400
400
|
|
401
401
|
context "with @all and @alice" do
|
402
402
|
before do
|
403
|
-
context[:allowed_usernames] = [
|
403
|
+
context[:allowed_usernames] = %w[alice bob]
|
404
404
|
end
|
405
405
|
|
406
406
|
let(:markdown) do
|
@@ -517,7 +517,7 @@ describe Qiita::Markdown::Processor do
|
|
517
517
|
it "creates link for that with .autolink class" do
|
518
518
|
should eq(
|
519
519
|
'<p><a href="http://example.com/search?q=%E6%97%A5%E6%9C%AC%E8%AA%9E" class="autolink">' \
|
520
|
-
"http://example.com/search?q=日本語</a></p>\n"
|
520
|
+
"http://example.com/search?q=日本語</a></p>\n",
|
521
521
|
)
|
522
522
|
end
|
523
523
|
end
|
@@ -613,7 +613,7 @@ describe Qiita::Markdown::Processor do
|
|
613
613
|
|
614
614
|
context "with font element with color attribute" do
|
615
615
|
let(:markdown) do
|
616
|
-
%
|
616
|
+
%(<font color="red">test</font>)
|
617
617
|
end
|
618
618
|
|
619
619
|
it "allows font element with color attribute" do
|
@@ -844,7 +844,7 @@ describe Qiita::Markdown::Processor do
|
|
844
844
|
|
845
845
|
context "with emoji_names and emoji_url_generator context" do
|
846
846
|
before do
|
847
|
-
context[:emoji_names] = %w
|
847
|
+
context[:emoji_names] = %w[foo o]
|
848
848
|
|
849
849
|
context[:emoji_url_generator] = proc do |emoji_name|
|
850
850
|
"https://example.com/foo.png" if emoji_name == "foo"
|
@@ -860,11 +860,11 @@ describe Qiita::Markdown::Processor do
|
|
860
860
|
it "replaces only the specified emoji names with img elements with custom URL" do
|
861
861
|
should include(
|
862
862
|
'<img class="emoji" title=":foo:" alt=":foo:" src="https://example.com/foo.png"',
|
863
|
-
'<img class="emoji" title=":o:" alt=":o:" src="/images/emoji/unicode/2b55.png"'
|
863
|
+
'<img class="emoji" title=":o:" alt=":o:" src="/images/emoji/unicode/2b55.png"',
|
864
864
|
)
|
865
865
|
|
866
866
|
should_not include(
|
867
|
-
'<img class="emoji" title=":x:" alt=":x:"'
|
867
|
+
'<img class="emoji" title=":x:" alt=":x:"',
|
868
868
|
)
|
869
869
|
end
|
870
870
|
end
|
@@ -881,7 +881,7 @@ describe Qiita::Markdown::Processor do
|
|
881
881
|
it "creates link which does not have rel='nofollow noopener' and target='_blank'" do
|
882
882
|
should eq(
|
883
883
|
'<p><a href="http://qiita.com/?a=b" class="autolink">' \
|
884
|
-
"http://qiita.com/?a=b</a></p>\n"
|
884
|
+
"http://qiita.com/?a=b</a></p>\n",
|
885
885
|
)
|
886
886
|
end
|
887
887
|
end
|
@@ -898,7 +898,7 @@ describe Qiita::Markdown::Processor do
|
|
898
898
|
it "creates link which has rel='nofollow noopener' and target='_blank'" do
|
899
899
|
should eq(
|
900
900
|
'<p><a href="http://external.com/?a=b" class="autolink" rel="nofollow noopener" target="_blank">' \
|
901
|
-
"http://external.com/?a=b</a></p>\n"
|
901
|
+
"http://external.com/?a=b</a></p>\n",
|
902
902
|
)
|
903
903
|
end
|
904
904
|
end
|
@@ -914,7 +914,7 @@ describe Qiita::Markdown::Processor do
|
|
914
914
|
|
915
915
|
it "creates link which does not have rel='nofollow noopener' and target='_blank'" do
|
916
916
|
should eq(
|
917
|
-
"<p><a href=\"http://qiita.com/?a=b\">foobar</a></p>\n"
|
917
|
+
"<p><a href=\"http://qiita.com/?a=b\">foobar</a></p>\n",
|
918
918
|
)
|
919
919
|
end
|
920
920
|
end
|
@@ -930,7 +930,7 @@ describe Qiita::Markdown::Processor do
|
|
930
930
|
|
931
931
|
it "creates link which has rel='nofollow noopener' and target='_blank'" do
|
932
932
|
should eq(
|
933
|
-
"<p><a href=\"http://external.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n"
|
933
|
+
"<p><a href=\"http://external.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n",
|
934
934
|
)
|
935
935
|
end
|
936
936
|
end
|
@@ -947,7 +947,7 @@ describe Qiita::Markdown::Processor do
|
|
947
947
|
it "creates link which has rel='nofollow noopener' and target='_blank'" do
|
948
948
|
should eq(
|
949
949
|
'<p><a href="http://qqqqqqiita.com/?a=b" class="autolink" rel="nofollow noopener" target="_blank">' \
|
950
|
-
"http://qqqqqqiita.com/?a=b</a></p>\n"
|
950
|
+
"http://qqqqqqiita.com/?a=b</a></p>\n",
|
951
951
|
)
|
952
952
|
end
|
953
953
|
end
|
@@ -963,7 +963,7 @@ describe Qiita::Markdown::Processor do
|
|
963
963
|
|
964
964
|
it "creates link which has rel='nofollow noopener' and target='_blank'" do
|
965
965
|
should eq(
|
966
|
-
"<p><a href=\"http://qqqqqqiita.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n"
|
966
|
+
"<p><a href=\"http://qqqqqqiita.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n",
|
967
967
|
)
|
968
968
|
end
|
969
969
|
end
|
@@ -980,7 +980,7 @@ describe Qiita::Markdown::Processor do
|
|
980
980
|
it "creates link which has rel='nofollow noopener' and target='_blank'" do
|
981
981
|
should eq(
|
982
982
|
'<p><a href="http://sub.qiita.com/?a=b" class="autolink" rel="nofollow noopener" target="_blank">' \
|
983
|
-
"http://sub.qiita.com/?a=b</a></p>\n"
|
983
|
+
"http://sub.qiita.com/?a=b</a></p>\n",
|
984
984
|
)
|
985
985
|
end
|
986
986
|
end
|
@@ -996,7 +996,7 @@ describe Qiita::Markdown::Processor do
|
|
996
996
|
|
997
997
|
it "creates link which has rel='nofollow noopener' and target='_blank', and rel value is overwritten" do
|
998
998
|
should eq(
|
999
|
-
"<p><a href=\"http://external.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n"
|
999
|
+
"<p><a href=\"http://external.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n",
|
1000
1000
|
)
|
1001
1001
|
end
|
1002
1002
|
end
|
@@ -11,7 +11,7 @@ describe Qiita::Markdown::SummaryProcessor do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
let(:markdown) do
|
14
|
-
|
14
|
+
raise NotImplementedError
|
15
15
|
end
|
16
16
|
|
17
17
|
let(:result) do
|
@@ -240,7 +240,7 @@ describe Qiita::Markdown::SummaryProcessor do
|
|
240
240
|
end
|
241
241
|
|
242
242
|
it "replaces mention with link" do
|
243
|
-
should eq %
|
243
|
+
should eq %(<a href="/alice" class="user-mention js-hovercard" title="alice" data-hovercard-target-type="user" data-hovercard-target-name="alice">@alice</a>\n)
|
244
244
|
end
|
245
245
|
end
|
246
246
|
|