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,333 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Core::Text::Formatted::LineWrap#wrap_line" do
6
- before(:each) do
7
- create_pdf
8
- @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
9
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
10
- @one_word_width = 50
11
- end
12
- it "should strip leading and trailing spaces" do
13
- array = [{ :text => " hello world, " },
14
- { :text => "goodbye ", :style => [:bold] }]
15
- @arranger.format_array = array
16
- string = @line_wrap.wrap_line(:arranger => @arranger,
17
- :width => 300,
18
- :document => @pdf)
19
- string.should == "hello world, goodbye"
20
- end
21
- it "should strip trailing spaces when a white-space-only fragment was" +
22
- " successfully pushed onto the end of a line but no other non-white" +
23
- " space fragment fits after it" do
24
- array = [{ :text => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " },
25
- { :text => " ", :style => [:bold] },
26
- { :text => " bbbbbbbbbbbbbbbbbbbbbbbbbbbb" }]
27
- @arranger.format_array = array
28
- string = @line_wrap.wrap_line(:arranger => @arranger,
29
- :width => 300,
30
- :document => @pdf)
31
- string.should == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
32
- end
33
- it "should raise_error CannotFit if a too-small width is given" do
34
- array = [{ :text => " hello world, " },
35
- { :text => "goodbye ", :style => [:bold] }]
36
- @arranger.format_array = array
37
- lambda do
38
- @line_wrap.wrap_line(:arranger => @arranger,
39
- :width => 1,
40
- :document => @pdf)
41
- end.should raise_error(Prawn::Errors::CannotFit)
42
- end
43
-
44
- it "should break on space" do
45
- array = [{ :text => "hello world" }]
46
- @arranger.format_array = array
47
- string = @line_wrap.wrap_line(:arranger => @arranger,
48
- :width => @one_word_width,
49
- :document => @pdf)
50
- string.should == "hello"
51
- end
52
-
53
- it "should break on zero-width space" do
54
- @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
55
- array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }]
56
- @arranger.format_array = array
57
- string = @line_wrap.wrap_line(:arranger => @arranger,
58
- :width => @one_word_width,
59
- :document => @pdf)
60
- string.should == "hello"
61
- end
62
-
63
- it "should not display zero-width space" do
64
- @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
65
- array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }]
66
- @arranger.format_array = array
67
- string = @line_wrap.wrap_line(:arranger => @arranger,
68
- :width => 300,
69
- :document => @pdf)
70
- string.should == "helloworld"
71
- end
72
-
73
- it "should break on tab" do
74
- array = [{ :text => "hello\tworld" }]
75
- @arranger.format_array = array
76
- string = @line_wrap.wrap_line(:arranger => @arranger,
77
- :width => @one_word_width,
78
- :document => @pdf)
79
- string.should == "hello"
80
- end
81
-
82
- it "should break on hyphens" do
83
- array = [{ :text => "hello-world" }]
84
- @arranger.format_array = array
85
- string = @line_wrap.wrap_line(:arranger => @arranger,
86
- :width => @one_word_width,
87
- :document => @pdf)
88
- string.should == "hello-"
89
- end
90
-
91
- it "should not break after a hyphen that follows white space and" +
92
- "precedes a word" do
93
- array = [{ :text => "hello -" }]
94
- @arranger.format_array = array
95
- string = @line_wrap.wrap_line(:arranger => @arranger,
96
- :width => @one_word_width,
97
- :document => @pdf)
98
- string.should == "hello -"
99
-
100
- array = [{ :text => "hello -world" }]
101
- @arranger.format_array = array
102
- string = @line_wrap.wrap_line(:arranger => @arranger,
103
- :width => @one_word_width,
104
- :document => @pdf)
105
- string.should == "hello"
106
- end
107
-
108
- it "should break on a soft hyphen" do
109
- string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}world")
110
- array = [{ :text => string }]
111
- @arranger.format_array = array
112
- string = @line_wrap.wrap_line(:arranger => @arranger,
113
- :width => @one_word_width,
114
- :document => @pdf)
115
- expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
116
- expected.force_encoding("utf-8") if "".respond_to?(:force_encoding)
117
- string.should == expected
118
-
119
- @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
120
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
121
-
122
- string = "hello#{Prawn::Text::SHY}world"
123
- array = [{ :text => string }]
124
- @arranger.format_array = array
125
- string = @line_wrap.wrap_line(:arranger => @arranger,
126
- :width => @one_word_width,
127
- :document => @pdf)
128
- string.should == "hello#{Prawn::Text::SHY}"
129
- end
130
-
131
- it "should not display soft hyphens except at the end of a line" do
132
- string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}world")
133
- array = [{ :text => string }]
134
- @arranger.format_array = array
135
- string = @line_wrap.wrap_line(:arranger => @arranger,
136
- :width => 300,
137
- :document => @pdf)
138
- string.should == "helloworld"
139
-
140
- @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
141
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
142
-
143
- string = "hello#{Prawn::Text::SHY}world"
144
- array = [{ :text => string }]
145
- @arranger.format_array = array
146
- string = @line_wrap.wrap_line(:arranger => @arranger,
147
- :width => 300,
148
- :document => @pdf)
149
- string.should == "helloworld"
150
- end
151
-
152
- it "should not break before a hard hyphen that follows a word" do
153
- enough_width_for_hello_world = 60
154
-
155
- array = [{ :text => "hello world" }]
156
- @arranger.format_array = array
157
- string = @line_wrap.wrap_line(:arranger => @arranger,
158
- :width => enough_width_for_hello_world,
159
- :document => @pdf)
160
- string.should == "hello world"
161
-
162
- array = [{ :text => "hello world-" }]
163
- @arranger.format_array = array
164
- string = @line_wrap.wrap_line(:arranger => @arranger,
165
- :width => enough_width_for_hello_world,
166
- :document => @pdf)
167
- string.should == "hello"
168
-
169
- @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
170
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
171
- enough_width_for_hello_world = 68
172
-
173
- array = [{ :text => "hello world" }]
174
- @arranger.format_array = array
175
- string = @line_wrap.wrap_line(:arranger => @arranger,
176
- :width => enough_width_for_hello_world,
177
- :document => @pdf)
178
- string.should == "hello world"
179
-
180
- array = [{ :text => "hello world-" }]
181
- @arranger.format_array = array
182
- string = @line_wrap.wrap_line(:arranger => @arranger,
183
- :width => enough_width_for_hello_world,
184
- :document => @pdf)
185
- string.should == "hello"
186
- end
187
-
188
- it "should not break after a hard hyphen that follows a soft hyphen and" +
189
- "precedes a word" do
190
- string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-")
191
- array = [{ :text => string }]
192
- @arranger.format_array = array
193
- string = @line_wrap.wrap_line(:arranger => @arranger,
194
- :width => @one_word_width,
195
- :document => @pdf)
196
- string.should == "hello-"
197
-
198
- string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-world")
199
- array = [{ :text => string }]
200
- @arranger.format_array = array
201
- string = @line_wrap.wrap_line(:arranger => @arranger,
202
- :width => @one_word_width,
203
- :document => @pdf)
204
- expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
205
- expected.force_encoding("utf-8") if "".respond_to?(:force_encoding)
206
- string.should == expected
207
-
208
- @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
209
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
210
-
211
- string = "hello#{Prawn::Text::SHY}-"
212
- array = [{ :text => string }]
213
- @arranger.format_array = array
214
- string = @line_wrap.wrap_line(:arranger => @arranger,
215
- :width => @one_word_width,
216
- :document => @pdf)
217
- string.should == "hello-"
218
-
219
- string = "hello#{Prawn::Text::SHY}-world"
220
- array = [{ :text => string }]
221
- @arranger.format_array = array
222
- string = @line_wrap.wrap_line(:arranger => @arranger,
223
- :width => @one_word_width,
224
- :document => @pdf)
225
- string.should == "hello#{Prawn::Text::SHY}"
226
- end
227
- end
228
-
229
- describe "Core::Text::Formatted::LineWrap#space_count" do
230
- before(:each) do
231
- create_pdf
232
- @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
233
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
234
- end
235
- it "should return the number of spaces in the last wrapped line" do
236
- array = [{ :text => "hello world, " },
237
- { :text => "goodbye", :style => [:bold] }]
238
- @arranger.format_array = array
239
- @line_wrap.wrap_line(:arranger => @arranger,
240
- :width => 300,
241
- :document => @pdf)
242
- @line_wrap.space_count.should == 2
243
- end
244
- it "should exclude preceding and trailing spaces from the count" do
245
- array = [{ :text => " hello world, " },
246
- { :text => "goodbye ", :style => [:bold] }]
247
- @arranger.format_array = array
248
- @line_wrap.wrap_line(:arranger => @arranger,
249
- :width => 300,
250
- :document => @pdf)
251
- @line_wrap.space_count.should == 2
252
- end
253
- end
254
-
255
- describe "Core::Text::Formatted::LineWrap" do
256
- before(:each) do
257
- create_pdf
258
- @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
259
- array = [{ :text => "hello\nworld\n\n\nhow are you?" },
260
- { :text => "\n" },
261
- { :text => "\n" },
262
- { :text => "" },
263
- { :text => "fine, thanks. " * 4 },
264
- { :text => "" },
265
- { :text => "\n" },
266
- { :text => "" }]
267
- @arranger.format_array = array
268
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
269
- end
270
- it "should only return an empty string if nothing fit or there" +
271
- "was nothing to wrap" do
272
- 8.times do
273
- line = @line_wrap.wrap_line(:arranger => @arranger,
274
- :width => 200,
275
- :document => @pdf)
276
- line.should_not be_empty
277
- end
278
- line = @line_wrap.wrap_line(:arranger => @arranger,
279
- :width => 200,
280
- :document => @pdf)
281
- line.should be_empty
282
- end
283
- end
284
-
285
- describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
286
- before(:each) do
287
- create_pdf
288
- @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
289
- @line_wrap = Prawn::Text::Formatted::LineWrap.new
290
- @one_word_width = 50
291
- end
292
- it "should be_false when the last printed line is not the end of the paragraph" do
293
- array = [{ :text => "hello world" }]
294
- @arranger.format_array = array
295
- string = @line_wrap.wrap_line(:arranger => @arranger,
296
- :width => @one_word_width,
297
- :document => @pdf)
298
-
299
- @line_wrap.paragraph_finished?.should == false
300
- end
301
- it "should be_true when the last printed line is the last fragment to print" do
302
- array = [{ :text => "hello world" }]
303
- @arranger.format_array = array
304
- string = @line_wrap.wrap_line(:arranger => @arranger,
305
- :width => @one_word_width,
306
- :document => @pdf)
307
- string = @line_wrap.wrap_line(:arranger => @arranger,
308
- :width => @one_word_width,
309
- :document => @pdf)
310
-
311
- @line_wrap.paragraph_finished?.should == true
312
- end
313
- it "should be_true when a newline exists on the current line" do
314
- array = [{ :text => "hello\n world" }]
315
- @arranger.format_array = array
316
- string = @line_wrap.wrap_line(:arranger => @arranger,
317
- :width => @one_word_width,
318
- :document => @pdf)
319
-
320
- @line_wrap.paragraph_finished?.should == true
321
- end
322
- it "should be_true when a newline exists in the next fragment" do
323
- array = [{ :text => "hello " },
324
- { :text => " \n" },
325
- { :text => "world" }]
326
- @arranger.format_array = array
327
- string = @line_wrap.wrap_line(:arranger => @arranger,
328
- :width => @one_word_width,
329
- :document => @pdf)
330
-
331
- @line_wrap.paragraph_finished?.should == true
332
- end
333
- end
@@ -1,23 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
- require "prawn/measurement_extensions"
3
-
4
- describe "Measurement units" do
5
-
6
- it "should convert units to PostScriptPoints" do
7
- 1.mm.should be_within(0.000000001).of(2.834645669)
8
- 1.mm.should == (72 / 25.4)
9
- 2.mm.should == (2 * 72 / 25.4)
10
- 3.mm.should == 3 * 72 / 25.4
11
- -3.mm.should == -3 * 72/25.4
12
- 1.cm.should == 10 * 72 / 25.4
13
- 1.dm.should == 100 * 72 / 25.4
14
- 1.m.should == 1000 * 72 / 25.4
15
-
16
- 1.in.should == 72
17
- 1.ft.should == 72 * 12
18
- 1.yd.should == 72 * 12 * 3
19
- 1.pt.should == 1
20
- end
21
-
22
- end
23
-
@@ -1,112 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
-
3
- def tree_dump(tree)
4
- if tree.is_a?(PDF::Core::NameTree::Node)
5
- "[" + tree.children.map { |child| tree_dump(child) }.join(",") + "]"
6
- else
7
- "#{tree.name}=#{tree.value}"
8
- end
9
- end
10
-
11
- def tree_add(tree, *args)
12
- args.each do |(name, value)|
13
- tree.add(name, value)
14
- end
15
- end
16
-
17
- def tree_value(name, value)
18
- PDF::Core::NameTree::Value.new(name, value)
19
- end
20
-
21
- class RefExposingDocument < Prawn::Document
22
- def object_store
23
- state.store
24
- end
25
- end
26
-
27
- describe "Name Tree" do
28
- before(:each) { create_pdf(RefExposingDocument) }
29
-
30
- it "should have no children when first initialized" do
31
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
32
- node.children.length.should == 0
33
- end
34
-
35
- it "should have no subtrees while child limit is not reached" do
36
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
37
- tree_add(node, ["one", 1], ["two", 2], ["three", 3])
38
- tree_dump(node).should == "[one=1,three=3,two=2]"
39
- end
40
-
41
- it "should split into subtrees when limit is exceeded" do
42
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
43
- tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
44
- tree_dump(node).should == "[[four=4,one=1],[three=3,two=2]]"
45
- end
46
-
47
- it "should create a two new references when root is split" do
48
- ref_count = @pdf.object_store.length
49
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
50
- tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
51
- @pdf.object_store.length.should == ref_count+2
52
- end
53
-
54
- it "should create a one new reference when subtree is split" do
55
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
56
- tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
57
-
58
- ref_count = @pdf.object_store.length # save when root is split
59
- tree_add(node, ["five", 5], ["six", 6], ["seven", 7])
60
- tree_dump(node).should == "[[five=5,four=4,one=1],[seven=7,six=6],[three=3,two=2]]"
61
- @pdf.object_store.length.should == ref_count+1
62
- end
63
-
64
- it "should keep tree balanced when subtree split cascades to root" do
65
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
66
- tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
67
- tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8])
68
- tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]"
69
- end
70
-
71
- it "should maintain order of already properly ordered nodes" do
72
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
73
- tree_add(node, ["eight", 8], ["five", 5], ["four", 4], ["one", 1])
74
- tree_add(node, ['seven', 7], ['six', 6], ['three', 3], ['two', 2])
75
- tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]"
76
- end
77
-
78
- it "should emit only :Names key with to_hash if root is only node" do
79
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
80
- tree_add(node, ["one", 1], ["two", 2], ["three", 3])
81
- node.to_hash.should ==(
82
- { :Names => [tree_value("one", 1), tree_value("three", 3), tree_value("two", 2)] }
83
- )
84
- end
85
-
86
- it "should emit only :Kids key with to_hash if root has children" do
87
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
88
- tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
89
- node.to_hash.should ==({ :Kids => node.children.map { |child| child.ref } })
90
- end
91
-
92
- it "should emit :Limits and :Names keys with to_hash for leaf node" do
93
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
94
- tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
95
- node.children.first.to_hash.should ==(
96
- { :Limits => %w(four one),
97
- :Names => [tree_value("four", 4), tree_value("one", 1)] }
98
- )
99
- end
100
-
101
- it "should emit :Limits and :Kids keys with to_hash for inner node" do
102
- node = PDF::Core::NameTree::Node.new(@pdf, 3)
103
- tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
104
- tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8])
105
- tree_add(node, ["nine", 9], ["ten", 10], ["eleven", 11], ["twelve", 12])
106
- tree_add(node, ["thirteen", 13], ["fourteen", 14], ["fifteen", 15], ["sixteen", 16])
107
- node.children.first.to_hash.should ==(
108
- { :Limits => %w(eight one),
109
- :Kids => node.children.first.children.map { |child| child.ref } }
110
- )
111
- end
112
- end
@@ -1,170 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Prawn::ObjectStore" do
6
- before(:each) do
7
- @store = PDF::Core::ObjectStore.new
8
- end
9
-
10
- it "should create required roots by default, including info passed to new" do
11
- store = PDF::Core::ObjectStore.new(:info => {:Test => 3})
12
- store.size.should == 3 # 3 default roots
13
- store.info.data[:Test].should == 3
14
- store.pages.data[:Count].should == 0
15
- store.root.data[:Pages].should == store.pages
16
- end
17
-
18
- it "should import objects from an existing PDF" do
19
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
20
- store = PDF::Core::ObjectStore.new(:template => filename)
21
- store.size.should == 5
22
- end
23
-
24
- it "should point to existing roots when importing objects from an existing PDF" do
25
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
26
- store = PDF::Core::ObjectStore.new(:template => filename)
27
- store.info.class.should == PDF::Core::Reference
28
- store.root.class.should == PDF::Core::Reference
29
- end
30
-
31
- it "should initialize with pages when importing objects from an existing PDF" do
32
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
33
- store = PDF::Core::ObjectStore.new(:template => filename)
34
- store.pages.data[:Count].should == 1
35
- end
36
-
37
- it "should import all objects from a PDF that has an indirect reference in a stream dict" do
38
- filename = "#{Prawn::DATADIR}/pdfs/indirect_reference.pdf"
39
- store = PDF::Core::ObjectStore.new(:template => filename)
40
- store.size.should == 8
41
- end
42
-
43
- it "should raise_error ArgumentError when given a file that doesn exist as a template" do
44
- filename = "not_really_there.pdf"
45
-
46
- lambda { PDF::Core::ObjectStore.new(:template => filename) }.should raise_error(ArgumentError)
47
- end
48
-
49
- it "should raise_error PDF::Core::Errors::TemplateError when given a non PDF as a template" do
50
- filename = "#{Prawn::DATADIR}/images/dice.png"
51
-
52
- lambda { PDF::Core::ObjectStore.new(:template => filename) }.should raise_error(PDF::Core::Errors::TemplateError)
53
- end
54
-
55
- it "should raise_error PDF::Core::Errors::TemplateError when given an encrypted PDF as a template" do
56
- filename = "#{Prawn::DATADIR}/pdfs/encrypted.pdf"
57
-
58
- lambda { PDF::Core::ObjectStore.new(:template => filename) }.should raise_error(PDF::Core::Errors::TemplateError)
59
- end
60
-
61
- it "should add to its objects when ref() is called" do
62
- count = @store.size
63
- @store.ref("blah")
64
- @store.size.should == count + 1
65
- end
66
-
67
- it "should accept push with a Prawn::Reference" do
68
- r = PDF::Core::Reference(123, "blah")
69
- @store.push(r)
70
- @store[r.identifier].should == r
71
- end
72
-
73
- it "should accept arbitrary data and use it to create a Prawn::Reference" do
74
- @store.push(123, "blahblah")
75
- @store[123].data.should == "blahblah"
76
- end
77
-
78
- it "should be Enumerable, yielding in order of submission" do
79
- # higher IDs to bypass the default roots
80
- [10, 11, 12].each do |id|
81
- @store.push(id, "some data #{id}")
82
- end
83
- @store.map{|ref| ref.identifier}[-3..-1].should == [10, 11, 12]
84
- end
85
- end
86
-
87
- describe "Prawn::ObjectStore#compact" do
88
- it "should do nothing to an ObjectStore with all live refs" do
89
- store = PDF::Core::ObjectStore.new
90
- store.info.data[:Blah] = store.ref(:some => "structure")
91
- old_size = store.size
92
- store.compact
93
-
94
- store.size.should == old_size
95
- end
96
-
97
- it "should remove dead objects, renumbering live objects from 1" do
98
- store = PDF::Core::ObjectStore.new
99
- store.ref(:some => "structure")
100
- old_size = store.size
101
- store.compact
102
-
103
- store.size.should be < old_size
104
- store.map{ |o| o.identifier }.should == (1..store.size).to_a
105
- end
106
-
107
- it "should detect and remove dead objects that were once live" do
108
- store = PDF::Core::ObjectStore.new
109
- store.info.data[:Blah] = store.ref(:some => "structure")
110
- store.info.data[:Blah] = :overwritten
111
- old_size = store.size
112
- store.compact
113
-
114
- store.size.should be < old_size
115
- store.map{ |o| o.identifier }.should == (1..store.size).to_a
116
- end
117
- end
118
-
119
- describe "Prawn::ObjectStorie#object_id_for_page" do
120
- it "should return the object ID of an imported template page" do
121
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
122
- store = PDF::Core::ObjectStore.new(:template => filename)
123
- store.object_id_for_page(0).should == 4
124
- end
125
-
126
- it "should return the object ID of the first imported template page" do
127
- filename = "#{Prawn::DATADIR}/pdfs/two_hexagons.pdf"
128
- store = PDF::Core::ObjectStore.new(:template => filename)
129
- store.object_id_for_page(1).should == 4
130
- end
131
-
132
- it "should return the object ID of the last imported template page" do
133
- filename = "#{Prawn::DATADIR}/pdfs/two_hexagons.pdf"
134
- store = PDF::Core::ObjectStore.new(:template => filename)
135
- store.object_id_for_page(-1).should == 6
136
- end
137
-
138
- it "should return the object ID of the first page of a template that uses nested Pages" do
139
- filename = "#{Prawn::DATADIR}/pdfs/nested_pages.pdf"
140
- store = PDF::Core::ObjectStore.new(:template => filename)
141
- store.object_id_for_page(1).should == 5
142
- end
143
-
144
- it "should return the object ID of the last page of a template that uses nested Pages" do
145
- filename = "#{Prawn::DATADIR}/pdfs/nested_pages.pdf"
146
- store = PDF::Core::ObjectStore.new(:template => filename)
147
- store.object_id_for_page(-1).should == 8
148
- end
149
-
150
- it "should return nil if given an invalid page number" do
151
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
152
- store = PDF::Core::ObjectStore.new(:template => filename)
153
- store.object_id_for_page(10).should == nil
154
- end
155
-
156
- it "should return nil if given an invalid page number" do
157
- store = PDF::Core::ObjectStore.new
158
- store.object_id_for_page(10).should == nil
159
- end
160
-
161
- it "should accept a stream instead of a filename" do
162
- example = Prawn::Document.new()
163
- example.text "An example doc, created in memory"
164
- example.start_new_page
165
- StringIO.open(example.render) do |stream|
166
- @pdf = PDF::Core::ObjectStore.new(:template => stream)
167
- end
168
- @pdf.page_count.should == 2
169
- end
170
- end