prawn 0.13.0 → 2.4.0

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.
Files changed (348) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +10 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -16
  6. data/Rakefile +17 -39
  7. data/lib/prawn/document/bounding_box.rb +85 -42
  8. data/lib/prawn/document/column_box.rb +21 -11
  9. data/lib/prawn/document/internals.rb +40 -147
  10. data/lib/prawn/document/span.rb +25 -17
  11. data/lib/prawn/document.rb +286 -245
  12. data/lib/prawn/encoding.rb +68 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +204 -155
  15. data/lib/prawn/font_metric_cache.rb +25 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +7 -13
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +142 -80
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +6 -5
  23. data/lib/prawn/graphics/color.rb +47 -44
  24. data/lib/prawn/graphics/dash.rb +30 -13
  25. data/lib/prawn/graphics/join_style.rb +13 -6
  26. data/lib/prawn/graphics/patterns.rb +221 -90
  27. data/lib/prawn/graphics/transformation.rb +21 -12
  28. data/lib/prawn/graphics/transparency.rb +21 -17
  29. data/lib/prawn/graphics.rb +155 -128
  30. data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
  31. data/lib/prawn/image_handler.rb +16 -2
  32. data/lib/prawn/images/image.rb +4 -2
  33. data/lib/prawn/images/jpg.rb +39 -30
  34. data/lib/prawn/images/png.rb +132 -169
  35. data/lib/prawn/images.rb +70 -62
  36. data/lib/prawn/measurement_extensions.rb +15 -10
  37. data/lib/prawn/measurements.rb +22 -23
  38. data/lib/prawn/outline.rb +301 -13
  39. data/lib/prawn/repeater.rb +19 -17
  40. data/lib/prawn/security/arcfour.rb +54 -0
  41. data/lib/prawn/security.rb +108 -86
  42. data/lib/prawn/soft_mask.rb +40 -41
  43. data/lib/prawn/stamp.rb +29 -12
  44. data/lib/prawn/text/box.rb +27 -29
  45. data/lib/prawn/text/formatted/arranger.rb +110 -67
  46. data/lib/prawn/text/formatted/box.rb +233 -165
  47. data/lib/prawn/text/formatted/fragment.rb +27 -27
  48. data/lib/prawn/text/formatted/line_wrap.rb +137 -97
  49. data/lib/prawn/text/formatted/parser.rb +149 -127
  50. data/lib/prawn/text/formatted/wrap.rb +57 -37
  51. data/lib/prawn/text/formatted.rb +6 -4
  52. data/lib/prawn/text.rb +105 -73
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +11 -21
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +42 -68
  58. data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
  59. data/manual/basic_concepts/adding_pages.rb +9 -10
  60. data/manual/basic_concepts/basic_concepts.rb +33 -24
  61. data/manual/basic_concepts/creation.rb +10 -11
  62. data/manual/basic_concepts/cursor.rb +9 -10
  63. data/manual/basic_concepts/measurement.rb +10 -11
  64. data/manual/basic_concepts/origin.rb +8 -9
  65. data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
  66. data/manual/basic_concepts/view.rb +48 -0
  67. data/manual/bounding_box/bounding_box.rb +31 -29
  68. data/manual/bounding_box/bounds.rb +17 -18
  69. data/manual/bounding_box/canvas.rb +8 -9
  70. data/manual/bounding_box/creation.rb +8 -9
  71. data/manual/bounding_box/indentation.rb +22 -23
  72. data/manual/bounding_box/nesting.rb +32 -25
  73. data/manual/bounding_box/russian_boxes.rb +19 -19
  74. data/manual/bounding_box/stretchy.rb +18 -20
  75. data/manual/contents.rb +35 -0
  76. data/manual/cover.rb +43 -0
  77. data/manual/document_and_page_options/background.rb +16 -14
  78. data/manual/document_and_page_options/document_and_page_options.rb +26 -23
  79. data/manual/document_and_page_options/metadata.rb +21 -19
  80. data/manual/document_and_page_options/page_margins.rb +20 -22
  81. data/manual/document_and_page_options/page_size.rb +15 -15
  82. data/manual/document_and_page_options/print_scaling.rb +23 -0
  83. data/manual/example_helper.rb +5 -408
  84. data/manual/graphics/blend_mode.rb +52 -0
  85. data/manual/graphics/circle_and_ellipse.rb +8 -9
  86. data/manual/graphics/color.rb +11 -13
  87. data/manual/graphics/common_lines.rb +13 -12
  88. data/manual/graphics/fill_and_stroke.rb +10 -11
  89. data/manual/graphics/fill_rules.rb +13 -12
  90. data/manual/graphics/gradients.rb +28 -22
  91. data/manual/graphics/graphics.rb +52 -46
  92. data/manual/graphics/helper.rb +20 -10
  93. data/manual/graphics/line_width.rb +13 -12
  94. data/manual/graphics/lines_and_curves.rb +13 -14
  95. data/manual/graphics/polygon.rb +10 -12
  96. data/manual/graphics/rectangle.rb +7 -8
  97. data/manual/graphics/rotate.rb +9 -12
  98. data/manual/graphics/scale.rb +19 -18
  99. data/manual/graphics/soft_masks.rb +5 -7
  100. data/manual/graphics/stroke_cap.rb +10 -11
  101. data/manual/graphics/stroke_dash.rb +16 -17
  102. data/manual/graphics/stroke_join.rb +10 -11
  103. data/manual/graphics/translate.rb +13 -13
  104. data/manual/graphics/transparency.rb +11 -13
  105. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
  106. data/manual/images/absolute_position.rb +9 -10
  107. data/manual/images/fit.rb +9 -10
  108. data/manual/images/horizontal.rb +13 -14
  109. data/manual/images/images.rb +31 -30
  110. data/manual/images/plain_image.rb +6 -7
  111. data/manual/images/scale.rb +12 -13
  112. data/manual/images/vertical.rb +19 -17
  113. data/manual/images/width_and_height.rb +13 -14
  114. data/manual/layout/boxes.rb +14 -15
  115. data/manual/layout/content.rb +12 -13
  116. data/manual/layout/layout.rb +19 -20
  117. data/manual/layout/simple_grid.rb +8 -9
  118. data/manual/outline/add_subsection_to.rb +26 -27
  119. data/manual/outline/insert_section_after.rb +19 -20
  120. data/manual/outline/outline.rb +23 -22
  121. data/manual/outline/sections_and_pages.rb +24 -25
  122. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  123. data/manual/repeatable_content/page_numbering.rb +20 -19
  124. data/manual/repeatable_content/repeatable_content.rb +26 -22
  125. data/manual/repeatable_content/repeater.rb +18 -19
  126. data/manual/repeatable_content/stamp.rb +18 -19
  127. data/manual/security/encryption.rb +8 -11
  128. data/manual/security/permissions.rb +20 -15
  129. data/manual/security/security.rb +20 -20
  130. data/manual/table.rb +16 -0
  131. data/manual/text/alignment.rb +17 -18
  132. data/manual/text/color.rb +13 -13
  133. data/manual/text/column_box.rb +10 -12
  134. data/manual/text/fallback_fonts.rb +29 -25
  135. data/manual/text/font.rb +17 -18
  136. data/manual/text/font_size.rb +21 -22
  137. data/manual/text/font_style.rb +12 -10
  138. data/manual/text/formatted_callbacks.rb +36 -26
  139. data/manual/text/formatted_text.rb +41 -34
  140. data/manual/text/free_flowing_text.rb +28 -29
  141. data/manual/text/inline.rb +23 -26
  142. data/manual/text/kerning_and_character_spacing.rb +20 -21
  143. data/manual/text/leading.rb +10 -11
  144. data/manual/text/line_wrapping.rb +40 -21
  145. data/manual/text/paragraph_indentation.rb +17 -12
  146. data/manual/text/positioned_text.rb +19 -20
  147. data/manual/text/registering_families.rb +33 -30
  148. data/manual/text/rendering_and_color.rb +11 -12
  149. data/manual/text/right_to_left_text.rb +31 -20
  150. data/manual/text/rotation.rb +36 -27
  151. data/manual/text/single_usage.rb +13 -14
  152. data/manual/text/text.rb +62 -62
  153. data/manual/text/text_box_excess.rb +22 -19
  154. data/manual/text/text_box_extensions.rb +21 -18
  155. data/manual/text/text_box_overflow.rb +28 -21
  156. data/manual/text/utf8.rb +16 -17
  157. data/manual/text/win_ansi_charset.rb +29 -26
  158. data/prawn.gemspec +45 -43
  159. data/spec/extensions/encoding_helpers.rb +4 -3
  160. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  161. data/spec/prawn/document/column_box_spec.rb +75 -0
  162. data/spec/prawn/document/security_spec.rb +176 -0
  163. data/spec/prawn/document_annotations_spec.rb +76 -0
  164. data/spec/prawn/document_destinations_spec.rb +15 -0
  165. data/spec/prawn/document_grid_spec.rb +99 -0
  166. data/spec/prawn/document_reference_spec.rb +27 -0
  167. data/spec/prawn/document_span_spec.rb +44 -0
  168. data/spec/prawn/document_spec.rb +805 -0
  169. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  170. data/spec/prawn/font_spec.rb +544 -0
  171. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  172. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  173. data/spec/prawn/graphics_spec.rb +872 -0
  174. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  175. data/spec/prawn/image_handler_spec.rb +53 -0
  176. data/spec/prawn/images/jpg_spec.rb +20 -0
  177. data/spec/prawn/images/png_spec.rb +283 -0
  178. data/spec/prawn/images_spec.rb +229 -0
  179. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  180. data/spec/prawn/outline_spec.rb +512 -0
  181. data/spec/prawn/repeater_spec.rb +166 -0
  182. data/spec/prawn/soft_mask_spec.rb +74 -0
  183. data/spec/prawn/stamp_spec.rb +173 -0
  184. data/spec/prawn/text/box_spec.rb +1110 -0
  185. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  186. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  187. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  188. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  189. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  190. data/spec/prawn/text_draw_text_spec.rb +150 -0
  191. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  192. data/spec/prawn/text_spacing_spec.rb +95 -0
  193. data/spec/prawn/text_spec.rb +603 -0
  194. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  195. data/spec/prawn/transformation_stack_spec.rb +66 -0
  196. data/spec/prawn/view_spec.rb +63 -0
  197. data/spec/prawn_manual_spec.rb +35 -0
  198. data/spec/spec_helper.rb +22 -21
  199. data.tar.gz.sig +0 -0
  200. metadata +168 -307
  201. metadata.gz.sig +0 -0
  202. data/README.md +0 -109
  203. data/data/encodings/win_ansi.txt +0 -29
  204. data/data/images/16bit.alpha +0 -0
  205. data/data/images/16bit.dat +0 -0
  206. data/data/images/16bit.png +0 -0
  207. data/data/images/arrow.png +0 -0
  208. data/data/images/arrow2.png +0 -0
  209. data/data/images/barcode_issue.png +0 -0
  210. data/data/images/dice.alpha +0 -0
  211. data/data/images/dice.dat +0 -0
  212. data/data/images/dice.png +0 -0
  213. data/data/images/dice_interlaced.png +0 -0
  214. data/data/images/indexed_color.dat +0 -0
  215. data/data/images/indexed_color.png +0 -0
  216. data/data/images/letterhead.jpg +0 -0
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.dat +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/lib/pdf/core/annotations.rb +0 -60
  244. data/lib/pdf/core/byte_string.rb +0 -9
  245. data/lib/pdf/core/destinations.rb +0 -90
  246. data/lib/pdf/core/document_state.rb +0 -78
  247. data/lib/pdf/core/filter_list.rb +0 -51
  248. data/lib/pdf/core/filters.rb +0 -36
  249. data/lib/pdf/core/graphics_state.rb +0 -68
  250. data/lib/pdf/core/literal_string.rb +0 -16
  251. data/lib/pdf/core/name_tree.rb +0 -177
  252. data/lib/pdf/core/object_store.rb +0 -320
  253. data/lib/pdf/core/outline.rb +0 -315
  254. data/lib/pdf/core/page.rb +0 -212
  255. data/lib/pdf/core/page_geometry.rb +0 -126
  256. data/lib/pdf/core/pdf_object.rb +0 -124
  257. data/lib/pdf/core/reference.rb +0 -103
  258. data/lib/pdf/core/stream.rb +0 -98
  259. data/lib/pdf/core/text.rb +0 -275
  260. data/lib/pdf/core.rb +0 -35
  261. data/lib/prawn/compatibility.rb +0 -91
  262. data/lib/prawn/document/graphics_state.rb +0 -73
  263. data/lib/prawn/document/snapshot.rb +0 -89
  264. data/lib/prawn/font/afm.rb +0 -203
  265. data/lib/prawn/layout.rb +0 -20
  266. data/lib/prawn/table/cell/image.rb +0 -70
  267. data/lib/prawn/table/cell/in_table.rb +0 -27
  268. data/lib/prawn/table/cell/span_dummy.rb +0 -92
  269. data/lib/prawn/table/cell/subtable.rb +0 -65
  270. data/lib/prawn/table/cell/text.rb +0 -153
  271. data/lib/prawn/table/cell.rb +0 -770
  272. data/lib/prawn/table/cells.rb +0 -295
  273. data/lib/prawn/table.rb +0 -643
  274. data/manual/example_file.rb +0 -116
  275. data/manual/example_package.rb +0 -53
  276. data/manual/example_section.rb +0 -46
  277. data/manual/manual/cover.rb +0 -35
  278. data/manual/manual/foreword.rb +0 -85
  279. data/manual/manual/manual.rb +0 -35
  280. data/manual/syntax_highlight.rb +0 -52
  281. data/manual/table/basic_block.rb +0 -53
  282. data/manual/table/before_rendering_page.rb +0 -26
  283. data/manual/table/cell_border_lines.rb +0 -24
  284. data/manual/table/cell_borders_and_bg.rb +0 -31
  285. data/manual/table/cell_dimensions.rb +0 -30
  286. data/manual/table/cell_text.rb +0 -38
  287. data/manual/table/column_widths.rb +0 -30
  288. data/manual/table/content_and_subtables.rb +0 -39
  289. data/manual/table/creation.rb +0 -27
  290. data/manual/table/filtering.rb +0 -36
  291. data/manual/table/flow_and_header.rb +0 -17
  292. data/manual/table/image_cells.rb +0 -33
  293. data/manual/table/position.rb +0 -29
  294. data/manual/table/row_colors.rb +0 -20
  295. data/manual/table/span.rb +0 -30
  296. data/manual/table/style.rb +0 -22
  297. data/manual/table/table.rb +0 -52
  298. data/manual/table/width.rb +0 -27
  299. data/manual/templates/full_template.rb +0 -25
  300. data/manual/templates/page_template.rb +0 -48
  301. data/manual/templates/templates.rb +0 -27
  302. data/manual/text/group.rb +0 -29
  303. data/spec/acceptance/png.rb +0 -23
  304. data/spec/annotations_spec.rb +0 -74
  305. data/spec/bounding_box_spec.rb +0 -493
  306. data/spec/cell_spec.rb +0 -628
  307. data/spec/column_box_spec.rb +0 -33
  308. data/spec/destinations_spec.rb +0 -15
  309. data/spec/document_spec.rb +0 -761
  310. data/spec/extensions/mocha.rb +0 -44
  311. data/spec/filters_spec.rb +0 -34
  312. data/spec/font_metric_cache_spec.rb +0 -52
  313. data/spec/font_spec.rb +0 -464
  314. data/spec/formatted_text_arranger_spec.rb +0 -421
  315. data/spec/formatted_text_box_spec.rb +0 -650
  316. data/spec/formatted_text_fragment_spec.rb +0 -298
  317. data/spec/graphics_spec.rb +0 -651
  318. data/spec/grid_spec.rb +0 -85
  319. data/spec/image_handler_spec.rb +0 -42
  320. data/spec/images_spec.rb +0 -157
  321. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  322. data/spec/jpg_spec.rb +0 -25
  323. data/spec/line_wrap_spec.rb +0 -333
  324. data/spec/measurement_units_spec.rb +0 -23
  325. data/spec/name_tree_spec.rb +0 -112
  326. data/spec/object_store_spec.rb +0 -170
  327. data/spec/outline_spec.rb +0 -448
  328. data/spec/pdf_object_spec.rb +0 -172
  329. data/spec/png_spec.rb +0 -240
  330. data/spec/reference_spec.rb +0 -82
  331. data/spec/repeater_spec.rb +0 -158
  332. data/spec/security_spec.rb +0 -158
  333. data/spec/snapshot_spec.rb +0 -186
  334. data/spec/soft_mask_spec.rb +0 -117
  335. data/spec/span_spec.rb +0 -44
  336. data/spec/stamp_spec.rb +0 -158
  337. data/spec/stream_spec.rb +0 -58
  338. data/spec/stroke_styles_spec.rb +0 -211
  339. data/spec/table/span_dummy_spec.rb +0 -17
  340. data/spec/table_spec.rb +0 -1355
  341. data/spec/template_spec.rb +0 -351
  342. data/spec/text_at_spec.rb +0 -130
  343. data/spec/text_box_spec.rb +0 -1030
  344. data/spec/text_rendering_mode_spec.rb +0 -45
  345. data/spec/text_spacing_spec.rb +0 -93
  346. data/spec/text_spec.rb +0 -425
  347. data/spec/text_with_inline_formatting_spec.rb +0 -35
  348. data/spec/transparency_spec.rb +0 -89
