qiita-markdown 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of qiita-markdown might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aeafaca650b98a99a00e0735bde849f99faff1fb
4
- data.tar.gz: 2911b685bc654da88a608ba1ee7c4636027c9a40
3
+ metadata.gz: 739494b992f30301e63c329ca71f822ef80bd67a
4
+ data.tar.gz: 6f925bef2e51205cec9f663e71ddae50ef6d2097
5
5
  SHA512:
6
- metadata.gz: 019f1dd78735350a0e5c43f0c869fc3656ae858aaeec5d659b9eab64a1d040f3e0685a26313facb6fa750b526aecf676ad5b874aca06a49e18867fa384a60030
7
- data.tar.gz: 26232bd99bac696a6eb05cd37054a53c0227773db46f78f0406abc63f0076d1b84ad06ca0058d53d8d2dcb18a4fbc5966f3f867f1f49f7d50f65f8d2eacbe7ff
6
+ metadata.gz: f002a9b803ff192b9139c8060dde2116e945aec2aec1fd9f02e3a09d45ad85c5654a7fdf8f2f7b31bd44a9f48293c693506d4b0cbeca15c9d41a2d4ae66cadf9
7
+ data.tar.gz: b718ef753796afa29aaed9dc72122a0bc88daa33db71cceea242ffe8192ff4f6238766e54ebe0f91821ebff7680b231457ce200ff7f6a0f3c38bb2936192d4af
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
+ ## 0.16.0
2
+ - Add rel=noopener to all external a tags
3
+ - Support HTML5 `<details>` and `<summary>` elements
4
+ - Enable to change settings for footnotes
5
+
1
6
  ## 0.15.0
2
- - Append rel=nofollow and target=_blank to all external a tags
7
+ - Append `rel=nofollow` and `target=_blank` to `a` tags for external link
3
8
 
4
9
  ## 0.14.0
5
10
  - Add some attributes to mentions for rendering hovercard
data/README.md CHANGED
@@ -57,6 +57,8 @@ processor.call(text)
57
57
  The original implementation is used when the generator returned a falsey value.
58
58
  :hostname - FQDN. Used to check whether or not each URL of `href` attributes is external site. (String)
59
59
  :language_aliases - Alias table for some language names. (Hash)
60
+ :markdown - A hash for enabling / disabling optional Markdown syntax. (Hash)
61
+ Currently only :footnotes (default: true) is supported.
60
62
  :rule - Sanitization rule table. (Hash)
61
63
  :script - A flag to allow to embed script element. (Boolean)
