html-pipeline 0.0.14 → 0.1.0

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.
data/.travis.yml CHANGED
@@ -10,4 +10,5 @@ rvm:
10
10
  - 1.8.7
11
11
  - 1.9.2
12
12
  - 1.9.3
13
- - ree
13
+ - 2.0.0
14
+ - ree
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.1.0
4
+
5
+ I realized I wasn't properly following [semver](http://semver.org) for interface
6
+ changes and new features. Starting from this release, semver will be followed.
7
+
8
+ * Whitelist table section elements in sanitization filter #55 mojavelinux
9
+ * Update readme typo #57 envygeeks
10
+ * TOC unicode characters and anchor names for Ruby > 1.9 #64 jakedouglas/non_english_anchors
11
+ * Add :skip_tags option for AutolinkFilter #65 pengwynn
12
+ * Fix CI dependency issues #67 jch
13
+ * Fix ignored test and add Ruby 2.0 to CI. #71, #72 tricknotes
14
+
3
15
  ## 0.0.14
4
16
 
5
17
  * Remove unused can_access_repo? method jch
data/README.md CHANGED
@@ -85,7 +85,7 @@ filter.call
85
85
 
86
86
  * `MentionFilter` - replace `@user` mentions with links
87
87
  * `AbsoluteSourceFilter` - replace relative image urls with fully qualified versions
