prawn 2.0.2 → 2.3.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 (277) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +20 -23
  7. data/lib/prawn.rb +37 -49
  8. data/lib/prawn/document.rb +181 -133
  9. data/lib/prawn/document/bounding_box.rb +41 -29
  10. data/lib/prawn/document/column_box.rb +7 -7
  11. data/lib/prawn/document/internals.rb +18 -8
  12. data/lib/prawn/document/span.rb +21 -16
  13. data/lib/prawn/encoding.rb +69 -68
  14. data/lib/prawn/errors.rb +12 -7
  15. data/lib/prawn/font.rb +115 -69
  16. data/lib/prawn/font_metric_cache.rb +14 -8
  17. data/lib/prawn/{font → fonts}/afm.rb +102 -68
  18. data/lib/prawn/{font → fonts}/dfont.rb +5 -11
  19. data/lib/prawn/fonts/otf.rb +11 -0
  20. data/lib/prawn/fonts/ttc.rb +36 -0
  21. data/lib/prawn/{font → fonts}/ttf.rb +87 -68
  22. data/lib/prawn/graphics.rb +120 -80
  23. data/lib/prawn/graphics/blend_mode.rb +65 -0
  24. data/lib/prawn/graphics/cap_style.rb +3 -3
  25. data/lib/prawn/graphics/color.rb +27 -25
  26. data/lib/prawn/graphics/dash.rb +23 -11
  27. data/lib/prawn/graphics/join_style.rb +9 -3
  28. data/lib/prawn/graphics/patterns.rb +197 -67
  29. data/lib/prawn/graphics/transformation.rb +17 -8
  30. data/lib/prawn/graphics/transparency.rb +17 -13
  31. data/lib/prawn/grid.rb +48 -47
  32. data/lib/prawn/image_handler.rb +5 -5
  33. data/lib/prawn/images.rb +39 -30
  34. data/lib/prawn/images/image.rb +2 -1
  35. data/lib/prawn/images/jpg.rb +28 -22
  36. data/lib/prawn/images/png.rb +107 -66
  37. data/lib/prawn/measurement_extensions.rb +10 -9
  38. data/lib/prawn/measurements.rb +19 -15
  39. data/lib/prawn/outline.rb +97 -77
  40. data/lib/prawn/repeater.rb +14 -10
  41. data/lib/prawn/security.rb +81 -61
  42. data/lib/prawn/security/arcfour.rb +2 -2
  43. data/lib/prawn/soft_mask.rb +26 -26
  44. data/lib/prawn/stamp.rb +20 -13
  45. data/lib/prawn/text.rb +68 -52
  46. data/lib/prawn/text/box.rb +11 -8
  47. data/lib/prawn/text/formatted.rb +5 -5
  48. data/lib/prawn/text/formatted/arranger.rb +78 -49
  49. data/lib/prawn/text/formatted/box.rb +134 -100
  50. data/lib/prawn/text/formatted/fragment.rb +11 -14
  51. data/lib/prawn/text/formatted/line_wrap.rb +121 -63
  52. data/lib/prawn/text/formatted/parser.rb +139 -117
  53. data/lib/prawn/text/formatted/wrap.rb +43 -31
  54. data/lib/prawn/transformation_stack.rb +44 -0
  55. data/lib/prawn/utilities.rb +7 -22
  56. data/lib/prawn/version.rb +2 -2
  57. data/lib/prawn/view.rb +17 -7
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +31 -22
  60. data/manual/basic_concepts/creation.rb +10 -11
  61. data/manual/basic_concepts/cursor.rb +4 -5
  62. data/manual/basic_concepts/measurement.rb +6 -7
  63. data/manual/basic_concepts/origin.rb +5 -6
  64. data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
  65. data/manual/basic_concepts/view.rb +22 -16
  66. data/manual/bounding_box/bounding_box.rb +29 -24
  67. data/manual/bounding_box/bounds.rb +11 -12
  68. data/manual/bounding_box/canvas.rb +4 -5
  69. data/manual/bounding_box/creation.rb +6 -7
  70. data/manual/bounding_box/indentation.rb +14 -15
  71. data/manual/bounding_box/nesting.rb +24 -17
  72. data/manual/bounding_box/russian_boxes.rb +14 -13
  73. data/manual/bounding_box/stretchy.rb +12 -13
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -28
  76. data/manual/document_and_page_options/background.rb +11 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +25 -20
  78. data/manual/document_and_page_options/metadata.rb +18 -16
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -12
  81. data/manual/document_and_page_options/print_scaling.rb +17 -15
  82. data/manual/example_helper.rb +5 -4
  83. data/manual/graphics/blend_mode.rb +52 -0
  84. data/manual/graphics/circle_and_ellipse.rb +4 -5
  85. data/manual/graphics/color.rb +7 -9
  86. data/manual/graphics/common_lines.rb +7 -8
  87. data/manual/graphics/fill_and_stroke.rb +4 -5
  88. data/manual/graphics/fill_rules.rb +9 -10
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +48 -39
  91. data/manual/graphics/helper.rb +12 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +7 -8
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -7
  97. data/manual/graphics/scale.rb +14 -15
  98. data/manual/graphics/soft_masks.rb +4 -5
  99. data/manual/graphics/stroke_cap.rb +6 -7
  100. data/manual/graphics/stroke_dash.rb +11 -12
  101. data/manual/graphics/stroke_join.rb +5 -6
  102. data/manual/graphics/translate.rb +9 -10
  103. data/manual/graphics/transparency.rb +7 -8
  104. data/manual/how_to_read_this_manual.rb +6 -6
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +9 -10
  108. data/manual/images/images.rb +28 -24
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +13 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +5 -6
  114. data/manual/layout/content.rb +7 -8
  115. data/manual/layout/layout.rb +18 -16
  116. data/manual/layout/simple_grid.rb +6 -7
  117. data/manual/outline/add_subsection_to.rb +20 -21
  118. data/manual/outline/insert_section_after.rb +15 -16
  119. data/manual/outline/outline.rb +21 -17
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +21 -17
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +25 -19
  124. data/manual/repeatable_content/repeater.rb +14 -15
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +9 -10
  127. data/manual/security/permissions.rb +19 -14
  128. data/manual/security/security.rb +19 -16
  129. data/manual/table.rb +3 -3
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -11
  132. data/manual/text/column_box.rb +9 -10
  133. data/manual/text/fallback_fonts.rb +25 -21
  134. data/manual/text/font.rb +11 -12
  135. data/manual/text/font_size.rb +13 -14
  136. data/manual/text/font_style.rb +7 -8
  137. data/manual/text/formatted_callbacks.rb +25 -21
  138. data/manual/text/formatted_text.rb +33 -25
  139. data/manual/text/free_flowing_text.rb +20 -21
  140. data/manual/text/inline.rb +18 -19
  141. data/manual/text/kerning_and_character_spacing.rb +14 -15
  142. data/manual/text/leading.rb +7 -8
  143. data/manual/text/line_wrapping.rb +37 -18
  144. data/manual/text/paragraph_indentation.rb +13 -14
  145. data/manual/text/positioned_text.rb +15 -16
  146. data/manual/text/registering_families.rb +20 -21
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +26 -19
  149. data/manual/text/rotation.rb +28 -23
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +57 -52
  152. data/manual/text/text_box_excess.rb +20 -17
  153. data/manual/text/text_box_extensions.rb +18 -15
  154. data/manual/text/text_box_overflow.rb +18 -19
  155. data/manual/text/utf8.rb +11 -12
  156. data/manual/text/win_ansi_charset.rb +21 -19
  157. data/prawn.gemspec +45 -33
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +546 -0
  160. data/spec/prawn/document/column_box_spec.rb +75 -0
  161. data/spec/prawn/document/security_spec.rb +176 -0
  162. data/spec/prawn/document_annotations_spec.rb +76 -0
  163. data/spec/prawn/document_destinations_spec.rb +15 -0
  164. data/spec/prawn/document_grid_spec.rb +99 -0
  165. data/spec/prawn/document_reference_spec.rb +27 -0
  166. data/spec/prawn/document_span_spec.rb +36 -0
  167. data/spec/prawn/document_spec.rb +802 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +542 -0
  170. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  171. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  172. data/spec/prawn/graphics_spec.rb +837 -0
  173. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  174. data/spec/prawn/image_handler_spec.rb +53 -0
  175. data/spec/prawn/images/jpg_spec.rb +20 -0
  176. data/spec/prawn/images/png_spec.rb +283 -0
  177. data/spec/prawn/images_spec.rb +224 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +412 -0
  180. data/spec/prawn/repeater_spec.rb +165 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +172 -0
  183. data/spec/prawn/text/box_spec.rb +1112 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +846 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +494 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +149 -0
  190. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  191. data/spec/prawn/text_spacing_spec.rb +95 -0
  192. data/spec/prawn/text_spec.rb +603 -0
  193. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  194. data/spec/prawn/transformation_stack_spec.rb +66 -0
  195. data/spec/prawn/view_spec.rb +63 -0
  196. data/spec/prawn_manual_spec.rb +35 -0
  197. data/spec/spec_helper.rb +19 -23
  198. metadata +145 -185
  199. metadata.gz.sig +4 -0
  200. data/data/images/16bit.alpha +0 -0
  201. data/data/images/16bit.color +0 -0
  202. data/data/images/16bit.png +0 -0
  203. data/data/images/arrow.png +0 -0
  204. data/data/images/arrow2.png +0 -0
  205. data/data/images/dice.alpha +0 -0
  206. data/data/images/dice.color +0 -0
  207. data/data/images/dice.png +0 -0
  208. data/data/images/dice_interlaced.png +0 -0
  209. data/data/images/fractal.jpg +0 -0
  210. data/data/images/indexed_color.dat +0 -0
  211. data/data/images/indexed_color.png +0 -0
  212. data/data/images/letterhead.jpg +0 -0
  213. data/data/images/license.md +0 -8
  214. data/data/images/page_white_text.alpha +0 -0
  215. data/data/images/page_white_text.color +0 -0
  216. data/data/images/page_white_text.png +0 -0
  217. data/data/images/pal_bk.png +0 -0
  218. data/data/images/pigs.jpg +0 -0
  219. data/data/images/prawn.png +0 -0
  220. data/data/images/ruport.png +0 -0
  221. data/data/images/ruport_data.dat +0 -0
  222. data/data/images/ruport_transparent.png +0 -0
  223. data/data/images/ruport_type0.png +0 -0
  224. data/data/images/stef.jpg +0 -0
  225. data/data/images/tru256.bmp +0 -0
  226. data/data/images/web-links.dat +0 -1
  227. data/data/images/web-links.png +0 -0
  228. data/data/pdfs/complex_template.pdf +0 -0
  229. data/data/pdfs/contains_ttf_font.pdf +0 -0
  230. data/data/pdfs/encrypted.pdf +0 -0
  231. data/data/pdfs/form.pdf +1 -819
  232. data/data/pdfs/hexagon.pdf +0 -61
  233. data/data/pdfs/indirect_reference.pdf +0 -86
  234. data/data/pdfs/multipage_template.pdf +0 -127
  235. data/data/pdfs/nested_pages.pdf +0 -118
  236. data/data/pdfs/page_without_mediabox.pdf +0 -193
  237. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  238. data/data/pdfs/two_hexagons.pdf +0 -90
  239. data/data/pdfs/version_1_6.pdf +0 -61
  240. data/data/shift_jis_text.txt +0 -1
  241. data/spec/acceptance/png.rb +0 -24
  242. data/spec/annotations_spec.rb +0 -67
  243. data/spec/bounding_box_spec.rb +0 -501
  244. data/spec/column_box_spec.rb +0 -59
  245. data/spec/destinations_spec.rb +0 -13
  246. data/spec/document_spec.rb +0 -742
  247. data/spec/extensions/mocha.rb +0 -45
  248. data/spec/font_metric_cache_spec.rb +0 -52
  249. data/spec/font_spec.rb +0 -475
  250. data/spec/formatted_text_arranger_spec.rb +0 -423
  251. data/spec/formatted_text_box_spec.rb +0 -716
  252. data/spec/formatted_text_fragment_spec.rb +0 -299
  253. data/spec/graphics_spec.rb +0 -666
  254. data/spec/grid_spec.rb +0 -95
  255. data/spec/image_handler_spec.rb +0 -53
  256. data/spec/images_spec.rb +0 -167
  257. data/spec/inline_formatted_text_parser_spec.rb +0 -568
  258. data/spec/jpg_spec.rb +0 -23
  259. data/spec/line_wrap_spec.rb +0 -366
  260. data/spec/measurement_units_spec.rb +0 -22
  261. data/spec/outline_spec.rb +0 -409
  262. data/spec/png_spec.rb +0 -235
  263. data/spec/reference_spec.rb +0 -25
  264. data/spec/repeater_spec.rb +0 -154
  265. data/spec/security_spec.rb +0 -151
  266. data/spec/soft_mask_spec.rb +0 -78
  267. data/spec/span_spec.rb +0 -43
  268. data/spec/stamp_spec.rb +0 -179
  269. data/spec/stroke_styles_spec.rb +0 -208
  270. data/spec/text_at_spec.rb +0 -142
  271. data/spec/text_box_spec.rb +0 -1038
  272. data/spec/text_rendering_mode_spec.rb +0 -45
  273. data/spec/text_spacing_spec.rb +0 -93
  274. data/spec/text_spec.rb +0 -549
  275. data/spec/text_with_inline_formatting_spec.rb +0 -35
  276. data/spec/transparency_spec.rb +0 -91
  277. data/spec/view_spec.rb +0 -42
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # transformation.rb: Implements rotate, translate, skew, scale and a generic
4
4
  # transformation_matrix
