nitro 0.31.0 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,3 +1,5 @@
1
+ require 'facets/core/class/descendents'
2
+
1
3
  module Nitro
2
4
 
3
5
  # A part is a module of reusable functionality encapsulated as
@@ -58,18 +60,61 @@ module Nitro
58
60
  # 'inherits' its templates. If you want to customize (override)
59
61
  # one template, just place a template with the same name in the
60
62
  # respective directory in the application template root.
61
-
63
+ #
64
+ #--
65
+ # TODO:
66
+ #
67
+ # * add support for autoload
68
+ # * add support for install/uninstall
69
+ #++
70
+
62
71
  class Part
63
72
 
64
- # Require (include) a part in the current application.
73
+ # Perform part initialization, just before the server is
74
+ # started. Override this in your parts.
75
+
76
+ def initialize
77
+ end
78
+
79
+ # Perform part finalization.
80
+
81
+ def finalize
82
+ end
65
83
 
66
- def self.require name
67
- Logger.debug "Requiring part '#{name}'." if $DBG
68
- Kernel.require 'part/' + name + '/run.rb'
84
+ # Perform part initialization when the part is installed,
85
+ # ie you add this in your application. Here comes one time
86
+ # initialization code.
87
+
88
+ def install
69
89
  end
90
+
91
+ # Perform part cleanup when you want to remove the part
92
+ # from your application.
93
+
94
+ def uninstall
95
+ end
96
+ alias cleanup uninstall
70
97
 
71
- end
98
+ class << self
99
+
100
+ # Require (include) a part in the current application.
101
+
102
+ def require(name)
103
+ Logger.debug "Requiring part '#{name}'." if $DBG
104
+ Kernel.require 'part/' + name + '/run.rb'
105
+ end
72
106
 
107
+ # Call the initialization code of all parts. Typically
108
+ # called just before the server starts.
109
+
110
+ def setup
111
+ for klass in self.descendents
112
+ p = klass.new
113
+ end
114
+ end
115
+
116
+ end
117
+
73
118
  end
74
119
 
75
- # * George Moschovitis <gm@navel.gr>
120
+ end
@@ -0,0 +1,328 @@
1
+ require 'facets/more/annotation'
2
+ require 'facets/more/inheritor'
3
+ require 'facets/more/aspects'
4
+
5
+ require 'nitro/markup'
6
+
7
+ require 'nitro'
8
+ require 'nitro/render'
9
+ require 'nitro/scaffolding'
10
+ require 'nitro/caching'
11
+ require 'nitro/flash'
12
+ require 'nitro/helper'
13
+ require 'nitro/compiler'
14
+
15
+ module Nitro
16
+
17
+ # Include this Mixin to a class to make objects of this class
18
+ # publishable, ie accessible through a standard web (REST)
19
+ # interface.
20
+ #
21
+ # === Instance variables
22
+ #
23
+ # ==== mount_path
24
+ #
25
+ # Where the publishable is mounted.
26
+ #
27
+ # ==== template_root
28
+ #
29
+ # Where to look for templates for this publishable
30
+ # object / controller. The template root is actually a stack
31
+ # to implement some form of template root inheritance,
32
+ # thus allowing for more reusable controllers. Ie you can
33
+ # 'extend' a controller, and only override the templates
34
+ # you want to change. The compiler will traverse the
35
+ # template root stack and use the templates from parent
36
+ # controllers if they are not overriden.
37
+
38
+
39
+ module Publishable
40
+
41
+ def self.included(base)
42
+ super
43
+
44
+ base.module_eval do
45
+ include Render
46
+ include Aspects
47
+ include Flashing
48
+ include Helpers
49
+
50
+ # The collection of 'models' ie classes that are linked
51
+ # to this Publishable/Controller.
52
+
53
+ ann :self, :models => []
54
+
55
+ # This is a helper that 'links' one or more classes to this
56
+ # controller. In practice it annotates each class with the
57
+ # controller and stores the controller's list of 'models'.
58
+
59
+ def self.model *classes
60
+ for c in classes
61
+ c.ann :self, :controller => self
62
+ self.ann.self.models! << c
63
+ end
64
+ end
65
+ end
66
+
67
+ # Aliases an action
68
+ #--
69
+ # gmosx, FIXME: better implementation needed.
70
+ # gmosx, FIXME: copy all annotations.
71
+ #++
72
+
73
+ base.module_eval do
74
+ def self.alias_action(new, old)
75
+ alias_method new, old
76
+ ann new, :template => old
77
+ end
78
+ end
79
+
80
+ # Return the 'action' methods for this Controller.
81
+ # Some dangerous methods from ancestors are removed.
82
+ # All private methods are ignored.
83
+
84
+ base.module_eval do
85
+ def self.action_methods
86
+ classes = self.ancestors - [Object, Kernel, Render, Controller, Caching]
87
+
88
+ classes.delete(PP::ObjectMixin) if defined?(PP::ObjectMixin)
89
+
90
+ methods = classes.inject([]) do |action_methods, klass|
91
+ action_methods + klass.public_instance_methods(false)
92
+ end
93
+
94
+ return methods
95
+ end
96
+ end
97
+
98
+ # Use the method_missing hook to compile the actions
99
+ # for this controller.
100
+
101
+ base.module_eval do
102
+ def method_missing(action, *args)
103
+ if Compiler.new(self.class).compile(action)
104
+ send(action, *args)
105
+ else
106
+ super
107
+ end
108
+ end
109
+ end
110
+
111
+ # Does this publishable respond to the given action?
112
+
113
+ base.module_eval do
114
+ class << self
115
+ def respond_to_action?(action)
116
+ action_methods.include?(action.to_s)
117
+ end
118
+ alias action? respond_to_action?
119
+ end
120
+ end
121
+
122
+ # Does this publishable respond to the given template?
123
+
124
+ base.module_eval do
125
+ class << self
126
+ def respond_to_template?(action)
127
+ Compiler.new(self).template?(action.to_s)
128
+ end
129
+ alias template? respond_to_template?
130
+ end
131
+ end
132
+
133
+ # Does this class respond to the given action?
134
+ # Also looks for templates in the template root.
135
+ #
136
+ # Prefer to use the compiler for this.
137
+ #--
138
+ # THINK: maybe move template? here
139
+ #++
140
+
141
+ base.module_eval do
142
+ class << self
143
+ def respond_to_action_or_template?(sym)
144
+ #--
145
+ # gmosx, FIXME: optimize this!
146
+ #++
147
+ return self.respond_to_action?(sym) || self.respond_to_template?(sym)
148
+ end
149
+ end
150
+ end
151
+
152
+ base.module_eval do
153
+ class << self
154
+ # Override this method to customize the template_root.
155
+ # Typically used in controllers defined in reusable Parts.
156
+ # Call super to include the parent class's customizations.
157
+ #
158
+ # def setup_template_root(path)
159
+ # super
160
+ # @template_root << "custom/route/#{path}"
161
+ # @template_root << "another/route/#{path}"
162
+ # end
163
+
164
+ def setup_template_root(path)
165
+ end
166
+
167
+ def mount_at(path)
168
+ # Store the mount_path (where the controller is mounted).
169
+
170
+ @mount_path = path
171
+
172
+ # Update template_root. Unshift the PROTO_TEMPLATE_ROOT,
173
+ # and unshift a template_root relative to the
174
+ # application template root.
175
+
176
+ @template_root = []
177
+ @template_root << File.join(Compiler::PROTO_TEMPLATE_ROOT, path).gsub(/\/$/, '')
178
+ setup_template_root(path)
179
+ @template_root << File.join(Nitro::Template.root, path).gsub(/\/$/, '')
180
+ @template_root.reverse!
181
+ end
182
+ alias_method :mount, :mount_at
183
+
184
+ # Returns the path where this controller is mounted.
185
+
186
+ def mount_path
187
+ @mount_path
188
+ end
189
+ alias mount_point mount_path
190
+ end
191
+ end
192
+
193
+ end
194
+
195
+ private
196
+
197
+ # Cookie helpers.
198
+ #--
199
+ # TODO: move elsewhere, probably to a default helper.
200
+ #++
201
+
202
+ def cookies
203
+ @context.cookies
204
+ end
205
+
206
+ # Send the cookie to the response stream.
207
+
208
+ def send_cookie(name, value = nil)
209
+ @context.add_cookie(name, value)
210
+ end
211
+
212
+ # Delete the cookie by setting the expire time to now and
213
+ # clearing the value.
214
+
215
+ def delete_cookie(name)
216
+ cookie = Cookie.new(name, '')
217
+ cookie.expires = Time.now
218
+ @context.add_cookie(cookie)
219
+ end
220
+
221
+ # Encode controller, action, params into a valid url.
222
+ # Automatically respects nice urls and routing.
223
+ #
224
+ # Handles parameters either as a hash or as an array.
225
+ # Use the array method to pass parameters to 'nice' actions.
226
+ #
227
+ # Pass Controller, action, and (param_name, param_value)
228
+ # pairs.
229
+ #
230
+ # === Examples
231
+ #
232
+ # encode_url ForaController, :post, :title, 'Hello', :body, 'World'
233
+ # encode_url :post, :title, 'Hello', :body, 'World' # => implies controller == self
234
+ # encode_url :kick, :oid, 4
235
+ # encode_url article # => article.to_href
236
+ #
237
+ # Alternatively you can pass options with a hash:
238
+ #
239
+ # encode_url :controller => ForaController, :action => :delete, :params => { :title => 'Hello' }
240
+ # encode_url :action => :delete
241
+ #--
242
+ # FIXME: better implementation? optimize this?
243
+ # TODO: move elsewhere.
244
+ #++
245
+
246
+ def encode_url(*args)
247
+ f = args.first
248
+
249
+ # A standard url as string, return as is.
250
+
251
+ if f.is_a? String
252
+ return f
253
+ end
254
+
255
+ # If the passed param is an object that responds to :to_href
256
+ # returns the url to this object.
257
+
258
+ if f.respond_to? :to_href
259
+ return args.first.to_href
260
+ end
261
+
262
+ if f.is_a? Symbol
263
+ # no controller passed, imply controller == self!
264
+ args.unshift(self.class)
265
+ end
266
+
267
+ # Try to encode using the router.
268
+
269
+ if url = context.dispatcher.encode_route(*args)
270
+ return url
271
+ end
272
+
273
+ # No routing rule, manual encoding.
274
+
275
+ controller = args.shift
276
+ action = args.shift.to_sym
277
+
278
+ if action == :index
279
+ url = "#{controller.mount_path}"
280
+ else
281
+ mount_path = controller.mount_path
282
+ mount_path = nil if mount_path == '/'
283
+ url = "#{mount_path}/#{action}"
284
+ end
285
+
286
+ unless args.empty?
287
+ if controller.respond_to_action_or_template? action
288
+ param_count = controller.instance_method(action).arity
289
+ if param_count != 0
290
+ param_count.times do
291
+ args.shift # name
292
+ url << "/#{CGI.escape(args.shift.to_s)}"
293
+ end
294
+ end
295
+ end
296
+
297
+ unless args.empty?
298
+ url << '?'
299
+ params = []
300
+ (args.size / 2).times do
301
+ params << "#{args.shift}=#{args.shift}"
302
+ end
303
+ url << params.join(';')
304
+ end
305
+ end
306
+
307
+ return url
308
+ end
309
+ alias R encode_url
310
+
311
+ # Just like encode_url, but generates an absolute url instead.
312
+
313
+ def encode_absolute_url(*args)
314
+ return "#{request.host_url}#{encode_url(*args)}"
315
+ end
316
+ alias RA encode_absolute_url
317
+
318
+ # Allows instances of Publishable classes to know where they
319
+ # are mounted.
320
+
321
+ def mount_path
322
+ self.class.mount_path
323
+ end
324
+ alias mount_point mount_path
325
+
326
+ end
327
+
328
+ end
@@ -5,7 +5,7 @@ require 'stringio'
5
5
  require 'facet/string/blank'
