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,133 @@
1
+ module Sass
2
+ module SCSS
3
+ # A module containing regular expressions used
4
+ # for lexing tokens in an SCSS document.
5
+ # Most of these are taken from [the CSS3 spec](http://www.w3.org/TR/css3-syntax/#lexical),
6
+ # although some have been modified for various reasons.
7
+ module RX
8
+ # Takes a string and returns a CSS identifier
9
+ # that will have the value of the given string.
10
+ #
11
+ # @param str [String] The string to escape
12
+ # @return [String] The escaped string
13
+ def self.escape_ident(str)
14
+ return "" if str.empty?
15
+ return "\\#{str}" if str == '-' || str == '_'
16
+ out = ""
17
+ value = str.dup
18
+ out << value.slice!(0...1) if value =~ /^[-_]/
19
+ if value[0...1] =~ NMSTART
20
+ out << value.slice!(0...1)
21
+ else
22
+ out << escape_char(value.slice!(0...1))
23
+ end
24
+ out << value.gsub(/[^a-zA-Z0-9_-]/) {|c| escape_char c}
25
+ return out
26
+ end
27
+
28
+ # Escapes a single character for a CSS identifier.
29
+ #
30
+ # @param c [String] The character to escape. Should have length 1
31
+ # @return [String] The escaped character
32
+ # @private
33
+ def self.escape_char(c)
34
+ return "\\%06x" % Sass::Util.ord(c) unless c =~ /[ -\/:-~]/
35
+ return "\\#{c}"
36
+ end
37
+
38
+ # Creates a Regexp from a plain text string,
39
+ # escaping all significant characters.
40
+ #
41
+ # @param str [String] The text of the regexp
42
+ # @param flags [Fixnum] Flags for the created regular expression
43
+ # @return [Regexp]
44
+ # @private
45
+ def self.quote(str, flags = 0)
46
+ Regexp.new(Regexp.quote(str), flags)
47
+ end
48
+
49
+ H = /[0-9a-fA-F]/
50
+ NL = /\n|\r\n|\r|\f/
51
+ UNICODE = /\\#{H}{1,6}[ \t\r\n\f]?/
52
+ s = if Sass::Util.ruby1_8?
53
+ '\200-\377'
54
+ elsif Sass::Util.macruby?
55
+ '\u0080-\uD7FF\uE000-\uFFFD\U00010000-\U0010FFFF'
56
+ else
57
+ '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'
58
+ end
59
+ NONASCII = /[#{s}]/
60
+ ESCAPE = /#{UNICODE}|\\[ -~#{s}]/
61
+ NMSTART = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
62
+ NMCHAR = /[a-zA-Z0-9_-]|#{NONASCII}|#{ESCAPE}/
63
+ STRING1 = /\"((?:[^\n\r\f\\"]|\\#{NL}|#{ESCAPE})*)\"/
64
+ STRING2 = /\'((?:[^\n\r\f\\']|\\#{NL}|#{ESCAPE})*)\'/
65
+
66
+ IDENT = /-?#{NMSTART}#{NMCHAR}*/
67
+ NAME = /#{NMCHAR}+/
68
+ NUM = /[0-9]+|[0-9]*\.[0-9]+/
69
+ STRING = /#{STRING1}|#{STRING2}/
70
+ URLCHAR = /[#%&*-~]|#{NONASCII}|#{ESCAPE}/
71
+ URL = /(#{URLCHAR}*)/
72
+ W = /[ \t\r\n\f]*/
73
+ VARIABLE = /(\$)(#{Sass::SCSS::RX::IDENT})/
74
+
75
+ # This is more liberal than the spec's definition,
76
+ # but that definition didn't work well with the greediness rules
77
+ RANGE = /(?:#{H}|\?){1,6}/
78
+
79
+ ##
80
+
81
+ S = /[ \t\r\n\f]+/
82
+
83
+ COMMENT = /\/\*[^*]*\*+(?:[^\/][^*]*\*+)*\//
84
+ SINGLE_LINE_COMMENT = /\/\/.*(\n[ \t]*\/\/.*)*/
85
+
86
+ CDO = quote("<!--")
87
+ CDC = quote("-->")
88
+ INCLUDES = quote("~=")
89
+ DASHMATCH = quote("|=")
90
+ PREFIXMATCH = quote("^=")
91
+ SUFFIXMATCH = quote("$=")
92
+ SUBSTRINGMATCH = quote("*=")
93
+
94
+ HASH = /##{NAME}/
95
+
96
+ IMPORTANT = /!#{W}important/i
97
+ DEFAULT = /!#{W}default/i
98
+
99
+ NUMBER = /#{NUM}(?:#{IDENT}|%)?/
100
+
101
+ URI = /url\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
102
+ FUNCTION = /#{IDENT}\(/
103
+
104
+ UNICODERANGE = /u\+(?:#{H}{1,6}-#{H}{1,6}|#{RANGE})/i
105
+
106
+ # Defined in http://www.w3.org/TR/css3-selectors/#lex
107
+ PLUS = /#{W}\+/
108
+ GREATER = /#{W}>/
109
+ TILDE = /#{W}~/
110
+ NOT = quote(":not(", Regexp::IGNORECASE)
111
+
112
+ # Defined in https://developer.mozilla.org/en/CSS/@-moz-document as a
113
+ # non-standard version of http://www.w3.org/TR/css3-conditional/
114
+ URL_PREFIX = /url-prefix\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
115
+ DOMAIN = /domain\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
116
+
117
+ # Custom
118
+ HEXCOLOR = /\#[0-9a-fA-F]+/
119
+ INTERP_START = /#\{/
120
+ ANY = /:(-[-\w]+-)?any\(/i
121
+ OPTIONAL = /!#{W}optional/i
122
+
123
+ IDENT_HYPHEN_INTERP = /-(#\{)/
124
+ STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\"/
125
+ STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\'/
126
+ STRING_NOINTERP = /#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/
127
+
128
+ STATIC_COMPONENT = /#{IDENT}|#{STRING_NOINTERP}|#{HEXCOLOR}|[+-]?#{NUMBER}|\!important/i
129
+ STATIC_VALUE = /#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*([;}])/i
130
+ STATIC_SELECTOR = /(#{NMCHAR}|[ \t]|[,>+*]|[:#.]#{NMSTART}){0,50}([{])/i
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,15 @@
1
+ module Sass
2
+ module SCSS
3
+ # A mixin for subclasses of {Sass::Script::Lexer}
4
+ # that makes them usable by {SCSS::Parser} to parse SassScript.
5
+ # In particular, the lexer doesn't support `!` for a variable prefix.
6
+ module ScriptLexer
7
+ private
8
+
9
+ def variable
10
+ return [:raw, "!important"] if scan(Sass::SCSS::RX::IMPORTANT)
11
+ _variable(Sass::SCSS::RX::VARIABLE)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ module Sass
2
+ module SCSS
3
+ # A mixin for subclasses of {Sass::Script::Parser}
4
+ # that makes them usable by {SCSS::Parser} to parse SassScript.
5
+ # In particular, the parser won't raise an error
6
+ # when there's more content in the lexer once lexing is done.
7
+ # In addition, the parser doesn't support `!` for a variable prefix.
8
+ module ScriptParser
9
+ private
10
+
11
+ # @private
12
+ def lexer_class
13
+ klass = Class.new(super)
14
+ klass.send(:include, ScriptLexer)
15
+ klass
16
+ end
17
+
18
+ # Instead of raising an error when the parser is done,
19
+ # rewind the StringScanner so that it hasn't consumed the final token.
20
+ def assert_done
21
+ @lexer.unpeek!
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,54 @@
1
+ require 'sass/script/css_parser'
2
+
3
+ module Sass
4
+ module SCSS
5
+ # A parser for a static SCSS tree.
6
+ # Parses with SCSS extensions, like nested rules and parent selectors,
7
+ # but without dynamic SassScript.
8
+ # This is useful for e.g. \{#parse\_selector parsing selectors}
9
+ # after resolving the interpolation.
10
+ class StaticParser < Parser
11
+ # Parses the text as a selector.
12
+ #
13
+ # @param filename [String, nil] The file in which the selector appears,
14
+ # or nil if there is no such file.
15
+ # Used for error reporting.
16
+ # @return [Selector::CommaSequence] The parsed selector
17
+ # @raise [Sass::SyntaxError] if there's a syntax error in the selector
18
+ def parse_selector
19
+ init_scanner!
20
+ seq = expr!(:selector_comma_sequence)
21
+ expected("selector") unless @scanner.eos?
22
+ seq.line = @line
23
+ seq.filename = @filename
24
+ seq
25
+ end
26
+
27
+ private
28
+
29
+ def moz_document_function
30
+ return unless val = tok(URI) || tok(URL_PREFIX) || tok(DOMAIN) ||
31
+ function(!:allow_var)
32
+ ss
33
+ [val]
34
+ end
35
+
36
+ def variable; nil; end
37
+ def script_value; nil; end
38
+ def interpolation; nil; end
39
+ def var_expr; nil; end
40
+ def interp_string; s = tok(STRING) and [s]; end
41
+ def interp_uri; s = tok(URI) and [s]; end
42
+ def interp_ident(ident = IDENT); s = tok(ident) and [s]; end
43
+ def use_css_import?; true; end
44
+
45
+ def special_directive(name)
46
+ return unless %w[media import charset -moz-document].include?(name)
47
+ super
48
+ end
49
+
50
+ @sass_script_parser = Class.new(Sass::Script::CssParser)
51
+ @sass_script_parser.send(:include, ScriptParser)
52
+ end
53
+ end
54
+ end
data/lib/sass/scss.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'sass/scss/rx'
2
+ require 'sass/scss/script_lexer'
3
+ require 'sass/scss/script_parser'
4
+ require 'sass/scss/parser'
5
+ require 'sass/scss/static_parser'
6
+ require 'sass/scss/css_parser'
7
+
8
+ module Sass
9
+ # SCSS is the CSS syntax for Sass.
10
+ # It parses into the same syntax tree as Sass,
11
+ # and generates the same sort of output CSS.
12
+ #
13
+ # This module contains code for the parsing of SCSS.
14
+ # The evaluation is handled by the broader {Sass} module.
15
+ module SCSS; end
16
+ end
@@ -0,0 +1,94 @@
1
+ module Sass
2
+ module Selector
3
+ # The abstract parent class of the various selector sequence classes.
4
+ #
5
+ # All subclasses should implement a `members` method that returns an array
6
+ # of object that respond to `#line=` and `#filename=`, as well as a `to_a`
7
+ # method that returns an array of strings and script nodes.
8
+ class AbstractSequence
9
+ # The line of the Sass template on which this selector was declared.
10
+ #
11
+ # @return [Fixnum]
12
+ attr_reader :line
13
+
14
+ # The name of the file in which this selector was declared.
15
+ #
16
+ # @return [String, nil]
17
+ attr_reader :filename
18
+
19
+ # Sets the line of the Sass template on which this selector was declared.
20
+ # This also sets the line for all child selectors.
21
+ #
22
+ # @param line [Fixnum]
23
+ # @return [Fixnum]
24
+ def line=(line)
25
+ members.each {|m| m.line = line}
26
+ @line = line
27
+ end
28
+
29
+ # Sets the name of the file in which this selector was declared,
30
+ # or `nil` if it was not declared in a file (e.g. on stdin).
31
+ # This also sets the filename for all child selectors.
32
+ #
33
+ # @param filename [String, nil]
34
+ # @return [String, nil]
35
+ def filename=(filename)
36
+ members.each {|m| m.filename = filename}
37
+ @filename = filename
38
+ end
39
+
40
+ # Returns a hash code for this sequence.
41
+ #
42
+ # Subclasses should define `#_hash` rather than overriding this method,
43
+ # which automatically handles memoizing the result.
44
+ #
45
+ # @return [Fixnum]
46
+ def hash
47
+ @_hash ||= _hash
48
+ end
49
+
50
+ # Checks equality between this and another object.
51
+ #
52
+ # Subclasses should define `#_eql?` rather than overriding this method,
53
+ # which handles checking class equality and hash equality.
54
+ #
55
+ # @param other [Object] The object to test equality against
56
+ # @return [Boolean] Whether or not this is equal to `other`
57
+ def eql?(other)
58
+ other.class == self.class && other.hash == self.hash && _eql?(other)
59
+ end
60
+ alias_method :==, :eql?
61
+
62
+ # Whether or not this selector sequence contains a placeholder selector.
63
+ # Checks recursively.
64
+ def has_placeholder?
65
+ @has_placeholder ||=
66
+ members.any? {|m| m.is_a?(AbstractSequence) ? m.has_placeholder? : m.is_a?(Placeholder)}
67
+ end
68
+
69
+ # Converts the selector into a string. This is the standard selector
70
+ # string, along with any SassScript interpolation that may exist.
71
+ #
72
+ # @return [String]
73
+ def to_s
74
+ to_a.map {|e| e.is_a?(Sass::Script::Node) ? "\#{#{e.to_sass}}" : e}.join
75
+ end
76
+
77
+ # Returns the specificity of the selector as an integer. The base is given
78
+ # by {Sass::Selector::SPECIFICITY_BASE}.
79
+ #
80
+ # @return [Fixnum]
81
+ def specificity
82
+ _specificity(members)
83
+ end
84
+
85
+ protected
86
+
87
+ def _specificity(arr)
88
+ spec = 0
89
+ arr.map {|m| spec += m.is_a?(String) ? 0 : m.specificity}
90
+ spec
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,92 @@
1
+ module Sass
2
+ module Selector
3
+ # A comma-separated sequence of selectors.
4
+ class CommaSequence < AbstractSequence
5
+ # The comma-separated selector sequences
6
+ # represented by this class.
7
+ #
8
+ # @return [Array<Sequence>]
9
+ attr_reader :members
10
+
11
+ # @param seqs [Array<Sequence>] See \{#members}
12
+ def initialize(seqs)
13
+ @members = seqs
14
+ end
15
+
16
+ # Resolves the {Parent} selectors within this selector
17
+ # by replacing them with the given parent selector,
18
+ # handling commas appropriately.
19
+ #
20
+ # @param super_cseq [CommaSequence] The parent selector
21
+ # @return [CommaSequence] This selector, with parent references resolved
22
+ # @raise [Sass::SyntaxError] If a parent selector is invalid
23
+ def resolve_parent_refs(super_cseq)
24
+ if super_cseq.nil?
25
+ if @members.any? do |sel|
26
+ sel.members.any? do |sel_or_op|
27
+ sel_or_op.is_a?(SimpleSequence) && sel_or_op.members.any? {|ssel| ssel.is_a?(Parent)}
28
+ end
29
+ end
30
+ raise Sass::SyntaxError.new("Base-level rules cannot contain the parent-selector-referencing character '&'.")
31
+ end
32
+ return self
33
+ end
34
+
35
+ CommaSequence.new(
36
+ super_cseq.members.map do |super_seq|
37
+ @members.map {|seq| seq.resolve_parent_refs(super_seq)}
38
+ end.flatten)
39
+ end
40
+
41
+ # Non-destrucively extends this selector with the extensions specified in a hash
42
+ # (which should come from {Sass::Tree::Visitors::Cssize}).
43
+ #
44
+ # @todo Link this to the reference documentation on `@extend`
45
+ # when such a thing exists.
46
+ #
47
+ # @param extends [Sass::Util::SubsetMap{Selector::Simple =>
48
+ # Sass::Tree::Visitors::Cssize::Extend}]
49
+ # The extensions to perform on this selector
50
+ # @param parent_directives [Array<Sass::Tree::DirectiveNode>]
51
+ # The directives containing this selector.
52
+ # @return [CommaSequence] A copy of this selector,
53
+ # with extensions made according to `extends`
54
+ def do_extend(extends, parent_directives)
55
+ CommaSequence.new(members.map do |seq|
56
+ extended = seq.do_extend(extends, parent_directives)
57
+ # First Law of Extend: the result of extending a selector should
58
+ # always contain the base selector.
59
+ #
60
+ # See https://github.com/nex3/sass/issues/324.
61
+ extended.unshift seq unless seq.has_placeholder? || extended.include?(seq)
62
+ extended
63
+ end.flatten)
64
+ end
65
+
66
+ # Returns a string representation of the sequence.
67
+ # This is basically the selector string.
68
+ #
69
+ # @return [String]
70
+ def inspect
71
+ members.map {|m| m.inspect}.join(", ")
72
+ end
73
+
74
+ # @see Simple#to_a
75
+ def to_a
76
+ arr = Sass::Util.intersperse(@members.map {|m| m.to_a}, ", ").flatten
77
+ arr.delete("\n")
78
+ arr
79
+ end
80
+
81
+ private
82
+
83
+ def _hash
84
+ members.hash
85
+ end
86
+
87
+ def _eql?(other)
88
+ other.class == self.class && other.members.eql?(self.members)
89
+ end
90
+ end
91
+ end
92
+ end