prawn 2.0.2 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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