forked from ku1ik/css2less
-
Notifications
You must be signed in to change notification settings - Fork 64
/
css2less.rb
52 lines (43 loc) · 1.14 KB
/
css2less.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
module Css2Less
require 'enumerator'
class Converter
def initialize(css)
@css = css
@tree = {}
end
def add_rule(tree, selectors, style)
return if style.nil? || style.empty?
if selectors.empty?
(tree[:style] ||= ';') << style
else
first, rest = selectors.first, selectors[1..-1]
node = (tree[first] ||= {})
add_rule(node, rest, style)
end
end
def generate
@css.split("\n").map { |l| l.strip }.join.gsub(/\/\*+[^\*]*\*+\//, '').split(/[\{\}]/).each_slice(2) do |style|
rules = style[0].strip
if rules.include?(',') # leave multiple rules alone
add_rule(@tree, [rules], style[1])
else
add_rule(@tree, rules.split(/\s+/), style[1])
end
end
end
def print(tree=nil, indent=0)
if tree.nil?
tree = @tree
end
tree.each do |element, children|
puts ' ' * indent + element + " {\n"
style = children.delete(:style)
if style
puts style.split(';').map { |s| s.strip }.reject { |s| s.empty? }.map { |s| ' ' * (indent+2) + s + ';' }.join("\n")
end
print(children, indent + 2)
puts ' ' * indent + "}\n"
end
end
end
end