prawn 1.1.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +1 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +9 -40
  7. data/lib/prawn/document/bounding_box.rb +54 -40
  8. data/lib/prawn/document/column_box.rb +8 -10
  9. data/lib/prawn/document/internals.rb +39 -146
  10. data/lib/prawn/document/span.rb +23 -17
  11. data/lib/prawn/document.rb +217 -182
  12. data/lib/prawn/encoding.rb +69 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +124 -104
  15. data/lib/prawn/font_metric_cache.rb +23 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +5 -12
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +140 -88
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +5 -5
  23. data/lib/prawn/graphics/color.rb +46 -44
  24. data/lib/prawn/graphics/dash.rb +27 -11
  25. data/lib/prawn/graphics/join_style.rb +11 -6
  26. data/lib/prawn/graphics/patterns.rb +220 -78
  27. data/lib/prawn/graphics/transformation.rb +20 -12
  28. data/lib/prawn/graphics/transparency.rb +20 -18
  29. data/lib/prawn/graphics.rb +153 -115
  30. data/lib/prawn/grid.rb +93 -50
  31. data/lib/prawn/image_handler.rb +4 -4
  32. data/lib/prawn/images/image.rb +3 -2
  33. data/lib/prawn/images/jpg.rb +31 -24
  34. data/lib/prawn/images/png.rb +101 -68
  35. data/lib/prawn/images.rb +64 -56
  36. data/lib/prawn/measurement_extensions.rb +10 -9
  37. data/lib/prawn/measurements.rb +20 -23
  38. data/lib/prawn/outline.rb +96 -75
  39. data/lib/prawn/repeater.rb +16 -16
  40. data/lib/prawn/security/arcfour.rb +2 -2
  41. data/lib/prawn/security.rb +100 -85
  42. data/lib/prawn/soft_mask.rb +37 -38
  43. data/lib/prawn/stamp.rb +28 -13
  44. data/lib/prawn/text/box.rb +24 -29
  45. data/lib/prawn/text/formatted/arranger.rb +108 -63
  46. data/lib/prawn/text/formatted/box.rb +187 -124
  47. data/lib/prawn/text/formatted/fragment.rb +24 -20
  48. data/lib/prawn/text/formatted/line_wrap.rb +133 -73
  49. data/lib/prawn/text/formatted/parser.rb +147 -127
  50. data/lib/prawn/text/formatted/wrap.rb +48 -35
  51. data/lib/prawn/text/formatted.rb +5 -5
  52. data/lib/prawn/text.rb +103 -68
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +10 -22
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +39 -54
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +34 -25
  60. data/manual/basic_concepts/creation.rb +10 -11
  61. data/manual/basic_concepts/cursor.rb +4 -5
  62. data/manual/basic_concepts/measurement.rb +8 -9
  63. data/manual/basic_concepts/origin.rb +5 -6
  64. data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
  65. data/manual/basic_concepts/view.rb +48 -0
  66. data/manual/bounding_box/bounding_box.rb +30 -28
  67. data/manual/bounding_box/bounds.rb +12 -13
  68. data/manual/bounding_box/canvas.rb +7 -8
  69. data/manual/bounding_box/creation.rb +6 -7
  70. data/manual/bounding_box/indentation.rb +14 -15
  71. data/manual/bounding_box/nesting.rb +25 -18
  72. data/manual/bounding_box/russian_boxes.rb +18 -18
  73. data/manual/bounding_box/stretchy.rb +12 -14
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -32
  76. data/manual/document_and_page_options/background.rb +15 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +24 -22
  78. data/manual/document_and_page_options/metadata.rb +20 -18
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -13
  81. data/manual/document_and_page_options/print_scaling.rb +18 -15
  82. data/manual/example_helper.rb +5 -4
  83. data/manual/graphics/blend_mode.rb +52 -0
  84. data/manual/graphics/circle_and_ellipse.rb +4 -5
  85. data/manual/graphics/color.rb +7 -9
  86. data/manual/graphics/common_lines.rb +7 -8
  87. data/manual/graphics/fill_and_stroke.rb +5 -6
  88. data/manual/graphics/fill_rules.rb +12 -11
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +46 -40
  91. data/manual/graphics/helper.rb +19 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +8 -9
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -9
  97. data/manual/graphics/scale.rb +14 -13
  98. data/manual/graphics/soft_masks.rb +4 -6
  99. data/manual/graphics/stroke_cap.rb +7 -8
  100. data/manual/graphics/stroke_dash.rb +15 -16
  101. data/manual/graphics/stroke_join.rb +6 -7
  102. data/manual/graphics/translate.rb +10 -10
  103. data/manual/graphics/transparency.rb +7 -9
  104. data/manual/how_to_read_this_manual.rb +8 -9
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +10 -11
  108. data/manual/images/images.rb +28 -27
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +16 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +10 -11
  114. data/manual/layout/content.rb +9 -10
  115. data/manual/layout/layout.rb +17 -18
  116. data/manual/layout/simple_grid.rb +6 -7
  117. data/manual/outline/add_subsection_to.rb +20 -21
  118. data/manual/outline/insert_section_after.rb +15 -16
  119. data/manual/outline/outline.rb +22 -21
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +27 -23
  124. data/manual/repeatable_content/repeater.rb +15 -16
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +8 -11
  127. data/manual/security/permissions.rb +20 -15
  128. data/manual/security/security.rb +18 -18
  129. data/manual/table.rb +16 -0
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -12
  132. data/manual/text/column_box.rb +9 -11
  133. data/manual/text/fallback_fonts.rb +25 -21
  134. data/manual/text/font.rb +11 -12
  135. data/manual/text/font_size.rb +13 -14
  136. data/manual/text/font_style.rb +10 -8
  137. data/manual/text/formatted_callbacks.rb +33 -23
  138. data/manual/text/formatted_text.rb +36 -25
  139. data/manual/text/free_flowing_text.rb +22 -23
  140. data/manual/text/inline.rb +18 -19
  141. data/manual/text/kerning_and_character_spacing.rb +14 -15
  142. data/manual/text/leading.rb +7 -8
  143. data/manual/text/line_wrapping.rb +37 -18
  144. data/manual/text/paragraph_indentation.rb +15 -10
  145. data/manual/text/positioned_text.rb +16 -17
  146. data/manual/text/registering_families.rb +27 -24
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +30 -19
  149. data/manual/text/rotation.rb +33 -24
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +56 -54
  152. data/manual/text/text_box_excess.rb +20 -17
  153. data/manual/text/text_box_extensions.rb +18 -15
  154. data/manual/text/text_box_overflow.rb +24 -17
  155. data/manual/text/utf8.rb +12 -13
  156. data/manual/text/win_ansi_charset.rb +28 -25
  157. data/prawn.gemspec +45 -50
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  160. data/spec/prawn/document/column_box_spec.rb +75 -0
  161. data/spec/prawn/document/security_spec.rb +176 -0
  162. data/spec/prawn/document_annotations_spec.rb +76 -0
  163. data/spec/prawn/document_destinations_spec.rb +15 -0
  164. data/spec/prawn/document_grid_spec.rb +99 -0
  165. data/spec/prawn/document_reference_spec.rb +27 -0
  166. data/spec/prawn/document_span_spec.rb +44 -0
  167. data/spec/prawn/document_spec.rb +805 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +544 -0
  170. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  171. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  172. data/spec/prawn/graphics_spec.rb +872 -0
  173. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  174. data/spec/prawn/image_handler_spec.rb +53 -0
  175. data/spec/prawn/images/jpg_spec.rb +20 -0
  176. data/spec/prawn/images/png_spec.rb +283 -0
  177. data/spec/prawn/images_spec.rb +229 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +512 -0
  180. data/spec/prawn/repeater_spec.rb +166 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +173 -0
  183. data/spec/prawn/text/box_spec.rb +1110 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +150 -0
  190. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  191. data/spec/prawn/text_spacing_spec.rb +95 -0
  192. data/spec/prawn/text_spec.rb +603 -0
  193. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  194. data/spec/prawn/transformation_stack_spec.rb +66 -0
  195. data/spec/prawn/view_spec.rb +63 -0
  196. data/spec/prawn_manual_spec.rb +35 -0
  197. data/spec/spec_helper.rb +19 -25
  198. data.tar.gz.sig +0 -0
  199. metadata +113 -276
  200. metadata.gz.sig +0 -0
  201. data/data/encodings/win_ansi.txt +0 -29
  202. data/data/images/16bit.alpha +0 -0
  203. data/data/images/16bit.color +0 -0
  204. data/data/images/16bit.png +0 -0
  205. data/data/images/arrow.png +0 -0
  206. data/data/images/arrow2.png +0 -0
  207. data/data/images/dice.alpha +0 -0
  208. data/data/images/dice.color +0 -0
  209. data/data/images/dice.png +0 -0
  210. data/data/images/dice_interlaced.png +0 -0
  211. data/data/images/fractal.jpg +0 -0
  212. data/data/images/indexed_color.dat +0 -0
  213. data/data/images/indexed_color.png +0 -0
  214. data/data/images/letterhead.jpg +0 -0
  215. data/data/images/license.md +0 -8
  216. data/data/images/page_white_text.alpha +0 -0
  217. data/data/images/page_white_text.color +0 -0
  218. data/data/images/page_white_text.png +0 -0
  219. data/data/images/pigs.jpg +0 -0
  220. data/data/images/prawn.png +0 -0
  221. data/data/images/ruport.png +0 -0
  222. data/data/images/ruport_data.dat +0 -0
  223. data/data/images/ruport_transparent.png +0 -0
  224. data/data/images/ruport_type0.png +0 -0
  225. data/data/images/stef.jpg +0 -0
  226. data/data/images/tru256.bmp +0 -0
  227. data/data/images/web-links.dat +0 -1
  228. data/data/images/web-links.png +0 -0
  229. data/data/pdfs/complex_template.pdf +0 -0
  230. data/data/pdfs/contains_ttf_font.pdf +0 -0
  231. data/data/pdfs/encrypted.pdf +0 -0
  232. data/data/pdfs/form.pdf +1 -819
  233. data/data/pdfs/hexagon.pdf +0 -61
  234. data/data/pdfs/indirect_reference.pdf +0 -86
  235. data/data/pdfs/multipage_template.pdf +0 -127
  236. data/data/pdfs/nested_pages.pdf +0 -118
  237. data/data/pdfs/page_without_mediabox.pdf +0 -193
  238. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  239. data/data/pdfs/two_hexagons.pdf +0 -90
  240. data/data/pdfs/version_1_6.pdf +0 -61
  241. data/data/shift_jis_text.txt +0 -1
  242. data/lib/prawn/document/graphics_state.rb +0 -73
  243. data/lib/prawn/font/afm.rb +0 -247
  244. data/lib/prawn/table/cell/image.rb +0 -69
  245. data/lib/prawn/table/cell/in_table.rb +0 -33
  246. data/lib/prawn/table/cell/span_dummy.rb +0 -93
  247. data/lib/prawn/table/cell/subtable.rb +0 -66
  248. data/lib/prawn/table/cell/text.rb +0 -154
  249. data/lib/prawn/table/cell.rb +0 -772
  250. data/lib/prawn/table/cells.rb +0 -255
  251. data/lib/prawn/table/column_width_calculator.rb +0 -182
  252. data/lib/prawn/table.rb +0 -644
  253. data/manual/table/basic_block.rb +0 -53
  254. data/manual/table/before_rendering_page.rb +0 -26
  255. data/manual/table/cell_border_lines.rb +0 -24
  256. data/manual/table/cell_borders_and_bg.rb +0 -31
  257. data/manual/table/cell_dimensions.rb +0 -30
  258. data/manual/table/cell_text.rb +0 -38
  259. data/manual/table/column_widths.rb +0 -30
  260. data/manual/table/content_and_subtables.rb +0 -39
  261. data/manual/table/creation.rb +0 -27
  262. data/manual/table/filtering.rb +0 -36
  263. data/manual/table/flow_and_header.rb +0 -17
  264. data/manual/table/image_cells.rb +0 -33
  265. data/manual/table/position.rb +0 -29
  266. data/manual/table/row_colors.rb +0 -20
  267. data/manual/table/span.rb +0 -30
  268. data/manual/table/style.rb +0 -22
  269. data/manual/table/table.rb +0 -52
  270. data/manual/table/width.rb +0 -27
  271. data/spec/acceptance/png.rb +0 -25
  272. data/spec/annotations_spec.rb +0 -74
  273. data/spec/bounding_box_spec.rb +0 -510
  274. data/spec/cell_spec.rb +0 -629
  275. data/spec/column_box_spec.rb +0 -65
  276. data/spec/destinations_spec.rb +0 -15
  277. data/spec/document_spec.rb +0 -730
  278. data/spec/extensions/mocha.rb +0 -46
  279. data/spec/font_metric_cache_spec.rb +0 -52
  280. data/spec/font_spec.rb +0 -449
  281. data/spec/formatted_text_arranger_spec.rb +0 -421
  282. data/spec/formatted_text_box_spec.rb +0 -639
  283. data/spec/formatted_text_fragment_spec.rb +0 -298
  284. data/spec/graphics_spec.rb +0 -669
  285. data/spec/grid_spec.rb +0 -96
  286. data/spec/image_handler_spec.rb +0 -54
  287. data/spec/images_spec.rb +0 -153
  288. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  289. data/spec/jpg_spec.rb +0 -25
  290. data/spec/line_wrap_spec.rb +0 -344
  291. data/spec/measurement_units_spec.rb +0 -25
  292. data/spec/outline_spec.rb +0 -430
  293. data/spec/png_spec.rb +0 -237
  294. data/spec/reference_spec.rb +0 -25
  295. data/spec/repeater_spec.rb +0 -160
  296. data/spec/security_spec.rb +0 -158
  297. data/spec/soft_mask_spec.rb +0 -79
  298. data/spec/span_spec.rb +0 -44
  299. data/spec/stamp_spec.rb +0 -160
  300. data/spec/stroke_styles_spec.rb +0 -211
  301. data/spec/table/span_dummy_spec.rb +0 -17
  302. data/spec/table_spec.rb +0 -1527
  303. data/spec/text_at_spec.rb +0 -115
  304. data/spec/text_box_spec.rb +0 -1034
  305. data/spec/text_rendering_mode_spec.rb +0 -45
  306. data/spec/text_spacing_spec.rb +0 -93
  307. data/spec/text_spec.rb +0 -437
  308. data/spec/text_with_inline_formatting_spec.rb +0 -35
  309. data/spec/transparency_spec.rb +0 -91
