prawn 2.3.0 → 2.5.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 (203) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/prawn/document/bounding_box.rb +223 -143
  4. data/lib/prawn/document/column_box.rb +61 -26
  5. data/lib/prawn/document/internals.rb +25 -16
  6. data/lib/prawn/document/span.rb +21 -18
  7. data/lib/prawn/document.rb +273 -182
  8. data/lib/prawn/encoding.rb +2 -5
  9. data/lib/prawn/errors.rb +23 -34
  10. data/lib/prawn/font.rb +254 -139
  11. data/lib/prawn/font_metric_cache.rb +18 -16
  12. data/lib/prawn/fonts/afm.rb +99 -57
  13. data/lib/prawn/fonts/dfont.rb +7 -1
  14. data/lib/prawn/fonts/otf.rb +4 -1
  15. data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
  16. data/lib/prawn/fonts/ttc.rb +7 -2
  17. data/lib/prawn/fonts/ttf.rb +345 -107
  18. data/lib/prawn/fonts.rb +14 -0
  19. data/lib/prawn/graphics/blend_mode.rb +25 -28
  20. data/lib/prawn/graphics/cap_style.rb +9 -12
  21. data/lib/prawn/graphics/color.rb +75 -50
  22. data/lib/prawn/graphics/dash.rb +45 -42
  23. data/lib/prawn/graphics/join_style.rb +18 -12
  24. data/lib/prawn/graphics/patterns.rb +239 -110
  25. data/lib/prawn/graphics/transformation.rb +51 -44
  26. data/lib/prawn/graphics/transparency.rb +16 -40
  27. data/lib/prawn/graphics.rb +370 -260
  28. data/lib/prawn/grid.rb +219 -57
  29. data/lib/prawn/image_handler.rb +27 -10
  30. data/lib/prawn/images/image.rb +8 -10
  31. data/lib/prawn/images/jpg.rb +46 -20
  32. data/lib/prawn/images/png.rb +94 -42
  33. data/lib/prawn/images.rb +70 -81
  34. data/lib/prawn/measurement_extensions.rb +39 -8
  35. data/lib/prawn/measurements.rb +60 -5
  36. data/lib/prawn/outline.rb +120 -113
  37. data/lib/prawn/repeater.rb +52 -36
  38. data/lib/prawn/security/arcfour.rb +4 -4
  39. data/lib/prawn/security.rb +106 -98
  40. data/lib/prawn/soft_mask.rb +42 -30
  41. data/lib/prawn/stamp.rb +38 -42
  42. data/lib/prawn/text/box.rb +156 -105
  43. data/lib/prawn/text/formatted/arranger.rb +121 -41
  44. data/lib/prawn/text/formatted/box.rb +239 -163
  45. data/lib/prawn/text/formatted/fragment.rb +130 -14
  46. data/lib/prawn/text/formatted/line_wrap.rb +49 -38
  47. data/lib/prawn/text/formatted/parser.rb +116 -74
  48. data/lib/prawn/text/formatted/wrap.rb +25 -26
  49. data/lib/prawn/text/formatted.rb +75 -0
  50. data/lib/prawn/text.rb +456 -211
  51. data/lib/prawn/transformation_stack.rb +29 -10
  52. data/lib/prawn/utilities.rb +13 -13
  53. data/lib/prawn/version.rb +2 -1
  54. data/lib/prawn/view.rb +69 -54
  55. data/lib/prawn.rb +24 -18
  56. data.tar.gz.sig +0 -0
  57. metadata +55 -262
  58. metadata.gz.sig +3 -4
  59. data/.yardopts +0 -10
  60. data/Gemfile +0 -5
  61. data/Rakefile +0 -54
  62. data/manual/absolute_position.pdf +0 -0
  63. data/manual/basic_concepts/adding_pages.rb +0 -26
  64. data/manual/basic_concepts/basic_concepts.rb +0 -43
  65. data/manual/basic_concepts/creation.rb +0 -38
  66. data/manual/basic_concepts/cursor.rb +0 -32
  67. data/manual/basic_concepts/measurement.rb +0 -24
  68. data/manual/basic_concepts/origin.rb +0 -37
  69. data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
  70. data/manual/basic_concepts/view.rb +0 -48
  71. data/manual/bounding_box/bounding_box.rb +0 -41
  72. data/manual/bounding_box/bounds.rb +0 -48
  73. data/manual/bounding_box/canvas.rb +0 -23
  74. data/manual/bounding_box/creation.rb +0 -22
  75. data/manual/bounding_box/indentation.rb +0 -45
  76. data/manual/bounding_box/nesting.rb +0 -52
  77. data/manual/bounding_box/russian_boxes.rb +0 -40
  78. data/manual/bounding_box/stretchy.rb +0 -29
  79. data/manual/contents.rb +0 -35
  80. data/manual/cover.rb +0 -43
  81. data/manual/document_and_page_options/background.rb +0 -25
  82. data/manual/document_and_page_options/document_and_page_options.rb +0 -34
  83. data/manual/document_and_page_options/metadata.rb +0 -25
  84. data/manual/document_and_page_options/page_margins.rb +0 -36
  85. data/manual/document_and_page_options/page_size.rb +0 -34
  86. data/manual/document_and_page_options/print_scaling.rb +0 -22
  87. data/manual/example_helper.rb +0 -8
  88. data/manual/graphics/blend_mode.rb +0 -52
  89. data/manual/graphics/circle_and_ellipse.rb +0 -21
  90. data/manual/graphics/color.rb +0 -22
  91. data/manual/graphics/common_lines.rb +0 -29
  92. data/manual/graphics/fill_and_stroke.rb +0 -41
  93. data/manual/graphics/fill_rules.rb +0 -37
  94. data/manual/graphics/gradients.rb +0 -43
  95. data/manual/graphics/graphics.rb +0 -64
  96. data/manual/graphics/helper.rb +0 -27
  97. data/manual/graphics/line_width.rb +0 -36
  98. data/manual/graphics/lines_and_curves.rb +0 -40
  99. data/manual/graphics/polygon.rb +0 -27
  100. data/manual/graphics/rectangle.rb +0 -20
  101. data/manual/graphics/rotate.rb +0 -25
  102. data/manual/graphics/scale.rb +0 -42
  103. data/manual/graphics/soft_masks.rb +0 -44
  104. data/manual/graphics/stroke_cap.rb +0 -30
  105. data/manual/graphics/stroke_dash.rb +0 -47
  106. data/manual/graphics/stroke_join.rb +0 -29
  107. data/manual/graphics/translate.rb +0 -28
  108. data/manual/graphics/transparency.rb +0 -33
  109. data/manual/how_to_read_this_manual.rb +0 -39
  110. data/manual/images/absolute_position.rb +0 -22
  111. data/manual/images/fit.rb +0 -20
  112. data/manual/images/horizontal.rb +0 -24
  113. data/manual/images/images.rb +0 -41
  114. data/manual/images/plain_image.rb +0 -17
  115. data/manual/images/scale.rb +0 -21
  116. data/manual/images/vertical.rb +0 -27
  117. data/manual/images/width_and_height.rb +0 -24
  118. data/manual/layout/boxes.rb +0 -26
  119. data/manual/layout/content.rb +0 -24
  120. data/manual/layout/layout.rb +0 -27
  121. data/manual/layout/simple_grid.rb +0 -22
  122. data/manual/outline/add_subsection_to.rb +0 -60
  123. data/manual/outline/insert_section_after.rb +0 -46
  124. data/manual/outline/outline.rb +0 -33
  125. data/manual/outline/sections_and_pages.rb +0 -66
  126. data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
  127. data/manual/repeatable_content/page_numbering.rb +0 -55
  128. data/manual/repeatable_content/repeatable_content.rb +0 -35
  129. data/manual/repeatable_content/repeater.rb +0 -54
  130. data/manual/repeatable_content/stamp.rb +0 -40
  131. data/manual/security/encryption.rb +0 -28
  132. data/manual/security/permissions.rb +0 -41
  133. data/manual/security/security.rb +0 -28
  134. data/manual/table.rb +0 -16
  135. data/manual/text/alignment.rb +0 -43
  136. data/manual/text/color.rb +0 -24
  137. data/manual/text/column_box.rb +0 -30
  138. data/manual/text/fallback_fonts.rb +0 -41
  139. data/manual/text/font.rb +0 -40
  140. data/manual/text/font_size.rb +0 -44
  141. data/manual/text/font_style.rb +0 -22
  142. data/manual/text/formatted_callbacks.rb +0 -65
  143. data/manual/text/formatted_text.rb +0 -58
  144. data/manual/text/free_flowing_text.rb +0 -50
  145. data/manual/text/inline.rb +0 -40
  146. data/manual/text/kerning_and_character_spacing.rb +0 -38
  147. data/manual/text/leading.rb +0 -24
  148. data/manual/text/line_wrapping.rb +0 -60
  149. data/manual/text/paragraph_indentation.rb +0 -32
  150. data/manual/text/positioned_text.rb +0 -37
  151. data/manual/text/registering_families.rb +0 -51
  152. data/manual/text/rendering_and_color.rb +0 -36
  153. data/manual/text/right_to_left_text.rb +0 -54
  154. data/manual/text/rotation.rb +0 -47
  155. data/manual/text/single_usage.rb +0 -36
  156. data/manual/text/text.rb +0 -75
  157. data/manual/text/text_box_excess.rb +0 -35
  158. data/manual/text/text_box_extensions.rb +0 -48
  159. data/manual/text/text_box_overflow.rb +0 -49
  160. data/manual/text/utf8.rb +0 -27
  161. data/manual/text/win_ansi_charset.rb +0 -62
  162. data/prawn.gemspec +0 -57
  163. data/spec/data/curves.pdf +0 -66
  164. data/spec/extensions/encoding_helpers.rb +0 -11
  165. data/spec/prawn/document/bounding_box_spec.rb +0 -546
  166. data/spec/prawn/document/column_box_spec.rb +0 -75
  167. data/spec/prawn/document/security_spec.rb +0 -176
  168. data/spec/prawn/document_annotations_spec.rb +0 -76
  169. data/spec/prawn/document_destinations_spec.rb +0 -15
  170. data/spec/prawn/document_grid_spec.rb +0 -99
  171. data/spec/prawn/document_reference_spec.rb +0 -27
  172. data/spec/prawn/document_span_spec.rb +0 -36
  173. data/spec/prawn/document_spec.rb +0 -802
  174. data/spec/prawn/font_metric_cache_spec.rb +0 -54
  175. data/spec/prawn/font_spec.rb +0 -542
  176. data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
  177. data/spec/prawn/graphics/transparency_spec.rb +0 -81
  178. data/spec/prawn/graphics_spec.rb +0 -837
  179. data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
  180. data/spec/prawn/image_handler_spec.rb +0 -53
  181. data/spec/prawn/images/jpg_spec.rb +0 -20
  182. data/spec/prawn/images/png_spec.rb +0 -283
  183. data/spec/prawn/images_spec.rb +0 -224
  184. data/spec/prawn/measurements_extensions_spec.rb +0 -24
  185. data/spec/prawn/outline_spec.rb +0 -412
  186. data/spec/prawn/repeater_spec.rb +0 -165
  187. data/spec/prawn/soft_mask_spec.rb +0 -74
  188. data/spec/prawn/stamp_spec.rb +0 -172
  189. data/spec/prawn/text/box_spec.rb +0 -1112
  190. data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
  191. data/spec/prawn/text/formatted/box_spec.rb +0 -846
  192. data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
  193. data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -494
  194. data/spec/prawn/text/formatted/parser_spec.rb +0 -697
  195. data/spec/prawn/text_draw_text_spec.rb +0 -149
  196. data/spec/prawn/text_rendering_mode_spec.rb +0 -48
  197. data/spec/prawn/text_spacing_spec.rb +0 -95
  198. data/spec/prawn/text_spec.rb +0 -603
  199. data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
  200. data/spec/prawn/transformation_stack_spec.rb +0 -66
  201. data/spec/prawn/view_spec.rb +0 -63
  202. data/spec/prawn_manual_spec.rb +0 -35
  203. data/spec/spec_helper.rb +0 -48
