hobo 0.5.3

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.
Files changed (125) hide show
  1. data/LICENSE.txt +22 -0
  2. data/README.txt +18 -0
  3. data/bin/hobo +81 -0
  4. data/hobo_files/plugin/CHANGES.txt +963 -0
  5. data/hobo_files/plugin/LICENSE.txt +22 -0
  6. data/hobo_files/plugin/README +4 -0
  7. data/hobo_files/plugin/Rakefile +11 -0
  8. data/hobo_files/plugin/generators/hobo/hobo_generator.rb +37 -0
  9. data/hobo_files/plugin/generators/hobo/templates/application.dryml +2 -0
  10. data/hobo_files/plugin/generators/hobo/templates/guest.rb +31 -0
  11. data/hobo_files/plugin/generators/hobo_front_controller/USAGE +11 -0
  12. data/hobo_files/plugin/generators/hobo_front_controller/hobo_front_controller_generator.rb +90 -0
  13. data/hobo_files/plugin/generators/hobo_front_controller/templates/controller.rb +51 -0
  14. data/hobo_files/plugin/generators/hobo_front_controller/templates/functional_test.rb +18 -0
  15. data/hobo_files/plugin/generators/hobo_front_controller/templates/helper.rb +2 -0
  16. data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +43 -0
  17. data/hobo_files/plugin/generators/hobo_front_controller/templates/login.dryml +44 -0
  18. data/hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml +18 -0
  19. data/hobo_files/plugin/generators/hobo_front_controller/templates/signup.dryml +45 -0
  20. data/hobo_files/plugin/generators/hobo_model/USAGE +26 -0
  21. data/hobo_files/plugin/generators/hobo_model/hobo_model_generator.rb +38 -0
  22. data/hobo_files/plugin/generators/hobo_model/templates/fixtures.yml +11 -0
  23. data/hobo_files/plugin/generators/hobo_model/templates/migration.rb +13 -0
  24. data/hobo_files/plugin/generators/hobo_model/templates/model.rb +24 -0
  25. data/hobo_files/plugin/generators/hobo_model/templates/unit_test.rb +10 -0
  26. data/hobo_files/plugin/generators/hobo_model_controller/USAGE +30 -0
  27. data/hobo_files/plugin/generators/hobo_model_controller/hobo_model_controller_generator.rb +43 -0
  28. data/hobo_files/plugin/generators/hobo_model_controller/templates/controller.rb +5 -0
  29. data/hobo_files/plugin/generators/hobo_model_controller/templates/functional_test.rb +18 -0
  30. data/hobo_files/plugin/generators/hobo_model_controller/templates/helper.rb +2 -0
  31. data/hobo_files/plugin/generators/hobo_model_controller/templates/view.rhtml +2 -0
  32. data/hobo_files/plugin/generators/hobo_rapid/hobo_rapid_generator.rb +51 -0
  33. data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.js +436 -0
  34. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/default_mapping.rb +11 -0
  35. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/banner.gif +0 -0
  36. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_bodytop.gif +0 -0
  37. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_01.gif +0 -0
  38. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_02.gif +0 -0
  39. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_03.gif +0 -0
  40. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_04.gif +0 -0
  41. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_bottom.gif +0 -0
  42. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_left.gif +0 -0
  43. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_right.gif +0 -0
  44. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_top.gif +0 -0
  45. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_blue.gif +0 -0
  46. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_dblue.gif +0 -0
  47. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_green.gif +0 -0
  48. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_purple.gif +0 -0
  49. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_red.gif +0 -0
  50. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/logo.gif +0 -0
  51. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/spinner.gif +0 -0
  52. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_dblue.gif +0 -0
  53. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_green.gif +0 -0
  54. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_purple.gif +0 -0
  55. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_red.gif +0 -0
  56. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_01.gif +0 -0
  57. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_02.gif +0 -0
  58. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_03.gif +0 -0
  59. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_04.gif +0 -0
  60. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_bottom.gif +0 -0
  61. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_left.gif +0 -0
  62. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_right.gif +0 -0
  63. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_top.gif +0 -0
  64. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css +390 -0
  65. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +104 -0
  66. data/hobo_files/plugin/generators/hobo_user_model/USAGE +26 -0
  67. data/hobo_files/plugin/generators/hobo_user_model/hobo_user_model_generator.rb +38 -0
  68. data/hobo_files/plugin/generators/hobo_user_model/templates/fixtures.yml +11 -0
  69. data/hobo_files/plugin/generators/hobo_user_model/templates/migration.rb +15 -0
  70. data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +58 -0
  71. data/hobo_files/plugin/generators/hobo_user_model/templates/unit_test.rb +10 -0
  72. data/hobo_files/plugin/init.rb +44 -0
  73. data/hobo_files/plugin/lib/action_view_extensions/base.rb +14 -0
  74. data/hobo_files/plugin/lib/active_record/has_many_association.rb +54 -0
  75. data/hobo_files/plugin/lib/active_record/has_many_through_association.rb +22 -0
  76. data/hobo_files/plugin/lib/active_record/table_definition.rb +34 -0
  77. data/hobo_files/plugin/lib/extensions.rb +245 -0
  78. data/hobo_files/plugin/lib/extensions/test_case.rb +130 -0
  79. data/hobo_files/plugin/lib/hobo.rb +353 -0
  80. data/hobo_files/plugin/lib/hobo/HtmlString +3 -0
  81. data/hobo_files/plugin/lib/hobo/authenticated_user.rb +106 -0
  82. data/hobo_files/plugin/lib/hobo/authentication_support.rb +108 -0
  83. data/hobo_files/plugin/lib/hobo/composite_model.rb +66 -0
  84. data/hobo_files/plugin/lib/hobo/controller.rb +134 -0
  85. data/hobo_files/plugin/lib/hobo/controller_helpers.rb +135 -0
  86. data/hobo_files/plugin/lib/hobo/core.rb +475 -0
  87. data/hobo_files/plugin/lib/hobo/define_tags.rb +56 -0
  88. data/hobo_files/plugin/lib/hobo/dryml.rb +161 -0
  89. data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +126 -0
  90. data/hobo_files/plugin/lib/hobo/dryml/tag_module.rb +9 -0
  91. data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +57 -0
  92. data/hobo_files/plugin/lib/hobo/dryml/template.rb +586 -0
  93. data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +302 -0
  94. data/hobo_files/plugin/lib/hobo/dryml/template_handler.rb +19 -0
  95. data/hobo_files/plugin/lib/hobo/generator.rb +25 -0
  96. data/hobo_files/plugin/lib/hobo/html_string.rb +3 -0
  97. data/hobo_files/plugin/lib/hobo/lazy_hash.rb +28 -0
  98. data/hobo_files/plugin/lib/hobo/mapping_tags.rb +262 -0
  99. data/hobo_files/plugin/lib/hobo/markdown_string.rb +7 -0
  100. data/hobo_files/plugin/lib/hobo/model.rb +391 -0
  101. data/hobo_files/plugin/lib/hobo/model_controller.rb +676 -0
  102. data/hobo_files/plugin/lib/hobo/model_queries.rb +92 -0
  103. data/hobo_files/plugin/lib/hobo/model_support.rb +44 -0
  104. data/hobo_files/plugin/lib/hobo/password_string.rb +3 -0
  105. data/hobo_files/plugin/lib/hobo/predicate_dispatch.rb +78 -0
  106. data/hobo_files/plugin/lib/hobo/proc_binding.rb +32 -0
  107. data/hobo_files/plugin/lib/hobo/rapid.rb +447 -0
  108. data/hobo_files/plugin/lib/hobo/static_tags +92 -0
  109. data/hobo_files/plugin/lib/hobo/text.rb +3 -0
  110. data/hobo_files/plugin/lib/hobo/textile_string.rb +13 -0
  111. data/hobo_files/plugin/lib/hobo/undefined.rb +41 -0
  112. data/hobo_files/plugin/lib/hobo/undefined_access_error.rb +5 -0
  113. data/hobo_files/plugin/lib/hobo/where_fragment.rb +23 -0
  114. data/hobo_files/plugin/lib/rexml.rb +345 -0
  115. data/hobo_files/plugin/tags/core.dryml +6 -0
  116. data/hobo_files/plugin/tags/rapid.dryml +177 -0
  117. data/hobo_files/plugin/tags/rapid_editing.dryml +168 -0
  118. data/hobo_files/plugin/tags/rapid_navigation.dryml +95 -0
  119. data/hobo_files/plugin/tags/rapid_pages.dryml +175 -0
  120. data/hobo_files/plugin/tasks/environments.rake +19 -0
  121. data/hobo_files/plugin/tasks/hobo_tasks.rake +4 -0
  122. data/hobo_files/plugin/test/hobo_dryml_template_test.rb +7 -0
  123. data/hobo_files/plugin/test/hobo_test.rb +7 -0
  124. data/hobo_files/plugin/uninstall.rb +1 -0
  125. metadata +206 -0
