From a836bf2f02d237c25a26285713a9f629c340ffe7 Mon Sep 17 00:00:00 2001 From: Tim van der Horst Date: Mon, 4 Jun 2012 23:14:03 -0300 Subject: [PATCH] Add option to always remove whitespace. Closes #550 Closes #528 Signed-off-by: Norman Clarke --- REFERENCE.md | 7 +++++++ lib/haml/options.rb | 10 +++++++++- lib/haml/parser.rb | 5 +++++ test/engine_test.rb | 14 ++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/REFERENCE.md b/REFERENCE.md index 949fdfdc..32bd5ce6 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -160,6 +160,13 @@ Available options are: Defaults to `true` in Rails production mode, and `false` everywhere else. +{#remove_whitespace-option} `:remove_whitespace` +: If set to `true`, all tags are treated as if + both [whitespace removal](#whitespace_removal__and_) + options were present. Use with caution as this + may cause whitespace-related formatting errors. + Defaults to `false`. + {#suppress_eval-option} `:suppress_eval` : Whether or not attribute hashes and Ruby scripts designated by `=` or `~` should be diff --git a/lib/haml/options.rb b/lib/haml/options.rb index ee07b6f4..74ce1fdb 100644 --- a/lib/haml/options.rb +++ b/lib/haml/options.rb @@ -13,6 +13,7 @@ module Haml :line => 1, :mime_type => nil, :preserve => %w(textarea pre code), + :remove_whitespace => false, :suppress_eval => false, :ugly => false } @@ -49,6 +50,7 @@ module Haml attr_reader :encoding attr_reader :format attr_reader :mime_type + attr_reader :remove_whitespace def initialize(values = {}, &block) @@ -64,7 +66,8 @@ module Haml send "#{key}=", value end - [:escape_attrs, :hyphenate_data_attrs, :suppress_eval, :ugly].each do |method| + [:escape_attrs, :hyphenate_data_attrs, :remove_whitespace, :suppress_eval, + :ugly].each do |method| class_eval(<<-END) def #{method}? !! @#{method} @@ -106,6 +109,11 @@ module Haml end @format = value end + + def remove_whitespace=(value) + @ugly = true if value + @remove_whitespace = value + end if RUBY_VERSION < "1.9" attr_writer :encoding diff --git a/lib/haml/parser.rb b/lib/haml/parser.rb index d67950cb..788e4052 100644 --- a/lib/haml/parser.rb +++ b/lib/haml/parser.rb @@ -505,6 +505,11 @@ END nuke_inner_whitespace = nuke_whitespace.include? '<' end + if @options[:remove_whitespace] + nuke_outer_whitespace = true + nuke_inner_whitespace = true + end + value = value.to_s.strip [tag_name, attributes, attributes_hashes, object_ref, nuke_outer_whitespace, nuke_inner_whitespace, action, value, last_line || @index] diff --git a/test/engine_test.rb b/test/engine_test.rb index 06c294cc..b977262f 100644 --- a/test/engine_test.rb +++ b/test/engine_test.rb @@ -1331,6 +1331,20 @@ HAML render("%p= 's' * 75", :ugly => true)) end + def test_remove_whitespace_true + assert_equal("

hello world

", + render("#outer\n #inner\n %p hello world", :remove_whitespace => true)) + assert_equal("

hello world

foo   bar\nbaz

", render(< true)) +%p + hello world + %pre + foo bar + baz +HAML + assert_equal("
foo bar
", + render('%div foo bar', :remove_whitespace => true)) + end + def test_auto_preserve_unless_ugly assert_equal("
foo
bar
\n", render('%pre="foo\nbar"')) assert_equal("
foo\nbar
\n", render("%pre\n foo\n bar"))