prawn 2.1.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) 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 +9 -41
  7. data/lib/prawn.rb +37 -49
  8. data/lib/prawn/document.rb +193 -141
  9. data/lib/prawn/document/bounding_box.rb +50 -30
  10. data/lib/prawn/document/column_box.rb +7 -7
  11. data/lib/prawn/document/internals.rb +8 -6
  12. data/lib/prawn/document/span.rb +22 -16
  13. data/lib/prawn/encoding.rb +69 -68
  14. data/lib/prawn/errors.rb +12 -7
  15. data/lib/prawn/font.rb +104 -69
  16. data/lib/prawn/font_metric_cache.rb +20 -13
  17. data/lib/prawn/{font → fonts}/afm.rb +108 -72
  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 +126 -81
  22. data/lib/prawn/graphics.rb +119 -81
  23. data/lib/prawn/graphics/blend_mode.rb +9 -8
  24. data/lib/prawn/graphics/cap_style.rb +3 -3
  25. data/lib/prawn/graphics/color.rb +43 -39
  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 +204 -102
  29. data/lib/prawn/graphics/transformation.rb +15 -9
  30. data/lib/prawn/graphics/transparency.rb +17 -13
  31. data/lib/prawn/grid.rb +84 -48
  32. data/lib/prawn/image_handler.rb +5 -5
  33. data/lib/prawn/images.rb +60 -49
  34. data/lib/prawn/images/image.rb +2 -1
  35. data/lib/prawn/images/jpg.rb +31 -22
  36. data/lib/prawn/images/png.rb +67 -63
  37. data/lib/prawn/measurement_extensions.rb +10 -9
  38. data/lib/prawn/measurements.rb +19 -15
  39. data/lib/prawn/outline.rb +98 -77
  40. data/lib/prawn/repeater.rb +15 -11
  41. data/lib/prawn/security.rb +93 -70
  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 +76 -60
  46. data/lib/prawn/text/box.rb +18 -14
  47. data/lib/prawn/text/formatted.rb +5 -5
  48. data/lib/prawn/text/formatted/arranger.rb +80 -40
  49. data/lib/prawn/text/formatted/box.rb +140 -101
  50. data/lib/prawn/text/formatted/fragment.rb +11 -14
  51. data/lib/prawn/text/formatted/line_wrap.rb +128 -67
  52. data/lib/prawn/text/formatted/parser.rb +147 -123
  53. data/lib/prawn/text/formatted/wrap.rb +48 -32
  54. data/lib/prawn/transformation_stack.rb +7 -5
  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 +7 -8
  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 +7 -8
  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 +25 -18
  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 +15 -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 +18 -15
  82. data/manual/example_helper.rb +5 -4
  83. data/manual/graphics/blend_mode.rb +12 -9
  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 +5 -6
  88. data/manual/graphics/fill_rules.rb +10 -10
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +48 -40
  91. data/manual/graphics/helper.rb +19 -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 +3 -4
  99. data/manual/graphics/stroke_cap.rb +6 -7
  100. data/manual/graphics/stroke_dash.rb +15 -16
  101. data/manual/graphics/stroke_join.rb +5 -6
  102. data/manual/graphics/translate.rb +10 -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 +10 -11
  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 +16 -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 +21 -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 +10 -8
  137. data/manual/text/formatted_callbacks.rb +33 -24
  138. data/manual/text/formatted_text.rb +36 -25
  139. data/manual/text/free_flowing_text.rb +22 -23
  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 +12 -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 +33 -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 +20 -19
  155. data/manual/text/utf8.rb +11 -12
  156. data/manual/text/win_ansi_charset.rb +27 -25
  157. data/prawn.gemspec +41 -34
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +550 -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 +44 -0
  167. data/spec/prawn/document_spec.rb +805 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +544 -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 +872 -0
  173. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  174. data/spec/{image_handler_spec.rb → prawn/image_handler_spec.rb} +14 -14
  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 +229 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +512 -0
  180. data/spec/prawn/repeater_spec.rb +166 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +173 -0
  183. data/spec/prawn/text/box_spec.rb +1110 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +150 -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/{transformation_stack_spec.rb → prawn/transformation_stack_spec.rb} +22 -19
  195. data/spec/prawn/view_spec.rb +63 -0
  196. data/spec/prawn_manual_spec.rb +35 -0
  197. data/spec/spec_helper.rb +18 -19
  198. metadata +102 -222
  199. metadata.gz.sig +0 -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/blend_modes_bottom_layer.jpg +0 -0
  206. data/data/images/blend_modes_top_layer.jpg +0 -0
  207. data/data/images/dice.alpha +0 -0
  208. data/data/images/dice.color +0 -0
  209. data/data/images/dice.png +0 -0
  210. data/data/images/dice_interlaced.png +0 -0
  211. data/data/images/fractal.jpg +0 -0
  212. data/data/images/indexed_color.dat +0 -0
  213. data/data/images/indexed_color.png +0 -0
  214. data/data/images/indexed_transparency.png +0 -0
  215. data/data/images/indexed_transparency_alpha.dat +0 -0
  216. data/data/images/indexed_transparency_color.dat +0 -0
  217. data/data/images/letterhead.jpg +0 -0
  218. data/data/images/license.md +0 -8
  219. data/data/images/page_white_text.alpha +0 -0
  220. data/data/images/page_white_text.color +0 -0
  221. data/data/images/page_white_text.png +0 -0
  222. data/data/images/pigs.jpg +0 -0
  223. data/data/images/prawn.png +0 -0
  224. data/data/images/ruport.png +0 -0
  225. data/data/images/ruport_data.dat +0 -0
  226. data/data/images/ruport_transparent.png +0 -0
  227. data/data/images/ruport_type0.png +0 -0
  228. data/data/images/stef.jpg +0 -0
  229. data/data/images/tru256.bmp +0 -0
  230. data/data/images/web-links.dat +0 -1
  231. data/data/images/web-links.png +0 -0
  232. data/data/pdfs/complex_template.pdf +0 -0
  233. data/data/pdfs/contains_ttf_font.pdf +0 -0
  234. data/data/pdfs/encrypted.pdf +0 -0
  235. data/data/pdfs/form.pdf +1 -819
  236. data/data/pdfs/hexagon.pdf +0 -61
  237. data/data/pdfs/indirect_reference.pdf +0 -86
  238. data/data/pdfs/multipage_template.pdf +0 -127
  239. data/data/pdfs/nested_pages.pdf +0 -118
  240. data/data/pdfs/page_without_mediabox.pdf +0 -193
  241. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  242. data/data/pdfs/two_hexagons.pdf +0 -90
  243. data/data/pdfs/version_1_6.pdf +0 -61
  244. data/data/shift_jis_text.txt +0 -1
  245. data/spec/acceptance/png_spec.rb +0 -35
  246. data/spec/annotations_spec.rb +0 -67
  247. data/spec/blend_mode_spec.rb +0 -71
  248. data/spec/bounding_box_spec.rb +0 -501
  249. data/spec/column_box_spec.rb +0 -59
  250. data/spec/destinations_spec.rb +0 -13
  251. data/spec/document_spec.rb +0 -738
  252. data/spec/font_metric_cache_spec.rb +0 -52
  253. data/spec/font_spec.rb +0 -475
  254. data/spec/formatted_text_arranger_spec.rb +0 -452
  255. data/spec/formatted_text_box_spec.rb +0 -716
  256. data/spec/formatted_text_fragment_spec.rb +0 -299
  257. data/spec/graphics_spec.rb +0 -705
  258. data/spec/grid_spec.rb +0 -95
  259. data/spec/images_spec.rb +0 -167
  260. data/spec/inline_formatted_text_parser_spec.rb +0 -568
  261. data/spec/jpg_spec.rb +0 -23
  262. data/spec/line_wrap_spec.rb +0 -366
  263. data/spec/measurement_units_spec.rb +0 -22
  264. data/spec/outline_spec.rb +0 -409
  265. data/spec/png_spec.rb +0 -257
  266. data/spec/reference_spec.rb +0 -25
  267. data/spec/repeater_spec.rb +0 -154
  268. data/spec/security_spec.rb +0 -151
  269. data/spec/soft_mask_spec.rb +0 -78
  270. data/spec/span_spec.rb +0 -43
  271. data/spec/stamp_spec.rb +0 -179
  272. data/spec/stroke_styles_spec.rb +0 -208
  273. data/spec/text_at_spec.rb +0 -142
  274. data/spec/text_box_spec.rb +0 -1042
  275. data/spec/text_rendering_mode_spec.rb +0 -45
  276. data/spec/text_spacing_spec.rb +0 -93
  277. data/spec/text_spec.rb +0 -543
  278. data/spec/text_with_inline_formatting_spec.rb +0 -35
  279. data/spec/transparency_spec.rb +0 -91
  280. data/spec/view_spec.rb +0 -42
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  # wrap.rb: Handles text wrapping for for formatted text
4
4
  #
