Skip to content

Instantly share code, notes, and snippets.

@corysimmons
Forked from andreypopp/sass2stylus.rb
Created January 19, 2014 03:59
Show Gist options
  • Save corysimmons/8500338 to your computer and use it in GitHub Desktop.
Save corysimmons/8500338 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# Convert SASS/SCSS to Stylus
require 'sass'
class ToStylus < Sass::Tree::Visitors::Base
def visit(node)
method = "visit_#{node_name node}"
if self.respond_to?(method, true)
self.send(method, node) {visit_children(node)}
else
raise "unhandled node: '#{node_name node}'"
end
end
def visit_children(node)
@indent += 1
super(node)
@indent -= 1
end
def render_arg(arg)
if arg.is_a? Array
var = arg[0]
default = arg[1]
if default
"#{arg[0].to_sass} = #{arg[1].to_sass}"
else
var.to_sass
end
else
arg.to_sass
end
end
def render_args(args)
args.map { |a| render_arg(a) }.join(', ')
end
def emit(line)
line = (' ' * @indent) + line
@lines.push line
end
def visit_if(node, isElse = false)
line = []
line.push 'else' if isElse
line.push "if #{node.expr.to_sass}" if node.expr
emit line.join(' ')
visit_children(node)
visit_if(node.else, true) if node.else
end
def visit_return(node)
emit node.expr.to_sass
end
def visit_comment(node)
node.value.each { |s| emit s }
end
def visit_variable(node)
emit "$#{node.name} = #{node.expr.to_sass}"
end
def visit_mixindef(node)
emit "#{node.name}(#{render_args(node.args)})"
visit_children node
end
def visit_mixin(node)
emit "#{node.name}(#{render_args(node.args)})"
end
def visit_prop(node)
emit "#{node.name.join(' ')}: #{node.value.to_sass}"
end
def visit_function(node)
emit "#{node.name}(#{render_args(node.args)})"
visit_children node
end
def visit_rule(node)
emit node.parsed_rules.to_s
visit_children node
end
def visit_root(node)
@indent = -1
@lines = []
visit_children(node)
@lines.join("\n")
end
end
def main
options = Sass::Engine::DEFAULT_OPTIONS
engine = Sass::Engine.for_file(ARGV[0], options)
tree = engine.to_tree
stylus = ToStylus.visit(tree)
puts stylus
end
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment