summaryrefslogtreecommitdiff
path: root/css/css.rb
blob: a52b5e29fb013aa60846293b92d4258ef6782e7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
<style type="text/css">
#{stylesheet}
</style>
    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 "<span #{css[:foo]}>Test</span>"
  puts css.stylesheet_tag
end