documatic 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,9 +1,9 @@
1
1
  = Documatic
2
2
 
3
- Documatic is an OpenDocument processor for Ruby. It can be used to
4
- produce attractive printable documents such as database reports,
5
- invoices, letters, faxes and more. Both the data inputs and the
6
- printable output are very flexible and easy to configure.
3
+ Documatic is an OpenDocument extension for Ruby Reports (Ruport). It
4
+ is a template-driven formatter that can be used to produce attractive
5
+ printable documents such as database reports, invoices, letters, faxes
6
+ and more.
7
7
 
8
8
 
9
9
  == Installation
@@ -13,6 +13,22 @@ Documatic can be installed via Rubygems.
13
13
  % gem install documatic
14
14
 
15
15
 
16
+ == Usage
17
+
18
+ Documatic is a Ruport extension, so it is loaded like this:
19
+
20
+ require 'rubygems'
21
+ require 'ruport'
22
+ require 'ruport/extensions'
23
+
24
+ Documatic will then be available as a formatter for your Ruport tables, groups and groupings:
25
+
26
+ data.to_odt_template(:template => 'path/filename.odt',
27
+ :output => 'output-path/filename.odt')
28
+
29
+ The wiki has more documentation and examples, plus a simple tutorial.
30
+
31
+
16
32
  == Licence
17
33
 
18
34
  Documatic is (p) Public Domain 2007, no rights reserved.
@@ -22,8 +38,20 @@ Documatic comes with no warranty whatsoever.
22
38
 
23
39
  == Support
24
40
 
25
- Further information is available on the Documatic homepage at
26
- http://documatic.240gl.org.
41
+ See the Documatic Trac page at
42
+ http://stonecode.svnrepository.com/documatic/trac.cgi. The wiki is
43
+ the main source of information for end-users. The tracking system is
44
+ where bug reports should be filed.
45
+
46
+ Users can discuss Documatic on the Ruby Reports mailing list at
47
+ http://groups.google.com/group/ruby-reports.
48
+
49
+ The Subversion repository for Documatic is at
50
+ http://stonecode.svnrepository.com/svn/documatic.
51
+
52
+ The Rubyforge project page for Documatic is at
53
+ http://rubyforge.org/projects/documatic. The Documatic rubygem is
54
+ distributed from here.
27
55
 
28
- The Documatic project page (including tracker) is at
29
- http://rubyforge.org/projects/documatic.
56
+ For any other enquiries please contact Dave Nelson (urbanus at 240gl
57
+ dot org).
@@ -3,7 +3,7 @@ require 'erb'
3
3
  module Documatic
4
4
  class Component
5
5
  include ERB::Util
6
- include Documatic::Helper
6
+ include Documatic::OpenDocumentText::Helper
7
7
 
8
8
  attr_accessor :erb
9
9
 
@@ -46,7 +46,7 @@ module Documatic
46
46
  # intended to be called directly by client applications: it is
47
47
  # called automatically by Documatic::Template after processing.
48
48
  def merge_partial_styles
49
- cache = Documatic::Partial.cache_by_prefix
49
+ cache = Documatic::OpenDocumentText::Partial.cache_by_prefix
50
50
  if cache.length > 0
51
51
  styles = self.xml.root.elements['office:automatic-styles']
52
52
  if styles
