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.
Files changed (66) hide show
  1. data/README.md +10 -1
  2. data/Rakefile +21 -2
  3. data/VERSION +1 -1
  4. data/bin/lessc +0 -8
  5. data/less.gemspec +48 -15
  6. data/lib/less/command.rb +24 -25
  7. data/lib/less/engine/builder.rb +13 -0
  8. data/lib/less/engine/less.tt +379 -0
  9. data/lib/less/engine/nodes/element.rb +153 -0
  10. data/lib/less/engine/nodes/entity.rb +59 -0
  11. data/lib/less/engine/nodes/function.rb +61 -0
  12. data/lib/less/engine/nodes/literal.rb +132 -0
  13. data/lib/less/engine/nodes/property.rb +120 -0
  14. data/lib/less/engine/nodes/selector.rb +39 -0
  15. data/lib/less/engine/nodes.rb +8 -0
  16. data/lib/less/engine/parser.rb +3854 -0
  17. data/lib/less/engine.rb +42 -139
  18. data/lib/less.rb +65 -10
  19. data/spec/command_spec.rb +2 -6
  20. data/spec/css/accessors-1.0.css +20 -0
  21. data/spec/css/big-1.0.css +3770 -0
  22. data/spec/css/comments-1.0.css +11 -0
  23. data/spec/css/css-1.0.css +40 -0
  24. data/spec/css/functions-1.0.css +8 -0
  25. data/spec/css/import-1.0.css +13 -0
  26. data/spec/css/mixins-1.0.css +30 -0
  27. data/spec/css/operations-1.0.css +30 -0
  28. data/spec/css/rulesets-1.0.css +19 -0
  29. data/spec/css/scope-1.0.css +16 -0
  30. data/spec/css/strings-1.0.css +14 -0
  31. data/spec/css/variables-1.0.css +7 -0
  32. data/spec/css/whitespace-1.0.css +11 -0
  33. data/spec/engine_spec.rb +66 -18
  34. data/spec/less/accessors-1.0.less +20 -0
  35. data/spec/less/big-1.0.less +4810 -0
  36. data/spec/less/colors-1.0.less +0 -0
  37. data/spec/less/comments-1.0.less +46 -0
  38. data/spec/less/css-1.0.less +82 -0
  39. data/spec/less/exceptions/mixed-units-error.less +0 -0
  40. data/spec/less/exceptions/name-error-1.0.less +0 -0
  41. data/spec/less/exceptions/syntax-error-1.0.less +0 -0
  42. data/spec/less/functions-1.0.less +6 -0
  43. data/spec/less/import/import-test-a.less +2 -0
  44. data/spec/less/import/import-test-b.less +8 -0
  45. data/spec/less/import/import-test-c.less +5 -0
  46. data/spec/less/import-1.0.less +7 -0
  47. data/spec/less/mixins-1.0.less +43 -0
  48. data/spec/less/operations-1.0.less +39 -0
  49. data/spec/less/rulesets-1.0.less +30 -0
  50. data/spec/less/scope-1.0.less +33 -0
  51. data/spec/less/strings-1.0.less +14 -0
  52. data/spec/less/variables-1.0.less +16 -0
  53. data/spec/less/whitespace-1.0.less +21 -0
  54. data/spec/spec.css +81 -23
  55. data/spec/spec.less +3 -4
  56. data/spec/spec_helper.rb +4 -1
  57. metadata +46 -13
  58. data/lib/less/tree.rb +0 -82
  59. data/spec/css/less-0.8.10.css +0 -30
  60. data/spec/css/less-0.8.11.css +0 -31
  61. data/spec/css/less-0.8.12.css +0 -28
  62. data/spec/css/less-0.8.5.css +0 -24
  63. data/spec/css/less-0.8.6.css +0 -24
  64. data/spec/css/less-0.8.7.css +0 -24
  65. data/spec/css/less-0.8.8.css +0 -25
  66. data/spec/tree_spec.rb +0 -5
