forked from baccigalupi/garterbelt
-
Notifications
You must be signed in to change notification settings - Fork 1
/
simple_tag.rb
70 lines (60 loc) · 1.69 KB
/
simple_tag.rb
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
module Garterbelt
class SimpleTag < Renderer
attr_accessor :type, :attributes, :css_class
def initialize(opts)
super
self.type = opts[:type] || raise(ArgumentError, ":type required in initialization options")
self.attributes = opts[:attributes] || {}
css_class = attributes.delete(:class)
self.css_class = if css_class
css_class.is_a?(Array) ? css_class : [css_class]
else
[]
end
end
# Convenience method chaining ---------------------------
def id(identifier)
raise ArgumentError, "Id must be a String or Symbol" unless [String, Symbol].include?(identifier.class)
self.attributes[:id] = identifier
self
end
def c(*args)
self.css_class += args
self
end
# Rendering -----------------------------------------------
def rendered_attributes
str = ""
str << " class=\"" << css_class.join(' ') << "\"" unless css_class.empty?
keys = attributes.keys.sort{|a, b| a.to_s <=> b.to_s}
keys.each do |key|
value = attributes[key]
if value
value = value.to_s.gsub('"', '\'')
str << " " << key.to_s << "=\"" << value.to_s << "\""
end
end
str
end
def template
if style == :text
type == :br ? "\n" : ""
else
"#{indent}<#{type}#{rendered_attributes}>#{line_end}"
end
end
def render
str = template
self.output << str
str
end
def method_missing(name, *args, &block)
super if args.size > 0 || block_given?
if name.to_s.match(/(.+)!/)
id($1)
else
c(name)
end
end
end
end