@@ -6,8 +6,8 @@
6
6
  #
7
7
  # This is free software. Please see the LICENSE and COPYING files for details.
8
8
 
9
- require_relative "line_wrap"
10
- require_relative "arranger"
9
+ require_relative 'line_wrap'
10
+ require_relative 'arranger'
11
11
 
12
12
  module Prawn
13
13
  module Text
@@ -15,10 +15,12 @@ module Prawn
15
15
  # @private
16
16
 
17
17
  module Wrap #:nodoc:
18
- def initialize(array, options)
18
+ def initialize(_array, options)
19
19
  @line_wrap = Prawn::Text::Formatted::LineWrap.new
20
- @arranger = Prawn::Text::Formatted::Arranger.new(@document,
21
- :kerning => options[:kerning])
20
+ @arranger = Prawn::Text::Formatted::Arranger.new(
21
+ @document,
22
+ kerning: options[:kerning]
23
+ )
22
24
  @disable_wrap_by_char = options[:disable_wrap_by_char]
23
25
  end
24
26
 
@@ -46,15 +48,17 @@ module Prawn
46
48
  initialize_wrap(array)
47
49
 
48
50
  stop = false
49
- while !stop
51
+ until stop
50
52
  # wrap before testing if enough height for this line because the
51
53
  # height of the highest fragment on this line will be used to
52
54
  # determine the line height
53
- @line_wrap.wrap_line(:document => @document,
54
- :kerning => @kerning,
55
- :width => available_width,
56
- :arranger => @arranger,
57
- :disable_wrap_by_char => @disable_wrap_by_char)
55
+ @line_wrap.wrap_line(
56
+ document: @document,
57
+ kerning: @kerning,
58
+ width: available_width,
59
+ arranger: @arranger,
60
+ disable_wrap_by_char: @disable_wrap_by_char
61
+ )
58
62
 
59
63
  if enough_height_for_this_line?
60
64
  move_baseline_down
@@ -78,30 +82,38 @@ module Prawn
78
82
  fragments_this_line = []
79
83
 
80
84
  word_spacing = word_spacing_for_this_line
81
- while fragment = @arranger.retrieve_fragment
85
+ @arranger.fragments.each do |fragment|
82
86
  fragment.word_spacing = word_spacing
83
87
  if fragment.text == "\n"
84
- printed_fragments << "\n" if @printed_lines.last == ""
88
+ printed_fragments << "\n" if @printed_lines.last == ''
85
89
  break
86
90
  end
87
91
  printed_fragments << fragment.text
88
92
  fragments_this_line << fragment
89
93
  end
94
+ @arranger.fragments.replace []
90
95
 
91
96
  accumulated_width = 0
92
97
  fragments_this_line.reverse! if @direction == :rtl
93
98
  fragments_this_line.each do |fragment_this_line|
94
99
  fragment_this_line.default_direction = @direction
95
- format_and_draw_fragment(fragment_this_line, accumulated_width,
96
- @line_wrap.width, word_spacing)
100
+ format_and_draw_fragment(
101
+ fragment_this_line,
102
+ accumulated_width,
103
+ @line_wrap.width,
104
+ word_spacing
105
+ )
97
106
  accumulated_width += fragment_this_line.width
98
107
  end
99
108
 
100
- @printed_lines << printed_fragments.map { |s| s.force_encoding(::Encoding::UTF_8) }.join
109
+ @printed_lines << printed_fragments.map do |s|
110
+ s.dup.force_encoding(::Encoding::UTF_8)
111
+ end.join
101
112
  end
102
113
 
103
114
  def word_spacing_for_this_line
104
- if @align == :justify && @line_wrap.space_count > 0 && !@line_wrap.paragraph_finished?
115
+ if @align == :justify && @line_wrap.space_count.positive? &&
116
+ !@line_wrap.paragraph_finished?
105
117
  (available_width - @line_wrap.width) / @line_wrap.space_count
106
118
  else
107
119
  0
@@ -110,13 +122,14 @@ module Prawn
110
122
 
111
123
  def enough_height_for_this_line?
112
124
  @line_height = @arranger.max_line_height
113
- @descender = @arranger.max_descender
114
- @ascender = @arranger.max_ascender
115
- if @baseline_y == 0
116
- diff = @ascender + @descender
117
- else
118
- diff = @descender + @line_height + @leading
119
- end
125
+ @descender = @arranger.max_descender
126
+ @ascender = @arranger.max_ascender
127
+ diff =
128
+ if @baseline_y.zero?
129
+ @ascender + @descender
130
+ else
131
+ @descender + @line_height + @leading
132
+ end
120
133
  require_relatived_total_height = @baseline_y.abs + diff
121
134
  if require_relatived_total_height > @height + 0.0001
122
135
  # no room for the full height of this line
@@ -133,20 +146,23 @@ module Prawn
133
146
 
134
147
  # these values will depend on the maximum value within a given line
135
148
  @line_height = 0
136
- @descender = 0
137
- @ascender = 0
138
- @baseline_y = 0
149
+ @descender = 0
150
+ @ascender = 0
151
+ @baseline_y = 0
139
152
 
140
153
  @printed_lines = []
141
154
  @nothing_printed = true
142
155
  @everything_printed = false
143
156
  end
144
157
 
145
- def format_and_draw_fragment(fragment, accumulated_width,
146
- line_width, word_spacing)
158
+ def format_and_draw_fragment(fragment, accumulated_width, line_width, word_spacing)
147
159
  @arranger.apply_color_and_font_settings(fragment) do
148
- draw_fragment(fragment, accumulated_width,
149
- line_width, word_spacing)
160
+ draw_fragment(
161
+ fragment,
162
+ accumulated_width,
163
+ line_width,
164
+ word_spacing
165
+ )
150
166
  end
151
167
  end
152
168
  end
@@ -1,14 +1,15 @@
1
- # encoding: utf-8
2
- #
3
- # transformation_stack.rb : Stores the transformations that have been applied to the document
1
+ # frozen_string_literal: true
2
+
3
+ # transformation_stack.rb : Stores the transformations that have been applied to
4
+ # the document
4
5
  #
5
6
  # Copyright 2015, Roger Nesbitt. All Rights Reserved.
6
7
  #
7
8
  # This is free software. Please see the LICENSE and COPYING files for details.
8
- #
9
9
 
10
10
  require 'matrix'
11
11
 
12
+ # rubocop: disable Metrics/ParameterLists, Naming/MethodParameterName
12
13
  module Prawn
