prawn-graph 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.markdown CHANGED
@@ -20,21 +20,15 @@ be in early alpha state at best. It's not recommended for use in
20
20
  a production environment unless you're happy to put up with bugs and
21
21
  are willing to help fix them!
22
22
 
23
- ## Branches
24
-
25
- The master branch of this repository tracks edge Prawn and will
26
- be updated to reflect any changes there. If you need to work on
27
- a version which is compatible with the current stable release,
28
- 0.7.*, then please use the <tt>stable-compat</tt> branch instead.
29
-
30
23
  ## Installing & Using through RubyGems
31
24
 
32
25
  Installing and running prawn-graph is very easy:
33
26
 
34
- * <tt>gem install prawn prawn-graph</tt>
27
+ * <tt>gem install prawn-graph</tt>
35
28
 
36
- Will give you the latest 'stable' version of Prawn and the latest
37
- compatible version of prawn-graph.
29
+ Gem version 0.3 is compatible with the latest 0.8 stable release
30
+ of prawn. If you're still using 0.7, then install version 0.2 of
31
+ prawn-graph.
38
32
 
39
33
  Using graphs in your PDF is as straightforward as:
40
34
 
@@ -50,3 +44,21 @@ Using graphs in your PDF is as straightforward as:
50
44
  bar_graph data at => [10,10]
51
45
  end
52
46
  </pre>
47
+
48
+ ## Using Themes
49
+
50
+ At the moment, work is underway on implementing 'Themes' within
51
+ Prawn::Graph, which are hugely inspired by (and are indeed based on
52
+ the actual themes from) Gruff.
53
+
54
+ To find the list of available themes, use:
55
+
56
+ Prawn::Chart::Themes.list
57
+
58
+ The default theme which will be used for rendering is:
59
+
60
+ Prawn::Chart::Theme.monochrome
61
+
62
+ This in-line with the design decision of Prawn::Graph to render in
63
+ monochrome by default, since most of our users are likely to be
64
+ printing these documents!
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ require 'rake'
3
3
  require "rake/gempackagetask"
4
4
  require "rake/rdoctask"
5
5
 
6
- PRAWN_GRAPH_VERSION = '0.0.3'
6
+ PRAWN_GRAPH_VERSION = '0.0.4'
7
7
 
8
8
  spec = Gem::Specification.new do |spec|
9
9
  spec.name = "prawn-graph"
@@ -5,7 +5,7 @@ options = {
5
5
  :title => 'Average litter size per kind of animal',
6
6
  :label_x => 'Kind of animal',
7
7
  :label_y => 'Average litter size',
8
- :at => [10,10],
8
+ :at => [10,10]
9
9
  }
10
10
 
