prawn 0.13.0 → 2.4.0

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