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
@@ -1,639 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Text::Formatted::Box wrapping" do
6
- before(:each) do
7
- create_pdf
8
- end
9
-
10
- it "should not wrap between two fragments" do
11
- texts = [
12
- {:text => "Hello "},
13
- {:text => "World"},
14
- {:text => "2", :styles => [:superscript]},
15
- ]
16
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
17
- text_box.render
18
- text_box.text.should == "Hello\nWorld2"
19
- end
20
-
21
- it "should not raise an Encoding::CompatibilityError when keeping a TTF and an " +
22
- "AFM font together" do
23
- file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
24
- @pdf.font_families["Kai"] = {
25
- :normal => { :file => file, :font => "Kai" }
26
- }
27
-
28
- texts = [{ :text => "Hello " },
29
- { :text => "再见", :font => "Kai"},
30
- { :text => "World" }]
31
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
32
-
33
- text_box.render
34
- end
35
-
36
- it "should wrap between two fragments when the preceding fragment ends with white space" do
37
- texts = [
38
- {:text => "Hello "},
39
- {:text => "World "},
40
- {:text => "2", :styles => [:superscript]},
41
- ]
42
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
43
- text_box.render
44
- text_box.text.should == "Hello World\n2"
45
-
46
- texts = [
47
- {:text => "Hello "},
48
- {:text => "World\n"},
49
- {:text => "2", :styles => [:superscript]},
50
- ]
51
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
52
- text_box.render
53
- text_box.text.should == "Hello World\n2"
54
- end
55
-
56
- it "should wrap between two fragments when the final fragment begins with white space" do
57
- texts = [
58
- {:text => "Hello "},
59
- {:text => "World"},
60
- {:text => " 2", :styles => [:superscript]},
61
- ]
62
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
63
- text_box.render
64
- text_box.text.should == "Hello World\n2"
65
-
66
- texts = [
67
- {:text => "Hello "},
68
- {:text => "World"},
69
- {:text => "\n2", :styles => [:superscript]},
70
- ]
71
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
72
- text_box.render
73
- text_box.text.should == "Hello World\n2"
74
- end
75
-
76
- it "should properly handle empty slices using default encoding" do
77
- texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }]
78
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen"))
79
- lambda {
80
- text_box.render
81
- }.should_not raise_error
82
- text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli"
83
- end
84
-
85
- describe "Unicode" do
86
- before do
87
- @reset_value = [Encoding.default_external, Encoding.default_internal]
88
- Encoding.default_external = Encoding::UTF_8
89
- Encoding.default_internal = Encoding::UTF_8
90
- end
91
-
92
- after do
93
- Encoding.default_external = @reset_value[0]
94
- Encoding.default_internal = @reset_value[1]
95
- end
96
-
97
- it "should properly handle empty slices using Unicode encoding" do
98
- texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }]
99
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen"))
100
- lambda {
101
- text_box.render
102
- }.should_not raise_error
103
- text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli"
104
- end
105
- end
106
- end
107
-
108
- describe "Text::Formatted::Box with :fallback_fonts option that includes" +
109
- "a Chinese font and set of Chinese glyphs not in the current font" do
110
- it "should change the font to the Chinese font for the Chinese glyphs" do
111
- create_pdf
112
- file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
113
- @pdf.font_families["Kai"] = {
114
- :normal => { :file => file, :font => "Kai" }
115
- }
116
- formatted_text = [{ :text => "hello你好" },
117
- { :text => "再见goodbye" }]
118
- @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Kai"])
119
-
120
- text = PDF::Inspector::Text.analyze(@pdf.render)
121
-
122
- fonts_used = text.font_settings.map { |e| e[:name] }
123
- fonts_used.length.should == 4
124
- fonts_used[0].should == :"Helvetica"
125
- fonts_used[1].to_s.should =~ /GBZenKai-Medium/
126
- fonts_used[2].to_s.should =~ /GBZenKai-Medium/
127
- fonts_used[3].should == :"Helvetica"
128
-
129
- text.strings[0].should == "hello"
130
- text.strings[1].should == "你好"
131
- text.strings[2].should == "再见"
132
- text.strings[3].should == "goodbye"
133
- end
134
- end
135
-
136
- describe "Text::Formatted::Box with :fallback_fonts option that includes" +
137
- "an AFM font and Win-Ansi glyph not in the current Chinese font" do
138
- it "should change the font to the AFM font for the Win-Ansi glyph" do
139
- create_pdf
140
- file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
141
- @pdf.font_families["Kai"] = {
142
- :normal => { :file => file, :font => "Kai" }
143
- }
144
- @pdf.font("Kai")
145
- formatted_text = [{ :text => "hello你好" },
146
- { :text => "再见€" }]
147
- @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Helvetica"])
148
-
149
- text = PDF::Inspector::Text.analyze(@pdf.render)
150
-
151
- fonts_used = text.font_settings.map { |e| e[:name] }
152
- fonts_used.length.should == 4
153
- fonts_used[0].to_s.should =~ /GBZenKai-Medium/
154
- fonts_used[1].to_s.should =~ /GBZenKai-Medium/
155
- fonts_used[2].to_s.should =~ /GBZenKai-Medium/
156
- fonts_used[3].should == :"Helvetica"
157
-
158
- text.strings[0].should == "hello"
159
- text.strings[1].should == "你好"
160
- text.strings[2].should == "再见"
161
- text.strings[3].should == "€"
162
- end
163
- end
164
-
165
- describe "Text::Formatted::Box with :fallback_fonts option and fragment " +
166
- "level font" do
167
- it "should use the fragment level font except for glyphs not in that font" do
168
- create_pdf
169
- file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
170
- @pdf.font_families["Kai"] = {
171
- :normal => { :file => file, :font => "Kai" }
172
- }
173
- formatted_text = [{ :text => "hello你好" },
174
- { :text => "再见goodbye", :font => "Times-Roman" }]
175
- @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Kai"])
176
-
177
- text = PDF::Inspector::Text.analyze(@pdf.render)
178
-
179
- fonts_used = text.font_settings.map { |e| e[:name] }
180
- fonts_used.length.should == 4
181
- fonts_used[0].should == :"Helvetica"
182
- fonts_used[1].to_s.should =~ /GBZenKai-Medium/
183
- fonts_used[2].to_s.should =~ /GBZenKai-Medium/
184
- fonts_used[3].should == :"Times-Roman"
185
-
186
- text.strings[0].should == "hello"
187
- text.strings[1].should == "你好"
188
- text.strings[2].should == "再见"
189
- text.strings[3].should == "goodbye"
190
- end
191
- end
192
-
193
- describe "Text::Formatted::Box" do
194
- before(:each) do
195
- create_pdf
196
- file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
197
- @pdf.font_families["Kai"] = {
198
- :normal => { :file => file, :font => "Kai" }
199
- }
200
- @formatted_text = [{ :text => "hello你好" }]
201
- @pdf.fallback_fonts(["Kai"])
202
- @pdf.fallback_fonts = ["Kai"]
203
- end
204
- it "#fallback_fonts should return the document-wide fallback fonts" do
205
- @pdf.fallback_fonts.should == ["Kai"]
206
- end
207
- it "should be able to set text fallback_fonts document-wide" do
208
- @pdf.formatted_text_box(@formatted_text)
209
-
210
- text = PDF::Inspector::Text.analyze(@pdf.render)
211
-
212
- fonts_used = text.font_settings.map { |e| e[:name] }
213
- fonts_used.length.should == 2
214
- fonts_used[0].should == :"Helvetica"
215
- fonts_used[1].to_s.should =~ /GBZenKai-Medium/
216
- end
217
- it "should be able to override document-wide fallback_fonts" do
218
- @pdf.formatted_text_box(@formatted_text, :fallback_fonts => ["Courier"])
219
-
220
- text = PDF::Inspector::Text.analyze(@pdf.render)
221
-
222
- fonts_used = text.font_settings.map { |e| e[:name] }
223
- fonts_used.length.should == 1
224
- fonts_used[0].should == :"Helvetica"
225
- end
226
- it "should omit the fallback fonts overhead when passing an empty array " +
227
- "as the :fallback_fonts" do
228
- box = Prawn::Text::Formatted::Box.new(@formatted_text,
229
- :document => @pdf,
230
- :fallback_fonts => [])
231
- box.expects(:process_fallback_fonts).never
232
- box.render
233
- end
234
- it "should be able to clear document-wide fallback_fonts" do
235
- @pdf.fallback_fonts([])
236
- box = Prawn::Text::Formatted::Box.new(@formatted_text,
237
- :document => @pdf)
238
- box.expects(:process_fallback_fonts).never
239
- box.render
240
- end
241
- end
242
-
243
- describe "Text::Formatted::Box with :fallback_fonts option " +
244
- "with glyphs not in the primary or the fallback fonts" do
245
- it "should use the primary font" do
246
- create_pdf
247
- formatted_text = [{ :text => "hello world. 世界你好。" }]
248
- @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Helvetica"])
249
-
250
- text = PDF::Inspector::Text.analyze(@pdf.render)
251
-
252
- fonts_used = text.font_settings.map { |e| e[:name] }
253
- fonts_used.length.should == 1
254
- fonts_used[0].should == :"Helvetica"
255
- end
256
- end
257
-
258
- describe "Text::Formatted::Box#extensions" do
259
- it "should be able to override default line wrapping" do
260
- create_pdf
261
- Prawn::Text::Formatted::Box.extensions << TestFormattedWrapOverride
262
- @pdf.formatted_text_box([{ :text => "hello world" }], {})
263
- Prawn::Text::Formatted::Box.extensions.delete(TestFormattedWrapOverride)
264
- text = PDF::Inspector::Text.analyze(@pdf.render)
265
- text.strings[0].should == "all your base are belong to us"
266
- end
267
- it "overriding Text::Formatted::Box line wrapping should not affect " +
268
- "Text::Box wrapping" do
269
- create_pdf
270
- Prawn::Text::Formatted::Box.extensions << TestFormattedWrapOverride
271
- @pdf.text_box("hello world", {})
272
- Prawn::Text::Formatted::Box.extensions.delete(TestFormattedWrapOverride)
273
- text = PDF::Inspector::Text.analyze(@pdf.render)
274
- text.strings[0].should == "hello world"
275
- end
276
- it "overriding Text::Box line wrapping should override Text::Box wrapping" do
277
- create_pdf
278
- Prawn::Text::Box.extensions << TestFormattedWrapOverride
279
- @pdf.text_box("hello world", {})
280
- Prawn::Text::Box.extensions.delete(TestFormattedWrapOverride)
281
- text = PDF::Inspector::Text.analyze(@pdf.render)
282
- text.strings[0].should == "all your base are belong to us"
283
- end
284
- end
285
-
286
- describe "Text::Formatted::Box#render" do
287
- it "should handle newlines" do
288
- create_pdf
289
- array = [{ :text => "hello\nworld"}]
290
- options = { :document => @pdf }
291
- text_box = Prawn::Text::Formatted::Box.new(array, options)
292
- text_box.render
293
- text_box.text.should == "hello\nworld"
294
- end
295
- it "should omit spaces from the beginning of the line" do
296
- create_pdf
297
- array = [{ :text => " hello\n world"}]
298
- options = { :document => @pdf }
299
- text_box = Prawn::Text::Formatted::Box.new(array, options)
300
- text_box.render
301
- text_box.text.should == "hello\nworld"
302
- end
303
- it "should be okay printing a line of whitespace" do
304
- create_pdf
305
- array = [{ :text => "hello\n \nworld"}]
306
- options = { :document => @pdf }
307
- text_box = Prawn::Text::Formatted::Box.new(array, options)
308
- text_box.render
309
- text_box.text.should == "hello\n\nworld"
310
-
311
-
312
- array = [{ :text => "hello" + " " * 500},
313
- { :text => " " * 500 },
314
- { :text => " " * 500 + "\n"},
315
- { :text => "world"}]
316
- options = { :document => @pdf }
317
- text_box = Prawn::Text::Formatted::Box.new(array, options)
318
- text_box.render
319
- text_box.text.should == "hello\n\nworld"
320
- end
321
- it "should enable fragment level direction setting" do
322
- create_pdf
323
- number_of_hellos = 18
324
- array = [
325
- { :text => "hello " * number_of_hellos },
326
- { :text => "world", :direction => :ltr },
327
- { :text => ", how are you?" }
328
- ]
329
- options = { :document => @pdf, :direction => :rtl }
330
- text_box = Prawn::Text::Formatted::Box.new(array, options)
331
- text_box.render
332
- text = PDF::Inspector::Text.analyze(@pdf.render)
333
- text.strings[0].should == "era woh ,"
334
- text.strings[1].should == "world"
335
- text.strings[2].should == " olleh" * number_of_hellos
336
- text.strings[3].should == "?uoy"
337
- end
338
- end
339
-
340
- describe "Text::Formatted::Box#render" do
341
- it "should be able to perform fragment callbacks" do
342
- create_pdf
343
- callback_object = TestFragmentCallback.new("something", 7,
344
- :document => @pdf)
345
- callback_object.expects(:render_behind).with(
346
- kind_of(Prawn::Text::Formatted::Fragment))
347
- callback_object.expects(:render_in_front).with(
348
- kind_of(Prawn::Text::Formatted::Fragment))
349
- array = [{ :text => "hello world " },
350
- { :text => "callback now",
351
- :callback => callback_object }]
352
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
353
- text_box.render
354
- end
355
- it "should be able to perform fragment callbacks on multiple objects" do
356
- create_pdf
357
-
358
- callback_object = TestFragmentCallback.new("something", 7,
359
- :document => @pdf)
360
- callback_object.expects(:render_behind).with(
361
- kind_of(Prawn::Text::Formatted::Fragment))
362
- callback_object.expects(:render_in_front).with(
363
- kind_of(Prawn::Text::Formatted::Fragment))
364
-
365
- callback_object2 = TestFragmentCallback.new("something else", 14,
366
- :document => @pdf)
367
- callback_object2.expects(:render_behind).with(
368
- kind_of(Prawn::Text::Formatted::Fragment))
369
- callback_object2.expects(:render_in_front).with(
370
- kind_of(Prawn::Text::Formatted::Fragment))
371
-
372
- array = [{ :text => "hello world " },
373
- { :text => "callback now",
374
- :callback => [callback_object, callback_object2] }]
375
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
376
- text_box.render
377
- end
378
- it "fragment callbacks should be able to define only the callback they need" do
379
- create_pdf
380
- behind = TestFragmentCallbackBehind.new("something", 7,
381
- :document => @pdf)
382
- in_front = TestFragmentCallbackInFront.new("something", 7,
383
- :document => @pdf)
384
- array = [{ :text => "hello world " },
385
- { :text => "callback now",
386
- :callback => [behind, in_front] }]
387
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
388
-
389
- text_box.render # trigger callbacks
390
- end
391
- it "should be able to set the font" do
392
- create_pdf
393
- array = [{ :text => "this contains " },
394
- { :text => "Times-Bold",
395
- :styles => [:bold],
396
- :font => "Times-Roman" },
397
- { :text => " text" }]
398
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
399
- text_box.render
400
- contents = PDF::Inspector::Text.analyze(@pdf.render)
401
- fonts = contents.font_settings.map { |e| e[:name] }
402
- fonts.should == [:Helvetica, :"Times-Bold", :Helvetica]
403
- contents.strings[0].should == "this contains "
404
- contents.strings[1].should == "Times-Bold"
405
- contents.strings[2].should == " text"
406
- end
407
- it "should be able to set bold" do
408
- create_pdf
409
- array = [{ :text => "this contains " },
410
- { :text => "bold", :styles => [:bold] },
411
- { :text => " text" }]
412
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
413
- text_box.render
414
- contents = PDF::Inspector::Text.analyze(@pdf.render)
415
- fonts = contents.font_settings.map { |e| e[:name] }
416
- fonts.should == [:Helvetica, :"Helvetica-Bold", :Helvetica]
417
- contents.strings[0].should == "this contains "
418
- contents.strings[1].should == "bold"
419
- contents.strings[2].should == " text"
420
- end
421
- it "should be able to set italics" do
422
- create_pdf
423
- array = [{ :text => "this contains " },
424
- { :text => "italic", :styles => [:italic] },
425
- { :text => " text" }]
426
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
427
- text_box.render
428
- contents = PDF::Inspector::Text.analyze(@pdf.render)
429
- fonts = contents.font_settings.map { |e| e[:name] }
430
- fonts.should == [:Helvetica, :"Helvetica-Oblique", :Helvetica]
431
- end
432
- it "should be able to set subscript" do
433
- create_pdf
434
- array = [{ :text => "this contains " },
435
- { :text => "subscript", :size => 18, :styles => [:subscript] },
436
- { :text => " text" }]
437
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
438
- text_box.render
439
- contents = PDF::Inspector::Text.analyze(@pdf.render)
440
- contents.font_settings[0][:size].should == 12
441
- contents.font_settings[1][:size].should be_within(0.0001).of(18 * 0.583)
442
- end
443
- it "should be able to set superscript" do
444
- create_pdf
445
- array = [{ :text => "this contains " },
446
- { :text => "superscript", :size => 18, :styles => [:superscript] },
447
- { :text => " text" }]
448
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
449
- text_box.render
450
- contents = PDF::Inspector::Text.analyze(@pdf.render)
451
- contents.font_settings[0][:size].should == 12
452
- contents.font_settings[1][:size].should be_within(0.0001).of(18 * 0.583)
453
- end
454
- it "should be able to set compound bold and italic text" do
455
- create_pdf
456
- array = [{ :text => "this contains " },
457
- { :text => "bold italic", :styles => [:bold, :italic] },
458
- { :text => " text" }]
459
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
460
- text_box.render
461
- contents = PDF::Inspector::Text.analyze(@pdf.render)
462
- fonts = contents.font_settings.map { |e| e[:name] }
463
- fonts.should == [:Helvetica, :"Helvetica-BoldOblique", :Helvetica]
464
- end
465
- it "should be able to underline" do
466
- create_pdf
467
- array = [{ :text => "this contains " },
468
- { :text => "underlined", :styles => [:underline] },
469
- { :text => " text" }]
470
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
471
- text_box.render
472
- line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
473
- line_drawing.points.length.should == 2
474
- end
475
- it "should be able to strikethrough" do
476
- create_pdf
477
- array = [{ :text => "this contains " },
478
- { :text => "struckthrough", :styles => [:strikethrough] },
479
- { :text => " text" }]
480
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
481
- text_box.render
482
- line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
483
- line_drawing.points.length.should == 2
484
- end
485
- it "should be able to add URL links" do
486
- create_pdf
487
- @pdf.expects(:link_annotation).with(kind_of(Array), :Border => [0,0,0],
488
- :A => { :Type => :Action, :S => :URI, :URI => "http://example.com" })
489
- array = [{ :text => "click " },
490
- { :text => "here", :link => "http://example.com" },
491
- { :text => " to visit" }]
492
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
493
- text_box.render
494
- end
495
- it "should be able to add destination links" do
496
- create_pdf
497
- @pdf.expects(:link_annotation).with(kind_of(Array), :Border => [0,0,0],
498
- :Dest => "ToC")
499
- array = [{ :text => "Go to the " },
500
- { :text => "Table of Contents", :anchor => "ToC" }]
501
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
502
- text_box.render
503
- end
504
- it "should be able to add local actions" do
505
- create_pdf
506
- @pdf.expects(:link_annotation).with(kind_of(Array), :Border => [0,0,0],
507
- :A => { :Type => :Action, :S => :Launch, :F => "../example.pdf", :NewWindow => true })
508
- array = [{ :text => "click " },
509
- { :text => "here", :local => "../example.pdf" },
510
- { :text => " to open a local file" }]
511
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
512
- text_box.render
513
- end
514
- it "should be able to set font size" do
515
- create_pdf
516
- array = [{ :text => "this contains " },
517
- { :text => "sized", :size => 24 },
518
- { :text => " text" }]
519
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
520
- text_box.render
521
- contents = PDF::Inspector::Text.analyze(@pdf.render)
522
- contents.font_settings[0][:size].should == 12
523
- contents.font_settings[1][:size].should == 24
524
- end
525
- it "should set the baseline based on the tallest fragment on a given line" do
526
- create_pdf
527
- array = [{ :text => "this contains " },
528
- { :text => "sized", :size => 24 },
529
- { :text => " text" }]
530
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
531
- text_box.render
532
- @pdf.font_size(24) do
533
- text_box.height.should be_within(0.001).of(@pdf.font.ascender + @pdf.font.descender)
534
- end
535
- end
536
- it "should be able to set color via an rgb hex string" do
537
- create_pdf
538
- array = [{ :text => "rgb",
539
- :color => "ff0000" }]
540
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
541
- text_box.render
542
- colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
543
- colors.fill_color_count.should == 2
544
- colors.stroke_color_count.should == 2
545
- end
546
- it "should be able to set color using a cmyk array" do
547
- create_pdf
548
- array = [{ :text => "cmyk",
549
- :color => [100, 0, 0, 0] }]
550
- text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
551
- text_box.render
552
- colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
553
- colors.fill_color_count.should == 2
554
- colors.stroke_color_count.should == 2
555
- end
556
- end
557
-
558
- describe "Text::Formatted::Box#render with fragment level :character_spacing option" do
559
- it "should draw the character spacing to the document" do
560
- create_pdf
561
- array = [{ :text => "hello world",
562
- :character_spacing => 7 }]
563
- options = { :document => @pdf }
564
- text_box = Prawn::Text::Formatted::Box.new(array, options)
565
- text_box.render
566
- contents = PDF::Inspector::Text.analyze(@pdf.render)
567
- contents.character_spacing[0].should == 7
568
- end
569
- it "should draw the character spacing to the document" do
570
- create_pdf
571
- array = [{ :text => "hello world",
572
- :font => "Courier",
573
- :character_spacing => 10 }]
574
- options = { :document => @pdf,
575
- :width => 100,
576
- :overflow => :expand }
577
- text_box = Prawn::Text::Formatted::Box.new(array, options)
578
- text_box.render
579
- text_box.text.should == "hello\nworld"
580
- end
581
- end
582
-
583
- describe "Text::Formatted::Box#render with :align => :justify" do
584
- it "should not justify the last line of a paragraph" do
585
- create_pdf
586
- array = [{ :text => "hello world " },
587
- { :text => "\n" },
588
- { :text => "goodbye" }]
589
- options = { :document => @pdf, :align => :justify }
590
- text_box = Prawn::Text::Formatted::Box.new(array, options)
591
- text_box.render
592
- contents = PDF::Inspector::Text.analyze(@pdf.render)
593
- contents.word_spacing.should be_empty
594
- end
595
- end
596
-
597
- class TestFragmentCallback
598
- def initialize(string, number, options)
599
- @document = options[:document]
600
- end
601
-
602
- def render_behind(fragment)
603
- end
604
-
605
- def render_in_front(fragment)
606
- end
607
- end
608
-
609
- class TestFragmentCallbackBehind
610
- def initialize(string, number, options)
611
- @document = options[:document]
612
- end
613
-
614
- def render_behind(fragment)
615
- end
616
- end
617
-
618
- class TestFragmentCallbackInFront
619
- def initialize(string, number, options)
620
- @document = options[:document]
621
- end
622
-
623
- def render_in_front(fragment)
624
- end
625
- end
626
-
627
- module TestFormattedWrapOverride
628
- def wrap(array)
629
- initialize_wrap([{ :text => 'all your base are belong to us' }])
630
- line_to_print = @line_wrap.wrap_line(:document => @document,
631
- :kerning => @kerning,
632
- :width => 10000,
633
- :arranger => @arranger)
634
- fragment = @arranger.retrieve_fragment
635
- format_and_draw_fragment(fragment, 0, @line_wrap.width, 0)
636
-
637
- []
638
- end
639
- end