13
14
  module TransformationStack
14
15
  def add_to_transformation_stack(a, b, c, d, e, f)
@@ -22,7 +23,7 @@ module Prawn
22
23
  end
23
24
 
24
25
  def restore_transformation_stack
25
- @transformation_stack.pop if @transformation_stack
26
+ @transformation_stack&.pop
26
27
  end
27
28
 
28
29
  def current_transformation_matrix_with_translation(x = 0, y = 0)
@@ -40,3 +41,4 @@ module Prawn
40
41
  end
41
42
  end
42
43
  end
44
+ # rubocop: enable Metrics/ParameterLists, Naming/MethodParameterName
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  # utilities.rb : General-purpose utility classes which don't fit anywhere else
4
4
  #
@@ -6,18 +6,18 @@
6
6
  #
7
7
  # This is free software. Please see the LICENSE and COPYING files for details.
8
8
 
9
- require 'thread'
10
-
11
9
  module Prawn
12
- # Throughout the Prawn codebase, repeated calculations which can benefit from caching are made
13
- # In some cases, caching and reusing results can not only save CPU cycles but also greatly
14
- # reduce memory requirements
10
+ # Throughout the Prawn codebase, repeated calculations which can benefit from
11
+ # caching are made.
12
+ # In some cases, caching and reusing results can not only save CPU cycles but
13
+ # also greatly reduce memory requirements
15
14
  # But at the same time, we don't want to throw away thread safety
16
15
  # We have two interchangeable thread-safe cache implementations:
17
16
 
18
17
  # @private
19
18
  class SynchronizedCache
20
- # As an optimization, this could access the hash directly on VMs with a global interpreter lock (like MRI)
19
+ # As an optimization, this could access the hash directly on VMs with
20
+ # a global interpreter lock (like MRI)
21
21
  def initialize
22
22
  @cache = {}
23
23
  @mutex = Mutex.new
@@ -31,19 +31,4 @@ module Prawn
31
31
  @mutex.synchronize { @cache[key] = value }
32
32
  end
33
33
  end
34
-
35
- # @private
36
- class ThreadLocalCache
37
- def initialize
38
- @cache_id = "cache_#{self.object_id}".to_sym
39
- end
40
-
41
- def [](key)
42
- (Thread.current[@cache_id] ||= {})[key]
43
- end
44
-
45
- def []=(key, value)
46
- (Thread.current[@cache_id] ||= {})[key] = value
47
- end
48
- end
49
34
  end
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Prawn
4
- VERSION = "2.1.0"
4
+ VERSION = '2.4.0'
5
5
  end
@@ -1,5 +1,5 @@
1
- # encoding: UTF-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # prawn/view.rb : Implements a mixin for Prawn's DSL
4
4
  #
5
5
  # This is free software. Please see the LICENSE and COPYING files for details.
@@ -11,6 +11,12 @@ module Prawn
11
11
  # class Greeter
12
12
  # include Prawn::View
13
13
  #
14
+ # # Optional override: allows you to set document options or even use
15
+ # # a custom document class
16
+ # def document
17
+ # @document ||= Prawn::Document.new(page_size: 'A4')
18
+ # end
19
+ #
14
20
  # def initialize(name)
15
21
  # @name = name
16
22
  # end
@@ -63,10 +69,14 @@ module Prawn
63
69
 
64
70
  # Delegates all unhandled calls to object returned by +document+ method.
65
71
  # (which is an instance of Prawn::Document by default)
66
- def method_missing(m, *a, &b)
67
- return super unless document.respond_to?(m)
72
+ def method_missing(method_name, *arguments, &block)
73
+ return super unless document.respond_to?(method_name)
74
+
75
+ document.public_send(method_name, *arguments, &block)
76
+ end
68
77
 
69
- document.send(m, *a, &b)
78
+ def respond_to_missing?(method_name, _include_all = false)
79
+ document.respond_to?(method_name) || super
70
80
  end
