1
0
Fork 0
mirror of https://github.com/haml/haml.git synced 2022-11-09 12:33:31 -05:00

Create Hamlit::Parsers::Whitespace

This commit is contained in:
Takashi Kokubun 2015-03-29 21:21:07 +09:00
parent a5a4c7587a
commit d8492dba9c
2 changed files with 41 additions and 25 deletions

View file

@ -1,4 +1,3 @@
require 'set'
require 'strscan'
require 'temple'
require 'hamlit/parsers/attribute'
@ -7,6 +6,7 @@ require 'hamlit/parsers/doctype'
require 'hamlit/parsers/filter'
require 'hamlit/parsers/multiline'
require 'hamlit/parsers/script'
require 'hamlit/parsers/whitespace'
module Hamlit
class Parser < Temple::Parser
@ -16,6 +16,7 @@ module Hamlit
include Parsers::Filter
include Parsers::Multiline
include Parsers::Script
include Parsers::Whitespace
TAG_ID_CLASS_REGEXP = /[a-zA-Z0-9_-]+/
INTERNAL_STATEMENTS = %w[else elsif when].freeze
@ -37,10 +38,10 @@ module Hamlit
# Reset the parser state.
def reset(template)
@outer_removal = Set.new
template = preprocess_multilines(template)
reset_lines(template.split("\n"))
reset_indent
reset_outer_removal
end
# Parse lines in current_indent and return ASTs.
@ -126,29 +127,6 @@ module Hamlit
ast
end
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 parse_inner_removal(scanner)
scanner.scan(/</)
end
def parse_outer_removal(scanner)
if scanner.scan(/>/)
@outer_removal.add(@current_indent)
else
@outer_removal.delete(@current_indent)
end
end
def parse_text(scanner)
ast = [:haml, :text]
ast << scanner.scan(/.+/).strip

View file

@ -0,0 +1,38 @@
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
private
def reset_outer_removal
@outer_removal = Set.new
end
def parse_inner_removal(scanner)
scanner.scan(/</)
end
def parse_outer_removal(scanner)
if scanner.scan(/>/)
@outer_removal.add(@current_indent)
else
@outer_removal.delete(@current_indent)
end
end
end
end
end