prawn 2.0.2 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (277) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +20 -23
  7. data/lib/prawn.rb +37 -49
  8. data/lib/prawn/document.rb +181 -133
  9. data/lib/prawn/document/bounding_box.rb +41 -29
  10. data/lib/prawn/document/column_box.rb +7 -7
  11. data/lib/prawn/document/internals.rb +18 -8
  12. data/lib/prawn/document/span.rb +21 -16
  13. data/lib/prawn/encoding.rb +69 -68
  14. data/lib/prawn/errors.rb +12 -7
  15. data/lib/prawn/font.rb +115 -69
  16. data/lib/prawn/font_metric_cache.rb +14 -8
  17. data/lib/prawn/{font → fonts}/afm.rb +102 -68
  18. data/lib/prawn/{font → fonts}/dfont.rb +5 -11
  19. data/lib/prawn/fonts/otf.rb +11 -0
  20. data/lib/prawn/fonts/ttc.rb +36 -0
  21. data/lib/prawn/{font → fonts}/ttf.rb +87 -68
  22. data/lib/prawn/graphics.rb +120 -80
  23. data/lib/prawn/graphics/blend_mode.rb +65 -0
  24. data/lib/prawn/graphics/cap_style.rb +3 -3
  25. data/lib/prawn/graphics/color.rb +27 -25
  26. data/lib/prawn/graphics/dash.rb +23 -11
  27. data/lib/prawn/graphics/join_style.rb +9 -3
  28. data/lib/prawn/graphics/patterns.rb +197 -67
  29. data/lib/prawn/graphics/transformation.rb +17 -8
  30. data/lib/prawn/graphics/transparency.rb +17 -13
  31. data/lib/prawn/grid.rb +48 -47
  32. data/lib/prawn/image_handler.rb +5 -5
  33. data/lib/prawn/images.rb +39 -30
  34. data/lib/prawn/images/image.rb +2 -1
  35. data/lib/prawn/images/jpg.rb +28 -22
  36. data/lib/prawn/images/png.rb +107 -66
  37. data/lib/prawn/measurement_extensions.rb +10 -9
  38. data/lib/prawn/measurements.rb +19 -15
  39. data/lib/prawn/outline.rb +97 -77
  40. data/lib/prawn/repeater.rb +14 -10
  41. data/lib/prawn/security.rb +81 -61
  42. data/lib/prawn/security/arcfour.rb +2 -2
  43. data/lib/prawn/soft_mask.rb +26 -26
  44. data/lib/prawn/stamp.rb +20 -13
  45. data/lib/prawn/text.rb +68 -52
  46. data/lib/prawn/text/box.rb +11 -8
  47. data/lib/prawn/text/formatted.rb +5 -5
  48. data/lib/prawn/text/formatted/arranger.rb +78 -49
  49. data/lib/prawn/text/formatted/box.rb +134 -100
  50. data/lib/prawn/text/formatted/fragment.rb +11 -14
  51. data/lib/prawn/text/formatted/line_wrap.rb +121 -63
  52. data/lib/prawn/text/formatted/parser.rb +139 -117
  53. data/lib/prawn/text/formatted/wrap.rb +43 -31
  54. data/lib/prawn/transformation_stack.rb +44 -0
  55. data/lib/prawn/utilities.rb +7 -22
  56. data/lib/prawn/version.rb +2 -2
  57. data/lib/prawn/view.rb +17 -7
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +31 -22
  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 +6 -7
  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 +22 -16
  66. data/manual/bounding_box/bounding_box.rb +29 -24
  67. data/manual/bounding_box/bounds.rb +11 -12
  68. data/manual/bounding_box/canvas.rb +4 -5
  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 +24 -17
  72. data/manual/bounding_box/russian_boxes.rb +14 -13
  73. data/manual/bounding_box/stretchy.rb +12 -13
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -28
  76. data/manual/document_and_page_options/background.rb +11 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +25 -20
  78. data/manual/document_and_page_options/metadata.rb +18 -16
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -12
  81. data/manual/document_and_page_options/print_scaling.rb +17 -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 +4 -5
  88. data/manual/graphics/fill_rules.rb +9 -10
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +48 -39
  91. data/manual/graphics/helper.rb +12 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +7 -8
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -7
  97. data/manual/graphics/scale.rb +14 -15
  98. data/manual/graphics/soft_masks.rb +4 -5
  99. data/manual/graphics/stroke_cap.rb +6 -7
  100. data/manual/graphics/stroke_dash.rb +11 -12
  101. data/manual/graphics/stroke_join.rb +5 -6
  102. data/manual/graphics/translate.rb +9 -10
  103. data/manual/graphics/transparency.rb +7 -8
  104. data/manual/how_to_read_this_manual.rb +6 -6
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +9 -10
  108. data/manual/images/images.rb +28 -24
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +13 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +5 -6
  114. data/manual/layout/content.rb +7 -8
  115. data/manual/layout/layout.rb +18 -16
  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 +21 -17
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +21 -17
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +25 -19
  124. data/manual/repeatable_content/repeater.rb +14 -15
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +9 -10
  127. data/manual/security/permissions.rb +19 -14
  128. data/manual/security/security.rb +19 -16
  129. data/manual/table.rb +3 -3
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -11
  132. data/manual/text/column_box.rb +9 -10
  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 +7 -8
  137. data/manual/text/formatted_callbacks.rb +25 -21
  138. data/manual/text/formatted_text.rb +33 -25
  139. data/manual/text/free_flowing_text.rb +20 -21
  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 +13 -14
  145. data/manual/text/positioned_text.rb +15 -16
  146. data/manual/text/registering_families.rb +20 -21
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +26 -19
  149. data/manual/text/rotation.rb +28 -23
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +57 -52
  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 +18 -19
  155. data/manual/text/utf8.rb +11 -12
  156. data/manual/text/win_ansi_charset.rb +21 -19
  157. data/prawn.gemspec +45 -33
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +546 -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 +36 -0
  167. data/spec/prawn/document_spec.rb +802 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +542 -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 +837 -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 +224 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +412 -0
  180. data/spec/prawn/repeater_spec.rb +165 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +172 -0
  183. data/spec/prawn/text/box_spec.rb +1112 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +846 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +494 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +149 -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 -23
  198. metadata +145 -185
  199. metadata.gz.sig +4 -0
  200. data/data/images/16bit.alpha +0 -0
  201. data/data/images/16bit.color +0 -0
  202. data/data/images/16bit.png +0 -0
  203. data/data/images/arrow.png +0 -0
  204. data/data/images/arrow2.png +0 -0
  205. data/data/images/dice.alpha +0 -0
  206. data/data/images/dice.color +0 -0
  207. data/data/images/dice.png +0 -0
  208. data/data/images/dice_interlaced.png +0 -0
  209. data/data/images/fractal.jpg +0 -0
  210. data/data/images/indexed_color.dat +0 -0
  211. data/data/images/indexed_color.png +0 -0
  212. data/data/images/letterhead.jpg +0 -0
  213. data/data/images/license.md +0 -8
  214. data/data/images/page_white_text.alpha +0 -0
  215. data/data/images/page_white_text.color +0 -0
  216. data/data/images/page_white_text.png +0 -0
  217. data/data/images/pal_bk.png +0 -0
  218. data/data/images/pigs.jpg +0 -0
  219. data/data/images/prawn.png +0 -0
  220. data/data/images/ruport.png +0 -0
  221. data/data/images/ruport_data.dat +0 -0
  222. data/data/images/ruport_transparent.png +0 -0
  223. data/data/images/ruport_type0.png +0 -0
  224. data/data/images/stef.jpg +0 -0
  225. data/data/images/tru256.bmp +0 -0
  226. data/data/images/web-links.dat +0 -1
  227. data/data/images/web-links.png +0 -0
  228. data/data/pdfs/complex_template.pdf +0 -0
  229. data/data/pdfs/contains_ttf_font.pdf +0 -0
  230. data/data/pdfs/encrypted.pdf +0 -0
  231. data/data/pdfs/form.pdf +1 -819
  232. data/data/pdfs/hexagon.pdf +0 -61
  233. data/data/pdfs/indirect_reference.pdf +0 -86
  234. data/data/pdfs/multipage_template.pdf +0 -127
  235. data/data/pdfs/nested_pages.pdf +0 -118
  236. data/data/pdfs/page_without_mediabox.pdf +0 -193
  237. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  238. data/data/pdfs/two_hexagons.pdf +0 -90
  239. data/data/pdfs/version_1_6.pdf +0 -61
  240. data/data/shift_jis_text.txt +0 -1
  241. data/spec/acceptance/png.rb +0 -24
  242. data/spec/annotations_spec.rb +0 -67
  243. data/spec/bounding_box_spec.rb +0 -501
  244. data/spec/column_box_spec.rb +0 -59
  245. data/spec/destinations_spec.rb +0 -13
  246. data/spec/document_spec.rb +0 -742
  247. data/spec/extensions/mocha.rb +0 -45
  248. data/spec/font_metric_cache_spec.rb +0 -52
  249. data/spec/font_spec.rb +0 -475
  250. data/spec/formatted_text_arranger_spec.rb +0 -423
  251. data/spec/formatted_text_box_spec.rb +0 -716
  252. data/spec/formatted_text_fragment_spec.rb +0 -299
  253. data/spec/graphics_spec.rb +0 -666
  254. data/spec/grid_spec.rb +0 -95
  255. data/spec/image_handler_spec.rb +0 -53
  256. data/spec/images_spec.rb +0 -167
  257. data/spec/inline_formatted_text_parser_spec.rb +0 -568
  258. data/spec/jpg_spec.rb +0 -23
  259. data/spec/line_wrap_spec.rb +0 -366
  260. data/spec/measurement_units_spec.rb +0 -22
  261. data/spec/outline_spec.rb +0 -409
  262. data/spec/png_spec.rb +0 -235
  263. data/spec/reference_spec.rb +0 -25
  264. data/spec/repeater_spec.rb +0 -154
  265. data/spec/security_spec.rb +0 -151
  266. data/spec/soft_mask_spec.rb +0 -78
  267. data/spec/span_spec.rb +0 -43
  268. data/spec/stamp_spec.rb +0 -179
  269. data/spec/stroke_styles_spec.rb +0 -208
  270. data/spec/text_at_spec.rb +0 -142
  271. data/spec/text_box_spec.rb +0 -1038
  272. data/spec/text_rendering_mode_spec.rb +0 -45
  273. data/spec/text_spacing_spec.rb +0 -93
  274. data/spec/text_spec.rb +0 -549
  275. data/spec/text_with_inline_formatting_spec.rb +0 -35
  276. data/spec/transparency_spec.rb +0 -91
  277. data/spec/view_spec.rb +0 -42