@@ -1,295 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # cells.rb: Methods for accessing rows, columns, and cells of a Prawn::Table.
4
- #
5
- # Copyright December 2009, Brad Ediger. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
-
9
- module Prawn
10
- class Table
11
-
12
- # Selects the given rows (0-based) for styling. Returns a Cells object --
13
- # see the documentation on Cells for things you can do with cells.
14
- #
15
- def rows(row_spec)
16
- cells.rows(row_spec)
17
- end
18
- alias_method :row, :rows
19
-
20
- # Selects the given columns (0-based) for styling. Returns a Cells object
21
- # -- see the documentation on Cells for things you can do with cells.
22
- #
23
- def columns(col_spec)
24
- cells.columns(col_spec)
25
- end
26
- alias_method :column, :columns
27
-
28
- # Represents a selection of cells to be styled. Operations on a CellProxy
29
- # can be chained, and cell properties can be set one-for-all on the proxy.
30
- #
31
- # To set vertical borders only:
32
- #
33
- # table.cells.borders = [:left, :right]
34
- #
35
- # To highlight a rectangular area of the table:
36
- #
37
- # table.rows(1..3).columns(2..4).background_color = 'ff0000'
38
- #
39
- class Cells < Array
40
-
41
- # Limits selection to the given row or rows. +row_spec+ can be anything
42
- # that responds to the === operator selecting a set of 0-based row
43
- # numbers; most commonly a number or a range.
44
- #
45
- # table.row(0) # selects first row
46
- # table.rows(3..4) # selects rows four and five
47
- #
48
- def rows(row_spec)
49
- index_cells unless defined?(@indexed) && @indexed
50
- row_spec = transform_spec(row_spec, @first_row, @row_count)
51
- Cells.new(@rows[row_spec] ||= select { |c|
52
- row_spec.respond_to?(:include?) ?
53
- row_spec.include?(c.row) : row_spec === c.row })
54
- end
55
- alias_method :row, :rows
56
-
57
- # Returns the number of rows in the list.
58
- #
59
- def row_count
60
- index_cells unless defined?(@indexed) && @indexed
61
- @row_count
62
- end
63
-
64
- # Limits selection to the given column or columns. +col_spec+ can be
65
- # anything that responds to the === operator selecting a set of 0-based
66
- # column numbers; most commonly a number or a range.
67
- #
68
- # table.column(0) # selects first column
69
- # table.columns(3..4) # selects columns four and five
70
- #
71
- def columns(col_spec)
72
- index_cells unless defined?(@indexed) && @indexed
73
- col_spec = transform_spec(col_spec, @first_column, @column_count)
74
- Cells.new(@columns[col_spec] ||= select { |c|
75
- col_spec.respond_to?(:include?) ?
76
- col_spec.include?(c.column) : col_spec === c.column })
77
- end
78
- alias_method :column, :columns
79
-
80
- # Returns the number of columns in the list.
81
- #
82
- def column_count
83
- index_cells unless defined?(@indexed) && @indexed
84
- @column_count
85
- end
86
-
87
- # Allows you to filter the given cells by arbitrary properties.
88
- #
89
- # table.column(4).filter { |cell| cell.content =~ /Yes/ }.
90
- # background_color = '00ff00'
91
- #
92
- def filter(&block)
93
- Cells.new(select(&block))
94
- end
95
-
96
- # Retrieves a cell based on its 0-based row and column. Returns an
97
- # individual Cell, not a Cells collection.
98
- #
99
- # table.cells[0, 0].content # => "First cell content"
100
- #
101
- def [](row, col)
102
- return nil if empty?
103
- index_cells unless defined?(@indexed) && @indexed
104
- row_array, col_array = @rows[@first_row + row] || [], @columns[@first_column + col] || []
105
- if row_array.length < col_array.length
106
- row_array.find { |c| c.column == @first_column + col }
107
- else
108
- col_array.find { |c| c.row == @first_row + row }
109
- end
110
- end
111
-
112
- # Puts a cell in the collection at the given position. Internal use only.
113
- #
114
- def []=(row, col, cell) # :nodoc:
115
- cell.extend(Cell::InTable)
116
- cell.row = row
117
- cell.column = col
118
-
119
- if defined?(@indexed) && @indexed
120
- (@rows[row] ||= []) << cell
121
- (@columns[col] ||= []) << cell
122
- @first_row = row if !@first_row || row < @first_row
123
- @first_column = col if !@first_column || col < @first_column
124
- @row_count = @rows.size
125
- @column_count = @columns.size
126
- end
127
-
128
- self << cell
129
- end
130
-
131
- # Supports setting multiple properties at once.
132
- #
133
- # table.cells.style(:padding => 0, :border_width => 2)
134
- #
135
- # is the same as:
136
- #
137
- # table.cells.padding = 0
138
- # table.cells.border_width = 2
139
- #
140
- # You can also pass a block, which will be called for each cell in turn.
141
- # This allows you to set more complicated properties:
142
- #
143
- # table.cells.style { |cell| cell.border_width += 12 }
144
- #
145
- def style(options={}, &block)
146
- each do |cell|
147
- next if cell.is_a?(Cell::SpanDummy)
148
- cell.style(options, &block)
149
- end
150
- end
151
-
152
- # Returns the total width of all columns in the selected set.
153
- #
154
- def width
155
- widths = {}
156
- each do |cell|
157
- per_cell_width = cell.width_ignoring_span.to_f / cell.colspan
158
- cell.colspan.times do |n|
159
- widths[cell.column+n] = [widths[cell.column+n], per_cell_width].
160
- compact.max
161
- end
162
- end
163
- widths.values.inject(0, &:+)
164
- end
165
-
166
- # Returns minimum width required to contain cells in the set.
167
- #
168
- def min_width
169
- aggregate_cell_values(:column, :avg_spanned_min_width, :max)
170
- end
171
-
172
- # Returns maximum width that can contain cells in the set.
173
- #
174
- def max_width
175
- aggregate_cell_values(:column, :max_width_ignoring_span, :max)
176
- end
177
-
178
- # Returns the total height of all rows in the selected set.
179
- #
180
- def height
181
- aggregate_cell_values(:row, :height_ignoring_span, :max)
182
- end
183
-
184
- # Supports setting arbitrary properties on a group of cells.
185
- #
186
- # table.cells.row(3..6).background_color = 'cc0000'
187
- #
188
- def method_missing(id, *args, &block)
189
- if id.to_s =~ /=\z/
190
- each { |c| c.send(id, *args, &block) if c.respond_to?(id) }
191
- else
192
- super
193
- end
194
- end
195
-
196
- protected
197
-
198
- # Defers indexing until rows() or columns() is actually called on the
199
- # Cells object. Without this, we would needlessly index the leaf nodes of
200
- # the object graph, the ones that are only there to be iterated over.
201
- #
202
- # Make sure to call this before using @rows or @columns.
203
- #
204
- def index_cells
205
- @rows = {}
206
- @columns = {}
207
-
208
- each do |cell|
209
- @rows[cell.row] ||= []
210
- @rows[cell.row] << cell
211
-
212
- @columns[cell.column] ||= []
213
- @columns[cell.column] << cell
214
- end
215
-
216
- @first_row = @rows.keys.min
217
- @first_column = @columns.keys.min
218
-
219
- @row_count = @rows.size
220
- @column_count = @columns.size
221
-
222
- @indexed = true
223
- end
224
-
225
- # Sum up a min/max value over rows or columns in the cells selected.
226
- # Takes the min/max (per +aggregate+) of the result of sending +meth+ to
227
- # each cell, grouped by +row_or_column+.
228
- #
229
- def aggregate_cell_values(row_or_column, meth, aggregate)
230
- values = {}
231
-
232
- #calculate values for all cells that do not span accross multiple cells
233
- #this ensures that we don't have a problem if the first line includes
234
- #a cell that spans across multiple cells
235
- each do |cell|
236
- #don't take spanned cells
237
- if cell.colspan == 1 and cell.class != Prawn::Table::Cell::SpanDummy
238
- index = cell.send(row_or_column)
239
- values[index] = [values[index], cell.send(meth)].compact.send(aggregate)
240
- end
241
- end
242
-
243
- each do |cell|
244
- index = cell.send(row_or_column)
245
- if cell.colspan > 1
246
- #calculate current (old) return value before we do anything
247
- old_sum = 0
248
- cell.colspan.times { |i|
249
- old_sum += values[index+i] unless values[index+i].nil?
250
- }
251
-
252
- #calculate future return value
253
- new_sum = cell.send(meth) * cell.colspan
254
-
255
- if new_sum >= old_sum
256
- #not entirely sure why we need this line, but with it the tests pass
257
- values[index] = [values[index], cell.send(meth)].compact.send(aggregate)
258
- #overwrite the old values with the new ones, but only if all entries existed
259
- entries_exist = true
260
- cell.colspan.times { |i| entries_exist = false if values[index+i].nil? }
261
- cell.colspan.times { |i|
262
- values[index+i] = cell.send(meth) if entries_exist
263
- }
264
- end
265
- else
266
- if cell.class == Prawn::Table::Cell::SpanDummy
267
- values[index] = [values[index], cell.send(meth)].compact.send(aggregate)
268
- end
269
- end
270
- end
271
- values.values.inject(0, &:+)
272
- end
273
-
274
- # Transforms +spec+, a column / row specification, into an object that
275
- # can be compared against a row or column number using ===. Normalizes
276
- # negative indices to be positive, given a total size of +total+. The
277
- # first row/column is indicated by +first+; this value is considered row
278
- # or column 0.
279
- #
280
- def transform_spec(spec, first, total)
281
- case spec
282
- when Range
283
- transform_spec(spec.begin, first, total) ..
284
- transform_spec(spec.end, first, total)
285
- when Integer
286
- spec < 0 ? (first + total + spec) : first + spec
287
- when Enumerable
288
- spec.map { |x| first + x }
289
- else # pass through
290
- raise "Don't understand spec #{spec.inspect}"
291
- end
292
- end
293
- end
294
- end
295
- end