5
5
  #
@@ -48,7 +48,8 @@ module Prawn
48
48
  if options[:origin].nil?
49
49
  transformation_matrix(cos, sin, -sin, cos, 0, 0, &block)
50
50
  else
51
- fail Prawn::Errors::BlockRequired unless block_given?
51
+ raise Prawn::Errors::BlockRequired unless block_given?
52
+
52
53
  x = options[:origin][0] + bounds.absolute_left
53
54
  y = options[:origin][1] + bounds.absolute_bottom
54
55
  x_prime = x * cos - y * sin
@@ -59,8 +60,8 @@ module Prawn
59
60
  end
60
61
  end
61
62
 
62
- # Translate the user space. If a block is not provided, then you must save
63
- # and restore the graphics state yourself.
63
+ # Translate the user space. If a block is not provided, then you must
64
+ # save and restore the graphics state yourself.
64
65
  #
65
66
  # Example without a block: move the text up and over 10
66
67
  #
@@ -117,7 +118,8 @@ module Prawn
117
118
  if options[:origin].nil?
118
119
  transformation_matrix(factor, 0, 0, factor, 0, 0, &block)
119
120
  else
120
- fail Prawn::Errors::BlockRequired unless block_given?
121
+ raise Prawn::Errors::BlockRequired unless block_given?
122
+
121
123
  x = options[:origin][0] + bounds.absolute_left