data/lib/prawn/outline.rb CHANGED
@@ -1,33 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prawn
4
- class Document
4
+ class Document # rubocop: disable Style/Documentation
5
5
  # @group Stable API
6
6
 
7
7
  # Lazily instantiates a Prawn::Outline object for document. This is used as
8
8
  # point of entry to methods to build the outline tree for a document's table
9
9
  # of contents.
10
+ #
11
+ # @return [Prawn::Outline]
10
12
  def outline
11
13
  @outline ||= Outline.new(self)
12
14
  end
13
15
  end
14
16
 
15
- # The Outline class organizes the outline tree items for the document.
16
- # Note that the prev and parent instance variables are adjusted while
17
- # navigating through the nested blocks. These variables along with the
18
- # presence or absense of blocks are the primary means by which the relations
19
- # for the various OutlineItems and the OutlineRoot are set. Unfortunately, the
20
- # best way to understand how this works is to follow the method calls through
21
- # a real example.
22
- #
23
- # Some ideas for the organization of this class were gleaned from name_tree.
24
- # In particular the way in which the OutlineItems are finally rendered into
25
- # document objects in PdfObject through a hash.
17
+ # The Outline class organizes the outline tree items for the document. Note
18
+ # that the {prev} and {parent} are adjusted while navigating through the
19
+ # nested blocks. These attributes along with the presence or absence of blocks
20
+ # are the primary means by which the relations for the various
21
+ # `PDF::Core::OutlineItem`s and the `PDF::Core::OutlineRoot` are set.
26
22
  #
