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,76 @@
1
+ module Sass
2
+ # This module contains functionality that's shared between Haml and Sass.
3
+ module Shared
4
+ extend self
5
+
6
+ # Scans through a string looking for the interoplation-opening `#{`
7
+ # and, when it's found, yields the scanner to the calling code
8
+ # so it can handle it properly.
9
+ #
10
+ # The scanner will have any backslashes immediately in front of the `#{`
11
+ # as the second capture group (`scan[2]`),
12
+ # and the text prior to that as the first (`scan[1]`).
13
+ #
14
+ # @yieldparam scan [StringScanner] The scanner scanning through the string
15
+ # @return [String] The text remaining in the scanner after all `#{`s have been processed
16
+ def handle_interpolation(str)
17
+ scan = Sass::Util::MultibyteStringScanner.new(str)
18
+ yield scan while scan.scan(/(.*?)(\\*)\#\{/m)
19
+ scan.rest
20
+ end
21
+
22
+ # Moves a scanner through a balanced pair of characters.
23
+ # For example:
24
+ #
25
+ # Foo (Bar (Baz bang) bop) (Bang (bop bip))
26
+ # ^ ^
27
+ # from to
28
+ #
29
+ # @param scanner [StringScanner] The string scanner to move
30
+ # @param start [Character] The character opening the balanced pair.
31
+ # A `Fixnum` in 1.8, a `String` in 1.9
32
+ # @param finish [Character] The character closing the balanced pair.
33
+ # A `Fixnum` in 1.8, a `String` in 1.9
34
+ # @param count [Fixnum] The number of opening characters matched
35
+ # before calling this method
36
+ # @return [(String, String)] The string matched within the balanced pair
37
+ # and the rest of the string.
38
+ # `["Foo (Bar (Baz bang) bop)", " (Bang (bop bip))"]` in the example above.
39
+ def balance(scanner, start, finish, count = 0)
40
+ str = ''
41
+ scanner = Sass::Util::MultibyteStringScanner.new(scanner) unless scanner.is_a? StringScanner
42
+ regexp = Regexp.new("(.*?)[\\#{start.chr}\\#{finish.chr}]", Regexp::MULTILINE)
43
+ while scanner.scan(regexp)
44
+ str << scanner.matched
45
+ count += 1 if scanner.matched[-1] == start
46
+ count -= 1 if scanner.matched[-1] == finish
47
+ return [str.strip, scanner.rest] if count == 0
48
+ end
49
+ end
50
+
51
+ # Formats a string for use in error messages about indentation.
52
+ #
53
+ # @param indentation [String] The string used for indentation
54
+ # @param was [Boolean] Whether or not to add `"was"` or `"were"`
55
+ # (depending on how many characters were in `indentation`)
56
+ # @return [String] The name of the indentation (e.g. `"12 spaces"`, `"1 tab"`)
57
+ def human_indentation(indentation, was = false)
58
+ if !indentation.include?(?\t)
59
+ noun = 'space'
60
+ elsif !indentation.include?(?\s)
61
+ noun = 'tab'
62
+ else
63
+ return indentation.inspect + (was ? ' was' : '')
64
+ end
65
+
66
+ singular = indentation.length == 1
67
+ if was
68
+ was = singular ? ' was' : ' were'
69
+ else
70
+ was = ''
71
+ end
72
+
73
+ "#{indentation.length} #{noun}#{'s' unless singular}#{was}"
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,229 @@
1
+ # A namespace for the `@supports` condition parse tree.
2
+ module Sass::Supports
3
+ # The abstract superclass of all Supports conditions.
4
+ class Condition
5
+ # Runs the SassScript in the supports condition.
6
+ #
7
+ # @param env [Sass::Environment] The environment in which to run the script.
8
+ def perform(environment); Sass::Util.abstract(self); end
9
+
10
+ # Returns the CSS for this condition.
11
+ #
12
+ # @return [String]
13
+ def to_css; Sass::Util.abstract(self); end
14
+
15
+ # Returns the Sass/CSS code for this condition.
16
+ #
17
+ # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
18
+ # @return [String]
19
+ def to_src(options); Sass::Util.abstract(self); end
20
+
21
+ # Returns a deep copy of this condition and all its children.
22
+ #
23
+ # @return [Condition]
24
+ def deep_copy; Sass::Util.abstract(self); end
25
+
26
+ # Sets the options hash for the script nodes in the supports condition.
27
+ #
28
+ # @param options [{Symbol => Object}] The options has to set.
29
+ def options=(options); Sass::Util.abstract(self); end
30
+ end
31
+
32
+ # An operator condition (e.g. `CONDITION1 and CONDITION2`).
33
+ class Operator < Condition
34
+ # The left-hand condition.
35
+ #
36
+ # @return [Sass::Supports::Condition]
37
+ attr_accessor :left
38
+
39
+ # The right-hand condition.
40
+ #
41
+ # @return [Sass::Supports::Condition]
42
+ attr_accessor :right
43
+
44
+ # The operator ("and" or "or").
45
+ #
46
+ # @return [String]
47
+ attr_accessor :op
48
+
49
+ def initialize(left, right, op)
50
+ @left = left
51
+ @right = right
52
+ @op = op
53
+ end
54
+
55
+ def perform(env)
56
+ @left.perform(env)
57
+ @right.perform(env)
58
+ end
59
+
60
+ def to_css
61
+ "#{left_parens @left.to_css} #{op} #{right_parens @right.to_css}"
62
+ end
63
+
64
+ def to_src(options)
65
+ "#{left_parens @left.to_src(options)} #{op} #{right_parens @right.to_src(options)}"
66
+ end
67
+
68
+ def deep_copy
69
+ copy = dup
70
+ copy.left = @left.deep_copy
71
+ copy.right = @right.deep_copy
72
+ copy
73
+ end
74
+
75
+ def options=(options)
76
+ @left.options = options
77
+ @right.options = options
78
+ end
79
+
80
+ private
81
+
82
+ def left_parens(str)
83
+ return "(#{str})" if @left.is_a?(Negation)
84
+ return str
85
+ end
86
+
87
+ def right_parens(str)
88
+ return "(#{str})" if @right.is_a?(Negation) || @right.is_a?(Operator)
89
+ return str
90
+ end
91
+ end
92
+
93
+ # A negation condition (`not CONDITION`).
94
+ class Negation < Condition
95
+ # The condition being negated.
96
+ #
97
+ # @return [Sass::Supports::Condition]
98
+ attr_accessor :condition
99
+
100
+ def initialize(condition)
101
+ @condition = condition
102
+ end
103
+
104
+ def perform(env)
105
+ @condition.perform(env)
106
+ end
107
+
108
+ def to_css
109
+ "not #{parens @condition.to_css}"
110
+ end
111
+
112
+ def to_src(options)
113
+ "not #{parens @condition.to_src(options)}"
114
+ end
115
+
116
+ def deep_copy
117
+ copy = dup
118
+ copy.condition = condition.deep_copy
119
+ copy
120
+ end
121
+
122
+ def options=(options)
123
+ condition.options = options
124
+ end
125
+
126
+ private
127
+
128
+ def parens(str)
129
+ return "(#{str})" if @condition.is_a?(Negation) || @condition.is_a?(Operator)
130
+ return str
131
+ end
132
+ end
133
+
134
+ # A declaration condition (e.g. `(feature: value)`).
135
+ class Declaration < Condition
136
+ # The feature name.
137
+ #
138
+ # @param [Sass::Script::Node]
139
+ attr_accessor :name
140
+
141
+ # The name of the feature after any SassScript has been resolved.
142
+ # Only set once \{Tree::Visitors::Perform} has been run.
143
+ #
144
+ # @return [String]
145
+ attr_accessor :resolved_name
146
+
147
+ # The feature value.
148
+ #
149
+ # @param [Sass::Script::Node]
150
+ attr_accessor :value
151
+
152
+ # The value of the feature after any SassScript has been resolved.
153
+ # Only set once \{Tree::Visitors::Perform} has been run.
154
+ #
155
+ # @return [String]
156
+ attr_accessor :resolved_value
157
+
158
+ def initialize(name, value)
159
+ @name = name
160
+ @value = value
161
+ end
162
+
163
+ def perform(env)
164
+ @resolved_name = name.perform(env)
165
+ @resolved_value = value.perform(env)
166
+ end
167
+
168
+ def to_css
169
+ "(#{@resolved_name}: #{@resolved_value})"
170
+ end
171
+
172
+ def to_src(options)
173
+ "(#{@name.to_sass(options)}: #{@value.to_sass(options)})"
174
+ end
175
+
176
+ def deep_copy
177
+ copy = dup
178
+ copy.name = @name.deep_copy
179
+ copy.value = @value.deep_copy
180
+ copy
181
+ end
182
+
183
+ def options=(options)
184
+ @name.options = options
185
+ @value.options = options
186
+ end
187
+ end
188
+
189
+ # An interpolation condition (e.g. `#{$var}`).
190
+ class Interpolation < Condition
191
+ # The SassScript expression in the interpolation.
192
+ #
193
+ # @param [Sass::Script::Node]
194
+ attr_accessor :value
195
+
196
+ # The value of the expression after it's been resolved.
197
+ # Only set once \{Tree::Visitors::Perform} has been run.
198
+ #
199
+ # @return [String]
200
+ attr_accessor :resolved_value
201
+
202
+ def initialize(value)
203
+ @value = value
204
+ end
205
+
206
+ def perform(env)
207
+ val = value.perform(env)
208
+ @resolved_value = val.is_a?(Sass::Script::String) ? val.value : val.to_s
209
+ end
210
+
211
+ def to_css
212
+ @resolved_value
213
+ end
214
+
215
+ def to_src(options)
216
+ "\#{#{@value.to_sass(options)}}"
217
+ end
218
+
219
+ def deep_copy
220
+ copy = dup
221
+ copy.value = @value.deep_copy
222
+ copy
223
+ end
224
+
225
+ def options=(options)
226
+ @value.options = options
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,22 @@
1
+ module Sass::Tree
2
+ # A static node representing an unproccessed Sass `@charset` directive.
3
+ #
4
+ # @see Sass::Tree
5
+ class CharsetNode < Node
6
+ # The name of the charset.
7
+ #
8
+ # @return [String]
9
+ attr_accessor :name
10
+
11
+ # @param name [String] see \{#name}
12
+ def initialize(name)
13
+ @name = name
14
+ super()
15
+ end
16
+
17
+ # @see Node#invisible?
18
+ def invisible?
19
+ !Sass::Util.ruby1_8?
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,82 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A static node representing a Sass comment (silent or loud).
5
+ #
6
+ # @see Sass::Tree
7
+ class CommentNode < Node
8
+ # The text of the comment, not including `/*` and `*/`.
9
+ # Interspersed with {Sass::Script::Node}s representing `#{}`-interpolation
10
+ # if this is a loud comment.
11
+ #
12
+ # @return [Array<String, Sass::Script::Node>]
13
+ attr_accessor :value
14
+
15
+ # The text of the comment
16
+ # after any interpolated SassScript has been resolved.
17
+ # Only set once \{Tree::Visitors::Perform} has been run.
18
+ #
19
+ # @return [String]
20
+ attr_accessor :resolved_value
21
+
22
+ # The type of the comment. `:silent` means it's never output to CSS,
23
+ # `:normal` means it's output in every compile mode except `:compressed`,
24
+ # and `:loud` means it's output even in `:compressed`.
25
+ #
26
+ # @return [Symbol]
27
+ attr_accessor :type
28
+
29
+ # @param value [Array<String, Sass::Script::Node>] See \{#value}
30
+ # @param type [Symbol] See \{#type}
31
+ def initialize(value, type)
32
+ @value = Sass::Util.with_extracted_values(value) {|str| normalize_indentation str}
33
+ @type = type
34
+ super()
35
+ end
36
+
37
+ # Compares the contents of two comments.
38
+ #
39
+ # @param other [Object] The object to compare with
40
+ # @return [Boolean] Whether or not this node and the other object
41
+ # are the same
42
+ def ==(other)
43
+ self.class == other.class && value == other.value && type == other.type
44
+ end
45
+
46
+ # Returns `true` if this is a silent comment
47
+ # or the current style doesn't render comments.
48
+ #
49
+ # Comments starting with ! are never invisible (and the ! is removed from the output.)
50
+ #
51
+ # @return [Boolean]
52
+ def invisible?
53
+ case @type
54
+ when :loud; false
55
+ when :silent; true
56
+ else; style == :compressed
57
+ end
58
+ end
59
+
60
+ # Returns the number of lines in the comment.
61
+ #
62
+ # @return [Fixnum]
63
+ def lines
64
+ @value.inject(0) do |s, e|
65
+ next s + e.count("\n") if e.is_a?(String)
66
+ next s
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def normalize_indentation(str)
73
+ ind = str.split("\n").inject(str[/^[ \t]*/].split("")) do |pre, line|
74
+ line[/^[ \t]*/].split("").zip(pre).inject([]) do |arr, (a, b)|
75
+ break arr if a != b
76
+ arr << a
77
+ end
78
+ end.join
79
+ str.gsub(/^#{ind}/, '')
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,9 @@
1
+ module Sass
2
+ module Tree
3
+ # A node representing the placement within a mixin of the include statement's content.
4
+ #
5
+ # @see Sass::Tree
6
+ class ContentNode < Node
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ module Sass::Tree
2
+ # A node representing an `@import` rule that's importing plain CSS.
3
+ #
4
+ # @see Sass::Tree
5
+ class CssImportNode < DirectiveNode
6
+ # The URI being imported, either as a plain string or an interpolated
7
+ # script string.
8
+ #
9
+ # @return [String, Sass::Script::Node]
10
+ attr_accessor :uri
11
+
12
+ # The text of the URI being imported after any interpolated SassScript has
13
+ # been resolved. Only set once \{Tree::Visitors::Perform} has been run.
14
+ #
15
+ # @return [String]
16
+ attr_accessor :resolved_uri
17
+
18
+ # The media query for this rule, interspersed with {Sass::Script::Node}s
19
+ # representing `#{}`-interpolation. Any adjacent strings will be merged
20
+ # together.
21
+ #
22
+ # @return [Array<String, Sass::Script::Node>]
23
+ attr_accessor :query
24
+
25
+ # The media query for this rule, without any unresolved interpolation. It's
26
+ # only set once {Tree::Node#perform} has been called.
27
+ #
28
+ # @return [Sass::Media::QueryList]
29
+ attr_accessor :resolved_query
30
+
31
+ # @param uri [String, Sass::Script::Node] See \{#uri}
32
+ # @param query [Array<String, Sass::Script::Node>] See \{#query}
33
+ def initialize(uri, query = nil)
34
+ @uri = uri
35
+ @query = query
36
+ super('')
37
+ end
38
+
39
+ # @param uri [String] See \{#resolved_uri}
40
+ # @return [CssImportNode]
41
+ def self.resolved(uri)
42
+ node = new(uri)
43
+ node.resolved_uri = uri
44
+ node
45
+ end
46
+
47
+ # @see DirectiveNode#value
48
+ def value; raise NotImplementedError; end
49
+
50
+ # @see DirectiveNode#resolved_value
51
+ def resolved_value
52
+ @resolved_value ||=
53
+ begin
54
+ str = "@import #{resolved_uri}"
55
+ str << " #{resolved_query.to_css}" if resolved_query
56
+ str
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,18 @@
1
+ module Sass
2
+ module Tree
3
+ # A dynamic node representing a Sass `@debug` statement.
4
+ #
5
+ # @see Sass::Tree
6
+ class DebugNode < Node
7
+ # The expression to print.
8
+ # @return [Script::Node]
9
+ attr_accessor :expr
10
+
11
+ # @param expr [Script::Node] The expression to print
12
+ def initialize(expr)
13
+ @expr = expr
14
+ super()
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,42 @@
1
+ module Sass::Tree
2
+ # A static node representing an unproccessed Sass `@`-directive.
3
+ # Directives known to Sass, like `@for` and `@debug`,
4
+ # are handled by their own nodes;
5
+ # only CSS directives like `@media` and `@font-face` become {DirectiveNode}s.
6
+ #
7
+ # `@import` and `@charset` are special cases;
8
+ # they become {ImportNode}s and {CharsetNode}s, respectively.
9
+ #
10
+ # @see Sass::Tree
11
+ class DirectiveNode < Node
12
+ # The text of the directive, `@` and all, with interpolation included.
13
+ #
14
+ # @return [Array<String, Sass::Script::Node>]
15
+ attr_accessor :value
16
+
17
+ # The text of the directive after any interpolated SassScript has been resolved.
18
+ # Only set once \{Tree::Visitors::Perform} has been run.
19
+ #
20
+ # @return [String]
21
+ attr_accessor :resolved_value
22
+
23
+ # @param value [Array<String, Sass::Script::Node>] See \{#value}
24
+ def initialize(value)
25
+ @value = value
26
+ super()
27
+ end
28
+
29
+ # @param value [String] See \{#resolved_value}
30
+ # @return [DirectiveNode]
31
+ def self.resolved(value)
32
+ node = new([value])
33
+ node.resolved_value = value
34
+ node
35
+ end
36
+
37
+ # @return [String] The name of the directive, including `@`.
38
+ def name
39
+ value.first.gsub(/ .*$/, '')
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,24 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A dynamic node representing a Sass `@each` loop.
5
+ #
6
+ # @see Sass::Tree
7
+ class EachNode < Node
8
+ # The name of the loop variable.
9
+ # @return [String]
10
+ attr_reader :var
11
+
12
+ # The parse tree for the list.
13
+ # @param [Script::Node]
14
+ attr_accessor :list
15
+
16
+ # @param var [String] The name of the loop variable
17
+ # @param list [Script::Node] The parse tree for the list
18
+ def initialize(var, list)
19
+ @var = var
20
+ @list = list
21
+ super()
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A static node reprenting an `@extend` directive.
5
+ #
6
+ # @see Sass::Tree
7
+ class ExtendNode < Node
8
+ # The parsed selector after interpolation has been resolved.
9
+ # Only set once {Tree::Visitors::Perform} has been run.
10
+ #
11
+ # @return [Selector::CommaSequence]
12
+ attr_accessor :resolved_selector
13
+
14
+ # The CSS selector to extend, interspersed with {Sass::Script::Node}s
15
+ # representing `#{}`-interpolation.
16
+ #
17
+ # @return [Array<String, Sass::Script::Node>]
18
+ attr_accessor :selector
19
+
20
+ # Whether the `@extend` is allowed to match no selectors or not.
21
+ #
22
+ # @return [Boolean]
23
+ def optional?; @optional; end
24
+
25
+ # @param selector [Array<String, Sass::Script::Node>]
26
+ # The CSS selector to extend,
27
+ # interspersed with {Sass::Script::Node}s
28
+ # representing `#{}`-interpolation.
29
+ # @param optional [Boolean] See \{#optional}
30
+ def initialize(selector, optional)
31
+ @selector = selector
32
+ @optional = optional
33
+ super()
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A dynamic node representing a Sass `@for` loop.
5
+ #
6
+ # @see Sass::Tree
7
+ class ForNode < Node
8
+ # The name of the loop variable.
9
+ # @return [String]
10
+ attr_reader :var
11
+
12
+ # The parse tree for the initial expression.
13
+ # @return [Script::Node]
14
+ attr_accessor :from
15
+
16
+ # The parse tree for the final expression.
17
+ # @return [Script::Node]
18
+ attr_accessor :to
19
+
20
+ # Whether to include `to` in the loop or stop just before.
21
+ # @return [Boolean]
22
+ attr_reader :exclusive
23
+
24
+ # @param var [String] See \{#var}
25
+ # @param from [Script::Node] See \{#from}
26
+ # @param to [Script::Node] See \{#to}
27
+ # @param exclusive [Boolean] See \{#exclusive}
28
+ def initialize(var, from, to, exclusive)
29
+ @var = var
30
+ @from = from
31
+ @to = to
32
+ @exclusive = exclusive
33
+ super()
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ module Sass
2
+ module Tree
3
+ # A dynamic node representing a function definition.
4
+ #
5
+ # @see Sass::Tree
6
+ class FunctionNode < Node
7
+ # The name of the function.
8
+ # @return [String]
9
+ attr_reader :name
10
+
11
+ # The arguments to the function. Each element is a tuple
12
+ # containing the variable for argument and the parse tree for
13
+ # the default value of the argument
14
+ #
15
+ # @return [Array<Script::Node>]
16
+ attr_accessor :args
17
+
18
+ # The splat argument for this function, if one exists.
19
+ #
20
+ # @return [Script::Node?]
21
+ attr_accessor :splat
22
+
23
+ # @param name [String] The function name
24
+ # @param args [Array<(Script::Node, Script::Node)>] The arguments for the function.
25
+ # @param splat [Script::Node] See \{#splat}
26
+ def initialize(name, args, splat)
27
+ @name = name
28
+ @args = args
29
+ @splat = splat
30
+ super()
31
+ end
32
+ end
33
+ end
34
+ end