class ERB::Compiler

Public Instance Methods

add_insert_escapehtml_cmd(out, content) click to toggle source
# File lib/erb_safe_ext.rb, line 70
def add_insert_escapehtml_cmd(out, content)
  out.push("#{@insert_cmd}(ERB::Util.html_escape((#{content})))")
end
compile(s) click to toggle source
# File lib/erb_safe_ext.rb, line 5
def compile(s)
  enc = s.encoding
  raise ArgumentError, "#{enc} is not ASCII compatible" if enc.dummy?
  s = s.dup.force_encoding("ASCII-8BIT") # don't use constant Enoding::ASCII_8BIT for miniruby
  enc = detect_magic_comment(s) || enc
  out = Buffer.new(self, enc)
  content = ''
  scanner = make_scanner(s)
  scanner.scan do |token|
    next if token.nil?
    next if token == ''
    if scanner.stag.nil?
      case token
      when PercentLine
        add_put_cmd(out, content) if content.size > 0
        content = ''
        out.push(token.to_s)
        out.cr
      when :cr
        out.cr
      when '<%', '<%~', '<%=', '<%#'
        scanner.stag = token
        add_put_cmd(out, content) if content.size > 0
        content = ''
      when "\n"
        content << "\n"
        add_put_cmd(out, content)
        content = ''
      when '<%%'
        content << '<%'
      else
        content << token
      end
    else
      case token
      when '%>'
        case scanner.stag
        when '<%'
          if content[-1] == ?\n
            content.chop!
            out.push(content)
            out.cr
          else
            out.push(content)
          end
        when '<%='
          add_insert_cmd(out, content)
        when '<%~'
          add_insert_escapehtml_cmd(out, content)
        when '<%#'
          # out.push("# #{content_dump(content)}")
        end
        scanner.stag = nil
        content = ''
      when '%%>'
        content << '%>'
      else
        content << token
      end
    end
  end
  add_put_cmd(out, content) if content.size > 0
  out.close
  return out.script, enc
end