23
+ # Some ideas for the organization of this class were gleaned from `name_tree`.
24
+ # In particular the way in which the `PDF::Core::OutlineItem`s are finally
25
+ # rendered into document objects through a hash.
27
26
  class Outline
28
27
  # @private
29
28
  attr_accessor :parent, :prev, :document, :items
30
29
 
30
+ # @param document [Prawn::Document]
31
31
  def initialize(document)
32
32
  @document = document
33
33
  @parent = root
@@ -37,74 +37,81 @@ module Prawn
37
37
 
38
38
  # @group Stable API
39
39
 
40
- # Returns the current page number of the document
40
+ # Returns the current page number of the document.
41
+ #
42
+ # @return [Integer]
41
43
  def page_number
42
44
  @document.page_number
43
45
  end
44
46
 
45
47
  # Defines/Updates an outline for the document.
48
+ #
46
49
  # The outline is an optional nested index that appears on the side of a PDF
47
50
  # document usually with direct links to pages. The outline DSL is defined by
48
- # nested blocks involving two methods: section and page; see the
49
- # documentation on those methods for their arguments and options. Note that
50
- # one can also use outline#update to add more sections to the end of the
51
- # outline tree using the same syntax and scope.
51
+ # nested blocks involving two methods: {section} and {page}. Note that one
52
+ # can also use {update} to add more sections to the end of the outline tree
53
+ # using the same syntax and scope.
52
54
  #