@@ -1,46 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # Allow speccing things when an expectation matcher runs. Similar to #with, but
4
- # always succeeds.
5
- #
6
- # @pdf.expects(:stroke_line).checking do |from, to|
7
- # @pdf.map_to_absolute(from).should == [0, 0]
8
- # end
9
- #
10
- # Note that the outer expectation does *not* fail only because the inner one
11
- # does; in the above example, the outer expectation would only fail if
12
- # stroke_line were not called.
13
-
14
- class ParameterChecker < Mocha::ParametersMatcher
15
- def initialize(&matching_block)
16
- @expected_parameters = [Mocha::ParameterMatchers::AnyParameters.new]
17
- @matching_block = matching_block
18
- end
19
-
20
- def match?(actual_parameters = [])
21
- @matching_block.call(*actual_parameters)
22
-
23
- true # always succeed
24
- end
25
- end
26
-
27
- class Mocha::Expectation
28
- def checking(&block)
29
- @parameters_matcher = ParameterChecker.new(&block)
30
- self
31
- end
32
- end
33
-
34
-
35
- # Equivalent to expects(method_name).at_least(0). More useful when combined
36
- # with parameter matchers to ignore certain calls for the sake of parameter
37
- # matching.
38
- #
39
- # @pdf.ignores(:stroke_color=).with("000000")
40
- # @pdf.expects(:stroke_color=).with("ff0000")
41
- #
42
- module Mocha::ObjectMethods
43
- def ignores(method_name)
44
- expects(method_name).at_least(0)
45
- end
46
- 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,449 +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
- it "should not treat minus as if it were a hyphen", :issue => 578 do
84
- create_pdf
85
-
86
- @pdf.width_of("-0.75").should be < @pdf.width_of("25.00")
87
- end
88
- end
89
-
90
- describe "#font_size" do
91
- it "should allow setting font size in DSL style" do
92
- create_pdf
93
- @pdf.font_size 20
94
- @pdf.font_size.should == 20
95
- end
96
- end
97
-
98
- describe "font style support" do
99
- before(:each) { create_pdf }
100
-
101
- it "should complain if there is no @current_page" do
102
- pdf_without_page = Prawn::Document.new(:skip_page_creation => true)
103
-
104
- lambda{ pdf_without_page.font "Helvetica" }.
105
- should raise_error(Prawn::Errors::NotOnPage)
106
- end
107
-
108
- it "should allow specifying font style by style name and font family" do
109
- @pdf.font "Courier", :style => :bold
110
- @pdf.text "In Courier bold"
111
-
112
- @pdf.font "Courier", :style => :bold_italic
113
- @pdf.text "In Courier bold-italic"
114
-
115
- @pdf.font "Courier", :style => :italic
116
- @pdf.text "In Courier italic"
117
-
118
- @pdf.font "Courier", :style => :normal
119
- @pdf.text "In Normal Courier"
120
-
121
- @pdf.font "Helvetica"
122
- @pdf.text "In Normal Helvetica"
123
-
124
- text = PDF::Inspector::Text.analyze(@pdf.render)
125
- text.font_settings.map { |e| e[:name] }.should ==
126
- [:"Courier-Bold", :"Courier-BoldOblique", :"Courier-Oblique",
127
- :Courier, :Helvetica]
128
- end
129
-
130
- it "should allow font familes to be defined in a single dfont" do
131
- file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont"
132
- @pdf.font_families["Panic Sans"] = {
133
- :normal => { :file => file, :font => "PanicSans" },
134
- :italic => { :file => file, :font => "PanicSans-Italic" },
135
- :bold => { :file => file, :font => "PanicSans-Bold" },
136
- :bold_italic => { :file => file, :font => "PanicSans-BoldItalic" }
137
- }
138
-
139
- @pdf.font "Panic Sans", :style => :italic
140
- @pdf.text "In PanicSans-Italic"
141
-
142
- text = PDF::Inspector::Text.analyze(@pdf.render)
143
- name = text.font_settings.map { |e| e[:name] }.first.to_s
144
- name = name.sub(/\w+\+/, "subset+")
145
- name.should == "subset+PanicSans-Italic"
146
- end
147
-
148
- it "should accept Pathname objects for font files" do
149
- file = Pathname.new( "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" )
150
- @pdf.font_families["DejaVu Sans"] = {
151
- :normal => file
152
- }
153
-
154
- @pdf.font "DejaVu Sans"
155
- @pdf.text "In DejaVu Sans"
156
-
157
- text = PDF::Inspector::Text.analyze(@pdf.render)
158
- name = text.font_settings.map { |e| e[:name] }.first.to_s
159
- name = name.sub(/\w+\+/, "subset+")
160
- name.should == "subset+DejaVuSans"
161
- end
162
-
163
- it "should accept IO objects for font files" do
164
- io = File.open "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
165
- @pdf.font_families["DejaVu Sans"] = {
166
- normal: Prawn::Font.load(@pdf, io)
167
- }
168
-
169
- @pdf.font "DejaVu Sans"
170
- @pdf.text "In DejaVu Sans"
171
-
172
- text = PDF::Inspector::Text.analyze(@pdf.render)
173
- name = text.font_settings.map { |e| e[:name] }.first.to_s
174
- name = name.sub(/\w+\+/, "subset+")
175
- name.should == "subset+DejaVuSans"
176
- end
177
- end
178
-
179
- describe "Transactional font handling" do
180
- before(:each) { create_pdf }
181
-
182
- it "should allow setting of size directly when font is created" do
183
- @pdf.font "Courier", :size => 16
184
- @pdf.font_size.should == 16
185
- end
186
-
187
- it "should allow temporary setting of a new font using a transaction" do
188
- @pdf.font "Helvetica", :size => 12
189
-
190
- @pdf.font "Courier", :size => 16 do
191
- @pdf.font.name.should == "Courier"
192
- @pdf.font_size.should == 16
193
- end
194
-
195
- @pdf.font.name.should == "Helvetica"
196
- @pdf.font_size.should == 12
197
- end
198
-
199
- it "should mask font size when using a transacation" do
200
- @pdf.font "Courier", :size => 16 do
201
- @pdf.font_size.should == 16
202
- end
203
-
204
- @pdf.font "Times-Roman"
205
- @pdf.font "Courier"
206
-
207
- @pdf.font_size.should == 12
208
- end
209
-
210
- end
211
-
212
- describe "Document#page_fonts" do
213
- before(:each) { create_pdf }
214
-
215
- it "should register fonts properly by page" do
216
- @pdf.font "Courier"; @pdf.text("hello")
217
- @pdf.font "Helvetica"; @pdf.text("hello")
218
- @pdf.font "Times-Roman"; @pdf.text("hello")
219
- ["Courier","Helvetica","Times-Roman"].each { |f|
220
- page_should_include_font(f)
221
- }
222
-
223
- @pdf.start_new_page
224
- @pdf.font "Helvetica"; @pdf.text("hello")
225
- page_should_include_font("Helvetica")
226
- page_should_not_include_font("Courier")
227
- page_should_not_include_font("Times-Roman")
228
- end
229
-
230
- def page_includes_font?(font)
231
- @pdf.page.fonts.values.map { |e| e.data[:BaseFont] }.include?(font.to_sym)
232
- end
233
-
234
- def page_should_include_font(font)
235
- page_includes_font?(font).should be_true
236
- end
237
-
238
- def page_should_not_include_font(font)
239
- page_includes_font?(font).should be_false
240
- end
241
-
242
- end
243
-
244
- describe "AFM fonts" do
245
-
246
- before do
247
- create_pdf
248
- @times = @pdf.find_font "Times-Roman"
249
- end
250
-
251
- it "should calculate string width taking into account accented characters" do
252
- input = win1252_string("\xE9")# é in win-1252
253
- @times.compute_width_of(input, :size => 12).should == @times.compute_width_of("e", :size => 12)
254
- end
255
-
256
- it "should calculate string width taking into account kerning pairs" do
257
- @times.compute_width_of(win1252_string("To"), :size => 12).should == 13.332
258
- @times.compute_width_of(win1252_string("To"), :size => 12, :kerning => true).should == 12.372
259
-
260
- input = win1252_string("T\xF6") # Tö in win-1252
261
- @times.compute_width_of(input, :size => 12, :kerning => true).should == 12.372
262
- end
263
-
264
- it "should encode text without kerning by default" do
265
- @times.encode_text(win1252_string("To")).should == [[0, "To"]]
266
- input = win1252_string("T\xE9l\xE9") # Télé in win-1252
267
- @times.encode_text(input).should == [[0, input]]
268
- @times.encode_text(win1252_string("Technology")).should == [[0, "Technology"]]
269
- @times.encode_text(win1252_string("Technology...")).should == [[0, "Technology..."]]
270
- end
271
-
272
- it "should encode text with kerning if requested" do
273
- @times.encode_text(win1252_string("To"), :kerning => true).should == [[0, ["T", 80, "o"]]]
274
- input = win1252_string("T\xE9l\xE9") # Télé in win-1252
275
- output = win1252_string("\xE9l\xE9") # élé in win-1252
276
- @times.encode_text(input, :kerning => true).should == [[0, ["T", 70, output]]]
277
- @times.encode_text(win1252_string("Technology"), :kerning => true).should == [[0, ["T", 70, "echnology"]]]
278
- @times.encode_text(win1252_string("Technology..."), :kerning => true).should == [[0, ["T", 70, "echnology", 65, "..."]]]
279
- end
280
-
281
- describe "when normalizing encoding" do
282
-
283
- it "should not modify the original string when normalize_encoding() is used" do
284
- original = "Foo"
285
- normalized = @times.normalize_encoding(original)
286
- original.equal?(normalized).should be_false
287
- end
288
-
289
- it "should modify the original string when normalize_encoding!() is used" do
290
- original = "Foo"
291
- normalized = @times.normalize_encoding!(original)
292
- original.equal?(normalized).should be_true
293
- end
294
-
295
- end
296
-
297
- it "should omit /Encoding for symbolic fonts" do
298
- zapf = @pdf.find_font "ZapfDingbats"
299
- font_dict = zapf.send(:register, nil)
300
- font_dict.data[:Encoding].should == nil
301
- end
302
-
303
- end
304
-
305
- describe "#glyph_present" do
306
- before(:each) { create_pdf }
307
-
308
- it "should return true when present in an AFM font" do
309
- font = @pdf.find_font("Helvetica")
310
- font.glyph_present?("H").should be_true
311
- end
312
-
313
- it "should return false when absent in an AFM font" do
314
- font = @pdf.find_font("Helvetica")
315
- font.glyph_present?("再").should be_false
316
- end
317
-
318
- it "should return true when present in a TTF font" do
319
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
320
- font.glyph_present?("H").should be_true
321
- end
322
-
323
- it "should return false when absent in a TTF font" do
324
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
325
- font.glyph_present?("再").should be_false
326
-
327
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
328
- font.glyph_present?("€").should be_false
329
- end
330
- end
331
-
332
- describe "TTF fonts" do
333
-
334
- before do
335
- create_pdf
336
- @font = @pdf.find_font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
337
- end
338
-
339
- it "should calculate string width taking into account accented characters" do
340
- @font.compute_width_of("é", :size => 12).should == @font.compute_width_of("e", :size => 12)
341
- end
342
-
343
- it "should calculate string width taking into account kerning pairs" do
344
- @font.compute_width_of("To", :size => 12).should be_within(0.01).of(14.65)
345
- @font.compute_width_of("To", :size => 12, :kerning => true).should be_within(0.01).of(12.61)
346
- end
347
-
348
- it "should encode text without kerning by default" do
349
- @font.encode_text("To").should == [[0, "To"]]
350
-
351
- tele = "T\216l\216"
352
- result = @font.encode_text("Télé")
353
- result.length.should == 1
354
- result[0][0].should == 0
355
- result[0][1].bytes.to_a.should == tele.bytes.to_a
356
-
357
- @font.encode_text("Technology").should == [[0, "Technology"]]
358
- @font.encode_text("Technology...").should == [[0, "Technology..."]]
359
- @font.encode_text("Teχnology...").should == [[0, "Te"], [1, "!"], [0, "nology..."]]
360
- end
361
-
362
- it "should encode text with kerning if requested" do
363
- @font.encode_text("To", :kerning => true).should == [[0, ["T", 169.921875, "o"]]]
364
- @font.encode_text("Technology", :kerning => true).should == [[0, ["T", 169.921875, "echnology"]]]
365
- @font.encode_text("Technology...", :kerning => true).should == [[0, ["T", 169.921875, "echnology", 142.578125, "..."]]]
366
- @font.encode_text("Teχnology...", :kerning => true).should == [[0, ["T", 169.921875, "e"]], [1, "!"], [0, ["nology", 142.578125, "..."]]]
367
- end
368
-
369
- it "should use the ascender, descender, and cap height from the TTF verbatim" do
370
- # These metrics are relative to the font's own bbox. They should not be
371
- # scaled with font size.
372
- ref = @pdf.ref!({})
373
- @font.send :embed, ref, 0
374
-
375
- # Pull out the embedded font descriptor
376
- descriptor = ref.data[:FontDescriptor].data
377
- descriptor[:Ascent].should == 759
378
- descriptor[:Descent].should == -240
379
- descriptor[:CapHeight].should == 759
380
- end
381
-
382
- describe "when normalizing encoding" do
383
- it "should not modify the original string when normalize_encoding() is used" do
384
- original = "Foo"
385
- normalized = @font.normalize_encoding(original)
386
- original.equal?(normalized).should be_false
387
- end
388
-
389
- it "should modify the original string when normalize_encoding!() is used" do
390
- original = "Foo"
391
- normalized = @font.normalize_encoding!(original)
392
- original.equal?(normalized).should be_true
393
- end
394
-
395
- end
396
- end
397
-
398
- describe "DFont fonts" do
399
- before do
400
- create_pdf
401
- @file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont"
402
- end
403
-
404
- it "should list all named fonts" do
405
- list = Prawn::Font::DFont.named_fonts(@file)
406
- list.sort.should == %w(PanicSans PanicSans-Italic PanicSans-Bold PanicSans-BoldItalic).sort
407
- end
408
-
409
- it "should count the number of fonts in the file" do
410
- Prawn::Font::DFont.font_count(@file).should == 4
411
- end
412
-
413
- it "should default selected font to the first one if not specified" do
414
- font = @pdf.find_font(@file)
415
- font.basename.should == "PanicSans"
416
- end
417
-
418
- it "should allow font to be selected by index" do
419
- font = @pdf.find_font(@file, :font => 2)
420
- font.basename.should == "PanicSans-Italic"
421
- end
422
-
423
- it "should allow font to be selected by name" do
424
- font = @pdf.find_font(@file, :font => "PanicSans-BoldItalic")
425
- font.basename.should == "PanicSans-BoldItalic"
426
- end
427
-
428
- it "should cache font object based on selected font" do
429
- f1 = @pdf.find_font(@file, :font => "PanicSans")
430
- f2 = @pdf.find_font(@file, :font => "PanicSans-Bold")
431
- f2.object_id.should_not == f1.object_id
432
- @pdf.find_font(@file, :font => "PanicSans").object_id.should == f1.object_id
433
- @pdf.find_font(@file, :font => "PanicSans-Bold").object_id.should == f2.object_id
434
- end
435
- end
436
-
437
- describe "#character_count(text)" do
438
- it "should work on TTF fonts" do
439
- create_pdf
440
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
441
- @pdf.font.character_count("こんにちは世界").should == 7
442
- @pdf.font.character_count("Hello, world!").should == 13
443
- end
444
-
445
- it "should work on AFM fonts" do
446
- create_pdf
447
- @pdf.font.character_count("Hello, world!").should == 13
448
- end
449
- end