71
81
 
72
82
  # Syntactic sugar that uses +instance_eval+ under the hood to provide
@@ -77,8 +87,8 @@ module Prawn
77
87
  # say_goodbye
78
88
  # end
79
89
  #
80
- def update(&b)
81
- instance_eval(&b)
90
+ def update(&block)
91
+ instance_eval(&block)
82
92
  end
83
93
 
84
94
  # Syntatic sugar that calls +document.render_file+ under the hood.
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # A PDF document is a collection of pages. When we create a new document be it
4
4
  # with <code>Document.new</code> or on a <code>Document.generate</code> block
5
5
  # one initial page is created for us.
@@ -12,14 +12,13 @@
12
12
  #
13
13
  # Just use the <code>start_new_page</code> method and a shiny new page will be
14
14
  # created for you just like in the following snippet.
15
- #
16
- require File.expand_path(File.join(File.dirname(__FILE__),
17
- %w[.. example_helper]))
15
+
16
+ require_relative '../example_helper'
18
17
 
19
18
  filename = File.basename(__FILE__).gsub('.rb', '.pdf')
20
19
  Prawn::ManualBuilder::Example.generate(filename) do
21
- text "We are still on the initial page for this example. Now I'll ask " +
22
- "Prawn to gently start a new page. Please follow me to the next page."
20
+ text "We are still on the initial page for this example. Now I'll ask " \
21
+ 'Prawn to gently start a new page. Please follow me to the next page.'
23
22
 
24
23
  start_new_page
25
24
 
@@ -1,34 +1,43 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Examples for Prawn basic concepts.
4
4
  #
5
5
 
6
- require_relative "../example_helper"
6
+ require_relative '../example_helper'
7
7
 
8
- Prawn::ManualBuilder::Example.generate("basic_concepts.pdf", :page_size => "FOLIO") do
9
- package "basic_concepts" do |p|
10
- p.example "creation", :eval_source => false, :full_source => true
11
- p.example "origin"
12
- p.example "cursor"
13
- p.example "other_cursor_helpers"
14
- p.example "adding_pages"
15
- p.example "measurement"
16
- p.example "view", :eval_source => false, :full_source => true
8
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
9
+ Prawn::ManualBuilder::Example.generate(filename, page_size: 'FOLIO') do
10
+ package 'basic_concepts' do |p|
11
+ p.example 'creation', eval_source: false, full_source: true
12
+ p.example 'origin'
13
+ p.example 'cursor'
14
+ p.example 'other_cursor_helpers'
15
+ p.example 'adding_pages'
16
+ p.example 'measurement'
17
+ p.example 'view', eval_source: false, full_source: true
17
18
 
18
19
  p.intro do
