From 54424de7931f44d74596e9e4052a26f4641ce5e2 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 23 Jan 2010 01:06:54 -0800 Subject: [PATCH] Sass extensions for emitting Sass text from a Sass::Tree --- doc-src/lib/stylesheets.rb | 12 +-- doc-src/lib/stylesheets/sass_extensions.rb | 90 ++++++++++++++++++++++ 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/doc-src/lib/stylesheets.rb b/doc-src/lib/stylesheets.rb index 9c4eb6d4..187c1beb 100644 --- a/doc-src/lib/stylesheets.rb +++ b/doc-src/lib/stylesheets.rb @@ -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) diff --git a/doc-src/lib/stylesheets/sass_extensions.rb b/doc-src/lib/stylesheets/sass_extensions.rb index 5710402e..5243ba03 100644 --- a/doc-src/lib/stylesheets/sass_extensions.rb +++ b/doc-src/lib/stylesheets/sass_extensions.rb @@ -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 \ No newline at end of file