主に wiliki-experimental パッケージに入っている修正の説明です。 通常 www.keshi.org では常に最新の wiliki-experimental パッケージを インストールしてテストしてます。
以下のようにすれば Subversion を使って sid 版との差分を取ることができますので、参考にしてください。
% svn diff http://www.keshi.org/svn/repos/WiLiKi/unstable http://www.keshi.org/svn/repos/WiLiKi/experimental
WikiName の変更が簡単にできないことについて苦情がよく出るので、 編集ページに WikiName のフォームを加えて変更できるようにしてみました。
CGI パラメータや関数の引数に newpagename を加え、 cmd-commit-edit で pagename と newpagename が異なる場合に rename と見なして古い WikiName を削除します。 新しい WikiName がすでに存在する場合はエラーにしています。 また新しい WikiName が空文字列の場合は空ページの場合と同様に削除します。
Index: src/wiliki.scm
===================================================================
--- src/wiliki.scm (.../unstable) (revision 16)
+++ src/wiliki.scm (.../experimental) (revision 16)
@@ -618,7 +618,7 @@
(cons "Status: 302 Moved\n"
(cgi-header :location (url "~a" key))))
-(define (conflict-page page pagename content donttouch)
+(define (conflict-page page pagename newpagename content donttouch)
(format-page
(string-append (title-of (wiliki))": "($$ "Update Conflict"))
`(,($$ "<p>It seems that somebody has updated this page while you're editing. The most recent content is shown below.</p>")
@@ -626,7 +626,7 @@
,(colored-box (html:pre (html-escape-string (content-of page))))
,(html:hr)
,($$ "<p>The following shows what you are about to submit. Please re-edit the content and submit again.</p>")
- ,(edit-form #t pagename content (mtime-of page) donttouch)
+ ,(edit-form #t pagename newpagename content (mtime-of page) donttouch)
)
:show-edit? #f))
@@ -653,7 +653,7 @@
:show-edit? #f))
))
-(define (edit-form preview? pagename content mtime donttouch)
+(define (edit-form preview? pagename newpagename content mtime donttouch)
(define (buttons)
(if preview?
`(,(html:input :type "submit" :name "preview" :value ($$ "Preview"))
@@ -669,6 +669,8 @@
:method "POST" :action (cgi-name-of (wiliki))
(buttons) (donttouch-checkbox)
(html:br)
+ (html:input :type "text" :name "newpagename" :value newpagename :size 80)
+ (html:br)
(html:input :type "hidden" :name "c" :value "c")
(html:input :type "hidden" :name "p" :value pagename)
(html:input :type "hidden" :name "l" :value (lang))
@@ -727,11 +729,11 @@
(errorf "Can't edit the page ~s: the database is read-only" pagename))
(let ((page (wdb-get (db) pagename #t)))
(format-page pagename
- (edit-form #t pagename
+ (edit-form #t pagename pagename
(content-of page) (mtime-of page) #f)
:show-edit? #f)))
-(define (cmd-preview pagename content mtime donttouch)
+(define (cmd-preview pagename newpagename content mtime donttouch)
(let ((page (wdb-get (db) pagename #t)))
(if (or (not (mtime-of page)) (eqv? (mtime-of page) mtime))
(format-page
@@ -740,18 +742,24 @@
:key pagename
:content content)))
,(html:hr)
- ,(edit-form #f pagename content mtime donttouch))
+ ,(edit-form #f pagename newpagename content mtime donttouch))
:show-edit? #f)
- (conflict-page page pagename content donttouch)
+ (conflict-page page pagename newpagename content donttouch)
)))
-(define (cmd-commit-edit pagename content mtime donttouch)
+(define (cmd-commit-edit pagename newpagename content mtime donttouch)
(unless (editable? (wiliki))
(errorf "Can't edit the page ~s: the database is read-only" pagename))
- (let ((p (wdb-get (db) pagename #t))
- (now (sys-time)))
+ (let ((p (wdb-get (db) pagename #t))
+ (now (sys-time))
+ (movep (not (string=? pagename newpagename))))
+ (if (#/\s/ newpagename)
+ (errorf "Can't rename to ~s: invalid WikiName" newpagename))
+ (if (and movep (wdb-exists? (db) newpagename))
+ (errorf "Can't rename to ~s: already exists" newpagename))
(if (or (not (mtime-of p)) (eqv? (mtime-of p) mtime))
- (if (string-every #[\s] content)
+ (if (or (string-every #[\s] content)
+ (string-every #[\s] newpagename))
(begin
(set! (content-of p) "")
(wdb-delete! (db) pagename)
@@ -759,9 +767,10 @@
(begin
(set! (mtime-of p) now)
(set! (content-of p) (expand-writer-macros content))
- (wdb-put! (db) pagename p :donttouch donttouch)
- (redirect-page pagename)))
- (conflict-page p pagename content donttouch)
+ (wdb-put! (db) newpagename p :donttouch donttouch)
+ (if movep (wdb-delete! (db) pagename))
+ (redirect-page newpagename)))
+ (conflict-page p pagename newpagename content donttouch)
)
))
@@ -852,6 +861,8 @@
cmd-commit-edit
cmd-preview)
pagename
+ (cgi-get-parameter "newpagename" param
+ :default pagename :convert cv-in)
(cgi-get-parameter "content" param :convert cv-in)
(cgi-get-parameter "mtime" param
:convert x->integer