--- wiliki2.cgi 2008/04/08 09:00:26 1.1 +++ wiliki2.cgi 2008/04/04 07:51:21 @@ -1,14 +1,31 @@ -#!/usr/bin/gosh +#!/usr/local/gauche/bin/gosh ;; wiliki2 - sample of customizing page format +(use srfi-13) (use util.list) (use wiliki) (use wiliki.format) (use wiliki.db) +(use dbm.fsdbm) (define-class () ()) +(define-method wiliki:format-head-elements ((fmt ) page . opts) + `((title ,(ref page 'title)) + ,@(or (and-let* ((w (wiliki)) + (fsp (wiliki:url :full))) + `((base (@ (href ,fsp))) + (link (@ (rel "alternate") (type "application/rss+xml") + (title "RSS") (href ,(format "~a?c=rss" fsp)))))) + '()) + ,(or (and-let* ((w (wiliki)) (ss (ref w 'style-sheet))) + `(link (@ (rel "stylesheet") (href ,ss) (type "text/css")))) + ;; default + '(style (@ (type "text/css")) + "body { background-color: #eeeedd }")) + )) + (define-method wiliki:format-page-header ((fmt ) page . opts) (define (td x) (list 'td x)) `((div (@ (style "font-size:80%") (align "right")) @@ -52,21 +69,88 @@ ,@(wiliki:page-title page) ,@(wiliki:format-content page)))))) -(wiliki:formatter (make )) +(define-method wiliki:format-wikiname ((fmt ) name) + (define (inter-wikiname-prefix head) + (and-let* ((page (wiliki:db-get "InterWikiName")) + (rx (string->regexp #`"^:,|head|:\\s*"))) + (call-with-input-string (ref page 'content) + (lambda (p) + (let loop ((line (read-line p))) + (cond ((eof-object? line) #f) + ((rx line) => + (lambda (m) + (let ((prefix (m 'after))) + (if (string-null? prefix) + (let ((prefix (read-line p))) + (if (or (eof-object? prefix) (string-null? prefix)) + #f + (string-trim-both prefix))) + (string-trim-both prefix))))) + (else (loop (read-line p))))))))) + (define (reader-macro-wikiname? name) + (cond ((string-prefix? "$$" name) + (handle-reader-macro name)) + ((or (string-prefix? "$" name) + (#/^\s/ name) + (#/\s$/ name)) + ;;invalid wiki name + (list "[[" name "]]")) + (else #f))) + (define (inter-wikiname? name) + (receive (head after) (string-scan name ":" 'both) + (or (and head + (and-let* ((inter-prefix (inter-wikiname-prefix head))) + (values inter-prefix after))) + (values #f name)))) + (or (reader-macro-wikiname? name) + (receive (inter-prefix real-name) (inter-wikiname? name) + (cond (inter-prefix + (let1 scheme + (if (#/^(https?|ftp|mailto):/ inter-prefix) "" "http://") + `((a (@ (href ,(format "~a~a~a" scheme inter-prefix + (uri-encode-string + (wiliki:cv-out real-name))))) + ,name)))) + ;; NB: the order of checks here is debatable. Should a virtual + ;; page shadow an existing page, or an existing page shadow a + ;; virtual one? Note also the order of this check must match + ;; the order in cmd-view. + ((or (wiliki:db-exists? real-name) (virtual-page? real-name)) + (list (wiliki:wikiname-anchor real-name))) + (else + `(,real-name + (a (@ (href ,(wiliki:self-url "p=~a&c=e" (wiliki:cv-out real-name)))) "?"))))) + ) + ) + +(define (format-time time) + (sys-strftime "%Y/%m/%d %T" + (sys-localtime + (if (integer? time) + time + (sys-time)) + )) + ) + +(wiliki:formatter + (make + :time format-time + )) (define (main args) (wiliki-main (make :db-path "/home/shiro/data/wikidata.dbm" :top-page "WiLiKi" :title "MyWiliki2" :description "Shiro's Wiliki Site Sample 2" :style-sheet "wiliki2.css" :language 'jp :charsets '((jp . euc-jp) (en . euc-jp)) :image-urls '((#/^http:\/\/sourceforge.net\/sflogo/ allow)) :log-file "wikidata.log" :debug-level 0 + :db-type + :gettext-paths '("/usr/local/share/locale") ))) ;; Local variables: