qwikdoc 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/CHANGES +3 -0
  4. data/COPYING +340 -0
  5. data/Gemfile +3 -0
  6. data/README.md +10 -0
  7. data/Rakefile +10 -0
  8. data/TextFormattingRules +137 -0
  9. data/TextFormattingRules.ja +143 -0
  10. data/bin/qwikdoc +34 -0
  11. data/lib/qwik_doc.rb +15 -0
  12. data/lib/qwik_doc/hack.rb +184 -0
  13. data/qwikdoc.gemspec +26 -0
  14. data/spec/qwik_doc_spec.rb +305 -0
  15. data/spec/spec_helper.rb +12 -0
  16. data/vendor/qwik/Makefile +63 -0
  17. data/vendor/qwik/Rakefile +17 -0
  18. data/vendor/qwik/act-aa.rb +83 -0
  19. data/vendor/qwik/act-archive.rb +386 -0
  20. data/vendor/qwik/act-attach.rb +304 -0
  21. data/vendor/qwik/act-backup.rb +236 -0
  22. data/vendor/qwik/act-basic.rb +325 -0
  23. data/vendor/qwik/act-book.rb +161 -0
  24. data/vendor/qwik/act-calc.rb +371 -0
  25. data/vendor/qwik/act-charset.rb +251 -0
  26. data/vendor/qwik/act-christel.rb +112 -0
  27. data/vendor/qwik/act-chronology.rb +149 -0
  28. data/vendor/qwik/act-code.rb +155 -0
  29. data/vendor/qwik/act-comment.rb +554 -0
  30. data/vendor/qwik/act-config.rb +49 -0
  31. data/vendor/qwik/act-counter.rb +125 -0
  32. data/vendor/qwik/act-day.rb +96 -0
  33. data/vendor/qwik/act-describe.rb +135 -0
  34. data/vendor/qwik/act-diary.rb +109 -0
  35. data/vendor/qwik/act-edit.rb +317 -0
  36. data/vendor/qwik/act-embed-html.rb +296 -0
  37. data/vendor/qwik/act-emode.rb +150 -0
  38. data/vendor/qwik/act-event.rb +187 -0
  39. data/vendor/qwik/act-file.rb +303 -0
  40. data/vendor/qwik/act-files.rb +771 -0
  41. data/vendor/qwik/act-getpass.rb +295 -0
  42. data/vendor/qwik/act-history.rb +136 -0
  43. data/vendor/qwik/act-html.rb +204 -0
  44. data/vendor/qwik/act-httpauth.rb +147 -0
  45. data/vendor/qwik/act-include.rb +142 -0
  46. data/vendor/qwik/act-interwiki.rb +189 -0
  47. data/vendor/qwik/act-isearch.rb +109 -0
  48. data/vendor/qwik/act-keywords.rb +137 -0
  49. data/vendor/qwik/act-lang.rb +81 -0
  50. data/vendor/qwik/act-license.rb +63 -0
  51. data/vendor/qwik/act-list.rb +287 -0
  52. data/vendor/qwik/act-login.rb +410 -0
  53. data/vendor/qwik/act-logout.rb +60 -0
  54. data/vendor/qwik/act-mail.rb +159 -0
  55. data/vendor/qwik/act-map.rb +292 -0
  56. data/vendor/qwik/act-md5.rb +42 -0
  57. data/vendor/qwik/act-mdlb.rb +741 -0
  58. data/vendor/qwik/act-media.rb +416 -0
  59. data/vendor/qwik/act-member.rb +157 -0
  60. data/vendor/qwik/act-menu.rb +142 -0
  61. data/vendor/qwik/act-metadata.rb +323 -0
  62. data/vendor/qwik/act-mlsubmitform.rb +49 -0
  63. data/vendor/qwik/act-monitor.rb +167 -0
  64. data/vendor/qwik/act-new.rb +418 -0
  65. data/vendor/qwik/act-pagelist.rb +248 -0
  66. data/vendor/qwik/act-password.rb +145 -0
  67. data/vendor/qwik/act-plan.rb +210 -0
  68. data/vendor/qwik/act-povray.rb +230 -0
  69. data/vendor/qwik/act-presen.rb +380 -0
  70. data/vendor/qwik/act-redirect.rb +133 -0
  71. data/vendor/qwik/act-ring.rb +1071 -0
  72. data/vendor/qwik/act-rrefs.rb +255 -0
  73. data/vendor/qwik/act-ruby.rb +116 -0
  74. data/vendor/qwik/act-sample.rb +170 -0
  75. data/vendor/qwik/act-save.rb +295 -0
  76. data/vendor/qwik/act-schedule.rb +374 -0
  77. data/vendor/qwik/act-search.rb +180 -0
  78. data/vendor/qwik/act-searchwords.rb +51 -0
  79. data/vendor/qwik/act-sendpass.rb +83 -0
  80. data/vendor/qwik/act-site.rb +89 -0
  81. data/vendor/qwik/act-sitebackup.rb +419 -0
  82. data/vendor/qwik/act-sitelog.rb +118 -0
  83. data/vendor/qwik/act-smil.rb +299 -0
  84. data/vendor/qwik/act-status.rb +220 -0
  85. data/vendor/qwik/act-style.rb +608 -0
  86. data/vendor/qwik/act-table.rb +263 -0
  87. data/vendor/qwik/act-tableform.rb +241 -0
  88. data/vendor/qwik/act-tag.rb +103 -0
  89. data/vendor/qwik/act-text.rb +70 -0
  90. data/vendor/qwik/act-textarea.rb +164 -0
  91. data/vendor/qwik/act-theme.rb +346 -0
  92. data/vendor/qwik/act-toc.rb +112 -0
  93. data/vendor/qwik/act-typekey.rb +198 -0
  94. data/vendor/qwik/act-under-const.rb +94 -0
  95. data/vendor/qwik/act-webservice.rb +321 -0
  96. data/vendor/qwik/act-wema.rb +558 -0
  97. data/vendor/qwik/act-wysiwyg.rb +238 -0
  98. data/vendor/qwik/action.rb +325 -0
  99. data/vendor/qwik/autoreload.rb +98 -0
  100. data/vendor/qwik/bench-bench.rb +28 -0
  101. data/vendor/qwik/bench-emode.rb +47 -0
  102. data/vendor/qwik/bench-format-xml.rb +70 -0
  103. data/vendor/qwik/bench-large-table.rb +62 -0
  104. data/vendor/qwik/bench-md5.rb +14 -0
  105. data/vendor/qwik/bench-module-session.rb +19 -0
  106. data/vendor/qwik/bench-page.rb +50 -0
  107. data/vendor/qwik/bench-s-md5.rb +28 -0
  108. data/vendor/qwik/bench-session.rb +25 -0
  109. data/vendor/qwik/bench-textformat.rb +31 -0
  110. data/vendor/qwik/catalog-factory.rb +91 -0
  111. data/vendor/qwik/catalog-ja.rb +479 -0
  112. data/vendor/qwik/catalog-ml-ja.rb +145 -0
  113. data/vendor/qwik/check-act-monitor.rb +112 -0
  114. data/vendor/qwik/check-act-monitor2.rb +46 -0
  115. data/vendor/qwik/check-act-theme.rb +27 -0
  116. data/vendor/qwik/check-event.rb +112 -0
  117. data/vendor/qwik/check-event2.rb +55 -0
  118. data/vendor/qwik/check-htree-rexml.rb +77 -0
  119. data/vendor/qwik/check-htree.rb +51 -0
  120. data/vendor/qwik/check-libxml.rb +135 -0
  121. data/vendor/qwik/check-many-pages.rb +47 -0
  122. data/vendor/qwik/check-monitor.rb +33 -0
  123. data/vendor/qwik/check-observer.rb +67 -0
  124. data/vendor/qwik/check-server.rb +61 -0
  125. data/vendor/qwik/check-uuencode.rb +33 -0
  126. data/vendor/qwik/check-webdav.rb +65 -0
  127. data/vendor/qwik/check-xml-xpath.rb +27 -0
  128. data/vendor/qwik/common-backtrace.rb +94 -0
  129. data/vendor/qwik/common-basic.rb +111 -0
  130. data/vendor/qwik/common-condition.rb +142 -0
  131. data/vendor/qwik/common-error.rb +48 -0
  132. data/vendor/qwik/common-gettext.rb +50 -0
  133. data/vendor/qwik/common-javascript.rb +45 -0
  134. data/vendor/qwik/common-notice.rb +132 -0
  135. data/vendor/qwik/common-plain.rb +105 -0
  136. data/vendor/qwik/common-plugin.rb +111 -0
  137. data/vendor/qwik/common-res.rb +76 -0
  138. data/vendor/qwik/common-resolve.rb +92 -0
  139. data/vendor/qwik/common-send.rb +171 -0
  140. data/vendor/qwik/common-session.rb +139 -0
  141. data/vendor/qwik/common-surface.rb +261 -0
  142. data/vendor/qwik/common-url.rb +90 -0
  143. data/vendor/qwik/compat/Makefile +12 -0
  144. data/vendor/qwik/compat/add_load_path.rb +1 -0
  145. data/vendor/qwik/config.rb +299 -0
  146. data/vendor/qwik/db-b-backup.rb +142 -0
  147. data/vendor/qwik/db-backup.rb +184 -0
  148. data/vendor/qwik/db-berkeley.rb +306 -0
  149. data/vendor/qwik/db-filesystem.rb +305 -0
  150. data/vendor/qwik/db-indexer.rb +154 -0
  151. data/vendor/qwik/db-searchwords.rb +238 -0
  152. data/vendor/qwik/description-ja.rb +267 -0
  153. data/vendor/qwik/description.rb +256 -0
  154. data/vendor/qwik/dev-add-copyright.rb +23 -0
  155. data/vendor/qwik/dev-backup.rb +24 -0
  156. data/vendor/qwik/dev-bench.rb +175 -0
  157. data/vendor/qwik/dev-calctime.rb +52 -0
  158. data/vendor/qwik/dev-css-compressor.rb +60 -0
  159. data/vendor/qwik/dev-extract-catalog.rb +102 -0
  160. data/vendor/qwik/dev-js-compressor.rb +73 -0
  161. data/vendor/qwik/dev-release.rb +235 -0
  162. data/vendor/qwik/dev-replace.rb +353 -0
  163. data/vendor/qwik/dev-sendmail.rb +25 -0
  164. data/vendor/qwik/farm.rb +283 -0
  165. data/vendor/qwik/gettext.rb +56 -0
  166. data/vendor/qwik/group-cond.rb +157 -0
  167. data/vendor/qwik/group-config.rb +247 -0
  168. data/vendor/qwik/group-confirm.rb +147 -0
  169. data/vendor/qwik/group-db.rb +326 -0
  170. data/vendor/qwik/group-mail.rb +195 -0
  171. data/vendor/qwik/group-member.rb +307 -0
  172. data/vendor/qwik/group-sendmail.rb +231 -0
  173. data/vendor/qwik/group-site.rb +374 -0
  174. data/vendor/qwik/group-sweep.rb +63 -0
  175. data/vendor/qwik/group.rb +157 -0
  176. data/vendor/qwik/helper.rb +6 -0
  177. data/vendor/qwik/html-generator.rb +104 -0
  178. data/vendor/qwik/html-to-wabisabi.rb +149 -0
  179. data/vendor/qwik/htree-diff.rb +87 -0
  180. data/vendor/qwik/htree-format-xml.rb +57 -0
  181. data/vendor/qwik/htree-generator.rb +144 -0
  182. data/vendor/qwik/htree-get.rb +251 -0
  183. data/vendor/qwik/htree-html-generator.rb +179 -0
  184. data/vendor/qwik/htree-template.rb +263 -0
  185. data/vendor/qwik/htree-to-wabisabi.rb +171 -0
  186. data/vendor/qwik/loadlib.rb +79 -0
  187. data/vendor/qwik/logger.rb +115 -0
  188. data/vendor/qwik/mail-body.rb +171 -0
  189. data/vendor/qwik/mail-header.rb +474 -0
  190. data/vendor/qwik/mail-multipart.rb +193 -0
  191. data/vendor/qwik/mail-parse.rb +147 -0
  192. data/vendor/qwik/mail.rb +341 -0
  193. data/vendor/qwik/mailaddress.rb +83 -0
  194. data/vendor/qwik/mdlb-model.rb +81 -0
  195. data/vendor/qwik/mdlb-sample.rb +324 -0
  196. data/vendor/qwik/ml-catalog-factory.rb +27 -0
  197. data/vendor/qwik/ml-exception.rb +15 -0
  198. data/vendor/qwik/ml-generator.rb +28 -0
  199. data/vendor/qwik/ml-gettext.rb +137 -0
  200. data/vendor/qwik/ml-logger.rb +82 -0
  201. data/vendor/qwik/ml-memory.rb +65 -0
  202. data/vendor/qwik/ml-msg-validator.rb +86 -0
  203. data/vendor/qwik/ml-processor.rb +609 -0
  204. data/vendor/qwik/ml-quickml-server.rb +122 -0
  205. data/vendor/qwik/ml-sendmail.rb +0 -0
  206. data/vendor/qwik/ml-server.rb +107 -0
  207. data/vendor/qwik/ml-session.rb +348 -0
  208. data/vendor/qwik/ml-sweeper.rb +101 -0
  209. data/vendor/qwik/mock-logger.rb +65 -0
  210. data/vendor/qwik/mock-sendmail.rb +78 -0
  211. data/vendor/qwik/mock-socket.rb +82 -0
  212. data/vendor/qwik/modulobe.rb +406 -0
  213. data/vendor/qwik/mongrel-server.rb +72 -0
  214. data/vendor/qwik/page-files.rb +249 -0
  215. data/vendor/qwik/page-generate.rb +82 -0
  216. data/vendor/qwik/page-get.rb +262 -0
  217. data/vendor/qwik/page-images.rb +168 -0
  218. data/vendor/qwik/page-put.rb +128 -0
  219. data/vendor/qwik/page-rrefs.rb +154 -0
  220. data/vendor/qwik/page-title.rb +0 -0
  221. data/vendor/qwik/page-wikidb.rb +234 -0
  222. data/vendor/qwik/page.rb +67 -0
  223. data/vendor/qwik/pages.rb +444 -0
  224. data/vendor/qwik/parse-plugin.rb +249 -0
  225. data/vendor/qwik/parser-emode.rb +116 -0
  226. data/vendor/qwik/parser-inline.rb +273 -0
  227. data/vendor/qwik/parser.rb +350 -0
  228. data/vendor/qwik/password.rb +183 -0
  229. data/vendor/qwik/periodic.rb +79 -0
  230. data/vendor/qwik/qp.rb +56 -0
  231. data/vendor/qwik/qwik-service.rb +341 -0
  232. data/vendor/qwik/qwik.rb +5 -0
  233. data/vendor/qwik/qwikweb-adduser.rb +34 -0
  234. data/vendor/qwik/qwikweb-catalog-validator.rb +110 -0
  235. data/vendor/qwik/qwikweb-incgen.rb +28 -0
  236. data/vendor/qwik/qwikweb-makesite.rb +41 -0
  237. data/vendor/qwik/qwikweb-server.rb +44 -0
  238. data/vendor/qwik/qwikweb-showpassword.rb +26 -0
  239. data/vendor/qwik/qwikweb-watchlog.rb +67 -0
  240. data/vendor/qwik/request-path.rb +304 -0
  241. data/vendor/qwik/request-ua.rb +76 -0
  242. data/vendor/qwik/request-webrick.rb +81 -0
  243. data/vendor/qwik/request.rb +91 -0
  244. data/vendor/qwik/resolve-tdiary.rb +292 -0
  245. data/vendor/qwik/resolve.rb +121 -0
  246. data/vendor/qwik/response.rb +228 -0
  247. data/vendor/qwik/server-memory.rb +57 -0
  248. data/vendor/qwik/server-webrick.rb +102 -0
  249. data/vendor/qwik/server.rb +252 -0
  250. data/vendor/qwik/site-config.rb +149 -0
  251. data/vendor/qwik/site-db.rb +136 -0
  252. data/vendor/qwik/site-event.rb +162 -0
  253. data/vendor/qwik/site-files.rb +86 -0
  254. data/vendor/qwik/site-group.rb +103 -0
  255. data/vendor/qwik/site-index.rb +47 -0
  256. data/vendor/qwik/site-log.rb +64 -0
  257. data/vendor/qwik/site-member.rb +230 -0
  258. data/vendor/qwik/site-monitor.rb +97 -0
  259. data/vendor/qwik/site-pages.rb +62 -0
  260. data/vendor/qwik/site-plan.rb +139 -0
  261. data/vendor/qwik/site-report.rb +282 -0
  262. data/vendor/qwik/site-resolve.rb +230 -0
  263. data/vendor/qwik/site-rrefs.rb +18 -0
  264. data/vendor/qwik/site-search.rb +180 -0
  265. data/vendor/qwik/site-timeline.rb +153 -0
  266. data/vendor/qwik/site-url.rb +189 -0
  267. data/vendor/qwik/site.rb +76 -0
  268. data/vendor/qwik/smil-time.rb +105 -0
  269. data/vendor/qwik/smtp-session.rb +331 -0
  270. data/vendor/qwik/template-generator.rb +149 -0
  271. data/vendor/qwik/template.rb +85 -0
  272. data/vendor/qwik/test-common.rb +10 -0
  273. data/vendor/qwik/test-ml-info.rb +225 -0
  274. data/vendor/qwik/test-module-ml.rb +142 -0
  275. data/vendor/qwik/test-module-path.rb +110 -0
  276. data/vendor/qwik/test-module-public.rb +70 -0
  277. data/vendor/qwik/test-module-server.rb +98 -0
  278. data/vendor/qwik/test-module-session.rb +264 -0
  279. data/vendor/qwik/test-module-suite.rb +91 -0
  280. data/vendor/qwik/test-ms-applemail.rb +59 -0
  281. data/vendor/qwik/test-ms-attach.rb +174 -0
  282. data/vendor/qwik/test-ms-basic.rb +40 -0
  283. data/vendor/qwik/test-ms-close.rb +35 -0
  284. data/vendor/qwik/test-ms-confirm.rb +75 -0
  285. data/vendor/qwik/test-ms-ignore-spam.rb +57 -0
  286. data/vendor/qwik/test-ms-japanese.rb +97 -0
  287. data/vendor/qwik/test-ms-jfilename.rb +82 -0
  288. data/vendor/qwik/test-ms-large.rb +58 -0
  289. data/vendor/qwik/test-ms-member.rb +103 -0
  290. data/vendor/qwik/test-ms-multipart.rb +84 -0
  291. data/vendor/qwik/test-ms-org.rb +129 -0
  292. data/vendor/qwik/test-ms-plan.rb +130 -0
  293. data/vendor/qwik/test-ms-post.rb +53 -0
  294. data/vendor/qwik/test-ms-quopri.rb +76 -0
  295. data/vendor/qwik/test-sub-quopri.rb +45 -0
  296. data/vendor/qwik/test-submit-base64.rb +59 -0
  297. data/vendor/qwik/test-submit-forward.rb +61 -0
  298. data/vendor/qwik/test-submit-html-mail.rb +52 -0
  299. data/vendor/qwik/test-submit-japanese.rb +135 -0
  300. data/vendor/qwik/test-submit-jfilename.rb +144 -0
  301. data/vendor/qwik/test-submit-uuencode.rb +71 -0
  302. data/vendor/qwik/test-suite-all.rb +8 -0
  303. data/vendor/qwik/test-suite-basic.rb +9 -0
  304. data/vendor/qwik/test-suite-ml.rb +9 -0
  305. data/vendor/qwik/test-typekey.rb +64 -0
  306. data/vendor/qwik/testunit.rb +45 -0
  307. data/vendor/qwik/tokenizer-inline.rb +294 -0
  308. data/vendor/qwik/tokenizer.rb +332 -0
  309. data/vendor/qwik/typekey.rb +160 -0
  310. data/vendor/qwik/util-basic.rb +135 -0
  311. data/vendor/qwik/util-charset.rb +332 -0
  312. data/vendor/qwik/util-css.rb +56 -0
  313. data/vendor/qwik/util-csv-tokenizer.rb +113 -0
  314. data/vendor/qwik/util-filename.rb +112 -0
  315. data/vendor/qwik/util-pathname.rb +202 -0
  316. data/vendor/qwik/util-pid.rb +58 -0
  317. data/vendor/qwik/util-safe.rb +67 -0
  318. data/vendor/qwik/util-sendmail.rb +273 -0
  319. data/vendor/qwik/util-string.rb +203 -0
  320. data/vendor/qwik/util-time.rb +125 -0
  321. data/vendor/qwik/util-webrick.rb +176 -0
  322. data/vendor/qwik/version.rb +11 -0
  323. data/vendor/qwik/wabisabi-basic.rb +163 -0
  324. data/vendor/qwik/wabisabi-diff.rb +130 -0
  325. data/vendor/qwik/wabisabi-format-xml.rb +310 -0
  326. data/vendor/qwik/wabisabi-generator.rb +262 -0
  327. data/vendor/qwik/wabisabi-index.rb +174 -0
  328. data/vendor/qwik/wabisabi-table.rb +212 -0
  329. data/vendor/qwik/wabisabi-template.rb +295 -0
  330. data/vendor/qwik/wabisabi-to-htree.rb +111 -0
  331. data/vendor/qwik/wabisabi-to-wiki.rb +690 -0
  332. data/vendor/qwik/wabisabi-traverse.rb +207 -0
  333. data/vendor/qwik/wabisabi-validator.rb +116 -0
  334. data/vendor/qwik/wabisabi.rb +5 -0
  335. metadata +416 -0
