html-builder 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/html-builder.rb +190 -127
- metadata +1 -1
data/lib/html-builder.rb
CHANGED
@@ -1,145 +1,208 @@
|
|
1
|
-
|
1
|
+
class HtmlBuilderNode
|
2
|
+
INDENT = "\t"
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
#
|
6
|
-
# Example:
|
7
|
-
# require 'html-builder'
|
8
|
-
#
|
9
|
-
# puts HtmlBuilder.html {
|
10
|
-
# head {
|
11
|
-
# title "Hello HtmlBuilder"
|
12
|
-
# }
|
13
|
-
# body {
|
14
|
-
# text "Hello ", a("HtmlBuilder", :href => "http://github.com/jinchizhong/html-builder"), "."
|
15
|
-
# }
|
16
|
-
# }
|
17
|
-
# Got:
|
18
|
-
# <html>
|
19
|
-
# <head>
|
20
|
-
# <title>Hello HtmlBuilder</title>
|
21
|
-
# </head>
|
22
|
-
# <body>
|
23
|
-
# Hello <a href="http://github.com/jinchizhong/html-builder">HtmlBuilder</a>.
|
24
|
-
# </body>
|
25
|
-
# </html>
|
26
|
-
# Just so easy...
|
27
|
-
|
28
|
-
def initialize name, attrs, text
|
4
|
+
def initialize parent, name, *args
|
5
|
+
@attrs = args.last.is_a?(Hash) ? args.pop : {}
|
29
6
|
@name = name
|
30
|
-
|
31
|
-
|
7
|
+
if not args.empty?
|
8
|
+
@text = args.collect do |a|
|
9
|
+
if a.is_a? HtmlBuilderNode
|
10
|
+
parent.children.delete a
|
11
|
+
a.to_s(0, true)
|
12
|
+
else
|
13
|
+
a.to_s
|
14
|
+
end
|
15
|
+
end.join
|
16
|
+
end
|
17
|
+
parent.children << self if parent
|
32
18
|
@children = []
|
33
|
-
@refed = false
|
34
19
|
end
|
35
|
-
attr_accessor :
|
36
|
-
def
|
37
|
-
#
|
38
|
-
str.to_s
|
20
|
+
attr_accessor :children
|
21
|
+
def format_node_inner
|
22
|
+
[@name, *@attrs.collect{|k,v| "#{k}=\"#{v}\""}].join ' '
|
39
23
|
end
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
def format_node
|
50
|
-
str = escape @name
|
51
|
-
if @attrs
|
52
|
-
@attrs.each do |k, v|
|
53
|
-
str += " #{escape k}=#{quote v}"
|
24
|
+
def to_s ind = 0, inl = false
|
25
|
+
raise "Cannot own text and child both!" if @text and not @children.empty?
|
26
|
+
if inl
|
27
|
+
if @text
|
28
|
+
return "<#{format_node_inner}>#{@text}</#{@name}>"
|
29
|
+
elsif not @children.empty?
|
30
|
+
return ["<#{format_node_inner}>", *@children.collect{|c| c.to_s 0, true}, "</#{@name}>"].join
|
31
|
+
else
|
32
|
+
return "<#{format_node_inner}/>"
|
54
33
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
34
|
+
else
|
35
|
+
if @text
|
36
|
+
return "#{INDENT * ind}<#{format_node_inner}>#{@text}</#{@name}>\n"
|
37
|
+
elsif not @children.empty?
|
38
|
+
return ["#{INDENT * ind}<#{format_node_inner}>\n", *@children.collect{|c| c.to_s(ind + 1)}, "#{INDENT * ind}</#{@name}>\n"].join
|
39
|
+
else
|
40
|
+
return "#{INDENT * ind}<#{format_node_inner}/>\n"
|
62
41
|
end
|
63
|
-
return
|
64
42
|
end
|
65
|
-
|
66
|
-
|
67
|
-
raise "Cannot own block and text both." if @text and not cs.empty?
|
43
|
+
end
|
44
|
+
end
|
68
45
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
c.generate_internel lines, dep + 1, inl
|
73
|
-
end
|
74
|
-
lines << " " * dep + "</#{escape @name}>"
|
75
|
-
elsif @text
|
76
|
-
lines << " " * dep + "<#{format_node}>#{escape @text}</#{escape @name}>"
|
77
|
-
else
|
78
|
-
lines << " " * dep + "<#{format_node}/>"
|
79
|
-
end
|
46
|
+
class HtmlBuilder
|
47
|
+
def self.html *args, &block
|
48
|
+
generate :html, *args, &block
|
80
49
|
end
|
81
|
-
def generate
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
return lines.join
|
86
|
-
else
|
87
|
-
return lines.join "\n"
|
88
|
-
end
|
50
|
+
def self.generate root_ele, *args, &block
|
51
|
+
x = self.new
|
52
|
+
x.build_tree root_ele, *args, &block
|
53
|
+
x.to_s
|
89
54
|
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
attrs = args.pop
|
94
|
-
else
|
95
|
-
attrs = {}
|
96
|
-
end
|
97
|
-
text = ""
|
98
|
-
args.each do |arg|
|
99
|
-
if arg.instance_of? HtmlBuilder
|
100
|
-
text += arg.generate(0, true)
|
101
|
-
else
|
102
|
-
text += arg.to_s
|
103
|
-
end
|
104
|
-
end
|
105
|
-
text = nil if text == ""
|
106
|
-
return attrs, text
|
55
|
+
def initialize
|
56
|
+
@root = nil
|
57
|
+
@stack = []
|
107
58
|
end
|
108
|
-
def
|
109
|
-
|
110
|
-
args.each do |a|
|
111
|
-
@children.delete a if a.instance_of? HtmlBuilder
|
112
|
-
end
|
113
|
-
@children << HtmlBuilder.new(name, attrs, text)
|
114
|
-
if block
|
115
|
-
@children.last.instance_eval &block
|
116
|
-
end
|
117
|
-
@children.last
|
59
|
+
def inspect
|
60
|
+
nil
|
118
61
|
end
|
119
|
-
def
|
120
|
-
|
121
|
-
|
122
|
-
|
62
|
+
def to_s *args
|
63
|
+
@root.to_s *args
|
64
|
+
end
|
65
|
+
def build_tree root_name, *args, &block
|
66
|
+
@root = HtmlBuilderNode.new nil, root_name, *args
|
67
|
+
yield_block @root, &block
|
123
68
|
end
|
124
|
-
def
|
125
|
-
|
69
|
+
def yield_block e, &block
|
70
|
+
return unless block
|
71
|
+
@stack << e
|
72
|
+
instance_eval &block
|
73
|
+
@stack.pop
|
126
74
|
end
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
def_node :link
|
131
|
-
def_node :script
|
132
|
-
def_node :body
|
133
|
-
def_node :a
|
134
|
-
def_node :h1
|
135
|
-
def_node :div
|
136
|
-
def_node :img
|
137
|
-
def_node :span
|
138
|
-
def javascript code
|
139
|
-
script(:type => "text/javascript"){
|
140
|
-
text code
|
141
|
-
}
|
75
|
+
def add_child name, *args, &block
|
76
|
+
e = HtmlBuilderNode.new @stack.last, name, *args
|
77
|
+
yield_block e, &block
|
142
78
|
end
|
79
|
+
def self.def_tag name
|
80
|
+
define_method name do |*args, &block|
|
81
|
+
add_child name, *args, &block
|
82
|
+
end
|
83
|
+
end
|
84
|
+
def_tag :a
|
85
|
+
def_tag :abbr
|
86
|
+
def_tag :acronym
|
87
|
+
def_tag :address
|
88
|
+
def_tag :applet
|
89
|
+
def_tag :area
|
90
|
+
def_tag :article
|
91
|
+
def_tag :aside
|
92
|
+
def_tag :audio
|
93
|
+
def_tag :b
|
94
|
+
def_tag :base
|
95
|
+
def_tag :basefont
|
96
|
+
def_tag :bdi
|
97
|
+
def_tag :bdo
|
98
|
+
def_tag :big
|
99
|
+
def_tag :blockquote
|
100
|
+
def_tag :body
|
101
|
+
def_tag :br
|
102
|
+
def_tag :button
|
103
|
+
def_tag :canvas
|
104
|
+
def_tag :caption
|
105
|
+
def_tag :center
|
106
|
+
def_tag :cite
|
107
|
+
def_tag :code
|
108
|
+
def_tag :col
|
109
|
+
def_tag :colgroup
|
110
|
+
def_tag :command
|
111
|
+
def_tag :datalist
|
112
|
+
def_tag :dd
|
113
|
+
def_tag :del
|
114
|
+
def_tag :details
|
115
|
+
def_tag :dir
|
116
|
+
def_tag :div
|
117
|
+
def_tag :dfn
|
118
|
+
def_tag :dialog
|
119
|
+
def_tag :dl
|
120
|
+
def_tag :dt
|
121
|
+
def_tag :em
|
122
|
+
def_tag :embed
|
123
|
+
def_tag :fieldset
|
124
|
+
def_tag :figcaption
|
125
|
+
def_tag :figure
|
126
|
+
def_tag :font
|
127
|
+
def_tag :footer
|
128
|
+
def_tag :form
|
129
|
+
def_tag :frame
|
130
|
+
def_tag :frameset
|
131
|
+
def_tag :h1
|
132
|
+
def_tag :h2
|
133
|
+
def_tag :h3
|
134
|
+
def_tag :h4
|
135
|
+
def_tag :h5
|
136
|
+
def_tag :h6
|
137
|
+
def_tag :head
|
138
|
+
def_tag :header
|
139
|
+
def_tag :hr
|
140
|
+
def_tag :html
|
141
|
+
def_tag :i
|
142
|
+
def_tag :iframe
|
143
|
+
def_tag :img
|
144
|
+
def_tag :input
|
145
|
+
def_tag :ins
|
146
|
+
def_tag :isindex
|
147
|
+
def_tag :kbd
|
148
|
+
def_tag :keygen
|
149
|
+
def_tag :label
|
150
|
+
def_tag :legend
|
151
|
+
def_tag :li
|
152
|
+
def_tag :link
|
153
|
+
def_tag :map
|
154
|
+
def_tag :mark
|
155
|
+
def_tag :menu
|
156
|
+
def_tag :menuitem
|
157
|
+
def_tag :meta
|
158
|
+
def_tag :meter
|
159
|
+
def_tag :nav
|
160
|
+
def_tag :noframes
|
161
|
+
def_tag :noscript
|
162
|
+
def_tag :object
|
163
|
+
def_tag :ol
|
164
|
+
def_tag :optgroup
|
165
|
+
def_tag :option
|
166
|
+
def_tag :output
|
167
|
+
def_tag :p
|
168
|
+
def_tag :param
|
169
|
+
def_tag :pre
|
170
|
+
def_tag :progress
|
171
|
+
def_tag :q
|
172
|
+
def_tag :rp
|
173
|
+
def_tag :rt
|
174
|
+
def_tag :ruby
|
175
|
+
def_tag :s
|
176
|
+
def_tag :samp
|
177
|
+
def_tag :script
|
178
|
+
def_tag :section
|
179
|
+
def_tag :select
|
180
|
+
def_tag :small
|
181
|
+
def_tag :source
|
182
|
+
def_tag :span
|
183
|
+
def_tag :strike
|
184
|
+
def_tag :strong
|
185
|
+
def_tag :style
|
186
|
+
def_tag :sub
|
187
|
+
def_tag :summary
|
188
|
+
def_tag :sup
|
189
|
+
def_tag :table
|
190
|
+
def_tag :tbody
|
191
|
+
def_tag :td
|
192
|
+
def_tag :textarea
|
193
|
+
def_tag :tfoot
|
194
|
+
def_tag :th
|
195
|
+
def_tag :thead
|
196
|
+
def_tag :time
|
197
|
+
def_tag :title
|
198
|
+
def_tag :tr
|
199
|
+
def_tag :track
|
200
|
+
def_tag :tt
|
201
|
+
def_tag :u
|
202
|
+
def_tag :ul
|
203
|
+
def_tag :var
|
204
|
+
def_tag :video
|
205
|
+
def_tag :wbr
|
206
|
+
def_tag :xmp
|
143
207
|
end
|
144
208
|
|
145
|
-
|