class Opal::ERB::Compiler

Constants

BLOCK_EXPR

Public Class Methods

new(source, file_name = '(erb)') click to toggle source
# File lib/opal/erb.rb, line 34
def initialize(source, file_name = '(erb)')
  @source, @file_name, @result = source, file_name, source
end

Public Instance Methods

compile() click to toggle source
# File lib/opal/erb.rb, line 50
def compile
  Opal.compile prepared_source
end
find_code(result) click to toggle source
# File lib/opal/erb.rb, line 74
def find_code(result)
  result.gsub(/<%([\s\S]+?)%>/) do
    inner = Regexp.last_match(1).gsub(/\\"/, '"')
    "\")\n#{inner}\noutput_buffer.append(\""
  end
end
find_contents(result) click to toggle source
# File lib/opal/erb.rb, line 62
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
fix_quotes(result) click to toggle source
# File lib/opal/erb.rb, line 54
def fix_quotes(result)
  result.gsub '"', '\\"'
end
prepared_source() click to toggle source
# File lib/opal/erb.rb, line 38
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
require_erb(result) click to toggle source
# File lib/opal/erb.rb, line 58
def require_erb(result)
  'require "erb";' + result
end
wrap_compiled(result) click to toggle source
# File lib/opal/erb.rb, line 81
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