88
- * `AutoLinkFilter` - auto_linking urls in HTML
88
+ * `AutolinkFilter` - auto_linking urls in HTML
89
89
  * `CamoFilter` - replace http image urls with [camo-fied](https://github.com/atmos/camo) https versions
90
90
  * `EmailReplyFilter` - util filter for working with emails
91
91
  * `EmojiFilter` - everyone loves [emoji](http://www.emoji-cheat-sheet.com/)!
@@ -16,12 +16,12 @@ Gem::Specification.new do |gem|
16
16
  gem.require_paths = ["lib"]
17
17
 
18
18
  gem.add_dependency "gemoji", "~> 1.0"
19
- gem.add_dependency "nokogiri", "~> 1.4"
19
+ gem.add_dependency "nokogiri", RUBY_VERSION < "1.9.2" ? [">= 1.4", "< 1.6"] : "~> 1.4"
20
20
  gem.add_dependency "github-markdown", "~> 0.5"
21
- gem.add_dependency "sanitize", "~> 2.0"
21
+ gem.add_dependency "sanitize", RUBY_VERSION < "1.9.2" ? [">= 2", "< 2.0.4"] : "~> 2.0"
22
22
  gem.add_dependency "rinku", "~> 1.7"
23
23
  gem.add_dependency "escape_utils", "~> 0.3"
24
- gem.add_dependency "activesupport", ">= 2"
24
+ gem.add_dependency "activesupport", RUBY_VERSION < "1.9.3" ? [">= 2", "< 4"] : ">= 2"
25
25
 
26
26
  gem.add_development_dependency "github-linguist", "~> 2.6.2"
27
27
  end
@@ -5,18 +5,22 @@ module HTML
5
5
  # HTML Filter for auto_linking urls in HTML.
6
6
  #
7
7
  # Context options:
8
- # :autolink - boolean whether to autolink urls
9
- # :flags - additional Rinku flags. See https://github.com/vmg/rinku
8
+ # :autolink - boolean whether to autolink urls
9
+ # :skip_tags - HTML tags inside which autolinking will be skipped.
10
+ # See Rinku.skip_tags
11
+ # :flags - additional Rinku flags. See https://github.com/vmg/rinku
10
12
  #
11
13
  # This filter does not write additional information to the context.
12
14
  class AutolinkFilter < Filter
13
15
  def call
14
16
  return html if context[:autolink] == false
17
+
18
+ skip_tags = context[:skip_tags]
15
19
  flags = 0
16
20
  flags |= context[:flags] if context[:flags]
17
21
 
18
- Rinku.auto_link(html, :urls, nil, %w[a script kbd pre code], flags)
22
+ Rinku.auto_link(html, :urls, nil, skip_tags, flags)
19
23
  end
20
24
  end
21
25
  end
22
- end
26
+ end
@@ -25,15 +25,16 @@ module HTML
25
25
  # of places we're using tables to contain formatted user content (like pull
26
26
  # request review comments).
27
27
  TABLE_ITEMS = Set.new(%w(tr td th).freeze)
28
- TABLE = 'table'.freeze
28
+ TABLE = 'table'.freeze
29
+ TABLE_SECTIONS = Set.new(%w(thead tbody tfoot).freeze)
29
30
 
30
31
  # The main sanitization whitelist. Only these elements and attributes are
31
32
  # allowed through by default.
32
33
  WHITELIST = {
33
34
  :elements => %w(
34
35
  h1 h2 h3 h4 h5 h6 h7 h8 br b i strong em a pre code img tt
35
- div ins del sup sub p ol ul table blockquote dl dt dd
36
- kbd q samp var hr ruby rt rp li tr td th
36
+ div ins del sup sub p ol ul table thead tbody tfoot blockquote
37
+ dl dt dd kbd q samp var hr ruby rt rp li tr td th
37
38
  ),
38
39
  :remove_contents => ['script'],
39
40
  :attributes => {
@@ -75,7 +76,7 @@ module HTML
75
76
  # Table child elements that are not contained by a <table> are removed.
76
77
  lambda { |env|
77
78
  name, node = env[:node_name], env[:node]
78
- if TABLE_ITEMS.include?(name) && !node.ancestors.any? { |n| n.name == TABLE }
79
+ if (TABLE_SECTIONS.include?(name) || TABLE_ITEMS.include?(name)) && !node.ancestors.any? { |n| n.name == TABLE }
79
80
  node.replace(node.children)
80
81
  end
81
82
  }
@@ -103,4 +104,4 @@ module HTML
103
104
  end
104
105
  end
105
106
  end
106
- end
107
+ end
@@ -1,7 +1,7 @@
1
1
  begin
2
2
  require 'linguist'
3
3
  rescue LoadError
4
- raise LoadError, "You need to install linguist before using the SyntaxHighlightFilter. See README.md for details"
4
+ raise LoadError, "You need to install 'github-linguist' before using the SyntaxHighlightFilter. See README.md for details"
5
5
  end
6
6
 
7
7
  module HTML
@@ -7,13 +7,14 @@ module HTML
7
7
  # eventually generating the Table of Contents itself, with links
8
8
  # to each header
9
9
  class TableOfContentsFilter < Filter
10
+ PUNCTUATION_REGEXP = RUBY_VERSION > "1.9" ? /[^\p{Word}\- ]/u : /[^\w\- ]/
11
+
10
12
  def call
11
13
  headers = Hash.new(0)
12
14
  doc.css('h1, h2, h3, h4, h5, h6').each do |node|
13
15
  name = node.text.downcase
14
- name.gsub!(/[^\w\- ]/, '') # remove punctuation
16
+ name.gsub!(PUNCTUATION_REGEXP, '') # remove punctuation
15
17
  name.gsub!(' ', '-') # replace spaces with dash
16
- name = EscapeUtils.escape_uri(name) # escape extended UTF-8 chars
17
18
 
18
19
  uniq = (headers[name] > 0) ? "-#{headers[name]}" : ''
19
20
  headers[name] += 1
@@ -25,4 +26,4 @@ module HTML
25
26
  end
26
27
  end
27
28
  end
28
- end
29
+ end
@@ -1,5 +1,5 @@
1
1
  module HTML
2
2
  class Pipeline
3
- VERSION = "0.0.14"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -12,14 +12,13 @@ class HTML::Pipeline::AbsoluteSourceFilterTest < Test::Unit::TestCase
12
12
  }
13
13
  end
14
14
 
15
- def test_rewrites_root_relative_urls
15
+ def test_rewrites_root_urls
16
16
  orig = %(<p><img src="/img.png"></p>)
17
- puts AbsoluteSourceFilter.call(orig, @options).to_s
18
17
  assert_equal "<p><img src=\"#{@image_base_url}/img.png\"></p>",
19
18
  AbsoluteSourceFilter.call(orig, @options).to_s
20
19
  end
21
20
 
22
- def test_rewrites_root_relative_urls
21
+ def test_rewrites_relative_urls
23
22
  orig = %(<p><img src="post/img.png"></p>)
24
23
  assert_equal "<p><img src=\"#{@image_subpage_url}/img.png\"></p>",
25
24
  AbsoluteSourceFilter.call(orig, @options).to_s
@@ -19,4 +19,12 @@ class HTML::Pipeline::AutolinkFilterTest < Test::Unit::TestCase
19
19
  assert_equal '<p>"<a href="http://github">http://github</a>"</p>',
20
20
  AutolinkFilter.to_html('<p>"http://github"</p>', :flags => Rinku::AUTOLINK_SHORT_DOMAINS)
21
21
  end
22
+
23
+ def test_autolink_skip_tags
24
+ assert_equal '<code>"http://github.com"</code>',
25
+ AutolinkFilter.to_html('<code>"http://github.com"</code>')
26
+
27
+ assert_equal '<code>"<a href="http://github.com">http://github.com</a>"</code>',
28
+ AutolinkFilter.to_html('<code>"http://github.com"</code>', :skip_tags => %w(kbd script))
29
+ end
22
30
  end
@@ -49,4 +49,23 @@ class HTML::Pipeline::SanitizationFilterTest < Test::Unit::TestCase
49
49
  orig = '<script>JavaScript!</script>'
50
50
  assert_equal "", SanitizationFilter.call(orig).to_s
51
51
  end
52
+
53
+ def test_table_rows_and_cells_removed_if_not_in_table
54
+ orig = %(<tr><td>Foo</td></tr><td>Bar</td>)
55
+ assert_equal 'FooBar', SanitizationFilter.call(orig).to_s
56
+ end
57
+
58
+ def test_table_sections_removed_if_not_in_table
59
+ orig = %(<thead><tr><td>Foo</td></tr></thead>)
60
+ assert_equal 'Foo', SanitizationFilter.call(orig).to_s
61
+ end
62
+
63
+ def test_table_sections_are_not_removed
64
+ orig = %(<table>
65
+ <thead><tr><th>Column 1</th></tr></thead>
66
+ <tfoot><tr><td>Sum</td></tr></tfoot>
67
+ <tbody><tr><td>1</td></tr></tbody>
68
+ </table>)
69
+ assert_equal orig, SanitizationFilter.call(orig).to_s
70
+ end
52
71
  end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require "test_helper"
2
3
 
3
4
  class HTML::Pipeline::TableOfContentsFilterTest < Test::Unit::TestCase
@@ -42,6 +43,16 @@ class HTML::Pipeline::TableOfContentsFilterTest < Test::Unit::TestCase
42
43
  doc = TocFilter.call(orig)
43
44
  assert_equal 6, doc.search('a').size
44
45
  end
45
- end
46
46
 
47
+ def test_anchors_with_utf8_characters
48
+ orig = %(<h1>日本語</h1>
49
+ <h1>Русский</h1)
50
+
51
+ rendered_h1s = TocFilter.call(orig).search('h1').map(&:to_s)
47
52
 
53
+ assert_equal "<h1>\n<a name=\"%E6%97%A5%E6%9C%AC%E8%AA%9E\" class=\"anchor\" href=\"#%E6%97%A5%E6%9C%AC%E8%AA%9E\"><span class=\"octicon octicon-link\"></span></a>日本語</h1>",
54
+ rendered_h1s[0]
55
+ assert_equal "<h1>\n<a name=\"%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9\" class=\"anchor\" href=\"#%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9\"><span class=\"octicon octicon-link\"></span></a>Русский</h1>",
56
+ rendered_h1s[1]
57
+ end if RUBY_VERSION > "1.9" # not sure how to make this work on 1.8.7
58
+ end
metadata CHANGED
@@ -1,153 +1,175 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: html-pipeline
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.14
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Ryan Tomayko
9
14
  - Jerry Cheung
10
15
  autorequire:
11
16
  bindir: bin
12
17
  cert_chain: []
13
- date: 2013-05-22 00:00:00.000000000 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
18
+
19
+ date: 2013-07-15 00:00:00 -07:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
16
23
  name: gemoji
17
- requirement: !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ~>
21
- - !ruby/object:Gem::Version
22
- version: '1.0'
23
- type: :runtime
24
24
  prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
26
  none: false
27
- requirements:
27
+ requirements:
28
28
  - - ~>
29
- - !ruby/object:Gem::Version
30
- version: '1.0'
31
- - !ruby/object:Gem::Dependency
32
- name: nokogiri
33
- requirement: !ruby/object:Gem::Requirement
34
- none: false
35
- requirements:
36
- - - ~>
37
- - !ruby/object:Gem::Version
38
- version: '1.4'
29
+ - !ruby/object:Gem::Version
30
+ hash: 15
31
+ segments:
32
+ - 1
33
+ - 0
34
+ version: "1.0"
39
35
  type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: nokogiri
40
39
  prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
40
+ requirement: &id002 !ruby/object:Gem::Requirement
42
41
  none: false
43
- requirements:
44
- - - ~>
45
- - !ruby/object:Gem::Version
46
- version: '1.4'
47
- - !ruby/object:Gem::Dependency
48
- name: github-markdown
49
- requirement: !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '0.5'
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 7
46
+ segments:
47
+ - 1
48
+ - 4
49
+ version: "1.4"
50
+ - - <
51
+ - !ruby/object:Gem::Version
52
+ hash: 3
53
+ segments:
54
+ - 1
55
+ - 6
56
+ version: "1.6"
55
57
  type: :runtime
58
+ version_requirements: *id002
59
+ - !ruby/object:Gem::Dependency
60
+ name: github-markdown
56
61
  prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ~>
61
- - !ruby/object:Gem::Version
62
- version: '0.5'
63
- - !ruby/object:Gem::Dependency
64
- name: sanitize
65
- requirement: !ruby/object:Gem::Requirement
62
+ requirement: &id003 !ruby/object:Gem::Requirement
66
63
  none: false
67
- requirements:
64
+ requirements:
68
65
  - - ~>
69
- - !ruby/object:Gem::Version
70
- version: '2.0'
66
+ - !ruby/object:Gem::Version
67
+ hash: 1
68
+ segments:
69
+ - 0
70
+ - 5
71
+ version: "0.5"
71
72
  type: :runtime
73
+ version_requirements: *id003
74
+ - !ruby/object:Gem::Dependency
75
+ name: sanitize
72
76
  prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
76
- - - ~>
77
- - !ruby/object:Gem::Version
78
- version: '2.0'
79
- - !ruby/object:Gem::Dependency
80
- name: rinku
81
- requirement: !ruby/object:Gem::Requirement
77
+ requirement: &id004 !ruby/object:Gem::Requirement
82
78
  none: false
83
- requirements:
84
- - - ~>
85
- - !ruby/object:Gem::Version
86
- version: '1.7'
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ hash: 7
83
+ segments:
84
+ - 2
85
+ version: "2"
86
+ - - <
87
+ - !ruby/object:Gem::Version
88
+ hash: 7
89
+ segments:
90
+ - 2
91
+ - 0
92
+ - 4
93
+ version: 2.0.4
87
94
  type: :runtime
95
+ version_requirements: *id004
96
+ - !ruby/object:Gem::Dependency
97
+ name: rinku
88
98
  prerelease: false
89
- version_requirements: !ruby/object:Gem::Requirement
99
+ requirement: &id005 !ruby/object:Gem::Requirement
90
100
  none: false
91
- requirements:
101
+ requirements:
92
102
  - - ~>
93
- - !ruby/object:Gem::Version
94
- version: '1.7'
95
- - !ruby/object:Gem::Dependency
96
- name: escape_utils
97
- requirement: !ruby/object:Gem::Requirement
98
- none: false
99
- requirements:
100
- - - ~>
101
- - !ruby/object:Gem::Version
102
- version: '0.3'
103
+ - !ruby/object:Gem::Version
104
+ hash: 1
105
+ segments:
106
+ - 1
107
+ - 7
108
+ version: "1.7"
103
109
  type: :runtime
110
+ version_requirements: *id005
111
+ - !ruby/object:Gem::Dependency
112
+ name: escape_utils
104
113
  prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
114
+ requirement: &id006 !ruby/object:Gem::Requirement
106
115
  none: false
107
- requirements:
116
+ requirements:
108
117
  - - ~>
109
- - !ruby/object:Gem::Version
110
- version: '0.3'
111
- - !ruby/object:Gem::Dependency
112
- name: activesupport
113
- requirement: !ruby/object:Gem::Requirement
114
- none: false
115
- requirements:
116
- - - ! '>='
117
- - !ruby/object:Gem::Version
118
- version: '2'
118
+ - !ruby/object:Gem::Version
119
+ hash: 13
120
+ segments:
121
+ - 0
122
+ - 3
123
+ version: "0.3"
119
124
  type: :runtime
125
+ version_requirements: *id006
126
+ - !ruby/object:Gem::Dependency
127
+ name: activesupport
120
128
  prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
129
+ requirement: &id007 !ruby/object:Gem::Requirement
122
130
  none: false
123
- requirements:
124
- - - ! '>='
125
- - !ruby/object:Gem::Version
126
- version: '2'
127
- - !ruby/object:Gem::Dependency
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ hash: 7
135
+ segments:
136
+ - 2
137
+ version: "2"
138
+ - - <
139
+ - !ruby/object:Gem::Version
140
+ hash: 11
141
+ segments:
142
+ - 4
143
+ version: "4"
144
+ type: :runtime
145
+ version_requirements: *id007
146
+ - !ruby/object:Gem::Dependency
128
147
  name: github-linguist
129
- requirement: !ruby/object:Gem::Requirement
130
- none: false
131
- requirements:
132
- - - ~>
133
- - !ruby/object:Gem::Version
134
- version: 2.6.2
135
- type: :development
136
148
  prerelease: false
137
- version_requirements: !ruby/object:Gem::Requirement
149
+ requirement: &id008 !ruby/object:Gem::Requirement
138
150
  none: false
139
- requirements:
151
+ requirements:
140
152
  - - ~>
141
- - !ruby/object:Gem::Version
153
+ - !ruby/object:Gem::Version
154
+ hash: 19
155
+ segments:
156
+ - 2
157
+ - 6
158
+ - 2
142
159
  version: 2.6.2
160
+ type: :development
161
+ version_requirements: *id008
143
162
  description: GitHub HTML processing filters and utilities
144
- email:
163
+ email:
145
164
  - ryan@github.com
146
165
  - jerry@github.com
147
166
  executables: []
167
+
148
168
  extensions: []
169
+
149
170
  extra_rdoc_files: []
150
- files:
171
+
172
+ files:
151
173
  - .gitignore
152
174
  - .travis.yml
153
175
  - CHANGELOG.md
@@ -189,32 +211,41 @@ files:
189
211
  - test/html/pipeline/toc_filter_test.rb
190
212
  - test/html/pipeline_test.rb
191
213
  - test/test_helper.rb
214
+ has_rdoc: true
192
215
  homepage: https://github.com/jch/html-pipeline
193
- licenses:
216
+ licenses:
194
217
  - MIT
195
218
  post_install_message:
196
219
  rdoc_options: []
197
- require_paths:
220
+
221
+ require_paths:
198
222
  - lib
199
- required_ruby_version: !ruby/object:Gem::Requirement
223
+ required_ruby_version: !ruby/object:Gem::Requirement
200
224
  none: false
201
- requirements:
202
- - - ! '>='
203
- - !ruby/object:Gem::Version
204
- version: '0'
205
- required_rubygems_version: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ hash: 3
229
+ segments:
230
+ - 0
231
+ version: "0"
232
+ required_rubygems_version: !ruby/object:Gem::Requirement
206
233
  none: false
207
- requirements:
208
- - - ! '>='
209
- - !ruby/object:Gem::Version
210
- version: '0'
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ hash: 3
238
+ segments:
239
+ - 0
240
+ version: "0"
211
241
  requirements: []
242
+
212
243
  rubyforge_project:
213
- rubygems_version: 1.8.23
244
+ rubygems_version: 1.6.2
214
245
  signing_key:
215
246
  specification_version: 3
216
247
  summary: Helpers for processing content through a chain of filters
217
- test_files:
248
+ test_files:
218
249
  - test/helpers/mocked_instrumentation_service.rb
219
250
  - test/html/pipeline/absolute_source_filter_test.rb
220
251
  - test/html/pipeline/autolink_filter_test.rb