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:
parent
9a27efe8cf
commit
8177b53a8b
5 changed files with 58 additions and 96 deletions
55
lib/hamlit/concerns/multiline.rb
Normal file
55
lib/hamlit/concerns/multiline.rb
Normal 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
|
|
@ -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) }
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Add table
Reference in a new issue