122
124
  y = options[:origin][1] + bounds.absolute_bottom
123
125
  x_prime = factor * x
@@ -142,9 +144,16 @@ module Prawn
142
144
  # Transform the user space (see notes for rotate regarding graphics state)
143
145
  # Generally, one would use the rotate, scale, translate, and skew
144
146
  # convenience methods instead of calling transformation_matrix directly
145
- def transformation_matrix(a, b, c, d, e, f)
146
- values = [a, b, c, d, e, f].map { |x| "%.5f" % x }.join(" ")
147
+ def transformation_matrix(*matrix)
148
+ if matrix.length != 6
149
+ raise ArgumentError,
150
+ 'Transformation matrix must have exacty 6 elements'
151
+ end
152
+ values = matrix.map { |x| x.to_f.round(5) }.join(' ')
147
153
  save_graphics_state if block_given?
154
+
155
+ add_to_transformation_stack(*matrix)
156
+
148
157
  renderer.add_content "#{values} cm"
149
158
  if block_given?
150
159
  yield
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # transparency.rb : Implements transparency
4
4
  #
5
5
  # Copyright October 2009, Daniel Nelson. All Rights Reserved.
@@ -51,14 +51,16 @@ module Prawn
51
51
  # pdf.fill_and_stroke_circle([x, y], 25)
