class Css2Less::Converter
Public Class Methods
new(css=nil)
click to toggle source
# File lib/css2less.rb, line 24 def initialize(css=nil) if not css.nil? @css = css end @tree = {} @less = '' end
Public Instance Methods
get_less()
click to toggle source
# File lib/css2less.rb, line 45 def get_less return @less end
process_less()
click to toggle source
# File lib/css2less.rb, line 32 def process_less cleanup if @css.nil? return false end if @css.empty? return false end generate_tree render_less return true end
set_css(css)
click to toggle source
# File lib/css2less.rb, line 49 def set_css(css) @css = css end
Private Instance Methods
add_rule(tree, selectors, style)
click to toggle source
# File lib/css2less.rb, line 60 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
cleanup()
click to toggle source
# File lib/css2less.rb, line 55 def cleanup @tree = {} @less = '' end
generate_tree()
click to toggle source
# File lib/css2less.rb, line 71 def generate_tree @css.split("\n").map { |l| l.strip }.join.gsub(/\/\*+[^\*]*\*+\//, '').split(/[\{\}]/).each_slice(2) do |style| rules = style[0].strip # handle child selector case - step1 if rules.include?('>') rules = rules.gsub(/\s*>\s*/, ' &>') end if rules.include?("@import") import_rule = rules.match(/@import.*;/)[0] rules = rules.gsub(/@import.*;/, '') add_rule(@tree, [], import_rule) end # leave multiple rules alone if rules.include?(',') add_rule(@tree, [rules], style[1]) else rules_split = rules.split(/\s+/) # handle child selector case - step2 rules_split.map! {|rule| rule.gsub('&>', '& > ')} add_rule(@tree, rules_split, style[1]) end end end
render_less(tree=nil, indent=0)
click to toggle source
# File lib/css2less.rb, line 95 def render_less(tree=nil, indent=0) if tree.nil? tree = @tree end tree.each do |element, children| if element == :style @less = @less + children.split(';').map { |s| s.strip }.reject { |s| s.empty? }.map { |s| s + ";" }.join("\n") + "\n" else @less = @less + ' ' * indent + element + " {\n" style = children.delete(:style) if style @less = @less + style.split(';').map { |s| s.strip }.reject { |s| s.empty? }.map { |s| ' ' * (indent+4) + s + ";" }.join("\n") + "\n" end render_less(children, indent + 4) @less = @less + ' ' * indent + "}\n" end end end