walters 0.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Licensed under the Apache License, Version 2.0 (the "License");
2
+ you may not use this file except in compliance with the License.
3
+ You may obtain a copy of the License at
4
+
5
+ http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ Unless required by applicable law or agreed to in writing, software
8
+ distributed under the License is distributed on an "AS IS" BASIS,
9
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ See the License for the specific language governing permissions and
11
+ limitations under the License.
12
+
13
+
14
+ This software also contains code licensed under the GNU General Public License version 2 with a linking exception.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010-2013 Brian Lopez - http://github.com/brianmario
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,14 @@
1
+ Copyright (C) 2012 Vicent Martí
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ documentation files (the "Software"), to deal in the Software without restriction, including without
5
+ limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
6
+ of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7
+
8
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions
9
+ of the Software.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
12
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
14
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,52 @@
1
+ walters [![Build Status](https://travis-ci.org/wmeissner/walters.png)](https://travis-ci.org/wmeissner/walters)
2
+ ======
3
+
4
+ [Walters](https://github.com/wmeissner/walters) is a fast HTML (and href, uri, xml, javascript) escaping library for JRuby.
5
+
6
+ It is optimised for the non-escaping case - i.e. where the input string contains no characters requiring escaping.
7
+
8
+ ### Example usage
9
+
10
+ jruby-1.7.4.dev :001 > require 'walters'
11
+ => true
12
+ jruby-1.7.4.dev :002 > Walters.escape_html('<html>')
13
+ => "&lt;html&gt;"
14
+
15
+
16
+ The same extension can also be used from the legacy CRuby VM for compatibility.
17
+
18
+ 2.0.0p0 :001 > require 'walters'
19
+ => true
20
+ 2.0.0p0 :002 > Walters.escape_html('<html>')
21
+ => "&lt;html&gt;"
22
+
23
+ ### Benchmarks
24
+ Escaping 1000 bytes of text requiring escaping 1000000 times under jruby-1.7.4:
25
+
26
+ user system total real
27
+ Rack::Utils.escape_html 89.980000 0.230000 90.210000 ( 90.272000)
28
+ Haml::Helpers.html_escape 50.420000 0.170000 50.590000 ( 51.147000)
29
+ ERB::Util.html_escape 44.650000 0.130000 44.780000 ( 45.518000)
30
+ CGI.escapeHTML 36.230000 0.090000 36.320000 ( 36.358000)
31
+ String#gsub 35.490000 0.090000 35.580000 ( 35.587000)
32
+ Walters.escape_html 10.090000 0.030000 10.120000 ( 10.126000)
33
+
34
+ Escaping 1000 bytes of html-free text 1000000 times under jruby-1.7.4:
35
+
36
+ user system total real
37
+ Rack::Utils.escape_html 3.530000 0.010000 3.540000 ( 3.601000)
38
+ Haml::Helpers.html_escape 4.140000 0.010000 4.150000 ( 4.196000)
39
+ ERB::Util.html_escape 11.710000 0.030000 11.740000 ( 11.876000)
40
+ CGI.escapeHTML 3.440000 0.010000 3.450000 ( 3.548000)
41
+ String#gsub 3.470000 0.000000 3.470000 ( 3.531000)
42
+ Walters.escape_html 0.660000 0.010000 0.670000 ( 0.663000)
43
+
44
+ ### Punching ducks
45
+ There are monkey-patching shims supplied that replace common html escaping functions with calls to the Walters escape_html function.
46
+
47
+ e.g. to patch Rack::Utils.escape_html to use Walters.escape_html:
48
+
49
+ require 'walters/html/rack'
50
+
51
+ ### Credits
52
+ The escaping routines are based on C code from the [Houdini](https://github.com/vmg/houdini) project, and the specs, benchmarks and monkey patches come from the [escape_utils](https://github.com/brianmario/escape_utils) project
data/Rakefile ADDED
@@ -0,0 +1,71 @@
1
+ require 'rake/clean'
2
+ require 'rubygems/package_task'
3
+ require 'rubygems/tasks'
4
+
5
+
6
+ def gem_spec
7
+ @gem_spec ||= Gem::Specification.load('walters.gemspec')
8
+ end
9
+
10
+ TEST_DEPS = []
11
+ if defined?(JRUBY_VERSION)
12
+ require 'ant'
13
+ jar_file = 'lib/walters/walters_ext.jar'
14
+ CLEAN.include jar_file
15
+ TEST_DEPS << jar_file
16
+
17
+ gem_spec.files << jar_file
18
+
19
+ directory 'pkg/classes'
20
+ CLEAN.include 'pkg/classes'
21
+
22
+ desc 'Compile the JRuby extension'
23
+ task :compile => FileList['pkg/classes', 'jruby-ext/src/**/*.java'] do |t|
24
+ ant.javac :srcdir => 'jruby-ext/src', :destdir => t.prerequisites.first,
25
+ :source => '1.6', :target => '1.6', :debug => true, :includeantruntime => false,
26
+ :classpath => '${java.class.path}:${sun.boot.class.path}'
27
+ end
28
+
29
+ desc 'Build the jar'
30
+ file jar_file => :compile do |t|
31
+ ant.jar :basedir => 'pkg/classes', :destfile => t.name, :includes => '**/*.class'
32
+ end
33
+
34
+ task :jar => jar_file
35
+ end
36
+
37
+ Gem::Tasks.new do |t|
38
+ t.scm.tag.format = '%s'
39
+ end
40
+
41
+ task :specs do
42
+ sh %{#{Gem.ruby} -w -Ilib -S rspec spec}
43
+ end
44
+
45
+ namespace 'java' do
46
+ java_gem_spec = Gem::Specification.new do |s|
47
+ s.name = gem_spec.name
48
+ s.version = gem_spec.version
49
+ s.author = gem_spec.author
50
+ s.email = gem_spec.email
51
+ s.homepage = gem_spec.homepage
52
+ s.summary = gem_spec.summary
53
+ s.description = gem_spec.description
54
+ s.files = %w(LICENSE LICENSE-EscapeUtils.txt LICENSE-houdini.txt README.md Rakefile)
55
+ s.files << Dir['{lib,spec,benchmark}/**/*.rb']
56
+ s.files << 'lib/walters/walters_ext.jar'
57
+ s.has_rdoc = false
58
+ s.license = gem_spec.license
59
+ s.platform = 'java'
60
+ end
61
+
62
+ Gem::PackageTask.new(java_gem_spec) do |pkg|
63
+ pkg.need_zip = true
64
+ pkg.need_tar = true
65
+ pkg.package_dir = 'pkg'
66
+ end
67
+
68
+ task :gem => 'lib/walters/walters_ext.jar'
69
+ end
70
+
71
+ task 'gem:java' => 'java:gem'
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
3
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
4
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
5
+
6
+ require 'rubygems'
7
+ require 'benchmark'
8
+
9
+ require 'rack'
10
+ require 'erb'
11
+ require 'cgi'
12
+ require 'haml'
13
+ require 'walters'
14
+ unless defined?(JRUBY_VERSION)
15
+ require 'fast_xs'
16
+ require 'escape_utils'
17
+ end
18
+
19
+ module HamlBench
20
+ extend Haml::Helpers
21
+ end
22
+
23
+ times = 1000_000
24
+ url = "http://en.wikipedia.org/wiki/Line_of_succession_to_the_British_throne"
25
+ html = ((('a'..'z').to_a.join('') + ('A'..'Z').to_a.join('')) * 100)[0...1000]
26
+ html = html.force_encoding('utf-8') if html.respond_to?(:force_encoding)
27
+
28
+ puts "Escaping #{html.bytesize} bytes of html #{times} times, from #{url}"
29
+
30
+ Benchmark.bmbm do |x|
31
+ x.report "Rack::Utils.escape_html" do
32
+ times.times do
33
+ Rack::Utils.escape_html(html)
34
+ end
35
+ end
36
+
37
+ x.report "Haml::Helpers.html_escape" do
38
+ times.times do
39
+ HamlBench.html_escape(html)
40
+ end
41
+ end
42
+
43
+ x.report "ERB::Util.html_escape" do
44
+ times.times do
45
+ ERB::Util.html_escape(html)
46
+ end
47
+ end
48
+
49
+ x.report "CGI.escapeHTML" do
50
+ times.times do
51
+ CGI.escapeHTML(html)
52
+ end
53
+ end
54
+
55
+ x.report "String#gsub" do
56
+ html_escape = { '&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;', "'" => '&#39;' }
57
+ times.times do
58
+ html.gsub(/[&"'><]/, html_escape)
59
+ end
60
+ end
61
+
62
+ x.report "Walters.escape_html" do
63
+ times.times do
64
+ Walters.escape_html(html)
65
+ end
66
+ end
67
+
68
+ unless defined?(JRUBY_VERSION)
69
+ #x.report "fast_xs_extra#fast_xs_html" do
70
+ # times.times do
71
+ # html.fast_xs_html
72
+ # end
73
+ #end
74
+ #
75
+ x.report "EscapeUtils.escape_html" do
76
+ times.times do
77
+ EscapeUtils.escape_html(html)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
3
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
4
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
5
+
6
+ require 'rubygems'
7
+ require 'benchmark'
8
+
9
+ require 'rack'
10
+ require 'erb'
11
+ require 'cgi'
12
+ require 'haml'
13
+ require 'walters'
14
+ unless defined?(JRUBY_VERSION)
15
+ require 'fast_xs'
16
+ require 'escape_utils'
17
+ end
18
+
19
+ module HamlBench
20
+ extend Haml::Helpers
21
+ end
22
+
23
+ times = 1000_000
24
+ url = "http://en.wikipedia.org/wiki/Line_of_succession_to_the_British_throne"
25
+ html = `curl -s #{url}`[0...1000]
26
+ html = html.force_encoding('utf-8') if html.respond_to?(:force_encoding)
27
+
28
+ # Warm up java code
29
+ 10_000_000.times { Walters.escape_html('fubar foo<bar>\'/&""') }
30
+
31
+ puts "Escaping #{html.bytesize} bytes of html #{times} times, from #{url}"
32
+
33
+ Benchmark.bmbm do |x|
34
+ x.report "Rack::Utils.escape_html" do
35
+ times.times do
36
+ Rack::Utils.escape_html(html)
37
+ end
38
+ end
39
+
40
+ x.report "Haml::Helpers.html_escape" do
41
+ times.times do
42
+ HamlBench.html_escape(html)
43
+ end
44
+ end
45
+
46
+ x.report "ERB::Util.html_escape" do
47
+ times.times do
48
+ ERB::Util.html_escape(html)
49
+ end
50
+ end
51
+
52
+ x.report "CGI.escapeHTML" do
53
+ times.times do
54
+ CGI.escapeHTML(html)
55
+ end
56
+ end
57
+
58
+ x.report "String#gsub" do
59
+ html_escape = { '&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;', "'" => '&#39;' }
60
+ times.times do
61
+ html.gsub(/[&"'><]/, html_escape)
62
+ end
63
+ end
64
+
65
+ x.report "Walters.escape_html" do
66
+ times.times do
67
+ Walters.escape_html(html)
68
+ end
69
+ end
70
+
71
+ unless defined?(JRUBY_VERSION)
72
+ x.report "EscapeUtils.escape_html" do
73
+ times.times do
74
+ EscapeUtils.escape_html(html)
75
+ end
76
+ end
77
+ end
78
+ end
data/lib/walters.rb ADDED
@@ -0,0 +1,2 @@
1
+ require_relative 'walters/walters'
2
+ require_relative 'walters/version'
@@ -0,0 +1,12 @@
1
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
2
+ require_relative 'html_safety'
3
+
4
+ module CGI
5
+ extend ::Walters::HtmlSafety
6
+ extend ::Walters::HtmlUnescape
7
+
8
+ class << self
9
+ alias escapeHTML walters_escape_html
10
+ alias unescapeHTML walters_unescape_html
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
2
+ require_relative 'html_safety'
3
+
4
+ class ERB
5
+ module Util
6
+ include ::Walters::HtmlSafety
7
+
8
+ alias html_escape walters_escape_html
9
+ alias h html_escape
10
+ module_function :h
11
+ module_function :html_escape
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
2
+ require_relative 'html_safety'
3
+
4
+ module Haml
5
+ module Helpers
6
+ include ::Walters::HtmlSafety
7
+
8
+ alias html_escape walters_escape_html
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
2
+ require 'walters'
3
+
4
+ module Walters
5
+ module HtmlSafety
6
+ if ''.respond_to? :html_safe?
7
+ def walters_escape_html(s)
8
+ if s.html_safe?
9
+ s.to_s.html_safe
10
+ else
11
+ Walters.escape_html(s).html_safe
12
+ end
13
+ end
14
+ else
15
+ include ::Walters::HtmlEscape
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,11 @@
1
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
2
+ require_relative 'html_safety'
3
+
4
+ module Rack
5
+ module Utils
6
+ include ::Walters::HtmlSafety
7
+
8
+ alias escape_html walters_escape_html
9
+ module_function :escape_html
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
2
+ require 'walters'
3
+
4
+ module ActionView
5
+ module Helpers
6
+ module JavaScriptHelper
7
+ include ::Walters::JavaScriptEscape
8
+ alias escape_javascript walters_escape_javascript
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Walters
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,23 @@
1
+ #
2
+ # Copyright (C) 2013 Wayne Meissner
3
+ #
4
+ # This file is part of the Walters project (http://github.com/wmeissner/walters).
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+
19
+ if defined?(JRUBY_VERSION)
20
+ require 'walters/walters_ext'
21
+ else
22
+ require_relative 'walters_xni'
23
+ end
Binary file
@@ -0,0 +1,109 @@
1
+ #
2
+ # Copyright (C) 2013 Wayne Meissner
3
+ #
4
+ # This file is part of the Walters project (http://github.com/wmeissner/walters).
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'xni'
19
+
20
+ module Walters
21
+ extend XNI::Extension
22
+ extension 'walters'
23
+
24
+ class Buffer < XNI::DataObject
25
+ custom_finalizer
26
+
27
+ native :initialize, [ :uint ], :void
28
+ native :cstring, [], :cstring
29
+
30
+ native :escape_html, [ :cstring, :uint], :bool
31
+ native :escape_html0, [ :cstring, :uint, :bool ], :bool
32
+ native :unescape_html, [ :cstring, :uint], :bool
33
+ native :escape_xml, [ :cstring, :uint], :bool
34
+ native :escape_uri, [ :cstring, :uint], :bool
35
+ native :escape_url, [ :cstring, :uint], :bool
36
+ native :escape_href, [ :cstring, :uint], :bool
37
+ native :unescape_uri, [ :cstring, :uint], :bool
38
+ native :unescape_url, [ :cstring, :uint], :bool
39
+ native :escape_js, [ :cstring, :uint], :bool
40
+ native :unescape_js, [ :cstring, :uint], :bool
41
+ end
42
+
43
+ native :free_cstring, [ :pointer ], :void
44
+ native :read_cstring, [ :pointer ], :cstring
45
+ native :_escape_html, [ :cstring, :uint, :bool], :pointer
46
+ native :_unescape_html, [ :cstring, :uint], :pointer
47
+ native :_escape_xml, [ :cstring, :uint], :pointer
48
+ native :_escape_uri, [ :cstring, :uint], :pointer
49
+ native :_escape_url, [ :cstring, :uint], :pointer
50
+ native :_escape_href, [ :cstring, :uint], :pointer
51
+ native :_unescape_uri, [ :cstring, :uint], :pointer
52
+ native :_unescape_url, [ :cstring, :uint], :pointer
53
+ native :_escape_js, [ :cstring, :uint], :pointer
54
+ native :_unescape_js, [ :cstring, :uint], :pointer
55
+
56
+ class << self
57
+ private
58
+ def cstring(ptr, str)
59
+ if ptr
60
+ begin
61
+ str = read_cstring(ptr)
62
+ ensure
63
+ free_cstring(ptr)
64
+ end
65
+ end
66
+ str
67
+ end
68
+ end
69
+
70
+ def self.escape_html(src, secure = true)
71
+ cstring _escape_html(src, src.length, secure), src
72
+ end
73
+
74
+ def self.unescape_html(src)
75
+ cstring _unescape_html(src, src.length), src
76
+ end
77
+
78
+ def self.escape_xml(src)
79
+ cstring _escape_xml(src, src.length), src
80
+ end
81
+
82
+ def self.escape_uri(src)
83
+ cstring _escape_uri(src, src.length), src
84
+ end
85
+
86
+ def self.escape_url(src)
87
+ cstring _escape_url(src, src.length), src
88
+ end
89
+
90
+ def self.escape_href(src)
91
+ cstring _escape_href(src, src.length), src
92
+ end
93
+
94
+ def self.unescape_uri(src)
95
+ cstring _unescape_uri(src, src.length), src
96
+ end
97
+
98
+ def self.unescape_url(src)
99
+ cstring _unescape_url(src, src.length), src
100
+ end
101
+
102
+ def self.escape_js(src)
103
+ cstring _escape_js(src, src.length), src
104
+ end
105
+
106
+ def self.unescape_js(src)
107
+ cstring _unescape_js(src, src.length), src
108
+ end
109
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: UTF-8
2
+ if defined?(JRUBY_VERSION)
3
+ system "cd #{File.expand_path('../..', __FILE__)} && ruby -S rake jar"
4
+ else
5
+ system "cd #{File.expand_path('../../xni-ext', __FILE__)} && ruby -S rake"
6
+ end
7
+
8
+ require 'walters'
@@ -0,0 +1,58 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2013 Wayne Meissner
4
+ #
5
+ # This file is part of the Walters project (http://github.com/wmeissner/walters).
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
20
+ #
21
+
22
+ require File.expand_path('../../spec_helper.rb', __FILE__)
23
+
24
+ describe 'html escape' do
25
+ it 'double quotes' do
26
+ Walters.escape_html("<some_tag some_attr=\"some value\"/>").should == '&lt;some_tag some_attr=&quot;some value&quot;&#47;&gt;'
27
+ end
28
+
29
+ it 'single quotes' do
30
+ Walters.escape_html("<some_tag some_attr='some value'/>").should == '&lt;some_tag some_attr=&#39;some value&#39;&#47;&gt;'
31
+ end
32
+
33
+ it 'ampersand' do
34
+ Walters.escape_html('<b>Bourbon & Branch</b>').should == '&lt;b&gt;Bourbon &amp; Branch&lt;&#47;b&gt;'
35
+ end
36
+
37
+ it 'original returned if no escaping required' do
38
+ str = 'foobar'
39
+ Walters.escape_html(str).should equal str
40
+ end
41
+
42
+ it 'all tags escaped' do
43
+ Walters.escape_html('&<>"\'/').should == '&amp;&lt;&gt;&quot;&#39;&#47;'
44
+ end
45
+
46
+ it 'plain text followed by tag' do
47
+ Walters.escape_html('foobar<1>').should == 'foobar&lt;1&gt;'
48
+ end
49
+
50
+ it 'non-utf8 input' do
51
+ lambda { Walters.escape_html('<b>Bourbon & Branch</b>'.encode('ISO-8859-1')) }.should raise_error Encoding::CompatibilityError
52
+ end
53
+
54
+ it 'returned value has same encoding as original' do
55
+ str = '<b>Bourbon & Branch</b>'.encode('utf-8')
56
+ Walters.escape_html(str).encoding.should == str.encoding
57
+ end
58
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2013 Wayne Meissner
4
+ #
5
+ # This file is part of the Walters project (http://github.com/wmeissner/walters).
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This file contains code based on the EscapeUtils project. See the file LICENSE-EscapeUtils.txt for details.
20
+ #
21
+
22
+ describe 'javascript' do
23
+ it 'quotes and newlines' do
24
+ Walters.escape_javascript(%(This "thing" is really\n netos\r\n\n')).should == %(This \\"thing\\" is really\\n netos\\n\\n\\')
25
+ end
26
+
27
+ it 'backslash' do
28
+ Walters.escape_javascript(%(backslash\\test)).should == %(backslash\\\\test)
29
+
30
+ end
31
+
32
+ it 'closed html tags' do
33
+ Walters.escape_javascript(%(keep <open>, but dont </close> tags)).should == %(keep <open>, but dont <\\/close> tags)
34
+ end
35
+
36
+ it 'original returned if no escaping required' do
37
+ str = 'foobar'
38
+ Walters.escape_javascript(str).should equal str
39
+ end
40
+
41
+ it 'input must be utf8' do
42
+ lambda { Walters.escape_javascript('dont </close> tags'.encode('ISO-8859-1')) }.should raise_error(Encoding::CompatibilityError)
43
+ end
44
+
45
+ it 'return value has same encoding as input' do
46
+ str = "dont </close> tags"
47
+ Walters.escape_javascript(str).encoding.should == Encoding.find('UTF-8')
48
+ end
49
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: walters
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: java
7
+ authors:
8
+ - Wayne Meissner
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-02 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: JRuby wrapper for Houdini html escaping library
15
+ email: wmeissner@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - LICENSE
21
+ - LICENSE-EscapeUtils.txt
22
+ - LICENSE-houdini.txt
23
+ - README.md
24
+ - Rakefile
25
+ - lib/walters.rb
26
+ - lib/walters/version.rb
27
+ - lib/walters/walters.rb
28
+ - lib/walters/walters_xni.rb
29
+ - lib/walters/html/cgi.rb
30
+ - lib/walters/html/erb.rb
31
+ - lib/walters/html/haml.rb
32
+ - lib/walters/html/html_safety.rb
33
+ - lib/walters/html/rack.rb
34
+ - lib/walters/javascript/action_view.rb
35
+ - spec/spec_helper.rb
36
+ - spec/walters/html_escape_spec.rb
37
+ - spec/walters/javascript_escape_spec.rb
38
+ - benchmark/html_clean_escape.rb
39
+ - benchmark/html_escape.rb
40
+ - lib/walters/walters_ext.jar
41
+ homepage: http://wiki.github.com/wmeissner/walters
42
+ licenses:
43
+ - Apache 2.0
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ none: false
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ none: false
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 1.8.24
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: JRuby wrapper for Houdini
66
+ test_files: []