Class: ORB::RailsDerp

Inherits:
Object
  • Object
show all
Defined in:
lib/orb/rails_derp.rb

Constant Summary collapse

ENCODING_FLAG =
'#.*coding[:=]\s*(\S+)[ \t]*'
ENCODING_TAG =
Regexp.new("\\A(<%#{ENCODING_FLAG}-?%>)[ \\t]*")

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.call(template, source = nil) ⇒ Object



7
8
9
# File 'lib/orb/rails_derp.rb', line 7

def call(template, source = nil)
  new.call(template, source)
end

Instance Method Details

#call(template, source) ⇒ Object



54
55
56
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
# File 'lib/orb/rails_derp.rb', line 54

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 = ::Regexp.last_match(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

  ActionView::Template::Handlers::ERB::Erubi.new(erb, options).src
end

#translate_location(spot, backtrace_location, source) ⇒ Object

Translate an error location returned by ErrorHighlight to the correct source location inside the template.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/orb/rails_derp.rb', line 30

def translate_location(spot, backtrace_location, source)
  Rails.logger.debug "in translate_location"
  Rails.logger.debug ""
  Rails.logger.debug spot
  Rails.logger.debug ""
  Rails.logger.debug backtrace_location
  Rails.logger.debug ""
  Rails.logger.debug source

  # Tokenize the source line
  tokens = ORB::Utils::ERB.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