class Synvert::Core::Engine::ERB

Public Class Methods

decode(source) click to toggle source

convert ruby code to erb.

@param source [String] ruby source code. @return [String] erb source code.

# File lib/synvert/core/engine/erb.rb, line 24
def decode(source)
  source = decode_ruby_stmt(source)
  source = decode_ruby_output(source)
  source = decode_html_output(source)
  source = remove_erubis_buf(source)
end
encode(source) click to toggle source

convert erb to ruby code.

@param source [String] erb source code. @return [String] ruby source code.

# File lib/synvert/core/engine/erb.rb, line 16
def encode(source)
  Erubis.new(source.gsub('-%>', '%>'), escape: false, trim: false).src
end

Private Class Methods

decode_html_output(source) click to toggle source
# File lib/synvert/core/engine/erb.rb, line 45
def decode_html_output(source)
  source.gsub(/@output_buffer.safe_append='(.+?)'.freeze;/m) { reverse_escape_text(Regexp.last_match(1)) }.gsub(
    /@output_buffer.safe_append=\((.+?)\);#{ERUBY_EXPR_SPLITTER}/mo
  ) { reverse_escape_text(Regexp.last_match(1)) }.gsub(
    /@output_buffer.safe_append=(.+?)\s+(do|\{)(\s*\|[^|]*\|)?\s*#{ERUBY_EXPR_SPLITTER}/mo
  ) { reverse_escape_text(Regexp.last_match(1)) }
end
decode_ruby_output(source) click to toggle source
# File lib/synvert/core/engine/erb.rb, line 37
def decode_ruby_output(source)
  source.gsub(/@output_buffer.append=\((.+?)\);#{ERUBY_EXPR_SPLITTER}/mo) {
    "<%=#{Regexp.last_match(1)}%>"
  }.gsub(/@output_buffer.append= (.+?)\s+(do|\{)(\s*\|[^|]*\|)?\s*#{ERUBY_EXPR_SPLITTER}/mo) { |m|
    "<%=#{m.sub('@output_buffer.append= ', '').sub(ERUBY_EXPR_SPLITTER, '')}%>"
  }
end
decode_ruby_stmt(source) click to toggle source
# File lib/synvert/core/engine/erb.rb, line 33
def decode_ruby_stmt(source)
  source.gsub(/#{ERUBY_STMT_SPLITTER}(.+?)#{ERUBY_STMT_SPLITTER}/mo) { "<%#{Regexp.last_match(1)}%>" }
end
remove_erubis_buf(source) click to toggle source
# File lib/synvert/core/engine/erb.rb, line 53
def remove_erubis_buf(source)
  source
    .sub('@output_buffer = output_buffer || ActionView::OutputBuffer.new;', '')
    .sub('@output_buffer.to_s', '')
end
reverse_escape_text(source) click to toggle source
# File lib/synvert/core/engine/erb.rb, line 59
def reverse_escape_text(source)
  source.gsub("\\\\", "\\").gsub("\\'", "'")
end