53
55
  # The syntax is best illustrated with an example:
54
56
  #
55
- # Prawn::Document.generate(outlined_document.pdf) do
57
+ # ```ruby
58
+ # Prawn::Document.generate('outlined_document.pdf') do
56
59
  # text "Page 1. This is the first Chapter. "
57
60
  # start_new_page
58
61
  # text "Page 2. More in the first Chapter. "
59
62
  # start_new_page
60
63
  # outline.define do
61
- # section 'Chapter 1', :destination => 1, :closed => true do
62
- # page :destination => 1, :title => 'Page 1'
63
- # page :destination => 2, :title => 'Page 2'
64
+ # section 'Chapter 1', destination: 1, closed: true do
65
+ # page destination: 1, title: 'Page 1'
66
+ # page destination: 2, title: 'Page 2'
64
67
  # end
65
68
  # end
66
69
  # start_new_page do
67
70
  # outline.update do
68
- # section 'Chapter 2', :destination => 2, do
69
- # page :destination => 3, :title => 'Page 3'
71
+ # section 'Chapter 2', destination: 2, do
72
+ # page destination: 3, title: 'Page 3'
70
73
  # end
71
74
  # end
72
75
  # end
76
+ # ```
73
77
  #
78
+ # @yield
79
+ # @return [void]
74
80
  def define(&block)
75
81
  instance_eval(&block) if block
76
82
  end
77
83
 
78
84
  alias update define
79
85
 
80
- # Inserts an outline section to the outline tree (see outline#define).
81
- # Although you will probably choose to exclusively use outline#define so
82
- # that your outline tree is contained and easy to manage, this method gives
83
- # you the option to insert sections to the outline tree at any point during
84
- # document generation. This method allows you to add a child subsection to
85
- # any other item at any level in the outline tree. Currently the only way
86
- # to locate the place of entry is with the title for the item. If your title
87
- # names are not unique consider using define_outline.
88
- # The method takes the following arguments:
89
- # title: a string that must match an outline title to add
90
- # the subsection to
91
- # position: either :first or :last (the default) where the subsection will
92
- # be placed relative to other child elements. If you need to position
93
- # your subsection in between other elements then consider using
94
- # #insert_section_after
95
- # block: uses the same DSL syntax as outline#define, for example:
86
+ # Inserts an outline section to the outline tree (see {define}).
96
87
  #
97
- # Consider using this method inside of outline.update if you want to have
98
- # the outline object to be scoped as self (see #insert_section_after
99
- # example).
88
+ # Although you will probably choose to exclusively use {define} so that your
89
+ # outline tree is contained and easy to manage, this method gives you the
90
+ # option to insert sections to the outline tree at any point during document
91
+ # generation. This method allows you to add a child subsection to any other
92
+ # item at any level in the outline tree. Currently the only way to locate
93
+ # the place of entry is with the title for the item. If your title names are
94
+ # not unique consider using {define}.
100
95
  #
101
- # go_to_page 2
102
- # start_new_page
103
- # text "Inserted Page"
104
- # outline.add_subsection_to :title => 'Page 2', :first do
105
- # outline.page :destination => page_number, :title => "Inserted Page"
106
- # end
96
+ # Consider using this method instead of {update} if you want to have the
97
+ # outline object to be scoped as self (see {insert_section_after} example).
107
98
  #
99
+ # ```ruby
100
+ # go_to_page 2
101
+ # start_new_page
102
+ # text "Inserted Page"
103
+ # outline.add_subsection_to title: 'Page 2', :first do
104
+ # outline.page destination: page_number, title: "Inserted Page"
105
+ # end
106
+ # ```
107
+ #
108
+ # @param title [String] An outline title to add the subsection to.
109
+ # @param position [:first, :last] (:last)
110
+ # Where the subsection will be placed relative to other child elements. If
111
+ # you need to position your subsection in between other elements then
112
+ # consider using {insert_section_after}.
113
+ # @yield Uses the same DSL syntax as {define}
114
+ # @return [void]
108
115
  def add_subsection_to(title, position = :last, &block)
109
116
  @parent = items[title]
110
117
  unless @parent
@@ -116,19 +123,18 @@ module Prawn
116
123
  insert_section(nxt, &block)
117
124
  end
118
125
 
119
- # Inserts an outline section to the outline tree (see outline#define).
120
- # Although you will probably choose to exclusively use outline#define so
121
- # that your outline tree is contained and easy to manage, this method gives
122
- # you the option to insert sections to the outline tree at any point during
123
- # document generation. Unlike outline.add_section, this method allows you to
124
- # enter a section after any other item at any level in the outline tree.
126
+ # Inserts an outline section to the outline tree (see {define}).
127
+ #
128
+ # Although you will probably choose to exclusively use {define} so that your
129
+ # outline tree is contained and easy to manage, this method gives you the
130
+ # option to insert sections to the outline tree at any point during document
131
+ # generation. Unlike {add_subsection_to}, this method allows you to enter
132
+ # a section after any other item at any level in the outline tree.
125
133
  # Currently the only way to locate the place of entry is with the title for
126
134
  # the item. If your title names are not unique consider using
127
- # define_outline.
128
- # The method takes the following arguments:
129
- # title: the title of other section or page to insert new section after
130
- # block: uses the same DSL syntax as outline#define, for example:
135
+ # {define}.
131
136
  #
137
+ # @example
132
138
  # go_to_page 2
133
139
  # start_new_page
134
140
  # text "Inserted Page"
@@ -138,6 +144,10 @@ module Prawn
138
144
  # end
139
145
  # end
140
146
  #
147
+ # @param title [String]
148
+ # The title of other section or page to insert new section after.
149
+ # @yield Uses the same DSL syntax as {define}.
150
+ # @return [void]
141
151
  def insert_section_after(title, &block)
