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:
parent
a5a4c7587a
commit
d8492dba9c
2 changed files with 41 additions and 25 deletions
|
@ -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
|
||||
|
|
38
lib/hamlit/parsers/whitespace.rb
Normal file
38
lib/hamlit/parsers/whitespace.rb
Normal 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
|
Loading…
Add table
Reference in a new issue