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,25 @@
1
+ # encoding: utf-8
2
+
3
+ # Spec'ing the PNG class. Not complete yet - still needs to check the
4
+ # contents of palette and transparency to ensure they're correct.
5
+ # Need to find files that have these sections first.
6
+
7
+ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
8
+
9
+ describe "When reading a JPEG file" do
10
+
11
+ before(:each) do
12
+ @filename = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
13
+ @img_data = File.open(@filename, "rb") { |f| f.read }
14
+ end
15
+
16
+ it "should read the basic attributes correctly" do
17
+ jpg = Prawn::Images::JPG.new(@img_data)
18
+
19
+ jpg.width.should == 604
20
+ jpg.height.should == 453
21
+ jpg.bits.should == 8
22
+ jpg.channels.should == 3
23
+ end
24
+ end
25
+
@@ -0,0 +1,341 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
+
5
+ describe "Core::Text::LineWrap#wrap_line" do
6
+ before(:each) do
7
+ create_pdf
8
+ @line_wrap = Prawn::Core::Text::LineWrap.new
9
+ end
10
+ it "should strip preceding and trailing spaces" do
11
+ string = @line_wrap.wrap_line(" hello world ",
12
+ :width => 300,
13
+ :document => @pdf)
14
+ string.should == "hello world"
15
+ end
16
+
17
+ it "should raise CannotFit if a too-small width is given" do
18
+ lambda do
19
+ @line_wrap.wrap_line(" hello world ",
20
+ :width => 1,
21
+ :document => @pdf)
22
+ end.should.raise(Prawn::Errors::CannotFit)
23
+ end
24
+ end
25
+
26
+ describe "Core::Text::LineWrap#wrap_line" do
27
+ before(:each) do
28
+ create_pdf
29
+ @line_wrap = Prawn::Core::Text::LineWrap.new
30
+ @one_word_width = 50
31
+ end
32
+ it "should break on space" do
33
+ normalized_string = @pdf.font.normalize_encoding("hello world")
34
+ string = @line_wrap.wrap_line(normalized_string,
35
+ :width => @one_word_width,
36
+ :document => @pdf)
37
+ string.should == "hello"
38
+ end
39
+
40
+ it "should break on tab" do
41
+ normalized_string = @pdf.font.normalize_encoding("hello\tworld")
42
+ string = @line_wrap.wrap_line(normalized_string,
43
+ :width => @one_word_width,
44
+ :document => @pdf)
45
+ string.should == "hello"
46
+ end
47
+
48
+ it "should break on hyphens" do
49
+ normalized_string = @pdf.font.normalize_encoding("hello-world")
50
+ string = @line_wrap.wrap_line(normalized_string,
51
+ :width => @one_word_width,
52
+ :document => @pdf)
53
+ string.should == "hello-"
54
+ end
55
+
56
+ it "should not break after a hyphen that follows white space and" +
57
+ "precedes a word" do
58
+ normalized_string = @pdf.font.normalize_encoding("hello -")
59
+ string = @line_wrap.wrap_line(normalized_string,
60
+ :width => @one_word_width,
61
+ :document => @pdf)
62
+ string.should == "hello -"
63
+
64
+ normalized_string = @pdf.font.normalize_encoding("hello -world")
65
+ string = @line_wrap.wrap_line(normalized_string,
66
+ :width => @one_word_width,
67
+ :document => @pdf)
68
+ string.should == "hello"
69
+ end
70
+
71
+ it "should break on a soft hyphen" do
72
+ normalized_string = @pdf.font.normalize_encoding("hello­world")
73
+ string = @line_wrap.wrap_line(normalized_string,
74
+ :width => @one_word_width,
75
+ :document => @pdf)
76
+ string.should == @pdf.font.normalize_encoding("hello­")
77
+
78
+
79
+ @pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
80
+ @line_wrap = Prawn::Core::Text::LineWrap.new
81
+
82
+ normalized_string = @pdf.font.normalize_encoding("hello­world")
83
+ string = @line_wrap.wrap_line(normalized_string,
84
+ :width => @one_word_width,
85
+ :document => @pdf)
86
+ string.should == @pdf.font.normalize_encoding("hello­")
87
+ end
88
+
89
+ it "should not display soft hyphens except at the end of a line" do
90
+ normalized_string = @pdf.font.normalize_encoding("hello­world")
91
+ string = @line_wrap.wrap_line(normalized_string,
92
+ :width => 300,
93
+ :document => @pdf)
94
+ string.should == "helloworld"
95
+
96
+
97
+ @pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
98
+ @line_wrap = Prawn::Core::Text::LineWrap.new
99
+
100
+ normalized_string = @pdf.font.normalize_encoding("hello­world")
101
+ string = @line_wrap.wrap_line(normalized_string,
102
+ :width => 300,
103
+ :document => @pdf)
104
+ string.should == "helloworld"
105
+ end
106
+
107
+ it "should not break before a hard hyphen that follows a word" do
108
+ enough_width_for_hello_world = 60
109
+ normalized_string = @pdf.font.normalize_encoding("hello world")
110
+ string = @line_wrap.wrap_line(normalized_string,
111
+ :width => enough_width_for_hello_world,
112
+ :document => @pdf)
113
+ string.should == @pdf.font.normalize_encoding("hello world")
114
+
115
+ normalized_string = @pdf.font.normalize_encoding("hello world-")
116
+ string = @line_wrap.wrap_line(normalized_string,
117
+ :width => enough_width_for_hello_world,
118
+ :document => @pdf)
119
+ string.should == @pdf.font.normalize_encoding("hello")
120
+
121
+ @pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
122
+ @line_wrap = Prawn::Core::Text::LineWrap.new
123
+ enough_width_for_hello_world = 68
124
+
125
+ normalized_string = @pdf.font.normalize_encoding("hello world")
126
+ string = @line_wrap.wrap_line(normalized_string,
127
+ :width => enough_width_for_hello_world,
128
+ :document => @pdf)
129
+ string.should == @pdf.font.normalize_encoding("hello world")
130
+
131
+ normalized_string = @pdf.font.normalize_encoding("hello world-")
132
+ string = @line_wrap.wrap_line(normalized_string,
133
+ :width => enough_width_for_hello_world,
134
+ :document => @pdf)
135
+ string.should == @pdf.font.normalize_encoding("hello")
136
+ end
137
+
138
+ it "should not break after a hard hyphen that follows a soft hyphen and" +
139
+ "precedes a word" do
140
+ normalized_string = @pdf.font.normalize_encoding("hello­-")
141
+ string = @line_wrap.wrap_line(normalized_string,
142
+ :width => @one_word_width,
143
+ :document => @pdf)
144
+ string.should == @pdf.font.normalize_encoding("hello-")
145
+
146
+ normalized_string = @pdf.font.normalize_encoding("hello­-world")
147
+ string = @line_wrap.wrap_line(normalized_string,
148
+ :width => @one_word_width,
149
+ :document => @pdf)
150
+ string.should == @pdf.font.normalize_encoding("hello­")
151
+
152
+ @pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
153
+ @line_wrap = Prawn::Core::Text::LineWrap.new
154
+
155
+ normalized_string = @pdf.font.normalize_encoding("hello­-world")
156
+ string = @line_wrap.wrap_line(normalized_string,
157
+ :width => @one_word_width,
158
+ :document => @pdf)
159
+ string.should == @pdf.font.normalize_encoding("hello­")
160
+ end
161
+ end
162
+
163
+ describe "Core::Text::LineWrap#consumed_char_count" do
164
+ before(:each) do
165
+ create_pdf
166
+ @line_wrap = Prawn::Core::Text::LineWrap.new
167
+ end
168
+ it "should return the total number of characters incorporated into" +
169
+ " or deleted from the last line" do
170
+ string = @line_wrap.wrap_line(" hello world ",
171
+ :width => 300,
172
+ :document => @pdf)
173
+ @line_wrap.consumed_char_count.should == 19
174
+ end
175
+ end
176
+
177
+ describe "Core::Text::LineWrap#width" do
178
+ before(:each) do
179
+ create_pdf
180
+ @line_wrap = Prawn::Core::Text::LineWrap.new
181
+ end
182
+ it "should return the width of the last wrapped line" do
183
+ @line_wrap.wrap_line("hello world" * 10,
184
+ :width => 300,
185
+ :document => @pdf)
186
+ @line_wrap.width.should.be > 0
187
+ @line_wrap.width.should.be <= 300
188
+ end
189
+ end
190
+
191
+ describe "Core::Text::LineWrap#space_count" do
192
+ before(:each) do
193
+ create_pdf
194
+ @line_wrap = Prawn::Core::Text::LineWrap.new
195
+ end
196
+ it "should return the number of spaces in the last wrapped line" do
197
+ @line_wrap.wrap_line("hello world, goobye",
198
+ :width => 300,
199
+ :document => @pdf)
200
+ @line_wrap.space_count.should == 2
201
+ end
202
+ it "should exclude trailing spaces from the count" do
203
+ @line_wrap.wrap_line("hello world, goobye ",
204
+ :width => 300,
205
+ :document => @pdf)
206
+ @line_wrap.space_count.should == 2
207
+ end
208
+ end
209
+
210
+ describe "Core::Text::Formatted::Wrap#line_wrap" do
211
+ before(:each) do
212
+ create_pdf
213
+ @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
214
+ @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
215
+ @one_word_width = 50
216
+ end
217
+ it "should strip preceding and trailing spaces" do
218
+ array = [{ :text => " hello world, " },
219
+ { :text => "goodbye ", :style => [:bold] }]
220
+ @arranger.format_array = array
221
+ string = @line_wrap.wrap_line(:arranger => @arranger,
222
+ :width => 300,
223
+ :document => @pdf)
224
+ string.should == "hello world, goodbye"
225
+ end
226
+ it "should strip trailing spaces when we try but fail to push any of a" +
227
+ " fragment onto the end of a line that currently ends with a space" do
228
+ array = [{ :text => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " },
229
+ { :text => "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", :style => [:bold] }]
230
+ @arranger.format_array = array
231
+ string = @line_wrap.wrap_line(:arranger => @arranger,
232
+ :width => 300,
233
+ :document => @pdf)
234
+ string.should == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
235
+ end
236
+ it "should strip trailing spaces when a white-space-only fragment was" +
237
+ " successfully pushed onto the end of a line but no other non-white" +
238
+ " space fragment fits after it" do
239
+ array = [{ :text => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " },
240
+ { :text => " ", :style => [:bold] },
241
+ { :text => " bbbbbbbbbbbbbbbbbbbbbbbbbbbb" }]
242
+ @arranger.format_array = array
243
+ string = @line_wrap.wrap_line(:arranger => @arranger,
244
+ :width => 300,
245
+ :document => @pdf)
246
+ string.should == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
247
+ end
248
+ it "should raise CannotFit if a too-small width is given" do
249
+ array = [{ :text => " hello world, " },
250
+ { :text => "goodbye ", :style => [:bold] }]
251
+ @arranger.format_array = array
252
+ lambda do
253
+ @line_wrap.wrap_line(:arranger => @arranger,
254
+ :width => 1,
255
+ :document => @pdf)
256
+ end.should.raise(Prawn::Errors::CannotFit)
257
+ end
258
+
259
+ it "should break on space" do
260
+ array = [{ :text => "hello world" }]
261
+ @arranger.format_array = array
262
+ string = @line_wrap.wrap_line(:arranger => @arranger,
263
+ :width => @one_word_width,
264
+ :document => @pdf)
265
+ string.should == "hello"
266
+ end
267
+
268
+ it "should break on tab" do
269
+ array = [{ :text => "hello\tworld" }]
270
+ @arranger.format_array = array
271
+ string = @line_wrap.wrap_line(:arranger => @arranger,
272
+ :width => @one_word_width,
273
+ :document => @pdf)
274
+ string.should == "hello"
275
+ end
276
+
277
+ it "should break on hyphens" do
278
+ array = [{ :text => "hello-world" }]
279
+ @arranger.format_array = array
280
+ string = @line_wrap.wrap_line(:arranger => @arranger,
281
+ :width => @one_word_width,
282
+ :document => @pdf)
283
+ string.should == "hello-"
284
+ end
285
+ end
286
+
287
+ describe "Core::Text::Formatted::Wrap#space_count" do
288
+ before(:each) do
289
+ create_pdf
290
+ @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
291
+ @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
292
+ end
293
+ it "should return the number of spaces in the last wrapped line" do
294
+ array = [{ :text => "hello world, " },
295
+ { :text => "goodbye", :style => [:bold] }]
296
+ @arranger.format_array = array
297
+ @line_wrap.wrap_line(:arranger => @arranger,
298
+ :width => 300,
299
+ :document => @pdf)
300
+ @line_wrap.space_count.should == 2
301
+ end
302
+ it "should exclude preceding and trailing spaces from the count" do
303
+ array = [{ :text => " hello world, " },
304
+ { :text => "goodbye ", :style => [:bold] }]
305
+ @arranger.format_array = array
306
+ @line_wrap.wrap_line(:arranger => @arranger,
307
+ :width => 300,
308
+ :document => @pdf)
309
+ @line_wrap.space_count.should == 2
310
+ end
311
+ end
312
+
313
+ describe "Core::Text::Formatted::Wrap" do
314
+ before(:each) do
315
+ create_pdf
316
+ @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
317
+ array = [{ :text => "hello\nworld\n\n\nhow are you?" },
318
+ { :text => "\n" },
319
+ { :text => "\n" },
320
+ { :text => "" },
321
+ { :text => "fine, thanks. " * 4 },
322
+ { :text => "" },
323
+ { :text => "\n" },
324
+ { :text => "" }]
325
+ @arranger.format_array = array
326
+ @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
327
+ end
328
+ it "should only return an empty string if nothing fit or there" +
329
+ "was nothing to wrap" do
330
+ 8.times do
331
+ line = @line_wrap.wrap_line(:arranger => @arranger,
332
+ :width => 200,
333
+ :document => @pdf)
334
+ line.should.not.be.empty
335
+ end
336
+ line = @line_wrap.wrap_line(:arranger => @arranger,
337
+ :width => 200,
338
+ :document => @pdf)
339
+ line.should.be.empty
340
+ end
341
+ end
@@ -0,0 +1,23 @@
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.close(2.834645669, 0.000000001)
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
+
@@ -0,0 +1,112 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
+
3
+ def tree_dump(tree)
4
+ if tree.is_a?(Prawn::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
+ Prawn::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 = Prawn::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 = Prawn::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 = Prawn::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 = Prawn::Core::NameTree::Node.new(@pdf, 3)
50
+ tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
51
+ @pdf.object_store.length.should.equal ref_count+2
52
+ end
53
+
54
+ it "should create a one new reference when subtree is split" do
55
+ node = Prawn::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.equal ref_count+1
62
+ end
63
+
64
+ it "should keep tree balanced when subtree split cascades to root" do
65
+ node = Prawn::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 = Prawn::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 = Prawn::Core::NameTree::Node.new(@pdf, 3)
80
+ tree_add(node, ["one", 1], ["two", 2], ["three", 3])
81
+ node.to_hash.should.equal(
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 = Prawn::Core::NameTree::Node.new(@pdf, 3)
88
+ tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
89
+ node.to_hash.should.equal({ :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 = Prawn::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.equal(
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 = Prawn::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.equal(
108
+ { :Limits => %w(eight one),
109
+ :Kids => node.children.first.children.map { |child| child.ref } }
110
+ )
111
+ end
112
+ end