52
52
  # end
53
53
  #
54
- def transparent(opacity, stroke_opacity = opacity, &block)
54
+ def transparent(opacity, stroke_opacity = opacity)
55
55
  renderer.min_version(1.4)
56
56
 
57
- opacity = [[opacity, 0.0].max, 1.0].min
57
+ opacity = [[opacity, 0.0].max, 1.0].min
58
58
  stroke_opacity = [[stroke_opacity, 0.0].max, 1.0].min
59
59
 
60
60
  save_graphics_state
61
- renderer.add_content "/#{opacity_dictionary_name(opacity, stroke_opacity)} gs"
61
+ renderer.add_content(
62
+ "/#{opacity_dictionary_name(opacity, stroke_opacity)} gs"
63
+ )
62
64
  yield
63
65
  restore_graphics_state
64
66
  end
@@ -77,21 +79,23 @@ module Prawn
77
79
  key = "#{opacity}_#{stroke_opacity}"
78
80
 
79
81
  if opacity_dictionary_registry[key]
80
- dictionary = opacity_dictionary_registry[key][:obj]
81
- dictionary_name = opacity_dictionary_registry[key][:name]
82
+ dictionary = opacity_dictionary_registry[key][:obj]
83
+ dictionary_name = opacity_dictionary_registry[key][:name]
82
84
  else
