simple_view 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/Rakefile +2 -0
  2. data/lib/CVS/Entries +3 -0
  3. data/lib/CVS/Repository +1 -0
  4. data/lib/CVS/Root +1 -0
  5. data/lib/core-ext/CVS/Entries +5 -0
  6. data/lib/core-ext/CVS/Repository +1 -0
  7. data/lib/core-ext/CVS/Root +1 -0
  8. data/lib/core-ext/array.rb +14 -0
  9. data/lib/core-ext/jopen.rb +43 -0
  10. data/lib/core-ext/nilclass.rb +31 -0
  11. data/lib/core-ext/string.rb +51 -0
  12. data/lib/simple_view/CVS/Entries +11 -0
  13. data/lib/simple_view/CVS/Repository +1 -0
  14. data/lib/simple_view/CVS/RevisionCache/builder_view.rb#1.1.1.1 +42 -0
  15. data/lib/simple_view/CVS/RevisionCache/erb_view.rb#1.1.1.1 +44 -0
  16. data/lib/simple_view/CVS/RevisionCache/file_content.rb#1.1.1.1 +50 -0
  17. data/lib/simple_view/CVS/RevisionCache/io_view.rb#1.1.1.1 +37 -0
  18. data/lib/simple_view/CVS/RevisionCache/poi_view.rb#1.1.1.1 +116 -0
  19. data/lib/simple_view/CVS/RevisionCache/renderable.rb#1.1.1.1 +114 -0
  20. data/lib/simple_view/CVS/RevisionCache/simple_view.rb#1.1.1.1 +214 -0
  21. data/lib/simple_view/CVS/Root +1 -0
  22. data/lib/simple_view/builder_view.rb +42 -0
  23. data/lib/simple_view/erb_view.rb +44 -0
  24. data/lib/simple_view/file_content.rb +50 -0
  25. data/lib/simple_view/haml_view.rb +36 -0
  26. data/lib/simple_view/io_view.rb +37 -0
  27. data/lib/simple_view/java/CVS/Entries +1 -0
  28. data/lib/simple_view/java/CVS/Repository +1 -0
  29. data/lib/simple_view/java/CVS/Root +1 -0
  30. data/lib/simple_view/java/poi/CVS/Entries +6 -0
  31. data/lib/simple_view/java/poi/CVS/Repository +1 -0
  32. data/lib/simple_view/java/poi/CVS/Root +1 -0
  33. data/lib/simple_view/java/poi/poi-3.6-20091214.jar +0 -0
  34. data/lib/simple_view/java/poi/poi-contrib-3.6-20091214.jar +0 -0
  35. data/lib/simple_view/java/poi/poi-ooxml-3.6-20091214.jar +0 -0
  36. data/lib/simple_view/java/poi/poi-ooxml-schemas-3.6-20091214.jar +0 -0
  37. data/lib/simple_view/java/poi/poi-scratchpad-3.6-20091214.jar +0 -0
  38. data/lib/simple_view/poi_view.rb +116 -0
  39. data/lib/simple_view/renderable.rb +114 -0
  40. data/lib/simple_view/simple_view.rb +214 -0
  41. data/lib/simple_view/smartxls.rb +38 -0
  42. data/lib/simple_view/version.rb +3 -0
  43. data/lib/simple_view.rb +5 -0
  44. data/test/CVS/Entries +6 -0
  45. data/test/CVS/Repository +1 -0
  46. data/test/CVS/RevisionCache/test_view.rb#1.1.1.1 +25 -0
  47. data/test/CVS/RevisionCache/test_view_reuse_erb.rb#1.1.1.1 +21 -0
  48. data/test/CVS/Root +1 -0
  49. data/test/helpers/CVS/Entries +3 -0
  50. data/test/helpers/CVS/Repository +1 -0
  51. data/test/helpers/CVS/RevisionCache/test_helper.rb#1.1.1.1 +7 -0
  52. data/test/helpers/CVS/Root +1 -0
  53. data/test/helpers/etat_corbeilles_prc_helper.rb +13 -0
  54. data/test/helpers/test_helper.rb +7 -0
  55. data/test/jtest_view.rb +17 -0
  56. data/test/test_view.rb +25 -0
  57. data/test/test_view_reuse_erb.rb +21 -0
  58. data/test/test_view_sv_debug.rb +16 -0
  59. data/test/views/CVS/Entries +17 -0
  60. data/test/views/CVS/Repository +1 -0
  61. data/test/views/CVS/RevisionCache/test.erb#1.1.1.1 +2 -0
  62. data/test/views/CVS/Root +1 -0
  63. data/test/views/etat_corbeilles_prc-csv.io.rb +40 -0
  64. data/test/views/etat_corbeilles_prc-xls.poi.rb +97 -0
  65. data/test/views/etat_corbeilles_prc-xls2.smartxl.rb +128 -0
  66. data/test/views/etat_corbeilles_prc.html.erb +108 -0
  67. data/test/views/test-builder.builder.rb +1 -0
  68. data/test/views/test-erb.erb +1 -0
  69. data/test/views/test-model.xls +0 -0
  70. data/test/views/test-model.xlsx +0 -0
  71. data/test/views/test-xls.poi.rb +34 -0
  72. data/test/views/test-xls.smartxl.rb +80 -0
  73. data/test/views/test.builder.rb +1 -0
  74. data/test/views/test.erb +2 -0
  75. data/test/views/test.haml +1 -0
  76. data/test/views/test.io.rb +1 -0
  77. data/test/views/test.poi.rb +7 -0
  78. data/test/views/test_error.erb +1 -0
  79. metadata +177 -0
