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,282 @@
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/config'
7
+ require 'qwik/farm'
8
+ require 'qwik/mail'
9
+ require 'qwik/mailaddress'
10
+ require 'qwik/util-sendmail'
11
+ require 'qwik/util-pathname'
12
+ #require 'qwik/group-config'
13
+
14
+ module Qwik
15
+ class SendReportThread
16
+ def initialize(memory)
17
+ @memory = memory
18
+ end
19
+
20
+ def start
21
+ loop {
22
+ now = Time.now
23
+ sleep(calc_sleep_time(now))
24
+ begin
25
+ process
26
+ rescue Exception => e
27
+ p e
28
+ end
29
+ }
30
+ end
31
+
32
+ def send(interval)
33
+ farm = @memory.farm
34
+ farm.list.each {|sitename|
35
+ site = farm.get_site(sitename)
36
+ if site.siteconfig['reportmail'] == interval
37
+ site.send_report
38
+ end
39
+ }
40
+ end
41
+ end
42
+
43
+ class WeeklySendReportThread < SendReportThread
44
+ def calc_sleep_time(w)
45
+ t = Time.at(w.to_i + 60*60*24*7) # next week
46
+ nxt = Time.local(t.year, t.mon, t.day, 0, 0, 0, 0) # next
47
+ return (nxt - w).to_i
48
+ end
49
+
50
+ def process
51
+ send('weekly')
52
+ end
53
+ end
54
+
55
+ class DailySendReportThread < SendReportThread
56
+ def calc_sleep_time(w)
57
+ t = Time.at(w.to_i + 60*60*24) # next day
58
+ nxt = Time.local(t.year, t.mon, t.day, 0, 0, 0, 0) # next
59
+ return (nxt - w).to_i
60
+ end
61
+
62
+ def process
63
+ send('daily')
64
+ end
65
+ end
66
+
67
+ class HourlySendReportThread < SendReportThread
68
+ def calc_sleep_time(w)
69
+ t = Time.at(w.to_i + 60*60) # next hour
70
+ nxt = Time.local(t.year, t.mon, t.day, t.hour, 0, 0, 0) # next
71
+ return (nxt - w).to_i
72
+ end
73
+
74
+ def process
75
+ send('hourly')
76
+ end
77
+ end
78
+
79
+ class Site
80
+ def send_report
81
+ rep = self.make_report
82
+ return nil if rep.nil?
83
+ list = self.member.list(false) # Without obfuscation.
84
+
85
+ list.each {|user|
86
+ mail = generate_report_mail(user, rep)
87
+ sm = Sendmail.new(@config.smtp_host, @config.smtp_port, @config.test)
88
+ begin
89
+ sm.send(mail)
90
+ rescue => e
91
+ p 'error '+e
92
+ end
93
+ }
94
+ self.delete('_SiteChanged') # Destructive.
95
+ end
96
+
97
+ # private
98
+
99
+ def make_report
100
+ page = self['_SiteChanged']
101
+ return nil if page.nil?
102
+
103
+ report = ''
104
+ page.wikidb.array.each {|k, v|
105
+ user, cmd, pagename = v
106
+ user = 'anonymous' if user.nil? || user.empty?
107
+ user = MailAddress.obfuscate(user) if ! user.empty?
108
+ time = Time.at(k.to_i)
109
+ time_str = time.strftime('%H:%M')
110
+ url = self.page_url(pagename)
111
+ line = "#{time_str} #{user} #{cmd} #{url}\n"
112
+ report += line
113
+ }
114
+ return report
115
+ end
116
+
117
+ def generate_report_mail(user, rep)
118
+ domainurl = self.host_url
119
+ siteurl = self.site_url
120
+ f = self.siteconfig['reportfrom']
121
+ from = self.ml_address
122
+ from = f if f && ! f.empty?
123
+ mail = {
124
+ :from => from,
125
+ :to => user,
126
+ :subject => "#{siteurl} Report",
127
+ :content => "Recent changes on #{siteurl}\n\n#{rep}",
128
+ :precedence => "bulk",
129
+ }
130
+
131
+ lang = get_lang
132
+ if lang == 'ja'
133
+ mail[:subject] = "#{siteurl} ���|�[�g"
134
+ mail[:content] = "#{siteurl} �ɂ�����A�{���̕ҏW�L�^�ł��B\n\n#{rep}"
135
+ end
136
+
137
+ return mail
138
+ end
139
+
140
+ def get_lang
141
+ lang = 'en'
142
+ page = self['_GroupCharset']
143
+ return lang if page.nil?
144
+ content = page.load
145
+ charset = self.class.parse_charset(content)
146
+ return 'ja' if charset == 'iso-2022-jp'
147
+ return lang
148
+ end
149
+
150
+ # FIXME: Same as in group-config.rb
151
+ def self.parse_charset(content)
152
+ return (content.to_a.first || '').chomp
153
+ end
154
+ end
155
+ end
156
+
157
+ if $0 == __FILE__
158
+ require 'qwik/test-common'
159
+ $test = true
160
+ end
161
+
162
+ if defined?($test) && $test
163
+ class TestReportThread < Test::Unit::TestCase
164
+ include TestSession
165
+
166
+ def test_all
167
+ memory = @memory
168
+
169
+ # test_weekly_thread
170
+ @day = Qwik::WeeklySendReportThread.new(memory)
171
+ t = Time.now
172
+ eq(true, 0 < @day.calc_sleep_time(t))
173
+ t = Time.local(2000, 1, 1, 0, 0, 0) # 2000-01-01T00:00:00
174
+ eq(86400*7, @day.calc_sleep_time(t))
175
+ t = Time.local(2000, 1, 1, 0, 30, 0) # 2000-01-01T00:30:00
176
+ eq(603000, @day.calc_sleep_time(t))
177
+
178
+ # test_daily_thread
179
+ @day = Qwik::DailySendReportThread.new(memory)
180
+ t = Time.now
181
+ eq(true, 0 < @day.calc_sleep_time(t))
182
+ t = Time.local(2000, 1, 1, 0, 0, 0) # 2000-01-01T00:00:00
183
+ eq(86400, @day.calc_sleep_time(t))
184
+ t = Time.local(2000, 1, 1, 0, 30, 0) # 2000-01-01T00:30:00
185
+ eq(84600, @day.calc_sleep_time(t))
186
+
187
+ # test_hourly_thread
188
+ @day = Qwik::HourlySendReportThread.new(memory)
189
+ t = Time.now
190
+ eq(true, 0 < @day.calc_sleep_time(t))
191
+ t = Time.local(2000, 1, 1, 0, 0, 0) # 2000-01-01T00:00:00
192
+ eq(3600, @day.calc_sleep_time(t))
193
+ t = Time.local(2000, 1, 1, 0, 30, 0) # 2000-01-01T00:30:00
194
+ eq(1800, @day.calc_sleep_time(t))
195
+ end
196
+ end
197
+
198
+ class TestSiteReport < Test::Unit::TestCase
199
+ include TestSession
200
+
201
+ def test_all
202
+ t_add_user
203
+
204
+ # test_get_lang
205
+ t_make_public(Qwik::Site, :get_lang)
206
+ eq('en', @site.get_lang)
207
+
208
+ # test_generate_report_mail
209
+ t_make_public(Qwik::Site, :generate_report_mail)
210
+ mail = @site.generate_report_mail('user@e.com', 'test')
211
+ eq 'test@q.example.com', mail[:from]
212
+ eq 'user@e.com', mail[:to]
213
+ eq 'http://example.com/test/ Report', mail[:subject]
214
+ eq 'Recent changes on http://example.com/test/
215
+
216
+ test', mail[:content]
217
+
218
+ # test_get_lang_ja
219
+ page = @site.create('_GroupCharset')
220
+ page.put('iso-2022-jp
221
+ ')
222
+ eq('ja', @site.get_lang)
223
+
224
+ # test_generate_report_mail_ja
225
+ t_make_public(Qwik::Site, :generate_report_mail)
226
+ mail = @site.generate_report_mail('user@e.com', 'test')
227
+ eq 'test@q.example.com', mail[:from]
228
+ eq 'user@e.com', mail[:to]
229
+ eq 'http://example.com/test/ ���|�[�g', mail[:subject]
230
+ eq 'http://example.com/test/ �ɂ�����A�{���̕ҏW�L�^�ł��B
231
+
232
+ test', mail[:content]
233
+
234
+ # test_make_report
235
+ t_make_public(Qwik::Site, :make_report)
236
+ rep = @site.make_report
237
+ eq(nil, rep)
238
+
239
+ page = @site.create_new
240
+ page.store('t')
241
+
242
+ sitelog = @site.sitelog
243
+ sitelog.add(0, 'user@e.com', 'save', '1')
244
+ eq(',0,user@e.com,save,1
245
+ ', @site['_SiteChanged'].load)
246
+ sitelog.add(0, nil, 'save', '1')
247
+ eq(',0,user@e.com,save,1
248
+ ,0,,save,1
249
+ ', @site['_SiteChanged'].load)
250
+
251
+ # test_make_report2
252
+ eq('09:00 user@e... save http://example.com/test/1.html
253
+ 09:00 anonymous save http://example.com/test/1.html
254
+ ', @site.make_report)
255
+ eq(',0,user@e.com,save,1
256
+ ,0,,save,1
257
+ ', @site['_SiteChanged'].load)
258
+
259
+ # test_send_report
260
+ @site.send_report
261
+ eq(['test@q.example.com', 'user@e.com'], $smtp_sendmail[2..3])
262
+ assert_match(/test@q.example.com/, $smtp_sendmail[4])
263
+
264
+ header =
265
+ "From: test@q.example.com
266
+ To: user@e.com
267
+ Subject: http://example.com/test/ =?ISO-2022-JP?B?GyRCJWwlXSE8JUgbKEI=?=
268
+ Content-Type: text/plain; charset=\"ISO-2022-JP\"
269
+
270
+ "
271
+ body =
272
+ 'http://example.com/test/ �ɂ�����A�{���̕ҏW�L�^�ł��B
273
+
274
+ 09:00 user@e... save http://example.com/test/1.html
275
+ 09:00 anonymous save http://example.com/test/1.html
276
+
277
+ '
278
+ eq((header+body.set_sourcecode_charset.to_mail_charset),
279
+ $smtp_sendmail[4])
280
+ end
281
+ end
282
+ end
@@ -0,0 +1,230 @@
1
+ #
2
+ # Copyright (C) 2003-2006 Kouichirou Eto
3
+ # All rights reserved.
4
+ # This is free software with ABSOLUTELY NO WARRANTY.
5
+ #
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the GNU General Public License version 2.
8
+ #
9
+
10
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
11
+ require 'qwik/wabisabi-template'
12
+
13
+ module Qwik
14
+ class Site
15
+ # Make index before call this method. Use parent.
16
+ def resolve_all_ref(wabisabi)
17
+ wabisabi.index_each_tag(:a) {|e|
18
+ resolve_ref(e)
19
+ }
20
+ return wabisabi
21
+ end
22
+
23
+ def resolve_ref(w)
24
+ attr = w.attr
25
+ return w if attr.nil?
26
+
27
+ href = attr[:href]
28
+ return w if href.nil? || href.empty?
29
+
30
+ # External link.
31
+ if /^(?:http|https|ftp|file):\/\// =~ href
32
+ w.set_attr(:class=>'external')
33
+
34
+ # Make it redirect link.
35
+ if self.siteconfig['redirect'] == 'true'
36
+ w.set_attr(:href=>".redirect?url=#{href}")
37
+ end
38
+
39
+ return w
40
+ end
41
+
42
+ # Error check.
43
+ return w if href.include?('?') # ignore command link
44
+ return w if href[0] == ?/ # already resolved
45
+ return w if /\.html\z/ !~ href # ignore not html file
46
+
47
+ linkbase = href.sub(/\.html\z/, '')
48
+ text = w[2]
49
+
50
+ t = linkbase
51
+ page = self.get_by_title(t)
52
+ if page && page.key != t
53
+ w.set_attr(:href=>page.key+'.html')
54
+ return w
55
+ end
56
+
57
+ # Create a new page link.
58
+ if ! self.exist?(linkbase)
59
+ newlinkbase = linkbase.escape
60
+ edithref = ".new?t=#{newlinkbase}"
61
+
62
+ return [:span, {:class=>'new'}, text,
63
+ [:a, {:href=>edithref},
64
+ [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]]
65
+
66
+ end
67
+
68
+ # Rewrite inside to the page title.
69
+ if linkbase == text
70
+ t = self[linkbase].get_title
71
+ return w if t == linkbase
72
+ w[2] = t
73
+ return w
74
+ end
75
+
76
+ return w
77
+ end
78
+ end
79
+ end
80
+
81
+ if $0 == __FILE__
82
+ require 'qwik/test-common'
83
+ $test = true
84
+ end
85
+
86
+ if defined?($test) && $test
87
+ class TestSiteResolve < Test::Unit::TestCase
88
+ include TestSession
89
+
90
+ def ok(e, w)
91
+ ok_eq(e, @site.resolve_ref(w))
92
+ end
93
+
94
+ def test_all
95
+ res = session
96
+
97
+ ok([:a], [:a])
98
+ ok([:a, {:href=>''}, 't'], [:a, {:href=>''}, 't'])
99
+
100
+ # test_external
101
+ ok([:a, {:href=>'http://e/', :class=>'external'}, 't'],
102
+ [:a, {:href=>'http://e/'}, 't'])
103
+
104
+ # test_redirect
105
+ page = @site['_SiteConfig']
106
+ page.store(':redirect:true')
107
+ ok([:a, {:href=>'.redirect?url=http://e/', :class=>'external'}, 't'],
108
+ [:a, {:href=>'http://e/'}, 't'])
109
+ page.store('')
110
+
111
+ ok([:a, {:href=>'a?b'}, 't'],
112
+ [:a, {:href=>'a?b'}, 't'])
113
+ ok([:a, {:href=>'/t'}, 't'],
114
+ [:a, {:href=>'/t'}, 't'])
115
+ ok([:a, {:href=>'t'}, 't'],
116
+ [:a, {:href=>'t'}, 't'])
117
+
118
+ # test_new
119
+ ok([:span, {:class=>'new'}, 't',
120
+ [:a, {:href=>'.new?t=t'},
121
+ [:img, {:alt=>'create', :src=>'.theme/i/new.png'}]]],
122
+ [:a, {:href=>'t.html'}, 't'])
123
+
124
+ page = @site.create('t')
125
+ ok([:a, {:href=>'t.html'}, 't'], [:a, {:href=>'t.html'}, 't'])
126
+ page = @site.create_new
127
+ page.store('t')
128
+ ok([:a, {:href=>'1.html'}, '1'], [:a, {:href=>'1.html'}, '1'])
129
+ ok([:a, {:href=>'1.html'}, 't'], [:a, {:href=>'1.html'}, 't'])
130
+ page.store('*t')
131
+ ok([:a, {:href=>'1.html'}, 't'], [:a, {:href=>'1.html'}, '1'])
132
+ ok([:a, {:href=>'1.html'}, 't'], [:a, {:href=>'1.html'}, 't'])
133
+ ok([:a, {:href=>'1.html'}, 's'], [:a, {:href=>'1.html'}, 's'])
134
+
135
+ # test_error
136
+ ok([:a, {:href=>"\"D_R\", \"/v/w\""}, 't'],
137
+ [:a, {:href=>"\"D_R\", \"/v/w\""}, 't'])
138
+
139
+ # test_act
140
+ ok([:a, {:href=>'.attach'}, '.attach'],
141
+ [:a, {:href=>'.attach'}, '.attach'])
142
+
143
+ # test_plusplus
144
+ ok([:a, {:href=>'t.html'}, 't'],
145
+ [:a, {:href=>'t.html'}, 't'])
146
+ ok([:span, {:class=>'new'}, 'C++',
147
+ [:a, {:href=>'.new?t=C%2B%2B'},
148
+ [:img, {:alt=>'create', :src=>'.theme/i/new.png'}]]],
149
+ [:a, {:href=>'C++.html'}, 'C++'])
150
+ page.store('* C++')
151
+ ok([:a, {:href=>'1.html'}, 'C++'],
152
+ [:a, {:href=>'C++.html'}, 'C++'])
153
+ end
154
+
155
+ def test_japanese
156
+ res = session
157
+ page = @site.create_new
158
+ page.store('*��')
159
+
160
+ ok([:a, {:href=>'1.html'}, '��'],
161
+ [:a, {:href=>'��.html'}, '��'])
162
+
163
+ ok([:span, {:class=>'new'}, '��',
164
+ [:a, {:href=>'.new?t=%82%A2'},
165
+ [:img, {:alt=>'create', :src=>'.theme/i/new.png'}]]],
166
+ [:a, {:href=>'��.html'}, '��'])
167
+ end
168
+ end
169
+
170
+ class TestSiteResolveAll < Test::Unit::TestCase
171
+ include TestSession
172
+
173
+ def ok_all(e, w)
174
+ ok_eq(e, @site.resolve_all_ref(w))
175
+ end
176
+
177
+ def test_all
178
+ res = session
179
+ # test_ref
180
+ ok_all([[:span, {:class=>'new'}, 't',
181
+ [:a, {:href=>'.new?t=t'},
182
+ [:img, {:alt=>'create', :src=>'.theme/i/new.png'}]]]],
183
+ [[:a, {:href=>'t.html'}, 't']])
184
+ page = @site.create('t')
185
+ ok_all([[:a, {:href=>'t.html'}, 't']],
186
+ [[:a, {:href=>'t.html'}, 't']])
187
+ page = @site.create_new
188
+ page.store('t')
189
+ ok_all([[:a, {:href=>'1.html'}, '1']],
190
+ [[:a, {:href=>'1.html'}, '1']])
191
+ page.store('*t')
192
+ ok_all([[:a, {:href=>'1.html'}, 't']],
193
+ [[:a, {:href=>'1.html'}, '1']])
194
+ ok_all([[:a, {:href=>'.attach'}, '.attach']],
195
+ [[:a, {:href=>'.attach'}, '.attach']])
196
+ end
197
+
198
+ def test_all1
199
+ res = session
200
+
201
+ # test_newpage
202
+ ok_wi([:p, [:span, {:class=>'new'}, 'test',
203
+ [:a, {:href=>'.new?t=test'},
204
+ [:img, {:alt=>'create', :src=>'.theme/i/new.png'}]]]],
205
+ '[[test]]')
206
+ ok_wi([:p, [:span, {:class=>'new'}, '��',
207
+ [:a, {:href=>'.new?t=%82%A2'},
208
+ [:img, {:alt=>'create', :src=>'.theme/i/new.png'}]]]],
209
+ '[[��]]')
210
+ end
211
+
212
+ def test_all2
213
+ res = session
214
+
215
+ # test_act
216
+ ok_wi([:p, 't', [:a, {:href=>'.attach'}, '.attach']],
217
+ 't[[.attach]]')
218
+ ok_wi([:p, [:a, {:href=>'.attach'}, '.attach']], '[[.attach]]')
219
+ ok_wi([:p, [:a, {:href=>'.attach'}, 'FileAttach']],
220
+ '[[FileAttach|.attach]]')
221
+ ok_wi([:p, [:a, {:href=>'.attach'}, '�t�@�C���Y�t']],
222
+ '[[�t�@�C���Y�t|.attach]]')
223
+
224
+ # test_mojibake
225
+ ok_wi([:p, 't'], 't')
226
+ ok_wi([:p, '450�~'], '450�~')
227
+ end
228
+
229
+ end
230
+ end