6
6
 
7
7
  require 'glue/settings'
8
- require 'glue/template'
8
+ require 'nitro/template'
9
9
  require 'glue/builder/xml'
10
10
 
11
11
  require 'nitro/helper/xhtml'
@@ -84,10 +84,6 @@ module Render
84
84
 
85
85
  attr_accessor :action_name
86
86
 
87
- # The base url for this render.
88
-
89
- attr_accessor :base
90
-
91
87
  # The current controller class.
92
88
 
93
89
  attr_accessor :controller
@@ -97,9 +93,8 @@ module Render
97
93
  # [+context+]
98
94
  # A parent render/controller acts as the context.
99
95
 
100
- def initialize(context, base = nil)
96
+ def initialize(context)
101
97
  @request = @response = @context = context
102
- @base = base
103
98
  @out = context.out
104
99
  end
105
100
 
@@ -108,16 +103,16 @@ module Render
108
103
  # controller.
109
104
  #
110
105
  # Both relative and absolute paths are supported. Relative
111
- # paths are converted to absolute by prepending the @base
112
- # path of the controller.
106
+ # paths are converted to absolute by prepending the mount path
107
+ # of the controller.
113
108
 
114
109
  def render(path)
115
110
  # Convert relative paths to absolute paths.
116
- path = "#@base/#{path}" unless path =~ /^\//
111
+ path = "#{self.class.mount_path}/#{path}".squeeze('/') unless path =~ /^\//
117
112
 
118
113
  Logger.debug "Rendering '#{path}'." if $DBG
119
114
 
