Sass extensions for emitting Sass text from a Sass::Tree

This commit is contained in:
Chris Eppstein 2010-01-23 01:06:54 -08:00
parent 52e2a9cc63
commit 54424de793
2 changed files with 91 additions and 11 deletions

View File

@ -49,17 +49,7 @@ def mixins(item)
end
def mixin_signature(mixin)
signature = "+#{mixin.name}"
if mixin.args && mixin.args.any?
signature << "("
signature << mixin.args.map do |a|
var = a.first
default_value = a.last
"#{var.inspect}#{" = " + default_value.inspect if default_value}"
end.join(", ")
signature << ")"
end
signature
mixin.sass_signature(:include)
end
def format_doc(docstring)

View File

@ -1,13 +1,96 @@
require 'sass'
module Sass
module Tree
class Node
private
def tab(s, indent_level = 1)
s.split("\n").join("\n" + " " * indent_level)
end
def children_to_sass
clean_children = children.inject([[],true]) do |m,c|
if c.respond_to?(:doc) && !c.doc.nil?
[m.first, c.doc]
else
if m.last
[m.first + [c], true]
else
m
end
end
end
raise clean_children.first.inspect if clean_children.first.detect{|c| TrueClass === c}
tab(clean_children.first.
map{|c| c.to_sass}.join("\n"))
end
end
class VariableNode < Node
attr_accessor :name unless method_defined? :name
end
class IfNode < Node
def to_sass
sass_str = %Q{@if #{@expr.inspect unless @expr.nil?}
- #{tab children_to_sass}
-}.gsub(/^\s+-/,'')
if @else
sass_str << %Q{@else
- #{tab @else.to_sass}
-}.gsub(/^\s+-/,'')
end
sass_str
end
end
class DebugNode < Node
def to_sass
""
end
end
class MixinNode < Node
attr_accessor :name unless method_defined? :name
attr_accessor :args unless method_defined? :args
def to_sass
sass_str = "+#{name}"
if args.any?
sass_str << "(#{args.map{|a| a.inspect}.join(", ")})"
end
sass_str
end
end
class MixinDefNode < Node
attr_accessor :name unless method_defined? :name
attr_accessor :args unless method_defined? :args
attr_accessor :comment unless method_defined? :comment
def to_sass
"#{sass_signature}\n #{children_to_sass}\n"
end
def sass_signature(mode = :definition)
prefix = case mode
when :definition
"="
when :include
"+"
end
"#{prefix}#{name}#{arglist_to_sass}"
end
private
def arglist_to_sass
if args.any?
"(#{args.map{|a| arg_to_sass(a)}.join(", ")})"
else
""
end
end
def arg_to_sass(arg)
name, default_value = arg
sass_str = "#{name.inspect}"
if default_value
sass_str << " = "
sass_str << default_value.inspect
end
sass_str
end
end
class ImportNode < RootNode
attr_accessor :imported_filename unless method_defined? :imported_filename
@ -16,6 +99,13 @@ module Sass
def docstring
([value] + lines).join("\n")
end
def doc
if value == "@doc off"
false
elsif value == "@doc on"
true
end
end
end
end
end