prawn 0.13.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +10 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -16
  6. data/Rakefile +17 -39
  7. data/lib/prawn/document/bounding_box.rb +85 -42
  8. data/lib/prawn/document/column_box.rb +21 -11
  9. data/lib/prawn/document/internals.rb +40 -147
  10. data/lib/prawn/document/span.rb +25 -17
  11. data/lib/prawn/document.rb +286 -245
  12. data/lib/prawn/encoding.rb +68 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +204 -155
  15. data/lib/prawn/font_metric_cache.rb +25 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +7 -13
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +142 -80
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +6 -5
  23. data/lib/prawn/graphics/color.rb +47 -44
  24. data/lib/prawn/graphics/dash.rb +30 -13
  25. data/lib/prawn/graphics/join_style.rb +13 -6
  26. data/lib/prawn/graphics/patterns.rb +221 -90
  27. data/lib/prawn/graphics/transformation.rb +21 -12
  28. data/lib/prawn/graphics/transparency.rb +21 -17
  29. data/lib/prawn/graphics.rb +155 -128
  30. data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
  31. data/lib/prawn/image_handler.rb +16 -2
  32. data/lib/prawn/images/image.rb +4 -2
  33. data/lib/prawn/images/jpg.rb +39 -30
  34. data/lib/prawn/images/png.rb +132 -169
  35. data/lib/prawn/images.rb +70 -62
  36. data/lib/prawn/measurement_extensions.rb +15 -10
  37. data/lib/prawn/measurements.rb +22 -23
  38. data/lib/prawn/outline.rb +301 -13
  39. data/lib/prawn/repeater.rb +19 -17
  40. data/lib/prawn/security/arcfour.rb +54 -0
  41. data/lib/prawn/security.rb +108 -86
  42. data/lib/prawn/soft_mask.rb +40 -41
  43. data/lib/prawn/stamp.rb +29 -12
  44. data/lib/prawn/text/box.rb +27 -29
  45. data/lib/prawn/text/formatted/arranger.rb +110 -67
  46. data/lib/prawn/text/formatted/box.rb +233 -165
  47. data/lib/prawn/text/formatted/fragment.rb +27 -27
  48. data/lib/prawn/text/formatted/line_wrap.rb +137 -97
  49. data/lib/prawn/text/formatted/parser.rb +149 -127
  50. data/lib/prawn/text/formatted/wrap.rb +57 -37
  51. data/lib/prawn/text/formatted.rb +6 -4
  52. data/lib/prawn/text.rb +105 -73
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +11 -21
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +42 -68
  58. data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
  59. data/manual/basic_concepts/adding_pages.rb +9 -10
  60. data/manual/basic_concepts/basic_concepts.rb +33 -24
  61. data/manual/basic_concepts/creation.rb +10 -11
  62. data/manual/basic_concepts/cursor.rb +9 -10
  63. data/manual/basic_concepts/measurement.rb +10 -11
  64. data/manual/basic_concepts/origin.rb +8 -9
  65. data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
  66. data/manual/basic_concepts/view.rb +48 -0
  67. data/manual/bounding_box/bounding_box.rb +31 -29
  68. data/manual/bounding_box/bounds.rb +17 -18
  69. data/manual/bounding_box/canvas.rb +8 -9
  70. data/manual/bounding_box/creation.rb +8 -9
  71. data/manual/bounding_box/indentation.rb +22 -23
  72. data/manual/bounding_box/nesting.rb +32 -25
  73. data/manual/bounding_box/russian_boxes.rb +19 -19
  74. data/manual/bounding_box/stretchy.rb +18 -20
  75. data/manual/contents.rb +35 -0
  76. data/manual/cover.rb +43 -0
  77. data/manual/document_and_page_options/background.rb +16 -14
  78. data/manual/document_and_page_options/document_and_page_options.rb +26 -23
  79. data/manual/document_and_page_options/metadata.rb +21 -19
  80. data/manual/document_and_page_options/page_margins.rb +20 -22
  81. data/manual/document_and_page_options/page_size.rb +15 -15
  82. data/manual/document_and_page_options/print_scaling.rb +23 -0
  83. data/manual/example_helper.rb +5 -408
  84. data/manual/graphics/blend_mode.rb +52 -0
  85. data/manual/graphics/circle_and_ellipse.rb +8 -9
  86. data/manual/graphics/color.rb +11 -13
  87. data/manual/graphics/common_lines.rb +13 -12
  88. data/manual/graphics/fill_and_stroke.rb +10 -11
  89. data/manual/graphics/fill_rules.rb +13 -12
  90. data/manual/graphics/gradients.rb +28 -22
  91. data/manual/graphics/graphics.rb +52 -46
  92. data/manual/graphics/helper.rb +20 -10
  93. data/manual/graphics/line_width.rb +13 -12
  94. data/manual/graphics/lines_and_curves.rb +13 -14
  95. data/manual/graphics/polygon.rb +10 -12
  96. data/manual/graphics/rectangle.rb +7 -8
  97. data/manual/graphics/rotate.rb +9 -12
  98. data/manual/graphics/scale.rb +19 -18
  99. data/manual/graphics/soft_masks.rb +5 -7
  100. data/manual/graphics/stroke_cap.rb +10 -11
  101. data/manual/graphics/stroke_dash.rb +16 -17
  102. data/manual/graphics/stroke_join.rb +10 -11
  103. data/manual/graphics/translate.rb +13 -13
  104. data/manual/graphics/transparency.rb +11 -13
  105. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
  106. data/manual/images/absolute_position.rb +9 -10
  107. data/manual/images/fit.rb +9 -10
  108. data/manual/images/horizontal.rb +13 -14
  109. data/manual/images/images.rb +31 -30
  110. data/manual/images/plain_image.rb +6 -7
  111. data/manual/images/scale.rb +12 -13
  112. data/manual/images/vertical.rb +19 -17
  113. data/manual/images/width_and_height.rb +13 -14
  114. data/manual/layout/boxes.rb +14 -15
  115. data/manual/layout/content.rb +12 -13
  116. data/manual/layout/layout.rb +19 -20
  117. data/manual/layout/simple_grid.rb +8 -9
  118. data/manual/outline/add_subsection_to.rb +26 -27
  119. data/manual/outline/insert_section_after.rb +19 -20
  120. data/manual/outline/outline.rb +23 -22
  121. data/manual/outline/sections_and_pages.rb +24 -25
  122. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  123. data/manual/repeatable_content/page_numbering.rb +20 -19
  124. data/manual/repeatable_content/repeatable_content.rb +26 -22
  125. data/manual/repeatable_content/repeater.rb +18 -19
  126. data/manual/repeatable_content/stamp.rb +18 -19
  127. data/manual/security/encryption.rb +8 -11
  128. data/manual/security/permissions.rb +20 -15
  129. data/manual/security/security.rb +20 -20
  130. data/manual/table.rb +16 -0
  131. data/manual/text/alignment.rb +17 -18
  132. data/manual/text/color.rb +13 -13
  133. data/manual/text/column_box.rb +10 -12
  134. data/manual/text/fallback_fonts.rb +29 -25
  135. data/manual/text/font.rb +17 -18
  136. data/manual/text/font_size.rb +21 -22
  137. data/manual/text/font_style.rb +12 -10
  138. data/manual/text/formatted_callbacks.rb +36 -26
  139. data/manual/text/formatted_text.rb +41 -34
  140. data/manual/text/free_flowing_text.rb +28 -29
  141. data/manual/text/inline.rb +23 -26
  142. data/manual/text/kerning_and_character_spacing.rb +20 -21
  143. data/manual/text/leading.rb +10 -11
  144. data/manual/text/line_wrapping.rb +40 -21
  145. data/manual/text/paragraph_indentation.rb +17 -12
  146. data/manual/text/positioned_text.rb +19 -20
  147. data/manual/text/registering_families.rb +33 -30
  148. data/manual/text/rendering_and_color.rb +11 -12
  149. data/manual/text/right_to_left_text.rb +31 -20
  150. data/manual/text/rotation.rb +36 -27
  151. data/manual/text/single_usage.rb +13 -14
  152. data/manual/text/text.rb +62 -62
  153. data/manual/text/text_box_excess.rb +22 -19
  154. data/manual/text/text_box_extensions.rb +21 -18
  155. data/manual/text/text_box_overflow.rb +28 -21
  156. data/manual/text/utf8.rb +16 -17
  157. data/manual/text/win_ansi_charset.rb +29 -26
  158. data/prawn.gemspec +45 -43
  159. data/spec/extensions/encoding_helpers.rb +4 -3
  160. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  161. data/spec/prawn/document/column_box_spec.rb +75 -0
  162. data/spec/prawn/document/security_spec.rb +176 -0
  163. data/spec/prawn/document_annotations_spec.rb +76 -0
  164. data/spec/prawn/document_destinations_spec.rb +15 -0
  165. data/spec/prawn/document_grid_spec.rb +99 -0
  166. data/spec/prawn/document_reference_spec.rb +27 -0
  167. data/spec/prawn/document_span_spec.rb +44 -0
  168. data/spec/prawn/document_spec.rb +805 -0
  169. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  170. data/spec/prawn/font_spec.rb +544 -0
  171. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  172. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  173. data/spec/prawn/graphics_spec.rb +872 -0
  174. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  175. data/spec/prawn/image_handler_spec.rb +53 -0
  176. data/spec/prawn/images/jpg_spec.rb +20 -0
  177. data/spec/prawn/images/png_spec.rb +283 -0
  178. data/spec/prawn/images_spec.rb +229 -0
  179. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  180. data/spec/prawn/outline_spec.rb +512 -0
  181. data/spec/prawn/repeater_spec.rb +166 -0
  182. data/spec/prawn/soft_mask_spec.rb +74 -0
  183. data/spec/prawn/stamp_spec.rb +173 -0
  184. data/spec/prawn/text/box_spec.rb +1110 -0
  185. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  186. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  187. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  188. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  189. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  190. data/spec/prawn/text_draw_text_spec.rb +150 -0
  191. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  192. data/spec/prawn/text_spacing_spec.rb +95 -0
  193. data/spec/prawn/text_spec.rb +603 -0
  194. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  195. data/spec/prawn/transformation_stack_spec.rb +66 -0
  196. data/spec/prawn/view_spec.rb +63 -0
  197. data/spec/prawn_manual_spec.rb +35 -0
  198. data/spec/spec_helper.rb +22 -21
  199. data.tar.gz.sig +0 -0
  200. metadata +168 -307
  201. metadata.gz.sig +0 -0
  202. data/README.md +0 -109
  203. data/data/encodings/win_ansi.txt +0 -29
  204. data/data/images/16bit.alpha +0 -0
  205. data/data/images/16bit.dat +0 -0
  206. data/data/images/16bit.png +0 -0
  207. data/data/images/arrow.png +0 -0
  208. data/data/images/arrow2.png +0 -0
  209. data/data/images/barcode_issue.png +0 -0
  210. data/data/images/dice.alpha +0 -0
  211. data/data/images/dice.dat +0 -0
  212. data/data/images/dice.png +0 -0
  213. data/data/images/dice_interlaced.png +0 -0
  214. data/data/images/indexed_color.dat +0 -0
  215. data/data/images/indexed_color.png +0 -0
  216. data/data/images/letterhead.jpg +0 -0
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.dat +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/lib/pdf/core/annotations.rb +0 -60
  244. data/lib/pdf/core/byte_string.rb +0 -9
  245. data/lib/pdf/core/destinations.rb +0 -90
  246. data/lib/pdf/core/document_state.rb +0 -78
  247. data/lib/pdf/core/filter_list.rb +0 -51
  248. data/lib/pdf/core/filters.rb +0 -36
  249. data/lib/pdf/core/graphics_state.rb +0 -68
  250. data/lib/pdf/core/literal_string.rb +0 -16
  251. data/lib/pdf/core/name_tree.rb +0 -177
  252. data/lib/pdf/core/object_store.rb +0 -320
  253. data/lib/pdf/core/outline.rb +0 -315
  254. data/lib/pdf/core/page.rb +0 -212
  255. data/lib/pdf/core/page_geometry.rb +0 -126
  256. data/lib/pdf/core/pdf_object.rb +0 -124
  257. data/lib/pdf/core/reference.rb +0 -103
  258. data/lib/pdf/core/stream.rb +0 -98
  259. data/lib/pdf/core/text.rb +0 -275
  260. data/lib/pdf/core.rb +0 -35
  261. data/lib/prawn/compatibility.rb +0 -91
  262. data/lib/prawn/document/graphics_state.rb +0 -73
  263. data/lib/prawn/document/snapshot.rb +0 -89
  264. data/lib/prawn/font/afm.rb +0 -203
  265. data/lib/prawn/layout.rb +0 -20
  266. data/lib/prawn/table/cell/image.rb +0 -70
  267. data/lib/prawn/table/cell/in_table.rb +0 -27
  268. data/lib/prawn/table/cell/span_dummy.rb +0 -92
  269. data/lib/prawn/table/cell/subtable.rb +0 -65
  270. data/lib/prawn/table/cell/text.rb +0 -153
  271. data/lib/prawn/table/cell.rb +0 -770
  272. data/lib/prawn/table/cells.rb +0 -295
  273. data/lib/prawn/table.rb +0 -643
  274. data/manual/example_file.rb +0 -116
  275. data/manual/example_package.rb +0 -53
  276. data/manual/example_section.rb +0 -46
  277. data/manual/manual/cover.rb +0 -35
  278. data/manual/manual/foreword.rb +0 -85
  279. data/manual/manual/manual.rb +0 -35
  280. data/manual/syntax_highlight.rb +0 -52
  281. data/manual/table/basic_block.rb +0 -53
  282. data/manual/table/before_rendering_page.rb +0 -26
  283. data/manual/table/cell_border_lines.rb +0 -24
  284. data/manual/table/cell_borders_and_bg.rb +0 -31
  285. data/manual/table/cell_dimensions.rb +0 -30
  286. data/manual/table/cell_text.rb +0 -38
  287. data/manual/table/column_widths.rb +0 -30
  288. data/manual/table/content_and_subtables.rb +0 -39
  289. data/manual/table/creation.rb +0 -27
  290. data/manual/table/filtering.rb +0 -36
  291. data/manual/table/flow_and_header.rb +0 -17
  292. data/manual/table/image_cells.rb +0 -33
  293. data/manual/table/position.rb +0 -29
  294. data/manual/table/row_colors.rb +0 -20
  295. data/manual/table/span.rb +0 -30
  296. data/manual/table/style.rb +0 -22
  297. data/manual/table/table.rb +0 -52
  298. data/manual/table/width.rb +0 -27
  299. data/manual/templates/full_template.rb +0 -25
  300. data/manual/templates/page_template.rb +0 -48
  301. data/manual/templates/templates.rb +0 -27
  302. data/manual/text/group.rb +0 -29
  303. data/spec/acceptance/png.rb +0 -23
  304. data/spec/annotations_spec.rb +0 -74
  305. data/spec/bounding_box_spec.rb +0 -493
  306. data/spec/cell_spec.rb +0 -628
  307. data/spec/column_box_spec.rb +0 -33
  308. data/spec/destinations_spec.rb +0 -15
  309. data/spec/document_spec.rb +0 -761
  310. data/spec/extensions/mocha.rb +0 -44
  311. data/spec/filters_spec.rb +0 -34
  312. data/spec/font_metric_cache_spec.rb +0 -52
  313. data/spec/font_spec.rb +0 -464
  314. data/spec/formatted_text_arranger_spec.rb +0 -421
  315. data/spec/formatted_text_box_spec.rb +0 -650
  316. data/spec/formatted_text_fragment_spec.rb +0 -298
  317. data/spec/graphics_spec.rb +0 -651
  318. data/spec/grid_spec.rb +0 -85
  319. data/spec/image_handler_spec.rb +0 -42
  320. data/spec/images_spec.rb +0 -157
  321. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  322. data/spec/jpg_spec.rb +0 -25
  323. data/spec/line_wrap_spec.rb +0 -333
  324. data/spec/measurement_units_spec.rb +0 -23
  325. data/spec/name_tree_spec.rb +0 -112
  326. data/spec/object_store_spec.rb +0 -170
  327. data/spec/outline_spec.rb +0 -448
  328. data/spec/pdf_object_spec.rb +0 -172
  329. data/spec/png_spec.rb +0 -240
  330. data/spec/reference_spec.rb +0 -82
  331. data/spec/repeater_spec.rb +0 -158
  332. data/spec/security_spec.rb +0 -158
  333. data/spec/snapshot_spec.rb +0 -186
  334. data/spec/soft_mask_spec.rb +0 -117
  335. data/spec/span_spec.rb +0 -44
  336. data/spec/stamp_spec.rb +0 -158
  337. data/spec/stream_spec.rb +0 -58
  338. data/spec/stroke_styles_spec.rb +0 -211
  339. data/spec/table/span_dummy_spec.rb +0 -17
  340. data/spec/table_spec.rb +0 -1355
  341. data/spec/template_spec.rb +0 -351
  342. data/spec/text_at_spec.rb +0 -130
  343. data/spec/text_box_spec.rb +0 -1030
  344. data/spec/text_rendering_mode_spec.rb +0 -45
  345. data/spec/text_spacing_spec.rb +0 -93
  346. data/spec/text_spec.rb +0 -425
  347. data/spec/text_with_inline_formatting_spec.rb +0 -35
  348. data/spec/transparency_spec.rb +0 -89
