prawn 1.1.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 (309) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +1 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +9 -40
  7. data/lib/prawn/document/bounding_box.rb +54 -40
  8. data/lib/prawn/document/column_box.rb +8 -10
  9. data/lib/prawn/document/internals.rb +39 -146
  10. data/lib/prawn/document/span.rb +23 -17
  11. data/lib/prawn/document.rb +217 -182
  12. data/lib/prawn/encoding.rb +69 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +124 -104
  15. data/lib/prawn/font_metric_cache.rb +23 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +5 -12
  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 +140 -88
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +5 -5
  23. data/lib/prawn/graphics/color.rb +46 -44
  24. data/lib/prawn/graphics/dash.rb +27 -11
  25. data/lib/prawn/graphics/join_style.rb +11 -6
  26. data/lib/prawn/graphics/patterns.rb +220 -78
  27. data/lib/prawn/graphics/transformation.rb +20 -12
  28. data/lib/prawn/graphics/transparency.rb +20 -18
  29. data/lib/prawn/graphics.rb +153 -115
  30. data/lib/prawn/grid.rb +93 -50
  31. data/lib/prawn/image_handler.rb +4 -4
  32. data/lib/prawn/images/image.rb +3 -2
  33. data/lib/prawn/images/jpg.rb +31 -24
  34. data/lib/prawn/images/png.rb +101 -68
  35. data/lib/prawn/images.rb +64 -56
  36. data/lib/prawn/measurement_extensions.rb +10 -9
  37. data/lib/prawn/measurements.rb +20 -23
  38. data/lib/prawn/outline.rb +96 -75
  39. data/lib/prawn/repeater.rb +16 -16
  40. data/lib/prawn/security/arcfour.rb +2 -2
  41. data/lib/prawn/security.rb +100 -85
  42. data/lib/prawn/soft_mask.rb +37 -38
  43. data/lib/prawn/stamp.rb +28 -13
  44. data/lib/prawn/text/box.rb +24 -29
  45. data/lib/prawn/text/formatted/arranger.rb +108 -63
  46. data/lib/prawn/text/formatted/box.rb +187 -124
  47. data/lib/prawn/text/formatted/fragment.rb +24 -20
  48. data/lib/prawn/text/formatted/line_wrap.rb +133 -73
  49. data/lib/prawn/text/formatted/parser.rb +147 -127
  50. data/lib/prawn/text/formatted/wrap.rb +48 -35
  51. data/lib/prawn/text/formatted.rb +5 -5
  52. data/lib/prawn/text.rb +103 -68
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +10 -22
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +39 -54
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +34 -25
  60. data/manual/basic_concepts/creation.rb +10 -11
  61. data/manual/basic_concepts/cursor.rb +4 -5
  62. data/manual/basic_concepts/measurement.rb +8 -9
  63. data/manual/basic_concepts/origin.rb +5 -6
  64. data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
  65. data/manual/basic_concepts/view.rb +48 -0
  66. data/manual/bounding_box/bounding_box.rb +30 -28
  67. data/manual/bounding_box/bounds.rb +12 -13
  68. data/manual/bounding_box/canvas.rb +7 -8
  69. data/manual/bounding_box/creation.rb +6 -7
  70. data/manual/bounding_box/indentation.rb +14 -15
  71. data/manual/bounding_box/nesting.rb +25 -18
  72. data/manual/bounding_box/russian_boxes.rb +18 -18
  73. data/manual/bounding_box/stretchy.rb +12 -14
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -32
  76. data/manual/document_and_page_options/background.rb +15 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +24 -22
  78. data/manual/document_and_page_options/metadata.rb +20 -18
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -13
  81. data/manual/document_and_page_options/print_scaling.rb +18 -15
  82. data/manual/example_helper.rb +5 -4
  83. data/manual/graphics/blend_mode.rb +52 -0
  84. data/manual/graphics/circle_and_ellipse.rb +4 -5
  85. data/manual/graphics/color.rb +7 -9
  86. data/manual/graphics/common_lines.rb +7 -8
  87. data/manual/graphics/fill_and_stroke.rb +5 -6
  88. data/manual/graphics/fill_rules.rb +12 -11
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +46 -40
  91. data/manual/graphics/helper.rb +19 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +8 -9
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -9
  97. data/manual/graphics/scale.rb +14 -13
  98. data/manual/graphics/soft_masks.rb +4 -6
  99. data/manual/graphics/stroke_cap.rb +7 -8
  100. data/manual/graphics/stroke_dash.rb +15 -16
  101. data/manual/graphics/stroke_join.rb +6 -7
  102. data/manual/graphics/translate.rb +10 -10
  103. data/manual/graphics/transparency.rb +7 -9
  104. data/manual/how_to_read_this_manual.rb +8 -9
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +10 -11
  108. data/manual/images/images.rb +28 -27
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +16 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +10 -11
  114. data/manual/layout/content.rb +9 -10
  115. data/manual/layout/layout.rb +17 -18
  116. data/manual/layout/simple_grid.rb +6 -7
  117. data/manual/outline/add_subsection_to.rb +20 -21
  118. data/manual/outline/insert_section_after.rb +15 -16
  119. data/manual/outline/outline.rb +22 -21
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +27 -23
  124. data/manual/repeatable_content/repeater.rb +15 -16
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +8 -11
  127. data/manual/security/permissions.rb +20 -15
  128. data/manual/security/security.rb +18 -18
  129. data/manual/table.rb +16 -0
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -12
  132. data/manual/text/column_box.rb +9 -11
  133. data/manual/text/fallback_fonts.rb +25 -21
  134. data/manual/text/font.rb +11 -12
  135. data/manual/text/font_size.rb +13 -14
  136. data/manual/text/font_style.rb +10 -8
  137. data/manual/text/formatted_callbacks.rb +33 -23
  138. data/manual/text/formatted_text.rb +36 -25
  139. data/manual/text/free_flowing_text.rb +22 -23
  140. data/manual/text/inline.rb +18 -19
  141. data/manual/text/kerning_and_character_spacing.rb +14 -15
  142. data/manual/text/leading.rb +7 -8
  143. data/manual/text/line_wrapping.rb +37 -18
  144. data/manual/text/paragraph_indentation.rb +15 -10
  145. data/manual/text/positioned_text.rb +16 -17
  146. data/manual/text/registering_families.rb +27 -24
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +30 -19
  149. data/manual/text/rotation.rb +33 -24
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +56 -54
  152. data/manual/text/text_box_excess.rb +20 -17
  153. data/manual/text/text_box_extensions.rb +18 -15
  154. data/manual/text/text_box_overflow.rb +24 -17
  155. data/manual/text/utf8.rb +12 -13
  156. data/manual/text/win_ansi_charset.rb +28 -25
  157. data/prawn.gemspec +45 -50
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  160. data/spec/prawn/document/column_box_spec.rb +75 -0
  161. data/spec/prawn/document/security_spec.rb +176 -0
  162. data/spec/prawn/document_annotations_spec.rb +76 -0
  163. data/spec/prawn/document_destinations_spec.rb +15 -0
  164. data/spec/prawn/document_grid_spec.rb +99 -0
  165. data/spec/prawn/document_reference_spec.rb +27 -0
  166. data/spec/prawn/document_span_spec.rb +44 -0
  167. data/spec/prawn/document_spec.rb +805 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +544 -0
  170. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  171. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  172. data/spec/prawn/graphics_spec.rb +872 -0
  173. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  174. data/spec/prawn/image_handler_spec.rb +53 -0
  175. data/spec/prawn/images/jpg_spec.rb +20 -0
  176. data/spec/prawn/images/png_spec.rb +283 -0
  177. data/spec/prawn/images_spec.rb +229 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +512 -0
  180. data/spec/prawn/repeater_spec.rb +166 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +173 -0
  183. data/spec/prawn/text/box_spec.rb +1110 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +150 -0
  190. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  191. data/spec/prawn/text_spacing_spec.rb +95 -0
  192. data/spec/prawn/text_spec.rb +603 -0
  193. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  194. data/spec/prawn/transformation_stack_spec.rb +66 -0
  195. data/spec/prawn/view_spec.rb +63 -0
  196. data/spec/prawn_manual_spec.rb +35 -0
  197. data/spec/spec_helper.rb +19 -25
  198. data.tar.gz.sig +0 -0
  199. metadata +113 -276
  200. metadata.gz.sig +0 -0
  201. data/data/encodings/win_ansi.txt +0 -29
  202. data/data/images/16bit.alpha +0 -0
  203. data/data/images/16bit.color +0 -0
  204. data/data/images/16bit.png +0 -0
  205. data/data/images/arrow.png +0 -0
  206. data/data/images/arrow2.png +0 -0
  207. data/data/images/dice.alpha +0 -0
  208. data/data/images/dice.color +0 -0
  209. data/data/images/dice.png +0 -0
  210. data/data/images/dice_interlaced.png +0 -0
  211. data/data/images/fractal.jpg +0 -0
  212. data/data/images/indexed_color.dat +0 -0
  213. data/data/images/indexed_color.png +0 -0
  214. data/data/images/letterhead.jpg +0 -0
  215. data/data/images/license.md +0 -8
  216. data/data/images/page_white_text.alpha +0 -0
  217. data/data/images/page_white_text.color +0 -0
  218. data/data/images/page_white_text.png +0 -0
  219. data/data/images/pigs.jpg +0 -0
  220. data/data/images/prawn.png +0 -0
  221. data/data/images/ruport.png +0 -0
  222. data/data/images/ruport_data.dat +0 -0
  223. data/data/images/ruport_transparent.png +0 -0
  224. data/data/images/ruport_type0.png +0 -0
  225. data/data/images/stef.jpg +0 -0
  226. data/data/images/tru256.bmp +0 -0
  227. data/data/images/web-links.dat +0 -1
  228. data/data/images/web-links.png +0 -0
  229. data/data/pdfs/complex_template.pdf +0 -0
  230. data/data/pdfs/contains_ttf_font.pdf +0 -0
  231. data/data/pdfs/encrypted.pdf +0 -0
  232. data/data/pdfs/form.pdf +1 -819
  233. data/data/pdfs/hexagon.pdf +0 -61
  234. data/data/pdfs/indirect_reference.pdf +0 -86
  235. data/data/pdfs/multipage_template.pdf +0 -127
  236. data/data/pdfs/nested_pages.pdf +0 -118
  237. data/data/pdfs/page_without_mediabox.pdf +0 -193
  238. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  239. data/data/pdfs/two_hexagons.pdf +0 -90
  240. data/data/pdfs/version_1_6.pdf +0 -61
  241. data/data/shift_jis_text.txt +0 -1
  242. data/lib/prawn/document/graphics_state.rb +0 -73
  243. data/lib/prawn/font/afm.rb +0 -247
  244. data/lib/prawn/table/cell/image.rb +0 -69
  245. data/lib/prawn/table/cell/in_table.rb +0 -33
  246. data/lib/prawn/table/cell/span_dummy.rb +0 -93
  247. data/lib/prawn/table/cell/subtable.rb +0 -66
  248. data/lib/prawn/table/cell/text.rb +0 -154
  249. data/lib/prawn/table/cell.rb +0 -772
  250. data/lib/prawn/table/cells.rb +0 -255
  251. data/lib/prawn/table/column_width_calculator.rb +0 -182
  252. data/lib/prawn/table.rb +0 -644
  253. data/manual/table/basic_block.rb +0 -53
  254. data/manual/table/before_rendering_page.rb +0 -26
  255. data/manual/table/cell_border_lines.rb +0 -24
  256. data/manual/table/cell_borders_and_bg.rb +0 -31
  257. data/manual/table/cell_dimensions.rb +0 -30
  258. data/manual/table/cell_text.rb +0 -38
  259. data/manual/table/column_widths.rb +0 -30
  260. data/manual/table/content_and_subtables.rb +0 -39
  261. data/manual/table/creation.rb +0 -27
  262. data/manual/table/filtering.rb +0 -36
  263. data/manual/table/flow_and_header.rb +0 -17
  264. data/manual/table/image_cells.rb +0 -33
  265. data/manual/table/position.rb +0 -29
  266. data/manual/table/row_colors.rb +0 -20
  267. data/manual/table/span.rb +0 -30
  268. data/manual/table/style.rb +0 -22
  269. data/manual/table/table.rb +0 -52
  270. data/manual/table/width.rb +0 -27
  271. data/spec/acceptance/png.rb +0 -25
  272. data/spec/annotations_spec.rb +0 -74
  273. data/spec/bounding_box_spec.rb +0 -510
  274. data/spec/cell_spec.rb +0 -629
  275. data/spec/column_box_spec.rb +0 -65
  276. data/spec/destinations_spec.rb +0 -15
  277. data/spec/document_spec.rb +0 -730
  278. data/spec/extensions/mocha.rb +0 -46
  279. data/spec/font_metric_cache_spec.rb +0 -52
  280. data/spec/font_spec.rb +0 -449
  281. data/spec/formatted_text_arranger_spec.rb +0 -421
  282. data/spec/formatted_text_box_spec.rb +0 -639
  283. data/spec/formatted_text_fragment_spec.rb +0 -298
  284. data/spec/graphics_spec.rb +0 -669
  285. data/spec/grid_spec.rb +0 -96
  286. data/spec/image_handler_spec.rb +0 -54
  287. data/spec/images_spec.rb +0 -153
  288. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  289. data/spec/jpg_spec.rb +0 -25
  290. data/spec/line_wrap_spec.rb +0 -344
  291. data/spec/measurement_units_spec.rb +0 -25
  292. data/spec/outline_spec.rb +0 -430
  293. data/spec/png_spec.rb +0 -237
  294. data/spec/reference_spec.rb +0 -25
  295. data/spec/repeater_spec.rb +0 -160
  296. data/spec/security_spec.rb +0 -158
  297. data/spec/soft_mask_spec.rb +0 -79
  298. data/spec/span_spec.rb +0 -44
  299. data/spec/stamp_spec.rb +0 -160
  300. data/spec/stroke_styles_spec.rb +0 -211
  301. data/spec/table/span_dummy_spec.rb +0 -17
  302. data/spec/table_spec.rb +0 -1527
  303. data/spec/text_at_spec.rb +0 -115
  304. data/spec/text_box_spec.rb +0 -1034
  305. data/spec/text_rendering_mode_spec.rb +0 -45
  306. data/spec/text_spacing_spec.rb +0 -93
  307. data/spec/text_spec.rb +0 -437
  308. data/spec/text_with_inline_formatting_spec.rb +0 -35
  309. data/spec/transparency_spec.rb +0 -91
@@ -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