narf 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (657) hide show
  1. data/ChangeLog +163 -0
  2. data/InstalledFiles +2227 -0
  3. data/README +124 -0
  4. data/TODO +88 -0
  5. data/bin/narftest +17 -0
  6. data/bug.rb +9 -0
  7. data/build.rb +314 -0
  8. data/build.rb~ +314 -0
  9. data/config.save +12 -0
  10. data/doc/apache_cgi.txt +17 -0
  11. data/doc/fastcgi.txt +19 -0
  12. data/doc/mod_ruby.txt +7 -0
  13. data/doc/rdoc/classes/Web.html +366 -0
  14. data/doc/rdoc/classes/Web.src/M000002.html +15 -0
  15. data/doc/rdoc/classes/Web.src/M000003.html +15 -0
  16. data/doc/rdoc/classes/Web.src/M000004.html +15 -0
  17. data/doc/rdoc/classes/Web.src/M000005.html +15 -0
  18. data/doc/rdoc/classes/Web.src/M000006.html +20 -0
  19. data/doc/rdoc/classes/Web.src/M000007.html +18 -0
  20. data/doc/rdoc/classes/Web.src/M000008.html +18 -0
  21. data/doc/rdoc/classes/Web.src/M000009.html +18 -0
  22. data/doc/rdoc/classes/Web.src/M000010.html +15 -0
  23. data/doc/rdoc/classes/Web.src/M000011.html +15 -0
  24. data/doc/rdoc/classes/Web.src/M000012.html +15 -0
  25. data/doc/rdoc/classes/Web/CGD.html +173 -0
  26. data/doc/rdoc/classes/Web/CGD.src/M000037.html +24 -0
  27. data/doc/rdoc/classes/Web/CGD.src/M000038.html +23 -0
  28. data/doc/rdoc/classes/Web/CGD.src/M000039.html +15 -0
  29. data/doc/rdoc/classes/Web/CGD.src/M000040.html +15 -0
  30. data/doc/rdoc/classes/Web/CGD.src/M000041.html +23 -0
  31. data/doc/rdoc/classes/Web/CGI.html +946 -0
  32. data/doc/rdoc/classes/Web/CGI.src/M000051.html +15 -0
  33. data/doc/rdoc/classes/Web/CGI.src/M000052.html +24 -0
  34. data/doc/rdoc/classes/Web/CGI.src/M000053.html +15 -0
  35. data/doc/rdoc/classes/Web/CGI.src/M000054.html +15 -0
  36. data/doc/rdoc/classes/Web/CGI.src/M000055.html +15 -0
  37. data/doc/rdoc/classes/Web/CGI.src/M000056.html +15 -0
  38. data/doc/rdoc/classes/Web/CGI.src/M000057.html +17 -0
  39. data/doc/rdoc/classes/Web/CGI.src/M000058.html +34 -0
  40. data/doc/rdoc/classes/Web/CGI.src/M000059.html +22 -0
  41. data/doc/rdoc/classes/Web/CGI.src/M000060.html +15 -0
  42. data/doc/rdoc/classes/Web/CGI.src/M000061.html +15 -0
  43. data/doc/rdoc/classes/Web/CGI.src/M000062.html +19 -0
  44. data/doc/rdoc/classes/Web/CGI.src/M000063.html +18 -0
  45. data/doc/rdoc/classes/Web/CGI.src/M000064.html +19 -0
  46. data/doc/rdoc/classes/Web/CGI.src/M000065.html +15 -0
  47. data/doc/rdoc/classes/Web/CGI.src/M000066.html +15 -0
  48. data/doc/rdoc/classes/Web/CGI.src/M000067.html +15 -0
  49. data/doc/rdoc/classes/Web/CGI.src/M000068.html +13 -0
  50. data/doc/rdoc/classes/Web/CGI.src/M000069.html +13 -0
  51. data/doc/rdoc/classes/Web/CGI.src/M000070.html +13 -0
  52. data/doc/rdoc/classes/Web/CGI.src/M000071.html +13 -0
  53. data/doc/rdoc/classes/Web/CGI.src/M000072.html +19 -0
  54. data/doc/rdoc/classes/Web/CGI.src/M000073.html +15 -0
  55. data/doc/rdoc/classes/Web/CGI.src/M000074.html +19 -0
  56. data/doc/rdoc/classes/Web/CGI.src/M000075.html +15 -0
  57. data/doc/rdoc/classes/Web/CGI.src/M000076.html +15 -0
  58. data/doc/rdoc/classes/Web/CGI.src/M000077.html +15 -0
  59. data/doc/rdoc/classes/Web/CGI.src/M000078.html +20 -0
  60. data/doc/rdoc/classes/Web/CGI.src/M000079.html +36 -0
  61. data/doc/rdoc/classes/Web/CGI.src/M000080.html +19 -0
  62. data/doc/rdoc/classes/Web/CGI.src/M000081.html +18 -0
  63. data/doc/rdoc/classes/Web/CGI.src/M000082.html +15 -0
  64. data/doc/rdoc/classes/Web/CGI.src/M000083.html +17 -0
  65. data/doc/rdoc/classes/Web/CGI.src/M000084.html +15 -0
  66. data/doc/rdoc/classes/Web/CGI.src/M000085.html +16 -0
  67. data/doc/rdoc/classes/Web/CGI.src/M000086.html +15 -0
  68. data/doc/rdoc/classes/Web/CGI.src/M000087.html +15 -0
  69. data/doc/rdoc/classes/Web/CGI.src/M000088.html +15 -0
  70. data/doc/rdoc/classes/Web/CGI.src/M000089.html +16 -0
  71. data/doc/rdoc/classes/Web/CGI.src/M000090.html +15 -0
  72. data/doc/rdoc/classes/Web/CGI.src/M000091.html +15 -0
  73. data/doc/rdoc/classes/Web/CGI.src/M000092.html +15 -0
  74. data/doc/rdoc/classes/Web/CGI.src/M000093.html +15 -0
  75. data/doc/rdoc/classes/Web/CGI.src/M000094.html +15 -0
  76. data/doc/rdoc/classes/Web/CGI.src/M000095.html +15 -0
  77. data/doc/rdoc/classes/Web/CGI.src/M000096.html +19 -0
  78. data/doc/rdoc/classes/Web/CGI.src/M000097.html +15 -0
  79. data/doc/rdoc/classes/Web/CGI.src/M000098.html +15 -0
  80. data/doc/rdoc/classes/Web/CGI.src/M000099.html +43 -0
  81. data/doc/rdoc/classes/Web/CGI.src/M000100.html +18 -0
  82. data/doc/rdoc/classes/Web/CGI.src/M000101.html +20 -0
  83. data/doc/rdoc/classes/Web/CGI.src/M000102.html +15 -0
  84. data/doc/rdoc/classes/Web/CGI.src/M000103.html +15 -0
  85. data/doc/rdoc/classes/Web/CGI.src/M000104.html +15 -0
  86. data/doc/rdoc/classes/Web/CGI.src/M000105.html +24 -0
  87. data/doc/rdoc/classes/Web/CGI.src/M000106.html +24 -0
  88. data/doc/rdoc/classes/Web/CGI.src/M000107.html +22 -0
  89. data/doc/rdoc/classes/Web/CaseInsensitiveHash.html +104 -0
  90. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000118.html +15 -0
  91. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000119.html +15 -0
  92. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000120.html +15 -0
  93. data/doc/rdoc/classes/Web/Mime.html +122 -0
  94. data/doc/rdoc/classes/Web/Mime.src/M000118.html +15 -0
  95. data/doc/rdoc/classes/Web/Mime.src/M000119.html +15 -0
  96. data/doc/rdoc/classes/Web/Mime.src/M000120.html +23 -0
  97. data/doc/rdoc/classes/Web/Mime.src/M000121.html +15 -0
  98. data/doc/rdoc/classes/Web/Mime.src/M000122.html +15 -0
  99. data/doc/rdoc/classes/Web/Mime.src/M000123.html +23 -0
  100. data/doc/rdoc/classes/Web/Mime.src/M000124.html +15 -0
  101. data/doc/rdoc/classes/Web/Narflates.html +132 -0
  102. data/doc/rdoc/classes/Web/Parser.html +219 -0
  103. data/doc/rdoc/classes/Web/Parser.src/M000013.html +21 -0
  104. data/doc/rdoc/classes/Web/Parser.src/M000014.html +19 -0
  105. data/doc/rdoc/classes/Web/Parser.src/M000015.html +21 -0
  106. data/doc/rdoc/classes/Web/Parser.src/M000016.html +15 -0
  107. data/doc/rdoc/classes/Web/Parser.src/M000017.html +30 -0
  108. data/doc/rdoc/classes/Web/Parser.src/M000018.html +15 -0
  109. data/doc/rdoc/classes/Web/Parser.src/M000019.html +19 -0
  110. data/doc/rdoc/classes/Web/Parser.src/M000020.html +27 -0
  111. data/doc/rdoc/classes/Web/Parser.src/M000021.html +15 -0
  112. data/doc/rdoc/classes/Web/Parser.src/M000022.html +16 -0
  113. data/doc/rdoc/classes/Web/Parser.src/M000023.html +18 -0
  114. data/doc/rdoc/classes/Web/Session.html +178 -0
  115. data/doc/rdoc/classes/Web/Session.src/M000042.html +20 -0
  116. data/doc/rdoc/classes/Web/Session.src/M000043.html +19 -0
  117. data/doc/rdoc/classes/Web/Session.src/M000044.html +21 -0
  118. data/doc/rdoc/classes/Web/Session.src/M000045.html +21 -0
  119. data/doc/rdoc/classes/Web/Session.src/M000046.html +15 -0
  120. data/doc/rdoc/classes/Web/Session.src/M000047.html +17 -0
  121. data/doc/rdoc/classes/Web/Session.src/M000048.html +15 -0
  122. data/doc/rdoc/classes/Web/Session.src/M000049.html +15 -0
  123. data/doc/rdoc/classes/Web/Session.src/M000050.html +16 -0
  124. data/doc/rdoc/classes/Web/Testing.html +474 -0
  125. data/doc/rdoc/classes/Web/Testing.src/M000024.html +15 -0
  126. data/doc/rdoc/classes/Web/Testing.src/M000025.html +25 -0
  127. data/doc/rdoc/classes/Web/Testing.src/M000026.html +15 -0
  128. data/doc/rdoc/classes/Web/Testing.src/M000027.html +28 -0
  129. data/doc/rdoc/classes/Web/Testing.src/M000028.html +58 -0
  130. data/doc/rdoc/classes/Web/Testing.src/M000029.html +15 -0
  131. data/doc/rdoc/classes/Web/Testing.src/M000030.html +15 -0
  132. data/doc/rdoc/classes/Web/Testing.src/M000031.html +15 -0
  133. data/doc/rdoc/classes/Web/Testing.src/M000032.html +15 -0
  134. data/doc/rdoc/classes/Web/Testing.src/M000033.html +15 -0
  135. data/doc/rdoc/classes/Web/Testing.src/M000034.html +15 -0
  136. data/doc/rdoc/classes/Web/Testing.src/M000035.html +15 -0
  137. data/doc/rdoc/classes/Web/Testing.src/M000036.html +18 -0
  138. data/doc/rdoc/classes/Web/Upload.html +160 -0
  139. data/doc/rdoc/classes/Web/Upload.src/M000108.html +25 -0
  140. data/doc/rdoc/classes/Web/Upload.src/M000109.html +18 -0
  141. data/doc/rdoc/classes/Web/Upload.src/M000110.html +16 -0
  142. data/doc/rdoc/classes/Web/Upload.src/M000111.html +16 -0
  143. data/doc/rdoc/classes/Web/Wiki.html +249 -0
  144. data/doc/rdoc/classes/Web/Wiki.src/M000112.html +25 -0
  145. data/doc/rdoc/classes/Web/Wiki.src/M000113.html +15 -0
  146. data/doc/rdoc/classes/Web/Wiki.src/M000114.html +26 -0
  147. data/doc/rdoc/classes/Web/Wiki.src/M000115.html +21 -0
  148. data/doc/rdoc/classes/Web/Wiki.src/M000116.html +18 -0
  149. data/doc/rdoc/classes/Web/Wiki.src/M000117.html +19 -0
  150. data/doc/rdoc/created.rid +1 -0
  151. data/doc/rdoc/files/README.html +226 -0
  152. data/doc/rdoc/files/doc/apache_cgi_txt.html +82 -0
  153. data/doc/rdoc/files/doc/fastcgi_txt.html +82 -0
  154. data/doc/rdoc/files/doc/mod_ruby_txt.html +62 -0
  155. data/doc/rdoc/files/doc/webrick_txt.html +79 -0
  156. data/doc/rdoc/files/examples/examples_rdoc.html +73 -0
  157. data/doc/rdoc/files/lib/web/cgi_rb.html +75 -0
  158. data/doc/rdoc/files/lib/web/mime_rb.html +67 -0
  159. data/doc/rdoc/files/lib/web/parser_rb.html +73 -0
  160. data/doc/rdoc/files/lib/web/session_rb.html +73 -0
  161. data/doc/rdoc/files/lib/web/template_rb.html +73 -0
  162. data/doc/rdoc/files/lib/web/testing_rb.html +67 -0
  163. data/doc/rdoc/files/lib/web/upload_rb.html +73 -0
  164. data/doc/rdoc/files/lib/web/wiki_rb.html +79 -0
  165. data/doc/rdoc/files/lib/web_rb.html +116 -0
  166. data/doc/rdoc/files/lib/web_rb.src/M000001.html +15 -0
  167. data/doc/rdoc/fr_class_index.html +47 -0
  168. data/doc/rdoc/fr_file_index.html +52 -0
  169. data/doc/rdoc/fr_method_index.html +158 -0
  170. data/doc/rdoc/index.html +22 -0
  171. data/doc/rdoc/rdoc-style.css +99 -0
  172. data/doc/webrick.txt +23 -0
  173. data/examples/admin.rb +8 -0
  174. data/examples/admin.rb~ +5 -0
  175. data/examples/cookbook.rdoc +247 -0
  176. data/examples/cookbook.rdoc~ +238 -0
  177. data/examples/examples.rdoc +19 -0
  178. data/examples/examples.rdoc~ +17 -0
  179. data/examples/hello.world.rb +5 -0
  180. data/examples/hello.world.rb~ +3 -0
  181. data/examples/session.rb +34 -0
  182. data/examples/session.rb~ +31 -0
  183. data/examples/test/test.hello.world.rb +9 -0
  184. data/examples/test/test.hello.world.rb~ +9 -0
  185. data/examples/test/test.session.rb +37 -0
  186. data/examples/test/test.session.rb~ +37 -0
  187. data/examples/webunit/COPYING +340 -0
  188. data/examples/webunit/Makefile +14 -0
  189. data/examples/webunit/TIPS-ja.html +126 -0
  190. data/examples/webunit/TIPS-ja.rd +154 -0
  191. data/examples/webunit/TODO-ja.html +35 -0
  192. data/examples/webunit/TODO-ja.rd +28 -0
  193. data/examples/webunit/changes.rd +185 -0
  194. data/examples/webunit/conv/digit-0.cgi +40 -0
  195. data/examples/webunit/conv/digit-0.rb +21 -0
  196. data/examples/webunit/conv/digit-1.cgi +44 -0
  197. data/examples/webunit/conv/digit-1.rb +17 -0
  198. data/examples/webunit/conv/digit.cgi +59 -0
  199. data/examples/webunit/conv/digit.rb +23 -0
  200. data/examples/webunit/conv/test_digit-0.rb +16 -0
  201. data/examples/webunit/conv/test_digit-1.rb +19 -0
  202. data/examples/webunit/conv/test_digit.rb +26 -0
  203. data/examples/webunit/conv/test_digit_view-0.rb +76 -0
  204. data/examples/webunit/conv/test_digit_view-1.rb +102 -0
  205. data/examples/webunit/conv/test_digit_view.rb +134 -0
  206. data/examples/webunit/example.rd +37 -0
  207. data/examples/webunit/index-en.html +263 -0
  208. data/examples/webunit/index-en.rd +60 -0
  209. data/examples/webunit/index-ja.html +263 -0
  210. data/examples/webunit/index-ja.rd +60 -0
  211. data/examples/wiki.rb +7 -0
  212. data/examples/wiki.rb~ +5 -0
  213. data/install.rb +1022 -0
  214. data/lib/web.rb +290 -0
  215. data/lib/web.rb~ +290 -0
  216. data/lib/web/#assertinclude.rb# +110 -0
  217. data/lib/web/action.rb +82 -0
  218. data/lib/web/assertinclude.rb +110 -0
  219. data/lib/web/assertinclude.rb~ +110 -0
  220. data/lib/web/buffer.rb +20 -0
  221. data/lib/web/cgi.rb +641 -0
  222. data/lib/web/cgi.rb~ +640 -0
  223. data/lib/web/formreader.rb +317 -0
  224. data/lib/web/forms.rb +104 -0
  225. data/lib/web/htmlparser/html-parser.rb +429 -0
  226. data/lib/web/htmlparser/html-parser.rb~ +429 -0
  227. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  228. data/lib/web/htmlparser/sgml-parser.rb~ +332 -0
  229. data/lib/web/htmltools/element.rb +296 -0
  230. data/lib/web/htmltools/element.rb~ +296 -0
  231. data/lib/web/htmltools/stparser.rb +276 -0
  232. data/lib/web/htmltools/stparser.rb~ +276 -0
  233. data/lib/web/htmltools/tags.rb +286 -0
  234. data/lib/web/htmltools/tags.rb~ +286 -0
  235. data/lib/web/htmltools/tree.rb +139 -0
  236. data/lib/web/htmltools/tree.rb~ +139 -0
  237. data/lib/web/htmltools/xmltree.rb +160 -0
  238. data/lib/web/htmltools/xmltree.rb~ +160 -0
  239. data/lib/web/htmltools/xpath.rb +71 -0
  240. data/lib/web/htmltools/xpath.rb~ +71 -0
  241. data/lib/web/mime.rb +82 -0
  242. data/lib/web/parser.rb +266 -0
  243. data/lib/web/parser.rb~ +266 -0
  244. data/lib/web/request.rb~ +238 -0
  245. data/lib/web/resources/mime.types +483 -0
  246. data/lib/web/runner.rb +26 -0
  247. data/lib/web/runner.rb~ +26 -0
  248. data/lib/web/sapi/fastcgi.rb +26 -0
  249. data/lib/web/sapi/fastcgi.rb~ +25 -0
  250. data/lib/web/sapi/mod_ruby.rb +46 -0
  251. data/lib/web/sapi/mod_ruby.rb~ +46 -0
  252. data/lib/web/sapi/webrick.rb +91 -0
  253. data/lib/web/sapi/webrick.rb~ +89 -0
  254. data/lib/web/session.rb +75 -0
  255. data/lib/web/session.rb~ +75 -0
  256. data/lib/web/simpledispatcher.rb +155 -0
  257. data/lib/web/strscanparser.rb +24 -0
  258. data/lib/web/tagparser.rb +96 -0
  259. data/lib/web/tagparser.rb~ +96 -0
  260. data/lib/web/template.rb +613 -0
  261. data/lib/web/template.rb~ +613 -0
  262. data/lib/web/testing.rb +546 -0
  263. data/lib/web/testing.rb~ +546 -0
  264. data/lib/web/traceoutput.rb +32 -0
  265. data/lib/web/unit.rb +27 -0
  266. data/lib/web/unit/assert.rb +154 -0
  267. data/lib/web/unit/converter.rb +148 -0
  268. data/lib/web/unit/cookie.rb +120 -0
  269. data/lib/web/unit/domwalker.rb +187 -0
  270. data/lib/web/unit/exception.rb +15 -0
  271. data/lib/web/unit/form.rb +118 -0
  272. data/lib/web/unit/formatter.rb +314 -0
  273. data/lib/web/unit/frame.rb +39 -0
  274. data/lib/web/unit/html-parser.rb +432 -0
  275. data/lib/web/unit/htmlelem.rb +124 -0
  276. data/lib/web/unit/htmlrepair.rb +116 -0
  277. data/lib/web/unit/htmlsplit.rb +840 -0
  278. data/lib/web/unit/image.rb +27 -0
  279. data/lib/web/unit/jscript.rb +32 -0
  280. data/lib/web/unit/link.rb +35 -0
  281. data/lib/web/unit/params.rb +323 -0
  282. data/lib/web/unit/parser.rb +226 -0
  283. data/lib/web/unit/resources/assert.html +101 -0
  284. data/lib/web/unit/resources/auth/index.html +5 -0
  285. data/lib/web/unit/resources/badtags.html +7 -0
  286. data/lib/web/unit/resources/cookie.cgi +33 -0
  287. data/lib/web/unit/resources/document.xml +13 -0
  288. data/lib/web/unit/resources/form.html +150 -0
  289. data/lib/web/unit/resources/frame-0.html +10 -0
  290. data/lib/web/unit/resources/frame-1.html +10 -0
  291. data/lib/web/unit/resources/frame.html +10 -0
  292. data/lib/web/unit/resources/image.html +17 -0
  293. data/lib/web/unit/resources/images/x.gif +0 -0
  294. data/lib/web/unit/resources/images/y.gif +0 -0
  295. data/lib/web/unit/resources/jscript-0.html +10 -0
  296. data/lib/web/unit/resources/jscript-1.html +10 -0
  297. data/lib/web/unit/resources/jscript.html +19 -0
  298. data/lib/web/unit/resources/link.html +19 -0
  299. data/lib/web/unit/resources/multipart.cgi +28 -0
  300. data/lib/web/unit/resources/multipart.html +74 -0
  301. data/lib/web/unit/resources/params.html +65 -0
  302. data/lib/web/unit/resources/redirect.cgi +13 -0
  303. data/lib/web/unit/resources/response.html +67 -0
  304. data/lib/web/unit/resources/simple.cgi +14 -0
  305. data/lib/web/unit/resources/stock.cgi +35 -0
  306. data/lib/web/unit/resources/table.html +83 -0
  307. data/lib/web/unit/response.rb +469 -0
  308. data/lib/web/unit/response.rb~ +461 -0
  309. data/lib/web/unit/runtest.rb +44 -0
  310. data/lib/web/unit/sgml-parser.rb +336 -0
  311. data/lib/web/unit/table.rb +150 -0
  312. data/lib/web/unit/testcase.rb +49 -0
  313. data/lib/web/unit/ui/cui/testrunner.rb +52 -0
  314. data/lib/web/unit/ui/cui/testrunner.rb~ +50 -0
  315. data/lib/web/unit/utils.rb +70 -0
  316. data/lib/web/unit/webunit.rb +28 -0
  317. data/lib/web/upload.rb +55 -0
  318. data/lib/web/upload.rb~ +262 -0
  319. data/lib/web/wiki.rb +506 -0
  320. data/lib/web/wiki.rb~ +506 -0
  321. data/lib/web/wiki/linker.rb +72 -0
  322. data/lib/web/wiki/linker.rb~ +72 -0
  323. data/lib/web/wiki/mime.rb~ +68 -0
  324. data/lib/web/wiki/page.rb +192 -0
  325. data/lib/web/wiki/page.rb~ +192 -0
  326. data/lib/web/wiki/resources/#edit.html# +65 -0
  327. data/lib/web/wiki/resources/admin.html +13 -0
  328. data/lib/web/wiki/resources/admin.html~ +13 -0
  329. data/lib/web/wiki/resources/asset_history.html +3 -0
  330. data/lib/web/wiki/resources/basic.html +1 -0
  331. data/lib/web/wiki/resources/default-content_editor.html +1 -0
  332. data/lib/web/wiki/resources/default-content_editor.html~ +1 -0
  333. data/lib/web/wiki/resources/edit.html +1 -1
  334. data/lib/web/wiki/resources/edit.html~ +1 -1
  335. data/lib/web/wiki/resources/ekit-content_editor.html +1 -0
  336. data/lib/web/wiki/resources/home.html +10 -0
  337. data/lib/web/wiki/resources/home.html~ +10 -0
  338. data/lib/web/wiki/resources/htmlarea/ChangeLog +1185 -0
  339. data/lib/web/wiki/resources/htmlarea/dialog.js +72 -0
  340. data/lib/web/wiki/resources/htmlarea/examples/2-areas.cgi +16 -0
  341. data/lib/web/wiki/resources/htmlarea/examples/2-areas.html +158 -0
  342. data/lib/web/wiki/resources/htmlarea/examples/context-menu.html +95 -0
  343. data/lib/web/wiki/resources/htmlarea/examples/core.html +184 -0
  344. data/lib/web/wiki/resources/htmlarea/examples/css.html +88 -0
  345. data/lib/web/wiki/resources/htmlarea/examples/custom.css +29 -0
  346. data/lib/web/wiki/resources/htmlarea/examples/full-page.html +75 -0
  347. data/lib/web/wiki/resources/htmlarea/examples/fully-loaded.html +248 -0
  348. data/lib/web/wiki/resources/htmlarea/examples/index.html +40 -0
  349. data/lib/web/wiki/resources/htmlarea/examples/spell-checker.html +132 -0
  350. data/lib/web/wiki/resources/htmlarea/examples/table-operations.html +116 -0
  351. data/lib/web/wiki/resources/htmlarea/examples/test.cgi +21 -0
  352. data/lib/web/wiki/resources/htmlarea/htmlarea.css +180 -0
  353. data/lib/web/wiki/resources/htmlarea/htmlarea.js +2175 -0
  354. data/lib/web/wiki/resources/htmlarea/images/ed_about.gif +0 -0
  355. data/lib/web/wiki/resources/htmlarea/images/ed_align_center.gif +0 -0
  356. data/lib/web/wiki/resources/htmlarea/images/ed_align_justify.gif +0 -0
  357. data/lib/web/wiki/resources/htmlarea/images/ed_align_left.gif +0 -0
  358. data/lib/web/wiki/resources/htmlarea/images/ed_align_right.gif +0 -0
  359. data/lib/web/wiki/resources/htmlarea/images/ed_blank.gif +0 -0
  360. data/lib/web/wiki/resources/htmlarea/images/ed_charmap.gif +0 -0
  361. data/lib/web/wiki/resources/htmlarea/images/ed_color_bg.gif +0 -0
  362. data/lib/web/wiki/resources/htmlarea/images/ed_color_fg.gif +0 -0
  363. data/lib/web/wiki/resources/htmlarea/images/ed_copy.gif +0 -0
  364. data/lib/web/wiki/resources/htmlarea/images/ed_custom.gif +0 -0
  365. data/lib/web/wiki/resources/htmlarea/images/ed_cut.gif +0 -0
  366. data/lib/web/wiki/resources/htmlarea/images/ed_delete.gif +0 -0
  367. data/lib/web/wiki/resources/htmlarea/images/ed_format_bold.gif +0 -0
  368. data/lib/web/wiki/resources/htmlarea/images/ed_format_italic.gif +0 -0
  369. data/lib/web/wiki/resources/htmlarea/images/ed_format_strike.gif +0 -0
  370. data/lib/web/wiki/resources/htmlarea/images/ed_format_sub.gif +0 -0
  371. data/lib/web/wiki/resources/htmlarea/images/ed_format_sup.gif +0 -0
  372. data/lib/web/wiki/resources/htmlarea/images/ed_format_underline.gif +0 -0
  373. data/lib/web/wiki/resources/htmlarea/images/ed_help.gif +0 -0
  374. data/lib/web/wiki/resources/htmlarea/images/ed_hr.gif +0 -0
  375. data/lib/web/wiki/resources/htmlarea/images/ed_html.gif +0 -0
  376. data/lib/web/wiki/resources/htmlarea/images/ed_image.gif +0 -0
  377. data/lib/web/wiki/resources/htmlarea/images/ed_indent_less.gif +0 -0
  378. data/lib/web/wiki/resources/htmlarea/images/ed_indent_more.gif +0 -0
  379. data/lib/web/wiki/resources/htmlarea/images/ed_left_to_right.gif +0 -0
  380. data/lib/web/wiki/resources/htmlarea/images/ed_link.gif +0 -0
  381. data/lib/web/wiki/resources/htmlarea/images/ed_list_bullet.gif +0 -0
  382. data/lib/web/wiki/resources/htmlarea/images/ed_list_num.gif +0 -0
  383. data/lib/web/wiki/resources/htmlarea/images/ed_paste.gif +0 -0
  384. data/lib/web/wiki/resources/htmlarea/images/ed_redo.gif +0 -0
  385. data/lib/web/wiki/resources/htmlarea/images/ed_right_to_left.gif +0 -0
  386. data/lib/web/wiki/resources/htmlarea/images/ed_save.gif +0 -0
  387. data/lib/web/wiki/resources/htmlarea/images/ed_show_border.gif +0 -0
  388. data/lib/web/wiki/resources/htmlarea/images/ed_splitcel.gif +0 -0
  389. data/lib/web/wiki/resources/htmlarea/images/ed_undo.gif +0 -0
  390. data/lib/web/wiki/resources/htmlarea/images/fullscreen_maximize.gif +0 -0
  391. data/lib/web/wiki/resources/htmlarea/images/fullscreen_minimize.gif +0 -0
  392. data/lib/web/wiki/resources/htmlarea/images/insert_table.gif +0 -0
  393. data/lib/web/wiki/resources/htmlarea/index.html +199 -0
  394. data/lib/web/wiki/resources/htmlarea/lang/b5.js +36 -0
  395. data/lib/web/wiki/resources/htmlarea/lang/cz.js +63 -0
  396. data/lib/web/wiki/resources/htmlarea/lang/da.js +38 -0
  397. data/lib/web/wiki/resources/htmlarea/lang/de.js +54 -0
  398. data/lib/web/wiki/resources/htmlarea/lang/ee.js +63 -0
  399. data/lib/web/wiki/resources/htmlarea/lang/el.js +75 -0
  400. data/lib/web/wiki/resources/htmlarea/lang/en.js +88 -0
  401. data/lib/web/wiki/resources/htmlarea/lang/es.js +51 -0
  402. data/lib/web/wiki/resources/htmlarea/lang/fi.js +46 -0
  403. data/lib/web/wiki/resources/htmlarea/lang/fr.js +61 -0
  404. data/lib/web/wiki/resources/htmlarea/lang/gb.js +36 -0
  405. data/lib/web/wiki/resources/htmlarea/lang/he.js +63 -0
  406. data/lib/web/wiki/resources/htmlarea/lang/hu.js +63 -0
  407. data/lib/web/wiki/resources/htmlarea/lang/it.js +54 -0
  408. data/lib/web/wiki/resources/htmlarea/lang/ja-euc.js +37 -0
  409. data/lib/web/wiki/resources/htmlarea/lang/ja-jis.js +37 -0
  410. data/lib/web/wiki/resources/htmlarea/lang/ja-sjis.js +37 -0
  411. data/lib/web/wiki/resources/htmlarea/lang/ja-utf8.js +37 -0
  412. data/lib/web/wiki/resources/htmlarea/lang/lt.js +55 -0
  413. data/lib/web/wiki/resources/htmlarea/lang/lv.js +55 -0
  414. data/lib/web/wiki/resources/htmlarea/lang/nb.js +36 -0
  415. data/lib/web/wiki/resources/htmlarea/lang/nl.js +90 -0
  416. data/lib/web/wiki/resources/htmlarea/lang/no.js +79 -0
  417. data/lib/web/wiki/resources/htmlarea/lang/pl.js +36 -0
  418. data/lib/web/wiki/resources/htmlarea/lang/pt_br.js +37 -0
  419. data/lib/web/wiki/resources/htmlarea/lang/ro.js +80 -0
  420. data/lib/web/wiki/resources/htmlarea/lang/ru.js +63 -0
  421. data/lib/web/wiki/resources/htmlarea/lang/se.js +38 -0
  422. data/lib/web/wiki/resources/htmlarea/lang/si.js +63 -0
  423. data/lib/web/wiki/resources/htmlarea/lang/vn.js +51 -0
  424. data/lib/web/wiki/resources/htmlarea/license.txt +30 -0
  425. data/lib/web/wiki/resources/htmlarea/plugins/CSS/css.js +116 -0
  426. data/lib/web/wiki/resources/htmlarea/plugins/CSS/lang/en.js +2 -0
  427. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/context-menu.js +416 -0
  428. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/de.js +59 -0
  429. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/el.js +57 -0
  430. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/en.js +66 -0
  431. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/nl.js +66 -0
  432. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/menu.css +64 -0
  433. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/full-page.js +143 -0
  434. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/img/docprop.gif +0 -0
  435. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/lang/en.js +25 -0
  436. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/lang/ro.js +25 -0
  437. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/popups/docprop.html +131 -0
  438. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/test.html +89 -0
  439. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/img/spell-check.gif +0 -0
  440. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/cz.js +37 -0
  441. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/da.js +37 -0
  442. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/de.js +28 -0
  443. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/en.js +38 -0
  444. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/hu.js +37 -0
  445. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/it.js +28 -0
  446. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/ro.js +37 -0
  447. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/readme-tech.html +114 -0
  448. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-logic.cgi +210 -0
  449. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-style.css +10 -0
  450. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-ui.html +122 -0
  451. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-ui.js +397 -0
  452. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-checker.js +79 -0
  453. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-delete.gif +0 -0
  454. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-insert-after.gif +0 -0
  455. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-insert-before.gif +0 -0
  456. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-merge.gif +0 -0
  457. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-prop.gif +0 -0
  458. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-split.gif +0 -0
  459. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-delete.gif +0 -0
  460. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-insert-after.gif +0 -0
  461. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-insert-before.gif +0 -0
  462. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-split.gif +0 -0
  463. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-delete.gif +0 -0
  464. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-insert-above.gif +0 -0
  465. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-insert-under.gif +0 -0
  466. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-prop.gif +0 -0
  467. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-split.gif +0 -0
  468. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/table-prop.gif +0 -0
  469. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/cz.js +90 -0
  470. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/da.js +90 -0
  471. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/de.js +81 -0
  472. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/el.js +81 -0
  473. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/en.js +90 -0
  474. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/fi.js +66 -0
  475. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/hu.js +63 -0
  476. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/it.js +81 -0
  477. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/nl.js +90 -0
  478. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/no.js +91 -0
  479. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/ro.js +90 -0
  480. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/table-operations.js +1160 -0
  481. data/lib/web/wiki/resources/htmlarea/popupdiv.js +369 -0
  482. data/lib/web/wiki/resources/htmlarea/popups/about.html +378 -0
  483. data/lib/web/wiki/resources/htmlarea/popups/blank.html +2 -0
  484. data/lib/web/wiki/resources/htmlarea/popups/custom2.html +35 -0
  485. data/lib/web/wiki/resources/htmlarea/popups/editor_help.html +16 -0
  486. data/lib/web/wiki/resources/htmlarea/popups/fullscreen.html +133 -0
  487. data/lib/web/wiki/resources/htmlarea/popups/insert_image.html +191 -0
  488. data/lib/web/wiki/resources/htmlarea/popups/insert_table.html +174 -0
  489. data/lib/web/wiki/resources/htmlarea/popups/link.html +142 -0
  490. data/lib/web/wiki/resources/htmlarea/popups/old-fullscreen.html +131 -0
  491. data/lib/web/wiki/resources/htmlarea/popups/old_insert_image.html +206 -0
  492. data/lib/web/wiki/resources/htmlarea/popups/popup.js +109 -0
  493. data/lib/web/wiki/resources/htmlarea/popups/select_color.html +347 -0
  494. data/lib/web/wiki/resources/htmlarea/popupwin.js +139 -0
  495. data/lib/web/wiki/resources/htmlarea/reference.html +523 -0
  496. data/lib/web/wiki/resources/htmlarea/release-notes.html +165 -0
  497. data/lib/web/wiki/resources/ie-content_editor.html +1 -0
  498. data/lib/web/wiki/resources/ie-content_editor.js +196 -0
  499. data/lib/web/wiki/resources/illustration.html +1 -0
  500. data/lib/web/wiki/resources/illustration.html~ +1 -0
  501. data/lib/web/wiki/resources/images.html +1 -0
  502. data/lib/web/wiki/resources/index.html +4 -0
  503. data/lib/web/wiki/resources/index.html~ +4 -0
  504. data/lib/web/wiki/resources/more_news.html +5 -0
  505. data/lib/web/wiki/resources/more_news.html~ +5 -0
  506. data/lib/web/wiki/resources/more_news_rss_0.91.html +23 -0
  507. data/lib/web/wiki/resources/narf-logo.gif +0 -0
  508. data/lib/web/wiki/resources/page_history.html +19 -0
  509. data/lib/web/wiki/resources/page_history.html~ +19 -0
  510. data/lib/web/wiki/resources/template.html +13 -0
  511. data/lib/web/wiki/resources/template.html~ +13 -0
  512. data/lib/web/wiki/resources/test_upload.gif +0 -0
  513. data/lib/web/wiki/resources/text-styles.css +1 -0
  514. data/lib/web/writableio.rb +33 -0
  515. data/narf-0.5.1.gem +0 -0
  516. data/narf.gemspec +40 -0
  517. data/narf.gemspec~ +52 -0
  518. data/pre-setup.rb +5 -0
  519. data/sapi/apache_cgi/INSTALL.txt~ +9 -0
  520. data/sapi/apache_cgi/README~ +0 -0
  521. data/sapi/apache_cgi/src/narf.c +13 -0
  522. data/sapi/fastcgi/INSTALL.txt~ +17 -0
  523. data/sapi/mod_ruby/INSTALL.txt~ +5 -0
  524. data/sapi/webrick/INSTALL.txt~ +21 -0
  525. data/sapi/webrick/run_webrick.rb~ +16 -0
  526. data/scripts/dump.rb +14 -0
  527. data/scripts/makedist.rb +49 -0
  528. data/scripts/upload.html +5 -0
  529. data/scripts/uri.rb +41 -0
  530. data/scripts/uri/common.rb +432 -0
  531. data/scripts/uri/ftp.rb +149 -0
  532. data/scripts/uri/generic.rb +1106 -0
  533. data/scripts/uri/http.rb +76 -0
  534. data/scripts/uri/https.rb +26 -0
  535. data/scripts/uri/ldap.rb +238 -0
  536. data/scripts/uri/mailto.rb +260 -0
  537. data/scripts/urireg.rb +174 -0
  538. data/test/bufferedtestrunner.rb +112 -0
  539. data/test/mod_ruby_stub.rb +39 -0
  540. data/test/mod_ruby_stub.rb~ +38 -0
  541. data/test/stringio.rb +2 -0
  542. data/test/test.action.rb +142 -0
  543. data/test/test.action.rb~ +142 -0
  544. data/test/test.app.rb +0 -0
  545. data/test/test.assertinclude.rb +109 -0
  546. data/test/test.assertinclude.rb~ +109 -0
  547. data/test/test.formreader-2.0.rb +352 -0
  548. data/test/test.formreader.rb +465 -0
  549. data/test/test.mime-type.rb +23 -0
  550. data/test/test.narf.cgi.rb +101 -0
  551. data/test/test.narf.cgi.rb~ +105 -0
  552. data/test/test.request.rb +328 -0
  553. data/test/test.request.rb~ +318 -0
  554. data/test/test.response.rb +565 -0
  555. data/test/test.response.rb~ +556 -0
  556. data/test/test.session.rb +50 -0
  557. data/test/test.simpledispatcher.rb +188 -0
  558. data/test/test.tagparser.rb +65 -0
  559. data/test/test.template.rb +831 -0
  560. data/test/test.template.rb~ +832 -0
  561. data/test/test.testing2.rb +341 -0
  562. data/test/test.web.test.rb +463 -0
  563. data/test/test.web.test.rb~ +461 -0
  564. data/test/testfiles/basictemplate.tpl +1 -0
  565. data/test/testfiles/explorer5.multipart.data +9 -0
  566. data/test/testfiles/form.html +7 -0
  567. data/test/testfiles/mozilla.multipart.data +9 -0
  568. data/test/testfiles/netscape4.multipart.data +9 -0
  569. data/test/testfiles/pic hydra.png +1 -0
  570. data/test/testfiles/post.data +1 -0
  571. data/test/testfiles/print.text +1 -0
  572. data/test/testfiles/text +1 -0
  573. data/test/webunit/dont_get_it.test_webunit.rb +27 -0
  574. data/test/webunit/ref +38 -0
  575. data/test/webunit/resources/uploadfile1.txt +1 -0
  576. data/test/webunit/resources/uploadfile2.txt +1 -0
  577. data/test/webunit/test_assert.rb +169 -0
  578. data/test/webunit/test_cookie.rb +128 -0
  579. data/test/webunit/test_cookie.rb~ +128 -0
  580. data/test/webunit/test_domwalker.rb +83 -0
  581. data/test/webunit/test_form.rb +43 -0
  582. data/test/webunit/test_form.rb~ +43 -0
  583. data/test/webunit/test_frame.rb +43 -0
  584. data/test/webunit/test_htmlelem.rb +75 -0
  585. data/test/webunit/test_image.rb +46 -0
  586. data/test/webunit/test_jscript.rb +58 -0
  587. data/test/webunit/test_link.rb +87 -0
  588. data/test/webunit/test_multipart.rb +53 -0
  589. data/test/webunit/test_multipart.rb~ +53 -0
  590. data/test/webunit/test_params.rb +212 -0
  591. data/test/webunit/test_params.rb~ +211 -0
  592. data/test/webunit/test_parser.rb +31 -0
  593. data/test/webunit/test_response.rb +145 -0
  594. data/test/webunit/test_response.rb~ +145 -0
  595. data/test/webunit/test_site/assert.html +101 -0
  596. data/test/webunit/test_site/assert.html~ +1 -0
  597. data/test/webunit/test_site/auth/index.html +5 -0
  598. data/test/webunit/test_site/auth/index.html~ +1 -0
  599. data/test/webunit/test_site/badtags.html +7 -0
  600. data/test/webunit/test_site/badtags.html~ +1 -0
  601. data/test/webunit/test_site/cookie.cgi +37 -0
  602. data/test/webunit/test_site/cookie.cgi~ +35 -0
  603. data/test/webunit/test_site/document.xml +13 -0
  604. data/test/webunit/test_site/document.xml~ +1 -0
  605. data/test/webunit/test_site/form.html +150 -0
  606. data/test/webunit/test_site/form.html~ +1 -0
  607. data/test/webunit/test_site/frame-0.html +10 -0
  608. data/test/webunit/test_site/frame-0.html~ +1 -0
  609. data/test/webunit/test_site/frame-1.html +10 -0
  610. data/test/webunit/test_site/frame-1.html~ +1 -0
  611. data/test/webunit/test_site/frame.html +10 -0
  612. data/test/webunit/test_site/frame.html~ +1 -0
  613. data/test/webunit/test_site/image.html +17 -0
  614. data/test/webunit/test_site/image.html~ +1 -0
  615. data/test/webunit/test_site/images/x.gif +0 -0
  616. data/test/webunit/test_site/images/y.gif +0 -0
  617. data/test/webunit/test_site/include.cgi~ +10 -0
  618. data/test/webunit/test_site/jscript-0.html +10 -0
  619. data/test/webunit/test_site/jscript-0.html~ +1 -0
  620. data/test/webunit/test_site/jscript-1.html +10 -0
  621. data/test/webunit/test_site/jscript-1.html~ +1 -0
  622. data/test/webunit/test_site/jscript.html +19 -0
  623. data/test/webunit/test_site/jscript.html~ +1 -0
  624. data/test/webunit/test_site/link.html +19 -0
  625. data/test/webunit/test_site/link.html~ +1 -0
  626. data/test/webunit/test_site/multipart.cgi +27 -0
  627. data/test/webunit/test_site/multipart.cgi~ +25 -0
  628. data/test/webunit/test_site/multipart.html +74 -0
  629. data/test/webunit/test_site/multipart.html~ +1 -0
  630. data/test/webunit/test_site/params.html +65 -0
  631. data/test/webunit/test_site/params.html~ +1 -0
  632. data/test/webunit/test_site/redirect.cgi +14 -0
  633. data/test/webunit/test_site/redirect.cgi~ +14 -0
  634. data/test/webunit/test_site/response.html +67 -0
  635. data/test/webunit/test_site/response.html~ +1 -0
  636. data/test/webunit/test_site/simple.cgi +17 -0
  637. data/test/webunit/test_site/simple.cgi~ +17 -0
  638. data/test/webunit/test_site/stock.cgi +36 -0
  639. data/test/webunit/test_site/stock.cgi~ +34 -0
  640. data/test/webunit/test_site/table.html +83 -0
  641. data/test/webunit/test_site/table.html~ +1 -0
  642. data/test/webunit/test_site/test.cgi~ +25 -0
  643. data/test/webunit/test_table.rb +70 -0
  644. data/test/webunit/test_utils.rb +107 -0
  645. data/test/wiki/test.history.rb +277 -0
  646. data/test/wiki/test.history.rb~ +254 -0
  647. data/test/wiki/test.illustration_page.rb +287 -0
  648. data/test/wiki/test.illustration_page.rb~ +287 -0
  649. data/test/wiki/test.linker.rb +197 -0
  650. data/test/wiki/test.tarpit.rb +40 -0
  651. data/test/wiki/test.wiki.rb +295 -0
  652. data/test/wiki/test.wiki.rb~ +295 -0
  653. data/test/wikitestroot/big_image.jpg +0 -0
  654. data/test/wikitestroot/mime.types +483 -0
  655. data/test/wikitestroot/test_upload.gif +0 -0
  656. data/vandals.test.txt +3 -0
  657. metadata +768 -0
