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

Now there are only parser and compiler in engine

This commit is contained in:
Takashi Kokubun 2015-03-28 20:15:33 +09:00
parent 9a27efe8cf
commit 8177b53a8b
5 changed files with 58 additions and 96 deletions

View file

@ -0,0 +1,55 @@
require 'temple'
require 'hamlit/concerns/line_reader'
module Hamlit
module Concerns
module Multiline
include Concerns::LineReader
def preprocess_multilines(template)
reset_lines(template.split("\n"))
result = []
while @lines[@current_lineno + 1]
@current_lineno += 1
unless end_with_pipe?(current_line)
result << current_line
next
end
prefix = current_line[/\A */]
lines = scan_multilines
result << prefix + build_multiline(lines)
(lines.length - 1).times { result << '' }
end
result.map { |line| "#{line}\n" }.join
end
private
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
end

View file

@ -2,7 +2,6 @@ require 'temple'
require 'hamlit/compiler'
require 'hamlit/html/pretty'
require 'hamlit/html/ugly'
require 'hamlit/multiline'
require 'hamlit/parser'
module Hamlit
@ -14,7 +13,6 @@ module Hamlit
ugly: false,
)
use Multiline
use Parser
use Compiler
use :Html, -> { create(html_compiler) }

View file

@ -1,57 +0,0 @@
require 'temple'
require 'hamlit/concerns/line_reader'
module Hamlit
class Multiline < 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
unless end_with_pipe?(current_line)
result << current_line
next
end
prefix = current_line[/\A */]
lines = scan_multilines
result << prefix + build_multiline(lines)
(lines.length - 1).times { result << '' }
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

View file

@ -4,6 +4,7 @@ require 'hamlit/concerns/balanceable'
require 'hamlit/concerns/escapable'
require 'hamlit/concerns/indentable'
require 'hamlit/concerns/line_reader'
require 'hamlit/concerns/multiline'
module Hamlit
class Parser < Temple::Parser
@ -11,6 +12,7 @@ module Hamlit
include Concerns::Escapable
include Concerns::Indentable
include Concerns::LineReader
include Concerns::Multiline
TAG_ID_CLASS_REGEXP = /[a-zA-Z0-9_-]+/
INTERNAL_STATEMENTS = %w[else elsif when].freeze
@ -32,6 +34,7 @@ module Hamlit
# Reset the parser state.
def reset(template)
template = preprocess_multilines(template)
reset_lines(template.split("\n"))
reset_indent
end

View file

@ -1,37 +0,0 @@
describe Hamlit::Multiline do
describe '#call' do
it 'does not alter normal lines' do
assert_compile(<<-HAML, <<-HAML)
abc
d|
ef
HAML
abc
d|
ef
HAML
end
it 'joins multi-lines' do
assert_compile(<<-HAML, <<-HAML)
abc |
d |
ef
HAML
abc d
ef
HAML
end
it 'joins multi-lines' do
assert_compile(<<-HAML, <<-HAML)
= 'a' + |
'b' |
HAML
= 'a' + 'b'
HAML
end
end
end