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
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Prawn::Text do
6
+ describe '#draw_text' do
7
+ let(:pdf) { create_pdf }
8
+
9
+ it 'raise_errors ArgumentError if :at option omitted' do
10
+ expect { pdf.draw_text('hai', {}) }.to raise_error(ArgumentError)
11
+ end
12
+
13
+ it 'raise_errors ArgumentError if :align option included' do
14
+ expect do
15
+ pdf.draw_text('hai', at: [0, 0], align: :center)
16
+ end.to raise_error(ArgumentError)
17
+ end
18
+
19
+ it 'allows drawing empty strings to the page' do
20
+ pdf.draw_text(' ', at: [100, 100])
21
+ text = PDF::Inspector::Text.analyze(pdf.render)
22
+ expect(text.strings.first).to eq(' ')
23
+ end
24
+
25
+ it 'defaults to 12 point helvetica' do
26
+ pdf.draw_text('Blah', at: [100, 100])
27
+ text = PDF::Inspector::Text.analyze(pdf.render)
28
+ expect(text.font_settings[0][:name]).to eq(:Helvetica)
29
+ expect(text.font_settings[0][:size]).to eq(12)
30
+ expect(text.strings.first).to eq('Blah')
31
+ end
32
+
33
+ it 'allows setting font size' do
34
+ pdf.draw_text('Blah', at: [100, 100], size: 16)
35
+ text = PDF::Inspector::Text.analyze(pdf.render)
36
+ expect(text.font_settings[0][:size]).to eq(16)
37
+ end
38
+
39
+ it 'allows setting a default font size' do
40
+ pdf.font_size = 16
41
+ pdf.draw_text('Blah', at: [0, 0])
42
+
43
+ text = PDF::Inspector::Text.analyze(pdf.render)
44
+ expect(text.font_settings[0][:size]).to eq(16)
45
+ end
46
+
47
+ # rubocop: disable Naming/AccessorMethodName
48
+ rotated_text_inspector =
49
+ Class.new(PDF::Inspector) do
50
+ attr_reader :tm_operator_used
51
+
52
+ def initialize
53
+ @tm_operator_used = false
54
+ end
55
+
56
+ def set_text_matrix_and_text_line_matrix(*_arguments)
57
+ @tm_operator_used = true
58
+ end
59
+ end
60
+ # rubocop: enable Naming/AccessorMethodName
61
+
62
+ it 'allows rotation' do
63
+ pdf.draw_text('Test', at: [100, 100], rotate: 90)
64
+
65
+ text = rotated_text_inspector.analyze(pdf.render)
66
+
67
+ expect(text.tm_operator_used).to eq true
68
+ end
69
+
70
+ it 'does not use rotation matrix by default' do
71
+ pdf.draw_text('Test', at: [100, 100])
72
+
73
+ text = rotated_text_inspector.analyze(pdf.render)
74
+
75
+ expect(text.tm_operator_used).to eq false
76
+ end
77
+
78
+ it 'allows overriding default font for a single instance' do
79
+ pdf.font_size = 16
80
+
81
+ pdf.draw_text('Blah', size: 11, at: [0, 0])
82
+ pdf.draw_text('Blaz', at: [0, 0])
83
+ text = PDF::Inspector::Text.analyze(pdf.render)
84
+ expect(text.font_settings[0][:size]).to eq(11)
85
+ expect(text.font_settings[1][:size]).to eq(16)
86
+ end
87
+
88
+ it 'allows setting a font size transaction with a block' do
89
+ pdf.font_size 16 do
90
+ pdf.draw_text('Blah', at: [0, 0])
91
+ end
92
+
93
+ pdf.draw_text('blah', at: [0, 0])
94
+
95
+ text = PDF::Inspector::Text.analyze(pdf.render)
96
+ expect(text.font_settings[0][:size]).to eq(16)
97
+ expect(text.font_settings[1][:size]).to eq(12)
98
+ end
99
+
100
+ it 'allows manual setting the font size when in a font size block' do
101
+ pdf.font_size(16) do
102
+ pdf.draw_text('Foo', at: [0, 0])
103
+ pdf.draw_text('Blah', size: 11, at: [0, 0])
104
+ pdf.draw_text('Blaz', at: [0, 0])
105
+ end
106
+ text = PDF::Inspector::Text.analyze(pdf.render)
107
+ expect(text.font_settings[0][:size]).to eq(16)
108
+ expect(text.font_settings[1][:size]).to eq(11)
109
+ expect(text.font_settings[2][:size]).to eq(16)
110
+ end
111
+
112
+ it 'allows registering of built-in font_settings on the fly' do
113
+ pdf.font 'Times-Roman'
114
+ pdf.draw_text('Blah', at: [100, 100])
115
+ pdf.font 'Courier'
116
+ pdf.draw_text('Blaz', at: [150, 150])
117
+ text = PDF::Inspector::Text.analyze(pdf.render)
118
+ expect(text.font_settings[0][:name]).to eq(:"Times-Roman")
119
+ expect(text.font_settings[1][:name]).to eq(:Courier)
120
+ end
121
+
122
+ it 'raise_errors an exception when an unknown font is used' do
123
+ expect { pdf.font 'Pao bu' }.to raise_error(Prawn::Errors::UnknownFont)
124
+ end
125
+
126
+ it 'correctlies render a utf-8 string when using a built-in font' do
127
+ str = '©' # copyright symbol
128
+ pdf.draw_text(str, at: [0, 0])
129
+
130
+ # grab the text from the rendered PDF and ensure it matches
131
+ text = PDF::Inspector::Text.analyze(pdf.render)
132
+ expect(text.strings.first).to eq(str)
133
+ end
134
+
135
+ it 'raises an exception when a utf-8 incompatible string is rendered' do
136
+ str = "Blah \xDD"
137
+ expect { pdf.draw_text(str, at: [0, 0]) }.to raise_error(
138
+ Prawn::Errors::IncompatibleStringEncoding
139
+ )
140
+ end
141
+
142
+ it 'does not raise an exception when a shift-jis string is rendered' do
143
+ datafile = "#{Prawn::DATADIR}/shift_jis_text.txt"
144
+ sjis_str = File.open(datafile, 'r:shift_jis', &:gets)
145
+ pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
146
+
147
+ pdf.draw_text(sjis_str, at: [0, 0])
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Prawn::Text do
6
+ let(:pdf) { create_pdf }
7
+
8
+ describe '#text_rendering_mode' do
9
+ it 'draws the text rendering mode to the document' do
10
+ pdf.text_rendering_mode(:stroke) do
11
+ pdf.text('hello world')
12
+ end
13
+ contents = PDF::Inspector::Text.analyze(pdf.render)
14
+ expect(contents.text_rendering_mode.first).to eq(1)
15
+ end
16
+
17
+ it 'does not draw the text rendering mode to the document' \
18
+ ' when the new mode matches the old' do
19
+ pdf.text_rendering_mode(:fill) do
20
+ pdf.text('hello world')
21
+ end
22
+ contents = PDF::Inspector::Text.analyze(pdf.render)
23
+ expect(contents.text_rendering_mode).to be_empty
24
+ end
25
+
26
+ it 'restores character spacing to 0' do
27
+ pdf.text_rendering_mode(:stroke) do
28
+ pdf.text('hello world')
29
+ end
30
+ contents = PDF::Inspector::Text.analyze(pdf.render)
31
+ expect(contents.text_rendering_mode).to eq([1, 0])
32
+ end
33
+
34
+ it 'functions as an accessor when no parameter given' do
35
+ pdf.text_rendering_mode(:fill_stroke) do
36
+ pdf.text('hello world')
37
+ expect(pdf.text_rendering_mode).to eq(:fill_stroke)
38
+ end
39
+ expect(pdf.text_rendering_mode).to eq(:fill)
40
+ end
41
+
42
+ it 'raise_errors an exception when passed an invalid mode' do
43
+ expect { pdf.text_rendering_mode(-1) }.to raise_error(ArgumentError)
44
+ expect { pdf.text_rendering_mode(8) }.to raise_error(ArgumentError)
45
+ expect { pdf.text_rendering_mode(:flil) }.to raise_error(ArgumentError)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Prawn::Text do
6
+ let(:pdf) { create_pdf }
7
+
8
+ describe '#character_spacing' do
9
+ it 'draws the character spacing to the document' do
10
+ pdf.character_spacing(10.555555) do
11
+ pdf.text('hello world')
12
+ end
13
+ contents = PDF::Inspector::Text.analyze(pdf.render)
14
+ expect(contents.character_spacing.first).to eq(10.55556)
15
+ end
16
+
17
+ it 'does not draw the character spacing to the document' \
18
+ ' when the new character spacing matches the old' do
19
+ pdf.character_spacing(0) do
20
+ pdf.text('hello world')
21
+ end
22
+ contents = PDF::Inspector::Text.analyze(pdf.render)
23
+ expect(contents.character_spacing).to be_empty
24
+ end
25
+
26
+ it 'restores character spacing to 0' do
27
+ pdf.character_spacing(10.555555) do
28
+ pdf.text('hello world')
29
+ end
30
+ contents = PDF::Inspector::Text.analyze(pdf.render)
31
+ expect(contents.character_spacing.last).to eq(0)
32
+ end
33
+
34
+ it 'functions as an accessor when no parameter given' do
35
+ pdf.character_spacing(10.555555) do
36
+ pdf.text('hello world')
37
+ expect(pdf.character_spacing).to eq(10.555555)
38
+ end
39
+ expect(pdf.character_spacing).to eq(0)
40
+ end
41
+
42
+ # ensure that we properly internationalize by using the number of characters
43
+ # in a string, not the number of bytes, to insert character spaces
44
+ #
45
+ it 'calculates character spacing widths by characters, not bytes' do
46
+ pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
47
+
48
+ str = 'こんにちは世界'
49
+ raw_width = nil
50
+ pdf.character_spacing(0) do
51
+ raw_width = pdf.width_of(str)
52
+ end
53
+
54
+ pdf.character_spacing(10) do
55
+ # the new width should include six 10-pt character spaces.
56
+ expect(pdf.width_of(str)).to be_within(0.001).of(raw_width + (10 * 6))
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#word_spacing' do
62
+ it 'draws the word spacing to the document' do
63
+ pdf.word_spacing(10.555555) do
64
+ pdf.text('hello world')
65
+ end
66
+ contents = PDF::Inspector::Text.analyze(pdf.render)
67
+ expect(contents.word_spacing.first).to eq(10.55556)
68
+ end
69
+
70
+ it 'draws the word spacing to the document' \
71
+ ' when the new word spacing matches the old' do
72
+ pdf.word_spacing(0) do
73
+ pdf.text('hello world')
74
+ end
75
+ contents = PDF::Inspector::Text.analyze(pdf.render)
76
+ expect(contents.word_spacing).to be_empty
77
+ end
78
+
79
+ it 'restores word spacing to 0' do
80
+ pdf.word_spacing(10.555555) do
81
+ pdf.text('hello world')
82
+ end
83
+ contents = PDF::Inspector::Text.analyze(pdf.render)
84
+ expect(contents.word_spacing.last).to eq(0)
85
+ end
86
+
87
+ it 'functions as an accessor when no parameter given' do
88
+ pdf.word_spacing(10.555555) do
89
+ pdf.text('hello world')
90
+ expect(pdf.word_spacing).to eq(10.555555)
91
+ end
92
+ expect(pdf.word_spacing).to eq(0)
93
+ end
94
+ end
95
+ end