qwikdoc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,79 @@
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
+
7
+ module Qwik
8
+ class LoadLibrary
9
+ LIBDIR = File.dirname(__FILE__)
10
+ ROOTLIBDIR = File.expand_path(LIBDIR+'/../')
11
+
12
+ def self.load_libs_here(glob)
13
+ dir = ROOTLIBDIR
14
+ ar = list_files(dir, glob)
15
+ add_load_path(dir)
16
+ require_files(ar)
17
+ end
18
+
19
+ private
20
+
21
+ def self.list_files(dir, glob)
22
+ return Dir.glob("#{dir}/#{glob}").map {|f|
23
+ f.sub("#{dir}/", '')
24
+ }
25
+ end
26
+
27
+ def self.add_load_path(dir)
28
+ dir = '..' if defined?($test) && $test
29
+ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir)
30
+ end
31
+
32
+ def self.require_files(ar)
33
+ #before = $".dup
34
+ ar.each {|f|
35
+ require f
36
+ }
37
+ #after = $".dup
38
+ #pp 'load success', after-before if before != after
39
+ end
40
+ end
41
+ end
42
+
43
+ if $0 == __FILE__
44
+ require 'qwik/test-common'
45
+ $test = true
46
+ end
47
+
48
+ if defined?($test) && $test
49
+ class TestLoadLib < Test::Unit::TestCase
50
+ def test_all
51
+ return if $0 != __FILE__ # just only for unit test.
52
+
53
+ c = Qwik::LoadLibrary
54
+ org_path = $LOAD_PATH.dup
55
+ org_libs = $".dup
56
+
57
+ # test list_files
58
+ dir = Qwik::LoadLibrary::ROOTLIBDIR
59
+ glob = 'qwik/act-*.rb'
60
+ files = c.list_files(dir, glob)
61
+ ok_eq(true, 0 < files.length)
62
+ files.each {|f|
63
+ assert_match(/\Aqwik\/act-[-a-z0-9]+\.rb\z/, f)
64
+ }
65
+
66
+ c.load_libs_here(glob) # LOAD
67
+
68
+ # LOAD_PATH is not changed.
69
+ diff = $LOAD_PATH.length - org_path.length
70
+ #p $LOAD_PATH.length, org_path.length
71
+ #pp $LOAD_PATH, org_path
72
+ ok_eq(false, 0 < diff)
73
+
74
+ diff = $".length - org_libs.length
75
+ #p $".length, org_libs.length
76
+ ok_eq(true, 0 < diff)
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,115 @@
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
+ require 'resolv'
6
+
7
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
8
+ require 'qwik/config'
9
+
10
+ module Qwik
11
+ class Logger
12
+ WEB_ACCESS_LOG = 'qwik-access.log'
13
+ WEB_ERROR_LOG = 'qwik-error.log'
14
+ ACCESS_LOG = 'access.log'
15
+
16
+ def initialize(log_file)
17
+ @log = open(log_file, 'ab+')
18
+ @log.sync = true
19
+ @verbose = false
20
+ end
21
+ attr_writer :verbose
22
+
23
+ def close
24
+ @log.close
25
+ @log = nil
26
+ end
27
+
28
+ IGNORE_ACTION = %w(theme num)
29
+ def log(wreq, wres, req, res, diff)
30
+ return if IGNORE_ACTION.include?(req.plugin)
31
+ format = Logger.format_log_line(req, wres, diff)
32
+ @log << format
33
+ $stdout << format if @verbose
34
+ end
35
+
36
+ def take_log(format)
37
+ #return if IGNORE_ACTION.include?(req.plugin)
38
+ #format = Logger.format_log_line(req, wres, diff)
39
+ @log << format
40
+ $stdout << format if @verbose
41
+ end
42
+
43
+ # FIXME: Ad hoc reopen support.
44
+ def reopen
45
+ @log.close
46
+ log_file = @log.path
47
+ @log = open(log_file, 'ab+')
48
+ @log.sync = true
49
+ end
50
+
51
+ def self.format_log_line(req, wres, diff)
52
+ time = req.start_time.rfc_date
53
+ fromhost = req.fromhost
54
+ user = req.user || '-'
55
+ request_line = req.request_line
56
+ status = wres.status
57
+ len = '-'
58
+ len = wres.body.length if wres.body.is_a? String
59
+ diff = "%0.2f" % diff
60
+ str = "#{time} #{fromhost} #{user} \"#{request_line}\" #{status} #{len} #{diff}\n"
61
+ return str
62
+ end
63
+
64
+ private
65
+
66
+ def nu_resolve(ip)
67
+ begin
68
+ return Resolv.getname(ip).to_s
69
+ rescue
70
+ return ip
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ if $0 == __FILE__
77
+ require 'qwik/testunit'
78
+ require 'qwik/util-pathname'
79
+ require 'qwik/util-time'
80
+ require 'qwik/request'
81
+ require 'qwik/response'
82
+ $test = true
83
+ end
84
+
85
+ if defined?($test) && $test
86
+ class TestLogger < Test::Unit::TestCase
87
+ def test_logger
88
+ c = Qwik::Logger
89
+
90
+ # test_format_log_line
91
+ config = Qwik::Config.new
92
+ req = Qwik::Request.new(config)
93
+ res = Qwik::Response.new(config)
94
+ assert_equal "1970-01-01T09:00:00 - \"\" 200 - 0.00\n",
95
+ c.format_log_line(req, res, 0)
96
+
97
+ path = 'test.txt'.path
98
+ path.unlink if path.exist?
99
+
100
+ # test_init
101
+ logger = Qwik::Logger.new(path.to_s)
102
+ assert_equal true, path.exist?
103
+
104
+ # test_log
105
+ logger.log(req, res, req, res, 0)
106
+ assert_equal "1970-01-01T09:00:00 - \"\" 200 - 0.00\n", path.read
107
+
108
+ # test_close
109
+ logger.close
110
+
111
+ path.unlink if path.exist?
112
+ assert_equal false, path.exist?
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,171 @@
1
+ # -*- coding: shift_jis -*-
2
+ #
3
+ # Copyright (C) 2002-2004 Satoru Takabayashi <satoru@namazu.org>
4
+ # Copyright (C) 2003-2006 Kouichirou Eto
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
13
+ require 'qwik/mail'
14
+
15
+ module QuickML
16
+ class Mail
17
+ def to_s
18
+ str = ''
19
+ self.each_field {|key, value|
20
+ str << "#{key}: #{value}\n"
21
+ }
22
+ str << "\n"
23
+ str << @body
24
+ return str
25
+ end
26
+
27
+ # ml-processor.rb:102: @mail.empty_body? ||
28
+ def empty_body?
29
+ return Mail.empty_body?(@body)
30
+ end
31
+
32
+ # group-mail.rb:38: if mail.plain_text_body?
33
+ # group-site.rb:116: if sub_mail.plain_text_body?
34
+ def plain_text_body?
35
+ Mail.plain_text_body?(self['Content-Type'],
36
+ self['Content-Transfer-Encoding'])
37
+ end
38
+
39
+ def get_body
40
+ body = ''
41
+ self.each_part {|mail|
42
+ if mail.plain_text_body?
43
+ body << mail.body.chomp.chomp+"\n"
44
+ end
45
+ }
46
+ return body
47
+ end
48
+
49
+ # by eto
50
+ def decoded_body
51
+ return Mail.decode_body(self['Content-Transfer-Encoding'], @body)
52
+ end
53
+
54
+ # ==================== Class methods.
55
+ def self.empty_body?(body)
56
+ return false if 100 < body.length
57
+ # Substitute spaces in Shift_JIS to ordinaly spaces.
58
+ body = body.tosjis.gsub("\201@") { ' ' }
59
+ return true if /\A\s*\Z/s =~ body
60
+ return false
61
+ end
62
+
63
+ def self.plain_text_body?(ct, cte)
64
+ return true if (ct.empty? || /\btext\/plain\b/i =~ ct) &&
65
+ (cte.empty? || /^[78]bit$/i =~ cte || /^base64$/i =~ cte || /quoted-printable/i =~ cte)
66
+ return false
67
+ end
68
+
69
+ def self.decode_body(enc, body)
70
+ return Mail.decode_base64(body) if /base64/i =~ enc
71
+ return Mail.decode_uuencode(body) if /x-uuencode/i =~ enc
72
+ return Mail.decode_quoted_printable(body) if /quoted-printable/i =~ enc
73
+ return body
74
+ end
75
+
76
+ def self.decode_base64(str)
77
+ return Base64.decode64(str)
78
+ end
79
+
80
+ def self.decode_uuencode(str)
81
+ uu = ''
82
+ str.each {|line|
83
+ next if /\Abegin/ =~ line
84
+ break if /\Aend/ =~ line
85
+ uu << line
86
+ }
87
+ return uu.unpack('u').first
88
+ end
89
+
90
+ def self.decode_quoted_printable(str)
91
+ str = str.gsub(/[ \t]+$/no, '')
92
+ str.gsub!(/=\r?\n/no, '')
93
+ str.gsub!(/=([0-9A-F][0-9A-F])/no) { $1.hex.chr }
94
+ return str
95
+ end
96
+
97
+ # group-mail.rb:168: mail.body = Mail.join_parts(parts, mail.boundary)
98
+ # ml-processor.rb:188: body = Mail.join_parts(parts, @mail.boundary)
99
+ def self.join_parts (parts, boundary)
100
+ body = ''
101
+ body << "--#{boundary}\n"
102
+ body << parts.join("--#{boundary}\n")
103
+ body << "--#{boundary}--\n"
104
+ return body
105
+ end
106
+
107
+ end
108
+ end
109
+
110
+ if $0 == __FILE__
111
+ require 'qwik/testunit'
112
+ $test = true
113
+ end
114
+
115
+ if defined?($test) && $test
116
+ class TestMailBody < Test::Unit::TestCase
117
+ def test_all
118
+ mail = QuickML::Mail.new
119
+
120
+ # test_to_s
121
+ ok_eq("\n", mail.to_s)
122
+
123
+ # test_empty_body?
124
+ ok_eq(true, mail.empty_body?)
125
+
126
+ # test_plain_text_body?
127
+ ok_eq(true, mail.plain_text_body?)
128
+ end
129
+
130
+ def test_class_method
131
+ c = QuickML::Mail
132
+
133
+ # test_empty_body?
134
+ #ok_eq(false, mail.empty_body?)
135
+ ok_eq("\201@", '�@')
136
+ ok_eq(true, c.empty_body?(''))
137
+ ok_eq(true, c.empty_body?(' '))
138
+ ok_eq(true, c.empty_body?(' '*100))
139
+ ok_eq(true, c.empty_body?("\n"*100))
140
+ ok_eq(true, c.empty_body?("\t"*100))
141
+ ok_eq(true, c.empty_body?("\201@"*50))
142
+ ok_eq(false, c.empty_body?("\201@"*100))
143
+ ok_eq(false, c.empty_body?(' '*101))
144
+ ok_eq(false, c.empty_body?('a'))
145
+
146
+ # test_plain_text_body?
147
+ ok_eq(true, c.plain_text_body?('', ''))
148
+ ok_eq(true, c.plain_text_body?('text/plain; charset="ascii"', ''))
149
+ ok_eq(false, c.plain_text_body?("multipart/mixed; boundary='boundary'", ''))
150
+ ok_eq(false, c.plain_text_body?("image/png; name='1x1.png'", ''))
151
+
152
+ # test_decode_body
153
+ ok_eq('', c.decode_body('', ''))
154
+
155
+ # test_decode_base64
156
+ ok_eq('', c.decode_base64(''))
157
+ ok_eq('', c.decode_base64('t'))
158
+
159
+ # test_decode_uuencode
160
+ ok_eq('', c.decode_uuencode(''))
161
+ ok_eq('', c.decode_uuencode('t'))
162
+
163
+ # test_decode_quoted_printable
164
+ ok_eq('', c.decode_quoted_printable(''))
165
+ ok_eq('t', c.decode_quoted_printable('t'))
166
+
167
+ # test_join_parts
168
+ ok_eq("--b\ns--b\nt--b--\n", c.join_parts(['s', 't'], 'b'))
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,474 @@
1
+ # -*- coding: shift_jis -*-
2
+ #
3
+ # Copyright (C) 2002-2004 Satoru Takabayashi <satoru@namazu.org>
4
+ # Copyright (C) 2003-2006 Kouichirou Eto
5
+ # All rights reserved.
6
+ # This is free software with ABSOLUTELY NO WARRANTY.
7
+ #
8
+ # You can redistribute it and/or modify it under the terms of
9
+ # the GNU General Public License version 2.
10
+ #
11
+
12
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
13
+ require 'qwik/mail'
14
+ require 'qwik/mailaddress'
15
+ require 'qwik/mail-multipart'
16
+ require 'qwik/util-charset'
17
+
18
+ module QuickML
19
+ class Mail
20
+ # ==================== Basic header methods.
21
+ def header
22
+ return nil if ! $test # Only for test.
23
+ return @header
24
+ end
25
+
26
+ def []=(key, value)
27
+ return nil if ! $test # Only for test.
28
+ field = @header.find {|field|
29
+ key.downcase == field.first.downcase
30
+ }
31
+ if field
32
+ field[1] = value
33
+ else
34
+ @header << [key, value]
35
+ end
36
+ return nil
37
+ end
38
+
39
+ def [] (key)
40
+ field = @header.find {|field|
41
+ key.downcase == field.first.downcase
42
+ }
43
+ return '' if field.nil?
44
+ return field.last
45
+ end
46
+
47
+ # ml-session.rb:214: mail.unshift_field('Received', received_field)
48
+ def unshift_field (key, value)
49
+ # Use Array for preserving order of the header
50
+ @header.unshift([key, value])
51
+ end
52
+
53
+ # group.rb:265: mail.each_field {|key, value|
54
+ # mail-body.rb:18: self.each_field {|key, value|
55
+ def each_field
56
+ @header.each {|field|
57
+ yield(field.first, field.last)
58
+ }
59
+ end
60
+
61
+ # ==================== Get value.
62
+ def get_unified_subject(name)
63
+ return Mail.get_unified_subject(self['Subject'], name)
64
+ end
65
+
66
+ # ml-processor.rb:37: if @mail.looping?
67
+ def looping?
68
+ return ! self['X-QuickML'].empty?
69
+ end
70
+
71
+ # ==================== Address methods.
72
+ def from
73
+ address = @mail_from
74
+ address = Mail.collect_address(self['From'])[0] if ! self['From'].empty?
75
+ address = 'unknown' if address.nil? || address.empty?
76
+ address = MailAddress.normalize(address)
77
+ return address
78
+ end
79
+
80
+ def valid?
81
+ return (! @recipients.empty?) && !!@mail_from
82
+ end
83
+
84
+ def add_recipient (address)
85
+ @recipients.push(MailAddress.normalize(address))
86
+ end
87
+
88
+ def clear_recipients
89
+ @recipients = []
90
+ end
91
+
92
+ def collect_to
93
+ return Mail.collect_address(self['To']) if self['To']
94
+ return []
95
+ end
96
+
97
+ def collect_cc
98
+ return Mail.collect_address(self['Cc']) if self['Cc']
99
+ return []
100
+ end
101
+
102
+ # ==================== Class methods.
103
+ def self.collect_address (field)
104
+ address_regex =
105
+ /(("?)[-0-9a-zA-Z_.+?\/]+\2@[-0-9a-zA-Z]+\.[-0-9a-zA-Z.]+)/ #/
106
+ addresses = []
107
+ parts = Mail.remove_comment_in_field(field).split(',')
108
+ parts.each {|part|
109
+ if (/<(.*?)>/ =~ part) || (address_regex =~ part)
110
+ addresses.push(MailAddress.normalize($1))
111
+ end
112
+ }
113
+ return addresses.uniq
114
+ end
115
+
116
+ def self.get_unified_subject(s, name)
117
+ s = Mail.clean_subject(s, name)
118
+ s.sub!(/(?:Re:\s*)+/i, '')
119
+ s.sub!(/\A\s+/, '')
120
+ s.sub!(/\s+\z/, '')
121
+ s.gsub!(/\s+/, ' ') # Thanks to Mr. Atsushi SHICHI.
122
+ return s
123
+ end
124
+
125
+ def self.remove_comment_in_field (field)
126
+ field = field.tosjis
127
+ true while field.sub!(/\([^()]*?\)/, '')
128
+ return field
129
+ end
130
+
131
+ def self.get_charset(contenttype)
132
+ return $2.downcase if /charset=("?)([-\w]+)\1/ =~ contenttype
133
+ return nil
134
+ end
135
+
136
+ def self.get_content_type(contenttype)
137
+ return $1.downcase if /([-\w]+\/[-\w]+)/ =~ contenttype
138
+ return nil
139
+ end
140
+
141
+ def self.encode_field (field)
142
+ field.gsub(Regexp.new("[\x81\x40-\xef\xf7]\\S*\\s*", nil, 's')) {|x|
143
+ x.scan(Regexp.new('.{1,10}', nil, 's')).map {|y|
144
+ '=?ISO-2022-JP?B?' + y.tojis.to_a.pack('m').chomp + '?='
145
+ }.join("\n ")
146
+ }
147
+ end
148
+
149
+ def self.decode_subject(s)
150
+ s = join_lines(s) if multiline?(s)
151
+ s = SubjectDecoder.decode(s)
152
+ s.tosjis
153
+ end
154
+
155
+ def self.multiline?(s)
156
+ /\n/ =~ s
157
+ end
158
+
159
+ def self.join_lines(s)
160
+ result = s.dup
161
+ result.gsub!(/\?=\s*\n\s+=\?/, '?==?')
162
+ result.gsub!(/\n\s+/, ' ')
163
+ result.gsub!(/\n/, '')
164
+ return result
165
+ end
166
+
167
+ def self.clean_subject(s, name)
168
+ s = Mail.decode_subject(s)
169
+ s.gsub!(/(?:\[#{Regexp.quote(name)}:\d+\])/, '')
170
+ s.sub!(/(?:Re:\s*)+/i, 'Re: ')
171
+ return s
172
+ end
173
+
174
+ def self.rewrite_subject (s, name, count)
175
+ s = Mail.clean_subject(s, name)
176
+ s = "[#{name}:#{count}] " + s
177
+ return Mail.encode_field(s)
178
+ end
179
+
180
+ def self.address_of_domain? (address, domain)
181
+ re = '[.@]' + Regexp.quote(domain) + '$'
182
+ domainpat = Regexp.new(re, Regexp::IGNORECASE)
183
+ return true if domainpat =~ address
184
+ return false
185
+ end
186
+
187
+ def self.content_type(default_content_type, charset)
188
+ return default_content_type + "; charset=#{charset}" if charset
189
+ return default_content_type
190
+ end
191
+
192
+ end
193
+
194
+ class SubjectDecoder
195
+ ENCODED_WORDS = /=\?(iso-2022-jp|euc-jp|shift_jis|cp932)\?([QB])\?([^?]+)\?=/i
196
+ def self.decode(str)
197
+ str.gsub(ENCODED_WORDS) {|s|
198
+ charset = $1.downcase
199
+ encoding = $2.upcase
200
+ contents = $3
201
+ decoder = self.new(charset, encoding, contents)
202
+ decoder.decode
203
+ }
204
+ end
205
+
206
+ def initialize(charset, encoding, contents)
207
+ @charset = charset
208
+ @encoding = encoding
209
+ @contents = contents
210
+ end
211
+
212
+ def decode
213
+ return @contents if @charset.nil? and @encoding.nil?
214
+ decode_encoding!
215
+ convert_charset!
216
+ return @contents
217
+ end
218
+
219
+ def decode_encoding!
220
+ result = @contents
221
+ case @encoding
222
+ when "B"
223
+ result = @contents.unpack("m").first
224
+ when "Q"
225
+ result = @contents.unpack("M").first
226
+ result.gsub!("_", " ")
227
+ end
228
+ @contents = result
229
+ end
230
+
231
+ def convert_charset!
232
+ case @charset
233
+ when "iso-2022-jp"
234
+ @contents = @contents.jistosjis
235
+ when "euc-jp"
236
+ @contents = @contents.euctosjis
237
+ when "shift_jis", "cp932"
238
+ :do_nothing
239
+ when "utf-8"
240
+ @contents = @contents.u8tosjis
241
+ end
242
+ end
243
+
244
+ end
245
+ end
246
+
247
+ if $0 == __FILE__
248
+ require 'qwik/testunit'
249
+ $test = true
250
+ end
251
+
252
+ if defined?($test) && $test
253
+ class TestSubjectDecoder < Test::Unit::TestCase
254
+ def test_usascii_none
255
+ input = "test"
256
+ expected = "test"
257
+ actual = QuickML::SubjectDecoder.decode(input)
258
+ ok_eq(expected, actual)
259
+ end
260
+
261
+ def test_cp932_quotedprintable
262
+ input = "=?CP932?B?gqAg?="
263
+ expected = "\202\240 "
264
+ actual = QuickML::SubjectDecoder.decode(input)
265
+ ok_eq(expected, actual)
266
+ end
267
+
268
+ def test_iso2022jp_base64
269
+ input = '=?iso-2022-jp?B?GyRCJCIbKEI=?= '
270
+ expected = "\202\240 "
271
+ actual = QuickML::SubjectDecoder.decode(input)
272
+ ok_eq(expected, actual)
273
+ end
274
+
275
+ def test_1
276
+ input = "[smd:30] =?ISO-2022-JP?B?GyRCRnxLXDhsJTUlViU4JSclLyVIGyhC?="
277
+ expected = "[smd:30] ���{��T�u�W�F�N�g"
278
+ actual = QuickML::SubjectDecoder.decode(input)
279
+ ok_eq(expected, actual)
280
+ end
281
+
282
+ def test_2
283
+ input = "=?ISO-2022-JP?B?UmU6IFtzbWQ6MzA=?==?ISO-2022-JP?B?XSAbJEJGfEtcOGwlNSVWJTglJyUvJUgbKEI=?="
284
+ expected = "Re: [smd:30] ���{��T�u�W�F�N�g"
285
+ actual = QuickML::SubjectDecoder.decode(input)
286
+ ok_eq(expected, actual)
287
+ end
288
+
289
+ def test_3
290
+ input = "[smd:31] Re: =?ISO-2022-JP?B?GyRCRnxLXDhsJTUlViU4JSclLyVIGyhC?="
291
+ expected = "[smd:31] Re: ���{��T�u�W�F�N�g"
292
+ actual = QuickML::SubjectDecoder.decode(input)
293
+ ok_eq(expected, actual)
294
+ end
295
+
296
+ def test_4
297
+ input = "[smd:32] =?CP932?Q?Re: __=93=FA=96{=8C=EA=83T=83u=83W=83F=83N=83g?="
298
+ expected = "[smd:32] Re: ���{��T�u�W�F�N�g"
299
+ actual = QuickML::SubjectDecoder.decode(input)
300
+ ok_eq(expected, actual)
301
+ end
302
+
303
+ def test_5
304
+ input = "=?ISO-2022-JP?B?UmU6IFtzbWQ6MzBdIBskQkZ8S1w4bCU1JVYlOBsoQg==?==?ISO-2022-JP?B?GyRCJSclLyVIGyhC?="
305
+ expected = "Re: [smd:30] ���{��T�u�W�F�N�g"
306
+ actual = QuickML::SubjectDecoder.decode(input)
307
+ ok_eq(expected, actual)
308
+ end
309
+
310
+ end
311
+
312
+ class TestMailHeader < Test::Unit::TestCase
313
+ def test_all
314
+ mail = QuickML::Mail.new
315
+
316
+ # test_header
317
+ ok_eq([], mail.header)
318
+
319
+ # test_[]=
320
+ mail['k'] = 'v'
321
+
322
+ # test_[]
323
+ ok_eq('v', mail['k'])
324
+
325
+ # test_unshift_field
326
+ mail.unshift_field('k2', 'v2')
327
+ ok_eq([['k2', 'v2'], ['k', 'v']], mail.header)
328
+
329
+ # test_each_field
330
+ mail.each_field {|k, v|
331
+ # do nothing.
332
+ }
333
+
334
+ # test_get_unified_subject
335
+ mail['Subject'] = 'Re: [t:1] s'
336
+ ok_eq('s', mail.get_unified_subject('t'))
337
+
338
+ # test_looping?
339
+ ok_eq(false, mail.looping?)
340
+ mail['X-QuickML'] = 'true'
341
+ ok_eq(true, mail.looping?)
342
+ end
343
+
344
+ def test_address
345
+ mail = QuickML::Mail.new
346
+
347
+ # test_from
348
+ ok_eq('unknown', mail.from)
349
+ mail['From'] = 'a@e.com'
350
+ ok_eq('a@e.com', mail.from)
351
+
352
+ # test_valid?
353
+ ok_eq(false, mail.valid?)
354
+
355
+ # test_add_recipient
356
+ mail.add_recipient('b@e.com')
357
+ ok_eq(false, mail.valid?)
358
+
359
+ # test_clear_recipients
360
+ mail.clear_recipients
361
+
362
+ # test_collect_to
363
+ ok_eq([], mail.collect_to)
364
+ mail['To'] = 't@e.com'
365
+ ok_eq(['t@e.com'], mail.collect_to)
366
+
367
+ # test_collect_cc
368
+ ok_eq([], mail.collect_cc)
369
+ mail['Cc'] = 'c@e.com'
370
+ ok_eq(['c@e.com'], mail.collect_cc)
371
+ end
372
+
373
+ def test_class_method
374
+ c = QuickML::Mail
375
+
376
+ # test_collect_address
377
+ ok_eq(['a@example.net'], c.collect_address('a@example.net'))
378
+
379
+ # test_get_unified_subject
380
+ ok_eq('t', c.get_unified_subject('t', 'test'))
381
+ ok_eq('t', c.get_unified_subject('Re: t', 'test'))
382
+ ok_eq('t', c.get_unified_subject(' t', 'test'))
383
+ ok_eq('t', c.get_unified_subject('t ', 'test'))
384
+ ok_eq('t t', c.get_unified_subject('t t', 'test'))
385
+ ok_eq('t t', c.get_unified_subject('t t', 'test'))
386
+ ok_eq('t t t', c.get_unified_subject('t t t', 'test'))
387
+ ok_eq('t t t', c.get_unified_subject('t t t', 'test'))
388
+ ok_eq('Test Mail', c.get_unified_subject('Re: [test:1] Test Mail', 'test'))
389
+ ok_eq('�e�X�g', c.get_unified_subject('Re: [test:1] �e�X�g ', 'test'))
390
+
391
+ # test_remove_comment_in_field
392
+ ok_eq('', c.remove_comment_in_field(''))
393
+ ok_eq('ac', c.remove_comment_in_field('a(b)c'))
394
+ ok_eq('ace', c.remove_comment_in_field('a(b)c(d)e'))
395
+
396
+ # test_get_charset
397
+ ok_eq(nil, c.get_charset(''))
398
+ ok_eq('ascii', c.get_charset('text/plain; charset="ascii"'))
399
+ ok_eq('iso-2022-jp', c.get_charset('text/plain; charset=ISO-2022-JP'))
400
+ ok_eq('shift_jis', c.get_charset('text/plain; charset=Shift_JIS'))
401
+
402
+ # test_get_contenttype
403
+ ok_eq(nil, c.get_content_type(''))
404
+ ok_eq('text/plain',
405
+ c.get_content_type('text/plain; charset="ascii"'))
406
+ ok_eq('multipart/mixed',
407
+ c.get_content_type("multipart/mixed; boundary='boundary'"))
408
+ ok_eq('multipart/alternative',
409
+ c.get_content_type("multipart/alternative; boundary='b'"))
410
+
411
+ # test_encode_field
412
+ ok_eq("\201@", '�@')
413
+ ok_eq("\352\242", '�')
414
+ ok_eq('t', c.encode_field('t'))
415
+ ok_eq('=?ISO-2022-JP?B?GyRCJCIbKEI=?=', c.encode_field('��'))
416
+ ok_eq('=?ISO-2022-JP?B?GyRCJCIkJBsoQg==?=', c.encode_field('����'))
417
+ ok_eq('=?ISO-2022-JP?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMbKEI=?=
418
+ =?ISO-2022-JP?B?GyRCJDUkNyQ5JDskPRsoQg==?=',
419
+ c.encode_field('������������������������������'))
420
+ ok_eq('[test:1] Re: =?ISO-2022-JP?B?GyRCJUYlOSVIGyhCICA=?=',
421
+ c.encode_field('[test:1] Re: �e�X�g '))
422
+ ok_eq('[test:1] Re: =?ISO-2022-JP?B?GyRCJUYlOSVIGyhCIA==?=',
423
+ c.encode_field('[test:1] Re: �e�X�g '))
424
+ ok_eq('[test:1] Re: =?ISO-2022-JP?B?GyRCJCIbKEI=?=',
425
+ c.encode_field('[test:1] Re: ��'))
426
+
427
+ # test_decode_subject
428
+ ok_eq('t', c.decode_subject('t'))
429
+ ok_eq('st', c.decode_subject("s\nt"))
430
+ ok_eq('s t', c.decode_subject("s\n t"))
431
+ ok_eq("\202\240 ", c.decode_subject('=?iso-2022-jp?B?GyRCJCIbKEI=?= '))
432
+ ok_eq( '[test:33] �ƂĂ��ƂĂ��ƂĂ��ƂĂ��ƂĂ��ƂĂ��������������������������������������ƂĂ��ƂĂ��ƂĂ��ƂĂ��ƂĂ��ƂĂ����������������������������������������{��T�u�W�F�N�g�̃e�X�g',
433
+ c.decode_subject('[test:33] =?ISO-2022-JP?B?GyRCJEgkRiRiJEgkRiRiJEgkRiRiJEgbKEI=?=
434
+ =?ISO-2022-JP?B?GyRCJEYkYiRIJEYkYiRIJEYkYkQ5JCQbKEI=?=
435
+ =?ISO-2022-JP?B?GyRCRDkkJEQ5JCREOSQkRDkkJEQ5JCQbKEI=?=
436
+ =?ISO-2022-JP?B?GyRCRDkkJEQ5JCREOSQkJEgkRiRiJEgbKEI=?=
437
+ =?ISO-2022-JP?B?GyRCJEYkYiRIJEYkYiRIJEYkYiRIJEYbKEI=?=
438
+ =?ISO-2022-JP?B?GyRCJGIkSCRGJGJEOSQkRDkkJEQ5JCQbKEI=?=
439
+ =?ISO-2022-JP?B?GyRCRDkkJEQ5JCREOSQkRDkkJEQ5JCQbKEI=?=
440
+ =?ISO-2022-JP?B?GyRCRDkkJEZ8S1w4bCU1JVYlOCUnJS8bKEI=?=
441
+ =?ISO-2022-JP?B?GyRCJUgkTiVGJTklSBsoQg==?=
442
+ '))
443
+ ok_eq('[test:34] very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long �ȃT�u�W�F�N�g�̃e�X�g',
444
+ c.decode_subject('[test:34] very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long =?ISO-2022-JP?B?GyRCJEolNSVWJTglJyUvJUgkTiVGJTkbKEI=?=
445
+ =?ISO-2022-JP?B?GyRCJUgbKEI=?=
446
+ '))
447
+
448
+ # test_clean_subject
449
+ ok_eq('t', c.clean_subject('t', 'test'))
450
+ ok_eq(' Re: Test ', c.clean_subject('[test:1] Re: Test ', 'test'))
451
+ ok_eq('Re: �e�X�g ', c.clean_subject('Re: [test:1] �e�X�g ', 'test'))
452
+ ok_eq('[hoge:2] ���� ', c.clean_subject('[hoge:2] ���� ', 'test'))
453
+ ok_eq('[ttt:3] ���� ', c.clean_subject('[ttt:3] ���� ', 'test'))
454
+
455
+ # test_rewrite_subject
456
+ ok_eq('[n:2] t', c.rewrite_subject('t', 'n', '2'))
457
+ ok_eq('[test:2] [t:3] test', c.rewrite_subject('[t:3] test', 'test', '2'))
458
+ ok_eq('[test:2] Re: Test Mail',
459
+ c.rewrite_subject('Re: [test:1] Test Mail', 'test', 2))
460
+ ok_eq('[test:2] Re: =?ISO-2022-JP?B?GyRCJUYlOSVIGyhCIA==?=',
461
+ c.rewrite_subject('Re: [test:1] �e�X�g ', 'test', 2))
462
+
463
+ # test_address_of_domain?
464
+ ok_eq(true, c.address_of_domain?('user@example.net', 'example.net'))
465
+ ok_eq(false, c.address_of_domain?('user@example.com', 'example.net'))
466
+ ok_eq(false, c.address_of_domain?('user', 'example.net'))
467
+
468
+ # test_content_type
469
+ ok_eq('text/plain', c.content_type('text/plain', nil))
470
+ ok_eq('text/plain; charset=iso-2022-jp',
471
+ c.content_type('text/plain', 'iso-2022-jp'))
472
+ end
473
+ end
474
+ end