nitro 0.16.0 → 0.17.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 (45) hide show
  1. data/CHANGELOG +94 -1
  2. data/INSTALL +3 -0
  3. data/README +9 -1
  4. data/Rakefile +2 -1
  5. data/doc/RELEASES +183 -2
  6. data/examples/blog/run.rb +4 -9
  7. data/examples/blog/src/controller.rb +1 -5
  8. data/examples/blog/src/models/blog.rb +1 -5
  9. data/examples/blog/src/models/content.rb +0 -5
  10. data/examples/blog/src/views/comments.xhtml +6 -11
  11. data/examples/blog/src/views/index.xhtml +2 -3
  12. data/examples/blog/src/views/recent_posts.xhtml +1 -1
  13. data/examples/no_xsl_blog/lib/blog/controller.rb +1 -5
  14. data/examples/no_xsl_blog/lib/blog/model.rb +2 -6
  15. data/examples/no_xsl_blog/lib/blog.rb +0 -4
  16. data/examples/no_xsl_blog/lib/content.rb +7 -11
  17. data/examples/no_xsl_blog/public/comments.xhtml +6 -11
  18. data/examples/no_xsl_blog/public/index.xhtml +2 -2
  19. data/examples/no_xsl_blog/public/recent_posts.xhtml +1 -1
  20. data/examples/no_xsl_blog/run.rb +2 -9
  21. data/lib/nitro/adapters/cgi.rb +7 -8
  22. data/lib/nitro/adapters/fastcgi.rb +17 -19
  23. data/lib/nitro/adapters/webrick.rb +3 -3
  24. data/lib/nitro/buffering.rb +0 -4
  25. data/lib/nitro/builders/form.rb +3 -3
  26. data/lib/nitro/builders/rss.rb +33 -4
  27. data/lib/nitro/builders/xhtml.rb +1 -1
  28. data/lib/nitro/builders/xml.rb +1 -1
  29. data/lib/nitro/context.rb +0 -4
  30. data/lib/nitro/controller.rb +0 -4
  31. data/lib/nitro/dispatcher.rb +5 -5
  32. data/lib/nitro/element.rb +151 -0
  33. data/lib/nitro/part.rb +0 -4
  34. data/lib/nitro/render.rb +79 -40
  35. data/lib/nitro/request.rb +15 -4
  36. data/lib/nitro/scaffold.rb +2 -6
  37. data/lib/nitro/shaders.rb +4 -3
  38. data/lib/nitro/template.rb +3 -1
  39. data/lib/nitro.rb +7 -6
  40. data/proto/public/error.xhtml +1 -1
  41. data/proto/public/js/prototype.js +764 -0
  42. data/test/nitro/adapters/tc_cgi.rb +1 -0
  43. data/test/nitro/tc_element.rb +46 -0
  44. metadata +27 -6
  45. data/examples/blog/cache/entriesadmintrue +0 -3
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: fastcgi.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  require 'cgi'
6
2
  require 'fcgi'
7
3
 
@@ -28,27 +24,29 @@ class FastCGI
28
24
  conf = Flexob.new(conf) unless conf.is_a?(Flexob)
29
25
 
30
26
  FCGI.each do |cgi|
27
+ begin
28
+ context = Context.new(conf)
31
29
 
32
- context = Context.new(conf)
33
-
34
- context.in = cgi.in
35
- context.headers = cgi.env
36
-
37
- CgiUtils.parse_params(context)
38
- CgiUtils.parse_cookies(context)
39
-
40
- # gmosx, TODO: move this into a filter.
41
- Og.db.get_connection if defined?(Og) and Og.db
30
+ context.in = cgi.in
31
+ context.headers = cgi.env
42
32
 
43
- context.render(context.path)
33
+ CgiUtils.parse_params(context)
34
+ CgiUtils.parse_cookies(context)
35
+
36
+ # gmosx, TODO: move this into a filter.
37
+ # Og.db.get_connection if defined?(Og) and Og.db
44
38
 