83
85
  dictionary = ref!(
84
- :Type => :ExtGState,
85
- :CA => stroke_opacity,
86
- :ca => opacity
86
+ Type: :ExtGState,
87
+ CA: stroke_opacity,
88
+ ca: opacity
87
89
  )
88
90
 
89
91
  dictionary_name = "Tr#{next_opacity_dictionary_id}"
90
- opacity_dictionary_registry[key] = { :name => dictionary_name,
91
- :obj => dictionary }
92
+ opacity_dictionary_registry[key] = {
93
+ name: dictionary_name,
94
+ obj: dictionary
95
+ }
92
96
  end
93
97
 
94
- page.ext_gstates.merge!(dictionary_name => dictionary)
98
+ page.ext_gstates[dictionary_name] = dictionary
95
99
  dictionary_name
96
100
  end
97
101
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  # grid.rb: Provides a basic grid layout system for Prawn
4
4
  #
@@ -33,21 +33,21 @@ module Prawn
33
33
  #
34
34
  def grid(*args)
35
35
  @boxes ||= {}
36
- return @boxes[args] if @boxes[args]
37
-
38
- if args.empty?
39
- @boxes[args] = @grid
40
- else
41
- g1, g2 = args
42
-
43
- if g1.class == Array && g2.class == Array && g1.length == 2 && g2.length == 2
44
- @boxes[args] = multi_box(single_box(*g1), single_box(*g2))
45
- else
46
- @boxes[args] = single_box(g1, g2)
36
+ @boxes[args] ||=
37
+ begin
38
+ if args.empty?
39
+ @grid
40
+ else
41
+ g1, g2 = args
42
+
43
+ if g1.is_a?(Array) && g2.is_a?(Array) &&
44
+ g1.length == 2 && g2.length == 2
45
+ multi_box(single_box(*g1), single_box(*g2))
46
+ else
47
+ single_box(g1, g2)
48
+ end
49
+ end
47
50
  end
48
- end
49
-
50
- @boxes[args]
51
51
  end
52
52
 
53
53
  # A Grid represents the entire grid system of a Page and calculates
@@ -57,13 +57,13 @@ module Prawn
57
57
  class Grid
58
58
  attr_reader :pdf, :columns, :rows, :gutter, :row_gutter, :column_gutter
59
59
  def initialize(pdf, options = {}) # :nodoc:
60
- valid_options = [:columns, :rows, :gutter, :row_gutter, :column_gutter]
60
+ valid_options = %i[columns rows gutter row_gutter column_gutter]
61
61
  Prawn.verify_options valid_options, options
62
62
 
63
63
  @pdf = pdf
64
64
  @columns = options[:columns]
65
65
  @rows = options[:rows]
66
- set_gutter(options)
66
+ apply_gutter(options)
67
67
  end
68
68
 
69
69
  # Calculates the base width of boxes.
@@ -77,10 +77,10 @@ module Prawn
77
77
  end
78
78
 
79
79
  # Diagnostic tool to show all of the grids. Defaults to gray.
80
- def show_all(color = "CCCCCC")
81
- self.rows.times do |i|
82
- self.columns.times do |j|
83
- pdf.grid(i, j).show(color)
80
+ def show_all(color = 'CCCCCC')
81
+ rows.times do |row|
82
+ columns.times do |column|
83
+ pdf.grid(row, column).show(color)
84
84
  end
85
85
  end
86
86
  end
@@ -91,12 +91,13 @@ module Prawn
91
91
  (total.to_f - (gutter * (num - 1).to_f)) / num.to_f
92
92
  end
93
93
 
94
- def set_gutter(options)
94
+ def apply_gutter(options)
95
95
  if options.key?(:gutter)
96
96
  @gutter = options[:gutter].to_f
97
- @row_gutter, @column_gutter = @gutter, @gutter
97
+ @row_gutter = @gutter
98
+ @column_gutter = @gutter
98
99
  else
99
- @row_gutter = options[:row_gutter].to_f
100
+ @row_gutter = options[:row_gutter].to_f
100
101
  @column_gutter = options[:column_gutter].to_f
101
102
  @gutter = 0
102
103
  end
@@ -111,17 +112,17 @@ module Prawn
111
112
  class GridBox
112
113
  attr_reader :pdf
113
114
 
114
- def initialize(pdf, i, j)
115
+ def initialize(pdf, rows, columns)
115
116
  @pdf = pdf
116
- @i = i
117
- @j = j
117
+ @rows = rows
118
+ @columns = columns
118
119
  end
119
120
 
120
121
  # Mostly diagnostic method that outputs the name of a box as
121
122
  # col_num, row_num
122
123
  #
123
124
  def name
124
- "#{@i.to_s},#{@j.to_s}"
125
+ "#{@rows},#{@columns}"
125
126
  end
126
127
 
127
128
  # :nodoc
@@ -146,7 +147,7 @@ module Prawn
146
147
 
147
148
  # x-coordinate of left side
148
149
  def left
149
- @left ||= (width + grid.column_gutter) * @j.to_f
150
+ @left ||= (width + grid.column_gutter) * @columns.to_f
150
151
  end
151
152
 
152
153
  # x-coordinate of right side
@@ -156,7 +157,7 @@ module Prawn
156
157
 
157
158
  # y-coordinate of the top
158
159
  def top
159
- @top ||= total_height - ((height + grid.row_gutter) * @i.to_f)
160
+ @top ||= total_height - ((height + grid.row_gutter) * @rows.to_f)
160
161
  end
161
162
 
162
163
  # y-coordinate of the bottom
@@ -186,16 +187,16 @@ module Prawn
186
187
 
187
188
  # Creates a standard bounding box based on the grid box.
188
189
  def bounding_box(&blk)
189
- pdf.bounding_box(top_left, :width => width, :height => height, &blk)
190
+ pdf.bounding_box(top_left, width: width, height: height, &blk)
190
191
  end
191
192
 
192
193
  # Diagnostic method
193
- def show(grid_color = "CCCCCC")
194
- self.bounding_box do
194
+ def show(grid_color = 'CCCCCC')
195
+ bounding_box do
195
196
  original_stroke_color = pdf.stroke_color
196
197
 
197
198
  pdf.stroke_color = grid_color
198
- pdf.text self.name
199
+ pdf.text name
199
200
  pdf.stroke_bounds
200
201
 
201
202
  pdf.stroke_color = original_stroke_color
@@ -213,17 +214,17 @@ module Prawn
213
214
  #
214
215
  # @group Experimental API
215
216
  class MultiBox < GridBox
216
- def initialize(pdf, b1, b2)
217
+ def initialize(pdf, box1, box2)
217
218
  @pdf = pdf
218
- @bs = [b1, b2]
219
+ @boxes = [box1, box2]
219
220
  end
220
221
 
221
222
  def name
222
- @bs.map(&:name).join(":")
223
+ @boxes.map(&:name).join(':')
223
224
  end
224
225
 
225
226
  def total_height
226
- @bs[0].total_height
227
+ @boxes[0].total_height
227
228
  end
228
229
 
229
230
  def width
@@ -235,7 +236,7 @@ module Prawn
235
236
  end
236
237
 
237
238
  def gutter
238
- @bs[0].gutter
239
+ @boxes[0].gutter
239
240
  end
240
241
 
241
242
  def left
@@ -257,30 +258,30 @@ module Prawn
257
258
  private
258
259
 
259
260
  def left_box
260
- @left_box ||= @bs.min { |a, b| a.left <=> b.left }
261
+ @left_box ||= @boxes.min_by(&:left)
261
262
  end
262
263
 
263
264
  def right_box
264
- @right_box ||= @bs.max { |a, b| a.right <=> b.right }
265
+ @right_box ||= @boxes.max_by(&:right)
265
266
  end
266
267
 
267
268
  def top_box
268
- @top_box ||= @bs.max { |a, b| a.top <=> b.top }
269
+ @top_box ||= @boxes.max_by(&:top)
269
270
  end
270
271
 
271
272
  def bottom_box
272
- @bottom_box ||= @bs.min { |a, b| a.bottom <=> b.bottom }
273
+ @bottom_box ||= @boxes.min_by(&:bottom)
273
274
  end
274
275
  end
275
276
 
276
277
  private
277
278
 