@@ -1,46 +1,51 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  # measurement_extensions.rb: Core extensions for Prawn::Measurements
3
4
  #
4
5
  # Copyright December 2008, Florian Witteler. All Rights Reserved.
5
6
  #
6
7
  # This is free software. Please see the LICENSE and COPYING files for details.
7
8
 
8
- require 'prawn/measurements'
9
+ require_relative 'measurements'
10
+
11
+ # @group Stable API
9
12
 
10
13
  class Numeric
11
14
  include Prawn::Measurements
12
15
  # prawns' basic unit is PostScript-Point
13
16
  # 72 points per inch
14
17
 
18
+ # @group Experimental API
19
+
15
20
  def mm
16
- return mm2pt(self)
21
+ mm2pt(self)
17
22
  end
18
23
 
19
24
  def cm
20
- return cm2pt(self)
25
+ cm2pt(self)
21
26
  end
22
27
 
23
28
  def dm
24
- return dm2pt(self)
29
+ dm2pt(self)
25
30
  end
26
31
 
27
32
  def m
28
- return m2pt(self)
33
+ m2pt(self)
29
34
  end
30
35
 
31
36
  def in
32
- return in2pt(self)
37
+ in2pt(self)
33
38
  end
34
39
 
35
40
  def yd
36
- return yd2pt(self)
41
+ yd2pt(self)
37
42
  end
