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,248 @@
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 Action
9
+ def pagelist_update
10
+ running_path = @site.cache_path + "pagelist.dat.running"
11
+ pagelist_path = @site.cache_path + "pagelist.dat"
12
+
13
+ return if running_path.exist?
14
+
15
+ Thread.new {
16
+ running_path.write("running")
17
+
18
+ ar = []
19
+ list = @site.date_list
20
+ list.reverse.each {|page|
21
+ key = page.key
22
+ time = page.mtime.to_i
23
+ title = page.get_title
24
+ ar << [key, time, title]
25
+ }
26
+ dat = Marshal.dump(ar)
27
+ pagelist_path.write(dat)
28
+
29
+ running_path.unlink if running_path.exist?
30
+ }
31
+ end
32
+
33
+ def pagelist_get
34
+ pagelist_path = @site.cache_path + "pagelist.dat"
35
+
36
+ unless pagelist_path.exist?
37
+ pagelist_update
38
+ return []
39
+ end
40
+
41
+ dat = pagelist_path.read
42
+ ar = Marshal.load(dat)
43
+ return ar
44
+ end
45
+
46
+ def act_list
47
+ c_surface(_('Page List'), true) {
48
+ [:div, {:class=>'day'},
49
+ [:div, {:class=>'section'},
50
+ plg_title_list]]
51
+ }
52
+ end
53
+
54
+ def plg_title_list
55
+ str = @site.title_list.map {|page|
56
+ "- #{page.mtime.ymd} : [[#{page.key}]]"
57
+ }.join("\n")
58
+ return c_res(str)
59
+ end
60
+
61
+ def act_recent(max = -1)
62
+ str = recent_str(max)
63
+ c_surface(_('Recent Changes'), true) {
64
+ [:div, {:class=>'day'},
65
+ [:div, {:class=>'section'}, c_res(str)]]
66
+ }
67
+ end
68
+
69
+ def plg_recent_list(max = -1)
70
+ return c_res(recent_str(max))
71
+ end
72
+ alias :plg_recent :plg_recent_list
73
+
74
+ def plg_side_recent(*a)
75
+ return [
76
+ [:h2, _('Recent change')],
77
+ plg_srecent(*a)
78
+ ]
79
+ end
80
+
81
+ def plg_srecent(max = -1)
82
+ max = max.to_i
83
+ ar = []
84
+
85
+ now = @req.start_time
86
+
87
+ list = pagelist_get
88
+ overflow = nil
89
+ list.each_with_index {|a, i|
90
+ if 0 <= max && max < (i += 1)
91
+ overflow = [:p,{:class=>'recent'},
92
+ [:a, {:href=>'RecentList.html'}, [:em, _('more...')]]]
93
+ break
94
+ end
95
+
96
+ key, t, title = a
97
+ time = Time.at(t)
98
+ difftime = now.to_i - time.to_i
99
+ timestr = time.ymdx.to_s
100
+ li = [:li,
101
+ [:a, {:href=>"#{key}.html", :title=>timestr}, title]]
102
+ if @req.user
103
+ li += [' ', [:span, {:class=>'ago'},
104
+ int_to_time(difftime)+_(' ago')]]
105
+ end
106
+ ar << li
107
+ }
108
+ div = [:div, {:class=>'recent'}, [:ul, ar]]
109
+ div << overflow if overflow
110
+ return div
111
+ end
112
+
113
+ def nu_plg_srecent(max = -1)
114
+ max = max.to_i
115
+ ar = []
116
+ now = @req.start_time
117
+ list = @site.date_list
118
+ overflow = nil
119
+ list.reverse.each_with_index {|page, i|
120
+ if 0 <= max && max < (i += 1)
121
+ overflow = [:p,{:class=>'recent'},
122
+ [:a, {:href=>'RecentList.html'}, [:em, _('more...')]]]
123
+ break
124
+ end
125
+ time = page.mtime
126
+ difftime = now.to_i - time.to_i
127
+ timestr = time.ymdx.to_s
128
+ li = [:li,
129
+ [:a, {:href=>"#{page.key}.html", :title=>timestr}, page.get_title]]
130
+ if @req.user
131
+ li += [' ', [:span, {:class=>'ago'},
132
+ int_to_time(difftime)+_(' ago')]]
133
+ end
134
+ ar << li
135
+ }
136
+ div = [:div, {:class=>'recent'}, [:ul, ar]]
137
+ div << overflow if overflow
138
+ return div
139
+ end
140
+
141
+ def recent_str(max = -1)
142
+ max = max.to_i
143
+ ar = []
144
+ last_day = nil
145
+ add_day = true
146
+ @site.date_list.reverse.each_with_index {|page, i|
147
+ break if 0 <= max && max < (i += 1)
148
+ if add_day
149
+ day = page.mtime.ymd.to_s
150
+ if last_day.nil? || day != last_day
151
+ ar << "** #{day}"
152
+ last_day = day
153
+ end
154
+ end
155
+ ar << "- [[#{page.key}]]"
156
+ }
157
+ ar.join("\n")
158
+ end
159
+
160
+ def int_to_time(n)
161
+ return n.to_s+_('sec.') if n < 60 # under 1 min
162
+ return (n/60).to_s+_('min.') if n < 60*60 # under 1 hour
163
+ return (n/(60*60)).to_s+_('hour') if n < 60*60*24 # under 1 day
164
+ return (n/(60*60*24)).to_s+_('day') if n < 60*60*24*30 # under 1 month
165
+ return (n/(60*60*24*30)).to_s+_('month') if n < 60*60*24*365 # under 1 year
166
+ return (n/(60*60*24*365)).to_s+_('year') if n < 60*60*24*365*100 # under 1 century
167
+ return (n/(60*60*24*365*100)).to_s+_('century')
168
+ end
169
+ end
170
+ end
171
+
172
+ if $0 == __FILE__
173
+ require 'qwik/test-common'
174
+ $test = true
175
+ end
176
+
177
+ if defined?($test) && $test
178
+ class TestActList < Test::Unit::TestCase
179
+ include TestSession
180
+
181
+ def test_title_list
182
+ t_add_user
183
+ res = session('/test/.list')
184
+ ok_title('Page List')
185
+ ok_wi(/<ul><li>/, "{{title_list}}")
186
+ ok_wi(%r| : <a href="1.html">1</a></li>|, "{{title_list}}")
187
+ end
188
+
189
+ def test_recent_list
190
+ t_add_user
191
+ res = session('/test/.recent')
192
+ ok_title('Recent Changes')
193
+ ok_wi(/<h3>/, "{{recent_list}}")
194
+ ok_wi(%r|<li><a href=\"1.html\">1</a></li>|, "{{recent}}")
195
+ ok_wi(/<h3>/, "{{recent_list(1)}}")
196
+ end
197
+
198
+ def test_srecent
199
+ t_add_user
200
+
201
+ # test with no pages.
202
+ ok_wi [:div, {:class=>"recent"}, [:ul, []]], "{{srecent}}"
203
+
204
+ # test with a page.
205
+ page = @site["1"]
206
+ page.put_with_time("* t1", 1)
207
+ @action.pagelist_update
208
+ ok_wi [:div, {:class=>"recent"},
209
+ [:ul,
210
+ [[:li,
211
+ [:a, {:href=>"1.html", :title=>"1970-01-01 09:00:01"}, "t1"],
212
+ " ",
213
+ [:span, {:class=>"ago"}, "-1sec. ago"]]]]], "{{srecent}}"
214
+
215
+ # test with two pages.
216
+ page = @site.create("2")
217
+ page.put_with_time("* t2", 2)
218
+ @action.pagelist_update
219
+ =begin
220
+ ok_wi [:div, {:class=>"recent"},
221
+ [:ul,
222
+ [[:li,
223
+ [:a, {:href=>"1.html", :title=>"2009-09-04 10:16:25"}, "1"],
224
+ " ",
225
+ [:span, {:class=>"ago"}, "-1252026985sec. ago"]],
226
+ [:li,
227
+ [:a, {:href=>"2.html", :title=>"1970-01-01 09:00:02"}, "t2"],
228
+ " ",
229
+ [:span, {:class=>"ago"}, "-2sec. ago"]]]]], "{{srecent}}"
230
+ =end
231
+ end
232
+
233
+ def ok_time(e, n)
234
+ eq e, @action.int_to_time(n)
235
+ end
236
+
237
+ def test_time
238
+ res = session
239
+ ok_time '1sec.', 1
240
+ ok_time '1min.', 60
241
+ ok_time '1hour', 60*60
242
+ ok_time '1day', 60*60*24
243
+ ok_time '1month', 60*60*24*30
244
+ ok_time '1year', 60*60*24*365
245
+ ok_time '1century', 60*60*24*365*100
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,145 @@
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 Action
9
+ D_PluginPassword = {
10
+ :dt => 'Set password plugin',
11
+ :dd => 'You can lock a page by a password.',
12
+ :dc => "* Example
13
+ {{password(\"a password string\")}}
14
+ You can lock your page by setting this password plugin.
15
+
16
+ '''Warning:''' There is no way to unlock the page.
17
+ If you forgot your password, you can not edit the page.
18
+ Please be careful.
19
+ "
20
+ }
21
+
22
+ D_PluginPassword_ja = {
23
+ :dt => '�p�X���[�h�ی�v���O�C��',
24
+ :dd => '�y�[�W���p�X���[�h�ŕی삷�邱�Ƃ��ł��܂��B',
25
+ :dc => "* ��
26
+ {{password(\"a password string\")}}
27
+ ���̂悤�ȃv���O�C�����y�[�W�ɖ����ނƁA
28
+ ���̃y�[�W�̓p�X���[�h�ŕی삳��܂��B
29
+
30
+ '''����:''' ���݂͂܂��p�X���[�h������������@��񋟂��Ă܂���B
31
+ �����p�X���[�h��Y�ꂽ�ꍇ�́A�y�[�W��ҏW�ł��Ȃ��Ȃ�܂��̂ŁA
32
+ �C���‚��Ă��������B
33
+ "
34
+ }
35
+
36
+ def plg_password(pass=nil)
37
+ # password plugin is parsed in act-edit.rb
38
+ return nil
39
+ end
40
+ end
41
+
42
+ # These methods will be used in ext_save
43
+ class Page
44
+ def get_password
45
+ return Page.get_password(self.load)
46
+ end
47
+
48
+ def self.get_password(str)
49
+ return $1 if str && /\{\{password\((.+)\)\}\}/ =~ str
50
+ return nil
51
+ end
52
+
53
+ def self.embed_password(content)
54
+ new_pass = get_password(content)
55
+ return content if new_pass.nil? # Nothing to embed.
56
+ new_content = content.sub(/\{\{password\((.+)\)\}\}/) {
57
+ "{{password(#{$1.md5hex})}}"
58
+ }
59
+ return new_content
60
+ end
61
+
62
+ def match_password?(v)
63
+ old_pass_md5 = self.get_password
64
+ return true if old_pass_md5.nil? # No password. Go on.
65
+ new_pass_md5 = Page.get_password(v) # assume already become md5
66
+ return false if new_pass_md5.nil? # Can not go if there is no pass
67
+ return false if new_pass_md5 != old_pass_md5 # should be correct pass
68
+ return true # Go on.
69
+ end
70
+ end
71
+ end
72
+
73
+ if $0 == __FILE__
74
+ require 'qwik/test-common'
75
+ $test = true
76
+ end
77
+
78
+ if defined?($test) && $test
79
+ class TestActPassword < Test::Unit::TestCase
80
+ include TestSession
81
+
82
+ def test_password
83
+ @pages = Qwik::Pages.new(@config, @dir)
84
+ page = @pages.create('1')
85
+ page.store('test2')
86
+
87
+ eq 'test2', page.load
88
+ # The text is rewrite to the text with embeded password.
89
+ text = Qwik::Page.embed_password('take1 {{password(testpassword)}}')
90
+ eq "take1 {{password(e16b2ab8d12314bf4efbd6203906ea6c)}}", text
91
+ page.store(text)
92
+
93
+ eq "e16b2ab8d12314bf4efbd6203906ea6c", page.get_password
94
+
95
+ take2 = Qwik::Page.embed_password('take2 {{password(notcorrectpassword)}}')
96
+ eq false, page.match_password?(take2) # NG
97
+
98
+ take3 = Qwik::Page.embed_password('take3 {{password(testpassword)}}')
99
+ eq true, page.match_password?(take3)
100
+ page.store(take3) # OK
101
+ assert_match(/take3/, page.load)
102
+ eq "take3 {{password(e16b2ab8d12314bf4efbd6203906ea6c)}}", page.load
103
+
104
+ eq "e16b2ab8d12314bf4efbd6203906ea6c", page.get_password
105
+ eq 'testpassword'.md5hex, page.get_password
106
+ @pages.erase_all
107
+ end
108
+
109
+ def test_usecase_password
110
+ t_add_user
111
+
112
+ page = @site.create_new
113
+ page.store("test\n")
114
+ res = session('/test/1.html')
115
+ ok_in(['test'], "//div[@class='section']/p")
116
+
117
+ res = session('/test/1.edit')
118
+ assert_text("test\n", 'textarea')
119
+
120
+ res = session('/test/1.save?contents=test%0A{{password(test)}}%0A')
121
+ ok_title('Page is saved.')
122
+
123
+ res = session('/test/1.edit')
124
+ assert_text("test\n{{password(098f6bcd4621d373cade4e832627b4f6)}}\n",
125
+ 'textarea')
126
+
127
+ res = session('/test/1.save?contents=t2%0A{{password(test)}}%0A')
128
+ ok_title('Page is saved.')
129
+
130
+ res = session('/test/1.edit')
131
+ assert_text("t2\n{{password(098f6bcd4621d373cade4e832627b4f6)}}\n",
132
+ 'textarea')
133
+
134
+ res = session('/test/1.save?contents=t3%0A{{password(nomatch)}}%0A')
135
+ ok_in([[:tt, '{{password('], 'Password', [:tt, ')}}']],
136
+ "//div[@class='section']/p")
137
+ assert_text("t3\n{{password(nomatch)}}\n", 'textarea')
138
+
139
+ res = session('/test/1.save?contents=t3%0A{{password(test)}}%0A')
140
+ ok_title('Page is saved.')
141
+ eq "t3\n{{password(098f6bcd4621d373cade4e832627b4f6)}}\n",
142
+ page.load
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,210 @@
1
+ # -*- coding: shift_jis -*-
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
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
7
+ require 'qwik/site-plan'
8
+
9
+ module Qwik
10
+ class Action
11
+ D_PluginPlan = {
12
+ :dt => 'Show plan plugin',
13
+ :dd => 'You can show the plan of this group.',
14
+ :dc => "* Example
15
+ {{plan}}
16
+ {{plan}}
17
+ You can see plans of this group.
18
+ If there are no plan for this group, you see nothing.
19
+ * How to create new plan.
20
+ Follow '''Create a new plan''' link and create a new plan page.
21
+ You'll see plans on sidemenu.
22
+ '''Notice''' We changed the format of the date of pages.
23
+ You can not use tag notation to specify date now.
24
+ "
25
+ }
26
+
27
+ D_PluginPlan_ja = {
28
+ :dt => '�\��\���v���O�C��',
29
+ :dd => '�\���\�����܂��B',
30
+ :dc => '* ��
31
+ {{plan}}
32
+ {{plan}}
33
+ �����\�肪�o�^����Ă���ꍇ�́A���̃v���O�C���ŕ\������܂��B
34
+ * �\��̓o�^���@
35
+ ��ԉ��́u�V�����\���o�^����v�Ƃ��������N�����ǂ��āA
36
+ �V�����\��y�[�W��������������B
37
+ �T�C�h���j���[�ɗ\�肪�\�������悤�ɂȂ�܂��B
38
+ �ߋ��̗\��͕\������܂���B�܂���N�ȏ��̗\����\������܂���B
39
+ �ꃖ������x�̗\���o�^���Ă݂Ă��������B
40
+
41
+ \'\'\'����\'\'\' �ȑO�̓^�O�L�@�ɂ����t�w����̗p���Ă��܂������A
42
+ �V�����o�[�W���������L�̐V�K�\��y�[�W�����ɐ؂�ւ��܂����B
43
+ �䗹���������B
44
+ '
45
+ }
46
+
47
+ def plg_side_plan
48
+ div = [:div, [:h2, _('Plan')]]
49
+ pages = @site.get_pages_with_date
50
+ div << plan_make_html(pages) if ! pages.empty?
51
+ div << [:p, plg_new_plan]
52
+ return div
53
+ end
54
+
55
+ def plg_plan
56
+ div = [:div, [:h2, _('Plan')]]
57
+ pages = @site.get_pages_with_date
58
+ return if pages.empty?
59
+ div << plan_make_html(pages)
60
+ div << [:p, plg_new_plan]
61
+ return div
62
+ end
63
+
64
+ def plg_new_plan
65
+ return [:a, {:href=>'.plan'}, _('Create a new plan')]
66
+ end
67
+
68
+ def plan_make_html(pages)
69
+ day = 60 * 60 * 24
70
+ nowi = @req.start_time.to_i
71
+ pages = pages.select {|pagekey, datei|
72
+ page = @site[pagekey]
73
+ diff = datei - nowi
74
+ -day < diff
75
+ }
76
+ return nil if pages.empty?
77
+
78
+ ul = [:ul]
79
+ pages.sort_by {|pagekey, datei|
80
+ datei
81
+ }.each {|pagekey, datei|
82
+ page = @site[pagekey]
83
+ title = page.get_title
84
+ date = Time.at(datei)
85
+ now = Time.at(nowi)
86
+ date_abbr = Time.date_abbr(now, date)
87
+ em_title = Time.date_emphasis(now, date, title)
88
+ ul << [:li, "#{date_abbr} ", [:a, {:href=>"#{pagekey}.html"}, em_title]]
89
+ }
90
+ return ul
91
+ end
92
+
93
+ # Make a new plan.
94
+ def act_plan
95
+ date = @req.query['date']
96
+ title = @req.query['title']
97
+ if date.nil? || date.empty? || title.nil? || title.empty?
98
+ date_attr = {:name=>'date', :class => 'focus'}
99
+ date_attr[:value] = @req.start_time.ymd_s
100
+ date_attr[:value] = date if date && ! date.empty?
101
+ title_attr = {:name=>'title'}
102
+ title_attr[:value] = 'Plan'
103
+ title_attr[:value] = title if title && ! title.empty?
104
+ form = [:form, {:action=>'.plan', :method=>'POST'},
105
+ [:dl,
106
+ [:dt, _('Date')],
107
+ [:dd, [:input, date_attr]],
108
+ [:dt, _('Title')],
109
+ [:dd, [:input, title_attr]]],
110
+ [:input, {:type=>'submit', :value=>_('Create a new plan')}]]
111
+ return c_notice(_('New plan')) {
112
+ [[:h2, _('New plan')],
113
+ [:div, {:class=>'plan form'},
114
+ form]]
115
+ }
116
+ end
117
+
118
+ # Create a new plan
119
+ #page = @site.create_new # CREATE
120
+
121
+ dateobj = Time.parse(date)
122
+
123
+ pagename = "plan_#{dateobj.ymd_s}"
124
+ page = @site[pagename]
125
+ msg = _('Already Exists.')
126
+ if page.nil?
127
+ msg = _('Created.')
128
+ page = @site.create(pagename) # CREATE
129
+ page.store("* #{title}\n") # Specify title.
130
+ end
131
+
132
+ url = "#{page.key}.edit"
133
+ return c_notice(_('New plan'), url, 201) { # 201, Created
134
+ [[:h2, msg],
135
+ [:p, [:a, {:href=>url}, _('Edit new page')]]]
136
+ }
137
+ end
138
+ end
139
+ end
140
+
141
+ if $0 == __FILE__
142
+ require 'qwik/test-common'
143
+ $test = true
144
+ end
145
+
146
+ if defined?($test) && $test
147
+ class TestActPlan < Test::Unit::TestCase
148
+ include TestSession
149
+
150
+ def create_plan_pages(site)
151
+ page = site.create 'plan_19700101'
152
+ page.store("* t")
153
+ page = site.create 'plan_19700115'
154
+ page.store("* t")
155
+ page = site.create 'plan_19700201'
156
+ page.store("* t")
157
+ page = site.create 'plan_19710101'
158
+ page.store("* t")
159
+ end
160
+
161
+ def test_plg_plan
162
+ ok_wi([], '{{plan}}')
163
+
164
+ create_plan_pages(@site)
165
+
166
+ ok_wi [:div,
167
+ [:h2, "Plan"],
168
+ [:ul,
169
+ [:li, "01-01 ", [:a, {:href=>"plan_19700101.html"}, [:strong, "t"]]],
170
+ [:li, "01-15 ", [:a, {:href=>"plan_19700115.html"}, [:em, "t"]]],
171
+ [:li, "02-01 ", [:a, {:href=>"plan_19700201.html"},
172
+ [:span, {:class=>"future"}, "t"]]],
173
+ [:li, "1971-01-01 ", [:a, {:href=>"plan_19710101.html"},
174
+ [:span, {:class=>"future"}, "t"]]]],
175
+ [:p, [:a, {:href=>".plan"}, "Create a new plan"]]],
176
+ '{{plan}}'
177
+
178
+ # $KCODE = 'n'
179
+ eq "\227\\\222\350", '�\��'
180
+ end
181
+
182
+ def ok_date(num, date)
183
+ assert_equal(num, Time.parse(date).to_i + Time::now.utc_offset)
184
+ end
185
+
186
+ def test_parsedate
187
+ ok_date 0, '1970-01-01'
188
+ ok_date 0, '19700101'
189
+ ok_date 0, '1970/01/01'
190
+ ok_date 0, '1970/1/1'
191
+ end
192
+
193
+ def test_plan
194
+ t_add_user
195
+
196
+ ok_wi [:div, [:h2, "Plan"], [:p, [:a, {:href=>".plan"},
197
+ "Create a new plan"]]], '{{side_plan}}'
198
+
199
+ # Go create a new plan page.
200
+ res = session '/test/.plan'
201
+ ok_in ["New plan"], '//h1'
202
+ ok_attr({:action=>".plan", :method=>"POST"}, '//form')
203
+ ok_attr({:value=>"19700101", :class=>"focus", :name=>"date"}, '//input')
204
+ ok_attr({:value=>"Plan", :name=>"title"}, '//input[2]')
205
+
206
+ page = @site.create_new
207
+ page.store('t1')
208
+ end
209
+ end
210
+ end