62
64
  ```
@@ -23,6 +23,7 @@ require "qiita/markdown/filters/truncate"
23
23
  require "qiita/markdown/greenmat/heading_rendering"
24
24
  require "qiita/markdown/greenmat/html_renderer"
25
25
  require "qiita/markdown/greenmat/html_toc_renderer"
26
+ require "qiita/markdown/base_processor"
26
27
  require "qiita/markdown/processor"
27
28
  require "qiita/markdown/summary_processor"
28
29
  require "qiita/markdown/version"
@@ -0,0 +1,42 @@
1
+ module Qiita
2
+ module Markdown
3
+ # An abstract base processor for rendering a Markdown document.
4
+ class BaseProcessor
5
+ # @return [Hash] the default context for HTML::Pipeline
6
+ def self.default_context
7
+ raise NotImplementedError
8
+ end
9
+
10
+ # @return [Array<Class>] the default HTML::Pipeline filter classes
11
+ def self.default_fiters
12
+ raise NotImplementedError
13
+ end
14
+
15
+ # @param [Hash] context Optional context for HTML::Pipeline.
16
+ def initialize(context = {})
17
+ @context = self.class.default_context.merge(context)
18
+ end
19
+
20
+ # Converts Markdown text into HTML string with extracted metadata.
21
+ #
22
+ # @param [String] input Markdown text.
23
+ # @param [Hash] context Optional context merged into default context.
24
+ # @return [Hash] Process result.
25
+ # @example
26
+ # Qiita::Markdown::Processor.new.call(markdown) #=> {
27
+ # codes: [...],
28
+ # mentioned_usernames: [...],
29
+ # output: "...",
30
+ # }
31
+ def call(input, context = {})
32
+ HTML::Pipeline.new(filters, @context).call(input, context)
33
+ end
34
+
35
+ # @note Modify filters if you want.
36
+ # @return [Array<HTML::Pipeline::Filter>]
37
+ def filters
38
+ @filters ||= self.class.default_filters
39
+ end
40
+ end
41
+ end
42
+ end
@@ -11,7 +11,7 @@ module Qiita
11
11
  href_host = host_of(href)
12
12
  next unless href_host
13
13
  if href_host != hostname
14
- anchor["rel"] = "nofollow"
14
+ anchor["rel"] = "nofollow noopener"
15
15
  anchor["target"] = "_blank"
16
16
  end
17
17
  end
@@ -2,6 +2,10 @@ module Qiita
2
2
  module Markdown
3
3
  module Filters
4
4
  class Greenmat < HTML::Pipeline::TextFilter
5
+ DEFAULT_OPTIONS = {
6
+ footnotes: true,
7
+ }.freeze
8
+
5
9
  # @return [Nokogiri::HTML::DocumentFragment]
6
10
  def call
7
11
  Nokogiri::HTML.fragment(greenmat.render(@text))
@@ -16,13 +20,17 @@ module Qiita
16
20
  Qiita::Markdown::Greenmat::HTMLRenderer.new(hard_wrap: true, with_toc_data: true),
17
21
  autolink: true,
18
22
  fenced_code_blocks: true,
19
- footnotes: true,
23
+ footnotes: options[:footnotes],
20
24
  no_intra_emphasis: true,
21
25
  no_mention_emphasis: true,
22
26
  strikethrough: true,
23
27
  tables: true,
24
28
  )
25
29
  end
30
+
31
+ def options
32
+ @options ||= DEFAULT_OPTIONS.merge(context[:markdown] || {})
33
+ end
26
34
  end
27
35
  end
28
36
  end
@@ -133,6 +133,7 @@ module Qiita
133
133
  "code",
134
134
  "dd",
135
135
  "del",
136
+ "details",
136
137
  "div",
137
138
  "dl",
138
139
  "dt",
@@ -166,6 +167,7 @@ module Qiita
166
167
  "strike",
167
168
  "strong",
168
169
  "sub",
170
+ "summary",
169
171
  "sup",
170
172
  "table",
171
173
  "tbody",
@@ -1,48 +1,26 @@
1
1
  module Qiita
2
2
  module Markdown
3
- class Processor
4
- DEFAULT_CONTEXT = {
5
- asset_root: "/images",
6
- }
7
-
8
- DEFAULT_FILTERS = [
9
- Filters::Greenmat,
10
- Filters::ImageLink,
11
- Filters::Footnote,
12
- Filters::Code,
13
- Filters::Checkbox,
14
- Filters::Emoji,
15
- Filters::SyntaxHighlight,
16
- Filters::Mention,
17
- Filters::GroupMention,
18
- Filters::ExternalLink,
19
- Filters::Sanitize,
20
- ]
21
-
22
- # @param [Hash] context Optional context for HTML::Pipeline.
23
- def initialize(context = {})
24
- @context = DEFAULT_CONTEXT.merge(context)
25
- end
26
-
27
- # Converts Markdown text into HTML string with extracted metadata.
28
- #
29
- # @param [String] input Markdown text.
30
- # @param [Hash] context Optional context merged into default context.
31
- # @return [Hash] Process result.
32
- # @example
33
- # Qiita::Markdown::Processor.new.call(markdown) #=> {
34
- # codes: [...],
35
- # mentioned_usernames: [...],
36
- # output: "...",
37
- # }
38
- def call(input, context = {})
39
- HTML::Pipeline.new(filters, @context).call(input, context)
3
+ class Processor < BaseProcessor
4
+ def self.default_context
5
+ {
6
+ asset_root: "/images",
7
+ }
40
8
  end
41
9
 
42
- # @note Modify filters if you want.
43
- # @return [Array<HTML::Pipeline::Filter>]
44
- def filters
45
- @filters ||= DEFAULT_FILTERS.clone
10
+ def self.default_filters
11
+ [
12
+ Filters::Greenmat,
13
+ Filters::ImageLink,
14
+ Filters::Footnote,
15
+ Filters::Code,
16
+ Filters::Checkbox,
17
+ Filters::Emoji,
18
+ Filters::SyntaxHighlight,
19
+ Filters::Mention,
20
+ Filters::GroupMention,
21
+ Filters::ExternalLink,
22
+ Filters::Sanitize,
23
+ ]
46
24
  end
47
25
  end
48
26
  end
@@ -3,21 +3,26 @@ module Qiita
3
3
  # A processor for rendering a summary of markdown document. This simplifies
4
4
  # a document by removing complex markups and also truncates it to a
5
5
  # specific length without breaking the document structure.
6
- class SummaryProcessor < Processor
7
- DEFAULT_FILTERS = [
8
- Filters::Greenmat,
9
- Filters::Simplify,
10
- Filters::Emoji,
11
- Filters::Mention,
12
- Filters::ExternalLink,
13
- Filters::Sanitize,
14
- Filters::Truncate,
15
- ]
6
+ class SummaryProcessor < BaseProcessor
7
+ def self.default_context
8
+ {
9
+ asset_root: "/images",
10
+ markdown: {
11
+ footnotes: false,
12
+ },
13
+ }
14
+ end
16
15
 
17
- # @note Modify filters if you want.
18
- # @return [Array<HTML::Pipeline::Filter>]
19
- def filters
20
- @filters ||= DEFAULT_FILTERS.clone
16
+ def self.default_filters
17
+ [
18
+ Filters::Greenmat,
19
+ Filters::Simplify,
20
+ Filters::Emoji,
21
+ Filters::Mention,
22
+ Filters::ExternalLink,
23
+ Filters::Sanitize,
24
+ Filters::Truncate,
25
+ ]
21
26
  end
22
27
  end
23
28
  end
@@ -1,5 +1,5 @@
1
1
  module Qiita
2
2
  module Markdown
3
- VERSION = "0.15.0"
3
+ VERSION = "0.16.0"
4
4
  end
5
5
  end
@@ -482,7 +482,7 @@ describe Qiita::Markdown::Processor do
482
482
 
483
483
  it "replaces it with preferred link and updates :mentioned_groups" do
484
484
  is_expected.to eq <<-EOS.strip_heredoc
485
- <p><a href="https://alice.example.com/groups/bob" rel="nofollow" target="_blank">@alice/bob</a></p>
485
+ <p><a href="https://alice.example.com/groups/bob" rel="nofollow noopener" target="_blank">@alice/bob</a></p>
486
486
  EOS
487
487
  expect(result[:mentioned_groups]).to eq [{
488
488
  group_url_name: "bob",
@@ -789,6 +789,25 @@ describe Qiita::Markdown::Processor do
789
789
  end
790
790
  end
791
791
 
792
+ context "with markdown: { footnotes: false } context" do
793
+ before do
794
+ context[:markdown] = { footnotes: false }
795
+ end
796
+
797
+ let(:markdown) do
798
+ <<-EOS.strip_heredoc
799
+ [^1]
800
+ [^1]: test
801
+ EOS
802
+ end
803
+
804
+ it "does not generate footnote elements" do
805
+ should eq <<-EOS.strip_heredoc
806
+ <p><a href="test">^1</a></p>
807
+ EOS
808
+ end
809
+ end
810
+
792
811
  context "with data-attributes" do
793
812
  let(:markdown) do
794
813
  <<-EOS.strip_heredoc
@@ -857,7 +876,7 @@ describe Qiita::Markdown::Processor do
857
876
  { hostname: "qiita.com" }
858
877
  end
859
878
 
860
- it "creates link which does not have rel='nofollow' and target='_blank'" do
879
+ it "creates link which does not have rel='nofollow noopener' and target='_blank'" do
861
880
  should eq(
862
881
  '<p><a href="http://qiita.com/?a=b" class="autolink">' \
863
882
  "http://qiita.com/?a=b</a></p>\n"
@@ -874,9 +893,9 @@ describe Qiita::Markdown::Processor do
874
893
  { hostname: "qiita.com" }
875
894
  end
876
895
 
877
- it "creates link which has rel='nofollow' and target='_blank'" do
896
+ it "creates link which has rel='nofollow noopener' and target='_blank'" do
878
897
  should eq(
879
- '<p><a href="http://external.com/?a=b" class="autolink" rel="nofollow" target="_blank">' \
898
+ '<p><a href="http://external.com/?a=b" class="autolink" rel="nofollow noopener" target="_blank">' \
880
899
  "http://external.com/?a=b</a></p>\n"
881
900
  )
882
901
  end
@@ -891,7 +910,7 @@ describe Qiita::Markdown::Processor do
891
910
  { hostname: "qiita.com" }
892
911
  end
893
912
 
894
- it "creates link which does not have rel='nofollow' and target='_blank'" do
913
+ it "creates link which does not have rel='nofollow noopener' and target='_blank'" do
895
914
  should eq(
896
915
  "<p><a href=\"http://qiita.com/?a=b\">foobar</a></p>\n"
897
916
  )
@@ -907,9 +926,9 @@ describe Qiita::Markdown::Processor do
907
926
  { hostname: "qiita.com" }
908
927
  end
909
928
 
910
- it "creates link which has rel='nofollow' and target='_blank'" do
929
+ it "creates link which has rel='nofollow noopener' and target='_blank'" do
911
930
  should eq(
912
- "<p><a href=\"http://external.com/?a=b\" rel=\"nofollow\" target=\"_blank\">foobar</a></p>\n"
931
+ "<p><a href=\"http://external.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n"
913
932
  )
914
933
  end
915
934
  end
@@ -923,9 +942,9 @@ describe Qiita::Markdown::Processor do
923
942
  { hostname: "qiita.com" }
924
943
  end
925
944
 
926
- it "creates link which has rel='nofollow' and target='_blank'" do
945
+ it "creates link which has rel='nofollow noopener' and target='_blank'" do
927
946
  should eq(
928
- '<p><a href="http://qqqqqqiita.com/?a=b" class="autolink" rel="nofollow" target="_blank">' \
947
+ '<p><a href="http://qqqqqqiita.com/?a=b" class="autolink" rel="nofollow noopener" target="_blank">' \
929
948
  "http://qqqqqqiita.com/?a=b</a></p>\n"
930
949
  )
931
950
  end
@@ -940,9 +959,9 @@ describe Qiita::Markdown::Processor do
940
959
  { hostname: "qiita.com" }
941
960
  end
942
961
 
943
- it "creates link which has rel='nofollow' and target='_blank'" do
962
+ it "creates link which has rel='nofollow noopener' and target='_blank'" do
944
963
  should eq(
945
- "<p><a href=\"http://qqqqqqiita.com/?a=b\" rel=\"nofollow\" target=\"_blank\">foobar</a></p>\n"
964
+ "<p><a href=\"http://qqqqqqiita.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n"
946
965
  )
947
966
  end
948
967
  end
@@ -956,9 +975,9 @@ describe Qiita::Markdown::Processor do
956
975
  { hostname: "qiita.com" }
957
976
  end
958
977
 
959
- it "creates link which has rel='nofollow' and target='_blank'" do
978
+ it "creates link which has rel='nofollow noopener' and target='_blank'" do
960
979
  should eq(
961
- '<p><a href="http://sub.qiita.com/?a=b" class="autolink" rel="nofollow" target="_blank">' \
980
+ '<p><a href="http://sub.qiita.com/?a=b" class="autolink" rel="nofollow noopener" target="_blank">' \
962
981
  "http://sub.qiita.com/?a=b</a></p>\n"
963
982
  )
964
983
  end
@@ -973,9 +992,9 @@ describe Qiita::Markdown::Processor do
973
992
  { hostname: "qiita.com" }
974
993
  end
975
994
 
976
- it "creates link which has rel='nofollow' and target='_blank', and rel value is overwritten" do
995
+ it "creates link which has rel='nofollow noopener' and target='_blank', and rel value is overwritten" do
977
996
  should eq(
978
- "<p><a href=\"http://external.com/?a=b\" rel=\"nofollow\" target=\"_blank\">foobar</a></p>\n"
997
+ "<p><a href=\"http://external.com/?a=b\" rel=\"nofollow noopener\" target=\"_blank\">foobar</a></p>\n"
979
998
  )
980
999
  end
981
1000
  end
@@ -243,5 +243,20 @@ describe Qiita::Markdown::SummaryProcessor do
243
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
+
247
+ context "with footenote syntax" do
248
+ let(:markdown) do
249
+ <<-EOS.strip_heredoc
250
+ [^1]
251
+ [^1]: test
252
+ EOS
253
+ end
254
+
255
+ it "does not generate footnote elements by default" do
256
+ should eq <<-EOS.strip_heredoc
257
+ <a href="test">^1</a>
258
+ EOS
259
+ end
260
+ end
246
261
  end
247
262
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qiita-markdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-26 00:00:00.000000000 Z
11
+ date: 2016-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gemoji
@@ -261,6 +261,7 @@ files:
261
261
  - benchmark/sample.md
262
262
  - lib/qiita-markdown.rb
263
263
  - lib/qiita/markdown.rb
264
+ - lib/qiita/markdown/base_processor.rb
264
265
  - lib/qiita/markdown/filters/checkbox.rb
265
266
  - lib/qiita/markdown/filters/code.rb
266
267
  - lib/qiita/markdown/filters/emoji.rb