module Erubis::Basic::Converter

def self.supported_properties # :nodoc:

:nodoc:
def self.supported_properties    # :nodoc:
  return [
          [:pattern,  '<% %>', "embed pattern"],
          [:trim,      true,   "trim spaces around <% ... %>"],
         ]
end

def add_expr(src, code, indicator)

# add expression code to src
def add_expr(src, code, indicator)
  case indicator
  when '='
    @escape ? add_expr_escaped(src, code) : add_expr_literal(src, code)
  when '=='
    @escape ? add_expr_literal(src, code) : add_expr_escaped(src, code)
  when '==='
    add_expr_debug(src, code)
  end
end

def convert_input(src, input)

def convert_input(src, input)
  pat = @pattern
  regexp = pat.nil? || pat == '<% %>' ? DEFAULT_REGEXP : pattern_regexp(pat)
  pos = 0
  is_bol = true     # is beginning of line
  input.scan(regexp) do |indicator, code, tailch, rspace|
    match = Regexp.last_match()
    len  = match.begin(0) - pos
    text = input[pos, len]
    pos  = match.end(0)
    ch   = indicator ? indicator[0] : nil
    lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol)
    is_bol = rspace ? true : false
    add_text(src, text) if text && !text.empty?
    ## * when '<%= %>', do nothing
    ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>'
    if ch == ?=              # <%= %>
      rspace = nil if tailch && !tailch.empty?
      add_text(src, lspace) if lspace
      add_expr(src, code, indicator)
      add_text(src, rspace) if rspace
    elsif ch == ?\#          # <%# %>
      n = code.count("\n") + (rspace ? 1 : 0)
      if @trim && lspace && rspace
        add_stmt(src, "\n" * n)
      else
        add_text(src, lspace) if lspace
        add_stmt(src, "\n" * n)
        add_text(src, rspace) if rspace
      end
    elsif ch == ?%           # <%% %>
      s = "#{lspace}#{@prefix||='<%'}#{code}#{tailch}#{@postfix||='%>'}#{rspace}"
      add_text(src, s)
    else                     # <% %>
      if @trim && lspace && rspace
        add_stmt(src, "#{lspace}#{code}#{rspace}")
      else
        add_text(src, lspace) if lspace
        add_stmt(src, code)
        add_text(src, rspace) if rspace
      end
    end
  end
  #rest = $' || input                        # ruby1.8
  rest = pos == 0 ? input : input[pos..-1]   # ruby1.9
  add_text(src, rest)
end

def init_converter(properties={})

def init_converter(properties={})
  super(properties)
  @pattern = properties[:pattern]
  @trim    = properties[:trim] != false
end

def pattern_regexp(pattern)

# return regexp of pattern to parse eRuby script
def pattern_regexp(pattern)
  @prefix, @postfix = pattern.split()   # '<% %>' => '<%', '%>'
  #return /(.*?)(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m
  #return /(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m
  return /#{@prefix}(=+|-|\#|%)?(.*?)([-=])?#{@postfix}([ \t]*\r?\n)?/m
end