nitro 0.31.0 → 0.40.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.
Files changed (174) hide show
  1. data/bin/nitro +135 -37
  2. data/doc/CHANGELOG.1 +108 -108
  3. data/doc/CHANGELOG.2 +89 -89
  4. data/doc/CHANGELOG.3 +105 -105
  5. data/{CHANGELOG → doc/CHANGELOG.4} +509 -509
  6. data/doc/{AUTHORS → CONTRIBUTORS} +49 -37
  7. data/doc/LIBRARIES +13 -0
  8. data/doc/LICENSE +2 -3
  9. data/doc/MIGRATION +45 -0
  10. data/doc/RELEASES +131 -11
  11. data/doc/TODO +67 -0
  12. data/lib/glue/magick.rb +0 -3
  13. data/lib/glue/sweeper.rb +30 -15
  14. data/lib/glue/thumbnails.rb +0 -2
  15. data/lib/glue/webfile.rb +23 -11
  16. data/lib/nitro.rb +37 -44
  17. data/lib/nitro/adapter/cgi.rb +0 -3
  18. data/lib/nitro/adapter/console.rb +0 -2
  19. data/lib/nitro/adapter/fastcgi.rb +6 -3
  20. data/lib/nitro/adapter/mongrel.rb +97 -58
  21. data/lib/nitro/adapter/script.rb +4 -6
  22. data/lib/nitro/adapter/webrick.rb +33 -87
  23. data/lib/nitro/adapter/webrick/vcr.rb +85 -0
  24. data/lib/nitro/caching.rb +0 -2
  25. data/lib/nitro/caching/actions.rb +0 -2
  26. data/lib/nitro/caching/fragments.rb +0 -2
  27. data/lib/nitro/caching/output.rb +45 -16
  28. data/lib/nitro/caching/proxy.rb +49 -0
  29. data/lib/nitro/cgi.rb +3 -6
  30. data/lib/nitro/cgi/cookie.rb +0 -3
  31. data/lib/nitro/cgi/request.rb +67 -24
  32. data/lib/nitro/cgi/response.rb +0 -2
  33. data/lib/nitro/cgi/{sendfile.rb → send_file.rb} +7 -6
  34. data/lib/nitro/compiler.rb +62 -55
  35. data/lib/nitro/compiler/cleanup.rb +0 -3
  36. data/lib/nitro/compiler/elements.rb +31 -28
  37. data/lib/nitro/compiler/errors.rb +2 -5
  38. data/lib/nitro/compiler/include.rb +10 -8
  39. data/lib/nitro/compiler/layout.rb +0 -2
  40. data/lib/nitro/compiler/localization.rb +0 -2
  41. data/lib/nitro/compiler/markup.rb +14 -6
  42. data/lib/nitro/compiler/morphing.rb +1 -5
  43. data/lib/nitro/compiler/script.rb +2 -4
  44. data/lib/nitro/compiler/squeeze.rb +0 -2
  45. data/lib/nitro/compiler/xslt.rb +0 -2
  46. data/lib/nitro/context.rb +10 -5
  47. data/lib/nitro/control.rb +18 -0
  48. data/lib/nitro/control/attribute.rb +88 -0
  49. data/lib/nitro/control/attribute/checkbox.rb +19 -0
  50. data/lib/nitro/control/attribute/datetime.rb +21 -0
  51. data/lib/nitro/control/attribute/file.rb +20 -0
  52. data/lib/nitro/control/attribute/fixnum.rb +26 -0
  53. data/lib/nitro/control/attribute/float.rb +26 -0
  54. data/lib/nitro/control/attribute/options.rb +38 -0
  55. data/lib/nitro/control/attribute/password.rb +16 -0
  56. data/lib/nitro/control/attribute/text.rb +16 -0
  57. data/lib/nitro/control/attribute/textarea.rb +16 -0
  58. data/lib/nitro/control/none.rb +16 -0
  59. data/lib/nitro/control/relation.rb +53 -0
  60. data/lib/nitro/control/relation/belongs_to.rb +0 -0
  61. data/lib/nitro/control/relation/has_many.rb +97 -0
  62. data/lib/nitro/control/relation/joins_many.rb +0 -0
  63. data/lib/nitro/control/relation/many_to_many.rb +0 -0
  64. data/lib/nitro/control/relation/refers_to.rb +29 -0
  65. data/lib/nitro/controller.rb +7 -296
  66. data/lib/nitro/dispatcher.rb +72 -34
  67. data/lib/nitro/element.rb +36 -10
  68. data/lib/nitro/element/javascript.rb +0 -2
  69. data/lib/nitro/flash.rb +23 -10
  70. data/lib/nitro/global.rb +36 -11
  71. data/lib/nitro/helper.rb +22 -8
  72. data/lib/nitro/helper/benchmark.rb +0 -2
  73. data/lib/nitro/helper/buffer.rb +0 -3
  74. data/lib/nitro/helper/css.rb +12 -0
  75. data/lib/nitro/helper/debug.rb +1 -3
  76. data/lib/nitro/helper/default.rb +1 -0
  77. data/lib/nitro/helper/feed.rb +400 -386
  78. data/lib/nitro/helper/form.rb +246 -116
  79. data/lib/nitro/helper/javascript.rb +28 -2
  80. data/lib/nitro/helper/javascript/morphing.rb +0 -2
  81. data/lib/nitro/helper/javascript/prototype.rb +0 -2
  82. data/lib/nitro/helper/javascript/scriptaculous.rb +0 -1
  83. data/lib/nitro/helper/layout.rb +0 -2
  84. data/lib/nitro/helper/navigation.rb +87 -0
  85. data/lib/nitro/helper/pager.rb +11 -22
  86. data/lib/nitro/helper/table.rb +9 -32
  87. data/lib/nitro/helper/url.rb +104 -0
  88. data/lib/nitro/helper/xhtml.rb +20 -4
  89. data/lib/nitro/helper/xml.rb +0 -2
  90. data/lib/nitro/markup.rb +131 -0
  91. data/lib/nitro/part.rb +52 -7
  92. data/lib/nitro/publishable.rb +328 -0
  93. data/lib/nitro/render.rb +30 -61
  94. data/lib/nitro/router.rb +12 -4
  95. data/lib/nitro/sanitize.rb +48 -0
  96. data/lib/nitro/scaffold.rb +9 -11
  97. data/lib/nitro/scaffold/controller.rb +25 -0
  98. data/lib/nitro/scaffold/model.rb +150 -0
  99. data/lib/nitro/scaffolding.rb +1 -3
  100. data/lib/nitro/server.rb +57 -32
  101. data/lib/nitro/server/drb.rb +16 -2
  102. data/lib/nitro/server/runner.rb +80 -102
  103. data/lib/nitro/service.rb +0 -1
  104. data/lib/nitro/service/xmlrpc.rb +0 -2
  105. data/lib/nitro/session.rb +26 -18
  106. data/lib/nitro/session/drb.rb +2 -16
  107. data/lib/nitro/session/memory.rb +0 -2
  108. data/lib/nitro/template.rb +219 -0
  109. data/lib/nitro/test/assertions.rb +1 -3
  110. data/lib/nitro/test/context.rb +0 -1
  111. data/lib/nitro/test/testcase.rb +0 -1
  112. data/lib/nitro/version.rb +6 -0
  113. data/lib/part/admin.rb +16 -0
  114. data/lib/part/admin/controller.rb +19 -0
  115. data/lib/part/admin/helper.rb +30 -0
  116. data/lib/part/admin/og/controller.rb +114 -0
  117. data/lib/part/admin/og/customize.rb +4 -0
  118. data/lib/part/admin/og/template/index.xhtml +27 -0
  119. data/lib/part/admin/og/template/list.xhtml +38 -0
  120. data/lib/part/admin/og/template/search.xhtml +20 -0
  121. data/lib/part/admin/og/template/update.xhtml +25 -0
  122. data/lib/part/admin/skin.rb +207 -0
  123. data/lib/part/admin/template/denied.xhtml +13 -0
  124. data/lib/part/admin/template/index.xhtml +12 -0
  125. data/lib/part/admin/todo.txt +2 -0
  126. data/proto/public/error.xhtml +4 -2
  127. data/proto/run.rb +0 -2
  128. data/test/glue/tc_webfile.rb +1 -0
  129. data/test/nitro/cgi/tc_request.rb +23 -0
  130. data/test/nitro/helper/tc_feed.rb +0 -3
  131. data/test/nitro/helper/tc_navbar.rb +74 -0
  132. data/test/nitro/helper/tc_table.rb +2 -0
  133. data/test/nitro/tc_cgi.rb +72 -19
  134. data/test/nitro/tc_controller.rb +35 -26
  135. data/test/nitro/tc_controller_aspect.rb +1 -0
  136. data/test/nitro/tc_controller_params.rb +864 -0
  137. data/test/nitro/tc_dispatcher.rb +2 -2
  138. data/test/nitro/tc_element.rb +16 -16
  139. data/test/nitro/tc_flash.rb +3 -3
  140. data/test/nitro/tc_markup.rb +31 -0
  141. data/test/nitro/tc_render.rb +12 -14
  142. data/test/nitro/tc_session.rb +9 -7
  143. data/test/nitro/tc_template.rb +34 -0
  144. metadata +217 -198
  145. data/INSTALL +0 -121
  146. data/ProjectInfo +0 -74
  147. data/README +0 -555
  148. data/doc/apache.txt +0 -9
  149. data/doc/config.txt +0 -28
  150. data/doc/faq.txt +0 -7
  151. data/doc/lhttpd.txt +0 -7
  152. data/lib/nitro/adapter/scgi.rb +0 -239
  153. data/lib/nitro/helper/form/builder.rb +0 -144
  154. data/lib/nitro/helper/form/controls.rb +0 -389
  155. data/lib/nitro/helper/rss.rb +0 -72
  156. data/proto/conf/apache.conf +0 -51
  157. data/proto/public/scaffold/advanced_search.xhtml +0 -30
  158. data/proto/public/scaffold/edit.xhtml +0 -11
  159. data/proto/public/scaffold/form.xhtml +0 -1
  160. data/proto/public/scaffold/index.xhtml +0 -20
  161. data/proto/public/scaffold/list.xhtml +0 -32
  162. data/proto/public/scaffold/new.xhtml +0 -11
  163. data/proto/public/scaffold/search.xhtml +0 -29
  164. data/proto/public/scaffold/view.xhtml +0 -8
  165. data/proto/script/scgi_ctl +0 -221
  166. data/proto/script/scgi_service +0 -128
  167. data/setup.rb +0 -1585
  168. data/src/part/admin.rb +0 -16
  169. data/src/part/admin/controller.rb +0 -81
  170. data/src/part/admin/skin.rb +0 -21
  171. data/src/part/admin/system.css +0 -135
  172. data/src/part/admin/template/denied.xhtml +0 -1
  173. data/src/part/admin/template/index.xhtml +0 -43
  174. data/test/nitro/helper/tc_rss.rb +0 -24
