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,304 @@
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/act-file'
7
+
8
+ module Qwik
9
+ class Action
10
+ def act_attach
11
+ if @req.query['c'] == 'del'
12
+ c_require_member
13
+ filename = @req.query['f']
14
+ return attach_delete(filename) if @req.is_post? # delete it
15
+ return attach_delete_confirm(filename) # confirm before delete
16
+ end
17
+
18
+ args = @req.path_args
19
+ if 0 < args.length # has target file
20
+ filename = args.join('/')
21
+ filename.set_url_charset
22
+ filename = Filename.decode(filename)
23
+ if ! @site.attach.exist?(filename)
24
+ return c_notfound(_('No such file'))
25
+ end
26
+ return attach_send_file(filename) # send it
27
+ end
28
+
29
+ content = @req.query['content']
30
+ return attach_put_file(filename, content) if content
31
+
32
+ # show attach form and the list of files
33
+ return attach_form_and_list
34
+ end
35
+ alias ext_attach act_attach
36
+
37
+ def attach_send_file(filename)
38
+ @res.set_content_type(Filename.extname(filename))
39
+ file = @site.attach.path(filename)
40
+ return c_simple_send(file.to_s)
41
+ end
42
+
43
+ def attach_put_file(filename, content)
44
+ c_require_member
45
+ c_require_post
46
+
47
+ filename = content.filename
48
+ basename = Action.get_basename(filename)
49
+ basename.set_url_charset
50
+ basename = Filename.decode(basename)
51
+ res = basename
52
+ res = @site.attach.fput(basename, content)
53
+
54
+ attach_rewrite_page(res)
55
+
56
+ backpage = '.attach'
57
+
58
+ return c_notice(_('File attachment completed')) {
59
+ [[:p, [:strong, res], ' : ', _('The file is saved.')],
60
+ [:p, [:a, {:href=>backpage}, _('Go back')]]]
61
+ }
62
+ end
63
+
64
+ def self.get_basename(filename)
65
+ basename = filename.sub(/\A.*[\/\\]([^\/\\]+)\z/) { $1 }
66
+ return basename
67
+ end
68
+
69
+ def attach_rewrite_page(basename)
70
+ page = @site[@req.base]
71
+ v = page.load
72
+ if /\{\{ref\}\}/ =~ v
73
+ v.sub!(/\{\{ref\}\}/){ "{{ref(#{basename})}}" } # only once
74
+ page.store(v)
75
+ end
76
+ end
77
+
78
+ def attach_form_and_list
79
+ c_require_member
80
+
81
+ div = []
82
+ div << [:div, {:class=>'msg'},
83
+ [:p, _('Attach a file')],
84
+ attach_form]
85
+
86
+ list = attach_file_list
87
+
88
+ if list
89
+ div << [:br]
90
+ div << [:div, {:class=>'msg'},
91
+ [:p, _('File list')],
92
+ [:ul, list]]
93
+ end
94
+
95
+ return c_notice(_('Attach file')) { div }
96
+ end
97
+
98
+ def attach_form(a=nil)
99
+ return [:form, {:action=>a, :method=>'post',
100
+ :enctype=>'multipart/form-data'},
101
+ [:input, {:type=>'file', :name=>'content'}],
102
+ [:br],
103
+ [:input, {:type=>'submit', :value=>'attach'}]]
104
+ end
105
+
106
+ def attach_file_list
107
+ base = c_relative_to_root('.attach')
108
+ list = []
109
+ @site.attach.each {|file|
110
+ encoded = Filename.encode(file)
111
+ list << [:li, [:a, {:href=>"#{base}/#{encoded}"}, file.to_page_charset],
112
+ [:span, {:class=>'delete'},
113
+ ' (', [:a, {:href=>"#{base}?c=del&f=#{encoded}"}, _('Delete')], ')']]
114
+ }
115
+ return nil if list.length == 0
116
+ return list
117
+ end
118
+
119
+ def attach_delete_confirm(filename)
120
+ return c_notice(_('Confirm file deletion')) {
121
+ [:form, {:method=>'POST', :action=>'.attach'},
122
+ [:p, _("Push 'Delete' to delete a file")],
123
+ [:input, {:type=>'hidden', :name=>'c', :value=>'del'}],
124
+ [:input, {:type=>'hidden', :name=>'f', :value=>filename}],
125
+ [:p, [:input, {:type=>'submit', :value=>_('Delete')}]]]
126
+ }
127
+ end
128
+
129
+ def attach_delete(filename)
130
+ c_require_post
131
+ url = '.attach'
132
+ begin
133
+ filename.set_url_charset
134
+ filename = Filename.decode(filename)
135
+ @site.attach.delete(filename)
136
+ rescue FileNotExist
137
+ return c_nerror(_('Already deleted.'), url)
138
+ rescue FailedToDelete
139
+ return c_nerror(_('Failed to delete.'), url)
140
+ end
141
+ return c_notice(_('The file has been deleted.')) {
142
+ [:p, [:a, {:href=>url}, _('Go back')]]
143
+ }
144
+ end
145
+ end
146
+ end
147
+
148
+ if $0 == __FILE__
149
+ require 'qwik/test-common'
150
+ $test = true
151
+ end
152
+
153
+ if defined?($test) && $test
154
+ class TestActAttach < Test::Unit::TestCase
155
+ include TestSession
156
+
157
+ def test_attach
158
+ # Only member can access attach form.
159
+ res = session('/test/.attach')
160
+ ok_title('Members Only')
161
+
162
+ t_add_user
163
+
164
+ # Check directory.
165
+ ok_eq('.test/data/test', @site.path.to_s)
166
+ attach_path = @site.path+'.attach'
167
+ ok_eq('.test/data/test/.attach', attach_path.to_s)
168
+
169
+ filename = 't.txt'
170
+ file = attach_path+filename
171
+ file.unlink if file.exist?
172
+
173
+ # See form.
174
+ res = session('/test/.attach')
175
+ ok_title('Attach file')
176
+ ok_xp([:form, {:method=>'post', :action=>nil,
177
+ :enctype=>'multipart/form-data'},
178
+ [:input, {:type=>'file', :name=>'content'}],
179
+ [:br],
180
+ [:input, {:value=>'attach', :type=>'submit'}]],
181
+ "//div[@class='msg']/form")
182
+
183
+ # Try to get a file. But there is no file yet.
184
+ res = session('/test/.attach/t.txt')
185
+ ok_title('No such file')
186
+
187
+ d = @dir+'.attach'
188
+ d.erase_all_for_test if d.exist?
189
+
190
+ # Put a file.
191
+ res = session('POST /test/.attach') {|req|
192
+ req.query.update('content'=>t_make_content('t.txt', 't'))
193
+ }
194
+ ok_title('File attachment completed')
195
+
196
+ # Get the file.
197
+ res = session('/test/.attach/t.txt')
198
+ ok_eq('text/plain', res['Content-Type'])
199
+ ok_eq('t', res.body)
200
+
201
+ # Put a file with same file name again.
202
+ # The file is saved as another filename.
203
+ res = session('POST /test/.attach') {|req|
204
+ req.query.update('content'=>t_make_content('t.txt', 't2'))
205
+ }
206
+ ok_title('File attachment completed')
207
+
208
+ # Show the list of attached files.
209
+ res = session('/test/.attach')
210
+ ok_title('Attach file')
211
+ ok_xp([:form, {:method=>'post', :action=>nil,
212
+ :enctype=>'multipart/form-data'},
213
+ [:input, {:type=>'file', :name=>'content'}],
214
+ [:br],
215
+ [:input, {:value=>'attach', :type=>'submit'}]],
216
+ "//div[@class='msg']/form")
217
+ ok_xp([:a, {:href=>'/test/.attach/1-t.txt'}, '1-t.txt'], '//ul/li/a[1]')
218
+ ok_xp([:a, {:href=>'/test/.attach?c=del&f=1-t.txt'}, 'Delete'],
219
+ '//ul/li/a[2]')
220
+ ok_xp([:a, {:href=>'/test/.attach/t.txt'}, 't.txt'], '//ul/li[2]/a[1]')
221
+ ok_xp([:a, {:href=>'/test/.attach?c=del&f=t.txt'}, 'Delete'],
222
+ '//ul/li[2]/a[2]')
223
+
224
+ # Show a form to delete the file.
225
+ res = session('/test/.attach?c=del&f=t.txt')
226
+ ok_title('Confirm file deletion')
227
+
228
+ # Delete it.
229
+ res = session('POST /test/.attach?c=del&f=t.txt')
230
+ ok_title('The file has been deleted.')
231
+
232
+ # Try to delete it again. But the file is already deleted.
233
+ res = session('POST /test/.attach?c=del&f=t.txt')
234
+ ok_title('Already deleted.')
235
+
236
+ # Try to get file agin. But the file is already deleted.
237
+ res = session('/test/.attach/t.txt')
238
+ ok_title('No such file')
239
+ end
240
+
241
+ def test_attach_with_rewrite
242
+ t_add_user
243
+
244
+ file = @site.attach.path('t.txt')
245
+ file.unlink if file.exist?
246
+
247
+ # See the page.
248
+ ok_wi([], '{{ref}}')
249
+
250
+ page = @site['1']
251
+ ok_eq('{{ref}}', page.load)
252
+
253
+ # Put a file.
254
+ res = session('POST /test/1.attach') {|req|
255
+ req.query.update('content'=>t_make_content('t.txt', 't'))
256
+ }
257
+ ok_title('File attachment completed')
258
+ ok_eq('{{ref(t.txt)}}', page.load)
259
+
260
+ res = session('/test/1.html')
261
+ ok_xp([:div, {:class=>"section"},
262
+ [[:div, {:class=>'ref'},
263
+ [:a, {:href=>'.attach/t.txt'}, 't.txt']]]],
264
+ "//div[@class='section']")
265
+ end
266
+
267
+ def test_attach_with_dir
268
+ t_add_user
269
+
270
+ d = @dir+'.attach'
271
+ d.erase_all_for_test if d.exist?
272
+
273
+ # Try to get a file.
274
+ res = session('/test/.attach/.thumb/t.jpg')
275
+ ok_title('No such file')
276
+
277
+ thumb_dir = d+'.thumb'
278
+ thumb_dir.check_directory
279
+ thumb = thumb_dir+'t.jpg'
280
+ thumb.put('dummy')
281
+
282
+ res = session('/test/.attach/.thumb/t.jpg')
283
+ ok_eq('dummy', res.body)
284
+ ok_eq('image/jpeg', @res['Content-Type'])
285
+ end
286
+
287
+ def test_attach_to_page
288
+ t_add_user
289
+
290
+ page = @site.create_new
291
+ page.store('t')
292
+
293
+ # See form.
294
+ res = session('/test/1.attach')
295
+ ok_title('Attach file')
296
+ ok_xp([:form, {:method=>'post', :action=>nil,
297
+ :enctype=>'multipart/form-data'},
298
+ [:input, {:type=>'file', :name=>'content'}],
299
+ [:br],
300
+ [:input, {:value=>'attach', :type=>'submit'}]],
301
+ "//div[@class='msg']/form")
302
+ end
303
+ end
304
+ end
@@ -0,0 +1,236 @@
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/wabisabi-diff'
8
+
9
+ module Qwik
10
+ class Action
11
+ D_ExtBackup = {
12
+ :dt => 'Backup pages',
13
+ :dd => 'You can see backup of the page.',
14
+ :dc => "* How to
15
+ Go edit page, follow 'Backup' link in the right side.
16
+ You see the backup list of the page.
17
+ "
18
+ }
19
+
20
+ D_ExtBackup_ja = {
21
+ :dt => '�y�[�W�E�o�b�N�A�b�v',
22
+ :dd => '�y�[�W�̃o�b�N�A�b�v�����邱�Ƃ��ł��܂��B',
23
+ :dc => "* �g����
24
+ �ҏW��ʂ̉E���Ɂu�o�b�N�A�b�v�v�Ƃ��������N������܂��B
25
+ ���̃����N���A�y�[�W�̃o�b�N�A�b�v���X�g�����邱�Ƃ��ł��܂��B
26
+ "
27
+ }
28
+
29
+ def plg_backup_list
30
+ return if @req.user.nil?
31
+ return if ! defined?(@req.base) || @req.base.nil?
32
+ return page_attribute('backup', _('Show backup'))
33
+ end
34
+
35
+ def ext_backup
36
+ c_require_pagename
37
+ c_require_member
38
+ #c_require_page_exist # does not require the page is exist
39
+ # because you can see the list of the page that is already deleted.
40
+ c_require_no_path_args
41
+
42
+ args = @req.ext_args
43
+ if 0 < args.length # has target
44
+ return backup_show(@site, @req.base, args)
45
+ end
46
+
47
+ return backup_list_page(@site, @req.base)
48
+ end
49
+
50
+ def backup_show(site, key, args)
51
+ page = site[key]
52
+
53
+ return c_nerror('only one time stamp') if 1 < args.length
54
+ time = args.shift
55
+ return c_nerror('should be number') unless /\A[0-9]+\z/ =~ time
56
+
57
+ # Is the backup exist?
58
+ time = Time.at(time.to_i)
59
+ unless site.backupdb.exist?(key, time)
60
+ return c_notfound('not found')
61
+ end
62
+
63
+ str = site.backupdb.get(key, time) # Get the old content.
64
+ =begin
65
+ # Do not show diffs for now. (2009/9/1)
66
+ list = backup_list(site, key) # Get the list.
67
+
68
+ # Get the index of the content.
69
+ index = nil
70
+ list.each_with_index {|a, i|
71
+ if a[1] == time.to_i
72
+ index = i
73
+ end
74
+ }
75
+ return c_notfound('no data?') if index.nil?
76
+
77
+ msg = ''
78
+ if index == 0
79
+ msg = [:p, _('This is the first page.')]
80
+ else
81
+ # FIXME: fix diff function. (2009/9/1)
82
+ diff = backup_diff(list, index-1, index)
83
+ msg = [:div, {:class=>'differ'}, *diff]
84
+ end
85
+
86
+ return c_plain("#{key} @ #{time.ymdax}") {
87
+ [[:div, {:class=>'day'},
88
+ [:h2, _('Difference from the previous page')],
89
+ [:div, {:class=>'section'}, msg]],
90
+ [:div, {:class=>'day'},
91
+ [:h2, _('Original data')],
92
+ [:div, {:class=>'section'},
93
+ [:pre, str]]]]
94
+ }
95
+ =end
96
+
97
+ return c_plain("#{key} @ #{time.ymdax}") {
98
+ [[:div, {:class=>'day'},
99
+ [:h2, _('Original data')],
100
+ [:div, {:class=>'section'},
101
+ [:pre, str]]]]
102
+ }
103
+ end
104
+
105
+ def backup_list(site, key)
106
+ list = []
107
+ site.backupdb.each_by_key(key) {|v, time|
108
+ list << [v, time.to_i]
109
+ }
110
+ return list
111
+ end
112
+
113
+ def backup_diff(list, last, now)
114
+ s1, t1 = list[last]
115
+ s2, t2 = list[now]
116
+ return DiffGenerator.generate(s1, s2)
117
+ end
118
+
119
+ def backup_list_page(site, key)
120
+ list = backup_list(site, key)
121
+
122
+ ul = list.map {|v, time|
123
+ [:li, [:a, {:href=>"#{key}.#{time}.backup"},
124
+ Time.at(time).format_date]]
125
+ }
126
+ if 0 < ul.length
127
+ ul.last << ' '+_('<-')+' '+ _('Newest')
128
+ end
129
+
130
+ return c_plain(_('Backup list')) {
131
+ [:div, {:class=>'day'},
132
+ [:div, {:class=>'section'},
133
+ [:ul, ul]]]
134
+ }
135
+ end
136
+ end
137
+ end
138
+
139
+ if $0 == __FILE__
140
+ require 'qwik/test-common'
141
+ $test = true
142
+ end
143
+
144
+ if defined?($test) && $test
145
+ class TestActBackup < Test::Unit::TestCase
146
+ include TestSession
147
+
148
+ def test_plg_backup_list
149
+ ok_wi [:span, {:class=>'attribute'},
150
+ [:a, {:href=>'1.backup'}, 'Show backup']],
151
+ '{{backup_list}}'
152
+ end
153
+
154
+ def test_act_backup2
155
+ #return if $0 != __FILE__
156
+
157
+ # Only members can see the page.
158
+ res = session '/test/1.html'
159
+ ok_title 'Members Only'
160
+ res = session '/test/1.backup'
161
+ ok_title 'Members Only'
162
+
163
+ t_add_user
164
+
165
+ # You can see backup page even if the page does not exist.
166
+ res = session '/test/1.html'
167
+ ok_title 'Page not found.'
168
+ res = session '/test/1.backup'
169
+ ok_in ['Backup list'], '//title'
170
+
171
+ page = @site.create_new
172
+ page.put_with_time('t', 0)
173
+
174
+ res = session '/test/1.html'
175
+ ok_title '1'
176
+ res = session '/test/1.backup'
177
+ ok_in ['Backup list'], '//title'
178
+
179
+ # Error check.
180
+ res = session '/test/1.backup/0'
181
+ ok_title 'Incorrect path arguments.'
182
+ res = session '/test/1.100.200.backup'
183
+ ok_title 'only one time stamp'
184
+ res = session '/test/1.hoge.backup'
185
+ ok_title 'should be number'
186
+
187
+ list = @action.backup_list(@site, '1')
188
+ # eq 't', list[0][0]
189
+ # eq '', list[1][0]
190
+ eq nil, list[2]
191
+
192
+ t1 = list[0][1]
193
+ res = session "/test/1.#{t1}.backup"
194
+ assert_text(/\A1 @ /, 'title')
195
+ assert_text 't', 'pre'
196
+
197
+ # Edit the page again.
198
+ page.put_with_time 't2', 1
199
+
200
+ list = @action.backup_list(@site, '1')
201
+ # eq 't', list[0][0]
202
+ # eq 't2', list[1][0]
203
+ # eq '', list[2][0]
204
+ eq nil, list[3]
205
+
206
+ diff = @action.backup_diff(list, 0, 1)
207
+ # eq [[:del, 't'], [:br], [:ins, 't2'], [:br]], diff
208
+
209
+ t2 = list[1][1]
210
+ res = session "/test/1.#{t2}.backup"
211
+ assert_text(/\A1 @ /, 'title')
212
+ assert_text('t2', 'pre')
213
+ # ok_in [[:del, 't'], [:br], [:ins, 't2'], [:br]],
214
+ # "//div[@class='differ']"
215
+
216
+ # Edit the page again. The 3rd times.
217
+ page.put_with_time('t3', 2)
218
+
219
+ list = @action.backup_list(@site, '1')
220
+ # eq 't', list[0][0]
221
+ # eq 't2', list[1][0]
222
+ # eq 't3', list[2][0]
223
+ # eq '', list[3][0]
224
+ eq nil, list[4]
225
+
226
+ diff = @action.backup_diff(list, 1, 2)
227
+ # eq [[:del, 't2'], [:br], [:ins, 't3'], [:br]], diff
228
+
229
+ t3 = list[2][1]
230
+ res = session "/test/1.#{t3}.backup"
231
+ assert_text 't3', 'pre'
232
+ # ok_in [[:del, 't2'], [:br], [:ins, 't3'], [:br]],
233
+ # "//div[@class='differ']"
234
+ end
235
+ end
236
+ end