45
- Og.db.put_connection if defined?(Og) and Og.db
39
+ context.render(context.path)
46
40
 
47
- cgi.out.print(CgiUtils.response_headers(context))
48
- cgi.out.print(context.out)
41
+ # Og.db.put_connection if defined?(Og) and Og.db
49
42
 
50
- cgi.finish
43
+ cgi.out.print(CgiUtils.response_headers(context))
44
+ cgi.out.print(context.out)
51
45
 
46
+ cgi.finish
47
+ ensure
48
+ # Og.db.put_connection if defined?(Og) and Og.db
49
+ end
52
50
  end
53
51
  end
54
52
 
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: webrick.rb 9 2005-04-13 00:08:20Z nasis $
3
+ # $Id: webrick.rb 41 2005-05-05 14:56:40Z gmosx $
4
4
 
5
5
  require 'webrick'
6
6
  require 'stringio'
@@ -103,7 +103,7 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
103
103
  path = req.request_uri.path
104
104
 
105
105
  # gmosx, TODO: move this into a filter.
106
- Og.db.get_connection if defined?(Og) and Og.db
106
+ # Og.db.get_connection if defined?(Og) and Og.db
107
107
 
108
108
  # REQUEST_MUTEX.lock
109
109
 
@@ -131,7 +131,7 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
131
131
  context.close
132
132
  ensure
133
133
  # REQUEST_MUTEX.unlock if REQUEST_MUTEX.locked?
134
- Og.db.put_connection if defined?(Og) and Og.db
134
+ # Og.db.put_connection if defined?(Og) and Og.db
135
135
  end
136
136
  end
137
137
  end
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: buffering.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  require 'glue/attribute'
6
2
 
7
3
  require 'nitro/shaders'
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: form.rb 1 2005-04-11 11:04:30Z gmosx $
2
+ # (c) 2005 Navel, all rights reserved.
3
+ # $Id: form.rb 30 2005-04-25 12:28:02Z gmosx $
4
4
 
5
5
  require 'glue/hash'
6
6
  require 'nitro/markup'
@@ -18,7 +18,7 @@ module FormBuilderMixin
18
18
  #
19
19
  # <p>
20
20
  # <form name="test">
21
- # #{N::FormBuilder.render(entry)}
21
+ # #{o.build_form(entry)}
22
22
  # </form>
23
23
  # </p>
24
24
 
@@ -1,10 +1,7 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id: rss.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  require 'rss/0.9'
6
2
 
7
3
  require 'glue/string'
4
+ require 'nitro/builders/xml'
8
5
 
9
6
  module Nitro
10
7
 
@@ -14,9 +11,13 @@ module Nitro
14
11
  #
15
12
  #--
16
13
  # TODO: add more options here, 1.0/2.0 support and more.
14
+ # use custom version to add headers like the following.
15
+ # <?xml version="1.0" encoding="UTF-8"?>
16
+ # <?xml-stylesheet href="rss.css" type="text/css"?>
17
17
  #++
18
18
 
19
19
  module RssBuilderMixin
20
+ include XmlBuilderMixin
20
21
 
21
22
  # === Options
22
23
  #
@@ -55,6 +56,34 @@ module RssBuilderMixin
55
56
  end
56
57
  alias_method :build_rss, :build_rss_09
57
58
 
59
+ =begin
60
+ Experimental.
61
+
62
+ def build_rss(objects, options = {})
63
+ # pi! :xml, :version => '1.0', :encoding => 'UTF-8'
64
+ self << '<?xml version="1.0" encoding="UTF-8" ?>'
65
+ self << '<?xml-stylesheet href="rss.css" type="text/css" ?>'
66
+ rss(:version => '2.0',
67
+ 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
68
+ 'xmlns:trackback' => 'http://madskills.com/public/xml/rss/module/trackback/') {
69
+ channel {
70
+ title 'koko'
71
+ language 'en-us'
72
+ ttl '40'
73
+ description 'hello lamer'
74
+
75
+ for obj in objects
76
+ item {
77
+ title(obj.title)
78
+ description(obj.body)
79
+ trackback :ping => 'http://www.joy.gr'
80
+ }
81
+ end
82
+ }
83
+ }
84
+ end
85
+ =end
86
+
58
87
  end
