markaby 0.5 → 0.6.6
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/.gitignore +4 -0
- data/CHANGELOG.rdoc +79 -0
- data/Markaby.gemspec +103 -0
- data/{README → README.rdoc} +14 -6
- data/Rakefile +71 -14
- data/VERSION +1 -0
- data/garlic.rb +29 -0
- data/init.rb +6 -0
- data/lib/markaby.rb +4 -9
- data/lib/markaby/builder.rb +156 -143
- data/lib/markaby/builder_tags.rb +64 -0
- data/lib/markaby/cssproxy.rb +36 -34
- data/lib/markaby/kernel_method.rb +7 -0
- data/lib/markaby/rails.rb +64 -39
- data/lib/markaby/rails/current.rb +46 -0
- data/lib/markaby/rails/deprecated.rb +124 -0
- data/lib/markaby/rails/rails_builder.rb +50 -0
- data/lib/markaby/tags.rb +158 -130
- data/lib/markaby/tilt.rb +21 -0
- data/spec/markaby/builder_spec.rb +118 -0
- data/spec/markaby/css_proxy_spec.rb +47 -0
- data/spec/markaby/fragment_spec.rb +10 -0
- data/spec/markaby/markaby_other_static.mab +1 -0
- data/spec/markaby/markaby_spec.rb +232 -0
- data/spec/markaby/rails/spec_helper.rb +21 -0
- data/spec/markaby/rails/views/markaby/_a_partial.mab +3 -0
- data/spec/markaby/rails/views/markaby/_partial_child_with_locals.mab +1 -0
- data/spec/markaby/rails/views/markaby/access_to_helpers.mab +1 -0
- data/spec/markaby/rails/views/markaby/broken.mab +7 -0
- data/spec/markaby/rails/views/markaby/correct_template_values.mab +5 -0
- data/spec/markaby/rails/views/markaby/form_for.mab +2 -0
- data/spec/markaby/rails/views/markaby/form_for_with_fields.mab +3 -0
- data/spec/markaby/rails/views/markaby/form_for_with_multiple_fields.mab +4 -0
- data/spec/markaby/rails/views/markaby/no_values_passed.mab +3 -0
- data/spec/markaby/rails/views/markaby/partial_parent.mab +1 -0
- data/spec/markaby/rails/views/markaby/partial_parent_with_locals.mab +7 -0
- data/spec/markaby/rails/views/markaby/render_erb_without_explicit_render_call.erb +1 -0
- data/spec/markaby/rails/views/markaby/render_explicit_but_empty_markaby_layout.mab +0 -0
- data/spec/markaby/rails/views/markaby/render_mab_without_explicit_render_call.mab +3 -0
- data/spec/markaby/rails/views/markaby/render_with_ivar.mab +3 -0
- data/spec/markaby/rails/views/markaby/renders_erb.rhtml +1 -0
- data/spec/markaby/rails_spec.rb +249 -0
- data/spec/markaby/rails_version_spec.rb +37 -0
- data/spec/markaby/tilt/erb.erb +1 -0
- data/spec/markaby/tilt/locals.mab +1 -0
- data/spec/markaby/tilt/markaby.mab +1 -0
- data/spec/markaby/tilt/markaby_other_static.mab +1 -0
- data/spec/markaby/tilt/render_twice.mab +1 -0
- data/spec/markaby/tilt/scope.mab +1 -0
- data/spec/markaby/tilt/yielding.mab +2 -0
- data/spec/markaby/tilt_spec.rb +86 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +39 -0
- metadata +132 -52
- data/lib/markaby/metaid.rb +0 -16
- data/lib/markaby/template.rb +0 -12
- data/setup.rb +0 -1551
- data/test/test_markaby.rb +0 -109
- data/tools/rakehelp.rb +0 -106
data/lib/markaby/tags.rb
CHANGED
@@ -1,107 +1,114 @@
|
|
1
1
|
module Markaby
|
2
|
-
|
3
|
-
|
4
|
-
SELF_CLOSING_TAGS = [ :base, :meta, :link, :hr, :br, :param, :img, :area, :input, :col ]
|
5
|
-
NO_PROXY = [ :hr, :br ]
|
2
|
+
FORM_TAGS = [ :form, :input, :select, :textarea ]
|
3
|
+
SELF_CLOSING_TAGS = [ :base, :meta, :link, :hr, :br, :param, :img, :area, :input, :col, :frame ]
|
6
4
|
|
7
5
|
# Common sets of attributes.
|
8
|
-
AttrCore
|
9
|
-
AttrI18n
|
10
|
-
AttrEvents = [:onclick,
|
11
|
-
|
12
|
-
|
6
|
+
AttrCore = [:id, :class, :style, :title]
|
7
|
+
AttrI18n = [:lang, 'xml:lang'.intern, :dir]
|
8
|
+
AttrEvents = [:onclick,
|
9
|
+
:ondblclick,
|
10
|
+
:onmousedown,
|
11
|
+
:onmouseup,
|
12
|
+
:onmouseover,
|
13
|
+
:onmousemove,
|
14
|
+
:onmouseout,
|
15
|
+
:onkeypress,
|
16
|
+
:onkeydown,
|
17
|
+
:onkeyup]
|
18
|
+
AttrFocus = [:accesskey, :tabindex, :onfocus, :onblur]
|
13
19
|
AttrHAlign = [:align, :char, :charoff]
|
14
20
|
AttrVAlign = [:valign]
|
15
|
-
Attrs
|
21
|
+
Attrs = AttrCore + AttrI18n + AttrEvents
|
16
22
|
|
17
23
|
# All the tags and attributes from XHTML 1.0 Strict
|
18
24
|
class XHTMLStrict
|
19
25
|
class << self
|
20
26
|
attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
|
21
27
|
end
|
22
|
-
|
23
|
-
@
|
24
|
-
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
44
|
-
:
|
28
|
+
|
29
|
+
@doctype = ['-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd']
|
30
|
+
@tagset = {
|
31
|
+
:html => AttrI18n + [:id, :xmlns],
|
32
|
+
:head => AttrI18n + [:id, :profile],
|
33
|
+
:title => AttrI18n + [:id],
|
34
|
+
:base => [:href, :id],
|
35
|
+
:meta => AttrI18n + [:id, :http, :name, :content, :scheme, 'http-equiv'.intern],
|
36
|
+
:link => Attrs + [:charset, :href, :hreflang, :type, :rel, :rev, :media],
|
37
|
+
:style => AttrI18n + [:id, :type, :media, :title, 'xml:space'.intern],
|
38
|
+
:script => [:id, :charset, :type, :src, :defer, 'xml:space'.intern],
|
39
|
+
:noscript => Attrs,
|
40
|
+
:body => Attrs + [:onload, :onunload],
|
41
|
+
:div => Attrs,
|
42
|
+
:p => Attrs,
|
43
|
+
:ul => Attrs,
|
44
|
+
:ol => Attrs,
|
45
|
+
:li => Attrs,
|
46
|
+
:dl => Attrs,
|
47
|
+
:dt => Attrs,
|
48
|
+
:dd => Attrs,
|
49
|
+
:address => Attrs,
|
50
|
+
:hr => Attrs,
|
51
|
+
:pre => Attrs + ['xml:space'.intern],
|
45
52
|
:blockquote => Attrs + [:cite],
|
46
|
-
:ins
|
47
|
-
:del
|
48
|
-
:a
|
49
|
-
:span
|
50
|
-
:bdo
|
51
|
-
:br
|
52
|
-
:em
|
53
|
-
:strong
|
54
|
-
:dfn
|
55
|
-
:code
|
56
|
-
:samp
|
57
|
-
:kbd
|
58
|
-
:var
|
59
|
-
:cite
|
60
|
-
:abbr
|
61
|
-
:acronym
|
62
|
-
:q
|
63
|
-
:sub
|
64
|
-
:sup
|
65
|
-
:tt
|
66
|
-
:i
|
67
|
-
:b
|
68
|
-
:big
|
69
|
-
:small
|
70
|
-
:object
|
71
|
-
:param
|
72
|
-
:img
|
73
|
-
:map
|
74
|
-
:area
|
75
|
-
:form
|
76
|
-
:label
|
77
|
-
:input
|
78
|
-
:select
|
79
|
-
:optgroup
|
80
|
-
:option
|
81
|
-
:textarea
|
82
|
-
:fieldset
|
83
|
-
:legend
|
84
|
-
:button
|
85
|
-
:table
|
86
|
-
:caption
|
87
|
-
:colgroup
|
88
|
-
:col
|
89
|
-
:thead
|
90
|
-
:tfoot
|
91
|
-
:tbody
|
92
|
-
:tr
|
93
|
-
:th
|
94
|
-
:td
|
95
|
-
:h1
|
96
|
-
:h2
|
97
|
-
:h3
|
98
|
-
:h4
|
99
|
-
:h5
|
100
|
-
:h6
|
53
|
+
:ins => Attrs + [:cite, :datetime],
|
54
|
+
:del => Attrs + [:cite, :datetime],
|
55
|
+
:a => Attrs + AttrFocus + [:charset, :type, :name, :href, :hreflang, :rel, :rev, :shape, :coords],
|
56
|
+
:span => Attrs,
|
57
|
+
:bdo => AttrCore + AttrEvents + [:lang, 'xml:lang'.intern, :dir],
|
58
|
+
:br => AttrCore,
|
59
|
+
:em => Attrs,
|
60
|
+
:strong => Attrs,
|
61
|
+
:dfn => Attrs,
|
62
|
+
:code => Attrs,
|
63
|
+
:samp => Attrs,
|
64
|
+
:kbd => Attrs,
|
65
|
+
:var => Attrs,
|
66
|
+
:cite => Attrs,
|
67
|
+
:abbr => Attrs,
|
68
|
+
:acronym => Attrs,
|
69
|
+
:q => Attrs + [:cite],
|
70
|
+
:sub => Attrs,
|
71
|
+
:sup => Attrs,
|
72
|
+
:tt => Attrs,
|
73
|
+
:i => Attrs,
|
74
|
+
:b => Attrs,
|
75
|
+
:big => Attrs,
|
76
|
+
:small => Attrs,
|
77
|
+
:object => Attrs + [:declare, :classid, :codebase, :data, :type, :codetype, :archive, :standby, :height, :width, :usemap, :name, :tabindex],
|
78
|
+
:param => [:id, :name, :value, :valuetype, :type],
|
79
|
+
:img => Attrs + [:src, :alt, :longdesc, :height, :width, :usemap, :ismap],
|
80
|
+
:map => AttrI18n + AttrEvents + [:id, :class, :style, :title, :name],
|
81
|
+
:area => Attrs + AttrFocus + [:shape, :coords, :href, :nohref, :alt],
|
82
|
+
:form => Attrs + [:action, :method, :enctype, :onsubmit, :onreset, :accept, :accept],
|
83
|
+
:label => Attrs + [:for, :accesskey, :onfocus, :onblur],
|
84
|
+
:input => Attrs + AttrFocus + [:type, :name, :value, :checked, :disabled, :readonly, :size, :maxlength, :src, :alt, :usemap, :onselect, :onchange, :accept],
|
85
|
+
:select => Attrs + [:name, :size, :multiple, :disabled, :tabindex, :onfocus, :onblur, :onchange],
|
86
|
+
:optgroup => Attrs + [:disabled, :label],
|
87
|
+
:option => Attrs + [:selected, :disabled, :label, :value],
|
88
|
+
:textarea => Attrs + AttrFocus + [:name, :rows, :cols, :disabled, :readonly, :onselect, :onchange],
|
89
|
+
:fieldset => Attrs,
|
90
|
+
:legend => Attrs + [:accesskey],
|
91
|
+
:button => Attrs + AttrFocus + [:name, :value, :type, :disabled],
|
92
|
+
:table => Attrs + [:summary, :width, :border, :frame, :rules, :cellspacing, :cellpadding],
|
93
|
+
:caption => Attrs,
|
94
|
+
:colgroup => Attrs + AttrHAlign + AttrVAlign + [:span, :width],
|
95
|
+
:col => Attrs + AttrHAlign + AttrVAlign + [:span, :width],
|
96
|
+
:thead => Attrs + AttrHAlign + AttrVAlign,
|
97
|
+
:tfoot => Attrs + AttrHAlign + AttrVAlign,
|
98
|
+
:tbody => Attrs + AttrHAlign + AttrVAlign,
|
99
|
+
:tr => Attrs + AttrHAlign + AttrVAlign,
|
100
|
+
:th => Attrs + AttrHAlign + AttrVAlign + [:abbr, :axis, :headers, :scope, :rowspan, :colspan],
|
101
|
+
:td => Attrs + AttrHAlign + AttrVAlign + [:abbr, :axis, :headers, :scope, :rowspan, :colspan],
|
102
|
+
:h1 => Attrs,
|
103
|
+
:h2 => Attrs,
|
104
|
+
:h3 => Attrs,
|
105
|
+
:h4 => Attrs,
|
106
|
+
:h5 => Attrs,
|
107
|
+
:h6 => Attrs
|
101
108
|
}
|
102
109
|
|
103
|
-
@tags
|
104
|
-
@forms
|
110
|
+
@tags = @tagset.keys
|
111
|
+
@forms = @tags & FORM_TAGS
|
105
112
|
@self_closing = @tags & SELF_CLOSING_TAGS
|
106
113
|
end
|
107
114
|
|
@@ -110,51 +117,56 @@ module Markaby
|
|
110
117
|
class << self
|
111
118
|
attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
|
112
119
|
end
|
113
|
-
|
114
|
-
@
|
115
|
-
|
116
|
-
:
|
117
|
-
:
|
120
|
+
|
121
|
+
@doctype = ['-//W3C//DTD XHTML 1.0 Transitional//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd']
|
122
|
+
@tagset = XHTMLStrict.tagset.merge({
|
123
|
+
:strike => Attrs,
|
124
|
+
:center => Attrs,
|
125
|
+
:dir => Attrs + [:compact],
|
118
126
|
:noframes => Attrs,
|
119
|
-
:basefont => [:id, :size, :color, :face],
|
120
|
-
:u
|
121
|
-
:menu
|
122
|
-
:iframe
|
123
|
-
:font
|
124
|
-
:s
|
125
|
-
:applet
|
126
|
-
:isindex
|
127
|
+
:basefont => [:id, :size, :color, :face],
|
128
|
+
:u => Attrs,
|
129
|
+
:menu => Attrs + [:compact],
|
130
|
+
:iframe => AttrCore + [:longdesc, :name, :src, :frameborder, :marginwidth, :marginheight, :scrolling, :align, :height, :width],
|
131
|
+
:font => AttrCore + AttrI18n + [:size, :color, :face],
|
132
|
+
:s => Attrs,
|
133
|
+
:applet => AttrCore + [:codebase, :archive, :code, :object, :alt, :name, :width, :height, :align, :hspace, :vspace],
|
134
|
+
:isindex => AttrCore + AttrI18n + [:prompt]
|
135
|
+
})
|
127
136
|
|
128
137
|
# Additional attributes found in XHTML 1.0 Transitional
|
129
|
-
|
130
|
-
:
|
131
|
-
:
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
136
|
-
:
|
137
|
-
:
|
138
|
-
:
|
139
|
-
:
|
140
|
-
:
|
141
|
-
:
|
138
|
+
additional_tags = {
|
139
|
+
:script => [:language],
|
140
|
+
:a => [:target],
|
141
|
+
:td => [:bgcolor, :nowrap, :width, :height],
|
142
|
+
:p => [:align],
|
143
|
+
:h5 => [:align],
|
144
|
+
:h3 => [:align],
|
145
|
+
:li => [:type, :value],
|
146
|
+
:div => [:align],
|
147
|
+
:pre => [:width],
|
148
|
+
:body => [:background, :bgcolor, :text, :link, :vlink, :alink],
|
149
|
+
:ol => [:type, :compact, :start],
|
150
|
+
:h4 => [:align],
|
151
|
+
:h2 => [:align],
|
142
152
|
:object => [:align, :border, :hspace, :vspace],
|
143
|
-
:img
|
144
|
-
:link
|
153
|
+
:img => [:name, :align, :border, :hspace, :vspace],
|
154
|
+
:link => [:target],
|
145
155
|
:legend => [:align],
|
146
|
-
:dl
|
147
|
-
:input
|
148
|
-
:h6
|
149
|
-
:hr
|
150
|
-
:base
|
151
|
-
:ul
|
152
|
-
:br
|
153
|
-
:form
|
154
|
-
:area
|
155
|
-
:h1
|
156
|
-
}
|
157
|
-
|
156
|
+
:dl => [:compact],
|
157
|
+
:input => [:align],
|
158
|
+
:h6 => [:align],
|
159
|
+
:hr => [:align, :noshade, :size, :width],
|
160
|
+
:base => [:target],
|
161
|
+
:ul => [:type, :compact],
|
162
|
+
:br => [:clear],
|
163
|
+
:form => [:name, :target],
|
164
|
+
:area => [:target],
|
165
|
+
:h1 => [:align]
|
166
|
+
}
|
167
|
+
|
168
|
+
additional_tags.each do |k, v|
|
169
|
+
@tagset[k] += v
|
158
170
|
end
|
159
171
|
|
160
172
|
@tags = @tagset.keys
|
@@ -162,4 +174,20 @@ module Markaby
|
|
162
174
|
@self_closing = @tags & SELF_CLOSING_TAGS
|
163
175
|
end
|
164
176
|
|
177
|
+
# Additional tags found in XHTML 1.0 Frameset
|
178
|
+
class XHTMLFrameset
|
179
|
+
class << self
|
180
|
+
attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
|
181
|
+
end
|
182
|
+
|
183
|
+
@doctype = ['-//W3C//DTD XHTML 1.0 Frameset//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd']
|
184
|
+
@tagset = XHTMLTransitional.tagset.merge({
|
185
|
+
:frameset => AttrCore + [:rows, :cols, :onload, :onunload],
|
186
|
+
:frame => AttrCore + [:longdesc, :name, :src, :frameborder, :marginwidth, :marginheight, :noresize, :scrolling]
|
187
|
+
})
|
188
|
+
|
189
|
+
@tags = @tagset.keys
|
190
|
+
@forms = @tags & FORM_TAGS
|
191
|
+
@self_closing = @tags & SELF_CLOSING_TAGS
|
192
|
+
end
|
165
193
|
end
|
data/lib/markaby/tilt.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
|
3
|
+
module Markaby
|
4
|
+
module Tilt
|
5
|
+
class Template < ::Tilt::Template
|
6
|
+
def evaluate(scope, locals, &block)
|
7
|
+
builder = Markaby::Builder.new({}, scope)
|
8
|
+
builder.locals = locals
|
9
|
+
builder.instance_eval(data, __FILE__, __LINE__)
|
10
|
+
builder.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def prepare; end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Tilt
|
19
|
+
MarkabyTemplate = Markaby::Tilt::Template
|
20
|
+
register "mab", MarkabyTemplate
|
21
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
|
3
|
+
module Markaby
|
4
|
+
describe Builder do
|
5
|
+
before do
|
6
|
+
Markaby::Builder.restore_defaults!
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
Markaby::Builder.restore_defaults!
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have method missing as a private method" do
|
14
|
+
private_methods = Markaby::Builder.private_instance_methods.dup
|
15
|
+
private_methods.map! { |m| m.to_sym }
|
16
|
+
private_methods.should include(:method_missing)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "setting options" do
|
20
|
+
it "should be able to restore defaults after setting" do
|
21
|
+
Markaby::Builder.set :indent, 2
|
22
|
+
Markaby::Builder.restore_defaults!
|
23
|
+
|
24
|
+
Markaby::Builder.get(:indent).should == 0
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be able to set global options" do
|
28
|
+
Markaby::Builder.set :indent, 2
|
29
|
+
Markaby::Builder.get(:indent).should == 2
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "hidden internal variables" do
|
34
|
+
# internal clobbering by passed in assigns
|
35
|
+
it "should not overwrite internal helpers ivar when assigning a :helpers key" do
|
36
|
+
helper = Class.new do
|
37
|
+
def some_method
|
38
|
+
"a value"
|
39
|
+
end
|
40
|
+
end.new
|
41
|
+
|
42
|
+
builder = Markaby::Builder.new({:helpers => nil}, helper)
|
43
|
+
builder.some_method.should == "a value"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "evaluating blocks" do
|
48
|
+
it "should evaluate a pure-string block (without requiring a call to the text method)" do
|
49
|
+
b = Builder.new do
|
50
|
+
"foo"
|
51
|
+
end
|
52
|
+
|
53
|
+
b.to_s.should == "foo"
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should only evaluate the last argument in a pure-string block" do
|
57
|
+
b = Builder.new do
|
58
|
+
"foo"
|
59
|
+
"bar"
|
60
|
+
end
|
61
|
+
|
62
|
+
b.to_s.should == "bar"
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should evaluate pure-strings inside an tag" do
|
66
|
+
b = Builder.new do
|
67
|
+
h1 do
|
68
|
+
"foo"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
b.to_s.should == "<h1>foo</h1>"
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should ignore a pure string in the block, even if comes last, if there has been any markup whatsoever" do
|
76
|
+
b = Builder.new do
|
77
|
+
h1
|
78
|
+
"foo"
|
79
|
+
end
|
80
|
+
|
81
|
+
b.to_s.should == "<h1/>"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "capture" do
|
86
|
+
before do
|
87
|
+
@builder = Builder.new
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should return the string captured" do
|
91
|
+
out = @builder.capture do
|
92
|
+
h1 "TEST"
|
93
|
+
h2 "CAPTURE ME"
|
94
|
+
end
|
95
|
+
|
96
|
+
out.should == "<h1>TEST</h1><h2>CAPTURE ME</h2>"
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should not change the output buffer" do
|
100
|
+
lambda {
|
101
|
+
@builder.capture do
|
102
|
+
h1 "FOO!"
|
103
|
+
end
|
104
|
+
}.should_not change { @builder.to_s }
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should be able to capture inside a capture" do
|
108
|
+
out = @builder.capture do
|
109
|
+
capture do
|
110
|
+
h1 "foo"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
out.should == "<h1>foo</h1>"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|