File without changes
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Comment Test
3
+ *
4
+ * - cloudhead (http://cloudhead.net)
5
+ *
6
+ */
7
+
8
+ ////////////////
9
+ @var: "content";
10
+ ////////////////
11
+
12
+ /* Colors
13
+ * ------
14
+ * #EDF8FC (background blue)
15
+ * #166C89 (darkest blue)
16
+ *
17
+ * Text:
18
+ * #333 (standard text) // A comment within a comment!
19
+ * #1F9EC9 (standard link)
20
+ *
21
+ */
22
+
23
+ /* @group Variables
24
+ ------------------- */
25
+ #comments {
26
+ /**/ // An empty comment
27
+ color: red; /* A C-style comment */
28
+ background-color: orange; // A little comment
29
+ font-size: 12px;
30
+
31
+ /* lost comment */ content: @var;
32
+
33
+ border: 1px solid black;
34
+
35
+ // padding & margin //
36
+ padding: 0;
37
+ margin: 2em;
38
+ } //
39
+
40
+ /* commented out
41
+ #more-comments {
42
+ color: grey;
43
+ }
44
+ */
45
+
46
+ //
@@ -0,0 +1,82 @@
1
+ /*
2
+
3
+ a CSS File
4
+
5
+ */
6
+
7
+ div { color: black; }
8
+ div { width: 99%; }
9
+
10
+ * {
11
+ min-width: 45em;
12
+ }
13
+
14
+ h1, h2 > a > p, h3 {
15
+ color: none;
16
+ }
17
+
18
+ div.class {
19
+ color: blue;
20
+ }
21
+
22
+ div#id {
23
+ color: green;
24
+ }
25
+
26
+ .one.two.three {
27
+ color: grey;
28
+ }
29
+
30
+ @media print {
31
+ font-size: 3em;
32
+ }
33
+
34
+ @media screen {
35
+ font-size: 10px;
36
+ }
37
+
38
+ @font-face {
39
+ font-family: 'Garamond Pro';
40
+ src: url("/fonts/garamond-pro.ttf");
41
+ }
42
+
43
+ a:hover, a:link {
44
+ color: #999;
45
+ }
46
+
47
+ p, p:first-child {
48
+ text-transform: none;
49
+ }
50
+
51
+ q:lang(no) {
52
+ quotes: none;
53
+ }
54
+
55
+ p + h1 {
56
+ font-size: 2em;
57
+ }
58
+
59
+ input[type="text"] {
60
+ font-weight: normal;
61
+ }
62
+
63
+ #shorthands {
64
+ border: 1px solid #000;
65
+ font: 12px/16px Arial;
66
+ margin: 1px 0;
67
+ padding: 0 auto;
68
+ background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px;
69
+ }
70
+
71
+ #more-shorthands {
72
+ margin: 0;
73
+ padding: 1px 0 2px 0;
74
+ font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;
75
+ }
76
+
77
+ .misc {
78
+ -moz-border-radius: 2px;
79
+ color: red !important;
80
+ margin: ;
81
+ }
82
+
File without changes
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+ #functions {
2
+ color: color("evil red"); // #999999
3
+ width: increment(15);
4
+ height: undefined("self");
5
+ border-width: add(2, 3);
6
+ }
@@ -0,0 +1,2 @@
1
+ @import "import-test-b.less";
2
+ @a: 20%;
@@ -0,0 +1,8 @@
1
+ @import "import-test-c";
2
+
3
+ @b: 100%;
4
+
5
+ .mixin {
6
+ height: 10px;
7
+ color: @c;
8
+ }
@@ -0,0 +1,5 @@
1
+ @c: red;
2
+
3
+ #import {
4
+ color: @c;
5
+ }
@@ -0,0 +1,7 @@
1
+ @import url("import/import-test-a.less");
2
+
3
+ #import-test {
4
+ .mixin;
5
+ width: 10px;
6
+ height: @a + 10%;
7
+ }
@@ -0,0 +1,43 @@
1
+ .mixin { border: 1px solid black; }
2
+ .mixout { border-color: orange; }
3
+ .borders { border-style: dashed; }
4
+
5
+ #namespace {
6
+ .borders {
7
+ border-style: dotted;
8
+ }
9
+ .biohazard {
10
+ content: "death";
11
+ .man {
12
+ color: transparent;
13
+ }
14
+ }
15
+ }
16
+ #theme > .mixin {
17
+ background-color: grey;
18
+ }
19
+ #container {
20
+ color: black;
21
+ .mixin, .mixout;
22
+ #theme > .mixin;
23
+ }
24
+
25
+ #header {
26
+ .milk {
27
+ color: white;
28
+ .mixin, #theme > .mixin;
29
+ }
30
+ #cookie {
31
+ .chips {
32
+ #namespace .borders;
33
+ .calories {
34
+ #container;
35
+ }
36
+ }
37
+ .borders;
38
+ }
39
+ }
40
+ .secure-zone { #namespace .biohazard .man; }
41
+ .direct {
42
+ #namespace > .borders;
43
+ }
@@ -0,0 +1,39 @@
1
+ #operations {
2
+ color: #110000 + #000011 + #001100; // #111111
3
+ height: 10px / 2px + 6px - 1px * 2; // 9px
4
+ width: 2 * 4 - 5em; // 3em
5
+ .spacing {
6
+ height: 10px / 2px+6px-1px*2;
7
+ width: 2 * 4-5em;
8
+ }
9
+ }
10
+
11
+ @x: 4;
12
+ @y: 12em;
13
+
14
+ .with-variables {
15
+ height: @x + @y; // 16em
16
+ width: 12 + @y; // 24em
17
+ size: 5cm - @x; // 1cm
18
+ }
19
+
20
+ @z: -2;
21
+
22
+ .negative {
23
+ height: 2px + @z; // 0px
24
+ width: 2px - @z; // 4px
25
+ }
26
+
27
+ .shorthands {
28
+ padding: -1px 2px 0 -4px; //
29
+ }
30
+
31
+ .colors {
32
+ color: #123; // #123123
33
+ border-color: #234 + #111111; // #345345
34
+ background-color: #222222 - #fff; // #000000
35
+ .other {
36
+ color: 2 * #111; // #222222
37
+ border-color: #333333 / 3 + #111; // #222222
38
+ }
39
+ }
@@ -0,0 +1,30 @@
1
+ #first > .one {
2
+ > #second .two > #deux {
3
+ width: 50%;
4
+ #third {
5
+ :focus {
6
+ color: black;
7
+ #fifth {
8
+ > #sixth {
9
+ .seventh #eighth {
10
+ + #ninth {
11
+ color: purple;
12
+ }
13
+ }
14
+ }
15
+ }
16
+ }
17
+ height: 100%;
18
+ }
19
+ #fourth, #five, #six {
20
+ color: #110000;
21
+ .seven, .eight > #nine {
22
+ border: 1px solid black;
23
+ }
24
+ #ten {
25
+ color: red;
26
+ }
27
+ }
28
+ }
29
+ font-size: 2em;
30
+ }
@@ -0,0 +1,33 @@
1
+ @x: blue;
2
+ @z: transparent;
3
+ @mix: none;
4
+
5
+ .mixin {
6
+ @mix: #989;
7
+ }
8
+
9
+ .tiny-scope {
10
+ color: @mix; // none
11
+ .mixin;
12
+ border-color: @mix; // #989
13
+ }
14
+
15
+ .scope1 {
16
+ @y: orange;
17
+ @z: black;
18
+ color: @x; // blue
19
+ border-color: @z; // black
20
+ .hidden {
21
+ @x: #131313;
22
+ }
23
+ .scope2 {
24
+ @y: red;
25
+ color: @x; // blue
26
+ .scope3 {
27
+ @local: white;
28
+ color: @y; // red
29
+ border-color: @z; // black
30
+ background-color: @local; // white
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,14 @@
1
+ #strings {
2
+ background-image: url("http://son-of-a-banana.com");
3
+ quotes: "~" "~";
4
+ content: "#*%:&^,)!.(~*})";
5
+ empty: "";
6
+ }
7
+ #comments {
8
+ content: "/* hello */ // not-so-secret";
9
+ }
10
+ #single-quote {
11
+ quotes: "'" "'";
12
+ content: '""#!&""';
13
+ empty: '';
14
+ }
@@ -0,0 +1,16 @@
1
+ @a: 2;
2
+ @x: @a * @a;
3
+ @y: @x + 1;
4
+ @z: @x * 2 + @y;
5
+
6
+ .variables {
7
+ width: @z + 1cm; // 14cm
8
+ }
9
+
10
+ @b: @a * 10;
11
+ @c: #888;
12
+
13
+ .variables {
14
+ height: @b + @x + 0px; // 24px
15
+ color: @c;
16
+ }
@@ -0,0 +1,21 @@
1
+ .whitespace
2
+ { color: white; }
3
+ .whitespace
4
+ {
5
+ color: white;
6
+ }
7
+ .whitespace
8
+ { color: white; }
9
+
10
+ .whitespace{color:white;}
11
+ .whitespace { color : white ; }
12
+
13
+ .white,
14
+ .space,
15
+ .mania
16
+ { color: white; }
17
+
18
+ .no-semi-column { color: white }
19
+ .empty {
20
+
21
+ }
data/spec/spec.css CHANGED
@@ -1,28 +1,86 @@
1
- .theme { color: #ccc; background-color: #aaa; }
2
- .extra > .dark-borders { border-color: #444444; }
3
- .extra > .light-borders { border-color: #888; }
4
- body, div > p a, h2 a > span:first-child { font-family: sans-serif; }
5
- .root > a { color: blue; display: none; }
6
- .root > a:hover, a:focus { color: orange; }
7
- .root > .first { color: green; }
8
- .root > .first > .second > .third { background-color: blue; font-size: 8px; color: red; border-color: red; }
1
+ /* Generated with Less 1.0.0 */
2
+
3
+ .theme {
4
+ color: #cccccc;
5
+ background-color: #aaaaaa;
6
+ }
7
+ .extra .dark-borders { border-color: #444444; }
8
+ .extra .light-borders { border-color: #888888; }
9
+ body { font-family: sans-serif; }
10
+ div > p a { font-family: sans-serif; }
11
+ h2 a > span:first-child { font-family: sans-serif; }
12
+ .root a {
13
+ color: blue;
14
+ display: none;
15
+ }
16
+ .root a:hover { color: orange; }
17
+ .root a:focus { color: orange; }
18
+ .root .first { color: green; }
19
+ .root .first .second .third {
20
+ background-color: blue;
21
+ font-size: 8px;
22
+ color: red;
23
+ border-color: red;
24
+ }
9
25
  .root:hover a { display: block; }
10
- body { font-size: 10px; font-family: 'Lucida Grande', 'Helvetica', Verdana, sans-serif; margin: -5px 0 5px 10px; border: solid 1px #000; text-shadow: #333 -1px 1px 2px; -moz-border-radius: 3px; color: #ccc; background-color: #aaa; }
11
- #operations { font: 12px/16px; width: 110px; font-size: 66; color: #eeeeee; colorb: #333333; colorc: #777777; }
12
- #operations > div { width: 80px; }
13
- td, tr, table { border-width: 88px; }
14
- blockquote:before, blockquote:after, q:before, q:after { content: ''; }
15
- a:link, a:hover { color: brown; }
16
- div > a, a span { color: grey; }
26
+ body {
27
+ font-size: 10px;
28
+ font-family: "Lucida Grande", 'Helvetica', Verdana, sans-serif;
29
+ margin: -5px 0 5px 10px;
30
+ border: solid 1px #000000;
31
+ text-shadow: #333333 -1px 1px 2px;
32
+ -moz-border-radius: 3px;
33
+ color: #cccccc;
34
+ background-color: #aaaaaa;
35
+ }
36
+ #operations {
37
+ font: 12px/16px;
38
+ width: 110px;
39
+ font-size: 66;
40
+ color: #eeeeee;
41
+ colorb: #333333;
42
+ colorc: #777777;
43
+ }
44
+ #operations div { width: 80px; }
45
+ td { border-width: 88px; }
46
+ tr { border-width: 88px; }
47
+ table { border-width: 88px; }
48
+ blockquote:before { content: ""; }
49
+ blockquote:after { content: ""; }
50
+ q:before { content: ""; }
51
+ q:after { content: ""; }
52
+ a:link { color: brown; }
53
+ a:hover { color: brown; }
54
+ div > a { color: grey; }
55
+ a span { color: grey; }
17
56
  ul li:first-child { border-top: none; }
18
- ul li:first-child, ul li:last-child { background-color: #333; }
57
+ ul li:first-child { background-color: #333333; }
58
+ ul li:last-child { background-color: #333333; }
19
59
  .p:first-letter { color: red; }
20
- h5:focus { outline: 0; content: '*}#f~ '; }
21
- q:lang(no) { quotes: '~' '~'; }
60
+ h5:focus {
61
+ outline: 0;
62
+ content: "*}#f~ ";
63
+ }
64
+ q:lang(no) { quotes: "~" "~"; }
22
65
  blockquote:before { color: red; }
66
+ div { width: 9px; }
23
67
  div { color: purple; }
24
- .duplicate { width: 11px; color: blue; }
25
- input[type='text'] { background-color: blue; }
26
- .transparent_box { background-color: #FFF; filter: alpha(opacity=60); opacity: 0.6; }
27
- .space { color: purple; font-color: yellow; }
28
- .no-semi-column { color: orange; }
68
+ .duplicate {
69
+ width: 9px;
70
+ height: 11px;
71
+ }
72
+ .duplicate {
73
+ width: 11px;
74
+ color: blue;
75
+ }
76
+ .loading { background: "http://"; }
77
+ input[type="text"] { background-color: blue; }
78
+ .transparent_box {
79
+ background-color: #ffffff;
80
+ opacity: 0.6;
81
+ }
82
+ .space {
83
+ color: purple;
84
+ font-color: yellow;
85
+ }
86
+ .no-semi-column { color: orange; }
data/spec/spec.less CHANGED
@@ -131,14 +131,13 @@ div {
131
131
  width: 11px;
132
132
  color: blue;
133
133
  }
134
-
134
+ .loading { background: "http://"; }
135
135
  input[type="text"] {
136
136
  background-color: blue;
137
137
  }
138
138
  .transparent_box {
139
- background-color:#FFF;
140
- filter:alpha(opacity=60); /* for IE */
141
- opacity:0.6; /* CSS3 standard */
139
+ background-color: #FFF;
140
+ opacity: 0.6; /* CSS3 standard */
142
141
  }
143
142
 
144
143
  // Spacing
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'spec'
3
3
 
4
- require File.dirname(__FILE__) + '/../lib/less'
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+
7
+ require 'less'
5
8
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudhead-less
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.12
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - cloudhead
@@ -9,12 +9,12 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-21 00:00:00 -07:00
12
+ date: 2009-07-08 00:00:00 -07:00
13
13
  default_executable: lessc
14
14
  dependencies: []
15
15
 
16
16
  description: LESS is leaner CSS
17
- email: alexis@cloudhead.net
17
+ email: self@cloudhead.net
18
18
  executables:
19
19
  - lessc
20
20
  extensions: []
@@ -33,20 +33,54 @@ files:
33
33
  - lib/less.rb
34
34
  - lib/less/command.rb
35
35
  - lib/less/engine.rb
36
- - lib/less/tree.rb
36
+ - lib/less/engine/builder.rb
37
+ - lib/less/engine/less.tt
38
+ - lib/less/engine/nodes.rb
39
+ - lib/less/engine/nodes/element.rb
40
+ - lib/less/engine/nodes/entity.rb
41
+ - lib/less/engine/nodes/function.rb
42
+ - lib/less/engine/nodes/literal.rb
43
+ - lib/less/engine/nodes/property.rb
44
+ - lib/less/engine/nodes/selector.rb
45
+ - lib/less/engine/parser.rb
37
46
  - spec/command_spec.rb
38
- - spec/css/less-0.8.10.css
39
- - spec/css/less-0.8.11.css
40
- - spec/css/less-0.8.12.css
41
- - spec/css/less-0.8.5.css
42
- - spec/css/less-0.8.6.css
43
- - spec/css/less-0.8.7.css
44
- - spec/css/less-0.8.8.css
47
+ - spec/css/accessors-1.0.css
48
+ - spec/css/big-1.0.css
49
+ - spec/css/comments-1.0.css
50
+ - spec/css/css-1.0.css
51
+ - spec/css/functions-1.0.css
52
+ - spec/css/import-1.0.css
53
+ - spec/css/mixins-1.0.css
54
+ - spec/css/operations-1.0.css
55
+ - spec/css/rulesets-1.0.css
56
+ - spec/css/scope-1.0.css
57
+ - spec/css/strings-1.0.css
58
+ - spec/css/variables-1.0.css
59
+ - spec/css/whitespace-1.0.css
45
60
  - spec/engine_spec.rb
61
+ - spec/less/accessors-1.0.less
62
+ - spec/less/big-1.0.less
63
+ - spec/less/colors-1.0.less
64
+ - spec/less/comments-1.0.less
65
+ - spec/less/css-1.0.less
66
+ - spec/less/exceptions/mixed-units-error.less
67
+ - spec/less/exceptions/name-error-1.0.less
68
+ - spec/less/exceptions/syntax-error-1.0.less
69
+ - spec/less/functions-1.0.less
70
+ - spec/less/import-1.0.less
71
+ - spec/less/import/import-test-a.less
72
+ - spec/less/import/import-test-b.less
73
+ - spec/less/import/import-test-c.less
74
+ - spec/less/mixins-1.0.less
75
+ - spec/less/operations-1.0.less
76
+ - spec/less/rulesets-1.0.less
77
+ - spec/less/scope-1.0.less
78
+ - spec/less/strings-1.0.less
79
+ - spec/less/variables-1.0.less
80
+ - spec/less/whitespace-1.0.less
46
81
  - spec/spec.css
47
82
  - spec/spec.less
48
83
  - spec/spec_helper.rb
49
- - spec/tree_spec.rb
50
84
  has_rdoc: true
51
85
  homepage: http://www.lesscss.org
52
86
  post_install_message:
@@ -77,4 +111,3 @@ test_files:
77
111
  - spec/command_spec.rb
78
112
  - spec/engine_spec.rb
79
113
  - spec/spec_helper.rb
80
- - spec/tree_spec.rb
data/lib/less/tree.rb DELETED
@@ -1,82 +0,0 @@
1
- module Less
2
- class Tree < Hash
3
- def initialize init = {}
4
- self.replace init
5
- end
6
-
7
- def var k
8
- self[:variables] ? self[:variables][ k ] : nil
9
- end
10
-
11
- def vars?
12
- self.include? :variables
13
- end
14
-
15
- def vars
16
- self[:variables] ? self[:variables] : nil
17
- end
18
-
19
- #
20
- # Find a variable or mixin from a specific path
21
- #
22
- def find what = :var, path = []
23
- path.inject(self) do |branch, k|
24
- if what == :var && k == path.last
25
- branch[:variables][ k ]
26
- else
27
- branch = branch[ k ] or raise PathError, path.join(' > ')
28
- end
29
- end
30
- end
31
-
32
- #
33
- # Find the nearest variable in the hierarchy
34
- #
35
- def nearest var, path
36
- values = []
37
- path.inject(self) do |branch, k|
38
- values << branch.var( var )
39
- branch[ k ]
40
- end
41
- values.compact.last
42
- end
43
-
44
- def traverse by = :leaf, path = [], &blk
45
- #
46
- # Traverse the whole tree, returning each leaf or branch (recursive)
47
- #
48
- ###
49
- # Aside from the key & value, we yield the full path of the leaf,
50
- # aswell as the branch which contains it (self).
51
- # Note that in :branch mode, we only return 'twigs', branches which contain leaves.
52
- #
53
- self.each do |key, value| # `self` is the current node, starting with the trunk
54
- if value.is_a? Hash and key != :variables # If the node is a branch, we can go deeper
55
- path << key # Add the current branch to the path
56
- yield path, self[ key ] if by == :branch # The node is a branch, yield it to the block
57
- self[ key ] = value.to_tree. # Make sure any change is saved to the main tree
58
- traverse by, path, &blk # Recurse, with the current node becoming `self`
59
- path.pop # We're returning from a branch, pop the last path element
60
- elsif by == :leaf and key.is_a? String
61
- yield key, value, path, self # The node is a leaf, yield it to the block
62
- else
63
- next
64
- end
65
- end
66
- self
67
- end
68
-
69
- #
70
- # Convert the tree to css, using full paths
71
- #
72
- def to_css chain, css = []
73
- self.traverse :branch do |path, node|
74
- properties = node.inject("") do |s, (k, v)|
75
- v.is_a?(String) ? (s + "#{k}: #{CGI.unescape(v)}; ") : s # Add the property to the list
76
- end
77
- css << path * ( chain == :desc ? ' ' : ' > ') + " { " + properties + "}" unless properties.empty? # Add the rule-set to the CSS
78
- end
79
- css.join "\n"
80
- end
81
- end
82
- end