@@ -166,5 +166,3 @@ Morphing.add_morpher :auto_complete, AutoCompleteMorpher
166
166
  Morphing.add_morpher :draggable, DraggableMorpher
167
167
 
168
168
  end
169
-
170
- # * George Moschovitis <gm@navel.gr>
@@ -92,5 +92,3 @@ module ScriptGenerator
92
92
  end
93
93
 
94
94
  end
95
-
96
- # * George Moschovitis <gm@navel.gr>
@@ -15,4 +15,3 @@ end
15
15
 
16
16
  end
17
17
 
18
- # * George Moschovitis <gm@navel.gr>
@@ -38,5 +38,3 @@ module LayoutHelper
38
38
  end
39
39
 
40
40
  end
41
-
42
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,87 @@
1
+ module Nitro
2
+
3
+ # A helper mixin for programmatically building Navigation Menus
4
+ # through easy to style XHTML.
5
+ # The code resulting from these methods is in line with that found in most examples at
6
+ # listamatic, thus you can use prebuilt CSS and Javascript to create horizontal or vertical menus.
7
+ # Basically it generates something like
8
+ # <div id="navcontainer">
9
+ # <ul id="navlist">
10
+ # <li id="active"> <a href="/foo" id="current"> Current Page </a></li>
11
+ # <li> <a href="/bar"> Other page </a> </li>
12
+ # </ul>
13
+ # </div>
14
+ #
15
+ # This helper takes care of setting of putting the special CSS
16
+ # identifiers for the current controller automatically.
17
+ # You could override menuitem_active_on(path)
18
+ # to change the behaviour that choose the active item,
19
+ # for example to keep the item "Wiki" active both for
20
+ # /wiki/pageone and /wiki/pagetwo
21
+ #
22
+ # Example of horizontal bar at listamatic:
23
+ # http://css.maxdesign.com.au/listamatic/horizontal26.htm
24
+ # Vertical example
25
+ # http://css.maxdesign.com.au/listamatic/vertical09.htm
26
+ #
27
+ # NOTE: No tests were made with Publishable objects which are not
28
+ # subclass of Nitro::Controller, but it _should_ work.
29
+
30
+ module NavigationHelper
31
+
32
+ TEMPLATE=<<Eof
33
+ <div id="navcontainer">
34
+ <ul id="navlist">
35
+ LIST
36
+ </ul>
37
+ </div>
38
+ Eof
39
+
40
+ # Takes a list of controllers and builds a menu
41
+ # using #mount_path as the url and the controller name as text.
42
+ # An eventual "Controller" suffix will be stripped, so i.e. for controllers
43
+ # named +HomeController+, +Pages+, +FeedCtl+ it will use
44
+ # +Home+, +Page+, +FeedCtl+.
45
+ #
46
+ # For more finegrained control you can pass a block to this function, each
47
+ # controller will be passed to it and the result will be used as the text
48
+ # for the menu item.
49
+ #
50
+ #
51
+ # Otherwise you can specify pairs of path/text using #navigation_for_hash
52
+
53
+ def menu_for(*controllers) #:yields:
54
+ hash= {}
55
+ controllers.each do |c|
56
+ hash[c.mount_path] = block_given? ? yield(c) : c.name.gsub(/Controller/,'')
57
+ end
58
+ menu_from_hash(hash)
59
+ end
60
+
61
+ # The argument must be an hash of pairs {'path'=>'text for menu item'},
62
+ # no control will be applied on these values, they will be used directly.
63
+ # You can use the method like
64
+ # navigation_for_hash '/foo/bar'=>'Page One', '/foo/baz'=>'Page Two'
65
+ #
66
+ # The method takes care of setting the CSS values as expected.
67
+ #
68
+ # To avoid specifying everything the method #navigation_menu can be used.
69
+
70
+ def menu_from_hash(hash)
71
+ list=hash.map do |path,name|
72
+ if menuitem_active_on?(path)
73
+ %{<li id="active"><a href="#{path}" id="current"> #{name} </a></li>}
74
+ else
75
+ %{<li><a href="#{path}"> #{name} </a></li>}
76
+ end
77
+ end.join("\n")
78
+ TEMPLATE.gsub("LIST",list)
79
+ end
80
+
81
+ def menuitem_active_on?(path)
82
+ path == request.path
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -24,10 +24,6 @@ class Pager
24
24
 
25
25
  setting :key, :default => '_page', :doc => 'The request key'
26
26
 
27
- # The nav link titles
28
-
29
- setting :link_titles, :default => {:first => 'First', :previous => 'Previous', :last => 'Last', :next => 'Next'}, :doc => "Titles of pager links"
30
-
31
27
  # The current page.
32
28
 
33
29
  attr_accessor :page
@@ -44,10 +40,10 @@ class Pager
44
40
 
45
41
  attr_accessor :total_count
46
42
 
47
- def initialize(request, per_page, total_count, key = Pager.key, link_titles = Pager.link_titles)
43
+ def initialize(request, per_page, total_count, key = Pager.key)
48
44
  raise 'per_page should be > 0' unless per_page > 0
49
45
 
50
- @request, @key, @link_titles = request, key, link_titles
46
+ @request, @key = request, key
51
47
  @page = request.query.fetch(key, 1).to_i
52
48
  @per_page = per_page
53
49
  set_count(total_count)
@@ -59,10 +55,6 @@ class Pager
59
55
  @page_count = (@total_count.to_f / @per_page).ceil
60
56
  end
61
57
 
62
- def has_pages?
63
- return @page_count > 1
64
- end
65
-
66
58
  # Return the first page index.
67
59
 
68
60
  def first_page
@@ -196,18 +188,17 @@ class Pager
196
188
  def navigation
197
189
  nav = ""
198
190
 
199
- return nav unless has_pages?
200
191
  unless first_page?
201
192
  nav << %{
202
- <div class="first"><a href="#{first_page_href}">#{CGI.escapeHTML(@link_titles[:first])}</a></div>
203
- <div class="previous"><a href="#{previous_page_href}">#{CGI.escapeHTML(@link_titles[:previous])}</a></div>
193
+ <div class="first"><a href="#{first_page_href}">First</a></div>
194
+ <div class="previous"><a href="#{previous_page_href}">Previous</a></div>
204
195
  }
205
196
  end
206
197
 
207
198
  unless last_page?
208
199
  nav << %{
209
- <div class="last"><a href="#{last_page_href}">#{CGI.escapeHTML(@link_titles[:last])}</a></div>
210
- <div class="next"><a href="#{next_page_href}">#{CGI.escapeHTML(@link_titles[:next])}</a></div>
200
+ <div class="last"><a href="#{last_page_href}">Last</a></div>
201
+ <div class="next"><a href="#{next_page_href}">Next</a></div>
211
202
  }
212
203
  end
213
204
 
@@ -277,26 +268,26 @@ private
277
268
  # #{pager.links}
278
269
 
279
270
  def paginate(items, options = {})
280
- per_page = options.delete(:per_page) || Pager.per_page
271
+ per_page = options.delete(:per_page) || options[:limit] || Pager.per_page
281
272
  pager_key = options.delete(:pager_key) || Pager.key
282
- pager_link_titles = Pager.link_titles.merge(options.delete(:pager_link_titles) || Pager.link_titles)
273
+
283
274
  case items
284
275
  when Array
285
276
  items = items.dup
286
- pager = Pager.new(request, per_page, items.size, pager_key, pager_link_titles)
277
+ pager = Pager.new(request, per_page, items.size, pager_key)
287
278
  items = items.slice(pager.offset, pager.per_page) || []
288
279
  return items, pager
289
280
 
290
281
  when Og::Collection
291
282
  collection = items
292
- pager = Pager.new(request, per_page, collection.count, pager_key, pager_link_titles)
283
+ pager = Pager.new(request, per_page, collection.count, pager_key)
293
284
  options.update(pager.limit)
294
285
  items = collection.reload(options)
295
286
  return items, pager
296
287
 
297
288
  when Class
298
289
  klass = items
299
- pager = Pager.new(request, per_page, klass.count(options), pager_key, pager_link_titles)
290
+ pager = Pager.new(request, per_page, klass.count(options), pager_key)
300
291
  options.update(pager.limit)
301
292
  items = klass.all(options)
302
293
  return items, pager
@@ -306,5 +297,3 @@ private
306
297
  end
307
298
 
308
299
  end
309
-
310
- # * George Moschovitis <gm@navel.gr>
@@ -37,6 +37,7 @@ module Nitro
37
37
  #
38
38
  #--
39
39
  # TODO: legend, verbose... ?
40
+ # TODO, gmosx: Remove crappy, bloatware additions.
40
41
  #++
41
42
 
42
43
  module TableHelper
@@ -84,7 +85,7 @@ module TableHelper
84
85
  def table_rows(options)
85
86
  # also accept :items, :rows
86
87
  options[:values] = options[:values] || options[:items] || options[:rows]
87
-
88
+
88
89
  str = ''
89
90
  str << table_header(options) if options[:headers]
90
91
  str << table_footer(options) if options[:footers]
@@ -111,7 +112,7 @@ module TableHelper
111
112
  str << '>'
112
113
 
113
114
  for value in row
114
- str << %|<td>#{process(value)}</td>|
115
+ str << %|<td>#{value}</td>|
115
116
  end
116
117
 
117
118
  str << '</tr>'
@@ -131,7 +132,7 @@ module TableHelper
131
132
  str << '>'
132
133
 
133
134
  for value in row
134
- str << %|<td>#{process(value)}</td>|
135
+ str << %|<td>#{value}</td>|
135
136
  end
136
137
 
137
138
  str << '</tr>'
@@ -159,7 +160,6 @@ module TableHelper
159
160
  str << '<tr>'
160
161
 
161
162
  options[:headers].each_with_index do |header, index|
162
- header = process(header)
163
163
  if (options[:order] && options[:order][:values] &&
164
164
  options[:order][:values][index])
165
165
  order_by = options[:order][:values][index]
@@ -233,37 +233,14 @@ module TableHelper
233
233
  return Glue::UriUtils.update_query_string(request.uri.to_s, params)
234
234
  end
235
235
 
236
+ #--
237
+ # gmosx: Arrgh!! dangerous method, who added this?
238
+ #++
239
+
236
240
  def create_tbody?(options)
237
- options[:values][0].respond_to?(:to_ary) && options[:values][0][0].respond_to?(:to_ary)
238
- end
239
-
240
- # A simple hack to allow Localization-processing in the table-helper
241
- # overwrite this method to make this happen
242
- # Now you can just pass [[somestring]] to the tablehelper and it will
243
- # be localized like the rest of the page.
244
- # ATM it's only kicking in when the @lc is set.
245
- #
246
- # Example for the method:
247
- # module Nitro
248
- # module TableHelper
249
- # def process(value)
250
- # val = value.to_s.gsub(/\[\[(.*?)\]\]/){ @lc[$1] }
251
- # return val == "" ? value : val
252
- # end
253
- # end
254
- # end
255
-
256
- def process(value)
257
- if @lc
258
- val = value.to_s.gsub(/\[\[(.*?)\]\]/){ @lc[$1] }
259
- return val == "" ? value : val
260
- end
261
- return value
241
+ options[:values][0][0].respond_to?(:to_ary)
262
242
  end
263
243
 
264
244
  end
265
245
 
266
246
  end
267
-
268
- # * George Moschovitis <gm@navel.gr>
269
- # * Kashia Buch <kashia@vfemail.net>
@@ -0,0 +1,104 @@
1
+ module Nitro
2
+
3
+ module URLHelper
4
+
5
+ # Encode controller, action, params into a valid url.
6
+ # Automatically respects nice urls and routing.
7
+ #
8
+ # Handles parameters either as a hash or as an array.
9
+ # Use the array method to pass parameters to 'nice' actions.
10
+ #
11
+ # Pass Controller, action, and (param_name, param_value)
12
+ # pairs.
13
+ #
14
+ # === Examples
15
+ #
16
+ # encode_url ForaController, :post, :title, 'Hello', :body, 'World'
17
+ # encode_url :post, :title, 'Hello', :body, 'World' # => implies controller == self
18
+ # encode_url :kick, :oid, 4
19
+ # encode_url article # => article.to_href
20
+ #
21
+ # Alternatively you can pass options with a hash:
22
+ #
23
+ # encode_url :controller => ForaController, :action => :delete, :params => { :title => 'Hello' }
24
+ # encode_url :action => :delete
25
+ #--
26
+ # FIXME: better implementation? optimize this?
27
+ # TODO: move elsewhere.
28
+ #++
29
+
30
+ def encode_url(*args)
31
+ f = args.first
32
+
33
+ # A standard url as string, return as is.
34
+
35
+ if f.is_a? String
36
+ return f
37
+ end
38
+
39
+ # If the passed param is an object that responds to :to_href
40
+ # returns the url to this object.
41
+
42
+ if f.respond_to? :to_href
43
+ return args.first.to_href
44
+ end
45
+
46
+ if f.is_a? Symbol
47
+ # no controller passed, imply controller == self!
48
+ args.unshift(self.class)
49
+ end
50
+
51
+ # Try to encode using the router.
52
+
53
+ if url = Nitro.server.dispatcher.encode_route(*args)
54
+ return url
55
+ end
56
+
57
+ # No routing rule, manual encoding.
58
+
59
+ controller = args.shift
60
+ action = args.shift.to_sym
61
+
62
+ if action == :index
63
+ url = "#{controller.mount_path}"
64
+ else
65
+ mount_path = controller.mount_path
66
+ mount_path = nil if mount_path == '/'
67
+ url = "#{mount_path}/#{action}"
68
+ end
69
+
70
+ unless args.empty?
71
+ if controller.respond_to_action_or_template? action
72
+ param_count = controller.instance_method(action).arity
73
+ if param_count != 0
74
+ param_count.times do
75
+ args.shift # name
76
+ url << "/#{CGI.escape(args.shift.to_s)}"
77
+ end
78
+ end
79
+ end
80
+
81
+ unless args.empty?
82
+ url << '?'
83
+ params = []
84
+ (args.size / 2).times do
85
+ params << "#{args.shift}=#{args.shift}"
86
+ end
87
+ url << params.join(';')
88
+ end
89
+ end
90
+
91
+ return url
92
+ end
93
+ alias R encode_url
94
+
95
+ # Just like encode_url, but generates an absolute url instead.
96
+
97
+ def encode_absolute_url(*args)
98
+ return "#{request.host_url}#{encode_url(*args)}"
99
+ end
100
+ alias RA encode_absolute_url
101
+
102
+ end
103
+
104
+ end
@@ -6,6 +6,9 @@ module Nitro
6
6
  module XhtmlHelper
7
7
 
8
8
  # Creates the href of an Object.
9
+ #--
10
+ # gmosx: this duplicates R functionality, merge!
11
+ #++
9
12
 
10
13
  def href_of(obj, base = nil)
11
14
  if obj.is_a?(Symbol) or obj.is_a?(String)
@@ -89,11 +92,25 @@ module XhtmlHelper
89
92
  end
90
93
  end
91
94
 
95
+ # Convert a collection of objects to options.
96
+
97
+ def objects_to_options(objs, params = {})
98
+ labels = []
99
+ values = []
100
+ for obj in objs
101
+ labels << obj.to_s
102
+ values << obj.pk
103
+ end
104
+ params[:labels] = labels
105
+ params[:values] = values
106
+ options(params)
107
+ end
108
+
92
109
  # Render a hidden form input.
93
110
 
94
- def hidden(options)
95
- opts = options.collect { |k, v| %[#{k}="#{v}"] }.join(' ')
96
- %[<input type="hidden" #{opts} />]
111
+ def hidden(name, value)
112
+ # opts = options.collect { |k, v| %[#{k}="#{v}"] }.join(' ')
113
+ %[<input type="hidden" name="#{name}" value="#{value}" />]
97
114
  end
98
115
 
99
116
  # Render a submit input.
@@ -199,4 +216,3 @@ end
199
216
 
200
217
  end
201
218
 
202
- # * George Moschovitis <gm@navel.gr>
@@ -123,5 +123,3 @@ class Glue::XmlBuilder
123
123
  end
124
124
 
125
125
  end
126
-
127
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,131 @@
1
+ require 'singleton'
2
+ require 'redcloth'
3
+ require 'cgi'
4
+
5
+ require 'facets/core/module/class_extension'
6
+
7
+ require 'nitro/sanitize'
8
+
9
+ module Nitro
10
+
11
+ # Generalised Markup transformations.
12
+ #
13
+ # The expand methods evaluate (expand) the markup
14
+ # code to produce the final content. The compact
15
+ # methods reverse this process to create the original
16
+ # markup code. Not all markup transformations are
17
+ # reversible.
18
+ #
19
+ # When this library is included, the default PropertyUtils
20
+ # implementation is overriden to add markup support.
21
+ #
22
+ # === Examples
23
+ #
24
+ # Define your custom markup methods like this:
25
+ #
26
+ # module Markup
27
+ # def markup_simple
28
+ # ...
29
+ # end
30
+ # def markup_special
31
+ # ...
32
+ # end
33
+ #
34
+ # # maps the {{..}} macro
35
+ # alias_method :sanitize, :markup_simple
36
+ # # maps the {|..|} macro
37
+ # alias_method :markup, :markup_special
38
+ # end
39
+ #
40
+ # here comes the #{obj.body} # => prints the expanded version.
41
+ #
42
+ # obj.body = markup(@params['body'])
43
+
44
+ module Markup
45
+
46
+ private
47
+ # The default markup method. You should override this method
48
+ # in your application to call your custom markup
49
+ # methods.
50
+
51
+ def expand(str)
52
+ if str
53
+ xstr = str.dup
54
+ xstr.gsub!(/</, '&lt;')
55
+ xstr.gsub!(/>/, '&gt;')
56
+ xstr.gsub!(/\r/, '<br />')
57
+ return String.sanitize(xstr)
58
+ end
59
+ return nil
60
+ end
61
+ alias_method :sanitize, :expand
62
+
63
+ # ...
64
+ begin
65
+ require 'redcloth'
66
+ # Translates a String with Textile/Markdown formatting
67
+ # into XHTML. Depends on the RedCloth gem to work properly
68
+
69
+ def expand_redcloth(str)
70
+ if str
71
+ return RedCloth.new(expand(str)).to_html
72
+ end
73
+ return nil
74
+ end
75
+ rescue LoadError
76
+ def expand_redcloth(str) # :nodoc:
77
+ "You called expand_redcloth(), but it needs RedCloth installed to work"
78
+ end
79
+ end
80
+ alias_method :markup, :expand_redcloth
81
+
82
+ # Compact (reverse) the content to the origial markup
83
+ # code. Not all markup transformations are reversible.
84
+ # You should override this method in your application
85
+ # to call your custom markup methods.
86
+ #
87
+ # NOT IMPLEMENTED.
88
+
89
+ def compact(str, meth = nil)
90
+ end
91
+
92
+ # Remove markup code from the input string.
93
+ #
94
+ # NOT IMPLEMENTED.
95
+
96
+ def clear(str)
97
+ end
98
+
99
+ def escape(str)
100
+ CGI.escape(str.gsub(/ /, '_'))
101
+ end
102
+
103
+ def unescape(str)
104
+ CGI.unescape(str.gsub(/_/, ' '))
105
+ end
106
+
107
+ class_extension do
108
+ # Helper method for manipulating the sanitize transformation.
109
+
110
+ def setup_sanitize_transform(&block)
111
+ self.send :define_method, :sanitize, block
112
+ end
113
+ alias_method :setup_sanitize_transformation, :setup_sanitize_transform
114
+
115
+ # Helper method for manipulating the markup transformation.
116
+
117
+ def setup_markup_transform(&block)
118
+ self.send :define_method, :markup, block
119
+ end
120
+ alias_method :setup_markup_transformation, :setup_markup_transform
121
+ end
122
+ end
123
+
124
+ # An abstract Markup class.
125
+
126
+ class MarkupKit
127
+ extend Markup
128
+ include Markup
129
+ end
130
+
131
+ end