; Wiki in Arc v0.02
; (c) 2008, Andres N. Kievsky
; Licensed under the GPL v3.0
; 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=Welcome
; Wiki entries are saved in this hash. Includes a sample entry.
(= wiki-entries (obj "Welcome"
"*Welcome* to ArcWiki, a Wiki written in Arc.
This is a very simple example.
Link to [AnotherPage].
Remember that wikiterms go within [ and ] but without any spaces.
Enjoy,
- ank"
))
; List all entries
(defop list req (show-wikilist))
; View an entry or edit a new one
(defop wiki req
(let page (arg req "page")
(if (no (wiki-entries page))
(show-wikiedit page)
(show-wikipage 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 (html-escape 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)
(textarea "content" 12 60 (pr-escaped (or (wiki-entries page) "")) )
)
(def wikiedit-page-title (page)
(pr
(if (wiki-entries page) "Editing" "Creating")
" page \"" (html-escape page) "\""))
(def show-wikipage (page)
(whitepage
(pr "Page: \"")
(pr-escaped page)
(pr "\" ") (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))
; Convert a wiki-style string to HTML.
; [A] --> A
; I built a simple state machine to test Arc's operators -- ank.
; Code can be reduced a lot here. WIP.
(def decode-wiki (s)
(let result ""
(let state 'default
(let result-add (fn (c) (= result (string result c)))
(let switch-state (fn (new-state) (= state new-state))
(each c s
(case state
default (case c
#\[ (do (switch-state 'sqbrackets) (= name ""))
#\* (do (switch-state 'bold) (= name ""))
#\newline (result-add "
")
#\< (result-add "<")
#\> (result-add ">")
#\& (result-add "&")
(result-add c) )
sqbrackets (case c #\] (do (result-add (string "" (html-escape name) ""))
(switch-state 'default)
)
#\space (do (result-add (string "[" name " "))
(switch-state 'default)
)
(= name (string name c)) )
bold (case c #\* (do (result-add (string "" name ""))
(switch-state 'default)
)
#\space (do (result-add (string "*" name " "))
(switch-state 'default)
)
(= name (string name c)) )
)
)
result
)))))
(def wikipage-exists (name) (wiki-entries name))
(def wikipage (title content)
(whitepage (tag b title )))
(def html-escape (s) (tostring (pr-escaped s)))
(asv)