nitro 0.21.2 → 0.22.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.
- data/CHANGELOG +121 -0
- data/README +9 -3
- data/doc/RELEASES +86 -1
- data/lib/nitro.rb +1 -1
- data/lib/nitro/adapter/cgi.rb +4 -1
- data/lib/nitro/adapter/scgi.rb +2 -0
- data/lib/nitro/adapter/webrick.rb +1 -1
- data/lib/nitro/caching/output.rb +6 -5
- data/lib/nitro/compiler.rb +8 -3
- data/lib/nitro/dispatcher.rb +2 -2
- data/lib/nitro/dispatcher/nice.rb +1 -1
- data/lib/nitro/element.rb +19 -2
- data/lib/nitro/mixin/markup.rb +2 -2
- data/lib/nitro/mixin/pager.rb +80 -25
- data/lib/nitro/mixin/rss.rb +5 -2
- data/lib/nitro/render.rb +9 -0
- data/lib/nitro/request.rb +93 -6
- data/lib/nitro/response.rb +4 -0
- data/lib/nitro/server.rb +24 -10
- data/lib/nitro/server/runner.rb +15 -10
- data/lib/nitro/service/xmlrpc.rb +1 -0
- data/lib/nitro/test.rb +5 -0
- data/lib/nitro/test/assertions.rb +171 -0
- data/lib/nitro/{testing → test}/context.rb +0 -0
- data/lib/nitro/test/testcase.rb +66 -0
- data/proto/public/error.xhtml +5 -2
- data/proto/public/settings.xhtml +2 -0
- data/proto/script/runner +20 -0
- data/test/nitro/tc_controller.rb +3 -3
- data/test/nitro/tc_controller_aspect.rb +29 -0
- data/test/nitro/tc_dispatcher.rb +2 -1
- data/test/nitro/tc_element.rb +9 -0
- data/test/nitro/tc_request.rb +38 -0
- metadata +13 -13
- data/lib/nitro/mail.rb +0 -270
- data/lib/nitro/template.rb +0 -202
- data/lib/nitro/testing.rb +0 -2
- data/lib/nitro/testing/assertions.rb +0 -100
- data/lib/nitro/testing/testcase.rb +0 -51
- data/test/nitro/tc_mail.rb +0 -97
- data/test/nitro/tc_template.rb +0 -32
data/test/nitro/tc_dispatcher.rb
CHANGED
data/test/nitro/tc_element.rb
CHANGED
@@ -28,6 +28,12 @@ $source = %{
|
|
28
28
|
</html>
|
29
29
|
}
|
30
30
|
|
31
|
+
$source2 = %{
|
32
|
+
<x:box color="#ff0">
|
33
|
+
xhtml mode
|
34
|
+
</x:box>
|
35
|
+
}
|
36
|
+
|
31
37
|
class Box < Nitro::Element
|
32
38
|
def open
|
33
39
|
%|<div style="color: #@color">|
|
@@ -41,5 +47,8 @@ end
|
|
41
47
|
class TC_Element < Test::Unit::TestCase # :nodoc: all
|
42
48
|
def test_all
|
43
49
|
res = ElementProcessor.transform($source)
|
50
|
+
assert_match /div style/, res
|
51
|
+
res = ElementProcessor.transform($source2)
|
52
|
+
assert_match /div style/, res
|
44
53
|
end
|
45
54
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require 'nitro/request'
|
6
|
+
|
7
|
+
class TC_Request < Test::Unit::TestCase # :nodoc: all
|
8
|
+
class DummyRequest
|
9
|
+
include Nitro::Request
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@headers = {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_all
|
17
|
+
req = DummyRequest.new
|
18
|
+
|
19
|
+
req.headers['HTTP_HOST'] = 'www.nitrohq.com'
|
20
|
+
assert_equal 'nitrohq.com', req.domain
|
21
|
+
assert_equal 'www', req.subdomains.first
|
22
|
+
|
23
|
+
req.headers['HTTP_HOST'] = 'www.nitrohq.co.uk'
|
24
|
+
assert_equal 'nitrohq.co.uk', req.domain(2)
|
25
|
+
|
26
|
+
req.headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
27
|
+
assert req.xhr?
|
28
|
+
|
29
|
+
req.headers['REQUEST_METHOD'] = 'POST'
|
30
|
+
|
31
|
+
req.headers['CONTENT_TYPE'] = 'application/x-yaml'
|
32
|
+
assert req.yaml_post?
|
33
|
+
|
34
|
+
req.instance_variable_set '@post_format', nil
|
35
|
+
req.headers['CONTENT_TYPE'] = 'text/xml'
|
36
|
+
assert req.xml_post?
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: nitro
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2005-07
|
6
|
+
version: 0.22.0
|
7
|
+
date: 2005-08-07 00:00:00 +03:00
|
8
8
|
summary: Nitro Web Engine
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- proto/src
|
65
65
|
- proto/run.rb
|
66
66
|
- proto/README
|
67
|
+
- proto/script
|
67
68
|
- proto/conf/lhttpd.conf
|
68
69
|
- proto/conf/apache.conf
|
69
70
|
- proto/doc/README
|
@@ -82,31 +83,30 @@ files:
|
|
82
83
|
- proto/public/js/behaviour.js
|
83
84
|
- proto/public/js/controls.js
|
84
85
|
- proto/public/js/effects.js
|
86
|
+
- proto/script/runner
|
85
87
|
- lib/nitro
|
86
88
|
- lib/nitro.rb
|
87
89
|
- lib/nitro/server
|
88
|
-
- lib/nitro/testing
|
89
90
|
- lib/nitro/session
|
90
91
|
- lib/nitro/adapter
|
91
92
|
- lib/nitro/caching
|
92
93
|
- lib/nitro/element
|
94
|
+
- lib/nitro/test
|
93
95
|
- lib/nitro/controller.rb
|
94
96
|
- lib/nitro/scaffold.rb
|
95
|
-
- lib/nitro/mail.rb
|
96
97
|
- lib/nitro/dispatcher.rb
|
97
98
|
- lib/nitro/context.rb
|
98
99
|
- lib/nitro/dispatcher
|
99
100
|
- lib/nitro/request.rb
|
100
101
|
- lib/nitro/mixin
|
101
102
|
- lib/nitro/caching.rb
|
103
|
+
- lib/nitro/test.rb
|
102
104
|
- lib/nitro/compiler
|
103
105
|
- lib/nitro/cookie.rb
|
104
|
-
- lib/nitro/testing.rb
|
105
106
|
- lib/nitro/render.rb
|
106
107
|
- lib/nitro/session.rb
|
107
108
|
- lib/nitro/routing.rb
|
108
109
|
- lib/nitro/response.rb
|
109
|
-
- lib/nitro/template.rb
|
110
110
|
- lib/nitro/element.rb
|
111
111
|
- lib/nitro/service.rb
|
112
112
|
- lib/nitro/service
|
@@ -114,9 +114,6 @@ files:
|
|
114
114
|
- lib/nitro/server.rb
|
115
115
|
- lib/nitro/compiler.rb
|
116
116
|
- lib/nitro/server/runner.rb
|
117
|
-
- lib/nitro/testing/assertions.rb
|
118
|
-
- lib/nitro/testing/context.rb
|
119
|
-
- lib/nitro/testing/testcase.rb
|
120
117
|
- lib/nitro/session/drbserver.rb
|
121
118
|
- lib/nitro/session/drb.rb
|
122
119
|
- lib/nitro/session/memory.rb
|
@@ -131,6 +128,9 @@ files:
|
|
131
128
|
- lib/nitro/caching/output.rb
|
132
129
|
- lib/nitro/caching/fragments.rb
|
133
130
|
- lib/nitro/element/java_script.rb
|
131
|
+
- lib/nitro/test/assertions.rb
|
132
|
+
- lib/nitro/test/context.rb
|
133
|
+
- lib/nitro/test/testcase.rb
|
134
134
|
- lib/nitro/dispatcher/nice.rb
|
135
135
|
- lib/nitro/dispatcher/general.rb
|
136
136
|
- lib/nitro/mixin/debug.rb
|
@@ -157,8 +157,6 @@ files:
|
|
157
157
|
- test/nitro/mixin
|
158
158
|
- test/nitro/ui
|
159
159
|
- test/nitro/adapter
|
160
|
-
- test/nitro/tc_template.rb
|
161
|
-
- test/nitro/tc_mail.rb
|
162
160
|
- test/nitro/tc_controller.rb
|
163
161
|
- test/nitro/tc_session.rb
|
164
162
|
- test/nitro/tc_context.rb
|
@@ -167,7 +165,9 @@ files:
|
|
167
165
|
- test/nitro/tc_caching.rb
|
168
166
|
- test/nitro/tc_flash.rb
|
169
167
|
- test/nitro/tc_server.rb
|
168
|
+
- test/nitro/tc_request.rb
|
170
169
|
- test/nitro/tc_cookie.rb
|
170
|
+
- test/nitro/tc_controller_aspect.rb
|
171
171
|
- test/nitro/mixin/tc_pager.rb
|
172
172
|
- test/nitro/mixin/tc_rss.rb
|
173
173
|
- test/nitro/mixin/tc_table.rb
|
@@ -208,7 +208,7 @@ dependencies:
|
|
208
208
|
-
|
209
209
|
- "="
|
210
210
|
- !ruby/object:Gem::Version
|
211
|
-
version: 0.
|
211
|
+
version: 0.22.0
|
212
212
|
version:
|
213
213
|
- !ruby/object:Gem::Dependency
|
214
214
|
name: og
|
@@ -218,7 +218,7 @@ dependencies:
|
|
218
218
|
-
|
219
219
|
- "="
|
220
220
|
- !ruby/object:Gem::Version
|
221
|
-
version: 0.
|
221
|
+
version: 0.22.0
|
222
222
|
version:
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: ruby-breakpoint
|
data/lib/nitro/mail.rb
DELETED
@@ -1,270 +0,0 @@
|
|
1
|
-
# Based on original code from the RubyOnRails project.
|
2
|
-
# http://www.rubyonrails.com
|
3
|
-
# Copyright (c) 2004 David Heinemeier Hansson
|
4
|
-
|
5
|
-
require 'net/smtp'
|
6
|
-
|
7
|
-
require 'glue/attribute'
|
8
|
-
require 'nitro/template'
|
9
|
-
|
10
|
-
module Nitro
|
11
|
-
|
12
|
-
# Encapsulates an email message.
|
13
|
-
|
14
|
-
class Mail
|
15
|
-
|
16
|
-
# Sender, can be an array.
|
17
|
-
|
18
|
-
attr_accessor :from
|
19
|
-
|
20
|
-
# The list of the recipients, can be arrays.
|
21
|
-
|
22
|
-
attr_accessor :to, :cc, :bcc
|
23
|
-
|
24
|
-
# The subject
|
25
|
-
|
26
|
-
attr_accessor :subject
|
27
|
-
|
28
|
-
# The body of the message.
|
29
|
-
|
30
|
-
attr_accessor :body
|
31
|
-
|
32
|
-
# Reply to.
|
33
|
-
|
34
|
-
attr_accessor :reply_to
|
35
|
-
|
36
|
-
# Sent on
|
37
|
-
|
38
|
-
attr_accessor :sent_on
|
39
|
-
|
40
|
-
# Encode the subject?
|
41
|
-
|
42
|
-
attr_accessor :encode_subject
|
43
|
-
|
44
|
-
# The charset used to encode the message.
|
45
|
-
|
46
|
-
attr_accessor :charset
|
47
|
-
|
48
|
-
# Additional headers
|
49
|
-
|
50
|
-
attr_accessor :headers
|
51
|
-
|
52
|
-
def initialize(from = nil, to = nil, subject = nil, body = nil)
|
53
|
-
@from, @to, @subject, @body = from, to, subject, body
|
54
|
-
@headers = {}
|
55
|
-
end
|
56
|
-
|
57
|
-
def [](key)
|
58
|
-
@headers[key]
|
59
|
-
end
|
60
|
-
|
61
|
-
def []=(key, value)
|
62
|
-
@headers[key] = value
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns the Mail message in encoded format.
|
66
|
-
|
67
|
-
def encoded
|
68
|
-
raise 'No body defined' unless @body
|
69
|
-
raise 'No sender defined' unless @from
|
70
|
-
raise 'No recipients defined' unless @to
|
71
|
-
|
72
|
-
# gmosx: From is typically NOT an array.
|
73
|
-
|
74
|
-
from = @from.is_a?(Array) ? @from.join(', ') : @from
|
75
|
-
buf = "From: #{from}\n"
|
76
|
-
|
77
|
-
to = @to.is_a?(Array) ? @to.join(', ') : @to
|
78
|
-
buf << "To: #{to}\n"
|
79
|
-
|
80
|
-
if @cc
|
81
|
-
cc = @cc.is_a?(Array) ? @cc.join(', ') : @cc
|
82
|
-
buf << "Cc: #{cc}\n"
|
83
|
-
end
|
84
|
-
|
85
|
-
if @bcc
|
86
|
-
bcc = @bcc.is_a?(Array) ? @bcc.join(', ') : @bcc
|
87
|
-
buf << "Bcc: #{bcc}\n"
|
88
|
-
end
|
89
|
-
|
90
|
-
buf << "Subject: #@subject\n" if @subject
|
91
|
-
|
92
|
-
buf << "\n"
|
93
|
-
buf << @body
|
94
|
-
|
95
|
-
return buf
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
module MailerMixin
|
100
|
-
|
101
|
-
def self.append_features(base) # :nodoc:
|
102
|
-
super
|
103
|
-
base.extend(SingletonMethods)
|
104
|
-
end
|
105
|
-
|
106
|
-
module SingletonMethods
|
107
|
-
|
108
|
-
def mailer(klass)
|
109
|
-
end
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
# A flexible mailing service.
|
116
|
-
#--
|
117
|
-
# TODO: add callback/observers support.
|
118
|
-
#++
|
119
|
-
|
120
|
-
class Mailer < Mail
|
121
|
-
|
122
|
-
# The mail server configuration.
|
123
|
-
|
124
|
-
cattr_accessor :server; @@server = {
|
125
|
-
:address => 'localhost',
|
126
|
-
:port => 25,
|
127
|
-
:domain => 'localhost.localdomain',
|
128
|
-
:username => nil,
|
129
|
-
:password => nil,
|
130
|
-
:authentication => nil
|
131
|
-
}
|
132
|
-
|
133
|
-
# The delivery method. The following options are
|
134
|
-
# supported:
|
135
|
-
#
|
136
|
-
# * :smtp
|
137
|
-
# * :sendmail
|
138
|
-
# * :test
|
139
|
-
|
140
|
-
cattr_accessor :delivery_method; @@delivery_method = :smtp
|
141
|
-
|
142
|
-
# The encode subject.
|
143
|
-
|
144
|
-
cattr_accessor :encode_subject; @@encode_subject = false # true
|
145
|
-
|
146
|
-
# The default charset.
|
147
|
-
|
148
|
-
cattr_accessor :default_charset, 'utf-8'
|
149
|
-
|
150
|
-
# An array to store the delivered mails, useful
|
151
|
-
# for testing.
|
152
|
-
|
153
|
-
cattr_accessor :deliveries; @@deliveries = []
|
154
|
-
|
155
|
-
# Disable deliveries, useful for testing.
|
156
|
-
|
157
|
-
cattr_accessor :disable_deliveries, false
|
158
|
-
|
159
|
-
# The root directory where the templates reside
|
160
|
-
|
161
|
-
attr_accessor :template_root
|
162
|
-
|
163
|
-
def initialize(from = nil, to = nil, subject = nil, body = FileTemplate.new)
|
164
|
-
super
|
165
|
-
@charset = @@default_charset.dup
|
166
|
-
@encode_subject = @@encode_subject
|
167
|
-
@template_root = 'public'
|
168
|
-
end
|
169
|
-
|
170
|
-
class << self
|
171
|
-
|
172
|
-
def method_missing(method_symbol, *params) #:nodoc:
|
173
|
-
case method_symbol.id2name
|
174
|
-
when /^create_([_a-z]*)/
|
175
|
-
create_from_method($1, *params)
|
176
|
-
when /^deliver_([_a-z]*)/
|
177
|
-
begin
|
178
|
-
deliver(send("create_" + $1, *params))
|
179
|
-
rescue Object => e
|
180
|
-
raise e # FIXME
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def mail(from, to, subject, body, timestamp = nil, headers = {}, encode = @@encode_subject, charset = @@default_charset) #:nodoc:
|
186
|
-
deliver(create(from, to, subject, body, timestamp, headers, charset))
|
187
|
-
end
|
188
|
-
|
189
|
-
def create(from, to, subject, body, timestamp = nil, headers = {}, encode = @@encode_subject, charset = @@default_charset) #:nodoc:
|
190
|
-
m = Mail.new
|
191
|
-
m.to, m.subject, m.body, m.from = to, ( encode ? quoted_printable(subject, charset) : subject ), body, from
|
192
|
-
# m.date = timestamp.respond_to?("to_time") ? timestamp.to_time : (timestamp || Time.now)
|
193
|
-
# m.set_content_type "text", "plain", { "charset" => charset }
|
194
|
-
headers.each do |k, v|
|
195
|
-
m[k] = v
|
196
|
-
end
|
197
|
-
return m
|
198
|
-
end
|
199
|
-
|
200
|
-
def deliver(mail) #:nodoc:
|
201
|
-
send("perform_delivery_#{delivery_method}", mail) unless disable_deliveries
|
202
|
-
end
|
203
|
-
|
204
|
-
def quoted_printable(text, charset) #:nodoc:
|
205
|
-
text = text.gsub( /[^a-z ]/i ) { "=%02x" % $&[0] }.gsub( / /, "_" )
|
206
|
-
"=?#{charset}?Q?#{text}?="
|
207
|
-
end
|
208
|
-
|
209
|
-
private
|
210
|
-
|
211
|
-
def create_from_method(method_name, *params)
|
212
|
-
mailer = new
|
213
|
-
|
214
|
-
mailer.send(method_name, *params)
|
215
|
-
|
216
|
-
unless mailer.body.is_a?(String)
|
217
|
-
mailer.body = render_body(method_name, mailer)
|
218
|
-
end
|
219
|
-
|
220
|
-
mail = create(
|
221
|
-
mailer.from, mailer.to, mailer.subject,
|
222
|
-
mailer.body, mailer.sent_on,
|
223
|
-
mailer.headers, mailer.charset
|
224
|
-
)
|
225
|
-
|
226
|
-
mail.cc = mailer.cc if mailer.cc
|
227
|
-
mail.bcc = mailer.bcc if mailer.bcc
|
228
|
-
|
229
|
-
return mail
|
230
|
-
end
|
231
|
-
|
232
|
-
# Render the body by expanfing the template
|
233
|
-
|
234
|
-
def render_body(method_name, mailer)
|
235
|
-
mailer.body.template_filename = "#{mailer.template_root}/#{method_name.to_s}.xhtml"
|
236
|
-
return mailer.body.process
|
237
|
-
end
|
238
|
-
|
239
|
-
# Deliver emails using SMTP.
|
240
|
-
|
241
|
-
def perform_delivery_smtp(mail) # :nodoc:
|
242
|
-
c = @@server
|
243
|
-
Net::SMTP.start(c[:address], c[:port], c[:domain], c[:username], c[:password], c[:authentication]) do |smtp|
|
244
|
-
smtp.send_message(mail.encoded, mail.from, mail.to)
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
# Deliver emails using sendmail.
|
249
|
-
|
250
|
-
def perform_delivery_sendmail(mail) # :nodoc:
|
251
|
-
IO.popen('/usr/sbin/sendmail -i -t', 'w+') do |sm|
|
252
|
-
sm.print(mail.encoded)
|
253
|
-
sm.flush
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
# Used for testing, does not actually send the
|
258
|
-
# mail.
|
259
|
-
|
260
|
-
def perform_delivery_test(mail) # :nodoc:
|
261
|
-
deliveries << mail
|
262
|
-
end
|
263
|
-
|
264
|
-
end
|
265
|
-
|
266
|
-
end
|
267
|
-
|
268
|
-
end
|
269
|
-
|
270
|
-
# * George Moschovitis <gm@navel.gr>
|
data/lib/nitro/template.rb
DELETED
@@ -1,202 +0,0 @@
|
|
1
|
-
require 'glue/flexob'
|
2
|
-
require 'glue/configuration'
|
3
|
-
|
4
|
-
module Nitro
|
5
|
-
|
6
|
-
# A template is a text file with embeded Ruby code. The template
|
7
|
-
# processor converts the original text file to ruby code and
|
8
|
-
# then evaluates this code to produce the result of the
|
9
|
-
# template transformation.
|
10
|
-
|
11
|
-
module TemplateMixin
|
12
|
-
|
13
|
-
# Convert a template to actual Ruby code, ready to be
|
14
|
-
# evaluated.
|
15
|
-
#
|
16
|
-
# [+template+]
|
17
|
-
# The template as a String.
|
18
|
-
#
|
19
|
-
# [+buffer+]
|
20
|
-
# The variable to act as a buffer where the ruby code
|
21
|
-
# for this template will be generated. Passed as a|
|
22
|
-
# String.
|
23
|
-
#
|
24
|
-
# [+base_dir+]
|
25
|
-
# The base directory where the templates reside.
|
26
|
-
|
27
|
-
def compile_template(template, buffer = '@out', base_dir = Dir.pwd)
|
28
|
-
text = template.dup
|
29
|
-
|
30
|
-
# Strip the xml header! (interracts with the following gsub!)
|
31
|
-
text.gsub!(/<\?xml.*\?>/, "")
|
32
|
-
|
33
|
-
# Statically include sub-template files.
|
34
|
-
# The target file is included at compile time.
|
35
|
-
#
|
36
|
-
# gmosx: must be xformed before the <?r pi.
|
37
|
-
#
|
38
|
-
# Example:
|
39
|
-
# <?include href="root/myfile.sx" ?>
|
40
|
-
|
41
|
-
text.gsub!(/<\?include href=["|'](.*?)["|'](.*)\?>/) do |match|
|
42
|
-
text = File.read("#{base_dir}/#$1")
|
43
|
-
text.gsub!(/<\?xml.*\?>/, '')
|
44
|
-
text.gsub!(/<\/?root(.*?)>/m, ' ');
|
45
|
-
text
|
46
|
-
end
|
47
|
-
|
48
|
-
# Transform include instructions <include href="xxx" />
|
49
|
-
# must be transformed before the processinc instructions.
|
50
|
-
# Useful to include fragments cached on disk
|
51
|
-
#
|
52
|
-
# gmosx, FIXME: NOT TESTED! test and add caching.
|
53
|
-
# add load_statically_included fixes.
|
54
|
-
|
55
|
-
text.gsub!(/<include href=["|'](.*?)["|'](.*)(.?)\/>/) do |match|
|
56
|
-
"<?r File.read( '\#\{@dispatcher.root\}/#$1' ?>"
|
57
|
-
end
|
58
|
-
|
59
|
-
# xform render/inject instructions <render href="xxx" />
|
60
|
-
# must be transformed before the processinc instructions.
|
61
|
-
|
62
|
-
text.gsub!(/<inject href=["|'](.*?)["|'](.*)(.?)\/>/) do |match|
|
63
|
-
"<?r render '/#$1' ?>"
|
64
|
-
end
|
65
|
-
|
66
|
-
text.gsub!(/<render href=["|'](.*?)["|'](.*)(.?)\/>/) do |match|
|
67
|
-
"<?r render '/#$1' ?>"
|
68
|
-
end
|
69
|
-
|
70
|
-
# Remove <root> elements. typically removed by xslt but lets
|
71
|
-
# play it safe. The <root> element is typically added to
|
72
|
-
# template files to make them XHTML valid.
|
73
|
-
|
74
|
-
text.gsub!(/<(\/)?root>/, '')
|
75
|
-
|
76
|
-
# Transform the processing instructions, use <?r as
|
77
|
-
# a marker.
|
78
|
-
|
79
|
-
text.gsub!(/\?>/, "; #{buffer} << %^")
|
80
|
-
text.gsub!(/<\?r(\s?)/, "^; ")
|
81
|
-
|
82
|
-
# Transform alternative code tags.
|
83
|
-
# (very useful in xsl stylesheets)
|
84
|
-
|
85
|
-
text.gsub!(/<\/ruby>/, "; #{buffer} << %^")
|
86
|
-
text.gsub!(/<ruby>/, "^; ")
|
87
|
-
|
88
|
-
# Also handle erb/asp/jsp style tags. Those tags
|
89
|
-
# *cannot* be used with an xslt stylesheet.
|
90
|
-
|
91
|
-
text.gsub!(/%>/, "; #{buffer} << %^")
|
92
|
-
text.gsub!(/<%/, "^; ")
|
93
|
-
|
94
|
-
# Alterative versions of interpolation.
|
95
|
-
# (very useful in xsl stylesheets)
|
96
|
-
# Example: #\my_val\
|
97
|
-
|
98
|
-
text.gsub!(/\#\\(.*?)\\/, '#{\1}')
|
99
|
-
|
100
|
-
# Alternative for entities.
|
101
|
-
# (useful in xsl stylesheets)
|
102
|
-
# Examples: %nbsp;, %rquo;
|
103
|
-
|
104
|
-
text.gsub!(/%(\S*?);/, '&\1;')
|
105
|
-
|
106
|
-
# Compile time ruby code. This code is evaluated when
|
107
|
-
# compiling the template and the result injected directly
|
108
|
-
# into the result. Usefull for example to prevaluate
|
109
|
-
# localization. Just use the #[] marker instead of #{}.
|
110
|
-
|
111
|
-
text.gsub!(/\#\[(.*?)\]/) do |match|
|
112
|
-
eval($1)
|
113
|
-
end
|
114
|
-
|
115
|
-
text = "#{buffer} << %^" + text + "^"
|
116
|
-
|
117
|
-
return text
|
118
|
-
end
|
119
|
-
|
120
|
-
# Render the template.
|
121
|
-
#
|
122
|
-
# [+ruby+]
|
123
|
-
# A String containing the compiled template
|
124
|
-
# code.
|
125
|
-
#
|
126
|
-
# [+binding+]
|
127
|
-
# The evaluation binding for the rendering.
|
128
|
-
|
129
|
-
def render_template(ruby, the_binding = nil)
|
130
|
-
eval(ruby, the_binding)
|
131
|
-
end
|
132
|
-
|
133
|
-
# Compile and render the template.
|
134
|
-
|
135
|
-
def process_template(template, buffer = '@out', the_binding = nil)
|
136
|
-
render_template(compile_template(template, buffer), the_binding)
|
137
|
-
end
|
138
|
-
|
139
|
-
end
|
140
|
-
|
141
|
-
# A helper class that provides access to the Template methods
|
142
|
-
# as singleton methods.
|
143
|
-
|
144
|
-
class Template
|
145
|
-
|
146
|
-
# The default root directory where template files reside.
|
147
|
-
|
148
|
-
setting :root, :default => 'public', :doc => 'The default root directory where template files reside'
|
149
|
-
|
150
|
-
# The default template name.
|
151
|
-
|
152
|
-
setting :default, :default => 'index', :doc => 'The default template name'
|
153
|
-
|
154
|
-
# The default template file extension.
|
155
|
-
|
156
|
-
setting :extension, :default => 'xhtml', :doc => 'The default template file extension'
|
157
|
-
|
158
|
-
class << self
|
159
|
-
include TemplateMixin
|
160
|
-
alias_method :compile, :compile_template
|
161
|
-
alias_method :transform, :compile_template
|
162
|
-
alias_method :render, :render_template
|
163
|
-
alias_method :process, :process_template
|
164
|
-
end
|
165
|
-
|
166
|
-
end
|
167
|
-
|
168
|
-
# A Template that reads from files and also
|
169
|
-
# provides a simple but effective caching scheme.
|
170
|
-
# An intuitive binding mechanism provides the
|
171
|
-
# expansion environment.
|
172
|
-
|
173
|
-
class FileTemplate < Flexob
|
174
|
-
include TemplateMixin
|
175
|
-
|
176
|
-
@@compiled_template_cache = {}
|
177
|
-
|
178
|
-
attr_accessor :template_filename
|
179
|
-
|
180
|
-
def initialize(filename = nil)
|
181
|
-
super
|
182
|
-
@template_filename = filename
|
183
|
-
end
|
184
|
-
|
185
|
-
def process
|
186
|
-
__out__ = ''
|
187
|
-
|
188
|
-
unless compiled = @@compiled_template_cache[@template_filename]
|
189
|
-
template = File.read(@template_filename)
|
190
|
-
compiled = compile_template(template, '__out__')
|
191
|
-
@@compiled_template_cache[@template_filename] = compiled
|
192
|
-
end
|
193
|
-
|
194
|
-
render_template(compiled, binding)
|
195
|
-
|
196
|
-
return __out__
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
end
|
201
|
-
|
202
|
-
# * George Moschovitis <gm@navel.gr>
|