mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
Merge branch 'stable'
Relatively major changes to warning-avoiding to get it working with master. The warning-avoiding in stable is based on http://pastie.org/262917.txt?key=18ufvnurbhubd7io3em5q, while the warning-avoiding in master is based on http://pastie.org/262888.txt?key=tmdvzn8bf9gm2hqht4fllq.
This commit is contained in:
commit
eafdc2db7e
12 changed files with 51 additions and 37 deletions
3
bin/haml
3
bin/haml
|
@ -1,7 +1,8 @@
|
|||
#!/usr/bin/env ruby
|
||||
# The command line Haml parser.
|
||||
|
||||
require File.dirname(__FILE__) + '/../lib/haml'
|
||||
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
||||
require 'haml'
|
||||
require 'haml/exec'
|
||||
|
||||
opts = Haml::Exec::Haml.new(ARGV)
|
||||
|
|
|
@ -73,6 +73,7 @@ module Haml
|
|||
:escape_html => false
|
||||
}
|
||||
@options.merge! options
|
||||
@index = 0
|
||||
|
||||
unless [:xhtml, :html4, :html5].include?(@options[:format])
|
||||
raise Haml::Error, "Invalid format #{@options[:format].inspect}"
|
||||
|
@ -83,7 +84,6 @@ module Haml
|
|||
@to_close_stack = []
|
||||
@output_tabs = 0
|
||||
@template_tabs = 0
|
||||
@index = 0
|
||||
@flat = false
|
||||
@newlines = 0
|
||||
@precompiled = ''
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
require File.dirname(__FILE__) + '/../haml'
|
||||
require 'optparse'
|
||||
require 'fileutils'
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ module Haml
|
|||
def self.included(base) # :nodoc:
|
||||
Filters.defined[base.name.split("::").last.downcase] = base
|
||||
base.extend(base)
|
||||
base.instance_variable_set "@lazy_requires", nil
|
||||
end
|
||||
|
||||
# Takes a string, the source text that should be passed to the filter,
|
||||
|
|
|
@ -397,7 +397,7 @@ module Haml
|
|||
def capture_haml_with_buffer(local_buffer, *args, &block)
|
||||
position = local_buffer.length
|
||||
|
||||
block.call *args
|
||||
block.call(*args)
|
||||
|
||||
captured = local_buffer.slice!(position..-1)
|
||||
|
||||
|
|
|
@ -136,6 +136,8 @@ END
|
|||
end
|
||||
|
||||
def precompile
|
||||
@haml_comment = @dont_indent_next_line = @dont_tab_up_next_text = false
|
||||
@indentation = nil
|
||||
@line = next_line
|
||||
resolve_newlines
|
||||
newline
|
||||
|
@ -727,7 +729,7 @@ END
|
|||
|
||||
def handle_multiline(line)
|
||||
if is_multiline?(line.text)
|
||||
line.text.slice! -1
|
||||
line.text.slice!(-1)
|
||||
while new_line = raw_next_line.first
|
||||
newline and next if new_line.strip.empty?
|
||||
break unless is_multiline?(new_line.strip)
|
||||
|
@ -766,7 +768,7 @@ END
|
|||
end
|
||||
|
||||
def balance(*args)
|
||||
res = Haml::Shared.balance *args
|
||||
res = Haml::Shared.balance(*args)
|
||||
return res if res
|
||||
raise SyntaxError.new("Unbalanced brackets.")
|
||||
end
|
||||
|
|
|
@ -8,7 +8,7 @@ module Sass::Constant
|
|||
def parse(value)
|
||||
first, second, unit = value.scan(Literal::NUMBER)[0]
|
||||
@value = first.empty? ? second.to_i : "#{first}#{second}".to_f
|
||||
@unit = unit unless unit.empty?
|
||||
@unit = unit.empty? ? nil : unit
|
||||
end
|
||||
|
||||
def plus(other)
|
||||
|
|
|
@ -445,7 +445,7 @@ END
|
|||
end
|
||||
|
||||
def balance(*args)
|
||||
res = Haml::Shared.balance *args
|
||||
res = Haml::Shared.balance(*args)
|
||||
return res if res
|
||||
raise SyntaxError.new("Unbalanced brackets.", @line)
|
||||
end
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
require File.dirname(__FILE__) + '/../test_helper'
|
||||
|
||||
class EngineTest < Test::Unit::TestCase
|
||||
# A map of erroneous Sass documents to the error messages they should produce.
|
||||
# A map of erroneous Haml documents to the error messages they should produce.
|
||||
# The error messages may be arrays;
|
||||
# if so, the second element should be the line number that should be reported for the error.
|
||||
# If this isn't provided, the tests will assume the line number should be the last line of the document.
|
||||
|
@ -34,13 +34,7 @@ class EngineTest < Test::Unit::TestCase
|
|||
"%p{:a => 'b',\n:c => 'd',\n:e => raise('foo')}" => ["foo", 3],
|
||||
" %p foo" => "Indenting at the beginning of the document is illegal.",
|
||||
" %p foo" => "Indenting at the beginning of the document is illegal.",
|
||||
"- end" => <<END.rstrip,
|
||||
You don't need to use "- end" in Haml. Use indentation instead:
|
||||
- if foo?
|
||||
%strong Foo!
|
||||
- else
|
||||
Not foo.
|
||||
END
|
||||
"- end" => "You don't need to use \"- end\" in Haml. Use indentation instead:\n- if foo?\n %strong Foo!\n- else\n Not foo.",
|
||||
" \n\t\n %p foo" => ["Indenting at the beginning of the document is illegal.", 3],
|
||||
"\n\n %p foo" => ["Indenting at the beginning of the document is illegal.", 3],
|
||||
"%p\n foo\n foo" => ["Inconsistent indentation: 1 space was used for indentation, but the rest of the document was indented using 2 spaces.", 3],
|
||||
|
@ -71,9 +65,19 @@ END
|
|||
def render(text, options = {}, &block)
|
||||
scope = options.delete(:scope) || Object.new
|
||||
locals = options.delete(:locals) || {}
|
||||
Haml::Engine.new(text, options).to_html(scope, locals, &block)
|
||||
engine(text, options).to_html(scope, locals, &block)
|
||||
end
|
||||
|
||||
|
||||
def engine(text, options = {})
|
||||
unless options[:filename]
|
||||
# use caller method name as fake filename. useful for debugging
|
||||
i = -1
|
||||
caller[i+=1] =~ /`(.+?)'/ until $1 and $1.index('test_') == 0
|
||||
options[:filename] = "(#{$1})"
|
||||
end
|
||||
Haml::Engine.new(text, options)
|
||||
end
|
||||
|
||||
def test_flexible_tabulation
|
||||
assert_equal("<p>\n foo\n</p>\n<q>\n bar\n <a>\n baz\n </a>\n</q>\n",
|
||||
render("%p\n foo\n%q\n bar\n %a\n baz"))
|
||||
|
@ -115,7 +119,7 @@ END
|
|||
end
|
||||
|
||||
def test_multi_render
|
||||
engine = Haml::Engine.new("%strong Hi there!")
|
||||
engine = engine("%strong Hi there!")
|
||||
assert_equal("<strong>Hi there!</strong>\n", engine.to_html)
|
||||
assert_equal("<strong>Hi there!</strong>\n", engine.to_html)
|
||||
assert_equal("<strong>Hi there!</strong>\n", engine.to_html)
|
||||
|
@ -293,14 +297,14 @@ SOURCE
|
|||
render("\n\n = abc", :filename => 'test', :line => 2)
|
||||
rescue Exception => e
|
||||
assert_kind_of Haml::SyntaxError, e
|
||||
assert_match /test:4/, e.backtrace.first
|
||||
assert_match(/test:4/, e.backtrace.first)
|
||||
end
|
||||
|
||||
begin
|
||||
render("\n\n= 123\n\n= nil[]", :filename => 'test', :line => 2)
|
||||
rescue Exception => e
|
||||
assert_kind_of NoMethodError, e
|
||||
assert_match /test:6/, e.backtrace.first
|
||||
assert_match(/test:6/, e.backtrace.first)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -387,12 +391,15 @@ SOURCE
|
|||
def test_exceptions
|
||||
EXCEPTION_MAP.each do |key, value|
|
||||
begin
|
||||
render(key)
|
||||
render(key, :filename => "(exception test for #{key.inspect})")
|
||||
rescue Exception => err
|
||||
value = [value] unless value.is_a?(Array)
|
||||
expected_message, line_no = value
|
||||
line_no ||= key.split("\n").length
|
||||
line_reported = err.backtrace[0].gsub(/\(.+\):/, '').to_i
|
||||
|
||||
assert_equal(value.first, err.message, "Line: #{key}")
|
||||
assert_equal(value[1] || key.split("\n").length, err.backtrace[0].gsub('(haml):', '').to_i, "Line: #{key}")
|
||||
assert_equal(expected_message, err.message, "Line: #{key}")
|
||||
assert_equal(line_no, line_reported, "Line: #{key}")
|
||||
else
|
||||
assert(false, "Exception not raised for\n#{key}")
|
||||
end
|
||||
|
@ -402,7 +409,7 @@ SOURCE
|
|||
def test_exception_line
|
||||
render("a\nb\n!!!\n c\nd")
|
||||
rescue Haml::SyntaxError => e
|
||||
assert_equal("(haml):4", e.backtrace[0])
|
||||
assert_equal("(test_exception_line):4", e.backtrace[0])
|
||||
else
|
||||
assert(false, '"a\nb\n!!!\n c\nd" doesn\'t produce an exception')
|
||||
end
|
||||
|
@ -410,7 +417,7 @@ SOURCE
|
|||
def test_exception
|
||||
render("%p\n hi\n %a= undefined\n= 12")
|
||||
rescue Exception => e
|
||||
assert_match("(haml):3", e.backtrace[0])
|
||||
assert_match("(test_exception):3", e.backtrace[0])
|
||||
else
|
||||
# Test failed... should have raised an exception
|
||||
assert(false)
|
||||
|
@ -419,7 +426,7 @@ SOURCE
|
|||
def test_compile_error
|
||||
render("a\nb\n- fee)\nc")
|
||||
rescue Exception => e
|
||||
assert_match(/^compile error\n\(haml\):3: syntax error/i, e.message)
|
||||
assert_match(/^compile error\n\(test_compile_error\):3: syntax error/i, e.message)
|
||||
else
|
||||
assert(false,
|
||||
'"a\nb\n- fee)\nc" doesn\'t produce an exception!')
|
||||
|
@ -494,28 +501,28 @@ END
|
|||
|
||||
def test_yield_should_work_with_def_method
|
||||
s = "foo"
|
||||
Haml::Engine.new("= yield\n= upcase").def_method(s, :render)
|
||||
engine("= yield\n= upcase").def_method(s, :render)
|
||||
assert_equal("12\nFOO\n", s.render { 12 })
|
||||
end
|
||||
|
||||
def test_def_method_with_module
|
||||
Haml::Engine.new("= yield\n= upcase").def_method(String, :render_haml)
|
||||
engine("= yield\n= upcase").def_method(String, :render_haml)
|
||||
assert_equal("12\nFOO\n", "foo".render_haml { 12 })
|
||||
end
|
||||
|
||||
def test_def_method_locals
|
||||
obj = Object.new
|
||||
Haml::Engine.new("%p= foo\n.bar{:baz => baz}= boom").def_method(obj, :render, :foo, :baz, :boom)
|
||||
engine("%p= foo\n.bar{:baz => baz}= boom").def_method(obj, :render, :foo, :baz, :boom)
|
||||
assert_equal("<p>1</p>\n<div baz='2' class='bar'>3</div>\n", obj.render(:foo => 1, :baz => 2, :boom => 3))
|
||||
end
|
||||
|
||||
def test_render_proc_locals
|
||||
proc = Haml::Engine.new("%p= foo\n.bar{:baz => baz}= boom").render_proc(Object.new, :foo, :baz, :boom)
|
||||
proc = engine("%p= foo\n.bar{:baz => baz}= boom").render_proc(Object.new, :foo, :baz, :boom)
|
||||
assert_equal("<p>1</p>\n<div baz='2' class='bar'>3</div>\n", proc[:foo => 1, :baz => 2, :boom => 3])
|
||||
end
|
||||
|
||||
def test_render_proc_with_binding
|
||||
assert_equal("FOO\n", Haml::Engine.new("= upcase").render_proc("foo".instance_eval{binding}).call)
|
||||
assert_equal("FOO\n", engine("= upcase").render_proc("foo".instance_eval{binding}).call)
|
||||
end
|
||||
|
||||
def test_ugly_true
|
||||
|
@ -542,7 +549,7 @@ END
|
|||
end
|
||||
|
||||
def test_arbitrary_output_option
|
||||
assert_raise(Haml::Error, "Invalid output format :html1") { Haml::Engine.new("%br", :format => :html1) }
|
||||
assert_raise(Haml::Error, "Invalid output format :html1") { engine("%br", :format => :html1) }
|
||||
end
|
||||
|
||||
# HTML 4.0
|
||||
|
@ -571,7 +578,7 @@ END
|
|||
|
||||
# because anything before the doctype triggers quirks mode in IE
|
||||
def test_xml_prolog_and_doctype_dont_result_in_a_leading_whitespace_in_html
|
||||
assert_no_match /^\s+/, render("!!! xml\n!!!", :format => :html4)
|
||||
assert_no_match(/^\s+/, render("!!! xml\n!!!", :format => :html4))
|
||||
end
|
||||
|
||||
# HTML5
|
||||
|
|
|
@ -52,7 +52,8 @@ class Html2HamlTest < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def assert_equal_attributes(expected, result)
|
||||
assert_equal *[expected, result].map { |s| s.gsub!(/\{ (.+) \}/, ''); $1.split(', ').sort }
|
||||
expected_attr, result_attr = [expected, result].map { |s| s.gsub!(/\{ (.+) \}/, ''); $1.split(', ').sort }
|
||||
assert_equal expected_attr, result_attr
|
||||
assert_equal expected, result
|
||||
end
|
||||
end
|
||||
|
|
|
@ -198,5 +198,6 @@ class Sass::Engine
|
|||
end
|
||||
|
||||
class ActionController::Base
|
||||
undef :sass_old_process
|
||||
def sass_old_process(*args); end
|
||||
end
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
lib_dir = File.dirname(__FILE__) + '/../lib'
|
||||
# allows testing with edge Rails by creating a test/rails symlink
|
||||
linked_rails = File.dirname(__FILE__) + '/rails'
|
||||
|
||||
|
@ -12,5 +13,6 @@ require 'action_controller'
|
|||
require 'action_view'
|
||||
|
||||
require 'test/unit'
|
||||
require File.dirname(__FILE__) + '/../lib/haml'
|
||||
require File.dirname(__FILE__) + '/../lib/sass'
|
||||
$:.unshift lib_dir unless $:.include?(lib_dir)
|
||||
require 'haml'
|
||||
require 'sass'
|
||||
|
|
Loading…
Add table
Reference in a new issue