From 864190853fdc693936c0e683a61b24b85a9ff946 Mon Sep 17 00:00:00 2001 From: murphy Date: Sat, 29 Oct 2005 06:06:39 +0000 Subject: CSS class added. Don't yet know if I use it. --- css/css.rb | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 css/css.rb diff --git a/css/css.rb b/css/css.rb new file mode 100644 index 0000000..a52b5e2 --- /dev/null +++ b/css/css.rb @@ -0,0 +1,101 @@ +class CSS < Hash + + attr_reader :mode + + def initialize styles = [], mode = nil + @mode = mode + @sorted = [] + @styles = read styles + @styles_used = {} + super() do |hash, key| + hash[key] = style_for key + end + end + + def clear + super + @sorted.clear + end + + def style_for selector, mode = @mode + selector = selector.to_s if selector.is_a? Symbol + case mode + when nil: self[selector] + when :style, :class: send mode, selector + else + raise + end + #case selector + #when String: selector] + #when Symbol: self[selector.to_s] + #when Array: self[selector.last] + #else + # raise ArgumentError, 'String, Symbol or Array expected, %p given' % styles.class + #end + end + + def read styles + case styles + when String: read_style_sheet styles + when Array: read_style_list styles + else + raise ArgumentError, 'String or Array expected, %p given' % styles.class + end + end + + def read_style_list list + for clas, style in list + add clas, style + end + end + + def add clas, style + @sorted << clas + self[clas] = style + end + + protected :[]=, :fetch + + def use selector + @styles_used[selector] = true + end + + def class selector = nil + # redirect to Object#class if no argument given + return super unless selector + + use selector + "class=\"#{selector}\"" + end + + def style selector + "style=\"#{self[selector]}\"" + end + + def stylesheet_tag indent = nil + tag = <<-STYLESHEET + + STYLESHEET + tag.gsub!(/^/, indent) if indent + tag + end + + def stylesheet + @styles_used.sort_by { |sel,| sel }.map do |selector, val| + ".#{selector} { #{self.fetch(selector)} }" + end.join "\n" + end + +end + +if $0 == __FILE__ + css = CSS.new [ + ['foo', 'color: blue'], + ['bar', 'font-size: 200%'], + ], :class + + puts "Test" + puts css.stylesheet_tag +end -- cgit v1.2.1