; Wiki in Arc v0.01
; (c) 2008, Andres N. Kievsky
; http://www.ank.com.ar / ank2000@yahoo.com
;
; To run:
; 1. Save this file as wiki.arc
; 2. Load Arc.
; 3. Run it with (load "wiki.arc") - adjust the path as needed.
; 4. visit http://localhost:8080/wiki?page=Sample
; Wiki entries are saved in this hash
(= wiki-entries (table))
; A sample entry
(= (wiki-entries "Sample") "This is a simple sample. Create [AnotherPage]. Remember that terms go within [ and ] but without spaces.")
; List all entries
(defop list req
(show-wikilist))
; View an entry or edit a new one
(defop wiki req
(if (no (wiki-entries (arg req "page")))
(show-wikiedit (arg req "page"))
(show-wikipage (arg req "page")) ))
; Edit an entry
(defop wikiedit req
(show-wikiedit (arg req "page")))
(def show-wikilist ()
(whitepage (pr "List of all pages")
(br2)
(each e (keys wiki-entries)
(link e (wiki-link e)) (br)
)))
(def show-wikiedit (page)
(whitepage
(wikiedit-page-title page)
(br2)
(aform (fn (req) (= (wiki-entries page) (arg req "content"))
(show-wikipage page) )
(wikiedit-editbox page)
(br2)
(submit))
))
(def wikiedit-editbox (page)
(if (no (wiki-entries page))
(textarea "content" 12 60)
(textarea "content" 12 60 (pr (wiki-entries page)))
)
)
(def wikiedit-page-title (page)
(if (no (wiki-entries page))
(pr "Creating page \"" page "\"")
(pr "Editing page \"" page "\""))
)
(def show-wikipage (page)
(whitepage
(pr "Page: \"" page "\"") (link "(edit)" (edit-link page))
(br2)
(pr (decode-wiki (wiki-entries page)))
(br2)
(link "View all entries" "list")
(aform (fn (req) (show-wikiedit (arg req "page")))
(pr "Create a new page named: ") (input "page" "" 40) (submit "go"))
))
(def edit-link (page) (string "wikiedit?page=" page))
(def wiki-link (page) (string "wiki?page=" page))
(def page-not-found (name)
(whitepage (pr "Wiki page \"" name "\" not found. Create it ") (link "here." (edit-link name)))
)
; Convert a wiki-style string to HTML.
; [A] --> A
(def decode-wiki (s)
(= result "")
(= naming nil)
(each c s
(if naming
(case c #\] (do (= naming nil)
(= result
(string result "" name "")
))
#\space (do (= result (string result (string "[" name " ")))
(= naming nil)
)
(= name (string name c)) )
(case c #\[ (do (= naming t) (= name ""))
(= result (string result c)) )
)
)
result
)
(def wikipage-exists (name) (wiki-entries name))
(def wikipage (title content)
(whitepage (tag b title )))
(asv)