142
152
  @prev = items[title]
143
153
  unless @prev
@@ -149,67 +159,63 @@ module Prawn
149
159
  insert_section(nxt, &block)
150
160
  end
151
161
 
152
- # See outline#define above for documentation on how this is used in that
153
- # context
154
- #
155
- # Adds an outine section to the outline tree.
156
- # Although you will probably choose to exclusively use outline#define so
157
- # that your outline tree is contained and easy to manage, this method gives
158
- # you the option to add sections to the outline tree at any point during
159
- # document generation. When not being called from within another #section
160
- # block the section will be added at the top level after the other root
161
- # elements of the outline. For more flexible placement try using
162
- # outline#insert_section_after and/or outline#add_subsection_to
162
+ # Adds an outline section to the outline tree.
163
163
  #
164
- # Takes the following arguments:
165
- # title: the outline text that appears for the section.
166
- # options: destination - optional integer defining the page number for
167
- # a destination link to the top of the page (using a :FIT
168
- # destination).
169
- # - or an array with a custom destination (see the #dest_*
170
- # methods of the PDF::Destination module)
171
- # closed - whether the section should show its nested outline
172
- # elements.
173
- # - defaults to false.
174
- # block: more nested subsections and/or page blocks
164
+ # Although you will probably choose to exclusively use {define} so that your
165
+ # outline tree is contained and easy to manage, this method gives you the
166
+ # option to add sections to the outline tree at any point during document
167
+ # generation. When not being called from within another {section} block the
168
+ # section will be added at the top level after the other root elements of
169
+ # the outline. For more flexible placement try using {insert_section_after}
170
+ # and/or {add_subsection_to}.
175
171
  #
176
- # example usage:
177
- #
178
- # outline.section 'Added Section', :destination => 3 do
179
- # outline.page :destionation => 3, :title => 'Page 3'
172
+ # @example
173
+ # outline.section 'Added Section', destination: 3 do
174
+ # outline.page destionation: 3, title: 'Page 3'
180
175
  # end
176
+ #
177
+ # @param title [String] The outline text that appears for the section.
178
+ # @param options [Hash{Symbol => any}]
179
+ # @option options :destination [Integer, Array]
180
+ # - Optional page number for a destination link to the top of the page
181
+ # (using a `:FIT` destination).
182
+ # - An array with a custom destination (see the `#dest_*` methods of the
183
+ # `PDF::Core::Destination` module).
184
+ # @option options :closed [Boolean] (false)
185
+ # Whether the section should show its nested outline elements.
186
+ # @yield More nested subsections and/or page blocks.
187
+ # @return [void]
181
188
  def section(title, options = {}, &block)
182
189
  add_outline_item(title, options, &block)
183
190
  end
184
191
 
185
- # See Outline#define above for more documentation on how it is used in that
186
- # context
187
- #
188
192
  # Adds a page to the outline.
189
- # Although you will probably choose to exclusively use outline#define so
190
- # that your outline tree is contained and easy to manage, this method also
191
- # gives you the option to add pages to the root of outline tree at any point
192
- # during document generation. Note that the page will be added at the top
193
- # level after the other root outline elements. For more flexible placement
194
- # try using outline#insert_section_after and/or outline#add_subsection_to.
195
193
  #
196
- # Takes the following arguments:
197
- # options:
198
- # title - REQUIRED. The outline text that appears for the page.
199
- # destination - optional integer defining the page number for
200
- # a destination link to the top of the page (using a :FIT
201
- # destination).
202
- # or an array with a custom destination (see the dest_* methods
203
- # of the PDF::Destination module)
204
- # closed - whether the section should show its nested outline elements.
205
- # - defaults to false.
206
- # example usage:
194
+ # Although you will probably choose to exclusively use {define} so that your
195
+ # outline tree is contained and easy to manage, this method also gives you
196
+ # the option to add pages to the root of outline tree at any point during
197
+ # document generation. Note that the page will be added at the top level
198
+ # after the other root outline elements. For more flexible placement try
199
+ # using {insert_section_after} and/or {add_subsection_to}.
200
+ #
201
+ # @note This method is almost identical to {section} except that it does not
202
+ # accept a block thereby defining the outline item as a leaf on the
203
+ # outline tree structure.
207
204
  #
