mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
69 lines
1.7 KiB
Ruby
69 lines
1.7 KiB
Ruby
require 'hamlit/concerns/included'
|
|
require 'hamlit/concerns/escapable'
|
|
|
|
module Hamlit
|
|
module Parsers
|
|
module Script
|
|
extend Concerns::Included
|
|
|
|
included do
|
|
include Concerns::Escapable
|
|
end
|
|
|
|
def parse_script(scanner, force_escape: false, disable_escape: false)
|
|
raise SyntaxError unless scanner.scan(/=|&=|!=/)
|
|
|
|
code = scan_code(scanner)
|
|
unless has_block?
|
|
return [:dynamic, code] if disable_escape
|
|
return escape_html([:dynamic, code], force_escape)
|
|
end
|
|
|
|
# FIXME: parse != or &= for block
|
|
ast = [:haml, :script, code]
|
|
ast += with_indented { parse_lines }
|
|
ast << [:code, 'end']
|
|
ast
|
|
end
|
|
|
|
def parse_preserve(scanner)
|
|
raise SyntaxError unless scanner.scan(/~/)
|
|
|
|
code = scan_code(scanner)
|
|
escape_html([:haml, :preserve, code])
|
|
end
|
|
|
|
def parse_silent_script(scanner)
|
|
raise SyntaxError unless scanner.scan(/-/)
|
|
if scanner.scan(/#/)
|
|
with_indented { skip_lines }
|
|
return [:newline]
|
|
end
|
|
|
|
ast = [:code]
|
|
ast << scan_code(scanner)
|
|
return ast unless has_block?
|
|
|
|
ast = [:multi, ast]
|
|
ast += with_indented { parse_lines }
|
|
ast << [:code, 'end'] unless same_indent?(next_line) && internal_statement?(next_line)
|
|
ast
|
|
end
|
|
|
|
private
|
|
|
|
def scan_code(scanner)
|
|
code = ''
|
|
loop do
|
|
code += scanner.scan(/.+/).strip
|
|
break unless code =~ /,\Z/
|
|
|
|
@current_lineno += 1
|
|
scanner = StringScanner.new(current_line)
|
|
code += ' '
|
|
end
|
|
code
|
|
end
|
|
end
|
|
end
|
|
end
|