From 8177b53a8b3f4b88f49c8ab18524ef382b3bd62d Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Sat, 28 Mar 2015 20:15:33 +0900 Subject: [PATCH] Now there are only parser and compiler in engine --- lib/hamlit/concerns/multiline.rb | 55 ++++++++++++++++++++++++++++++ lib/hamlit/engine.rb | 2 -- lib/hamlit/multiline.rb | 57 -------------------------------- lib/hamlit/parser.rb | 3 ++ spec/hamlit/multiline_spec.rb | 37 --------------------- 5 files changed, 58 insertions(+), 96 deletions(-) create mode 100644 lib/hamlit/concerns/multiline.rb delete mode 100644 lib/hamlit/multiline.rb delete mode 100644 spec/hamlit/multiline_spec.rb diff --git a/lib/hamlit/concerns/multiline.rb b/lib/hamlit/concerns/multiline.rb new file mode 100644 index 00000000..ded423a8 --- /dev/null +++ b/lib/hamlit/concerns/multiline.rb @@ -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 diff --git a/lib/hamlit/engine.rb b/lib/hamlit/engine.rb index 7e259caf..a438cca6 100644 --- a/lib/hamlit/engine.rb +++ b/lib/hamlit/engine.rb @@ -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) } diff --git a/lib/hamlit/multiline.rb b/lib/hamlit/multiline.rb deleted file mode 100644 index 0ca0f8b8..00000000 --- a/lib/hamlit/multiline.rb +++ /dev/null @@ -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 diff --git a/lib/hamlit/parser.rb b/lib/hamlit/parser.rb index c0a8df73..b5959e1e 100644 --- a/lib/hamlit/parser.rb +++ b/lib/hamlit/parser.rb @@ -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 diff --git a/spec/hamlit/multiline_spec.rb b/spec/hamlit/multiline_spec.rb deleted file mode 100644 index 15419bc1..00000000 --- a/spec/hamlit/multiline_spec.rb +++ /dev/null @@ -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