geothird-html-pipeline 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +13 -0
  4. data/CHANGELOG.md +43 -0
  5. data/Gemfile +9 -0
  6. data/LICENSE +22 -0
  7. data/README.md +274 -0
  8. data/Rakefile +11 -0
  9. data/bin/html-pipeline +80 -0
  10. data/geothird-html-pipeline.gemspec +27 -0
  11. data/lib/html/pipeline.rb +198 -0
  12. data/lib/html/pipeline/@mention_filter.rb +121 -0
  13. data/lib/html/pipeline/absolute_source_filter.rb +48 -0
  14. data/lib/html/pipeline/autolink_filter.rb +22 -0
  15. data/lib/html/pipeline/body_content.rb +42 -0
  16. data/lib/html/pipeline/camo_filter.rb +70 -0
  17. data/lib/html/pipeline/email_reply_filter.rb +56 -0
  18. data/lib/html/pipeline/emoji_filter.rb +54 -0
  19. data/lib/html/pipeline/filter.rb +178 -0
  20. data/lib/html/pipeline/https_filter.rb +13 -0
  21. data/lib/html/pipeline/image_max_width_filter.rb +37 -0
  22. data/lib/html/pipeline/markdown_filter.rb +29 -0
  23. data/lib/html/pipeline/plain_text_input_filter.rb +11 -0
  24. data/lib/html/pipeline/sanitization_filter.rb +105 -0
  25. data/lib/html/pipeline/syntax_highlight_filter.rb +33 -0
  26. data/lib/html/pipeline/text_filter.rb +14 -0
  27. data/lib/html/pipeline/textile_filter.rb +21 -0
  28. data/lib/html/pipeline/toc_filter.rb +28 -0
  29. data/lib/html/pipeline/version.rb +5 -0
  30. data/test/helpers/mocked_instrumentation_service.rb +17 -0
  31. data/test/html/pipeline/absolute_source_filter_test.rb +56 -0
  32. data/test/html/pipeline/autolink_filter_test.rb +22 -0
  33. data/test/html/pipeline/camo_filter_test.rb +47 -0
  34. data/test/html/pipeline/emoji_filter_test.rb +18 -0
  35. data/test/html/pipeline/image_max_width_filter_test.rb +50 -0
  36. data/test/html/pipeline/markdown_filter_test.rb +101 -0
  37. data/test/html/pipeline/mention_filter_test.rb +156 -0
  38. data/test/html/pipeline/plain_text_input_filter_test.rb +22 -0
  39. data/test/html/pipeline/sanitization_filter_test.rb +47 -0
  40. data/test/html/pipeline/toc_filter_test.rb +47 -0
  41. data/test/html/pipeline_test.rb +74 -0
  42. data/test/test_helper.rb +38 -0
  43. metadata +213 -0
