; 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)