sass 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING +1 -1
  3. data/MIT-LICENSE +2 -2
  4. data/README.md +29 -17
  5. data/Rakefile +43 -9
  6. data/VERSION +1 -1
  7. data/VERSION_DATE +1 -0
  8. data/VERSION_NAME +1 -1
  9. data/bin/sass +6 -1
  10. data/bin/sass-convert +6 -1
  11. data/bin/scss +6 -1
  12. data/ext/mkrf_conf.rb +27 -0
  13. data/lib/sass/cache_stores/base.rb +7 -3
  14. data/lib/sass/cache_stores/chain.rb +3 -2
  15. data/lib/sass/cache_stores/filesystem.rb +5 -7
  16. data/lib/sass/cache_stores/memory.rb +1 -1
  17. data/lib/sass/cache_stores/null.rb +2 -2
  18. data/lib/sass/callbacks.rb +2 -1
  19. data/lib/sass/css.rb +168 -53
  20. data/lib/sass/engine.rb +502 -174
  21. data/lib/sass/environment.rb +151 -111
  22. data/lib/sass/error.rb +7 -7
  23. data/lib/sass/exec.rb +176 -60
  24. data/lib/sass/features.rb +40 -0
  25. data/lib/sass/importers/base.rb +46 -7
  26. data/lib/sass/importers/deprecated_path.rb +51 -0
  27. data/lib/sass/importers/filesystem.rb +113 -30
  28. data/lib/sass/importers.rb +1 -0
  29. data/lib/sass/logger/base.rb +30 -0
  30. data/lib/sass/logger/log_level.rb +45 -0
  31. data/lib/sass/logger.rb +12 -0
  32. data/lib/sass/media.rb +213 -0
  33. data/lib/sass/plugin/compiler.rb +194 -104
  34. data/lib/sass/plugin/configuration.rb +18 -25
  35. data/lib/sass/plugin/merb.rb +1 -1
  36. data/lib/sass/plugin/staleness_checker.rb +37 -11
  37. data/lib/sass/plugin.rb +10 -13
  38. data/lib/sass/railtie.rb +2 -1
  39. data/lib/sass/repl.rb +5 -6
  40. data/lib/sass/script/css_lexer.rb +8 -4
  41. data/lib/sass/script/css_parser.rb +5 -2
  42. data/lib/sass/script/functions.rb +1547 -618
  43. data/lib/sass/script/lexer.rb +122 -72
  44. data/lib/sass/script/parser.rb +304 -135
  45. data/lib/sass/script/tree/funcall.rb +306 -0
  46. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +43 -13
  47. data/lib/sass/script/tree/list_literal.rb +77 -0
  48. data/lib/sass/script/tree/literal.rb +45 -0
  49. data/lib/sass/script/tree/map_literal.rb +64 -0
  50. data/lib/sass/script/{node.rb → tree/node.rb} +30 -12
  51. data/lib/sass/script/{operation.rb → tree/operation.rb} +33 -21
  52. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +14 -4
  53. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +21 -9
  54. data/lib/sass/script/tree/variable.rb +57 -0
  55. data/lib/sass/script/tree.rb +15 -0
  56. data/lib/sass/script/value/arg_list.rb +36 -0
  57. data/lib/sass/script/value/base.rb +238 -0
  58. data/lib/sass/script/value/bool.rb +40 -0
  59. data/lib/sass/script/{color.rb → value/color.rb} +256 -74
  60. data/lib/sass/script/value/deprecated_false.rb +55 -0
  61. data/lib/sass/script/value/helpers.rb +155 -0
  62. data/lib/sass/script/value/list.rb +128 -0
  63. data/lib/sass/script/value/map.rb +70 -0
  64. data/lib/sass/script/value/null.rb +49 -0
  65. data/lib/sass/script/{number.rb → value/number.rb} +115 -62
  66. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  67. data/lib/sass/script/value.rb +12 -0
  68. data/lib/sass/script.rb +35 -9
  69. data/lib/sass/scss/css_parser.rb +2 -12
  70. data/lib/sass/scss/parser.rb +657 -230
  71. data/lib/sass/scss/rx.rb +17 -12
  72. data/lib/sass/scss/static_parser.rb +37 -6
  73. data/lib/sass/scss.rb +0 -1
  74. data/lib/sass/selector/abstract_sequence.rb +35 -3
  75. data/lib/sass/selector/comma_sequence.rb +29 -14
  76. data/lib/sass/selector/sequence.rb +371 -74
  77. data/lib/sass/selector/simple.rb +28 -13
  78. data/lib/sass/selector/simple_sequence.rb +163 -36
  79. data/lib/sass/selector.rb +138 -36
  80. data/lib/sass/shared.rb +3 -5
  81. data/lib/sass/source/map.rb +196 -0
  82. data/lib/sass/source/position.rb +39 -0
  83. data/lib/sass/source/range.rb +41 -0
  84. data/lib/sass/stack.rb +126 -0
  85. data/lib/sass/supports.rb +228 -0
  86. data/lib/sass/tree/at_root_node.rb +82 -0
  87. data/lib/sass/tree/comment_node.rb +34 -29
  88. data/lib/sass/tree/content_node.rb +9 -0
  89. data/lib/sass/tree/css_import_node.rb +60 -0
  90. data/lib/sass/tree/debug_node.rb +3 -3
  91. data/lib/sass/tree/directive_node.rb +33 -3
  92. data/lib/sass/tree/each_node.rb +9 -9
  93. data/lib/sass/tree/extend_node.rb +20 -6
  94. data/lib/sass/tree/for_node.rb +6 -6
  95. data/lib/sass/tree/function_node.rb +12 -4
  96. data/lib/sass/tree/if_node.rb +2 -15
  97. data/lib/sass/tree/import_node.rb +11 -5
  98. data/lib/sass/tree/media_node.rb +27 -11
  99. data/lib/sass/tree/mixin_def_node.rb +15 -4
  100. data/lib/sass/tree/mixin_node.rb +27 -7
  101. data/lib/sass/tree/node.rb +69 -35
  102. data/lib/sass/tree/prop_node.rb +47 -31
  103. data/lib/sass/tree/return_node.rb +4 -3
  104. data/lib/sass/tree/root_node.rb +20 -4
  105. data/lib/sass/tree/rule_node.rb +37 -26
  106. data/lib/sass/tree/supports_node.rb +38 -0
  107. data/lib/sass/tree/trace_node.rb +33 -0
  108. data/lib/sass/tree/variable_node.rb +10 -4
  109. data/lib/sass/tree/visitors/base.rb +5 -8
  110. data/lib/sass/tree/visitors/check_nesting.rb +67 -52
  111. data/lib/sass/tree/visitors/convert.rb +134 -53
  112. data/lib/sass/tree/visitors/cssize.rb +245 -51
  113. data/lib/sass/tree/visitors/deep_copy.rb +102 -0
  114. data/lib/sass/tree/visitors/extend.rb +68 -0
  115. data/lib/sass/tree/visitors/perform.rb +331 -105
  116. data/lib/sass/tree/visitors/set_options.rb +125 -0
  117. data/lib/sass/tree/visitors/to_css.rb +259 -95
  118. data/lib/sass/tree/warn_node.rb +3 -3
  119. data/lib/sass/tree/while_node.rb +3 -3
  120. data/lib/sass/util/cross_platform_random.rb +19 -0
  121. data/lib/sass/util/multibyte_string_scanner.rb +157 -0
  122. data/lib/sass/util/normalized_map.rb +130 -0
  123. data/lib/sass/util/ordered_hash.rb +192 -0
  124. data/lib/sass/util/subset_map.rb +11 -2
  125. data/lib/sass/util/test.rb +9 -0
  126. data/lib/sass/util.rb +565 -39
  127. data/lib/sass/version.rb +27 -15
  128. data/lib/sass.rb +39 -4
  129. data/test/sass/cache_test.rb +15 -0
  130. data/test/sass/compiler_test.rb +223 -0
  131. data/test/sass/conversion_test.rb +901 -107
  132. data/test/sass/css2sass_test.rb +94 -0
  133. data/test/sass/engine_test.rb +1059 -164
  134. data/test/sass/exec_test.rb +86 -0
  135. data/test/sass/extend_test.rb +933 -837
  136. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  137. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  138. data/test/sass/functions_test.rb +995 -136
  139. data/test/sass/importer_test.rb +338 -18
  140. data/test/sass/logger_test.rb +58 -0
  141. data/test/sass/more_results/more_import.css +2 -2
  142. data/test/sass/plugin_test.rb +114 -30
  143. data/test/sass/results/cached_import_option.css +3 -0
  144. data/test/sass/results/filename_fn.css +3 -0
  145. data/test/sass/results/import.css +2 -2
  146. data/test/sass/results/import_charset.css +1 -0
  147. data/test/sass/results/import_charset_1_8.css +1 -0
  148. data/test/sass/results/import_charset_ibm866.css +1 -0
  149. data/test/sass/results/import_content.css +1 -0
  150. data/test/sass/results/script.css +1 -1
  151. data/test/sass/results/scss_import.css +2 -2
  152. data/test/sass/results/units.css +2 -2
  153. data/test/sass/script_conversion_test.rb +43 -1
  154. data/test/sass/script_test.rb +380 -36
  155. data/test/sass/scss/css_test.rb +257 -75
  156. data/test/sass/scss/scss_test.rb +2322 -110
  157. data/test/sass/source_map_test.rb +887 -0
  158. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  159. data/test/sass/templates/_double_import_loop2.sass +1 -0
  160. data/test/sass/templates/_filename_fn_import.scss +11 -0
  161. data/test/sass/templates/_imported_content.sass +3 -0
  162. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  163. data/test/sass/templates/bork5.sass +3 -0
  164. data/test/sass/templates/cached_import_option.scss +3 -0
  165. data/test/sass/templates/double_import_loop1.sass +1 -0
  166. data/test/sass/templates/filename_fn.scss +18 -0
  167. data/test/sass/templates/import_charset.sass +2 -0
  168. data/test/sass/templates/import_charset_1_8.sass +2 -0
  169. data/test/sass/templates/import_charset_ibm866.sass +2 -0
  170. data/test/sass/templates/import_content.sass +4 -0
  171. data/test/sass/templates/same_name_different_ext.sass +2 -0
  172. data/test/sass/templates/same_name_different_ext.scss +1 -0
  173. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  174. data/test/sass/templates/single_import_loop.sass +1 -0
  175. data/test/sass/templates/subdir/import_up1.scss +1 -0
  176. data/test/sass/templates/subdir/import_up2.scss +1 -0
  177. data/test/sass/test_helper.rb +1 -1
  178. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  179. data/test/sass/util/normalized_map_test.rb +51 -0
  180. data/test/sass/util_test.rb +183 -0
  181. data/test/sass/value_helpers_test.rb +181 -0
  182. data/test/test_helper.rb +45 -5
  183. data/vendor/listen/CHANGELOG.md +228 -0
  184. data/vendor/listen/CONTRIBUTING.md +38 -0
  185. data/vendor/listen/Gemfile +30 -0
  186. data/vendor/listen/Guardfile +8 -0
  187. data/vendor/{fssm → listen}/LICENSE +1 -1
  188. data/vendor/listen/README.md +315 -0
  189. data/vendor/listen/Rakefile +47 -0
  190. data/vendor/listen/Vagrantfile +96 -0
  191. data/vendor/listen/lib/listen/adapter.rb +214 -0
  192. data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
  193. data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
  194. data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
  195. data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
  196. data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
  197. data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
  198. data/vendor/listen/lib/listen/directory_record.rb +371 -0
  199. data/vendor/listen/lib/listen/listener.rb +225 -0
  200. data/vendor/listen/lib/listen/multi_listener.rb +143 -0
  201. data/vendor/listen/lib/listen/turnstile.rb +28 -0
  202. data/vendor/listen/lib/listen/version.rb +3 -0
  203. data/vendor/listen/lib/listen.rb +40 -0
  204. data/vendor/listen/listen.gemspec +22 -0
  205. data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
  206. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  207. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
  208. data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
  209. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  210. data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
  211. data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
  212. data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
  213. data/vendor/listen/spec/listen/listener_spec.rb +169 -0
  214. data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
  215. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  216. data/vendor/listen/spec/listen_spec.rb +73 -0
  217. data/vendor/listen/spec/spec_helper.rb +21 -0
  218. data/vendor/listen/spec/support/adapter_helper.rb +629 -0
  219. data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
  220. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  221. data/vendor/listen/spec/support/listeners_helper.rb +156 -0
  222. data/vendor/listen/spec/support/platform_helper.rb +15 -0
  223. metadata +344 -271
  224. data/lib/sass/less.rb +0 -382
  225. data/lib/sass/script/bool.rb +0 -18
  226. data/lib/sass/script/funcall.rb +0 -162
  227. data/lib/sass/script/list.rb +0 -76
  228. data/lib/sass/script/literal.rb +0 -245
  229. data/lib/sass/script/variable.rb +0 -54
  230. data/lib/sass/scss/sass_parser.rb +0 -11
  231. data/test/sass/less_conversion_test.rb +0 -653
  232. data/vendor/fssm/README.markdown +0 -55
  233. data/vendor/fssm/Rakefile +0 -59
  234. data/vendor/fssm/VERSION.yml +0 -5
  235. data/vendor/fssm/example.rb +0 -9
  236. data/vendor/fssm/fssm.gemspec +0 -77
  237. data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
  238. data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
  239. data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
  240. data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
  241. data/vendor/fssm/lib/fssm/monitor.rb +0 -26
  242. data/vendor/fssm/lib/fssm/path.rb +0 -91
  243. data/vendor/fssm/lib/fssm/pathname.rb +0 -502
  244. data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
  245. data/vendor/fssm/lib/fssm/state/file.rb +0 -24
  246. data/vendor/fssm/lib/fssm/support.rb +0 -63
  247. data/vendor/fssm/lib/fssm/tree.rb +0 -176
  248. data/vendor/fssm/lib/fssm.rb +0 -33
  249. data/vendor/fssm/profile/prof-cache.rb +0 -40
  250. data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
  251. data/vendor/fssm/profile/prof-pathname.rb +0 -68
  252. data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
  253. data/vendor/fssm/profile/prof.html +0 -2379
  254. data/vendor/fssm/spec/path_spec.rb +0 -75
  255. data/vendor/fssm/spec/root/duck/quack.txt +0 -0
  256. data/vendor/fssm/spec/root/file.css +0 -0
  257. data/vendor/fssm/spec/root/file.rb +0 -0
  258. data/vendor/fssm/spec/root/file.yml +0 -0
  259. data/vendor/fssm/spec/root/moo/cow.txt +0 -0
  260. data/vendor/fssm/spec/spec_helper.rb +0 -14
