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 |