Sha256: 69d059473aa12dc216c07fcdb4883acc01f7c79c820854eb63aed68a64e315f6

Contents?: true

Size: 1.32 KB

Versions: 2

Compression:

Stored size: 1.32 KB

Contents

require 'singleton'

module HtmlToHaml
  module Erb
    class ControlFlowMatcher
      include Singleton

      CONTROL_FLOW_MIDDLE_OF_LINE_KEYWORDS = ["do"]
      CONTROL_FLOW_BEGINNING_OF_LINE_KEYWORDS = ["if", "unless"]
      CONTROL_FLOW_CONTINUE_KEYWORDS = ["elsif", "else", "when"]

      def begin_case_statement?(erb:)
        matches_keywords_at_beginning_of_line?(erb: erb, keywords: ["case"])
      end

      def begin_indented_control_flow?(erb:)
        matches_keywords?(erb: erb, keywords: CONTROL_FLOW_MIDDLE_OF_LINE_KEYWORDS) ||
            matches_keywords_at_beginning_of_line?(erb: erb, keywords: CONTROL_FLOW_BEGINNING_OF_LINE_KEYWORDS)
      end

      def continue_indented_control_flow?(erb:)
        matches_keywords_at_beginning_of_line?(erb: erb, keywords: CONTROL_FLOW_CONTINUE_KEYWORDS)
      end

      def end_of_block?(erb:)
        erb_without_strings(erb: erb) =~ /\s*-\send/
      end

      private

      def matches_keywords_at_beginning_of_line?(erb:, keywords:)
        erb_without_strings(erb: erb) =~ /\s*(-|=)\s*(#{keywords.join("|")})(\s|$)/
      end

      def matches_keywords?(erb:, keywords:)
        erb_without_strings(erb: erb) =~ /\s*(-|=)(.*)\s+(#{keywords.join("|")})(\s|$)/
      end

      def erb_without_strings(erb:)
        erb.gsub(/".*?"/, '').gsub(/'.*?'/, '')
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
html-to-haml-0.0.6 lib/html_to_haml/tools/erb/control_flow_matcher.rb
html-to-haml-0.0.5 lib/html_to_haml/tools/erb/control_flow_matcher.rb