208
- # outline.page :title => "Very Last Page"
205
+ # @example
206
+ # outline.page title: "Very Last Page"
209
207
  #
210
- # Note: this method is almost identical to section except that it does not
211
- # accept a block thereby defining the outline item as a leaf on the outline
212
- # tree structure.
208
+ # @param options [Hash{Symbol => any}]
209
+ # @option options :title [String] REQUIRED.
210
+ # The outline text that appears for the page.
211
+ # @option options :destination [Integer, Array]
212
+ # - The page number for a destination link to the top of the page (using
213
+ # a `:FIT` destination).
214
+ # - An array with a custom destination (see the `#dest_*` methods of the
215
+ # `PDF::Core::Destination` module).
216
+ # @option options :closed [Boolean] (false)
217
+ # Whether the section should show its nested outline elements.
218
+ # @return [void]
213
219
  def page(options = {})
214
220
  if options[:title]
215
221
  title = options[:title]
@@ -264,11 +270,12 @@ module Prawn
264
270
  counting_parent = parent
265
271
  while counting_parent
266
272
  counting_parent.data.count += 1
267
- counting_parent = if counting_parent == root
268
- nil
269
- else
270
- counting_parent.data.parent
271
- end
273
+ counting_parent =
274
+ if counting_parent == root
275
+ nil
276
+ else
277
+ counting_parent.data.parent
278
+ end
272
279
  end
273
280
  end
274
281
 
@@ -1,19 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # repeater.rb : Implements repeated page elements.
4
- # Heavy inspired by repeating_element() in PDF::Wrapper
5
- # http://pdf-wrapper.rubyforge.org/
6
- #
7
- # Copyright November 2009, Gregory Brown. All Rights Reserved.
8
- #
9
- # This is free software. Please see the LICENSE and COPYING files for details.
10
-
11
3
  module Prawn
12
- class Document
4
+ class Document # rubocop: disable Style/Documentation
13
5
  # A list of all repeaters in the document.
14
- # See Document#repeat for details
6
+ # See {repeat} for details.
15
7
  #
16
8
  # @private
9
+ # @return [Array]
17
10
  def repeaters
18
11
  @repeaters ||= []
19
12
  end
@@ -21,60 +14,66 @@ module Prawn
21
14
  # @group Experimental API
22
15
 
23
16
  # Provides a way to execute a block of code repeatedly based on
24
- # a page_filter. Since Stamp is used under the hood, this method is very
17
+ # a `page_filter`. Since Stamp is used under the hood, this method is very
25
18
  # space efficient.
26
19
  #
27
- # Available page filters are:
28
- # :all -- repeats on every page
29
- # :odd -- repeats on odd pages
30
- # :even -- repeats on even pages
31
- # some_array -- repeats on every page listed in the array
32
- # some_range -- repeats on every page included in the range
33
- # some_lambda -- yields page number and repeats for true return values
34
- #
35
20
  # Also accepts an optional second argument for dynamic content which
36
21
  # executes the code in the context of the filtered pages without using
37
22
  # a Stamp.
38
23
  #
39
- # Example:
40
- #
41
- # Prawn::Document.generate("repeat.pdf", :skip_page_creation => true) do
42
- #
24
+ # @example
25
+ # Prawn::Document.generate("repeat.pdf", skip_page_creation: true) do
43
26
  # repeat :all do
44
- # draw_text "ALLLLLL", :at => bounds.top_left
27
+ # draw_text "ALLLLLL", at: bounds.top_left
45
28
  # end
46
29
  #
47
30
  # repeat :odd do
48
- # draw_text "ODD", :at => [0,0]
31
+ # draw_text "ODD", at: [0, 0]
49
32
  # end
50
33
  #
51
34
  # repeat :even do
52
- # draw_text "EVEN", :at => [0,0]
35
+ # draw_text "EVEN", at: [0, 0]
53
36
  # end
54
37
  #
55
- # repeat [1,2] do
56
- # draw_text "[1,2]", :at => [100,0]
38
+ # repeat [1, 2] do
39
+ # draw_text "[1, 2]", at: [100, 0]
57
40
  # end
58
41
  #