@@ -1,114 +1,20 @@
1
1
  require 'set'
2
2
 
3
3
  module Sass
4
- # The lexical environment for SassScript.
5
- # This keeps track of variable, mixin, and function definitions.
6
- #
7
- # A new environment is created for each level of Sass nesting.
8
- # This allows variables to be lexically scoped.
9
- # The new environment refers to the environment in the upper scope,
10
- # so it has access to variables defined in enclosing scopes,
11
- # but new variables are defined locally.
12
- #
13
- # Environment also keeps track of the {Engine} options
14
- # so that they can be made available to {Sass::Script::Functions}.
15
- class Environment
16
- # The enclosing environment,
17
- # or nil if this is the global environment.
18
- #
19
- # @return [Environment]
20
- attr_reader :parent
21
- attr_writer :options
22
-
23
- # @param parent [Environment] See \{#parent}
24
- def initialize(parent = nil)
25
- @parent = parent
26
- unless parent
27
- @stack = []
28
- @mixins_in_use = Set.new
29
- set_var("important", Script::String.new("!important"))
30
- end
31
- end
32
-
33
- # The options hash.
34
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
35
- #
36
- # @return [{Symbol => Object}]
37
- def options
38
- @options || parent_options || {}
39
- end
40
-
41
- # Push a new stack frame onto the mixin/include stack.
42
- #
43
- # @param frame_info [{Symbol => Object}]
44
- # Frame information has the following keys:
45
- #
46
- # `:filename`
47
- # : The name of the file in which the lexical scope changed.
48
- #
49
- # `:mixin`
50
- # : The name of the mixin in which the lexical scope changed,
51
- # or `nil` if it wasn't within in a mixin.
52
- #
53
- # `:line`
54
- # : The line of the file on which the lexical scope changed. Never nil.
55
- def push_frame(frame_info)
56
- top_of_stack = stack.last
57
- if top_of_stack && top_of_stack.delete(:prepared)
58
- top_of_stack.merge!(frame_info)
59
- else
60
- stack.push(top_of_stack = frame_info)
61
- end
62
- mixins_in_use << top_of_stack[:mixin] if top_of_stack[:mixin] && !top_of_stack[:prepared]
63
- end
64
-
65
- # Like \{#push\_frame}, but next time a stack frame is pushed,
66
- # it will be merged with this frame.
67
- #
68
- # @param frame_info [{Symbol => Object}] Same as for \{#push\_frame}.
69
- def prepare_frame(frame_info)
70
- push_frame(frame_info.merge(:prepared => true))
71
- end
72
-
73
- # Pop a stack frame from the mixin/include stack.
74
- def pop_frame
75
- stack.pop if stack.last && stack.last[:prepared]
76
- popped = stack.pop
77
- mixins_in_use.delete(popped[:mixin]) if popped && popped[:mixin]
78
- end
79
-
80
- # A list of stack frames in the mixin/include stack.
81
- # The last element in the list is the most deeply-nested frame.
82
- #
83
- # @return [Array<{Symbol => Object}>] The stack frames,
84
- # of the form passed to \{#push\_frame}.
85
- def stack
86
- @stack ||= @parent.stack
87
- end
88
-
89
- # A set of names of mixins currently present in the stack.
90
- #
91
- # @return [Set<String>] The mixin names.
92
- def mixins_in_use
93
- @mixins_in_use ||= @parent.mixins_in_use
94
- end
95
-
96
- private
97
-
98
- def parent_options
99
- @parent_options ||= @parent && @parent.options
100
- end
101
-
4
+ # The abstract base class for lexical environments for SassScript.
5
+ class BaseEnvironment
102
6
  class << self
