prawn 0.13.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +10 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -16
  6. data/Rakefile +17 -39
  7. data/lib/prawn/document/bounding_box.rb +85 -42
  8. data/lib/prawn/document/column_box.rb +21 -11
  9. data/lib/prawn/document/internals.rb +40 -147
  10. data/lib/prawn/document/span.rb +25 -17
  11. data/lib/prawn/document.rb +286 -245
  12. data/lib/prawn/encoding.rb +68 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +204 -155
  15. data/lib/prawn/font_metric_cache.rb +25 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +7 -13
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +142 -80
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +6 -5
  23. data/lib/prawn/graphics/color.rb +47 -44
  24. data/lib/prawn/graphics/dash.rb +30 -13
  25. data/lib/prawn/graphics/join_style.rb +13 -6
  26. data/lib/prawn/graphics/patterns.rb +221 -90
  27. data/lib/prawn/graphics/transformation.rb +21 -12
  28. data/lib/prawn/graphics/transparency.rb +21 -17
  29. data/lib/prawn/graphics.rb +155 -128
  30. data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
  31. data/lib/prawn/image_handler.rb +16 -2
  32. data/lib/prawn/images/image.rb +4 -2
  33. data/lib/prawn/images/jpg.rb +39 -30
  34. data/lib/prawn/images/png.rb +132 -169
  35. data/lib/prawn/images.rb +70 -62
  36. data/lib/prawn/measurement_extensions.rb +15 -10
  37. data/lib/prawn/measurements.rb +22 -23
  38. data/lib/prawn/outline.rb +301 -13
  39. data/lib/prawn/repeater.rb +19 -17
  40. data/lib/prawn/security/arcfour.rb +54 -0
  41. data/lib/prawn/security.rb +108 -86
  42. data/lib/prawn/soft_mask.rb +40 -41
  43. data/lib/prawn/stamp.rb +29 -12
  44. data/lib/prawn/text/box.rb +27 -29
  45. data/lib/prawn/text/formatted/arranger.rb +110 -67
  46. data/lib/prawn/text/formatted/box.rb +233 -165
  47. data/lib/prawn/text/formatted/fragment.rb +27 -27
  48. data/lib/prawn/text/formatted/line_wrap.rb +137 -97
  49. data/lib/prawn/text/formatted/parser.rb +149 -127
  50. data/lib/prawn/text/formatted/wrap.rb +57 -37
  51. data/lib/prawn/text/formatted.rb +6 -4
  52. data/lib/prawn/text.rb +105 -73
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +11 -21
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +42 -68
  58. data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
  59. data/manual/basic_concepts/adding_pages.rb +9 -10
  60. data/manual/basic_concepts/basic_concepts.rb +33 -24
  61. data/manual/basic_concepts/creation.rb +10 -11
  62. data/manual/basic_concepts/cursor.rb +9 -10
  63. data/manual/basic_concepts/measurement.rb +10 -11
  64. data/manual/basic_concepts/origin.rb +8 -9
  65. data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
  66. data/manual/basic_concepts/view.rb +48 -0
  67. data/manual/bounding_box/bounding_box.rb +31 -29
  68. data/manual/bounding_box/bounds.rb +17 -18
  69. data/manual/bounding_box/canvas.rb +8 -9
  70. data/manual/bounding_box/creation.rb +8 -9
  71. data/manual/bounding_box/indentation.rb +22 -23
  72. data/manual/bounding_box/nesting.rb +32 -25
  73. data/manual/bounding_box/russian_boxes.rb +19 -19
  74. data/manual/bounding_box/stretchy.rb +18 -20
  75. data/manual/contents.rb +35 -0
  76. data/manual/cover.rb +43 -0
  77. data/manual/document_and_page_options/background.rb +16 -14
  78. data/manual/document_and_page_options/document_and_page_options.rb +26 -23
  79. data/manual/document_and_page_options/metadata.rb +21 -19
  80. data/manual/document_and_page_options/page_margins.rb +20 -22
  81. data/manual/document_and_page_options/page_size.rb +15 -15
  82. data/manual/document_and_page_options/print_scaling.rb +23 -0
  83. data/manual/example_helper.rb +5 -408
  84. data/manual/graphics/blend_mode.rb +52 -0
  85. data/manual/graphics/circle_and_ellipse.rb +8 -9
  86. data/manual/graphics/color.rb +11 -13
  87. data/manual/graphics/common_lines.rb +13 -12
  88. data/manual/graphics/fill_and_stroke.rb +10 -11
  89. data/manual/graphics/fill_rules.rb +13 -12
  90. data/manual/graphics/gradients.rb +28 -22
  91. data/manual/graphics/graphics.rb +52 -46
  92. data/manual/graphics/helper.rb +20 -10
  93. data/manual/graphics/line_width.rb +13 -12
  94. data/manual/graphics/lines_and_curves.rb +13 -14
  95. data/manual/graphics/polygon.rb +10 -12
  96. data/manual/graphics/rectangle.rb +7 -8
  97. data/manual/graphics/rotate.rb +9 -12
  98. data/manual/graphics/scale.rb +19 -18
  99. data/manual/graphics/soft_masks.rb +5 -7
  100. data/manual/graphics/stroke_cap.rb +10 -11
  101. data/manual/graphics/stroke_dash.rb +16 -17
  102. data/manual/graphics/stroke_join.rb +10 -11
  103. data/manual/graphics/translate.rb +13 -13
  104. data/manual/graphics/transparency.rb +11 -13
  105. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
  106. data/manual/images/absolute_position.rb +9 -10
  107. data/manual/images/fit.rb +9 -10
  108. data/manual/images/horizontal.rb +13 -14
  109. data/manual/images/images.rb +31 -30
  110. data/manual/images/plain_image.rb +6 -7
  111. data/manual/images/scale.rb +12 -13
  112. data/manual/images/vertical.rb +19 -17
  113. data/manual/images/width_and_height.rb +13 -14
  114. data/manual/layout/boxes.rb +14 -15
  115. data/manual/layout/content.rb +12 -13
  116. data/manual/layout/layout.rb +19 -20
  117. data/manual/layout/simple_grid.rb +8 -9
  118. data/manual/outline/add_subsection_to.rb +26 -27
  119. data/manual/outline/insert_section_after.rb +19 -20
  120. data/manual/outline/outline.rb +23 -22
  121. data/manual/outline/sections_and_pages.rb +24 -25
  122. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  123. data/manual/repeatable_content/page_numbering.rb +20 -19
  124. data/manual/repeatable_content/repeatable_content.rb +26 -22
  125. data/manual/repeatable_content/repeater.rb +18 -19
  126. data/manual/repeatable_content/stamp.rb +18 -19
  127. data/manual/security/encryption.rb +8 -11
  128. data/manual/security/permissions.rb +20 -15
  129. data/manual/security/security.rb +20 -20
  130. data/manual/table.rb +16 -0
  131. data/manual/text/alignment.rb +17 -18
  132. data/manual/text/color.rb +13 -13
  133. data/manual/text/column_box.rb +10 -12
  134. data/manual/text/fallback_fonts.rb +29 -25
  135. data/manual/text/font.rb +17 -18
  136. data/manual/text/font_size.rb +21 -22
  137. data/manual/text/font_style.rb +12 -10
  138. data/manual/text/formatted_callbacks.rb +36 -26
  139. data/manual/text/formatted_text.rb +41 -34
  140. data/manual/text/free_flowing_text.rb +28 -29
  141. data/manual/text/inline.rb +23 -26
  142. data/manual/text/kerning_and_character_spacing.rb +20 -21
  143. data/manual/text/leading.rb +10 -11
  144. data/manual/text/line_wrapping.rb +40 -21
  145. data/manual/text/paragraph_indentation.rb +17 -12
  146. data/manual/text/positioned_text.rb +19 -20
  147. data/manual/text/registering_families.rb +33 -30
  148. data/manual/text/rendering_and_color.rb +11 -12
  149. data/manual/text/right_to_left_text.rb +31 -20
  150. data/manual/text/rotation.rb +36 -27
  151. data/manual/text/single_usage.rb +13 -14
  152. data/manual/text/text.rb +62 -62
  153. data/manual/text/text_box_excess.rb +22 -19
  154. data/manual/text/text_box_extensions.rb +21 -18
  155. data/manual/text/text_box_overflow.rb +28 -21
  156. data/manual/text/utf8.rb +16 -17
  157. data/manual/text/win_ansi_charset.rb +29 -26
  158. data/prawn.gemspec +45 -43
  159. data/spec/extensions/encoding_helpers.rb +4 -3
  160. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  161. data/spec/prawn/document/column_box_spec.rb +75 -0
  162. data/spec/prawn/document/security_spec.rb +176 -0
  163. data/spec/prawn/document_annotations_spec.rb +76 -0
  164. data/spec/prawn/document_destinations_spec.rb +15 -0
  165. data/spec/prawn/document_grid_spec.rb +99 -0
  166. data/spec/prawn/document_reference_spec.rb +27 -0
  167. data/spec/prawn/document_span_spec.rb +44 -0
  168. data/spec/prawn/document_spec.rb +805 -0
  169. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  170. data/spec/prawn/font_spec.rb +544 -0
  171. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  172. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  173. data/spec/prawn/graphics_spec.rb +872 -0
  174. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  175. data/spec/prawn/image_handler_spec.rb +53 -0
  176. data/spec/prawn/images/jpg_spec.rb +20 -0
  177. data/spec/prawn/images/png_spec.rb +283 -0
  178. data/spec/prawn/images_spec.rb +229 -0
  179. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  180. data/spec/prawn/outline_spec.rb +512 -0
  181. data/spec/prawn/repeater_spec.rb +166 -0
  182. data/spec/prawn/soft_mask_spec.rb +74 -0
  183. data/spec/prawn/stamp_spec.rb +173 -0
  184. data/spec/prawn/text/box_spec.rb +1110 -0
  185. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  186. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  187. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  188. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  189. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  190. data/spec/prawn/text_draw_text_spec.rb +150 -0
  191. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  192. data/spec/prawn/text_spacing_spec.rb +95 -0
  193. data/spec/prawn/text_spec.rb +603 -0
  194. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  195. data/spec/prawn/transformation_stack_spec.rb +66 -0
  196. data/spec/prawn/view_spec.rb +63 -0
  197. data/spec/prawn_manual_spec.rb +35 -0
  198. data/spec/spec_helper.rb +22 -21
  199. data.tar.gz.sig +0 -0
  200. metadata +168 -307
  201. metadata.gz.sig +0 -0
  202. data/README.md +0 -109
  203. data/data/encodings/win_ansi.txt +0 -29
  204. data/data/images/16bit.alpha +0 -0
  205. data/data/images/16bit.dat +0 -0
  206. data/data/images/16bit.png +0 -0
  207. data/data/images/arrow.png +0 -0
  208. data/data/images/arrow2.png +0 -0
  209. data/data/images/barcode_issue.png +0 -0
  210. data/data/images/dice.alpha +0 -0
  211. data/data/images/dice.dat +0 -0
  212. data/data/images/dice.png +0 -0
  213. data/data/images/dice_interlaced.png +0 -0
  214. data/data/images/indexed_color.dat +0 -0
  215. data/data/images/indexed_color.png +0 -0
  216. data/data/images/letterhead.jpg +0 -0
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.dat +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/lib/pdf/core/annotations.rb +0 -60
  244. data/lib/pdf/core/byte_string.rb +0 -9
  245. data/lib/pdf/core/destinations.rb +0 -90
  246. data/lib/pdf/core/document_state.rb +0 -78
  247. data/lib/pdf/core/filter_list.rb +0 -51
  248. data/lib/pdf/core/filters.rb +0 -36
  249. data/lib/pdf/core/graphics_state.rb +0 -68
  250. data/lib/pdf/core/literal_string.rb +0 -16
  251. data/lib/pdf/core/name_tree.rb +0 -177
  252. data/lib/pdf/core/object_store.rb +0 -320
  253. data/lib/pdf/core/outline.rb +0 -315
  254. data/lib/pdf/core/page.rb +0 -212
  255. data/lib/pdf/core/page_geometry.rb +0 -126
  256. data/lib/pdf/core/pdf_object.rb +0 -124
  257. data/lib/pdf/core/reference.rb +0 -103
  258. data/lib/pdf/core/stream.rb +0 -98
  259. data/lib/pdf/core/text.rb +0 -275
  260. data/lib/pdf/core.rb +0 -35
  261. data/lib/prawn/compatibility.rb +0 -91
  262. data/lib/prawn/document/graphics_state.rb +0 -73
  263. data/lib/prawn/document/snapshot.rb +0 -89
  264. data/lib/prawn/font/afm.rb +0 -203
  265. data/lib/prawn/layout.rb +0 -20
  266. data/lib/prawn/table/cell/image.rb +0 -70
  267. data/lib/prawn/table/cell/in_table.rb +0 -27
  268. data/lib/prawn/table/cell/span_dummy.rb +0 -92
  269. data/lib/prawn/table/cell/subtable.rb +0 -65
  270. data/lib/prawn/table/cell/text.rb +0 -153
  271. data/lib/prawn/table/cell.rb +0 -770
  272. data/lib/prawn/table/cells.rb +0 -295
  273. data/lib/prawn/table.rb +0 -643
  274. data/manual/example_file.rb +0 -116
  275. data/manual/example_package.rb +0 -53
  276. data/manual/example_section.rb +0 -46
  277. data/manual/manual/cover.rb +0 -35
  278. data/manual/manual/foreword.rb +0 -85
  279. data/manual/manual/manual.rb +0 -35
  280. data/manual/syntax_highlight.rb +0 -52
  281. data/manual/table/basic_block.rb +0 -53
  282. data/manual/table/before_rendering_page.rb +0 -26
  283. data/manual/table/cell_border_lines.rb +0 -24
  284. data/manual/table/cell_borders_and_bg.rb +0 -31
  285. data/manual/table/cell_dimensions.rb +0 -30
  286. data/manual/table/cell_text.rb +0 -38
  287. data/manual/table/column_widths.rb +0 -30
  288. data/manual/table/content_and_subtables.rb +0 -39
  289. data/manual/table/creation.rb +0 -27
  290. data/manual/table/filtering.rb +0 -36
  291. data/manual/table/flow_and_header.rb +0 -17
  292. data/manual/table/image_cells.rb +0 -33
  293. data/manual/table/position.rb +0 -29
  294. data/manual/table/row_colors.rb +0 -20
  295. data/manual/table/span.rb +0 -30
  296. data/manual/table/style.rb +0 -22
  297. data/manual/table/table.rb +0 -52
  298. data/manual/table/width.rb +0 -27
  299. data/manual/templates/full_template.rb +0 -25
  300. data/manual/templates/page_template.rb +0 -48
  301. data/manual/templates/templates.rb +0 -27
  302. data/manual/text/group.rb +0 -29
  303. data/spec/acceptance/png.rb +0 -23
  304. data/spec/annotations_spec.rb +0 -74
  305. data/spec/bounding_box_spec.rb +0 -493
  306. data/spec/cell_spec.rb +0 -628
  307. data/spec/column_box_spec.rb +0 -33
  308. data/spec/destinations_spec.rb +0 -15
  309. data/spec/document_spec.rb +0 -761
  310. data/spec/extensions/mocha.rb +0 -44
  311. data/spec/filters_spec.rb +0 -34
  312. data/spec/font_metric_cache_spec.rb +0 -52
  313. data/spec/font_spec.rb +0 -464
  314. data/spec/formatted_text_arranger_spec.rb +0 -421
  315. data/spec/formatted_text_box_spec.rb +0 -650
  316. data/spec/formatted_text_fragment_spec.rb +0 -298
  317. data/spec/graphics_spec.rb +0 -651
  318. data/spec/grid_spec.rb +0 -85
  319. data/spec/image_handler_spec.rb +0 -42
  320. data/spec/images_spec.rb +0 -157
  321. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  322. data/spec/jpg_spec.rb +0 -25
  323. data/spec/line_wrap_spec.rb +0 -333
  324. data/spec/measurement_units_spec.rb +0 -23
  325. data/spec/name_tree_spec.rb +0 -112
  326. data/spec/object_store_spec.rb +0 -170
  327. data/spec/outline_spec.rb +0 -448
  328. data/spec/pdf_object_spec.rb +0 -172
  329. data/spec/png_spec.rb +0 -240
  330. data/spec/reference_spec.rb +0 -82
  331. data/spec/repeater_spec.rb +0 -158
  332. data/spec/security_spec.rb +0 -158
  333. data/spec/snapshot_spec.rb +0 -186
  334. data/spec/soft_mask_spec.rb +0 -117
  335. data/spec/span_spec.rb +0 -44
  336. data/spec/stamp_spec.rb +0 -158
  337. data/spec/stream_spec.rb +0 -58
  338. data/spec/stroke_styles_spec.rb +0 -211
  339. data/spec/table/span_dummy_spec.rb +0 -17
  340. data/spec/table_spec.rb +0 -1355
  341. data/spec/template_spec.rb +0 -351
  342. data/spec/text_at_spec.rb +0 -130
  343. data/spec/text_box_spec.rb +0 -1030
  344. data/spec/text_rendering_mode_spec.rb +0 -45
  345. data/spec/text_spacing_spec.rb +0 -93
  346. data/spec/text_spec.rb +0 -425
  347. data/spec/text_with_inline_formatting_spec.rb +0 -35
  348. data/spec/transparency_spec.rb +0 -89
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "#text_rendering_mode" do
6
- it "should draw the text rendering mode to the document" do
7
- create_pdf
8
- @pdf.text_rendering_mode(:stroke) do
9
- @pdf.text("hello world")
10
- end
11
- contents = PDF::Inspector::Text.analyze(@pdf.render)
12
- contents.text_rendering_mode.first.should == 1
13
- end
14
- it "should not draw the text rendering mode to the document" +
15
- " when the new mode matches the old" do
16
- create_pdf
17
- @pdf.text_rendering_mode(:fill) do
18
- @pdf.text("hello world")
19
- end
20
- contents = PDF::Inspector::Text.analyze(@pdf.render)
21
- contents.text_rendering_mode.should be_empty
22
- end
23
- it "should restore character spacing to 0" do
24
- create_pdf
25
- @pdf.text_rendering_mode(:stroke) do
26
- @pdf.text("hello world")
27
- end
28
- contents = PDF::Inspector::Text.analyze(@pdf.render)
29
- contents.text_rendering_mode.should == [1,0]
30
- end
31
- it "should function as an accessor when no parameter given" do
32
- create_pdf
33
- @pdf.text_rendering_mode(:fill_stroke) do
34
- @pdf.text("hello world")
35
- @pdf.text_rendering_mode.should == :fill_stroke
36
- end
37
- @pdf.text_rendering_mode.should == :fill
38
- end
39
- it "should raise_error an exception when passed an invalid mode" do
40
- create_pdf
41
- lambda { @pdf.text_rendering_mode(-1) }.should raise_error(ArgumentError)
42
- lambda { @pdf.text_rendering_mode(8) }.should raise_error(ArgumentError)
43
- lambda { @pdf.text_rendering_mode(:flil) }.should raise_error(ArgumentError)
44
- end
45
- end
@@ -1,93 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "#character_spacing" do
6
- it "should draw the character spacing to the document" do
7
- create_pdf
8
- @pdf.character_spacing(10.555555) do
9
- @pdf.text("hello world")
10
- end
11
- contents = PDF::Inspector::Text.analyze(@pdf.render)
12
- contents.character_spacing.first.should == 10.556
13
- end
14
- it "should not draw the character spacing to the document" +
15
- " when the new character spacing matches the old" do
16
- create_pdf
17
- @pdf.character_spacing(0) do
18
- @pdf.text("hello world")
19
- end
20
- contents = PDF::Inspector::Text.analyze(@pdf.render)
21
- contents.character_spacing.should be_empty
22
- end
23
- it "should restore character spacing to 0" do
24
- create_pdf
25
- @pdf.character_spacing(10.555555) do
26
- @pdf.text("hello world")
27
- end
28
- contents = PDF::Inspector::Text.analyze(@pdf.render)
29
- contents.character_spacing.last.should == 0
30
- end
31
- it "should function as an accessor when no parameter given" do
32
- create_pdf
33
- @pdf.character_spacing(10.555555) do
34
- @pdf.text("hello world")
35
- @pdf.character_spacing.should == 10.555555
36
- end
37
- @pdf.character_spacing.should == 0
38
- end
39
-
40
- # ensure that we properly internationalize by using the number of characters
41
- # in a string, not the number of bytes, to insert character spaces
42
- #
43
- it "should calculate character spacing widths by characters, not bytes" do
44
- create_pdf
45
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
46
-
47
- str = "こんにちは世界"
48
- @pdf.character_spacing(0) do
49
- @raw_width = @pdf.width_of(str)
50
- end
51
-
52
- @pdf.character_spacing(10) do
53
- # the new width should include seven 10-pt character spaces.
54
- @pdf.width_of(str).should be_within(0.001).of(@raw_width + (10 * 7))
55
- end
56
- end
57
- end
58
-
59
- describe "#word_spacing" do
60
- it "should draw the word spacing to the document" do
61
- create_pdf
62
- @pdf.word_spacing(10.555555) do
63
- @pdf.text("hello world")
64
- end
65
- contents = PDF::Inspector::Text.analyze(@pdf.render)
66
- contents.word_spacing.first.should == 10.556
67
- end
68
- it "should draw the word spacing to the document" +
69
- " when the new word spacing matches the old" do
70
- create_pdf
71
- @pdf.word_spacing(0) do
72
- @pdf.text("hello world")
73
- end
74
- contents = PDF::Inspector::Text.analyze(@pdf.render)
75
- contents.word_spacing.should be_empty
76
- end
77
- it "should restore word spacing to 0" do
78
- create_pdf
79
- @pdf.word_spacing(10.555555) do
80
- @pdf.text("hello world")
81
- end
82
- contents = PDF::Inspector::Text.analyze(@pdf.render)
83
- contents.word_spacing.last.should == 0
84
- end
85
- it "should function as an accessor when no parameter given" do
86
- create_pdf
87
- @pdf.word_spacing(10.555555) do
88
- @pdf.text("hello world")
89
- @pdf.word_spacing.should == 10.555555
90
- end
91
- @pdf.word_spacing.should == 0
92
- end
93
- end
data/spec/text_spec.rb DELETED
@@ -1,425 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Prawn::Text::NBSP" do
6
- it "should be defined" do
7
- Prawn::Text::NBSP.should == " "
8
- end
9
- end
10
-
11
- describe "#height_of" do
12
- before(:each) { create_pdf }
13
-
14
- it "should return the height that would be required to print a" +
15
- "particular string of text" do
16
- original_y = @pdf.y
17
- @pdf.text("Foo")
18
- new_y = @pdf.y
19
- @pdf.height_of("Foo").should be_within(0.0001).of(original_y - new_y)
20
- end
21
-
22
- it "should omit the gap below the last descender if :final_gap => false " +
23
- "is given" do
24
- original_y = @pdf.y
25
- @pdf.text("Foo", :final_gap => false)
26
- new_y = @pdf.y
27
- @pdf.height_of("Foo", :final_gap => false).should be_within(0.0001).of(original_y - new_y)
28
- end
29
-
30
- it "should raise_error CannotFit if a too-small width is given" do
31
- lambda do
32
- @pdf.height_of("text", :width => 1)
33
- end.should raise_error(Prawn::Errors::CannotFit)
34
- end
35
-
36
- it "should raise_error NotImplementedError if :indent_paragraphs option is provided" do
37
- lambda {
38
- @pdf.height_of("hai", :width => 300,
39
- :indent_paragraphs => 60)
40
- }.should raise_error(NotImplementedError)
41
- end
42
-
43
- it "should_not raise_error Prawn::Errors::UnknownOption if :final_gap option is provided" do
44
- @pdf.height_of("hai", :width => 300, :final_gap => true)
45
- end
46
- end
47
-
48
- describe "#text" do
49
- before(:each) { create_pdf }
50
-
51
- it "should not fail when @output is nil when PDF::Core::Text::LineWrap#finalize_line is called" do
52
- # need a document with margins for these particulars to produce the
53
- # condition that was throwing the error
54
- pdf = Prawn::Document.new
55
- pdf.text "transparency " * 150, :size => 18
56
- end
57
-
58
- it "should allow drawing empty strings to the page" do
59
- @pdf.text " "
60
- text = PDF::Inspector::Text.analyze(@pdf.render)
61
- # If anything is rendered to the page, it should be whitespace.
62
- text.strings.each { |str| str.should =~ /\A\s*\z/ }
63
- end
64
-
65
- it "should ignore call when string is nil" do
66
- @pdf.text(nil).should be_false
67
- end
68
-
69
- it "should correctly render empty paragraphs" do
70
- @pdf.text "text\n\ntext"
71
- text = PDF::Inspector::Text.analyze(@pdf.render)
72
- @pdf.page_count.should == 1
73
- text.strings.reject{ |s| s.empty? }.should == ["text", "text"]
74
- end
75
-
76
- it "should correctly render empty paragraphs with :indent_paragraphs" do
77
- @pdf.text "text\n\ntext", :indent_paragraphs => 5
78
- text = PDF::Inspector::Text.analyze(@pdf.render)
79
- @pdf.page_count.should == 1
80
- text.strings.reject{ |s| s.empty? }.should == ["text", "text"]
81
- end
82
-
83
- it "should correctly render strings ending with empty paragraphs and " +
84
- ":inline_format and :indent_paragraphs" do
85
- @pdf.text "text\n\n", :inline_format => true, :indent_paragraphs => 5
86
- text = PDF::Inspector::Text.analyze(@pdf.render)
87
- @pdf.page_count.should == 1
88
- text.strings.should == ["text"]
89
- end
90
-
91
- it "should default to use kerning information" do
92
- @pdf.text "hello world"
93
- text = PDF::Inspector::Text.analyze(@pdf.render)
94
- text.kerned[0].should be_true
95
- end
96
-
97
- it "should be able to disable kerning with an option" do
98
- @pdf.text "hello world", :kerning => false
99
- text = PDF::Inspector::Text.analyze(@pdf.render)
100
- text.kerned[0].should be_false
101
- end
102
-
103
- it "should be able to disable kerning document-wide" do
104
- @pdf.default_kerning(false)
105
- @pdf.default_kerning = false
106
- @pdf.text "hello world"
107
- text = PDF::Inspector::Text.analyze(@pdf.render)
108
- text.kerned[0].should be_false
109
- end
110
-
111
- it "option should be able to override document-wide kerning disabling" do
112
- @pdf.default_kerning = false
113
- @pdf.text "hello world", :kerning => true
114
- text = PDF::Inspector::Text.analyze(@pdf.render)
115
- text.kerned[0].should be_true
116
- end
117
-
118
- it "should raise_error ArgumentError if :at option included" do
119
- lambda { @pdf.text("hai", :at => [0, 0]) }.should raise_error(ArgumentError)
120
- end
121
-
122
- it "should advance down the document based on font_height" do
123
- position = @pdf.y
124
- @pdf.text "Foo"
125
-
126
- @pdf.y.should be_within(0.0001).of(position - @pdf.font.height)
127
-
128
- position = @pdf.y
129
- @pdf.text "Foo\nBar\nBaz"
130
- @pdf.y.should be_within(0.0001).of(position - 3*@pdf.font.height)
131
- end
132
-
133
- it "should advance down the document based on font_height" +
134
- " with size option" do
135
- position = @pdf.y
136
- @pdf.text "Foo", :size => 15
137
-
138
- @pdf.font_size = 15
139
- @pdf.y.should be_within(0.0001).of(position - @pdf.font.height)
140
-
141
- position = @pdf.y
142
- @pdf.text "Foo\nBar\nBaz"
143
- @pdf.y.should be_within(0.0001).of(position - 3 * @pdf.font.height)
144
- end
145
-
146
- it "should advance down the document based on font_height" +
147
- " with leading option" do
148
- position = @pdf.y
149
- leading = 2
150
- @pdf.text "Foo", :leading => leading
151
-
152
- @pdf.y.should be_within(0.0001).of(position - @pdf.font.height - leading)
153
-
154
- position = @pdf.y
155
- @pdf.text "Foo\nBar\nBaz"
156
- @pdf.y.should be_within(0.0001).of(position - 3*@pdf.font.height)
157
- end
158
-
159
- it "should advance only to the bottom of the final descender "+
160
- "if final_gap is false" do
161
- position = @pdf.y
162
- @pdf.text "Foo", :final_gap => false
163
-
164
- @pdf.y.should be_within(0.0001).of(position - @pdf.font.ascender - @pdf.font.descender)
165
-
166
- position = @pdf.y
167
- @pdf.text "Foo\nBar\nBaz", :final_gap => false
168
- @pdf.y.should be_within(0.0001).of(position - 2*@pdf.font.height - @pdf.font.ascender - @pdf.font.descender)
169
- end
170
-
171
- it "should be able to print text starting at the last line of a page" do
172
- @pdf.move_cursor_to(@pdf.font.height)
173
- @pdf.text("hello world")
174
- pages = PDF::Inspector::Page.analyze(@pdf.render).pages
175
- pages.size.should == 1
176
- end
177
-
178
- it "should default to 12 point helvetica" do
179
- @pdf.text "Blah"
180
- text = PDF::Inspector::Text.analyze(@pdf.render)
181
- text.font_settings[0][:name].should == :Helvetica
182
- text.font_settings[0][:size].should == 12
183
- text.strings.first.should == "Blah"
184
- end
185
-
186
- it "should allow setting font size" do
187
- @pdf.text "Blah", :size => 16
188
- text = PDF::Inspector::Text.analyze(@pdf.render)
189
- text.font_settings[0][:size].should == 16
190
- end
191
-
192
- it "should allow setting a default font size" do
193
- @pdf.font_size = 16
194
- @pdf.text "Blah"
195
- text = PDF::Inspector::Text.analyze(@pdf.render)
196
- text.font_settings[0][:size].should == 16
197
- end
198
-
199
- it "should allow overriding default font for a single instance" do
200
- @pdf.font_size = 16
201
-
202
- @pdf.text "Blah", :size => 11
203
- @pdf.text "Blaz"
204
- text = PDF::Inspector::Text.analyze(@pdf.render)
205
- text.font_settings[0][:size].should == 11
206
- text.font_settings[1][:size].should == 16
207
- end
208
-
209
- it "should allow setting a font size transaction with a block" do
210
- @pdf.font_size 16 do
211
- @pdf.text 'Blah'
212
- end
213
-
214
- @pdf.text 'blah'
215
-
216
- text = PDF::Inspector::Text.analyze(@pdf.render)
217
- text.font_settings[0][:size].should == 16
218
- text.font_settings[1][:size].should == 12
219
- end
220
-
221
- it "should allow manual setting the font size " +
222
- "when in a font size block" do
223
- @pdf.font_size(16) do
224
- @pdf.text 'Foo'
225
- @pdf.text 'Blah', :size => 11
226
- @pdf.text 'Blaz'
227
- end
228
- text = PDF::Inspector::Text.analyze(@pdf.render)
229
- text.font_settings[0][:size].should == 16
230
- text.font_settings[1][:size].should == 11
231
- text.font_settings[2][:size].should == 16
232
- end
233
-
234
- it "should allow registering of built-in font_settings on the fly" do
235
- @pdf.font "Times-Roman"
236
- @pdf.text "Blah"
237
- @pdf.font "Courier"
238
- @pdf.text "Blaz"
239
- text = PDF::Inspector::Text.analyze(@pdf.render)
240
- text.font_settings[0][:name].should == :"Times-Roman"
241
- text.font_settings[1][:name].should == :Courier
242
- end
243
-
244
- it "should utilise the same default font across multiple pages" do
245
- @pdf.text "Blah"
246
- @pdf.start_new_page
247
- @pdf.text "Blaz"
248
- text = PDF::Inspector::Text.analyze(@pdf.render)
249
-
250
- text.font_settings.size.should == 2
251
- text.font_settings[0][:name].should == :Helvetica
252
- text.font_settings[1][:name].should == :Helvetica
253
- end
254
-
255
- it "should raise_error an exception when an unknown font is used" do
256
- lambda { @pdf.font "Pao bu" }.should raise_error(Prawn::Errors::UnknownFont)
257
- end
258
-
259
- it "should_not raise_error an exception when providing Pathname instance as font" do
260
- @pdf.font Pathname.new("#{Prawn::DATADIR}/fonts/comicsans.ttf")
261
- end
262
-
263
- it "should correctly render a utf-8 string when using a built-in font" do
264
- str = "©" # copyright symbol
265
- @pdf.text str
266
-
267
- # grab the text from the rendered PDF and ensure it matches
268
- text = PDF::Inspector::Text.analyze(@pdf.render)
269
- text.strings.first.should == str
270
- end
271
-
272
- it "should correctly render a utf-8 string when using a TTF font" do
273
- str = "©" # copyright symbol
274
- @pdf.font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
275
- @pdf.text str
276
-
277
- # grab the text from the rendered PDF and ensure it matches
278
- text = PDF::Inspector::Text.analyze(@pdf.render)
279
- text.strings.first.should == str
280
- end
281
-
282
- it "subsets mixed low-ASCII and non-ASCII characters when they can be " +
283
- "subsetted together" do
284
- str = "It’s super effective!"
285
- @pdf.font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
286
- @pdf.text str
287
-
288
- text = PDF::Inspector::Text.analyze(@pdf.render)
289
- text.strings.first.should == str
290
- end
291
-
292
- it "should correctly render a string with higher bit characters across" +
293
- " a page break when using a built-in font" do
294
- str = "©"
295
- @pdf.move_cursor_to(@pdf.font.height)
296
- @pdf.text(str + "\n" + str)
297
-
298
- pages = PDF::Inspector::Page.analyze(@pdf.render).pages
299
- pages.size.should == 2
300
- pages[0][:strings].should == [str]
301
- pages[1][:strings].should == [str]
302
- end
303
-
304
- it "should correctly render a string with higher bit characters across" +
305
- " a page break when using a built-in font and :indent_paragraphs option" do
306
- str = "©"
307
- @pdf.move_cursor_to(@pdf.font.height)
308
- @pdf.text(str + "\n" + str, :indent_paragraphs => 20)
309
-
310
- pages = PDF::Inspector::Page.analyze(@pdf.render).pages
311
- pages.size.should == 2
312
- pages[0][:strings].should == [str]
313
- pages[1][:strings].should == [str]
314
- end
315
-
316
- if "spec".respond_to?(:encode!)
317
- # Handle non utf-8 string encodings in a sane way on M17N aware VMs
318
- it "should raise_error an exception when a utf-8 incompatible string is rendered" do
319
- str = "Blah \xDD"
320
- str.force_encoding("ASCII-8BIT")
321
- lambda { @pdf.text str }.should raise_error(
322
- Prawn::Errors::IncompatibleStringEncoding)
323
- end
324
- it "should_not raise_error an exception when a shift-jis string is rendered" do
325
- datafile = "#{Prawn::DATADIR}/shift_jis_text.txt"
326
- sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets }
327
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
328
-
329
- # Expect that the call to text will not raise an encoding error
330
- @pdf.text(sjis_str)
331
- end
332
- else
333
- # Handle non utf-8 string encodings in a sane way on non-M17N aware VMs
334
- it "should raise_error an exception when a corrupt utf-8 string is rendered" do
335
- str = "Blah \xDD"
336
- lambda { @pdf.text str }.should raise_error(
337
- Prawn::Errors::IncompatibleStringEncoding)
338
- end
339
- it "should raise_error an exception when a shift-jis string is rendered" do
340
- sjis_str = File.read("#{Prawn::DATADIR}/shift_jis_text.txt")
341
- lambda { @pdf.text sjis_str }.should raise_error(
342
- Prawn::Errors::IncompatibleStringEncoding)
343
- end
344
- end
345
-
346
- it "should call move_past_bottom when printing more text than can fit" +
347
- " between the current document.y and bounds.bottom" do
348
- @pdf.y = @pdf.font.height
349
- @pdf.text "Hello"
350
- @pdf.text "World"
351
- pages = PDF::Inspector::Page.analyze(@pdf.render).pages
352
- pages.size.should == 2
353
- pages[0][:strings].should == ["Hello"]
354
- pages[1][:strings].should == ["World"]
355
- end
356
-
357
- describe "with :indent_paragraphs option" do
358
- it "should indent the paragraphs" do
359
- hello = "hello " * 50
360
- hello2 = "hello " * 50
361
- @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60)
362
- text = PDF::Inspector::Text.analyze(@pdf.render)
363
- text.strings[0].should == ("hello " * 19).strip
364
- text.strings[1].should == ("hello " * 21).strip
365
- text.strings[3].should == ("hello " * 19).strip
366
- text.strings[4].should == ("hello " * 21).strip
367
- end
368
- describe "when wrap to new page, and first line of new page" +
369
- " is not the start of a new paragraph, that line should" +
370
- " not be indented" do
371
- it "should indent the paragraphs" do
372
- hello = "hello " * 50
373
- hello2 = "hello " * 50
374
- @pdf.move_cursor_to(@pdf.font.height)
375
- @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60)
376
- text = PDF::Inspector::Text.analyze(@pdf.render)
377
- text.strings[0].should == ("hello " * 19).strip
378
- text.strings[1].should == ("hello " * 21).strip
379
- text.strings[3].should == ("hello " * 19).strip
380
- text.strings[4].should == ("hello " * 21).strip
381
- end
382
- end
383
- describe "when wrap to new page, and first line of new page" +
384
- " is the start of a new paragraph, that line should" +
385
- " be indented" do
386
- it "should indent the paragraphs" do
387
- hello = "hello " * 50
388
- hello2 = "hello " * 50
389
- @pdf.move_cursor_to(@pdf.font.height * 3)
390
- @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60)
391
- text = PDF::Inspector::Text.analyze(@pdf.render)
392
- text.strings[0].should == ("hello " * 19).strip
393
- text.strings[1].should == ("hello " * 21).strip
394
- text.strings[3].should == ("hello " * 19).strip
395
- text.strings[4].should == ("hello " * 21).strip
396
- end
397
- end
398
- end
399
-
400
- describe "kerning" do
401
- it "should respect text kerning setting (document default)" do
402
- create_pdf
403
- @pdf.font.expects(:compute_width_of).with do |str, options|
404
- str == "VAT" && options[:kerning] == true
405
- end.at_least_once.returns(10)
406
- @pdf.text "VAT"
407
- end
408
-
409
- it "should respect text kerning setting (kerning=true)" do
410
- create_pdf
411
- @pdf.font.expects(:compute_width_of).with do |str, options|
412
- str == "VAT" && options[:kerning] == true
413
- end.at_least_once.returns(10)
414
- @pdf.text "VAT", :kerning => true
415
- end
416
-
417
- it "should respect text kerning setting (kerning=false)" do
418
- create_pdf
419
- @pdf.font.expects(:compute_width_of).with do |str, options|
420
- str == "VAT" && options[:kerning] == false
421
- end.at_least_once.returns(10)
422
- @pdf.text "VAT", :kerning => false
423
- end
424
- end
425
- end
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "#formatted_text" do
6
- it "should draw text" do
7
- create_pdf
8
- string = "hello world"
9
- format_array = [:text => string]
10
- @pdf.formatted_text(format_array)
11
- # grab the text from the rendered PDF and ensure it matches
12
- text = PDF::Inspector::Text.analyze(@pdf.render)
13
- text.strings.first.should == string
14
- end
15
- end
16
-
17
- describe "#text with inline styling" do
18
- before(:each) { create_pdf }
19
-
20
- it "should automatically move to a new page if the tallest fragment" +
21
- " on the next line won't fit in the available space" do
22
- create_pdf
23
- @pdf.move_cursor_to(@pdf.font.height)
24
- formatted = "this contains <font size='24'>sized</font> text"
25
- @pdf.text(formatted, :inline_format => true)
26
- pages = PDF::Inspector::Page.analyze(@pdf.render).pages
27
- pages.size.should == 2
28
- end
29
-
30
- it "should embed links as literal strings" do
31
- @pdf.text "<link href='http://wiki.github.com/sandal/prawn/'>wiki</link>",
32
- :inline_format => true
33
- @pdf.render.should =~ %r{/URI\s+\(http://wiki\.github\.com}
34
- end
35
- end
@@ -1,89 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
-
3
- module TransparencyHelper
4
- def make_transparent(opacity, stroke_opacity=opacity)
5
- @pdf.transparent(opacity, stroke_opacity) do
6
- yield if block_given?
7
- end
8
- end
9
- end
10
-
11
- describe "Document with transparency" do
12
- include TransparencyHelper
13
-
14
- it "the PDF version should be at least 1.4" do
15
- create_pdf
16
- make_transparent(0.5)
17
- str = @pdf.render
18
- str[0,8].should == "%PDF-1.4"
19
- end
20
-
21
- it "a new extended graphics state should be created for "+
22
- "each unique transparency setting" do
23
- create_pdf
24
- make_transparent(0.5, 0.2) do
25
- make_transparent(0.5, 0.75)
26
- end
27
- extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates
28
- extgstates.length.should == 2
29
- end
30
-
31
- it "a new extended graphics state should not be created for "+
32
- "each duplicate transparency setting" do
33
- create_pdf
34
- make_transparent(0.5, 0.75) do
35
- make_transparent(0.5, 0.75)
36
- end
37
- extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates
38
- extgstates.length.should == 1
39
- end
40
-
41
- it "setting the transparency with only one parameter sets the transparency"+
42
- " for both the fill and the stroke" do
43
- create_pdf
44
- make_transparent(0.5)
45
- extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0]
46
- extgstate[:opacity].should == 0.5
47
- extgstate[:stroke_opacity].should == 0.5
48
- end
49
-
50
- it "setting the transparency with a numerical parameter and "+
51
- "a :stroke should set the fill transparency to the numerical parameter "+
52
- "and the stroke transparency to the option" do
53
- create_pdf
54
- make_transparent(0.5, 0.2)
55
- extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0]
56
- extgstate[:opacity].should == 0.5
57
- extgstate[:stroke_opacity].should == 0.2
58
- end
59
-
60
- it "should enforce the valid range of 0.0 to 1.0" do
61
- create_pdf
62
- make_transparent(-0.5, -0.2)
63
- extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0]
64
- extgstate[:opacity].should == 0.0
65
- extgstate[:stroke_opacity].should == 0.0
66
-
67
- create_pdf
68
- make_transparent(2.0, 3.0)
69
- extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0]
70
- extgstate[:opacity].should == 1.0
71
- extgstate[:stroke_opacity].should == 1.0
72
- end
73
-
74
- describe "with more than one page" do
75
- include TransparencyHelper
76
-
77
- it "the extended graphic state resource should be added to both pages" do
78
- create_pdf
79
- make_transparent(0.5, 0.2)
80
- @pdf.start_new_page
81
- make_transparent(0.5, 0.2)
82
- extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates
83
- extgstate = extgstates[0]
84
- extgstates.length.should == 2
85
- extgstate[:opacity].should == 0.5
86
- extgstate[:stroke_opacity].should == 0.2
87
- end
88
- end
89
- end