#!/usr/bin/env retro In the Konilo system, I have a set of blocks that serve as a little wiki. This is a small program that generates HTML from the wiki: blocks. It assumes the existance of an `_wiki` directiory under the current directory. The generated HTML will be store in this. If you use this, I recommend having it run via a cron job. ~~~ 'Block d:create #1026 allot ; :block:buffer &Block n:inc ; 'ilo.blocks block:set-file ~~~ Wiki blocks take a form of: 0 wiki: pagename 1 .... 2 .... ... [snipped] ... 14 .... 15 .... I define a helper word to identify the wiki blocks based on their title line. ~~~ :wiki? (-f) block:buffer 'wiki:_ s:begins-with? ; ~~~ Since the exported blocks need to go into files, I want to name the files after the pagename in the title line. A pair of words is defined to extract the page name and to generate a file name. The actual page names are required to be lowercase. ~~~ :~filter (-q) [ { $. $/ $, $; $: ${ $} $[ $] $( $) $$ } a:contains? not ] ; :pagename/raw (-s) block:buffer #6 n:add #58 s:left s:trim ; :pagename (-s) pagename/raw ~filter s:filter ; :filename (-s) pagename '\_wiki/%s.html s:format ; ~~~ ~~~ 'F var :~open (-) filename dup s:put nl file:W file:open !F ; :~save (s-) [ @F file:write ] s:for-each #32 @F file:write ; :~br (-) '
[ @F file:write ] s:for-each ; :~nl (-) #10 @F file:write ; :~close (-) @F file:close ; ~~~ Wiki entries are ordinary blocks. I use an asterisk (*) sigil to mark links. My strategy here is to copy a line into a `Line` buffer, then tokenize it. I can then look at the start of each token to see if it is a link. If so, I generate an tag for the link. Otherwise I just display the token. ~~~ 'Line d:create #65 allot :link? (s-sf) dup #0 s:fetch $* eq? ; :link:template (-s) '%s ; :link (s-) dup n:inc s:to-lower ~filter s:filter link:template s:format ~save ; :line &Line buffer:set #64 [ fetch-next buffer:add ] times &Line #32 s:tokenize [ link? [ link ] [ ~save ] choose ] a:for-each ~nl ; :~css { ' } &~save a:for-each ; :display (-) ~open ~css 'start_| s:format ~save 'all-pages

s:format ~save pagename/raw '%s\n s:format ~save block:buffer #64 n:add #15 &line times drop ~close ; :dump-blocks 'ilo.blocks file:R file:open dup file:size swap file:close #4096 n:div [ I block:buffer block:read wiki? [ display ] if ] indexed-times ; dump-blocks ~~~ ~~~ 'all-pages.html file:W file:open !F ~css 'start_| s:format ~save 'all-pages

s:format ~save '\_wiki s:format unix:chdir [ dup dup s:length #5 n:sub s:left swap '•_%s\n s:format ~save ] unix:for-each-file ~close ~~~