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

Inherits:
Object
  • Object
show all
Defined in:
actionview/lib/action_view/template/handlers/erb.rb,
actionview/lib/action_view/template/handlers/erb/erubi.rb

Defined Under Namespace

Classes: Erubi

Constant Summary collapse

ENCODING_TAG =
Regexp.new("\\A(<%#{ENCODING_FLAG}-?%>)[ \\t]*")

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.call(template, source) ⇒ Object



27
28
29
# File 'actionview/lib/action_view/template/handlers/erb.rb', line 27

def self.call(template, source)
  new.call(template, source)
end

Instance Method Details

#call(template, source) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'actionview/lib/action_view/template/handlers/erb.rb', line 57

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)


35
36
37
# File 'actionview/lib/action_view/template/handlers/erb.rb', line 35

def handles_encoding?
  true
end

#supports_streaming?Boolean

Returns:

  • (Boolean)


31
32
33
# File 'actionview/lib/action_view/template/handlers/erb.rb', line 31

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.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'actionview/lib/action_view/template/handlers/erb.rb', line 41

def translate_location(spot, backtrace_location, source)
  # Tokenize the source line
  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
end