Class: ViewInspect::Handlers::HTMLTemplate

Inherits:
Object
  • Object
show all
Defined in:
lib/view_inspect/handlers/html_template.rb

Direct Known Subclasses

ERB, Handlebars

Constant Summary collapse

STUB_PREFIX =
"__template_expression_stub__"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeHTMLTemplate

Returns a new instance of HTMLTemplate.



9
10
11
# File 'lib/view_inspect/handlers/html_template.rb', line 9

def initialize
  @expression_stub_map = {}
end

Class Method Details

.expression_regexObject



13
14
15
# File 'lib/view_inspect/handlers/html_template.rb', line 13

def self.expression_regex
  raise "must be implemented by subclass"
end

Instance Method Details

#add_file_line(source, filepath) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/view_inspect/handlers/html_template.rb', line 27

def add_file_line(source, filepath)
  doc = ::Nokogiri::HTML.fragment(source)

  return source if doc.errors.count > 0 && !ViewInspect.show_html_syntax_error?

  doc.traverse do |node|
    if node.is_a?(::Nokogiri::XML::Element)
      file_line = [filepath, node.line].join(":")
      node.set_attribute "data-orig-file-line", file_line
    end
  end

  source = CGI.unescapeHTML(doc.inner_html)

  if doc.errors.length > 0
    error_msg = build_html_syntax_error_msg(doc.errors, filepath)
    "#{error_msg}#{source}"
  else
    source
  end
end

#add_file_line_to_html_tags(source, filepath) ⇒ Object



17
18
19
20
21
22
23
24
25
# File 'lib/view_inspect/handlers/html_template.rb', line 17

def add_file_line_to_html_tags(source, filepath)
  return source if html_layout?(source) # currently dont support html layout templates

  source = replace_expression_with_stub(source)
  source = add_file_line(source, filepath)
  source = replace_stub_with_expression(source)

  source
end

#build_html_syntax_error_msg(errors, filepath) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# File 'lib/view_inspect/handlers/html_template.rb', line 49

def build_html_syntax_error_msg(errors, filepath)
  errors_list = errors.inject("") do |result, error|
    result << "<li>line #{error.line} - #{error.to_s}</li>"
    result
  end

  "<div id='view_inspect_error_message' style='border: solid 1px black; z-index: 9999; position: absolute; margin-left: 200px; width: 800px; padding: 20px; background-color: rgb(255, 229, 229); color: black;'>
    <h3 style='font-size: 20px; line-height: 30px; font-weight: bold; background-color: lightgray; padding: 5px; display: inline-block; border: solid 1px black;'>Please correct HTML syntax errors in #{filepath}</h3>
    <ul>#{errors_list}</ul>
  </div>"
end

#replace_expression_with_stub(source) ⇒ Object



61
62
63
64
65
66
67
68
# File 'lib/view_inspect/handlers/html_template.rb', line 61

def replace_expression_with_stub(source)
  source.gsub(self.class.expression_regex).with_index do |match, index|
    stub = "#{STUB_PREFIX}#{index}"
    stub = preserve_linecount(stub, match)
    @expression_stub_map[stub] = match
    stub
  end
end

#replace_stub_with_expression(source) ⇒ Object



70
71
72
73
74
# File 'lib/view_inspect/handlers/html_template.rb', line 70

def replace_stub_with_expression(source)
  @expression_stub_map.inject(source) do |result, (stub, expression)|
    result = result.sub(stub, expression)
  end
end