haml 3.0.18 → 3.0.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of haml might be problematic. Click here for more details.

Files changed (206) hide show
  1. data/Rakefile +11 -1
  2. data/VERSION +1 -1
  3. data/extra/haml-mode.el +2 -2
  4. data/extra/sass-mode.el +1 -1
  5. data/lib/haml/engine.rb +1 -1
  6. data/lib/haml/exec.rb +3 -5
  7. data/lib/haml/precompiler.rb +9 -9
  8. data/lib/haml/util.rb +13 -0
  9. data/lib/sass/script/color.rb +2 -1
  10. data/lib/sass/script/funcall.rb +3 -5
  11. data/lib/sass/script/interpolation.rb +1 -1
  12. data/lib/sass/script/literal.rb +1 -1
  13. data/lib/sass/script/node.rb +11 -0
  14. data/lib/sass/script/number.rb +12 -9
  15. data/lib/sass/script/operation.rb +1 -3
  16. data/lib/sass/script/parser.rb +1 -1
  17. data/lib/sass/script/string_interpolation.rb +1 -1
  18. data/lib/sass/tree/rule_node.rb +1 -1
  19. data/test/haml/engine_test.rb +55 -189
  20. data/test/sass/engine_test.rb +32 -0
  21. data/test/sass/script_test.rb +18 -1
  22. data/test/sass/scss/scss_test.rb +14 -0
  23. data/vendor/sass/CONTRIBUTING +3 -0
  24. data/vendor/sass/MIT-LICENSE +20 -0
  25. data/vendor/sass/README.md +201 -0
  26. data/vendor/sass/Rakefile +363 -0
  27. data/vendor/sass/TODO +39 -0
  28. data/vendor/sass/VERSION +1 -0
  29. data/vendor/sass/VERSION_NAME +1 -0
  30. data/vendor/sass/bin/css2sass +13 -0
  31. data/vendor/sass/bin/sass +8 -0
  32. data/vendor/sass/bin/sass-convert +7 -0
  33. data/vendor/sass/doc-src/FAQ.md +35 -0
  34. data/vendor/sass/doc-src/INDENTED_SYNTAX.md +210 -0
  35. data/vendor/sass/doc-src/SASS_CHANGELOG.md +1870 -0
  36. data/vendor/sass/doc-src/SASS_REFERENCE.md +1713 -0
  37. data/vendor/sass/doc-src/SCSS_FOR_SASS_USERS.md +155 -0
  38. data/vendor/sass/ext/extconf.rb +10 -0
  39. data/vendor/sass/extra/update_watch.rb +13 -0
  40. data/vendor/sass/init.rb +18 -0
  41. data/vendor/sass/lib/sass.rb +71 -0
  42. data/vendor/sass/lib/sass/cache_store.rb +208 -0
  43. data/vendor/sass/lib/sass/callbacks.rb +66 -0
  44. data/vendor/sass/lib/sass/css.rb +294 -0
  45. data/vendor/sass/lib/sass/engine.rb +792 -0
  46. data/vendor/sass/lib/sass/environment.rb +143 -0
  47. data/vendor/sass/lib/sass/error.rb +201 -0
  48. data/vendor/sass/lib/sass/exec.rb +619 -0
  49. data/vendor/sass/lib/sass/importers.rb +22 -0
  50. data/vendor/sass/lib/sass/importers/base.rb +138 -0
  51. data/vendor/sass/lib/sass/importers/filesystem.rb +121 -0
  52. data/vendor/sass/lib/sass/less.rb +363 -0
  53. data/vendor/sass/lib/sass/plugin.rb +126 -0
  54. data/vendor/sass/lib/sass/plugin/compiler.rb +346 -0
  55. data/vendor/sass/lib/sass/plugin/configuration.rb +123 -0
  56. data/vendor/sass/lib/sass/plugin/generic.rb +15 -0
  57. data/vendor/sass/lib/sass/plugin/merb.rb +48 -0
  58. data/vendor/sass/lib/sass/plugin/rack.rb +47 -0
  59. data/vendor/sass/lib/sass/plugin/rails.rb +41 -0
  60. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +145 -0
  61. data/vendor/sass/lib/sass/railtie.rb +8 -0
  62. data/vendor/sass/lib/sass/repl.rb +58 -0
  63. data/vendor/sass/lib/sass/root.rb +7 -0
  64. data/vendor/sass/lib/sass/script.rb +63 -0
  65. data/vendor/sass/lib/sass/script/bool.rb +18 -0
  66. data/vendor/sass/lib/sass/script/color.rb +491 -0
  67. data/vendor/sass/lib/sass/script/css_lexer.rb +29 -0
  68. data/vendor/sass/lib/sass/script/css_parser.rb +31 -0
  69. data/vendor/sass/lib/sass/script/funcall.rb +79 -0
  70. data/vendor/sass/lib/sass/script/functions.rb +852 -0
  71. data/vendor/sass/lib/sass/script/interpolation.rb +70 -0
  72. data/vendor/sass/lib/sass/script/lexer.rb +337 -0
  73. data/vendor/sass/lib/sass/script/literal.rb +236 -0
  74. data/vendor/sass/lib/sass/script/node.rb +101 -0
  75. data/vendor/sass/lib/sass/script/number.rb +423 -0
  76. data/vendor/sass/lib/sass/script/operation.rb +92 -0
  77. data/vendor/sass/lib/sass/script/parser.rb +392 -0
  78. data/vendor/sass/lib/sass/script/string.rb +67 -0
  79. data/vendor/sass/lib/sass/script/string_interpolation.rb +93 -0
  80. data/vendor/sass/lib/sass/script/unary_operation.rb +57 -0
  81. data/vendor/sass/lib/sass/script/variable.rb +48 -0
  82. data/vendor/sass/lib/sass/scss.rb +17 -0
  83. data/vendor/sass/lib/sass/scss/css_parser.rb +51 -0
  84. data/vendor/sass/lib/sass/scss/parser.rb +838 -0
  85. data/vendor/sass/lib/sass/scss/rx.rb +126 -0
  86. data/vendor/sass/lib/sass/scss/sass_parser.rb +11 -0
  87. data/vendor/sass/lib/sass/scss/script_lexer.rb +15 -0
  88. data/vendor/sass/lib/sass/scss/script_parser.rb +25 -0
  89. data/vendor/sass/lib/sass/scss/static_parser.rb +40 -0
  90. data/vendor/sass/lib/sass/selector.rb +361 -0
  91. data/vendor/sass/lib/sass/selector/abstract_sequence.rb +62 -0
  92. data/vendor/sass/lib/sass/selector/comma_sequence.rb +82 -0
  93. data/vendor/sass/lib/sass/selector/sequence.rb +236 -0
  94. data/vendor/sass/lib/sass/selector/simple.rb +113 -0
  95. data/vendor/sass/lib/sass/selector/simple_sequence.rb +135 -0
  96. data/vendor/sass/lib/sass/shared.rb +78 -0
  97. data/vendor/sass/lib/sass/tree/comment_node.rb +128 -0
  98. data/vendor/sass/lib/sass/tree/debug_node.rb +36 -0
  99. data/vendor/sass/lib/sass/tree/directive_node.rb +75 -0
  100. data/vendor/sass/lib/sass/tree/extend_node.rb +65 -0
  101. data/vendor/sass/lib/sass/tree/for_node.rb +67 -0
  102. data/vendor/sass/lib/sass/tree/if_node.rb +81 -0
  103. data/vendor/sass/lib/sass/tree/import_node.rb +124 -0
  104. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +60 -0
  105. data/vendor/sass/lib/sass/tree/mixin_node.rb +123 -0
  106. data/vendor/sass/lib/sass/tree/node.rb +490 -0
  107. data/vendor/sass/lib/sass/tree/prop_node.rb +220 -0
  108. data/vendor/sass/lib/sass/tree/root_node.rb +125 -0
  109. data/vendor/sass/lib/sass/tree/rule_node.rb +273 -0
  110. data/vendor/sass/lib/sass/tree/variable_node.rb +39 -0
  111. data/vendor/sass/lib/sass/tree/warn_node.rb +42 -0
  112. data/vendor/sass/lib/sass/tree/while_node.rb +48 -0
  113. data/vendor/sass/lib/sass/util.rb +700 -0
  114. data/vendor/sass/lib/sass/util/subset_map.rb +101 -0
  115. data/vendor/sass/lib/sass/version.rb +109 -0
  116. data/vendor/sass/rails/init.rb +1 -0
  117. data/vendor/sass/sass.gemspec +32 -0
  118. data/vendor/sass/test/sass/cache_test.rb +74 -0
  119. data/vendor/sass/test/sass/callbacks_test.rb +61 -0
  120. data/vendor/sass/test/sass/conversion_test.rb +1210 -0
  121. data/vendor/sass/test/sass/css2sass_test.rb +364 -0
  122. data/vendor/sass/test/sass/data/hsl-rgb.txt +319 -0
  123. data/vendor/sass/test/sass/engine_test.rb +2283 -0
  124. data/vendor/sass/test/sass/extend_test.rb +1348 -0
  125. data/vendor/sass/test/sass/functions_test.rb +565 -0
  126. data/vendor/sass/test/sass/importer_test.rb +104 -0
  127. data/vendor/sass/test/sass/less_conversion_test.rb +632 -0
  128. data/vendor/sass/test/sass/mock_importer.rb +49 -0
  129. data/vendor/sass/test/sass/more_results/more1.css +9 -0
  130. data/vendor/sass/test/sass/more_results/more1_with_line_comments.css +26 -0
  131. data/vendor/sass/test/sass/more_results/more_import.css +29 -0
  132. data/vendor/sass/test/sass/more_templates/_more_partial.sass +2 -0
  133. data/vendor/sass/test/sass/more_templates/more1.sass +23 -0
  134. data/vendor/sass/test/sass/more_templates/more_import.sass +11 -0
  135. data/vendor/sass/test/sass/plugin_test.rb +430 -0
  136. data/vendor/sass/test/sass/results/alt.css +4 -0
  137. data/vendor/sass/test/sass/results/basic.css +9 -0
  138. data/vendor/sass/test/sass/results/compact.css +5 -0
  139. data/vendor/sass/test/sass/results/complex.css +86 -0
  140. data/vendor/sass/test/sass/results/compressed.css +1 -0
  141. data/vendor/sass/test/sass/results/expanded.css +19 -0
  142. data/vendor/sass/test/sass/results/import.css +31 -0
  143. data/vendor/sass/test/sass/results/line_numbers.css +49 -0
  144. data/vendor/sass/test/sass/results/mixins.css +95 -0
  145. data/vendor/sass/test/sass/results/multiline.css +24 -0
  146. data/vendor/sass/test/sass/results/nested.css +22 -0
  147. data/vendor/sass/test/sass/results/options.css +1 -0
  148. data/vendor/sass/test/sass/results/parent_ref.css +13 -0
  149. data/vendor/sass/test/sass/results/script.css +16 -0
  150. data/vendor/sass/test/sass/results/scss_import.css +31 -0
  151. data/vendor/sass/test/sass/results/scss_importee.css +2 -0
  152. data/vendor/sass/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  153. data/vendor/sass/test/sass/results/subdir/subdir.css +3 -0
  154. data/vendor/sass/test/sass/results/units.css +11 -0
  155. data/vendor/sass/test/sass/results/warn.css +0 -0
  156. data/vendor/sass/test/sass/results/warn_imported.css +0 -0
  157. data/vendor/sass/test/sass/script_conversion_test.rb +254 -0
  158. data/vendor/sass/test/sass/script_test.rb +470 -0
  159. data/vendor/sass/test/sass/scss/css_test.rb +897 -0
  160. data/vendor/sass/test/sass/scss/rx_test.rb +156 -0
  161. data/vendor/sass/test/sass/scss/scss_test.rb +1088 -0
  162. data/vendor/sass/test/sass/scss/test_helper.rb +37 -0
  163. data/vendor/sass/test/sass/templates/_partial.sass +2 -0
  164. data/vendor/sass/test/sass/templates/alt.sass +16 -0
  165. data/vendor/sass/test/sass/templates/basic.sass +23 -0
  166. data/vendor/sass/test/sass/templates/bork1.sass +2 -0
  167. data/vendor/sass/test/sass/templates/bork2.sass +2 -0
  168. data/vendor/sass/test/sass/templates/bork3.sass +2 -0
  169. data/vendor/sass/test/sass/templates/bork4.sass +2 -0
  170. data/vendor/sass/test/sass/templates/compact.sass +17 -0
  171. data/vendor/sass/test/sass/templates/complex.sass +305 -0
  172. data/vendor/sass/test/sass/templates/compressed.sass +15 -0
  173. data/vendor/sass/test/sass/templates/expanded.sass +17 -0
  174. data/vendor/sass/test/sass/templates/import.sass +12 -0
  175. data/vendor/sass/test/sass/templates/importee.less +2 -0
  176. data/vendor/sass/test/sass/templates/importee.sass +19 -0
  177. data/vendor/sass/test/sass/templates/line_numbers.sass +13 -0
  178. data/vendor/sass/test/sass/templates/mixin_bork.sass +5 -0
  179. data/vendor/sass/test/sass/templates/mixins.sass +76 -0
  180. data/vendor/sass/test/sass/templates/multiline.sass +20 -0
  181. data/vendor/sass/test/sass/templates/nested.sass +25 -0
  182. data/vendor/sass/test/sass/templates/nested_bork1.sass +2 -0
  183. data/vendor/sass/test/sass/templates/nested_bork2.sass +2 -0
  184. data/vendor/sass/test/sass/templates/nested_bork3.sass +2 -0
  185. data/vendor/sass/test/sass/templates/nested_bork4.sass +2 -0
  186. data/vendor/sass/test/sass/templates/nested_mixin_bork.sass +6 -0
  187. data/vendor/sass/test/sass/templates/options.sass +2 -0
  188. data/vendor/sass/test/sass/templates/parent_ref.sass +25 -0
  189. data/vendor/sass/test/sass/templates/script.sass +101 -0
  190. data/vendor/sass/test/sass/templates/scss_import.scss +11 -0
  191. data/vendor/sass/test/sass/templates/scss_importee.scss +1 -0
  192. data/vendor/sass/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  193. data/vendor/sass/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  194. data/vendor/sass/test/sass/templates/subdir/subdir.sass +6 -0
  195. data/vendor/sass/test/sass/templates/units.sass +11 -0
  196. data/vendor/sass/test/sass/templates/warn.sass +3 -0
  197. data/vendor/sass/test/sass/templates/warn_imported.sass +4 -0
  198. data/vendor/sass/test/sass/test_helper.rb +8 -0
  199. data/vendor/sass/test/sass/util/subset_map_test.rb +91 -0
  200. data/vendor/sass/test/sass/util_test.rb +275 -0
  201. data/vendor/sass/test/test_helper.rb +64 -0
  202. data/vendor/sass/yard/callbacks.rb +29 -0
  203. data/vendor/sass/yard/default/fulldoc/html/css/common.sass +26 -0
  204. data/vendor/sass/yard/default/layout/html/footer.erb +12 -0
  205. data/vendor/sass/yard/inherited_hash.rb +41 -0
  206. metadata +422 -239