59
88
 
60
89
  # Abstract class for the RssBuilderMixin.
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2005 Navel, all rights reserved.
3
- # $Id: xhtml.rb 1 2005-04-11 11:04:30Z gmosx $
3
+ # $Id: xhtml.rb 25 2005-04-18 12:31:55Z gmosx $
4
4
 
5
5
  require 'nitro/builders/xml'
6
6
 
@@ -1,6 +1,6 @@
1
1
  # George Moschovitis <gm@navel.gr>
2
2
  # (c) 2005 Navel, all rights reserved.
3
- # $Id: xml.rb 1 2005-04-11 11:04:30Z gmosx $
3
+ # $Id: xml.rb 25 2005-04-18 12:31:55Z gmosx $
4
4
 
5
5
  module Nitro
6
6
 
data/lib/nitro/context.rb CHANGED
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: context.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  require 'nitro/request'
6
2
  require 'nitro/response'
7
3
  require 'nitro/render'
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id: controller.rb 20 2005-04-15 15:18:36Z gmosx $
4
-
5
1
  require 'glue/aspects'
6
2
 
7
3
  require 'nitro/render'
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: dispatcher.rb 23 2005-04-16 18:20:00Z gmosx $
3
+ # $Id: dispatcher.rb 30 2005-04-25 12:28:02Z gmosx $
4
4
 
5
5
  module Nitro
6
6
 
@@ -153,7 +153,7 @@ class Dispatcher
153
153
  klass = @controllers[key]
154
154
 
155
155
  if (:full == Rendering.reload) and context and context[:__RELOADED__].nil? and klass
156
- =begin
156
+ #=begin
157
157
  ancestors = [c = klass]
158
158
  while (c = c.superclass) != Nitro::Controller
159
159
  ancestors.unshift(c)
@@ -169,14 +169,14 @@ class Dispatcher
169
169
  load(c::DEF_FILE)
170
170
  c = Object.const_get(klass.name.intern)
171
171
  end
172
- =end
173
- #=begin
172
+ #=end
173
+ =begin
174
174
  def_file = klass::DEF_FILE
175
175
  # Object.send(:remove_const, klass) rescue nil
176
176
  # FIXME: also reload superclasses!
177
177
  Controller.remove_subclasses
178
178
  load(def_file)
179
- #=end
179
+ =end
180
180
  klass = @controllers[key] = Object.const_get(klass.name.intern)
181
181
  context[:__RELOADED__] = true
182
182
  end
