html-pipeline 0.0.14 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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