haml 4.0.7 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/CHANGELOG.md +42 -4
- data/FAQ.md +4 -14
- data/MIT-LICENSE +1 -1
- data/README.md +85 -42
- data/REFERENCE.md +108 -57
- data/Rakefile +46 -54
- data/lib/haml/attribute_builder.rb +163 -0
- data/lib/haml/attribute_compiler.rb +215 -0
- data/lib/haml/attribute_parser.rb +144 -0
- data/lib/haml/buffer.rb +22 -132
- data/lib/haml/compiler.rb +87 -295
- data/lib/haml/engine.rb +25 -41
- data/lib/haml/error.rb +3 -0
- data/lib/haml/escapable.rb +49 -0
- data/lib/haml/exec.rb +33 -19
- data/lib/haml/filters.rb +18 -24
- data/lib/haml/generator.rb +41 -0
- data/lib/haml/helpers/action_view_extensions.rb +3 -2
- data/lib/haml/helpers/action_view_mods.rb +36 -58
- data/lib/haml/helpers/action_view_xss_mods.rb +1 -0
- data/lib/haml/helpers/safe_erubi_template.rb +27 -0
- data/lib/haml/helpers/safe_erubis_template.rb +4 -1
- data/lib/haml/helpers/xss_mods.rb +18 -12
- data/lib/haml/helpers.rb +133 -90
- data/lib/haml/options.rb +38 -47
- data/lib/haml/parser.rb +278 -216
- data/lib/haml/{template/plugin.rb → plugin.rb} +8 -15
- data/lib/haml/railtie.rb +21 -12
- data/lib/haml/sass_rails_filter.rb +17 -4
- data/lib/haml/template/options.rb +12 -2
- data/lib/haml/template.rb +12 -6
- data/lib/haml/temple_engine.rb +120 -0
- data/lib/haml/temple_line_counter.rb +29 -0
- data/lib/haml/util.rb +80 -199
- data/lib/haml/version.rb +2 -1
- data/lib/haml.rb +1 -0
- data/test/attribute_parser_test.rb +101 -0
- data/test/engine_test.rb +287 -176
- data/test/filters_test.rb +32 -19
- data/test/gemfiles/Gemfile.rails-4.0.x +9 -3
- data/test/gemfiles/Gemfile.rails-4.0.x.lock +87 -0
- data/test/gemfiles/Gemfile.rails-4.1.x +5 -0
- data/test/gemfiles/Gemfile.rails-4.2.x +5 -0
- data/test/gemfiles/Gemfile.rails-5.0.x +4 -0
- data/test/helper_test.rb +224 -112
- data/test/options_test.rb +22 -0
- data/test/parser_test.rb +71 -4
- data/test/results/bemit.xhtml +4 -0
- data/test/results/eval_suppressed.xhtml +4 -4
- data/test/results/helpers.xhtml +43 -41
- data/test/results/helpful.xhtml +6 -3
- data/test/results/just_stuff.xhtml +21 -20
- data/test/results/list.xhtml +9 -9
- data/test/results/nuke_inner_whitespace.xhtml +22 -22
- data/test/results/nuke_outer_whitespace.xhtml +84 -92
- data/test/results/original_engine.xhtml +17 -17
- data/test/results/partial_layout.xhtml +4 -3
- data/test/results/partial_layout_erb.xhtml +4 -3
- data/test/results/partials.xhtml +11 -10
- data/test/results/silent_script.xhtml +63 -63
- data/test/results/standard.xhtml +156 -159
- data/test/results/tag_parsing.xhtml +19 -19
- data/test/results/very_basic.xhtml +2 -2
- data/test/results/whitespace_handling.xhtml +77 -76
- data/test/template_test.rb +24 -56
- data/test/template_test_helper.rb +38 -0
- data/test/templates/bemit.haml +3 -0
- data/test/templates/just_stuff.haml +1 -0
- data/test/templates/standard_ugly.haml +1 -0
- data/test/templates/with_bom.haml +1 -0
- data/test/temple_line_counter_test.rb +40 -0
- data/test/test_helper.rb +26 -8
- data/test/util_test.rb +6 -47
- metadata +53 -43
- data/test/gemfiles/Gemfile.rails-3.0.x +0 -5
- data/test/gemfiles/Gemfile.rails-3.1.x +0 -6
- data/test/gemfiles/Gemfile.rails-3.2.x +0 -5
- data/test/haml-spec/LICENSE +0 -14
- data/test/haml-spec/README.md +0 -106
- data/test/haml-spec/lua_haml_spec.lua +0 -38
- data/test/haml-spec/perl_haml_test.pl +0 -81
- data/test/haml-spec/ruby_haml_test.rb +0 -23
- data/test/haml-spec/tests.json +0 -660
- data/test/templates/_av_partial_1_ugly.haml +0 -9
- data/test/templates/_av_partial_2_ugly.haml +0 -5
- data/test/templates/action_view_ugly.haml +0 -47
- data/test/templates/standard_ugly.haml +0 -43
data/test/engine_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require 'test_helper'
|
3
3
|
|
4
|
-
class EngineTest <
|
4
|
+
class EngineTest < Haml::TestCase
|
5
5
|
# A map of erroneous Haml documents to the error messages they should produce.
|
6
6
|
# The error messages may be arrays;
|
7
7
|
# if so, the second element should be the line number that should be reported for the error.
|
@@ -113,13 +113,11 @@ class EngineTest < MiniTest::Unit::TestCase
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def setup
|
116
|
-
return if RUBY_VERSION < "1.9"
|
117
116
|
@old_default_internal = Encoding.default_internal
|
118
117
|
silence_warnings{Encoding.default_internal = nil}
|
119
118
|
end
|
120
119
|
|
121
120
|
def teardown
|
122
|
-
return if RUBY_VERSION < "1.9"
|
123
121
|
silence_warnings{Encoding.default_internal = @old_default_internal}
|
124
122
|
end
|
125
123
|
|
@@ -128,11 +126,11 @@ class EngineTest < MiniTest::Unit::TestCase
|
|
128
126
|
end
|
129
127
|
|
130
128
|
def test_flexible_tabulation
|
131
|
-
assert_equal("<p>\
|
129
|
+
assert_equal("<p>\nfoo\n</p>\n<q>\nbar\n<a>\nbaz\n</a>\n</q>\n",
|
132
130
|
render("%p\n foo\n%q\n bar\n %a\n baz"))
|
133
|
-
assert_equal("<p>\
|
131
|
+
assert_equal("<p>\nfoo\n</p>\n<q>\nbar\n<a>\nbaz\n</a>\n</q>\n",
|
134
132
|
render("%p\n\tfoo\n%q\n\tbar\n\t%a\n\t\tbaz"))
|
135
|
-
assert_equal("<p>\n
|
133
|
+
assert_equal("<p>\n \t \t bar\n baz\n</p>\n",
|
136
134
|
render("%p\n :plain\n \t \t bar\n baz"))
|
137
135
|
end
|
138
136
|
|
@@ -187,7 +185,7 @@ class EngineTest < MiniTest::Unit::TestCase
|
|
187
185
|
def test_dynamic_attributes_with_no_content
|
188
186
|
assert_equal(<<HTML, render(<<HAML))
|
189
187
|
<p>
|
190
|
-
|
188
|
+
<a href='http://haml.info'></a>
|
191
189
|
</p>
|
192
190
|
HTML
|
193
191
|
%p
|
@@ -224,7 +222,7 @@ HAML
|
|
224
222
|
end
|
225
223
|
|
226
224
|
def test_one_liner_with_newline_shouldnt_be_one_line
|
227
|
-
assert_equal("<p
|
225
|
+
assert_equal("<p>foo\nbar</p>", render('%p= "foo\nbar"').chomp)
|
228
226
|
end
|
229
227
|
|
230
228
|
def test_multi_render
|
@@ -235,8 +233,31 @@ HAML
|
|
235
233
|
end
|
236
234
|
|
237
235
|
def test_interpolation
|
238
|
-
assert_equal("<p>Hello World</p>\n", render('%p Hello #{who}', :
|
239
|
-
assert_equal("<p>\
|
236
|
+
assert_equal("<p>Hello World</p>\n", render('%p Hello #{who}', locals: {who: 'World'}, escape_html: false))
|
237
|
+
assert_equal("<p>\nHello World\n</p>\n", render("%p\n Hello \#{who}", locals: {who: 'World'}, escape_html: false))
|
238
|
+
assert_equal("<p>Hello World</p>\n", render('%p Hello #{who}', locals: {who: 'World'}, escape_html: true))
|
239
|
+
assert_equal("<p>\nHello World\n</p>\n", render("%p\n Hello \#{who}", locals: {who: 'World'}, escape_html: true))
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_interpolation_with_instance_var
|
243
|
+
scope = Object.new
|
244
|
+
scope.instance_variable_set(:@who, 'World')
|
245
|
+
|
246
|
+
assert_equal("<p>Hello World</p>\n", render('%p Hello #@who', scope: scope, escape_html: false))
|
247
|
+
assert_equal("<p>\nHello World\n</p>\n", render("%p\n Hello \#@who", scope: scope, escape_html: false))
|
248
|
+
assert_equal("<p>Hello World</p>\n", render('%p Hello #@who', scope: scope, escape_html: true))
|
249
|
+
assert_equal("<p>\nHello World\n</p>\n", render("%p\n Hello \#@who", scope: scope, escape_html: true))
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_interpolation_with_global
|
253
|
+
$global_var_for_testing = 'World'
|
254
|
+
|
255
|
+
assert_equal("<p>Hello World</p>\n", render('%p Hello #$global_var_for_testing', escape_html: false))
|
256
|
+
assert_equal("<p>\nHello World\n</p>\n", render("%p\n Hello \#$global_var_for_testing", escape_html: false))
|
257
|
+
assert_equal("<p>Hello World</p>\n", render('%p Hello #$global_var_for_testing', escape_html: true))
|
258
|
+
assert_equal("<p>\nHello World\n</p>\n", render("%p\n Hello \#$global_var_for_testing", escape_html: true))
|
259
|
+
ensure
|
260
|
+
$global_var_for_testing = nil
|
240
261
|
end
|
241
262
|
|
242
263
|
def test_interpolation_in_the_middle_of_a_string
|
@@ -244,9 +265,43 @@ HAML
|
|
244
265
|
render("\"title '\#{\"Title\"}'. \""))
|
245
266
|
end
|
246
267
|
|
268
|
+
def test_interpolation_with_instance_var_in_the_middle_of_a_string
|
269
|
+
scope = Object.new
|
270
|
+
scope.instance_variable_set(:@title, 'Title')
|
271
|
+
|
272
|
+
assert_equal("\"title 'Title'. \"\n",
|
273
|
+
render("\"title '\#@title'. \"", :scope => scope))
|
274
|
+
end
|
275
|
+
|
276
|
+
def test_interpolation_with_global_in_the_middle_of_a_string
|
277
|
+
$global_var_for_testing = 'Title'
|
278
|
+
|
279
|
+
assert_equal("\"title 'Title'. \"\n",
|
280
|
+
render("\"title '\#$global_var_for_testing'. \""))
|
281
|
+
ensure
|
282
|
+
$global_var_for_testing = nil
|
283
|
+
end
|
284
|
+
|
247
285
|
def test_interpolation_at_the_beginning_of_a_line
|
248
286
|
assert_equal("<p>2</p>\n", render('%p #{1 + 1}'))
|
249
|
-
assert_equal("<p>\
|
287
|
+
assert_equal("<p>\n2\n</p>\n", render("%p\n \#{1 + 1}"))
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_interpolation_with_instance_var_at_the_beginning_of_a_line
|
291
|
+
scope = Object.new
|
292
|
+
scope.instance_variable_set(:@foo, 2)
|
293
|
+
|
294
|
+
assert_equal("<p>2</p>\n", render('%p #@foo', :scope => scope))
|
295
|
+
assert_equal("<p>\n2\n</p>\n", render("%p\n \#@foo", :scope => scope))
|
296
|
+
end
|
297
|
+
|
298
|
+
def test_interpolation_with_global_at_the_beginning_of_a_line
|
299
|
+
$global_var_for_testing = 2
|
300
|
+
|
301
|
+
assert_equal("<p>2</p>\n", render('%p #$global_var_for_testing'))
|
302
|
+
assert_equal("<p>\n2\n</p>\n", render("%p\n \#$global_var_for_testing"))
|
303
|
+
ensure
|
304
|
+
$global_var_for_testing = nil
|
250
305
|
end
|
251
306
|
|
252
307
|
def test_escaped_interpolation
|
@@ -271,7 +326,7 @@ HAML
|
|
271
326
|
|
272
327
|
def test_attribute_hash_with_newlines
|
273
328
|
assert_equal("<p a='b' c='d'>foop</p>\n", render("%p{:a => 'b',\n :c => 'd'} foop"))
|
274
|
-
assert_equal("<p a='b' c='d'>\
|
329
|
+
assert_equal("<p a='b' c='d'>\nfoop\n</p>\n", render("%p{:a => 'b',\n :c => 'd'}\n foop"))
|
275
330
|
assert_equal("<p a='b' c='d'>\n", render("%p{:a => 'b',\n :c => 'd'}/"))
|
276
331
|
assert_equal("<p a='b' c='d' e='f'></p>\n", render("%p{:a => 'b',\n :c => 'd',\n :e => 'f'}"))
|
277
332
|
end
|
@@ -290,8 +345,8 @@ HAML
|
|
290
345
|
assert_equal(hash, {:color => 'red'})
|
291
346
|
end
|
292
347
|
|
293
|
-
def
|
294
|
-
assert_equal(<<HTML, render(<<HAML
|
348
|
+
def test_semi_prerendered_tags
|
349
|
+
assert_equal(<<HTML, render(<<HAML))
|
295
350
|
<p a='2'></p>
|
296
351
|
<p a='2'>foo</p>
|
297
352
|
<p a='2'>
|
@@ -333,7 +388,7 @@ HAML
|
|
333
388
|
assert_equal("<textarea>#{'a' * 100}</textarea>\n",
|
334
389
|
render("%textarea #{'a' * 100}"))
|
335
390
|
|
336
|
-
assert_equal("<p>\n
|
391
|
+
assert_equal("<p>\n<textarea>Foo\nBar\nBaz</textarea>\n</p>\n", render(<<SOURCE))
|
337
392
|
%p
|
338
393
|
%textarea
|
339
394
|
Foo
|
@@ -380,7 +435,7 @@ HAML
|
|
380
435
|
def test_both_whitespace_nukes_work_together
|
381
436
|
assert_equal(<<RESULT, render(<<SOURCE))
|
382
437
|
<p><q>Foo
|
383
|
-
|
438
|
+
Bar</q></p>
|
384
439
|
RESULT
|
385
440
|
%p
|
386
441
|
%q><= "Foo\\nBar"
|
@@ -389,6 +444,7 @@ SOURCE
|
|
389
444
|
|
390
445
|
def test_nil_option
|
391
446
|
assert_equal("<p foo='bar'></p>\n", render('%p{:foo => "bar"}', :attr_wrapper => nil))
|
447
|
+
assert_equal("<p foo='bar'></p>\n", render('%p{foo: "bar"}', :attr_wrapper => nil))
|
392
448
|
end
|
393
449
|
|
394
450
|
def test_comment_with_crazy_nesting
|
@@ -407,15 +463,14 @@ HAML
|
|
407
463
|
|
408
464
|
# Regression tests
|
409
465
|
|
410
|
-
|
411
|
-
|
412
|
-
assert_equal(<<HTML, render(<<HAML))
|
466
|
+
def test_indentation_after_dynamic_attr_hash
|
467
|
+
assert_equal(<<HTML, render(<<HAML))
|
413
468
|
<html>
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
469
|
+
<body>
|
470
|
+
<img src='test'>
|
471
|
+
foo
|
472
|
+
bar
|
473
|
+
</body>
|
419
474
|
</html>
|
420
475
|
HTML
|
421
476
|
%html
|
@@ -423,14 +478,15 @@ HTML
|
|
423
478
|
%img{:src => 'te'+'st'}
|
424
479
|
= "foo\\nbar"
|
425
480
|
HAML
|
426
|
-
end
|
427
481
|
end
|
428
482
|
|
429
483
|
def test_whitespace_nuke_with_both_newlines
|
430
|
-
assert_equal("<p
|
484
|
+
assert_equal("<p>\nfoo\n</p>\n", render('%p<= "\nfoo\n"'))
|
431
485
|
assert_equal(<<HTML, render(<<HAML))
|
432
486
|
<p>
|
433
|
-
|
487
|
+
<p>
|
488
|
+
foo
|
489
|
+
</p>
|
434
490
|
</p>
|
435
491
|
HTML
|
436
492
|
%p
|
@@ -441,7 +497,7 @@ HAML
|
|
441
497
|
def test_whitespace_nuke_with_tags_and_else
|
442
498
|
assert_equal(<<HTML, render(<<HAML))
|
443
499
|
<a>
|
444
|
-
|
500
|
+
<b>foo</b>
|
445
501
|
</a>
|
446
502
|
HTML
|
447
503
|
%a
|
@@ -454,9 +510,9 @@ HAML
|
|
454
510
|
|
455
511
|
assert_equal(<<HTML, render(<<HAML))
|
456
512
|
<a>
|
457
|
-
|
458
|
-
|
459
|
-
|
513
|
+
<b>
|
514
|
+
foo
|
515
|
+
</b>
|
460
516
|
</a>
|
461
517
|
HTML
|
462
518
|
%a
|
@@ -471,7 +527,7 @@ HAML
|
|
471
527
|
def test_outer_whitespace_nuke_with_empty_script
|
472
528
|
assert_equal(<<HTML, render(<<HAML))
|
473
529
|
<p>
|
474
|
-
|
530
|
+
foo <a></a></p>
|
475
531
|
HTML
|
476
532
|
%p
|
477
533
|
foo
|
@@ -483,7 +539,7 @@ HAML
|
|
483
539
|
def test_both_case_indentation_work_with_deeply_nested_code
|
484
540
|
result = <<RESULT
|
485
541
|
<h2>
|
486
|
-
|
542
|
+
other
|
487
543
|
</h2>
|
488
544
|
RESULT
|
489
545
|
assert_equal(result, render(<<HAML))
|
@@ -506,15 +562,15 @@ HAML
|
|
506
562
|
HAML
|
507
563
|
end
|
508
564
|
|
509
|
-
def
|
510
|
-
assert_equal("foo\n", render(<<HAML
|
565
|
+
def test_equals_block
|
566
|
+
assert_equal("foo\n", render(<<HAML))
|
511
567
|
= capture_haml do
|
512
568
|
foo
|
513
569
|
HAML
|
514
570
|
end
|
515
571
|
|
516
|
-
def
|
517
|
-
assert_equal("foo\nbar\n", render(<<HAML
|
572
|
+
def test_plain_equals
|
573
|
+
assert_equal("foo\nbar\n", render(<<HAML))
|
518
574
|
= "foo"
|
519
575
|
bar
|
520
576
|
HAML
|
@@ -532,10 +588,7 @@ HAML
|
|
532
588
|
end
|
533
589
|
|
534
590
|
def test_end_with_method_call
|
535
|
-
assert_equal(
|
536
|
-
2|3|4
|
537
|
-
b-a-r
|
538
|
-
HTML
|
591
|
+
assert_equal("2|3|4b-a-r", render(<<HAML))
|
539
592
|
= [1, 2, 3].map do |i|
|
540
593
|
- i + 1
|
541
594
|
- end.join("|")
|
@@ -549,9 +602,7 @@ HAML
|
|
549
602
|
def test_nested_end_with_method_call
|
550
603
|
assert_equal(<<HTML, render(<<HAML))
|
551
604
|
<p>
|
552
|
-
|
553
|
-
b-a-r
|
554
|
-
</p>
|
605
|
+
2|3|4b-a-r</p>
|
555
606
|
HTML
|
556
607
|
%p
|
557
608
|
= [1, 2, 3].map do |i|
|
@@ -633,7 +684,7 @@ HAML
|
|
633
684
|
def test_escape_attrs_false
|
634
685
|
assert_equal(<<HTML, render(<<HAML, :escape_attrs => false))
|
635
686
|
<div class='<?php echo """ ?>' id='foo'>
|
636
|
-
|
687
|
+
bar
|
637
688
|
</div>
|
638
689
|
HTML
|
639
690
|
#foo{:class => '<?php echo """ ?>'}
|
@@ -642,9 +693,9 @@ HAML
|
|
642
693
|
end
|
643
694
|
|
644
695
|
def test_escape_attrs_always
|
645
|
-
assert_equal(<<HTML, render(<<HAML, :escape_attrs =>
|
646
|
-
<div class='
|
647
|
-
|
696
|
+
assert_equal(<<HTML, render(<<HAML, :escape_attrs => true))
|
697
|
+
<div class='"&lt;&gt;&amp;"' id='foo'>
|
698
|
+
bar
|
648
699
|
</div>
|
649
700
|
HTML
|
650
701
|
#foo{:class => '"<>&"'}
|
@@ -764,7 +815,7 @@ HAML
|
|
764
815
|
assert_equal("<a href='#'>Foo</a>\n",
|
765
816
|
render('%a(href="#") #{"Foo"}'))
|
766
817
|
|
767
|
-
assert_equal("<a href='
|
818
|
+
assert_equal("<a href='#"'></a>\n", render('%a(href="#\\"")'))
|
768
819
|
end
|
769
820
|
|
770
821
|
def test_case_assigned_to_var
|
@@ -893,7 +944,7 @@ HAML
|
|
893
944
|
# HTML escaping tests
|
894
945
|
|
895
946
|
def test_ampersand_equals_should_escape
|
896
|
-
assert_equal("<p>\
|
947
|
+
assert_equal("<p>\nfoo & bar\n</p>\n", render("%p\n &= 'foo & bar'", :escape_html => false))
|
897
948
|
end
|
898
949
|
|
899
950
|
def test_ampersand_equals_inline_should_escape
|
@@ -905,7 +956,7 @@ HAML
|
|
905
956
|
end
|
906
957
|
|
907
958
|
def test_bang_equals_should_not_escape
|
908
|
-
assert_equal("<p>\
|
959
|
+
assert_equal("<p>\nfoo & bar\n</p>\n", render("%p\n != 'foo & bar'", :escape_html => true))
|
909
960
|
end
|
910
961
|
|
911
962
|
def test_bang_equals_inline_should_not_escape
|
@@ -919,8 +970,6 @@ HAML
|
|
919
970
|
render(".atlantis{:style => 'ugly&stupid'} foo"))
|
920
971
|
assert_equal("<p class='atlantis' style='ugly&stupid'>foo</p>\n",
|
921
972
|
render("%p.atlantis{:style => 'ugly&stupid'}= 'foo'"))
|
922
|
-
assert_equal("<p class='atlantis' style='ugly
stupid'></p>\n",
|
923
|
-
render("%p.atlantis{:style => \"ugly\\nstupid\"}"))
|
924
973
|
end
|
925
974
|
|
926
975
|
def test_dynamic_attributes_should_be_escaped
|
@@ -930,8 +979,6 @@ HAML
|
|
930
979
|
render("%p{:width => nil, :src => '&foo.png', :alt => String.new} foo"))
|
931
980
|
assert_equal("<div alt='' src='&foo.png'>foo</div>\n",
|
932
981
|
render("%div{:width => nil, :src => '&foo.png', :alt => String.new}= 'foo'"))
|
933
|
-
assert_equal("<img alt='' src='foo
.png'>\n",
|
934
|
-
render("%img{:width => nil, :src => \"foo\\n.png\", :alt => String.new}"))
|
935
982
|
end
|
936
983
|
|
937
984
|
def test_string_double_equals_should_be_esaped
|
@@ -950,13 +997,13 @@ HAML
|
|
950
997
|
end
|
951
998
|
|
952
999
|
def test_escaped_string_double_equals
|
953
|
-
assert_equal("<p>\
|
954
|
-
assert_equal("<p>\
|
1000
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n &== \#{2+2}&\#{'<'}", :escape_html => true))
|
1001
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n &== \#{2+2}&\#{'<'}", :escape_html => false))
|
955
1002
|
end
|
956
1003
|
|
957
1004
|
def test_unescaped_string_double_equals
|
958
|
-
assert_equal("<p>\
|
959
|
-
assert_equal("<p>\
|
1005
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n !== \#{2+2}&\#{'<'}", :escape_html => true))
|
1006
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n !== \#{2+2}&\#{'<'}", :escape_html => false))
|
960
1007
|
end
|
961
1008
|
|
962
1009
|
def test_string_interpolation_should_be_esaped
|
@@ -975,18 +1022,28 @@ HAML
|
|
975
1022
|
end
|
976
1023
|
|
977
1024
|
def test_escaped_string_interpolation
|
978
|
-
assert_equal("<p>\
|
979
|
-
assert_equal("<p>\
|
1025
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n & \#{2+2}&\#{'<'}", :escape_html => true))
|
1026
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n & \#{2+2}&\#{'<'}", :escape_html => false))
|
1027
|
+
end
|
1028
|
+
|
1029
|
+
def test_escaped_string_interpolation_with_no_space
|
1030
|
+
assert_equal("<br>\n", render('&#{"<br>"}'))
|
1031
|
+
assert_equal("<span><br></span>\n", render('%span&#{"<br>"}'))
|
980
1032
|
end
|
981
1033
|
|
982
1034
|
def test_unescaped_string_interpolation
|
983
|
-
assert_equal("<p>\
|
984
|
-
assert_equal("<p>\
|
1035
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n ! \#{2+2}&\#{'<'}", :escape_html => true))
|
1036
|
+
assert_equal("<p>\n4&<\n</p>\n", render("%p\n ! \#{2+2}&\#{'<'}", :escape_html => false))
|
1037
|
+
end
|
1038
|
+
|
1039
|
+
def test_unescaped_string_interpolation_with_no_space
|
1040
|
+
assert_equal("<br>\n", render('!#{"<br>"}'))
|
1041
|
+
assert_equal("<span><br></span>\n", render('%span!#{"<br>"}'))
|
985
1042
|
end
|
986
1043
|
|
987
1044
|
def test_scripts_should_respect_escape_html_option
|
988
|
-
assert_equal("<p>\
|
989
|
-
assert_equal("<p>\
|
1045
|
+
assert_equal("<p>\nfoo & bar\n</p>\n", render("%p\n = 'foo & bar'", :escape_html => true))
|
1046
|
+
assert_equal("<p>\nfoo & bar\n</p>\n", render("%p\n = 'foo & bar'", :escape_html => false))
|
990
1047
|
end
|
991
1048
|
|
992
1049
|
def test_inline_scripts_should_respect_escape_html_option
|
@@ -1065,9 +1122,9 @@ HAML
|
|
1065
1122
|
|
1066
1123
|
def test_attr_wrapper
|
1067
1124
|
assert_equal("<p strange=*attrs*></p>\n", render("%p{ :strange => 'attrs'}", :attr_wrapper => '*'))
|
1068
|
-
assert_equal("<p escaped
|
1069
|
-
assert_equal("<p escaped=\"quo
|
1070
|
-
assert_equal("<p escaped=\"q
|
1125
|
+
assert_equal("<p escaped=\"quo"te\"></p>\n", render("%p{ :escaped => 'quo\"te'}", :attr_wrapper => '"'))
|
1126
|
+
assert_equal("<p escaped=\"quo'te\"></p>\n", render("%p{ :escaped => 'quo\\'te'}", :attr_wrapper => '"'))
|
1127
|
+
assert_equal("<p escaped=\"q'uo"te\"></p>\n", render("%p{ :escaped => 'q\\'uo\"te'}", :attr_wrapper => '"'))
|
1071
1128
|
assert_equal("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n", render("!!! XML", :attr_wrapper => '"', :format => :xhtml))
|
1072
1129
|
end
|
1073
1130
|
|
@@ -1085,9 +1142,7 @@ HAML
|
|
1085
1142
|
end
|
1086
1143
|
|
1087
1144
|
def test_attrs_parsed_correctly
|
1088
|
-
assert_equal("<p boom=>biddly='bar => baz'></p>\n", render("%p{'boom=>biddly' => 'bar => baz'}"))
|
1089
1145
|
assert_equal("<p foo,bar='baz, qux'></p>\n", render("%p{'foo,bar' => 'baz, qux'}"))
|
1090
|
-
assert_equal("<p escaped='quo
te'></p>\n", render("%p{ :escaped => \"quo\\nte\"}"))
|
1091
1146
|
assert_equal("<p escaped='quo4te'></p>\n", render("%p{ :escaped => \"quo\#{2 + 2}te\"}"))
|
1092
1147
|
end
|
1093
1148
|
|
@@ -1193,10 +1248,10 @@ HAML
|
|
1193
1248
|
def test_compile_error
|
1194
1249
|
render("a\nb\n- fee)\nc")
|
1195
1250
|
rescue Exception => e
|
1196
|
-
assert_match(/\(test_compile_error\):3
|
1251
|
+
assert_match(/\(test_compile_error\):3:/i, e.message)
|
1252
|
+
assert_match(/(syntax error|expecting \$end)/i, e.message)
|
1197
1253
|
else
|
1198
|
-
assert(false,
|
1199
|
-
'"a\nb\n- fee)\nc" doesn\'t produce an exception!')
|
1254
|
+
assert(false, '"a\nb\n- fee)\nc" doesn\'t produce an exception!')
|
1200
1255
|
end
|
1201
1256
|
|
1202
1257
|
def test_unbalanced_brackets
|
@@ -1205,14 +1260,39 @@ HAML
|
|
1205
1260
|
assert_equal(Haml::Error.message(:unbalanced_brackets), e.message)
|
1206
1261
|
end
|
1207
1262
|
|
1263
|
+
def test_single_line_comments_are_interpolated
|
1264
|
+
assert_equal("<!-- Hello 2 -->\n",
|
1265
|
+
render('/ Hello #{1 + 1}'))
|
1266
|
+
end
|
1267
|
+
|
1268
|
+
def test_single_line_comments_are_not_interpolated_with_suppress_eval
|
1269
|
+
assert_equal("<!-- -->\n",
|
1270
|
+
render('/ Hello #{1 + 1}', :suppress_eval => true))
|
1271
|
+
end
|
1272
|
+
|
1273
|
+
def test_single_line_comments_with_interpolation_dont_break_tabulation
|
1274
|
+
assert_equal("<!-- Hello 2 -->\nconcatted\n",
|
1275
|
+
render("/ Hello \#{1 + 1}\n- haml_concat 'concatted'"))
|
1276
|
+
end
|
1277
|
+
|
1208
1278
|
def test_balanced_conditional_comments
|
1209
1279
|
assert_equal("<!--[if !(IE 6)|(IE 7)]> Bracket: ] <![endif]-->\n",
|
1210
1280
|
render("/[if !(IE 6)|(IE 7)] Bracket: ]"))
|
1211
1281
|
end
|
1212
1282
|
|
1283
|
+
def test_downlevel_revealed_conditional_comments
|
1284
|
+
assert_equal("<!--[if !IE]><!--> A comment <!--<![endif]-->\n",
|
1285
|
+
render("/![if !IE] A comment"))
|
1286
|
+
end
|
1287
|
+
|
1288
|
+
def test_downlevel_revealed_conditional_comments_block
|
1289
|
+
assert_equal("<!--[if !IE]><!-->\nA comment\n<!--<![endif]-->\n",
|
1290
|
+
render("/![if !IE]\n A comment"))
|
1291
|
+
end
|
1292
|
+
|
1213
1293
|
def test_local_assigns_dont_modify_class
|
1214
1294
|
assert_equal("bar\n", render("= foo", :locals => {:foo => 'bar'}))
|
1215
|
-
|
1295
|
+
assert_nil(defined?(foo))
|
1216
1296
|
end
|
1217
1297
|
|
1218
1298
|
def test_object_ref_with_nil_id
|
@@ -1247,7 +1327,7 @@ HAML
|
|
1247
1327
|
|
1248
1328
|
def test_render_should_accept_a_binding_as_scope
|
1249
1329
|
string = "This is a string!"
|
1250
|
-
string.instance_variable_set(
|
1330
|
+
string.instance_variable_set(:@var, "Instance variable")
|
1251
1331
|
b = string.instance_eval do
|
1252
1332
|
var = "Local variable"
|
1253
1333
|
# Silence unavoidable warning; Ruby doesn't know we're going to use this
|
@@ -1328,15 +1408,15 @@ HAML
|
|
1328
1408
|
end
|
1329
1409
|
end
|
1330
1410
|
|
1331
|
-
def
|
1411
|
+
def test_spacing_inside_tag
|
1332
1412
|
assert_equal("<div id='outer'>\n<div id='inner'>\n<p>hello world</p>\n</div>\n</div>\n",
|
1333
|
-
render("#outer\n #inner\n %p hello world"
|
1413
|
+
render("#outer\n #inner\n %p hello world"))
|
1334
1414
|
|
1335
1415
|
assert_equal("<p>#{'s' * 75}</p>\n",
|
1336
|
-
render("%p #{'s' * 75}"
|
1416
|
+
render("%p #{'s' * 75}"))
|
1337
1417
|
|
1338
1418
|
assert_equal("<p>#{'s' * 75}</p>\n",
|
1339
|
-
render("%p= 's' * 75"
|
1419
|
+
render("%p= 's' * 75"))
|
1340
1420
|
end
|
1341
1421
|
|
1342
1422
|
def test_remove_whitespace_true
|
@@ -1353,15 +1433,13 @@ HAML
|
|
1353
1433
|
render('%div <span>foo</span> <span>bar</span>', :remove_whitespace => true))
|
1354
1434
|
end
|
1355
1435
|
|
1356
|
-
def
|
1436
|
+
def test_auto_preserve
|
1357
1437
|
assert_equal("<pre>foo
bar</pre>\n", render('%pre="foo\nbar"'))
|
1358
1438
|
assert_equal("<pre>foo\nbar</pre>\n", render("%pre\n foo\n bar"))
|
1359
|
-
assert_equal("<pre>foo\nbar</pre>\n", render('%pre="foo\nbar"', :ugly => true))
|
1360
|
-
assert_equal("<pre>foo\nbar</pre>\n", render("%pre\n foo\n bar", :ugly => true))
|
1361
1439
|
end
|
1362
1440
|
|
1363
1441
|
def test_xhtml_output_option
|
1364
|
-
assert_equal "<p>\n
|
1442
|
+
assert_equal "<p>\n<br />\n</p>\n", render("%p\n %br", :format => :xhtml)
|
1365
1443
|
assert_equal "<a />\n", render("%a/", :format => :xhtml)
|
1366
1444
|
end
|
1367
1445
|
|
@@ -1394,6 +1472,8 @@ HAML
|
|
1394
1472
|
engine = Haml::Engine.new('%a{:b => "a #$global_var_for_testing b"}')
|
1395
1473
|
$global_var_for_testing = 'bar'
|
1396
1474
|
assert_equal("<a b='a bar b'></a>\n", engine.to_html)
|
1475
|
+
ensure
|
1476
|
+
$global_var_for_testing = nil
|
1397
1477
|
end
|
1398
1478
|
|
1399
1479
|
def test_utf8_attrs
|
@@ -1404,7 +1484,7 @@ HAML
|
|
1404
1484
|
# HTML 4.0
|
1405
1485
|
|
1406
1486
|
def test_html_has_no_self_closing_tags
|
1407
|
-
assert_equal "<p>\n
|
1487
|
+
assert_equal "<p>\n<br>\n</p>\n", render("%p\n %br", :format => :html4)
|
1408
1488
|
assert_equal "<br>\n", render("%br/", :format => :html4)
|
1409
1489
|
end
|
1410
1490
|
|
@@ -1448,7 +1528,7 @@ HAML
|
|
1448
1528
|
render("%div{:data => {:one_plus_one => 1+1}}",
|
1449
1529
|
:hyphenate_data_attrs => false))
|
1450
1530
|
|
1451
|
-
assert_equal("<div data-foo='Here&#
|
1531
|
+
assert_equal("<div data-foo='Here's a "quoteful" string.'></div>\n",
|
1452
1532
|
render(%{%div{:data => {:foo => %{Here's a "quoteful" string.}}}},
|
1453
1533
|
:hyphenate_data_attrs => false)) #'
|
1454
1534
|
end
|
@@ -1467,6 +1547,21 @@ HAML
|
|
1467
1547
|
render("%div{:foo => {:baz => 'bang'}}"))
|
1468
1548
|
end
|
1469
1549
|
|
1550
|
+
def test_arbitrary_attribute_hash_merging
|
1551
|
+
assert_equal(%Q{<a aria-baz='qux' aria-foo='bar'></a>\n}, render(<<-HAML))
|
1552
|
+
- h1 = {:aria => {:foo => :bar}}
|
1553
|
+
- h2 = {:baz => :qux}
|
1554
|
+
%a{h1, :aria => h2}
|
1555
|
+
HAML
|
1556
|
+
end
|
1557
|
+
|
1558
|
+
def test_hash_method_call_in_attributes
|
1559
|
+
assert_equal(%Q{<a foo='bar' hoge='fuga'></a>\n}, render(<<-HAML))
|
1560
|
+
- hash = {:hoge => :fuga}
|
1561
|
+
%a{{foo: 'bar'}.merge(hash)}
|
1562
|
+
HAML
|
1563
|
+
end
|
1564
|
+
|
1470
1565
|
def test_html5_data_attributes_with_nested_hash
|
1471
1566
|
assert_equal("<div data-a-b='c'></div>\n", render(<<-HAML))
|
1472
1567
|
- hash = {:a => {:b => 'c'}}
|
@@ -1492,24 +1587,23 @@ HAML
|
|
1492
1587
|
end
|
1493
1588
|
|
1494
1589
|
def test_html5_data_attributes_with_attr_method
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1590
|
+
obj = Object.new
|
1591
|
+
def obj.data_hash
|
1592
|
+
{:data => {:foo => "bar", :baz => "bang"}}
|
1593
|
+
end
|
1499
1594
|
|
1500
|
-
|
1501
|
-
|
1502
|
-
end
|
1595
|
+
def obj.data_val
|
1596
|
+
{:data => "dat"}
|
1503
1597
|
end
|
1504
1598
|
|
1505
1599
|
assert_equal("<div data-baz='bang' data-brat='wurst' data-foo='blip'></div>\n",
|
1506
|
-
render("%div{data_hash, :data => {:foo => 'blip', :brat => 'wurst'}}"))
|
1600
|
+
render("%div{data_hash, :data => {:foo => 'blip', :brat => 'wurst'}}", scope: obj))
|
1507
1601
|
assert_equal("<div data-baz='bang' data-foo='blip'></div>\n",
|
1508
|
-
render("%div{data_hash, 'data-foo' => 'blip'}"))
|
1602
|
+
render("%div{data_hash, 'data-foo' => 'blip'}", scope: obj))
|
1509
1603
|
assert_equal("<div data-baz='bang' data-foo='bar' data='dat'></div>\n",
|
1510
|
-
render("%div{data_hash, :data => 'dat'}"))
|
1604
|
+
render("%div{data_hash, :data => 'dat'}", scope: obj))
|
1511
1605
|
assert_equal("<div data-brat='wurst' data-foo='blip' data='dat'></div>\n",
|
1512
|
-
render("%div{data_val, :data => {:foo => 'blip', :brat => 'wurst'}}"))
|
1606
|
+
render("%div{data_val, :data => {:foo => 'blip', :brat => 'wurst'}}", scope: obj))
|
1513
1607
|
end
|
1514
1608
|
|
1515
1609
|
def test_html5_data_attributes_with_identical_attribute_values
|
@@ -1521,8 +1615,8 @@ HAML
|
|
1521
1615
|
assert_equal(<<XML, render(<<HAML, { :format => :html5, :mime_type => 'text/xml' }))
|
1522
1616
|
<?xml version='1.0' encoding='utf-8' ?>
|
1523
1617
|
<root>
|
1524
|
-
|
1525
|
-
|
1618
|
+
<element />
|
1619
|
+
<hr />
|
1526
1620
|
</root>
|
1527
1621
|
XML
|
1528
1622
|
!!! XML
|
@@ -1536,8 +1630,8 @@ HAML
|
|
1536
1630
|
assert_equal(<<XML, render(<<HAML, { :format => :html4, :mime_type => 'text/xml' }))
|
1537
1631
|
<?xml version='1.0' encoding='utf-8' ?>
|
1538
1632
|
<root>
|
1539
|
-
|
1540
|
-
|
1633
|
+
<element />
|
1634
|
+
<hr />
|
1541
1635
|
</root>
|
1542
1636
|
XML
|
1543
1637
|
!!! XML
|
@@ -1603,10 +1697,10 @@ HAML
|
|
1603
1697
|
|
1604
1698
|
def test_new_attribute_parsing
|
1605
1699
|
assert_equal("<a a2='b2'>bar</a>\n", render("%a(a2=b2) bar", :locals => {:b2 => 'b2'}))
|
1606
|
-
assert_equal(%Q{<a a='foo
|
1607
|
-
assert_equal(%Q{<a a=
|
1608
|
-
assert_equal(%Q{<a a='foo
|
1609
|
-
assert_equal(%Q{<a a=
|
1700
|
+
assert_equal(%Q{<a a='foo"bar'>bar</a>\n}, render(%q{%a(a="#{'foo"bar'}") bar})) #'
|
1701
|
+
assert_equal(%Q{<a a='foo'bar'>bar</a>\n}, render(%q{%a(a="#{"foo'bar"}") bar})) #'
|
1702
|
+
assert_equal(%Q{<a a='foo"bar'>bar</a>\n}, render(%q{%a(a='foo"bar') bar}))
|
1703
|
+
assert_equal(%Q{<a a='foo'bar'>bar</a>\n}, render(%q{%a(a="foo'bar") bar}))
|
1610
1704
|
assert_equal("<a a:b='foo'>bar</a>\n", render("%a(a:b='foo') bar"))
|
1611
1705
|
assert_equal("<a a='foo' b='bar'>bar</a>\n", render("%a(a = 'foo' b = 'bar') bar"))
|
1612
1706
|
assert_equal("<a a='foo' b='bar'>bar</a>\n", render("%a(a = foo b = bar) bar", :locals => {:foo => 'foo', :bar => 'bar'}))
|
@@ -1616,11 +1710,11 @@ HAML
|
|
1616
1710
|
end
|
1617
1711
|
|
1618
1712
|
def test_new_attribute_escaping
|
1619
|
-
assert_equal(%Q{<a a='foo
|
1620
|
-
assert_equal(%Q{<a a='foo
|
1713
|
+
assert_equal(%Q{<a a='foo " bar'>bar</a>\n}, render(%q{%a(a="foo \" bar") bar}))
|
1714
|
+
assert_equal(%Q{<a a='foo \\" bar'>bar</a>\n}, render(%q{%a(a="foo \\\\\" bar") bar}))
|
1621
1715
|
|
1622
|
-
assert_equal(%Q{<a a=
|
1623
|
-
assert_equal(%Q{<a a=
|
1716
|
+
assert_equal(%Q{<a a='foo ' bar'>bar</a>\n}, render(%q{%a(a='foo \' bar') bar}))
|
1717
|
+
assert_equal(%Q{<a a='foo \\' bar'>bar</a>\n}, render(%q{%a(a='foo \\\\\' bar') bar}))
|
1624
1718
|
|
1625
1719
|
assert_equal(%Q{<a a='foo \\ bar'>bar</a>\n}, render(%q{%a(a="foo \\\\ bar") bar}))
|
1626
1720
|
assert_equal(%Q{<a a='foo \#{1 + 1} bar'>bar</a>\n}, render(%q{%a(a="foo \#{1 + 1} bar") bar}))
|
@@ -1649,6 +1743,8 @@ HAML
|
|
1649
1743
|
locals = {:b => 'b', :d => 'd'}
|
1650
1744
|
assert_equal("<p a='b' c='d'></p>\n", render("%p{:a => b}(c=d)", :locals => locals))
|
1651
1745
|
assert_equal("<p a='b' c='d'></p>\n", render("%p(a=b){:c => d}", :locals => locals))
|
1746
|
+
|
1747
|
+
assert_equal("<p id='b_d'></p>\n<p id='b_d'></p>\n", render("%p(id=b){id:d}\n%p(id=b){id:d}", locals: locals))
|
1652
1748
|
end
|
1653
1749
|
|
1654
1750
|
# Ruby Multiline
|
@@ -1696,11 +1792,7 @@ HAML
|
|
1696
1792
|
end
|
1697
1793
|
|
1698
1794
|
def test_ruby_character_literals_are_not_continuation
|
1699
|
-
html =
|
1700
|
-
"44\n44\n<p>foo</p>\n"
|
1701
|
-
else
|
1702
|
-
",\n,\n<p>foo</p>\n"
|
1703
|
-
end
|
1795
|
+
html = ",\n,\n<p>foo</p>\n"
|
1704
1796
|
assert_equal(html, render(<<HAML))
|
1705
1797
|
= ?,
|
1706
1798
|
= ?\,
|
@@ -1752,8 +1844,7 @@ HAML
|
|
1752
1844
|
|
1753
1845
|
def test_loud_ruby_multiline_with_block
|
1754
1846
|
assert_equal(<<HTML, render(<<HAML))
|
1755
|
-
#{%w[far faz fang]}
|
1756
|
-
<p>foo</p>
|
1847
|
+
#{%w[far faz fang]}<p>foo</p>
|
1757
1848
|
<p>bar</p>
|
1758
1849
|
HTML
|
1759
1850
|
= ["bar",
|
@@ -1866,7 +1957,7 @@ HAML
|
|
1866
1957
|
def test_utf_8_bom
|
1867
1958
|
assert_equal <<HTML, render(<<HAML)
|
1868
1959
|
<div class='foo'>
|
1869
|
-
|
1960
|
+
<p>baz</p>
|
1870
1961
|
</div>
|
1871
1962
|
HTML
|
1872
1963
|
\xEF\xBB\xBF.foo
|
@@ -1874,60 +1965,59 @@ HTML
|
|
1874
1965
|
HAML
|
1875
1966
|
end
|
1876
1967
|
|
1877
|
-
|
1878
|
-
|
1879
|
-
assert_equal(Encoding.find("utf-8"), render(<<HAML.encode("us-ascii")).encoding)
|
1968
|
+
def test_default_encoding
|
1969
|
+
assert_equal(Encoding.find("utf-8"), render(<<HAML.encode("us-ascii")).encoding)
|
1880
1970
|
%p bar
|
1881
1971
|
%p foo
|
1882
1972
|
HAML
|
1883
|
-
|
1973
|
+
end
|
1884
1974
|
|
1885
|
-
|
1886
|
-
|
1975
|
+
def test_fake_ascii_encoding
|
1976
|
+
assert_encoded_equal(<<HTML.force_encoding("ascii-8bit"), render(<<HAML, :encoding => "ascii-8bit"))
|
1887
1977
|
<p>bâr</p>
|
1888
1978
|
<p>föö</p>
|
1889
1979
|
HTML
|
1890
1980
|
%p bâr
|
1891
1981
|
%p föö
|
1892
1982
|
HAML
|
1893
|
-
|
1983
|
+
end
|
1894
1984
|
|
1895
|
-
|
1896
|
-
|
1897
|
-
|
1985
|
+
def test_convert_template_render_proc
|
1986
|
+
assert_converts_template_properly {|e| e.render_proc.call}
|
1987
|
+
end
|
1898
1988
|
|
1899
|
-
|
1900
|
-
|
1901
|
-
|
1989
|
+
def test_convert_template_render
|
1990
|
+
assert_converts_template_properly {|e| e.render}
|
1991
|
+
end
|
1902
1992
|
|
1903
|
-
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
1908
|
-
end
|
1993
|
+
def test_convert_template_def_method
|
1994
|
+
assert_converts_template_properly do |e|
|
1995
|
+
o = Object.new
|
1996
|
+
e.def_method(o, :render)
|
1997
|
+
o.render
|
1909
1998
|
end
|
1999
|
+
end
|
1910
2000
|
|
1911
|
-
|
1912
|
-
|
1913
|
-
|
1914
|
-
|
1915
|
-
|
1916
|
-
|
1917
|
-
|
2001
|
+
def test_encoding_error
|
2002
|
+
render("foo\nbar\nb\xFEaz".force_encoding("utf-8"))
|
2003
|
+
assert(false, "Expected exception")
|
2004
|
+
rescue Haml::Error => e
|
2005
|
+
assert_equal(3, e.line)
|
2006
|
+
assert_match(/Invalid .* character/, e.message)
|
2007
|
+
end
|
1918
2008
|
|
1919
|
-
|
1920
|
-
|
1921
|
-
|
1922
|
-
|
1923
|
-
|
1924
|
-
|
1925
|
-
|
1926
|
-
|
1927
|
-
|
2009
|
+
def test_ascii_incompatible_encoding_error
|
2010
|
+
template = "foo\nbar\nb_z".encode("utf-16le")
|
2011
|
+
template[9] = "\xFE".force_encoding("utf-16le")
|
2012
|
+
render(template)
|
2013
|
+
assert(false, "Expected exception")
|
2014
|
+
rescue Haml::Error => e
|
2015
|
+
assert_equal(3, e.line)
|
2016
|
+
assert_match(/Invalid .* character/, e.message)
|
2017
|
+
end
|
1928
2018
|
|
1929
|
-
|
1930
|
-
|
2019
|
+
def test_same_coding_comment_as_encoding
|
2020
|
+
assert_renders_encoded(<<HTML, <<HAML)
|
1931
2021
|
<p>bâr</p>
|
1932
2022
|
<p>föö</p>
|
1933
2023
|
HTML
|
@@ -1935,34 +2025,33 @@ HTML
|
|
1935
2025
|
%p bâr
|
1936
2026
|
%p föö
|
1937
2027
|
HAML
|
1938
|
-
|
1939
|
-
|
1940
|
-
def test_coding_comments
|
1941
|
-
assert_valid_encoding_comment("-# coding: ibm866")
|
1942
|
-
assert_valid_encoding_comment("-# CodINg: IbM866")
|
1943
|
-
assert_valid_encoding_comment("-#coding:ibm866")
|
1944
|
-
assert_valid_encoding_comment("-# CodINg= ibm866")
|
1945
|
-
assert_valid_encoding_comment("-# foo BAR FAOJcoding: ibm866")
|
1946
|
-
assert_valid_encoding_comment("-# coding: ibm866 ASFJ (&(&#!$")
|
1947
|
-
assert_valid_encoding_comment("-# -*- coding: ibm866")
|
1948
|
-
assert_valid_encoding_comment("-# coding: ibm866 -*- coding: blah")
|
1949
|
-
assert_valid_encoding_comment("-# -*- coding: ibm866 -*-")
|
1950
|
-
assert_valid_encoding_comment("-# -*- encoding: ibm866 -*-")
|
1951
|
-
assert_valid_encoding_comment('-# -*- coding: "ibm866" -*-')
|
1952
|
-
assert_valid_encoding_comment("-#-*-coding:ibm866-*-")
|
1953
|
-
assert_valid_encoding_comment("-#-*-coding:ibm866-*-")
|
1954
|
-
assert_valid_encoding_comment("-# -*- foo: bar; coding: ibm866; baz: bang -*-")
|
1955
|
-
assert_valid_encoding_comment("-# foo bar coding: baz -*- coding: ibm866 -*-")
|
1956
|
-
assert_valid_encoding_comment("-# -*- coding: ibm866 -*- foo bar coding: baz")
|
1957
|
-
end
|
2028
|
+
end
|
1958
2029
|
|
1959
|
-
|
1960
|
-
|
2030
|
+
def test_coding_comments
|
2031
|
+
assert_valid_encoding_comment("-# coding: ibm866")
|
2032
|
+
assert_valid_encoding_comment("-# CodINg: IbM866")
|
2033
|
+
assert_valid_encoding_comment("-#coding:ibm866")
|
2034
|
+
assert_valid_encoding_comment("-# CodINg= ibm866")
|
2035
|
+
assert_valid_encoding_comment("-# foo BAR FAOJcoding: ibm866")
|
2036
|
+
assert_valid_encoding_comment("-# coding: ibm866 ASFJ (&(&#!$")
|
2037
|
+
assert_valid_encoding_comment("-# -*- coding: ibm866")
|
2038
|
+
assert_valid_encoding_comment("-# coding: ibm866 -*- coding: blah")
|
2039
|
+
assert_valid_encoding_comment("-# -*- coding: ibm866 -*-")
|
2040
|
+
assert_valid_encoding_comment("-# -*- encoding: ibm866 -*-")
|
2041
|
+
assert_valid_encoding_comment('-# -*- coding: "ibm866" -*-')
|
2042
|
+
assert_valid_encoding_comment("-#-*-coding:ibm866-*-")
|
2043
|
+
assert_valid_encoding_comment("-#-*-coding:ibm866-*-")
|
2044
|
+
assert_valid_encoding_comment("-# -*- foo: bar; coding: ibm866; baz: bang -*-")
|
2045
|
+
assert_valid_encoding_comment("-# foo bar coding: baz -*- coding: ibm866 -*-")
|
2046
|
+
assert_valid_encoding_comment("-# -*- coding: ibm866 -*- foo bar coding: baz")
|
2047
|
+
end
|
2048
|
+
|
2049
|
+
def test_different_coding_than_system
|
2050
|
+
assert_renders_encoded(<<HTML.encode("IBM866"), <<HAML.encode("IBM866"))
|
1961
2051
|
<p>тАЬ</p>
|
1962
2052
|
HTML
|
1963
2053
|
%p тАЬ
|
1964
2054
|
HAML
|
1965
|
-
end
|
1966
2055
|
end
|
1967
2056
|
|
1968
2057
|
def test_block_spacing
|
@@ -1977,6 +2066,28 @@ HAML
|
|
1977
2066
|
end
|
1978
2067
|
end
|
1979
2068
|
|
2069
|
+
def test_tracing
|
2070
|
+
result = render('%p{:class => "hello"}', :trace => true, :filename => 'foo').strip
|
2071
|
+
assert_equal "<p class='hello' data-trace='foo:1'></p>", result
|
2072
|
+
end
|
2073
|
+
|
2074
|
+
def test_unsafe_dynamic_attribute_name_raises_invalid_attribute_name_error
|
2075
|
+
assert_raises(Haml::InvalidAttributeNameError) do
|
2076
|
+
render(<<-HAML)
|
2077
|
+
- params = { 'x /><script>alert(1);</script><div x' => 'hello' }
|
2078
|
+
%div{ data: params }
|
2079
|
+
HAML
|
2080
|
+
end
|
2081
|
+
end
|
2082
|
+
|
2083
|
+
def test_unsafe_static_attribute_name_raises_invalid_attribute_name_error
|
2084
|
+
assert_raises(Haml::InvalidAttributeNameError) do
|
2085
|
+
render(<<-HAML)
|
2086
|
+
%div{ 'x /><script>alert(1);</script><div x' => 'hello' }
|
2087
|
+
HAML
|
2088
|
+
end
|
2089
|
+
end
|
2090
|
+
|
1980
2091
|
private
|
1981
2092
|
|
1982
2093
|
def assert_valid_encoding_comment(comment)
|