Sha256: c9d3c68ca7ccf275531334576bbd00915b0b9f5b231a2fe50ce3813844c7a46c

Contents?: true

Size: 1.82 KB

Versions: 2

Compression:

Stored size: 1.82 KB

Contents

require 'cgi'
require 'erubis'
require 'ruby_parser'

module Haml
  class HTML
    class ERB < Erubis::Basic::Engine
      def self.compile(template)
        new(template).src
      end

      def escaped_expr(code)
        raise "html2haml doesn't support escaped expressions."
      end

      def add_preamble(src); end
      def add_postamble(src); end

      def add_text(src, text)
        src << text
      end

      def add_stmt(src, code)
        src << '</haml:block>' if block_closer?(code) || mid_block?(code)
        src << '<haml:silent>' << h(code) << '</haml:silent>' unless code.strip == "end"
        src << '<haml:block>' if block_opener?(code) || mid_block?(code)
      end

      def add_expr_literal(src, code)
        src << '<haml:loud>' << h(code) << '</haml:loud>'
        src << '<haml:block>' if block_opener?(code)
      end

      def add_expr_debug(src, code)
        raise "html2haml doesn't support debugging expressions."
      end

      private

      def h(code)
        CGI.escapeHTML(code)
      end

      # Returns whether the code is valid Ruby code on its own
      def valid_ruby?(code)
        RubyParser.new.parse(code)
      rescue Racc::ParseError => e
        false
      end

      # Checks if the Ruby code opens a block
      def block_opener?(code)
        valid_ruby?(code + "\nend") ||
          valid_ruby?(code + "\nwhen foo\nend")
      end

      # Checks if the Ruby code closes a block
      def block_closer?(code)
        valid_ruby?("begin\n" + code)
      end

      # Checks if the Ruby code comes in the middle of a block
      def mid_block?(code)
        return if valid_ruby?(code)
        valid_ruby?("if foo\n#{code}\nend") || # else, elsif
          valid_ruby?("begin\n#{code}\nend") || # rescue, ensure
          valid_ruby?("case foo\n#{code}\nend") # when
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
haml-edge-2.3.57 lib/haml/html/erb.rb
haml-edge-2.3.56 lib/haml/html/erb.rb