Formatter is the base class for Ruport's format implementations.
Typically, a Formatter will implement one or more output types, and be registered with one or more Controller classes.
This class provides all the necessary base functionality to make use of Ruport's rendering system, including option handling, data access, and basic output wrapping.
The following example should provide a general idea of how formatters work, but see the built in formatters for reference implementations.
A simple Controller definition is included to help show the example in context, but you can also build your own custom interface to formatter if you wish.
class ReverseController < Ruport::Controller stage :reversed_header, :reversed_body end class ReversedText < Ruport::Formatter # Hooks formatter up to controller renders :txt, :for => ReverseController # Implements ReverseController's :reversed_header hook # but can be used by any controller def build_reversed_header output << "#{options.header_text}\n" output << "The reversed text will follow\n" end # Implements ReverseController's :reversed_body hook # but can be used by any controller def build_reversed_body output << data.reverse << "\n" end end puts ReverseController.render_txt(:data => "apple", :header_text => "Hello Mike, Hello Joe!") ----- OUTPUT: Hello Mike, Hello Joe! The reversed text will follow elppa
Allows you to implement stages in your formatter using the following syntax:
class ReversedText < Ruport::Formatter renders :txt, :for => ReverseController build :reversed_header do output << "#{options.header_text}\n" output << "The reversed text will follow\n" end build :reversed_body do output << data.reverse << "\n" end end
# File lib/ruport/formatter.rb, line 171 def self.build(stage,&block) define_method "build_#{stage}", &block end
Gives a list of formats registered for this formatter.
# File lib/ruport/formatter.rb, line 176 def self.formats @formats ||= [] end
Registers the formatter with one or more Controllers.
renders :pdf, :for => MyController render :text, :for => [MyController,YourController] renders [:csv,:html], :for => YourController
# File lib/ruport/formatter.rb, line 146 def self.renders(fmts,options={}) Array(fmts).each do |format| Array(options[:for]).each do |o| o.send(:add_format,self,format) formats << format unless formats.include?(format) end end end
Clears the output.
# File lib/ruport/formatter.rb, line 204 def clear_output @output.replace("") end
Sets the data object, making a local copy using dup. This may have a significant overhead for large tables, so formatters which don't modify the data object may wish to override this.
# File lib/ruport/formatter.rb, line 199 def data=(val) @data = val.dup end
Evaluates the string using ERB and returns the results.
If :binding is specified, it will evaluate the template in that context.
# File lib/ruport/formatter.rb, line 224 def erb(string,options={}) require "erb" if string =~ /(\.r\w+)|(\.erb)$/ ERB.new(File.read(string)).result(options[:binding]||binding) else ERB.new(string).result(options[:binding]||binding) end end
Provides a shortcut for per-format handlers.
Example:
# will only be called if formatter is called for html output html { output << "Look, I'm handling html" }
# File lib/ruport/formatter.rb, line 240 def method_missing(id,*args) if self.class.formats.include?(id) yield() if format == id else super end end
Provides a Controller::Options object for storing formatting options.
# File lib/ruport/formatter.rb, line 192 def options @options ||= Controller::Options.new end
Stores a string used for outputting formatted data.
# File lib/ruport/formatter.rb, line 186 def output return options.io if options.io @output ||= "" end
Generated with the Darkfish Rdoc Generator 2.