103
- private
104
- UNDERSCORE, DASH = '_', '-'
105
-
106
7
  # Note: when updating this,
107
8
  # update sass/yard/inherited_hash.rb as well.
108
- def inherited_hash(name)
109
- class_eval <<RUBY, __FILE__, __LINE__ + 1
9
+ def inherited_hash_accessor(name)
10
+ inherited_hash_reader(name)
11
+ inherited_hash_writer(name)
12
+ end
13
+
14
+ def inherited_hash_reader(name)
15
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
110
16
  def #{name}(name)
111
- _#{name}(name.tr(UNDERSCORE, DASH))
17
+ _#{name}(name.tr('_', '-'))
112
18
  end
113
19
 
114
20
  def _#{name}(name)
@@ -116,8 +22,17 @@ module Sass
116
22
  end
117
23
  protected :_#{name}
118
24
 
25
+ def is_#{name}_global?(name)
26
+ return !@parent if @#{name}s && @#{name}s.has_key?(name)
27
+ @parent && @parent.is_#{name}_global?(name)
28
+ end
29
+ RUBY
30
+ end
31
+
32
+ def inherited_hash_writer(name)
33
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
119
34
  def set_#{name}(name, value)
120
- name = name.tr(UNDERSCORE, DASH)
35
+ name = name.tr('_', '-')
121
36
  @#{name}s[name] = value unless try_set_#{name}(name, value)
