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.
- checksums.yaml +7 -0
- data/.yardopts +11 -0
- data/CONTRIBUTING +3 -0
- data/MIT-LICENSE +20 -0
- data/README.md +201 -0
- data/Rakefile +349 -0
- data/VERSION +1 -0
- data/VERSION_NAME +1 -0
- data/bin/push +13 -0
- data/bin/sass +13 -0
- data/bin/sass-convert +12 -0
- data/bin/scss +13 -0
- data/extra/update_watch.rb +13 -0
- data/init.rb +18 -0
- data/lib/sass/cache_stores/base.rb +88 -0
- data/lib/sass/cache_stores/chain.rb +33 -0
- data/lib/sass/cache_stores/filesystem.rb +64 -0
- data/lib/sass/cache_stores/memory.rb +47 -0
- data/lib/sass/cache_stores/null.rb +25 -0
- data/lib/sass/cache_stores.rb +15 -0
- data/lib/sass/callbacks.rb +66 -0
- data/lib/sass/css.rb +409 -0
- data/lib/sass/engine.rb +930 -0
- data/lib/sass/environment.rb +101 -0
- data/lib/sass/error.rb +201 -0
- data/lib/sass/exec.rb +707 -0
- data/lib/sass/importers/base.rb +139 -0
- data/lib/sass/importers/filesystem.rb +186 -0
- data/lib/sass/importers.rb +22 -0
- data/lib/sass/logger/base.rb +32 -0
- data/lib/sass/logger/log_level.rb +49 -0
- data/lib/sass/logger.rb +15 -0
- data/lib/sass/media.rb +213 -0
- data/lib/sass/plugin/compiler.rb +406 -0
- data/lib/sass/plugin/configuration.rb +123 -0
- data/lib/sass/plugin/generic.rb +15 -0
- data/lib/sass/plugin/merb.rb +48 -0
- data/lib/sass/plugin/rack.rb +60 -0
- data/lib/sass/plugin/rails.rb +47 -0
- data/lib/sass/plugin/staleness_checker.rb +199 -0
- data/lib/sass/plugin.rb +133 -0
- data/lib/sass/railtie.rb +10 -0
- data/lib/sass/repl.rb +57 -0
- data/lib/sass/root.rb +7 -0
- data/lib/sass/script/arg_list.rb +52 -0
- data/lib/sass/script/bool.rb +18 -0
- data/lib/sass/script/color.rb +606 -0
- data/lib/sass/script/css_lexer.rb +29 -0
- data/lib/sass/script/css_parser.rb +31 -0
- data/lib/sass/script/funcall.rb +245 -0
- data/lib/sass/script/functions.rb +1543 -0
- data/lib/sass/script/interpolation.rb +79 -0
- data/lib/sass/script/lexer.rb +345 -0
- data/lib/sass/script/list.rb +85 -0
- data/lib/sass/script/literal.rb +221 -0
- data/lib/sass/script/node.rb +99 -0
- data/lib/sass/script/null.rb +37 -0
- data/lib/sass/script/number.rb +453 -0
- data/lib/sass/script/operation.rb +110 -0
- data/lib/sass/script/parser.rb +502 -0
- data/lib/sass/script/string.rb +51 -0
- data/lib/sass/script/string_interpolation.rb +103 -0
- data/lib/sass/script/unary_operation.rb +69 -0
- data/lib/sass/script/variable.rb +58 -0
- data/lib/sass/script.rb +39 -0
- data/lib/sass/scss/css_parser.rb +36 -0
- data/lib/sass/scss/parser.rb +1180 -0
- data/lib/sass/scss/rx.rb +133 -0
- data/lib/sass/scss/script_lexer.rb +15 -0
- data/lib/sass/scss/script_parser.rb +25 -0
- data/lib/sass/scss/static_parser.rb +54 -0
- data/lib/sass/scss.rb +16 -0
- data/lib/sass/selector/abstract_sequence.rb +94 -0
- data/lib/sass/selector/comma_sequence.rb +92 -0
- data/lib/sass/selector/sequence.rb +507 -0
- data/lib/sass/selector/simple.rb +119 -0
- data/lib/sass/selector/simple_sequence.rb +215 -0
- data/lib/sass/selector.rb +452 -0
- data/lib/sass/shared.rb +76 -0
- data/lib/sass/supports.rb +229 -0
- data/lib/sass/tree/charset_node.rb +22 -0
- data/lib/sass/tree/comment_node.rb +82 -0
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/css_import_node.rb +60 -0
- data/lib/sass/tree/debug_node.rb +18 -0
- data/lib/sass/tree/directive_node.rb +42 -0
- data/lib/sass/tree/each_node.rb +24 -0
- data/lib/sass/tree/extend_node.rb +36 -0
- data/lib/sass/tree/for_node.rb +36 -0
- data/lib/sass/tree/function_node.rb +34 -0
- data/lib/sass/tree/if_node.rb +52 -0
- data/lib/sass/tree/import_node.rb +75 -0
- data/lib/sass/tree/media_node.rb +58 -0
- data/lib/sass/tree/mixin_def_node.rb +38 -0
- data/lib/sass/tree/mixin_node.rb +39 -0
- data/lib/sass/tree/node.rb +196 -0
- data/lib/sass/tree/prop_node.rb +152 -0
- data/lib/sass/tree/return_node.rb +18 -0
- data/lib/sass/tree/root_node.rb +78 -0
- data/lib/sass/tree/rule_node.rb +132 -0
- data/lib/sass/tree/supports_node.rb +51 -0
- data/lib/sass/tree/trace_node.rb +32 -0
- data/lib/sass/tree/variable_node.rb +30 -0
- data/lib/sass/tree/visitors/base.rb +75 -0
- data/lib/sass/tree/visitors/check_nesting.rb +147 -0
- data/lib/sass/tree/visitors/convert.rb +316 -0
- data/lib/sass/tree/visitors/cssize.rb +241 -0
- data/lib/sass/tree/visitors/deep_copy.rb +102 -0
- data/lib/sass/tree/visitors/extend.rb +68 -0
- data/lib/sass/tree/visitors/perform.rb +446 -0
- data/lib/sass/tree/visitors/set_options.rb +125 -0
- data/lib/sass/tree/visitors/to_css.rb +228 -0
- data/lib/sass/tree/warn_node.rb +18 -0
- data/lib/sass/tree/while_node.rb +18 -0
- data/lib/sass/util/multibyte_string_scanner.rb +155 -0
- data/lib/sass/util/subset_map.rb +109 -0
- data/lib/sass/util/test.rb +10 -0
- data/lib/sass/util.rb +948 -0
- data/lib/sass/version.rb +126 -0
- data/lib/sass.rb +95 -0
- data/rails/init.rb +1 -0
- data/test/Gemfile +3 -0
- data/test/Gemfile.lock +10 -0
- data/test/sass/cache_test.rb +89 -0
- data/test/sass/callbacks_test.rb +61 -0
- data/test/sass/conversion_test.rb +1760 -0
- data/test/sass/css2sass_test.rb +458 -0
- data/test/sass/data/hsl-rgb.txt +319 -0
- data/test/sass/engine_test.rb +3244 -0
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +1482 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/test/sass/functions_test.rb +1139 -0
- data/test/sass/importer_test.rb +192 -0
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/mock_importer.rb +49 -0
- data/test/sass/more_results/more1.css +9 -0
- data/test/sass/more_results/more1_with_line_comments.css +26 -0
- data/test/sass/more_results/more_import.css +29 -0
- data/test/sass/more_templates/_more_partial.sass +2 -0
- data/test/sass/more_templates/more1.sass +23 -0
- data/test/sass/more_templates/more_import.sass +11 -0
- data/test/sass/plugin_test.rb +564 -0
- data/test/sass/results/alt.css +4 -0
- data/test/sass/results/basic.css +9 -0
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/compact.css +5 -0
- data/test/sass/results/complex.css +86 -0
- data/test/sass/results/compressed.css +1 -0
- data/test/sass/results/expanded.css +19 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/if.css +3 -0
- data/test/sass/results/import.css +31 -0
- data/test/sass/results/import_charset.css +5 -0
- data/test/sass/results/import_charset_1_8.css +5 -0
- data/test/sass/results/import_charset_ibm866.css +5 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/line_numbers.css +49 -0
- data/test/sass/results/mixins.css +95 -0
- data/test/sass/results/multiline.css +24 -0
- data/test/sass/results/nested.css +22 -0
- data/test/sass/results/options.css +1 -0
- data/test/sass/results/parent_ref.css +13 -0
- data/test/sass/results/script.css +16 -0
- data/test/sass/results/scss_import.css +31 -0
- data/test/sass/results/scss_importee.css +2 -0
- data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
- data/test/sass/results/subdir/subdir.css +3 -0
- data/test/sass/results/units.css +11 -0
- data/test/sass/results/warn.css +0 -0
- data/test/sass/results/warn_imported.css +0 -0
- data/test/sass/script_conversion_test.rb +299 -0
- data/test/sass/script_test.rb +622 -0
- data/test/sass/scss/css_test.rb +1100 -0
- data/test/sass/scss/rx_test.rb +156 -0
- data/test/sass/scss/scss_test.rb +2106 -0
- data/test/sass/scss/test_helper.rb +37 -0
- data/test/sass/templates/_cached_import_option_partial.scss +1 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/_filename_fn_import.scss +11 -0
- data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
- data/test/sass/templates/_imported_charset_utf8.sass +4 -0
- data/test/sass/templates/_imported_content.sass +3 -0
- data/test/sass/templates/_partial.sass +2 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/alt.sass +16 -0
- data/test/sass/templates/basic.sass +23 -0
- data/test/sass/templates/bork1.sass +2 -0
- data/test/sass/templates/bork2.sass +2 -0
- data/test/sass/templates/bork3.sass +2 -0
- data/test/sass/templates/bork4.sass +2 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/compact.sass +17 -0
- data/test/sass/templates/complex.sass +305 -0
- data/test/sass/templates/compressed.sass +15 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/expanded.sass +17 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/if.sass +11 -0
- data/test/sass/templates/import.sass +12 -0
- data/test/sass/templates/import_charset.sass +9 -0
- data/test/sass/templates/import_charset_1_8.sass +6 -0
- data/test/sass/templates/import_charset_ibm866.sass +11 -0
- data/test/sass/templates/import_content.sass +4 -0
- data/test/sass/templates/importee.less +2 -0
- data/test/sass/templates/importee.sass +19 -0
- data/test/sass/templates/line_numbers.sass +13 -0
- data/test/sass/templates/mixin_bork.sass +5 -0
- data/test/sass/templates/mixins.sass +76 -0
- data/test/sass/templates/multiline.sass +20 -0
- data/test/sass/templates/nested.sass +25 -0
- data/test/sass/templates/nested_bork1.sass +2 -0
- data/test/sass/templates/nested_bork2.sass +2 -0
- data/test/sass/templates/nested_bork3.sass +2 -0
- data/test/sass/templates/nested_bork4.sass +2 -0
- data/test/sass/templates/nested_import.sass +2 -0
- data/test/sass/templates/nested_mixin_bork.sass +6 -0
- data/test/sass/templates/options.sass +2 -0
- data/test/sass/templates/parent_ref.sass +25 -0
- data/test/sass/templates/same_name_different_ext.sass +2 -0
- data/test/sass/templates/same_name_different_ext.scss +1 -0
- data/test/sass/templates/same_name_different_partiality.scss +1 -0
- data/test/sass/templates/script.sass +101 -0
- data/test/sass/templates/scss_import.scss +11 -0
- data/test/sass/templates/scss_importee.scss +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/test/sass/templates/subdir/import_up1.scss +1 -0
- data/test/sass/templates/subdir/import_up2.scss +1 -0
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
- data/test/sass/templates/subdir/subdir.sass +6 -0
- data/test/sass/templates/units.sass +11 -0
- data/test/sass/templates/warn.sass +3 -0
- data/test/sass/templates/warn_imported.sass +4 -0
- data/test/sass/test_helper.rb +8 -0
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/subset_map_test.rb +91 -0
- data/test/sass/util_test.rb +382 -0
- data/test/test_helper.rb +80 -0
- metadata +354 -0
data/lib/sass/scss/rx.rb
ADDED
|
@@ -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
|