@@ -0,0 +1,151 @@
1
+ require 'rexml/document'
2
+ require 'rexml/streamlistener'
3
+
4
+ require 'facet/string/capitalized%3F'
5
+
6
+ module Nitro
7
+
8
+ # A programmatically generated element.
9
+ #
10
+ # === Design
11
+ #
12
+ # An underscore is used for the standard attibutes to
13
+ # avoid name clashes.
14
+ #--
15
+ # TODO:
16
+ # * separate 'view' template files.
17
+ #++
18
+
19
+ class Element
20
+ # The parent of this element.
21
+
22
+ attr_accessor :_parent
23
+
24
+ # The childrens of this element.
25
+
26
+ attr_accessor :_children
27
+
28
+ # The text of this element.
29
+
30
+ attr_accessor :_text
31
+
32
+ # The view of this element.
33
+
34
+ attr_accessor :_view
35
+
36
+ def initialize(*args)
37
+ @_children = []
38
+ @_text = ''
39
+ end
40
+
41
+ def open
42
+ end
43
+
44
+ def content
45
+ # "#{@_text}#{render_children}"
46
+ @_text
47
+ end
48
+
49
+ def close
50
+ end
51
+
52
+ def render
53
+ "#{open}#{content}#{close}"
54
+ end
55
+
56
+ def render_children
57
+ str = ''
58
+ for c in @_children
59
+ str << c.render
60
+ end
61
+
62
+ return str
63
+ end
64
+
65
+ def add_child(child)
66
+ child._parent = self
67
+ @_children << child
68
+ end
69
+ end
70
+
71
+ # Processes a page containing elements.
72
+
73
+ class ElementProcessor # :nodoc: all
74
+
75
+ class Listener # :nodoc: all
76
+ include REXML::StreamListener
77
+
78
+ attr_accessor :buffer
79
+ attr_accessor :stack
80
+
81
+ def initialize
82
+ super
83
+ @buffer = ''
84
+ @stack = []
85
+ end
86
+
87
+ def tag_start(name, attributes)
88
+ if name.capitalized?
89
+ obj = Object.const_get(name).new
90
+
91
+ attributes.each do | k, v |
92
+ obj.instance_variable_set("@#{k}", v)
93
+ end
94
+
95
+ @stack.push [obj, @buffer]
96
+
97
+ @buffer = obj._text
98
+ @parent.add_child(obj) if @parent
99
+ @parent = obj
100
+ else # This is a static element.
101
+ attrs = []
102
+
103
+ attributes.each do | k, v |
104
+ attrs << %|#{k}="#{v}"|
105
+ end
106
+
107
+ attrs = attrs.empty? ? nil : " #{attrs.join(' ')}"
108
+
109
+ @buffer << "<#{name}#{attrs}>"
110
+ end
111
+ end
112
+
113
+ def tag_end(name)
114
+ if name.capitalized?
115
+ obj, @buffer = @stack.pop
116
+ @buffer << obj.render
117
+ else
118
+ @buffer << "</#{name}>"
119
+ end
120
+ end
121
+
122
+ def text(str)
123
+ @buffer << str
124
+ end
125
+
126
+ def instruction(name, attributes)
127
+ @buffer << "<?#{name}#{attributes}?>"
128
+ end
129
+ end
130
+
131
+ class << self
132
+ def parse(source)
133
+ self.new.parse(source)
134
+ end
135
+
136
+ def render(source)
137
+ self.new.render(source)
138
+ end
139
+
140
+ end
141
+
142
+ # Expand the elemens found in source.
143
+
144
+ def render(source)
145
+ listener = Listener.new
146
+ REXML::Document.parse_stream(source, listener)
147
+ return listener.buffer
148
+ end
149
+ end
150
+
151
+ end
data/lib/nitro/part.rb CHANGED
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id: part.rb 20 2005-04-15 15:18:36Z gmosx $
4
-
5
1
  # UNDER CONSTRUCTION, dont use yet!
6
2
 
7
3
  require 'glue/attribute'
data/lib/nitro/render.rb CHANGED
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id: render.rb 20 2005-04-15 15:18:36Z gmosx $
4
-
5
1
  require 'sync'
6
2
 
7
3
  require 'glue/attribute'
@@ -12,8 +8,14 @@ require 'nitro/shaders'
12
8
  require 'nitro/buffering'
13
9
 
14
10
  module Nitro
11
+
12
+ # Raise this exception to stop the current action.
13
+ # Typically called to skip the template.
14
+
15
+ class ActionExit < Exception; end
15
16
 
16
- # Raise this exception to stop rendering.
17
+ # Raise this exception to stop rendering altogether.
18
+ # Typically called by redirects.
17
19
 
18
20
  class RenderExit < Exception; end
19
21
 
@@ -81,7 +83,7 @@ module Rendering
81
83
 
82
84
  text = File.read(path)
83
85
  hash, text = shader.process(path, text)
84
-
86
+
85
87
  return text
86
88
  end
87
89
 
@@ -111,20 +113,39 @@ module Rendering
111
113
 
112
114
  code << Aspects.gen_advice_code(action, klass.advices, :pre)
113
115
 
114
- # call the action
116
+ # Call the action
115
117
 
116
118
  if klass.action_methods.include?(action)
117
119
  valid = true