@@ -0,0 +1,27 @@
1
+ require 'fileutils'
2
+ require 'ruport'
3
+
4
+ module Documatic::Formatter
5
+
6
+ class OpenDocumentText < Ruport::Formatter
7
+ PROCESSOR = Documatic::OpenDocumentText::Template
8
+ renders :odt_template, :for => [ Ruport::Renderer::Table, Ruport::Renderer::Group,
9
+ Ruport::Renderer::Grouping ]
10
+
11
+ def build
12
+ PROCESSOR.process_template(:data => data, :options => options)
13
+ end
14
+ alias_method :build_table_body, :build # for Ruport::Renderer::Table
15
+ alias_method :build_group_body, :build # for Ruport::Renderer::Group
16
+ alias_method :build_grouping_body, :build # for Ruport::Renderer::Grouping
17
+
18
+ end
19
+
20
+ # Coming soon
21
+ # class OpenDocumentSpreadsheet < OpenDocumentText
22
+ # PROCESSOR = Documatic::OpenDocumentSpreadsheet::Template
23
+ # renders :ods_template, :for => [ Ruport::Renderer::Table, Ruport::Renderer::Group,
24
+ # Ruport::Renderer::Grouping ]
25
+ # end
26
+
27
+ end
@@ -0,0 +1,4 @@
1
+ class RuportDocumaticLoader < GemPlugin::Plugin "/ruport/documatic"
2
+ require 'documatic'
3
+ require 'documatic/formatter/open_document'
4
+ end
@@ -0,0 +1,55 @@
1
+ require 'erb'
2
+
3
+ module Documatic
4
+ module OpenDocumentText
5
+ module Helper
6
+
7
+ include ERB::Util
8
+
9
+
10
+ # Inserts a paragraph (<text:p>) containing the provided content;
11
+ # or nothing if no content is provided. This helper should be
12
+ # invoked from within "Ruby Block" because paragraphs are
13
+ # block-level elements.
14
+ #
15
+ # Note that the content is not escaped by default because you
16
+ # might want to include other tags in the content. You should use
17
+ # ERB::Util.h() to escape any content that could possibly contain
18
+ # XML characters.
19
+ def para(stylename, content = nil)
20
+ end_element = ( content ? ">#{content}</text:p>" : "/>" )
21
+ %Q(<text:p text:style-name="#{stylename}"#{end_element})
22
+ end
23
+
24
+ # Inserts a text span (<text:span>) containing the provided
25
+ # content. This helper should be invoked from within "Ruby
26
+ # Literal" because the tag is a text-level element that shouldn't
27
+ # be escaped. However the content is escaped.
28
+ def span(stylename, content)
29
+ %Q(<text:span text:style-name="#{stylename}">#{ERB::Util.h(content)}</text:span>)
30
+ end
31
+
32
+
33
+ # Inserts a partial into the document at the chosen position.
34
+ # This helper should be invoked from within "Ruby Block" because
35
+ # it inserts unescaped block-level material in the current
36
+ # template.
37
+ #
38
+ # The +assigns+ hash is passed through to the partial for binding.
39
+ #
40
+ # This method will add the provided partial to the
41
+ # Documatic::Partial cache if it hasn't yet been loaded; or if it
42
+ # has been loaded then the existing partial will be re-used.
43
+ def partial(filename, *assigns)
44
+ if Documatic::OpenDocumentText::Partial.cache.has_key?(filename)
45
+ p = Documatic::OpenDocumentText::Partial.cache[filename]
46
+ else
47
+ p = Documatic::OpenDocumentText::Partial.new(filename)
48
+ Documatic::OpenDocumentText::Partial.add_partial(filename, p)
49
+ end
50
+ p.process(*assigns)
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -1,7 +1,7 @@
1
1
  require 'rexml/document'
2
2
 
3
- module Documatic
4
- class Partial < Documatic::Template
3
+ module Documatic::OpenDocumentText
4
+ class Partial < Template
5
5
 
6
6
  attr_accessor :content
7
7
  attr_accessor :filename
@@ -35,13 +35,13 @@ module Documatic
35
35
  end
36
36
 
37
37
  def process(local_assigns = {})
38
- self.zip_file.find_entry('documatic/partial') || self.compile
38
+ self.jar.find_entry('documatic/partial') || self.compile
39
39
  @content = Documatic::Component.new( self.content_erb )
40
40
  @content.process(local_assigns)
41
41
  end
42
42
 
43
43
  def compile
44
- doc = REXML::Document.new( self.zip_file.read('content.xml') )
44
+ doc = REXML::Document.new( self.jar.read('content.xml') )
45
45
  style_names = Hash.new
46
46
 
47
47
  # Gather all auto style names from <office:automatic-styles>
@@ -60,16 +60,16 @@ module Documatic
60
60
  end
61
61
 
62
62
  # Create 'documatic/partial/' in zip file
63
- self.zip_file.find_entry('documatic/partial') || self.zip_file.mkdir('documatic/partial')
63
+ self.jar.find_entry('documatic/partial') || self.jar.mkdir('documatic/partial')
64
64
 
65
65
  # Save the prefix in documatic/partial.txt
66
- self.zip_file.get_output_stream('documatic/partial/partial.txt') do |f|
66
+ self.jar.get_output_stream('documatic/partial/partial.txt') do |f|
67
67
  f.write self.prefix
68
68
  end
69
69
 
70
70
  # Set @styles, & save it in documatic/styles.xml
71
71
  @styles = doc.root.elements['office:automatic-styles']
72
- self.zip_file.get_output_stream('documatic/partial/styles.xml') do |f|
72
+ self.jar.get_output_stream('documatic/partial/styles.xml') do |f|
73
73
  f.write @styles.to_s
74
74
  end
75
75
 
@@ -78,7 +78,7 @@ module Documatic
78
78
  body_text.elements.delete('text:sequence-decls')
79
79
  body_text.elements.delete('office:forms')
80
80
  @content_erb = self.erbify( (body_text.elements.to_a.collect do |e| e.to_s ; end ).join )
81
- self.zip_file.get_output_stream('documatic/partial/content.erb') do |f|
81
+ self.jar.get_output_stream('documatic/partial/content.erb') do |f|
82
82
  f.write @content_erb
83
83
  end
84
84
 
@@ -89,8 +89,8 @@ module Documatic
89
89
 
90
90
  def prefix
91
91
  if not @prefix
92
- if self.zip_file.find_entry('documatic/partial/partial.txt')
93
- @prefix = self.zip_file.read('documatic/partial/partial.txt')
92
+ if self.jar.find_entry('documatic/partial/partial.txt')
93
+ @prefix = self.jar.read('documatic/partial/partial.txt')
94
94
  else
95
95
  @prefix = File.basename(self.filename, '.odt').gsub(/[^A-Za-z0-9_]/, '_')
96
96
  end
@@ -100,8 +100,8 @@ module Documatic
100
100
 
101
101
  def content_erb
102
102
  if not @content_erb
103
- if self.zip_file.find_entry('documatic/partial/content.erb')
104
- self.zip_file.read('documatic/partial/content.erb')
103
+ if self.jar.find_entry('documatic/partial/content.erb')
104
+ self.jar.read('documatic/partial/content.erb')
105
105
  else
106
106
  self.compile
107
107
  end
@@ -111,8 +111,8 @@ module Documatic
111
111
 
112
112
  def styles
113
113
  if not @styles
114
- if self.zip_file.find_entry('documatic/partial/styles.xml')
115
- @styles = REXML::Document.new( self.zip_file.read('documatic/partial/styles.xml') ).root
114
+ if self.jar.find_entry('documatic/partial/styles.xml')
115
+ @styles = REXML::Document.new( self.jar.read('documatic/partial/styles.xml') ).root
116
116
  else
117
117
  self.compile
118
118
  end
@@ -2,14 +2,15 @@ require 'rexml/text'
2
2
  require 'rexml/attribute'
3
3
  require 'zip/zip'
4
4
  require 'erb'
5
+ require 'fileutils'
5
6
 
6
- module Documatic
7
+ module Documatic::OpenDocumentText
7
8
  class Template
8
9
  include ERB::Util
9
10
 
10
11
  attr_accessor :content
11
12
  attr_accessor :styles
12
- attr_accessor :zip_file
13
+ attr_accessor :jar
13
14
  # The raw contents of 'content.xml'.
14
15
  attr_accessor :content_raw
15
16
  # Compiled text, to be written to 'content.erb'
@@ -57,7 +58,7 @@ module Documatic
57
58
  require 'action_view/helpers/number_helper'
58
59
  require 'action_view/helpers/text_helper'
59
60
 
60
- [self, Documatic::Partial].each do |klass|
61
+ [self, Documatic::OpenDocumentText::Partial].each do |klass|
61
62
  klass.class_eval do
62
63
  include ActionView::Helpers::NumberHelper
63
64
  include ActionView::Helpers::TextHelper
@@ -65,23 +66,41 @@ module Documatic
65
66
  end
66
67
  end
67
68
 
69
+ def process_template(args, &block)
70
+ if args[:options] && args[:options].template && args[:options].output
71
+ output_dir = File.dirname(args[:options].output)
72
+ File.directory?(output_dir) || FileUtils.mkdir_p(output_dir)
73
+ FileUtils.cp(args[:options].template, args[:options].output)
74
+ template = self.new(args[:options].output)
75
+ template.process :data => args[:data], :options => args[:options]
76
+ template.save
77
+ if block
78
+ block.call(template)
79
+ template.save
80
+ end
81
+ template.close
82
+ else
83
+ raise ArgumentError, 'Need to specify both :template and :output in options'
84
+ end
85
+ end
86
+
68
87
  end # class << self
69
88
 
70
89
  def initialize(filename)
71
90
  @filename = filename
72
- @zip_file = Zip::ZipFile.open(@filename)
91
+ @jar = Zip::ZipFile.open(@filename)
73
92
  return true
74
93
  end
75
94
 
76
95
  def process(local_assigns = {})
77
96
  # Compile this template, if not compiled already.
78
- self.zip_file.find_entry('documatic/master') || self.compile
97
+ self.jar.find_entry('documatic/master') || self.compile
79
98
  # Process the styles (incl. headers and footers).
80
99
  # This is conditional because partials don't need styles.erb.
81
- @styles = Documatic::Component.new( self.zip_file.read('documatic/master/styles.erb') )
100
+ @styles = Documatic::Component.new( self.jar.read('documatic/master/styles.erb') )
82
101
  @styles.process(local_assigns)
83
102
  # Process the main (body) content.
84
- @content = Documatic::Component.new( self.zip_file.read('documatic/master/content.erb') )
103
+ @content = Documatic::Component.new( self.jar.read('documatic/master/content.erb') )
85
104
  @content.process(local_assigns)
86
105
  @content.merge_partial_styles
87
106
  end
@@ -89,36 +108,36 @@ module Documatic
89
108
  def save
90
109
  # Gather all the styles from the partials, add them to the master's styles.
91
110
  # Put the body into the document.
92
- self.zip_file.get_output_stream('content.xml') do |f|
111
+ self.jar.get_output_stream('content.xml') do |f|
93
112
  f.write self.content.to_s
94
113
  end
95
114
 
96
115
  if self.styles
97
- self.zip_file.get_output_stream('styles.xml') do |f|
116
+ self.jar.get_output_stream('styles.xml') do |f|
98
117
  f.write self.styles.to_s
99
118
  end
100
119
  end
101
120
  end
102
121
 
103
122
  def close
104
- self.zip_file.close
123
+ self.jar.close
105
124
  end
106
125
 
107
126
  def compile
108
127
  # Read the raw files
109
- @content_raw = self.zip_file.read('content.xml')
110
- @styles_raw = self.zip_file.read('styles.xml')
128
+ @content_raw = self.jar.read('content.xml')
129
+ @styles_raw = self.jar.read('styles.xml')
111
130
 
112
131
  @content_erb = self.erbify(@content_raw)
113
132
  @styles_erb = self.erbify(@styles_raw)
114
133
 
115
134
  # Create 'documatic/master/' in zip file
116
- self.zip_file.find_entry('documatic/master') || self.zip_file.mkdir('documatic/master')
135
+ self.jar.find_entry('documatic/master') || self.jar.mkdir('documatic/master')
117
136
 
118
- self.zip_file.get_output_stream('documatic/master/content.erb') do |f|
137
+ self.jar.get_output_stream('documatic/master/content.erb') do |f|
119
138
  f.write @content_erb
120
139
  end
121
- self.zip_file.get_output_stream('documatic/master/styles.erb') do |f|
140
+ self.jar.get_output_stream('documatic/master/styles.erb') do |f|
122
141
  f.write @styles_erb
123
142
  end
124
143
  end
@@ -134,7 +153,7 @@ module Documatic
134
153
  end
135
154
 
136
155
  # Massage OpenDocument XML into ERb. (This is the heart of the compiler.)
137
- def erbify(code, escape = true)
156
+ def erbify(code)
138
157
  # First gather all the ERb-related derived styles
139
158
  remaining = code
140
159
  styles = {'Ruby_20_Code' => 'Code', 'Ruby_20_Value' => 'Value',
@@ -170,7 +189,7 @@ module Documatic
170
189
  # 11. ROW_END End table row (incl. covered rows) ?
171
190
  #
172
191
  # "?": optional, might not occur every time
173
- re_erb = /(<table:table-row><table:table-cell [^>]+>)?(<text:list-item>)?(<text:p [^>]+>)?(<\/text:span>)?<text:span text:style-name="(#{styles.keys.join '|'})">(([^<]*|<text:line-break\/>|<text:tab\/>)+)<\/text:span>(<text:span [^>]+>)?(<\/text:p>)?(<\/text:list-item>)?(<\/table:table-cell>(<table:covered-table-cell\/>)*<\/table:table-row>)?/
192
+ re_erb = /(<table:table-row[^>]*><table:table-cell [^>]+>)?(<text:list-item>)?(<text:p [^>]+>)?(<\/text:span>)?<text:span text:style-name="(#{styles.keys.join '|'})">(([^<]*|<text:line-break\/>|<text:tab\/>)+)<\/text:span>(<text:span [^>]+>)?(<\/text:p>)?(<\/text:list-item>)?(<\/table:table-cell>(<table:covered-table-cell\/>)*<\/table:table-row>)?/
174
193
 
175
194
  # Then search for all text using those styles
176
195
  while remaining.length > 0
@@ -179,13 +198,6 @@ module Documatic
179
198
 
180
199
  if md
181
200
 
182
- ### TESTING ONLY
183
- # puts "#{md[ERB_CODE]}:"
184
- # for i in 1 ... md.size do
185
- # puts "\t#{i}: #{md[i]}"
186
- # end
187
- # puts ""
188
-
189
201
  result += md.pre_match
190
202
 
191
203
  match_code = false
@@ -212,7 +224,7 @@ module Documatic
212
224
  match_para = true
213
225
  end
214
226
  else # style is Value or Literal
215
- if (not escape) || (styles[md[TYPE]] == 'Literal')
227
+ if styles[md[TYPE]] == 'Literal'
216
228
  delim_start = '<%= ' ; delim_end = ' %>'
217
229
  else
218
230
  delim_start = '<%= ERB::Util.h(' ; delim_end = ') %>'
@@ -245,9 +257,6 @@ module Documatic
245
257
  result += md[SPAN_START]
246
258
  end
247
259
  end
248
- # if md[SPAN_START] and not match_span
249
- # result += md[SPAN_START]
250
- # end
251
260
 
252
261
  result += "#{delim_start}#{self.unnormalize md[ERB_CODE]}#{delim_end}"
253
262
 
@@ -265,10 +274,6 @@ module Documatic
265
274
  end
266
275
  end
267
276
 
268
- # if md[SPAN_END] and not match_span
269
- # result += md[SPAN_END]
270
- # end
271
-
272
277
  if md[PARA_END] and not match_para
273
278
  result += md[PARA_END]
274
279
  end
@@ -294,10 +299,3 @@ module Documatic
294
299
 
295
300
  end
296
301
  end
297
-
298
- # Force REXML to use double-quotes (consistent with OOo).
299
- REXML::Attribute.class_eval do
300
- def to_string
301
- %Q[#@expanded_name="#{to_s().gsub(/"/, '&quot;')}"]
302
- end
303
- end
data/lib/documatic.rb CHANGED
@@ -1,7 +1,29 @@
1
- require 'documatic/helper'
2
- require 'documatic/template'
1
+ require 'documatic/open_document_text/helper'
2
+ require 'documatic/open_document_text/template'
3
3
  require 'documatic/component'
4
- require 'documatic/partial'
4
+ require 'documatic/open_document_text/partial'
5
5
 
6
+
7
+ # The module "Documatic" is the namespace for the other modules and
8
+ # classes in this project. It also contains some convenience methods.
6
9
  module Documatic
10
+ class << self
11
+
12
+ # Short-cut method for including a helper in
13
+ # OpenDocumentText::Template.
14
+ def text_helper(helper_module)
15
+ Documatic::Component.class_eval do
16
+ include helper_module
17
+ end
18
+ end
19
+
20
+ end # class << self
21
+ end
22
+
23
+
24
+ # Force REXML to use double-quotes (consistent with OOo).
25
+ REXML::Attribute.class_eval do
26
+ def to_string
27
+ %Q[#@expanded_name="#{to_s().gsub(/"/, '&quot;')}"]
28
+ end
7
29
  end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: documatic
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.1
7
- date: 2007-05-16 00:00:00 +10:00
8
- summary: Documatic is a Ruby OpenDocument processor for preparing documents and reports.
6
+ version: 0.0.2
7
+ date: 2007-06-15 00:00:00 +10:00
8
+ summary: Documatic is an OpenDocument extension for Ruby Reports (Ruport). It is a template-driven formatter that can be used to produce attractive printable documents such as database reports, invoices, letters, faxes and more.
9
9
  require_paths:
10
10
  - lib
11
11
  email: urbanus@240gl.org
12
- homepage: http://documatic.240gl.org
12
+ homepage: http://stonecode.svnrepository.com/documatic/trac.cgi
13
13
  rubyforge_project: documatic
14
14
  description:
15
- autorequire:
15
+ autorequire: init.rb
16
16
  default_executable:
17
17
  bindir: bin
18
18
  has_rdoc: true
@@ -32,18 +32,24 @@ files:
32
32
  - lib
33
33
  - lib/documatic
34
34
  - lib/documatic.rb
35
- - lib/documatic/template.rb
36
35
  - lib/documatic/component.rb
37
- - lib/documatic/helper.rb
38
- - lib/documatic/partial.rb
36
+ - lib/documatic/open_document_text
37
+ - lib/documatic/open_document_text/helper.rb
38
+ - lib/documatic/open_document_text/partial.rb
39
+ - lib/documatic/open_document_text/template.rb
40
+ - lib/documatic/formatter
41
+ - lib/documatic/formatter/open_document.rb
42
+ - lib/documatic/init.rb
39
43
  - tests
40
44
  - README
41
45
  test_files: []
42
46
 
43
- rdoc_options: []
44
-
45
- extra_rdoc_files: []
46
-
47
+ rdoc_options:
48
+ - --main
49
+ - README
50
+ - --inline-source
51
+ extra_rdoc_files:
52
+ - README
47
53
  executables: []
48
54
 
49
55
  extensions: []
@@ -60,3 +66,21 @@ dependencies:
60
66
  - !ruby/object:Gem::Version
61
67
  version: 0.9.1
62
68
  version:
69
+ - !ruby/object:Gem::Dependency
70
+ name: gem_plugin
71
+ version_requirement:
72
+ version_requirements: !ruby/object:Gem::Version::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0.1"
77
+ version:
78
+ - !ruby/object:Gem::Dependency
79
+ name: ruport
80
+ version_requirement:
81
+ version_requirements: !ruby/object:Gem::Version::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 1.0.0
86
+ version:
@@ -1,53 +0,0 @@
1
- require 'erb'
2
-
3
- module Documatic
4
- module Helper
5
-
6
- include ERB::Util
7
-
8
-
9
- # Inserts a paragraph (<text:p>) containing the provided content;
10
- # or nothing if no content is provided. This helper should be
11
- # invoked from within "Ruby Block" because paragraphs are
12
- # block-level elements.
13
- #
14
- # Note that the content is not escaped by default because you
15
- # might want to include other tags in the content. You should use
16
- # ERB::Util.h() to escape any content that could possibly contain
17
- # XML characters.
18
- def para(stylename, content = nil)
19
- end_element = ( content ? ">#{content}</text:p>" : "/>" )
20
- %Q(<text:p text:style-name="#{stylename}"#{end_element})
21
- end
22
-
23
- # Inserts a text span (<text:span>) containing the provided
24
- # content. This helper should be invoked from within "Ruby
25
- # Literal" because the tag is a text-level element that shouldn't
26
- # be escaped. However the content is escaped.
27
- def span(stylename, content)
28
- %Q(<text:span text:style-name="#{stylename}">#{ERB::Util.h(content)}</text:span>)
29
- end
30
-
31
-
32
- # Inserts a partial into the document at the chosen position.
33
- # This helper should be invoked from within "Ruby Block" because
34
- # it inserts unescaped block-level material in the current
35
- # template.
36
- #
37
- # The +assigns+ hash is passed through to the partial for binding.
38
- #
39
- # This method will add the provided partial to the
40
- # Documatic::Partial cache if it hasn't yet been loaded; or if it
41
- # has been loaded then the existing partial will be re-used.
42
- def partial(filename, *assigns)
43
- if Documatic::Partial.cache.has_key?(filename)
44
- p = Documatic::Partial.cache[filename]
45
- else
46
- p = Documatic::Partial.new(filename)
47
- Documatic::Partial.add_partial(filename, p)
48
- end
49
- p.process(*assigns)
50
- end
51
-
52
- end
53
- end