data/Rakefile CHANGED
@@ -42,7 +42,7 @@ END
42
42
  # Don't use Rake::GemPackageTast because we want prerequisites to run
43
43
  # before we load the gemspec.
44
44
  desc "Build all the packages."
45
- task :package => [:revision_file, :submodules] do
45
+ task :package => [:revision_file, :submodules, :permissions] do
46
46
  load scope('haml.gemspec')
47
47
  Gem::Builder.new(HAML_GEMSPEC).build
48
48
  pkg = "#{HAML_GEMSPEC.name}-#{HAML_GEMSPEC.version}"
@@ -54,6 +54,16 @@ task :package => [:revision_file, :submodules] do
54
54
  sh %{gzip pkg/#{pkg}.tar}
55
55
  end
56
56
 
57
+ task :permissions do
58
+ sh %{chmod -R a+rx bin}
59
+ sh %{chmod -R a+r .}
60
+ require 'shellwords'
61
+ Dir.glob('test/**/*_test.rb') do |file|
62
+ next if file =~ %r{^test/haml/spec/}
63
+ sh %{chmod a+rx #{file}}
64
+ end
65
+ end
66
+
57
67
  task :revision_file do
58
68
  require 'lib/haml'
59
69
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.18
1
+ 3.0.21
data/extra/haml-mode.el CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ;; Author: Nathan Weizenbaum
6
6
  ;; URL: http://github.com/nex3/haml/tree/master
7
- ;; Version: 3.0.14
7
+ ;; Version: 3.0.19
8
8
  ;; Created: 2007-03-08
9
9
  ;; By: Nathan Weizenbaum
10
10
  ;; Keywords: markup, language, html
@@ -73,7 +73,7 @@ a specific level to which the current line could be indented.")
73
73
  `(,(concat haml-tag-beg-re "[><]*[ \t]*$")
74
74
  "^[ \t]*[&!]?[-=~].*do[ \t]*\\(|.*|[ \t]*\\)?$"
75
75
  ,(concat "^[ \t]*[&!]?[-=~][ \t]*\\("
76
- (regexp-opt '("if" "unless" "while" "until" "else"
76
+ (regexp-opt '("if" "unless" "while" "until" "else" "for"
77
77
  "begin" "elsif" "rescue" "ensure" "when"))
78
78
  "\\)")
79
79
  "^[ \t]*/\\(\\[.*\\]\\)?[ \t]*$"
data/extra/sass-mode.el CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ;; Author: Nathan Weizenbaum
6
6
  ;; URL: http://github.com/nex3/haml/tree/master
7
- ;; Version: 3.0.14
7
+ ;; Version: 3.0.19
8
8
  ;; Created: 2007-03-15
9
9
  ;; By: Nathan Weizenbaum
10
10
  ;; Keywords: markup, language, css
data/lib/haml/engine.rb CHANGED
@@ -190,7 +190,7 @@ module Haml
190
190
  ensure
191
191
  # Get rid of the current buffer
192
192
  scope_object.instance_eval do
193
- @haml_buffer = buffer.upper
193
+ @haml_buffer = buffer.upper if buffer
194
194
  end
195
195
  end
196
196
  alias_method :to_html, :render
data/lib/haml/exec.rb CHANGED
@@ -79,10 +79,8 @@ module Haml
79
79
  @options[:trace] = true
80
80
  end
81
81
 
82
- if ::Haml::Util.windows?
83
- opts.on('--unix-newlines', 'Use Unix-style newlines in written files.') do
84
- @options[:unix_newlines] = true
85
- end
82
+ opts.on('--unix-newlines', 'Use Unix-style newlines in written files.') do
83
+ @options[:unix_newlines] = true if ::Haml::Util.windows?
86
84
  end
87
85
 
88
86
  opts.on_tail("-?", "-h", "--help", "Show this message") do
@@ -357,7 +355,7 @@ END
357
355
  input = @options[:input]
358
356
  output = @options[:output]
359
357
 
360
- @options[:syntax] ||= :scss if input.is_a?(File) && input.path =~ /\.scss$/
358
+ @options[:for_engine][:syntax] ||= :scss if input.is_a?(File) && input.path =~ /\.scss$/
361
359
  tree =
362
360
  if input.is_a?(File) && !@options[:check_syntax]
363
361
  ::Sass::Files.tree_for(input.path, @options[:for_engine])
@@ -118,8 +118,8 @@ END
118
118
 
119
119
  names.map do |name|
120
120
  # Can't use || because someone might explicitly pass in false with a symbol
121
- sym_local = "_haml_locals[#{name.to_sym.inspect}]"
122
- str_local = "_haml_locals[#{name.to_s.inspect}]"
121
+ sym_local = "_haml_locals[#{inspect(name.to_sym)}]"
122
+ str_local = "_haml_locals[#{inspect(name.to_s)}]"
123
123
  "#{name} = #{sym_local}.nil? ? #{str_local} : #{sym_local}"
124
124
  end.join(';') + ';'
125
125
  end
@@ -320,7 +320,7 @@ END
320
320
  @to_merge.each do |type, val, tabs|
321
321
  case type
322
322
  when :text
323
- str << val.inspect[1...-1]
323
+ str << inspect(val)[1...-1]
324
324
  mtabs += tabs
325
325
  when :script
326
326
  if mtabs != 0 && !@options[:ugly]
@@ -660,7 +660,7 @@ END
660
660
  if type == :static
661
661
  static_attributes[name] = val
662
662
  else
663
- dynamic_attributes << name.inspect << " => " << val << ","
663
+ dynamic_attributes << inspect(name) << " => " << val << ","
664
664
  end
665
665
  end
666
666
  dynamic_attributes << "}"
@@ -695,7 +695,7 @@ END
695
695
 
696
696
  return name, [:static, content.first[1]] if content.size == 1
697
697
  return name, [:dynamic,
698
- '"' + content.map {|(t, v)| t == :str ? v.inspect[1...-1] : "\#{#{v}}"}.join + '"']
698
+ '"' + content.map {|(t, v)| t == :str ? inspect(v)[1...-1] : "\#{#{v}}"}.join + '"']
699
699
  end
700
700
 
701
701
  # Parses a line that will render as an XHTML tag, and adds the code that will
@@ -800,7 +800,7 @@ END
800
800
  return if tag_closed
801
801
  else
802
802
  flush_merged_text
803
- content = parse ? 'nil' : value.inspect
803
+ content = parse ? 'nil' : inspect(value)
804
804
  if attributes_hashes.empty?
805
805
  attributes_hashes = ''
806
806
  elsif attributes_hashes.size == 1
@@ -811,7 +811,7 @@ END
811
811
 
812
812
  args = [tag_name, self_closing, !block_opened?, preserve_tag, escape_html,
813
813
  attributes, nuke_outer_whitespace, nuke_inner_whitespace
814
- ].map { |v| v.inspect }.join(', ')
814
+ ].map {|v| inspect(v)}.join(', ')
815
815
  push_silent "_hamlout.open_tag(#{args}, #{object_ref}, #{content}#{attributes_hashes})"
816
816
  @dont_tab_up_next_text = @dont_indent_next_line = dont_indent_next_line
817
817
  end
@@ -1017,14 +1017,14 @@ END
1017
1017
 
1018
1018
  def unescape_interpolation(str, opts = {})
1019
1019
  res = ''
1020
- rest = Haml::Shared.handle_interpolation str.dump do |scan|
1020
+ rest = Haml::Shared.handle_interpolation inspect(str) do |scan|
1021
1021
  escapes = (scan[2].size - 1) / 2
1022
1022
  res << scan.matched[0...-3 - escapes]
1023
1023
  if escapes % 2 == 1
1024
1024
  res << '#{'
1025
1025
  else
1026
1026
  content = eval('"' + balance(scan, ?{, ?}, 1)[0][0...-1] + '"')
1027
- content = "Haml::Helpers.html_escape(#{content})" if opts[:escape_html]
1027
+ content = "Haml::Helpers.html_escape((#{content}))" if opts[:escape_html]
1028
1028
  res << '#{' + content + "}"# Use eval to get rid of string escapes
1029
1029
  end
1030
1030
  end
data/lib/haml/util.rb CHANGED
@@ -656,6 +656,19 @@ MSG
656
656
  set1.to_a.uniq.sort_by {|e| e.hash}.eql?(set2.to_a.uniq.sort_by {|e| e.hash})
657
657
  end
658
658
 
659
+ # Like `Object#inspect`, but preserves non-ASCII characters rather than escaping them under Ruby 1.9.2.
660
+ # This is necessary so that the precompiled Haml template can be `#encode`d into `@options[:encoding]`
661
+ # before being evaluated.
662
+ #
663
+ # @param obj {Object}
664
+ # @return {String}
665
+ def inspect(obj)
666
+ return obj.inspect unless version_geq(::RUBY_VERSION, "1.9.2")
667
+ return ':' + inspect(obj.to_s) if obj.is_a?(Symbol)
668
+ return obj.inspect unless obj.is_a?(String)
669
+ '"' + obj.gsub(/[\x00-\x7F]+/) {|s| s.inspect[1...-1]} + '"'
670
+ end
671
+
659
672
  ## Static Method Stuff
660
673
 
661
674
  # The context in which the ERB for \{#def\_static\_method} will be run.
@@ -401,7 +401,8 @@ END
401
401
  end
402
402
 
403
403
  def rgba_str
404
- "rgba(#{rgb.join(', ')}, #{alpha % 1 == 0.0 ? alpha.to_i : alpha})"
404
+ split = options[:style] == :compressed ? ',' : ', '
405
+ "rgba(#{rgb.join(split)}#{split}#{Number.round(alpha)})"
405
406
  end
406
407
 
407
408
  def hex_str
@@ -63,12 +63,10 @@ module Sass
63
63
  args = self.args.map {|a| a.perform(environment)}
64
64
  ruby_name = name.gsub('-', '_')
65
65
  unless Haml::Util.has?(:public_instance_method, Functions, ruby_name) && ruby_name !~ /^__/
66
- return Script::String.new("#{name}(#{args.map {|a| a.perform(environment)}.join(', ')})")
66
+ opts(Script::String.new("#{name}(#{args.map {|a| a.perform(environment)}.join(', ')})"))
67
+ else
68
+ opts(Functions::EvaluationContext.new(environment.options).send(ruby_name, *args))
67
69
  end
68
-
69
- result = Functions::EvaluationContext.new(environment.options).send(ruby_name, *args)
70
- result.options = environment.options
71
- return result
72
70
  rescue ArgumentError => e
73
71
  raise e unless e.backtrace.any? {|t| t =~ /:in `(block in )?(#{name}|perform)'$/}
74
72
  raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
@@ -64,7 +64,7 @@ module Sass::Script
64
64
  res << (val.is_a?(Sass::Script::String) ? val.value : val.to_s)
65
65
  res << " " if @after && @whitespace_after
66
66
  res << @after.perform(environment).to_s if @after
67
- Sass::Script::String.new(res)
67
+ opts(Sass::Script::String.new(res))
68
68
  end
69
69
  end
70
70
  end
@@ -117,7 +117,7 @@ MSG
117
117
  # @return [Script::String] A string containing both literals
118
118
  # separated by `", "`
119
119
  def comma(other)
120
- Sass::Script::String.new("#{self.to_s}, #{other.to_s}")
120
+ Sass::Script::String.new("#{self.to_s},#{' ' unless options[:style] == :compressed}#{other.to_s}")
121
121
  end
122
122
 
123
123
  # The SassScript `=` operation
@@ -90,6 +90,8 @@ module Sass::Script
90
90
  end
91
91
 
92
92
  # Evaluates this node.
93
+ # Note that all {Literal} objects created within this method
94
+ # should have their \{#options} attribute set, probably via \{#opts}.
93
95
  #
94
96
  # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
95
97
  # @return [Literal] The SassScript object that is the value of the SassScript
@@ -97,5 +99,14 @@ module Sass::Script
97
99
  def _perform(environment)
98
100
  raise NotImplementedError.new("All subclasses of Sass::Script::Node must override #_perform.")
99
101
  end
102
+
103
+ # Sets the \{#options} field on the given literal and returns it
104
+ #
105
+ # @param literal [Literal]
106
+ # @return [Literal]
107
+ def opts(literal)
108
+ literal.options = options
109
+ literal
110
+ end
100
111
  end
101
112
  end
@@ -248,15 +248,7 @@ module Sass::Script
248
248
  #
249
249
  # @return [String] The representation
250
250
  def inspect(opts = {})
251
- value =
252
- if self.value.is_a?(Float) && (self.value.infinite? || self.value.nan?)
253
- self.value
254
- elsif int?
255
- self.value.to_i
256
- else
257
- (self.value * PRECISION).round / PRECISION
258
- end
259
- "#{value}#{unit_str}"
251
+ "#{self.class.round(self.value)}#{unit_str}"
260
252
  end
261
253
  alias_method :to_sass, :inspect
262
254
 
@@ -334,6 +326,17 @@ module Sass::Script
334
326
 
335
327
  private
336
328
 
329
+ # @private
330
+ def self.round(num)
331
+ if num.is_a?(Float) && (num.infinite? || num.nan?)
332
+ num
333
+ elsif num % 1 == 0.0
334
+ num.to_i
335
+ else
336
+ (num * PRECISION).round / PRECISION
337
+ end
338
+ end
339
+
337
340
  def operate(other, operation)
338
341
  this = self
339
342
  if [:+, :-, :<=, :<, :>, :>=].include?(operation)
@@ -72,9 +72,7 @@ module Sass::Script
72
72
  end
73
73
 
74
74
  begin
75
- res = literal1.send(@operator, literal2)
76
- res.options = environment.options
77
- res
75
+ opts(literal1.send(@operator, literal2))
78
76
  rescue NoMethodError => e
79
77
  raise e unless e.name.to_s == @operator.to_s
80
78
  raise Sass::SyntaxError.new("Undefined operation: \"#{literal1} #{@operator} #{literal2}\".")
@@ -246,7 +246,7 @@ RUBY
246
246
  return if @stop_at && @stop_at.include?(@lexer.peek.value)
247
247
 
248
248
  name = @lexer.next
249
- if color = Color::HTML4_COLORS[name.value]
249
+ if color = Color::HTML4_COLORS[name.value.downcase]
250
250
  return node(Color.new(color))
251
251
  end
252
252
  node(Script::String.new(name.value, :identifier))
@@ -72,7 +72,7 @@ module Sass::Script
72
72
  mid = @mid.perform(environment)
73
73
  res << (mid.is_a?(Sass::Script::String) ? mid.value : mid.to_s)
74
74
  res << @after.perform(environment).value
75
- Sass::Script::String.new(res, before.type)
75
+ opts(Sass::Script::String.new(res, before.type))
76
76
  end
77
77
 
78
78
  private
@@ -134,7 +134,7 @@ module Sass::Tree
134
134
  per_rule_indent, total_indent = [:nested, :expanded].include?(style) ? [rule_indent, ''] : ['', rule_indent]
135
135
 
136
136
  total_rule = total_indent + resolved_rules.members.
137
- map {|seq| seq.to_a.join}.
137
+ map {|seq| seq.to_a.join.gsub(/([^,])\n/m, style == :compressed ? '\1 ' : "\\1\n")}.
138
138
  join(rule_separator).split("\n").map do |line|
139
139
  per_rule_indent + line.strip
140
140
  end.join(line_separator)
@@ -111,6 +111,17 @@ MESSAGE
111
111
  Haml::Engine.new(text, options)
112
112
  end
113
113
 
114
+ def setup
115
+ return if Haml::Util.ruby1_8?
116
+ @old_default_internal = Encoding.default_internal
117
+ Encoding.default_internal = nil
118
+ end
119
+
120
+ def teardown
121
+ return if Haml::Util.ruby1_8?
122
+ Encoding.default_internal = @old_default_internal
123
+ end
124
+
114
125
  def test_empty_render
115
126
  assert_equal "", render("")
116
127
  end
@@ -763,6 +774,14 @@ HTML
763
774
  HAML
764
775
  end
765
776
 
777
+ def test_escape_html_with_interpolated_if_statement
778
+ assert_equal(<<HTML, render(<<HAML, :escape_html => true))
779
+ foo,
780
+ HTML
781
+ foo\#{"," if true}
782
+ HAML
783
+ end
784
+
766
785
  # HTML escaping tests
767
786
 
768
787
  def test_ampersand_equals_should_escape
@@ -1506,7 +1525,7 @@ HAML
1506
1525
 
1507
1526
  def test_loud_ruby_multiline_with_block
1508
1527
  assert_equal(<<HTML, render(<<HAML))
1509
- farfazfang
1528
+ #{%w[far faz fang]}
1510
1529
  <p>foo</p>
1511
1530
  <p>bar</p>
1512
1531
  HTML
@@ -1636,18 +1655,8 @@ HAML
1636
1655
  HAML
1637
1656
  end
1638
1657
 
1639
- def test_convert_template_render
1640
- assert_equal(<<HTML, render(<<HAML.encode("iso-8859-1"), :encoding => "utf-8"))
1641
- <p>bâr</p>
1642
- <p>föö</p>
1643
- HTML
1644
- %p bâr
1645
- %p föö
1646
- HAML
1647
- end
1648
-
1649
1658
  def test_fake_ascii_encoding
1650
- assert_equal(<<HTML.force_encoding("ascii-8bit"), render(<<HAML, :encoding => "ascii-8bit"))
1659
+ assert_encoded_equal(<<HTML.force_encoding("ascii-8bit"), render(<<HAML, :encoding => "ascii-8bit"))
1651
1660
  <p>bâr</p>
1652
1661
  <p>föö</p>
1653
1662
  HTML
@@ -1701,15 +1710,23 @@ HTML
1701
1710
  HAML
1702
1711
  end
1703
1712
 
1704
- def test_different_coding_comment_than_encoding
1705
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1706
- <p>bâr</p>
1707
- <p>föö</p>
1708
- HTML
1709
- -# coding: ibm866
1710
- %p bâr
1711
- %p föö
1712
- HAML
1713
+ def test_coding_comments
1714
+ assert_valid_encoding_comment("-# coding: ibm866")
1715
+ assert_valid_encoding_comment("-# CodINg: IbM866")
1716
+ assert_valid_encoding_comment("-#coding:ibm866")
1717
+ assert_valid_encoding_comment("-# CodINg= ibm866")
1718
+ assert_valid_encoding_comment("-# foo BAR FAOJcoding: ibm866")
1719
+ assert_valid_encoding_comment("-# coding: ibm866 ASFJ (&(&#!$")
1720
+ assert_valid_encoding_comment("-# -*- coding: ibm866")
1721
+ assert_valid_encoding_comment("-# coding: ibm866 -*- coding: blah")
1722
+ assert_valid_encoding_comment("-# -*- coding: ibm866 -*-")
1723
+ assert_valid_encoding_comment("-# -*- encoding: ibm866 -*-")
1724
+ assert_valid_encoding_comment('-# -*- coding: "ibm866" -*-')
1725
+ assert_valid_encoding_comment("-#-*-coding:ibm866-*-")
1726
+ assert_valid_encoding_comment("-#-*-coding:ibm866-*-")
1727
+ assert_valid_encoding_comment("-# -*- foo: bar; coding: ibm866; baz: bang -*-")
1728
+ assert_valid_encoding_comment("-# foo bar coding: baz -*- coding: ibm866 -*-")
1729
+ assert_valid_encoding_comment("-# -*- coding: ibm866 -*- foo bar coding: baz")
1713
1730
  end
1714
1731
 
1715
1732
  def test_different_coding_than_system
@@ -1719,182 +1736,27 @@ HTML
1719
1736
  %p тАЬ
1720
1737
  HAML
1721
1738
  end
1739
+ end
1722
1740
 
1723
- def test_case_insensitive_coding_comment
1724
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1725
- <p>bâr</p>
1726
- <p>föö</p>
1727
- HTML
1728
- -# CodINg: IbM866
1729
- %p bâr
1730
- %p föö
1731
- HAML
1732
- end
1733
-
1734
- def test_whitespace_insensitive_coding_comment
1735
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1736
- <p>bâr</p>
1737
- <p>föö</p>
1738
- HTML
1739
- -#coding:ibm866
1740
- %p bâr
1741
- %p föö
1742
- HAML
1743
- end
1744
-
1745
- def test_equals_coding_comment
1746
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1747
- <p>bâr</p>
1748
- <p>föö</p>
1749
- HTML
1750
- -# CodINg= ibm866
1751
- %p bâr
1752
- %p föö
1753
- HAML
1754
- end
1755
-
1756
- def test_prefixed_coding_comment
1757
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1758
- <p>bâr</p>
1759
- <p>föö</p>
1760
- HTML
1761
- -# foo BAR FAOJcoding: ibm866
1762
- %p bâr
1763
- %p föö
1764
- HAML
1765
- end
1766
-
1767
- def test_suffixed_coding_comment
1768
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1769
- <p>bâr</p>
1770
- <p>föö</p>
1771
- HTML
1772
- -# coding: ibm866 ASFJ (&(&#!$
1773
- %p bâr
1774
- %p föö
1775
- HAML
1776
- end
1777
-
1778
- def test_emacs_prefixed_coding_comment
1779
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1780
- <p>bâr</p>
1781
- <p>föö</p>
1782
- HTML
1783
- -# -*- coding: ibm866
1784
- %p bâr
1785
- %p föö
1786
- HAML
1787
- end
1788
-
1789
- def test_emacs_suffixed_coding_comment
1790
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1791
- <p>bâr</p>
1792
- <p>föö</p>
1793
- HTML
1794
- -# coding: ibm866 -*- coding: blah
1795
- %p bâr
1796
- %p föö
1797
- HAML
1798
- end
1799
-
1800
- def test_emacs_coding_comment
1801
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1802
- <p>bâr</p>
1803
- <p>föö</p>
1804
- HTML
1805
- -# -*- coding: ibm866 -*-
1806
- %p bâr
1807
- %p föö
1808
- HAML
1809
- end
1810
-
1811
- def test_emacs_encoding_comment
1812
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1813
- <p>bâr</p>
1814
- <p>föö</p>
1815
- HTML
1816
- -# -*- encoding: ibm866 -*-
1817
- %p bâr
1818
- %p föö
1819
- HAML
1820
- end
1821
-
1822
- def test_quoted_emacs_coding_comment
1823
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1824
- <p>bâr</p>
1825
- <p>föö</p>
1826
- HTML
1827
- -# -*- coding: "ibm866" -*-
1828
- %p bâr
1829
- %p föö
1830
- HAML
1831
- end
1832
-
1833
- def test_whitespace_insensitive_emacs_coding_comment
1834
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1835
- <p>bâr</p>
1836
- <p>föö</p>
1837
- HTML
1838
- -#-*-coding:ibm866-*-
1839
- %p bâr
1840
- %p föö
1841
- HAML
1842
- end
1843
-
1844
- def test_whitespace_insensitive_emacs_coding_comment
1845
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1846
- <p>bâr</p>
1847
- <p>föö</p>
1848
- HTML
1849
- -#-*-coding:ibm866-*-
1850
- %p bâr
1851
- %p föö
1852
- HAML
1853
- end
1854
-
1855
- def test_one_of_several_emacs_comments
1856
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1857
- <p>bâr</p>
1858
- <p>föö</p>
1859
- HTML
1860
- -# -*- foo: bar; coding: ibm866; baz: bang -*-
1861
- %p bâr
1862
- %p föö
1863
- HAML
1864
- end
1865
-
1866
- def test_prefixed_emacs_coding_comment
1867
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1868
- <p>bâr</p>
1869
- <p>föö</p>
1870
- HTML
1871
- -# foo bar coding: baz -*- coding: ibm866 -*-
1872
- %p bâr
1873
- %p föö
1874
- HAML
1875
- end
1741
+ private
1876
1742
 
1877
- def test_suffixed_emacs_coding_comment
1878
- assert_renders_encoded(<<HTML.force_encoding("IBM866"), <<HAML)
1879
- <p>bâr</p>
1880
- <p>föö</p>
1743
+ def assert_valid_encoding_comment(comment)
1744
+ assert_renders_encoded(<<HTML.encode("IBM866"), <<HAML.encode("IBM866").force_encoding("UTF-8"))
1745
+ <p>ЖЛЫ</p>
1746
+ <p>тАЬ</p>
1881
1747
  HTML
1882
- -# -*- coding: ibm866 -*- foo bar coding: baz
1883
- %p bâr
1884
- %p föö
1748
+ #{comment}
1749
+ %p ЖЛЫ
1750
+ %p тАЬ
1885
1751
  HAML
1886
- end
1887
-
1888
1752
  end
1889
1753
 
1890
- private
1891
-
1892
1754
  def assert_converts_template_properly
1893
- engine = Haml::Engine.new(<<HAML.encode("iso-8859-1"), :encoding => "utf-8")
1755
+ engine = Haml::Engine.new(<<HAML.encode("iso-8859-1"), :encoding => "macRoman")
1894
1756
  %p bâr
1895
1757
  %p föö
1896
1758
  HAML
1897
- assert_equal(<<HTML, yield(engine))
1759
+ assert_encoded_equal(<<HTML.encode("macRoman"), yield(engine))
1898
1760
  <p>bâr</p>
1899
1761
  <p>föö</p>
1900
1762
  HTML
@@ -1902,7 +1764,11 @@ HTML
1902
1764
 
1903
1765
  def assert_renders_encoded(html, haml)
1904
1766
  result = render(haml)
1905
- assert_equal html.encoding, result.encoding
1906
- assert_equal html, result
1767
+ assert_encoded_equal html, result
1768
+ end
1769
+
1770
+ def assert_encoded_equal(expected, actual)
1771
+ assert_equal expected.encoding, actual.encoding
1772
+ assert_equal expected, actual
1907
1773
  end
1908
1774
  end