nitro 0.31.0 → 0.40.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/nitro +135 -37
- data/doc/CHANGELOG.1 +108 -108
- data/doc/CHANGELOG.2 +89 -89
- data/doc/CHANGELOG.3 +105 -105
- data/{CHANGELOG → doc/CHANGELOG.4} +509 -509
- data/doc/{AUTHORS → CONTRIBUTORS} +49 -37
- data/doc/LIBRARIES +13 -0
- data/doc/LICENSE +2 -3
- data/doc/MIGRATION +45 -0
- data/doc/RELEASES +131 -11
- data/doc/TODO +67 -0
- data/lib/glue/magick.rb +0 -3
- data/lib/glue/sweeper.rb +30 -15
- data/lib/glue/thumbnails.rb +0 -2
- data/lib/glue/webfile.rb +23 -11
- data/lib/nitro.rb +37 -44
- data/lib/nitro/adapter/cgi.rb +0 -3
- data/lib/nitro/adapter/console.rb +0 -2
- data/lib/nitro/adapter/fastcgi.rb +6 -3
- data/lib/nitro/adapter/mongrel.rb +97 -58
- data/lib/nitro/adapter/script.rb +4 -6
- data/lib/nitro/adapter/webrick.rb +33 -87
- data/lib/nitro/adapter/webrick/vcr.rb +85 -0
- data/lib/nitro/caching.rb +0 -2
- data/lib/nitro/caching/actions.rb +0 -2
- data/lib/nitro/caching/fragments.rb +0 -2
- data/lib/nitro/caching/output.rb +45 -16
- data/lib/nitro/caching/proxy.rb +49 -0
- data/lib/nitro/cgi.rb +3 -6
- data/lib/nitro/cgi/cookie.rb +0 -3
- data/lib/nitro/cgi/request.rb +67 -24
- data/lib/nitro/cgi/response.rb +0 -2
- data/lib/nitro/cgi/{sendfile.rb → send_file.rb} +7 -6
- data/lib/nitro/compiler.rb +62 -55
- data/lib/nitro/compiler/cleanup.rb +0 -3
- data/lib/nitro/compiler/elements.rb +31 -28
- data/lib/nitro/compiler/errors.rb +2 -5
- data/lib/nitro/compiler/include.rb +10 -8
- data/lib/nitro/compiler/layout.rb +0 -2
- data/lib/nitro/compiler/localization.rb +0 -2
- data/lib/nitro/compiler/markup.rb +14 -6
- data/lib/nitro/compiler/morphing.rb +1 -5
- data/lib/nitro/compiler/script.rb +2 -4
- data/lib/nitro/compiler/squeeze.rb +0 -2
- data/lib/nitro/compiler/xslt.rb +0 -2
- data/lib/nitro/context.rb +10 -5
- data/lib/nitro/control.rb +18 -0
- data/lib/nitro/control/attribute.rb +88 -0
- data/lib/nitro/control/attribute/checkbox.rb +19 -0
- data/lib/nitro/control/attribute/datetime.rb +21 -0
- data/lib/nitro/control/attribute/file.rb +20 -0
- data/lib/nitro/control/attribute/fixnum.rb +26 -0
- data/lib/nitro/control/attribute/float.rb +26 -0
- data/lib/nitro/control/attribute/options.rb +38 -0
- data/lib/nitro/control/attribute/password.rb +16 -0
- data/lib/nitro/control/attribute/text.rb +16 -0
- data/lib/nitro/control/attribute/textarea.rb +16 -0
- data/lib/nitro/control/none.rb +16 -0
- data/lib/nitro/control/relation.rb +53 -0
- data/lib/nitro/control/relation/belongs_to.rb +0 -0
- data/lib/nitro/control/relation/has_many.rb +97 -0
- data/lib/nitro/control/relation/joins_many.rb +0 -0
- data/lib/nitro/control/relation/many_to_many.rb +0 -0
- data/lib/nitro/control/relation/refers_to.rb +29 -0
- data/lib/nitro/controller.rb +7 -296
- data/lib/nitro/dispatcher.rb +72 -34
- data/lib/nitro/element.rb +36 -10
- data/lib/nitro/element/javascript.rb +0 -2
- data/lib/nitro/flash.rb +23 -10
- data/lib/nitro/global.rb +36 -11
- data/lib/nitro/helper.rb +22 -8
- data/lib/nitro/helper/benchmark.rb +0 -2
- data/lib/nitro/helper/buffer.rb +0 -3
- data/lib/nitro/helper/css.rb +12 -0
- data/lib/nitro/helper/debug.rb +1 -3
- data/lib/nitro/helper/default.rb +1 -0
- data/lib/nitro/helper/feed.rb +400 -386
- data/lib/nitro/helper/form.rb +246 -116
- data/lib/nitro/helper/javascript.rb +28 -2
- data/lib/nitro/helper/javascript/morphing.rb +0 -2
- data/lib/nitro/helper/javascript/prototype.rb +0 -2
- data/lib/nitro/helper/javascript/scriptaculous.rb +0 -1
- data/lib/nitro/helper/layout.rb +0 -2
- data/lib/nitro/helper/navigation.rb +87 -0
- data/lib/nitro/helper/pager.rb +11 -22
- data/lib/nitro/helper/table.rb +9 -32
- data/lib/nitro/helper/url.rb +104 -0
- data/lib/nitro/helper/xhtml.rb +20 -4
- data/lib/nitro/helper/xml.rb +0 -2
- data/lib/nitro/markup.rb +131 -0
- data/lib/nitro/part.rb +52 -7
- data/lib/nitro/publishable.rb +328 -0
- data/lib/nitro/render.rb +30 -61
- data/lib/nitro/router.rb +12 -4
- data/lib/nitro/sanitize.rb +48 -0
- data/lib/nitro/scaffold.rb +9 -11
- data/lib/nitro/scaffold/controller.rb +25 -0
- data/lib/nitro/scaffold/model.rb +150 -0
- data/lib/nitro/scaffolding.rb +1 -3
- data/lib/nitro/server.rb +57 -32
- data/lib/nitro/server/drb.rb +16 -2
- data/lib/nitro/server/runner.rb +80 -102
- data/lib/nitro/service.rb +0 -1
- data/lib/nitro/service/xmlrpc.rb +0 -2
- data/lib/nitro/session.rb +26 -18
- data/lib/nitro/session/drb.rb +2 -16
- data/lib/nitro/session/memory.rb +0 -2
- data/lib/nitro/template.rb +219 -0
- data/lib/nitro/test/assertions.rb +1 -3
- data/lib/nitro/test/context.rb +0 -1
- data/lib/nitro/test/testcase.rb +0 -1
- data/lib/nitro/version.rb +6 -0
- data/lib/part/admin.rb +16 -0
- data/lib/part/admin/controller.rb +19 -0
- data/lib/part/admin/helper.rb +30 -0
- data/lib/part/admin/og/controller.rb +114 -0
- data/lib/part/admin/og/customize.rb +4 -0
- data/lib/part/admin/og/template/index.xhtml +27 -0
- data/lib/part/admin/og/template/list.xhtml +38 -0
- data/lib/part/admin/og/template/search.xhtml +20 -0
- data/lib/part/admin/og/template/update.xhtml +25 -0
- data/lib/part/admin/skin.rb +207 -0
- data/lib/part/admin/template/denied.xhtml +13 -0
- data/lib/part/admin/template/index.xhtml +12 -0
- data/lib/part/admin/todo.txt +2 -0
- data/proto/public/error.xhtml +4 -2
- data/proto/run.rb +0 -2
- data/test/glue/tc_webfile.rb +1 -0
- data/test/nitro/cgi/tc_request.rb +23 -0
- data/test/nitro/helper/tc_feed.rb +0 -3
- data/test/nitro/helper/tc_navbar.rb +74 -0
- data/test/nitro/helper/tc_table.rb +2 -0
- data/test/nitro/tc_cgi.rb +72 -19
- data/test/nitro/tc_controller.rb +35 -26
- data/test/nitro/tc_controller_aspect.rb +1 -0
- data/test/nitro/tc_controller_params.rb +864 -0
- data/test/nitro/tc_dispatcher.rb +2 -2
- data/test/nitro/tc_element.rb +16 -16
- data/test/nitro/tc_flash.rb +3 -3
- data/test/nitro/tc_markup.rb +31 -0
- data/test/nitro/tc_render.rb +12 -14
- data/test/nitro/tc_session.rb +9 -7
- data/test/nitro/tc_template.rb +34 -0
- metadata +217 -198
- data/INSTALL +0 -121
- data/ProjectInfo +0 -74
- data/README +0 -555
- data/doc/apache.txt +0 -9
- data/doc/config.txt +0 -28
- data/doc/faq.txt +0 -7
- data/doc/lhttpd.txt +0 -7
- data/lib/nitro/adapter/scgi.rb +0 -239
- data/lib/nitro/helper/form/builder.rb +0 -144
- data/lib/nitro/helper/form/controls.rb +0 -389
- data/lib/nitro/helper/rss.rb +0 -72
- data/proto/conf/apache.conf +0 -51
- data/proto/public/scaffold/advanced_search.xhtml +0 -30
- data/proto/public/scaffold/edit.xhtml +0 -11
- data/proto/public/scaffold/form.xhtml +0 -1
- data/proto/public/scaffold/index.xhtml +0 -20
- data/proto/public/scaffold/list.xhtml +0 -32
- data/proto/public/scaffold/new.xhtml +0 -11
- data/proto/public/scaffold/search.xhtml +0 -29
- data/proto/public/scaffold/view.xhtml +0 -8
- data/proto/script/scgi_ctl +0 -221
- data/proto/script/scgi_service +0 -128
- data/setup.rb +0 -1585
- data/src/part/admin.rb +0 -16
- data/src/part/admin/controller.rb +0 -81
- data/src/part/admin/skin.rb +0 -21
- data/src/part/admin/system.css +0 -135
- data/src/part/admin/template/denied.xhtml +0 -1
- data/src/part/admin/template/index.xhtml +0 -43
- data/test/nitro/helper/tc_rss.rb +0 -24
data/lib/nitro/cgi.rb
CHANGED
@@ -78,7 +78,7 @@ class Cgi
|
|
78
78
|
|
79
79
|
def self.structure_param(params, key, val)
|
80
80
|
if key =~ /(.+)\[(.+)\]$/ or key =~ /([^\.]+)\.(.+)$/
|
81
|
-
params[$1] ||=
|
81
|
+
params[$1] ||= Dictionary.new
|
82
82
|
params[$1] = structure_param(params[$1], $2, val)
|
83
83
|
elsif key =~ /(.+)\[\]$/
|
84
84
|
params[$1] ||= Array.new
|
@@ -94,7 +94,7 @@ class Cgi
|
|
94
94
|
# in parse_request_params is not done here.
|
95
95
|
|
96
96
|
def self.parse_query_string(query_string)
|
97
|
-
params =
|
97
|
+
params = Dictionary.new
|
98
98
|
|
99
99
|
# gmosx, THINK: better return nil here?
|
100
100
|
return params if (query_string.nil? or query_string.empty?)
|
@@ -261,7 +261,7 @@ class Cgi
|
|
261
261
|
else
|
262
262
|
input.read(content_length)
|
263
263
|
end
|
264
|
-
if c.nil?
|
264
|
+
if c.nil? || c.empty?
|
265
265
|
raise EOFError, "bad content body"
|
266
266
|
end
|
267
267
|
buf.concat(c)
|
@@ -315,6 +315,3 @@ class Cgi
|
|
315
315
|
end
|
316
316
|
|
317
317
|
end
|
318
|
-
|
319
|
-
# * George Moschovitis <gm@navel.gr>
|
320
|
-
# * Guillaume Pierronnet <guillaume.pierronnet@gmail.com>
|
data/lib/nitro/cgi/cookie.rb
CHANGED
data/lib/nitro/cgi/request.rb
CHANGED
@@ -21,12 +21,13 @@ module Request
|
|
21
21
|
# The parsed query parameters collection.
|
22
22
|
|
23
23
|
attr_accessor :params
|
24
|
-
|
25
|
-
|
24
|
+
alias query params
|
25
|
+
alias parameters params
|
26
|
+
|
26
27
|
# The request cookies.
|
27
28
|
|
28
29
|
attr_accessor :cookies
|
29
|
-
|
30
|
+
alias cookie cookies
|
30
31
|
|
31
32
|
# The request protocol.
|
32
33
|
|
@@ -58,11 +59,11 @@ module Request
|
|
58
59
|
end
|
59
60
|
|
60
61
|
# Returns the domain part of a host.
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
#
|
63
|
+
# === Examples
|
64
|
+
#
|
65
|
+
# www.nitroproject.org: request.domain # => 'nitroproject.org'
|
66
|
+
# www.nitroproject.co.uk: request.domain(2) # => 'nitroproject.co.uk'
|
66
67
|
|
67
68
|
def domain tld_length = 1
|
68
69
|
host.split('.').last(1 + tld_length).join('.')
|
@@ -95,6 +96,12 @@ module Request
|
|
95
96
|
headers['QUERY_STRING']
|
96
97
|
end
|
97
98
|
|
99
|
+
# The parameters the action will be called with
|
100
|
+
|
101
|
+
def action_params
|
102
|
+
headers['ACTION_PARAMS']
|
103
|
+
end
|
104
|
+
|
98
105
|
# The request method. Alternatively you could use the
|
99
106
|
# request method predicates.
|
100
107
|
#
|
@@ -168,7 +175,7 @@ module Request
|
|
168
175
|
not /XMLHttpRequest/i.match(@headers['HTTP_X_REQUESTED_WITH']).nil?
|
169
176
|
end
|
170
177
|
alias xhr? :xml_http_request?
|
171
|
-
alias
|
178
|
+
alias script? :xml_http_request?
|
172
179
|
|
173
180
|
# Return the referer. For the initial page in the
|
174
181
|
# clickstream there is no referer, set "/" by default.
|
@@ -197,7 +204,7 @@ module Request
|
|
197
204
|
|
198
205
|
if @headers.include?('HTTP_X_FORWARDED_FOR') then
|
199
206
|
remote_ips = @headers['HTTP_X_FORWARDED_FOR'].split(',').reject do |ip|
|
200
|
-
ip =~ /^unknown
|
207
|
+
ip =~ /^unknown$/i or local_net?(ip)
|
201
208
|
end
|
202
209
|
|
203
210
|
return remote_ips.first.strip unless remote_ips.empty?
|
@@ -206,6 +213,30 @@ module Request
|
|
206
213
|
return @headers['REMOTE_ADDR']
|
207
214
|
end
|
208
215
|
|
216
|
+
# Request is from a local network? (RFC1918 + localhost)
|
217
|
+
|
218
|
+
def local_net?(ip = remote_ip)
|
219
|
+
bip = ip.split('.').map{ |x| x.to_i }.pack('C4').unpack('N')[0]
|
220
|
+
|
221
|
+
# 127.0.0.1/32 => 2130706433
|
222
|
+
# 192.168.0.0/16 => 49320
|
223
|
+
# 172.16.0.0/12 => 2753
|
224
|
+
# 10.0.0.0/8 => 10
|
225
|
+
|
226
|
+
{ 0 => 2130706433, 16 => 49320, 20 => 2753, 24 => 10}.each do |s,c|
|
227
|
+
return true if (bip >> s) == c
|
228
|
+
end
|
229
|
+
|
230
|
+
return false
|
231
|
+
end
|
232
|
+
|
233
|
+
# Request comming from local?
|
234
|
+
|
235
|
+
def local?(ip = remote_ip)
|
236
|
+
# TODO: should check if requesting machine is the one the server is running
|
237
|
+
return true if ip == '127.0.0.1'
|
238
|
+
end
|
239
|
+
|
209
240
|
# The server port.
|
210
241
|
|
211
242
|
def port
|
@@ -242,28 +273,36 @@ module Request
|
|
242
273
|
end
|
243
274
|
|
244
275
|
# Lookup a query parameter.
|
245
|
-
|
246
|
-
|
276
|
+
#--
|
277
|
+
# TODO: Check if unescape is needed.
|
278
|
+
#++
|
279
|
+
|
280
|
+
def [](param)
|
247
281
|
@params[param]
|
282
|
+
=begin
|
283
|
+
if par = @params[param] and par.is_a?(String)
|
284
|
+
CGI.unescape(par)
|
285
|
+
end
|
286
|
+
=end
|
248
287
|
end
|
249
288
|
|
250
289
|
# Set a query parameter.
|
251
290
|
|
252
|
-
def []=
|
291
|
+
def []=(param, value)
|
253
292
|
@params[param] = value
|
254
293
|
end
|
255
294
|
|
256
295
|
# Check if a boolean param (checkbox) is true.
|
257
296
|
|
258
|
-
def true?
|
297
|
+
def true?(param)
|
259
298
|
@params[param] == 'on'
|
260
299
|
end
|
261
|
-
|
262
|
-
|
300
|
+
alias enabled? true?
|
301
|
+
alias boolean true?
|
263
302
|
|
264
303
|
# Check if a boolean param (checkbox) is false.
|
265
304
|
|
266
|
-
def false?
|
305
|
+
def false?(param)
|
267
306
|
!true?(param)
|
268
307
|
end
|
269
308
|
|
@@ -274,15 +313,19 @@ module Request
|
|
274
313
|
end
|
275
314
|
|
276
315
|
# Check if a param is available.
|
277
|
-
|
316
|
+
#--
|
317
|
+
# gmosx: use nil test instead of has_key? to be more robust.
|
318
|
+
# (nil can be a hash element !)
|
319
|
+
#++
|
320
|
+
|
278
321
|
def has_key? key
|
279
|
-
|
322
|
+
!@params[key].nil?
|
280
323
|
end
|
281
|
-
|
282
|
-
|
324
|
+
alias has_param? has_key?
|
325
|
+
alias param? has_key?
|
326
|
+
alias has? has_key?
|
327
|
+
alias is? has_key?
|
328
|
+
|
283
329
|
end
|
284
330
|
|
285
331
|
end
|
286
|
-
|
287
|
-
# * George Moschovitis <gm@navel.gr>
|
288
|
-
# * Guillaume Pierronnet <guillaume.pierronnet@laposte.net>
|
data/lib/nitro/cgi/response.rb
CHANGED
@@ -16,20 +16,21 @@ module Render
|
|
16
16
|
#
|
17
17
|
# === Examples
|
18
18
|
#
|
19
|
-
# require 'nitro/cgi/
|
19
|
+
# require 'nitro/cgi/send_file'
|
20
|
+
#
|
20
21
|
# class MyController < Nitro:Controller
|
21
22
|
# def download(fname)
|
22
|
-
#
|
23
|
+
# send_file(fname)
|
23
24
|
# end
|
24
25
|
# end
|
25
26
|
#
|
26
27
|
# class MyController < Nitro:Controller
|
27
28
|
# def download()
|
28
|
-
#
|
29
|
+
# send_file('/etc/password', true)
|
29
30
|
# end
|
30
31
|
# end
|
31
|
-
|
32
|
-
def
|
32
|
+
|
33
|
+
def send_file(fname=nil, fullpath=false)
|
33
34
|
fname = fullpath ? fname : "#{Server.public_root}/#{fname}"
|
34
35
|
f = File.open(fname, "rb")
|
35
36
|
@context.response_headers["Cache-control"] = 'private'
|
@@ -38,8 +39,8 @@ module Render
|
|
38
39
|
@context.out = f
|
39
40
|
raise RenderExit
|
40
41
|
end
|
42
|
+
alias sendfile send_file
|
41
43
|
|
42
44
|
end
|
43
45
|
|
44
46
|
end
|
45
|
-
|
data/lib/nitro/compiler.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'nitro/template'
|
2
2
|
|
3
3
|
require 'nitro/compiler/errors'
|
4
4
|
|
@@ -59,7 +59,24 @@ class Compiler
|
|
59
59
|
# ...
|
60
60
|
# end
|
61
61
|
|
62
|
-
setting :transformation_pipeline, :default => [StaticInclude, Morphing,
|
62
|
+
setting :transformation_pipeline, :default => [StaticInclude, Morphing, ElementCompiler, MarkupCompiler, ScriptCompiler, Cleanup], :doc => 'The default transformation pipeline'
|
63
|
+
|
64
|
+
|
65
|
+
# This specifies if
|
66
|
+
# def my_action(oid, val)
|
67
|
+
# should handle both
|
68
|
+
# my_action/1/23
|
69
|
+
# and
|
70
|
+
# my_action?oid=1;val=23
|
71
|
+
|
72
|
+
setting :mixin_get_parameters, :default => true
|
73
|
+
|
74
|
+
# Treats
|
75
|
+
# def my_action(oid, val)
|
76
|
+
# as
|
77
|
+
# def my_action(oid = nil, val = nil)
|
78
|
+
|
79
|
+
setting :non_strict_action_calling, :default => false
|
63
80
|
|
64
81
|
def initialize(controller = nil)
|
65
82
|
@controller = controller
|
@@ -75,7 +92,8 @@ class Compiler
|
|
75
92
|
# hello_world -> template_root/hello_world.xhtml
|
76
93
|
# this__is__my__hello_world -> template_root/this/is/my/hello_world
|
77
94
|
|
78
|
-
def template_for_action(action, ext =
|
95
|
+
def template_for_action(action, ext = Template.extension)
|
96
|
+
action = action.to_s
|
79
97
|
for template_root in @controller.instance_variable_get(:@template_root)
|
80
98
|
# attempt to find a template of the form
|
81
99
|
# template_root/action.xhtml
|
@@ -86,7 +104,7 @@ class Compiler
|
|
86
104
|
# attempt to find a template of the form
|
87
105
|
# template_root/action/index.xhtml
|
88
106
|
|
89
|
-
path = "#{template_root}/#{action.gsub(/__/, '/')}/#{
|
107
|
+
path = "#{template_root}/#{action.gsub(/__/, '/')}/#{Template.default}.#{ext}".squeeze('/')
|
90
108
|
return path if File.exist?(path)
|
91
109
|
end
|
92
110
|
return nil
|
@@ -174,7 +192,7 @@ class Compiler
|
|
174
192
|
#
|
175
193
|
# This generated method is called by the dispatcher.
|
176
194
|
#
|
177
|
-
# ===
|
195
|
+
# === Template root overloading
|
178
196
|
#
|
179
197
|
# Nitro provides a nice method of template_root overloading
|
180
198
|
# that allows you to use OOP principles with templates.
|
@@ -229,47 +247,40 @@ class Compiler
|
|
229
247
|
params = params.collect { |p| "@#{p} = @context['#{p}']" }
|
230
248
|
code << "#{params.join(';')}"
|
231
249
|
end
|
232
|
-
|
233
|
-
# Try to resolve action parameters. Returns negative
|
234
|
-
# numbers for arbitrary parameters.
|
235
|
-
#--
|
236
|
-
# gmosx: This needs a better implementation. Better means
|
237
|
-
# cleaner and more optimized code.
|
238
|
-
#++
|
239
|
-
|
240
|
-
param_count = @controller.instance_method(action.to_sym).arity
|
241
250
|
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
251
|
+
arity = @controller.instance_method(action.to_sym).arity
|
252
|
+
|
253
|
+
# Call action with given parameters, raises ActionError when the params
|
254
|
+
# are wrong.
|
255
|
+
# TODO: return 404 or other error code for browser?
|
256
|
+
|
257
|
+
code << %{
|
258
|
+
params = context.action_params || []
|
259
|
+
|
260
|
+
# Fill not given parameters with nils
|
261
|
+
|
262
|
+
arity = (#{arity} < -1) ? (#{arity}.abs - 1) : #{arity}
|
263
|
+
if Nitro::Compiler.non_strict_action_calling
|
264
|
+
arity.times {|i| params[i] ? nil : params[i] = nil }
|
253
265
|
end
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
+
|
267
|
+
# When arity zero, ignore params
|
268
|
+
params.clear if arity == 0
|
269
|
+
|
270
|
+
if Nitro::Compiler.mixin_get_parameters && params.empty? && arity > 0
|
271
|
+
context.params.each_with_index do |(k,v),i|
|
272
|
+
break if i > arity
|
273
|
+
params << v
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
begin
|
266
278
|
action_return_value = #{action}(*params)
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
end
|
279
|
+
rescue ArgumentError => e
|
280
|
+
raise ActionError, "Wrong parameter count for \#{@action_name}(\#{params.join(', ')})."
|
281
|
+
end
|
282
|
+
}
|
283
|
+
|
273
284
|
code << %{
|
274
285
|
unless :stop == action_return_value
|
275
286
|
}
|
@@ -285,14 +296,15 @@ class Compiler
|
|
285
296
|
# better practice to place the output related code in an
|
286
297
|
# external template file.
|
287
298
|
|
288
|
-
# Take :
|
299
|
+
# Take :template annotation into account.
|
289
300
|
|
290
|
-
|
291
|
-
|
301
|
+
unless template = @controller.ann(action.to_sym)[:template] # FIXME
|
302
|
+
template = action
|
303
|
+
end
|
292
304
|
|
293
305
|
# Search the [controller] class and it's ancestors for the template
|
294
306
|
|
295
|
-
template_path = template_for_action(
|
307
|
+
template_path = template_for_action(template.to_s)
|
296
308
|
if template_path or @controller.instance_methods.include?("#{action}_template")
|
297
309
|
valid = true
|
298
310
|
code << %{
|
@@ -313,7 +325,7 @@ class Compiler
|
|
313
325
|
|
314
326
|
if Render.redirect_on_empty
|
315
327
|
code << %{
|
316
|
-
|
328
|
+
redirect_to_referer if @out.empty?
|
317
329
|
}
|
318
330
|
end
|
319
331
|
|
@@ -354,12 +366,12 @@ class Compiler
|
|
354
366
|
# Typically used to precompile css templates.
|
355
367
|
|
356
368
|
def precompile(filename)
|
357
|
-
src = File.join(
|
369
|
+
src = File.join(Template.root, "#{filename}t")
|
358
370
|
dst = File.join(Server.public_root, filename)
|
359
371
|
|
360
372
|
if (!File.exist?(dst)) or (File.mtime(src) > File.mtime(dst))
|
361
373
|
Logger.info "Compiling template '#{src}' to '#{dst}'."
|
362
|
-
template =
|
374
|
+
template = FileTemplate.new(src)
|
363
375
|
File.open(dst, 'w') do |f|
|
364
376
|
f << template.process
|
365
377
|
end
|
@@ -371,8 +383,3 @@ class Compiler
|
|
371
383
|
end
|
372
384
|
|
373
385
|
end
|
374
|
-
|
375
|
-
# * George Moschovitis <gm@navel.gr>
|
376
|
-
# * Chris Farmiloe <chris.farmiloe@farmiloe.com>
|
377
|
-
# * Rob Pitt <rob@motionpath.co.uk>
|
378
|
-
# * Jonas Pfenniger <zimba.tm@gmail.com>
|
@@ -3,7 +3,7 @@ require 'rexml/streamlistener'
|
|
3
3
|
require 'facet/class/by_name'
|
4
4
|
|
5
5
|
require 'nitro/element'
|
6
|
-
require
|
6
|
+
require 'glue/html'
|
7
7
|
|
8
8
|
|
9
9
|
module Nitro
|
@@ -62,6 +62,7 @@ class Elements # :nodoc: all
|
|
62
62
|
def tag_end(name)
|
63
63
|
# check if the name starts with the element prefix, or
|
64
64
|
# is capitalized.
|
65
|
+
|
65
66
|
if is_element? name
|
66
67
|
obj, @buffer, @parent = @stack.pop
|
67
68
|
@buffer << obj.render
|
@@ -71,10 +72,10 @@ class Elements # :nodoc: all
|
|
71
72
|
end
|
72
73
|
|
73
74
|
|
74
|
-
# Check if a tag is a Nitro::Element. If found, it also
|
75
|
-
# auto-extend the klass.
|
76
|
-
#
|
77
|
-
|
75
|
+
# Check if a tag is a Nitro::Element. If found, it also
|
76
|
+
# tries to auto-extend the klass. Returns the Element class
|
77
|
+
# if found.
|
78
|
+
|
78
79
|
def is_element?(name)
|
79
80
|
# Doesn't support modulized classes
|
80
81
|
# name = name.demodulize
|
@@ -82,34 +83,42 @@ class Elements # :nodoc: all
|
|
82
83
|
|
83
84
|
name = name.gsub(PREFIX_RE,'').camelize if name =~ PREFIX_RE
|
84
85
|
|
85
|
-
#
|
86
|
+
# Try to use Controller::xxx
|
87
|
+
#--
|
88
|
+
# gmosx, THINK: this looks a bit dangerous to me!
|
89
|
+
#++
|
86
90
|
|
87
91
|
begin
|
88
|
-
|
92
|
+
#--
|
93
|
+
# gmosx, FIXME: Class.by_name also returns top level
|
94
|
+
# classes, how can we fix this?
|
95
|
+
#++
|
96
|
+
klass = Class.by_name("#{@compiler.controller}::#{name}")
|
89
97
|
rescue
|
98
|
+
# drink it!
|
90
99
|
end
|
91
100
|
|
92
|
-
#
|
101
|
+
# Try to use the Controller's :elements annotation
|
93
102
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
103
|
+
if (!klass) and namespace = @compiler.controller.ann.self[:element_namespace]
|
104
|
+
begin
|
105
|
+
klass = Class.by_name("#{namespace}::#{name}")
|
106
|
+
rescue
|
107
|
+
# drink it!
|
99
108
|
end
|
100
|
-
|
101
|
-
end unless klass
|
102
|
-
|
103
|
-
# Look in the root module
|
109
|
+
end
|
104
110
|
|
111
|
+
# Try to use Nitro::Element::xxx then ::xxx
|
112
|
+
|
105
113
|
begin
|
106
|
-
klass = Class.by_name(name)
|
114
|
+
klass = Class.by_name("Nitro::Element::#{name}")
|
107
115
|
rescue
|
116
|
+
# drink it!
|
108
117
|
end unless klass
|
109
118
|
|
110
|
-
return false unless klass.kind_of?
|
119
|
+
return false unless klass.kind_of? Class
|
111
120
|
|
112
|
-
# Try to auto-extend
|
121
|
+
# Try to auto-extend.
|
113
122
|
|
114
123
|
unless klass.ancestors.include? Nitro::Element
|
115
124
|
if Element.auto_extend
|
@@ -131,7 +140,7 @@ class Elements # :nodoc: all
|
|
131
140
|
end
|
132
141
|
|
133
142
|
def comment(c)
|
134
|
-
unless
|
143
|
+
unless Template.strip_xml_comments
|
135
144
|
@buffer << "<!--#{c}-->"
|
136
145
|
end
|
137
146
|
end
|
@@ -163,14 +172,8 @@ class Elements # :nodoc: all
|
|
163
172
|
end
|
164
173
|
end
|
165
174
|
|
166
|
-
|
167
|
-
|
168
|
-
unless const_defined? :ElementProcessor
|
169
|
-
ElementProcessor = Elements
|
175
|
+
unless const_defined? :ElementCompiler
|
170
176
|
ElementCompiler = Elements
|
171
177
|
end
|
172
178
|
|
173
179
|
end
|
174
|
-
|
175
|
-
# * George Moschovitis <gm@navel.gr>
|
176
|
-
# * Chris Farmiloe <chris.farmiloe@farmiloe.com>
|