oreorenasass 3.4.4 → 3.4.5
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 +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +50 -70
- data/Rakefile +5 -26
- data/VERSION +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/lib/sass.rb +12 -19
- data/lib/sass/cache_stores/base.rb +2 -2
- data/lib/sass/cache_stores/chain.rb +1 -2
- data/lib/sass/cache_stores/filesystem.rb +5 -1
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +0 -1
- data/lib/sass/css.rb +13 -11
- data/lib/sass/engine.rb +173 -424
- data/lib/sass/environment.rb +58 -148
- data/lib/sass/error.rb +14 -11
- data/lib/sass/exec.rb +703 -5
- data/lib/sass/importers/base.rb +6 -49
- data/lib/sass/importers/filesystem.rb +19 -44
- data/lib/sass/logger.rb +4 -1
- data/lib/sass/logger/base.rb +4 -2
- data/lib/sass/logger/log_level.rb +7 -3
- data/lib/sass/media.rb +23 -20
- data/lib/sass/plugin.rb +7 -7
- data/lib/sass/plugin/compiler.rb +145 -304
- data/lib/sass/plugin/configuration.rb +23 -18
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +3 -3
- data/lib/sass/repl.rb +3 -3
- data/lib/sass/script.rb +8 -35
- data/lib/sass/script/{value/arg_list.rb → arg_list.rb} +25 -9
- data/lib/sass/script/bool.rb +18 -0
- data/lib/sass/script/color.rb +606 -0
- data/lib/sass/script/css_lexer.rb +4 -8
- data/lib/sass/script/css_parser.rb +2 -5
- data/lib/sass/script/funcall.rb +245 -0
- data/lib/sass/script/functions.rb +408 -1491
- data/lib/sass/script/interpolation.rb +79 -0
- data/lib/sass/script/lexer.rb +68 -172
- data/lib/sass/script/list.rb +85 -0
- data/lib/sass/script/literal.rb +221 -0
- data/lib/sass/script/{tree/node.rb → node.rb} +12 -22
- data/lib/sass/script/{value/null.rb → null.rb} +7 -14
- data/lib/sass/script/{value/number.rb → number.rb} +75 -152
- data/lib/sass/script/{tree/operation.rb → operation.rb} +24 -17
- data/lib/sass/script/parser.rb +110 -245
- data/lib/sass/script/string.rb +51 -0
- data/lib/sass/script/{tree/string_interpolation.rb → string_interpolation.rb} +4 -5
- data/lib/sass/script/{tree/unary_operation.rb → unary_operation.rb} +6 -6
- data/lib/sass/script/variable.rb +58 -0
- data/lib/sass/scss/css_parser.rb +3 -9
- data/lib/sass/scss/parser.rb +421 -450
- data/lib/sass/scss/rx.rb +11 -19
- data/lib/sass/scss/static_parser.rb +7 -321
- data/lib/sass/selector.rb +194 -68
- data/lib/sass/selector/abstract_sequence.rb +14 -29
- data/lib/sass/selector/comma_sequence.rb +25 -108
- data/lib/sass/selector/sequence.rb +66 -159
- data/lib/sass/selector/simple.rb +25 -23
- data/lib/sass/selector/simple_sequence.rb +63 -173
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/supports.rb +15 -13
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +3 -3
- data/lib/sass/tree/css_import_node.rb +11 -11
- data/lib/sass/tree/debug_node.rb +2 -2
- data/lib/sass/tree/directive_node.rb +4 -21
- data/lib/sass/tree/each_node.rb +8 -8
- data/lib/sass/tree/extend_node.rb +7 -14
- data/lib/sass/tree/for_node.rb +4 -4
- data/lib/sass/tree/function_node.rb +4 -9
- data/lib/sass/tree/if_node.rb +1 -1
- data/lib/sass/tree/import_node.rb +5 -4
- data/lib/sass/tree/media_node.rb +14 -4
- data/lib/sass/tree/mixin_def_node.rb +4 -4
- data/lib/sass/tree/mixin_node.rb +8 -21
- data/lib/sass/tree/node.rb +12 -54
- data/lib/sass/tree/prop_node.rb +20 -39
- data/lib/sass/tree/return_node.rb +2 -3
- data/lib/sass/tree/root_node.rb +3 -19
- data/lib/sass/tree/rule_node.rb +22 -35
- data/lib/sass/tree/supports_node.rb +13 -0
- data/lib/sass/tree/trace_node.rb +1 -2
- data/lib/sass/tree/variable_node.rb +3 -9
- data/lib/sass/tree/visitors/base.rb +8 -5
- data/lib/sass/tree/visitors/check_nesting.rb +19 -49
- data/lib/sass/tree/visitors/convert.rb +56 -74
- data/lib/sass/tree/visitors/cssize.rb +74 -202
- data/lib/sass/tree/visitors/deep_copy.rb +5 -10
- data/lib/sass/tree/visitors/extend.rb +7 -7
- data/lib/sass/tree/visitors/perform.rb +185 -278
- data/lib/sass/tree/visitors/set_options.rb +6 -20
- data/lib/sass/tree/visitors/to_css.rb +81 -234
- data/lib/sass/tree/warn_node.rb +2 -2
- data/lib/sass/tree/while_node.rb +2 -2
- data/lib/sass/util.rb +152 -522
- data/lib/sass/util/multibyte_string_scanner.rb +0 -2
- data/lib/sass/util/subset_map.rb +3 -4
- data/lib/sass/util/test.rb +1 -0
- data/lib/sass/version.rb +22 -20
- data/test/Gemfile +3 -0
- data/test/Gemfile.lock +10 -0
- data/test/sass/cache_test.rb +20 -62
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/conversion_test.rb +2 -296
- data/test/sass/css2sass_test.rb +4 -23
- data/test/sass/engine_test.rb +354 -411
- data/test/sass/exec_test.rb +2 -2
- data/test/sass/extend_test.rb +145 -324
- data/test/sass/functions_test.rb +86 -873
- data/test/sass/importer_test.rb +21 -241
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/plugin_test.rb +26 -16
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +3 -3
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +7 -36
- data/test/sass/script_test.rb +53 -485
- data/test/sass/scss/css_test.rb +28 -143
- data/test/sass/scss/rx_test.rb +4 -4
- data/test/sass/scss/scss_test.rb +325 -2119
- data/test/sass/templates/scss_import.scss +1 -2
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +1 -86
- data/test/test_helper.rb +8 -37
- metadata +19 -66
- data/lib/sass/exec/base.rb +0 -187
- data/lib/sass/exec/sass_convert.rb +0 -264
- data/lib/sass/exec/sass_scss.rb +0 -424
- data/lib/sass/features.rb +0 -47
- data/lib/sass/script/tree.rb +0 -16
- data/lib/sass/script/tree/funcall.rb +0 -306
- data/lib/sass/script/tree/interpolation.rb +0 -118
- data/lib/sass/script/tree/list_literal.rb +0 -77
- data/lib/sass/script/tree/literal.rb +0 -45
- data/lib/sass/script/tree/map_literal.rb +0 -64
- data/lib/sass/script/tree/selector.rb +0 -26
- data/lib/sass/script/tree/variable.rb +0 -57
- data/lib/sass/script/value.rb +0 -11
- data/lib/sass/script/value/base.rb +0 -240
- data/lib/sass/script/value/bool.rb +0 -35
- data/lib/sass/script/value/color.rb +0 -680
- data/lib/sass/script/value/helpers.rb +0 -262
- data/lib/sass/script/value/list.rb +0 -113
- data/lib/sass/script/value/map.rb +0 -70
- data/lib/sass/script/value/string.rb +0 -97
- data/lib/sass/selector/pseudo.rb +0 -256
- data/lib/sass/source/map.rb +0 -210
- data/lib/sass/source/position.rb +0 -39
- data/lib/sass/source/range.rb +0 -41
- data/lib/sass/stack.rb +0 -120
- data/lib/sass/tree/at_root_node.rb +0 -83
- data/lib/sass/tree/error_node.rb +0 -18
- data/lib/sass/tree/keyframe_rule_node.rb +0 -15
- data/lib/sass/util/cross_platform_random.rb +0 -19
- data/lib/sass/util/normalized_map.rb +0 -130
- data/lib/sass/util/ordered_hash.rb +0 -192
- data/test/sass/compiler_test.rb +0 -232
- data/test/sass/encoding_test.rb +0 -219
- data/test/sass/source_map_test.rb +0 -977
- data/test/sass/superselector_test.rb +0 -191
- data/test/sass/util/normalized_map_test.rb +0 -51
- data/test/sass/value_helpers_test.rb +0 -179
data/lib/sass/source/position.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Sass::Source
|
2
|
-
class Position
|
3
|
-
# The one-based line of the document associated with the position.
|
4
|
-
#
|
5
|
-
# @return [Fixnum]
|
6
|
-
attr_accessor :line
|
7
|
-
|
8
|
-
# The one-based offset in the line of the document associated with the
|
9
|
-
# position.
|
10
|
-
#
|
11
|
-
# @return [Fixnum]
|
12
|
-
attr_accessor :offset
|
13
|
-
|
14
|
-
# @param line [Fixnum] The source line
|
15
|
-
# @param offset [Fixnum] The source offset
|
16
|
-
def initialize(line, offset)
|
17
|
-
@line = line
|
18
|
-
@offset = offset
|
19
|
-
end
|
20
|
-
|
21
|
-
# @return [String] A string representation of the source position.
|
22
|
-
def inspect
|
23
|
-
"#{line.inspect}:#{offset.inspect}"
|
24
|
-
end
|
25
|
-
|
26
|
-
# @param str [String] The string to move through.
|
27
|
-
# @return [Position] The source position after proceeding forward through
|
28
|
-
# `str`.
|
29
|
-
def after(str)
|
30
|
-
newlines = str.count("\n")
|
31
|
-
Position.new(line + newlines,
|
32
|
-
if newlines == 0
|
33
|
-
offset + str.length
|
34
|
-
else
|
35
|
-
str.length - str.rindex("\n") - 1
|
36
|
-
end)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/sass/source/range.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Sass::Source
|
2
|
-
class Range
|
3
|
-
# The starting position of the range in the document (inclusive).
|
4
|
-
#
|
5
|
-
# @return [Sass::Source::Position]
|
6
|
-
attr_accessor :start_pos
|
7
|
-
|
8
|
-
# The ending position of the range in the document (exclusive).
|
9
|
-
#
|
10
|
-
# @return [Sass::Source::Position]
|
11
|
-
attr_accessor :end_pos
|
12
|
-
|
13
|
-
# The file in which this source range appears. This can be nil if the file
|
14
|
-
# is unknown or not yet generated.
|
15
|
-
#
|
16
|
-
# @return [String]
|
17
|
-
attr_accessor :file
|
18
|
-
|
19
|
-
# The importer that imported the file in which this source range appears.
|
20
|
-
# This is nil for target ranges.
|
21
|
-
#
|
22
|
-
# @return [Sass::Importers::Base]
|
23
|
-
attr_accessor :importer
|
24
|
-
|
25
|
-
# @param start_pos [Sass::Source::Position] See \{#start_pos}
|
26
|
-
# @param end_pos [Sass::Source::Position] See \{#end_pos}
|
27
|
-
# @param file [String] See \{#file}
|
28
|
-
# @param importer [Sass::Importers::Base] See \{#importer}
|
29
|
-
def initialize(start_pos, end_pos, file, importer = nil)
|
30
|
-
@start_pos = start_pos
|
31
|
-
@end_pos = end_pos
|
32
|
-
@file = file
|
33
|
-
@importer = importer
|
34
|
-
end
|
35
|
-
|
36
|
-
# @return [String] A string representation of the source range.
|
37
|
-
def inspect
|
38
|
-
"(#{start_pos.inspect} to #{end_pos.inspect}#{" in #{@file}" if @file})"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/sass/stack.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
module Sass
|
2
|
-
# A class representing the stack when compiling a Sass file.
|
3
|
-
class Stack
|
4
|
-
# TODO: use this to generate stack information for Sass::SyntaxErrors.
|
5
|
-
|
6
|
-
# A single stack frame.
|
7
|
-
class Frame
|
8
|
-
# The filename of the file in which this stack frame was created.
|
9
|
-
#
|
10
|
-
# @return [String]
|
11
|
-
attr_reader :filename
|
12
|
-
|
13
|
-
# The line number on which this stack frame was created.
|
14
|
-
#
|
15
|
-
# @return [String]
|
16
|
-
attr_reader :line
|
17
|
-
|
18
|
-
# The type of this stack frame. This can be `:import`, `:mixin`, or
|
19
|
-
# `:base`.
|
20
|
-
#
|
21
|
-
# `:base` indicates that this is the bottom-most frame, meaning that it
|
22
|
-
# represents a single line of code rather than a nested context. The stack
|
23
|
-
# will only ever have one base frame, and it will always be the most
|
24
|
-
# deeply-nested frame.
|
25
|
-
#
|
26
|
-
# @return [Symbol?]
|
27
|
-
attr_reader :type
|
28
|
-
|
29
|
-
# The name of the stack frame. For mixin frames, this is the mixin name;
|
30
|
-
# otherwise, it's `nil`.
|
31
|
-
#
|
32
|
-
# @return [String?]
|
33
|
-
attr_reader :name
|
34
|
-
|
35
|
-
def initialize(filename, line, type, name = nil)
|
36
|
-
@filename = filename
|
37
|
-
@line = line
|
38
|
-
@type = type
|
39
|
-
@name = name
|
40
|
-
end
|
41
|
-
|
42
|
-
# Whether this frame represents an import.
|
43
|
-
#
|
44
|
-
# @return [Boolean]
|
45
|
-
def is_import?
|
46
|
-
type == :import
|
47
|
-
end
|
48
|
-
|
49
|
-
# Whether this frame represents a mixin.
|
50
|
-
#
|
51
|
-
# @return [Boolean]
|
52
|
-
def is_mixin?
|
53
|
-
type == :mixin
|
54
|
-
end
|
55
|
-
|
56
|
-
# Whether this is the base frame.
|
57
|
-
#
|
58
|
-
# @return [Boolean]
|
59
|
-
def is_base?
|
60
|
-
type == :base
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# The stack frames. The last frame is the most deeply-nested.
|
65
|
-
#
|
66
|
-
# @return [Array<Frame>]
|
67
|
-
attr_reader :frames
|
68
|
-
|
69
|
-
def initialize
|
70
|
-
@frames = []
|
71
|
-
end
|
72
|
-
|
73
|
-
# Pushes a base frame onto the stack.
|
74
|
-
#
|
75
|
-
# @param filename [String] See \{Frame#filename}.
|
76
|
-
# @param line [String] See \{Frame#line}.
|
77
|
-
# @yield [] A block in which the new frame is on the stack.
|
78
|
-
def with_base(filename, line)
|
79
|
-
with_frame(filename, line, :base) {yield}
|
80
|
-
end
|
81
|
-
|
82
|
-
# Pushes an import frame onto the stack.
|
83
|
-
#
|
84
|
-
# @param filename [String] See \{Frame#filename}.
|
85
|
-
# @param line [String] See \{Frame#line}.
|
86
|
-
# @yield [] A block in which the new frame is on the stack.
|
87
|
-
def with_import(filename, line)
|
88
|
-
with_frame(filename, line, :import) {yield}
|
89
|
-
end
|
90
|
-
|
91
|
-
# Pushes a mixin frame onto the stack.
|
92
|
-
#
|
93
|
-
# @param filename [String] See \{Frame#filename}.
|
94
|
-
# @param line [String] See \{Frame#line}.
|
95
|
-
# @param name [String] See \{Frame#name}.
|
96
|
-
# @yield [] A block in which the new frame is on the stack.
|
97
|
-
def with_mixin(filename, line, name)
|
98
|
-
with_frame(filename, line, :mixin, name) {yield}
|
99
|
-
end
|
100
|
-
|
101
|
-
def to_s
|
102
|
-
Sass::Util.enum_with_index(Sass::Util.enum_cons(frames.reverse + [nil], 2)).
|
103
|
-
map do |(frame, caller), i|
|
104
|
-
"#{i == 0 ? "on" : "from"} line #{frame.line}" +
|
105
|
-
" of #{frame.filename || "an unknown file"}" +
|
106
|
-
(caller && caller.name ? ", in `#{caller.name}'" : "")
|
107
|
-
end.join("\n")
|
108
|
-
end
|
109
|
-
|
110
|
-
private
|
111
|
-
|
112
|
-
def with_frame(filename, line, type, name = nil)
|
113
|
-
@frames.pop if @frames.last && @frames.last.type == :base
|
114
|
-
@frames.push(Frame.new(filename, line, type, name))
|
115
|
-
yield
|
116
|
-
ensure
|
117
|
-
@frames.pop unless type == :base && @frames.last && @frames.last.type != :base
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1,83 +0,0 @@
|
|
1
|
-
module Sass
|
2
|
-
module Tree
|
3
|
-
# A dynamic node representing an `@at-root` directive.
|
4
|
-
#
|
5
|
-
# An `@at-root` directive with a selector is converted to an \{AtRootNode}
|
6
|
-
# containing a \{RuleNode} at parse time.
|
7
|
-
#
|
8
|
-
# @see Sass::Tree
|
9
|
-
class AtRootNode < Node
|
10
|
-
# The query for this node (e.g. `(without: media)`),
|
11
|
-
# interspersed with {Sass::Script::Tree::Node}s representing
|
12
|
-
# `#{}`-interpolation. Any adjacent strings will be merged
|
13
|
-
# together.
|
14
|
-
#
|
15
|
-
# This will be nil if the directive didn't have a query. In this
|
16
|
-
# case, {#resolved\_type} will automatically be set to
|
17
|
-
# `:without` and {#resolved\_rule} will automatically be set to `["rule"]`.
|
18
|
-
#
|
19
|
-
# @return [Array<String, Sass::Script::Tree::Node>]
|
20
|
-
attr_accessor :query
|
21
|
-
|
22
|
-
# The resolved type of this directive. `:with` or `:without`.
|
23
|
-
#
|
24
|
-
# @return [Symbol]
|
25
|
-
attr_accessor :resolved_type
|
26
|
-
|
27
|
-
# The resolved value of this directive -- a list of directives
|
28
|
-
# to either include or exclude.
|
29
|
-
#
|
30
|
-
# @return [Array<String>]
|
31
|
-
attr_accessor :resolved_value
|
32
|
-
|
33
|
-
# The number of additional tabs that the contents of this node
|
34
|
-
# should be indented.
|
35
|
-
#
|
36
|
-
# @return [Number]
|
37
|
-
attr_accessor :tabs
|
38
|
-
|
39
|
-
# Whether the last child of this node should be considered the
|
40
|
-
# end of a group.
|
41
|
-
#
|
42
|
-
# @return [Boolean]
|
43
|
-
attr_accessor :group_end
|
44
|
-
|
45
|
-
def initialize(query = nil)
|
46
|
-
super()
|
47
|
-
@query = Sass::Util.strip_string_array(Sass::Util.merge_adjacent_strings(query)) if query
|
48
|
-
@tabs = 0
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns whether or not the given directive is excluded by this
|
52
|
-
# node. `directive` may be "rule", which indicates whether
|
53
|
-
# normal CSS rules should be excluded.
|
54
|
-
#
|
55
|
-
# @param directive [String]
|
56
|
-
# @return [Boolean]
|
57
|
-
def exclude?(directive)
|
58
|
-
if resolved_type == :with
|
59
|
-
return false if resolved_value.include?('all')
|
60
|
-
!resolved_value.include?(directive)
|
61
|
-
else # resolved_type == :without
|
62
|
-
return true if resolved_value.include?('all')
|
63
|
-
resolved_value.include?(directive)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Returns whether the given node is excluded by this node.
|
68
|
-
#
|
69
|
-
# @param node [Sass::Tree::Node]
|
70
|
-
# @return [Boolean]
|
71
|
-
def exclude_node?(node)
|
72
|
-
return exclude?(node.name.gsub(/^@/, '')) if node.is_a?(Sass::Tree::DirectiveNode)
|
73
|
-
return exclude?('keyframes') if node.is_a?(Sass::Tree::KeyframeRuleNode)
|
74
|
-
exclude?('rule') && node.is_a?(Sass::Tree::RuleNode)
|
75
|
-
end
|
76
|
-
|
77
|
-
# @see Node#bubbles?
|
78
|
-
def bubbles?
|
79
|
-
true
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
data/lib/sass/tree/error_node.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module Sass
|
2
|
-
module Tree
|
3
|
-
# A dynamic node representing a Sass `@error` statement.
|
4
|
-
#
|
5
|
-
# @see Sass::Tree
|
6
|
-
class ErrorNode < Node
|
7
|
-
# The expression to print.
|
8
|
-
# @return [Script::Tree::Node]
|
9
|
-
attr_accessor :expr
|
10
|
-
|
11
|
-
# @param expr [Script::Tree::Node] The expression to print
|
12
|
-
def initialize(expr)
|
13
|
-
@expr = expr
|
14
|
-
super()
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module Sass::Tree
|
2
|
-
class KeyframeRuleNode < Node
|
3
|
-
# The text of the directive after any interpolated SassScript has been resolved.
|
4
|
-
# Since this is only a static node, this is the only value property.
|
5
|
-
#
|
6
|
-
# @return [String]
|
7
|
-
attr_accessor :resolved_value
|
8
|
-
|
9
|
-
# @param resolved_value [String] See \{#resolved_value}
|
10
|
-
def initialize(resolved_value)
|
11
|
-
@resolved_value = resolved_value
|
12
|
-
super()
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Sass
|
2
|
-
module Util
|
3
|
-
# Ruby 1.8 doesn't support an actual Random class with a settable seed.
|
4
|
-
class CrossPlatformRandom
|
5
|
-
def initialize(seed = nil)
|
6
|
-
if Sass::Util.ruby1_8?
|
7
|
-
srand(seed) if seed
|
8
|
-
else
|
9
|
-
@random = seed ? ::Random.new(seed) : ::Random.new
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def rand(*args)
|
14
|
-
return @random.rand(*args) if @random
|
15
|
-
Kernel.rand(*args)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,130 +0,0 @@
|
|
1
|
-
require 'delegate'
|
2
|
-
require 'sass/util'
|
3
|
-
|
4
|
-
module Sass
|
5
|
-
module Util
|
6
|
-
# A hash that normalizes its string keys while still allowing you to get back
|
7
|
-
# to the original keys that were stored. If several different values normalize
|
8
|
-
# to the same value, whichever is stored last wins.
|
9
|
-
require 'sass/util/ordered_hash' if ruby1_8?
|
10
|
-
class NormalizedMap
|
11
|
-
# Create a normalized map
|
12
|
-
def initialize(map = nil)
|
13
|
-
@key_strings = {}
|
14
|
-
@map = Util.ruby1_8? ? OrderedHash.new : {}
|
15
|
-
|
16
|
-
map.each {|key, value| self[key] = value} if map
|
17
|
-
end
|
18
|
-
|
19
|
-
# Specifies how to transform the key.
|
20
|
-
#
|
21
|
-
# This can be overridden to create other normalization behaviors.
|
22
|
-
def normalize(key)
|
23
|
-
key.tr("-", "_")
|
24
|
-
end
|
25
|
-
|
26
|
-
# Returns the version of `key` as it was stored before
|
27
|
-
# normalization. If `key` isn't in the map, returns it as it was
|
28
|
-
# passed in.
|
29
|
-
#
|
30
|
-
# @return [String]
|
31
|
-
def denormalize(key)
|
32
|
-
@key_strings[normalize(key)] || key
|
33
|
-
end
|
34
|
-
|
35
|
-
# @private
|
36
|
-
def []=(k, v)
|
37
|
-
normalized = normalize(k)
|
38
|
-
@map[normalized] = v
|
39
|
-
@key_strings[normalized] = k
|
40
|
-
v
|
41
|
-
end
|
42
|
-
|
43
|
-
# @private
|
44
|
-
def [](k)
|
45
|
-
@map[normalize(k)]
|
46
|
-
end
|
47
|
-
|
48
|
-
# @private
|
49
|
-
def has_key?(k)
|
50
|
-
@map.has_key?(normalize(k))
|
51
|
-
end
|
52
|
-
|
53
|
-
# @private
|
54
|
-
def delete(k)
|
55
|
-
normalized = normalize(k)
|
56
|
-
@key_strings.delete(normalized)
|
57
|
-
@map.delete(normalized)
|
58
|
-
end
|
59
|
-
|
60
|
-
# @return [Hash] Hash with the keys as they were stored (before normalization).
|
61
|
-
def as_stored
|
62
|
-
Sass::Util.map_keys(@map) {|k| @key_strings[k]}
|
63
|
-
end
|
64
|
-
|
65
|
-
def empty?
|
66
|
-
@map.empty?
|
67
|
-
end
|
68
|
-
|
69
|
-
def values
|
70
|
-
@map.values
|
71
|
-
end
|
72
|
-
|
73
|
-
def keys
|
74
|
-
@map.keys
|
75
|
-
end
|
76
|
-
|
77
|
-
def each
|
78
|
-
@map.each {|k, v| yield(k, v)}
|
79
|
-
end
|
80
|
-
|
81
|
-
def size
|
82
|
-
@map.size
|
83
|
-
end
|
84
|
-
|
85
|
-
def to_hash
|
86
|
-
@map.dup
|
87
|
-
end
|
88
|
-
|
89
|
-
def to_a
|
90
|
-
@map.to_a
|
91
|
-
end
|
92
|
-
|
93
|
-
def map
|
94
|
-
@map.map {|k, v| yield(k, v)}
|
95
|
-
end
|
96
|
-
|
97
|
-
def dup
|
98
|
-
d = super
|
99
|
-
d.send(:instance_variable_set, "@map", @map.dup)
|
100
|
-
d
|
101
|
-
end
|
102
|
-
|
103
|
-
def sort_by
|
104
|
-
@map.sort_by {|k, v| yield k, v}
|
105
|
-
end
|
106
|
-
|
107
|
-
def update(map)
|
108
|
-
map = map.as_stored if map.is_a?(NormalizedMap)
|
109
|
-
map.each {|k, v| self[k] = v}
|
110
|
-
end
|
111
|
-
|
112
|
-
def method_missing(method, *args, &block)
|
113
|
-
if Sass.tests_running
|
114
|
-
raise ArgumentError.new("The method #{method} must be implemented explicitly")
|
115
|
-
end
|
116
|
-
@map.send(method, *args, &block)
|
117
|
-
end
|
118
|
-
|
119
|
-
if Sass::Util.ruby1_8?
|
120
|
-
def respond_to?(method, include_private = false)
|
121
|
-
super || @map.respond_to?(method, include_private)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def respond_to_missing?(method, include_private = false)
|
126
|
-
@map.respond_to?(method, include_private)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|