cloudhead-less 0.8.12 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +10 -1
- data/Rakefile +21 -2
- data/VERSION +1 -1
- data/bin/lessc +0 -8
- data/less.gemspec +48 -15
- data/lib/less/command.rb +24 -25
- data/lib/less/engine/builder.rb +13 -0
- data/lib/less/engine/less.tt +379 -0
- data/lib/less/engine/nodes/element.rb +153 -0
- data/lib/less/engine/nodes/entity.rb +59 -0
- data/lib/less/engine/nodes/function.rb +61 -0
- data/lib/less/engine/nodes/literal.rb +132 -0
- data/lib/less/engine/nodes/property.rb +120 -0
- data/lib/less/engine/nodes/selector.rb +39 -0
- data/lib/less/engine/nodes.rb +8 -0
- data/lib/less/engine/parser.rb +3854 -0
- data/lib/less/engine.rb +42 -139
- data/lib/less.rb +65 -10
- data/spec/command_spec.rb +2 -6
- data/spec/css/accessors-1.0.css +20 -0
- data/spec/css/big-1.0.css +3770 -0
- data/spec/css/comments-1.0.css +11 -0
- data/spec/css/css-1.0.css +40 -0
- data/spec/css/functions-1.0.css +8 -0
- data/spec/css/import-1.0.css +13 -0
- data/spec/css/mixins-1.0.css +30 -0
- data/spec/css/operations-1.0.css +30 -0
- data/spec/css/rulesets-1.0.css +19 -0
- data/spec/css/scope-1.0.css +16 -0
- data/spec/css/strings-1.0.css +14 -0
- data/spec/css/variables-1.0.css +7 -0
- data/spec/css/whitespace-1.0.css +11 -0
- data/spec/engine_spec.rb +66 -18
- data/spec/less/accessors-1.0.less +20 -0
- data/spec/less/big-1.0.less +4810 -0
- data/spec/less/colors-1.0.less +0 -0
- data/spec/less/comments-1.0.less +46 -0
- data/spec/less/css-1.0.less +82 -0
- data/spec/less/exceptions/mixed-units-error.less +0 -0
- data/spec/less/exceptions/name-error-1.0.less +0 -0
- data/spec/less/exceptions/syntax-error-1.0.less +0 -0
- data/spec/less/functions-1.0.less +6 -0
- data/spec/less/import/import-test-a.less +2 -0
- data/spec/less/import/import-test-b.less +8 -0
- data/spec/less/import/import-test-c.less +5 -0
- data/spec/less/import-1.0.less +7 -0
- data/spec/less/mixins-1.0.less +43 -0
- data/spec/less/operations-1.0.less +39 -0
- data/spec/less/rulesets-1.0.less +30 -0
- data/spec/less/scope-1.0.less +33 -0
- data/spec/less/strings-1.0.less +14 -0
- data/spec/less/variables-1.0.less +16 -0
- data/spec/less/whitespace-1.0.less +21 -0
- data/spec/spec.css +81 -23
- data/spec/spec.less +3 -4
- data/spec/spec_helper.rb +4 -1
- metadata +46 -13
- data/lib/less/tree.rb +0 -82
- data/spec/css/less-0.8.10.css +0 -30
- data/spec/css/less-0.8.11.css +0 -31
- data/spec/css/less-0.8.12.css +0 -28
- data/spec/css/less-0.8.5.css +0 -24
- data/spec/css/less-0.8.6.css +0 -24
- data/spec/css/less-0.8.7.css +0 -24
- data/spec/css/less-0.8.8.css +0 -25
- data/spec/tree_spec.rb +0 -5
@@ -0,0 +1,40 @@
|
|
1
|
+
/* Generated with Less 1.0.0 */
|
2
|
+
|
3
|
+
div { color: black; }
|
4
|
+
div { width: 99%; }
|
5
|
+
* { min-width: 45em; }
|
6
|
+
h1 { color: none; }
|
7
|
+
h2 > a > p { color: none; }
|
8
|
+
h3 { color: none; }
|
9
|
+
div.class { color: blue; }
|
10
|
+
div#id { color: green; }
|
11
|
+
.one.two.three { color: grey; }
|
12
|
+
@media print { font-size: 3em; }
|
13
|
+
@media screen { font-size: 10px; }
|
14
|
+
@font-face {
|
15
|
+
font-family: 'Garamond Pro';
|
16
|
+
src: url("/fonts/garamond-pro.ttf");
|
17
|
+
}
|
18
|
+
a:hover { color: #999999; }
|
19
|
+
a:link { color: #999999; }
|
20
|
+
p { text-transform: none; }
|
21
|
+
p:first-child { text-transform: none; }
|
22
|
+
q:lang(no) { quotes: none; }
|
23
|
+
p + h1 { font-size: 2em; }
|
24
|
+
input[type="text"] { font-weight: normal; }
|
25
|
+
#shorthands {
|
26
|
+
border: 1px solid #000000;
|
27
|
+
font: 12px/16px Arial;
|
28
|
+
margin: 1px 0;
|
29
|
+
padding: 0 auto;
|
30
|
+
background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px;
|
31
|
+
}
|
32
|
+
#more-shorthands {
|
33
|
+
margin: 0;
|
34
|
+
padding: 1px 0 2px 0;
|
35
|
+
font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;
|
36
|
+
}
|
37
|
+
.misc {
|
38
|
+
-moz-border-radius: 2px;
|
39
|
+
color: red !important;
|
40
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/* Generated with Less 1.0.0 */
|
2
|
+
|
3
|
+
.mixin { border: 1px solid black; }
|
4
|
+
.mixout { border-color: orange; }
|
5
|
+
.borders { border-style: dashed; }
|
6
|
+
#namespace .borders { border-style: dotted; }
|
7
|
+
#namespace .biohazard { content: "death"; }
|
8
|
+
#namespace .biohazard .man { color: transparent; }
|
9
|
+
#theme > .mixin { background-color: grey; }
|
10
|
+
#container {
|
11
|
+
color: black;
|
12
|
+
border: 1px solid black;
|
13
|
+
border-color: orange;
|
14
|
+
background-color: grey;
|
15
|
+
}
|
16
|
+
#header .milk {
|
17
|
+
color: white;
|
18
|
+
border: 1px solid black;
|
19
|
+
background-color: grey;
|
20
|
+
}
|
21
|
+
#header #cookie { border-style: dashed; }
|
22
|
+
#header #cookie .chips { border-style: dotted; }
|
23
|
+
#header #cookie .chips .calories {
|
24
|
+
color: black;
|
25
|
+
border: 1px solid black;
|
26
|
+
border-color: orange;
|
27
|
+
background-color: grey;
|
28
|
+
}
|
29
|
+
.secure-zone { color: transparent; }
|
30
|
+
.direct { border-style: dotted; }
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/* Generated with Less 1.0.0 */
|
2
|
+
|
3
|
+
#operations {
|
4
|
+
color: #111111;
|
5
|
+
height: 9px;
|
6
|
+
width: 3em;
|
7
|
+
}
|
8
|
+
#operations .spacing {
|
9
|
+
height: 9px;
|
10
|
+
width: 3em;
|
11
|
+
}
|
12
|
+
.with-variables {
|
13
|
+
height: 16em;
|
14
|
+
width: 24em;
|
15
|
+
size: 1cm;
|
16
|
+
}
|
17
|
+
.negative {
|
18
|
+
height: 0px;
|
19
|
+
width: 4px;
|
20
|
+
}
|
21
|
+
.shorthands { padding: -1px 2px 0 -4px; }
|
22
|
+
.colors {
|
23
|
+
color: #123123;
|
24
|
+
border-color: #345345;
|
25
|
+
background-color: #000000;
|
26
|
+
}
|
27
|
+
.colors .other {
|
28
|
+
color: #222222;
|
29
|
+
border-color: #222222;
|
30
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/* Generated with Less 1.0.0 */
|
2
|
+
|
3
|
+
#first > .one { font-size: 2em; }
|
4
|
+
#first > .one > #second .two > #deux { width: 50%; }
|
5
|
+
#first > .one > #second .two > #deux #third { height: 100%; }
|
6
|
+
#first > .one > #second .two > #deux #third:focus { color: black; }
|
7
|
+
#first > .one > #second .two > #deux #third:focus #fifth > #sixth .seventh #eighth + #ninth { color: purple; }
|
8
|
+
#first > .one > #second .two > #deux #fourth { color: #110000; }
|
9
|
+
#first > .one > #second .two > #deux #fourth .seven { border: 1px solid black; }
|
10
|
+
#first > .one > #second .two > #deux #fourth .eight > #nine { border: 1px solid black; }
|
11
|
+
#first > .one > #second .two > #deux #fourth #ten { color: red; }
|
12
|
+
#first > .one > #second .two > #deux #five { color: #110000; }
|
13
|
+
#first > .one > #second .two > #deux #five .seven { border: 1px solid black; }
|
14
|
+
#first > .one > #second .two > #deux #five .eight > #nine { border: 1px solid black; }
|
15
|
+
#first > .one > #second .two > #deux #five #ten { color: red; }
|
16
|
+
#first > .one > #second .two > #deux #six { color: #110000; }
|
17
|
+
#first > .one > #second .two > #deux #six .seven { border: 1px solid black; }
|
18
|
+
#first > .one > #second .two > #deux #six .eight > #nine { border: 1px solid black; }
|
19
|
+
#first > .one > #second .two > #deux #six #ten { color: red; }
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/* Generated with Less 1.0.0 */
|
2
|
+
|
3
|
+
.tiny-scope {
|
4
|
+
color: none;
|
5
|
+
border-color: #989989;
|
6
|
+
}
|
7
|
+
.scope1 {
|
8
|
+
color: blue;
|
9
|
+
border-color: black;
|
10
|
+
}
|
11
|
+
.scope1 .scope2 { color: blue; }
|
12
|
+
.scope1 .scope2 .scope3 {
|
13
|
+
color: red;
|
14
|
+
border-color: black;
|
15
|
+
background-color: white;
|
16
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/* Generated with Less 1.0.0 */
|
2
|
+
|
3
|
+
#strings {
|
4
|
+
background-image: url("http://son-of-a-banana.com");
|
5
|
+
quotes: "~" "~";
|
6
|
+
content: "#*%:&^,)!.(~*})";
|
7
|
+
empty: "";
|
8
|
+
}
|
9
|
+
#comments { content: "/* hello */ // not-so-secret"; }
|
10
|
+
#single-quote {
|
11
|
+
quotes: "'" "'";
|
12
|
+
content: '""#!&""';
|
13
|
+
empty: '';
|
14
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/* Generated with Less 1.0.0 */
|
2
|
+
|
3
|
+
.whitespace { color: white; }
|
4
|
+
.whitespace { color: white; }
|
5
|
+
.whitespace { color: white; }
|
6
|
+
.whitespace { color: white; }
|
7
|
+
.whitespace { color: white; }
|
8
|
+
.white { color: white; }
|
9
|
+
.space { color: white; }
|
10
|
+
.mania { color: white; }
|
11
|
+
.no-semi-column { color: white; }
|
data/spec/engine_spec.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require 'spec/spec_helper'
|
2
2
|
|
3
3
|
module LessEngineSpecHelper
|
4
|
-
def lessify
|
5
|
-
|
4
|
+
def lessify arg
|
5
|
+
if arg.is_a? String or arg.is_a? File
|
6
|
+
return Less::Engine.new(arg).to_css
|
7
|
+
else
|
8
|
+
lessify File.new("spec/less/#{arg}-1.0.less")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def css file
|
13
|
+
File.read("spec/css/#{file}-1.0.css")
|
6
14
|
end
|
7
15
|
end
|
8
16
|
|
@@ -10,29 +18,69 @@ describe Less::Engine do
|
|
10
18
|
include LessEngineSpecHelper
|
11
19
|
|
12
20
|
describe "to_css" do
|
13
|
-
it "should
|
14
|
-
lessify(
|
21
|
+
it "should parse css" do
|
22
|
+
lessify(:css).should == css(:css)
|
15
23
|
end
|
16
|
-
|
17
|
-
it "should
|
18
|
-
lessify(
|
24
|
+
|
25
|
+
it "should parse comments" do
|
26
|
+
lessify(:comments).should == css(:comments)
|
19
27
|
end
|
20
|
-
|
21
|
-
it "should
|
22
|
-
lessify(
|
28
|
+
|
29
|
+
it "should deal with whitespace" do
|
30
|
+
lessify(:whitespace).should == css(:whitespace)
|
23
31
|
end
|
24
|
-
|
25
|
-
it "should
|
26
|
-
lessify(
|
32
|
+
|
33
|
+
it "should parse nested rules" do
|
34
|
+
lessify(:rulesets).should == css(:rulesets)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should parse variables" do
|
38
|
+
lessify(:variables).should == css(:variables)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should parse operations" do
|
42
|
+
lessify(:operations).should == css(:operations)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should manage scope" do
|
46
|
+
lessify(:scope).should == css(:scope)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should parse strings" do
|
50
|
+
lessify(:strings).should == css(:strings)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should parse accessors" do
|
54
|
+
lessify(:accessors).should == css(:accessors)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should parse mixins" do
|
58
|
+
lessify(:mixins).should == css(:mixins)
|
27
59
|
end
|
28
60
|
|
29
|
-
it "should handle
|
30
|
-
|
61
|
+
it "should handle custom functions" do
|
62
|
+
module Less::Functions
|
63
|
+
def color arg
|
64
|
+
Less::Node::Color.new("#999999") if arg == "evil red"
|
65
|
+
end
|
66
|
+
|
67
|
+
def increment a
|
68
|
+
Less::Node::Number.new(a.to_i + 1)
|
69
|
+
end
|
70
|
+
|
71
|
+
def add a, b
|
72
|
+
Less::Node::Number.new(a + b)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
lessify(:functions).should == css(:functions)
|
31
76
|
end
|
32
77
|
|
33
|
-
it "should
|
34
|
-
lessify(
|
78
|
+
it "should work with import" do
|
79
|
+
lessify(:import).should == css(:import)
|
35
80
|
end
|
81
|
+
|
82
|
+
it "should parse a big file"
|
83
|
+
it "should handle complex color operations"
|
36
84
|
end
|
37
85
|
end
|
38
86
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
.magic-box {
|
2
|
+
@trim: orange;
|
3
|
+
content: "gold";
|
4
|
+
width: 60cm;
|
5
|
+
height: 40cm;
|
6
|
+
#lock {
|
7
|
+
color: silver;
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
#accessors {
|
12
|
+
content: .magic-box['content']; // "gold"
|
13
|
+
width: .magic-box['width']; // 60cm
|
14
|
+
}
|
15
|
+
|
16
|
+
.unlock {
|
17
|
+
.magic-box;
|
18
|
+
color: #lock['color']; // silver
|
19
|
+
border-color: .magic-box[@trim]; // orange
|
20
|
+
}
|