19
- prose("This chapter covers the minimum amount of functionality you'll need to start using Prawn.
20
+ prose <<-TEXT
21
+ This chapter covers the minimum amount of functionality you'll need to
22
+ start using Prawn.
20
23
 
21
- If you are new to Prawn this is the first chapter to read. Once you are comfortable with the concepts shown here you might want to check the Basics section of the Graphics, Bounding Box and Text sections.
24
+ If you are new to Prawn this is the first chapter to read. Once you are
25
+ comfortable with the concepts shown here you might want to check the
26
+ Basics section of the Graphics, Bounding Box and Text sections.
22
27
 
23
- The examples show:")
28
+ The examples show:
29
+ TEXT
24
30
 
25
- list( "How to create new pdf documents in every possible way",
26
- "Where the origin for the document coordinates is. What are Bounding Boxes and how they interact with the origin",
27
- "How the cursor behaves",
28
- "How to start new pages",
29
- "What the base unit for measurement and coordinates is and how to use other convenient measures",
30
- "How to build custom view objects that use Prawn's DSL"
31
- )
31
+ list(
32
+ 'How to create new pdf documents in every possible way',
33
+ 'Where the origin for the document coordinates is. What are Bounding '\
34
+ 'Boxes and how they interact with the origin',
35
+ 'How the cursor behaves',
36
+ 'How to start new pages',
37
+ 'What the base unit for measurement and coordinates is and how to use '\
38
+ 'other convenient measures',
39
+ "How to build custom view objects that use Prawn's DSL"
40
+ )
32
41
  end
33
42
  end
34
43
  end
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # There are three ways to create a PDF Document in Prawn: creating a new
4
4
  # <code>Prawn::Document</code> instance, or using the
5
5
  # <code>Prawn::Document.generate</code> method with and without block arguments.
@@ -19,21 +19,20 @@
19
19
  # The generate method without block arguments requires
20
20
  # less typing and defines and renders the pdf document in one shot.
21
21
  # Almost all of the examples are coded this way.
22
- #
23
- require File.expand_path(File.join(File.dirname(__FILE__),
24
- %w[.. example_helper]))
22
+
23
+ require_relative '../example_helper'
25
24
 
26
25
  # Assignment
27
26
  pdf = Prawn::Document.new
28
- pdf.text "Hello World"
29
- pdf.render_file "assignment.pdf"
27
+ pdf.text 'Hello World'
28
+ pdf.render_file 'assignment.pdf'
30
29
 
31
30
  # Implicit Block
32
- Prawn::Document.generate("implicit.pdf") do
33
- text "Hello World"
31
+ Prawn::Document.generate('implicit.pdf') do
32
+ text 'Hello World'
34
33
  end
35
34
 
36
35
  # Explicit Block
37
- Prawn::Document.generate("explicit.pdf") do |pdf|
38
- pdf.text "Hello World"
36
+ Prawn::Document.generate('explicit.pdf') do |pdf|
37
+ pdf.text 'Hello World'
39
38
  end
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # We normally write our documents from top to bottom and it is no different with
4
4
  # Prawn. Even if the origin is on the bottom left corner we still fill the page
5
5
  # from the top to the bottom. In other words the cursor for inserting content
@@ -11,9 +11,8 @@
11
11
  # The following snippet shows how the cursor behaves when we add some text to
12
12
  # the page and demonstrates some of the helpers to manage the cursor position.
13
13
  # The <code>cursor</code> method returns the current cursor position.
14
- #
15
- require File.expand_path(File.join(File.dirname(__FILE__),
16
- %w[.. example_helper]))
14
+
15
+ require_relative '../example_helper'
17
16
 
18
17
  filename = File.basename(__FILE__).gsub('.rb', '.pdf')
19
18
  Prawn::ManualBuilder::Example.generate(filename) do
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # The base unit in Prawn is the PDF Point. One PDF Point is equal to 1/72 of
4
4
  # an inch.
5
5
  #
@@ -10,16 +10,15 @@
10
10
  # Just <code>require "prawn/measurement_extensions"</code> and it will mix some
11
11
  # helpers onto <code>Numeric</code> for converting common measurement units to
12
12
  # PDF Points.
13
- #
14
- require File.expand_path(File.join(File.dirname(__FILE__),
15
- %w[.. example_helper]))
13
+
14
+ require_relative '../example_helper'
16
15
 
17
16
  filename = File.basename(__FILE__).gsub('.rb', '.pdf')
18
17
  Prawn::ManualBuilder::Example.generate(filename) do
19
- require "prawn/measurement_extensions"
18
+ require 'prawn/measurement_extensions'
20
19
 
21
- [:mm, :cm, :dm, :m, :in, :yd, :ft].each do |measurement|
22
- text "1 #{measurement} in PDF Points: #{1.send(measurement)} pt"
20
+ %i[mm cm dm m in yd ft].each do |measurement|
21
+ text "1 #{measurement} in PDF Points: #{1.public_send(measurement)} pt"
23
22
  move_down 5.mm
24
23
  end
25
24
  end