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,44 +0,0 @@
1
- # Allow speccing things when an expectation matcher runs. Similar to #with, but
2
- # always succeeds.
3
- #
4
- # @pdf.expects(:stroke_line).checking do |from, to|
5
- # @pdf.map_to_absolute(from).should == [0, 0]
6
- # end
7
- #
8
- # Note that the outer expectation does *not* fail only because the inner one
9
- # does; in the above example, the outer expectation would only fail if
10
- # stroke_line were not called.
11
-
12
- class ParameterChecker < Mocha::ParametersMatcher
13
- def initialize(&matching_block)
14
- @expected_parameters = [Mocha::ParameterMatchers::AnyParameters.new]
15
- @matching_block = matching_block
16
- end
17
-
18
- def match?(actual_parameters = [])
19
- @matching_block.call(*actual_parameters)
20
-
21
- true # always succeed
22
- end
23
- end
24
-
25
- class Mocha::Expectation
26
- def checking(&block)
27
- @parameters_matcher = ParameterChecker.new(&block)
28
- self
29
- end
30
- end
31
-
32
-
33
- # Equivalent to expects(method_name).at_least(0). More useful when combined
34
- # with parameter matchers to ignore certain calls for the sake of parameter
35
- # matching.
36
- #
37
- # @pdf.ignores(:stroke_color=).with("000000")
38
- # @pdf.expects(:stroke_color=).with("ff0000")
39
- #
40
- module Mocha::ObjectMethods
41
- def ignores(method_name)
42
- expects(method_name).at_least(0)
43
- end
44
- end
data/spec/filters_spec.rb DELETED
@@ -1,34 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- FILTERS = {
6
- :FlateDecode => {'test' => ruby_19 { "x\x9C+I-.\x01\x00\x04]\x01\xC1".force_encoding(Encoding::ASCII_8BIT) } || "x\x9C+I-.\x01\x00\x04]\x01\xC1" },
7
- :DCTDecode => {'test' => "test"}
8
- }
9
-
10
- FILTERS.each do |filter_name, examples|
11
- filter = PDF::Core::Filters.const_get(filter_name)
12
-
13
- describe "#{filter_name} filter" do
14
- it "should encode stream" do
15
- examples.each do |in_stream, out_stream|
16
- filter.encode(in_stream).should == out_stream
17
- end
18
- end
19
-
20
- it "should decode stream" do
21
- examples.each do |in_stream, out_stream|
22
- filter.decode(out_stream).should == in_stream
23
- end
24
- end
25
-
26
- it "should be symmetric" do
27
- examples.each do |in_stream, out_stream|
28
- filter.decode(filter.encode(in_stream)).should == in_stream
29
-
30
- filter.encode(filter.decode(out_stream)).should == out_stream
31
- end
32
- end
33
- end
34
- end
@@ -1,52 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
- require 'pathname'
5
-
6
- describe "Font metrics caching" do
7
- let(:document) { Prawn::Document.new }
8
-
9
- subject { Prawn::FontMetricCache.new( document ) }
10
-
11
- it "should start with an empty cache" do
12
- subject.instance_variable_get( :@cache ).should be_empty
13
- end
14
-
15
- it "should cache the width of the provided string" do
16
- subject.width_of('M', {})
17
-
18
- subject.instance_variable_get( :@cache ).should have(1).entry
19
- end
20
-
21
- it "should only cache a single copy of the same string" do
22
- subject.width_of('M', {})
23
- subject.width_of('M', {})
24
-
25
- subject.instance_variable_get( :@cache ).should have(1).entry
26
- end
27
-
28
- it "should cache different copies for different strings" do
29
- subject.width_of('M', {})
30
- subject.width_of('W', {})
31
-
32
- subject.instance_variable_get( :@cache ).should have(2).entries
33
- end
34
-
35
- it "should cache different copies of the same string with different font sizes" do
36
- subject.width_of('M', {})
37
-
38
- document.font_size 24
39
- subject.width_of('M', {})
40
-
41
- subject.instance_variable_get( :@cache ).should have(2).entries
42
- end
43
-
44
- it "should cache different copies of the same string with different fonts" do
45
- subject.width_of('M', {})
46
-
47
- document.font 'Courier'
48
- subject.width_of('M', {})
49
-
50
- subject.instance_variable_get( :@cache ).should have(2).entries
51
- end
52
- end
data/spec/font_spec.rb DELETED
@@ -1,464 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
- require 'pathname'
5
-
6
- describe "Font behavior" do
7
-
8
- it "should default to Helvetica if no font is specified" do
9
- @pdf = Prawn::Document.new
10
- @pdf.font.name.should == "Helvetica"
11
- end
12
-
13
- end
14
-
15
- describe "Font objects" do
16
-
17
- it "should be equal" do
18
- font1 = Prawn::Document.new.font
19
- font2 = Prawn::Document.new.font
20
-
21
- font1.should eql( font2 )
22
- end
23
-
24
- it "should always be the same key" do
25
- font1 = Prawn::Document.new.font
26
- font2 = Prawn::Document.new.font
27
-
28
- hash = Hash.new
29
-
30
- hash[ font1 ] = "Original"
31
- hash[ font2 ] = "Overwritten"
32
-
33
- hash.size.should == 1
34
-
35
- hash[ font1 ].should == "Overwritten"
36
- hash[ font2 ].should == "Overwritten"
37
- end
38
-
39
- end
40
-
41
- describe "#width_of" do
42
- it "should take character spacing into account" do
43
- create_pdf
44
- original_width = @pdf.width_of("hello world")
45
- @pdf.character_spacing(7) do
46
- @pdf.width_of("hello world").should == original_width + 11 * 7
47
- end
48
- end
49
-
50
- it "should exclude newlines" do
51
- create_pdf
52
- # Use a TTF font that has a non-zero width for \n
53
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
54
-
55
- @pdf.width_of("\nhello world\n").should ==
56
- @pdf.width_of("hello world")
57
- end
58
-
59
- it "should take formatting into account" do
60
- create_pdf
61
-
62
- normal_hello = @pdf.width_of("hello")
63
- inline_bold_hello = @pdf.width_of("<b>hello</b>", :inline_format => true)
64
- @pdf.font("Helvetica", :style => :bold) {
65
- @bold_hello = @pdf.width_of("hello")
66
- }
67
-
68
- inline_bold_hello.should be > normal_hello
69
- inline_bold_hello.should == @bold_hello
70
- end
71
-
72
- it "should accept :style as an argument" do
73
- create_pdf
74
-
75
- styled_bold_hello = @pdf.width_of("hello", :style => :bold)
76
- @pdf.font("Helvetica", :style => :bold) {
77
- @bold_hello = @pdf.width_of("hello")
78
- }
79
-
80
- styled_bold_hello.should == @bold_hello
81
- end
82
-
83
- # This is not a fully confirmed bug report... needs further investigation
84
- it "should not treat minus as if it were a hyphen", :unresolved, :issue => 578 do
85
- @pdf.width_of("-0.75").should be < @pdf.width_of("25.00")
86
- end
87
- end
88
-
89
- describe "#font_size" do
90
- it "should allow setting font size in DSL style" do
91
- create_pdf
92
- @pdf.font_size 20
93
- @pdf.font_size.should == 20
94
- end
95
- end
96
-
97
- describe "font style support" do
98
- before(:each) { create_pdf }
99
-
100
- it "should complain if there is no @current_page" do
101
- pdf_without_page = Prawn::Document.new(:skip_page_creation => true)
102
-
103
- lambda{ pdf_without_page.font "Helvetica" }.
104
- should raise_error(Prawn::Errors::NotOnPage)
105
- end
106
-
107
- it "should allow specifying font style by style name and font family" do
108
- @pdf.font "Courier", :style => :bold
109
- @pdf.text "In Courier bold"
110
-
111
- @pdf.font "Courier", :style => :bold_italic
112
- @pdf.text "In Courier bold-italic"
113
-
114
- @pdf.font "Courier", :style => :italic
115
- @pdf.text "In Courier italic"
116
-
117
- @pdf.font "Courier", :style => :normal
118
- @pdf.text "In Normal Courier"
119
-
120
- @pdf.font "Helvetica"
121
- @pdf.text "In Normal Helvetica"
122
-
123
- text = PDF::Inspector::Text.analyze(@pdf.render)
124
- text.font_settings.map { |e| e[:name] }.should ==
125
- [:"Courier-Bold", :"Courier-BoldOblique", :"Courier-Oblique",
126
- :Courier, :Helvetica]
127
- end
128
-
129
- it "should allow font familes to be defined in a single dfont" do
130
- file = "#{Prawn::DATADIR}/fonts/Action Man.dfont"
131
- @pdf.font_families["Action Man"] = {
132
- :normal => { :file => file, :font => "ActionMan" },
133
- :italic => { :file => file, :font => "ActionMan-Italic" },
134
- :bold => { :file => file, :font => "ActionMan-Bold" },
135
- :bold_italic => { :file => file, :font => "ActionMan-BoldItalic" }
136
- }
137
-
138
- @pdf.font "Action Man", :style => :italic
139
- @pdf.text "In ActionMan-Italic"
140
-
141
- text = PDF::Inspector::Text.analyze(@pdf.render)
142
- name = text.font_settings.map { |e| e[:name] }.first.to_s
143
- name = name.sub(/\w+\+/, "subset+")
144
- name.should == "subset+ActionMan-Italic"
145
- end
146
-
147
- it "should accept Pathname objects for font files" do
148
- file = Pathname.new( "#{Prawn::DATADIR}/fonts/Chalkboard.ttf" )
149
- @pdf.font_families["Chalkboard"] = {
150
- :normal => file
151
- }
152
-
153
- @pdf.font "Chalkboard"
154
- @pdf.text "In Chalkboard"
155
-
156
- text = PDF::Inspector::Text.analyze(@pdf.render)
157
- name = text.font_settings.map { |e| e[:name] }.first.to_s
158
- name = name.sub(/\w+\+/, "subset+")
159
- name.should == "subset+Chalkboard"
160
- end
161
- end
162
-
163
- describe "Transactional font handling" do
164
- before(:each) { create_pdf }
165
-
166
- it "should allow setting of size directly when font is created" do
167
- @pdf.font "Courier", :size => 16
168
- @pdf.font_size.should == 16
169
- end
170
-
171
- it "should allow temporary setting of a new font using a transaction" do
172
- @pdf.font "Helvetica", :size => 12
173
-
174
- @pdf.font "Courier", :size => 16 do
175
- @pdf.font.name.should == "Courier"
176
- @pdf.font_size.should == 16
177
- end
178
-
179
- @pdf.font.name.should == "Helvetica"
180
- @pdf.font_size.should == 12
181
- end
182
-
183
- it "should mask font size when using a transacation" do
184
- @pdf.font "Courier", :size => 16 do
185
- @pdf.font_size.should == 16
186
- end
187
-
188
- @pdf.font "Times-Roman"
189
- @pdf.font "Courier"
190
-
191
- @pdf.font_size.should == 12
192
- end
193
-
194
- end
195
-
196
- describe "Document#page_fonts" do
197
- before(:each) { create_pdf }
198
-
199
- it "should register fonts properly by page" do
200
- @pdf.font "Courier"; @pdf.text("hello")
201
- @pdf.font "Helvetica"; @pdf.text("hello")
202
- @pdf.font "Times-Roman"; @pdf.text("hello")
203
- ["Courier","Helvetica","Times-Roman"].each { |f|
204
- page_should_include_font(f)
205
- }
206
-
207
- @pdf.start_new_page
208
- @pdf.font "Helvetica"; @pdf.text("hello")
209
- page_should_include_font("Helvetica")
210
- page_should_not_include_font("Courier")
211
- page_should_not_include_font("Times-Roman")
212
- end
213
-
214
- def page_includes_font?(font)
215
- @pdf.page.fonts.values.map { |e| e.data[:BaseFont] }.include?(font.to_sym)
216
- end
217
-
218
- def page_should_include_font(font)
219
- page_includes_font?(font).should be_true
220
- end
221
-
222
- def page_should_not_include_font(font)
223
- page_includes_font?(font).should be_false
224
- end
225
-
226
- end
227
-
228
- describe "AFM fonts" do
229
-
230
- before do
231
- create_pdf
232
- @times = @pdf.find_font "Times-Roman"
233
- end
234
-
235
- it "should calculate string width taking into account accented characters" do
236
- input = win1252_string("\xE9")# é in win-1252
237
- @times.compute_width_of(input, :size => 12).should == @times.compute_width_of("e", :size => 12)
238
- end
239
-
240
- it "should calculate string width taking into account kerning pairs" do
241
- @times.compute_width_of(win1252_string("To"), :size => 12).should == 13.332
242
- @times.compute_width_of(win1252_string("To"), :size => 12, :kerning => true).should == 12.372
243
-
244
- input = win1252_string("T\xF6") # Tö in win-1252
245
- @times.compute_width_of(input, :size => 12, :kerning => true).should == 12.372
246
- end
247
-
248
- it "should encode text without kerning by default" do
249
- @times.encode_text(win1252_string("To")).should == [[0, "To"]]
250
- input = win1252_string("T\xE9l\xE9") # Télé in win-1252
251
- @times.encode_text(input).should == [[0, input]]
252
- @times.encode_text(win1252_string("Technology")).should == [[0, "Technology"]]
253
- @times.encode_text(win1252_string("Technology...")).should == [[0, "Technology..."]]
254
- end
255
-
256
- it "should encode text with kerning if requested" do
257
- @times.encode_text(win1252_string("To"), :kerning => true).should == [[0, ["T", 80, "o"]]]
258
- input = win1252_string("T\xE9l\xE9") # Télé in win-1252
259
- output = win1252_string("\xE9l\xE9") # élé in win-1252
260
- @times.encode_text(input, :kerning => true).should == [[0, ["T", 70, output]]]
261
- @times.encode_text(win1252_string("Technology"), :kerning => true).should == [[0, ["T", 70, "echnology"]]]
262
- @times.encode_text(win1252_string("Technology..."), :kerning => true).should == [[0, ["T", 70, "echnology", 65, "..."]]]
263
- end
264
-
265
- describe "when normalizing encoding" do
266
-
267
- it "should not modify the original string when normalize_encoding() is used" do
268
- original = "Foo"
269
- normalized = @times.normalize_encoding(original)
270
- original.equal?(normalized).should be_false
271
- end
272
-
273
- it "should modify the original string when normalize_encoding!() is used" do
274
- original = "Foo"
275
- normalized = @times.normalize_encoding!(original)
276
- original.equal?(normalized).should be_true
277
- end
278
-
279
- end
280
-
281
- it "should omit /Encoding for symbolic fonts" do
282
- zapf = @pdf.find_font "ZapfDingbats"
283
- font_dict = zapf.send(:register, nil)
284
- font_dict.data[:Encoding].should == nil
285
- end
286
-
287
- end
288
-
289
- describe "#glyph_present" do
290
- before(:each) { create_pdf }
291
-
292
- it "should return true when present in an AFM font" do
293
- font = @pdf.find_font("Helvetica")
294
- font.glyph_present?("H").should be_true
295
- end
296
-
297
- it "should return false when absent in an AFM font" do
298
- font = @pdf.find_font("Helvetica")
299
- font.glyph_present?("再").should be_false
300
- end
301
-
302
- it "should return true when present in a TTF font" do
303
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/Activa.ttf")
304
- font.glyph_present?("H").should be_true
305
- end
306
-
307
- it "should return false when absent in a TTF font" do
308
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/Activa.ttf")
309
- font.glyph_present?("再").should be_false
310
-
311
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
312
- font.glyph_present?("€").should be_false
313
- end
314
- end
315
-
316
- describe "TTF fonts" do
317
-
318
- before do
319
- create_pdf
320
- @activa = @pdf.find_font "#{Prawn::DATADIR}/fonts/Activa.ttf"
321
- end
322
-
323
- it "should calculate string width taking into account accented characters" do
324
- @activa.compute_width_of("é", :size => 12).should == @activa.compute_width_of("e", :size => 12)
325
- end
326
-
327
- it "should calculate string width taking into account kerning pairs" do
328
- @activa.compute_width_of("To", :size => 12).should == 15.228
329
- @activa.compute_width_of("To", :size => 12, :kerning => true).should == 12.996
330
- end
331
-
332
- it "should encode text without kerning by default" do
333
- @activa.encode_text("To").should == [[0, "To"]]
334
-
335
- tele = "T\216l\216"
336
- result = @activa.encode_text("Télé")
337
- result.length.should == 1
338
- result[0][0].should == 0
339
- result[0][1].bytes.to_a.should == tele.bytes.to_a
340
-
341
- @activa.encode_text("Technology").should == [[0, "Technology"]]
342
- @activa.encode_text("Technology...").should == [[0, "Technology..."]]
343
- @activa.encode_text("Teχnology...").should == [[0, "Te"], [1, "!"], [0, "nology..."]]
344
- end
345
-
346
- it "should encode text with kerning if requested" do
347
- @activa.encode_text("To", :kerning => true).should == [[0, ["T", 186.0, "o"]]]
348
- @activa.encode_text("To", :kerning => true).should == [[0, ["T", 186.0, "o"]]]
349
- @activa.encode_text("Technology", :kerning => true).should == [[0, ["T", 186.0, "echnology"]]]
350
- @activa.encode_text("Technology...", :kerning => true).should == [[0, ["T", 186.0, "echnology", 88.0, "..."]]]
351
- @activa.encode_text("Teχnology...", :kerning => true).should == [[0, ["T", 186.0, "e"]], [1, "!"], [0, ["nology", 88.0, "..."]]]
352
- end
353
-
354
- it "should use the ascender, descender, and cap height from the TTF verbatim" do
355
- # These metrics are relative to the font's own bbox. They should not be
356
- # scaled with font size.
357
- ref = @pdf.ref!({})
358
- @activa.send :embed, ref, 0
359
-
360
- # Pull out the embedded font descriptor
361
- descriptor = ref.data[:FontDescriptor].data
362
- descriptor[:Ascent].should == 804
363
- descriptor[:Descent].should == -195
364
- descriptor[:CapHeight].should == 804
365
- end
366
-
367
- describe "when normalizing encoding" do
368
-
369
- it "should not modify the original string when normalize_encoding() is used" do
370
- original = "Foo"
371
- normalized = @activa.normalize_encoding(original)
372
- original.equal?(normalized).should be_false
373
- end
374
-
375
- it "should modify the original string when normalize_encoding!() is used" do
376
- original = "Foo"
377
- normalized = @activa.normalize_encoding!(original)
378
- original.equal?(normalized).should be_true
379
- end
380
-
381
- end
382
-
383
- describe "when used with snapshots or transactions" do
384
-
385
- it "should allow TTF fonts to be used alongside document transactions" do
386
- lambda {
387
- Prawn::Document.new do
388
- font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
389
- text "Hi there"
390
- transaction { text "Nice, thank you" }
391
- end
392
- }.should_not raise_error
393
- end
394
-
395
- it "should allow TTF fonts to be used inside transactions" do
396
- pdf = Prawn::Document.new do
397
- transaction do
398
- font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
399
- text "Hi there"
400
- end
401
- end
402
-
403
- text = PDF::Inspector::Text.analyze(pdf.render)
404
- name = text.font_settings.map { |e| e[:name] }.first.to_s
405
- name = name.sub(/\w+\+/, "subset+")
406
- name.should == "subset+DejaVuSans"
407
- end
408
-
409
- end
410
-
411
- end
412
-
413
- describe "DFont fonts" do
414
- before do
415
- create_pdf
416
- @file = "#{Prawn::DATADIR}/fonts/Action Man.dfont"
417
- end
418
-
419
- it "should list all named fonts" do
420
- list = Prawn::Font::DFont.named_fonts(@file)
421
- list.sort.should == %w(ActionMan ActionMan-Italic ActionMan-Bold ActionMan-BoldItalic).sort
422
- end
423
-
424
- it "should count the number of fonts in the file" do
425
- Prawn::Font::DFont.font_count(@file).should == 4
426
- end
427
-
428
- it "should default selected font to the first one if not specified" do
429
- font = @pdf.find_font(@file)
430
- font.basename.should == "ActionMan"
431
- end
432
-
433
- it "should allow font to be selected by index" do
434
- font = @pdf.find_font(@file, :font => 2)
435
- font.basename.should == "ActionMan-Italic"
436
- end
437
-
438
- it "should allow font to be selected by name" do
439
- font = @pdf.find_font(@file, :font => "ActionMan-BoldItalic")
440
- font.basename.should == "ActionMan-BoldItalic"
441
- end
442
-
443
- it "should cache font object based on selected font" do
444
- f1 = @pdf.find_font(@file, :font => "ActionMan")
445
- f2 = @pdf.find_font(@file, :font => "ActionMan-Bold")
446
- f2.object_id.should_not == f1.object_id
447
- @pdf.find_font(@file, :font => "ActionMan").object_id.should == f1.object_id
448
- @pdf.find_font(@file, :font => "ActionMan-Bold").object_id.should == f2.object_id
449
- end
450
- end
451
-
452
- describe "#character_count(text)" do
453
- it "should work on TTF fonts" do
454
- create_pdf
455
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
456
- @pdf.font.character_count("こんにちは世界").should == 7
457
- @pdf.font.character_count("Hello, world!").should == 13
458
- end
459
-
460
- it "should work on AFM fonts" do
461
- create_pdf
462
- @pdf.font.character_count("Hello, world!").should == 13
463
- end
464
- end