@@ -0,0 +1,1160 @@
1
+ // Table Operations Plugin for HTMLArea-3.0
2
+ // Implementation by Mihai Bazon. Sponsored by http://www.bloki.com
3
+ //
4
+ // htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
5
+ // This notice MUST stay intact for use (see license.txt).
6
+ //
7
+ // A free WYSIWYG editor replacement for <textarea> fields.
8
+ // For full source code and docs, visit http://www.interactivetools.com/
9
+ //
10
+ // Version 3.0 developed by Mihai Bazon for InteractiveTools.
11
+ // http://dynarch.com/mishoo
12
+ //
13
+ // $Id: table-operations.js,v 1.5 2003/10/06 11:47:42 mishoo Exp $
14
+
15
+ // Object that will encapsulate all the table operations provided by
16
+ // HTMLArea-3.0 (except "insert table" which is included in the main file)
17
+ function TableOperations(editor) {
18
+ this.editor = editor;
19
+
20
+ var cfg = editor.config;
21
+ var tt = TableOperations.I18N;
22
+ var bl = TableOperations.btnList;
23
+ var self = this;
24
+
25
+ // register the toolbar buttons provided by this plugin
26
+ var toolbar = ["linebreak"];
27
+ for (var i in bl) {
28
+ var btn = bl[i];
29
+ if (!btn) {
30
+ toolbar.push("separator");
31
+ } else {
32
+ var id = "TO-" + btn[0];
33
+ cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "TableOperations"), false,
34
+ function(editor, id) {
35
+ // dispatch button press event
36
+ self.buttonPress(editor, id);
37
+ }, btn[1]);
38
+ toolbar.push(id);
39
+ }
40
+ }
41
+
42
+ // add a new line in the toolbar
43
+ cfg.toolbar.push(toolbar);
44
+ };
45
+
46
+ TableOperations._pluginInfo = {
47
+ name : "TableOperations",
48
+ version : "1.0",
49
+ developer : "Mihai Bazon",
50
+ developer_url : "http://dynarch.com/mishoo/",
51
+ c_owner : "Mihai Bazon",
52
+ sponsor : "Zapatec Inc.",
53
+ sponsor_url : "http://www.bloki.com",
54
+ license : "htmlArea"
55
+ };
56
+
57
+ /************************
58
+ * UTILITIES
59
+ ************************/
60
+
61
+ // retrieves the closest element having the specified tagName in the list of
62
+ // ancestors of the current selection/caret.
63
+ TableOperations.prototype.getClosest = function(tagName) {
64
+ var editor = this.editor;
65
+ var ancestors = editor.getAllAncestors();
66
+ var ret = null;
67
+ tagName = ("" + tagName).toLowerCase();
68
+ for (var i in ancestors) {
69
+ var el = ancestors[i];
70
+ if (el.tagName.toLowerCase() == tagName) {
71
+ ret = el;
72
+ break;
73
+ }
74
+ }
75
+ return ret;
76
+ };
77
+
78
+ // this function requires the file PopupDiv/PopupWin to be loaded from browser
79
+ TableOperations.prototype.dialogTableProperties = function() {
80
+ var i18n = TableOperations.I18N;
81
+ // retrieve existing values
82
+ var table = this.getClosest("table");
83
+ // this.editor.selectNodeContents(table);
84
+ // this.editor.updateToolbar();
85
+
86
+ var dialog = new PopupWin(this.editor, i18n["Table Properties"], function(dialog, params) {
87
+ TableOperations.processStyle(params, table);
88
+ for (var i in params) {
89
+ var val = params[i];
90
+ switch (i) {
91
+ case "f_caption":
92
+ if (/\S/.test(val)) {
93
+ // contains non white-space characters
94
+ var caption = table.getElementsByTagName("caption")[0];
95
+ if (!caption) {
96
+ caption = dialog.editor._doc.createElement("caption");
97
+ table.insertBefore(caption, table.firstChild);
98
+ }
99
+ caption.innerHTML = val;
100
+ } else {
101
+ // search for caption and delete it if found
102
+ var caption = table.getElementsByTagName("caption")[0];
103
+ if (caption) {
104
+ caption.parentNode.removeChild(caption);
105
+ }
106
+ }
107
+ break;
108
+ case "f_summary":
109
+ table.summary = val;
110
+ break;
111
+ case "f_width":
112
+ table.style.width = ("" + val) + params.f_unit;
113
+ break;
114
+ case "f_align":
115
+ table.align = val;
116
+ break;
117
+ case "f_spacing":
118
+ table.cellSpacing = val;
119
+ break;
120
+ case "f_padding":
121
+ table.cellPadding = val;
122
+ break;
123
+ case "f_borders":
124
+ table.border = val;
125
+ break;
126
+ case "f_frames":
127
+ table.frame = val;
128
+ break;
129
+ case "f_rules":
130
+ table.rules = val;
131
+ break;
132
+ }
133
+ }
134
+ // various workarounds to refresh the table display (Gecko,
135
+ // what's going on?! do not disappoint me!)
136
+ dialog.editor.forceRedraw();
137
+ dialog.editor.focusEditor();
138
+ dialog.editor.updateToolbar();
139
+ var save_collapse = table.style.borderCollapse;
140
+ table.style.borderCollapse = "collapse";
141
+ table.style.borderCollapse = "separate";
142
+ table.style.borderCollapse = save_collapse;
143
+ },
144
+
145
+ // this function gets called when the dialog needs to be initialized
146
+ function (dialog) {
147
+
148
+ var f_caption = "";
149
+ var capel = table.getElementsByTagName("caption")[0];
150
+ if (capel) {
151
+ f_caption = capel.innerHTML;
152
+ }
153
+ var f_summary = table.summary;
154
+ var f_width = parseInt(table.style.width);
155
+ isNaN(f_width) && (f_width = "");
156
+ var f_unit = /%/.test(table.style.width) ? 'percent' : 'pixels';
157
+ var f_align = table.align;
158
+ var f_spacing = table.cellSpacing;
159
+ var f_padding = table.cellPadding;
160
+ var f_borders = table.border;
161
+ var f_frames = table.frame;
162
+ var f_rules = table.rules;
163
+
164
+ function selected(val) {
165
+ return val ? " selected" : "";
166
+ };
167
+
168
+ // dialog contents
169
+ dialog.content.style.width = "400px";
170
+ dialog.content.innerHTML = " \
171
+ <div class='title'\
172
+ style='background: url(" + dialog.baseURL + dialog.editor.imgURL("table-prop.gif", "TableOperations") + ") #fff 98% 50% no-repeat'>" + i18n["Table Properties"] + "\
173
+ </div> \
174
+ <table style='width:100%'> \
175
+ <tr> \
176
+ <td> \
177
+ <fieldset><legend>" + i18n["Description"] + "</legend> \
178
+ <table style='width:100%'> \
179
+ <tr> \
180
+ <td class='label'>" + i18n["Caption"] + ":</td> \
181
+ <td class='value'><input type='text' name='f_caption' value='" + f_caption + "'/></td> \
182
+ </tr><tr> \
183
+ <td class='label'>" + i18n["Summary"] + ":</td> \
184
+ <td class='value'><input type='text' name='f_summary' value='" + f_summary + "'/></td> \
185
+ </tr> \
186
+ </table> \
187
+ </fieldset> \
188
+ </td> \
189
+ </tr> \
190
+ <tr><td id='--HA-layout'></td></tr> \
191
+ <tr> \
192
+ <td> \
193
+ <fieldset><legend>" + i18n["Spacing and padding"] + "</legend> \
194
+ <table style='width:100%'> \
195
+ "+// <tr> \
196
+ // <td class='label'>" + i18n["Width"] + ":</td> \
197
+ // <td><input type='text' name='f_width' value='" + f_width + "' size='5' /> \
198
+ // <select name='f_unit'> \
199
+ // <option value='%'" + selected(f_unit == "percent") + ">" + i18n["percent"] + "</option> \
200
+ // <option value='px'" + selected(f_unit == "pixels") + ">" + i18n["pixels"] + "</option> \
201
+ // </select> &nbsp;&nbsp;" + i18n["Align"] + ": \
202
+ // <select name='f_align'> \
203
+ // <option value='left'" + selected(f_align == "left") + ">" + i18n["Left"] + "</option> \
204
+ // <option value='center'" + selected(f_align == "center") + ">" + i18n["Center"] + "</option> \
205
+ // <option value='right'" + selected(f_align == "right") + ">" + i18n["Right"] + "</option> \
206
+ // </select> \
207
+ // </td> \
208
+ // </tr> \
209
+ " <tr> \
210
+ <td class='label'>" + i18n["Spacing"] + ":</td> \
211
+ <td><input type='text' name='f_spacing' size='5' value='" + f_spacing + "' /> &nbsp;" + i18n["Padding"] + ":\
212
+ <input type='text' name='f_padding' size='5' value='" + f_padding + "' /> &nbsp;&nbsp;" + i18n["pixels"] + "\
213
+ </td> \
214
+ </tr> \
215
+ </table> \
216
+ </fieldset> \
217
+ </td> \
218
+ </tr> \
219
+ <tr> \
220
+ <td> \
221
+ <fieldset><legend>Frame and borders</legend> \
222
+ <table width='100%'> \
223
+ <tr> \
224
+ <td class='label'>" + i18n["Borders"] + ":</td> \
225
+ <td><input name='f_borders' type='text' size='5' value='" + f_borders + "' /> &nbsp;&nbsp;" + i18n["pixels"] + "</td> \
226
+ </tr> \
227
+ <tr> \
228
+ <td class='label'>" + i18n["Frames"] + ":</td> \
229
+ <td> \
230
+ <select name='f_frames'> \
231
+ <option value='void'" + selected(f_frames == "void") + ">" + i18n["No sides"] + "</option> \
232
+ <option value='above'" + selected(f_frames == "above") + ">" + i18n["The top side only"] + "</option> \
233
+ <option value='below'" + selected(f_frames == "below") + ">" + i18n["The bottom side only"] + "</option> \
234
+ <option value='hsides'" + selected(f_frames == "hsides") + ">" + i18n["The top and bottom sides only"] + "</option> \
235
+ <option value='vsides'" + selected(f_frames == "vsides") + ">" + i18n["The right and left sides only"] + "</option> \
236
+ <option value='lhs'" + selected(f_frames == "lhs") + ">" + i18n["The left-hand side only"] + "</option> \
237
+ <option value='rhs'" + selected(f_frames == "rhs") + ">" + i18n["The right-hand side only"] + "</option> \
238
+ <option value='box'" + selected(f_frames == "box") + ">" + i18n["All four sides"] + "</option> \
239
+ </select> \
240
+ </td> \
241
+ </tr> \
242
+ <tr> \
243
+ <td class='label'>" + i18n["Rules"] + ":</td> \
244
+ <td> \
245
+ <select name='f_rules'> \
246
+ <option value='none'" + selected(f_rules == "none") + ">" + i18n["No rules"] + "</option> \
247
+ <option value='rows'" + selected(f_rules == "rows") + ">" + i18n["Rules will appear between rows only"] + "</option> \
248
+ <option value='cols'" + selected(f_rules == "cols") + ">" + i18n["Rules will appear between columns only"] + "</option> \
249
+ <option value='all'" + selected(f_rules == "all") + ">" + i18n["Rules will appear between all rows and columns"] + "</option> \
250
+ </select> \
251
+ </td> \
252
+ </tr> \
253
+ </table> \
254
+ </fieldset> \
255
+ </td> \
256
+ </tr> \
257
+ <tr> \
258
+ <td id='--HA-style'></td> \
259
+ </tr> \
260
+ </table> \
261
+ ";
262
+ var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, table);
263
+ var p = dialog.doc.getElementById("--HA-style");
264
+ p.appendChild(st_prop);
265
+ var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, table);
266
+ p = dialog.doc.getElementById("--HA-layout");
267
+ p.appendChild(st_layout);
268
+ dialog.modal = true;
269
+ dialog.addButtons("ok", "cancel");
270
+ dialog.showAtElement(dialog.editor._iframe, "c");
271
+ });
272
+ };
273
+
274
+ // this function requires the file PopupDiv/PopupWin to be loaded from browser
275
+ TableOperations.prototype.dialogRowCellProperties = function(cell) {
276
+ var i18n = TableOperations.I18N;
277
+ // retrieve existing values
278
+ var element = this.getClosest(cell ? "td" : "tr");
279
+ var table = this.getClosest("table");
280
+ // this.editor.selectNodeContents(element);
281
+ // this.editor.updateToolbar();
282
+
283
+ var dialog = new PopupWin(this.editor, i18n[cell ? "Cell Properties" : "Row Properties"], function(dialog, params) {
284
+ TableOperations.processStyle(params, element);
285
+ for (var i in params) {
286
+ var val = params[i];
287
+ switch (i) {
288
+ case "f_align":
289
+ element.align = val;
290
+ break;
291
+ case "f_char":
292
+ element.ch = val;
293
+ break;
294
+ case "f_valign":
295
+ element.vAlign = val;
296
+ break;
297
+ }
298
+ }
299
+ // various workarounds to refresh the table display (Gecko,
300
+ // what's going on?! do not disappoint me!)
301
+ dialog.editor.forceRedraw();
302
+ dialog.editor.focusEditor();
303
+ dialog.editor.updateToolbar();
304
+ var save_collapse = table.style.borderCollapse;
305
+ table.style.borderCollapse = "collapse";
306
+ table.style.borderCollapse = "separate";
307
+ table.style.borderCollapse = save_collapse;
308
+ },
309
+
310
+ // this function gets called when the dialog needs to be initialized
311
+ function (dialog) {
312
+
313
+ var f_align = element.align;
314
+ var f_valign = element.vAlign;
315
+ var f_char = element.ch;
316
+
317
+ function selected(val) {
318
+ return val ? " selected" : "";
319
+ };
320
+
321
+ // dialog contents
322
+ dialog.content.style.width = "400px";
323
+ dialog.content.innerHTML = " \
324
+ <div class='title'\
325
+ style='background: url(" + dialog.baseURL + dialog.editor.imgURL(cell ? "cell-prop.gif" : "row-prop.gif", "TableOperations") + ") #fff 98% 50% no-repeat'>" + i18n[cell ? "Cell Properties" : "Row Properties"] + "</div> \
326
+ <table style='width:100%'> \
327
+ <tr> \
328
+ <td id='--HA-layout'> \
329
+ "+// <fieldset><legend>" + i18n["Layout"] + "</legend> \
330
+ // <table style='width:100%'> \
331
+ // <tr> \
332
+ // <td class='label'>" + i18n["Align"] + ":</td> \
333
+ // <td> \
334
+ // <select name='f_align'> \
335
+ // <option value='left'" + selected(f_align == "left") + ">" + i18n["Left"] + "</option> \
336
+ // <option value='center'" + selected(f_align == "center") + ">" + i18n["Center"] + "</option> \
337
+ // <option value='right'" + selected(f_align == "right") + ">" + i18n["Right"] + "</option> \
338
+ // <option value='char'" + selected(f_align == "char") + ">" + i18n["Char"] + "</option> \
339
+ // </select> \
340
+ // &nbsp;&nbsp;" + i18n["Char"] + ": \
341
+ // <input type='text' style='font-family: monospace; text-align: center' name='f_char' size='1' value='" + f_char + "' /> \
342
+ // </td> \
343
+ // </tr><tr> \
344
+ // <td class='label'>" + i18n["Vertical align"] + ":</td> \
345
+ // <td> \
346
+ // <select name='f_valign'> \
347
+ // <option value='top'" + selected(f_valign == "top") + ">" + i18n["Top"] + "</option> \
348
+ // <option value='middle'" + selected(f_valign == "middle") + ">" + i18n["Middle"] + "</option> \
349
+ // <option value='bottom'" + selected(f_valign == "bottom") + ">" + i18n["Bottom"] + "</option> \
350
+ // <option value='baseline'" + selected(f_valign == "baseline") + ">" + i18n["Baseline"] + "</option> \
351
+ // </select> \
352
+ // </td> \
353
+ // </tr> \
354
+ // </table> \
355
+ // </fieldset> \
356
+ " </td> \
357
+ </tr> \
358
+ <tr> \
359
+ <td id='--HA-style'></td> \
360
+ </tr> \
361
+ </table> \
362
+ ";
363
+ var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, element);
364
+ var p = dialog.doc.getElementById("--HA-style");
365
+ p.appendChild(st_prop);
366
+ var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, element);
367
+ p = dialog.doc.getElementById("--HA-layout");
368
+ p.appendChild(st_layout);
369
+ dialog.modal = true;
370
+ dialog.addButtons("ok", "cancel");
371
+ dialog.showAtElement(dialog.editor._iframe, "c");
372
+ });
373
+ };
374
+
375
+ // this function gets called when some button from the TableOperations toolbar
376
+ // was pressed.
377
+ TableOperations.prototype.buttonPress = function(editor, button_id) {
378
+ this.editor = editor;
379
+ var mozbr = HTMLArea.is_gecko ? "<br />" : "";
380
+ var i18n = TableOperations.I18N;
381
+
382
+ // helper function that clears the content in a table row
383
+ function clearRow(tr) {
384
+ var tds = tr.getElementsByTagName("td");
385
+ for (var i = tds.length; --i >= 0;) {
386
+ var td = tds[i];
387
+ td.rowSpan = 1;
388
+ td.innerHTML = mozbr;
389
+ }
390
+ };
391
+
392
+ function splitRow(td) {
393
+ var n = parseInt("" + td.rowSpan);
394
+ var nc = parseInt("" + td.colSpan);
395
+ td.rowSpan = 1;
396
+ tr = td.parentNode;
397
+ var itr = tr.rowIndex;
398
+ var trs = tr.parentNode.rows;
399
+ var index = td.cellIndex;
400
+ while (--n > 0) {
401
+ tr = trs[++itr];
402
+ var otd = editor._doc.createElement("td");
403
+ otd.colSpan = td.colSpan;
404
+ otd.innerHTML = mozbr;
405
+ tr.insertBefore(otd, tr.cells[index]);
406
+ }
407
+ editor.forceRedraw();
408
+ editor.updateToolbar();
409
+ };
410
+
411
+ function splitCol(td) {
412
+ var nc = parseInt("" + td.colSpan);
413
+ td.colSpan = 1;
414
+ tr = td.parentNode;
415
+ var ref = td.nextSibling;
416
+ while (--nc > 0) {
417
+ var otd = editor._doc.createElement("td");
418
+ otd.rowSpan = td.rowSpan;
419
+ otd.innerHTML = mozbr;
420
+ tr.insertBefore(otd, ref);
421
+ }
422
+ editor.forceRedraw();
423
+ editor.updateToolbar();
424
+ };
425
+
426
+ function splitCell(td) {
427
+ var nc = parseInt("" + td.colSpan);
428
+ splitCol(td);
429
+ var items = td.parentNode.cells;
430
+ var index = td.cellIndex;
431
+ while (nc-- > 0) {
432
+ splitRow(items[index++]);
433
+ }
434
+ };
435
+
436
+ function selectNextNode(el) {
437
+ var node = el.nextSibling;
438
+ while (node && node.nodeType != 1) {
439
+ node = node.nextSibling;
440
+ }
441
+ if (!node) {
442
+ node = el.previousSibling;
443
+ while (node && node.nodeType != 1) {
444
+ node = node.previousSibling;
445
+ }
446
+ }
447
+ if (!node) {
448
+ node = el.parentNode;
449
+ }
450
+ editor.selectNodeContents(node);
451
+ };
452
+
453
+ switch (button_id) {
454
+ // ROWS
455
+
456
+ case "TO-row-insert-above":
457
+ case "TO-row-insert-under":
458
+ var tr = this.getClosest("tr");
459
+ if (!tr) {
460
+ break;
461
+ }
462
+ var otr = tr.cloneNode(true);
463
+ clearRow(otr);
464
+ tr.parentNode.insertBefore(otr, /under/.test(button_id) ? tr.nextSibling : tr);
465
+ editor.forceRedraw();
466
+ editor.focusEditor();
467
+ break;
468
+ case "TO-row-delete":
469
+ var tr = this.getClosest("tr");
470
+ if (!tr) {
471
+ break;
472
+ }
473
+ var par = tr.parentNode;
474
+ if (par.rows.length == 1) {
475
+ alert(i18n["not-del-last-row"]);
476
+ break;
477
+ }
478
+ // set the caret first to a position that doesn't
479
+ // disappear.
480
+ selectNextNode(tr);
481
+ par.removeChild(tr);
482
+ editor.forceRedraw();
483
+ editor.focusEditor();
484
+ editor.updateToolbar();
485
+ break;
486
+ case "TO-row-split":
487
+ var td = this.getClosest("td");
488
+ if (!td) {
489
+ break;
490
+ }
491
+ splitRow(td);
492
+ break;
493
+
494
+ // COLUMNS
495
+
496
+ case "TO-col-insert-before":
497
+ case "TO-col-insert-after":
498
+ var td = this.getClosest("td");
499
+ if (!td) {
500
+ break;
501
+ }
502
+ var rows = td.parentNode.parentNode.rows;
503
+ var index = td.cellIndex;
504
+ for (var i = rows.length; --i >= 0;) {
505
+ var tr = rows[i];
506
+ var ref = tr.cells[index + (/after/.test(button_id) ? 1 : 0)];
507
+ var otd = editor._doc.createElement("td");
508
+ otd.innerHTML = mozbr;
509
+ tr.insertBefore(otd, ref);
510
+ }
511
+ editor.focusEditor();
512
+ break;
513
+ case "TO-col-split":
514
+ var td = this.getClosest("td");
515
+ if (!td) {
516
+ break;
517
+ }
518
+ splitCol(td);
519
+ break;
520
+ case "TO-col-delete":
521
+ var td = this.getClosest("td");
522
+ if (!td) {
523
+ break;
524
+ }
525
+ var index = td.cellIndex;
526
+ if (td.parentNode.cells.length == 1) {
527
+ alert(i18n["not-del-last-col"]);
528
+ break;
529
+ }
530
+ // set the caret first to a position that doesn't disappear
531
+ selectNextNode(td);
532
+ var rows = td.parentNode.parentNode.rows;
533
+ for (var i = rows.length; --i >= 0;) {
534
+ var tr = rows[i];
535
+ tr.removeChild(tr.cells[index]);
536
+ }
537
+ editor.forceRedraw();
538
+ editor.focusEditor();
539
+ editor.updateToolbar();
540
+ break;
541
+
542
+ // CELLS
543
+
544
+ case "TO-cell-split":
545
+ var td = this.getClosest("td");
546
+ if (!td) {
547
+ break;
548
+ }
549
+ splitCell(td);
550
+ break;
551
+ case "TO-cell-insert-before":
552
+ case "TO-cell-insert-after":
553
+ var td = this.getClosest("td");
554
+ if (!td) {
555
+ break;
556
+ }
557
+ var tr = td.parentNode;
558
+ var otd = editor._doc.createElement("td");
559
+ otd.innerHTML = mozbr;
560
+ tr.insertBefore(otd, /after/.test(button_id) ? td.nextSibling : td);
561
+ editor.forceRedraw();
562
+ editor.focusEditor();
563
+ break;
564
+ case "TO-cell-delete":
565
+ var td = this.getClosest("td");
566
+ if (!td) {
567
+ break;
568
+ }
569
+ if (td.parentNode.cells.length == 1) {
570
+ alert(i18n["not-del-last-cell"]);
571
+ break;
572
+ }
573
+ // set the caret first to a position that doesn't disappear
574
+ selectNextNode(td);
575
+ td.parentNode.removeChild(td);
576
+ editor.forceRedraw();
577
+ editor.updateToolbar();
578
+ break;
579
+ case "TO-cell-merge":
580
+ // !! FIXME: Mozilla specific !!
581
+ var sel = editor._getSelection();
582
+ var range, i = 0;
583
+ var rows = [];
584
+ var row = null;
585
+ var cells = null;
586
+ if (!HTMLArea.is_ie) {
587
+ try {
588
+ while (range = sel.getRangeAt(i++)) {
589
+ var td = range.startContainer.childNodes[range.startOffset];
590
+ if (td.parentNode != row) {
591
+ row = td.parentNode;
592
+ (cells) && rows.push(cells);
593
+ cells = [];
594
+ }
595
+ cells.push(td);
596
+ }
597
+ } catch(e) {/* finished walking through selection */}
598
+ rows.push(cells);
599
+ } else {
600
+ // Internet Explorer "browser"
601
+ var td = this.getClosest("td");
602
+ if (!td) {
603
+ alert(i18n["Please click into some cell"]);
604
+ break;
605
+ }
606
+ var tr = td.parentElement;
607
+ var no_cols = prompt(i18n["How many columns would you like to merge?"], 2);
608
+ if (!no_cols) {
609
+ // cancelled
610
+ break;
611
+ }
612
+ var no_rows = prompt(i18n["How many rows would you like to merge?"], 2);
613
+ if (!no_rows) {
614
+ // cancelled
615
+ break;
616
+ }
617
+ var cell_index = td.cellIndex;
618
+ while (no_rows-- > 0) {
619
+ td = tr.cells[cell_index];
620
+ cells = [td];
621
+ for (var i = 1; i < no_cols; ++i) {
622
+ td = td.nextSibling;
623
+ if (!td) {
624
+ break;
625
+ }
626
+ cells.push(td);
627
+ }
628
+ rows.push(cells);
629
+ tr = tr.nextSibling;
630
+ if (!tr) {
631
+ break;
632
+ }
633
+ }
634
+ }
635
+ var HTML = "";
636
+ for (i = 0; i < rows.length; ++i) {
637
+ // i && (HTML += "<br />");
638
+ var cells = rows[i];
639
+ for (var j = 0; j < cells.length; ++j) {
640
+ // j && (HTML += "&nbsp;");
641
+ var cell = cells[j];
642
+ HTML += cell.innerHTML;
643
+ (i || j) && (cell.parentNode.removeChild(cell));
644
+ }
645
+ }
646
+ var td = rows[0][0];
647
+ td.innerHTML = HTML;
648
+ td.rowSpan = rows.length;
649
+ td.colSpan = rows[0].length;
650
+ editor.selectNodeContents(td);
651
+ editor.forceRedraw();
652
+ editor.focusEditor();
653
+ break;
654
+
655
+ // PROPERTIES
656
+
657
+ case "TO-table-prop":
658
+ this.dialogTableProperties();
659
+ break;
660
+
661
+ case "TO-row-prop":
662
+ this.dialogRowCellProperties(false);
663
+ break;
664
+
665
+ case "TO-cell-prop":
666
+ this.dialogRowCellProperties(true);
667
+ break;
668
+
669
+ default:
670
+ alert("Button [" + button_id + "] not yet implemented");
671
+ }
672
+ };
673
+
674
+ // the list of buttons added by this plugin
675
+ TableOperations.btnList = [
676
+ // table properties button
677
+ ["table-prop", "table"],
678
+ null, // separator
679
+
680
+ // ROWS
681
+ ["row-prop", "tr"],
682
+ ["row-insert-above", "tr"],
683
+ ["row-insert-under", "tr"],
684
+ ["row-delete", "tr"],
685
+ ["row-split", "td[rowSpan!=1]"],
686
+ null,
687
+
688
+ // COLS
689
+ ["col-insert-before", "td"],
690
+ ["col-insert-after", "td"],
691
+ ["col-delete", "td"],
692
+ ["col-split", "td[colSpan!=1]"],
693
+ null,
694
+
695
+ // CELLS
696
+ ["cell-prop", "td"],
697
+ ["cell-insert-before", "td"],
698
+ ["cell-insert-after", "td"],
699
+ ["cell-delete", "td"],
700
+ ["cell-merge", "tr"],
701
+ ["cell-split", "td[colSpan!=1,rowSpan!=1]"]
702
+ ];
703
+
704
+
705
+
706
+ //// GENERIC CODE [style of any element; this should be moved into a separate
707
+ //// file as it'll be very useful]
708
+ //// BEGIN GENERIC CODE -----------------------------------------------------
709
+
710
+ TableOperations.getLength = function(value) {
711
+ var len = parseInt(value);
712
+ if (isNaN(len)) {
713
+ len = "";
714
+ }
715
+ return len;
716
+ };
717
+
718
+ // Applies the style found in "params" to the given element.
719
+ TableOperations.processStyle = function(params, element) {
720
+ var style = element.style;
721
+ for (var i in params) {
722
+ var val = params[i];
723
+ switch (i) {
724
+ case "f_st_backgroundColor":
725
+ style.backgroundColor = val;
726
+ break;
727
+ case "f_st_color":
728
+ style.color = val;
729
+ break;
730
+ case "f_st_backgroundImage":
731
+ if (/\S/.test(val)) {
732
+ style.backgroundImage = "url(" + val + ")";
733
+ } else {
734
+ style.backgroundImage = "none";
735
+ }
736
+ break;
737
+ case "f_st_borderWidth":
738
+ style.borderWidth = val;
739
+ break;
740
+ case "f_st_borderStyle":
741
+ style.borderStyle = val;
742
+ break;
743
+ case "f_st_borderColor":
744
+ style.borderColor = val;
745
+ break;
746
+ case "f_st_borderCollapse":
747
+ style.borderCollapse = val ? "collapse" : "";
748
+ break;
749
+ case "f_st_width":
750
+ if (/\S/.test(val)) {
751
+ style.width = val + params["f_st_widthUnit"];
752
+ } else {
753
+ style.width = "";
754
+ }
755
+ break;
756
+ case "f_st_height":
757
+ if (/\S/.test(val)) {
758
+ style.height = val + params["f_st_heightUnit"];
759
+ } else {
760
+ style.height = "";
761
+ }
762
+ break;
763
+ case "f_st_textAlign":
764
+ if (val == "char") {
765
+ var ch = params["f_st_textAlignChar"];
766
+ if (ch == '"') {
767
+ ch = '\\"';
768
+ }
769
+ style.textAlign = '"' + ch + '"';
770
+ } else {
771
+ style.textAlign = val;
772
+ }
773
+ break;
774
+ case "f_st_verticalAlign":
775
+ style.verticalAlign = val;
776
+ break;
777
+ case "f_st_float":
778
+ style.cssFloat = val;
779
+ break;
780
+ // case "f_st_margin":
781
+ // style.margin = val + "px";
782
+ // break;
783
+ // case "f_st_padding":
784
+ // style.padding = val + "px";
785
+ // break;
786
+ }
787
+ }
788
+ };
789
+
790
+ // Returns an HTML element for a widget that allows color selection. That is,
791
+ // a button that contains the given color, if any, and when pressed will popup
792
+ // the sooner-or-later-to-be-rewritten select_color.html dialog allowing user
793
+ // to select some color. If a color is selected, an input field with the name
794
+ // "f_st_"+name will be updated with the color value in #123456 format.
795
+ TableOperations.createColorButton = function(doc, editor, color, name) {
796
+ if (!color) {
797
+ color = "";
798
+ } else if (!/#/.test(color)) {
799
+ color = HTMLArea._colorToRgb(color);
800
+ }
801
+
802
+ var df = doc.createElement("span");
803
+ var field = doc.createElement("input");
804
+ field.type = "hidden";
805
+ df.appendChild(field);
806
+ field.name = "f_st_" + name;
807
+ field.value = color;
808
+ var button = doc.createElement("span");
809
+ button.className = "buttonColor";
810
+ df.appendChild(button);
811
+ var span = doc.createElement("span");
812
+ span.className = "chooser";
813
+ // span.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
814
+ span.style.backgroundColor = color;
815
+ button.appendChild(span);
816
+ button.onmouseover = function() { if (!this.disabled) { this.className += " buttonColor-hilite"; }};
817
+ button.onmouseout = function() { if (!this.disabled) { this.className = "buttonColor"; }};
818
+ span.onclick = function() {
819
+ if (this.parentNode.disabled) {
820
+ return false;
821
+ }
822
+ editor._popupDialog("select_color.html", function(color) {
823
+ if (color) {
824
+ span.style.backgroundColor = "#" + color;
825
+ field.value = "#" + color;
826
+ }
827
+ }, color);
828
+ };
829
+ var span2 = doc.createElement("span");
830
+ span2.innerHTML = "&#x00d7;";
831
+ span2.className = "nocolor";
832
+ span2.title = TableOperations.I18N["Unset color"];
833
+ button.appendChild(span2);
834
+ span2.onmouseover = function() { if (!this.parentNode.disabled) { this.className += " nocolor-hilite"; }};
835
+ span2.onmouseout = function() { if (!this.parentNode.disabled) { this.className = "nocolor"; }};
836
+ span2.onclick = function() {
837
+ span.style.backgroundColor = "";
838
+ field.value = "";
839
+ };
840
+ return df;
841
+ };
842
+
843
+ TableOperations.createStyleLayoutFieldset = function(doc, editor, el) {
844
+ var i18n = TableOperations.I18N;
845
+ var fieldset = doc.createElement("fieldset");
846
+ var legend = doc.createElement("legend");
847
+ fieldset.appendChild(legend);
848
+ legend.innerHTML = i18n["Layout"];
849
+ var table = doc.createElement("table");
850
+ fieldset.appendChild(table);
851
+ table.style.width = "100%";
852
+ var tbody = doc.createElement("tbody");
853
+ table.appendChild(tbody);
854
+
855
+ var tagname = el.tagName.toLowerCase();
856
+ var tr, td, input, select, option, options, i;
857
+
858
+ if (tagname != "td" && tagname != "tr" && tagname != "th") {
859
+ tr = doc.createElement("tr");
860
+ tbody.appendChild(tr);
861
+ td = doc.createElement("td");
862
+ td.className = "label";
863
+ tr.appendChild(td);
864
+ td.innerHTML = i18n["Float"] + ":";
865
+ td = doc.createElement("td");
866
+ tr.appendChild(td);
867
+ select = doc.createElement("select");
868
+ td.appendChild(select);
869
+ select.name = "f_st_float";
870
+ options = ["None", "Left", "Right"];
871
+ for (i in options) {
872
+ var Val = options[i];
873
+ var val = options[i].toLowerCase();
874
+ option = doc.createElement("option");
875
+ option.innerHTML = i18n[Val];
876
+ option.value = val;
877
+ option.selected = (("" + el.style.cssFloat).toLowerCase() == val);
878
+ select.appendChild(option);
879
+ }
880
+ }
881
+
882
+ tr = doc.createElement("tr");
883
+ tbody.appendChild(tr);
884
+ td = doc.createElement("td");
885
+ td.className = "label";
886
+ tr.appendChild(td);
887
+ td.innerHTML = i18n["Width"] + ":";
888
+ td = doc.createElement("td");
889
+ tr.appendChild(td);
890
+ input = doc.createElement("input");
891
+ input.type = "text";
892
+ input.value = TableOperations.getLength(el.style.width);
893
+ input.size = "5";
894
+ input.name = "f_st_width";
895
+ input.style.marginRight = "0.5em";
896
+ td.appendChild(input);
897
+ select = doc.createElement("select");
898
+ select.name = "f_st_widthUnit";
899
+ option = doc.createElement("option");
900
+ option.innerHTML = i18n["percent"];
901
+ option.value = "%";
902
+ option.selected = /%/.test(el.style.width);
903
+ select.appendChild(option);
904
+ option = doc.createElement("option");
905
+ option.innerHTML = i18n["pixels"];
906
+ option.value = "px";
907
+ option.selected = /px/.test(el.style.width);
908
+ select.appendChild(option);
909
+ td.appendChild(select);
910
+
911
+ select.style.marginRight = "0.5em";
912
+ td.appendChild(doc.createTextNode(i18n["Text align"] + ":"));
913
+ select = doc.createElement("select");
914
+ select.style.marginLeft = select.style.marginRight = "0.5em";
915
+ td.appendChild(select);
916
+ select.name = "f_st_textAlign";
917
+ options = ["Left", "Center", "Right", "Justify"];
918
+ if (tagname == "td") {
919
+ options.push("Char");
920
+ }
921
+ input = doc.createElement("input");
922
+ input.name = "f_st_textAlignChar";
923
+ input.size = "1";
924
+ input.style.fontFamily = "monospace";
925
+ td.appendChild(input);
926
+ for (i in options) {
927
+ var Val = options[i];
928
+ var val = Val.toLowerCase();
929
+ option = doc.createElement("option");
930
+ option.value = val;
931
+ option.innerHTML = i18n[Val];
932
+ option.selected = (el.style.textAlign.toLowerCase() == val);
933
+ select.appendChild(option);
934
+ }
935
+ function setCharVisibility(value) {
936
+ input.style.visibility = value ? "visible" : "hidden";
937
+ if (value) {
938
+ input.focus();
939
+ input.select();
940
+ }
941
+ };
942
+ select.onchange = function() { setCharVisibility(this.value == "char"); };
943
+ setCharVisibility(select.value == "char");
944
+
945
+ tr = doc.createElement("tr");
946
+ tbody.appendChild(tr);
947
+ td = doc.createElement("td");
948
+ td.className = "label";
949
+ tr.appendChild(td);
950
+ td.innerHTML = i18n["Height"] + ":";
951
+ td = doc.createElement("td");
952
+ tr.appendChild(td);
953
+ input = doc.createElement("input");
954
+ input.type = "text";
955
+ input.value = TableOperations.getLength(el.style.height);
956
+ input.size = "5";
957
+ input.name = "f_st_height";
958
+ input.style.marginRight = "0.5em";
959
+ td.appendChild(input);
960
+ select = doc.createElement("select");
961
+ select.name = "f_st_heightUnit";
962
+ option = doc.createElement("option");
963
+ option.innerHTML = i18n["percent"];
964
+ option.value = "%";
965
+ option.selected = /%/.test(el.style.height);
966
+ select.appendChild(option);
967
+ option = doc.createElement("option");
968
+ option.innerHTML = i18n["pixels"];
969
+ option.value = "px";
970
+ option.selected = /px/.test(el.style.height);
971
+ select.appendChild(option);
972
+ td.appendChild(select);
973
+
974
+ select.style.marginRight = "0.5em";
975
+ td.appendChild(doc.createTextNode(i18n["Vertical align"] + ":"));
976
+ select = doc.createElement("select");
977
+ select.name = "f_st_verticalAlign";
978
+ select.style.marginLeft = "0.5em";
979
+ td.appendChild(select);
980
+ options = ["Top", "Middle", "Bottom", "Baseline"];
981
+ for (i in options) {
982
+ var Val = options[i];
983
+ var val = Val.toLowerCase();
984
+ option = doc.createElement("option");
985
+ option.value = val;
986
+ option.innerHTML = i18n[Val];
987
+ option.selected = (el.style.verticalAlign.toLowerCase() == val);
988
+ select.appendChild(option);
989
+ }
990
+
991
+ return fieldset;
992
+ };
993
+
994
+ // Returns an HTML element containing the style attributes for the given
995
+ // element. This can be easily embedded into any dialog; the functionality is
996
+ // also provided.
997
+ TableOperations.createStyleFieldset = function(doc, editor, el) {
998
+ var i18n = TableOperations.I18N;
999
+ var fieldset = doc.createElement("fieldset");
1000
+ var legend = doc.createElement("legend");
1001
+ fieldset.appendChild(legend);
1002
+ legend.innerHTML = i18n["CSS Style"];
1003
+ var table = doc.createElement("table");
1004
+ fieldset.appendChild(table);
1005
+ table.style.width = "100%";
1006
+ var tbody = doc.createElement("tbody");
1007
+ table.appendChild(tbody);
1008
+
1009
+ var tr, td, input, select, option, options, i;
1010
+
1011
+ tr = doc.createElement("tr");
1012
+ tbody.appendChild(tr);
1013
+ td = doc.createElement("td");
1014
+ tr.appendChild(td);
1015
+ td.className = "label";
1016
+ td.innerHTML = i18n["Background"] + ":";
1017
+ td = doc.createElement("td");
1018
+ tr.appendChild(td);
1019
+ var df = TableOperations.createColorButton(doc, editor, el.style.backgroundColor, "backgroundColor");
1020
+ df.firstChild.nextSibling.style.marginRight = "0.5em";
1021
+ td.appendChild(df);
1022
+ td.appendChild(doc.createTextNode(i18n["Image URL"] + ": "));
1023
+ input = doc.createElement("input");
1024
+ input.type = "text";
1025
+ input.name = "f_st_backgroundImage";
1026
+ if (el.style.backgroundImage.match(/url\(\s*(.*?)\s*\)/)) {
1027
+ input.value = RegExp.$1;
1028
+ }
1029
+ // input.style.width = "100%";
1030
+ td.appendChild(input);
1031
+
1032
+ tr = doc.createElement("tr");
1033
+ tbody.appendChild(tr);
1034
+ td = doc.createElement("td");
1035
+ tr.appendChild(td);
1036
+ td.className = "label";
1037
+ td.innerHTML = i18n["FG Color"] + ":";
1038
+ td = doc.createElement("td");
1039
+ tr.appendChild(td);
1040
+ td.appendChild(TableOperations.createColorButton(doc, editor, el.style.color, "color"));
1041
+
1042
+ // for better alignment we include an invisible field.
1043
+ input = doc.createElement("input");
1044
+ input.style.visibility = "hidden";
1045
+ input.type = "text";
1046
+ td.appendChild(input);
1047
+
1048
+ tr = doc.createElement("tr");
1049
+ tbody.appendChild(tr);
1050
+ td = doc.createElement("td");
1051
+ tr.appendChild(td);
1052
+ td.className = "label";
1053
+ td.innerHTML = i18n["Border"] + ":";
1054
+ td = doc.createElement("td");
1055
+ tr.appendChild(td);
1056
+
1057
+ var colorButton = TableOperations.createColorButton(doc, editor, el.style.borderColor, "borderColor");
1058
+ var btn = colorButton.firstChild.nextSibling;
1059
+ td.appendChild(colorButton);
1060
+ // borderFields.push(btn);
1061
+ btn.style.marginRight = "0.5em";
1062
+
1063
+ select = doc.createElement("select");
1064
+ var borderFields = [];
1065
+ td.appendChild(select);
1066
+ select.name = "f_st_borderStyle";
1067
+ options = ["none", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"];
1068
+ var currentBorderStyle = el.style.borderStyle;
1069
+ // Gecko reports "solid solid solid solid" for "border-style: solid".
1070
+ // That is, "top right bottom left" -- we only consider the first
1071
+ // value.
1072
+ (currentBorderStyle.match(/([^\s]*)\s/)) && (currentBorderStyle = RegExp.$1);
1073
+ for (i in options) {
1074
+ var val = options[i];
1075
+ option = doc.createElement("option");
1076
+ option.value = val;
1077
+ option.innerHTML = val;
1078
+ (val == currentBorderStyle) && (option.selected = true);
1079
+ select.appendChild(option);
1080
+ }
1081
+ select.style.marginRight = "0.5em";
1082
+ function setBorderFieldsStatus(value) {
1083
+ for (i in borderFields) {
1084
+ var el = borderFields[i];
1085
+ el.style.visibility = value ? "hidden" : "visible";
1086
+ if (!value && (el.tagName.toLowerCase() == "input")) {
1087
+ el.focus();
1088
+ el.select();
1089
+ }
1090
+ }
1091
+ };
1092
+ select.onchange = function() { setBorderFieldsStatus(this.value == "none"); };
1093
+
1094
+ input = doc.createElement("input");
1095
+ borderFields.push(input);
1096
+ input.type = "text";
1097
+ input.name = "f_st_borderWidth";
1098
+ input.value = TableOperations.getLength(el.style.borderWidth);
1099
+ input.size = "5";
1100
+ td.appendChild(input);
1101
+ input.style.marginRight = "0.5em";
1102
+ var span = doc.createElement("span");
1103
+ span.innerHTML = i18n["pixels"];
1104
+ td.appendChild(span);
1105
+ borderFields.push(span);
1106
+
1107
+ setBorderFieldsStatus(select.value == "none");
1108
+
1109
+ if (el.tagName.toLowerCase() == "table") {
1110
+ // the border-collapse style is only for tables
1111
+ tr = doc.createElement("tr");
1112
+ tbody.appendChild(tr);
1113
+ td = doc.createElement("td");
1114
+ td.className = "label";
1115
+ tr.appendChild(td);
1116
+ input = doc.createElement("input");
1117
+ input.type = "checkbox";
1118
+ input.name = "f_st_borderCollapse";
1119
+ input.id = "f_st_borderCollapse";
1120
+ var val = (/collapse/i.test(el.style.borderCollapse));
1121
+ input.checked = val ? 1 : 0;
1122
+ td.appendChild(input);
1123
+
1124
+ td = doc.createElement("td");
1125
+ tr.appendChild(td);
1126
+ var label = doc.createElement("label");
1127
+ label.htmlFor = "f_st_borderCollapse";
1128
+ label.innerHTML = i18n["Collapsed borders"];
1129
+ td.appendChild(label);
1130
+ }
1131
+
1132
+ // tr = doc.createElement("tr");
1133
+ // tbody.appendChild(tr);
1134
+ // td = doc.createElement("td");
1135
+ // td.className = "label";
1136
+ // tr.appendChild(td);
1137
+ // td.innerHTML = i18n["Margin"] + ":";
1138
+ // td = doc.createElement("td");
1139
+ // tr.appendChild(td);
1140
+ // input = doc.createElement("input");
1141
+ // input.type = "text";
1142
+ // input.size = "5";
1143
+ // input.name = "f_st_margin";
1144
+ // td.appendChild(input);
1145
+ // input.style.marginRight = "0.5em";
1146
+ // td.appendChild(doc.createTextNode(i18n["Padding"] + ":"));
1147
+
1148
+ // input = doc.createElement("input");
1149
+ // input.type = "text";
1150
+ // input.size = "5";
1151
+ // input.name = "f_st_padding";
1152
+ // td.appendChild(input);
1153
+ // input.style.marginLeft = "0.5em";
1154
+ // input.style.marginRight = "0.5em";
1155
+ // td.appendChild(doc.createTextNode(i18n["pixels"]));
1156
+
1157
+ return fieldset;
1158
+ };
1159
+
1160
+ //// END GENERIC CODE -------------------------------------------------------