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

58 lines
1.1 KiB
Ruby
Raw Normal View History

2015-03-16 08:11:07 +09:00
require 'temple'
require 'hamlit/concerns/line_reader'
module Hamlit
class MultilinePreprocessor < Temple::Parser
include Concerns::LineReader
def call(template)
reset_lines(template.split("\n"))
preprocess_multilines
end
private
def preprocess_multilines
result = []
while @lines[@current_lineno + 1]
@current_lineno += 1
2015-03-16 14:18:24 +09:00
unless end_with_pipe?(current_line)
2015-03-16 08:11:07 +09:00
result << current_line
2015-03-16 14:18:24 +09:00
next
2015-03-16 08:11:07 +09:00
end
2015-03-16 14:18:24 +09:00
prefix = current_line[/\A */]
lines = scan_multilines
result << prefix + build_multiline(lines)
(lines.length - 1).times { result << '' }
2015-03-16 08:11:07 +09:00
end
result.map { |line| "#{line}\n" }.join
end
def end_with_pipe?(line)
return false unless line
line.strip =~ / \|\Z/
end
def scan_multilines
lines = []
while end_with_pipe?(current_line)
lines << current_line
@current_lineno += 1
end
@current_lineno -= 1
lines
end
def build_multiline(lines)
lines = lines.map do |line|
line.strip.gsub(/ *\|\Z/, '')
end
lines.join(' ')
end
end
end