diff options
Diffstat (limited to 'lib/erb')
| -rw-r--r-- | lib/erb/compiler.rb | 25 | ||||
| -rw-r--r-- | lib/erb/def_method.rb | 2 | ||||
| -rw-r--r-- | lib/erb/erb.gemspec | 37 | ||||
| -rw-r--r-- | lib/erb/util.rb | 68 | ||||
| -rw-r--r-- | lib/erb/version.rb | 4 |
5 files changed, 101 insertions, 35 deletions
diff --git a/lib/erb/compiler.rb b/lib/erb/compiler.rb index 7096c8dcea..6d70288b4f 100644 --- a/lib/erb/compiler.rb +++ b/lib/erb/compiler.rb @@ -80,10 +80,16 @@ class ERB::Compiler # :nodoc: end class Scanner # :nodoc: - @scanner_map = {} + @scanner_map = defined?(Ractor) ? Ractor.make_shareable({}) : {} class << self - def register_scanner(klass, trim_mode, percent) - @scanner_map[[trim_mode, percent]] = klass + if defined?(Ractor) + def register_scanner(klass, trim_mode, percent) + @scanner_map = Ractor.make_shareable({ **@scanner_map, [trim_mode, percent] => klass }) + end + else + def register_scanner(klass, trim_mode, percent) + @scanner_map[[trim_mode, percent]] = klass + end end alias :regist_scanner :register_scanner end @@ -219,7 +225,7 @@ class ERB::Compiler # :nodoc: end end - ERB_STAG = %w(<%= <%# <%) + ERB_STAG = %w(<%= <%# <%).freeze def is_erb_stag?(s) ERB_STAG.member?(s) end @@ -466,7 +472,16 @@ class ERB::Compiler # :nodoc: return enc, frozen end + # :stopdoc: + WARNING_UPLEVEL = Class.new { + attr_reader :c + def initialize from + @c = caller.length - from.length + end + }.new(caller(0)).c + private_constant :WARNING_UPLEVEL + def warn_invalid_trim_mode(mode, uplevel:) - warn "Invalid ERB trim mode: #{mode.inspect} (trim_mode: nil, 0, 1, 2, or String composed of '%' and/or '-', '>', '<>')", uplevel: uplevel + 1 + warn "Invalid ERB trim mode: #{mode.inspect} (trim_mode: nil, 0, 1, 2, or String composed of '%' and/or '-', '>', '<>')", uplevel: uplevel + WARNING_UPLEVEL end end diff --git a/lib/erb/def_method.rb b/lib/erb/def_method.rb index aee989a926..e503b37140 100644 --- a/lib/erb/def_method.rb +++ b/lib/erb/def_method.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -#-- + # ERB::DefMethod # # Utility module to define eRuby script as instance method. diff --git a/lib/erb/erb.gemspec b/lib/erb/erb.gemspec new file mode 100644 index 0000000000..70113a2a04 --- /dev/null +++ b/lib/erb/erb.gemspec @@ -0,0 +1,37 @@ +begin + require_relative 'lib/erb/version' +rescue LoadError + # for Ruby core repository + require_relative 'version' +end + +Gem::Specification.new do |spec| + spec.name = 'erb' + spec.version = ERB::VERSION + spec.authors = ['Masatoshi SEKI', 'Takashi Kokubun'] + spec.email = ['seki@ruby-lang.org', 'k0kubun@ruby-lang.org'] + + spec.summary = %q{An easy to use but powerful templating system for Ruby.} + spec.description = %q{An easy to use but powerful templating system for Ruby.} + spec.homepage = 'https://github.com/ruby/erb' + spec.licenses = ['Ruby', 'BSD-2-Clause'] + + spec.metadata['homepage_uri'] = spec.homepage + spec.metadata['source_code_uri'] = spec.homepage + spec.metadata['changelog_uri'] = "https://github.com/ruby/erb/blob/v#{spec.version}/NEWS.md" + + spec.files = Dir.chdir(__dir__) do + `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|\.git|\.github)/}) } + end + spec.bindir = 'libexec' + spec.executables = ['erb'] + spec.require_paths = ['lib'] + + spec.required_ruby_version = '>= 3.2.0' + + if RUBY_ENGINE == 'jruby' + spec.platform = 'java' + else + spec.extensions = ['ext/erb/escape/extconf.rb'] + end +end diff --git a/lib/erb/util.rb b/lib/erb/util.rb index 1d2a36275d..d7d69eb4f1 100644 --- a/lib/erb/util.rb +++ b/lib/erb/util.rb @@ -1,18 +1,25 @@ # frozen_string_literal: true -#-- -# ERB::Escape -# -# A subset of ERB::Util. Unlike ERB::Util#html_escape, we expect/hope -# Rails will not monkey-patch ERB::Escape#html_escape. + +# Load CGI.escapeHTML and CGI.escapeURIComponent. +# CRuby: +# cgi.gem v0.1.0+ (Ruby 2.7-3.4) and Ruby 4.0+ stdlib have 'cgi/escape' and CGI.escapeHTML. +# cgi.gem v0.3.3+ (Ruby 3.2-3.4) and Ruby 4.0+ stdlib have CGI.escapeURIComponent. +# JRuby: cgi.gem has a Java extension 'cgi/escape'. +# TruffleRuby: lib/truffle/cgi/escape.rb requires 'cgi/util'. +require 'cgi/escape' + +# Load or define ERB::Escape#html_escape. +# We don't build the C extension 'cgi/escape' for JRuby, TruffleRuby, and WASM. +# miniruby (used by CRuby build scripts) also fails to load erb/escape.so. begin - # We don't build the C extension for JRuby, TruffleRuby, and WASM - if $LOAD_PATH.resolve_feature_path('erb/escape') - require 'erb/escape' - end -rescue LoadError # resolve_feature_path raises LoadError on TruffleRuby 22.3.0 -end -unless defined?(ERB::Escape) + require 'erb/escape' +rescue LoadError + # ERB::Escape + # + # A subset of ERB::Util. Unlike ERB::Util#html_escape, we expect/hope + # Rails will not monkey-patch ERB::Escape#html_escape. module ERB::Escape + # :stopdoc: def html_escape(s) CGI.escapeHTML(s.to_s) end @@ -20,7 +27,6 @@ unless defined?(ERB::Escape) end end -#-- # ERB::Util # # A utility module for conversion routines, often handy in HTML generation. @@ -42,20 +48,28 @@ module ERB::Util alias h html_escape module_function :h - # - # A utility method for encoding the String _s_ as a URL. - # - # require "erb" - # include ERB::Util - # - # puts url_encode("Programming Ruby: The Pragmatic Programmer's Guide") - # - # _Generates_ - # - # Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide - # - def url_encode(s) - CGI.escapeURIComponent(s.to_s) + if CGI.respond_to?(:escapeURIComponent) + # + # A utility method for encoding the String _s_ as a URL. + # + # require "erb" + # include ERB::Util + # + # puts url_encode("Programming Ruby: The Pragmatic Programmer's Guide") + # + # _Generates_ + # + # Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide + # + def url_encode(s) + CGI.escapeURIComponent(s.to_s) + end + else # cgi.gem <= v0.3.2 + def url_encode(s) + s.to_s.b.gsub(/[^a-zA-Z0-9_\-.~]/n) do |m| + sprintf("%%%02X", m.unpack1("C")) + end + end end alias u url_encode module_function :u diff --git a/lib/erb/version.rb b/lib/erb/version.rb index 295fc5fa6f..fde4a2776a 100644 --- a/lib/erb/version.rb +++ b/lib/erb/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true class ERB - VERSION = '4.0.3' - private_constant :VERSION + # The string \ERB version. + VERSION = '6.0.4' end |