122
37
  end
123
38
 
@@ -136,20 +51,145 @@ module Sass
136
51
 
137
52
  def set_local_#{name}(name, value)
138
53
  @#{name}s ||= {}
139
- @#{name}s[name.tr(UNDERSCORE, DASH)] = value
54
+ @#{name}s[name.tr('_', '-')] = value
140
55
  end
141
- RUBY
56
+ RUBY
142
57
  end
143
58
  end
144
59
 
60
+ # The options passed to the Sass Engine.
61
+ attr_reader :options
62
+
63
+ attr_writer :caller
64
+ attr_writer :content
65
+ attr_writer :selector
66
+
67
+ # variable
68
+ # Script::Value
69
+ inherited_hash_reader :var
70
+
71
+ # mixin
72
+ # Sass::Callable
73
+ inherited_hash_reader :mixin
74
+
75
+ # function
76
+ # Sass::Callable
77
+ inherited_hash_reader :function
78
+
79
+ # Whether a warning has been emitted for assigning to the given
80
+ # global variable. This is a set of tuples containing the name of
81
+ # the variable, its filename, and its line number.
82
+ #
83
+ # @return [Set<[String, String, int]>]
84
+ attr_reader :global_warning_given
85
+
86
+ # Whether a warning has been emitted for misusing a deprecated false value.
87
+ # This is a set of tuples containing the filename and its line number.
88
+ #
89
+ # @return [Set<[String, int]>]
90
+ attr_reader :deprecated_false_warning_given
91
+
92
+ # @param options [{Symbol => Object}] The options hash. See
93
+ # {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
94
+ # @param parent [Environment] See \{#parent}
95
+ def initialize(parent = nil, options = nil)
96
+ @parent = parent
97
+ @options = options || (parent && parent.options) || {}
98
+ @stack = Sass::Stack.new if @parent.nil?
99
+ @global_warning_given = Set.new
100
+ @deprecated_false_warning_given = Set.new
101
+ end
102
+
103
+ # The environment of the caller of this environment's mixin or function.
104
+ # @return {Environment?}
105
+ def caller
106
+ @caller || (@parent && @parent.caller)
107
+ end
108
+
109
+ # The content passed to this environment. This is naturally only set
110
+ # for mixin body environments with content passed in.
111
+ #
112
+ # @return {[Array<Sass::Tree::Node>, Environment]?} The content nodes and
113
+ # the lexical environment of the content block.
114
+ def content
115
+ @content || (@parent && @parent.content)
116
+ end
117
+
118
+ # The selector for the current CSS rule, or nil if there is no
119
+ # current CSS rule.
120
+ #
121
+ # @return [Selector::CommaSequence?] The current selector, with any
122
+ # nesting fully resolved.
123
+ def selector
124
+ @selector || (@caller && @caller.selector) || (@parent && @parent.selector)
125
+ end
126
+
127
+ # The top-level Environment object.
128
+ #
129
+ # @return [Environment]
130
+ def global_env
131
+ @global_env ||= @parent.nil? ? self : @parent.global_env
132
+ end
133
+
134
+ # The import/mixin stack.
135
+ #
136
+ # @return [Sass::Stack]
137
+ def stack
138
+ @stack || global_env.stack
139
+ end
140
+ end
141
+
142
+ # The lexical environment for SassScript.
143
+ # This keeps track of variable, mixin, and function definitions.
144
+ #
145
+ # A new environment is created for each level of Sass nesting.
146
+ # This allows variables to be lexically scoped.
147
+ # The new environment refers to the environment in the upper scope,
148
+ # so it has access to variables defined in enclosing scopes,
149
+ # but new variables are defined locally.
150
+ #
151
+ # Environment also keeps track of the {Engine} options
152
+ # so that they can be made available to {Sass::Script::Functions}.
153
+ class Environment < BaseEnvironment
154
+ # The enclosing environment,
155
+ # or nil if this is the global environment.
156
+ #
157
+ # @return [Environment]
158
+ attr_reader :parent
159
+
145
160
  # variable