118
120
 
119
- if meta = klass.action_metadata[action.intern]
121
+ # Annotated parameters.
122
+
123
+ if meta = klass.action_metadata[action.intern]
120
124
  params = meta.params.keys
121
- params = params.collect { |p| "@#{p} = @context['#{p}']" }
125
+ params = params.collect { |p| "@#{p} = @context['#{p}']" }
122
126
  code << "#{params.join(';')}"
123
127
  end
128
+
129
+ # Try to resolve action parameters.
130
+
131
+ param_count = klass.instance_method(action.intern).arity
124
132
 
125
- code << %{
126
- #{action}
127
- }
133
+ if param_count > 0
134
+ code << %{
135
+ qs = context.query_string.split(/[&;]/)
136
+
137
+ params = []
138
+ #{param_count}.times do |i|
139
+ params << qs.shift.split(/=/).last
140
+ end
141
+
142
+ unless :stop == #{action}(*params)
143
+ }
144
+ else
145
+ code << %{
146
+ unless :stop == #{action}
147
+ }
148
+ end
128
149
  end
129
150
 
130
151
  # Try to call the template method if it exists. It is a nice
@@ -136,12 +157,21 @@ module Rendering
136
157
  # template file into a template method. It is an even better
137
158
  # practice to place the output related code in an external
138
159
  # template file.
139
-
140
- if (template = template_for_action(template_root, action)) or
160
+
161
+ # Take :view metadata into account.
162
+
163
+ view = nil
164
+ if md = klass.action_metadata[action.intern]
165
+ view = md[:view]
166
+ end
167
+ view ||= action
168
+
169
+ if (template = template_for_action(template_root, view.to_s)) or
141
170
  klass.instance_methods.include?("#{action}_template")
142
171
  valid = true
172
+
143
173
  code << %{
144
- return unless #{action}_template;
174
+ #{action}_template;
145
175
  }
146
176
  end
147
177
 
@@ -152,9 +182,14 @@ module Rendering
152
182
 
153
183
  code << Aspects.gen_advice_code(action, klass.advices, :post)
154
184
 
185
+ if klass.action_methods.include?(action)
186
+ code << %{
187
+ end
188
+ }
189
+ end
190
+
155
191
  code << %{
156
192
  @action_name = @parent_action_name
157
-
158
193
  redirect_referer if @out.empty?
159
194
  end
160
195
  }
@@ -169,13 +204,16 @@ module Rendering
169
204
 
170
205
  # puts '---', klass, '==', code, '---'
171
206
 
172
- where = "Action: #{action}"
173
- where += ", Template: #{template}" if template
174
-
175
207
  begin
176
- klass.class_eval(code, where)
208
+ # FIXME: replace with correct file, line. search for
209
+ # lines in error radius.
210
+ klass.class_eval(code, __FILE__, __LINE__)
177
211
  rescue SyntaxError => e
178
- p e
212
+ where = "Action: #{action}"
213
+ where += ", Template: #{template}" if template
214
+ Logger.error "Action compilation error, #{where}"
215
+ Logger.error e
216
+ return false
179
217
  end
180
218
  end
181
219
 
@@ -192,8 +230,8 @@ end
192
230
 
193
231
  module Render
194
232
 
195
- # The output buffer. The output of a script/action is accumulated
196
- # in this buffer.
233
+ # The output buffer. The output of a script/action is
234
+ # accumulated in this buffer.
197
235
 
198
236
  attr_accessor :out
199
237
 
@@ -207,9 +245,9 @@ module Render
207
245
  alias_method :ctx, :context
208
246
  alias_method :ctx=, :context=
209
247
 
210
- # Alias for context.
248
+ # Aliases for context.
211
249
 
212
- attr_accessor :request
250
+ attr_accessor :request, :response
213
251
 
214
252
  # An array holding the rendering errors for this
215
253
  # request.
@@ -226,7 +264,7 @@ module Render
226
264
  # A parent render/controller acts as the context.
227
265
 
228
266
  def initialize(context, base = nil)
