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