Class: ActionView::Template::Handlers::ERB

Inherits:
Object
  • Object
show all
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

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

  options = {
    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
    options[:preamble] = "@output_buffer.safe_append='<!-- BEGIN #{template.short_identifier} -->';"
    options[:postamble] = "@output_buffer.safe_append='<!-- END #{template.short_identifier} -->';@output_buffer"
  end

  self.class.erb_implementation.new(erb, options).src
end

#handles_encoding?Boolean

Returns:

  • (Boolean)


37
38
39
# File 'lib/action_view/template/handlers/erb.rb', line 37

def handles_encoding?
  true
end

#supports_streaming?Boolean

Returns:

  • (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