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.
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/CHANGES +3 -0
- data/COPYING +340 -0
- data/Gemfile +3 -0
- data/README.md +10 -0
- data/Rakefile +10 -0
- data/TextFormattingRules +137 -0
- data/TextFormattingRules.ja +143 -0
- data/bin/qwikdoc +34 -0
- data/lib/qwik_doc.rb +15 -0
- data/lib/qwik_doc/hack.rb +184 -0
- data/qwikdoc.gemspec +26 -0
- data/spec/qwik_doc_spec.rb +305 -0
- data/spec/spec_helper.rb +12 -0
- data/vendor/qwik/Makefile +63 -0
- data/vendor/qwik/Rakefile +17 -0
- data/vendor/qwik/act-aa.rb +83 -0
- data/vendor/qwik/act-archive.rb +386 -0
- data/vendor/qwik/act-attach.rb +304 -0
- data/vendor/qwik/act-backup.rb +236 -0
- data/vendor/qwik/act-basic.rb +325 -0
- data/vendor/qwik/act-book.rb +161 -0
- data/vendor/qwik/act-calc.rb +371 -0
- data/vendor/qwik/act-charset.rb +251 -0
- data/vendor/qwik/act-christel.rb +112 -0
- data/vendor/qwik/act-chronology.rb +149 -0
- data/vendor/qwik/act-code.rb +155 -0
- data/vendor/qwik/act-comment.rb +554 -0
- data/vendor/qwik/act-config.rb +49 -0
- data/vendor/qwik/act-counter.rb +125 -0
- data/vendor/qwik/act-day.rb +96 -0
- data/vendor/qwik/act-describe.rb +135 -0
- data/vendor/qwik/act-diary.rb +109 -0
- data/vendor/qwik/act-edit.rb +317 -0
- data/vendor/qwik/act-embed-html.rb +296 -0
- data/vendor/qwik/act-emode.rb +150 -0
- data/vendor/qwik/act-event.rb +187 -0
- data/vendor/qwik/act-file.rb +303 -0
- data/vendor/qwik/act-files.rb +771 -0
- data/vendor/qwik/act-getpass.rb +295 -0
- data/vendor/qwik/act-history.rb +136 -0
- data/vendor/qwik/act-html.rb +204 -0
- data/vendor/qwik/act-httpauth.rb +147 -0
- data/vendor/qwik/act-include.rb +142 -0
- data/vendor/qwik/act-interwiki.rb +189 -0
- data/vendor/qwik/act-isearch.rb +109 -0
- data/vendor/qwik/act-keywords.rb +137 -0
- data/vendor/qwik/act-lang.rb +81 -0
- data/vendor/qwik/act-license.rb +63 -0
- data/vendor/qwik/act-list.rb +287 -0
- data/vendor/qwik/act-login.rb +410 -0
- data/vendor/qwik/act-logout.rb +60 -0
- data/vendor/qwik/act-mail.rb +159 -0
- data/vendor/qwik/act-map.rb +292 -0
- data/vendor/qwik/act-md5.rb +42 -0
- data/vendor/qwik/act-mdlb.rb +741 -0
- data/vendor/qwik/act-media.rb +416 -0
- data/vendor/qwik/act-member.rb +157 -0
- data/vendor/qwik/act-menu.rb +142 -0
- data/vendor/qwik/act-metadata.rb +323 -0
- data/vendor/qwik/act-mlsubmitform.rb +49 -0
- data/vendor/qwik/act-monitor.rb +167 -0
- data/vendor/qwik/act-new.rb +418 -0
- data/vendor/qwik/act-pagelist.rb +248 -0
- data/vendor/qwik/act-password.rb +145 -0
- data/vendor/qwik/act-plan.rb +210 -0
- data/vendor/qwik/act-povray.rb +230 -0
- data/vendor/qwik/act-presen.rb +380 -0
- data/vendor/qwik/act-redirect.rb +133 -0
- data/vendor/qwik/act-ring.rb +1071 -0
- data/vendor/qwik/act-rrefs.rb +255 -0
- data/vendor/qwik/act-ruby.rb +116 -0
- data/vendor/qwik/act-sample.rb +170 -0
- data/vendor/qwik/act-save.rb +295 -0
- data/vendor/qwik/act-schedule.rb +374 -0
- data/vendor/qwik/act-search.rb +180 -0
- data/vendor/qwik/act-searchwords.rb +51 -0
- data/vendor/qwik/act-sendpass.rb +83 -0
- data/vendor/qwik/act-site.rb +89 -0
- data/vendor/qwik/act-sitebackup.rb +419 -0
- data/vendor/qwik/act-sitelog.rb +118 -0
- data/vendor/qwik/act-smil.rb +299 -0
- data/vendor/qwik/act-status.rb +220 -0
- data/vendor/qwik/act-style.rb +608 -0
- data/vendor/qwik/act-table.rb +263 -0
- data/vendor/qwik/act-tableform.rb +241 -0
- data/vendor/qwik/act-tag.rb +103 -0
- data/vendor/qwik/act-text.rb +70 -0
- data/vendor/qwik/act-textarea.rb +164 -0
- data/vendor/qwik/act-theme.rb +346 -0
- data/vendor/qwik/act-toc.rb +112 -0
- data/vendor/qwik/act-typekey.rb +198 -0
- data/vendor/qwik/act-under-const.rb +94 -0
- data/vendor/qwik/act-webservice.rb +321 -0
- data/vendor/qwik/act-wema.rb +558 -0
- data/vendor/qwik/act-wysiwyg.rb +238 -0
- data/vendor/qwik/action.rb +325 -0
- data/vendor/qwik/autoreload.rb +98 -0
- data/vendor/qwik/bench-bench.rb +28 -0
- data/vendor/qwik/bench-emode.rb +47 -0
- data/vendor/qwik/bench-format-xml.rb +70 -0
- data/vendor/qwik/bench-large-table.rb +62 -0
- data/vendor/qwik/bench-md5.rb +14 -0
- data/vendor/qwik/bench-module-session.rb +19 -0
- data/vendor/qwik/bench-page.rb +50 -0
- data/vendor/qwik/bench-s-md5.rb +28 -0
- data/vendor/qwik/bench-session.rb +25 -0
- data/vendor/qwik/bench-textformat.rb +31 -0
- data/vendor/qwik/catalog-factory.rb +91 -0
- data/vendor/qwik/catalog-ja.rb +479 -0
- data/vendor/qwik/catalog-ml-ja.rb +145 -0
- data/vendor/qwik/check-act-monitor.rb +112 -0
- data/vendor/qwik/check-act-monitor2.rb +46 -0
- data/vendor/qwik/check-act-theme.rb +27 -0
- data/vendor/qwik/check-event.rb +112 -0
- data/vendor/qwik/check-event2.rb +55 -0
- data/vendor/qwik/check-htree-rexml.rb +77 -0
- data/vendor/qwik/check-htree.rb +51 -0
- data/vendor/qwik/check-libxml.rb +135 -0
- data/vendor/qwik/check-many-pages.rb +47 -0
- data/vendor/qwik/check-monitor.rb +33 -0
- data/vendor/qwik/check-observer.rb +67 -0
- data/vendor/qwik/check-server.rb +61 -0
- data/vendor/qwik/check-uuencode.rb +33 -0
- data/vendor/qwik/check-webdav.rb +65 -0
- data/vendor/qwik/check-xml-xpath.rb +27 -0
- data/vendor/qwik/common-backtrace.rb +94 -0
- data/vendor/qwik/common-basic.rb +111 -0
- data/vendor/qwik/common-condition.rb +142 -0
- data/vendor/qwik/common-error.rb +48 -0
- data/vendor/qwik/common-gettext.rb +50 -0
- data/vendor/qwik/common-javascript.rb +45 -0
- data/vendor/qwik/common-notice.rb +132 -0
- data/vendor/qwik/common-plain.rb +105 -0
- data/vendor/qwik/common-plugin.rb +111 -0
- data/vendor/qwik/common-res.rb +76 -0
- data/vendor/qwik/common-resolve.rb +92 -0
- data/vendor/qwik/common-send.rb +171 -0
- data/vendor/qwik/common-session.rb +139 -0
- data/vendor/qwik/common-surface.rb +261 -0
- data/vendor/qwik/common-url.rb +90 -0
- data/vendor/qwik/compat/Makefile +12 -0
- data/vendor/qwik/compat/add_load_path.rb +1 -0
- data/vendor/qwik/config.rb +299 -0
- data/vendor/qwik/db-b-backup.rb +142 -0
- data/vendor/qwik/db-backup.rb +184 -0
- data/vendor/qwik/db-berkeley.rb +306 -0
- data/vendor/qwik/db-filesystem.rb +305 -0
- data/vendor/qwik/db-indexer.rb +154 -0
- data/vendor/qwik/db-searchwords.rb +238 -0
- data/vendor/qwik/description-ja.rb +267 -0
- data/vendor/qwik/description.rb +256 -0
- data/vendor/qwik/dev-add-copyright.rb +23 -0
- data/vendor/qwik/dev-backup.rb +24 -0
- data/vendor/qwik/dev-bench.rb +175 -0
- data/vendor/qwik/dev-calctime.rb +52 -0
- data/vendor/qwik/dev-css-compressor.rb +60 -0
- data/vendor/qwik/dev-extract-catalog.rb +102 -0
- data/vendor/qwik/dev-js-compressor.rb +73 -0
- data/vendor/qwik/dev-release.rb +235 -0
- data/vendor/qwik/dev-replace.rb +353 -0
- data/vendor/qwik/dev-sendmail.rb +25 -0
- data/vendor/qwik/farm.rb +283 -0
- data/vendor/qwik/gettext.rb +56 -0
- data/vendor/qwik/group-cond.rb +157 -0
- data/vendor/qwik/group-config.rb +247 -0
- data/vendor/qwik/group-confirm.rb +147 -0
- data/vendor/qwik/group-db.rb +326 -0
- data/vendor/qwik/group-mail.rb +195 -0
- data/vendor/qwik/group-member.rb +307 -0
- data/vendor/qwik/group-sendmail.rb +231 -0
- data/vendor/qwik/group-site.rb +374 -0
- data/vendor/qwik/group-sweep.rb +63 -0
- data/vendor/qwik/group.rb +157 -0
- data/vendor/qwik/helper.rb +6 -0
- data/vendor/qwik/html-generator.rb +104 -0
- data/vendor/qwik/html-to-wabisabi.rb +149 -0
- data/vendor/qwik/htree-diff.rb +87 -0
- data/vendor/qwik/htree-format-xml.rb +57 -0
- data/vendor/qwik/htree-generator.rb +144 -0
- data/vendor/qwik/htree-get.rb +251 -0
- data/vendor/qwik/htree-html-generator.rb +179 -0
- data/vendor/qwik/htree-template.rb +263 -0
- data/vendor/qwik/htree-to-wabisabi.rb +171 -0
- data/vendor/qwik/loadlib.rb +79 -0
- data/vendor/qwik/logger.rb +115 -0
- data/vendor/qwik/mail-body.rb +171 -0
- data/vendor/qwik/mail-header.rb +474 -0
- data/vendor/qwik/mail-multipart.rb +193 -0
- data/vendor/qwik/mail-parse.rb +147 -0
- data/vendor/qwik/mail.rb +341 -0
- data/vendor/qwik/mailaddress.rb +83 -0
- data/vendor/qwik/mdlb-model.rb +81 -0
- data/vendor/qwik/mdlb-sample.rb +324 -0
- data/vendor/qwik/ml-catalog-factory.rb +27 -0
- data/vendor/qwik/ml-exception.rb +15 -0
- data/vendor/qwik/ml-generator.rb +28 -0
- data/vendor/qwik/ml-gettext.rb +137 -0
- data/vendor/qwik/ml-logger.rb +82 -0
- data/vendor/qwik/ml-memory.rb +65 -0
- data/vendor/qwik/ml-msg-validator.rb +86 -0
- data/vendor/qwik/ml-processor.rb +609 -0
- data/vendor/qwik/ml-quickml-server.rb +122 -0
- data/vendor/qwik/ml-sendmail.rb +0 -0
- data/vendor/qwik/ml-server.rb +107 -0
- data/vendor/qwik/ml-session.rb +348 -0
- data/vendor/qwik/ml-sweeper.rb +101 -0
- data/vendor/qwik/mock-logger.rb +65 -0
- data/vendor/qwik/mock-sendmail.rb +78 -0
- data/vendor/qwik/mock-socket.rb +82 -0
- data/vendor/qwik/modulobe.rb +406 -0
- data/vendor/qwik/mongrel-server.rb +72 -0
- data/vendor/qwik/page-files.rb +249 -0
- data/vendor/qwik/page-generate.rb +82 -0
- data/vendor/qwik/page-get.rb +262 -0
- data/vendor/qwik/page-images.rb +168 -0
- data/vendor/qwik/page-put.rb +128 -0
- data/vendor/qwik/page-rrefs.rb +154 -0
- data/vendor/qwik/page-title.rb +0 -0
- data/vendor/qwik/page-wikidb.rb +234 -0
- data/vendor/qwik/page.rb +67 -0
- data/vendor/qwik/pages.rb +444 -0
- data/vendor/qwik/parse-plugin.rb +249 -0
- data/vendor/qwik/parser-emode.rb +116 -0
- data/vendor/qwik/parser-inline.rb +273 -0
- data/vendor/qwik/parser.rb +350 -0
- data/vendor/qwik/password.rb +183 -0
- data/vendor/qwik/periodic.rb +79 -0
- data/vendor/qwik/qp.rb +56 -0
- data/vendor/qwik/qwik-service.rb +341 -0
- data/vendor/qwik/qwik.rb +5 -0
- data/vendor/qwik/qwikweb-adduser.rb +34 -0
- data/vendor/qwik/qwikweb-catalog-validator.rb +110 -0
- data/vendor/qwik/qwikweb-incgen.rb +28 -0
- data/vendor/qwik/qwikweb-makesite.rb +41 -0
- data/vendor/qwik/qwikweb-server.rb +44 -0
- data/vendor/qwik/qwikweb-showpassword.rb +26 -0
- data/vendor/qwik/qwikweb-watchlog.rb +67 -0
- data/vendor/qwik/request-path.rb +304 -0
- data/vendor/qwik/request-ua.rb +76 -0
- data/vendor/qwik/request-webrick.rb +81 -0
- data/vendor/qwik/request.rb +91 -0
- data/vendor/qwik/resolve-tdiary.rb +292 -0
- data/vendor/qwik/resolve.rb +121 -0
- data/vendor/qwik/response.rb +228 -0
- data/vendor/qwik/server-memory.rb +57 -0
- data/vendor/qwik/server-webrick.rb +102 -0
- data/vendor/qwik/server.rb +252 -0
- data/vendor/qwik/site-config.rb +149 -0
- data/vendor/qwik/site-db.rb +136 -0
- data/vendor/qwik/site-event.rb +162 -0
- data/vendor/qwik/site-files.rb +86 -0
- data/vendor/qwik/site-group.rb +103 -0
- data/vendor/qwik/site-index.rb +47 -0
- data/vendor/qwik/site-log.rb +64 -0
- data/vendor/qwik/site-member.rb +230 -0
- data/vendor/qwik/site-monitor.rb +97 -0
- data/vendor/qwik/site-pages.rb +62 -0
- data/vendor/qwik/site-plan.rb +139 -0
- data/vendor/qwik/site-report.rb +282 -0
- data/vendor/qwik/site-resolve.rb +230 -0
- data/vendor/qwik/site-rrefs.rb +18 -0
- data/vendor/qwik/site-search.rb +180 -0
- data/vendor/qwik/site-timeline.rb +153 -0
- data/vendor/qwik/site-url.rb +189 -0
- data/vendor/qwik/site.rb +76 -0
- data/vendor/qwik/smil-time.rb +105 -0
- data/vendor/qwik/smtp-session.rb +331 -0
- data/vendor/qwik/template-generator.rb +149 -0
- data/vendor/qwik/template.rb +85 -0
- data/vendor/qwik/test-common.rb +10 -0
- data/vendor/qwik/test-ml-info.rb +225 -0
- data/vendor/qwik/test-module-ml.rb +142 -0
- data/vendor/qwik/test-module-path.rb +110 -0
- data/vendor/qwik/test-module-public.rb +70 -0
- data/vendor/qwik/test-module-server.rb +98 -0
- data/vendor/qwik/test-module-session.rb +264 -0
- data/vendor/qwik/test-module-suite.rb +91 -0
- data/vendor/qwik/test-ms-applemail.rb +59 -0
- data/vendor/qwik/test-ms-attach.rb +174 -0
- data/vendor/qwik/test-ms-basic.rb +40 -0
- data/vendor/qwik/test-ms-close.rb +35 -0
- data/vendor/qwik/test-ms-confirm.rb +75 -0
- data/vendor/qwik/test-ms-ignore-spam.rb +57 -0
- data/vendor/qwik/test-ms-japanese.rb +97 -0
- data/vendor/qwik/test-ms-jfilename.rb +82 -0
- data/vendor/qwik/test-ms-large.rb +58 -0
- data/vendor/qwik/test-ms-member.rb +103 -0
- data/vendor/qwik/test-ms-multipart.rb +84 -0
- data/vendor/qwik/test-ms-org.rb +129 -0
- data/vendor/qwik/test-ms-plan.rb +130 -0
- data/vendor/qwik/test-ms-post.rb +53 -0
- data/vendor/qwik/test-ms-quopri.rb +76 -0
- data/vendor/qwik/test-sub-quopri.rb +45 -0
- data/vendor/qwik/test-submit-base64.rb +59 -0
- data/vendor/qwik/test-submit-forward.rb +61 -0
- data/vendor/qwik/test-submit-html-mail.rb +52 -0
- data/vendor/qwik/test-submit-japanese.rb +135 -0
- data/vendor/qwik/test-submit-jfilename.rb +144 -0
- data/vendor/qwik/test-submit-uuencode.rb +71 -0
- data/vendor/qwik/test-suite-all.rb +8 -0
- data/vendor/qwik/test-suite-basic.rb +9 -0
- data/vendor/qwik/test-suite-ml.rb +9 -0
- data/vendor/qwik/test-typekey.rb +64 -0
- data/vendor/qwik/testunit.rb +45 -0
- data/vendor/qwik/tokenizer-inline.rb +294 -0
- data/vendor/qwik/tokenizer.rb +332 -0
- data/vendor/qwik/typekey.rb +160 -0
- data/vendor/qwik/util-basic.rb +135 -0
- data/vendor/qwik/util-charset.rb +332 -0
- data/vendor/qwik/util-css.rb +56 -0
- data/vendor/qwik/util-csv-tokenizer.rb +113 -0
- data/vendor/qwik/util-filename.rb +112 -0
- data/vendor/qwik/util-pathname.rb +202 -0
- data/vendor/qwik/util-pid.rb +58 -0
- data/vendor/qwik/util-safe.rb +67 -0
- data/vendor/qwik/util-sendmail.rb +273 -0
- data/vendor/qwik/util-string.rb +203 -0
- data/vendor/qwik/util-time.rb +125 -0
- data/vendor/qwik/util-webrick.rb +176 -0
- data/vendor/qwik/version.rb +11 -0
- data/vendor/qwik/wabisabi-basic.rb +163 -0
- data/vendor/qwik/wabisabi-diff.rb +130 -0
- data/vendor/qwik/wabisabi-format-xml.rb +310 -0
- data/vendor/qwik/wabisabi-generator.rb +262 -0
- data/vendor/qwik/wabisabi-index.rb +174 -0
- data/vendor/qwik/wabisabi-table.rb +212 -0
- data/vendor/qwik/wabisabi-template.rb +295 -0
- data/vendor/qwik/wabisabi-to-htree.rb +111 -0
- data/vendor/qwik/wabisabi-to-wiki.rb +690 -0
- data/vendor/qwik/wabisabi-traverse.rb +207 -0
- data/vendor/qwik/wabisabi-validator.rb +116 -0
- data/vendor/qwik/wabisabi.rb +5 -0
- 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
|