278
- def single_box(i, j)
279
- GridBox.new(self, i, j)
279
+ def single_box(rows, columns)
280
+ GridBox.new(self, rows, columns)
280
281
  end
281
282
 
282
- def multi_box(b1, b2)
283
- MultiBox.new(self, b1, b2)
283
+ def multi_box(box1, box2)
284
+ MultiBox.new(self, box1, box2)
284
285
  end
285
286
  end
286
287
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  # ImageHandler provides a way to register image processors with Prawn
4
4
  #
@@ -29,16 +29,16 @@ module Prawn
29
29
  end
30
30
 
31
31
  def unregister(handler)
32
- @handlers.reject!{ |h| h == handler }
32
+ @handlers.reject! { |h| h == handler }
33
33
  end
34
34
 
35
35
  def find(image_blob)
36
- handler = @handlers.find{ |h| h.can_render? image_blob }
36
+ handler = @handlers.find { |h| h.can_render? image_blob }
37
37
 
38
38
  return handler if handler
39
39
 
40
- fail Prawn::Errors::UnsupportedImageType,
41
- "image file is an unrecognised format"
40
+ raise Prawn::Errors::UnsupportedImageType,
41
+ 'image file is an unrecognised format'
42
42
  end
43
43
  end
44
44
  end
@@ -1,4 +1,7 @@
1
1
  # encoding: ASCII-8BIT
2
+
3
+ # frozen_string_literal: true
4
+
2
5
  # images.rb : Implements PDF image embedding
3
6
  #
4
7
  # Copyright April 2008, James Healy, Gregory Brown. All Rights Reserved.
@@ -17,16 +20,19 @@ module Prawn
17
20
  # images with alpha channels can be processor and memory intensive.)
18
21
  #
19
22
  # Arguments:
20
- # <tt>file</tt>:: path to file or an object that responds to #read and #rewind
23
+ # <tt>file</tt>:: path to file or an object that responds to #read and
24
+ # #rewind
21
25
  #
22
26
  # Options:
23
- # <tt>:at</tt>:: an array [x,y] with the location of the top left corner of the image.
27
+ # <tt>:at</tt>:: an array [x,y] with the location of the top left corner of
28
+ # the image.
24
29
  # <tt>:position</tt>:: One of (:left, :center, :right) or an x-offset
25
- # <tt>:vposition</tt>:: One of (:top, :center, :center) or an y-offset
30
+ # <tt>:vposition</tt>:: One of (:top, :center, :bottom) or an y-offset
26
31
  # <tt>:height</tt>:: the height of the image [actual height of the image]
27
32
  # <tt>:width</tt>:: the width of the image [actual width of the image]
28
33
  # <tt>:scale</tt>:: scale the dimensions of the image proportionally
29
- # <tt>:fit</tt>:: scale the dimensions of the image proportionally to fit inside [width,height]
34
+ # <tt>:fit</tt>:: scale the dimensions of the image proportionally to fit
35
+ # inside [width,height]
30
36
  #
31
37
  # Prawn::Document.generate("image2.pdf", :page_layout => :landscape) do
32
38
  # pigs = "#{Prawn::DATADIR}/images/pigs.jpg"
@@ -52,7 +58,7 @@ module Prawn
52
58
  # require "open-uri"
53
59
  #
54
60
  # Prawn::Document.generate("remote_images.pdf") do
55
- # image open("http://prawn.majesticseacreature.com/media/prawn_logo.png")
61
+ # image open("http://prawnpdf.org/media/prawn_logo.png")
56
62
  # end
57
63
  #
58
64
  # This method returns an image info object which can be used to check the
@@ -60,8 +66,10 @@ module Prawn
60
66
  # (See also: Prawn::Images::PNG , Prawn::Images::JPG)
61
67
  #
62
68
  def image(file, options = {})
63
- Prawn.verify_options [:at, :position, :vposition, :height,
64
- :width, :scale, :fit], options
69
+ Prawn.verify_options %i[
70
+ at position vposition height
71
+ width scale fit
72
+ ], options
65
73
 
66
74
  pdf_obj, info = build_image_object(file)
67
75
  embed_image(pdf_obj, info, options)
@@ -74,8 +82,7 @@ module Prawn
74
82
  #
75
83
  # @private
76
84
  def build_image_object(file)
77
- io = verify_and_open_image(file)
78
- image_content = io.read
85
+ image_content = verify_and_read_image(file)
79
86
  image_sha1 = Digest::SHA1.hexdigest(image_content)
