class Opal::ERB::Compiler
def compile
def compile Opal.compile prepared_source end
def find_code(result)
def find_code(result) result.gsub(/<%([\s\S]+?)%>/) do inner = Regexp.last_match(1).gsub(/\\"/, '"') "\")\n#{inner}\noutput_buffer.append(\"" end end
def find_contents(result)
def find_contents(result) result.gsub(/<%=([\s\S]+?)%>/) do inner = Regexp.last_match(1).gsub(/\\'/, "'").gsub(/\\"/, '"') if inner =~ BLOCK_EXPR "\")\noutput_buffer.append= #{inner}\noutput_buffer.append(\"" else "\")\noutput_buffer.append=(#{inner})\noutput_buffer.append(\"" end end end
def fix_quotes(result)
def fix_quotes(result) result.gsub '"', '\\"' end
def initialize(source, file_name = '(erb)')
def initialize(source, file_name = '(erb)') @source, @file_name, @result = source, file_name, source end
def prepared_source
def prepared_source @prepared_source ||= begin source = @source source = fix_quotes(source) source = find_contents(source) source = find_code(source) source = wrap_compiled(source) source = require_erb(source) source end end
def require_erb(result)
def require_erb(result) 'require "erb";' + result end
def wrap_compiled(result)
def wrap_compiled(result) path = @file_name.sub(/\.opalerb#{REGEXP_END}/, '') "Template.new('#{path}') do |output_buffer|\noutput_buffer.append(\"#{result}\")\noutput_buffer.join\nend\n" end