prawn 0.11.1 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (353) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +10 -0
  3. data/COPYING +2 -2
  4. data/GPLv2 +340 -0
  5. data/GPLv3 +674 -0
  6. data/Gemfile +11 -0
  7. data/LICENSE +1 -1
  8. data/Rakefile +29 -38
  9. data/data/images/16bit.alpha +0 -0
  10. data/data/images/16bit.color +0 -0
  11. data/data/images/dice.alpha +0 -0
  12. data/data/images/dice.color +0 -0
  13. data/data/images/indexed_color.dat +0 -0
  14. data/data/images/indexed_color.png +0 -0
  15. data/data/images/page_white_text.alpha +0 -0
  16. data/data/images/page_white_text.color +0 -0
  17. data/data/pdfs/nested_pages.pdf +13 -13
  18. data/lib/prawn/document/bounding_box.rb +87 -12
  19. data/lib/prawn/document/column_box.rb +57 -28
  20. data/lib/prawn/document/graphics_state.rb +11 -74
  21. data/lib/prawn/document/internals.rb +25 -23
  22. data/lib/prawn/document/snapshot.rb +11 -8
  23. data/lib/prawn/document/span.rb +12 -10
  24. data/lib/prawn/document.rb +250 -194
  25. data/lib/prawn/encoding.rb +9 -10
  26. data/lib/prawn/errors.rb +18 -29
  27. data/lib/prawn/font/afm.rb +52 -41
  28. data/lib/prawn/font/dfont.rb +4 -3
  29. data/lib/prawn/font/ttf.rb +44 -48
  30. data/lib/prawn/font.rb +138 -88
  31. data/lib/prawn/font_metric_cache.rb +47 -0
  32. data/lib/prawn/graphics/cap_style.rb +4 -3
  33. data/lib/prawn/graphics/color.rb +13 -5
  34. data/lib/prawn/graphics/dash.rb +53 -31
  35. data/lib/prawn/graphics/join_style.rb +9 -7
  36. data/lib/prawn/graphics/patterns.rb +138 -0
  37. data/lib/prawn/graphics/transformation.rb +10 -9
  38. data/lib/prawn/graphics/transparency.rb +3 -1
  39. data/lib/prawn/graphics.rb +316 -61
  40. data/lib/prawn/image_handler.rb +36 -0
  41. data/lib/prawn/images/image.rb +49 -0
  42. data/lib/prawn/images/jpg.rb +21 -15
  43. data/lib/prawn/images/png.rb +62 -119
  44. data/lib/prawn/images.rb +89 -108
  45. data/lib/prawn/layout/grid.rb +66 -54
  46. data/lib/prawn/layout.rb +10 -15
  47. data/lib/prawn/measurement_extensions.rb +10 -6
  48. data/lib/prawn/measurements.rb +27 -21
  49. data/lib/prawn/outline.rb +6 -308
  50. data/lib/prawn/repeater.rb +11 -9
  51. data/lib/prawn/security/arcfour.rb +1 -0
  52. data/lib/prawn/security.rb +55 -33
  53. data/lib/prawn/soft_mask.rb +96 -0
  54. data/lib/prawn/stamp.rb +5 -3
  55. data/lib/prawn/table/cell/image.rb +69 -0
  56. data/lib/prawn/table/cell/in_table.rb +4 -2
  57. data/lib/prawn/table/cell/span_dummy.rb +93 -0
  58. data/lib/prawn/table/cell/subtable.rb +2 -2
  59. data/lib/prawn/table/cell/text.rb +44 -26
  60. data/lib/prawn/table/cell.rb +302 -50
  61. data/lib/prawn/table/cells.rb +147 -49
  62. data/lib/prawn/table/column_width_calculator.rb +61 -0
  63. data/lib/prawn/table.rb +297 -118
  64. data/lib/prawn/text/box.rb +21 -5
  65. data/lib/prawn/text/formatted/arranger.rb +290 -0
  66. data/lib/prawn/text/formatted/box.rb +103 -59
  67. data/lib/prawn/text/formatted/fragment.rb +34 -23
  68. data/lib/prawn/text/formatted/line_wrap.rb +266 -0
  69. data/lib/prawn/text/formatted/parser.rb +15 -5
  70. data/lib/prawn/text/formatted/wrap.rb +150 -0
  71. data/lib/prawn/text/formatted.rb +5 -4
  72. data/lib/prawn/text.rb +38 -24
  73. data/lib/prawn/utilities.rb +46 -0
  74. data/lib/prawn.rb +85 -20
  75. data/manual/basic_concepts/adding_pages.rb +27 -0
  76. data/manual/basic_concepts/basic_concepts.rb +34 -0
  77. data/manual/basic_concepts/creation.rb +39 -0
  78. data/manual/basic_concepts/cursor.rb +33 -0
  79. data/manual/basic_concepts/measurement.rb +25 -0
  80. data/manual/basic_concepts/origin.rb +38 -0
  81. data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
  82. data/manual/bounding_box/bounding_box.rb +39 -0
  83. data/manual/bounding_box/bounds.rb +49 -0
  84. data/manual/bounding_box/canvas.rb +24 -0
  85. data/manual/bounding_box/creation.rb +23 -0
  86. data/manual/bounding_box/indentation.rb +46 -0
  87. data/manual/bounding_box/nesting.rb +45 -0
  88. data/manual/bounding_box/russian_boxes.rb +40 -0
  89. data/manual/bounding_box/stretchy.rb +31 -0
  90. data/manual/document_and_page_options/background.rb +27 -0
  91. data/manual/document_and_page_options/document_and_page_options.rb +32 -0
  92. data/manual/document_and_page_options/metadata.rb +23 -0
  93. data/manual/document_and_page_options/page_margins.rb +38 -0
  94. data/manual/document_and_page_options/page_size.rb +34 -0
  95. data/manual/document_and_page_options/print_scaling.rb +20 -0
  96. data/manual/example_file.rb +111 -0
  97. data/manual/example_helper.rb +411 -0
  98. data/manual/example_package.rb +53 -0
  99. data/manual/example_section.rb +46 -0
  100. data/manual/graphics/circle_and_ellipse.rb +22 -0
  101. data/manual/graphics/color.rb +24 -0
  102. data/manual/graphics/common_lines.rb +30 -0
  103. data/manual/graphics/fill_and_stroke.rb +42 -0
  104. data/manual/graphics/fill_rules.rb +37 -0
  105. data/manual/graphics/gradients.rb +37 -0
  106. data/manual/graphics/graphics.rb +58 -0
  107. data/manual/graphics/helper.rb +24 -0
  108. data/manual/graphics/line_width.rb +35 -0
  109. data/manual/graphics/lines_and_curves.rb +41 -0
  110. data/manual/graphics/polygon.rb +29 -0
  111. data/manual/graphics/rectangle.rb +21 -0
  112. data/manual/graphics/rotate.rb +28 -0
  113. data/manual/graphics/scale.rb +41 -0
  114. data/manual/graphics/soft_masks.rb +46 -0
  115. data/manual/graphics/stroke_cap.rb +31 -0
  116. data/manual/graphics/stroke_dash.rb +48 -0
  117. data/manual/graphics/stroke_join.rb +30 -0
  118. data/manual/graphics/translate.rb +29 -0
  119. data/manual/graphics/transparency.rb +35 -0
  120. data/manual/images/absolute_position.rb +23 -0
  121. data/manual/images/fit.rb +21 -0
  122. data/manual/images/horizontal.rb +25 -0
  123. data/manual/images/images.rb +40 -0
  124. data/manual/images/plain_image.rb +18 -0
  125. data/manual/images/scale.rb +22 -0
  126. data/manual/images/vertical.rb +28 -0
  127. data/manual/images/width_and_height.rb +25 -0
  128. data/manual/layout/boxes.rb +27 -0
  129. data/manual/layout/content.rb +25 -0
  130. data/manual/layout/layout.rb +28 -0
  131. data/manual/layout/simple_grid.rb +23 -0
  132. data/manual/manual/cover.rb +36 -0
  133. data/manual/manual/foreword.rb +85 -0
  134. data/manual/manual/how_to_read_this_manual.rb +41 -0
  135. data/manual/manual/manual.rb +34 -0
  136. data/manual/outline/add_subsection_to.rb +61 -0
  137. data/manual/outline/insert_section_after.rb +47 -0
  138. data/manual/outline/outline.rb +32 -0
  139. data/manual/outline/sections_and_pages.rb +67 -0
  140. data/manual/repeatable_content/page_numbering.rb +54 -0
  141. data/manual/repeatable_content/repeatable_content.rb +31 -0
  142. data/manual/repeatable_content/repeater.rb +55 -0
  143. data/manual/repeatable_content/stamp.rb +41 -0
  144. data/manual/security/encryption.rb +31 -0
  145. data/manual/security/permissions.rb +38 -0
  146. data/manual/security/security.rb +28 -0
  147. data/manual/syntax_highlight.rb +52 -0
  148. data/manual/table/basic_block.rb +53 -0
  149. data/manual/table/before_rendering_page.rb +26 -0
  150. data/manual/table/cell_border_lines.rb +24 -0
  151. data/manual/table/cell_borders_and_bg.rb +31 -0
  152. data/manual/table/cell_dimensions.rb +30 -0
  153. data/manual/table/cell_text.rb +38 -0
  154. data/manual/table/column_widths.rb +30 -0
  155. data/manual/table/content_and_subtables.rb +39 -0
  156. data/manual/table/creation.rb +27 -0
  157. data/manual/table/filtering.rb +36 -0
  158. data/manual/table/flow_and_header.rb +17 -0
  159. data/manual/table/image_cells.rb +33 -0
  160. data/manual/table/position.rb +29 -0
  161. data/manual/table/row_colors.rb +20 -0
  162. data/manual/table/span.rb +30 -0
  163. data/manual/table/style.rb +22 -0
  164. data/manual/table/table.rb +52 -0
  165. data/manual/table/width.rb +27 -0
  166. data/manual/text/alignment.rb +44 -0
  167. data/manual/text/color.rb +24 -0
  168. data/manual/text/column_box.rb +32 -0
  169. data/manual/text/fallback_fonts.rb +37 -0
  170. data/manual/text/font.rb +41 -0
  171. data/manual/text/font_size.rb +45 -0
  172. data/manual/text/font_style.rb +23 -0
  173. data/manual/text/formatted_callbacks.rb +60 -0
  174. data/manual/text/formatted_text.rb +54 -0
  175. data/manual/text/free_flowing_text.rb +51 -0
  176. data/manual/text/group.rb +31 -0
  177. data/manual/text/inline.rb +43 -0
  178. data/manual/text/kerning_and_character_spacing.rb +39 -0
  179. data/manual/text/leading.rb +25 -0
  180. data/manual/text/line_wrapping.rb +41 -0
  181. data/manual/text/paragraph_indentation.rb +26 -0
  182. data/manual/text/positioned_text.rb +38 -0
  183. data/manual/text/registering_families.rb +48 -0
  184. data/manual/text/rendering_and_color.rb +37 -0
  185. data/manual/text/right_to_left_text.rb +43 -0
  186. data/manual/text/rotation.rb +43 -0
  187. data/manual/text/single_usage.rb +37 -0
  188. data/manual/text/text.rb +75 -0
  189. data/manual/text/text_box_excess.rb +32 -0
  190. data/manual/text/text_box_extensions.rb +45 -0
  191. data/manual/text/text_box_overflow.rb +44 -0
  192. data/manual/text/utf8.rb +28 -0
  193. data/{examples/m17n → manual/text}/win_ansi_charset.rb +14 -10
  194. data/prawn.gemspec +27 -17
  195. data/spec/acceptance/png.rb +23 -0
  196. data/spec/annotations_spec.rb +16 -32
  197. data/spec/bounding_box_spec.rb +284 -2
  198. data/spec/cell_spec.rb +169 -38
  199. data/spec/column_box_spec.rb +65 -0
  200. data/spec/data/curves.pdf +66 -0
  201. data/spec/destinations_spec.rb +5 -5
  202. data/spec/document_spec.rb +212 -113
  203. data/spec/extensions/encoding_helpers.rb +9 -0
  204. data/spec/extensions/mocha.rb +2 -3
  205. data/spec/font_metric_cache_spec.rb +52 -0
  206. data/spec/font_spec.rb +205 -95
  207. data/spec/formatted_text_arranger_spec.rb +43 -43
  208. data/spec/formatted_text_box_spec.rb +63 -24
  209. data/spec/formatted_text_fragment_spec.rb +8 -8
  210. data/spec/graphics_spec.rb +175 -68
  211. data/spec/grid_spec.rb +26 -15
  212. data/spec/image_handler_spec.rb +54 -0
  213. data/spec/images_spec.rb +58 -30
  214. data/spec/inline_formatted_text_parser_spec.rb +73 -19
  215. data/spec/jpg_spec.rb +4 -4
  216. data/spec/line_wrap_spec.rb +28 -28
  217. data/spec/measurement_units_spec.rb +6 -6
  218. data/spec/object_store_spec.rb +17 -106
  219. data/spec/outline_spec.rb +103 -63
  220. data/spec/png_spec.rb +25 -25
  221. data/spec/reference_spec.rb +8 -65
  222. data/spec/repeater_spec.rb +25 -11
  223. data/spec/security_spec.rb +44 -12
  224. data/spec/snapshot_spec.rb +38 -6
  225. data/spec/soft_mask_spec.rb +117 -0
  226. data/spec/span_spec.rb +10 -15
  227. data/spec/spec_helper.rb +32 -8
  228. data/spec/stamp_spec.rb +29 -30
  229. data/spec/stroke_styles_spec.rb +36 -18
  230. data/spec/table/span_dummy_spec.rb +17 -0
  231. data/spec/table_spec.rb +850 -104
  232. data/spec/text_at_spec.rb +19 -33
  233. data/spec/text_box_spec.rb +117 -64
  234. data/spec/text_rendering_mode_spec.rb +5 -5
  235. data/spec/text_spacing_spec.rb +20 -2
  236. data/spec/text_spec.rb +111 -59
  237. data/spec/transparency_spec.rb +5 -5
  238. metadata +477 -328
  239. data/HACKING +0 -50
  240. data/README +0 -141
  241. data/data/fonts/Action Man.dfont +0 -0
  242. data/data/fonts/Activa.ttf +0 -0
  243. data/data/fonts/Chalkboard.ttf +0 -0
  244. data/data/fonts/DejaVuSans.ttf +0 -0
  245. data/data/fonts/Dustismo_Roman.ttf +0 -0
  246. data/data/fonts/comicsans.ttf +0 -0
  247. data/data/fonts/gkai00mp.ttf +0 -0
  248. data/data/images/16bit.dat +0 -0
  249. data/data/images/dice.dat +0 -0
  250. data/data/images/page_white_text.dat +0 -0
  251. data/data/images/rails.dat +0 -0
  252. data/data/images/rails.png +0 -0
  253. data/examples/bounding_box/bounding_boxes.rb +0 -44
  254. data/examples/bounding_box/indentation.rb +0 -35
  255. data/examples/bounding_box/russian_boxes.rb +0 -37
  256. data/examples/bounding_box/stretched_nesting.rb +0 -68
  257. data/examples/example_helper.rb +0 -8
  258. data/examples/general/background.rb +0 -24
  259. data/examples/general/canvas.rb +0 -16
  260. data/examples/general/context_sensitive_headers.rb +0 -38
  261. data/examples/general/float.rb +0 -12
  262. data/examples/general/margin.rb +0 -37
  263. data/examples/general/measurement_units.rb +0 -52
  264. data/examples/general/metadata-info.rb +0 -17
  265. data/examples/general/multi_page_layout.rb +0 -19
  266. data/examples/general/outlines.rb +0 -67
  267. data/examples/general/page_geometry.rb +0 -32
  268. data/examples/general/page_numbering.rb +0 -40
  269. data/examples/general/page_templates.rb +0 -20
  270. data/examples/general/repeaters.rb +0 -48
  271. data/examples/general/stamp.rb +0 -42
  272. data/examples/general/templates.rb +0 -14
  273. data/examples/graphics/basic_images.rb +0 -24
  274. data/examples/graphics/cmyk.rb +0 -13
  275. data/examples/graphics/curves.rb +0 -12
  276. data/examples/graphics/gradient.rb +0 -23
  277. data/examples/graphics/hexagon.rb +0 -14
  278. data/examples/graphics/image_fit.rb +0 -16
  279. data/examples/graphics/image_flow.rb +0 -38
  280. data/examples/graphics/image_position.rb +0 -18
  281. data/examples/graphics/line.rb +0 -33
  282. data/examples/graphics/png_types.rb +0 -23
  283. data/examples/graphics/polygons.rb +0 -17
  284. data/examples/graphics/remote_images.rb +0 -13
  285. data/examples/graphics/rounded_polygons.rb +0 -20
  286. data/examples/graphics/rounded_rectangle.rb +0 -21
  287. data/examples/graphics/ruport_style_helpers.rb +0 -20
  288. data/examples/graphics/stroke_bounds.rb +0 -21
  289. data/examples/graphics/stroke_cap_and_join.rb +0 -46
  290. data/examples/graphics/stroke_dash.rb +0 -43
  291. data/examples/graphics/transformations.rb +0 -53
  292. data/examples/graphics/transparency.rb +0 -27
  293. data/examples/grid/bounding_boxes.rb +0 -22
  294. data/examples/grid/column_gutter_grid.rb +0 -21
  295. data/examples/grid/multi_boxes.rb +0 -52
  296. data/examples/grid/show_grid.rb +0 -14
  297. data/examples/grid/simple_grid.rb +0 -21
  298. data/examples/m17n/chinese_text_wrapping.rb +0 -18
  299. data/examples/m17n/euro.rb +0 -16
  300. data/examples/m17n/full_win_ansi_character_list.rb +0 -20
  301. data/examples/m17n/sjis.rb +0 -29
  302. data/examples/m17n/utf8.rb +0 -14
  303. data/examples/security/hello_foo.rb +0 -9
  304. data/examples/table/bill.rb +0 -54
  305. data/examples/table/borders.rb +0 -25
  306. data/examples/table/cell.rb +0 -13
  307. data/examples/table/checkerboard.rb +0 -23
  308. data/examples/table/header.rb +0 -15
  309. data/examples/table/inline_format_table.rb +0 -13
  310. data/examples/table/multi_page_table.rb +0 -10
  311. data/examples/table/simple_table.rb +0 -25
  312. data/examples/table/subtable.rb +0 -13
  313. data/examples/table/widths.rb +0 -21
  314. data/examples/text/alignment.rb +0 -19
  315. data/examples/text/character_spacing.rb +0 -13
  316. data/examples/text/dfont.rb +0 -49
  317. data/examples/text/family_based_styling.rb +0 -25
  318. data/examples/text/font_calculations.rb +0 -92
  319. data/examples/text/font_size.rb +0 -34
  320. data/examples/text/hyphenation.rb +0 -45
  321. data/examples/text/indent_paragraphs.rb +0 -24
  322. data/examples/text/inline_format.rb +0 -104
  323. data/examples/text/kerning.rb +0 -31
  324. data/examples/text/rendering_mode.rb +0 -21
  325. data/examples/text/rotated.rb +0 -99
  326. data/examples/text/shaped_text_box.rb +0 -32
  327. data/examples/text/simple_text.rb +0 -18
  328. data/examples/text/simple_text_ttf.rb +0 -18
  329. data/examples/text/span.rb +0 -30
  330. data/examples/text/text_box.rb +0 -90
  331. data/examples/text/text_box_returning_excess.rb +0 -52
  332. data/examples/text/text_flow.rb +0 -68
  333. data/lib/prawn/compatibility.rb +0 -51
  334. data/lib/prawn/core/annotations.rb +0 -61
  335. data/lib/prawn/core/byte_string.rb +0 -9
  336. data/lib/prawn/core/destinations.rb +0 -90
  337. data/lib/prawn/core/document_state.rb +0 -78
  338. data/lib/prawn/core/literal_string.rb +0 -16
  339. data/lib/prawn/core/name_tree.rb +0 -165
  340. data/lib/prawn/core/object_store.rb +0 -264
  341. data/lib/prawn/core/page.rb +0 -213
  342. data/lib/prawn/core/pdf_object.rb +0 -108
  343. data/lib/prawn/core/reference.rb +0 -112
  344. data/lib/prawn/core/text/formatted/arranger.rb +0 -293
  345. data/lib/prawn/core/text/formatted/line_wrap.rb +0 -272
  346. data/lib/prawn/core/text/formatted/wrap.rb +0 -149
  347. data/lib/prawn/core/text.rb +0 -268
  348. data/lib/prawn/core.rb +0 -85
  349. data/lib/prawn/document/page_geometry.rb +0 -136
  350. data/lib/prawn/graphics/gradient.rb +0 -84
  351. data/spec/name_tree_spec.rb +0 -112
  352. data/spec/pdf_object_spec.rb +0 -170
  353. data/spec/template_spec.rb +0 -291
