Class: Ruport::Format::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/ruport/format/builder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data_set) ⇒ Builder

Returns a new instance of Builder.



5
6
7
8
9
10
11
12
13
# File 'lib/ruport/format/builder.rb', line 5

def initialize( data_set )
  @data = data_set
  @original = data_set.dup
  @format = nil
  @range = nil
  @header = nil
  @footer = nil
  @output_type = nil
end

Instance Attribute Details

Returns the value of attribute footer.



15
16
17
# File 'lib/ruport/format/builder.rb', line 15

def footer
  @footer
end

#formatObject

Returns the value of attribute format.



15
16
17
# File 'lib/ruport/format/builder.rb', line 15

def format
  @format
end

#headerObject

Returns the value of attribute header.



15
16
17
# File 'lib/ruport/format/builder.rb', line 15

def header
  @header
end

#output_typeObject

Returns the value of attribute output_type.



15
16
17
# File 'lib/ruport/format/builder.rb', line 15

def output_type
  @output_type
end

#rangeObject

Returns the value of attribute range.



15
16
17
# File 'lib/ruport/format/builder.rb', line 15

def range
  @range
end

Instance Method Details

#renderObject



17
18
19
20
# File 'lib/ruport/format/builder.rb', line 17

def render
  @data = @range ? ( @original[@range] ) : ( @original )
  send("render_#{@format}")    
end

#render_csvObject



22
23
24
25
26
27
28
29
# File 'lib/ruport/format/builder.rb', line 22

def render_csv
  csv_klass = defined?(FasterCSV) ? FasterCSV : CSV
  fields = @original.fields
  ( @header ? "#{@header}\n\n" : "" ) +
  @data.inject(csv_klass.generate_line(fields).chomp + "\n" ) { |out,r|  
    out <<  csv_klass.generate_line(fields.map { |f| r[f] }).chomp + "\n"
  } + ( @footer ? "\n#{@footer}\n" : "" )
end

#render_htmlObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ruport/format/builder.rb', line 31

def render_html
  head_text = ( if @header
      "  <tr>\n    <th colspan=#{@original.fields.length}>#{@header}" +
      "</th>\n  </tr>\n" 
  end )
  out = "<table>\n#{head_text}  <tr>\n    <th>"+
        "#{@original.fields.join('</th><th>')}" +
        "</th>\n  </tr>\n"
  @data.inject(out) do |html,row|
    html << row.inject("  <tr>\n    "){ |row_html, field|
              row_html << "<td>#{field}</td>"
            } + "\n  </tr>\n"
  end
  foot_text = ( if @footer 
      "  <tr>\n    <th colspan=#{@original.fields.length}>#{@footer}" +
      "</th>\n  </tr>\n" 
  end )
  
  out << "#{foot_text}</table>"   
  return out unless @output_type.eql?(:complete) 
  "<html><head><title></title></head><body>\n#{out}</body></html>\n"
end

#render_pdfObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/ruport/format/builder.rb', line 63

def render_pdf
  
  return unless defined? PDF::Writer
  pdf = PDF::Writer.new
  pdf.margins_cm(0)
  @data.each do |page|
    unless page.eql?(@data.pages.first)
      pdf.start_new_page
    end
    page.each do |section|
      section.each do |element|
        pdf.y =  pdf.cm2pts(element.top)
        pdf.text element.content, 
                    :left  => pdf.cm2pts(element.left),
                    :right => pdf.cm2pts(element.right),
                    :justification => element.align || :center
                                   
      end
    end
  end
  pdf.render

end

#render_textObject



54
55
56
57
58
59
60
61
62
# File 'lib/ruport/format/builder.rb', line 54

def render_text
  header = @header ? "#{@header}\n" : ""
  header << "fields: ( #{ @original.fields.join(', ') } )\n"
  indices = (@range)  ? @range.to_a : (0...@original.to_a.length).to_a  
  @data.inject(header) do |output,row|
    output << "row#{indices.shift}: ( #{row.to_a.join(', ')} )\n"
  end + (@footer ? "#{@footer}\n" : "" )
  
end