80
87
 
81
88
  # if this image has already been embedded, just reuse it
@@ -87,11 +94,13 @@ module Prawn
87
94
  info = Prawn.image_handler.find(image_content).new(image_content)
88
95
 
89
96
  # Bump PDF version if the image requires it
90
- renderer.min_version(info.min_pdf_version) if info.respond_to?(:min_pdf_version)
97
+ if info.respond_to?(:min_pdf_version)
98
+ renderer.min_version(info.min_pdf_version)
99
+ end
91
100
 
92
101
  # Add the image to the PDF and register it in case we see it again.
93
102
  image_obj = info.build_pdf_object(self)
94
- image_registry[image_sha1] = { :obj => image_obj, :info => info }
103
+ image_registry[image_sha1] = { obj: image_obj, info: info }
95
104
  end
96
105
 
97
106
  [image_obj, info]
@@ -117,15 +126,15 @@ module Prawn
117
126
  # add a reference to the image object to the current page
118
127
  # resource list and give it a label
119
128
  label = "I#{next_image_id}"
120
- state.page.xobjects.merge!(label => pdf_obj)
129
+ state.page.xobjects[label] = pdf_obj
121
130
 
122
- cm_params = PDF::Core.real_params([ w, 0, 0, h, x, y - h])
131
+ cm_params = PDF::Core.real_params([w, 0, 0, h, x, y - h])
123
132
  renderer.add_content("\nq\n#{cm_params} cm\n/#{label} Do\nQ")
124
133
  end
125
134
 
126
135
  private
127
136
 
128
- def verify_and_open_image(io_or_path)
137
+ def verify_and_read_image(io_or_path)
129
138
  # File or IO
130
139
  if io_or_path.respond_to?(:rewind)
131
140
  io = io_or_path
@@ -135,54 +144,54 @@ module Prawn
135
144
  # read the file as binary so the size is calculated correctly
136
145
  # guard binmode because some objects acting io-like don't implement it
137
146
  io.binmode if io.respond_to?(:binmode)
138
- return io
147
+ return io.read
139
148
  end
140
149
  # String or Pathname
141
150
  io_or_path = Pathname.new(io_or_path)
142
- fail ArgumentError, "#{io_or_path} not found" unless io_or_path.file?
143
- io = io_or_path.open('rb')
144
- io
151
+ raise ArgumentError, "#{io_or_path} not found" unless io_or_path.file?
152
+
153
+ io_or_path.binread
145
154
  end
146
155
 
147
- def image_position(w, h, options)
156
+ def image_position(width, height, options)
148
157
  options[:position] ||= :left
149
158
 
150
159
  y = case options[:vposition]
151
160
  when :top
152
161
  bounds.absolute_top
153
162
  when :center
154
- bounds.absolute_top - (bounds.height - h) / 2.0
163
+ bounds.absolute_top - (bounds.height - height) / 2.0
155
164
  when :bottom
156
- bounds.absolute_bottom + h
165
+ bounds.absolute_bottom + height
157
166
  when Numeric
158
167
  bounds.absolute_top - options[:vposition]
159
168
  else
160
- determine_y_with_page_flow(h)
169
+ determine_y_with_page_flow(height)
161
170
  end
162
171
 
163
172
  x = case options[:position]
164
173
  when :left
165
174
  bounds.left_side
166
175
  when :center
167
- bounds.left_side + (bounds.width - w) / 2.0
176
+ bounds.left_side + (bounds.width - width) / 2.0
168
177
  when :right
169
- bounds.right_side - w
178
+ bounds.right_side - width
170
179
  when Numeric
171
180
  options[:position] + bounds.left_side
172
181
  end
173
182
 
174
- return [x, y]
183
+ [x, y]
175
184
  end
176
185
 
177
- def determine_y_with_page_flow(h)
178
- if overruns_page?(h)
186
+ def determine_y_with_page_flow(height)
187
+ if overruns_page?(height)
179
188
  bounds.move_past_bottom
180
189
  end
181
- self.y
190
+ y
182
191
  end
183
192
 
184
- def overruns_page?(h)
185
- (self.y - h) < reference_bounds.absolute_bottom
193
+ def overruns_page?(height)
194
+ (y - height) < reference_bounds.absolute_bottom
186
195
  end
187
196
 
188
197
  def image_registry