From a65d2520a2d77aedd7f5ec5f756a9d92b2109f17 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Fri, 5 Jun 2015 08:08:21 +0900 Subject: [PATCH] Remove outer whitespace in the block --- lib/hamlit/compilers/strip.rb | 3 +- lib/hamlit/parsers/whitespace.rb | 38 +++++---- spec/hamlit/engine/tag_spec.rb | 81 +++++++++++-------- .../app/views/users/whitespace.html.haml | 4 + spec/rails/config/routes.rb | 1 + spec/rails/spec/hamlit_spec.rb | 5 ++ 6 files changed, 83 insertions(+), 49 deletions(-) create mode 100644 spec/rails/app/views/users/whitespace.html.haml diff --git a/lib/hamlit/compilers/strip.rb b/lib/hamlit/compilers/strip.rb index d34a5627..f0750413 100644 --- a/lib/hamlit/compilers/strip.rb +++ b/lib/hamlit/compilers/strip.rb @@ -1,3 +1,5 @@ +# This module is created to compile [:haml, :strip], +# which is sexp for whitespace inner removal.module Hamlit module Hamlit module Compilers module Strip @@ -10,7 +12,6 @@ module Hamlit def strip_newline(content) indexes = newline_indexes(content) - return content if indexes.length < 2 content = content.dup content.delete_at(indexes.last) diff --git a/lib/hamlit/parsers/whitespace.rb b/lib/hamlit/parsers/whitespace.rb index c18f6126..3115e2dd 100644 --- a/lib/hamlit/parsers/whitespace.rb +++ b/lib/hamlit/parsers/whitespace.rb @@ -16,26 +16,36 @@ module Hamlit inner_removal end - def remove_last_outer_space!(ast) - index = find_last_newline_index(ast) - return unless index - - ast.delete_at(index) + def remove_last_outer_space!(exps) + exps.reverse! + remove_first_outer_space!(exps) + ensure + exps.reverse! end private - # Find [:static, "\n"]'s position ignoring [:code]. - # If it is not found, return nil. - def find_last_newline_index(ast) - ast.reverse_each.with_index do |node, index| - sexp, *args = node - next if sexp == :code - return if node != [:static, "\n"] + def remove_first_outer_space!(exps) + deleted = false + exps.delete_if do |exp| + break if deleted - return ast.length - index - 1 + name, *args = exp + case name + when :static + break if args != ["\n"] + deleted = true + next true + when :code + next false + when :newline + next false + when :haml + remove_last_outer_space!(exp) if args.first == :script + end + break end - nil + remove_last_outer_space!(exps) if deleted end def reset_outer_removal diff --git a/spec/hamlit/engine/tag_spec.rb b/spec/hamlit/engine/tag_spec.rb index 63326faf..f95f04f9 100644 --- a/spec/hamlit/engine/tag_spec.rb +++ b/spec/hamlit/engine/tag_spec.rb @@ -186,42 +186,55 @@ describe Hamlit::Engine do HTML end - it 'removes outer whitespace by >' do - assert_render(<<-HAML, <<-HTML) - %span> a - %span b - %span c - %span> - d - %span - e - %span f - HAML - ab - c - d - - e - - f - HTML - end - - it 'removes outer whitespace by > from inside of block' do - assert_render(<<-HAML, <<-HTML) - %span a - - if true + describe 'whitespace removal' do + it 'removes outer whitespace by >' do + assert_render(<<-HAML, <<-HTML) + %span> a + %span b + %span c %span> - b - %span + d + %span + e + %span f + HAML + ab + c + d + + e + + f + HTML + end + + it 'removes outer whitespace by > from inside of block' do + assert_render(<<-HAML, <<-HTML) + %span a + - if true + %span> + b + %span + c + HAML + a + b + c - HAML - a - b - - c - - HTML + + HTML + end + + it 'removes whitespaces inside block script' do + assert_render(<<-HAML, <<-HTML) + %span< + = 2.times do + = 'foo' + %span> bar + HAML + foofoo2bar + HTML + end end end end diff --git a/spec/rails/app/views/users/whitespace.html.haml b/spec/rails/app/views/users/whitespace.html.haml new file mode 100644 index 00000000..8120350e --- /dev/null +++ b/spec/rails/app/views/users/whitespace.html.haml @@ -0,0 +1,4 @@ +%span< + = link_to '#' do + = 'foo' + %span> bar diff --git a/spec/rails/config/routes.rb b/spec/rails/config/routes.rb index 87f9780a..25d0ff59 100644 --- a/spec/rails/config/routes.rb +++ b/spec/rails/config/routes.rb @@ -9,6 +9,7 @@ Rails.application.routes.draw do get :helpers get :safe_buffer get :old_attributes + get :whitespace end end end diff --git a/spec/rails/spec/hamlit_spec.rb b/spec/rails/spec/hamlit_spec.rb index b7b5d472..dd2aa5a4 100644 --- a/spec/rails/spec/hamlit_spec.rb +++ b/spec/rails/spec/hamlit_spec.rb @@ -72,6 +72,11 @@ describe 'Hamlit rails integration', type: :request do get form_users_path expect(response.body).to include('row') end + + it 'renders whitespace removal inside #capture' do + get whitespace_users_path + expect(response.body).to include('foo') + end end describe 'haml helpers' do