146
- # Script::Literal
147
- inherited_hash :var
161
+ # Script::Value
162
+ inherited_hash_writer :var
163
+
148
164
  # mixin
149
165
  # Sass::Callable
150
- inherited_hash :mixin
166
+ inherited_hash_writer :mixin
167
+
151
168
  # function
152
169
  # Sass::Callable
153
- inherited_hash :function
170
+ inherited_hash_writer :function
171
+ end
172
+
173
+ # A read-only wrapper for a lexical environment for SassScript.
174
+ class ReadOnlyEnvironment < BaseEnvironment
175
+ # The read-only environment of the caller of this environment's mixin or function.
176
+ #
177
+ # @see BaseEnvironment#caller
178
+ # @return {ReadOnlyEnvironment}
179
+ def caller
180
+ return @caller if @caller
181
+ env = super
182
+ @caller ||= env.is_a?(ReadOnlyEnvironment) ? env : ReadOnlyEnvironment.new(env, env.options)
183
+ end
184
+
185
+ # The read-only content passed to this environment.
186
+ #
187
+ # @see BaseEnvironment#content
188
+ # @return {ReadOnlyEnvironment}
189
+ def content
190
+ return @content if @content
191
+ env = super
192
+ @content ||= env.is_a?(ReadOnlyEnvironment) ? env : ReadOnlyEnvironment.new(env, env.options)
193
+ end
154
194
  end