38
43
 
39
44
  def ft
40
- return ft2pt(self)
45
+ ft2pt(self)
41
46
  end
42
47
 
43
48
  def pt
44
- return pt2pt(self)
49
+ pt2pt(self)
45
50
  end
46
51
  end
@@ -1,75 +1,74 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  # measurements.rb: Conversions from other measurements to PDF points
3
4
  #
4
5
  # Copyright December 2008, Florian Witteler. All Rights Reserved.
5
6
  #
7
+
8
+ # rubocop: disable Naming/MethodParameterName
6
9
  module Prawn
7
- module Measurements
10
+ # @group Stable API
8
11
 
9
- # ============================================================================
10
- #metric conversions
12
+ module Measurements
13
+ # metric conversions
11
14
  def cm2mm(cm)
12
- return cm*10
15
+ cm * 10
13
16
  end
14
17
 
15
18
  def dm2mm(dm)
16
- return dm*100
19
+ dm * 100
17
20
  end
18
21
 
19
22
  def m2mm(m)
20
- return m*1000
23
+ m * 1000
21
24
  end
22
25
 
23
- # ============================================================================
24
26
  # imperial conversions
25
27
  # from http://en.wikipedia.org/wiki/Imperial_units
26
-
27
28
  def ft2in(ft)
28
- return ft * 12
29
+ ft * 12
29
30
  end
