alphasights-prawn 0.10.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 (244) hide show
  1. data/COPYING +340 -0
  2. data/HACKING +50 -0
  3. data/LICENSE +56 -0
  4. data/README +141 -0
  5. data/Rakefile +52 -0
  6. data/data/encodings/win_ansi.txt +29 -0
  7. data/data/fonts/Action Man.dfont +0 -0
  8. data/data/fonts/Activa.ttf +0 -0
  9. data/data/fonts/Chalkboard.ttf +0 -0
  10. data/data/fonts/Courier-Bold.afm +342 -0
  11. data/data/fonts/Courier-BoldOblique.afm +342 -0
  12. data/data/fonts/Courier-Oblique.afm +342 -0
  13. data/data/fonts/Courier.afm +342 -0
  14. data/data/fonts/DejaVuSans.ttf +0 -0
  15. data/data/fonts/Dustismo_Roman.ttf +0 -0
  16. data/data/fonts/Helvetica-Bold.afm +2827 -0
  17. data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
  18. data/data/fonts/Helvetica-Oblique.afm +3051 -0
  19. data/data/fonts/Helvetica.afm +3051 -0
  20. data/data/fonts/MustRead.html +19 -0
  21. data/data/fonts/Symbol.afm +213 -0
  22. data/data/fonts/Times-Bold.afm +2588 -0
  23. data/data/fonts/Times-BoldItalic.afm +2384 -0
  24. data/data/fonts/Times-Italic.afm +2667 -0
  25. data/data/fonts/Times-Roman.afm +2419 -0
  26. data/data/fonts/ZapfDingbats.afm +225 -0
  27. data/data/fonts/comicsans.ttf +0 -0
  28. data/data/fonts/gkai00mp.ttf +0 -0
  29. data/data/images/16bit.alpha +0 -0
  30. data/data/images/16bit.dat +0 -0
  31. data/data/images/16bit.png +0 -0
  32. data/data/images/arrow.png +0 -0
  33. data/data/images/arrow2.png +0 -0
  34. data/data/images/barcode_issue.png +0 -0
  35. data/data/images/dice.alpha +0 -0
  36. data/data/images/dice.dat +0 -0
  37. data/data/images/dice.png +0 -0
  38. data/data/images/dice_interlaced.png +0 -0
  39. data/data/images/fractal.jpg +0 -0
  40. data/data/images/letterhead.jpg +0 -0
  41. data/data/images/page_white_text.alpha +0 -0
  42. data/data/images/page_white_text.dat +0 -0
  43. data/data/images/page_white_text.png +0 -0
  44. data/data/images/pigs.jpg +0 -0
  45. data/data/images/rails.dat +0 -0
  46. data/data/images/rails.png +0 -0
  47. data/data/images/ruport.png +0 -0
  48. data/data/images/ruport_data.dat +0 -0
  49. data/data/images/ruport_transparent.png +0 -0
  50. data/data/images/ruport_type0.png +0 -0
  51. data/data/images/stef.jpg +0 -0
  52. data/data/images/tru256.bmp +0 -0
  53. data/data/images/web-links.dat +1 -0
  54. data/data/images/web-links.png +0 -0
  55. data/data/pdfs/complex_template.pdf +0 -0
  56. data/data/pdfs/contains_ttf_font.pdf +0 -0
  57. data/data/pdfs/encrypted.pdf +0 -0
  58. data/data/pdfs/hexagon.pdf +61 -0
  59. data/data/pdfs/indirect_reference.pdf +86 -0
  60. data/data/pdfs/nested_pages.pdf +118 -0
  61. data/data/pdfs/resources_as_indirect_object.pdf +83 -0
  62. data/data/pdfs/two_hexagons.pdf +90 -0
  63. data/data/pdfs/version_1_6.pdf +61 -0
  64. data/data/shift_jis_text.txt +1 -0
  65. data/examples/bounding_box/bounding_boxes.rb +43 -0
  66. data/examples/bounding_box/indentation.rb +34 -0
  67. data/examples/bounding_box/russian_boxes.rb +36 -0
  68. data/examples/bounding_box/stretched_nesting.rb +67 -0
  69. data/examples/builder/simple.rb +28 -0
  70. data/examples/example_helper.rb +4 -0
  71. data/examples/general/background.rb +23 -0
  72. data/examples/general/canvas.rb +15 -0
  73. data/examples/general/context_sensitive_headers.rb +37 -0
  74. data/examples/general/float.rb +11 -0
  75. data/examples/general/margin.rb +36 -0
  76. data/examples/general/measurement_units.rb +51 -0
  77. data/examples/general/metadata-info.rb +16 -0
  78. data/examples/general/multi_page_layout.rb +18 -0
  79. data/examples/general/outlines.rb +50 -0
  80. data/examples/general/page_geometry.rb +31 -0
  81. data/examples/general/page_numbering.rb +15 -0
  82. data/examples/general/repeaters.rb +47 -0
  83. data/examples/general/stamp.rb +41 -0
  84. data/examples/general/templates.rb +13 -0
  85. data/examples/graphics/basic_images.rb +23 -0
  86. data/examples/graphics/chunkable.rb +38 -0
  87. data/examples/graphics/cmyk.rb +12 -0
  88. data/examples/graphics/curves.rb +11 -0
  89. data/examples/graphics/hexagon.rb +13 -0
  90. data/examples/graphics/image_fit.rb +15 -0
  91. data/examples/graphics/image_flow.rb +37 -0
  92. data/examples/graphics/image_position.rb +17 -0
  93. data/examples/graphics/line.rb +32 -0
  94. data/examples/graphics/png_types.rb +22 -0
  95. data/examples/graphics/polygons.rb +16 -0
  96. data/examples/graphics/remote_images.rb +12 -0
  97. data/examples/graphics/rounded_polygons.rb +19 -0
  98. data/examples/graphics/rounded_rectangle.rb +20 -0
  99. data/examples/graphics/ruport_style_helpers.rb +19 -0
  100. data/examples/graphics/stroke_bounds.rb +20 -0
  101. data/examples/graphics/stroke_cap_and_join.rb +45 -0
  102. data/examples/graphics/stroke_dash.rb +42 -0
  103. data/examples/graphics/transformations.rb +52 -0
  104. data/examples/graphics/transparency.rb +26 -0
  105. data/examples/m17n/chinese_text_wrapping.rb +17 -0
  106. data/examples/m17n/euro.rb +15 -0
  107. data/examples/m17n/sjis.rb +28 -0
  108. data/examples/m17n/utf8.rb +13 -0
  109. data/examples/m17n/win_ansi_charset.rb +54 -0
  110. data/examples/security/hello_foo.rb +8 -0
  111. data/examples/table/bill.rb +53 -0
  112. data/examples/table/cell.rb +12 -0
  113. data/examples/table/checkerboard.rb +22 -0
  114. data/examples/table/header.rb +14 -0
  115. data/examples/table/inline_format_table.rb +12 -0
  116. data/examples/table/multi_page_table.rb +9 -0
  117. data/examples/table/simple_table.rb +24 -0
  118. data/examples/table/subtable.rb +12 -0
  119. data/examples/table/widths.rb +20 -0
  120. data/examples/text/alignment.rb +18 -0
  121. data/examples/text/character_spacing.rb +12 -0
  122. data/examples/text/dfont.rb +48 -0
  123. data/examples/text/family_based_styling.rb +24 -0
  124. data/examples/text/font_calculations.rb +91 -0
  125. data/examples/text/font_size.rb +33 -0
  126. data/examples/text/hyphenation.rb +45 -0
  127. data/examples/text/indent_paragraphs.rb +22 -0
  128. data/examples/text/inline_format.rb +103 -0
  129. data/examples/text/kerning.rb +30 -0
  130. data/examples/text/rotated.rb +98 -0
  131. data/examples/text/shaped_text_box.rb +31 -0
  132. data/examples/text/simple_text.rb +17 -0
  133. data/examples/text/simple_text_ttf.rb +17 -0
  134. data/examples/text/text_box.rb +88 -0
  135. data/examples/text/text_box_returning_excess.rb +51 -0
  136. data/examples/text/text_flow.rb +67 -0
  137. data/lib/prawn.rb +27 -0
  138. data/lib/prawn/canvas.rb +119 -0
  139. data/lib/prawn/chunkable.rb +37 -0
  140. data/lib/prawn/compatibility.rb +51 -0
  141. data/lib/prawn/core.rb +85 -0
  142. data/lib/prawn/core/annotations.rb +61 -0
  143. data/lib/prawn/core/byte_string.rb +9 -0
  144. data/lib/prawn/core/chunk.rb +36 -0
  145. data/lib/prawn/core/destinations.rb +90 -0
  146. data/lib/prawn/core/document_state.rb +78 -0
  147. data/lib/prawn/core/literal_string.rb +16 -0
  148. data/lib/prawn/core/name_tree.rb +165 -0
  149. data/lib/prawn/core/object_store.rb +236 -0
  150. data/lib/prawn/core/page.rb +179 -0
  151. data/lib/prawn/core/pdf_object.rb +108 -0
  152. data/lib/prawn/core/reference.rb +112 -0
  153. data/lib/prawn/core/text.rb +140 -0
  154. data/lib/prawn/core/text/formatted/arranger.rb +266 -0
  155. data/lib/prawn/core/text/formatted/line_wrap.rb +127 -0
  156. data/lib/prawn/core/text/formatted/wrap.rb +112 -0
  157. data/lib/prawn/core/text/line_wrap.rb +209 -0
  158. data/lib/prawn/core/text/wrap.rb +80 -0
  159. data/lib/prawn/document.rb +573 -0
  160. data/lib/prawn/document/bounding_box.rb +425 -0
  161. data/lib/prawn/document/graphics_state.rb +48 -0
  162. data/lib/prawn/document/internals.rb +170 -0
  163. data/lib/prawn/document/page_geometry.rb +136 -0
  164. data/lib/prawn/document/snapshot.rb +87 -0
  165. data/lib/prawn/document_builder.rb +51 -0
  166. data/lib/prawn/document_builder/command.rb +38 -0
  167. data/lib/prawn/document_builder/constructs.rb +2 -0
  168. data/lib/prawn/document_builder/constructs/flowing_text_construct.rb +18 -0
  169. data/lib/prawn/document_builder/constructs/path_construct.rb +9 -0
  170. data/lib/prawn/document_builder/layout.rb +25 -0
  171. data/lib/prawn/document_builder/modifications.rb +2 -0
  172. data/lib/prawn/document_builder/modifications/layout_modification.rb +9 -0
  173. data/lib/prawn/document_builder/modifications/path_modification.rb +9 -0
  174. data/lib/prawn/encoding.rb +121 -0
  175. data/lib/prawn/errors.rb +94 -0
  176. data/lib/prawn/font.rb +341 -0
  177. data/lib/prawn/font/afm.rb +225 -0
  178. data/lib/prawn/font/dfont.rb +42 -0
  179. data/lib/prawn/font/ttf.rb +350 -0
  180. data/lib/prawn/graphics.rb +325 -0
  181. data/lib/prawn/graphics/cap_style.rb +38 -0
  182. data/lib/prawn/graphics/color.rb +205 -0
  183. data/lib/prawn/graphics/dash.rb +71 -0
  184. data/lib/prawn/graphics/join_style.rb +38 -0
  185. data/lib/prawn/graphics/transformation.rb +156 -0
  186. data/lib/prawn/graphics/transparency.rb +99 -0
  187. data/lib/prawn/images.rb +348 -0
  188. data/lib/prawn/images/jpg.rb +46 -0
  189. data/lib/prawn/images/png.rb +226 -0
  190. data/lib/prawn/measurement_extensions.rb +46 -0
  191. data/lib/prawn/measurements.rb +71 -0
  192. data/lib/prawn/outline.rb +278 -0
  193. data/lib/prawn/repeater.rb +129 -0
  194. data/lib/prawn/security.rb +262 -0
  195. data/lib/prawn/security/arcfour.rb +51 -0
  196. data/lib/prawn/stamp.rb +126 -0
  197. data/lib/prawn/table.rb +421 -0
  198. data/lib/prawn/table/accessors.rb +180 -0
  199. data/lib/prawn/table/cell.rb +350 -0
  200. data/lib/prawn/table/cell/in_table.rb +27 -0
  201. data/lib/prawn/table/cell/subtable.rb +65 -0
  202. data/lib/prawn/table/cell/text.rb +125 -0
  203. data/lib/prawn/text.rb +449 -0
  204. data/lib/prawn/text/box.rb +392 -0
  205. data/lib/prawn/text/formatted.rb +4 -0
  206. data/lib/prawn/text/formatted/box.rb +228 -0
  207. data/lib/prawn/text/formatted/fragment.rb +181 -0
  208. data/lib/prawn/text/formatted/parser.rb +213 -0
  209. data/spec/annotations_spec.rb +90 -0
  210. data/spec/bounding_box_spec.rb +190 -0
  211. data/spec/cell_spec.rb +348 -0
  212. data/spec/destinations_spec.rb +15 -0
  213. data/spec/document_spec.rb +473 -0
  214. data/spec/font_spec.rb +324 -0
  215. data/spec/formatted_text_arranger_spec.rb +426 -0
  216. data/spec/formatted_text_box_spec.rb +756 -0
  217. data/spec/formatted_text_fragment_spec.rb +211 -0
  218. data/spec/graphics_spec.rb +446 -0
  219. data/spec/images_spec.rb +96 -0
  220. data/spec/inline_formatted_text_parser_spec.rb +502 -0
  221. data/spec/jpg_spec.rb +25 -0
  222. data/spec/line_wrap_spec.rb +341 -0
  223. data/spec/measurement_units_spec.rb +23 -0
  224. data/spec/name_tree_spec.rb +112 -0
  225. data/spec/object_store_spec.rb +160 -0
  226. data/spec/outline_spec.rb +269 -0
  227. data/spec/pdf_object_spec.rb +170 -0
  228. data/spec/png_spec.rb +237 -0
  229. data/spec/reference_spec.rb +82 -0
  230. data/spec/repeater_spec.rb +96 -0
  231. data/spec/security_spec.rb +120 -0
  232. data/spec/snapshot_spec.rb +138 -0
  233. data/spec/spec_helper.rb +26 -0
  234. data/spec/stamp_spec.rb +108 -0
  235. data/spec/stroke_styles_spec.rb +163 -0
  236. data/spec/table_spec.rb +598 -0
  237. data/spec/template_spec.rb +158 -0
  238. data/spec/text_at_spec.rb +119 -0
  239. data/spec/text_box_spec.rb +742 -0
  240. data/spec/text_spacing_spec.rb +75 -0
  241. data/spec/text_spec.rb +333 -0
  242. data/spec/text_with_inline_formatting_spec.rb +193 -0
  243. data/spec/transparency_spec.rb +89 -0
  244. metadata +331 -0
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
+
5
+ describe "the image() function" do
6
+
7
+ before(:each) do
8
+ @filename = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
9
+ create_pdf
10
+ end
11
+
12
+ it "should only embed an image once, even if it's added multiple times" do
13
+ @pdf.image @filename, :at => [100,100]
14
+ @pdf.image @filename, :at => [300,300]
15
+
16
+ output = @pdf.render
17
+ images = PDF::Inspector::XObject.analyze(output)
18
+ # there should be 2 images in the page resources
19
+ images.page_xobjects.first.size.should == 2
20
+ # but only 1 image xobject
21
+ output.scan(/\/Type \/XObject/).size.should == 1
22
+ end
23
+
24
+ it "should return the image info object" do
25
+ info = @pdf.image(@filename)
26
+
27
+ info.should.be.kind_of(Prawn::Images::JPG)
28
+
29
+ info.height.should == 453
30
+ end
31
+
32
+ it "should accept IO objects" do
33
+ file = File.open(@filename, "rb")
34
+ info = @pdf.image(file)
35
+
36
+ info.height.should == 453
37
+ end
38
+
39
+ it "should raise an UnsupportedImageType if passed a BMP" do
40
+ filename = "#{Prawn::BASEDIR}/data/images/tru256.bmp"
41
+ lambda { @pdf.image filename, :at => [100,100] }.should.raise(Prawn::Errors::UnsupportedImageType)
42
+ end
43
+
44
+ it "should raise an UnsupportedImageType if passed an interlaced PNG" do
45
+ filename = "#{Prawn::BASEDIR}/data/images/dice_interlaced.png"
46
+ lambda { @pdf.image filename, :at => [100,100] }.should.raise(Prawn::Errors::UnsupportedImageType)
47
+ end
48
+
49
+ it "should bump PDF version to 1.5 or greater on embedding 16-bit PNGs" do
50
+ @pdf.image "#{Prawn::BASEDIR}/data/images/16bit.png"
51
+ @pdf.state.version.should >= 1.5
52
+ end
53
+
54
+ # to support Adobe Reader, which apparently doesn't handle 16-bit alpha
55
+ # channels. Verified experimentally [BE] but not confirmed in documentation
56
+ # or anything. OS X Preview handles those files just fine.
57
+ #
58
+ it "should embed 8-bit alpha channels for 16-bit PNGs" do
59
+ @pdf.image "#{Prawn::BASEDIR}/data/images/16bit.png"
60
+
61
+ output = @pdf.render
62
+ output.should =~ /\/BitsPerComponent 16/
63
+ output.should =~ /\/BitsPerComponent 8/
64
+ end
65
+
66
+ describe ":fit option" do
67
+ it "should fit inside the defined constraints" do
68
+ info = @pdf.image @filename, :fit => [100,400]
69
+ info.scaled_width.should <= 100
70
+ info.scaled_height.should <= 400
71
+
72
+ info = @pdf.image @filename, :fit => [400,100]
73
+ info.scaled_width.should <= 400
74
+ info.scaled_height.should <= 100
75
+
76
+ info = @pdf.image @filename, :fit => [604,453]
77
+ info.scaled_width.should == 604
78
+ info.scaled_height.should == 453
79
+ end
80
+ it "should move text position" do
81
+ @y = @pdf.y
82
+ info = @pdf.image @filename, :fit => [100,400]
83
+ @pdf.y.should < @y
84
+ end
85
+ end
86
+
87
+ describe ":at option" do
88
+ it "should not move text position" do
89
+ @y = @pdf.y
90
+ info = @pdf.image @filename, :at => [100,400]
91
+ @pdf.y.should == @y
92
+ end
93
+ end
94
+
95
+ end
96
+
@@ -0,0 +1,502 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
3
+
4
+ describe "Text::Formatted::Parser#to_array" do
5
+ it "should handle sup" do
6
+ string = "<sup>superscript</sup>"
7
+ array = Prawn::Text::Formatted::Parser.to_array(string)
8
+ array[0].should == { :text => "superscript",
9
+ :styles => [:superscript],
10
+ :color => nil,
11
+ :link => nil,
12
+ :anchor => nil,
13
+ :font => nil,
14
+ :size => nil,
15
+ :character_spacing => nil }
16
+ end
17
+ it "should handle sub" do
18
+ string = "<sub>subscript</sub>"
19
+ array = Prawn::Text::Formatted::Parser.to_array(string)
20
+ array[0].should == { :text => "subscript",
21
+ :styles => [:subscript],
22
+ :color => nil,
23
+ :link => nil,
24
+ :anchor => nil,
25
+ :font => nil,
26
+ :size => nil,
27
+ :character_spacing => nil }
28
+ end
29
+ it "should handle rgb" do
30
+ string = "<color rgb='#ff0000'>red text</color>"
31
+ array = Prawn::Text::Formatted::Parser.to_array(string)
32
+ array[0].should == { :text => "red text",
33
+ :styles => [],
34
+ :color => "ff0000",
35
+ :link => nil,
36
+ :anchor => nil,
37
+ :font => nil,
38
+ :size => nil,
39
+ :character_spacing => nil }
40
+ end
41
+ it "# should be optional in rgb" do
42
+ string = "<color rgb='ff0000'>red text</color>"
43
+ array = Prawn::Text::Formatted::Parser.to_array(string)
44
+ array[0].should == { :text => "red text",
45
+ :styles => [],
46
+ :color => "ff0000",
47
+ :link => nil,
48
+ :anchor => nil,
49
+ :font => nil,
50
+ :size => nil,
51
+ :character_spacing => nil }
52
+ end
53
+ it "should handle cmyk" do
54
+ string = "<color c='0' m='100' y='0' k='0'>magenta text</color>"
55
+ array = Prawn::Text::Formatted::Parser.to_array(string)
56
+ array[0].should == { :text => "magenta text",
57
+ :styles => [],
58
+ :color => [0, 100, 0, 0],
59
+ :link => nil,
60
+ :anchor => nil,
61
+ :font => nil,
62
+ :size => nil,
63
+ :character_spacing => nil }
64
+ end
65
+ it "should handle fonts" do
66
+ string = "<font name='Courier'>Courier text</font>"
67
+ array = Prawn::Text::Formatted::Parser.to_array(string)
68
+ array[0].should == { :text => "Courier text",
69
+ :styles => [],
70
+ :color => nil,
71
+ :link => nil,
72
+ :anchor => nil,
73
+ :font => "Courier",
74
+ :size => nil,
75
+ :character_spacing => nil }
76
+ end
77
+ it "should handle size" do
78
+ string = "<font size='14'>14 point text</font>"
79
+ array = Prawn::Text::Formatted::Parser.to_array(string)
80
+ array[0].should == { :text => "14 point text",
81
+ :styles => [],
82
+ :color => nil,
83
+ :link => nil,
84
+ :anchor => nil,
85
+ :font => nil,
86
+ :size => 14,
87
+ :character_spacing => nil }
88
+ end
89
+ it "should handle character_spacing" do
90
+ string = "<font character_spacing='2.5'>extra character spacing</font>"
91
+ array = Prawn::Text::Formatted::Parser.to_array(string)
92
+ array[0].should == { :text => "extra character spacing",
93
+ :styles => [],
94
+ :color => nil,
95
+ :link => nil,
96
+ :anchor => nil,
97
+ :font => nil,
98
+ :size => nil,
99
+ :character_spacing => 2.5 }
100
+ end
101
+ it "should handle links" do
102
+ string = "<link href='http://example.com'>external link</link>"
103
+ array = Prawn::Text::Formatted::Parser.to_array(string)
104
+ array[0].should == { :text => "external link",
105
+ :styles => [],
106
+ :color => nil,
107
+ :link => "http://example.com",
108
+ :anchor => nil,
109
+ :font => nil,
110
+ :size => nil,
111
+ :character_spacing => nil }
112
+ end
113
+ it "should handle anchors" do
114
+ string = "<link anchor='ToC'>internal link</link>"
115
+ array = Prawn::Text::Formatted::Parser.to_array(string)
116
+ array[0].should == { :text => "internal link",
117
+ :styles => [],
118
+ :color => nil,
119
+ :link => nil,
120
+ :anchor => "ToC",
121
+ :font => nil,
122
+ :size => nil,
123
+ :character_spacing => nil }
124
+ end
125
+ it "should handle higher order characters properly" do
126
+ string = "<b>©\n©</b>"
127
+ array = Prawn::Text::Formatted::Parser.to_array(string)
128
+ array[0].should == { :text => "©",
129
+ :styles => [:bold],
130
+ :color => nil,
131
+ :link => nil,
132
+ :anchor => nil,
133
+ :font => nil,
134
+ :size => nil,
135
+ :character_spacing => nil }
136
+ array[1].should == { :text => "\n",
137
+ :styles => [:bold],
138
+ :color => nil,
139
+ :link => nil,
140
+ :anchor => nil,
141
+ :font => nil,
142
+ :size => nil,
143
+ :character_spacing => nil }
144
+ array[2].should == { :text => "©",
145
+ :styles => [:bold],
146
+ :color => nil,
147
+ :link => nil,
148
+ :anchor => nil,
149
+ :font => nil,
150
+ :size => nil,
151
+ :character_spacing => nil }
152
+ end
153
+ it "should convert &lt; &gt;, and &amp; to <, >, and &, respectively" do
154
+ string = "hello <b>&lt;, &gt;, and &amp;</b>"
155
+ array = Prawn::Text::Formatted::Parser.to_array(string)
156
+ array[1].should == { :text => "<, >, and &",
157
+ :styles => [:bold],
158
+ :color => nil,
159
+ :link => nil,
160
+ :anchor => nil,
161
+ :font => nil,
162
+ :size => nil,
163
+ :character_spacing => nil }
164
+ end
165
+ it "should handle double qoutes around tag attributes" do
166
+ string = 'some <font size="14">sized</font> text'
167
+ array = Prawn::Text::Formatted::Parser.to_array(string)
168
+ array[1].should == { :text => "sized",
169
+ :styles => [],
170
+ :color => nil,
171
+ :link => nil,
172
+ :anchor => nil,
173
+ :font => nil,
174
+ :size => 14,
175
+ :character_spacing => nil }
176
+ end
177
+ it "should handle single qoutes around tag attributes" do
178
+ string = "some <font size='14'>sized</font> text"
179
+ array = Prawn::Text::Formatted::Parser.to_array(string)
180
+ array[1].should == { :text => "sized",
181
+ :styles => [],
182
+ :color => nil,
183
+ :link => nil,
184
+ :anchor => nil,
185
+ :font => nil,
186
+ :size => 14,
187
+ :character_spacing => nil }
188
+ end
189
+ it "should construct a formatted text array from a string" do
190
+ string = "hello <b>world\nhow <i>are</i></b> you?"
191
+ array = Prawn::Text::Formatted::Parser.to_array(string)
192
+
193
+ array[0].should == { :text => "hello ",
194
+ :styles => [],
195
+ :color => nil,
196
+ :link => nil,
197
+ :anchor => nil,
198
+ :font => nil,
199
+ :size => nil,
200
+ :character_spacing => nil }
201
+ array[1].should == { :text => "world",
202
+ :styles => [:bold],
203
+ :color => nil,
204
+ :link => nil,
205
+ :anchor => nil,
206
+ :font => nil,
207
+ :size => nil,
208
+ :character_spacing => nil }
209
+ array[2].should == { :text => "\n",
210
+ :styles => [:bold],
211
+ :color => nil,
212
+ :link => nil,
213
+ :anchor => nil,
214
+ :font => nil,
215
+ :size => nil,
216
+ :character_spacing => nil }
217
+ array[3].should == { :text => "how ",
218
+ :styles => [:bold],
219
+ :color => nil,
220
+ :link => nil,
221
+ :anchor => nil,
222
+ :font => nil,
223
+ :size => nil,
224
+ :character_spacing => nil }
225
+ array[4].should == { :text => "are",
226
+ :styles => [:bold, :italic],
227
+ :color => nil,
228
+ :link => nil,
229
+ :anchor => nil,
230
+ :font => nil,
231
+ :size => nil,
232
+ :character_spacing => nil }
233
+ array[5].should == { :text => " you?",
234
+ :styles => [],
235
+ :color => nil,
236
+ :link => nil,
237
+ :anchor => nil,
238
+ :font => nil,
239
+ :size => nil,
240
+ :character_spacing => nil }
241
+ end
242
+ it "should accept <strong> as an alternative to <b>" do
243
+ string = "<strong>bold</strong> not bold"
244
+ array = Prawn::Text::Formatted::Parser.to_array(string)
245
+
246
+ array[0].should == { :text => "bold",
247
+ :styles => [:bold],
248
+ :color => nil,
249
+ :link => nil,
250
+ :anchor => nil,
251
+ :font => nil,
252
+ :size => nil,
253
+ :character_spacing => nil }
254
+ array[1].should == { :text => " not bold",
255
+ :styles => [],
256
+ :color => nil,
257
+ :link => nil,
258
+ :anchor => nil,
259
+ :font => nil,
260
+ :size => nil,
261
+ :character_spacing => nil }
262
+ end
263
+ it "should accept <em> as an alternative to <i>" do
264
+ string = "<em>italic</em> not italic"
265
+ array = Prawn::Text::Formatted::Parser.to_array(string)
266
+
267
+ array[0].should == { :text => "italic",
268
+ :styles => [:italic],
269
+ :color => nil,
270
+ :link => nil,
271
+ :anchor => nil,
272
+ :font => nil,
273
+ :size => nil,
274
+ :character_spacing => nil }
275
+ array[1].should == { :text => " not italic",
276
+ :styles => [],
277
+ :color => nil,
278
+ :link => nil,
279
+ :anchor => nil,
280
+ :font => nil,
281
+ :size => nil,
282
+ :character_spacing => nil }
283
+ end
284
+ it "should accept <a> as an alternative to <link>" do
285
+ string = "<a href='http://example.com'>link</a> not a link"
286
+ array = Prawn::Text::Formatted::Parser.to_array(string)
287
+
288
+ array[0].should == { :text => "link",
289
+ :styles => [],
290
+ :color => nil,
291
+ :link => "http://example.com",
292
+ :anchor => nil,
293
+ :font => nil,
294
+ :size => nil,
295
+ :character_spacing => nil }
296
+ array[1].should == { :text => " not a link",
297
+ :styles => [],
298
+ :color => nil,
299
+ :link => nil,
300
+ :anchor => nil,
301
+ :font => nil,
302
+ :size => nil,
303
+ :character_spacing => nil }
304
+ end
305
+ end
306
+
307
+
308
+ describe "Text::Formatted::Parser#to_string" do
309
+ it "should handle sup" do
310
+ string = "<sup>superscript</sup>"
311
+ array = [{ :text => "superscript",
312
+ :styles => [:superscript],
313
+ :color => nil,
314
+ :link => nil,
315
+ :anchor => nil,
316
+ :font => nil,
317
+ :size => nil,
318
+ :character_spacing => nil }]
319
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
320
+ end
321
+ it "should handle sub" do
322
+ string = "<sub>subscript</sub>"
323
+ array = [{ :text => "subscript",
324
+ :styles => [:subscript],
325
+ :color => nil,
326
+ :link => nil,
327
+ :anchor => nil,
328
+ :font => nil,
329
+ :size => nil,
330
+ :character_spacing => nil }]
331
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
332
+ end
333
+ it "should handle rgb" do
334
+ string = "<color rgb='ff0000'>red text</color>"
335
+ array = [{ :text => "red text",
336
+ :styles => [],
337
+ :color => "ff0000",
338
+ :link => nil,
339
+ :anchor => nil,
340
+ :font => nil,
341
+ :size => nil,
342
+ :character_spacing => nil }]
343
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
344
+ end
345
+ it "should handle cmyk" do
346
+ string = "<color c='0' m='100' y='0' k='0'>magenta text</color>"
347
+ array = [{ :text => "magenta text",
348
+ :styles => [],
349
+ :color => [0, 100, 0, 0],
350
+ :link => nil,
351
+ :anchor => nil,
352
+ :font => nil,
353
+ :size => nil,
354
+ :character_spacing => nil }]
355
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
356
+ end
357
+ it "should handle fonts" do
358
+ string = "<font name='Courier'>Courier text</font>"
359
+ array = [{ :text => "Courier text",
360
+ :styles => [],
361
+ :color => nil,
362
+ :link => nil,
363
+ :anchor => nil,
364
+ :font => "Courier",
365
+ :size => nil,
366
+ :character_spacing => nil }]
367
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
368
+ end
369
+ it "should handle size" do
370
+ string = "<font size='14'>14 point text</font>"
371
+ array = [{ :text => "14 point text",
372
+ :styles => [],
373
+ :color => nil,
374
+ :link => nil,
375
+ :anchor => nil,
376
+ :font => nil,
377
+ :size => 14,
378
+ :character_spacing => nil }]
379
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
380
+ end
381
+ it "should handle character spacing" do
382
+ string = "<font character_spacing='2.5'>2.5 extra character spacing</font>"
383
+ array = [{ :text => "2.5 extra character spacing",
384
+ :styles => [],
385
+ :color => nil,
386
+ :link => nil,
387
+ :anchor => nil,
388
+ :font => nil,
389
+ :size => nil,
390
+ :character_spacing => 2.5 }]
391
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
392
+ end
393
+ it "should handle links" do
394
+ array = [{ :text => "external link",
395
+ :styles => [],
396
+ :color => nil,
397
+ :link => "http://example.com",
398
+ :anchor => nil,
399
+ :font => nil,
400
+ :size => nil,
401
+ :character_spacing => nil }]
402
+ string = "<link href='http://example.com'>external link</link>"
403
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
404
+ end
405
+ it "should handle anchors" do
406
+ array = [{ :text => "internal link",
407
+ :styles => [],
408
+ :color => nil,
409
+ :link => nil,
410
+ :anchor => "ToC",
411
+ :font => nil,
412
+ :size => nil,
413
+ :character_spacing => nil }]
414
+ string = "<link anchor='ToC'>internal link</link>"
415
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
416
+ end
417
+ it "should convert <, >, and & to &lt; &gt;, and &amp;, respectively" do
418
+ array = [{ :text => "hello ",
419
+ :styles => [],
420
+ :color => nil,
421
+ :link => nil,
422
+ :font => nil,
423
+ :size => nil,
424
+ :character_spacing => nil },
425
+ { :text => "<, >, and &",
426
+ :styles => [:bold],
427
+ :color => nil,
428
+ :link => nil,
429
+ :font => nil,
430
+ :size => nil,
431
+ :character_spacing => nil }]
432
+ string = "hello <b>&lt;, &gt;, and &amp;</b>"
433
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
434
+ end
435
+ it "should construct an HTML-esque string from a formatted" +
436
+ " text array" do
437
+ array = [
438
+ { :text => "hello ",
439
+ :styles => [],
440
+ :color => nil,
441
+ :link => nil,
442
+ :font => nil,
443
+ :size => 14,
444
+ :character_spacing => nil },
445
+ { :text => "world",
446
+ :styles => [:bold],
447
+ :color => nil,
448
+ :link => nil,
449
+ :font => nil,
450
+ :size => nil,
451
+ :character_spacing => nil },
452
+ { :text => "\n",
453
+ :styles => [:bold],
454
+ :color => nil,
455
+ :link => nil,
456
+ :font => nil,
457
+ :size => nil,
458
+ :character_spacing => nil },
459
+ { :text => "how ",
460
+ :styles => [:bold],
461
+ :color => nil,
462
+ :link => nil,
463
+ :font => nil,
464
+ :size => nil,
465
+ :character_spacing => nil },
466
+ { :text => "are",
467
+ :styles => [:bold, :italic],
468
+ :color => nil,
469
+ :link => nil,
470
+ :font => nil,
471
+ :size => nil,
472
+ :character_spacing => nil },
473
+ { :text => " you?",
474
+ :styles => [],
475
+ :color => nil,
476
+ :link => nil,
477
+ :font => nil,
478
+ :size => nil,
479
+ :character_spacing => nil }
480
+ ]
481
+ string = "<font size='14'>hello </font><b>world</b><b>\n</b><b>how </b><b><i>are</i></b> you?"
482
+ Prawn::Text::Formatted::Parser.to_string(array).should == string
483
+ end
484
+ end
485
+
486
+ describe "Text::Formatted::Parser#array_paragraphs" do
487
+ it "should group fragments separated by newlines" do
488
+ array = [{ :text => "\nhello\nworld" },
489
+ { :text => "\n\n" },
490
+ { :text => "how" },
491
+ { :text => "are" },
492
+ { :text => "you" }]
493
+ target = [[{ :text => "\n"}],
494
+ [{ :text => "hello" }],
495
+ [{ :text => "world" }],
496
+ [{ :text => "\n"}],
497
+ [{ :text => "how" },
498
+ { :text => "are" },
499
+ { :text => "you" }]]
500
+ Prawn::Text::Formatted::Parser.array_paragraphs(array).should == target
501
+ end
502
+ end