@@ -0,0 +1,475 @@
1
+ module Hobo
2
+
3
+ module Core
4
+
5
+ include Hobo::DefineTags
6
+
7
+ include Hobo::ControllerHelpers
8
+
9
+ def debug(*args)
10
+ logger.debug("\n### DRYML Debug ###")
11
+ logger.debug(args.map {|a| PP.pp(a, "")}.join("-------\n"))
12
+ logger.debug("DRYML THIS = " + Hobo.dom_id(this).to_s)
13
+ logger.debug("###################\n")
14
+ args.first unless args.empty?
15
+ end
16
+
17
+
18
+ def add_classes!(options, *classes)
19
+ options[:class] = ([options[:class]] + classes).select{|x|x}.join(' ')
20
+ options
21
+ end
22
+
23
+
24
+ def add_classes(options, *classes)
25
+ add_classes!({}.update(options), classes)
26
+ end
27
+
28
+
29
+ def map_this
30
+ res = []
31
+ this.each_index {|i| new_field_context(i) { res << yield } }
32
+ res
33
+ end
34
+ alias_method :collect_this, :map_this
35
+
36
+
37
+ def comma_split(x)
38
+ case x
39
+ when nil
40
+ []
41
+ when Symbol
42
+ x.to_s
43
+ when String
44
+ x.split(/\s*,\s*/)
45
+ else
46
+ x.map{|e| comma_split(e)}.flatten
47
+ end
48
+ end
49
+
50
+
51
+ def can_create?(object)
52
+ Hobo.can_create?(current_user, object)
53
+ end
54
+
55
+
56
+ def can_update?(object, new)
57
+ Hobo.can_update?(current_user, object, new)
58
+ end
59
+
60
+
61
+ def can_edit?(object, field)
62
+ if !field and object.respond_to?(:proxy_reflection)
63
+ Hobo.can_edit?(current_user, object.proxy_owner, object.proxy_reflection.name)
64
+ else
65
+ Hobo.can_edit?(current_user, object, field)
66
+ end
67
+ end
68
+
69
+
70
+ def can_edit_this?
71
+ this_parent && this_field && can_edit?(this_parent, this_field)
72
+ end
73
+
74
+
75
+ def can_delete?(object)
76
+ Hobo.can_delete?(current_user, object)
77
+ end
78
+
79
+
80
+ def can_view?(object, field=nil)
81
+ if !field and object.respond_to?(:proxy_reflection)
82
+ Hobo.can_view?(current_user, object.proxy_owner, object.proxy_reflection.name)
83
+ else
84
+ Hobo.can_view?(current_user, object, field)
85
+ end
86
+ end
87
+
88
+
89
+ def can_view_this?
90
+ if this_parent && this_field
91
+ can_view?(this_parent, this_field)
92
+ else
93
+ can_view?(this)
94
+ end
95
+ end
96
+
97
+
98
+ def viewable(collection)
99
+ collection.select {|x| can_view?(x)}
100
+ end
101
+
102
+
103
+ def theme_asset(path)
104
+ "#{urlb}/hobothemes/#{Hobo.current_theme}/#{path}"
105
+ end
106
+
107
+
108
+ def_tag :dynamic_tag, :name do
109
+ send(name, options)
110
+ end
111
+
112
+
113
+ def_tag :display_name do
114
+ name_tag = "display_name_for_#{this.class.name.underscore}"
115
+ if respond_to?(name_tag)
116
+ send(name_tag)
117
+ elsif this.is_a?(Array) && this.respond_to?(:proxy_reflection)
118
+ "(#{count})"
119
+ elsif this.is_a? Class and this < ActiveRecord::Base
120
+ this.name.pluralize.titleize
121
+ else
122
+ res = [:display_name, :name, :title].search do |m|
123
+ show(options.merge(:attr => m)) if this.respond_to?(m) and can_view?(this, m)
124
+ end
125
+ res || "#{this.class.name.humanize} #{this.id}"
126
+ end
127
+ end
128
+
129
+
130
+ def_tag :object_link, :view, :to, :params do
131
+ target = to || this
132
+ if target.nil?
133
+ "(Not Available)"
134
+ elsif to ? can_view?(to) : can_view_this?
135
+ content = tagbody ? tagbody.call : call_replaceable_tag(:display_name, options, options.delete(:name))
136
+ link_class = "#{target.class.name.underscore}_link"
137
+ link_to content, object_url(target, view, params), add_classes(options, link_class)
138
+ end
139
+ end
140
+
141
+
142
+ def_tag :new_object_link, :for do
143
+ f = for_ || this
144
+ new = f.new
145
+ new.created_by(current_user)
146
+ if can_create?(new)
147
+ default = "New " + (f.is_a?(Array) ? f.proxy_reflection.klass.name : f.name).titleize
148
+ content = tagbody ? tagbody.call : default
149
+ link_class = "new_#{new.class.name.underscore}_link"
150
+ link_to content, object_url(f, "new"), add_classes(options, link_class)
151
+ end
152
+ end
153
+
154
+
155
+ def_tag :tag_for_object, :name do
156
+ opts = {}.update(options)
157
+ opts.delete(:name)
158
+
159
+ if this_type and m = "#{name}_for_#{this_type.name.underscore}" and respond_to?(m)
160
+ send(m, opts)
161
+ else
162
+ send(name, opts)
163
+ end
164
+ end
165
+
166
+
167
+ def_tag :show, :no_span, :truncate_tail do
168
+ # We can't do this as a declared attribute as it will hide the truncate helper
169
+ trunc = options.delete(:truncate)
170
+
171
+ raise HoboError, "show of non-viewable field '#{this_field}' of #{this_parent.typed_id rescue this_parent}" unless
172
+ can_view_this?
173
+
174
+ res = if this_type.respond_to?(:macro)
175
+ if this_type.macro == :belongs_to
176
+ show_belongs_to
177
+ elsif this_type.macro == :has_many
178
+ show_has_many
179
+ end
180
+
181
+ else
182
+ res2 = case this
183
+ when nil
184
+ this_type <= String ? "" : "(Not Available)"
185
+
186
+ when Date
187
+ if respond_to?(:show_date)
188
+ show_date
189
+ else
190
+ this.to_s(:long)
191
+ end
192
+
193
+ when Time
194
+ if respond_to?(:show_datetime)
195
+ show_datetime
196
+ else
197
+ this.to_s(:long)
198
+ end
199
+
200
+ when Numeric
201
+ format = options[:format]
202
+ format ? format % this : this.to_s
203
+
204
+ when Hobo::HtmlString
205
+ this
206
+
207
+ when Hobo::MarkdownString
208
+ markdown(this)
209
+
210
+ when Hobo::TextileString
211
+ textilize(this)
212
+
213
+ when Hobo::PasswordString
214
+ "[password withheld]"
215
+
216
+ when String
217
+ h(this).gsub("\n", "<br/>")
218
+
219
+ when TrueClass
220
+ "Yes"
221
+
222
+ when FalseClass
223
+ "No"
224
+
225
+ else
226
+ raise HoboError, "Cannot show: #{this.inspect} (field is #{this_field}, type is #{this.class})"
227
+ end
228
+
229
+
230
+
231
+ if !no_span && this_parent.respond_to?(:typed_id)
232
+ "<span hobo_model_id='#{this_field_dom_id}'>#{res2}</span>"
233
+ else
234
+ res2
235
+ end
236
+ end
237
+ trunc ? truncate(res2, trunc.to_i, truncate_tail || "...") : res
238
+ end
239
+
240
+
241
+ def_tag :show_belongs_to do
242
+ object_link
243
+ end
244
+
245
+
246
+ def_tag :show_has_many do
247
+ if this.empty?
248
+ "(none)"
249
+ else
250
+ map_this { object_link }.join(", ")
251
+ end
252
+ end
253
+
254
+
255
+ def js_str(s)
256
+ if s.is_a? Hobo::RawJs
257
+ s.to_s
258
+ else
259
+ "'" + s.gsub("'"){"\\'"} + "'"
260
+ end
261
+ end
262
+
263
+
264
+ def make_params_js(*args)
265
+ ("'" + make_params(*args) + "'").sub(/ \+ ''$/,'')
266
+ end
267
+
268
+
269
+ def render_params(*args)
270
+ parts = args.map{|x| x.split(/, */) if x}.compact.flatten
271
+ { :part_page => view_name,
272
+ :render => parts.map do |part_id|
273
+ { :object => Hobo::RawJs.new("hoboParts.#{part_id}"),
274
+ :part => part_id }
275
+ end
276
+ }
277
+ end
278
+
279
+
280
+ def nl_to_br(s)
281
+ s.to_s.gsub("\n", "<br/>") if s
282
+ end
283
+
284
+
285
+ def xattrs(options, klass=nil)
286
+ options ||= {}
287
+ if klass
288
+ options = add_classes(options.symbolize_keys, [klass])
289
+ end
290
+ options.map do |n,v|
291
+ v = v.to_s
292
+ val = v.include?("'") ? '"' + v + '"' : "'" + v + "'"
293
+ "#{n}=#{val}"
294
+ end.join(' ')
295
+ end
296
+
297
+
298
+ def param_name_for(object, field_path)
299
+ field_path = field_path.to_s.split(".") if field_path.is_a?(String, Symbol)
300
+ attrs = field_path.map{|part| "[#{part}]"}.join
301
+ "#{object.class.name.underscore}#{attrs}"
302
+ end
303
+
304
+
305
+ def param_name_for_this(association_foreign_key=false)
306
+ return "" unless form_this
307
+ name = if association_foreign_key and this_type.respond_to?(:macro) and this_type.macro == :belongs_to
308
+ param_name_for(form_this, form_field_path[0..-2] + [this_type.primary_key_name])
309
+ else
310
+ param_name_for(form_this, form_field_path)
311
+ end
312
+ register_form_field(name)
313
+ name
314
+ end
315
+
316
+
317
+ def selector_type
318
+ if this.is_a? ActiveRecord::Base
319
+ this.class
320
+ elsif this.respond_to? :member_class
321
+ this.member_class
322
+ elsif this == @this
323
+ @model
324
+ end
325
+ end
326
+
327
+
328
+ def_tag :human_type, :style do
329
+ if can_view_this?
330
+ res = if this.respond_to? :proxy_reflection
331
+ this.proxy_reflection.klass.name.pluralize
332
+ elsif this.is_a? Class
333
+ this.name
334
+ else
335
+ this.class.name
336
+ end
337
+ res.underscore.humanize.send(style || :titleize)
338
+ end
339
+ end
340
+
341
+
342
+ def_tag :partial, :as do
343
+ render(:partial => find_partial(this, as), :locals => { :this => this })
344
+ end
345
+
346
+
347
+ def_tag :repeat, :even_odd, :else do
348
+ if this.empty?
349
+ else_
350
+ else
351
+ if even_odd
352
+ map_this do
353
+ klass = [options[:class], cycle("even", "odd")].compact.join(' ')
354
+ content_tag(even_odd, tagbody.call, options.merge(:class => klass, :hobo_model_id => dom_id(this)))
355
+ end
356
+ else
357
+ map_this { tagbody.call }
358
+ end
359
+ end
360
+ end
361
+
362
+
363
+ def_tag :transpose_and_repeat, :with_field do
364
+ matrix = this.map {|obj| obj.send(with_field) }
365
+ max_length = matrix.omap{ length }.max
366
+ matrix = matrix.map do |a|
367
+ a + [nil] * (max_length - a.length)
368
+ end
369
+ repeat(:obj => matrix.transpose) { tagbody.call }
370
+ end
371
+
372
+
373
+ def_tag :count, :label, :prefix do
374
+ raise Exception.new("asked for count of a string") if this.is_a?(String)
375
+
376
+ l = label
377
+ if this.is_a?(Class) and this < ActiveRecord::Base
378
+ c = this.count
379
+ l ||= this.name.titleize
380
+ else
381
+ unless label
382
+ assoc_name = this.proxy_reflection.name.to_s
383
+ l = assoc_name.singularize.titleize
384
+ end
385
+ c = this.size
386
+ end
387
+
388
+ main = l.blank? ? c : pluralize(c, l)
389
+
390
+ if prefix == "are"
391
+ p = c == 1 ? "is" : "are"
392
+ p + ' ' + main
393
+ else
394
+ main
395
+ end
396
+ end
397
+
398
+
399
+ def_tag :with do
400
+ tagbody.call
401
+ end
402
+
403
+
404
+ def_tag :join, :with do
405
+ map_this { tagbody.call }.join(with)
406
+ end
407
+
408
+
409
+ def_tag :link_tag, :href, :controller, :action, :id do
410
+ link_to(tagbody.call, href ? href : { :controller => controller, :action => action, :id => id })
411
+ end
412
+
413
+
414
+ def_tag :if, :q do
415
+ res = q ? tagbody.call : ""
416
+ Dryml.last_if = q
417
+ res
418
+ end
419
+
420
+
421
+ def_tag :else do
422
+ tagbody.call unless Dryml.last_if
423
+ end
424
+
425
+
426
+ def_tag :unless, :q do
427
+ if_(:q => !q) { tagbody.call }
428
+ end
429
+
430
+
431
+ def_tag :if_blank do
432
+ if_(:q => this.blank?) { tagbody.call }
433
+ end
434
+
435
+
436
+ def_tag :unless_blank do
437
+ if_(:q => !this.blank?) { tagbody.call }
438
+ end
439
+
440
+
441
+ def_tag :if_empty do
442
+ if_(:q => this.empty?) { tagbody.call }
443
+ end
444
+
445
+
446
+ def_tag :unless_empty do
447
+ if_(:q => !this.empty?) { tagbody.call }
448
+ end
449
+
450
+
451
+ def_tag :if_this do
452
+ if_(:q => this) { tagbody.call }
453
+ end
454
+
455
+
456
+ def_tag :if_can_delete do
457
+ if_(:q => can_delete?(this)) { tagbody.call }
458
+ end
459
+
460
+
461
+ def_tag :if_can_create do
462
+ if_(:q => can_create?(this)) { tagbody.call }
463
+ end
464
+
465
+
466
+ def_tag :if_can_view do
467
+ if_(:q => can_view?(this)) { tagbody.call }
468
+ end
469
+
470
+ def_tag :if_can_edit do
471
+ if_(:q => can_edit_this?) { tagbody.call }
472
+ end
473
+
474
+ end
475
+ end