30
31
 
31
32
  def yd2in(yd)
32
- return yd*36
33
+ yd * 36
33
34
  end
34
35
 
35
-
36
- # ============================================================================
37
36
  # PostscriptPoint-converisons
38
-
39
37
  def pt2pt(pt)
40
- return pt
38
+ pt
41
39
  end
42
40
 
43
41
  def in2pt(inch)
44
- return inch * 72
42
+ inch * 72
45
43
  end
46
44
 
47
45
  def ft2pt(ft)
48
- return in2pt(ft2in(ft))
46
+ in2pt(ft2in(ft))
49
47
  end
50
48
 
51
49
  def yd2pt(yd)
52
- return in2pt(yd2in(yd))
50
+ in2pt(yd2in(yd))
53
51
  end
54
52
 
55
53
  def mm2pt(mm)
56
- return mm*(72 / 25.4)
54
+ mm * (72 / 25.4)
57
55
  end
58
56
 
59
57
  def cm2pt(cm)
60
- return mm2pt(cm2mm(cm))
58
+ mm2pt(cm2mm(cm))
61
59
  end
62
60
 
63
61
  def dm2pt(dm)
64
- return mm2pt(dm2mm(dm))
62
+ mm2pt(dm2mm(dm))
65
63
  end
66
64
 