@@ -0,0 +1,156 @@
1
+ require "test_helper"
2
+
3
+ class HTML::Pipeline::MentionFilterTest < Test::Unit::TestCase
4
+ def filter(html, base_url='/', info_url=nil)
5
+ HTML::Pipeline::MentionFilter.call(html, :base_url => base_url, :info_url => info_url)
6
+ end
7
+
8
+ def test_filtering_a_documentfragment
9
+ body = "<p>@kneath: check it out.</p>"
10
+ doc = Nokogiri::HTML::DocumentFragment.parse(body)
11
+
12
+ res = filter(doc, '/')
13
+ assert_same doc, res
14
+
15
+ link = "<a href=\"/kneath\" class=\"user-mention\">@kneath</a>"
16
+ assert_equal "<p>#{link}: check it out.</p>",
17
+ res.to_html
18
+ end
19
+
20
+ def test_filtering_plain_text
21
+ body = "<p>@kneath: check it out.</p>"
22
+ res = filter(body, '/')
23
+
24
+ link = "<a href=\"/kneath\" class=\"user-mention\">@kneath</a>"
25
+ assert_equal "<p>#{link}: check it out.</p>",
26
+ res.to_html
27
+ end
28
+
29
+ def test_not_replacing_mentions_in_pre_tags
30
+ body = "<pre>@kneath: okay</pre>"
31
+ assert_equal body, filter(body).to_html
32
+ end
33
+
34
+ def test_not_replacing_mentions_in_code_tags
35
+ body = "<p><code>@kneath:</code> okay</p>"
36
+ assert_equal body, filter(body).to_html
37
+ end
38
+
39
+ def test_not_replacing_mentions_in_links
40
+ body = "<p><a>@kneath</a> okay</p>"
41
+ assert_equal body, filter(body).to_html
42
+ end
43
+
44
+ def test_entity_encoding_and_whatnot
45
+ body = "<p>@&#x6b;neath what's up</p>"
46
+ link = "<a href=\"/kneath\" class=\"user-mention\">@kneath</a>"
47
+ assert_equal "<p>#{link} what's up</p>", filter(body, '/').to_html
48
+ end
49
+
50
+ def test_html_injection
51
+ body = "<p>@kneath &lt;script>alert(0)&lt;/script></p>"
52
+ link = "<a href=\"/kneath\" class=\"user-mention\">@kneath</a>"
53
+ assert_equal "<p>#{link} &lt;script&gt;alert(0)&lt;/script&gt;</p>",
54
+ filter(body, '/').to_html
55
+ end
56
+
57
+ def test_links_to_nothing_when_no_info_url_given
58
+ body = "<p>How do I @mention someone?</p>"
59
+ assert_equal "<p>How do I @mention someone?</p>",
60
+ filter(body, '/').to_html
61
+ end
62
+
63
+ def test_links_to_more_info_when_info_url_given
64
+ body = "<p>How do I @mention someone?</p>"
65
+ link = "<a href=\"https://github.com/blog/821\" class=\"user-mention\">@mention</a>"
66
+ assert_equal "<p>How do I #{link} someone?</p>",
67
+ filter(body, '/', 'https://github.com/blog/821').to_html
68
+ end
69
+
70
+ MarkdownPipeline =
71
+ HTML::Pipeline.new [
72
+ HTML::Pipeline::MarkdownFilter,
73
+ HTML::Pipeline::MentionFilter
74
+ ]
75
+
76
+ def mentioned_usernames
77
+ result = {}
78
+ MarkdownPipeline.call(@body, {}, result)
79
+ result[:mentioned_usernames]
80
+ end
81
+
82
+ def test_matches_usernames_in_body
83
+ @body = "@test how are you?"
84
+ assert_equal %w[test], mentioned_usernames
85
+ end
86
+
87
+ def test_matches_usernames_with_dashes
88
+ @body = "hi @some-user"
89
+ assert_equal %w[some-user], mentioned_usernames
90
+ end
91
+
92
+ def test_matches_usernames_followed_by_a_single_dot
93
+ @body = "okay @some-user."
94
+ assert_equal %w[some-user], mentioned_usernames
95
+ end
96
+
97
+ def test_matches_usernames_followed_by_multiple_dots
98
+ @body = "okay @some-user..."
99
+ assert_equal %w[some-user], mentioned_usernames
100
+ end
101
+
102
+ def test_does_not_match_email_addresses
103
+ @body = "aman@tmm1.net"
104
+ assert_equal [], mentioned_usernames
105
+ end
106
+
107
+ def test_does_not_match_domain_name_looking_things
108
+ @body = "we need a @github.com email"
109
+ assert_equal [], mentioned_usernames
110
+ end
111
+
112
+ def test_does_not_match_organization_team_mentions
113
+ @body = "we need to @github/enterprise know"
114
+ assert_equal [], mentioned_usernames
115
+ end
116
+
117
+ def test_matches_colon_suffixed_names
118
+ @body = "@tmm1: what do you think?"
119
+ assert_equal %w[tmm1], mentioned_usernames
120
+ end
121
+
122
+ def test_matches_list_of_names
123
+ @body = "@defunkt @atmos @kneath"
124
+ assert_equal %w[defunkt atmos kneath], mentioned_usernames
125
+ end
126
+
127
+ def test_matches_list_of_names_with_commas
128
+ @body = "/cc @defunkt, @atmos, @kneath"
129
+ assert_equal %w[defunkt atmos kneath], mentioned_usernames
130
+ end
131
+
132
+ def test_matches_inside_brackets
133
+ @body = "(@mislav) and [@rtomayko]"
134
+ assert_equal %w[mislav rtomayko], mentioned_usernames
135
+ end
136
+
137
+ def test_doesnt_ignore_invalid_users
138
+ @body = "@defunkt @mojombo and @somedude"
139
+ assert_equal ['defunkt', 'mojombo', 'somedude'], mentioned_usernames
140
+ end
141
+
142
+ def test_returns_distinct_set
143
+ @body = "/cc @defunkt, @atmos, @kneath, @defunkt, @defunkt"
144
+ assert_equal %w[defunkt atmos kneath], mentioned_usernames
145
+ end
146
+
147
+ def test_does_not_match_inline_code_block_with_multiple_code_blocks
148
+ @body = "something\n\n`/cc @defunkt @atmos @kneath` `/cc @atmos/atmos`"
149
+ assert_equal %w[], mentioned_usernames
150
+ end
151
+
152
+ def test_mention_at_end_of_parenthetical_sentence
153
+ @body = "(We're talking 'bout @ymendel.)"
154
+ assert_equal %w[ymendel], mentioned_usernames
155
+ end
156
+ end
@@ -0,0 +1,22 @@
1
+ require "test_helper"
2
+
3
+ class HTML::Pipeline::PlainTextInputFilterTest < Test::Unit::TestCase
4
+ PlainTextInputFilter = HTML::Pipeline::PlainTextInputFilter
5
+
6
+ def test_fails_when_given_a_documentfragment
7
+ body = "<p>heyo</p>"
8
+ doc = Nokogiri::HTML::DocumentFragment.parse(body)
9
+ assert_raise(TypeError) { PlainTextInputFilter.call(doc, {}) }
10
+ end
11
+
12
+ def test_wraps_input_in_a_div_element
13
+ doc = PlainTextInputFilter.call("howdy pahtner", {})
14
+ assert_equal "<div>howdy pahtner</div>", doc.to_s
15
+ end
16
+
17
+ def test_html_escapes_plain_text_input
18
+ doc = PlainTextInputFilter.call("See: <http://example.org>", {})
19
+ assert_equal "<div>See: &lt;http://example.org&gt;</div>",
20
+ doc.to_s
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ require "test_helper"
2
+
3
+ class HTML::Pipeline::SanitizationFilterTest < Test::Unit::TestCase
4
+ SanitizationFilter = HTML::Pipeline::SanitizationFilter
5
+
6
+ def test_removing_script_tags
7
+ orig = %(<p><img src="http://github.com/img.png" /><script></script></p>)
8
+ html = SanitizationFilter.call(orig).to_s
9
+ assert_no_match /script/, html
10
+ end
11
+
12
+ def test_removing_style_tags
13
+ orig = %(<p><style>hey now</style></p>)
14
+ html = SanitizationFilter.call(orig).to_s
15
+ assert_no_match /style/, html
16
+ end
17
+
18
+ def test_removing_style_attributes
19
+ orig = %(<p style='font-size:1000%'>YO DAWG</p>)
20
+ html = SanitizationFilter.call(orig).to_s
21
+ assert_no_match /font-size/, html
22
+ assert_no_match /style/, html
23
+ end
24
+
25
+ def test_removing_script_event_handler_attributes
26
+ orig = %(<a onclick='javascript:alert(0)'>YO DAWG</a>)
27
+ html = SanitizationFilter.call(orig).to_s
28
+ assert_no_match /javscript/, html
29
+ assert_no_match /onclick/, html
30
+ end
31
+
32
+ def test_sanitizes_li_elements_not_contained_in_ul_or_ol
33
+ stuff = "a\n<li>b</li>\nc"
34
+ html = SanitizationFilter.call(stuff).to_s
35
+ assert_equal "a\nb\nc", html
36
+ end
37
+
38
+ def test_does_not_sanitize_li_elements_contained_in_ul_or_ol
39
+ stuff = "a\n<ul><li>b</li></ul>\nc"
40
+ assert_equal stuff, SanitizationFilter.call(stuff).to_s
41
+ end
42
+
43
+ def test_github_specific_protocols_are_not_removed
44
+ stuff = '<a href="github-windows://spillthelog">Spill this yo</a> and so on'
45
+ assert_equal stuff, SanitizationFilter.call(stuff).to_s
46
+ end
47
+ end
@@ -0,0 +1,47 @@
1
+ require "test_helper"
2
+
3
+ class HTML::Pipeline::TableOfContentsFilterTest < Test::Unit::TestCase
4
+ TocFilter = HTML::Pipeline::TableOfContentsFilter
5
+
6
+ def test_anchors_are_added_properly
7
+ orig = %(<h1>Ice cube</h1><p>Will swarm on any motherfucker in a blue uniform</p>)
8
+ assert_includes '<a name=', TocFilter.call(orig).to_s
9
+ end
10
+
11
+ def test_anchors_have_sane_names
12
+ orig = %(<h1>Dr Dre</h1><h1>Ice Cube</h1><h1>Eazy-E</h1><h1>MC Ren</h1>)
13
+ result = TocFilter.call(orig).to_s
14
+
15
+ assert_includes '"dr-dre"', result
16
+ assert_includes '"ice-cube"', result
17
+ assert_includes '"eazy-e"', result
18
+ assert_includes '"mc-ren"', result
19
+ end
20
+
21
+ def test_dupe_headers_have_unique_trailing_identifiers
22
+ orig = %(<h1>Straight Outta Compton</h1>
23
+ <h2>Dopeman</h2>
24
+ <h3>Express Yourself</h3>
25
+ <h1>Dopeman</h1>)
26
+
27
+ result = TocFilter.call(orig).to_s
28
+
29
+ assert_includes '"dopeman"', result
30
+ assert_includes '"dopeman-1"', result
31
+ end
32
+
33
+ def test_all_header_tags_are_found_when_adding_anchors
34
+ orig = %(<h1>"Funky President" by James Brown</h1>
35
+ <h2>"It's My Thing" by Marva Whitney</h2>
36
+ <h3>"Boogie Back" by Roy Ayers</h3>
37
+ <h4>"Feel Good" by Fancy</h4>
38
+ <h5>"Funky Drummer" by James Brown</h5>
39
+ <h6>"Ruthless Villain" by Eazy-E</h6>
40
+ <h7>"Be Thankful for What You Got" by William DeVaughn</h7>)
41
+
42
+ doc = TocFilter.call(orig)
43
+ assert_equal 6, doc.search('a').size
44
+ end
45
+ end
46
+
47
+
@@ -0,0 +1,74 @@
1
+ require "test_helper"
2
+ require "helpers/mocked_instrumentation_service"
3
+
4
+ class HTML::PipelineTest < Test::Unit::TestCase
5
+ Pipeline = HTML::Pipeline
6
+ class TestFilter
7
+ def self.call(input, context, result)
8
+ input.reverse
9
+ end
10
+ end
11
+
12
+ def setup
13
+ @context = {}
14
+ @result_class = Hash
15
+ @pipeline = Pipeline.new [TestFilter], @context, @result_class
16
+ end
17
+
18
+ def test_filter_instrumentation
19
+ service = MockedInstrumentationService.new
20
+ events = service.subscribe "call_filter.html_pipeline"
21
+ @pipeline.instrumentation_service = service
22
+ filter(body = "hello")
23
+ event, payload, res = events.pop
24
+ assert event, "event expected"
25
+ assert_equal "call_filter.html_pipeline", event
26
+ assert_equal TestFilter.name, payload[:filter]
27
+ assert_equal @pipeline.class.name, payload[:pipeline]
28
+ assert_equal body.reverse, payload[:result][:output]
29
+ end
30
+
31
+ def test_pipeline_instrumentation
32
+ service = MockedInstrumentationService.new
33
+ events = service.subscribe "call_pipeline.html_pipeline"
34
+ @pipeline.instrumentation_service = service
35
+ filter(body = "hello")
36
+ event, payload, res = events.pop
37
+ assert event, "event expected"
38
+ assert_equal "call_pipeline.html_pipeline", event
39
+ assert_equal @pipeline.filters.map(&:name), payload[:filters]
40
+ assert_equal @pipeline.class.name, payload[:pipeline]
41
+ assert_equal body.reverse, payload[:result][:output]
42
+ end
43
+
44
+ def test_default_instrumentation_service
45
+ service = 'default'
46
+ Pipeline.default_instrumentation_service = service
47
+ pipeline = Pipeline.new [], @context, @result_class
48
+ assert_equal service, pipeline.instrumentation_service
49
+ ensure
50
+ Pipeline.default_instrumentation_service = nil
51
+ end
52
+
53
+ def test_setup_instrumentation
54
+ assert_nil @pipeline.instrumentation_service
55
+
56
+ service = MockedInstrumentationService.new
57
+ events = service.subscribe "call_pipeline.html_pipeline"
58
+ @pipeline.setup_instrumentation name = 'foo', service
59
+
60
+ assert_equal service, @pipeline.instrumentation_service
61
+ assert_equal name, @pipeline.instrumentation_name
62
+
63
+ filter(body = 'foo')
64
+
65
+ event, payload, res = events.pop
66
+ assert event, "expected event"
67
+ assert_equal name, payload[:pipeline]
68
+ assert_equal body.reverse, payload[:result][:output]
69
+ end
70
+
71
+ def filter(input)
72
+ @pipeline.call(input)
73
+ end
74
+ end
@@ -0,0 +1,38 @@
1
+ require 'bundler/setup'
2
+ require 'html/pipeline'
3
+ require 'test/unit'
4
+
5
+ require 'active_support/core_ext/object/try'
6
+
7
+ module TestHelpers
8
+ # Asserts that `needle` is not a member of `haystack`, where
9
+ # `haystack` is any object that responds to `include?`.
10
+ def assert_doesnt_include(needle, haystack, message = nil)
11
+ error = '<?> included in <?>'
12
+ message = build_message(message, error, needle.to_s, Array(haystack).map(&:to_s))
13
+
14
+ assert_block message do
15
+ !haystack.include?(needle)
16
+ end
17
+ end
18
+
19
+ # Asserts that `needle` is a member of `haystack`, where
20
+ # `haystack` is any object that responds to `include?`.
21
+ def assert_includes(needle, haystack, message = nil)
22
+ error = '<?> not included in <?>'
23
+ message = build_message(message, error, needle.to_s, Array(haystack).map(&:to_s))
24
+
25
+ assert_block message do
26
+ haystack.include?(needle)
27
+ end
28
+ end
29
+
30
+ # Asserts that two html fragments are equivalent. Attribute order
31
+ # will be ignored.
32
+ def assert_equal_html(expected, actual)
33
+ assert_equal Nokogiri::HTML::DocumentFragment.parse(expected).to_hash,
34
+ Nokogiri::HTML::DocumentFragment.parse(actual).to_hash
35
+ end
36
+ end
37
+
38
+ Test::Unit::TestCase.send(:include, TestHelpers)
metadata ADDED
@@ -0,0 +1,213 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: geothird-html-pipeline
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.12
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Tomayko
8
+ - Jerry Cheung
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: gemoji
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: '1.4'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: '1.4'
42
+ - !ruby/object:Gem::Dependency
43
+ name: github-markdown
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '0.5'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '0.5'
56
+ - !ruby/object:Gem::Dependency
57
+ name: sanitize
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '2.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '2.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rinku
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '1.7'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '1.7'
84
+ - !ruby/object:Gem::Dependency
85
+ name: escape_utils
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ version: '0.3'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: '0.3'
98
+ - !ruby/object:Gem::Dependency
99
+ name: activesupport
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '2'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '2'
112
+ - !ruby/object:Gem::Dependency
113
+ name: geothird-linguist
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ~>
117
+ - !ruby/object:Gem::Version
118
+ version: 2.6.8
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 2.6.8
126
+ description: GitHub HTML processing filters and utilities
127
+ email:
128
+ - ryan@github.com
129
+ - jerry@github.com
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .gitignore
135
+ - .travis.yml
136
+ - CHANGELOG.md
137
+ - Gemfile
138
+ - LICENSE
139
+ - README.md
140
+ - Rakefile
141
+ - bin/html-pipeline
142
+ - geothird-html-pipeline.gemspec
143
+ - lib/html/pipeline.rb
144
+ - lib/html/pipeline/@mention_filter.rb
145
+ - lib/html/pipeline/absolute_source_filter.rb
146
+ - lib/html/pipeline/autolink_filter.rb
147
+ - lib/html/pipeline/body_content.rb
148
+ - lib/html/pipeline/camo_filter.rb
149
+ - lib/html/pipeline/email_reply_filter.rb
150
+ - lib/html/pipeline/emoji_filter.rb
151
+ - lib/html/pipeline/filter.rb
152
+ - lib/html/pipeline/https_filter.rb
153
+ - lib/html/pipeline/image_max_width_filter.rb
154
+ - lib/html/pipeline/markdown_filter.rb
155
+ - lib/html/pipeline/plain_text_input_filter.rb
156
+ - lib/html/pipeline/sanitization_filter.rb
157
+ - lib/html/pipeline/syntax_highlight_filter.rb
158
+ - lib/html/pipeline/text_filter.rb
159
+ - lib/html/pipeline/textile_filter.rb
160
+ - lib/html/pipeline/toc_filter.rb
161
+ - lib/html/pipeline/version.rb
162
+ - test/helpers/mocked_instrumentation_service.rb
163
+ - test/html/pipeline/absolute_source_filter_test.rb
164
+ - test/html/pipeline/autolink_filter_test.rb
165
+ - test/html/pipeline/camo_filter_test.rb
166
+ - test/html/pipeline/emoji_filter_test.rb
167
+ - test/html/pipeline/image_max_width_filter_test.rb
168
+ - test/html/pipeline/markdown_filter_test.rb
169
+ - test/html/pipeline/mention_filter_test.rb
170
+ - test/html/pipeline/plain_text_input_filter_test.rb
171
+ - test/html/pipeline/sanitization_filter_test.rb
172
+ - test/html/pipeline/toc_filter_test.rb
173
+ - test/html/pipeline_test.rb
174
+ - test/test_helper.rb
175
+ homepage: https://github.com/jch/html-pipeline
176
+ licenses:
177
+ - MIT
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - '>='
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.0.0
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Helpers for processing content through a chain of filters
199
+ test_files:
200
+ - test/helpers/mocked_instrumentation_service.rb
201
+ - test/html/pipeline/absolute_source_filter_test.rb
202
+ - test/html/pipeline/autolink_filter_test.rb
203
+ - test/html/pipeline/camo_filter_test.rb
204
+ - test/html/pipeline/emoji_filter_test.rb
205
+ - test/html/pipeline/image_max_width_filter_test.rb
206
+ - test/html/pipeline/markdown_filter_test.rb
207
+ - test/html/pipeline/mention_filter_test.rb
208
+ - test/html/pipeline/plain_text_input_filter_test.rb
209
+ - test/html/pipeline/sanitization_filter_test.rb
210
+ - test/html/pipeline/toc_filter_test.rb
211
+ - test/html/pipeline_test.rb
212
+ - test/test_helper.rb
213
+ has_rdoc: