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
|