loofah 2.5.0 → 2.18.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of loofah might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +157 -47
- data/README.md +13 -12
- data/lib/loofah/elements.rb +5 -2
- data/lib/loofah/html5/safelist.rb +99 -8
- data/lib/loofah/html5/scrub.rb +51 -24
- data/lib/loofah/instance_methods.rb +9 -5
- data/lib/loofah/scrubbers.rb +7 -2
- data/lib/loofah/version.rb +5 -0
- data/lib/loofah.rb +13 -15
- metadata +41 -124
- data/Gemfile +0 -23
- data/Manifest.txt +0 -25
- data/Rakefile +0 -97
- data/benchmark/benchmark.rb +0 -154
- data/benchmark/fragment.html +0 -96
- data/benchmark/helper.rb +0 -73
- data/benchmark/www.slashdot.com.html +0 -2560
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loofah
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Dalessio
|
@@ -9,22 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-05-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: nokogiri
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - ">="
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: 1.5.9
|
21
|
-
type: :runtime
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: 1.5.9
|
28
14
|
- !ruby/object:Gem::Dependency
|
29
15
|
name: crass
|
30
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -40,148 +26,88 @@ dependencies:
|
|
40
26
|
- !ruby/object:Gem::Version
|
41
27
|
version: 1.0.2
|
42
28
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - "~>"
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: '12.3'
|
49
|
-
type: :development
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - "~>"
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: '12.3'
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: minitest
|
29
|
+
name: nokogiri
|
58
30
|
requirement: !ruby/object:Gem::Requirement
|
59
31
|
requirements:
|
60
|
-
- - "
|
32
|
+
- - ">="
|
61
33
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
63
|
-
type: :
|
34
|
+
version: 1.5.9
|
35
|
+
type: :runtime
|
64
36
|
prerelease: false
|
65
37
|
version_requirements: !ruby/object:Gem::Requirement
|
66
38
|
requirements:
|
67
|
-
- - "
|
39
|
+
- - ">="
|
68
40
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
41
|
+
version: 1.5.9
|
70
42
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
43
|
+
name: hoe-markdown
|
72
44
|
requirement: !ruby/object:Gem::Requirement
|
73
45
|
requirements:
|
74
46
|
- - "~>"
|
75
47
|
- !ruby/object:Gem::Version
|
76
|
-
version: 1.
|
48
|
+
version: '1.3'
|
77
49
|
type: :development
|
78
50
|
prerelease: false
|
79
51
|
version_requirements: !ruby/object:Gem::Requirement
|
80
52
|
requirements:
|
81
53
|
- - "~>"
|
82
54
|
- !ruby/object:Gem::Version
|
83
|
-
version: 1.
|
55
|
+
version: '1.3'
|
84
56
|
- !ruby/object:Gem::Dependency
|
85
57
|
name: json
|
86
58
|
requirement: !ruby/object:Gem::Requirement
|
87
59
|
requirements:
|
88
60
|
- - "~>"
|
89
61
|
- !ruby/object:Gem::Version
|
90
|
-
version: 2.2
|
91
|
-
type: :development
|
92
|
-
prerelease: false
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
95
|
-
- - "~>"
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: 2.2.0
|
98
|
-
- !ruby/object:Gem::Dependency
|
99
|
-
name: hoe-gemspec
|
100
|
-
requirement: !ruby/object:Gem::Requirement
|
101
|
-
requirements:
|
102
|
-
- - "~>"
|
103
|
-
- !ruby/object:Gem::Version
|
104
|
-
version: '1.0'
|
105
|
-
type: :development
|
106
|
-
prerelease: false
|
107
|
-
version_requirements: !ruby/object:Gem::Requirement
|
108
|
-
requirements:
|
109
|
-
- - "~>"
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
version: '1.0'
|
112
|
-
- !ruby/object:Gem::Dependency
|
113
|
-
name: hoe-debugging
|
114
|
-
requirement: !ruby/object:Gem::Requirement
|
115
|
-
requirements:
|
116
|
-
- - "~>"
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '2.0'
|
62
|
+
version: '2.2'
|
119
63
|
type: :development
|
120
64
|
prerelease: false
|
121
65
|
version_requirements: !ruby/object:Gem::Requirement
|
122
66
|
requirements:
|
123
67
|
- - "~>"
|
124
68
|
- !ruby/object:Gem::Version
|
125
|
-
version: '2.
|
69
|
+
version: '2.2'
|
126
70
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
71
|
+
name: minitest
|
128
72
|
requirement: !ruby/object:Gem::Requirement
|
129
73
|
requirements:
|
130
74
|
- - "~>"
|
131
75
|
- !ruby/object:Gem::Version
|
132
|
-
version: '
|
76
|
+
version: '5.14'
|
133
77
|
type: :development
|
134
78
|
prerelease: false
|
135
79
|
version_requirements: !ruby/object:Gem::Requirement
|
136
80
|
requirements:
|
137
81
|
- - "~>"
|
138
82
|
- !ruby/object:Gem::Version
|
139
|
-
version: '
|
83
|
+
version: '5.14'
|
140
84
|
- !ruby/object:Gem::Dependency
|
141
|
-
name:
|
85
|
+
name: rake
|
142
86
|
requirement: !ruby/object:Gem::Requirement
|
143
87
|
requirements:
|
144
88
|
- - "~>"
|
145
89
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
90
|
+
version: '13.0'
|
147
91
|
type: :development
|
148
92
|
prerelease: false
|
149
93
|
version_requirements: !ruby/object:Gem::Requirement
|
150
94
|
requirements:
|
151
95
|
- - "~>"
|
152
96
|
- !ruby/object:Gem::Version
|
153
|
-
version: '
|
97
|
+
version: '13.0'
|
154
98
|
- !ruby/object:Gem::Dependency
|
155
|
-
name:
|
99
|
+
name: rdoc
|
156
100
|
requirement: !ruby/object:Gem::Requirement
|
157
101
|
requirements:
|
158
102
|
- - ">="
|
159
103
|
- !ruby/object:Gem::Version
|
160
|
-
version:
|
161
|
-
|
162
|
-
prerelease: false
|
163
|
-
version_requirements: !ruby/object:Gem::Requirement
|
164
|
-
requirements:
|
165
|
-
- - ">="
|
166
|
-
- !ruby/object:Gem::Version
|
167
|
-
version: 0.26.0
|
168
|
-
- !ruby/object:Gem::Dependency
|
169
|
-
name: rubocop
|
170
|
-
requirement: !ruby/object:Gem::Requirement
|
171
|
-
requirements:
|
172
|
-
- - ">="
|
104
|
+
version: '4.0'
|
105
|
+
- - "<"
|
173
106
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
107
|
+
version: '7'
|
175
108
|
type: :development
|
176
109
|
prerelease: false
|
177
110
|
version_requirements: !ruby/object:Gem::Requirement
|
178
|
-
requirements:
|
179
|
-
- - ">="
|
180
|
-
- !ruby/object:Gem::Version
|
181
|
-
version: 0.76.0
|
182
|
-
- !ruby/object:Gem::Dependency
|
183
|
-
name: rdoc
|
184
|
-
requirement: !ruby/object:Gem::Requirement
|
185
111
|
requirements:
|
186
112
|
- - ">="
|
187
113
|
- !ruby/object:Gem::Version
|
@@ -189,30 +115,34 @@ dependencies:
|
|
189
115
|
- - "<"
|
190
116
|
- !ruby/object:Gem::Version
|
191
117
|
version: '7'
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: rr
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.2.0
|
192
125
|
type: :development
|
193
126
|
prerelease: false
|
194
127
|
version_requirements: !ruby/object:Gem::Requirement
|
195
128
|
requirements:
|
196
|
-
- - "
|
197
|
-
- !ruby/object:Gem::Version
|
198
|
-
version: '4.0'
|
199
|
-
- - "<"
|
129
|
+
- - "~>"
|
200
130
|
- !ruby/object:Gem::Version
|
201
|
-
version:
|
131
|
+
version: 1.2.0
|
202
132
|
- !ruby/object:Gem::Dependency
|
203
|
-
name:
|
133
|
+
name: rubocop
|
204
134
|
requirement: !ruby/object:Gem::Requirement
|
205
135
|
requirements:
|
206
136
|
- - "~>"
|
207
137
|
- !ruby/object:Gem::Version
|
208
|
-
version: '
|
138
|
+
version: '1.1'
|
209
139
|
type: :development
|
210
140
|
prerelease: false
|
211
141
|
version_requirements: !ruby/object:Gem::Requirement
|
212
142
|
requirements:
|
213
143
|
- - "~>"
|
214
144
|
- !ruby/object:Gem::Version
|
215
|
-
version: '
|
145
|
+
version: '1.1'
|
216
146
|
description: |-
|
217
147
|
Loofah is a general library for manipulating and transforming HTML/XML documents and fragments, built on top of Nokogiri.
|
218
148
|
|
@@ -224,24 +154,12 @@ email:
|
|
224
154
|
- bryan@brynary.com
|
225
155
|
executables: []
|
226
156
|
extensions: []
|
227
|
-
extra_rdoc_files:
|
228
|
-
- CHANGELOG.md
|
229
|
-
- MIT-LICENSE.txt
|
230
|
-
- Manifest.txt
|
231
|
-
- README.md
|
232
|
-
- SECURITY.md
|
157
|
+
extra_rdoc_files: []
|
233
158
|
files:
|
234
159
|
- CHANGELOG.md
|
235
|
-
- Gemfile
|
236
160
|
- MIT-LICENSE.txt
|
237
|
-
- Manifest.txt
|
238
161
|
- README.md
|
239
|
-
- Rakefile
|
240
162
|
- SECURITY.md
|
241
|
-
- benchmark/benchmark.rb
|
242
|
-
- benchmark/fragment.html
|
243
|
-
- benchmark/helper.rb
|
244
|
-
- benchmark/www.slashdot.com.html
|
245
163
|
- lib/loofah.rb
|
246
164
|
- lib/loofah/elements.rb
|
247
165
|
- lib/loofah/helpers.rb
|
@@ -254,6 +172,7 @@ files:
|
|
254
172
|
- lib/loofah/metahelpers.rb
|
255
173
|
- lib/loofah/scrubber.rb
|
256
174
|
- lib/loofah/scrubbers.rb
|
175
|
+
- lib/loofah/version.rb
|
257
176
|
- lib/loofah/xml/document.rb
|
258
177
|
- lib/loofah/xml/document_fragment.rb
|
259
178
|
homepage: https://github.com/flavorjones/loofah
|
@@ -261,14 +180,12 @@ licenses:
|
|
261
180
|
- MIT
|
262
181
|
metadata:
|
263
182
|
homepage_uri: https://github.com/flavorjones/loofah
|
183
|
+
source_code_uri: https://github.com/flavorjones/loofah
|
264
184
|
bug_tracker_uri: https://github.com/flavorjones/loofah/issues
|
185
|
+
changelog_uri: https://github.com/flavorjones/loofah/blob/main/CHANGELOG.md
|
265
186
|
documentation_uri: https://www.rubydoc.info/gems/loofah/
|
266
|
-
changelog_uri: https://github.com/flavorjones/loofah/master/CHANGELOG.md
|
267
|
-
source_code_uri: https://github.com/flavorjones/loofah
|
268
187
|
post_install_message:
|
269
|
-
rdoc_options:
|
270
|
-
- "--main"
|
271
|
-
- README.md
|
188
|
+
rdoc_options: []
|
272
189
|
require_paths:
|
273
190
|
- lib
|
274
191
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -282,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
282
199
|
- !ruby/object:Gem::Version
|
283
200
|
version: '0'
|
284
201
|
requirements: []
|
285
|
-
rubygems_version: 3.
|
202
|
+
rubygems_version: 3.3.5
|
286
203
|
signing_key:
|
287
204
|
specification_version: 4
|
288
205
|
summary: Loofah is a general library for manipulating and transforming HTML/XML documents
|
data/Gemfile
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
|
-
# DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake bundler:gemfile`.
|
4
|
-
|
5
|
-
source "https://rubygems.org/"
|
6
|
-
|
7
|
-
gem "nokogiri", ">=1.5.9"
|
8
|
-
gem "crass", "~>1.0.2"
|
9
|
-
|
10
|
-
gem "rake", "~>12.3", :group => [:development, :test]
|
11
|
-
gem "minitest", "~>2.2", :group => [:development, :test]
|
12
|
-
gem "rr", "~>1.2.0", :group => [:development, :test]
|
13
|
-
gem "json", "~>2.2.0", :group => [:development, :test]
|
14
|
-
gem "hoe-gemspec", "~>1.0", :group => [:development, :test]
|
15
|
-
gem "hoe-debugging", "~>2.0", :group => [:development, :test]
|
16
|
-
gem "hoe-bundler", "~>1.5", :group => [:development, :test]
|
17
|
-
gem "hoe-git", "~>1.6", :group => [:development, :test]
|
18
|
-
gem "concourse", ">=0.26.0", :group => [:development, :test]
|
19
|
-
gem "rubocop", ">=0.76.0", :group => [:development, :test]
|
20
|
-
gem "rdoc", ">=4.0", "<7", :group => [:development, :test]
|
21
|
-
gem "hoe", "~>3.20", :group => [:development, :test]
|
22
|
-
|
23
|
-
# vim: syntax=ruby
|
data/Manifest.txt
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
CHANGELOG.md
|
2
|
-
Gemfile
|
3
|
-
MIT-LICENSE.txt
|
4
|
-
Manifest.txt
|
5
|
-
README.md
|
6
|
-
Rakefile
|
7
|
-
SECURITY.md
|
8
|
-
benchmark/benchmark.rb
|
9
|
-
benchmark/fragment.html
|
10
|
-
benchmark/helper.rb
|
11
|
-
benchmark/www.slashdot.com.html
|
12
|
-
lib/loofah.rb
|
13
|
-
lib/loofah/elements.rb
|
14
|
-
lib/loofah/helpers.rb
|
15
|
-
lib/loofah/html/document.rb
|
16
|
-
lib/loofah/html/document_fragment.rb
|
17
|
-
lib/loofah/html5/libxml2_workarounds.rb
|
18
|
-
lib/loofah/html5/safelist.rb
|
19
|
-
lib/loofah/html5/scrub.rb
|
20
|
-
lib/loofah/instance_methods.rb
|
21
|
-
lib/loofah/metahelpers.rb
|
22
|
-
lib/loofah/scrubber.rb
|
23
|
-
lib/loofah/scrubbers.rb
|
24
|
-
lib/loofah/xml/document.rb
|
25
|
-
lib/loofah/xml/document_fragment.rb
|
data/Rakefile
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "hoe"
|
3
|
-
require "concourse"
|
4
|
-
|
5
|
-
Hoe.plugin :git
|
6
|
-
Hoe.plugin :gemspec
|
7
|
-
Hoe.plugin :bundler
|
8
|
-
Hoe.plugin :debugging
|
9
|
-
|
10
|
-
Hoe.spec "loofah" do
|
11
|
-
developer "Mike Dalessio", "mike.dalessio@gmail.com"
|
12
|
-
developer "Bryan Helmkamp", "bryan@brynary.com"
|
13
|
-
|
14
|
-
self.history_file = "CHANGELOG.md"
|
15
|
-
self.readme_file = "README.md"
|
16
|
-
self.license "MIT"
|
17
|
-
self.urls = {
|
18
|
-
"home" => "https://github.com/flavorjones/loofah",
|
19
|
-
"bugs" => "https://github.com/flavorjones/loofah/issues",
|
20
|
-
"doco" => "https://www.rubydoc.info/gems/loofah/",
|
21
|
-
"clog" => "https://github.com/flavorjones/loofah/master/CHANGELOG.md",
|
22
|
-
"code" => "https://github.com/flavorjones/loofah",
|
23
|
-
}
|
24
|
-
|
25
|
-
extra_deps << ["nokogiri", ">=1.5.9"]
|
26
|
-
extra_deps << ["crass", "~> 1.0.2"]
|
27
|
-
|
28
|
-
extra_dev_deps << ["rake", "~> 12.3"]
|
29
|
-
extra_dev_deps << ["minitest", "~>2.2"]
|
30
|
-
extra_dev_deps << ["rr", "~>1.2.0"]
|
31
|
-
extra_dev_deps << ["json", "~> 2.2.0"]
|
32
|
-
extra_dev_deps << ["hoe-gemspec", "~> 1.0"]
|
33
|
-
extra_dev_deps << ["hoe-debugging", "~> 2.0"]
|
34
|
-
extra_dev_deps << ["hoe-bundler", "~> 1.5"]
|
35
|
-
extra_dev_deps << ["hoe-git", "~> 1.6"]
|
36
|
-
extra_dev_deps << ["concourse", ">=0.26.0"]
|
37
|
-
extra_dev_deps << ["rubocop", ">=0.76.0"]
|
38
|
-
end
|
39
|
-
|
40
|
-
task :gemspec do
|
41
|
-
system %q(rake debug_gem | grep -v "^\(in " > loofah.gemspec)
|
42
|
-
end
|
43
|
-
|
44
|
-
task :redocs => :fix_css
|
45
|
-
task :docs => :fix_css
|
46
|
-
task :fix_css do
|
47
|
-
better_css = <<-EOT
|
48
|
-
.method-description pre {
|
49
|
-
margin : 1em 0 ;
|
50
|
-
}
|
51
|
-
|
52
|
-
.method-description ul {
|
53
|
-
padding : .5em 0 .5em 2em ;
|
54
|
-
}
|
55
|
-
|
56
|
-
.method-description p {
|
57
|
-
margin-top : .5em ;
|
58
|
-
}
|
59
|
-
|
60
|
-
#main ul, div#documentation ul {
|
61
|
-
list-style-type : disc ! IMPORTANT ;
|
62
|
-
list-style-position : inside ! IMPORTANT ;
|
63
|
-
}
|
64
|
-
|
65
|
-
h2 + ul {
|
66
|
-
margin-top : 1em;
|
67
|
-
}
|
68
|
-
EOT
|
69
|
-
puts "* fixing css"
|
70
|
-
File.open("doc/rdoc.css", "a") { |f| f.write better_css }
|
71
|
-
end
|
72
|
-
|
73
|
-
desc "generate and upload docs to rubyforge"
|
74
|
-
task :doc_upload_to_rubyforge => :docs do
|
75
|
-
Dir.chdir "doc" do
|
76
|
-
system "rsync -avz --delete * rubyforge.org:/var/www/gforge-projects/loofah/loofah"
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
desc "generate safelists from W3C specifications"
|
81
|
-
task :generate_safelists do
|
82
|
-
load "tasks/generate-safelists"
|
83
|
-
end
|
84
|
-
|
85
|
-
task :rubocop => [:rubocop_security, :rubocop_frozen_string_literals]
|
86
|
-
task :rubocop_security do
|
87
|
-
sh "rubocop lib --only Security"
|
88
|
-
end
|
89
|
-
task :rubocop_frozen_string_literals do
|
90
|
-
sh "rubocop lib --auto-correct --only Style/FrozenStringLiteralComment"
|
91
|
-
end
|
92
|
-
Rake::Task[:test].prerequisites << :rubocop
|
93
|
-
|
94
|
-
Concourse.new("loofah", fly_target: "ci") do |c|
|
95
|
-
c.add_pipeline "loofah", "loofah.yml"
|
96
|
-
c.add_pipeline "loofah-pr", "loofah-pr.yml"
|
97
|
-
end
|
data/benchmark/benchmark.rb
DELETED
@@ -1,154 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require "#{File.dirname(__FILE__)}/helper.rb"
|
3
|
-
|
4
|
-
def compare_scrub_methods
|
5
|
-
snip = "<div>foo</div><foo>fuxx <b>quux</b></foo><script>i have a chair</script>"
|
6
|
-
puts "starting with:\n#{snip}"
|
7
|
-
puts
|
8
|
-
puts RailsSanitize.new.sanitize(snip) # => Rails.sanitize / scrub!(:prune).to_s
|
9
|
-
puts Loofah::Helpers.sanitize(snip)
|
10
|
-
puts "--"
|
11
|
-
puts RailsSanitize.new.strip_tags(snip) # => Rails.strip_tags / parse().text
|
12
|
-
puts Loofah::Helpers.strip_tags(snip)
|
13
|
-
puts "--"
|
14
|
-
puts Sanitize.clean(snip, Sanitize::Config::RELAXED) # => scrub!(:strip).to_s
|
15
|
-
puts Loofah.scrub_fragment(snip, :strip).to_s
|
16
|
-
puts "--"
|
17
|
-
puts HTML5libSanitize.new.sanitize(snip) # => scrub!(:escape).to_s
|
18
|
-
puts Loofah.scrub_fragment(snip, :escape).to_s
|
19
|
-
puts "--"
|
20
|
-
puts HTMLFilter.new.filter(snip)
|
21
|
-
puts Loofah.scrub_fragment(snip, :strip).to_s
|
22
|
-
puts
|
23
|
-
end
|
24
|
-
|
25
|
-
module TestSet
|
26
|
-
def test_set(options = {})
|
27
|
-
scale = options[:rehearse] ? 10 : 1
|
28
|
-
puts self.class.name
|
29
|
-
|
30
|
-
n = 100 / scale
|
31
|
-
puts " Large document, #{BIG_FILE.length} bytes (x#{n})"
|
32
|
-
bench BIG_FILE, n, false
|
33
|
-
puts
|
34
|
-
|
35
|
-
n = 1000 / scale
|
36
|
-
puts " Small fragment, #{FRAGMENT.length} bytes (x#{n})"
|
37
|
-
bench FRAGMENT, n, true
|
38
|
-
puts
|
39
|
-
|
40
|
-
n = 10_000 / scale
|
41
|
-
puts " Text snippet, #{SNIPPET.length} bytes (x#{n})"
|
42
|
-
bench SNIPPET, n, true
|
43
|
-
puts
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class HeadToHead < Measure
|
48
|
-
end
|
49
|
-
|
50
|
-
class HeadToHeadRailsSanitize < Measure
|
51
|
-
include TestSet
|
52
|
-
|
53
|
-
def bench(content, ntimes, fragment_p)
|
54
|
-
clear_measure
|
55
|
-
|
56
|
-
measure "Loofah::Helpers.sanitize", ntimes do
|
57
|
-
Loofah::Helpers.sanitize content
|
58
|
-
end
|
59
|
-
|
60
|
-
sanitizer = RailsSanitize.new
|
61
|
-
measure "ActionView sanitize", ntimes do
|
62
|
-
sanitizer.sanitize(content)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
class HeadToHeadRailsStripTags < Measure
|
68
|
-
include TestSet
|
69
|
-
|
70
|
-
def bench(content, ntimes, fragment_p)
|
71
|
-
clear_measure
|
72
|
-
|
73
|
-
measure "Loofah::Helpers.strip_tags", ntimes do
|
74
|
-
Loofah::Helpers.strip_tags content
|
75
|
-
end
|
76
|
-
|
77
|
-
sanitizer = RailsSanitize.new
|
78
|
-
measure "ActionView strip_tags", ntimes do
|
79
|
-
sanitizer.strip_tags(content)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
class HeadToHeadSanitizerSanitize < Measure
|
85
|
-
include TestSet
|
86
|
-
|
87
|
-
def bench(content, ntimes, fragment_p)
|
88
|
-
clear_measure
|
89
|
-
|
90
|
-
measure "Loofah :strip", ntimes do
|
91
|
-
if fragment_p
|
92
|
-
Loofah.scrub_fragment(content, :strip).to_s
|
93
|
-
else
|
94
|
-
Loofah.scrub_document(content, :strip).to_s
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
measure "Sanitize.clean", ntimes do
|
99
|
-
Sanitize.clean(content, Sanitize::Config::RELAXED)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
class HeadToHeadHtml5LibSanitize < Measure
|
105
|
-
include TestSet
|
106
|
-
|
107
|
-
def bench(content, ntimes, fragment_p)
|
108
|
-
clear_measure
|
109
|
-
|
110
|
-
measure "Loofah :escape", ntimes do
|
111
|
-
if fragment_p
|
112
|
-
Loofah.scrub_fragment(content, :escape).to_s
|
113
|
-
else
|
114
|
-
Loofah.scrub_document(content, :escape).to_s
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
html5_sanitizer = HTML5libSanitize.new
|
119
|
-
measure "HTML5lib.sanitize", ntimes do
|
120
|
-
html5_sanitizer.sanitize(content)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
class HeadToHeadHTMLFilter < Measure
|
126
|
-
include TestSet
|
127
|
-
|
128
|
-
def bench(content, ntimes, fragment_p)
|
129
|
-
clear_measure
|
130
|
-
|
131
|
-
measure "Loofah::Helpers.sanitize", ntimes do
|
132
|
-
Loofah::Helpers.sanitize content
|
133
|
-
end
|
134
|
-
|
135
|
-
sanitizer = HTMLFilter.new
|
136
|
-
measure "HTMLFilter.filter", ntimes do
|
137
|
-
sanitizer.filter(content)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
puts "Nokogiri version: #{Nokogiri::VERSION_INFO.inspect}"
|
143
|
-
puts "Loofah version: #{Loofah::VERSION.inspect}"
|
144
|
-
|
145
|
-
benches = []
|
146
|
-
benches << HeadToHeadRailsSanitize.new
|
147
|
-
benches << HeadToHeadRailsStripTags.new
|
148
|
-
benches << HeadToHeadSanitizerSanitize.new
|
149
|
-
benches << HeadToHeadHtml5LibSanitize.new
|
150
|
-
benches << HeadToHeadHTMLFilter.new
|
151
|
-
puts "---------- rehearsal ----------"
|
152
|
-
benches.each { |bench| bench.test_set :rehearse => true }
|
153
|
-
puts "---------- realsies ----------"
|
154
|
-
benches.each { |bench| bench.test_set }
|
data/benchmark/fragment.html
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
<div id="top_parent"></div>
|
2
|
-
|
3
|
-
<div id="jump">
|
4
|
-
<a href="#main-articles">Stories</a>
|
5
|
-
<br>
|
6
|
-
<a href="#blocks">Slash Boxes</a>
|
7
|
-
<br>
|
8
|
-
<a href="#comments">Comments</a>
|
9
|
-
</div>
|
10
|
-
<a name="topothepage"></a>
|
11
|
-
<div id="doc3" class="yui-t6 index2 mainpage ac ">
|
12
|
-
<div id="hd" >
|
13
|
-
<div id="logo" >
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
<h1><a href="//slashdot.org"><span>Slashdot</span></a></h1>
|
18
|
-
<div id="slogan"><h2>News for nerds, stuff that matters</h2></div>
|
19
|
-
</div>
|
20
|
-
<a href="#articles" class="hidden">Jump to articles</a>
|
21
|
-
<div class="nav">
|
22
|
-
<ul>
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
<li><a href="//slashdot.org/submit.pl" title="Submit a story to Slashdot">Submit Story</a></li>
|
27
|
-
<li><a href="//slashdot.org/help" title="Frequently asked questions on Slashdot">Help</a></li>
|
28
|
-
<li><a href="//slashdot.org/login.pl" onclick="show_login_box(); return false;">Log In</a></li>
|
29
|
-
|
30
|
-
</ul>
|
31
|
-
</div>
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
<div id="fh_picker_search" style="display: block;">
|
38
|
-
<form method="get" action="//slashdot.org/index2.pl">
|
39
|
-
<fieldset class="mode-filter mode-anon">
|
40
|
-
<legend>Search</legend>
|
41
|
-
|
42
|
-
|
43
|
-
<input class="query" type="text" name="fhfilter" value="" id="searchquery"> <input type="button" class="setfhfilter" value="Filter" id="viewsearch" style="display:none"> <input type="submit" class="setsearchfilter" value="Search" id="fhsearch" style="display:none">
|
44
|
-
<noscript><input type="submit" class="setsearchfilter" value="Search"></noscript>
|
45
|
-
|
46
|
-
<script type="text/javascript">
|
47
|
-
var slash_search;
|
48
|
-
$(function(){
|
49
|
-
if (has_hose()) {
|
50
|
-
var $search_text = $any('searchquery'),
|
51
|
-
$panel = $search_text.closest('fieldset');
|
52
|
-
$search_buttons = $('#viewsearch,#fhsearch'),
|
53
|
-
ws = /\s+/;
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
// The search buttons set the firehose option named by their class.
|
58
|
-
$search_buttons.
|
59
|
-
click(function(){
|
60
|
-
var which=this.className;
|
61
|
-
$search_text.each(function(){
|
62
|
-
firehose_set_options(which, this.value);
|
63
|
-
});
|
64
|
-
return false;
|
65
|
-
});
|
66
|
-
|
67
|
-
// Provide a globally available function that does whatever clicking the search button would do.
|
68
|
-
slash_search = function( query ){
|
69
|
-
query!==undefined && $search_text.val(query);
|
70
|
-
$search_buttons.filter(':visible:first').click();
|
71
|
-
};
|
72
|
-
|
73
|
-
$search_text.
|
74
|
-
keydown(function( e ){ // ESCAPE restores the filter in-effect.
|
75
|
-
if ( e.which == $.ui.keyCode.ESCAPE ) {
|
76
|
-
$search_text.val(firehose_settings.fhfilter||'');
|
77
|
-
return true;
|
78
|
-
}
|
79
|
-
if ( e.which == $.ui.keyCode.ENTER ) {
|
80
|
-
slash_search();
|
81
|
-
return false;
|
82
|
-
}
|
83
|
-
});
|
84
|
-
|
85
|
-
$(document).
|
86
|
-
bind('firehose-setting-setfhfilter firehose-setting-setsearchfilter', function( e, new_query ){
|
87
|
-
$('fieldset input[type=text]').each(function(){
|
88
|
-
$(this).blur().val(new_query);
|
89
|
-
});
|
90
|
-
}).
|
91
|
-
bind('set-options.firehose', function( e, data ){
|
92
|
-
data.select_section && $panel.toggleClass('mode-filter', data.id!=='unsaved');
|
93
|
-
});
|
94
|
-
}
|
95
|
-
});
|
96
|
-
</script>
|