@@ -1,142 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "#draw_text" do
6
- before(:each) { create_pdf }
7
-
8
- it "should raise_error ArgumentError if :at option omitted" do
9
- expect { @pdf.draw_text("hai", {}) }.to raise_error(ArgumentError)
10
- end
11
-
12
- it "should raise_error ArgumentError if :align option included" do
13
- expect { @pdf.draw_text("hai", :at => [0, 0], :align => :center) }.to raise_error(ArgumentError)
14
- end
15
-
16
- it "should allow drawing empty strings to the page" do
17
- @pdf.draw_text(" ", :at => [100, 100])
18
- text = PDF::Inspector::Text.analyze(@pdf.render)
19
- expect(text.strings.first).to eq(" ")
20
- end
21
-
22
- it "should default to 12 point helvetica" do
23
- @pdf.draw_text("Blah", :at => [100, 100])
24
- text = PDF::Inspector::Text.analyze(@pdf.render)
25
- expect(text.font_settings[0][:name]).to eq(:Helvetica)
26
- expect(text.font_settings[0][:size]).to eq(12)
27
- expect(text.strings.first).to eq("Blah")
28
- end
29
-
30
- it "should allow setting font size" do
31
- @pdf.draw_text("Blah", :at => [100, 100], :size => 16)
32
- text = PDF::Inspector::Text.analyze(@pdf.render)
33
- expect(text.font_settings[0][:size]).to eq(16)
34
- end
35
-
36
- it "should allow setting a default font size" do
37
- @pdf.font_size = 16
38
- @pdf.draw_text("Blah", :at => [0, 0])
39
-
40
- text = PDF::Inspector::Text.analyze(@pdf.render)
41
- expect(text.font_settings[0][:size]).to eq(16)
42
- end
43
-
44
- rotated_text_inspector = Class.new(PDF::Inspector) do
45
- attr_reader :tm_operator_used
46
-
47
- def initialize
48
- @tm_operator_used = false
49
- end
50
-
51
- def set_text_matrix_and_text_line_matrix(*a)
52
- @tm_operator_used = true
53
- end
54
- end
55
-
56
- it "should allow rotation" do
57
- @pdf.draw_text("Test", :at => [100, 100], :rotate => 90)
58
-
59
- text = rotated_text_inspector.analyze(@pdf.render)
60
-
61
- expect(text.tm_operator_used).to(be_true)
62
- end
63
-
64
- it "should not use rotation matrix by default" do
65
- @pdf.draw_text("Test", :at => [100, 100])
66
-
67
- text = rotated_text_inspector.analyze(@pdf.render)
68
-
69
- expect(text.tm_operator_used).to(be_false)
70
- end
71
-
72
- it "should allow overriding default font for a single instance" do
73
- @pdf.font_size = 16
74
-
75
- @pdf.draw_text("Blah", :size => 11, :at => [0, 0])
76
- @pdf.draw_text("Blaz", :at => [0, 0])
77
- text = PDF::Inspector::Text.analyze(@pdf.render)
78
- expect(text.font_settings[0][:size]).to eq(11)
79
- expect(text.font_settings[1][:size]).to eq(16)
80
- end
81
-
82
- it "should allow setting a font size transaction with a block" do
83
- @pdf.font_size 16 do
84
- @pdf.draw_text('Blah', :at => [0, 0])
85
- end
86
-
87
- @pdf.draw_text('blah', :at => [0, 0])
88
-
89
- text = PDF::Inspector::Text.analyze(@pdf.render)
90
- expect(text.font_settings[0][:size]).to eq(16)
91
- expect(text.font_settings[1][:size]).to eq(12)
92
- end
93
-
94
- it "should allow manual setting the font size when in a font size block" do
95
- @pdf.font_size(16) do
96
- @pdf.draw_text('Foo', :at => [0, 0])
97
- @pdf.draw_text('Blah', :size => 11, :at => [0, 0])
98
- @pdf.draw_text('Blaz', :at => [0, 0])
99
- end
100
- text = PDF::Inspector::Text.analyze(@pdf.render)
101
- expect(text.font_settings[0][:size]).to eq(16)
102
- expect(text.font_settings[1][:size]).to eq(11)
103
- expect(text.font_settings[2][:size]).to eq(16)
104
- end
105
-
106
- it "should allow registering of built-in font_settings on the fly" do
107
- @pdf.font "Times-Roman"
108
- @pdf.draw_text("Blah", :at => [100, 100])
109
- @pdf.font "Courier"
110
- @pdf.draw_text("Blaz", :at => [150, 150])
111
- text = PDF::Inspector::Text.analyze(@pdf.render)
112
- expect(text.font_settings[0][:name]).to eq(:"Times-Roman")
113
- expect(text.font_settings[1][:name]).to eq(:Courier)
114
- end
115
-
116
- it "should raise_error an exception when an unknown font is used" do
117
- expect { @pdf.font "Pao bu" }.to raise_error(Prawn::Errors::UnknownFont)
118
- end
119
-
120
- it "should correctly render a utf-8 string when using a built-in font" do
121
- str = "©" # copyright symbol
122
- @pdf.draw_text(str, :at => [0, 0])
123
-
124
- # grab the text from the rendered PDF and ensure it matches
125
- text = PDF::Inspector::Text.analyze(@pdf.render)
126
- expect(text.strings.first).to eq(str)
127
- end
128
-
129
- it "should raise_error an exception when a utf-8 incompatible string is rendered" do
130
- str = "Blah \xDD"
131
- expect { @pdf.draw_text(str, :at => [0, 0]) }.to raise_error(
132
- Prawn::Errors::IncompatibleStringEncoding)
133
- end
134
-
135
- it "should not raise an exception when a shift-jis string is rendered" do
136
- datafile = "#{Prawn::DATADIR}/shift_jis_text.txt"
137
- sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets }
138
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
139
-
140
- @pdf.draw_text(sjis_str, :at => [0, 0])
141
- end
142
- end
@@ -1,1038 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Text::Box#nothing_printed?" do
6
- it "should be_true when nothing printed" do
7
- create_pdf
8
- string = "Hello world, how are you?\nI'm fine, thank you."
9
- text_box = Prawn::Text::Box.new(string,
10
- :height => 2,
11
- :document => @pdf)
12
- text_box.render
13
- expect(text_box.nothing_printed?).to be_true
14
- end
15
- it "should be_false when something printed" do
16
- create_pdf
17
- string = "Hello world, how are you?\nI'm fine, thank you."
18
- text_box = Prawn::Text::Box.new(string,
19
- :height => 14,
20
- :document => @pdf)
21
- text_box.render
22
- expect(text_box.nothing_printed?).to be_false
23
- end
24
- end
25
-
26
- describe "Text::Box#everything_printed?" do
27
- it "should be_false when not everything printed" do
28
- create_pdf
29
- string = "Hello world, how are you?\nI'm fine, thank you."
30
- text_box = Prawn::Text::Box.new(string,
31
- :height => 14,
32
- :document => @pdf)
33
- text_box.render
34
- expect(text_box.everything_printed?).to be_false
35
- end
36
- it "should be_true when everything printed" do
37
- create_pdf
38
- string = "Hello world, how are you?\nI'm fine, thank you."
39
- text_box = Prawn::Text::Box.new(string,
40
- :document => @pdf)
41
- text_box.render
42
- expect(text_box.everything_printed?).to be_true
43
- end
44
- end
45
-
46
- describe "Text::Box#line_gap" do
47
- it "should == the line gap of the font when using a single " \
48
- "font and font size" do
49
- create_pdf
50
- string = "Hello world, how are you?\nI'm fine, thank you."
51
- text_box = Prawn::Text::Box.new(string,
52
- :document => @pdf)
53
- text_box.render
54
- expect(text_box.line_gap).to be_within(0.0001).of(@pdf.font.line_gap)
55
- end
56
- end
57
-
58
- describe "Text::Box" do
59
- it "should be able to set text direction document-wide" do
60
- create_pdf
61
- @pdf.text_direction(:rtl)
62
- @pdf.text_direction = :rtl
63
- string = "Hello world, how are you?\nI'm fine, thank you."
64
- text_box = Prawn::Text::Box.new(string,
65
- :document => @pdf)
66
- text_box.render
67
- text = PDF::Inspector::Text.analyze(@pdf.render)
68
- expect(text.strings[0]).to eq("?uoy era woh ,dlrow olleH")
69
- expect(text.strings[1]).to eq(".uoy knaht ,enif m'I")
70
- end
71
-
72
- it "should be able to reverse multi-byte text" do
73
- create_pdf
74
- @pdf.text_direction(:rtl)
75
- @pdf.text_direction = :rtl
76
- @pdf.text_direction = :rtl
77
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", :size => 16) do
78
- @pdf.text "写个小"
79
- end
80
- text = PDF::Inspector::Text.analyze(@pdf.render)
81
- expect(text.strings[0]).to eq("小个写")
82
- end
83
-
84
- it "option should be able to override document-wide text direction" do
85
- create_pdf
86
- @pdf.text_direction = :rtl
87
- string = "Hello world, how are you?\nI'm fine, thank you."
88
- text_box = Prawn::Text::Box.new(string,
89
- :document => @pdf,
90
- :direction => :ltr)
91
- text_box.render
92
- text = PDF::Inspector::Text.analyze(@pdf.render)
93
- expect(text.strings[0]).to eq("Hello world, how are you?")
94
- expect(text.strings[1]).to eq("I'm fine, thank you.")
95
- end
96
- end
97
-
98
- describe "Text::Box" do
99
- it "should be able to set leading document-wide" do
100
- create_pdf
101
- @pdf.default_leading(7)
102
- @pdf.default_leading = 7
103
- text_box = Prawn::Text::Box.new("hello world",
104
- :document => @pdf)
105
- expect(text_box.leading).to eq(7)
106
- end
107
-
108
- it "option should be able to override document-wide leading" do
109
- create_pdf
110
- @pdf.default_leading = 7
111
- text_box = Prawn::Text::Box.new("hello world",
112
- :document => @pdf,
113
- :leading => 20)
114
- expect(text_box.leading).to eq(20)
115
- end
116
- it "should default to document-wide leading if no" \
117
- "leading option is provided" do
118
- end
119
- end
120
-
121
- describe "Text::Box#render with :align => :justify" do
122
- it "should draw the word spacing to the document" do
123
- create_pdf
124
- string = "hello world " * 20
125
- options = { :document => @pdf, :align => :justify }
126
- text_box = Prawn::Text::Box.new(string, options)
127
- text_box.render
128
- contents = PDF::Inspector::Text.analyze(@pdf.render)
129
- expect(contents.word_spacing[0]).to be > 0
130
- end
131
- it "should not justify the last line of a paragraph" do
132
- create_pdf
133
- string = "hello world "
134
- options = { :document => @pdf, :align => :justify }
135
- text_box = Prawn::Text::Box.new(string, options)
136
- text_box.render
137
- contents = PDF::Inspector::Text.analyze(@pdf.render)
138
- expect(contents.word_spacing).to be_empty
139
- end
140
- end
141
-
142
- describe "Text::Box" do
143
- it "should only require enough space for the descender and the ascender " \
144
- "when determining whether a line can fit" do
145
- create_pdf
146
- text = "Oh hai text rect"
147
- options = { :document => @pdf, :height => @pdf.font.ascender + @pdf.font.descender }
148
- text_box = Prawn::Text::Box.new(text, options)
149
- text_box.render
150
- expect(text_box.text).to eq("Oh hai text rect")
151
-
152
- text = "Oh hai text rect\nOh hai text rect"
153
- options = { :document => @pdf, :height => @pdf.font.height + @pdf.font.ascender + @pdf.font.descender }
154
- text_box = Prawn::Text::Box.new(text, options)
155
- text_box.render
156
- expect(text_box.text).to eq("Oh hai text rect\nOh hai text rect")
157
- end
158
- end
159
-
160
- describe "Text::Box#height without leading" do
161
- it "should == the sum of the height of each line, " \
162
- "not including the space below the last line" do
163
- create_pdf
164
- text = "Oh hai text rect.\nOh hai text rect."
165
- options = { :document => @pdf }
166
- text_box = Prawn::Text::Box.new(text, options)
167
- text_box.render
168
- expect(text_box.height).to be_within(0.001).of(@pdf.font.height * 2 - @pdf.font.line_gap)
169
- end
170
- end
171
-
172
- describe "Text::Box#height with leading" do
173
- it "should == the sum of the height of each line plus leading, " \
174
- "but not including the space below the last line" do
175
- create_pdf
176
- text = "Oh hai text rect.\nOh hai text rect."
177
- leading = 12
178
- options = { :document => @pdf, :leading => leading }
179
- text_box = Prawn::Text::Box.new(text, options)
180
- text_box.render
181
- expect(text_box.height).to be_within(0.001).of((@pdf.font.height + leading) * 2 - @pdf.font.line_gap - leading)
182
- end
183
- end
184
-
185
- describe "Text::Box with :draw_text_callback" do
186
- before(:each) { create_pdf }
187
-
188
- it "hits the callback whenever text is drawn" do
189
- draw_block = stub
190
- draw_block.expects(:kick).with("this text is long enough to")
191
- draw_block.expects(:kick).with("span two lines")
192
-
193
- @pdf.text_box "this text is long enough to span two lines",
194
- :width => 150,
195
- :draw_text_callback => lambda { |text, _| draw_block.kick(text) }
196
- end
197
-
198
- it "hits the callback once per fragment for :inline_format" do
199
- draw_block = stub
200
- draw_block.expects(:kick).with("this text has ")
201
- draw_block.expects(:kick).with("fancy")
202
- draw_block.expects(:kick).with(" formatting")
203
-
204
- @pdf.text_box "this text has <b>fancy</b> formatting",
205
- :inline_format => true, :width => 500,
206
- :draw_text_callback => lambda { |text, _| draw_block.kick(text) }
207
- end
208
-
209
- it "does not call #draw_text!" do
210
- @pdf.expects(:draw_text!).never
211
- @pdf.text_box "some text", :width => 500,
212
- :draw_text_callback => lambda { |_, _| }
213
- end
214
- end
215
-
216
- describe "Text::Box#valid_options" do
217
- it "should return an array" do
218
- create_pdf
219
- text_box = Prawn::Text::Box.new("", :document => @pdf)
220
- expect(text_box.valid_options).to be_a_kind_of(Array)
221
- end
222
- end
223
-
224
- describe "Text::Box#render" do
225
- it "should not fail if height is smaller than 1 line" do
226
- create_pdf
227
- @text = "Oh hai text rect. " * 10
228
- @options = {
229
- :height => @pdf.font.height * 0.5,
230
- :document => @pdf
231
- }
232
- text_box = Prawn::Text::Box.new(@text, @options)
233
- text_box.render
234
- expect(text_box.text).to eq("")
235
- end
236
- it "should draw content to the page" do
237
- create_pdf
238
- @text = "Oh hai text rect. " * 10
239
- @options = { :document => @pdf }
240
- text_box = Prawn::Text::Box.new(@text, @options)
241
- text_box.render
242
- text = PDF::Inspector::Text.analyze(@pdf.render)
243
- expect(text.strings).not_to be_empty
244
- end
245
- it "should not draw a transformation matrix" do
246
- create_pdf
247
- @text = "Oh hai text rect. " * 10
248
- @options = { :document => @pdf }
249
- text_box = Prawn::Text::Box.new(@text, @options)
250
- text_box.render
251
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
252
- expect(matrices.matrices.length).to eq(0)
253
- end
254
- end
255
-
256
- describe "Text::Box#render(:single_line => true)" do
257
- it "should draw only one line to the page" do
258
- create_pdf
259
- @text = "Oh hai text rect. " * 10
260
- @options = { :document => @pdf,
261
- :single_line => true }
262
- text_box = Prawn::Text::Box.new(@text, @options)
263
- text_box.render
264
- text = PDF::Inspector::Text.analyze(@pdf.render)
265
- expect(text.strings.length).to eq(1)
266
- end
267
- end
268
-
269
- describe "Text::Box#render(:dry_run => true)" do
270
- it "should not draw any content to the page" do
271
- create_pdf
272
- @text = "Oh hai text rect. " * 10
273
- @options = { :document => @pdf }
274
- text_box = Prawn::Text::Box.new(@text, @options)
275
- text_box.render(:dry_run => true)
276
- text = PDF::Inspector::Text.analyze(@pdf.render)
277
- expect(text.strings).to be_empty
278
- end
279
-
280
- it "subsequent calls to render should_not raise_error an ArgumentError exception" do
281
- create_pdf
282
- @text = "™©"
283
- @options = { :document => @pdf }
284
- text_box = Prawn::Text::Box.new(@text, @options)
285
- text_box.render(:dry_run => true)
286
-
287
- text_box.render
288
- end
289
- end
290
-
291
- describe "Text::Box#render(:valign => :bottom)" do
292
- it "#at should be the same from one dry run to the next" do
293
- create_pdf
294
- text = "this is center text " * 12
295
- options = { :width => 162,
296
- :valign => :bottom,
297
- :document => @pdf }
298
- text_box = Prawn::Text::Box.new(text, options)
299
-
300
- text_box.render(:dry_run => true)
301
- original_at = text_box.at.dup
302
-
303
- text_box.render(:dry_run => true)
304
- expect(text_box.at).to eq(original_at)
305
- end
306
- end
307
-
308
- describe "Text::Box#render(:valign => :center)" do
309
- it "#at should be the same from one dry run to the next" do
310
- create_pdf
311
- text = "this is center text " * 12
312
- options = { :width => 162,
313
- :valign => :center,
314
- :document => @pdf }
315
- text_box = Prawn::Text::Box.new(text, options)
316
-
317
- text_box.render(:dry_run => true)
318
- original_at = text_box.at.dup
319
-
320
- text_box.render(:dry_run => true)
321
- expect(text_box.at).to eq(original_at)
322
- end
323
- end
324
-
325
- describe "Text::Box#render with :rotate option of 30)" do
326
- before(:each) do
327
- create_pdf
328
- rotate = 30
329
- @x = 300
330
- @y = 70
331
- @width = 100
332
- @height = 50
333
- @cos = Math.cos(rotate * Math::PI / 180)
334
- @sin = Math.sin(rotate * Math::PI / 180)
335
- @text = "Oh hai text rect. " * 10
336
- @options = { :document => @pdf,
337
- :rotate => rotate,
338
- :at => [@x, @y],
339
- :width => @width,
340
- :height => @height }
341
- end
342
- context ":rotate_around option of :center" do
343
- it "should draw content to the page rotated about the center of the text" do
344
- @options[:rotate_around] = :center
345
- text_box = Prawn::Text::Box.new(@text, @options)
346
- text_box.render
347
-
348
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
349
- x = @x + @width / 2
350
- y = @y - @height / 2
351
- x_prime = x * @cos - y * @sin
352
- y_prime = x * @sin + y * @cos
353
- expect(matrices.matrices[0]).to eq([1, 0, 0, 1,
354
- reduce_precision(x - x_prime),
355
- reduce_precision(y - y_prime)])
356
- expect(matrices.matrices[1]).to eq([reduce_precision(@cos),
357
- reduce_precision(@sin),
358
- reduce_precision(-@sin),
359
- reduce_precision(@cos), 0, 0])
360
-
361
- text = PDF::Inspector::Text.analyze(@pdf.render)
362
- expect(text.strings).not_to be_empty
363
- end
364
- end
365
- context ":rotate_around option of :upper_left" do
366
- it "should draw content to the page rotated about the upper left corner of the text" do
367
- @options[:rotate_around] = :upper_left
368
- text_box = Prawn::Text::Box.new(@text, @options)
369
- text_box.render
370
-
371
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
372
- x = @x
373
- y = @y
374
- x_prime = x * @cos - y * @sin
375
- y_prime = x * @sin + y * @cos
376
- expect(matrices.matrices[0]).to eq([1, 0, 0, 1,
377
- reduce_precision(x - x_prime),
378
- reduce_precision(y - y_prime)])
379
- expect(matrices.matrices[1]).to eq([reduce_precision(@cos),
380
- reduce_precision(@sin),
381
- reduce_precision(-@sin),
382
- reduce_precision(@cos), 0, 0])
383
-
384
- text = PDF::Inspector::Text.analyze(@pdf.render)
385
- expect(text.strings).not_to be_empty
386
- end
387
- end
388
- context "default :rotate_around" do
389
- it "should draw content to the page rotated about the upper left corner of the text" do
390
- text_box = Prawn::Text::Box.new(@text, @options)
391
- text_box.render
392
-
393
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
394
- x = @x
395
- y = @y
396
- x_prime = x * @cos - y * @sin
397
- y_prime = x * @sin + y * @cos
398
- expect(matrices.matrices[0]).to eq([1, 0, 0, 1,
399
- reduce_precision(x - x_prime),
400
- reduce_precision(y - y_prime)])
401
- expect(matrices.matrices[1]).to eq([reduce_precision(@cos),
402
- reduce_precision(@sin),
403
- reduce_precision(-@sin),
404
- reduce_precision(@cos), 0, 0])
405
-
406
- text = PDF::Inspector::Text.analyze(@pdf.render)
407
- expect(text.strings).not_to be_empty
408
- end
409
- end
410
- context ":rotate_around option of :upper_right" do
411
- it "should draw content to the page rotated about the upper right corner of the text" do
412
- @options[:rotate_around] = :upper_right
413
- text_box = Prawn::Text::Box.new(@text, @options)
414
- text_box.render
415
-
416
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
417
- x = @x + @width
418
- y = @y
419
- x_prime = x * @cos - y * @sin
420
- y_prime = x * @sin + y * @cos
421
- expect(matrices.matrices[0]).to eq([1, 0, 0, 1,
422
- reduce_precision(x - x_prime),
423
- reduce_precision(y - y_prime)])
424
- expect(matrices.matrices[1]).to eq([reduce_precision(@cos),
425
- reduce_precision(@sin),
426
- reduce_precision(-@sin),
427
- reduce_precision(@cos), 0, 0])
428
-
429
- text = PDF::Inspector::Text.analyze(@pdf.render)
430
- expect(text.strings).not_to be_empty
431
- end
432
- end
433
- context ":rotate_around option of :lower_right" do
434
- it "should draw content to the page rotated about the lower right corner of the text" do
435
- @options[:rotate_around] = :lower_right
436
- text_box = Prawn::Text::Box.new(@text, @options)
437
- text_box.render
438
-
439
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
440
- x = @x + @width
441
- y = @y - @height
442
- x_prime = x * @cos - y * @sin
443
- y_prime = x * @sin + y * @cos
444
- expect(matrices.matrices[0]).to eq([1, 0, 0, 1,
445
- reduce_precision(x - x_prime),
446
- reduce_precision(y - y_prime)])
447
- expect(matrices.matrices[1]).to eq([reduce_precision(@cos),
448
- reduce_precision(@sin),
449
- reduce_precision(-@sin),
450
- reduce_precision(@cos), 0, 0])
451
-
452
- text = PDF::Inspector::Text.analyze(@pdf.render)
453
- expect(text.strings).not_to be_empty
454
- end
455
- end
456
- context ":rotate_around option of :lower_left" do
457
- it "should draw content to the page rotated about the lower left corner of the text" do
458
- @options[:rotate_around] = :lower_left
459
- text_box = Prawn::Text::Box.new(@text, @options)
460
- text_box.render
461
-
462
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
463
- x = @x
464
- y = @y - @height
465
- x_prime = x * @cos - y * @sin
466
- y_prime = x * @sin + y * @cos
467
- expect(matrices.matrices[0]).to eq([1, 0, 0, 1,
468
- reduce_precision(x - x_prime),
469
- reduce_precision(y - y_prime)])
470
- expect(matrices.matrices[1]).to eq([reduce_precision(@cos),
471
- reduce_precision(@sin),
472
- reduce_precision(-@sin),
473
- reduce_precision(@cos), 0, 0])
474
-
475
- text = PDF::Inspector::Text.analyze(@pdf.render)
476
- expect(text.strings).not_to be_empty
477
- end
478
- end
479
- end
480
-
481
- describe "Text::Box default height" do
482
- before(:each) { create_pdf }
483
-
484
- it "should be the height from the bottom bound to document.y" do
485
- target_height = @pdf.y - @pdf.bounds.bottom
486
- @text = "Oh hai\n" * 60
487
- text_box = Prawn::Text::Box.new(@text, :document => @pdf)
488
- text_box.render
489
- expect(text_box.height).to be_within(@pdf.font.height).of(target_height)
490
- end
491
-
492
- it "should use the margin-box bottom if only in a stretchy bbox" do
493
- @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do
494
- target_height = @pdf.y - @pdf.bounds.bottom
495
- @text = "Oh hai\n" * 60
496
- text_box = Prawn::Text::Box.new(@text, :document => @pdf)
497
- text_box.render
498
- expect(text_box.height).to be_within(@pdf.font.height).of(target_height)
499
- end
500
- end
501
-
502
- it "should use the parent-box bottom if in a stretchy bbox and " \
503
- "overflow is :expand, even with an explicit height"do
504
- @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do
505
- target_height = @pdf.y - @pdf.bounds.bottom
506
- @text = "Oh hai\n" * 60
507
- text_box = Prawn::Text::Box.new(@text, :document => @pdf,
508
- :height => 100,
509
- :overflow => :expand)
510
- text_box.render
511
- expect(text_box.height).to be_within(@pdf.font.height).of(target_height)
512
- end
513
- end
514
-
515
- it "should use the innermost non-stretchy bbox, not the margin box" do
516
- @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width,
517
- :height => 200) do
518
- @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do
519
- @text = "Oh hai\n" * 60
520
- text_box = Prawn::Text::Box.new(@text, :document => @pdf)
521
- text_box.render
522
- expect(text_box.height).to be_within(@pdf.font.height).of(200)
523
- end
524
- end
525
- end
526
- end
527
-
528
- describe "Text::Box default at" do
529
- it "should be the left corner of the bounds, and the current document.y" do
530
- create_pdf
531
- target_at = [@pdf.bounds.left, @pdf.y]
532
- @text = "Oh hai text rect. " * 100
533
- @options = { :document => @pdf }
534
- text_box = Prawn::Text::Box.new(@text, @options)
535
- text_box.render
536
- expect(text_box.at).to eq(target_at)
537
- end
538
- end
539
-
540
- describe "Text::Box with text than can fit in the box" do
541
- before(:each) do
542
- create_pdf
543
- @text = "Oh hai text rect. " * 10
544
- @options = {
545
- :width => 162.0,
546
- :height => 162.0,
547
- :document => @pdf
548
- }
549
- end
550
-
551
- it "printed text should match requested text, except that preceding and " \
552
- "trailing white space will be stripped from each line, and newlines may " \
553
- "be inserted" do
554
- text_box = Prawn::Text::Box.new(" " + @text, @options)
555
- text_box.render
556
- expect(text_box.text.gsub("\n", " ")).to eq(@text.strip)
557
- end
558
-
559
- it "render should return an empty string because no text remains unprinted" do
560
- text_box = Prawn::Text::Box.new(@text, @options)
561
- expect(text_box.render).to eq("")
562
- end
563
-
564
- it "should be truncated when the leading is set high enough to prevent all the lines from being printed" do
565
- @options[:leading] = 40
566
- text_box = Prawn::Text::Box.new(@text, @options)
567
- text_box.render
568
- expect(text_box.text.gsub("\n", " ")).not_to eq(@text.strip)
569
- end
570
- end
571
-
572
- describe "Text::Box with text that fits exactly in the box" do
573
- before(:each) do
574
- create_pdf
575
- @lines = 3
576
- @interlines = @lines - 1
577
- @text = (1..@lines).to_a.join("\n")
578
- @options = {
579
- :width => 162.0,
580
- :height => @pdf.font.ascender + @pdf.font.height * @interlines + @pdf.font.descender,
581
- :document => @pdf
582
- }
583
- end
584
-
585
- it "should have the expected height" do
586
- expected_height = @options.delete(:height)
587
- text_box = Prawn::Text::Box.new(@text, @options)
588
- text_box.render
589
- expect(text_box.height).to be_within(0.0001).of(expected_height)
590
- end
591
-
592
- it "should print everything" do
593
- text_box = Prawn::Text::Box.new(@text, @options)
594
- text_box.render
595
- expect(text_box.text).to eq(@text)
596
- end
597
-
598
- describe "with leading" do
599
- before(:each) do
600
- @options[:leading] = 15
601
- end
602
-
603
- it "should not overflow when enough height is added" do
604
- @options[:height] += @options[:leading] * @interlines
605
- text_box = Prawn::Text::Box.new(@text, @options)
606
- text_box.render
607
- expect(text_box.text).to eq(@text)
608
- end
609
-
610
- it "should overflow when insufficient height is added" do
611
- @options[:height] += @options[:leading] * @interlines - 1
612
- text_box = Prawn::Text::Box.new(@text, @options)
613
- text_box.render
614
- expect(text_box.text).not_to eq(@text)
615
- end
616
- end
617
-
618
- describe "with negative leading" do
619
- before(:each) do
620
- @options[:leading] = -4
621
- end
622
-
623
- it "should not overflow when enough height is removed" do
624
- @options[:height] += @options[:leading] * @interlines
625
- text_box = Prawn::Text::Box.new(@text, @options)
626
- text_box.render
627
- expect(text_box.text).to eq(@text)
628
- end
629
-
630
- it "should overflow when too much height is removed" do
631
- @options[:height] += @options[:leading] * @interlines - 1
632
- text_box = Prawn::Text::Box.new(@text, @options)
633
- text_box.render
634
- expect(text_box.text).not_to eq(@text)
635
- end
636
- end
637
- end
638
-
639
- describe "Text::Box printing UTF-8 string with higher bit characters" do
640
- before(:each) do
641
- create_pdf
642
- @text = "©"
643
- # not enough height to print any text, so we can directly compare against
644
- # the input string
645
- bounding_height = 1.0
646
- options = {
647
- :height => bounding_height,
648
- :document => @pdf
649
- }
650
- file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont"
651
- @pdf.font_families["Panic Sans"] = {
652
- :normal => { :file => file, :font => "PanicSans" },
653
- :italic => { :file => file, :font => "PanicSans-Italic" },
654
- :bold => { :file => file, :font => "PanicSans-Bold" },
655
- :bold_italic => { :file => file, :font => "PanicSans-BoldItalic" }
656
- }
657
- @text_box = Prawn::Text::Box.new(@text, options)
658
- end
659
- describe "when using a TTF font" do
660
- it "unprinted text should be in UTF-8 encoding" do
661
- @pdf.font("Panic Sans")
662
- remaining_text = @text_box.render
663
- expect(remaining_text).to eq(@text)
664
- end
665
- end
666
-
667
- describe "when using an AFM font" do
668
- it "unprinted text should be in UTF-8 encoding" do
669
- remaining_text = @text_box.render
670
- expect(remaining_text).to eq(@text)
671
- end
672
- end
673
- end
674
-
675
- describe "Text::Box with more text than can fit in the box" do
676
- before(:each) do
677
- create_pdf
678
- @text = "Oh hai text rect. " * 30
679
- @bounding_height = 162.0
680
- @options = {
681
- :width => 162.0,
682
- :height => @bounding_height,
683
- :document => @pdf
684
- }
685
- end
686
-
687
- context "truncated overflow" do
688
- before(:each) do
689
- @options[:overflow] = :truncate
690
- @text_box = Prawn::Text::Box.new(@text, @options)
691
- end
692
- it "should be truncated" do
693
- @text_box.render
694
- expect(@text_box.text.gsub("\n", " ")).not_to eq(@text.strip)
695
- end
696
- it "render should not return an empty string because some text remains unprinted" do
697
- expect(@text_box.render).not_to be_empty
698
- end
699
- it "#height should be no taller than the specified height" do
700
- @text_box.render
701
- expect(@text_box.height).to be <= @bounding_height
702
- end
703
- it "#height should be within one font height of the specified height" do
704
- @text_box.render
705
- expect(@bounding_height).to be_within(@pdf.font.height).of(@text_box.height)
706
- end
707
- context "with :rotate option" do
708
- it "unrendered text should be the same as when not rotated" do
709
- remaining_text = @text_box.render
710
-
711
- rotate = 30
712
- x = 300
713
- y = 70
714
- width = @options[:width]
715
- height = @options[:height]
716
- @options[:document] = @pdf
717
- @options[:rotate] = rotate
718
- @options[:at] = [x, y]
719
- rotated_text_box = Prawn::Text::Box.new(@text, @options)
720
- expect(rotated_text_box.render).to eq(remaining_text)
721
- end
722
- end
723
- end
724
-
725
- context "truncated with text and size taken from the manual" do
726
- it "should return the right text" do
727
- @text = "This is the beginning of the text. It will be cut somewhere and " \
728
- "the rest of the text will procede to be rendered this time by " \
729
- "calling another method." + " . " * 50
730
- @options[:width] = 300
731
- @options[:height] = 50
732
- @options[:size] = 18
733
- @text_box = Prawn::Text::Box.new(@text, @options)
734
- remaining_text = @text_box.render
735
- expect(remaining_text).to eq("text will procede to be rendered this time by calling another method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ")
736
- end
737
- end
738
-
739
- context "expand overflow" do
740
- before(:each) do
741
- @options[:overflow] = :expand
742
- @text_box = Prawn::Text::Box.new(@text, @options)
743
- end
744
- it "height should expand to encompass all the text (but not exceed the height of the page)" do
745
- @text_box.render
746
- expect(@text_box.height).to be > @bounding_height
747
- end
748
- it "should display the entire string (as long as there was space remaining on the page to print all the text)" do
749
- @text_box.render
750
- expect(@text_box.text.gsub("\n", " ")).to eq(@text.strip)
751
- end
752
- it "render should return an empty string because no text remains unprinted(as long as there was space remaining on the page to print all the text)" do
753
- expect(@text_box.render).to eq("")
754
- end
755
- end
756
-
757
- context "shrink_to_fit overflow" do
758
- before(:each) do
759
- @options[:overflow] = :shrink_to_fit
760
- @options[:min_font_size] = 2
761
- @text_box = Prawn::Text::Box.new(@text, @options)
762
- end
763
- it "should display the entire text" do
764
- @text_box.render
765
- expect(@text_box.text.gsub("\n", " ")).to eq(@text.strip)
766
- end
767
- it "render should return an empty string because no text remains unprinted" do
768
- expect(@text_box.render).to eq("")
769
- end
770
- end
771
-
772
- context "shrink_to_fit overflow" do
773
- it "should not drop below the minimum font size" do
774
- @options[:overflow] = :shrink_to_fit
775
- @options[:min_font_size] = 10.1
776
- @text_box = Prawn::Text::Box.new(@text, @options)
777
- @text_box.render
778
-
779
- text = PDF::Inspector::Text.analyze(@pdf.render)
780
- expect(text.font_settings[0][:size]).to eq(10.1)
781
- end
782
- end
783
- end
784
-
785
- describe "Text::Box with enough space to fit the text but using the " \
786
- "shrink_to_fit overflow" do
787
- it "should not shrink the text when there is no need to" do
788
- create_pdf
789
- @bounding_height = 162.0
790
- @options = {
791
- :width => 162.0,
792
- :height => @bounding_height,
793
- :overflow => :shrink_to_fit,
794
- :min_font_size => 5,
795
- :document => @pdf
796
- }
797
- @text_box = Prawn::Text::Box.new("hello\nworld", @options)
798
- @text_box.render
799
-
800
- text = PDF::Inspector::Text.analyze(@pdf.render)
801
- expect(text.font_settings[0][:size]).to eq(12)
802
- end
803
- end
804
-
805
- describe "Text::Box with a solid block of Chinese characters" do
806
- it "printed text should match requested text, except for newlines" do
807
- create_pdf
808
- @text = "写中国字" * 10
809
- @options = {
810
- :width => 162.0,
811
- :height => 162.0,
812
- :document => @pdf
813
- }
814
- @pdf.font "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
815
- @options[:overflow] = :truncate
816
- text_box = Prawn::Text::Box.new(@text, @options)
817
- text_box.render
818
- expect(text_box.text.gsub("\n", "")).to eq(@text)
819
- end
820
- end
821
-
822
- describe "drawing bounding boxes" do
823
- before(:each) { create_pdf }
824
-
825
- it "should restore the margin box when bounding box exits" do
826
- margin_box = @pdf.bounds
827
-
828
- @pdf.text_box "Oh hai text box. " * 11, :height => @pdf.font.height * 10
829
-
830
- expect(@pdf.bounds).to eq(margin_box)
831
- end
832
- end
833
-
834
- describe "Text::Box#render with :character_spacing option" do
835
- it "should draw the character spacing to the document" do
836
- create_pdf
837
- string = "hello world"
838
- options = { :document => @pdf, :character_spacing => 10 }
839
- text_box = Prawn::Text::Box.new(string, options)
840
- text_box.render
841
- contents = PDF::Inspector::Text.analyze(@pdf.render)
842
- expect(contents.character_spacing[0]).to eq(10)
843
- end
844
- it "should take character spacing into account when wrapping" do
845
- create_pdf
846
- @pdf.font "Courier"
847
- text_box = Prawn::Text::Box.new("hello world",
848
- :width => 100,
849
- :overflow => :expand,
850
- :character_spacing => 10,
851
- :document => @pdf)
852
- text_box.render
853
- expect(text_box.text).to eq("hello\nworld")
854
- end
855
- end
856
-
857
- describe "Text::Box wrapping" do
858
- before(:each) do
859
- create_pdf
860
- end
861
-
862
- it "should wrap text" do
863
- text = "Please wrap this text about HERE. More text that should be wrapped"
864
- expect = "Please wrap this text about\nHERE. More text that should be\nwrapped"
865
-
866
- @pdf.font "Courier"
867
- text_box = Prawn::Text::Box.new(text,
868
- :width => 220,
869
- :overflow => :expand,
870
- :document => @pdf)
871
- text_box.render
872
- expect(text_box.text).to eq(expect)
873
- end
874
-
875
- # white space was being stripped after the entire line was generated, meaning
876
- # that leading white space characters reduced the amount of space on the line
877
- # for other characters, so wrapping "hello hello" resulted in
878
- # "hello\n\nhello", rather than "hello\nhello"
879
- #
880
- it "white space at beginning of line should not be taken into account when" \
881
- " computing line width" do
882
- text = "hello hello"
883
- expect = "hello\nhello"
884
-
885
- @pdf.font "Courier"
886
- text_box = Prawn::Text::Box.new(text,
887
- :width => 40,
888
- :overflow => :expand,
889
- :document => @pdf)
890
- text_box.render
891
- expect(text_box.text).to eq(expect)
892
- end
893
-
894
- it "should respect end of line when wrapping text" do
895
- text = "Please wrap only before\nTHIS word. Don't wrap this"
896
- expect = text
897
-
898
- @pdf.font "Courier"
899
- text_box = Prawn::Text::Box.new(text,
900
- :width => 220,
901
- :overflow => :expand,
902
- :document => @pdf)
903
- text_box.render
904
- expect(text_box.text).to eq(expect)
905
- end
906
-
907
- it "should respect multiple newlines when wrapping text" do
908
- text = "Please wrap only before THIS\n\nword. Don't wrap this"
909
- expect = "Please wrap only before\nTHIS\n\nword. Don't wrap this"
910
-
911
- @pdf.font "Courier"
912
- text_box = Prawn::Text::Box.new(text,
913
- :width => 200,
914
- :overflow => :expand,
915
- :document => @pdf)
916
- text_box.render
917
- expect(text_box.text).to eq(expect)
918
- end
919
-
920
- it "should respect multiple newlines when wrapping text when those newlines coincide with a line break" do
921
- text = "Please wrap only before\n\nTHIS word. Don't wrap this"
922
- expect = text
923
-
924
- @pdf.font "Courier"
925
- text_box = Prawn::Text::Box.new(text,
926
- :width => 220,
927
- :overflow => :expand,
928
- :document => @pdf)
929
- text_box.render
930
- expect(text_box.text).to eq(expect)
931
- end
932
-
933
- it "should respect initial newlines" do
934
- text = "\nThis should be on line 2"
935
- expect = text
936
-
937
- @pdf.font "Courier"
938
- text_box = Prawn::Text::Box.new(text,
939
- :width => 220,
940
- :overflow => :expand,
941
- :document => @pdf)
942
- text_box.render
943
- expect(text_box.text).to eq(expect)
944
- end
945
-
946
- it "should wrap lines comprised of a single word of the bounds when wrapping text" do
947
- text = "You_can_wrap_this_text_HERE"
948
- expect = "You_can_wrap_this_text_HE\nRE"
949
-
950
- @pdf.font "Courier"
951
- text_box = Prawn::Text::Box.new(text,
952
- :width => 180,
953
- :overflow => :expand,
954
- :document => @pdf)
955
- text_box.render
956
- expect(text_box.text).to eq(expect)
957
- end
958
-
959
- it "should wrap lines comprised of a single word of the bounds when wrapping text" do
960
- text = "©" * 30
961
-
962
- @pdf.font "Courier"
963
- text_box = Prawn::Text::Box.new(text, :width => 180,
964
- :overflow => :expand,
965
- :document => @pdf)
966
-
967
- text_box.render
968
-
969
- expected = "©" * 25 + "\n" + "©" * 5
970
- @pdf.font.normalize_encoding!(expected)
971
- expected = expected.force_encoding(Encoding::UTF_8)
972
- expect(text_box.text).to eq(expected)
973
- end
974
-
975
- it "should wrap non-unicode strings using single-byte word-wrapping" do
976
- text = "continúa esforzandote " * 5
977
- text_box = Prawn::Text::Box.new(text, :width => 180,
978
- :document => @pdf)
979
- text_box.render
980
- results_with_accent = text_box.text
981
-
982
- text = "continua esforzandote " * 5
983
- text_box = Prawn::Text::Box.new(text, :width => 180,
984
- :document => @pdf)
985
- text_box.render
986
- results_without_accent = text_box.text
987
-
988
- expect(first_line(results_with_accent).length).to eq(first_line(results_without_accent).length)
989
- end
990
-
991
- it "should allow you to disable wrapping by char" do
992
- text = "You_cannot_wrap_this_text_at_all_because_we_are_disabling_wrapping_by_char_and_there_are_no_word_breaks"
993
-
994
- @pdf.font "Courier"
995
- text_box = Prawn::Text::Box.new(text,
996
- :width => 180,
997
- :overflow => :shrink_to_fit,
998
- :disable_wrap_by_char => true,
999
- :document => @pdf)
1000
- expect { text_box.render }.to raise_error(Prawn::Errors::CannotFit)
1001
- end
1002
-
1003
- it "should retain full words with :shrink_to_fit if char wrapping is disabled" do
1004
- text = "Wrapped_words"
1005
- expect = "Wrapped_words"
1006
-
1007
- @pdf.font "Courier"
1008
- text_box = Prawn::Text::Box.new(text,
1009
- :width => 50,
1010
- :height => 50,
1011
- :size => 50,
1012
- :overflow => :shrink_to_fit,
1013
- :disable_wrap_by_char => true,
1014
- :document => @pdf)
1015
- text_box.render
1016
- expect(text_box.text).to eq(expect)
1017
- end
1018
- end
1019
-
1020
- describe "Text::Box#render with :mode option" do
1021
- it "should alter the text rendering mode of the document" do
1022
- create_pdf
1023
- string = "hello world"
1024
- options = { :document => @pdf, :mode => :fill_stroke }
1025
- text_box = Prawn::Text::Box.new(string, options)
1026
- text_box.render
1027
- contents = PDF::Inspector::Text.analyze(@pdf.render)
1028
- expect(contents.text_rendering_mode).to eq([2, 0])
1029
- end
1030
- end
1031
-
1032
- def reduce_precision(float)
1033
- ("%.5f" % float).to_f
1034
- end
1035
-
1036
- def first_line(str)
1037
- str.each_line { |line| return line }
1038
- end