sass 3.1.0.alpha.23 → 3.1.0.alpha.24
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.
- data/EDGE_GEM_VERSION +1 -1
- data/VERSION +1 -1
- data/lib/sass/engine.rb +24 -0
- data/lib/sass/less.rb +1 -1
- data/lib/sass/script/css_parser.rb +1 -1
- data/lib/sass/script/functions.rb +126 -5
- data/lib/sass/script/list.rb +76 -0
- data/lib/sass/script/literal.rb +10 -1
- data/lib/sass/script/number.rb +1 -1
- data/lib/sass/script/operation.rb +3 -2
- data/lib/sass/script/parser.rb +25 -12
- data/lib/sass/scss/parser.rb +14 -2
- data/lib/sass/tree/each_node.rb +54 -0
- data/lib/sass/tree/prop_node.rb +1 -1
- data/test/sass/conversion_test.rb +20 -0
- data/test/sass/engine_test.rb +23 -0
- data/test/sass/functions_test.rb +69 -0
- data/test/sass/script_conversion_test.rb +27 -25
- data/test/sass/script_test.rb +12 -1
- data/test/sass/scss/scss_test.rb +27 -0
- data/test/sass/templates/script.sass +2 -2
- metadata +13 -11
data/EDGE_GEM_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.0.alpha.
|
1
|
+
3.1.0.alpha.24
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.0.alpha.
|
1
|
+
3.1.0.alpha.24
|
data/lib/sass/engine.rb
CHANGED
@@ -14,6 +14,7 @@ require 'sass/tree/extend_node'
|
|
14
14
|
require 'sass/tree/if_node'
|
15
15
|
require 'sass/tree/while_node'
|
16
16
|
require 'sass/tree/for_node'
|
17
|
+
require 'sass/tree/each_node'
|
17
18
|
require 'sass/tree/debug_node'
|
18
19
|
require 'sass/tree/warn_node'
|
19
20
|
require 'sass/tree/import_node'
|
@@ -610,6 +611,8 @@ WARNING
|
|
610
611
|
parse_mixin_include(line, root)
|
611
612
|
elsif directive == "for"
|
612
613
|
parse_for(line, root, value)
|
614
|
+
elsif directive == "each"
|
615
|
+
parse_each(line, root, value)
|
613
616
|
elsif directive == "else"
|
614
617
|
parse_else(parent, line, value)
|
615
618
|
elsif directive == "while"
|
@@ -671,6 +674,27 @@ WARNING
|
|
671
674
|
Tree::ForNode.new(var, parsed_from, parsed_to, to_name == 'to')
|
672
675
|
end
|
673
676
|
|
677
|
+
def parse_each(line, root, text)
|
678
|
+
var, list_expr = text.scan(/^([^\s]+)\s+in\s+(.+)$/).first
|
679
|
+
|
680
|
+
if var.nil? # scan failed, try to figure out why for error message
|
681
|
+
if text !~ /^[^\s]+/
|
682
|
+
expected = "variable name"
|
683
|
+
elsif text !~ /^[^\s]+\s+from\s+.+/
|
684
|
+
expected = "'in <expr>'"
|
685
|
+
end
|
686
|
+
raise SyntaxError.new("Invalid for directive '@each #{text}': expected #{expected}.")
|
687
|
+
end
|
688
|
+
raise SyntaxError.new("Invalid variable \"#{var}\".") unless var =~ Script::VALIDATE
|
689
|
+
if var.slice!(0) == ?!
|
690
|
+
offset = line.offset + line.text.index("!" + var) + 1
|
691
|
+
Script.var_warning(var, @line, offset, @options[:filename])
|
692
|
+
end
|
693
|
+
|
694
|
+
parsed_list = parse_script(list_expr, :offset => line.offset + line.text.index(list_expr))
|
695
|
+
Tree::EachNode.new(var, parsed_list)
|
696
|
+
end
|
697
|
+
|
674
698
|
def parse_else(parent, line, text)
|
675
699
|
previous = parent.children.last
|
676
700
|
raise SyntaxError.new("@else must come after @if.") unless previous.is_a?(Tree::IfNode)
|
data/lib/sass/less.rb
CHANGED
@@ -251,7 +251,7 @@ WARNING
|
|
251
251
|
e, rest = _to_sass_tree_plus_minus_eq(arr)
|
252
252
|
until rest.empty?
|
253
253
|
e2, rest = _to_sass_tree_plus_minus_eq(rest)
|
254
|
-
e = Sass::Script::Operation.new(e, e2, :
|
254
|
+
e = Sass::Script::Operation.new(e, e2, :space)
|
255
255
|
end
|
256
256
|
return e
|
257
257
|
end
|
@@ -113,6 +113,17 @@ module Sass::Script
|
|
113
113
|
# \{#abs abs($value)}
|
114
114
|
# : Returns the absolute value of a number.
|
115
115
|
#
|
116
|
+
# ## List Functions {#list-functions}
|
117
|
+
#
|
118
|
+
# \{#length length($list)}
|
119
|
+
# : Returns the length of a list.
|
120
|
+
#
|
121
|
+
# \{#nth nth($list, $n)}
|
122
|
+
# : Returns a specific item in a list.
|
123
|
+
#
|
124
|
+
# \{#join join($list1, $list2, \[$separator\])}
|
125
|
+
# : Joins together two lists into one.
|
126
|
+
#
|
116
127
|
# ## Introspection Functions
|
117
128
|
#
|
118
129
|
# \{#type_of type-of($value)}
|
@@ -705,7 +716,7 @@ module Sass::Script
|
|
705
716
|
# mix(#f00, #00f) => #7f007f
|
706
717
|
# mix(#f00, #00f, 25%) => #3f00bf
|
707
718
|
# mix(rgba(255, 0, 0, 0.5), #00f) => rgba(63, 0, 191, 0.75)
|
708
|
-
# @overload mix(color1, color2, weight
|
719
|
+
# @overload mix(color1, color2, weight: 50%)
|
709
720
|
# @param color1 [Color]
|
710
721
|
# @param color2 [Color]
|
711
722
|
# @param weight [Number] between 0% and 100%
|
@@ -912,7 +923,7 @@ module Sass::Script
|
|
912
923
|
# round(10.6px) => 11px
|
913
924
|
# @param value [Number] The number
|
914
925
|
# @return [Number] The rounded number
|
915
|
-
# @raise [
|
926
|
+
# @raise [ArgumentError] if `value` isn't a number
|
916
927
|
def round(value)
|
917
928
|
numeric_transformation(value) {|n| n.round}
|
918
929
|
end
|
@@ -925,7 +936,7 @@ module Sass::Script
|
|
925
936
|
# ciel(10.6px) => 11px
|
926
937
|
# @param value [Number] The number
|
927
938
|
# @return [Number] The rounded number
|
928
|
-
# @raise [
|
939
|
+
# @raise [ArgumentError] if `value` isn't a number
|
929
940
|
def ceil(value)
|
930
941
|
numeric_transformation(value) {|n| n.ceil}
|
931
942
|
end
|
@@ -938,7 +949,7 @@ module Sass::Script
|
|
938
949
|
# floor(10.6px) => 10px
|
939
950
|
# @param value [Number] The number
|
940
951
|
# @return [Number] The rounded number
|
941
|
-
# @raise [
|
952
|
+
# @raise [ArgumentError] if `value` isn't a number
|
942
953
|
def floor(value)
|
943
954
|
numeric_transformation(value) {|n| n.floor}
|
944
955
|
end
|
@@ -951,12 +962,122 @@ module Sass::Script
|
|
951
962
|
# abs(-10px) => 10px
|
952
963
|
# @param value [Number] The number
|
953
964
|
# @return [Number] The absolute value
|
954
|
-
# @raise [
|
965
|
+
# @raise [ArgumentError] if `value` isn't a number
|
955
966
|
def abs(value)
|
956
967
|
numeric_transformation(value) {|n| n.abs}
|
957
968
|
end
|
958
969
|
declare :abs, [:value]
|
959
970
|
|
971
|
+
# Return the length of a list.
|
972
|
+
#
|
973
|
+
# @example
|
974
|
+
# length(10px) => 1
|
975
|
+
# length(10px 20px 30px) => 3
|
976
|
+
# @param list [Literal] The list
|
977
|
+
# @return [Number] The length
|
978
|
+
def length(list)
|
979
|
+
Sass::Script::Number.new(list.to_a.size)
|
980
|
+
end
|
981
|
+
declare :length, [:list]
|
982
|
+
|
983
|
+
# Gets the nth item in a list.
|
984
|
+
#
|
985
|
+
# Note that unlike some languages, the first item in a Sass list is number 1,
|
986
|
+
# the second number 2, and so forth.
|
987
|
+
#
|
988
|
+
# @example
|
989
|
+
# nth(10px 20px 30px, 1) => 10px
|
990
|
+
# nth((Helvetica, Arial, sans-serif), 3) => sans-serif
|
991
|
+
# @param list [Literal] The list
|
992
|
+
# @param n [Number] The index into the list
|
993
|
+
# @return [Literal] The nth item in the list
|
994
|
+
# @raise [ArgumentError] If `n` isn't an integer between 1 and the list's length.
|
995
|
+
def nth(list, n)
|
996
|
+
assert_type n, :Number
|
997
|
+
if !n.int?
|
998
|
+
raise ArgumentError.new("List index #{n} must be an integer")
|
999
|
+
elsif n.to_i < 1
|
1000
|
+
raise ArgumentError.new("List index #{n} must be greater than or equal to 1")
|
1001
|
+
elsif n.to_i > (size = list.to_a.size)
|
1002
|
+
raise ArgumentError.new("List index is #{n} but list is only #{size} item#{'s' if size != 1} long")
|
1003
|
+
end
|
1004
|
+
|
1005
|
+
list.to_a[n.to_i - 1]
|
1006
|
+
end
|
1007
|
+
declare :nth, [:list, :n]
|
1008
|
+
|
1009
|
+
# Joins together two lists into a new list.
|
1010
|
+
#
|
1011
|
+
# Unless the `$separator` argument is passed,
|
1012
|
+
# if one list is comma-separated and one is space-separated,
|
1013
|
+
# the first parameter's separator is used for the resulting list.
|
1014
|
+
# If the lists have only one item each, spaces are used for the resulting list.
|
1015
|
+
#
|
1016
|
+
# @example
|
1017
|
+
# join(10px 20px, 30px 40px) => 10px 20px 30px 40px
|
1018
|
+
# join((blue, red), (#abc, #def)) => blue, red, #abc, #def
|
1019
|
+
# join(10px, 20px) => 10px 20px
|
1020
|
+
# join(10px, 20px, comma) => 10px, 20px
|
1021
|
+
# join((blue, red), (#abc, #def), space) => blue red #abc #def
|
1022
|
+
# @overload join(list1, list2, separator: auto)
|
1023
|
+
# @param list1 [Literal] The first list to join
|
1024
|
+
# @param list2 [Literal] The second list to join
|
1025
|
+
# @param separator [String] How the list separator (comma or space) should be determined.
|
1026
|
+
# If this is `comma` or `space`, that is always the separator;
|
1027
|
+
# if this is `auto` (the default), the separator is determined as explained above.
|
1028
|
+
def join(list1, list2, separator = Sass::Script::String.new("auto"))
|
1029
|
+
assert_type separator, :String
|
1030
|
+
unless %w[auto space comma].include?(separator.value)
|
1031
|
+
raise ArgumentError.new("Separator name must be space, comma, or auto")
|
1032
|
+
end
|
1033
|
+
sep1 = list1.separator if list1.is_a?(Sass::Script::List)
|
1034
|
+
sep2 = list2.separator if list2.is_a?(Sass::Script::List)
|
1035
|
+
Sass::Script::List.new(
|
1036
|
+
list1.to_a + list2.to_a,
|
1037
|
+
if separator.value == 'auto'
|
1038
|
+
sep1 || sep2 || :space
|
1039
|
+
else
|
1040
|
+
separator.value.to_sym
|
1041
|
+
end)
|
1042
|
+
end
|
1043
|
+
declare :join, [:list1, :list2]
|
1044
|
+
declare :join, [:list1, :list2, :separator]
|
1045
|
+
|
1046
|
+
# Appends a single value onto the end of a list.
|
1047
|
+
#
|
1048
|
+
# Unless the `$separator` argument is passed,
|
1049
|
+
# if the list has only one item,
|
1050
|
+
# the resulting list will be space-separated.
|
1051
|
+
#
|
1052
|
+
# @example
|
1053
|
+
# append(10px 20px, 30px) => 10px 20px 30px
|
1054
|
+
# append((blue, red), green) => blue, red, green
|
1055
|
+
# append(10px 20px, 30px 40px) => 10px 20px (30px 40px)
|
1056
|
+
# join(10px, 20px, comma) => 10px, 20px
|
1057
|
+
# join((blue, red), green, space) => blue red green
|
1058
|
+
# @overload join(list, val, separator: auto)
|
1059
|
+
# @param list1 [Literal] The first list to join
|
1060
|
+
# @param list2 [Literal] The second list to join
|
1061
|
+
# @param separator [String] How the list separator (comma or space) should be determined.
|
1062
|
+
# If this is `comma` or `space`, that is always the separator;
|
1063
|
+
# if this is `auto` (the default), the separator is determined as explained above.
|
1064
|
+
def append(list, val, separator = Sass::Script::String.new("auto"))
|
1065
|
+
assert_type separator, :String
|
1066
|
+
unless %w[auto space comma].include?(separator.value)
|
1067
|
+
raise ArgumentError.new("Separator name must be space, comma, or auto")
|
1068
|
+
end
|
1069
|
+
sep = list.separator if list.is_a?(Sass::Script::List)
|
1070
|
+
Sass::Script::List.new(
|
1071
|
+
list.to_a + [val],
|
1072
|
+
if separator.value == 'auto'
|
1073
|
+
sep || :space
|
1074
|
+
else
|
1075
|
+
separator.value.to_sym
|
1076
|
+
end)
|
1077
|
+
end
|
1078
|
+
declare :append, [:list, :val]
|
1079
|
+
declare :append, [:list, :val, :separator]
|
1080
|
+
|
960
1081
|
private
|
961
1082
|
|
962
1083
|
# This method implements the pattern of transforming a numeric value into
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Sass::Script
|
2
|
+
# A SassScript object representing a CSS list.
|
3
|
+
# This includes both comma-separated lists and space-separated lists.
|
4
|
+
class List < Literal
|
5
|
+
# The Ruby array containing the contents of the list.
|
6
|
+
#
|
7
|
+
# @return [Array<Literal>]
|
8
|
+
attr_reader :value
|
9
|
+
alias_method :children, :value
|
10
|
+
alias_method :to_a, :value
|
11
|
+
|
12
|
+
# The operator separating the values of the list.
|
13
|
+
# Either `:comma` or `:space`.
|
14
|
+
#
|
15
|
+
# @return [Symbol]
|
16
|
+
attr_reader :separator
|
17
|
+
|
18
|
+
# Creates a new list.
|
19
|
+
#
|
20
|
+
# @param value [Array<Literal>] See \{#value}
|
21
|
+
# @param separator [String] See \{#separator}
|
22
|
+
def initialize(value, separator)
|
23
|
+
super(value)
|
24
|
+
@separator = separator
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see Node#eq
|
28
|
+
def eq(other)
|
29
|
+
Sass::Script::Bool.new(
|
30
|
+
self.class == other.class && self.value == other.value &&
|
31
|
+
self.separator == other.separator)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @see Node#to_s
|
35
|
+
def to_s(opts = {})
|
36
|
+
return value.map {|e| e.to_s(opts)}.join(sep_str)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @see Node#to_sass
|
40
|
+
def to_sass(opts = {})
|
41
|
+
precedence = Sass::Script::Parser.precedence_of(separator)
|
42
|
+
value.map do |v|
|
43
|
+
if v.is_a?(List) && Sass::Script::Parser.precedence_of(v.separator) <= precedence
|
44
|
+
"(#{v.to_sass(opts)})"
|
45
|
+
else
|
46
|
+
v.to_sass(opts)
|
47
|
+
end
|
48
|
+
end.join(sep_str(nil))
|
49
|
+
end
|
50
|
+
|
51
|
+
# @see Node#inspect
|
52
|
+
def inspect
|
53
|
+
"(#{to_sass})"
|
54
|
+
end
|
55
|
+
|
56
|
+
protected
|
57
|
+
|
58
|
+
# @see Node#_perform
|
59
|
+
def _perform(environment)
|
60
|
+
list = Sass::Script::List.new(
|
61
|
+
value.map {|e| e.perform(environment)},
|
62
|
+
separator)
|
63
|
+
list.options = self.options
|
64
|
+
list.context = self.context
|
65
|
+
list
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def sep_str(opts = self.options)
|
71
|
+
return ' ' if separator == :space
|
72
|
+
return ',' if opts && opts[:style] == :compressed
|
73
|
+
return ', '
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/sass/script/literal.rb
CHANGED
@@ -9,6 +9,7 @@ module Sass::Script
|
|
9
9
|
require 'sass/script/number'
|
10
10
|
require 'sass/script/color'
|
11
11
|
require 'sass/script/bool'
|
12
|
+
require 'sass/script/list'
|
12
13
|
|
13
14
|
# Returns the Ruby value of the literal.
|
14
15
|
# The type of this value varies based on the subclass.
|
@@ -107,7 +108,7 @@ MSG
|
|
107
108
|
# @param other [Literal] The right-hand side of the operator
|
108
109
|
# @return [Script::String] A string containing both literals
|
109
110
|
# separated by a space
|
110
|
-
def
|
111
|
+
def space(other)
|
111
112
|
Sass::Script::String.new("#{self.to_s} #{other.to_s}")
|
112
113
|
end
|
113
114
|
|
@@ -214,6 +215,14 @@ MSG
|
|
214
215
|
# @raise [Sass::SyntaxError] if this literal isn't an integer
|
215
216
|
def assert_int!; to_i; end
|
216
217
|
|
218
|
+
# Returns the value of this literal as a list.
|
219
|
+
# Single literals are considered the same as single-element lists.
|
220
|
+
#
|
221
|
+
# @return [Array<Literal>] The of this literal as a list
|
222
|
+
def to_a
|
223
|
+
[self]
|
224
|
+
end
|
225
|
+
|
217
226
|
# Returns the string representation of this literal
|
218
227
|
# as it would be output to the CSS document.
|
219
228
|
#
|
data/lib/sass/script/number.rb
CHANGED
@@ -238,7 +238,7 @@ module Sass::Script
|
|
238
238
|
# @return [String] The CSS representation of this number
|
239
239
|
# @raise [Sass::SyntaxError] if this number has units that can't be used in CSS
|
240
240
|
# (e.g. `px*in`)
|
241
|
-
def to_s
|
241
|
+
def to_s(opts = {})
|
242
242
|
return original if original
|
243
243
|
raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.") unless legal_units?
|
244
244
|
inspect
|
@@ -41,7 +41,7 @@ module Sass::Script
|
|
41
41
|
sep =
|
42
42
|
case @operator
|
43
43
|
when :comma; ", "
|
44
|
-
when :
|
44
|
+
when :space; " "
|
45
45
|
else; " #{Lexer::OPERATORS_REVERSE[@operator]} "
|
46
46
|
end
|
47
47
|
"#{o1}#{sep}#{o2}"
|
@@ -66,7 +66,7 @@ module Sass::Script
|
|
66
66
|
literal1 = @operand1.perform(environment)
|
67
67
|
literal2 = @operand2.perform(environment)
|
68
68
|
|
69
|
-
if @operator == :
|
69
|
+
if @operator == :space && context == :equals
|
70
70
|
literal1 = Sass::Script::String.new(literal1.value) if literal1.is_a?(Sass::Script::String)
|
71
71
|
literal2 = Sass::Script::String.new(literal2.value) if literal2.is_a?(Sass::Script::String)
|
72
72
|
end
|
@@ -82,6 +82,7 @@ module Sass::Script
|
|
82
82
|
private
|
83
83
|
|
84
84
|
def operand_to_sass(op, side, opts)
|
85
|
+
return "(#{op.to_sass(opts)})" if op.is_a?(List)
|
85
86
|
return op.to_sass(opts) unless op.is_a?(Operation)
|
86
87
|
|
87
88
|
pred = Sass::Script::Parser.precedence_of(@operator)
|
data/lib/sass/script/parser.rb
CHANGED
@@ -123,14 +123,14 @@ module Sass
|
|
123
123
|
end
|
124
124
|
|
125
125
|
PRECEDENCE = [
|
126
|
-
:comma, :single_eq, :
|
126
|
+
:comma, :single_eq, :space, :or, :and,
|
127
127
|
[:eq, :neq],
|
128
128
|
[:gt, :gte, :lt, :lte],
|
129
129
|
[:plus, :minus],
|
130
130
|
[:times, :div, :mod],
|
131
131
|
]
|
132
132
|
|
133
|
-
ASSOCIATIVE = [:
|
133
|
+
ASSOCIATIVE = [:plus, :times]
|
134
134
|
|
135
135
|
class << self
|
136
136
|
# Returns an integer representing the precedence
|
@@ -193,7 +193,18 @@ RUBY
|
|
193
193
|
# @private
|
194
194
|
def lexer_class; Lexer; end
|
195
195
|
|
196
|
-
|
196
|
+
def expr
|
197
|
+
interp = try_ops_after_interp([:comma], :expr) and return interp
|
198
|
+
line = @lexer.line
|
199
|
+
return unless e = interpolation
|
200
|
+
arr = [e]
|
201
|
+
while tok = try_tok(:comma)
|
202
|
+
interp = try_op_before_interp(tok, e) and return interp
|
203
|
+
arr << assert_expr(:interpolation)
|
204
|
+
end
|
205
|
+
arr.size == 1 ? arr.first : node(List.new(arr, :comma), line)
|
206
|
+
end
|
207
|
+
|
197
208
|
production :equals, :interpolation, :single_eq
|
198
209
|
|
199
210
|
def try_op_before_interp(op, prev = nil)
|
@@ -219,25 +230,27 @@ RUBY
|
|
219
230
|
return interp
|
220
231
|
end
|
221
232
|
|
222
|
-
def interpolation(first =
|
233
|
+
def interpolation(first = space)
|
223
234
|
e = first
|
224
235
|
while interp = try_tok(:begin_interpolation)
|
225
236
|
wb = @lexer.whitespace?(interp)
|
226
237
|
line = @lexer.line
|
227
238
|
mid = parse_interpolated
|
228
239
|
wa = @lexer.whitespace?
|
229
|
-
e = Script::Interpolation.new(e, mid,
|
240
|
+
e = Script::Interpolation.new(e, mid, space, wb, wa)
|
230
241
|
e.line = line
|
231
242
|
end
|
232
243
|
e
|
233
244
|
end
|
234
245
|
|
235
|
-
def
|
246
|
+
def space
|
247
|
+
line = @lexer.line
|
236
248
|
return unless e = or_expr
|
237
|
-
|
238
|
-
|
249
|
+
arr = [e]
|
250
|
+
while e = or_expr
|
251
|
+
arr << e
|
239
252
|
end
|
240
|
-
|
253
|
+
arr.size == 1 ? arr.first : node(List.new(arr, :space), line)
|
241
254
|
end
|
242
255
|
|
243
256
|
production :or_expr, :and_expr, :or
|
@@ -280,7 +293,7 @@ RUBY
|
|
280
293
|
c = assert_tok(:const)
|
281
294
|
var = Script::Variable.new(c.value)
|
282
295
|
if tok = (try_tok(:colon) || try_tok(:single_eq))
|
283
|
-
val = assert_expr(:
|
296
|
+
val = assert_expr(:space)
|
284
297
|
|
285
298
|
if tok.type == :single_eq
|
286
299
|
val.context = :equals
|
@@ -427,8 +440,8 @@ RUBY
|
|
427
440
|
@lexer.expected!(EXPR_NAMES[:default])
|
428
441
|
end
|
429
442
|
|
430
|
-
def node(node)
|
431
|
-
node.line =
|
443
|
+
def node(node, line = @lexer.line)
|
444
|
+
node.line = line
|
432
445
|
node
|
433
446
|
end
|
434
447
|
end
|
data/lib/sass/scss/parser.rb
CHANGED
@@ -98,8 +98,8 @@ module Sass
|
|
98
98
|
node << comment
|
99
99
|
end
|
100
100
|
|
101
|
-
DIRECTIVES = Set[:mixin, :include, :debug, :warn, :for, :
|
102
|
-
:media, :charset]
|
101
|
+
DIRECTIVES = Set[:mixin, :include, :debug, :warn, :for, :each, :while, :if,
|
102
|
+
:extend, :import, :media, :charset]
|
103
103
|
|
104
104
|
def directive
|
105
105
|
return unless tok(/@/)
|
@@ -169,6 +169,18 @@ module Sass
|
|
169
169
|
block(node(Sass::Tree::ForNode.new(var, from, to, exclusive)), :directive)
|
170
170
|
end
|
171
171
|
|
172
|
+
def each_directive
|
173
|
+
tok!(/\$/)
|
174
|
+
var = tok! IDENT
|
175
|
+
ss
|
176
|
+
|
177
|
+
tok!(/in/)
|
178
|
+
list = sass_script(:parse)
|
179
|
+
ss
|
180
|
+
|
181
|
+
block(node(Sass::Tree::EachNode.new(var, list)), :directive)
|
182
|
+
end
|
183
|
+
|
172
184
|
def while_directive
|
173
185
|
expr = sass_script(:parse)
|
174
186
|
ss
|
@@ -0,0 +1,54 @@
|
|
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
|
+
# @param var [String] The name of the loop variable
|
9
|
+
# @param list [Script::Node] The parse tree for the list
|
10
|
+
def initialize(var, list)
|
11
|
+
@var = var
|
12
|
+
@list = list
|
13
|
+
super()
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
# @see Node#to_src
|
19
|
+
def to_src(tabs, opts, fmt)
|
20
|
+
"#{' ' * tabs}@each $#{dasherize(@var, opts)} in #{@list.to_sass(opts)}" +
|
21
|
+
children_to_src(tabs, opts, fmt)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Runs the child nodes once for each value in the list.
|
25
|
+
#
|
26
|
+
# @param environment [Sass::Environment] The lexical environment containing
|
27
|
+
# variable and mixin values
|
28
|
+
# @return [Array<Tree::Node>] The resulting static nodes
|
29
|
+
# @see Sass::Tree
|
30
|
+
def _perform(environment)
|
31
|
+
list = @list.perform(environment)
|
32
|
+
|
33
|
+
children = []
|
34
|
+
environment = Sass::Environment.new(environment)
|
35
|
+
list.to_a.each do |v|
|
36
|
+
environment.set_local_var(@var, v)
|
37
|
+
children += perform_children(environment)
|
38
|
+
end
|
39
|
+
children
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns an error message if the given child node is invalid,
|
43
|
+
# and false otherwise.
|
44
|
+
#
|
45
|
+
# {ExtendNode}s are valid within {EachNode}s.
|
46
|
+
#
|
47
|
+
# @param child [Tree::Node] A potential child node.
|
48
|
+
# @return [Boolean, String] Whether or not the child node is valid,
|
49
|
+
# as well as the error message to display if it is invalid
|
50
|
+
def invalid_child?(child)
|
51
|
+
super unless child.is_a?(ExtendNode)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -199,7 +199,7 @@ module Sass::Tree
|
|
199
199
|
|
200
200
|
def val_to_sass_concat(node, opts)
|
201
201
|
return node unless node.is_a?(Sass::Script::Operation)
|
202
|
-
return val_to_sass_div(node, opts) unless node.operator == :
|
202
|
+
return val_to_sass_div(node, opts) unless node.operator == :space
|
203
203
|
|
204
204
|
Sass::Script::Operation.new(
|
205
205
|
val_to_sass_div(node.operand1, opts),
|
@@ -675,6 +675,26 @@ foo {
|
|
675
675
|
SCSS
|
676
676
|
end
|
677
677
|
|
678
|
+
def test_each
|
679
|
+
assert_renders <<SASS, <<SCSS
|
680
|
+
a
|
681
|
+
@each $number in 1px 2px 3px 4px
|
682
|
+
b: $number
|
683
|
+
|
684
|
+
c
|
685
|
+
@each $str in foo, bar, baz, bang
|
686
|
+
d: $str
|
687
|
+
SASS
|
688
|
+
a {
|
689
|
+
@each $number in 1px 2px 3px 4px {
|
690
|
+
b: $number; } }
|
691
|
+
|
692
|
+
c {
|
693
|
+
@each $str in foo, bar, baz, bang {
|
694
|
+
d: $str; } }
|
695
|
+
SCSS
|
696
|
+
end
|
697
|
+
|
678
698
|
def test_import
|
679
699
|
assert_renders <<SASS, <<SCSS
|
680
700
|
@import foo
|
data/test/sass/engine_test.rb
CHANGED
@@ -1281,6 +1281,29 @@ a
|
|
1281
1281
|
SASS
|
1282
1282
|
end
|
1283
1283
|
|
1284
|
+
def test_each
|
1285
|
+
assert_equal(<<CSS, render(<<SASS))
|
1286
|
+
a {
|
1287
|
+
b: 1px;
|
1288
|
+
b: 2px;
|
1289
|
+
b: 3px;
|
1290
|
+
b: 4px;
|
1291
|
+
c: foo;
|
1292
|
+
c: bar;
|
1293
|
+
c: baz;
|
1294
|
+
c: bang;
|
1295
|
+
d: blue; }
|
1296
|
+
CSS
|
1297
|
+
a
|
1298
|
+
@each $number in 1px 2px 3px 4px
|
1299
|
+
b: $number
|
1300
|
+
@each $str in foo, bar, baz, bang
|
1301
|
+
c: $str
|
1302
|
+
@each $single in blue
|
1303
|
+
d: $single
|
1304
|
+
SASS
|
1305
|
+
end
|
1306
|
+
|
1284
1307
|
def test_variable_reassignment
|
1285
1308
|
assert_equal(<<CSS, render(<<SASS))
|
1286
1309
|
a {
|
data/test/sass/functions_test.rb
CHANGED
@@ -599,6 +599,75 @@ MSG
|
|
599
599
|
assert_error_message("#ff0000 is not a number for `comparable'", "comparable(1px, #f00)")
|
600
600
|
end
|
601
601
|
|
602
|
+
def test_length
|
603
|
+
assert_equal("5", evaluate("length(1 2 3 4 5)"))
|
604
|
+
assert_equal("4", evaluate("length((foo, bar, baz, bip))"))
|
605
|
+
assert_equal("3", evaluate("length((foo, bar, baz bip))"))
|
606
|
+
assert_equal("3", evaluate("length((foo, bar, (baz, bip)))"))
|
607
|
+
assert_equal("1", evaluate("length(#f00)"))
|
608
|
+
end
|
609
|
+
|
610
|
+
def test_nth
|
611
|
+
assert_equal("1", evaluate("nth(1 2 3, 1)"))
|
612
|
+
assert_equal("2", evaluate("nth(1 2 3, 2)"))
|
613
|
+
assert_equal("3", evaluate("nth((1, 2, 3), 3)"))
|
614
|
+
assert_equal("foo", evaluate("nth(foo, 1)"))
|
615
|
+
assert_equal("bar baz", evaluate("nth(foo (bar baz) bang, 2)"))
|
616
|
+
assert_error_message("List index 0 must be greater than or equal to 1 for `nth'", "nth(foo, 0)")
|
617
|
+
assert_error_message("List index -10 must be greater than or equal to 1 for `nth'", "nth(foo, -10)")
|
618
|
+
assert_error_message("List index 1.5 must be an integer for `nth'", "nth(foo, 1.5)")
|
619
|
+
assert_error_message("List index is 5 but list is only 4 items long for `nth'", "nth(1 2 3 4, 5)")
|
620
|
+
assert_error_message("List index is 2 but list is only 1 item long for `nth'", "nth(foo, 2)")
|
621
|
+
end
|
622
|
+
|
623
|
+
def test_join
|
624
|
+
assert_equal("1 2 3", evaluate("join(1 2, 3)"))
|
625
|
+
assert_equal("1 2 3", evaluate("join(1, 2 3)"))
|
626
|
+
assert_equal("1 2 3 4", evaluate("join(1 2, 3 4)"))
|
627
|
+
assert_equal("true", evaluate("(1 2 3 4) == join(1 2, 3 4)"))
|
628
|
+
assert_equal("false", evaluate("(1 2 (3 4)) == join(1 2, 3 4)"))
|
629
|
+
assert_equal("1, 2, 3", evaluate("join((1, 2), 3)"))
|
630
|
+
assert_equal("1, 2, 3", evaluate("join(1, (2, 3))"))
|
631
|
+
assert_equal("1, 2, 3, 4", evaluate("join((1, 2), (3, 4))"))
|
632
|
+
assert_equal("true", evaluate("(1, 2, 3, 4) == join((1, 2), (3, 4))"))
|
633
|
+
assert_equal("false", evaluate("(1, 2, (3, 4)) == join((1, 2), (3, 4))"))
|
634
|
+
|
635
|
+
assert_equal("1 2", evaluate("join(1, 2)"))
|
636
|
+
assert_equal("1 2 3 4", evaluate("join(1 2, (3, 4))"))
|
637
|
+
assert_equal("1, 2, 3, 4", evaluate("join((1, 2), 3 4)"))
|
638
|
+
|
639
|
+
assert_equal("1 2", evaluate("join(1, 2, auto)"))
|
640
|
+
assert_equal("1, 2, 3, 4", evaluate("join(1 2, 3 4, comma)"))
|
641
|
+
assert_equal("1 2 3 4", evaluate("join((1, 2), (3, 4), space)"))
|
642
|
+
assert_equal("1, 2", evaluate("join(1, 2, comma)"))
|
643
|
+
|
644
|
+
assert_error_message("Separator name must be space, comma, or auto for `join'", "join(1, 2, baboon)")
|
645
|
+
end
|
646
|
+
|
647
|
+
def test_append
|
648
|
+
assert_equal("1 2 3", evaluate("append(1 2, 3)"))
|
649
|
+
assert_equal("1 2 3 4", evaluate("append(1 2, 3 4)"))
|
650
|
+
assert_equal("false", evaluate("(1 2 3 4) == append(1 2, 3 4)"))
|
651
|
+
assert_equal("true", evaluate("(1 2 (3 4)) == append(1 2, 3 4)"))
|
652
|
+
assert_equal("1, 2, 3", evaluate("append((1, 2), 3)"))
|
653
|
+
assert_equal("1, 2, 3, 4", evaluate("append((1, 2), (3, 4))"))
|
654
|
+
assert_equal("false", evaluate("(1, 2, 3, 4) == append((1, 2), (3, 4))"))
|
655
|
+
assert_equal("true", evaluate("(1, 2, (3, 4)) == append((1, 2), (3, 4))"))
|
656
|
+
|
657
|
+
assert_equal("1 2", evaluate("append(1, 2)"))
|
658
|
+
assert_equal("1 2 3, 4", evaluate("append(1 2, (3, 4))"))
|
659
|
+
assert_equal("true", evaluate("(1 2 (3, 4)) == append(1 2, (3, 4))"))
|
660
|
+
assert_equal("1, 2, 3 4", evaluate("append((1, 2), 3 4)"))
|
661
|
+
assert_equal("true", evaluate("(1, 2, 3 4) == append((1, 2), 3 4)"))
|
662
|
+
|
663
|
+
assert_equal("1 2", evaluate("append(1, 2, auto)"))
|
664
|
+
assert_equal("1, 2, 3 4", evaluate("append(1 2, 3 4, comma)"))
|
665
|
+
assert_equal("1 2 3, 4", evaluate("append((1, 2), (3, 4), space)"))
|
666
|
+
assert_equal("1, 2", evaluate("append(1, 2, comma)"))
|
667
|
+
|
668
|
+
assert_error_message("Separator name must be space, comma, or auto for `append'", "append(1, 2, baboon)")
|
669
|
+
end
|
670
|
+
|
602
671
|
def test_keyword_args_rgb
|
603
672
|
assert_equal(%Q{white}, evaluate("rgb($red: 255, $green: 255, $blue: 255)"))
|
604
673
|
end
|
@@ -82,28 +82,6 @@ WARN
|
|
82
82
|
assert_renders "$foo !important"
|
83
83
|
end
|
84
84
|
|
85
|
-
def test_comma_operator
|
86
|
-
assert_renders "$foo, $bar $baz"
|
87
|
-
assert_renders "$foo $bar, $baz"
|
88
|
-
|
89
|
-
assert_renders "($foo, $bar) $baz"
|
90
|
-
assert_renders "$foo ($bar, $baz)"
|
91
|
-
|
92
|
-
assert_equal "$foo, $bar $baz", render("$foo, ($bar $baz)")
|
93
|
-
assert_equal "$foo $bar, $baz", render("($foo $bar), $baz")
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_concat_operator
|
97
|
-
assert_renders "$foo $bar or $baz"
|
98
|
-
assert_renders "$foo or $bar $baz"
|
99
|
-
|
100
|
-
assert_renders "($foo $bar) or $baz"
|
101
|
-
assert_renders "$foo or ($bar $baz)"
|
102
|
-
|
103
|
-
assert_equal "$foo $bar or $baz", render("$foo ($bar or $baz)")
|
104
|
-
assert_equal "$foo or $bar $baz", render("($foo or $bar) $baz")
|
105
|
-
end
|
106
|
-
|
107
85
|
def self.test_precedence(outer, inner)
|
108
86
|
op_outer = Sass::Script::Lexer::OPERATORS_REVERSE[outer]
|
109
87
|
op_inner = Sass::Script::Lexer::OPERATORS_REVERSE[inner]
|
@@ -146,7 +124,7 @@ RUBY
|
|
146
124
|
def self.separator_for(op_name)
|
147
125
|
case op_name
|
148
126
|
when :comma; ", "
|
149
|
-
when :
|
127
|
+
when :space; " "
|
150
128
|
else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[op_name]} "
|
151
129
|
end
|
152
130
|
end
|
@@ -182,8 +160,6 @@ RUBY
|
|
182
160
|
test_precedence :plus, :div
|
183
161
|
test_precedence :plus, :mod
|
184
162
|
|
185
|
-
assert_associative :comma, :concat
|
186
|
-
assert_associative :concat, :or
|
187
163
|
assert_associative :plus, :minus
|
188
164
|
assert_associative :times, :div
|
189
165
|
assert_associative :times, :mod
|
@@ -196,6 +172,32 @@ RUBY
|
|
196
172
|
assert_non_associative :lt, :lte
|
197
173
|
assert_non_associative :lte, :gt
|
198
174
|
|
175
|
+
def test_comma_precedence
|
176
|
+
assert_renders "$foo, $bar, $baz"
|
177
|
+
|
178
|
+
assert_renders "$foo ($bar, $baz)"
|
179
|
+
assert_renders "($foo, $bar) $baz"
|
180
|
+
|
181
|
+
assert_equal "$foo, $bar $baz", render("$foo, ($bar $baz)")
|
182
|
+
assert_equal "$foo $bar, $baz", render("($foo $bar), $baz")
|
183
|
+
|
184
|
+
assert_equal "$foo, ($bar, $baz)", render("$foo, ($bar, $baz)")
|
185
|
+
assert_equal "($foo, $bar), $baz", render("($foo, $bar), $baz")
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_space_precedence
|
189
|
+
assert_renders "$foo $bar $baz"
|
190
|
+
|
191
|
+
assert_renders "$foo or ($bar $baz)"
|
192
|
+
assert_renders "($foo $bar) or $baz"
|
193
|
+
|
194
|
+
assert_equal "$foo $bar or $baz", render("$foo ($bar or $baz)")
|
195
|
+
assert_equal "$foo or $bar $baz", render("($foo or $bar) $baz")
|
196
|
+
|
197
|
+
assert_equal "$foo ($bar $baz)", render("$foo ($bar $baz)")
|
198
|
+
assert_equal "($foo $bar) $baz", render("($foo $bar) $baz")
|
199
|
+
end
|
200
|
+
|
199
201
|
def test_unary_op
|
200
202
|
assert_renders "-12px"
|
201
203
|
assert_renders '/"foo"'
|
data/test/sass/script_test.rb
CHANGED
@@ -103,7 +103,6 @@ class SassScriptTest < Test::Unit::TestCase
|
|
103
103
|
|
104
104
|
def test_implicit_strings
|
105
105
|
assert_equal Sass::Script::String.new("foo"), eval("foo")
|
106
|
-
assert_equal Sass::Script::String.new("foo bar"), eval("foo bar")
|
107
106
|
assert_equal Sass::Script::String.new("foo/bar"), eval("foo/bar")
|
108
107
|
end
|
109
108
|
|
@@ -235,6 +234,10 @@ SASS
|
|
235
234
|
def test_ruby_equality
|
236
235
|
assert_equal eval('"foo"'), eval('"foo"')
|
237
236
|
assert_equal eval('1'), eval('1.0')
|
237
|
+
assert_equal eval('1 2 3.0'), eval('1 2 3')
|
238
|
+
assert_equal eval('1, 2, 3.0'), eval('1, 2, 3')
|
239
|
+
assert_equal eval('(1 2), (3, 4), (5 6)'), eval('(1 2), (3, 4), (5 6)')
|
240
|
+
assert_not_equal eval('1, 2, 3'), eval('1 2 3')
|
238
241
|
assert_not_equal eval('1'), eval('"1"')
|
239
242
|
end
|
240
243
|
|
@@ -313,6 +316,14 @@ SASS
|
|
313
316
|
assert_equal "true", resolve("false != true")
|
314
317
|
assert_equal "false", resolve("1em == 1px")
|
315
318
|
assert_equal "false", resolve("12 != 12")
|
319
|
+
assert_equal "true", resolve("(foo bar baz) == (foo bar baz)")
|
320
|
+
assert_equal "true", resolve("(foo, bar, baz) == (foo, bar, baz)")
|
321
|
+
assert_equal "true", resolve('((1 2), (3, 4), (5 6)) == ((1 2), (3, 4), (5 6))')
|
322
|
+
assert_equal "true", resolve('((1 2), (3 4)) == (1 2, 3 4)')
|
323
|
+
assert_equal "false", resolve('((1 2) 3) == (1 2 3)')
|
324
|
+
assert_equal "false", resolve('(1 (2 3)) == (1 2 3)')
|
325
|
+
assert_equal "false", resolve('((1, 2) (3, 4)) == (1, 2 3, 4)')
|
326
|
+
assert_equal "false", resolve('(1 2 3) == (1, 2, 3)')
|
316
327
|
end
|
317
328
|
|
318
329
|
def test_operation_precedence
|
data/test/sass/scss/scss_test.rb
CHANGED
@@ -235,6 +235,33 @@ $i: 1;
|
|
235
235
|
SCSS
|
236
236
|
end
|
237
237
|
|
238
|
+
def test_each_directive
|
239
|
+
assert_equal <<CSS, render(<<SCSS)
|
240
|
+
a {
|
241
|
+
b: 1px;
|
242
|
+
b: 2px;
|
243
|
+
b: 3px;
|
244
|
+
b: 4px; }
|
245
|
+
|
246
|
+
c {
|
247
|
+
d: foo;
|
248
|
+
d: bar;
|
249
|
+
d: baz;
|
250
|
+
d: bang; }
|
251
|
+
CSS
|
252
|
+
a {
|
253
|
+
@each $number in 1px 2px 3px 4px {
|
254
|
+
b: $number;
|
255
|
+
}
|
256
|
+
}
|
257
|
+
c {
|
258
|
+
@each $str in foo, bar, baz, bang {
|
259
|
+
d: $str;
|
260
|
+
}
|
261
|
+
}
|
262
|
+
SCSS
|
263
|
+
end
|
264
|
+
|
238
265
|
def test_css_import_directive
|
239
266
|
assert_equal "@import url(foo.css);\n", render('@import "foo.css";')
|
240
267
|
assert_equal "@import url(foo.css);\n", render("@import 'foo.css';")
|
@@ -9,7 +9,7 @@ $esc: 10\+12
|
|
9
9
|
$str: Hello\!
|
10
10
|
$qstr: "Quo\"ted\"!"
|
11
11
|
$hstr: Hyph-en\!
|
12
|
-
$
|
12
|
+
$space: #{5 + 4} hi there
|
13
13
|
$percent: 11%
|
14
14
|
$complex: 1px/1em
|
15
15
|
|
@@ -22,7 +22,7 @@ $complex: 1px/1em
|
|
22
22
|
:color $main_text
|
23
23
|
:short-color #123
|
24
24
|
:named-color olive
|
25
|
-
:con "foo" bar ($
|
25
|
+
:con "foo" bar ($space "boom")
|
26
26
|
:con2 "noquo" quo
|
27
27
|
#sidebar
|
28
28
|
:background-color $color
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.0.alpha.
|
4
|
+
version: 3.1.0.alpha.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Weizenbaum
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2010-10
|
14
|
+
date: 2010-11-10 00:00:00 -05:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- lib/sass/script/string_interpolation.rb
|
88
88
|
- lib/sass/script/unary_operation.rb
|
89
89
|
- lib/sass/script/variable.rb
|
90
|
+
- lib/sass/script/list.rb
|
90
91
|
- lib/sass/scss.rb
|
91
92
|
- lib/sass/scss/css_parser.rb
|
92
93
|
- lib/sass/scss/parser.rb
|
@@ -102,6 +103,7 @@ files:
|
|
102
103
|
- lib/sass/selector/simple.rb
|
103
104
|
- lib/sass/selector/simple_sequence.rb
|
104
105
|
- lib/sass/shared.rb
|
106
|
+
- lib/sass/tree/charset_node.rb
|
105
107
|
- lib/sass/tree/comment_node.rb
|
106
108
|
- lib/sass/tree/debug_node.rb
|
107
109
|
- lib/sass/tree/directive_node.rb
|
@@ -118,7 +120,7 @@ files:
|
|
118
120
|
- lib/sass/tree/variable_node.rb
|
119
121
|
- lib/sass/tree/warn_node.rb
|
120
122
|
- lib/sass/tree/while_node.rb
|
121
|
-
- lib/sass/tree/
|
123
|
+
- lib/sass/tree/each_node.rb
|
122
124
|
- lib/sass/util.rb
|
123
125
|
- lib/sass/util/subset_map.rb
|
124
126
|
- lib/sass/version.rb
|
@@ -180,6 +182,9 @@ files:
|
|
180
182
|
- test/sass/results/compressed.css
|
181
183
|
- test/sass/results/expanded.css
|
182
184
|
- test/sass/results/import.css
|
185
|
+
- test/sass/results/import_charset.css
|
186
|
+
- test/sass/results/import_charset_1_8.css
|
187
|
+
- test/sass/results/import_charset_ibm866.css
|
183
188
|
- test/sass/results/line_numbers.css
|
184
189
|
- test/sass/results/mixins.css
|
185
190
|
- test/sass/results/multiline.css
|
@@ -194,15 +199,14 @@ files:
|
|
194
199
|
- test/sass/results/units.css
|
195
200
|
- test/sass/results/warn.css
|
196
201
|
- test/sass/results/warn_imported.css
|
197
|
-
- test/sass/results/import_charset.css
|
198
|
-
- test/sass/results/import_charset_1_8.css
|
199
|
-
- test/sass/results/import_charset_ibm866.css
|
200
202
|
- test/sass/script_conversion_test.rb
|
201
203
|
- test/sass/script_test.rb
|
202
204
|
- test/sass/scss/css_test.rb
|
203
205
|
- test/sass/scss/rx_test.rb
|
204
206
|
- test/sass/scss/scss_test.rb
|
205
207
|
- test/sass/scss/test_helper.rb
|
208
|
+
- test/sass/templates/_imported_charset_ibm866.sass
|
209
|
+
- test/sass/templates/_imported_charset_utf8.sass
|
206
210
|
- test/sass/templates/_partial.sass
|
207
211
|
- test/sass/templates/alt.sass
|
208
212
|
- test/sass/templates/basic.sass
|
@@ -215,6 +219,9 @@ files:
|
|
215
219
|
- test/sass/templates/compressed.sass
|
216
220
|
- test/sass/templates/expanded.sass
|
217
221
|
- test/sass/templates/import.sass
|
222
|
+
- test/sass/templates/import_charset.sass
|
223
|
+
- test/sass/templates/import_charset_1_8.sass
|
224
|
+
- test/sass/templates/import_charset_ibm866.sass
|
218
225
|
- test/sass/templates/importee.less
|
219
226
|
- test/sass/templates/importee.sass
|
220
227
|
- test/sass/templates/line_numbers.sass
|
@@ -238,11 +245,6 @@ files:
|
|
238
245
|
- test/sass/templates/units.sass
|
239
246
|
- test/sass/templates/warn.sass
|
240
247
|
- test/sass/templates/warn_imported.sass
|
241
|
-
- test/sass/templates/_imported_charset_ibm866.sass
|
242
|
-
- test/sass/templates/_imported_charset_utf8.sass
|
243
|
-
- test/sass/templates/import_charset.sass
|
244
|
-
- test/sass/templates/import_charset_1_8.sass
|
245
|
-
- test/sass/templates/import_charset_ibm866.sass
|
246
248
|
- test/sass/test_helper.rb
|
247
249
|
- test/sass/util/subset_map_test.rb
|
248
250
|
- test/sass/util_test.rb
|