@@ -0,0 +1,214 @@
1
+ require 'monitor'
2
+ require 'delegate'
3
+ require 'core-ext/string'
4
+ require 'core-ext/nilclass'
5
+
6
+
7
+ module SimpleView
8
+
9
+ autoload :FileContent, File.join(File.dirname(__FILE__), 'file_content')
10
+ autoload :Renderable, File.join(File.dirname(__FILE__), 'renderable')
11
+
12
+ autoload :SimpleViewERB, File.join(File.dirname(__FILE__), 'erb_view')
13
+ autoload :SimpleViewIO, File.join(File.dirname(__FILE__), 'io_view')
14
+ autoload :SimpleViewBuilder, File.join(File.dirname(__FILE__), 'builder_view')
15
+ autoload :SimpleViewPOI, File.join(File.dirname(__FILE__), 'poi_view')
16
+
17
+ $SV_DEBUG = ENV['SV_DEBUG']
18
+
19
+ class Base
20
+
21
+
22
+ class << self
23
+ attr_accessor :directory_views, :directory_helpers
24
+ end
25
+
26
+ def directory_views
27
+ Base.directory_views
28
+ end
29
+
30
+ def directory_helpers
31
+ Base.directory_helpers
32
+ end
33
+
34
+ end
35
+
36
+ class TemplateViewNotFound < Exception; end
37
+
38
+ class SimpleViewBase < Base
39
+
40
+ attr_accessor :template, :file_template
41
+
42
+ def initialize(template, file_template = nil)
43
+ self.template = template
44
+ self.file_template = file_template
45
+ end
46
+
47
+ def template_name(ext = self.template_extension)
48
+ "#{template}#{ext}"
49
+ end
50
+
51
+ def lookup_file_template(ext = self.template_extension)
52
+ unless @file_template
53
+ tpl = self.template_name(ext)
54
+ list = Dir.glob(File.join(self.directory_views, tpl))
55
+ raise TemplateViewNotFound.new("Impossible de trouver le template #{tpl} dans le repertoire #{self.directory_views}") unless list.size == 1
56
+ @file_template = list.first
57
+ end
58
+ @file_template
59
+ end
60
+
61
+ def clean_template_name_for_helper
62
+ template[/(\w+)(\W*)/,1]
63
+ end
64
+
65
+ def lookup_file_helper
66
+ if !self.instance_variable_defined?(:@file_helper) && self.directory_helpers
67
+ helper_file_name = "#{self.clean_template_name_for_helper}_helper.rb"
68
+ puts "SimpleViewBase > helper_file_name= #{helper_file_name}" if $DEBUG
69
+ fhlpr = File.join(self.directory_helpers, helper_file_name)
70
+ puts "SimpleViewBase > fhlpr= #{fhlpr}" if $DEBUG
71
+ if File.exist?(fhlpr)
72
+ @file_helper = FileContent.file(fhlpr)
73
+ end
74
+ end
75
+ @file_helper
76
+ end
77
+
78
+ def template_content
79
+ FileContent.file(self.lookup_file_template).content
80
+ end
81
+
82
+ def has_helper?
83
+ hf = self.lookup_file_helper
84
+ return nil unless hf
85
+ true
86
+ end
87
+
88
+ def helper_module_name
89
+ hname = self.clean_template_name_for_helper # exemple: template = 'etat_corbeilles_prc.html' => hname = 'etat_corbeilles_prc'
90
+ "#{hname}_helper".camelcase(true).to_sym
91
+ end
92
+
93
+ def template_extension
94
+ if self.class.respond_to?(:extension)
95
+ return self.class.extension
96
+ end
97
+ ".rb"
98
+ end
99
+
100
+
101
+ def set_helper(rendable_object)
102
+ if has_helper?
103
+ helper = nil
104
+ helper_name = self.helper_module_name
105
+ begin
106
+ if @file_helper.changed? || !Object::const_defined?(helper_name)
107
+ load @file_helper.file(true)
108
+ else
109
+
110
+ end
111
+ helper = Object::const_get(helper_name)
112
+ rescue NameError => ex
113
+ # puts "set_helper: #{ex.message}", ex.backtrace
114
+ require(@file_helper.file)
115
+ retry
116
+ end
117
+ puts "set_helper #{helper} for: #{rendable_object}" if $DEBUG
118
+ rendable_object.extend helper
119
+ end
120
+ end
121
+
122
+
123
+ def render(rendable_object, options = {})
124
+ target = options[:target]
125
+ if String === target && (options[:type] != :string)
126
+ FileUtils.mkdir_p(File.dirname(target)) if options[:mkdirs]
127
+ open(target, options[:open]||'w') do |o|
128
+ options[:target] = o
129
+ begin
130
+ return do_rendering(rendable_object, options)
131
+ ensure
132
+ options[:target] = target
133
+ end
134
+ end
135
+ else
136
+ return do_rendering(rendable_object, options)
137
+ end
138
+ rescue => ex
139
+ puts ex.message, ex.backtrace.collect{|st| "\t#{st}"}
140
+ if $SV_DEBUG
141
+ puts "[SV_DEBUG = #$SV_DEBUG]: Retry ? [y|n]"
142
+ response = $stdin.gets.strip
143
+ retry if response =~ /Y|y/
144
+ end
145
+ raise ex
146
+ end
147
+
148
+ def render_with_helper(rendable_object)
149
+ set_helper(rendable_object)
150
+ yield if block_given?
151
+ end
152
+
153
+
154
+ class << self
155
+
156
+ def template_extensions
157
+ @template_extensions ||= {}
158
+ end
159
+
160
+ def register(subclass)
161
+ ext = subclass.extension
162
+ SimpleViewBase.template_extensions[ext] = subclass
163
+ end
164
+
165
+ def lookup_file_template(template)
166
+ tpl = "#{template}#{self.extension}"
167
+ file = File.join(Base.directory_views, tpl)
168
+ puts "lookup_file_template : #{tpl} => #{file}" if $DEBUG
169
+ raise TemplateViewNotFound.new("Impossible de trouver le template #{tpl} dans le repertoire #{Base.directory_views} (#{file})") unless File.exist?(file)
170
+ file
171
+ end
172
+
173
+ def views
174
+ @views ||= {}
175
+ end
176
+
177
+ def view(template)
178
+ self.views[template] ||= self.basic_view(template)
179
+ end
180
+
181
+ def find_view(template)
182
+ SimpleViewBase.template_extensions.each do |ext, renderer|
183
+ begin
184
+ return renderer.view(template)
185
+ rescue TemplateViewNotFound
186
+ end
187
+ end
188
+ raise TemplateViewNotFound.new("Impossible de trouver le template #{template} dans le repertoire #{Base.directory_views}")
189
+ end
190
+
191
+ protected
192
+ def basic_view(template)
193
+ file = lookup_file_template(template)
194
+ self.new(template, file)
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+
201
+
202
+ class SimpleLayout < SimpleViewBase
203
+
204
+ def do_rendering(rendable_object, options)
205
+
206
+ end
207
+
208
+ end
209
+
210
+ # Loading default
211
+ SimpleViewERB.name
212
+ SimpleViewIO.name
213
+
214
+ end
@@ -0,0 +1 @@
1
+ :pserver:gie\barukh@esvwas51.si.fr:/repositories/aag
@@ -0,0 +1,42 @@
1
+ require 'builder'
2
+
3
+ module SimpleView
4
+
5
+ class SimpleViewBuilder < SimpleViewBase
6
+
7
+ EXTENTION = ".builder.rb".freeze unless defined?(EXTENTION)
8
+
9
+ def self.extension
10
+ EXTENTION
11
+ end
12
+
13
+ SimpleViewBase.register(self)
14
+
15
+ def do_rendering(rendable_object, options)
16
+ options = {:indent => 2}.merge(options)
17
+ filename = options.delete(:filename) || '<BUILDER>'
18
+ line = options.delete(:line) || 1
19
+ xml = ::Builder::XmlMarkup.new(options)
20
+ rendable_object.put_locals_objects((options.delete(:builder_name) || :xml).to_sym => xml)
21
+ render_with_helper(rendable_object) do
22
+ eval self.template_content, rendable_object.get_binding, filename, line
23
+ end
24
+ xml.target!
25
+ end
26
+
27
+ end
28
+
29
+
30
+ module Renderable
31
+
32
+ module InstanceMethods
33
+
34
+ def render_builder(template, options = {})
35
+ render_with SimpleViewBuilder, template, options
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,44 @@
1
+ require 'erb'
2
+
3
+
4
+ module SimpleView
5
+
6
+ class SimpleViewERB < SimpleViewBase
7
+ EXTENTION = ".erb".freeze unless defined?(EXTENTION)
8
+
9
+ def self.extension
10
+ EXTENTION
11
+ end
12
+
13
+ SimpleViewBase.register(self)
14
+
15
+ def erb
16
+ unless @erb
17
+ @erb = ERB.new(self.template_content, 0, '<%%>')
18
+ @erb.filename = self.file_template
19
+ end
20
+ @erb
21
+ end
22
+
23
+ def do_rendering(rendable_object, options)
24
+ render_with_helper(rendable_object) do
25
+ res = erb.result(rendable_object.get_binding)
26
+ options[:target] << res if options[:target]
27
+ res
28
+ end
29
+ end
30
+ end
31
+
32
+ module Renderable
33
+
34
+ module InstanceMethods
35
+
36
+ def render_erb(template, options = {})
37
+ render_with SimpleViewERB, template, options
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,50 @@
1
+ module SimpleView
2
+ class FileContent
3
+
4
+ NO_READ = :no_read
5
+
6
+ attr_accessor :file, :last_modification
7
+
8
+ def initialize(file)
9
+ self.file = file
10
+ self.last_modification = File.mtime(self.file)
11
+ end
12
+
13
+ def content
14
+ if changed? || @content == NO_READ
15
+ @content = File.read(self.file)
16
+ self.last_modification = File.mtime(self.file)
17
+ end
18
+ @content
19
+ end
20
+
21
+ def changed?
22
+ @content.nil? || (File.mtime(self.file) > self.last_modification)
23
+ end
24
+
25
+ def file(set_content_no_read = false)
26
+ if set_content_no_read
27
+ @content = NO_READ
28
+ end
29
+ @file
30
+ end
31
+
32
+ class << self
33
+
34
+ def files
35
+ @files ||= {}
36
+ end
37
+
38
+ def file(file)
39
+ return nil unless file
40
+ self.files[file] ||= self.new(file)
41
+ end
42
+
43
+ def changed?(file)
44
+ self.file(file).changed?
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,36 @@
1
+ require 'haml'
2
+
3
+ module SimpleView
4
+
5
+ class SimpleViewHAML < SimpleViewBase
6
+ EXTENTION = ".haml".freeze unless defined?(EXTENTION)
7
+
8
+ def self.extension
9
+ EXTENTION
10
+ end
11
+
12
+ SimpleViewBase.register(self)
13
+
14
+ def do_rendering(rendable_object, options)
15
+ haml = Haml::Engine.new(self.template_content)
16
+ render_with_helper(rendable_object) do
17
+ res = haml.render(rendable_object.get_binding)
18
+ (options[:target] || self.out) << res
19
+ res
20
+ end
21
+ end
22
+ end
23
+
24
+ module Renderable
25
+
26
+ module InstanceMethods
27
+
28
+ def render_haml(template, options = {})
29
+ render_with SimpleViewHAML, template, options
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,37 @@
1
+ module SimpleView
2
+
3
+ class SimpleViewIO < SimpleViewBase
4
+ EXTENTION = ".io.rb".freeze unless defined?(EXTENTION)
5
+
6
+ def self.extension
7
+ EXTENTION
8
+ end
9
+
10
+ SimpleViewBase.register(self)
11
+
12
+ def do_rendering(rendable_object, options)
13
+ options = {:target => $stdout}.merge(options)
14
+ filename = options.delete(:filename) || '<IO>'
15
+ line = options.delete(:line) || 1
16
+ io = options[:target]
17
+ rendable_object.put_locals_objects((options.delete(:io_name) || :io).to_sym => io)
18
+ render_with_helper(rendable_object) do
19
+ eval self.template_content, rendable_object.get_binding, filename, line
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ module Renderable
26
+
27
+ module InstanceMethods
28
+
29
+ def render_io(template, options = {})
30
+ render_with SimpleViewIO, template, options
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1 @@
1
+ D/poi////
@@ -0,0 +1 @@
1
+ simple_view/lib/simple_view/java
@@ -0,0 +1 @@
1
+ :pserver:gie\barukh@esvwas51.si.fr:/repositories/aag
@@ -0,0 +1,6 @@
1
+ D
2
+ /poi-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
3
+ /poi-contrib-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
4
+ /poi-ooxml-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
5
+ /poi-ooxml-schemas-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
6
+ /poi-scratchpad-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
@@ -0,0 +1 @@
1
+ simple_view/lib/simple_view/java/poi
@@ -0,0 +1 @@
1
+ :pserver:gie\barukh@esvwas51.si.fr:/repositories/aag
@@ -0,0 +1,116 @@
1
+ require 'java'
2
+ Dir["#{File.dirname(__FILE__)}/java/poi/*.jar"].each {|jar| require jar}
3
+
4
+ import org.apache.poi.poifs.filesystem.POIFSFileSystem
5
+ import org.apache.poi.hssf.usermodel.HSSFWorkbook
6
+ import org.apache.poi.hssf.usermodel.HSSFChart
7
+ import java.io.FileInputStream
8
+ import java.io.FileOutputStream
9
+
10
+ # D�clarer des s�ries Excel dynamique :
11
+ # 1. D�finir les variables
12
+ # Poids=DECALER(data!$K$1;0;0;NBVAL(data!$K:$K)-1;1)
13
+ # Signatures=DECALER(data!$B$1;0;0;NBVAL(data!$B:$B)-1;1)
14
+ # NbDossiers=DECALER(data!$J$1;0;0;NBVAL(data!$J:$J)-1;1)
15
+
16
+ # NbDossiersD=DECALER(data!$L$1;0;0;NBVAL(data!$L:$L)-1;1)
17
+ # NbDossiersE=DECALER(data!$M$1;0;0;NBVAL(data!$M:$M)-1;1)
18
+ # NbDossiersF=DECALER(data!$N$1;0;0;NBVAL(data!$N:$N)-1;1)
19
+ # NbDossiersH=DECALER(data!$O$1;0;0;NBVAL(data!$O:$O)-1;1)
20
+ # NbDossiersI=DECALER(data!$P$1;0;0;NBVAL(data!$P:$P)-1;1)
21
+ # NbDossiersP=DECALER(data!$Q$1;0;0;NBVAL(data!$Q:$Q)-1;1)
22
+ # NbDossiersR=DECALER(data!$R$1;0;0;NBVAL(data!$R:$R)-1;1)
23
+ # NbDossiersX=DECALER(data!$S$1;0;0;NBVAL(data!$S:$S)-1;1)
24
+
25
+ # 2. Dans les graphes
26
+ # S�rie: =data!Poids
27
+
28
+ module SimpleView
29
+
30
+ class SimpleViewPOI < SimpleViewBase
31
+
32
+ EXTENTION = ".poi.rb".freeze unless defined?(EXTENTION)
33
+
34
+ def self.extension
35
+ EXTENTION
36
+ end
37
+
38
+ SimpleViewBase.register(self)
39
+
40
+ def render(rendable_object, options = {})
41
+ do_rendering(rendable_object, options)
42
+ end
43
+
44
+ def do_rendering(rendable_object, options)
45
+ filename = options.delete(:filename) || '<POI.XLS>'
46
+ line = options.delete(:line) || 1
47
+ model_file = options.delete(:model)
48
+
49
+ xls = model_file ? HSSFWorkbook.new(file(model_file)) : HSSFWorkbook.new
50
+
51
+ rendable_object.put_locals_objects((options.delete(:builder_name) || :xls).to_sym => xls)
52
+ render_with_helper(rendable_object) do
53
+ rendable_object.extend(Helper)
54
+ eval self.template_content, rendable_object.get_binding, filename, line
55
+ end
56
+ if options.key?(:target)
57
+ output = file(options[:target], 'w')
58
+ begin
59
+ xls.write(output)
60
+ ensure
61
+ output.close
62
+ end
63
+ end
64
+ end
65
+
66
+ def file(filename, mode = 'r')
67
+ if mode == 'r'
68
+ POIFSFileSystem.new(FileInputStream.new(filename))
69
+ else
70
+ FileOutputStream.new(filename)
71
+ end
72
+ end
73
+
74
+ module Helper
75
+ def set_cell_value(row, col_index, value)
76
+ cell = row.create_cell(col_index)
77
+ cell.set_cell_value(value)
78
+ cell
79
+ end
80
+
81
+ def get_charts(sheet)
82
+ HSSFChart.get_sheet_charts(sheet)
83
+ end
84
+
85
+ def row_at(sheet, index_line)
86
+ row = sheet.get_row(index_line)
87
+ unless row
88
+ row = sheet.create_row(index_line)
89
+ end
90
+ row
91
+ end
92
+
93
+ def cell_at(row, index_col)
94
+ cell = row.get_cell(index_col)
95
+ unless cell
96
+ cell = row.create_cell(index_col)
97
+ end
98
+ cell
99
+ end
100
+
101
+ end
102
+ end
103
+
104
+ module Renderable
105
+
106
+ module InstanceMethods
107
+
108
+ def render_poi(template, options = {})
109
+ render_with SimpleViewPOI, template, options
110
+ end
111
+
112
+ end
113
+
114
+ end
115
+
116
+ end
@@ -0,0 +1,114 @@
1
+ #
2
+ # class Toto
3
+ # include Renderable
4
+ #
5
+ # attr_accessor :affectations
6
+ #
7
+ # end
8
+ #
9
+ # toto = Toto.new
10
+ # toto.affectations = [1,2,3,4]
11
+ # out = StringIO.new
12
+ #
13
+ # toto.render_erb('test', :titi => [:a, :b, :c])
14
+ #
15
+ # Le fichier 'views/test.erb'
16
+ # ---------------------------
17
+ # affectations = <%= affectations.inspect %>
18
+ # titi = <%= titi.inspect %>
19
+ #
20
+ # toto.render_builder('test', :titi => [:a, :b, :c])
21
+ #
22
+ # Le fichier 'views/test.builder.rb'
23
+ # ----------------------------------
24
+ # xml.instruct!
25
+ # affectation.each {|aff| xml.tag!(aff)}
26
+ # titi.each {|t| xml.tag!(t)}
27
+ #
28
+ #
29
+ module SimpleView
30
+ module Renderable
31
+
32
+ def self.included(mod)
33
+ if Class === mod
34
+ mod.send(:include, InstanceMethods)
35
+ mod.send(:extend, ClassMethods)
36
+ elsif Module === mod
37
+ mod.send(:extend, InstanceMethods)
38
+ end
39
+ end
40
+
41
+ module ClassMethods
42
+
43
+ end
44
+
45
+ module InstanceMethods
46
+
47
+ def _locals_objects
48
+ @_locals_objects ||= {}
49
+ end
50
+
51
+ def put_locals_objects(locals)
52
+ self._locals_objects.merge!(locals)
53
+ locals.each_pair do |name, obj|
54
+ self.instance_eval <<-RUBY
55
+ def #{name}; self._locals_objects[:#{name}]; end
56
+ RUBY
57
+ end
58
+ end
59
+
60
+ def get_binding
61
+ binding
62
+ end
63
+
64
+ def render(template, options = {})
65
+ self.safe_rendering do |object|
66
+ object.put_locals_objects(options[:locals] || {})
67
+ view = SimpleViewBase.find_view(template)
68
+ view.render(object, options)
69
+ end
70
+ end
71
+
72
+ def render_with(renderer, template, options = {})
73
+ self.safe_rendering do |object|
74
+ object.put_locals_objects(options[:locals] || {})
75
+ view = renderer.view(template)
76
+ view.render(object, options)
77
+ end
78
+ end
79
+
80
+ protected
81
+ def safe_rendering #:nodoc:
82
+ shot = RenderingObject === self ? BasicObjectRenderable.new : RenderingObject.new(self)
83
+ yield(shot) if block_given?
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+
90
+ class BasicObjectRenderable
91
+ include ::SimpleView::Renderable
92
+ end
93
+
94
+ class RenderingObject < SimpleDelegator #:nodoc:
95
+ include ::SimpleView::Renderable
96
+
97
+ def initialize(n)
98
+ super
99
+ # puts "RenderingObject for: #{n.inspect}"
100
+ end
101
+
102
+ def to_s
103
+ "RenderingObject(#{__getobj__}){:locals => #{_locals_objects.inspect}}"
104
+ end
105
+
106
+ end
107
+
108
+ # def self.render(template, options = {})
109
+ # BasicObjectRenderable.new.render(template, options)
110
+ # end
111
+
112
+
113
+ include Renderable
114
+ end