67
65
  def m2pt(m)
68
- return mm2pt(m2mm(m))
66
+ mm2pt(m2mm(m))
69
67
  end
70
68
 
71
69
  def pt2mm(pt)
72
- return pt * 1 / mm2pt(1)# (25.4 / 72)
70
+ pt * 1 / mm2pt(1) # (25.4 / 72)
73
71
  end
74
72
  end
75
73
  end
74
+ # rubocop: enable Naming/MethodParameterName
data/lib/prawn/outline.rb CHANGED
@@ -1,22 +1,310 @@
1
- # encoding: utf-8
2
- #
3
- # generates outline dictionary and items for document
4
- #
5
- # Author Jonathan Greenberg
6
-
7
- require 'forwardable'
8
- require_relative "../pdf/core/outline"
1
+ # frozen_string_literal: true
9
2
 
10
3
  module Prawn
11
-
12
4
  class Document
5
+ # @group Stable API
13
6
 
14
- # Lazily instantiates an Outline object for document. This is used as point of entry
15
- # to methods to build the outline tree.
7
+ # Lazily instantiates a Prawn::Outline object for document. This is used as
8
+ # point of entry to methods to build the outline tree for a document's table
9
+ # of contents.
16
10
  def outline
17
- @outline ||= PDF::Core::Outline.new(self)
11
+ @outline ||= Outline.new(self)
18
12
  end