229
- @request = @context = context
267
+ @request = @response = @context = context
230
268
  @out = context.out
231
269
  end
232
270
 
@@ -264,20 +302,6 @@ module Render
264
302
  @out << '(error)'
265
303
  end
266
304
 
267
- # Add some text to the output buffer.
268
-
269
- def render_text(text)
270
- @out << text
271
- end
272
-
273
- #--
274
- # FIXME: do something better to stop the redirect.
275
- #++
276
-
277
- def render_nothing
278
- @out = ' '
279
- end
280
-
281
305
  private
282
306
 
283
307
  # Send a redirect response.
@@ -321,6 +345,21 @@ private
321
345
  @out
322
346
  end
323
347
 
348
+ # Add some text to the output buffer.
349
+
350
+ def render_text(text)
351
+ @out << text
352
+ end
353
+ alias_method :print, :render_text
354
+
355
+ #--
356
+ # FIXME: do something better to stop the redirect.
357
+ #++
358
+
359
+ def render_nothing
360
+ @out = ' '
361
+ end
362
+
324
363
  end
325
364
 
326
365
  end
data/lib/nitro/request.rb CHANGED
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: request.rb 9 2005-04-13 00:08:20Z nasis $
4
-
5
1
  module Nitro
6
2
 
7
3
  # Encapsulates a request. This is an abstract request
@@ -129,6 +125,21 @@ module Request
129
125
  "http://#{host}"
130
126
  end
131
127
 
128
+ # The raw data of the request.
129
+ # Useful to implement Webservices.
130
+ #--
131
+ # FIXME: better name and implementation.
132
+ #++
133
+
134
+ def raw_body
135
+ unless @raw_body
136
+ @in.rewind
137
+ @raw_body = @in.read(content_length)
138
+ end
139
+
140
+ @raw_body
141
+ end
142
+
132
143
  # Lookup a query parameter.
133
144
 
134
145
  def [](param)
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: scaffold.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  require 'glue/inflector'
6
2
 
7
3
  module Nitro
@@ -32,9 +28,9 @@ module Scaffolding
32
28
  options[:nosuffix] ? suffix = nil : suffix = "_#{name}"
33
29
 
34
30
  # Add methods to the scaffolded class.
35
-
31
+
36
32
  klass.module_eval %{
37
- def view_uri
33
+ def to_href
38
34
  "view#{suffix}?oid=\#\{@oid\}"
39
35
  # "view#{suffix}/\#\{@oid\}"
40
36
  end
data/lib/nitro/shaders.rb CHANGED
@@ -1,8 +1,7 @@
1
- # George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: shaders.rb 1 2005-04-11 11:04:30Z gmosx $
1
+ # $Id: shaders.rb 56 2005-05-13 14:16:47Z gmosx $
4
2
 
5
3
  require 'nitro/template'
4
+ require 'nitro/element'
6
5
 
7
6
  module Nitro
8
7
 
@@ -198,6 +197,8 @@ end
198
197
  class ElementsShader < Shader
199
198
 
200
199
  def process(hash, text)
200
+ text = ElementProcessor.render(text)
201
+ process_next(hash, text)
201
202
  end
202
203
 
203
204
  end
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: template.rb 9 2005-04-13 00:08:20Z nasis $
3
+ # $Id: template.rb 30 2005-04-25 12:28:02Z gmosx $
4
4
 
5
5
  require 'glue/flexob'
6
6
 
@@ -96,11 +96,13 @@ module TemplateMixin
96
96
 
97
97
  # Alterative versions of interpolation.
98
98
  # (very useful in xsl stylesheets)
99
+ # Example: #(my_val)
99
100
 
100
101
  text.gsub!(/\#\((.*?)\)/, '#{\1}')
101
102
 
102
103
  # Alternative for entities.
103
104
  # (useful in xsl stylesheets)
105
+ # Examples: %nbsp;, %rquo;
104
106
 
105
107
  text.gsub!(/%(\S*?);/, '&\1;')
106
108