rio 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (248) hide show
  1. data/ChangeLog +49 -0
  2. data/VERSION +1 -1
  3. data/doc/ANNOUNCE +19 -2
  4. data/doc/RELEASE_NOTES +17 -0
  5. data/ex/colx.rb +3 -1
  6. data/ex/passwd_report.rb +12 -0
  7. data/lib/rio.rb +8 -9
  8. data/lib/rio/argv.rb +0 -4
  9. data/lib/rio/base.rb +3 -1
  10. data/lib/rio/doc/INTRO.rb +74 -1
  11. data/lib/rio/ext/csv.rb +34 -5
  12. data/lib/rio/factory.rb +2 -2
  13. data/lib/rio/if.rb +3 -0
  14. data/lib/rio/if/csv.rb +76 -0
  15. data/lib/rio/if/dir.rb +14 -6
  16. data/lib/rio/if/fileordir.rb +6 -0
  17. data/lib/rio/if/grande.rb +28 -0
  18. data/lib/rio/if/internal.rb +75 -2
  19. data/lib/rio/if/methods.rb +4 -3
  20. data/lib/rio/if/string.rb +46 -0
  21. data/lib/rio/if/temp.rb +46 -0
  22. data/lib/rio/matchcolumns.rb +266 -0
  23. data/lib/rio/rangemath.rb +44 -0
  24. data/lib/rio/scheme/temp.rb +4 -1
  25. data/lib/rio/version.rb +1 -1
  26. data/test/tc/all.rb +4 -1
  27. data/test/tc/copy-from.rb +1 -1
  28. data/test/tc/csv2.rb +135 -0
  29. data/test/tc/csv_columns.rb +37 -0
  30. data/test/tc/csvutil.rb +56 -0
  31. data/test/tc/ext.rb +1 -1
  32. data/test/tc/methods.rb +1 -1
  33. data/test/tc/tempfile.rb +17 -0
  34. metadata +11 -228
  35. data/doc/rdoc/classes/Kernel.html +0 -181
  36. data/doc/rdoc/classes/Kernel.src/M000182.html +0 -18
  37. data/doc/rdoc/classes/RIO.html +0 -543
  38. data/doc/rdoc/classes/RIO.src/M000001.html +0 -18
  39. data/doc/rdoc/classes/RIO.src/M000002.html +0 -18
  40. data/doc/rdoc/classes/RIO.src/M000003.html +0 -18
  41. data/doc/rdoc/classes/RIO/Doc.html +0 -138
  42. data/doc/rdoc/classes/RIO/Doc/HOWTO.html +0 -1035
  43. data/doc/rdoc/classes/RIO/Doc/INTRO.html +0 -1335
  44. data/doc/rdoc/classes/RIO/Doc/MISC.html +0 -443
  45. data/doc/rdoc/classes/RIO/Doc/SYNOPSIS.html +0 -355
  46. data/doc/rdoc/classes/RIO/Rio.html +0 -6358
  47. data/doc/rdoc/classes/RIO/Rio.src/M000004.html +0 -18
  48. data/doc/rdoc/classes/RIO/Rio.src/M000005.html +0 -20
  49. data/doc/rdoc/classes/RIO/Rio.src/M000006.html +0 -27
  50. data/doc/rdoc/classes/RIO/Rio.src/M000007.html +0 -27
  51. data/doc/rdoc/classes/RIO/Rio.src/M000008.html +0 -16
  52. data/doc/rdoc/classes/RIO/Rio.src/M000009.html +0 -18
  53. data/doc/rdoc/classes/RIO/Rio.src/M000010.html +0 -20
  54. data/doc/rdoc/classes/RIO/Rio.src/M000011.html +0 -16
  55. data/doc/rdoc/classes/RIO/Rio.src/M000012.html +0 -16
  56. data/doc/rdoc/classes/RIO/Rio.src/M000013.html +0 -16
  57. data/doc/rdoc/classes/RIO/Rio.src/M000014.html +0 -16
  58. data/doc/rdoc/classes/RIO/Rio.src/M000015.html +0 -16
  59. data/doc/rdoc/classes/RIO/Rio.src/M000016.html +0 -16
  60. data/doc/rdoc/classes/RIO/Rio.src/M000017.html +0 -16
  61. data/doc/rdoc/classes/RIO/Rio.src/M000018.html +0 -16
  62. data/doc/rdoc/classes/RIO/Rio.src/M000019.html +0 -16
  63. data/doc/rdoc/classes/RIO/Rio.src/M000020.html +0 -16
  64. data/doc/rdoc/classes/RIO/Rio.src/M000021.html +0 -16
  65. data/doc/rdoc/classes/RIO/Rio.src/M000022.html +0 -16
  66. data/doc/rdoc/classes/RIO/Rio.src/M000023.html +0 -16
  67. data/doc/rdoc/classes/RIO/Rio.src/M000024.html +0 -16
  68. data/doc/rdoc/classes/RIO/Rio.src/M000025.html +0 -16
  69. data/doc/rdoc/classes/RIO/Rio.src/M000026.html +0 -16
  70. data/doc/rdoc/classes/RIO/Rio.src/M000027.html +0 -16
  71. data/doc/rdoc/classes/RIO/Rio.src/M000028.html +0 -16
  72. data/doc/rdoc/classes/RIO/Rio.src/M000029.html +0 -16
  73. data/doc/rdoc/classes/RIO/Rio.src/M000030.html +0 -16
  74. data/doc/rdoc/classes/RIO/Rio.src/M000031.html +0 -16
  75. data/doc/rdoc/classes/RIO/Rio.src/M000032.html +0 -16
  76. data/doc/rdoc/classes/RIO/Rio.src/M000033.html +0 -16
  77. data/doc/rdoc/classes/RIO/Rio.src/M000034.html +0 -16
  78. data/doc/rdoc/classes/RIO/Rio.src/M000035.html +0 -16
  79. data/doc/rdoc/classes/RIO/Rio.src/M000036.html +0 -16
  80. data/doc/rdoc/classes/RIO/Rio.src/M000037.html +0 -16
  81. data/doc/rdoc/classes/RIO/Rio.src/M000038.html +0 -16
  82. data/doc/rdoc/classes/RIO/Rio.src/M000039.html +0 -16
  83. data/doc/rdoc/classes/RIO/Rio.src/M000040.html +0 -16
  84. data/doc/rdoc/classes/RIO/Rio.src/M000041.html +0 -16
  85. data/doc/rdoc/classes/RIO/Rio.src/M000042.html +0 -16
  86. data/doc/rdoc/classes/RIO/Rio.src/M000043.html +0 -16
  87. data/doc/rdoc/classes/RIO/Rio.src/M000044.html +0 -16
  88. data/doc/rdoc/classes/RIO/Rio.src/M000045.html +0 -16
  89. data/doc/rdoc/classes/RIO/Rio.src/M000046.html +0 -16
  90. data/doc/rdoc/classes/RIO/Rio.src/M000047.html +0 -16
  91. data/doc/rdoc/classes/RIO/Rio.src/M000048.html +0 -16
  92. data/doc/rdoc/classes/RIO/Rio.src/M000049.html +0 -16
  93. data/doc/rdoc/classes/RIO/Rio.src/M000050.html +0 -16
  94. data/doc/rdoc/classes/RIO/Rio.src/M000051.html +0 -16
  95. data/doc/rdoc/classes/RIO/Rio.src/M000052.html +0 -16
  96. data/doc/rdoc/classes/RIO/Rio.src/M000053.html +0 -16
  97. data/doc/rdoc/classes/RIO/Rio.src/M000054.html +0 -16
  98. data/doc/rdoc/classes/RIO/Rio.src/M000055.html +0 -16
  99. data/doc/rdoc/classes/RIO/Rio.src/M000056.html +0 -16
  100. data/doc/rdoc/classes/RIO/Rio.src/M000057.html +0 -16
  101. data/doc/rdoc/classes/RIO/Rio.src/M000058.html +0 -16
  102. data/doc/rdoc/classes/RIO/Rio.src/M000059.html +0 -16
  103. data/doc/rdoc/classes/RIO/Rio.src/M000060.html +0 -16
  104. data/doc/rdoc/classes/RIO/Rio.src/M000061.html +0 -16
  105. data/doc/rdoc/classes/RIO/Rio.src/M000062.html +0 -16
  106. data/doc/rdoc/classes/RIO/Rio.src/M000063.html +0 -16
  107. data/doc/rdoc/classes/RIO/Rio.src/M000064.html +0 -16
  108. data/doc/rdoc/classes/RIO/Rio.src/M000065.html +0 -16
  109. data/doc/rdoc/classes/RIO/Rio.src/M000066.html +0 -16
  110. data/doc/rdoc/classes/RIO/Rio.src/M000067.html +0 -16
  111. data/doc/rdoc/classes/RIO/Rio.src/M000068.html +0 -16
  112. data/doc/rdoc/classes/RIO/Rio.src/M000069.html +0 -16
  113. data/doc/rdoc/classes/RIO/Rio.src/M000070.html +0 -16
  114. data/doc/rdoc/classes/RIO/Rio.src/M000071.html +0 -16
  115. data/doc/rdoc/classes/RIO/Rio.src/M000072.html +0 -16
  116. data/doc/rdoc/classes/RIO/Rio.src/M000073.html +0 -16
  117. data/doc/rdoc/classes/RIO/Rio.src/M000074.html +0 -16
  118. data/doc/rdoc/classes/RIO/Rio.src/M000075.html +0 -16
  119. data/doc/rdoc/classes/RIO/Rio.src/M000076.html +0 -16
  120. data/doc/rdoc/classes/RIO/Rio.src/M000077.html +0 -16
  121. data/doc/rdoc/classes/RIO/Rio.src/M000078.html +0 -16
  122. data/doc/rdoc/classes/RIO/Rio.src/M000079.html +0 -16
  123. data/doc/rdoc/classes/RIO/Rio.src/M000080.html +0 -16
  124. data/doc/rdoc/classes/RIO/Rio.src/M000081.html +0 -16
  125. data/doc/rdoc/classes/RIO/Rio.src/M000082.html +0 -16
  126. data/doc/rdoc/classes/RIO/Rio.src/M000083.html +0 -16
  127. data/doc/rdoc/classes/RIO/Rio.src/M000084.html +0 -16
  128. data/doc/rdoc/classes/RIO/Rio.src/M000085.html +0 -16
  129. data/doc/rdoc/classes/RIO/Rio.src/M000086.html +0 -16
  130. data/doc/rdoc/classes/RIO/Rio.src/M000087.html +0 -16
  131. data/doc/rdoc/classes/RIO/Rio.src/M000088.html +0 -16
  132. data/doc/rdoc/classes/RIO/Rio.src/M000089.html +0 -16
  133. data/doc/rdoc/classes/RIO/Rio.src/M000090.html +0 -16
  134. data/doc/rdoc/classes/RIO/Rio.src/M000091.html +0 -16
  135. data/doc/rdoc/classes/RIO/Rio.src/M000092.html +0 -16
  136. data/doc/rdoc/classes/RIO/Rio.src/M000093.html +0 -16
  137. data/doc/rdoc/classes/RIO/Rio.src/M000094.html +0 -16
  138. data/doc/rdoc/classes/RIO/Rio.src/M000095.html +0 -16
  139. data/doc/rdoc/classes/RIO/Rio.src/M000096.html +0 -16
  140. data/doc/rdoc/classes/RIO/Rio.src/M000097.html +0 -16
  141. data/doc/rdoc/classes/RIO/Rio.src/M000098.html +0 -16
  142. data/doc/rdoc/classes/RIO/Rio.src/M000099.html +0 -16
  143. data/doc/rdoc/classes/RIO/Rio.src/M000100.html +0 -16
  144. data/doc/rdoc/classes/RIO/Rio.src/M000101.html +0 -16
  145. data/doc/rdoc/classes/RIO/Rio.src/M000102.html +0 -16
  146. data/doc/rdoc/classes/RIO/Rio.src/M000103.html +0 -16
  147. data/doc/rdoc/classes/RIO/Rio.src/M000104.html +0 -16
  148. data/doc/rdoc/classes/RIO/Rio.src/M000105.html +0 -16
  149. data/doc/rdoc/classes/RIO/Rio.src/M000106.html +0 -16
  150. data/doc/rdoc/classes/RIO/Rio.src/M000107.html +0 -16
  151. data/doc/rdoc/classes/RIO/Rio.src/M000108.html +0 -16
  152. data/doc/rdoc/classes/RIO/Rio.src/M000109.html +0 -16
  153. data/doc/rdoc/classes/RIO/Rio.src/M000110.html +0 -16
  154. data/doc/rdoc/classes/RIO/Rio.src/M000111.html +0 -16
  155. data/doc/rdoc/classes/RIO/Rio.src/M000112.html +0 -16
  156. data/doc/rdoc/classes/RIO/Rio.src/M000113.html +0 -16
  157. data/doc/rdoc/classes/RIO/Rio.src/M000114.html +0 -16
  158. data/doc/rdoc/classes/RIO/Rio.src/M000115.html +0 -16
  159. data/doc/rdoc/classes/RIO/Rio.src/M000116.html +0 -16
  160. data/doc/rdoc/classes/RIO/Rio.src/M000117.html +0 -16
  161. data/doc/rdoc/classes/RIO/Rio.src/M000118.html +0 -16
  162. data/doc/rdoc/classes/RIO/Rio.src/M000119.html +0 -16
  163. data/doc/rdoc/classes/RIO/Rio.src/M000120.html +0 -16
  164. data/doc/rdoc/classes/RIO/Rio.src/M000121.html +0 -16
  165. data/doc/rdoc/classes/RIO/Rio.src/M000122.html +0 -16
  166. data/doc/rdoc/classes/RIO/Rio.src/M000123.html +0 -16
  167. data/doc/rdoc/classes/RIO/Rio.src/M000124.html +0 -16
  168. data/doc/rdoc/classes/RIO/Rio.src/M000125.html +0 -16
  169. data/doc/rdoc/classes/RIO/Rio.src/M000126.html +0 -16
  170. data/doc/rdoc/classes/RIO/Rio.src/M000127.html +0 -16
  171. data/doc/rdoc/classes/RIO/Rio.src/M000128.html +0 -16
  172. data/doc/rdoc/classes/RIO/Rio.src/M000129.html +0 -16
  173. data/doc/rdoc/classes/RIO/Rio.src/M000130.html +0 -16
  174. data/doc/rdoc/classes/RIO/Rio.src/M000131.html +0 -16
  175. data/doc/rdoc/classes/RIO/Rio.src/M000132.html +0 -16
  176. data/doc/rdoc/classes/RIO/Rio.src/M000133.html +0 -16
  177. data/doc/rdoc/classes/RIO/Rio.src/M000134.html +0 -16
  178. data/doc/rdoc/classes/RIO/Rio.src/M000135.html +0 -16
  179. data/doc/rdoc/classes/RIO/Rio.src/M000136.html +0 -16
  180. data/doc/rdoc/classes/RIO/Rio.src/M000137.html +0 -16
  181. data/doc/rdoc/classes/RIO/Rio.src/M000138.html +0 -16
  182. data/doc/rdoc/classes/RIO/Rio.src/M000139.html +0 -16
  183. data/doc/rdoc/classes/RIO/Rio.src/M000140.html +0 -16
  184. data/doc/rdoc/classes/RIO/Rio.src/M000141.html +0 -16
  185. data/doc/rdoc/classes/RIO/Rio.src/M000142.html +0 -16
  186. data/doc/rdoc/classes/RIO/Rio.src/M000143.html +0 -16
  187. data/doc/rdoc/classes/RIO/Rio.src/M000144.html +0 -16
  188. data/doc/rdoc/classes/RIO/Rio.src/M000145.html +0 -16
  189. data/doc/rdoc/classes/RIO/Rio.src/M000146.html +0 -16
  190. data/doc/rdoc/classes/RIO/Rio.src/M000147.html +0 -16
  191. data/doc/rdoc/classes/RIO/Rio.src/M000148.html +0 -16
  192. data/doc/rdoc/classes/RIO/Rio.src/M000149.html +0 -16
  193. data/doc/rdoc/classes/RIO/Rio.src/M000150.html +0 -16
  194. data/doc/rdoc/classes/RIO/Rio.src/M000151.html +0 -16
  195. data/doc/rdoc/classes/RIO/Rio.src/M000152.html +0 -16
  196. data/doc/rdoc/classes/RIO/Rio.src/M000153.html +0 -16
  197. data/doc/rdoc/classes/RIO/Rio.src/M000154.html +0 -16
  198. data/doc/rdoc/classes/RIO/Rio.src/M000155.html +0 -16
  199. data/doc/rdoc/classes/RIO/Rio.src/M000156.html +0 -16
  200. data/doc/rdoc/classes/RIO/Rio.src/M000157.html +0 -16
  201. data/doc/rdoc/classes/RIO/Rio.src/M000158.html +0 -16
  202. data/doc/rdoc/classes/RIO/Rio.src/M000159.html +0 -16
  203. data/doc/rdoc/classes/RIO/Rio.src/M000160.html +0 -16
  204. data/doc/rdoc/classes/RIO/Rio.src/M000161.html +0 -16
  205. data/doc/rdoc/classes/RIO/Rio.src/M000162.html +0 -16
  206. data/doc/rdoc/classes/RIO/Rio.src/M000163.html +0 -16
  207. data/doc/rdoc/classes/RIO/Rio.src/M000164.html +0 -16
  208. data/doc/rdoc/classes/RIO/Rio.src/M000165.html +0 -16
  209. data/doc/rdoc/classes/RIO/Rio.src/M000166.html +0 -16
  210. data/doc/rdoc/classes/RIO/Rio.src/M000167.html +0 -16
  211. data/doc/rdoc/classes/RIO/Rio.src/M000168.html +0 -16
  212. data/doc/rdoc/classes/RIO/Rio.src/M000169.html +0 -16
  213. data/doc/rdoc/classes/RIO/Rio.src/M000170.html +0 -16
  214. data/doc/rdoc/classes/RIO/Rio.src/M000171.html +0 -16
  215. data/doc/rdoc/classes/RIO/Rio.src/M000172.html +0 -16
  216. data/doc/rdoc/classes/RIO/Rio.src/M000173.html +0 -16
  217. data/doc/rdoc/classes/RIO/Rio.src/M000174.html +0 -16
  218. data/doc/rdoc/classes/RIO/Rio.src/M000175.html +0 -16
  219. data/doc/rdoc/classes/RIO/Rio.src/M000176.html +0 -16
  220. data/doc/rdoc/classes/RIO/Rio.src/M000177.html +0 -16
  221. data/doc/rdoc/classes/RIO/Rio.src/M000178.html +0 -16
  222. data/doc/rdoc/classes/RIO/Rio.src/M000179.html +0 -16
  223. data/doc/rdoc/classes/RIO/Rio.src/M000180.html +0 -16
  224. data/doc/rdoc/classes/RIO/Rio.src/M000181.html +0 -16
  225. data/doc/rdoc/created.rid +0 -1
  226. data/doc/rdoc/files/README.html +0 -215
  227. data/doc/rdoc/files/lib/rio/constructor_rb.html +0 -142
  228. data/doc/rdoc/files/lib/rio/doc/HOWTO_rb.html +0 -135
  229. data/doc/rdoc/files/lib/rio/doc/INTRO_rb.html +0 -135
  230. data/doc/rdoc/files/lib/rio/doc/MISC_rb.html +0 -135
  231. data/doc/rdoc/files/lib/rio/doc/SYNOPSIS_rb.html +0 -135
  232. data/doc/rdoc/files/lib/rio/if/basic_rb.html +0 -135
  233. data/doc/rdoc/files/lib/rio/if/dir_rb.html +0 -135
  234. data/doc/rdoc/files/lib/rio/if/file_rb.html +0 -135
  235. data/doc/rdoc/files/lib/rio/if/fileordir_rb.html +0 -135
  236. data/doc/rdoc/files/lib/rio/if/grande_rb.html +0 -135
  237. data/doc/rdoc/files/lib/rio/if/internal_rb.html +0 -135
  238. data/doc/rdoc/files/lib/rio/if/methods_rb.html +0 -135
  239. data/doc/rdoc/files/lib/rio/if/path_rb.html +0 -135
  240. data/doc/rdoc/files/lib/rio/if/stream_rb.html +0 -135
  241. data/doc/rdoc/files/lib/rio/if/test_rb.html +0 -135
  242. data/doc/rdoc/files/lib/rio/kernel_rb.html +0 -142
  243. data/doc/rdoc/files/lib/rio_rb.html +0 -153
  244. data/doc/rdoc/fr_class_index.html +0 -34
  245. data/doc/rdoc/fr_file_index.html +0 -44
  246. data/doc/rdoc/fr_method_index.html +0 -209
  247. data/doc/rdoc/index.html +0 -24
  248. data/doc/rdoc/rdoc-style.css +0 -384