155
195
  end
data/lib/sass/error.rb CHANGED
@@ -138,15 +138,15 @@ module Sass
138
138
  # @see #sass_backtrace
139
139
  # @return [String]
140
140
  def sass_backtrace_str(default_filename = "an unknown file")
141
- lines = self.message.split("\n")
141
+ lines = message.split("\n")
142
142
  msg = lines[0] + lines[1..-1].
143
143
  map {|l| "\n" + (" " * "Syntax error: ".size) + l}.join
144
144
  "Syntax error: #{msg}" +
145
145
  Sass::Util.enum_with_index(sass_backtrace).map do |entry, i|
146
- "\n #{i == 0 ? "on" : "from"} line #{entry[:line]}" +
147
- " of #{entry[:filename] || default_filename}" +
148
- (entry[:mixin] ? ", in `#{entry[:mixin]}'" : "")
149
- end.join
146
+ "\n #{i == 0 ? "on" : "from"} line #{entry[:line]}" +
147
+ " of #{entry[:filename] || default_filename}" +
148
+ (entry[:mixin] ? ", in `#{entry[:mixin]}'" : "")
149
+ end.join
150
150
  end
151
151
 
152
152
  class << self
@@ -165,9 +165,9 @@ module Sass
165
165
 
166
166
  <<END
167
167
  /*
168
- #{header}
168
+ #{header.gsub("*/", "*\\/")}
169
169
 
170
- Backtrace:\n#{e.backtrace.join("\n")}
170
+ Backtrace:\n#{e.backtrace.join("\n").gsub("*/", "*\\/")}
171
171
  */
172
172
  body:before {
173
173
  white-space: pre;