Skip to content

Instantly share code, notes, and snippets.

@eliotsykes
Last active December 12, 2019 11:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eliotsykes/1470356fd6ed4b18396dae3e26f6f0bb to your computer and use it in GitHub Desktop.
Save eliotsykes/1470356fd6ed4b18396dae3e26f6f0bb to your computer and use it in GitHub Desktop.
Parse ERB template ruby output expressions (using the temple gem)
# An example to extract the ruby output expressions from an ERB template using the temple gem:
#
# 1. Install 'temple' gem https://github.com/judofyr/temple
# 2. Require this erb_parser.rb file and run:
#
# ErbParser.call
#
# Dynamics will be:
# [[[:dynamic, " @page.title "],
# [:dynamic, " an_image "],
# [:dynamic, " a_heading "],
# [:dynamic, " simple_format some_text "],
# [:dynamic, " sanitize html_text "],
# [:dynamic, " shared_content( 'the_email' ) "]],
#
# Abstract Syntax Tree will be:
# [:multi,
# [:code, " @page_title = @page.title "],
# [:static, "\n"],
# [:newline],
# [:static, "<h1>\n"],
# [:newline],
# [:static, " "],
# [:escape, true, [:dynamic, " @page.title "]],
# [:static, "\n"],
# [:newline],
# [:static, "</h1>\n"],
# [:newline],
# [:static, "<p>\n"],
# [:newline],
# [:static, " <img src=\"/images/shinycms/"],
# [:escape, true, [:dynamic, " an_image "]],
# [:static, "\" alt=\"\">\n"],
# [:newline],
# [:static, "</p>\n"],
# [:newline],
# [:static, "<h2>\n"],
# [:newline],
# [:static, " "],
# [:escape, true, [:dynamic, " a_heading "]],
# [:static, "\n"],
# [:newline],
# [:static, "</h2>\n"],
# [:newline],
# [:static, "\n"],
# [:newline],
# [:escape, true, [:dynamic, " simple_format some_text "]],
# [:static, "\n"],
# [:newline],
# [:static, "\n"],
# [:newline],
# [:escape, true, [:dynamic, " sanitize html_text "]],
# [:static, "\n"],
# [:newline],
# [:static, "\n"],
# [:newline],
# [:static, "<p class=\"small\">\n"],
# [:newline],
# [:static, " Contact: "],
# [:escape, true, [:dynamic, " shared_content( 'the_email' ) "]],
# [:static, "\n"],
# [:newline],
# [:static, "</p>\n"],
# [:newline],
# [:static, ""]]]
class ErbParser
def self.call
self.new.call
end
def call
parser = Temple::ERB::Parser.new
erb_source = <<~ERB
<% @page_title = @page.title %>
<h1>
<%= @page.title %>
</h1>
<p>
<img src="/images/shinycms/<%= an_image %>" alt="">
</p>
<h2>
<%= a_heading %>
</h2>
<%= simple_format some_text %>
<%= sanitize html_text %>
<p class="small">
Contact: <%= shared_content( 'the_email' ) %>
</p>
ERB
# Abstract Syntax Tree
ast = parser.call(erb_source)
dynamics = extract_dynamics(ast)
[dynamics, ast]
end
def extract_dynamics(ast)
dynamics = []
ast.each do |node|
next unless node.is_a?(Array)
if node[0] == :dynamic
dynamics << node
else
dynamics += extract_dynamics(node)
end
end
dynamics
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment