xass 0.1.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 (242) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +11 -0
  3. data/CONTRIBUTING +3 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +201 -0
  6. data/Rakefile +349 -0
  7. data/VERSION +1 -0
  8. data/VERSION_NAME +1 -0
  9. data/bin/push +13 -0
  10. data/bin/sass +13 -0
  11. data/bin/sass-convert +12 -0
  12. data/bin/scss +13 -0
  13. data/extra/update_watch.rb +13 -0
  14. data/init.rb +18 -0
  15. data/lib/sass/cache_stores/base.rb +88 -0
  16. data/lib/sass/cache_stores/chain.rb +33 -0
  17. data/lib/sass/cache_stores/filesystem.rb +64 -0
  18. data/lib/sass/cache_stores/memory.rb +47 -0
  19. data/lib/sass/cache_stores/null.rb +25 -0
  20. data/lib/sass/cache_stores.rb +15 -0
  21. data/lib/sass/callbacks.rb +66 -0
  22. data/lib/sass/css.rb +409 -0
  23. data/lib/sass/engine.rb +930 -0
  24. data/lib/sass/environment.rb +101 -0
  25. data/lib/sass/error.rb +201 -0
  26. data/lib/sass/exec.rb +707 -0
  27. data/lib/sass/importers/base.rb +139 -0
  28. data/lib/sass/importers/filesystem.rb +186 -0
  29. data/lib/sass/importers.rb +22 -0
  30. data/lib/sass/logger/base.rb +32 -0
  31. data/lib/sass/logger/log_level.rb +49 -0
  32. data/lib/sass/logger.rb +15 -0
  33. data/lib/sass/media.rb +213 -0
  34. data/lib/sass/plugin/compiler.rb +406 -0
  35. data/lib/sass/plugin/configuration.rb +123 -0
  36. data/lib/sass/plugin/generic.rb +15 -0
  37. data/lib/sass/plugin/merb.rb +48 -0
  38. data/lib/sass/plugin/rack.rb +60 -0
  39. data/lib/sass/plugin/rails.rb +47 -0
  40. data/lib/sass/plugin/staleness_checker.rb +199 -0
  41. data/lib/sass/plugin.rb +133 -0
  42. data/lib/sass/railtie.rb +10 -0
  43. data/lib/sass/repl.rb +57 -0
  44. data/lib/sass/root.rb +7 -0
  45. data/lib/sass/script/arg_list.rb +52 -0
  46. data/lib/sass/script/bool.rb +18 -0
  47. data/lib/sass/script/color.rb +606 -0
  48. data/lib/sass/script/css_lexer.rb +29 -0
  49. data/lib/sass/script/css_parser.rb +31 -0
  50. data/lib/sass/script/funcall.rb +245 -0
  51. data/lib/sass/script/functions.rb +1543 -0
  52. data/lib/sass/script/interpolation.rb +79 -0
  53. data/lib/sass/script/lexer.rb +345 -0
  54. data/lib/sass/script/list.rb +85 -0
  55. data/lib/sass/script/literal.rb +221 -0
  56. data/lib/sass/script/node.rb +99 -0
  57. data/lib/sass/script/null.rb +37 -0
  58. data/lib/sass/script/number.rb +453 -0
  59. data/lib/sass/script/operation.rb +110 -0
  60. data/lib/sass/script/parser.rb +502 -0
  61. data/lib/sass/script/string.rb +51 -0
  62. data/lib/sass/script/string_interpolation.rb +103 -0
  63. data/lib/sass/script/unary_operation.rb +69 -0
  64. data/lib/sass/script/variable.rb +58 -0
  65. data/lib/sass/script.rb +39 -0
  66. data/lib/sass/scss/css_parser.rb +36 -0
  67. data/lib/sass/scss/parser.rb +1180 -0
  68. data/lib/sass/scss/rx.rb +133 -0
  69. data/lib/sass/scss/script_lexer.rb +15 -0
  70. data/lib/sass/scss/script_parser.rb +25 -0
  71. data/lib/sass/scss/static_parser.rb +54 -0
  72. data/lib/sass/scss.rb +16 -0
  73. data/lib/sass/selector/abstract_sequence.rb +94 -0
  74. data/lib/sass/selector/comma_sequence.rb +92 -0
  75. data/lib/sass/selector/sequence.rb +507 -0
  76. data/lib/sass/selector/simple.rb +119 -0
  77. data/lib/sass/selector/simple_sequence.rb +215 -0
  78. data/lib/sass/selector.rb +452 -0
  79. data/lib/sass/shared.rb +76 -0
  80. data/lib/sass/supports.rb +229 -0
  81. data/lib/sass/tree/charset_node.rb +22 -0
  82. data/lib/sass/tree/comment_node.rb +82 -0
  83. data/lib/sass/tree/content_node.rb +9 -0
  84. data/lib/sass/tree/css_import_node.rb +60 -0
  85. data/lib/sass/tree/debug_node.rb +18 -0
  86. data/lib/sass/tree/directive_node.rb +42 -0
  87. data/lib/sass/tree/each_node.rb +24 -0
  88. data/lib/sass/tree/extend_node.rb +36 -0
  89. data/lib/sass/tree/for_node.rb +36 -0
  90. data/lib/sass/tree/function_node.rb +34 -0
  91. data/lib/sass/tree/if_node.rb +52 -0
  92. data/lib/sass/tree/import_node.rb +75 -0
  93. data/lib/sass/tree/media_node.rb +58 -0
  94. data/lib/sass/tree/mixin_def_node.rb +38 -0
  95. data/lib/sass/tree/mixin_node.rb +39 -0
  96. data/lib/sass/tree/node.rb +196 -0
  97. data/lib/sass/tree/prop_node.rb +152 -0
  98. data/lib/sass/tree/return_node.rb +18 -0
  99. data/lib/sass/tree/root_node.rb +78 -0
  100. data/lib/sass/tree/rule_node.rb +132 -0
  101. data/lib/sass/tree/supports_node.rb +51 -0
  102. data/lib/sass/tree/trace_node.rb +32 -0
  103. data/lib/sass/tree/variable_node.rb +30 -0
  104. data/lib/sass/tree/visitors/base.rb +75 -0
  105. data/lib/sass/tree/visitors/check_nesting.rb +147 -0
  106. data/lib/sass/tree/visitors/convert.rb +316 -0
  107. data/lib/sass/tree/visitors/cssize.rb +241 -0
  108. data/lib/sass/tree/visitors/deep_copy.rb +102 -0
  109. data/lib/sass/tree/visitors/extend.rb +68 -0
  110. data/lib/sass/tree/visitors/perform.rb +446 -0
  111. data/lib/sass/tree/visitors/set_options.rb +125 -0
  112. data/lib/sass/tree/visitors/to_css.rb +228 -0
  113. data/lib/sass/tree/warn_node.rb +18 -0
  114. data/lib/sass/tree/while_node.rb +18 -0
  115. data/lib/sass/util/multibyte_string_scanner.rb +155 -0
  116. data/lib/sass/util/subset_map.rb +109 -0
  117. data/lib/sass/util/test.rb +10 -0
  118. data/lib/sass/util.rb +948 -0
  119. data/lib/sass/version.rb +126 -0
  120. data/lib/sass.rb +95 -0
  121. data/rails/init.rb +1 -0
  122. data/test/Gemfile +3 -0
  123. data/test/Gemfile.lock +10 -0
  124. data/test/sass/cache_test.rb +89 -0
  125. data/test/sass/callbacks_test.rb +61 -0
  126. data/test/sass/conversion_test.rb +1760 -0
  127. data/test/sass/css2sass_test.rb +458 -0
  128. data/test/sass/data/hsl-rgb.txt +319 -0
  129. data/test/sass/engine_test.rb +3244 -0
  130. data/test/sass/exec_test.rb +86 -0
  131. data/test/sass/extend_test.rb +1482 -0
  132. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  133. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  134. data/test/sass/functions_test.rb +1139 -0
  135. data/test/sass/importer_test.rb +192 -0
  136. data/test/sass/logger_test.rb +58 -0
  137. data/test/sass/mock_importer.rb +49 -0
  138. data/test/sass/more_results/more1.css +9 -0
  139. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  140. data/test/sass/more_results/more_import.css +29 -0
  141. data/test/sass/more_templates/_more_partial.sass +2 -0
  142. data/test/sass/more_templates/more1.sass +23 -0
  143. data/test/sass/more_templates/more_import.sass +11 -0
  144. data/test/sass/plugin_test.rb +564 -0
  145. data/test/sass/results/alt.css +4 -0
  146. data/test/sass/results/basic.css +9 -0
  147. data/test/sass/results/cached_import_option.css +3 -0
  148. data/test/sass/results/compact.css +5 -0
  149. data/test/sass/results/complex.css +86 -0
  150. data/test/sass/results/compressed.css +1 -0
  151. data/test/sass/results/expanded.css +19 -0
  152. data/test/sass/results/filename_fn.css +3 -0
  153. data/test/sass/results/if.css +3 -0
  154. data/test/sass/results/import.css +31 -0
  155. data/test/sass/results/import_charset.css +5 -0
  156. data/test/sass/results/import_charset_1_8.css +5 -0
  157. data/test/sass/results/import_charset_ibm866.css +5 -0
  158. data/test/sass/results/import_content.css +1 -0
  159. data/test/sass/results/line_numbers.css +49 -0
  160. data/test/sass/results/mixins.css +95 -0
  161. data/test/sass/results/multiline.css +24 -0
  162. data/test/sass/results/nested.css +22 -0
  163. data/test/sass/results/options.css +1 -0
  164. data/test/sass/results/parent_ref.css +13 -0
  165. data/test/sass/results/script.css +16 -0
  166. data/test/sass/results/scss_import.css +31 -0
  167. data/test/sass/results/scss_importee.css +2 -0
  168. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  169. data/test/sass/results/subdir/subdir.css +3 -0
  170. data/test/sass/results/units.css +11 -0
  171. data/test/sass/results/warn.css +0 -0
  172. data/test/sass/results/warn_imported.css +0 -0
  173. data/test/sass/script_conversion_test.rb +299 -0
  174. data/test/sass/script_test.rb +622 -0
  175. data/test/sass/scss/css_test.rb +1100 -0
  176. data/test/sass/scss/rx_test.rb +156 -0
  177. data/test/sass/scss/scss_test.rb +2106 -0
  178. data/test/sass/scss/test_helper.rb +37 -0
  179. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  180. data/test/sass/templates/_double_import_loop2.sass +1 -0
  181. data/test/sass/templates/_filename_fn_import.scss +11 -0
  182. data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  183. data/test/sass/templates/_imported_charset_utf8.sass +4 -0
  184. data/test/sass/templates/_imported_content.sass +3 -0
  185. data/test/sass/templates/_partial.sass +2 -0
  186. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  187. data/test/sass/templates/alt.sass +16 -0
  188. data/test/sass/templates/basic.sass +23 -0
  189. data/test/sass/templates/bork1.sass +2 -0
  190. data/test/sass/templates/bork2.sass +2 -0
  191. data/test/sass/templates/bork3.sass +2 -0
  192. data/test/sass/templates/bork4.sass +2 -0
  193. data/test/sass/templates/bork5.sass +3 -0
  194. data/test/sass/templates/cached_import_option.scss +3 -0
  195. data/test/sass/templates/compact.sass +17 -0
  196. data/test/sass/templates/complex.sass +305 -0
  197. data/test/sass/templates/compressed.sass +15 -0
  198. data/test/sass/templates/double_import_loop1.sass +1 -0
  199. data/test/sass/templates/expanded.sass +17 -0
  200. data/test/sass/templates/filename_fn.scss +18 -0
  201. data/test/sass/templates/if.sass +11 -0
  202. data/test/sass/templates/import.sass +12 -0
  203. data/test/sass/templates/import_charset.sass +9 -0
  204. data/test/sass/templates/import_charset_1_8.sass +6 -0
  205. data/test/sass/templates/import_charset_ibm866.sass +11 -0
  206. data/test/sass/templates/import_content.sass +4 -0
  207. data/test/sass/templates/importee.less +2 -0
  208. data/test/sass/templates/importee.sass +19 -0
  209. data/test/sass/templates/line_numbers.sass +13 -0
  210. data/test/sass/templates/mixin_bork.sass +5 -0
  211. data/test/sass/templates/mixins.sass +76 -0
  212. data/test/sass/templates/multiline.sass +20 -0
  213. data/test/sass/templates/nested.sass +25 -0
  214. data/test/sass/templates/nested_bork1.sass +2 -0
  215. data/test/sass/templates/nested_bork2.sass +2 -0
  216. data/test/sass/templates/nested_bork3.sass +2 -0
  217. data/test/sass/templates/nested_bork4.sass +2 -0
  218. data/test/sass/templates/nested_import.sass +2 -0
  219. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  220. data/test/sass/templates/options.sass +2 -0
  221. data/test/sass/templates/parent_ref.sass +25 -0
  222. data/test/sass/templates/same_name_different_ext.sass +2 -0
  223. data/test/sass/templates/same_name_different_ext.scss +1 -0
  224. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  225. data/test/sass/templates/script.sass +101 -0
  226. data/test/sass/templates/scss_import.scss +11 -0
  227. data/test/sass/templates/scss_importee.scss +1 -0
  228. data/test/sass/templates/single_import_loop.sass +1 -0
  229. data/test/sass/templates/subdir/import_up1.scss +1 -0
  230. data/test/sass/templates/subdir/import_up2.scss +1 -0
  231. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  232. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  233. data/test/sass/templates/subdir/subdir.sass +6 -0
  234. data/test/sass/templates/units.sass +11 -0
  235. data/test/sass/templates/warn.sass +3 -0
  236. data/test/sass/templates/warn_imported.sass +4 -0
  237. data/test/sass/test_helper.rb +8 -0
  238. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  239. data/test/sass/util/subset_map_test.rb +91 -0
  240. data/test/sass/util_test.rb +382 -0
  241. data/test/test_helper.rb +80 -0
  242. metadata +354 -0
@@ -0,0 +1,221 @@
1
+ module Sass::Script
2
+ # The abstract superclass for SassScript objects.
3
+ #
4
+ # Many of these methods, especially the ones that correspond to SassScript operations,
5
+ # are designed to be overridden by subclasses which may change the semantics somewhat.
6
+ # The operations listed here are just the defaults.
7
+ class Literal < Node
8
+ require 'sass/script/string'
9
+ require 'sass/script/number'
10
+ require 'sass/script/color'
11
+ require 'sass/script/bool'
12
+ require 'sass/script/null'
13
+ require 'sass/script/list'
14
+ require 'sass/script/arg_list'
15
+
16
+ # Returns the Ruby value of the literal.
17
+ # The type of this value varies based on the subclass.
18
+ #
19
+ # @return [Object]
20
+ attr_reader :value
21
+
22
+ # Creates a new literal.
23
+ #
24
+ # @param value [Object] The object for \{#value}
25
+ def initialize(value = nil)
26
+ @value = value
27
+ super()
28
+ end
29
+
30
+ # Returns an empty array.
31
+ #
32
+ # @return [Array<Node>] empty
33
+ # @see Node#children
34
+ def children
35
+ []
36
+ end
37
+
38
+ # @see Node#deep_copy
39
+ def deep_copy
40
+ dup
41
+ end
42
+
43
+ # Returns the options hash for this node.
44
+ #
45
+ # @return [{Symbol => Object}]
46
+ # @raise [Sass::SyntaxError] if the options hash hasn't been set.
47
+ # This should only happen when the literal was created
48
+ # outside of the parser and \{#to\_s} was called on it
49
+ def options
50
+ opts = super
51
+ return opts if opts
52
+ raise Sass::SyntaxError.new(<<MSG)
53
+ The #options attribute is not set on this #{self.class}.
54
+ This error is probably occurring because #to_s was called
55
+ on this literal within a custom Sass function without first
56
+ setting the #option attribute.
57
+ MSG
58
+ end
59
+
60
+ # The SassScript `==` operation.
61
+ # **Note that this returns a {Sass::Script::Bool} object,
62
+ # not a Ruby boolean**.
63
+ #
64
+ # @param other [Literal] The right-hand side of the operator
65
+ # @return [Bool] True if this literal is the same as the other,
66
+ # false otherwise
67
+ def eq(other)
68
+ Sass::Script::Bool.new(self.class == other.class && self.value == other.value)
69
+ end
70
+
71
+ # The SassScript `!=` operation.
72
+ # **Note that this returns a {Sass::Script::Bool} object,
73
+ # not a Ruby boolean**.
74
+ #
75
+ # @param other [Literal] The right-hand side of the operator
76
+ # @return [Bool] False if this literal is the same as the other,
77
+ # true otherwise
78
+ def neq(other)
79
+ Sass::Script::Bool.new(!eq(other).to_bool)
80
+ end
81
+
82
+ # The SassScript `==` operation.
83
+ # **Note that this returns a {Sass::Script::Bool} object,
84
+ # not a Ruby boolean**.
85
+ #
86
+ # @param other [Literal] The right-hand side of the operator
87
+ # @return [Bool] True if this literal is the same as the other,
88
+ # false otherwise
89
+ def unary_not
90
+ Sass::Script::Bool.new(!to_bool)
91
+ end
92
+
93
+ # The SassScript `=` operation
94
+ # (used for proprietary MS syntax like `alpha(opacity=20)`).
95
+ #
96
+ # @param other [Literal] The right-hand side of the operator
97
+ # @return [Script::String] A string containing both literals
98
+ # separated by `"="`
99
+ def single_eq(other)
100
+ Sass::Script::String.new("#{self.to_s}=#{other.to_s}")
101
+ end
102
+
103
+ # The SassScript `+` operation.
104
+ #
105
+ # @param other [Literal] The right-hand side of the operator
106
+ # @return [Script::String] A string containing both literals
107
+ # without any separation
108
+ def plus(other)
109
+ if other.is_a?(Sass::Script::String)
110
+ return Sass::Script::String.new(self.to_s + other.value, other.type)
111
+ end
112
+ Sass::Script::String.new(self.to_s + other.to_s)
113
+ end
114
+
115
+ # The SassScript `-` operation.
116
+ #
117
+ # @param other [Literal] The right-hand side of the operator
118
+ # @return [Script::String] A string containing both literals
119
+ # separated by `"-"`
120
+ def minus(other)
121
+ Sass::Script::String.new("#{self.to_s}-#{other.to_s}")
122
+ end
123
+
124
+ # The SassScript `/` operation.
125
+ #
126
+ # @param other [Literal] The right-hand side of the operator
127
+ # @return [Script::String] A string containing both literals
128
+ # separated by `"/"`
129
+ def div(other)
130
+ Sass::Script::String.new("#{self.to_s}/#{other.to_s}")
131
+ end
132
+
133
+ # The SassScript unary `+` operation (e.g. `+$a`).
134
+ #
135
+ # @param other [Literal] The right-hand side of the operator
136
+ # @return [Script::String] A string containing the literal
137
+ # preceded by `"+"`
138
+ def unary_plus
139
+ Sass::Script::String.new("+#{self.to_s}")
140
+ end
141
+
142
+ # The SassScript unary `-` operation (e.g. `-$a`).
143
+ #
144
+ # @param other [Literal] The right-hand side of the operator
145
+ # @return [Script::String] A string containing the literal
146
+ # preceded by `"-"`
147
+ def unary_minus
148
+ Sass::Script::String.new("-#{self.to_s}")
149
+ end
150
+
151
+ # The SassScript unary `/` operation (e.g. `/$a`).
152
+ #
153
+ # @param other [Literal] The right-hand side of the operator
154
+ # @return [Script::String] A string containing the literal
155
+ # preceded by `"/"`
156
+ def unary_div
157
+ Sass::Script::String.new("/#{self.to_s}")
158
+ end
159
+
160
+ # @return [String] A readable representation of the literal
161
+ def inspect
162
+ value.inspect
163
+ end
164
+
165
+ # @return [Boolean] `true` (the Ruby boolean value)
166
+ def to_bool
167
+ true
168
+ end
169
+
170
+ # Compares this object with another.
171
+ #
172
+ # @param other [Object] The object to compare with
173
+ # @return [Boolean] Whether or not this literal is equivalent to `other`
174
+ def ==(other)
175
+ eq(other).to_bool
176
+ end
177
+
178
+ # @return [Fixnum] The integer value of this literal
179
+ # @raise [Sass::SyntaxError] if this literal isn't an integer
180
+ def to_i
181
+ raise Sass::SyntaxError.new("#{self.inspect} is not an integer.")
182
+ end
183
+
184
+ # @raise [Sass::SyntaxError] if this literal isn't an integer
185
+ def assert_int!; to_i; end
186
+
187
+ # Returns the value of this literal as a list.
188
+ # Single literals are considered the same as single-element lists.
189
+ #
190
+ # @return [Array<Literal>] The of this literal as a list
191
+ def to_a
192
+ [self]
193
+ end
194
+
195
+ # Returns the string representation of this literal
196
+ # as it would be output to the CSS document.
197
+ #
198
+ # @return [String]
199
+ def to_s(opts = {})
200
+ raise Sass::SyntaxError.new("[BUG] All subclasses of Sass::Literal must implement #to_s.")
201
+ end
202
+ alias_method :to_sass, :to_s
203
+
204
+ # Returns whether or not this object is null.
205
+ #
206
+ # @return [Boolean] `false`
207
+ def null?
208
+ false
209
+ end
210
+
211
+ protected
212
+
213
+ # Evaluates the literal.
214
+ #
215
+ # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
216
+ # @return [Literal] This literal
217
+ def _perform(environment)
218
+ self
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,99 @@
1
+ module Sass::Script
2
+ # The abstract superclass for SassScript parse tree nodes.
3
+ #
4
+ # Use \{#perform} to evaluate a parse tree.
5
+ class Node
6
+ # The options hash for this node.
7
+ #
8
+ # @return [{Symbol => Object}]
9
+ attr_reader :options
10
+
11
+ # The line of the document on which this node appeared.
12
+ #
13
+ # @return [Fixnum]
14
+ attr_accessor :line
15
+
16
+ # Sets the options hash for this node,
17
+ # as well as for all child nodes.
18
+ # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
19
+ #
20
+ # @param options [{Symbol => Object}] The options
21
+ def options=(options)
22
+ @options = options
23
+ children.each do |c|
24
+ if c.is_a? Hash
25
+ c.values.each {|v| v.options = options }
26
+ else
27
+ c.options = options
28
+ end
29
+ end
30
+ end
31
+
32
+ # Evaluates the node.
33
+ #
34
+ # \{#perform} shouldn't be overridden directly;
35
+ # instead, override \{#\_perform}.
36
+ #
37
+ # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
38
+ # @return [Literal] The SassScript object that is the value of the SassScript
39
+ def perform(environment)
40
+ _perform(environment)
41
+ rescue Sass::SyntaxError => e
42
+ e.modify_backtrace(:line => line)
43
+ raise e
44
+ end
45
+
46
+ # Returns all child nodes of this node.
47
+ #
48
+ # @return [Array<Node>]
49
+ def children
50
+ Sass::Util.abstract(self)
51
+ end
52
+
53
+ # Returns the text of this SassScript expression.
54
+ #
55
+ # @return [String]
56
+ def to_sass(opts = {})
57
+ Sass::Util.abstract(self)
58
+ end
59
+
60
+ # Returns a deep clone of this node.
61
+ # The child nodes are cloned, but options are not.
62
+ #
63
+ # @return [Node]
64
+ def deep_copy
65
+ Sass::Util.abstract(self)
66
+ end
67
+
68
+ protected
69
+
70
+ # Converts underscores to dashes if the :dasherize option is set.
71
+ def dasherize(s, opts)
72
+ if opts[:dasherize]
73
+ s.gsub(/_/,'-')
74
+ else
75
+ s
76
+ end
77
+ end
78
+
79
+ # Evaluates this node.
80
+ # Note that all {Literal} objects created within this method
81
+ # should have their \{#options} attribute set, probably via \{#opts}.
82
+ #
83
+ # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
84
+ # @return [Literal] The SassScript object that is the value of the SassScript
85
+ # @see #perform
86
+ def _perform(environment)
87
+ Sass::Util.abstract(self)
88
+ end
89
+
90
+ # Sets the \{#options} field on the given literal and returns it
91
+ #
92
+ # @param literal [Literal]
93
+ # @return [Literal]
94
+ def opts(literal)
95
+ literal.options = options
96
+ literal
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,37 @@
1
+ require 'sass/script/literal'
2
+
3
+ module Sass::Script
4
+ # A SassScript object representing a null value.
5
+ class Null < Literal
6
+ # Creates a new null literal.
7
+ def initialize
8
+ super nil
9
+ end
10
+
11
+ # @return [Boolean] `false` (the Ruby boolean value)
12
+ def to_bool
13
+ false
14
+ end
15
+
16
+ # @return [Boolean] `true`
17
+ def null?
18
+ true
19
+ end
20
+
21
+ # @return [String] '' (An empty string)
22
+ def to_s(opts = {})
23
+ ''
24
+ end
25
+
26
+ def to_sass(opts = {})
27
+ 'null'
28
+ end
29
+
30
+ # Returns a string representing a null value.
31
+ #
32
+ # @return [String]
33
+ def inspect
34
+ 'null'
35
+ end
36
+ end
37
+ end