prawn 0.13.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
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