11
11
  data = [
@@ -0,0 +1,185 @@
1
+ %PDF-1.3
2
+ %����
3
+ 1 0 obj
4
+ << /Creator (Prawn)
5
+ /Producer (Prawn)
6
+ >>
7
+ endobj
8
+ 2 0 obj
9
+ << /Count 1
10
+ /Type /Pages
11
+ /Kids [5 0 R]
12
+ >>
13
+ endobj
14
+ 3 0 obj
15
+ << /Pages 2 0 R
16
+ /Type /Catalog
17
+ >>
18
+ endobj
19
+ 4 0 obj
20
+ << /Length 1307
21
+ >>
22
+ stream
23
+ /DeviceRGB cs
24
+ 0.000 0.000 0.000 scn
25
+ /DeviceRGB CS
26
+ 0.000 0.000 0.000 SCN
27
+ q
28
+ 0.000 0.000 0.000 scn
29
+ 46.000 46.000 500.000 200.000 re
30
+ b
31
+ 1.000 1.000 1.000 SCN
32
+ 61.000 66.000 m
33
+ 0.5 w
34
+ 546.000 66.000 l
35
+ S
36
+ 61.000 86.000 m
37
+ 0.5 w
38
+ 546.000 86.000 l
39
+ S
40
+ 61.000 106.000 m
41
+ 0.5 w
42
+ 546.000 106.000 l
43
+ S
44
+ 61.000 126.000 m
45
+ 0.5 w
46
+ 546.000 126.000 l
47
+ S
48
+ 61.000 146.000 m
49
+ 0.5 w
50
+ 546.000 146.000 l
51
+ S
52
+ 61.000 166.000 m
53
+ 0.5 w
54
+ 546.000 166.000 l
55
+ S
56
+ 61.000 186.000 m
57
+ 0.5 w
58
+ 546.000 186.000 l
59
+ S
60
+ 61.000 206.000 m
61
+ 0.5 w
62
+ 546.000 206.000 l
63
+ S
64
+ 61.000 226.000 m
65
+ 0.5 w
66
+ 546.000 226.000 l
67
+ S
68
+ 61.000 246.000 m
69
+ 0.5 w
70
+ 546.000 246.000 l
71
+ S
72
+ 61.000 46.000 m
73
+ 2 w
74
+ 61.000 246.000 l
75
+ S
76
+ 61.000 46.000 m
77
+ 2 w
78
+ 546.000 46.000 l
79
+ S
80
+ 61.000 246.000 m
81
+ 0.000 0.000 0.000 SCN
82
+ 1 w
83
+ 61.000 46.000 m
84
+
85
+ BT
86
+ 47 247.0 Td
87
+ /F1.0 5 Tf
88
+ [<3435>] TJ
89
+ ET
90
+
91
+
92
+ BT
93
+ 47 47.0 Td
94
+ /F1.0 5 Tf
95
+ [<30>] TJ
96
+ ET
97
+
98
+
99
+ BT
100
+ 122 32.0 Td
101
+ /F1.0 5 Tf
102
+ [<43617473>] TJ
103
+ ET
104
+
105
+
106
+ BT
107
+ 243 32.0 Td
108
+ /F1.0 5 Tf
109
+ [<446f6773>] TJ
110
+ ET
111
+
112
+
113
+ BT
114
+ 364 32.0 Td
115
+ /F1.0 5 Tf
116
+ [<48616d7374657273>] TJ
117
+ ET
118
+
119
+
120
+ BT
121
+ 485 32.0 Td
122
+ /F1.0 5 Tf
123
+ [<476f6c6466697368>] TJ
124
+ ET
125
+
126
+ 60 w
127
+ 88.000 47.000 m
128
+ 0.408 0.525 0.706 SCN
129
+ 88.000 135.000 l
130
+ S
131
+ 209.000 47.000 m
132
+ 0.992 0.847 0.306 SCN
133
+ 209.000 207.000 l
134
+ S
135
+ 330.000 47.000 m
136
+ 0.447 0.682 0.431 SCN
137
+ 330.000 247.000 l
138
+ S
139
+ 451.000 47.000 m
140
+ 0.820 0.412 0.369 SCN
141
+ 451.000 69.000 l
142
+ S
143
+ 1 w
144
+ 0.000 0.000 0.000 SCN
145
+ 0.000 0.000 0.000 scn
146
+ 61.000 46.000 m
147
+ Q
148
+
149
+ endstream
150
+ endobj
151
+ 5 0 obj
152
+ << /Contents 4 0 R
153
+ /Type /Page
154
+ /Parent 2 0 R
155
+ /Resources << /Font << /F1.0 6 0 R
156
+ >>
157
+ /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
158
+ >>
159
+ /MediaBox [0 0 612.0 792.0]
160
+ >>
161
+ endobj
162
+ 6 0 obj
163
+ << /Encoding /WinAnsiEncoding
164
+ /Subtype /Type1
165
+ /Type /Font
166
+ /BaseFont /Helvetica
167
+ >>
168
+ endobj
169
+ xref
170
+ 0 7
171
+ 0000000000 65535 f
172
+ 0000000015 00000 n
173
+ 0000000071 00000 n
174
+ 0000000128 00000 n
175
+ 0000000177 00000 n
176
+ 0000001536 00000 n
177
+ 0000001714 00000 n
178
+ trailer
179
+ << /Root 3 0 R
180
+ /Info 1 0 R
181
+ /Size 7
182
+ >>
183
+ startxref
184
+ 1811
185
+ %%EOF
@@ -0,0 +1,219 @@
1
+ %PDF-1.3
2
+ %����
3
+ 1 0 obj
4
+ << /Creator (Prawn)
5
+ /Producer (Prawn)
6
+ >>
7
+ endobj
8
+ 2 0 obj
9
+ << /Count 1
10
+ /Type /Pages
11
+ /Kids [5 0 R]
12
+ >>
13
+ endobj
14
+ 3 0 obj
15
+ << /Pages 2 0 R
16
+ /Type /Catalog
17
+ >>
18
+ endobj
19
+ 4 0 obj
20
+ << /Length 2391
21
+ >>
22
+ stream
23
+ /DeviceRGB cs
24
+ 0.000 0.000 0.000 scn
25
+ /DeviceRGB CS
26
+ 0.000 0.000 0.000 SCN
27
+ q
28
+ 1.000 0.278 0.643 scn
29
+ 46.000 46.000 500.000 200.000 re
30
+ b
31
+ 1.000 1.000 1.000 SCN
32
+ 61.000 66.000 m
33
+ 0.5 w
34
+ 546.000 66.000 l
35
+ S
36
+ 61.000 86.000 m
37
+ 0.5 w
38
+ 546.000 86.000 l
39
+ S
40
+ 61.000 106.000 m
41
+ 0.5 w
42
+ 546.000 106.000 l
43
+ S
44
+ 61.000 126.000 m
45
+ 0.5 w
46
+ 546.000 126.000 l
47
+ S
48
+ 61.000 146.000 m
49
+ 0.5 w
50
+ 546.000 146.000 l
51
+ S
52
+ 61.000 166.000 m
53
+ 0.5 w
54
+ 546.000 166.000 l
55
+ S
56
+ 61.000 186.000 m
57
+ 0.5 w
58
+ 546.000 186.000 l
59
+ S
60
+ 61.000 206.000 m
61
+ 0.5 w
62
+ 546.000 206.000 l
63
+ S
64
+ 61.000 226.000 m
65
+ 0.5 w
66
+ 546.000 226.000 l
67
+ S
68
+ 61.000 246.000 m
69
+ 0.5 w
70
+ 546.000 246.000 l
71
+ S
72
+ 61.000 46.000 m
73
+ 2 w
74
+ 61.000 246.000 l
75
+ S
76
+ 61.000 46.000 m
77
+ 2 w
78
+ 546.000 46.000 l
79
+ S
80
+ 61.000 246.000 m
81
+ 0.000 0.000 0.000 SCN
82
+ 1 w
83
+ 61.000 46.000 m
84
+
85
+ BT
86
+ 47 247.0 Td
87
+ /F1.0 5 Tf
88
+ [<3435>] TJ
89
+ ET
90
+
91
+
92
+ BT
93
+ 47 47.0 Td
94
+ /F1.0 5 Tf
95
+ [<30>] TJ
96
+ ET
97
+
98
+
99
+ BT
100
+ 122 32.0 Td
101
+ /F1.0 5 Tf
102
+ [<4a> 20 <616e> 10 <756172> -30 <79>] TJ
103
+ ET
104
+
105
+
106
+ BT
107
+ 243 32.0 Td
108
+ /F1.0 5 Tf
109
+ [<46> 30 <656272> -15 <756172> -30 <79>] TJ
110
+ ET
111
+
112
+
113
+ BT
114
+ 364 32.0 Td
115
+ /F1.0 5 Tf
116
+ [<4d61726368>] TJ
117
+ ET
118
+
119
+
120
+ BT
121
+ 485 32.0 Td
122
+ /F1.0 5 Tf
123
+ [<417072> -15 <696c>] TJ
124
+ ET
125
+
126
+ 60 w
127
+ 148.000 47.000 m
128
+ 0.125 0.125 0.125 scn
129
+ 149.000 135.000 m
130
+ 149.000 135.552 148.552 136.000 148.000 136.000 c
131
+ 147.448 136.000 147.000 135.552 147.000 135.000 c
132
+ 147.000 134.448 147.448 134.000 148.000 134.000 c
133
+ 148.552 134.000 149.000 134.448 149.000 135.000 c
134
+ 148.000 135.000 m
135
+ f
136
+ 269.000 47.000 m
137
+ 0.125 0.125 0.125 scn
138
+ 270.000 207.000 m
139
+ 270.000 207.552 269.552 208.000 269.000 208.000 c
140
+ 268.448 208.000 268.000 207.552 268.000 207.000 c
141
+ 268.000 206.448 268.448 206.000 269.000 206.000 c
142
+ 269.552 206.000 270.000 206.448 270.000 207.000 c
143
+ 269.000 207.000 m
144
+ f
145
+ 390.000 47.000 m
146
+ 0.125 0.125 0.125 scn
147
+ 391.000 247.000 m
148
+ 391.000 247.552 390.552 248.000 390.000 248.000 c
149
+ 389.448 248.000 389.000 247.552 389.000 247.000 c
150
+ 389.000 246.448 389.448 246.000 390.000 246.000 c
151
+ 390.552 246.000 391.000 246.448 391.000 247.000 c
152
+ 390.000 247.000 m
153
+ f
154
+ 511.000 47.000 m
155
+ 0.125 0.125 0.125 scn
156
+ 512.000 69.000 m
157
+ 512.000 69.552 511.552 70.000 511.000 70.000 c
158
+ 510.448 70.000 510.000 69.552 510.000 69.000 c
159
+ 510.000 68.448 510.448 68.000 511.000 68.000 c
160
+ 511.552 68.000 512.000 68.448 512.000 69.000 c
161
+ 511.000 69.000 m
162
+ f
163
+ 2 w
164
+ 0.125 0.125 0.125 SCN
165
+ 62.000 47.000 m
166
+ 148.000 135.000 l
167
+ S
168
+ 148.000 135.000 m
169
+ 269.000 207.000 l
170
+ S
171
+ 269.000 207.000 m
172
+ 390.000 247.000 l
173
+ S
174
+ 390.000 247.000 m
175
+ 511.000 69.000 l
176
+ S
177
+ 1 w
178
+ 0.000 0.000 0.000 SCN
179
+ 0.000 0.000 0.000 scn
180
+ 61.000 46.000 m
181
+ Q
182
+
183
+ endstream
184
+ endobj
185
+ 5 0 obj
186
+ << /Contents 4 0 R
187
+ /Type /Page
188
+ /Parent 2 0 R
189
+ /Resources << /Font << /F1.0 6 0 R
190
+ >>
191
+ /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
192
+ >>
193
+ /MediaBox [0 0 612.0 792.0]
194
+ >>
195
+ endobj
196
+ 6 0 obj
197
+ << /Encoding /WinAnsiEncoding
198
+ /Subtype /Type1
199
+ /Type /Font
200
+ /BaseFont /Helvetica
201
+ >>
202
+ endobj
203
+ xref
204
+ 0 7
205
+ 0000000000 65535 f
206
+ 0000000015 00000 n
207
+ 0000000071 00000 n
208
+ 0000000128 00000 n
209
+ 0000000177 00000 n
210
+ 0000002620 00000 n
211
+ 0000002798 00000 n
212
+ trailer
213
+ << /Root 3 0 R
214
+ /Info 1 0 R
215
+ /Size 7
216
+ >>
217
+ startxref
218
+ 2895
219
+ %%EOF
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ #
3
+ require "#{File.dirname(__FILE__)}/../example_helper.rb"
4
+
5
+ # Simplest bar chart example
6
+ #
7
+
8
+ data = [
9
+ ['Cats',20],
10
+ ['Dogs',36],
11
+ ['Hamsters',45],
12
+ ['Goldfish', 5]
13
+ ]
14
+
15
+ Prawn::Document.generate('bar_chart.pdf') do
16
+ bar_chart data, :at => [10, 10], :theme => Prawn::Chart::Themes.keynote
17
+ end
18
+
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ #
3
+ require "#{File.dirname(__FILE__)}/../example_helper.rb"
4
+
5
+ # Simplest line chart example
6
+ #
7
+
8
+ data = [
9
+ ['January',20],
10
+ ['February',36],
11
+ ['March',45],
12
+ ['April', 5]
13
+ ]
14
+
15
+ Prawn::Document.generate('line_chart.pdf') do
16
+ line_chart data, :at => [10, 10], :theme => Prawn::Chart::Themes.odeo
17
+ end
18
+
data/lib/prawn/graph.rb CHANGED
@@ -6,11 +6,14 @@ require File.dirname(__FILE__) + '/graph/base'
6
6
  require File.dirname(__FILE__) + '/graph/grid'
7
7
  require File.dirname(__FILE__) + '/graph/bar'
8
8
  require File.dirname(__FILE__) + '/graph/line'
9
+ require File.dirname(__FILE__) + '/graph/themes'
9
10
 
10
11
  module Prawn
11
12
 
12
13
  class Document
13
14
 
15
+ Prawn::Chart::Themes.initialize_themes
16
+
14
17
  # Draws a fairly simple bar chart. Data should be passed in as an array of
15
18
  # arrays, much like how Tables are dealt with:
16
19
  #
@@ -53,11 +53,7 @@ module Prawn
53
53
  @values.each do |value|
54
54
  @document.move_to [base_x + last_position, base_y]
55
55
  bar_height = calculate_point_height_from value
56
- if @colour
57
- @document.stroke_color [rand(255), rand(255), rand(255), 0]
58
- else
59
- @document.stroke_color 'AAAAAA'
60
- end
56
+ @document.stroke_color @theme.next_colour
61
57
  @document.stroke_line_to [base_x + last_position, base_y + bar_height]
62
58
  last_position += point_spacing
63
59
  end
@@ -41,23 +41,28 @@ module Prawn
41
41
  # :label_y, a label to be shown along the Y axis of he graph, rendered centered
42
42
  # on the grid and rotated to be perpendicular to the axis.
43
43
  #
44
+ # :theme, the theme to be used to draw this graph, defaults to monochrome.
45
+ #
44
46
  def initialize(data, document, options = {})
45
47
  if options[:at].nil? || options[:at].empty?
46
48
  raise Prawn::Errors::NoGraphStartSet,
47
- "you must specify options[:at] as the coordinates wher you" +
49
+ "you must specify options[:at] as the coordinates where you" +
48
50
  " wish this graph to be drawn from."
49
51
  end
50
- opts = { :width => 500, :height => 200, :spacing => 20 }.merge(options)
52
+ opts = { :theme => Prawn::Chart::Themes.monochrome, :width => 500, :height => 200, :spacing => 20 }.merge(options)
51
53
  (@headings, @values, @highest_value) = process_the data
52
54
  (grid_x_start, grid_y_start, grid_width, grid_height) = parse_sizing_from opts
53
55
  @colour = (!opts[:use_color].nil? || !opts[:use_colour].nil?)
54
56
  @document = document
55
- @grid = Prawn::Chart::Grid.new(grid_x_start, grid_y_start, grid_width, grid_height, opts[:spacing], document)
57
+ @theme = opts[:theme]
58
+ off = 20
59
+ @grid = Prawn::Chart::Grid.new(grid_x_start, grid_y_start, grid_width, grid_height, opts[:spacing], document, @theme)
56
60
  end
57
61
 
58
62
  # Draws the graph on the document which we have a reference to.
59
63
  #
60
64
  def draw
65
+ draw_bounding_box
61
66
  @grid.draw
62
67
  label_axes
63
68
  if @title
@@ -74,8 +79,15 @@ module Prawn
74
79
  end
75
80
 
76
81
  private
77
-
82
+
83
+ def draw_bounding_box
84
+ @document.fill_color @theme.background_colour
85
+ @document.fill_and_stroke_rectangle [(@point.first - 10), (@point.last + ( @total_height + 40 ))], @document.bounds.width, (@total_height + 40)
86
+ @document.fill_color '000000'
87
+ end
88
+
78
89
  def label_axes
90
+ @document.fill_color @theme.font_colour
79
91
  base_x = @grid.start_x + 1
80
92
  base_y = @grid.start_y + 1
81
93
 
@@ -92,24 +104,31 @@ module Prawn
92
104
  @document.draw_text heading, :at => [last_position, base_y - 15 ], :size => 5
93
105
  last_position += point_spacing
94
106
  end
107
+ @document.fill_color @theme.background_colour
95
108
  end
96
109
 
97
110
  def draw_title
111
+ @document.fill_color @theme.font_colour
98
112
  x_coord = calculate_x_axis_center_point(@title, 10)
99
113
  y_coord = @grid.start_y + @grid.height + 10
100
114
  @document.draw_text @title, :at => [x_coord, y_coord] ,:size => 10
115
+ @document.fill_color @theme.background_colour
101
116
  end
102
117
 
103
118
  def draw_x_axis_label
119
+ @document.fill_color @theme.font_colour
104
120
  x_coord = calculate_x_axis_center_point(@x_label, 8)
105
121
  y_coord = @grid.start_y - 30
106
122
  @document.draw_text @x_label, :at => [x_coord, y_coord] ,:size => 8
123
+ @document.fill_color @theme.background_colour
107
124
  end
108
125
 
109
126
  def draw_y_axis_label
127
+ @document.fill_color @theme.font_colour
110
128
  y_coord = calculate_y_axis_center_point(@y_label, 8)
111
129
  x_coord = @grid.start_x - 30
112
130
  @document.draw_text @y_label, :at => [x_coord, y_coord] ,:size => 8, :rotate => 90
131
+ @document.fill_color @theme.background_colour
113
132
  end
114
133
 
115
134
  # All subclasses of Prawn::Chart::Base must implement thier own plot_values
@@ -140,6 +159,10 @@ module Prawn
140
159
  move_y_up = 0
141
160
  grid_width = o[:width]
142
161
  grid_height = o[:height]
162
+
163
+ @total_width = o[:width]
164
+ @total_height = o[:height]
165
+ @point = o[:at].dup
143
166
 
144
167
  # Make room for the title if we're choosing to Render it.
145
168
  #
@@ -162,10 +185,11 @@ module Prawn
162
185
  @y_label = o[:label_y]
163
186
  x_offset += 15
164
187
  end
165
-
188
+
189
+
166
190
  # Return the values calculated here.
167
191
  #
168
- [ (o[:at][0] + x_offset), (o[:at][1] + move_y_up), (grid_width - x_offset), (grid_height - y_offset) ]
192
+ [ (o[:at][0] + x_offset), (o[:at][1] + move_y_up + 20), (grid_width - (x_offset - 20)), (grid_height - y_offset) ]
169
193
  end
170
194
 
171
195
  def process_the(data_array)
@@ -204,4 +228,4 @@ module Prawn
204
228
 
205
229
  end
206
230
  end
207
- end
231
+ end
@@ -9,12 +9,13 @@ module Prawn
9
9
 
10
10
  attr_accessor :width, :height, :point, :spacing, :document
11
11
 
12
- def initialize(grid_x_start, grid_y_start, grid_width, grid_height, spacing, document)
12
+ def initialize(grid_x_start, grid_y_start, grid_width, grid_height, spacing, document, theme)
13
13
  @point = [grid_x_start, grid_y_start]
14
14
  @width = grid_width
15
15
  @height = grid_height
16
16
  @spacing = spacing
17
17
  @document = document
18
+ @theme = theme
18
19
  end
19
20
 
20
21
  def start_x; @point.first; end
@@ -23,16 +24,17 @@ module Prawn
23
24
  # Draws the Grid on the specified Prawn::Document
24
25
  #
25
26
  def draw
26
- @document.stroke_color 'CCCCCC'
27
- (@height / @spacing).times do |x|
28
- offset = @spacing * (x + 1)
29
- @document.move_to [@point.first, (@point.last + offset)]
30
- @document.line_width(0.5)
31
- @document.stroke_line_to([(@point.first + @width), (@point.last + offset)])
27
+ @document.stroke_color @theme.marker_colour
28
+ if @theme.stroke_grid_markers?
29
+ (@height / @spacing).times do |x|
30
+ offset = @spacing * (x + 1)
31
+ @document.move_to [@point.first, (@point.last + offset)]
32
+ @document.line_width(0.5)
33
+ @document.stroke_line_to([(@point.first + @width), (@point.last + offset)])
34
+ end
32
35
  end
33
36
  @document.move_to @point
34
37
  @document.line_width(2)
35
- @document.stroke_color '000000'
36
38
  @document.stroke_line_to([@point.first, @point.last + @height])
37
39
  @document.move_to @point
38
40
  @document.line_width(2)
@@ -56,20 +56,12 @@ module Prawn
56
56
  bar_height = calculate_point_height_from value
57
57
  point = [base_x + last_position, base_y + bar_height]
58
58
  p << point
59
- if @colour
60
- @document.fill_color '00DD00'
61
- else
62
- @document.fill_color 'AAAAAA'
63
- end
59
+ @document.fill_color @theme.colours.first
64
60
  @document.fill_circle_at point, :radius => 1
65
61
  last_position += point_spacing
66
62
  end
67
63
  @document.line_width 2
68
- if @colour
69
- @document.stroke_color '00DD00'
70
- else
71
- @document.stroke_color 'AAAAAA'
72
- end
64
+ @document.stroke_color @theme.colours.first
73
65
  p.each_with_index do |point,i|
74
66
  next if point == p.last
75
67
  @document.move_to point
@@ -0,0 +1,116 @@
1
+ require 'yaml'
2
+
3
+ module Prawn
4
+ module Chart
5
+
6
+ # Themes serves as a point of interaction between the user and the underlying
7
+ # collection of themes made available to Prawn::Graph.
8
+ #
9
+ class Themes
10
+
11
+ # Called once when Prawn::Graph is loaded, initializes the list of
12
+ # themes currently bundled. If you have your own custom theme you'd
13
+ # like to use instead, use _register_theme and give it the path to
14
+ # your theme file.
15
+ #
16
+ def self.initialize_themes
17
+ path = File.expand_path(File.dirname(__FILE__) + '/themes/')
18
+ Dir.open(path) do |dir|
19
+ dir.each do |file|
20
+ _register_theme(path + '/' + file) if file.include?('.yml')
21
+ end
22
+ end
23
+ end
24
+
25
+ # Adds the theme defined by the yaml file specified to the mapping of
26
+ # registered themes stored in +@@_themes_list+. Converts the YAML object
27
+ # into a Theme object for use in the application.
28
+ #
29
+ def self._register_theme(theme_file_path)
30
+ theme = Theme.new(YAML.load(IO.read(File.expand_path(theme_file_path))))
31
+ if !defined? @@_themes_list
32
+ @@_themes_list = {}
33
+ end
34
+ @@_themes_list[theme.name.to_sym] = theme
35
+ end
36
+
37
+ # Returns an array of the themes currently registered.
38
+ #
39
+ def self.list
40
+ @@_themes_list.keys
41
+ end
42
+
43
+ protected
44
+
45
+ # Hook into method_missing to allow us to do things like:
46
+ # Prawn::Chart::Themes.theme_name
47
+ # To return the theme object being looked for.
48
+ #
49
+ def self.method_missing(method, *args)
50
+ if @@_themes_list.keys.include?(method)
51
+ return @@_themes_list[method]
52
+ end
53
+ end
54
+
55
+
56
+ class Theme
57
+ attr_accessor :name, :title, :colours, :font_colour, :background_colour, :marker_colour
58
+
59
+ # Creates a new theme from a theme hash. The hash comes from the
60
+ # library parsing YAML definitions of a theme.
61
+ #
62
+ def initialize(theme_hash)
63
+ @name = theme_hash['name']
64
+ @title = theme_hash['title']
65
+
66
+ if theme_hash.keys.include?('colours')
67
+ @colours = theme_hash['colours']
68
+ elsif theme_hash.keys.include?('colors')
69
+ @colours = theme_hash['colors']
70
+ end
71
+
72
+ if theme_hash.keys.include?('font_colour')
73
+ @font_colour = theme_hash['font_colour']
74
+ elsif theme_hash.keys.include?('font_color')
75
+ @font_colour = theme_hash['font_color']
76
+ end
77
+
78
+ if theme_hash.keys.include?('background_colour')
79
+ @background_colour = theme_hash['background_colour']
80
+ elsif theme_hash.keys.include?('background_color')
81
+ @background_colour = theme_hash['background_color']
82
+ end
83
+
84
+ if theme_hash.keys.include?('marker_colour')
85
+ @marker_colour = theme_hash['marker_colour']
86
+ elsif theme_hash.keys.include?('marker_color')
87
+ @marker_colour = theme_hash['marker_color']
88
+ end
89
+
90
+ @stroke_grid_markers = theme_hash['stroke_grid_markers'].to_i
91
+ end
92
+
93
+ # Returns the next colour in the array of colours associated
94
+ # with this theme. If it gets to the end, it starts again from
95
+ # the beginning.
96
+ #
97
+ def next_colour
98
+ unless @current_colour
99
+ @current_colour = 0
100
+ return @colours[0]
101
+ end
102
+ @current_colour += 1
103
+ @current_colour = 0 if @current_colour == @colours.nitems
104
+ @colours[@current_colour]
105
+ end
106
+ alias next_color next_colour
107
+
108
+ def stroke_grid_markers?
109
+ @stroke_grid_markers == 1
110
+ end
111
+
112
+ end
113
+ end
114
+
115
+ end
116
+ end
@@ -0,0 +1,14 @@
1
+ name: 37signals
2
+ title: 37 Signals Theme
3
+ font_color: 'FFFFFF'
4
+ marker_color: 'FFFFFF'
5
+ background_colour: 'D1EDF5'
6
+ stroke_grid_markers: 0
7
+ colours:
8
+ - '339933'
9
+ - 'cc99cc'
10
+ - '336699'
11
+ - 'FFF804'
12
+ - 'ff0000'
13
+ - 'cf5910'
14
+ - '000000'
@@ -0,0 +1,14 @@
1
+ name: keynote
2
+ title: Keynote Theme
3
+ font_color: 'FFFFFF'
4
+ background_colour: '000000'
5
+ marker_colour: 'FFFFFF'
6
+ stroke_grid_markers: 0
7
+ colours:
8
+ - '6886B4'
9
+ - 'FDD84E'
10
+ - '72AE6E'
11
+ - 'D1695E'
12
+ - '8A6EAF'
13
+ - 'EFAA43'
14
+ - 'FFFFFF'
@@ -0,0 +1,8 @@
1
+ name: monochrome
2
+ title: Monochrome Theme
3
+ font_color: '000000'
4
+ marker_color: '000000'
5
+ background_colour: 'FFFFFF'
6
+ stroke_grid_markers: 1
7
+ colours:
8
+ - 'AAAAAA'
@@ -0,0 +1,14 @@
1
+ name: odeo
2
+ title: Odeo Theme
3
+ font_color: 'FFFFFF'
4
+ marker_color: 'FFFFFF'
5
+ stroke_grid_markers: 0
6
+ background_colour: 'FF47A4'
7
+ colours:
8
+ - '202020'
9
+ - 'FFFFFF'
10
+ - 'A21764'
11
+ - '8AB438'
12
+ - '999999'
13
+ - '3A5B87'
14
+ - '000000'
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prawn-graph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 4
9
+ version: 0.0.4
5
10
  platform: ruby
6
11
  authors:
7
12
  - Ryan Stenhouse
@@ -9,19 +14,21 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-22 00:00:00 +00:00
17
+ date: 2010-02-27 00:00:00 +00:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: prawn
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
23
29
  version: "0"
24
- version:
30
+ type: :runtime
31
+ version_requirements: *id001
25
32
  description: " An extension to Prawn that provides the ability to draw basic graphs and charts natively in your PDFs.\n"
26
33
  email: " ryan@ryanstenhouse.eu"
27
34
  executables: []
@@ -33,15 +40,23 @@ extra_rdoc_files:
33
40
  files:
34
41
  - examples/example_helper.rb
35
42
  - examples/graph/advanced_bar_chart.rb
43
+ - examples/graph/bar_chart.pdf
36
44
  - examples/graph/bar_chart.rb
45
+ - examples/graph/line_chart.pdf
37
46
  - examples/graph/line_chart.rb
47
+ - examples/graph/themed_bar_chart.rb
48
+ - examples/graph/themed_line_chart.rb
38
49
  - lib/prawn/graph/bar.rb
39
50
  - lib/prawn/graph/base.rb
40
51
  - lib/prawn/graph/chart.rb
41
52
  - lib/prawn/graph/errors.rb
42
53
  - lib/prawn/graph/grid.rb
43
54
  - lib/prawn/graph/line.rb
44
- - lib/prawn/graph/theme.rb
55
+ - lib/prawn/graph/themes/37signals.yml
56
+ - lib/prawn/graph/themes/keynote.yml
57
+ - lib/prawn/graph/themes/monochome.yml
58
+ - lib/prawn/graph/themes/odeo.yml
59
+ - lib/prawn/graph/themes.rb
45
60
  - lib/prawn/graph.rb
46
61
  - Rakefile
47
62
  - README.markdown
@@ -62,18 +77,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
77
  requirements:
63
78
  - - ">="
64
79
  - !ruby/object:Gem::Version
80
+ segments:
81
+ - 0
65
82
  version: "0"
66
- version:
67
83
  required_rubygems_version: !ruby/object:Gem::Requirement
68
84
  requirements:
69
85
  - - ">="
70
86
  - !ruby/object:Gem::Version
87
+ segments:
88
+ - 0
71
89
  version: "0"
72
- version:
73
90
  requirements: []
74
91
 
75
92
  rubyforge_project: prawn
76
- rubygems_version: 1.3.5
93
+ rubygems_version: 1.3.6
77
94
  signing_key:
78
95
  specification_version: 3
79
96
  summary: An extension to Prawn that provides the ability to draw basic graphs and charts natively in your PDFs.
@@ -1,24 +0,0 @@
1
- module Prawn
2
- module Chart
3
-
4
- class Theme
5
- attr_accessor :red, :green, :blue, :orange, :yellow, :purple, :black, :white
6
- end
7
-
8
- class Themes
9
-
10
- def self.register(theme)
11
- if theme.is_a? Theme
12
- unless defined? @@_themes
13
- @@_themes = []
14
- end
15
- @@_themes << theme
16
- end
17
- end
18
-
19
-
20
-
21
- end
22
-
23
- end
24
-