@@ -5,7 +5,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
5
5
  describe "Core::Text::Formatted::Arranger#format_array" do
6
6
  it "should populate unconsumed array" do
7
7
  create_pdf
8
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
8
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
9
9
  array = [{ :text => "hello " },
10
10
  { :text => "world how ", :styles => [:bold] },
11
11
  { :text => "are", :styles => [:bold, :italic] },
@@ -20,7 +20,7 @@ describe "Core::Text::Formatted::Arranger#format_array" do
20
20
  end
21
21
  it "should split newlines into their own elements" do
22
22
  create_pdf
23
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
23
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
24
24
  array = [{ :text => "\nhello\nworld" }]
25
25
  arranger.format_array = array
26
26
  arranger.unconsumed[0].should == { :text => "\n" }
@@ -32,7 +32,7 @@ end
32
32
  describe "Core::Text::Formatted::Arranger#preview_next_string" do
33
33
  it "should not populate the consumed array" do
34
34
  create_pdf
35
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
35
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
36
36
  array = [{ :text => "hello" }]
37
37
  arranger.format_array = array
38
38
  arranger.preview_next_string
@@ -40,7 +40,7 @@ describe "Core::Text::Formatted::Arranger#preview_next_string" do
40
40
  end
41
41
  it "should not consumed array" do
42
42
  create_pdf
43
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
43
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
44
44
  array = [{ :text => "hello" }]
45
45
  arranger.format_array = array
46
46
  arranger.preview_next_string.should == "hello"
@@ -49,19 +49,19 @@ end
49
49
  describe "Core::Text::Formatted::Arranger#next_string" do
50
50
  before(:each) do
51
51
  create_pdf
52
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
52
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
53
53
  array = [{ :text => "hello " },
54
54
  { :text => "world how ", :styles => [:bold] },
55
55
  { :text => "are", :styles => [:bold, :italic] },
56
56
  { :text => " you?" }]
57
57
  @arranger.format_array = array
58
58
  end
59
- it "should raise an error if called after a line was finalized and" +
59
+ it "should raise_error an error if called after a line was finalized and" +
60
60
  " before a new line was initialized" do
61
61
  @arranger.finalize_line
62
62
  lambda do
63
63
  @arranger.next_string
64
- end.should.raise(RuntimeError)
64
+ end.should raise_error(RuntimeError)
65
65
  end
66
66
  it "should populate consumed array" do
67
67
  while string = @arranger.next_string
@@ -75,7 +75,7 @@ describe "Core::Text::Formatted::Arranger#next_string" do
75
75
  end
76
76
  it "should populate current_format_state array" do
77
77
  create_pdf
78
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
78
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
79
79
  array = [{ :text => "hello " },
80
80
  { :text => "world how ", :styles => [:bold] },
81
81
  { :text => "are", :styles => [:bold, :italic] },
@@ -99,9 +99,9 @@ describe "Core::Text::Formatted::Arranger#next_string" do
99
99
  end
100
100
 
101
101
  describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
102
- it "should raise an error if called before finalize_line was called" do
102
+ it "should raise_error an error if called before finalize_line was called" do
103
103
  create_pdf
104
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
104
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
105
105
  array = [{ :text => "hello " },
106
106
  { :text => "world how ", :styles => [:bold] },
107
107
  { :text => "are", :styles => [:bold, :italic] },
@@ -111,12 +111,12 @@ describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
111
111
  end
112
112
  lambda do
113
113
  arranger.retrieve_fragment
114
- end.should.raise(RuntimeError)
114
+ end.should raise_error(RuntimeError)
115
115
  end
116
116
  it "should return the consumed fragments in order of consumption" +
117
117
  " and update" do
118
118
  create_pdf
119
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
119
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
120
120
  array = [{ :text => "hello " },
121
121
  { :text => "world how ", :styles => [:bold] },
122
122
  { :text => "are", :styles => [:bold, :italic] },
@@ -132,7 +132,7 @@ describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
132
132
  end
133
133
  it "should never return a fragment whose text is an empty string" do
134
134
  create_pdf
135
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
135
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
136
136
  array = [{ :text => "hello\nworld\n\n\nhow are you?" },
137
137
  { :text => "\n" },
138
138
  { :text => "\n" },
@@ -147,12 +147,12 @@ describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
147
147
  end
148
148
  arranger.finalize_line
149
149
  while fragment = arranger.retrieve_fragment
150
- fragment.text.should.not.be.empty
150
+ fragment.text.should_not be_empty
151
151
  end
152
152
  end
153
153
  it "should not alter the current font style" do
154
154
  create_pdf
155
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
155
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
156
156
  array = [{ :text => "hello " },
157
157
  { :text => "world how ", :styles => [:bold] },
158
158
  { :text => "are", :styles => [:bold, :italic] },
@@ -162,7 +162,7 @@ describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
162
162
  end
163
163
  arranger.finalize_line
164
164
  arranger.retrieve_fragment
165
- arranger.current_format_state[:styles].should.be.nil
165
+ arranger.current_format_state[:styles].should be_nil
166
166
  end
167
167
  end
168
168
 
@@ -170,7 +170,7 @@ describe "Core::Text::Formatted::Arranger#update_last_string" do
170
170
  it "should update the last retrieved string with what actually fit on" +
171
171
  "the line and the list of unconsumed with what did not" do
172
172
  create_pdf
173
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
173
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
174
174
  array = [{ :text => "hello " },
175
175
  { :text => "world how ", :styles => [:bold] },
176
176
  { :text => "are", :styles => [:bold, :italic] },
@@ -186,7 +186,7 @@ describe "Core::Text::Formatted::Arranger#update_last_string" do
186
186
  end
187
187
  it "should set the format state to the previously processed fragment" do
188
188
  create_pdf
189
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
189
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
190
190
  array = [{ :text => "hello " },
191
191
  { :text => "world how ", :styles => [:bold] },
192
192
  { :text => "are", :styles => [:bold, :italic] },
@@ -201,7 +201,7 @@ describe "Core::Text::Formatted::Arranger#update_last_string" do
201
201
  context "when the entire string was used" do
202
202
  it "should not push empty string onto unconsumed" do
203
203
  create_pdf
204
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
204
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
205
205
  array = [{ :text => "hello " },
206
206
  { :text => "world how ", :styles => [:bold] },
207
207
  { :text => "are", :styles => [:bold, :italic] },
@@ -217,7 +217,7 @@ end
217
217
  describe "Core::Text::Formatted::Arranger#space_count" do
218
218
  before(:each) do
219
219
  create_pdf
220
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
220
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
221
221
  array = [{ :text => "hello " },
222
222
  { :text => "world how ", :styles => [:bold] },
223
223
  { :text => "are", :styles => [:bold, :italic] },
@@ -226,10 +226,10 @@ describe "Core::Text::Formatted::Arranger#space_count" do
226
226
  while string = @arranger.next_string
227
227
  end
228
228
  end
229
- it "should raise an error if called before finalize_line was called" do
229
+ it "should raise_error an error if called before finalize_line was called" do
230
230
  lambda do
231
231
  @arranger.space_count
232
- end.should.raise(RuntimeError)
232
+ end.should raise_error(RuntimeError)
233
233
  end
234
234
  it "should return the total number of spaces in all fragments" do
235
235
  @arranger.finalize_line
@@ -240,7 +240,7 @@ describe "Core::Text::Formatted::Arranger#finalize_line" do
240
240
  it "should make it so that all trailing white space fragments " +
241
241
  "exclude trailing white space" do
242
242
  create_pdf
243
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
243
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
244
244
  array = [{ :text => "hello " },
245
245
  { :text => "world how ", :styles => [:bold] },
246
246
  { :text => " ", :styles => [:bold, :italic] }]
@@ -264,28 +264,28 @@ end
264
264
  describe "Core::Text::Formatted::Arranger#line_width" do
265
265
  before(:each) do
266
266
  create_pdf
267
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
267
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
268
268
  array = [{ :text => "hello " },
269
269
  { :text => "world", :styles => [:bold] }]
270
270
  @arranger.format_array = array
271
271
  while string = @arranger.next_string
272
272
  end
273
273
  end
274
- it "should raise an error if called before finalize_line was called" do
274
+ it "should raise_error an error if called before finalize_line was called" do
275
275
  lambda do
276
276
  @arranger.line_width
277
- end.should.raise(RuntimeError)
277
+ end.should raise_error(RuntimeError)
278
278
  end
279
279
  it "should return the width of the complete line" do
280
280
  @arranger.finalize_line
281
- @arranger.line_width.should.be > 0
281
+ @arranger.line_width.should be > 0
282
282
  end
283
283
  end
284
284
 
285
285
  describe "Core::Text::Formatted::Arranger#line_width with character_spacing > 0" do
286
286
  it "should return a width greater than a line without a character_spacing" do
287
287
  create_pdf
288
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
288
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
289
289
 
290
290
  array = [{ :text => "hello " },
291
291
  { :text => "world", :styles => [:bold] }]
@@ -304,24 +304,24 @@ describe "Core::Text::Formatted::Arranger#line_width with character_spacing > 0"
304
304
  while string = arranger.next_string
305
305
  end
306
306
  arranger.finalize_line
307
- arranger.line_width.should.be > base_line_width
307
+ arranger.line_width.should be > base_line_width
308
308
  end
309
309
  end
310
310
 
311
311
  describe "Core::Text::Formatted::Arranger#line" do
312
312
  before(:each) do
313
313
  create_pdf
314
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
314
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
315
315
  array = [{ :text => "hello " },
316
316
  { :text => "world", :styles => [:bold] }]
317
317
  @arranger.format_array = array
318
318
  while string = @arranger.next_string
319
319
  end
320
320
  end
321
- it "should raise an error if called before finalize_line was called" do
321
+ it "should raise_error an error if called before finalize_line was called" do
322
322
  lambda do
323
323
  @arranger.line
324
- end.should.raise(RuntimeError)
324
+ end.should raise_error(RuntimeError)
325
325
  end
326
326
  it "should return the complete line" do
327
327
  @arranger.finalize_line
@@ -332,7 +332,7 @@ end
332
332
  describe "Core::Text::Formatted::Arranger#unconsumed" do
333
333
  it "should return the original array if nothing was consumed" do
334
334
  create_pdf
335
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
335
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
336
336
  array = [{ :text => "hello " },
337
337
  { :text => "world how ", :styles => [:bold] },
338
338
  { :text => "are", :styles => [:bold, :italic] },
@@ -342,7 +342,7 @@ describe "Core::Text::Formatted::Arranger#unconsumed" do
342
342
  end
343
343
  it "should return an empty array if everything was consumed" do
344
344
  create_pdf
345
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
345
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
346
346
  array = [{ :text => "hello " },
347
347
  { :text => "world how ", :styles => [:bold] },
348
348
  { :text => "are", :styles => [:bold, :italic] },
@@ -355,9 +355,9 @@ describe "Core::Text::Formatted::Arranger#unconsumed" do
355
355
  end
356
356
 
357
357
  describe "Core::Text::Formatted::Arranger#finished" do
358
- it "should be false if anything was not printed" do
358
+ it "should be_false if anything was not printed" do
359
359
  create_pdf
360
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
360
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
361
361
  array = [{ :text => "hello " },
362
362
  { :text => "world how ", :styles => [:bold] },
363
363
  { :text => "are", :styles => [:bold, :italic] },
@@ -366,11 +366,11 @@ describe "Core::Text::Formatted::Arranger#finished" do
366
366
  while string = arranger.next_string
367
367
  end
368
368
  arranger.update_last_string(" you", "now?", nil)
369
- arranger.should.not.be.finished
369
+ arranger.should_not be_finished
370
370
  end
371
- it "should be false if everything was printed" do
371
+ it "should be_false if everything was printed" do
372
372
  create_pdf
373
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
373
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
374
374
  array = [{ :text => "hello " },
375
375
  { :text => "world how ", :styles => [:bold] },
376
376
  { :text => "are", :styles => [:bold, :italic] },
@@ -378,14 +378,14 @@ describe "Core::Text::Formatted::Arranger#finished" do
378
378
  arranger.format_array = array
379
379
  while string = arranger.next_string
380
380
  end
381
- arranger.should.be.finished
381
+ arranger.should be_finished
382
382
  end
383
383
  end
384
384
 
385
385
  describe "Core::Text::Formatted::Arranger.max_line_height" do
386
386
  it "should be the height of the maximum consumed fragment" do
387
387
  create_pdf
388
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
388
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
389
389
  array = [{ :text => "hello " },
390
390
  { :text => "world how ", :styles => [:bold] },
391
391
  { :text => "are", :styles => [:bold, :italic],
@@ -395,14 +395,14 @@ describe "Core::Text::Formatted::Arranger.max_line_height" do
395
395
  while string = arranger.next_string
396
396
  end
397
397
  arranger.finalize_line
398
- arranger.max_line_height.should.be.close(33.32, 0.0001)
398
+ arranger.max_line_height.should be_within(0.0001).of(33.32)
399
399
  end
400
400
  end
401
401
 
402
402
  describe "Core::Text::Formatted::Arranger#repack_unretrieved" do
403
403
  it "should restore part of the original string" do
404
404
  create_pdf
405
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
405
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
406
406
  array = [{ :text => "hello " },
407
407
  { :text => "world how ", :styles => [:bold] },
408
408
  { :text => "are", :styles => [:bold, :italic] },
@@ -18,22 +18,19 @@ describe "Text::Formatted::Box wrapping" do
18
18
  text_box.text.should == "Hello\nWorld2"
19
19
  end
20
20
 
21
- it "should not raise Encoding::CompatibilityError when keeping a TTF and an " +
21
+ it "should not raise an Encoding::CompatibilityError when keeping a TTF and an " +
22
22
  "AFM font together" do
23
- ruby_19 do
24
- file = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf"
25
- @pdf.font_families["Kai"] = {
26
- :normal => { :file => file, :font => "Kai" }
27
- }
28
-
29
- texts = [{ :text => "Hello " },
30
- { :text => "再见", :font => "Kai"},
31
- { :text => "World" }]
32
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
33
- lambda {
34
- text_box.render
35
- }.should.not.raise(Encoding::CompatibilityError)
36
- end
23
+ file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
24
+ @pdf.font_families["Kai"] = {
25
+ :normal => { :file => file, :font => "Kai" }
26
+ }
27
+
28
+ texts = [{ :text => "Hello " },
29
+ { :text => "再见", :font => "Kai"},
30
+ { :text => "World" }]
31
+ text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
32
+
33
+ text_box.render
37
34
  end
38
35
 
39
36
  it "should wrap between two fragments when the preceding fragment ends with white space" do
@@ -75,13 +72,44 @@ describe "Text::Formatted::Box wrapping" do
75
72
  text_box.render
76
73
  text_box.text.should == "Hello World\n2"
77
74
  end
75
+
76
+ it "should properly handle empty slices using default encoding" do
77
+ texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }]
78
+ text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen"))
79
+ lambda {
80
+ text_box.render
81
+ }.should_not raise_error
82
+ text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli"
83
+ end
84
+
85
+ describe "Unicode" do
86
+ before do
87
+ @reset_value = [Encoding.default_external, Encoding.default_internal]
88
+ Encoding.default_external = Encoding::UTF_8
89
+ Encoding.default_internal = Encoding::UTF_8
90
+ end
91
+
92
+ after do
93
+ Encoding.default_external = @reset_value[0]
94
+ Encoding.default_internal = @reset_value[1]
95
+ end
96
+
97
+ it "should properly handle empty slices using Unicode encoding" do
98
+ texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }]
99
+ text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen"))
100
+ lambda {
101
+ text_box.render
102
+ }.should_not raise_error
103
+ text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli"
104
+ end
105
+ end
78
106
  end
79
107
 
80
108
  describe "Text::Formatted::Box with :fallback_fonts option that includes" +
81
109
  "a Chinese font and set of Chinese glyphs not in the current font" do
82
110
  it "should change the font to the Chinese font for the Chinese glyphs" do
83
111
  create_pdf
84
- file = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf"
112
+ file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
85
113
  @pdf.font_families["Kai"] = {
86
114
  :normal => { :file => file, :font => "Kai" }
87
115
  }
@@ -109,7 +137,7 @@ describe "Text::Formatted::Box with :fallback_fonts option that includes" +
109
137
  "an AFM font and Win-Ansi glyph not in the current Chinese font" do
110
138
  it "should change the font to the AFM font for the Win-Ansi glyph" do
111
139
  create_pdf
112
- file = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf"
140
+ file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
113
141
  @pdf.font_families["Kai"] = {
114
142
  :normal => { :file => file, :font => "Kai" }
115
143
  }
@@ -138,7 +166,7 @@ describe "Text::Formatted::Box with :fallback_fonts option and fragment " +
138
166
  "level font" do
139
167
  it "should use the fragment level font except for glyphs not in that font" do
140
168
  create_pdf
141
- file = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf"
169
+ file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
142
170
  @pdf.font_families["Kai"] = {
143
171
  :normal => { :file => file, :font => "Kai" }
144
172
  }
@@ -165,7 +193,7 @@ end
165
193
  describe "Text::Formatted::Box" do
166
194
  before(:each) do
167
195
  create_pdf
168
- file = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf"
196
+ file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
169
197
  @pdf.font_families["Kai"] = {
170
198
  :normal => { :file => file, :font => "Kai" }
171
199
  }
@@ -357,7 +385,8 @@ describe "Text::Formatted::Box#render" do
357
385
  { :text => "callback now",
358
386
  :callback => [behind, in_front] }]
359
387
  text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
360
- lambda { text_box.render }.should.not.raise(NoMethodError)
388
+
389
+ text_box.render # trigger callbacks
361
390
  end
362
391
  it "should be able to set the font" do
363
392
  create_pdf
@@ -409,7 +438,7 @@ describe "Text::Formatted::Box#render" do
409
438
  text_box.render
410
439
  contents = PDF::Inspector::Text.analyze(@pdf.render)
411
440
  contents.font_settings[0][:size].should == 12
412
- contents.font_settings[1][:size].should.be.close(18 * 0.583, 0.0001)
441
+ contents.font_settings[1][:size].should be_within(0.0001).of(18 * 0.583)
413
442
  end
414
443
  it "should be able to set superscript" do
415
444
  create_pdf
@@ -420,7 +449,7 @@ describe "Text::Formatted::Box#render" do
420
449
  text_box.render
421
450
  contents = PDF::Inspector::Text.analyze(@pdf.render)
422
451
  contents.font_settings[0][:size].should == 12
423
- contents.font_settings[1][:size].should.be.close(18 * 0.583, 0.0001)
452
+ contents.font_settings[1][:size].should be_within(0.0001).of(18 * 0.583)
424
453
  end
425
454
  it "should be able to set compound bold and italic text" do
426
455
  create_pdf
@@ -472,6 +501,16 @@ describe "Text::Formatted::Box#render" do
472
501
  text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
473
502
  text_box.render
474
503
  end
504
+ it "should be able to add local actions" do
505
+ create_pdf
506
+ @pdf.expects(:link_annotation).with(kind_of(Array), :Border => [0,0,0],
507
+ :A => { :Type => :Action, :S => :Launch, :F => "../example.pdf", :NewWindow => true })
508
+ array = [{ :text => "click " },
509
+ { :text => "here", :local => "../example.pdf" },
510
+ { :text => " to open a local file" }]
511
+ text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
512
+ text_box.render
513
+ end
475
514
  it "should be able to set font size" do
476
515
  create_pdf
477
516
  array = [{ :text => "this contains " },
@@ -491,7 +530,7 @@ describe "Text::Formatted::Box#render" do
491
530
  text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
492
531
  text_box.render
493
532
  @pdf.font_size(24) do
494
- text_box.height.should.be.close(@pdf.font.ascender + @pdf.font.descender, 0.001)
533
+ text_box.height.should be_within(0.001).of(@pdf.font.ascender + @pdf.font.descender)
495
534
  end
496
535
  end
497
536
  it "should be able to set color via an rgb hex string" do
@@ -551,7 +590,7 @@ describe "Text::Formatted::Box#render with :align => :justify" do
551
590
  text_box = Prawn::Text::Formatted::Box.new(array, options)
552
591
  text_box.render
553
592
  contents = PDF::Inspector::Text.analyze(@pdf.render)
554
- contents.word_spacing.should.be.empty
593
+ contents.word_spacing.should be_empty
555
594
  end
556
595
  end
557
596
 
@@ -75,7 +75,7 @@ describe "Text::Formatted::Fragment#word_spacing=" do
75
75
  @fragment.ascender = 17
76
76
  @fragment.word_spacing = 10
77
77
  end
78
-
78
+
79
79
  it "should account for word_spacing in #width" do
80
80
  @fragment.width.should == 110
81
81
  end
@@ -122,7 +122,7 @@ describe "Text::Formatted::Fragment" do
122
122
  @fragment.descender = 7
123
123
  @fragment.ascender = 17
124
124
  end
125
-
125
+
126
126
  describe "#width" do
127
127
  it "should return the width" do
128
128
  @fragment.width.should == 100
@@ -224,13 +224,13 @@ describe "Text::Formatted::Fragment that is a subscript" do
224
224
  @fragment.ascender = 17
225
225
  end
226
226
  describe "#subscript?" do
227
- it "should be true" do
228
- @fragment.should.be.subscript
227
+ it "should be_true" do
228
+ @fragment.should be_subscript
229
229
  end
230
230
  end
231
231
  describe "#y_offset" do
232
232
  it "should return a negative value" do
233
- @fragment.y_offset.should.be < 0
233
+ @fragment.y_offset.should be < 0
234
234
  end
235
235
  end
236
236
  end
@@ -252,13 +252,13 @@ describe "Text::Formatted::Fragment that is a superscript" do
252
252
  @fragment.ascender = 17
253
253
  end
254
254
  describe "#superscript?" do
255
- it "should be true" do
256
- @fragment.should.be.superscript
255
+ it "should be_true" do
256
+ @fragment.should be_superscript
257
257
  end
258
258
  end
259
259
  describe "#y_offset" do
260
260
  it "should return a positive value" do
261
- @fragment.y_offset.should.be > 0
261
+ @fragment.y_offset.should be > 0
262
262
  end
263
263
  end
264
264
  end