Sha256: 6de457562f11fda915219fcd2dedbb9e6655e6655d1eb3edb432c2cc4a553bad

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

require 'set'

# Hamlit::Parsers::Whitespace cares about "whitespace removal",
# which is achieved by '<' or '>' after html tag.
module Hamlit
  module Parsers
    module Whitespace
      def parse_whitespace_removal(scanner)
        if scanner.match?(/</)
          inner_removal = parse_inner_removal(scanner)
          parse_outer_removal(scanner)
        else
          parse_outer_removal(scanner)
          inner_removal = parse_inner_removal(scanner)
        end
        inner_removal
      end

      def remove_last_outer_space!(ast)
        index = find_last_newline_index(ast)
        return unless index

        ast.delete_at(index)
      end

      private

      # Find [:static, "\n"]'s position ignoring [:code].
      # If it is not found, return nil.
      def find_last_newline_index(ast)
        ast.reverse_each.with_index do |node, index|
          sexp, *args = node
          next if sexp == :code
          return if node != [:static, "\n"]

          return ast.length - index - 1
        end
        nil
      end

      def reset_outer_removal
        @outer_removal = Set.new
        @tag_indent    = 0
      end

      def with_tag_nested(&block)
        @tag_indent += 1
        with_indented { block.call }
      ensure
        @outer_removal.delete(@tag_indent)
        @tag_indent -= 1
      end

      def parse_inner_removal(scanner)
        scanner.scan(/</)
      end

      def parse_outer_removal(scanner)
        if scanner.scan(/>/)
          @outer_removal.add(@tag_indent)
        else
          @outer_removal.delete(@tag_indent)
        end
      end

      def outer_remove?
        @outer_removal.include?(@tag_indent)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hamlit-1.5.0 lib/hamlit/parsers/whitespace.rb