19
-
20
13
  end
21
14
 
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.
26
+ #
27
+ class Outline
28
+ # @private
29
+ attr_accessor :parent, :prev, :document, :items
30
+
31
+ def initialize(document)
32
+ @document = document
33
+ @parent = root
34
+ @prev = nil
35
+ @items = {}
36
+ end
37
+
38
+ # @group Stable API
39
+
40
+ # Returns the current page number of the document
41
+ def page_number
42
+ @document.page_number
43
+ end
44
+
45
+ # Defines/Updates an outline for the document.
46
+ # The outline is an optional nested index that appears on the side of a PDF
47
+ # 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.
52
+ #
53
+ # The syntax is best illustrated with an example:
54
+ #
55
+ # Prawn::Document.generate(outlined_document.pdf) do
56
+ # text "Page 1. This is the first Chapter. "
57
+ # start_new_page
58
+ # text "Page 2. More in the first Chapter. "
59
+ # start_new_page
60
+ # 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
+ # end
65
+ # end
66
+ # start_new_page do
67
+ # outline.update do
68
+ # section 'Chapter 2', :destination => 2, do
69
+ # page :destination => 3, :title => 'Page 3'
70
+ # end
71
+ # end
72
+ # end
73
+ #
74
+ def define(&block)
75
+ instance_eval(&block) if block
76
+ end
77
+
78
+ alias update define
79
+
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:
96
+ #
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).
100
+ #
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
107
+ #
108
+ def add_subsection_to(title, position = :last, &block)
109
+ @parent = items[title]
110
+ unless @parent
111
+ raise Prawn::Errors::UnknownOutlineTitle,
112
+ "\n No outline item with title: '#{title}' exists in the outline tree"
113
+ end
114
+ @prev = position == :first ? nil : @parent.data.last
115
+ nxt = position == :first ? @parent.data.first : nil
116
+ insert_section(nxt, &block)
117
+ end
118
+
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.
125
+ # Currently the only way to locate the place of entry is with the title for
126
+ # 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:
131
+ #
132
+ # go_to_page 2
133
+ # start_new_page
134
+ # text "Inserted Page"
135
+ # update_outline do
136
+ # insert_section_after :title => 'Page 2' do
137
+ # page :destination => page_number, :title => "Inserted Page"
138
+ # end
139
+ # end
140
+ #
141
+ def insert_section_after(title, &block)
142
+ @prev = items[title]
143
+ unless @prev
144
+ raise Prawn::Errors::UnknownOutlineTitle,
145
+ "\n No outline item with title: '#{title}' exists in the outline tree"
146
+ end
147
+ @parent = @prev.data.parent
148
+ nxt = @prev.data.next
149
+ insert_section(nxt, &block)
150
+ end
151
+
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
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
175
+ #
176
+ # example usage:
177
+ #
178
+ # outline.section 'Added Section', :destination => 3 do
179
+ # outline.page :destionation => 3, :title => 'Page 3'
180
+ # end
181
+ def section(title, options = {}, &block)
182
+ add_outline_item(title, options, &block)
183
+ end
184
+
185
+ # See Outline#define above for more documentation on how it is used in that
186
+ # context
187
+ #
188
+ # 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
+ #
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:
207
+ #
208
+ # outline.page :title => "Very Last Page"
209
+ #
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.
213
+ def page(options = {})
214
+ if options[:title]
215
+ title = options[:title]
216
+ else
217
+ raise Prawn::Errors::RequiredOption,
218
+ "\nTitle is a required option for page"
219
+ end
220
+ add_outline_item(title, options)
221
+ end
222
+
223
+ private
224
+
225
+ # The Outline dictionary (12.3.3) for this document. It is
226
+ # lazily initialized, so that documents that do not have an outline
227
+ # do not incur the additional overhead.
228
+ def root
229
+ document.state.store.root.data[:Outlines] ||=
230
+ document.ref!(PDF::Core::OutlineRoot.new)
231
+ end
232
+
233
+ def add_outline_item(title, options, &block)
234
+ outline_item = create_outline_item(title, options)
235
+ establish_relations(outline_item)
236
+ increase_count
237
+ set_variables_for_block(outline_item, block)
238
+ yield if block
239
+ reset_parent(outline_item)
240
+ end
241
+
242
+ def create_outline_item(title, options)
243
+ outline_item = PDF::Core::OutlineItem.new(title, parent, options)
244
+
245
+ case options[:destination]
246
+ when Integer
247
+ page_index = options[:destination] - 1
248
+ outline_item.dest = [document.state.pages[page_index].dictionary, :Fit]
249
+ when Array
250
+ outline_item.dest = options[:destination]
251
+ end
252
+
253
+ outline_item.prev = prev if @prev
254
+ items[title] = document.ref!(outline_item)
255
+ end
256
+
257
+ def establish_relations(outline_item)
258
+ prev.data.next = outline_item if prev
259
+ parent.data.first = outline_item unless prev
260
+ parent.data.last = outline_item
261
+ end
262
+
263
+ def increase_count
264
+ counting_parent = parent
265
+ while counting_parent
266
+ counting_parent.data.count += 1
267
+ counting_parent =
268
+ if counting_parent == root
269
+ nil
270
+ else
271
+ counting_parent.data.parent
272
+ end
273
+ end
274
+ end
275
+
276
+ def set_variables_for_block(outline_item, block)
277
+ self.prev = block ? nil : outline_item
278
+ self.parent = outline_item if block
279
+ end
280
+
281
+ def reset_parent(outline_item)
282
+ if parent == outline_item
283
+ self.prev = outline_item
284
+ self.parent = outline_item.data.parent
285
+ end
286
+ end
287
+
288
+ def insert_section(nxt, &block)
289
+ last = @parent.data.last
290
+ if block
291
+ yield
292
+ end
293
+ adjust_relations(nxt, last)
294
+ reset_root_positioning
295
+ end
296
+
297
+ def adjust_relations(nxt, last)
298
+ if nxt
299
+ nxt.data.prev = @prev
300
+ @prev.data.next = nxt
301
+ @parent.data.last = last
302
+ end
303
+ end
304
+
305
+ def reset_root_positioning
306
+ @parent = root
307
+ @prev = root.data.last
308
+ end
309
+ end
22
310
  end
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # repeater.rb : Implements repeated page elements.
4
4
  # Heavy inspired by repeating_element() in PDF::Wrapper
