less 1.1.9 → 1.1.10
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/VERSION +1 -1
- data/less.gemspec +2 -2
- data/lib/less/engine/nodes/element.rb +70 -58
- data/lib/less/engine/nodes/property.rb +8 -0
- data/spec/css/selectors.css +5 -0
- data/spec/css/whitespace.css +0 -5
- data/spec/less/selectors.less +9 -0
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.10
|
data/less.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{less}
|
5
|
-
s.version = "1.1.
|
5
|
+
s.version = "1.1.10"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["cloudhead"]
|
9
|
-
s.date = %q{2009-07-
|
9
|
+
s.date = %q{2009-07-31}
|
10
10
|
s.default_executable = %q{lessc}
|
11
11
|
s.description = %q{LESS is leaner CSS}
|
12
12
|
s.email = %q{self@cloudhead.net}
|
@@ -8,41 +8,41 @@ module Less
|
|
8
8
|
# TODO: Look into making @rules its own hash-like class
|
9
9
|
# TODO: Look into whether selector should be child by default
|
10
10
|
#
|
11
|
-
class Element
|
11
|
+
class Element
|
12
12
|
include Enumerable
|
13
13
|
include Entity
|
14
|
-
|
15
|
-
attr_accessor :rules, :selector, :
|
16
|
-
|
14
|
+
|
15
|
+
attr_accessor :rules, :selector, :file,
|
16
|
+
:set, :name
|
17
|
+
|
17
18
|
def initialize name = "", selector = ''
|
18
|
-
|
19
|
-
|
19
|
+
@name = name
|
20
20
|
@set = []
|
21
21
|
@rules = [] # Holds all the nodes under this element's hierarchy
|
22
22
|
@selector = Selector[selector.strip].new # descendant | child | adjacent
|
23
23
|
end
|
24
|
-
|
25
|
-
def class?;
|
26
|
-
def id?;
|
27
|
-
def universal?;
|
28
|
-
|
29
|
-
def tag?
|
24
|
+
|
25
|
+
def class?; name =~ /^\./ end
|
26
|
+
def id?; name =~ /^#/ end
|
27
|
+
def universal?; name == '*' end
|
28
|
+
|
29
|
+
def tag?
|
30
30
|
not id? || class? || universal?
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
# Top-most node?
|
34
34
|
def root?
|
35
35
|
parent.nil?
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def empty?
|
39
39
|
@rules.empty?
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def leaf?
|
43
43
|
elements.empty?
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# Group similar rulesets together
|
47
47
|
# This is horrible, horrible code,
|
48
48
|
# but it'll have to do until I find
|
@@ -51,24 +51,14 @@ module Less
|
|
51
51
|
matched = false
|
52
52
|
stack, result = elements.dup, []
|
53
53
|
return self unless elements.size > 1
|
54
|
-
|
54
|
+
|
55
55
|
elements.each do
|
56
56
|
e = stack.first
|
57
57
|
result << e unless matched
|
58
|
-
|
58
|
+
|
59
59
|
matched = stack[1..-1].each do |ee|
|
60
|
-
if e.
|
61
|
-
|
62
|
-
!e.rules.zip(ee.rules).map {|a, b|
|
63
|
-
a.to_css == b.to_css
|
64
|
-
}.include?(false)
|
65
|
-
|
66
|
-
# Add to set unless it's a duplicate
|
67
|
-
if e == ee
|
68
|
-
# Do something with dups
|
69
|
-
else
|
70
|
-
self[e].set << ee
|
71
|
-
end
|
60
|
+
if e.equiv? ee and e.elements.size == 0
|
61
|
+
self[e].set << ee
|
72
62
|
stack.shift
|
73
63
|
else
|
74
64
|
stack.shift
|
@@ -79,7 +69,7 @@ module Less
|
|
79
69
|
@rules -= (elements - result)
|
80
70
|
self
|
81
71
|
end
|
82
|
-
|
72
|
+
|
83
73
|
#
|
84
74
|
# Accessors for the different nodes in @rules
|
85
75
|
#
|
@@ -87,26 +77,47 @@ module Less
|
|
87
77
|
def properties; @rules.select {|r| r.instance_of? Property } end
|
88
78
|
def variables; @rules.select {|r| r.instance_of? Variable } end
|
89
79
|
def elements; @rules.select {|r| r.instance_of? Element } end
|
90
|
-
|
80
|
+
|
91
81
|
# Select a child element
|
92
82
|
# TODO: Implement full selector syntax & merge with descend()
|
93
83
|
def [] key
|
94
|
-
|
84
|
+
case key
|
85
|
+
when Entity
|
86
|
+
@rules.find {|i| i.eql? key }
|
87
|
+
when ::String
|
88
|
+
@rules.find {|i| i.to_s == key }
|
89
|
+
else raise ArgumentError
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def == other
|
94
|
+
name == other.name
|
95
|
+
end
|
96
|
+
|
97
|
+
def eql? other
|
98
|
+
super and self.equiv? other
|
95
99
|
end
|
96
|
-
|
100
|
+
|
101
|
+
def equiv? other
|
102
|
+
rules.size == other.rules.size and
|
103
|
+
!rules.zip(other.rules).map do |a, b|
|
104
|
+
a.to_css == b.to_css
|
105
|
+
end.include?(false)
|
106
|
+
end
|
107
|
+
|
97
108
|
# Same as above, except with a specific selector
|
98
109
|
# TODO: clean this up or implement it differently
|
99
110
|
def descend selector, element
|
100
111
|
if selector.is_a? Child
|
101
|
-
s = self[element].selector
|
102
|
-
self[element] if s.is_a? Child or s.is_a? Descendant
|
112
|
+
s = self[element.name].selector
|
113
|
+
self[element.name] if s.is_a? Child or s.is_a? Descendant
|
103
114
|
elsif selector.is_a? Descendant
|
104
|
-
self[element]
|
115
|
+
self[element.name]
|
105
116
|
else
|
106
|
-
self[element] if self[element].selector.class == selector.class
|
117
|
+
self[element.name] if self[element.name].selector.class == selector.class
|
107
118
|
end
|
108
119
|
end
|
109
|
-
|
120
|
+
|
110
121
|
#
|
111
122
|
# Add an arbitrary node to this element
|
112
123
|
#
|
@@ -118,33 +129,34 @@ module Less
|
|
118
129
|
raise ArgumentError, "argument can't be a #{obj.class}"
|
119
130
|
end
|
120
131
|
end
|
121
|
-
|
132
|
+
|
122
133
|
def last; elements.last end
|
123
134
|
def first; elements.first end
|
124
|
-
def to_s; root?? '*' :
|
125
|
-
|
135
|
+
def to_s; root?? '*' : name end
|
136
|
+
|
126
137
|
#
|
127
138
|
# Entry point for the css conversion
|
128
139
|
#
|
129
140
|
def to_css path = []
|
130
|
-
path << @selector.to_css <<
|
141
|
+
path << @selector.to_css << name unless root?
|
131
142
|
|
132
143
|
content = properties.map do |i|
|
133
144
|
' ' * 2 + i.to_css
|
134
145
|
end.compact.reject(&:empty?) * "\n"
|
135
|
-
|
136
|
-
content = content.include?("\n") ?
|
146
|
+
|
147
|
+
content = content.include?("\n") ?
|
137
148
|
"\n#{content}\n" : " #{content.strip} "
|
138
|
-
ruleset = !content.strip.empty??
|
139
|
-
"#{[path.reject(&:empty?).join.strip,
|
140
|
-
|
149
|
+
ruleset = !content.strip.empty??
|
150
|
+
"#{[path.reject(&:empty?).join.strip,
|
151
|
+
*@set.map(&:name)].uniq * ', '} {#{content}}\n" : ""
|
152
|
+
|
141
153
|
css = ruleset + elements.map do |i|
|
142
154
|
i.to_css(path)
|
143
|
-
end.reject(&:empty?).join
|
155
|
+
end.reject(&:empty?).join
|
144
156
|
path.pop; path.pop
|
145
157
|
css
|
146
158
|
end
|
147
|
-
|
159
|
+
|
148
160
|
#
|
149
161
|
# Find the nearest variable in the hierarchy or raise a NameError
|
150
162
|
#
|
@@ -156,26 +168,26 @@ module Less
|
|
156
168
|
raise VariableNameError, ident unless result
|
157
169
|
end
|
158
170
|
end
|
159
|
-
|
171
|
+
|
160
172
|
#
|
161
173
|
# Traverse the whole tree, returning each leaf (recursive)
|
162
174
|
#
|
163
175
|
def each path = [], &blk
|
164
|
-
elements.each do |element|
|
165
|
-
path << element
|
166
|
-
yield element, path if element.leaf?
|
167
|
-
element.each path, &blk
|
168
|
-
path.pop
|
176
|
+
elements.each do |element|
|
177
|
+
path << element
|
178
|
+
yield element, path if element.leaf?
|
179
|
+
element.each path, &blk
|
180
|
+
path.pop
|
169
181
|
end
|
170
182
|
self
|
171
183
|
end
|
172
|
-
|
184
|
+
|
173
185
|
def inspect depth = 0
|
174
186
|
indent = lambda {|i| '. ' * i }
|
175
187
|
put = lambda {|ary| ary.map {|i| indent[ depth + 1 ] + i.inspect } * "\n"}
|
176
188
|
|
177
189
|
(root?? "\n" : "") + [
|
178
|
-
indent[ depth ] +
|
190
|
+
indent[ depth ] + self.to_s,
|
179
191
|
put[ properties ],
|
180
192
|
put[ variables ],
|
181
193
|
elements.map {|i| i.inspect( depth + 1 ) } * "\n"
|
@@ -32,6 +32,14 @@ module Less
|
|
32
32
|
def inspect
|
33
33
|
self + (empty?? "" : ": `#{value.map {|i| i.to_s } * ' | '}`")
|
34
34
|
end
|
35
|
+
|
36
|
+
def == other
|
37
|
+
self.to_s == other.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def eql? other
|
41
|
+
self == other and value.eql? other.value
|
42
|
+
end
|
35
43
|
|
36
44
|
def to_s
|
37
45
|
super
|
data/spec/css/selectors.css
CHANGED
data/spec/css/whitespace.css
CHANGED
@@ -1,9 +1,4 @@
|
|
1
1
|
.whitespace, .white, .space, .mania, .no-semi-column { color: white; }
|
2
|
-
.whitespace { color: white; }
|
3
|
-
.whitespace { color: white; }
|
4
|
-
.whitespace { color: white; }
|
5
|
-
.whitespace { color: white; }
|
6
|
-
.no-semi-column { color: white; }
|
7
2
|
.no-semi-column {
|
8
3
|
color: white;
|
9
4
|
white-space: pre;
|
data/spec/less/selectors.less
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: less
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cloudhead
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-31 00:00:00 -04:00
|
13
13
|
default_executable: lessc
|
14
14
|
dependencies: []
|
15
15
|
|