120
- @controller, action, base = @context.dispatcher.dispatch(path, @context)
115
+ @controller, action = @context.dispatcher.dispatch(path.to_s, @context)
121
116
 
122
117
  raise 'No controller for action' unless @controller
123
118
 
@@ -130,13 +125,13 @@ module Render
130
125
  if self.class == @controller
131
126
  self.send(action)
132
127
  else
133
- @controller.new(@context, base).send(action)
128
+ @controller.new(@context).send(action)
134
129
  end
135
130
 
136
131
  Controller.replace_current(old_controller)
137
132
  @context.level -= 1
138
133
 
139
- rescue NoActionError => e1
134
+ rescue ActionError => e1
140
135
  log_error(e1, path, false)
141
136
  print '(error)'
142
137
 
@@ -200,6 +195,11 @@ private
200
195
  # The default redirect status is 303.
201
196
 
202
197
  def redirect(*args)
198
+ # If this is an ajax and/or rpc request skip the redirect.
199
+ # Allows to write more reusable code.
200
+
201
+ return if request.script?
202
+
203
203
  if args.last.is_a? Hash
204
204
  status = args.last.fetch(:status, 303)
205
205
  else
@@ -209,9 +209,8 @@ private
209
209
  url = encode_url(*args)
210
210
 
211
211
  # gmosx, THINK: this may be unnecessary!
212
-
212
+
213
213
  unless url =~ /^http/
214
- url = "#@base/#{url}" unless url =~ /^\//
215
214
  url = "#{@context.host_url}/#{url.gsub(/^\//, '')}"
216
215
  end
217
216
 
@@ -239,42 +238,6 @@ private
239
238
  end
240
239
  alias_method :redirect_to_home, :redirect_home
241
240
 
242
- # :section: Seaside style call/answer methods.
243
-
244
- # Call redirects to the given url but push the original
245
- # url in a callstack, so that the target can return by
246
- # executing answer.
247
- #
248
- # === Example
249
- #
250
- # caller:
251
- # color, type = call 'utils/select_color'
252
- #
253
- # target:
254
- # answer color, type
255
- #--
256
- # FIXME: dont use yet, you have to encode the branch to
257
- # make this safe for use.
258
- #++
259
-
260
- def call(url, status = 303)
261
- (session[:CALL_STACK] ||= {}) << request.uri
262
- redirect(url, status)
263
- end
264
-
265
- # Returns from a call by poping the callstack.
266
- #--
267
- # FIXME: don't use yet.
268
- #++
269
-
270
- def answer(index = 0, status = 303)
271
- if stack = session[:CALL_STACK] and not stack.empty?
272
- redirect(stack.pop, status)
273
- else
274
- raise 'Cannot answer, call stack is empty'
275
- end
276
- end
277
-
278
241
  # Log a rendering error.
279
242
 
280
243
  def log_error(error, path, full = true)
@@ -305,20 +268,28 @@ private
305
268
  alias_method :print, :render_text
306
269
 
307
270
  # Render a template into the output buffer.
308
-
309
- def render_template(filename)
310
- filename = "#{filename}.xhtml" unless filename =~ /\.xhtml$/
311
- template = File.read("#{template_root}/#{filename}")
312
- Glue::Template.process_template(template, '@out', binding)
271
+ =begin
272
+ def render_template(*args)
273
+ url = encode_url(*args)
274
+ filename = "#{url}.xhtml" unless url =~ /\.xhtml$/
275
+ template = File.read(File.join(Template.root, filename))
276
+ Template.process_template(template, '@out', binding)
313
277
  end
278
+ =end
314
279
 
280
+ def render_template(path)
281
+ render(path)
282
+ exit
283
+ end
284
+ alias_method :template, :render_template
285
+
315
286
  # Access the programmatic renderer (builder).
316
287
 
317
288
  def build(&block)
318
289
  if block.arity == 1
319
- yield Glue::XmlBuilder.new(@out)
290
+ yield XmlBuilder.new(@out)
320
291
  else
321
- Glue::XmlBuilder.new(@out).instance_eval(&block)
292
+ XmlBuilder.new(@out).instance_eval(&block)
322
293
  end
323
294
  end
324
295
 
@@ -326,7 +297,7 @@ private
326
297
  # output buffer.
327
298
 
328
299
  def builder
329
- Glue::XmlBuilder.new(@out)
300
+ XmlBuilder.new(@out)
330
301
  end
331
302
 
332
303
  # A Helper class to access rendering mixins. Useful to avoid
@@ -356,5 +327,3 @@ private
356
327
  end
357
328
 
358
329
  end
359
-
360
- # * George Moschovitis <gm@navel.gr>