erb 4.0.1-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5013347602fe04849ab4f30713e5f33c3119e4a8de6f3de31dc2a39108d70a46
4
+ data.tar.gz: cc71c6d4bdb04f39d35873317b340289e372b27cd343fbb596d2d0d9c18dbbd0
5
+ SHA512:
6
+ metadata.gz: ae29c46417424d5487c271975695ee21d5e437b3d8adbed5303dbb6aeef8d35401255d8527cf6c17bff84001d57112bad69c4272075e9c1251ea26b075662091
7
+ data.tar.gz: b33d009e86b08846aaeef2652add1251288bcbc245900cde13dd0762bf7c7f74228da036b00732bc7efb50f291c68969c41af70d2ab6debfb1b75f8aa2adeb4b
@@ -0,0 +1,36 @@
1
+ name: test
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ ruby-versions:
11
+ runs-on: ubuntu-latest
12
+ outputs:
13
+ versions: ${{ steps.versions.outputs.value }}
14
+ steps:
15
+ - id: versions
16
+ run: |
17
+ versions=$(curl -s 'https://cache.ruby-lang.org/pub/misc/ci_versions/cruby.json' | jq -c '. + ["jruby", "truffleruby-head"]')
18
+ echo "::set-output name=value::${versions}"
19
+ test:
20
+ needs: ruby-versions
21
+ name: build (${{ matrix.ruby }} / ${{ matrix.os }})
22
+ strategy:
23
+ matrix:
24
+ ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
25
+ os: [ubuntu-latest]
26
+ fail-fast: false
27
+ runs-on: ${{ matrix.os }}
28
+ steps:
29
+ - uses: actions/checkout@v2
30
+ - name: Set up Ruby
31
+ uses: ruby/setup-ruby@v1
32
+ with:
33
+ ruby-version: ${{ matrix.ruby }}
34
+ bundler-cache: true
35
+ - name: Run test
36
+ run: bundle exec rake test
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ Gemfile.lock
10
+ *.so
11
+ *.bundle
12
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'rake'
7
+ gem 'rake-compiler'
8
+ gem 'test-unit'
9
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
data/NEWS.md ADDED
@@ -0,0 +1,39 @@
1
+ # Change Log
2
+
3
+ ## 4.0.1
4
+
5
+ * Stop building the C extension for TruffleRuby [#39](https://github.com/ruby/erb/pull/39)
6
+
7
+ ## 4.0.0
8
+
9
+ * Optimize `ERB::Util.html_escape` [#27](https://github.com/ruby/erb/pull/27)
10
+ * No longer duplicate an argument string when nothing is escaped.
11
+ * This makes `ERB::Util.html_escape` faster than `CGI.escapeHTML` in no-escape cases.
12
+ * It skips calling `#to_s` when an argument is already a String.
13
+ * Define `ERB::Escape.html_escape` as an alias to `ERB::Util.html_escape` [#38](https://github.com/ruby/erb/pull/38)
14
+ * `ERB::Util.html_escape` is known to be monkey-patched by Rails.
15
+ `ERB::Escape.html_escape` is useful when you want a non-monkey-patched version.
16
+ * Drop deprecated `-S` option from `erb` command
17
+
18
+ ## 3.0.0
19
+
20
+ * Bump `required_ruby_version` to Ruby 2.7+ [#23](https://github.com/ruby/erb/pull/23)
21
+ * `ERB::Util.url_encode` uses a native implementation [#23](https://github.com/ruby/erb/pull/23)
22
+ * Fix a bug that a magic comment with a wrong format could be detected [#6](https://github.com/ruby/erb/pull/6)
23
+
24
+ ## 2.2.3
25
+
26
+ * Bump `required_ruby_version` from 2.3 to 2.5 as it has never been supported [#3](https://github.com/ruby/erb/pull/3)
27
+
28
+ ## 2.2.2
29
+
30
+ * `ERB.version` returns just a version number
31
+ * `ERB::Revision` is deprecated
32
+
33
+ ## 2.2.1
34
+
35
+ * `ERB#initialize` warns `safe_level` and later arguments even without -w
36
+
37
+ ## 2.2.0
38
+
39
+ * Ruby 3.0 promoted ERB to a default gem
data/README.md ADDED
@@ -0,0 +1,255 @@
1
+ # ERB
2
+
3
+ An easy to use but powerful templating system for Ruby.
4
+
5
+ ## Introduction
6
+
7
+ ERB provides an easy to use but powerful templating system for Ruby. Using
8
+ ERB, actual Ruby code can be added to any plain text document for the
9
+ purposes of generating document information details and/or flow control.
10
+
11
+ A very simple example is this:
12
+
13
+ ```rb
14
+ require 'erb'
15
+
16
+ x = 42
17
+ template = ERB.new <<-EOF
18
+ The value of x is: <%= x %>
19
+ EOF
20
+ puts template.result(binding)
21
+ ```
22
+
23
+ Prints: `The value of x is: 42`
24
+
25
+ More complex examples are given below.
26
+
27
+ ## Recognized Tags
28
+
29
+ ERB recognizes certain tags in the provided template and converts them based
30
+ on the rules below:
31
+
32
+ ```erb
33
+ <% Ruby code -- inline with output %>
34
+ <%= Ruby expression -- replace with result %>
35
+ <%# comment -- ignored -- useful in testing %> (`<% #` doesn't work. Don't use Ruby comments.)
36
+ % a line of Ruby code -- treated as <% line %> (optional -- see ERB.new)
37
+ %% replaced with % if first thing on a line and % processing is used
38
+ <%% or %%> -- replace with <% or %> respectively
39
+ ```
40
+
41
+ All other text is passed through ERB filtering unchanged.
42
+
43
+ ## Options
44
+
45
+ There are several settings you can change when you use ERB:
46
+ * the nature of the tags that are recognized;
47
+ * the binding used to resolve local variables in the template.
48
+
49
+ See the ERB.new and ERB#result methods for more detail.
50
+
51
+ ## Character encodings
52
+
53
+ ERB (or Ruby code generated by ERB) returns a string in the same
54
+ character encoding as the input string. When the input string has
55
+ a magic comment, however, it returns a string in the encoding specified
56
+ by the magic comment.
57
+
58
+ ```rb
59
+ # -*- coding: utf-8 -*-
60
+ require 'erb'
61
+
62
+ template = ERB.new <<EOF
63
+ <%#-*- coding: Big5 -*-%>
64
+ __ENCODING__ is <%= __ENCODING__ %>.
65
+ EOF
66
+ puts template.result
67
+ ```
68
+
69
+ Prints: `__ENCODING__ is Big5.`
70
+
71
+ ## Examples
72
+
73
+ ### Plain Text
74
+
75
+ ERB is useful for any generic templating situation. Note that in this example, we use the
76
+ convenient "% at start of line" tag, and we quote the template literally with
77
+ `%q{...}` to avoid trouble with the backslash.
78
+
79
+ ```rb
80
+ require "erb"
81
+
82
+ # Create template.
83
+ template = %q{
84
+ From: James Edward Gray II <james@grayproductions.net>
85
+ To: <%= to %>
86
+ Subject: Addressing Needs
87
+
88
+ <%= to[/\w+/] %>:
89
+
90
+ Just wanted to send a quick note assuring that your needs are being
91
+ addressed.
92
+
93
+ I want you to know that my team will keep working on the issues,
94
+ especially:
95
+
96
+ <%# ignore numerous minor requests -- focus on priorities %>
97
+ % priorities.each do |priority|
98
+ * <%= priority %>
99
+ % end
100
+
101
+ Thanks for your patience.
102
+
103
+ James Edward Gray II
104
+ }.gsub(/^ /, '')
105
+
106
+ message = ERB.new(template, trim_mode: "%<>")
107
+
108
+ # Set up template data.
109
+ to = "Community Spokesman <spokesman@ruby_community.org>"
110
+ priorities = [ "Run Ruby Quiz",
111
+ "Document Modules",
112
+ "Answer Questions on Ruby Talk" ]
113
+
114
+ # Produce result.
115
+ email = message.result
116
+ puts email
117
+ ```
118
+
119
+ Generates:
120
+
121
+ ```
122
+ From: James Edward Gray II <james@grayproductions.net>
123
+ To: Community Spokesman <spokesman@ruby_community.org>
124
+ Subject: Addressing Needs
125
+
126
+ Community:
127
+
128
+ Just wanted to send a quick note assuring that your needs are being addressed.
129
+
130
+ I want you to know that my team will keep working on the issues, especially:
131
+
132
+ * Run Ruby Quiz
133
+ * Document Modules
134
+ * Answer Questions on Ruby Talk
135
+
136
+ Thanks for your patience.
137
+
138
+ James Edward Gray II
139
+ ```
140
+
141
+ ### Ruby in HTML
142
+
143
+ ERB is often used in .rhtml files (HTML with embedded Ruby). Notice the need in
144
+ this example to provide a special binding when the template is run, so that the instance
145
+ variables in the Product object can be resolved.
146
+
147
+ ```rb
148
+ require "erb"
149
+
150
+ # Build template data class.
151
+ class Product
152
+ def initialize( code, name, desc, cost )
153
+ @code = code
154
+ @name = name
155
+ @desc = desc
156
+ @cost = cost
157
+
158
+ @features = [ ]
159
+ end
160
+
161
+ def add_feature( feature )
162
+ @features << feature
163
+ end
164
+
165
+ # Support templating of member data.
166
+ def get_binding
167
+ binding
168
+ end
169
+
170
+ # ...
171
+ end
172
+
173
+ # Create template.
174
+ template = %{
175
+ <html>
176
+ <head><title>Ruby Toys -- <%= @name %></title></head>
177
+ <body>
178
+
179
+ <h1><%= @name %> (<%= @code %>)</h1>
180
+ <p><%= @desc %></p>
181
+
182
+ <ul>
183
+ <% @features.each do |f| %>
184
+ <li><b><%= f %></b></li>
185
+ <% end %>
186
+ </ul>
187
+
188
+ <p>
189
+ <% if @cost < 10 %>
190
+ <b>Only <%= @cost %>!!!</b>
191
+ <% else %>
192
+ Call for a price, today!
193
+ <% end %>
194
+ </p>
195
+
196
+ </body>
197
+ </html>
198
+ }.gsub(/^ /, '')
199
+
200
+ rhtml = ERB.new(template)
201
+
202
+ # Set up template data.
203
+ toy = Product.new( "TZ-1002",
204
+ "Rubysapien",
205
+ "Geek's Best Friend! Responds to Ruby commands...",
206
+ 999.95 )
207
+ toy.add_feature("Listens for verbal commands in the Ruby language!")
208
+ toy.add_feature("Ignores Perl, Java, and all C variants.")
209
+ toy.add_feature("Karate-Chop Action!!!")
210
+ toy.add_feature("Matz signature on left leg.")
211
+ toy.add_feature("Gem studded eyes... Rubies, of course!")
212
+
213
+ # Produce result.
214
+ rhtml.run(toy.get_binding)
215
+ ```
216
+
217
+ Generates (some blank lines removed):
218
+
219
+ ```html
220
+ <html>
221
+ <head><title>Ruby Toys -- Rubysapien</title></head>
222
+ <body>
223
+
224
+ <h1>Rubysapien (TZ-1002)</h1>
225
+ <p>Geek's Best Friend! Responds to Ruby commands...</p>
226
+
227
+ <ul>
228
+ <li><b>Listens for verbal commands in the Ruby language!</b></li>
229
+ <li><b>Ignores Perl, Java, and all C variants.</b></li>
230
+ <li><b>Karate-Chop Action!!!</b></li>
231
+ <li><b>Matz signature on left leg.</b></li>
232
+ <li><b>Gem studded eyes... Rubies, of course!</b></li>
233
+ </ul>
234
+
235
+ <p>
236
+ Call for a price, today!
237
+ </p>
238
+
239
+ </body>
240
+ </html>
241
+ ```
242
+
243
+ ## Notes
244
+
245
+ There are a variety of templating solutions available in various Ruby projects.
246
+ For example, RDoc, distributed with Ruby, uses its own template engine, which
247
+ can be reused elsewhere.
248
+
249
+ Other popular engines could be found in the corresponding
250
+ [Category](https://www.ruby-toolbox.com/categories/template_engines) of
251
+ The Ruby Toolbox.
252
+
253
+ ## License
254
+
255
+ The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause).
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test/lib'
6
+ t.ruby_opts << '-rhelper'
7
+ t.test_files = FileList['test/**/test_*.rb']
8
+ end
9
+
10
+ case RUBY_ENGINE
11
+ when 'jruby', 'truffleruby'
12
+ # not using C extension
13
+ else
14
+ require 'rake/extensiontask'
15
+ Rake::ExtensionTask.new('erb/escape')
16
+ task test: :compile
17
+ end
18
+
19
+ task :sync_tool do
20
+ require 'fileutils'
21
+ FileUtils.cp '../ruby/tool/lib/core_assertions.rb', './test/lib'
22
+ FileUtils.cp '../ruby/tool/lib/envutil.rb', './test/lib'
23
+ FileUtils.cp '../ruby/tool/lib/find_executable.rb', './test/lib'
24
+ end
25
+
26
+ task default: :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "erb"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/erb.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ begin
2
+ require_relative 'lib/erb/version'
3
+ rescue LoadError
4
+ # for Ruby core repository
5
+ require_relative 'erb/version'
6
+ end
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'erb'
10
+ spec.version = ERB.const_get(:VERSION, false)
11
+ spec.authors = ['Masatoshi SEKI', 'Takashi Kokubun']
12
+ spec.email = ['seki@ruby-lang.org', 'takashikkbn@gmail.com']
13
+
14
+ spec.summary = %q{An easy to use but powerful templating system for Ruby.}
15
+ spec.description = %q{An easy to use but powerful templating system for Ruby.}
16
+ spec.homepage = 'https://github.com/ruby/erb'
17
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
18
+ spec.licenses = ['Ruby', 'BSD-2-Clause']
19
+
20
+ spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['source_code_uri'] = spec.homepage
22
+
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = 'libexec'
27
+ spec.executables = ['erb']
28
+ spec.require_paths = ['lib']
29
+
30
+ if RUBY_ENGINE == 'jruby'
31
+ spec.platform = 'java'
32
+ else
33
+ spec.required_ruby_version = '>= 2.7.0'
34
+ spec.extensions = ['ext/erb/escape/extconf.rb']
35
+ end
36
+
37
+ spec.add_dependency 'cgi', '>= 0.3.3'
38
+ end
@@ -0,0 +1,95 @@
1
+ #include "ruby.h"
2
+ #include "ruby/encoding.h"
3
+
4
+ static VALUE rb_cERB, rb_mEscape, rb_cCGI;
5
+ static ID id_escapeHTML;
6
+
7
+ #define HTML_ESCAPE_MAX_LEN 6
8
+
9
+ static const struct {
10
+ uint8_t len;
11
+ char str[HTML_ESCAPE_MAX_LEN+1];
12
+ } html_escape_table[UCHAR_MAX+1] = {
13
+ #define HTML_ESCAPE(c, str) [c] = {rb_strlen_lit(str), str}
14
+ HTML_ESCAPE('\'', "&#39;"),
15
+ HTML_ESCAPE('&', "&amp;"),
16
+ HTML_ESCAPE('"', "&quot;"),
17
+ HTML_ESCAPE('<', "&lt;"),
18
+ HTML_ESCAPE('>', "&gt;"),
19
+ #undef HTML_ESCAPE
20
+ };
21
+
22
+ static inline void
23
+ preserve_original_state(VALUE orig, VALUE dest)
24
+ {
25
+ rb_enc_associate(dest, rb_enc_get(orig));
26
+ }
27
+
28
+ static inline long
29
+ escaped_length(VALUE str)
30
+ {
31
+ const long len = RSTRING_LEN(str);
32
+ if (len >= LONG_MAX / HTML_ESCAPE_MAX_LEN) {
33
+ ruby_malloc_size_overflow(len, HTML_ESCAPE_MAX_LEN);
34
+ }
35
+ return len * HTML_ESCAPE_MAX_LEN;
36
+ }
37
+
38
+ static VALUE
39
+ optimized_escape_html(VALUE str)
40
+ {
41
+ VALUE vbuf;
42
+ char *buf = ALLOCV_N(char, vbuf, escaped_length(str));
43
+ const char *cstr = RSTRING_PTR(str);
44
+ const char *end = cstr + RSTRING_LEN(str);
45
+
46
+ char *dest = buf;
47
+ while (cstr < end) {
48
+ const unsigned char c = *cstr++;
49
+ uint8_t len = html_escape_table[c].len;
50
+ if (len) {
51
+ memcpy(dest, html_escape_table[c].str, len);
52
+ dest += len;
53
+ }
54
+ else {
55
+ *dest++ = c;
56
+ }
57
+ }
58
+
59
+ VALUE escaped = str;
60
+ if (RSTRING_LEN(str) < (dest - buf)) {
61
+ escaped = rb_str_new(buf, dest - buf);
62
+ preserve_original_state(str, escaped);
63
+ }
64
+ ALLOCV_END(vbuf);
65
+ return escaped;
66
+ }
67
+
68
+ // ERB::Util.html_escape is different from CGI.escapeHTML in the following two parts:
69
+ // * ERB::Util.html_escape converts an argument with #to_s first (only if it's not T_STRING)
70
+ // * ERB::Util.html_escape does not allocate a new string when nothing needs to be escaped
71
+ static VALUE
72
+ erb_escape_html(VALUE self, VALUE str)
73
+ {
74
+ if (!RB_TYPE_P(str, T_STRING)) {
75
+ str = rb_convert_type(str, T_STRING, "String", "to_s");
76
+ }
77
+
78
+ if (rb_enc_str_asciicompat_p(str)) {
79
+ return optimized_escape_html(str);
80
+ }
81
+ else {
82
+ return rb_funcall(rb_cCGI, id_escapeHTML, 1, str);
83
+ }
84
+ }
85
+
86
+ void
87
+ Init_escape(void)
88
+ {
89
+ rb_cERB = rb_define_class("ERB", rb_cObject);
90
+ rb_mEscape = rb_define_module_under(rb_cERB, "Escape");
91
+ rb_define_module_function(rb_mEscape, "html_escape", erb_escape_html, 1);
92
+
93
+ rb_cCGI = rb_define_class("CGI", rb_cObject);
94
+ id_escapeHTML = rb_intern("escapeHTML");
95
+ }
@@ -0,0 +1,7 @@
1
+ require 'mkmf'
2
+
3
+ if RUBY_ENGINE == 'truffleruby'
4
+ File.write('Makefile', dummy_makefile($srcdir).join)
5
+ else
6
+ create_makefile 'erb/escape'
7
+ end