Class: ActionView::Template::Handlers::ERB
- Inherits:
-
Object
- Object
- ActionView::Template::Handlers::ERB
- Defined in:
- lib/action_view/template/handlers/erb.rb,
lib/action_view/template/handlers/erb/erubi.rb
Defined Under Namespace
Classes: Erubi
Constant Summary collapse
- ENCODING_TAG =
Regexp.new("\\A(<%#{ENCODING_FLAG}-?%>)[ \\t]*")
- LocationParsingError =
:nodoc:
Class.new(StandardError)
Class Method Summary collapse
Instance Method Summary collapse
- #call(template, source) ⇒ Object
- #handles_encoding? ⇒ Boolean
- #supports_streaming? ⇒ Boolean
-
#translate_location(spot, backtrace_location, source) ⇒ Object
Translate an error location returned by ErrorHighlight to the correct source location inside the template.
Class Method Details
.call(template, source) ⇒ Object
29 30 31 |
# File 'lib/action_view/template/handlers/erb.rb', line 29 def self.call(template, source) new.call(template, source) end |
Instance Method Details
#call(template, source) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/action_view/template/handlers/erb.rb', line 63 def call(template, source) # First, convert to BINARY, so in case the encoding is # wrong, we can still find an encoding tag # (<%# encoding %>) inside the String using a regular # expression template_source = source.b erb = template_source.gsub(ENCODING_TAG, "") encoding = $2 erb.force_encoding valid_encoding(source.dup, encoding) # Always make sure we return a String in the default_internal erb.encode! # Strip trailing newlines from the template if enabled erb.chomp! if strip_trailing_newlines = { escape: (self.class.escape_ignore_list.include? template.type), trim: (self.class.erb_trim_mode == "-") } if ActionView::Base.annotate_rendered_view_with_filenames && template.format == :html [:preamble] = "@output_buffer.safe_append='<!-- BEGIN #{template.short_identifier} -->';" [:postamble] = "@output_buffer.safe_append='<!-- END #{template.short_identifier} -->';@output_buffer" end self.class.erb_implementation.new(erb, ).src end |
#handles_encoding? ⇒ Boolean
37 38 39 |
# File 'lib/action_view/template/handlers/erb.rb', line 37 def handles_encoding? true end |
#supports_streaming? ⇒ Boolean
33 34 35 |
# File 'lib/action_view/template/handlers/erb.rb', line 33 def supports_streaming? true end |
#translate_location(spot, backtrace_location, source) ⇒ Object
Translate an error location returned by ErrorHighlight to the correct source location inside the template.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/action_view/template/handlers/erb.rb', line 43 def translate_location(spot, backtrace_location, source) # Tokenize the source line source_lines = source.lines return nil if source_lines.size < backtrace_location.lineno tokens = ::ERB::Util.tokenize(source_lines[backtrace_location.lineno - 1]) new_first_column = find_offset(spot[:snippet], tokens, spot[:first_column]) lineno_delta = spot[:first_lineno] - backtrace_location.lineno spot[:first_lineno] -= lineno_delta spot[:last_lineno] -= lineno_delta column_delta = spot[:first_column] - new_first_column spot[:first_column] -= column_delta spot[:last_column] -= column_delta spot[:script_lines] = source_lines spot rescue NotImplementedError, LocationParsingError nil end |