5
5
  # http://pdf-wrapper.rubyforge.org/
@@ -9,19 +9,20 @@
9
9
  # This is free software. Please see the LICENSE and COPYING files for details.
10
10
 
11
11
  module Prawn
12
-
13
12
  class Document
14
-
15
13
  # A list of all repeaters in the document.
16
14
  # See Document#repeat for details
17
15
  #
16
+ # @private
18
17
  def repeaters
19
18
  @repeaters ||= []
20
19
  end
21
20
 
22
- # Provides a way to execute a block of code repeatedly based on a
23
- # page_filter. Since Stamp is used under the hood, this method is very space
24
- # efficient.
21
+ # @group Experimental API
22
+
23
+ # 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
25
+ # space efficient.
25
26
  #
26
27
  # Available page filters are:
27
28
  # :all -- repeats on every page
@@ -31,8 +32,9 @@ module Prawn
31
32
  # some_range -- repeats on every page included in the range
32
33
  # some_lambda -- yields page number and repeats for true return values
33
34
  #
34
- # Also accepts an optional second argument for dynamic content which executes the code
35
- # in the context of the filtered pages without using a Stamp.
35
+ # Also accepts an optional second argument for dynamic content which
36
+ # executes the code in the context of the filtered pages without using
37
+ # a Stamp.
36
38
  #