@@ -1,443 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>Module: RIO::Doc::MISC</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="classHeader">
50
- <table class="header-table">
51
- <tr class="top-aligned-row">
52
- <td class="class-mod"><strong>Module</strong></td>
53
- <td class="class-name-in-header">RIO::Doc::MISC</td>
54
- <td rowspan="2" class="class-header-space-col"></td>
55
- <td rowspan="2">
56
- <a class="in-url" href="../../../files/lib/rio/doc/MISC_rb.html">
57
- lib/rio/doc/MISC.rb
58
- </a>
59
- &nbsp;&nbsp;
60
- </td>
61
- </tr>
62
-
63
- </table>
64
- </div>
65
- <!-- banner header -->
66
-
67
- <div id="bodyContent">
68
-
69
-
70
-
71
- <div id="contextContent">
72
-
73
- <div id="description">
74
- <p>
75
- The following example are provided without comment
76
- </p>
77
- <pre>
78
- array = rio('afile').readlines
79
-
80
- rio('afile') &gt; rio('acopy')
81
-
82
- ary = rio('afile').chomp.lines[0...10]
83
-
84
- rio('adir').rename.all.files('*.htm') do |file|
85
- file.ext = '.html'
86
- end
87
- </pre>
88
- <p>
89
- A basic familiarity with ruby and shell operations should allow a casual
90
- reader to guess what these examples will do. How they are being performed
91
- may not be what a casual reader might expect. I will explain these example
92
- to illustrate the <a href="../Rio.html">Rio</a> basics.
93
- </p>
94
- <p>
95
- For many more examples please read the <a href="HOWTO.html">HOWTO</a>
96
- document and the rdoc documentation.
97
- </p>
98
- <h2>Example 1.</h2>
99
- <pre>
100
- array = rio('afile').readlines
101
- </pre>
102
- <p>
103
- This uses IO#readlines to read the lines of &#8216;afile&#8217; into an
104
- array.
105
- </p>
106
- <h3>Creating a <a href="../Rio.html">Rio</a></h3>
107
- <p>
108
- <a href="../Rio.html">Rio</a> extends the module <a
109
- href="../../Kernel.html">Kernel</a> by adding one function <em>rio</em>,
110
- which acts as a constructor returning a <a href="../Rio.html">Rio</a>. This
111
- constructor builds a description of the resource the <a
112
- href="../Rio.html">Rio</a> will access (usually a path). It does not open
113
- the resource, check for its existance, or do anything except remember its
114
- specifcation. <em>rio</em> returns the <a href="../Rio.html">Rio</a> which
115
- can be chained to a <a href="../Rio.html">Rio</a> method as in this example
116
- or stored in a variable. This coud have been written
117
- </p>
118
- <pre>
119
- ario = rio('afile')
120
- array = ario.readlines
121
-
122
- ario = rio('afile')
123
- </pre>
124
- <p>
125
- In this case the resource specified is a relative path. After the first
126
- line the <a href="../Rio.html">Rio</a> does know or care whether it is a
127
- path to a file nor whether it exists. <a href="../Rio.html">Rio</a>
128
- provides many methods that only deal with a resource at this level, much as
129
- the standard library classes Pathname and URI. It should be noted at this
130
- point that <a href="../Rio.html">Rio</a> paths stored internally as a URL
131
- as specified in RFC 1738 and therefore use slashes as separators. A
132
- resource can also be specified without separators, because <em>rio</em>
133
- interprets multiple arguments as parts of a path to be joined, and an array
134
- as an array of parts to be joined. So the following all specify the same
135
- resource.
136
- </p>
137
- <pre>
138
- rio('adir/afile')
139
- rio('adir','afile')
140
- rio(%w/adir afile/)
141
- </pre>
142
- <p>
143
- The rio constructor can be used to specify non-file-system resources, but
144
- for this example we will restrict our discussion to paths to entities on
145
- file-systems.
146
- </p>
147
- <pre>
148
- array = ario.readlines
149
- </pre>
150
- <p>
151
- Now that we have a <a href="../Rio.html">Rio</a>, we can call one of its
152
- methods; in this case <em>readlines</em>. This is an example of using a <a
153
- href="../Rio.html">Rio</a> as a proxy for the builtin IO#readlines. Given
154
- the method <em>readlines</em>, the <a href="../Rio.html">Rio</a> opens
155
- &#8216;afile&#8217; for reading, calls readlines on the resulting IO
156
- object, closes the IO object, and returns the lines read.
157
- </p>
158
- <h2>Example 2</h2>
159
- <pre>
160
- rio('afile') &gt; rio('acopy')
161
- </pre>
162
- <p>
163
- This copies the file &#8216;afile&#8217; into the file &#8216;acopy&#8217;.
164
- </p>
165
- <p>
166
- The first things that happen here are the creation of the Rios. As
167
- described in Example 1, when created a <a href="../Rio.html">Rio</a> simply
168
- remembers the specifcation of its resource. In this case, a relative path
169
- &#8216;afile&#8217; on the left and a relative path &#8216;acopy&#8217; on
170
- the right.
171
- </p>
172
- <p>
173
- Next the <a href="../Rio.html">Rio</a>#&gt; (copy-to) method is called on
174
- the &#8216;afile&#8217; <a href="../Rio.html">Rio</a> with the
175
- &#8216;acopy&#8217; <a href="../Rio.html">Rio</a> as its argument. If that
176
- looks like a greater-than operator to you, think Unix shell, with Rios
177
- &#8217;&gt;&#8217; is the copy-to operator.
178
- </p>
179
- <p>
180
- Upon seeing the copy-to operator, the <a href="../Rio.html">Rio</a> has all
181
- the information it needs to proceed. It determines that it must be opened
182
- for reading, that its argument must be opened for writing, and that
183
- it&#8217;s contents must be copied to the resource referenced by it&#8217;
184
- argument &#8212; and that is what it does. Then it closes itself and its
185
- argument.
186
- </p>
187
- <p>
188
- Consider if we had written this example this way.
189
- </p>
190
- <pre>
191
- afile = rio('afile')
192
- acopy = rio('acopy')
193
- afile &gt; acopy
194
- </pre>
195
- <p>
196
- In this case we would still have variables referencing the Rios, and
197
- perhaps we would like do things a little differently than described above.
198
- Be assured that the selection of mode and automatic closing of files are
199
- the default behaviour and can be changed. Say we wanted &#8216;afile&#8217;
200
- to remain open so that we could rewind it and make a second copy, we might
201
- do something like this:
202
- </p>
203
- <pre>
204
- afile = rio('afile').nocloseoneof
205
- afile &gt; rio('acopy1')
206
- afile.rewind &gt; rio('acopy2')
207
- afile.close
208
- </pre>
209
- <p>
210
- Actually the &#8216;thinking-process&#8217; of the <a
211
- href="../Rio.html">Rio</a> when it sees a copy-to operator is much more
212
- complex that described above. If its argument had been a rio referencing a
213
- directory, it would not have opened itself for reading, but instead used
214
- FileUtils#cp to copy itself; if its argument had been a string, its
215
- contents would have ended up in the string; If its argument had been an
216
- array, its lines would been elements of that array; if its argument had
217
- been a socket, the its contents would have been copied to the socket. See
218
- the documentation for details.
219
- </p>
220
- <h2>Example 3.</h2>
221
- <pre>
222
- array = rio('afile').chomp.lines[0...10]
223
- </pre>
224
- <p>
225
- This fills <tt>array</tt> with the first ten lines of &#8216;afile&#8217;,
226
- with each line chomped
227
- </p>
228
- <p>
229
- The casual observer mentioned above might think that <tt>lines</tt> returns
230
- an array of lines and that this is a simple rewording of <tt>array = <a
231
- href="http://0...10">rio('afile').readlines</a></tt> or even of <tt>array =
232
- <a href="http://0...10">File.new('afile').readlines</a></tt>. They would be
233
- wrong.
234
- </p>
235
- <p>
236
- <tt>chomp</tt> is a configuration method which turns on chomp-mode and
237
- returns the <a href="../Rio.html">Rio</a>. Chomp-mode causes all line
238
- oriented read operations to perform a String#chomp on each line
239
- </p>
240
- <h3>Reading files</h3>
241
- <p>
242
- <a href="../Rio.html">Rio</a> provides four methods to select which part of
243
- the file is read and how the file is divided. They are <tt>lines</tt>,
244
- <tt>records</tt>, <tt>rows</tt> and <tt>bytes</tt>. Briefly, <tt>lines</tt>
245
- specifies that the file should be read line by line and +bytes(n)+
246
- specifies that the file should be read in <em>n</em> byte chunks. All four
247
- take arguments which can be used to filter lines or chunks in or out. For
248
- simple Rios <tt>records</tt> and <tt>rows</tt> only specify the filter
249
- arguments and are provided for use be extensions. For example, the CSV
250
- extension returns an array of the columns in a line when <tt>records</tt>
251
- is used. In the absence of an extension <tt>records</tt> and <tt>rows</tt>
252
- behave like <tt>lines</tt>.
253
- </p>
254
- <p>
255
- First lets rewrite our example as:
256
- </p>
257
- <pre>
258
- array = rio('afile').chomp.lines(0...10).to_a
259
- </pre>
260
- <p>
261
- The arguments to lines specify which records are to be read. Arguments are
262
- interpreted based on their class as follows:
263
- </p>
264
- <ul>
265
- <li>Range - interpreted as a range of record numbers to be read
266
-
267
- </li>
268
- <li>Integer - interpreted as a one-element range
269
-
270
- </li>
271
- <li>RegExp - only matching records are processed
272
-
273
- </li>
274
- <li>Symbol - sent to each record, which is processed unless the result is false
275
- or nil
276
-
277
- </li>
278
- <li>Proc - called for each record, the record is processed unless the return
279
- value is false or nil
280
-
281
- </li>
282
- </ul>
283
- <p>
284
- See the documentation for details and examples.
285
- </p>
286
- <p>
287
- In our example we have specified the Range (0...10). The <tt>lines</tt>
288
- method is just configuring the <a href="../Rio.html">Rio</a>, it does not
289
- trigger any IO operation. The fact that it was called and the arguments it
290
- was called with are stored away and the <a href="../Rio.html">Rio</a> is
291
- returned for further configuration or an actual IO operation. When an IO
292
- operation is called the Range will be used to limit processing to the first
293
- ten records. For example:
294
- </p>
295
- <pre>
296
- rio('afile').lines(0...10).each { |line| ... } # block will be called for the first 10 records
297
- rio('afile').lines(0...10).to_a # the first 10 records will be returned in an array
298
- rio('afile').lines(0...10) &gt; rio('acopy') # the first 10 records will be copied to 'acopy'
299
- </pre>
300
- <p>
301
- &quot;But wait&quot;, you say, &quot;In our original example the range was
302
- an argument to the subscript operator, not to <tt>lines</tt>&quot;. This
303
- works because the subscript operator processes its arguments as if they had
304
- been arguments to the most-recently-called selection method and then calls
305
- <tt>to_a</tt> on the rio. So our rewrite of the example does precisely the
306
- same thing as the original
307
- </p>
308
- <p>
309
- The big difference between the original example and the
310
- casual-observer&#8217;s solution is that hers creates an array of the
311
- entire contents and only returns the first 10 while the original only puts
312
- 10 records into the array.
313
- </p>
314
- <p>
315
- As a sidenote, Rios also have an optimization that can really help in
316
- certain situations. If records are only selected using Ranges, it stops
317
- iterating when it is beyond the point where it could possibly ever match.
318
- This can make a dramatic difference when one is only interested in the
319
- first few lines of very large files.
320
- </p>
321
- <h2>Example 4.</h2>
322
- <pre>
323
- rio('adir').rename.all.files('*.htm') do |file|
324
- file.ext = '.html'
325
- end
326
- </pre>
327
- <p>
328
- This changes the extension of all .htm files below &#8216;adir&#8217; to
329
- &#8217;.html&#8217;
330
- </p>
331
- <p>
332
- First we create the rio as always.
333
- </p>
334
- <p>
335
- Next we process the <tt>rename</tt> method. When used as it is here &#8212;
336
- without arguments &#8212; it just turns on rename-mode and returns the <a
337
- href="../Rio.html">Rio</a>.
338
- </p>
339
- <p>
340
- <tt>all</tt> is another configuration method, which causes directories to
341
- be processed recursively
342
- </p>
343
- <p>
344
- <tt>files</tt> is another configuration method. In example 3 we used
345
- <tt>lines</tt> to select what to process when iterating through a file.
346
- <tt>files</tt> is used to select what to process when iterating through
347
- directories. The arguments to <tt>files</tt> can be the same as those for
348
- <tt>lines</tt> except that Ranges can not be used and globs can.
349
- </p>
350
- <p>
351
- In our example, the argument to <tt>files</tt> is a string which is treated
352
- as a glob. As with <tt>lines</tt>, <tt>files</tt> does not trigger any IO,
353
- it just configures the <a href="../Rio.html">Rio</a>.
354
- </p>
355
- <h3>There&#8217;s no action</h3>
356
- <p>
357
- The previous examples had something that triggered IO: <tt>readlines</tt>,
358
- <tt>to_a</tt>, <tt>each</tt>, <tt>&gt; (copy-to)</tt>. This example does
359
- not. This example illustrates <a href="../Rio.html">Rio</a>&#8217;s
360
- &#8216;implied each&#8217;. All the configuration methods will call each
361
- for you if a block is given. So, because a block follows the files method,
362
- it calls <tt>each</tt> and passes it the block.
363
- </p>
364
- <p>
365
- Let&#8217;s recap. At this point we have a <a href="../Rio.html">Rio</a>
366
- with a resource specified. We have configured with a couple of modes,
367
- &#8216;rename&#8217;, and &#8216;all&#8217;, and we have limited the
368
- elements we want to process to entries that are files and match the glob
369
- &#8217;*.htm&#8217;. <tt>each</tt> causes the <a href="../Rio.html">Rio</a>
370
- to open the directory and call the block for each entry that is both a file
371
- and matches the glob. It was also configured with <tt>all</tt>,so it
372
- descends into subdirectories to find further matches and calles the block
373
- for each of them. The argument passed to the block is a <a
374
- href="../Rio.html">Rio</a> referencing the entry on the file-system.
375
- </p>
376
- <p>
377
- The <em>rename_mode</em> we set has had no effect on our iteration at all,
378
- so why is it there? In general, configuration options that are not
379
- applicable to a <a href="../Rio.html">Rio</a> are silently ignored,
380
- however, for directories some of them are passed on to the Rios for each
381
- entry when iterating. Since <tt>rename</tt> is one such option, The example
382
- could have been written:
383
- </p>
384
- <pre>
385
- rio('adir').all.files('*.htm') do |file|
386
- file.rename.ext = '.html'
387
- end
388
- </pre>
389
- <p>
390
- The rename-with-no-args method affects the behaviour of the <tt>ext=</tt>
391
- option. In this case, setting it for the directory, rather than for each
392
- file in the block seems to make the intent of the code more clear, but that
393
- is a matter of personal taste. See the documentation for more information
394
- on the rename-with-no-args method
395
- </p>
396
- <h2>Suggested Reading</h2>
397
- <ul>
398
- <li><a href="SYNOPSIS.html">RIO::Doc::SYNOPSIS</a>
399
-
400
- </li>
401
- <li><a href="INTRO.html">RIO::Doc::INTRO</a>
402
-
403
- </li>
404
- <li><a href="HOWTO.html">RIO::Doc::HOWTO</a>
405
-
406
- </li>
407
- <li><a href="../Rio.html">RIO::Rio</a>
408
-
409
- </li>
410
- </ul>
411
-
412
- </div>
413
-
414
-
415
- </div>
416
-
417
-
418
- </div>
419
-
420
-
421
- <!-- if includes -->
422
-
423
- <div id="section">
424
-
425
-
426
-
427
-
428
-
429
-
430
-
431
-
432
- <!-- if method_list -->
433
-
434
-
435
- </div>
436
-
437
-
438
- <div id="validator-badges">
439
- <p><small>Copyright &copy; 2005 Christopher Kleckner. <a href="http://www.gnu.org/licenses/gpl.html">All rights reserved</a>.</small></p>
440
- </div>
441
-
442
- </body>
443
- </html>
@@ -1,355 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>Module: RIO::Doc::SYNOPSIS</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="classHeader">
50
- <table class="header-table">
51
- <tr class="top-aligned-row">
52
- <td class="class-mod"><strong>Module</strong></td>
53
- <td class="class-name-in-header">RIO::Doc::SYNOPSIS</td>
54
- <td rowspan="2" class="class-header-space-col"></td>
55
- <td rowspan="2">
56
- <a class="in-url" href="../../../files/lib/rio/doc/SYNOPSIS_rb.html">
57
- lib/rio/doc/SYNOPSIS.rb
58
- </a>
59
- &nbsp;&nbsp;
60
- </td>
61
- </tr>
62
-
63
- </table>
64
- </div>
65
- <!-- banner header -->
66
-
67
- <div id="bodyContent">
68
-
69
-
70
-
71
- <div id="contextContent">
72
-
73
- <div id="description">
74
- <h1><a href="../Rio.html">Rio</a> - Ruby I/O Comfort Class</h1>
75
- <p>
76
- <a href="../Rio.html">Rio</a> is a convenience class wrapping much of the
77
- functionality of IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO,
78
- OpenURI, Zlib, and CSV.
79
- </p>
80
- <h2><a href="SYNOPSIS.html">SYNOPSIS</a></h2>
81
- <p>
82
- For the following assume:
83
- </p>
84
- <pre>
85
- astring = &quot;&quot;
86
- anarray = []
87
- </pre>
88
- <p>
89
- Copy a file into a string
90
- </p>
91
- <pre>
92
- rio('afile') &gt; astring
93
- </pre>
94
- <p>
95
- Copy a string into a file
96
- </p>
97
- <pre>
98
- rio('afile') &lt; astring
99
- </pre>
100
- <p>
101
- Copy the chomped lines of a file into an array
102
- </p>
103
- <pre>
104
- rio('afile').chomp &gt; anarray
105
- </pre>
106
- <p>
107
- Copy a file into another file
108
- </p>
109
- <pre>
110
- rio('afile') &gt; rio('another_file')
111
- </pre>
112
- <p>
113
- Copy a file into a directory
114
- </p>
115
- <pre>
116
- rio('afile') &gt; rio('adir')
117
- </pre>
118
- <p>
119
- Copy an entire directory structure into another directory
120
- </p>
121
- <pre>
122
- rio('adir') &gt; rio('another_directory')
123
- </pre>
124
- <p>
125
- Copy a web page into a file
126
- </p>
127
- <pre>
128
- rio('http://rubydoc.org/') &gt; rio('afile')
129
- </pre>
130
- <p>
131
- Copy a file from a ftp server into a local file
132
- </p>
133
- <pre>
134
- rio('ftp://host/afile.gz') &gt; rio('afile.gz')
135
- </pre>
136
- <p>
137
- Copy a gzipped file un-gzipping it
138
- </p>
139
- <pre>
140
- rio('afile.gz').gzip &gt; rio('afile')
141
- </pre>
142
- <p>
143
- Copy a plain file, gzipping it
144
- </p>
145
- <pre>
146
- rio('afile.gz').gzip &lt; rio('afile')
147
- </pre>
148
- <p>
149
- Copy a file from a ftp server into a local file un-gzipping it
150
- </p>
151
- <pre>
152
- rio('ftp://host/afile.gz').gzip &gt; rio('afile')
153
- </pre>
154
- <p>
155
- Iterate over the entries in a directory
156
- </p>
157
- <pre>
158
- rio('adir').entries { |entrio| ... }
159
- </pre>
160
- <p>
161
- Iterate over only the files in a directory
162
- </p>
163
- <pre>
164
- rio('adir').files { |entrio| ... }
165
- </pre>
166
- <p>
167
- Iterate over only the .rb files in a directory
168
- </p>
169
- <pre>
170
- rio('adir').files('*.rb') { |entrio| ... }
171
- </pre>
172
- <p>
173
- Iterate over only the directories in a directory
174
- </p>
175
- <pre>
176
- rio('adir').dirs { |entrio| ... }
177
- </pre>
178
- <p>
179
- Iterate over only the <em>dot</em> files in a directory
180
- </p>
181
- <pre>
182
- rio('adir').dirs(/^\./) { |entrio| ... }
183
- </pre>
184
- <p>
185
- Iterate over the files in a directory and its subdirectories, skipping
186
- &#8217;.svn&#8217; and &#8216;CVS&#8217; directories
187
- </p>
188
- <pre>
189
- rio('adir').norecurse(/^\.svn$/,'CVS').files { |entrio| ... }
190
- </pre>
191
- <p>
192
- Create an array of the .rb entries in a directory
193
- </p>
194
- <pre>
195
- anarray = rio('adir')['*.rb']
196
- </pre>
197
- <p>
198
- Iterate over the .rb files in a directory and its subdirectories
199
- </p>
200
- <pre>
201
- rio('adir').all.files('*.rb') { |entrio| ... }
202
- </pre>
203
- <p>
204
- Create an array of the .rb entries in a directory and its subdirectories
205
- </p>
206
- <pre>
207
- anarray = rio('adir').all['*.rb']
208
- </pre>
209
- <p>
210
- Create an array of the .rb files in a directory and its subdirectories
211
- </p>
212
- <pre>
213
- anarray = rio('adir').all.files['*.rb']
214
- </pre>
215
- <p>
216
- Copy an entire directory structure and the .rb files within it
217
- </p>
218
- <pre>
219
- rio('adir').dirs.files('*.rb') &gt; rio('another_directory')
220
- </pre>
221
- <p>
222
- Iterate over the chomped lines of a file
223
- </p>
224
- <pre>
225
- rio('afile').chomp.lines { |line| ... }
226
- </pre>
227
- <p>
228
- Put the chomped lines of a file into an array
229
- </p>
230
- <pre>
231
- anarray = rio('afile').chomp.lines[]
232
- </pre>
233
- <p>
234
- Iterate over the first 10 chomped lines of a file
235
- </p>
236
- <pre>
237
- rio('afile').chomp.lines(0..9) { |line| ... }
238
- </pre>
239
- <p>
240
- Put the first 10 chomped lines of a file into an array
241
- </p>
242
- <pre>
243
- anarray = rio('afile').chomp.lines[0..9]
244
- </pre>
245
- <p>
246
- Copy the first 10 lines of a file into another file
247
- </p>
248
- <pre>
249
- rio('afile').lines(0..9) &gt; rio('another_file')
250
- </pre>
251
- <p>
252
- Copy the first 10 lines of a file to stdout
253
- </p>
254
- <pre>
255
- rio('afile').lines(0..9) &gt; rio(?-)
256
- </pre>
257
- <p>
258
- Copy the first 10 lines of a gzipped file on an ftp server to stdout
259
- </p>
260
- <pre>
261
- rio('ftp://host/afile.gz').gzip.lines(0..9) &gt; rio(?-)
262
- </pre>
263
- <p>
264
- Put the first 100 chomped lines of a gzipped file into an array
265
- </p>
266
- <pre>
267
- anarray = rio('afile.gz').chomp.gzip[0...100]
268
- </pre>
269
- <p>
270
- Put chomped lines that start with &#8216;<a
271
- href="../Rio.html">Rio</a>&#8217; into an array
272
- </p>
273
- <pre>
274
- anarray = rio('afile').chomp[/^Rio/]
275
- </pre>
276
- <p>
277
- Iterate over the non-empty, non-comment chomped lines of a file
278
- </p>
279
- <pre>
280
- rio('afile').chomp.nolines(:empty?,/^\s*#/) { |line| ... }
281
- </pre>
282
- <p>
283
- Copy the output of th ps command into an array, skipping the header line
284
- and the ps command entry
285
- </p>
286
- <pre>
287
- rio(?-,'ps -a').nolines(0,/ps$/) &gt; anarray
288
- </pre>
289
- <p>
290
- Prompt for input and return what was typed
291
- </p>
292
- <pre>
293
- ans = rio(?-).print(&quot;Type Something: &quot;).chomp.gets
294
- </pre>
295
- <p>
296
- Change the extension of all .htm files in a directory and its
297
- subdirectories to .html
298
- </p>
299
- <pre>
300
- rio('adir').rename.all.files('*.htm') do |htmfile|
301
- htmfile.extname = '.html'
302
- end
303
- </pre>
304
- <p>
305
- Create a symbolic link &#8216;asymlink&#8217; in &#8216;adir&#8217; which
306
- refers to &#8216;adir/afile&#8216;
307
- </p>
308
- <pre>
309
- rio('adir/afile').symlink('adir/asymlink')
310
- </pre>
311
- <h3>SUGGESTED READING</h3>
312
- <ul>
313
- <li><a href="INTRO.html">RIO::Doc::INTRO</a>
314
-
315
- </li>
316
- <li><a href="HOWTO.html">RIO::Doc::HOWTO</a>
317
-
318
- </li>
319
- <li><a href="../Rio.html">RIO::Rio</a>
320
-
321
- </li>
322
- </ul>
323
-
324
- </div>
325
-
326
-
327
- </div>
328
-
329
-
330
- </div>
331
-
332
-
333
- <!-- if includes -->
334
-
335
- <div id="section">
336
-
337
-
338
-
339
-
340
-
341
-
342
-
343
-
344
- <!-- if method_list -->
345
-
346
-
347
- </div>
348
-
349
-
350
- <div id="validator-badges">
351
- <p><small>Copyright &copy; 2005 Christopher Kleckner. <a href="http://www.gnu.org/licenses/gpl.html">All rights reserved</a>.</small></p>
352
- </div>
353
-
354
- </body>
355
- </html>