class Ruport::Formatter module Graph class Amline < Ruport::Formatter renders :amline, :for => Ruport::Controller::Graph def initialize Ruport.quiet { require "hpricot" } end def build_graph generate_config_file data_out << "" data_out << "" data.x_labels.each_with_index do |e,i| data_out << %Q{#{e}} end data_out << "" data_out << "" data.each do |r| data_out << %Q{} r.each_with_index do |e,i| data_out << %Q{#{e}} end data_out << "" end data_out << "" data_out << "" if options.data_file File.open(options.data_file,"w") { |f| f << data_out } end if options.settings_file File.open(options.settings_file,"w") { |f| f << settings_out } end end def apply_template options.templated_settings_proc = lambda do |s| s.config do |c| c.values.y_left.max = template.y_max c.values.y_right.max = template.y_max c.values.y_left.min = template.y_min c.values.y_right.min = template.y_min c.width = template.width c.height = template.height c.legend.enabled = template.show_legend if template.config template.config[c] end end if template.graph_options default = template.graph_options[:_default] || lambda { } template.graph_options.each do |k,v| next if k == :_default s.graph(k,&default) s.graph(k,&v) end end end end def generate_config_file settings = ::Amline::Settings.new data.each do |r| settings.add_graph(r.gid) settings.graph(r.gid) { |g| g.title = r.gid } end options.templated_settings_proc[settings] if options.templated_settings_proc format_settings[settings] settings_out << settings.to_xml end def format_settings options.format_settings || lambda {} end def output { :data => data_out, :settings => settings_out } end def data_out @data_out ||= "" end def settings_out @settings_out ||= "" end end end end class Amline class UnknownOption < StandardError; end class BlankSlate instance_methods.each { |m| undef_method m unless m =~ /^__/ } end class HpricotTraverser < BlankSlate def initialize(some_root) @root = some_root end attr :root def method_missing(id, *args, &block) if id.to_s =~ /^(\w+)=/ @root.at($1).innerHTML = args[0].to_s elsif id.to_s =~ /^(\w+)!/ @root.at($1) else new_root = @root.at(id) or raise HpricotTraverser.new(new_root) end rescue raise UnknownOption end def ==(other) @root == other end def inspect @root end def to_s @root.to_s end alias_method :to_xml, :to_s end class Settings SETTINGS_FILE = File.join(Ruport::Util::BASEDIR, 'example', 'data', 'amline_settings.xml') GRAPH_FILE = File.join(Ruport::Util::BASEDIR, 'example','data', 'amline_graph.xml') def initialize(settings_file=SETTINGS_FILE,graph_file=GRAPH_FILE) @config = HpricotTraverser.new(Hpricot(File.read(settings_file))) @graph_file = graph_file end def config yield @config.settings if block_given? @config.settings end def add_label(label,options) xml = %Q{ } @config.root.search("labels").append(xml) end def add_graph(gid) new_graph = Hpricot(File.read(@graph_file)) new_graph.at("graph")["gid"] = gid @config.root.search("graphs").append new_graph.to_s end def graph(gid) yield HpricotTraverser.new(@config.root.search("graph[@gid=#{gid}]")) end def to_xml @config.to_xml end def save(file) File.open(file,"w") { |f| f << @config.to_s } end end end