piglop-prawn 0.10.2.1

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 (276) hide show
  1. data/COPYING +340 -0
  2. data/HACKING +49 -0
  3. data/LICENSE +56 -0
  4. data/README +140 -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/example_helper.rb +4 -0
  70. data/examples/general/background.rb +23 -0
  71. data/examples/general/canvas.rb +15 -0
  72. data/examples/general/context_sensitive_headers.rb +37 -0
  73. data/examples/general/float.rb +11 -0
  74. data/examples/general/margin.rb +36 -0
  75. data/examples/general/measurement_units.rb +51 -0
  76. data/examples/general/metadata-info.rb +16 -0
  77. data/examples/general/multi_page_layout.rb +18 -0
  78. data/examples/general/outlines.rb +50 -0
  79. data/examples/general/page_geometry.rb +31 -0
  80. data/examples/general/page_numbering.rb +15 -0
  81. data/examples/general/repeaters.rb +47 -0
  82. data/examples/general/stamp.rb +41 -0
  83. data/examples/general/templates.rb +13 -0
  84. data/examples/graphics/basic_images.rb +23 -0
  85. data/examples/graphics/cmyk.rb +12 -0
  86. data/examples/graphics/curves.rb +11 -0
  87. data/examples/graphics/hexagon.rb +13 -0
  88. data/examples/graphics/image_fit.rb +15 -0
  89. data/examples/graphics/image_flow.rb +37 -0
  90. data/examples/graphics/image_position.rb +17 -0
  91. data/examples/graphics/line.rb +32 -0
  92. data/examples/graphics/png_types.rb +22 -0
  93. data/examples/graphics/polygons.rb +16 -0
  94. data/examples/graphics/remote_images.rb +12 -0
  95. data/examples/graphics/rounded_polygons.rb +19 -0
  96. data/examples/graphics/rounded_rectangle.rb +20 -0
  97. data/examples/graphics/ruport_style_helpers.rb +19 -0
  98. data/examples/graphics/stroke_bounds.rb +20 -0
  99. data/examples/graphics/stroke_cap_and_join.rb +45 -0
  100. data/examples/graphics/stroke_dash.rb +42 -0
  101. data/examples/graphics/transformations.rb +52 -0
  102. data/examples/graphics/transparency.rb +26 -0
  103. data/examples/m17n/chinese_text_wrapping.rb +17 -0
  104. data/examples/m17n/euro.rb +15 -0
  105. data/examples/m17n/sjis.rb +28 -0
  106. data/examples/m17n/utf8.rb +13 -0
  107. data/examples/m17n/win_ansi_charset.rb +54 -0
  108. data/examples/security/hello_foo.rb +8 -0
  109. data/examples/table/bill.rb +53 -0
  110. data/examples/table/cell.rb +12 -0
  111. data/examples/table/checkerboard.rb +22 -0
  112. data/examples/table/header.rb +14 -0
  113. data/examples/table/inline_format_table.rb +12 -0
  114. data/examples/table/multi_page_table.rb +9 -0
  115. data/examples/table/simple_table.rb +24 -0
  116. data/examples/table/subtable.rb +12 -0
  117. data/examples/table/widths.rb +20 -0
  118. data/examples/text/alignment.rb +18 -0
  119. data/examples/text/dfont.rb +48 -0
  120. data/examples/text/family_based_styling.rb +24 -0
  121. data/examples/text/font_calculations.rb +91 -0
  122. data/examples/text/font_size.rb +33 -0
  123. data/examples/text/hyphenation.rb +45 -0
  124. data/examples/text/indent_paragraphs.rb +18 -0
  125. data/examples/text/inline_format.rb +72 -0
  126. data/examples/text/kerning.rb +30 -0
  127. data/examples/text/rotated.rb +98 -0
  128. data/examples/text/shaped_text_box.rb +31 -0
  129. data/examples/text/simple_text.rb +17 -0
  130. data/examples/text/simple_text_ttf.rb +17 -0
  131. data/examples/text/text_box.rb +88 -0
  132. data/examples/text/text_box_returning_excess.rb +51 -0
  133. data/examples/text/text_flow.rb +67 -0
  134. data/lib/prawn/compatibility.rb +51 -0
  135. data/lib/prawn/core/annotations.rb +61 -0
  136. data/lib/prawn/core/byte_string.rb +9 -0
  137. data/lib/prawn/core/destinations.rb +90 -0
  138. data/lib/prawn/core/document_state.rb +84 -0
  139. data/lib/prawn/core/literal_string.rb +16 -0
  140. data/lib/prawn/core/name_tree.rb +165 -0
  141. data/lib/prawn/core/object_store.rb +219 -0
  142. data/lib/prawn/core/page.rb +179 -0
  143. data/lib/prawn/core/pdf_object.rb +83 -0
  144. data/lib/prawn/core/reference.rb +112 -0
  145. data/lib/prawn/core/text/formatted/arranger.rb +260 -0
  146. data/lib/prawn/core/text/formatted/line_wrap.rb +127 -0
  147. data/lib/prawn/core/text/formatted/wrap.rb +113 -0
  148. data/lib/prawn/core/text/line_wrap.rb +198 -0
  149. data/lib/prawn/core/text/wrap.rb +80 -0
  150. data/lib/prawn/core/text.rb +115 -0
  151. data/lib/prawn/core.rb +89 -0
  152. data/lib/prawn/document/bounding_box.rb +425 -0
  153. data/lib/prawn/document/graphics_state.rb +48 -0
  154. data/lib/prawn/document/internals.rb +176 -0
  155. data/lib/prawn/document/page_geometry.rb +136 -0
  156. data/lib/prawn/document/snapshot.rb +87 -0
  157. data/lib/prawn/document.rb +573 -0
  158. data/lib/prawn/encoding.rb +121 -0
  159. data/lib/prawn/errors.rb +94 -0
  160. data/lib/prawn/font/afm.rb +225 -0
  161. data/lib/prawn/font/dfont.rb +42 -0
  162. data/lib/prawn/font/ttf.rb +350 -0
  163. data/lib/prawn/font.rb +342 -0
  164. data/lib/prawn/graphics/cap_style.rb +38 -0
  165. data/lib/prawn/graphics/color.rb +205 -0
  166. data/lib/prawn/graphics/dash.rb +71 -0
  167. data/lib/prawn/graphics/join_style.rb +38 -0
  168. data/lib/prawn/graphics/transformation.rb +156 -0
  169. data/lib/prawn/graphics/transparency.rb +99 -0
  170. data/lib/prawn/graphics.rb +321 -0
  171. data/lib/prawn/images/jpg.rb +46 -0
  172. data/lib/prawn/images/png.rb +226 -0
  173. data/lib/prawn/images.rb +348 -0
  174. data/lib/prawn/measurement_extensions.rb +46 -0
  175. data/lib/prawn/measurements.rb +71 -0
  176. data/lib/prawn/outline.rb +278 -0
  177. data/lib/prawn/repeater.rb +129 -0
  178. data/lib/prawn/security/arcfour.rb +51 -0
  179. data/lib/prawn/security.rb +262 -0
  180. data/lib/prawn/stamp.rb +126 -0
  181. data/lib/prawn/table/accessors.rb +180 -0
  182. data/lib/prawn/table/cell/in_table.rb +27 -0
  183. data/lib/prawn/table/cell/subtable.rb +65 -0
  184. data/lib/prawn/table/cell/text.rb +128 -0
  185. data/lib/prawn/table/cell.rb +330 -0
  186. data/lib/prawn/table.rb +421 -0
  187. data/lib/prawn/text/box.rb +380 -0
  188. data/lib/prawn/text/formatted/box.rb +215 -0
  189. data/lib/prawn/text/formatted/fragment.rb +127 -0
  190. data/lib/prawn/text/formatted/parser.rb +202 -0
  191. data/lib/prawn/text/formatted.rb +4 -0
  192. data/lib/prawn/text.rb +442 -0
  193. data/lib/prawn.rb +25 -0
  194. data/spec/annotations_spec.rb +90 -0
  195. data/spec/bounding_box_spec.rb +190 -0
  196. data/spec/cell_spec.rb +337 -0
  197. data/spec/destinations_spec.rb +15 -0
  198. data/spec/document_spec.rb +461 -0
  199. data/spec/font_spec.rb +314 -0
  200. data/spec/formatted_text_arranger_spec.rb +400 -0
  201. data/spec/formatted_text_box_spec.rb +659 -0
  202. data/spec/formatted_text_fragment_spec.rb +211 -0
  203. data/spec/graphics_spec.rb +446 -0
  204. data/spec/images_spec.rb +96 -0
  205. data/spec/inline_formatted_text_parser_spec.rb +446 -0
  206. data/spec/jpg_spec.rb +25 -0
  207. data/spec/line_wrap_spec.rb +341 -0
  208. data/spec/measurement_units_spec.rb +23 -0
  209. data/spec/name_tree_spec.rb +112 -0
  210. data/spec/object_store_spec.rb +160 -0
  211. data/spec/outline_spec.rb +229 -0
  212. data/spec/pdf_object_spec.rb +127 -0
  213. data/spec/png_spec.rb +237 -0
  214. data/spec/reference_spec.rb +82 -0
  215. data/spec/repeater_spec.rb +96 -0
  216. data/spec/security_spec.rb +120 -0
  217. data/spec/snapshot_spec.rb +138 -0
  218. data/spec/spec_helper.rb +26 -0
  219. data/spec/stamp_spec.rb +108 -0
  220. data/spec/stroke_styles_spec.rb +163 -0
  221. data/spec/table_spec.rb +583 -0
  222. data/spec/template_spec.rb +158 -0
  223. data/spec/text_at_spec.rb +119 -0
  224. data/spec/text_box_spec.rb +675 -0
  225. data/spec/text_spacing_spec.rb +57 -0
  226. data/spec/text_spec.rb +328 -0
  227. data/spec/text_with_inline_formatting_spec.rb +193 -0
  228. data/spec/transparency_spec.rb +75 -0
  229. data/vendor/pdf-inspector/README +18 -0
  230. data/vendor/pdf-inspector/lib/pdf/inspector/extgstate.rb +18 -0
  231. data/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +131 -0
  232. data/vendor/pdf-inspector/lib/pdf/inspector/page.rb +25 -0
  233. data/vendor/pdf-inspector/lib/pdf/inspector/text.rb +46 -0
  234. data/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +19 -0
  235. data/vendor/pdf-inspector/lib/pdf/inspector.rb +26 -0
  236. data/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
  237. data/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
  238. data/vendor/ttfunk/example.rb +45 -0
  239. data/vendor/ttfunk/lib/ttfunk/directory.rb +17 -0
  240. data/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +88 -0
  241. data/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +69 -0
  242. data/vendor/ttfunk/lib/ttfunk/reader.rb +44 -0
  243. data/vendor/ttfunk/lib/ttfunk/resource_file.rb +78 -0
  244. data/vendor/ttfunk/lib/ttfunk/subset/base.rb +141 -0
  245. data/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +50 -0
  246. data/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +48 -0
  247. data/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +63 -0
  248. data/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +55 -0
  249. data/vendor/ttfunk/lib/ttfunk/subset.rb +18 -0
  250. data/vendor/ttfunk/lib/ttfunk/subset_collection.rb +72 -0
  251. data/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +54 -0
  252. data/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +126 -0
  253. data/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +79 -0
  254. data/vendor/ttfunk/lib/ttfunk/table/cmap.rb +34 -0
  255. data/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +81 -0
  256. data/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +37 -0
  257. data/vendor/ttfunk/lib/ttfunk/table/glyf.rb +64 -0
  258. data/vendor/ttfunk/lib/ttfunk/table/head.rb +44 -0
  259. data/vendor/ttfunk/lib/ttfunk/table/hhea.rb +41 -0
  260. data/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +47 -0
  261. data/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +62 -0
  262. data/vendor/ttfunk/lib/ttfunk/table/kern.rb +79 -0
  263. data/vendor/ttfunk/lib/ttfunk/table/loca.rb +43 -0
  264. data/vendor/ttfunk/lib/ttfunk/table/maxp.rb +40 -0
  265. data/vendor/ttfunk/lib/ttfunk/table/name.rb +125 -0
  266. data/vendor/ttfunk/lib/ttfunk/table/os2.rb +78 -0
  267. data/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +43 -0
  268. data/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +35 -0
  269. data/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +23 -0
  270. data/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +17 -0
  271. data/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +17 -0
  272. data/vendor/ttfunk/lib/ttfunk/table/post.rb +91 -0
  273. data/vendor/ttfunk/lib/ttfunk/table/simple.rb +14 -0
  274. data/vendor/ttfunk/lib/ttfunk/table.rb +46 -0
  275. data/vendor/ttfunk/lib/ttfunk.rb +102 -0
  276. metadata +364 -0
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+
3
+ # text/formatted/fragment.rb : Implements information about a formatted fragment
4
+ #
5
+ # Copyright March 2010, Daniel Nelson. All Rights Reserved.
6
+ #
7
+ # This is free software. Please see the LICENSE and COPYING files for details.
8
+
9
+ module Prawn
10
+ module Text
11
+ module Formatted
12
+ class Fragment
13
+
14
+ attr_reader :text, :format_state
15
+ attr_writer :width
16
+ attr_accessor :line_height, :descender, :ascender
17
+ attr_accessor :word_spacing, :left, :baseline
18
+
19
+ def initialize(text, format_state, document)
20
+ @text = text
21
+ @format_state = format_state
22
+ @document = document
23
+ @word_spacing = 0
24
+ end
25
+
26
+ def width
27
+ if @word_spacing == 0 then @width
28
+ else @width + @word_spacing * @text.count(" ")
29
+ end
30
+ end
31
+
32
+ def subscript?
33
+ styles.include?(:subscript)
34
+ end
35
+
36
+ def superscript?
37
+ styles.include?(:superscript)
38
+ end
39
+
40
+ def y_offset
41
+ if subscript? then -descender
42
+ elsif superscript? then 0.85 * ascender
43
+ else 0
44
+ end
45
+ end
46
+
47
+ def bounding_box
48
+ [left, baseline - descender, left + width, baseline + ascender]
49
+ end
50
+
51
+ def absolute_bounding_box
52
+ box = bounding_box
53
+ box[0] += @document.bounds.absolute_left
54
+ box[2] += @document.bounds.absolute_left
55
+ box[1] += @document.bounds.absolute_bottom
56
+ box[3] += @document.bounds.absolute_bottom
57
+ box
58
+ end
59
+
60
+ def underline_points
61
+ box = bounding_box
62
+ y = baseline - 1.25
63
+ [[box[0], y], [box[2], y]]
64
+ end
65
+
66
+ def strikethrough_points
67
+ box = bounding_box
68
+ y = baseline + ascender * 0.3
69
+ [[box[0], y], [box[2], y]]
70
+ end
71
+
72
+ def styles
73
+ @format_state[:styles] || []
74
+ end
75
+
76
+ def link
77
+ @format_state[:link]
78
+ end
79
+
80
+ def anchor
81
+ @format_state[:anchor]
82
+ end
83
+
84
+ def color
85
+ @format_state[:color]
86
+ end
87
+
88
+ def font
89
+ @format_state[:font]
90
+ end
91
+
92
+ def size
93
+ @format_state[:size]
94
+ end
95
+
96
+ def callback_object
97
+ callback[:object]
98
+ end
99
+
100
+ def callback_method
101
+ callback[:method]
102
+ end
103
+
104
+ def callback_arguments
105
+ callback[:arguments]
106
+ end
107
+
108
+ def finished
109
+ if callback_object && callback_method
110
+ if callback_arguments
111
+ callback_object.send(callback_method, self, *callback_arguments)
112
+ else
113
+ callback_object.send(callback_method, self)
114
+ end
115
+ end
116
+ end
117
+
118
+ private
119
+
120
+ def callback
121
+ @format_state[:callback] || {}
122
+ end
123
+
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,202 @@
1
+ # encoding: utf-8
2
+
3
+ # text/formatted/parser.rb : Implements a bi-directional parser between a subset
4
+ # of html and formatted text arrays
5
+ #
6
+ # Copyright February 2010, Daniel Nelson. All Rights Reserved.
7
+ #
8
+ # This is free software. Please see the LICENSE and COPYING files for details.
9
+ #
10
+
11
+ module Prawn
12
+ module Text
13
+ module Formatted
14
+
15
+ class Parser
16
+
17
+ def self.to_array(string)
18
+ regex_string = "\n|" +
19
+ "<b>|</b>|" +
20
+ "<i>|</i>|" +
21
+ "<u>|</u>|" +
22
+ "<strikethrough>|</strikethrough>|" +
23
+ "<sub>|</sub>|" +
24
+ "<sup>|</sup>|" +
25
+ "<link[^>]*>|</link>|" +
26
+ "<color[^>]*>|</color>|" +
27
+ "<font[^>]*>|</font>|" +
28
+ "<strong>|</strong>|" +
29
+ "<em>|</em>|" +
30
+ "<a[^>]*>|</a>|" +
31
+ "[^<\n]+"
32
+ regex = Regexp.new(regex_string, Regexp::MULTILINE)
33
+ tokens = string.scan(regex)
34
+ self.array_from_tokens(tokens)
35
+ end
36
+
37
+ def self.to_string(array)
38
+ prefixes = { :bold => "<b>",
39
+ :italic => "<i>",
40
+ :underline => "<u>",
41
+ :strikethrough => "<strikethrough>",
42
+ :subscript => "<sub>",
43
+ :superscript => "<sup>" }
44
+ suffixes = { :bold => "</b>",
45
+ :italic => "</i>",
46
+ :underline => "</u>",
47
+ :strikethrough => "</strikethrough>",
48
+ :subscript => "</sub>",
49
+ :superscript => "</sup>" }
50
+ array.collect do |hash|
51
+ prefix = ""
52
+ suffix = ""
53
+ if hash[:styles]
54
+ hash[:styles].each do |style|
55
+ prefix = prefix + prefixes[style]
56
+ suffix = suffixes[style] + suffix
57
+ end
58
+ end
59
+
60
+ font = hash[:font] ? " name='#{hash[:font]}'" : nil
61
+ size = hash[:size] ? " size='#{hash[:size]}'" : nil
62
+ if font || size
63
+ prefix = prefix + "<font#{font}#{size}>"
64
+ suffix = "</font>"
65
+ end
66
+
67
+ link = hash[:link] ? " href='#{hash[:link]}'" : nil
68
+ anchor = hash[:anchor] ? " anchor='#{hash[:anchor]}'" : nil
69
+ if link || anchor
70
+ prefix = prefix + "<link#{link}#{anchor}>"
71
+ suffix = "</link>"
72
+ end
73
+
74
+ if hash[:color]
75
+ if hash[:color].kind_of?(Array)
76
+ prefix = prefix + "<color c='#{hash[:color][0]}'" +
77
+ " m='#{hash[:color][1]}'" +
78
+ " y='#{hash[:color][2]}'" +
79
+ " k='#{hash[:color][3]}'>"
80
+ else
81
+ prefix = prefix + "<color rgb='#{hash[:color]}'>"
82
+ end
83
+ suffix = "</color>"
84
+ end
85
+
86
+ string = hash[:text].gsub("&", "&amp;").gsub(">", "&gt;").gsub("<", "&lt;")
87
+ prefix + string + suffix
88
+ end.join("")
89
+ end
90
+
91
+ def self.array_paragraphs(array) #:nodoc:
92
+ paragraphs = []
93
+ paragraph = []
94
+ previous_string = "\n"
95
+ scan_pattern = /[^\n]+|\n/
96
+ array.each do |hash|
97
+ hash[:text].scan(scan_pattern).each do |string|
98
+ if string == "\n"
99
+ paragraph << hash.dup.merge(:text => "\n") if previous_string == "\n"
100
+ paragraphs << paragraph unless paragraph.empty?
101
+ paragraph = []
102
+ else
103
+ paragraph << hash.dup.merge(:text => string)
104
+ end
105
+ previous_string = string
106
+ end
107
+ end
108
+ paragraphs << paragraph unless paragraph.empty?
109
+ end
110
+
111
+ private
112
+
113
+ def self.array_from_tokens(tokens)
114
+ array = []
115
+ styles = []
116
+ colors = []
117
+ link = nil
118
+ anchor = nil
119
+ fonts = []
120
+ sizes = []
121
+
122
+ while token = tokens.shift
123
+ case token
124
+ when "<b>", "<strong>"
125
+ styles << :bold
126
+ when "<i>", "<em>"
127
+ styles << :italic
128
+ when "<u>"
129
+ styles << :underline
130
+ when "<strikethrough>"
131
+ styles << :strikethrough
132
+ when "<sub>"
133
+ styles << :subscript
134
+ when "<sup>"
135
+ styles << :superscript
136
+ when "</b>", "</strong>"
137
+ styles.delete(:bold)
138
+ when "</i>", "</em>"
139
+ styles.delete(:italic)
140
+ when "</u>"
141
+ styles.delete(:underline)
142
+ when "</strikethrough>"
143
+ styles.delete(:strikethrough)
144
+ when "</sub>"
145
+ styles.delete(:subscript)
146
+ when "</sup>"
147
+ styles.delete(:superscript)
148
+ when "</link>", "</a>"
149
+ link = nil
150
+ anchor = nil
151
+ when "</color>"
152
+ colors.pop
153
+ when "</font>"
154
+ fonts.pop
155
+ sizes.pop
156
+ else
157
+ if token =~ /^<link[^>]*>$/ or token =~ /^<a[^>]*>$/
158
+ matches = /href="([^"]*)"/.match(token) || /href='([^']*)'/.match(token)
159
+ link = matches[1] unless matches.nil?
160
+
161
+ matches = /anchor="([^"]*)"/.match(token) || /anchor='([^']*)'/.match(token)
162
+ anchor = matches[1] unless matches.nil?
163
+ elsif token =~ /^<color[^>]*>$/
164
+ matches = /rgb="#?([^"]*)"/.match(token) || /rgb='#?([^']*)'/.match(token)
165
+ colors << matches[1] if matches
166
+
167
+ matches = /c="#?([^"]*)" +m="#?([^"]*)" +y="#?([^"]*)" +k="#?([^"]*)"/.match(token) ||
168
+ /c='#?([^']*)' +m='#?([^']*)' +y='#?([^']*)' +k='#?([^']*)'/.match(token)
169
+ colors << [matches[1].to_i, matches[2].to_i, matches[3].to_i, matches[4].to_i] if matches
170
+
171
+ # intend to support rgb="#ffffff" or rgb='#ffffff',
172
+ # r="255" g="255" b="255" or r='255' g='255' b='255',
173
+ # and c="100" m="100" y="100" k="100" or
174
+ # c='100' m='100' y='100' k='100'
175
+ # color = { :rgb => "#ffffff" }
176
+ # color = { :r => 255, :g => 255, :b => 255 }
177
+ # color = { :c => 100, :m => 100, :y => 100, :k => 100 }
178
+ elsif token =~ /^<font[^>]*>$/
179
+ matches = /name="([^"]*)"/.match(token) || /name='([^']*)'/.match(token)
180
+ fonts << matches[1] unless matches.nil?
181
+
182
+ matches = /size="(\d+)"/.match(token) || /size='(\d+)'/.match(token)
183
+ sizes << matches[1].to_i unless matches.nil?
184
+ else
185
+ string = token.gsub("&lt;", "<").gsub("&gt;", ">").gsub("&amp;", "&")
186
+ array << { :text => string,
187
+ :styles => styles.dup,
188
+ :color => colors.last,
189
+ :link => link,
190
+ :anchor => anchor,
191
+ :font => fonts.last,
192
+ :size => sizes.last }
193
+ end
194
+ end
195
+ end
196
+ array
197
+ end
198
+
199
+ end
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,4 @@
1
+ require "prawn/core/text/formatted/wrap"
2
+ require "prawn/text/formatted/box"
3
+ require "prawn/text/formatted/parser"
4
+ require "prawn/text/formatted/fragment"