cloudhead-less 0.8.12 → 1.0.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.
- 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
|
+
}
|