59
42
  # repeat 2..4 do
60
- # draw_text "2..4", :at => [200,0]
43
+ # draw_text "2..4", at: [200, 0]
61
44
  # end
62
45
  #
63
46
  # repeat(lambda { |pg| pg % 3 == 0 }) do
64
- # draw_text "Every third", :at => [250, 20]
47
+ # draw_text "Every third", at: [250, 20]
65
48
  # end
66
49
  #
67
50
  # 10.times do
68
51
  # start_new_page
69
- # draw_text "A wonderful page", :at => [400,400]
52
+ # draw_text "A wonderful page", at: [400, 400]
70
53
  # end
71
54
  #
72
- # repeat(:all, :dynamic => true) do
73
- # text page_number, :at => [500, 0]
55
+ # repeat(:all, dynamic: true) do
56
+ # text page_number, at: [500, 0]
74
57
  # end
75
- #
76
58
  # end
77
59
  #
60
+ # @param page_filter [:all, :odd, :even, Array<Integer>, Range, Proc]
61
+ # Pages to draw the repeater content on.
62
+ #
63
+ # Available page filters are:
64
+ #
65
+ # - `:all` -- repeats on every page.
66
+ # - `:odd` -- repeats on odd pages.
67
+ # - `:even` -- repeats on even pages.
68
+ # - Array of Integers -- repeats on every page listed in the array.
69
+ # - Range -- repeats on every page included in the range.
70
+ # - Proc -- yields page number and repeats for true return values.
71
+ # @param options [Hash]
72
+ # @option options :dynamic [Boolean] (false)
73
+ # A dynamic repeater executes block on every matched page. A static
74
+ # repeater uses {stamp} to prepare the content (runs the block once) and
75
+ # puts it on every matched page.
76
+ # @return [void]
78
77
  def repeat(page_filter, options = {}, &block)
79
78
  dynamic = options.fetch(:dynamic, false)
80
79
  repeaters << Prawn::Repeater.new(
@@ -83,10 +82,19 @@ module Prawn
83
82
  end
84
83
  end
85
84
 
86
- class Repeater #:nodoc:
85
+ # Repeater object.
86
+ #
87
+ # @private
88
+ class Repeater
87
89
  class << self
88
90
  attr_writer :count
89
91
 
92
+ # Repeater counter.
93
+ #
94
+ # It's not an exact number of repeaters but a counter used to generate
95
+ # unique repeater stamp names.
96
+ #
97
+ # @return [Integer]
90
98
  def count
91
99
  @count ||= 0
92
100
  end
@@ -106,16 +114,24 @@ module Prawn
106
114
  Repeater.count += 1
107
115
  end
108
116
 
117
+ # Should this repeater run on this page?
118
+ #
119
+ # @param page_number [Integer]
120
+ # @return [Boolean]
109
121
  def match?(page_number)
110
122
  @document.page_match?(@page_filter, page_number)
111
123
  end
112
124
 
125
+ # Run repeater.
126
+ #
127
+ # @param page_number [Integer]
128
+ # @return [void]
113
129
  def run(page_number)
114
130
  if !@dynamic
115
131
  @document.stamp(@stamp_name) if match?(page_number)
116
132
  elsif @block && match?(page_number)
117
133
  @document.save_graphics_state(@graphic_state) do
118
- @document.send(:freeze_stamp_graphics)
134
+ @document.__send__(:freeze_stamp_graphics)
119
135
  @block.call
120
136
  end
121
137
  end
@@ -6,10 +6,6 @@
6
6
  #
7
7
  # "RC4" is a trademark of RSA Data Security, Inc.
8
8
  #
9
- # Copyright August 2009, Brad Ediger. All Rights Reserved.
10
- #
11
- # This is free software. Please see the LICENSE and COPYING files for details.
12
-
13
9
  # @private
14
10
  class Arcfour
15
11
  def initialize(key)
@@ -38,6 +34,10 @@ class Arcfour
38
34
  @i = @j = 0
39
35
  end
40
36
 
37
+ # Encrypt string.
38
+ #
39
+ # @param string [String]
40
+ # @return [String]
41
41
  def encrypt(string)
42
42
  string.unpack('c*').map { |byte| byte ^ key_byte }.pack('c*')
43
43
  end