@@ -0,0 +1,58 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/util-pathname'
7
+
8
+ module PidModule
9
+ def write_pid_file(pidfile)
10
+ pidfile.path.put("#{Process.pid}\n")
11
+ end
12
+
13
+ def read_pid_file(pidfile)
14
+ pid = nil
15
+ pid = pidfile.path.get_first.chomp.to_i
16
+ return pid
17
+ end
18
+
19
+ def remove_pid_file(pidfile)
20
+ if Process.pid == read_pid_file(pidfile)
21
+ pidfile.path.unlink
22
+ end
23
+ end
24
+
25
+ # for test
26
+ def exist_pid_file?(pidfile)
27
+ return pidfile.path.exist?
28
+ end
29
+ end
30
+
31
+ if $0 == __FILE__
32
+ require 'test/unit'
33
+ $test = true
34
+ end
35
+
36
+ if defined?($test) && $test
37
+ class TestUtilPid < Test::Unit::TestCase
38
+ include PidModule
39
+
40
+ def test_all
41
+ f = 'test-pid.txt'
42
+
43
+ # test_exist_pid_file?
44
+ assert_equal false, exist_pid_file?(f)
45
+
46
+ # test_write_pid_file
47
+ write_pid_file(f)
48
+ assert_equal true, exist_pid_file?(f)
49
+
50
+ # test_read_pid_file
51
+ assert_equal Process.pid, read_pid_file(f)
52
+
53
+ # test_remove_pid_file
54
+ remove_pid_file(f)
55
+ assert_equal false, exist_pid_file?(f)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,67 @@
1
+ #
2
+ # Copyright (C) 2002-2004 Satoru Takabayashi <satoru@namazu.org>
3
+ # Copyright (C) 2003-2006 Kouichirou Eto
4
+ # All rights reserved.
5
+ # This is free software with ABSOLUTELY NO WARRANTY.
6
+ #
7
+ # You can redistribute it and/or modify it under the terms of
8
+ # the GNU General Public License version 2.
9
+ #
10
+
11
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
12
+
13
+ #class TooLongLine < StandardError; end
14
+ class TooLongLine < Exception; end # FIXME: should be StandardError.
15
+
16
+ module SafeGetsModule
17
+ def safe_gets (max_length = 1024)
18
+ s = ''
19
+ while ! self.eof?
20
+ c = self.read(1) # FIXME: This code may be slow.
21
+ s << c
22
+
23
+ if max_length < s.length
24
+ raise TooLongLine
25
+ end
26
+
27
+ if c == "\n"
28
+ return s
29
+ end
30
+ end
31
+
32
+ res = if s.empty? then nil else s end
33
+ return res
34
+ end
35
+ end
36
+
37
+ class IO
38
+ include SafeGetsModule
39
+ end
40
+
41
+ if $0 == __FILE__
42
+ require 'test/unit'
43
+ require 'stringio'
44
+ $test = true
45
+ end
46
+
47
+ if defined?($test) && $test
48
+ class StringIO
49
+ include SafeGetsModule
50
+ end
51
+
52
+ class TestUtilSafe < Test::Unit::TestCase
53
+ def test_safe_gets
54
+ # under max
55
+ line = 'a' * 1024
56
+ assert_equal line, StringIO.new(line).gets
57
+ assert_equal line, StringIO.new(line).safe_gets
58
+
59
+ # over max
60
+ line = 'a' * 1025
61
+ assert_equal line, StringIO.new(line).gets
62
+ assert_raise(TooLongLine) {
63
+ assert_equal line, StringIO.new(line).safe_gets
64
+ }
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,273 @@
1
+ #
2
+ # Copyright (C) 2002-2004 Satoru Takabayashi <satoru@namazu.org>
3
+ # Copyright (C) 2003-2006 Kouichirou Eto
4
+ # All rights reserved.
5
+ # This is free software with ABSOLUTELY NO WARRANTY.
6
+ #
7
+ # You can redistribute it and/or modify it under the terms of
8
+ # the GNU General Public License version 2.
9
+ #
10
+
11
+ require 'socket'
12
+
13
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
14
+ require 'qwik/mail'
15
+ require 'qwik/util-charset'
16
+
17
+ module Qwik
18
+ class Sendmail
19
+ def initialize(host, port, test=false)
20
+ @host, @port = host, port
21
+ @test = test
22
+ end
23
+
24
+ def send(mail)
25
+ Sendmail.send(@host, @port, mail[:from], mail[:to], mail[:subject],
26
+ mail[:content], @test)
27
+ end
28
+
29
+ # FIXME: This method is too ad hoc.
30
+ def self.send(host, port, from, to, subject, body, test)
31
+ efrom = QuickML::Mail.encode_field(from.to_s)
32
+ eto = QuickML::Mail.encode_field(to.to_s)
33
+ esubject = QuickML::Mail.encode_field(subject)
34
+ body = body.set_sourcecode_charset.to_mail_charset
35
+ message =
36
+ "From: #{efrom}
37
+ To: #{eto}
38
+ Subject: #{esubject}
39
+ Content-Type: text/plain; charset=\"ISO-2022-JP\"
40
+
41
+ #{body}
42
+ "
43
+ if test
44
+ $smtp_sendmail = [host, port, efrom, eto, message]
45
+ return message # for debug
46
+ end
47
+
48
+ require 'net/smtp'
49
+ Net::SMTP.start(host, port) {|smtp|
50
+ smtp.send_mail(message, from, to)
51
+ }
52
+ return nil
53
+ end
54
+ end
55
+ end
56
+
57
+ class Sendmail
58
+ def self.send_mail (smtp_host, smtp_port, logger, mail)
59
+ validate_mail(mail)
60
+
61
+ msg = build_message(mail)
62
+
63
+ result = nil
64
+ begin
65
+ config = Sendmail.prepare_config(smtp_host, smtp_port, true)
66
+ s = Sendmail.open_socket(config)
67
+
68
+ myhostname = config[:test] ? 'sender' : Socket.gethostname
69
+
70
+ Sendmail.send_to_socket(config, s, myhostname, msg,
71
+ mail[:mail_from], mail[:recipient])
72
+ result = s
73
+ rescue => e
74
+ logger.log "Error: Unable to send mail: #{e.class}: #{e.message}"
75
+ end
76
+
77
+ if $test
78
+ $quickml_sendmail = [smtp_host, smtp_port,
79
+ mail[:mail_from], mail[:recipient], msg]
80
+ end
81
+
82
+ return result # Only for test
83
+ end
84
+
85
+ private
86
+
87
+ def self.validate_mail(mail)
88
+ if mail[:mail_from].nil? ||
89
+ mail[:recipient].nil? ||
90
+ mail[:header].nil? ||
91
+ mail[:body].nil?
92
+ raise "Missing mail header."
93
+ end
94
+
95
+ mail[:recipient] = [mail[:recipient]] if mail[:recipient].kind_of?(String)
96
+ end
97
+
98
+ def self.build_message(mail)
99
+ return mail[:header].map {|field|
100
+ key, value = field
101
+ "#{key}: #{value}\n"
102
+ }.join+"\n"+mail[:body]
103
+ end
104
+
105
+ def self.prepare_config(smtp_host, smtp_port,
106
+ use_xverp = false, test = false)
107
+ test = true if defined?($test) && $test
108
+ config = {
109
+ :smtp_port => smtp_port,
110
+ :smtp_host => smtp_host,
111
+ :use_xverp => use_xverp,
112
+ :xverp_available => false,
113
+ :test => test,
114
+ }
115
+ return config
116
+ end
117
+
118
+ def self.open_socket(c)
119
+ klass = c[:test] ? MockSmtpServer : TCPSocket
120
+ s = $ml_sm = klass.open(c[:smtp_host], c[:smtp_port]) # $ml_sm is for test
121
+ return s
122
+ end
123
+
124
+ def self.send_to_socket(c, s, myhostname, message, mail_from, recipients)
125
+ recipients = [recipients] if recipients.kind_of?(String)
126
+
127
+ send_command(c, s, nil, 220)
128
+
129
+ send_command(c, s, "EHLO #{myhostname}", 250)
130
+
131
+ if c[:use_xverp] and c[:xverp_available] and (not mail_from.empty?)
132
+ send_command(c, s, "MAIL FROM: <#{mail_from}> XVERP===", 250)
133
+ else
134
+ send_command(c, s, "MAIL FROM: <#{mail_from}>", 250)
135
+ end
136
+
137
+ recipients.each {|recipient|
138
+ send_command(c, s, "RCPT TO: <#{recipient}>", 250)
139
+ }
140
+
141
+ send_command(c, s, 'DATA', 354)
142
+
143
+ message.each_line {|line|
144
+ line.sub!(/\r?\n/, "")
145
+ line.sub!(/^\./, '..')
146
+ line << "\r\n"
147
+ s.print(line)
148
+ }
149
+
150
+ send_command(c, s, '.', 250)
151
+ send_command(c, s, 'QUIT', 221)
152
+
153
+ s.close
154
+ end
155
+
156
+ def self.send_command (c, s, command, code)
157
+ s.print(command + "\r\n") if command
158
+ begin
159
+ line = s.gets
160
+ c[:xverp_available] = true if /^250-XVERP/.match(line)
161
+ end while line[3] == ?-
162
+
163
+ return_code = line[0, 3].to_i
164
+ if return_code == code
165
+ line
166
+ else
167
+ raise "smtp-error: #{command} => #{line}"
168
+ end
169
+ end
170
+ end
171
+
172
+ def Sendmail(*args)
173
+ Sendmail.send_mail(*args)
174
+ end
175
+
176
+ if $0 == __FILE__
177
+ require 'test/unit'
178
+ require 'qwik/testunit'
179
+ require 'qwik/mock-sendmail'
180
+ require 'pp'
181
+ $test = true
182
+ end
183
+
184
+ if defined?($test) && $test
185
+ class TestSendmail < Test::Unit::TestCase
186
+ def test_all
187
+ sm = Qwik::Sendmail.new('127.0.0.1', '25', true)
188
+ mail = {
189
+ :from => 'from@example.com',
190
+ :to => 'to@example.com',
191
+ :subject => 'subject',
192
+ :content => 'content',
193
+ }
194
+ assert_equal "From: from@example.com
195
+ To: to@example.com
196
+ Subject: subject
197
+ Content-Type: text/plain; charset=\"ISO-2022-JP\"
198
+
199
+ content
200
+ ",
201
+ sm.send(mail)
202
+
203
+ mail = {
204
+ :from => 'from@example.com',
205
+ :to => 'to@example.com',
206
+ :subject => '�薼',
207
+ :content => '�{��',
208
+ }
209
+ assert_equal "From: from@example.com
210
+ To: to@example.com
211
+ Subject: =?ISO-2022-JP?B?GyRCQmpMPhsoQg==?=
212
+ Content-Type: text/plain; charset=\"ISO-2022-JP\"
213
+
214
+ \e$BK\\J8\e(B
215
+ ",
216
+ sm.send(mail)
217
+ end
218
+ end
219
+ end
220
+
221
+ if defined?($test) && $test
222
+ class TestSendmail < Test::Unit::TestCase
223
+ def test_all
224
+ c = Sendmail
225
+
226
+ # test_build_message
227
+ is "\n", c.build_message(:header=>[], :body=>'')
228
+ is "a: b\n\nc", c.build_message(:header=>[['a', 'b']], :body=>'c')
229
+ is "a: b\n\nc", c.build_message(:header=>[[:a, 'b']], :body=>'c')
230
+
231
+ # test_send
232
+ mail = {
233
+ :mail_from => '',
234
+ :recipient => '',
235
+ :header => [],
236
+ :body => '',
237
+ }
238
+ so = Sendmail('localhost', 25, nil, mail)
239
+ is "EHLO sender
240
+ MAIL FROM: <>
241
+ RCPT TO: <>
242
+ DATA
243
+
244
+ .
245
+ QUIT",
246
+ so.buffer.join("\n")
247
+
248
+ mail = {
249
+ :mail_from => 'alice@example.com',
250
+ :recipient => 'bob@example.com',
251
+ :header => [
252
+ ['To', 'bob@example.com'],
253
+ ['From', 'alice@example.com'],
254
+ ['Subject', 'test'],
255
+ ],
256
+ :body => 'This is a test.',
257
+ }
258
+ so = Sendmail('localhost', 25, false, mail)
259
+ is "EHLO sender
260
+ MAIL FROM: <alice@example.com>
261
+ RCPT TO: <bob@example.com>
262
+ DATA
263
+ To: bob@example.com
264
+ From: alice@example.com
265
+ Subject: test
266
+
267
+ This is a test.
268
+ .
269
+ QUIT",
270
+ so.buffer.join("\n")
271
+ end
272
+ end
273
+ end
@@ -0,0 +1,203 @@
1
+ #encoding: sjis
2
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
3
+ # This is free software with ABSOLUTELY NO WARRANTY.
4
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
5
+
6
+ #require 'md5'
7
+
8
+ $LOAD_PATH << 'compat' unless $LOAD_PATH.include? 'compat'
9
+ require 'base64'
10
+
11
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
12
+ require 'qwik/util-charset'
13
+
14
+ class String
15
+ def xchomp
16
+ return self.chomp("\n").chomp("\r")
17
+ end
18
+
19
+ # Used from parser.rb
20
+ def chompp
21
+ return self.sub(/[\n\r]+\z/, '')
22
+ end
23
+
24
+ def normalize_eol
25
+ return self.xchomp+"\n"
26
+ end
27
+
28
+ def normalize_newline
29
+ return self.gsub("\r\n", "\n").gsub("\r", "\n")
30
+ end
31
+
32
+ def sub_str(pattern, replace)
33
+ return sub(Regexp.new(Regexp.escape(pattern)), replace)
34
+ end
35
+
36
+ def md5
37
+ return MD5.digest(self)
38
+ end
39
+
40
+ def md5hex
41
+ return MD5.hexdigest(self)
42
+ end
43
+
44
+ def base64
45
+ return Base64.encode64(self).chomp
46
+ end
47
+
48
+ # ============================== escape
49
+ # Copied from cgi.rb
50
+ def escape
51
+ return self.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
52
+ '%' + $1.unpack('H2' * $1.size).join('%').upcase
53
+ }.tr(' ', "+")
54
+ end
55
+
56
+ def unescape
57
+ return self.tr("+", ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) {
58
+ [$1.delete('%')].pack('H*')
59
+ }
60
+ end
61
+
62
+ def unescapeHTML
63
+ return self.gsub(/&(.*?);/n) {
64
+ match = $1.dup
65
+ case match
66
+ when /\Aamp\z/ni then "&"
67
+ when /\Aquot\z/ni then "'"
68
+ when /\Agt\z/ni then ">"
69
+ when /\Alt\z/ni then "<"
70
+ else
71
+ "&#{match};"
72
+ end
73
+ }
74
+ end
75
+
76
+ def mb_length
77
+ case self.charset || self.guess_charset
78
+ when 'UTF-8'; return self.split(//u).length
79
+ when 'Shift_JIS'; return self.split(//s).length
80
+ when 'EUC-JP'; return self.split(//e).length
81
+ end
82
+ return self.length
83
+ end
84
+
85
+ def mb_substring(s,e)
86
+ case self.charset || self.guess_charset
87
+ when 'UTF-8'; return self.split(//u)[s...e].to_s
88
+ when 'Shift_JIS'; return self.split(//s)[s...e].to_s
89
+ when 'EUC-JP'; return self.split(//e)[s...e].to_s
90
+ end
91
+ return self[s...e]
92
+ end
93
+
94
+ # Copied from gonzui-0.1
95
+ # Use this method instead of WEBrick::HTMLUtils.escape for performance reason.
96
+ EscapeTable = {
97
+ "&" => "&amp;",
98
+ '"' => "&quot;",
99
+ '<' => "&lt;",
100
+ '>' => "&gt;",
101
+ }
102
+ def escapeHTML
103
+ string = self
104
+ return string.gsub(/[&"<>]/n) {|x| EscapeTable[x] }
105
+ end
106
+ end
107
+
108
+ if $0 == __FILE__
109
+ require 'test/unit'
110
+ $test = true
111
+ end
112
+
113
+ if defined?($test) && $test
114
+ class TestString < Test::Unit::TestCase
115
+ def test_string
116
+ # test_xchomp
117
+ assert_equal '', ''.xchomp
118
+ assert_equal '', "\n".xchomp
119
+ assert_equal '', "\r".xchomp
120
+ assert_equal '', "\r\n".xchomp
121
+ assert_equal "\n", "\n\r".xchomp
122
+ assert_equal 't', 't'.xchomp
123
+ assert_equal 't', "t\r".xchomp
124
+ assert_equal 't', "t\n".xchomp
125
+
126
+ # test_chompp
127
+ assert_equal '', "\n\r".chompp
128
+ assert_equal '', "\n\r\n\r".chompp
129
+
130
+ # test_normalize_eol
131
+ assert_equal "\n", ''.normalize_eol
132
+ assert_equal "\n", "\n".normalize_eol
133
+ assert_equal "t\n", 't'.normalize_eol
134
+ assert_equal "t\n", "t\n".normalize_eol
135
+
136
+ # test_normalize_newline
137
+ assert_equal "\n", "\n".normalize_newline
138
+ assert_equal "\n", "\r".normalize_newline
139
+ assert_equal "\n", "\r\n".normalize_newline
140
+ assert_equal "\n\n", "\n\r".normalize_newline
141
+ assert_equal "\na\n", "\ra\r".normalize_newline
142
+ assert_equal "\na\n", "\r\na\r\n".normalize_newline
143
+ assert_equal "\n\na\n\n", "\n\ra\n\r".normalize_newline
144
+
145
+ # test_sub_str
146
+ assert_equal 'a:b', 'a*b'.sub_str('*', ':')
147
+
148
+ # test_md5
149
+ assert_instance_of String, 't'.md5
150
+ assert_equal 16, 't'.md5.length
151
+ assert_equal "\343X\357\244\211\365\200b\361\r\3271ked\236", 't'.md5
152
+ assert_instance_of String, 't'.md5hex
153
+ assert_equal 32, 't'.md5hex.length
154
+ assert_equal 'e358efa489f58062f10dd7316b65649e', 't'.md5hex
155
+ assert_equal 'dA==', 't'.base64
156
+ end
157
+
158
+ def test_escape
159
+ # test_escape
160
+ assert_equal('A', 'A'.escape)
161
+ assert_equal("+", ' '.escape)
162
+ assert_equal('%2B', "+".escape)
163
+ assert_equal('%21', "!".escape)
164
+ assert_equal("ABC%82%A0%82%A2%82%A4+%2B%23", "ABC������ +#".escape)
165
+
166
+ # test_unescape
167
+ assert_equal('A', '%41'.unescape)
168
+ assert_equal(' ', "+".unescape)
169
+ assert_equal("!", '%21'.unescape)
170
+ assert_equal("ABC������ +#", "ABC%82%A0%82%A2%82%A4+%2B%23".unescape)
171
+
172
+ # test_escapeHTML
173
+ assert_equal("&lt;", "<".escapeHTML)
174
+ assert_equal("&gt;", ">".escapeHTML)
175
+ assert_equal("&amp;", "&".escapeHTML)
176
+ assert_equal("&lt;a href=&quot;http://e.com/&quot;&gt;e.com&lt;/a&gt;",
177
+ '<a href="http://e.com/">e.com</a>'.escapeHTML)
178
+
179
+ # test_unescapeHTML
180
+ assert_equal("<", "&lt;".unescapeHTML)
181
+ assert_equal(">", "&gt;".unescapeHTML)
182
+ assert_equal("&", "&amp;".unescapeHTML)
183
+ assert_equal("<a href='http://e.com/'>e.com</a>",
184
+ "&lt;a href=&quot;http://e.com/&quot;&gt;e.com&lt;/a&gt;".unescapeHTML)
185
+ end
186
+
187
+ def test_mb_length
188
+ str = "���{�ꕶ����"
189
+ assert_equal(6,str.mb_length)
190
+
191
+ str = "English"
192
+ assert_equal(7,str.mb_length)
193
+ end
194
+
195
+ def test_mb_substring
196
+ str = "���{�ꕶ����"
197
+ assert_equal("�{�ꕶ",str.mb_substring(1,4))
198
+
199
+ str = "English"
200
+ assert_equal("ngl",str.mb_substring(1,4))
201
+ end
202
+ end
203
+ end