37
39
  # Example:
38
40
  #
@@ -73,8 +75,11 @@ module Prawn
73
75
  #
74
76
  # end
75
77
  #
76
- def repeat(page_filter, options={}, &block)
77
- repeaters << Prawn::Repeater.new(self, page_filter, !!options[:dynamic], &block)
78
+ def repeat(page_filter, options = {}, &block)
79
+ dynamic = options.fetch(:dynamic, false)
80
+ repeaters << Prawn::Repeater.new(
81
+ self, page_filter, dynamic, &block
82
+ )
78
83
  end
79
84
  end
80
85
 
@@ -90,10 +95,10 @@ module Prawn
90
95
  attr_reader :name
91
96
 
92
97
  def initialize(document, page_filter, dynamic = false, &block)
93
- @document = document
98
+ @document = document
94
99
  @page_filter = page_filter
95
100
  @dynamic = dynamic
96
- @stamp_name = "prawn_repeater(#{Repeater.count})"
101
+ @stamp_name = "prawn_repeater(#{Repeater.count})"
97
102
  @document.create_stamp(@stamp_name, &block) unless dynamic
98
103
  @block = block if dynamic
99
104
  @graphic_state = document.state.page.graphic_state.dup
@@ -110,13 +115,10 @@ module Prawn
110
115
  @document.stamp(@stamp_name) if match?(page_number)
111
116
  elsif @block && match?(page_number)
112
117
  @document.save_graphics_state(@graphic_state) do
113
- @document.send(:freeze_stamp_graphics)
118
+ @document.__send__(:freeze_stamp_graphics)
114
119
  @block.call
115
120
  end
116
121
  end
117
122
  end
118
-
119
123
  end
120
124
  end
121
-
122
-
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Implementation of the "ARCFOUR" algorithm ("alleged RC4 (tm)"). Implemented
4
+ # as described at:
5
+ # http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt
6
+ #
7
+ # "RC4" is a trademark of RSA Data Security, Inc.
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
+ # @private
14
+ class Arcfour
15
+ def initialize(key)
16
+ # Convert string key to Array of integers
17
+ key = key.unpack('c*') if key.is_a?(String)
18
+
19
+ # 1. Allocate an 256 element array of 8 bit bytes to be used as an S-box
20
+ # 2. Initialize the S-box. Fill each entry first with it's index
21
+ @sbox = (0..255).to_a
22
+
23
+ # 3. Fill another array of the same size (256) with the key, repeating
24
+ # bytes as necessary.
25
+ s2 = []
26
+ while s2.length < 256
27
+ s2 += key
28
+ end
29
+ s2 = s2[0, 256]
30
+
31
+ # 4. Set j to zero and initialize the S-box
32
+ j = 0
33
+ (0..255).each do |i|
34
+ j = (j + @sbox[i] + s2[i]) % 256
35
+ @sbox[i], @sbox[j] = @sbox[j], @sbox[i]
36
+ end
37
+
38
+ @i = @j = 0
39
+ end
40
+
41
+ def encrypt(string)
42
+ string.unpack('c*').map { |byte| byte ^ key_byte }.pack('c*')
43
+ end
44
+
45
+ private
46
+
47
+ # Produces the next byte of key material in the stream (3.2 Stream Generation)
48
+ def key_byte
49
+ @i = (@i + 1) % 256
50
+ @j = (@j + @sbox[@i]) % 256
51
+ @sbox[@i], @sbox[@j] = @sbox[@j], @sbox[@i]
52
+ @sbox[(@sbox[@i] + @sbox[@j]) % 256]
53
+ end
54
+ end