Artifact 1e45e35279c3701e6c37eca6df69f23d3a092f7d:


0000: 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30 30  ;; Copyright 200
0010: 37 2d 32 30 31 30 2c 20 4d 61 74 74 68 65 77 20  7-2010, Matthew 
0020: 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 0a 3b 3b 20 20  Welland..;;.;;  
0030: 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20  This program is 
0040: 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20 75  made available u
0050: 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47 50 4c  nder the GNU GPL
0060: 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f 72 0a   version 2.0 or.
0070: 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53 65 65  ;;  greater. See
0080: 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69 6e   the accompanyin
0090: 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 20 66  g file COPYING f
00a0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b 0a 3b  or details..;;.;
00b0: 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20  ;  This program 
00c0: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 57  is distributed W
00d0: 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52 52 41  ITHOUT ANY WARRA
00e0: 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65 76 65  NTY; without eve
00f0: 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70 6c 69 65  n the.;;  implie
0100: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 20 4d 45  d warranty of ME
0110: 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 6f 72  RCHANTABILITY or
0120: 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20 50   FITNESS FOR A P
0130: 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20 20 50 55  ARTICULAR.;;  PU
0140: 52 50 4f 53 45 2e 0a 0a 3b 3b 20 74 77 69 6b 69  RPOSE...;; twiki
0150: 20 6d 6f 64 75 6c 65 0a 28 72 65 71 75 69 72 65   module.(require
0160: 2d 65 78 74 65 6e 73 69 6f 6e 20 73 71 6c 69 74  -extension sqlit
0170: 65 33 20 72 65 67 65 78 20 70 6f 73 69 78 20 6d  e3 regex posix m
0180: 64 35 20 62 61 73 65 36 34 29 0a 28 69 6d 70 6f  d5 base64).(impo
0190: 72 74 20 28 70 72 65 66 69 78 20 62 61 73 65 36  rt (prefix base6
01a0: 34 20 62 61 73 65 36 34 3a 29 29 0a 0a 3b 3b 20  4 base64:))..;; 
01b0: 54 4f 44 4f 0a 3b 3b 0a 3b 3b 20 2a 20 49 6e 6c  TODO.;;.;; * Inl
01c0: 69 6e 65 20 74 69 64 64 6c 65 72 73 20 5b 69 6e  ine tiddlers [in
01d0: 6c 69 6e 65 5b 54 69 64 64 6c 65 72 4e 61 6d 65  line[TiddlerName
01e0: 5d 5d 0a 3b 3b 20 2a 20 50 69 63 73 20 20 20 20  ]].;; * Pics    
01f0: 20 20 20 20 20 20 20 20 5b 70 69 63 20 58 20 59          [pic X Y
0200: 5b 70 69 63 6e 61 6d 65 2e 6a 70 67 5d 5d 0a 3b  [picname.jpg]].;
0210: 3b 20 2a 20 4d 6f 76 65 20 74 77 69 6b 69 20 70  ; * Move twiki p
0220: 61 72 73 69 6e 67 2f 65 78 70 61 6e 64 69 6e 67  arsing/expanding
0230: 20 74 6f 20 6d 61 74 74 73 75 74 69 6c 73 20 61   to mattsutils a
0240: 73 20 6c 6f 61 64 61 62 6c 65 20 6d 6f 64 75 6c  s loadable modul
0250: 65 0a 0a 3b 3b 20 52 6f 75 74 69 6e 65 73 20 69  e..;; Routines i
0260: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 6f 76  ntended to be ov
0270: 65 72 72 69 64 64 65 6e 20 62 79 20 65 6e 64 20  erridden by end 
0280: 75 73 65 72 73 0a 3b 3b 20 20 28 74 77 69 6b 69  users.;;  (twiki
0290: 3a 61 63 63 65 73 73 20 6b 65 79 73 20 77 69 6b  :access keys wik
02a0: 69 2d 6e 61 6d 65 20 75 73 65 72 2d 69 64 29 0a  i-name user-id).
02b0: 3b 3b 20 73 65 61 72 63 68 20 74 68 65 20 63 6f  ;; search the co
02c0: 64 65 20 66 6f 72 20 22 6f 76 65 72 72 69 64 65  de for "override
02d0: 22 20 66 6f 72 20 6d 6f 72 65 2e 0a 0a 3b 3b 20  " for more...;; 
02e0: 74 77 69 6b 69 20 63 73 73 0a 3b 3b 20 3d 3d 3d  twiki css.;; ===
02f0: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 42 6c 6f 63 6b 20  ======.;; Block 
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0310: 61 67 0a 3b 3b 20 2d 2d 2d 2d 2d 20 20 20 20 20  ag.;; -----     
0320: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 0a 3b             ---.;
0330: 3b 20 74 77 69 6b 69 20 20 20 20 20 20 20 20 20  ; twiki         
0340: 20 20 20 20 20 20 20 74 77 69 6b 69 0a 3b 3b 20         twiki.;; 
0350: 74 77 69 6b 69 20 62 6f 64 79 20 64 69 76 20 20  twiki body div  
0360: 20 20 20 20 20 74 77 69 6b 69 2d 6e 6f 64 65 0a       twiki-node.
0370: 3b 3b 20 74 77 69 6b 69 20 6d 61 69 6e 20 6d 65  ;; twiki main me
0380: 6e 75 20 20 20 20 20 20 74 77 69 6b 69 2d 6d 61  nu      twiki-ma
0390: 69 6e 2d 6d 65 6e 75 0a 0a 3b 3b 20 54 68 69 73  in-menu..;; This
03a0: 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 6c   is the currentl
03b0: 79 20 73 75 70 70 6f 72 74 65 64 20 6d 65 63 68  y supported mech
03c0: 61 6e 69 73 6d 2e 20 50 6f 73 74 67 72 65 73 20  anism. Postgres 
03d0: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 6c 61  will be added la
03e0: 74 65 72 20 2d 6d 72 77 2d 20 37 2f 32 36 2f 32  ter -mrw- 7/26/2
03f0: 30 30 39 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28  009.;;.(define (
0400: 74 77 69 6b 69 3a 6f 70 65 6e 2d 64 62 20 6b 65  twiki:open-db ke
0410: 79 20 2e 20 63 72 65 61 74 65 2d 6e 6f 74 2d 6f  y . create-not-o
0420: 6b 29 0a 20 20 3b 3b 20 28 73 3a 6c 6f 67 20 22  k).  ;; (s:log "
0430: 47 6f 74 20 74 6f 20 74 77 69 6b 69 3a 6f 70 65  Got to twiki:ope
0440: 6e 2d 64 62 20 77 69 74 68 20 6b 65 79 3a 20 22  n-db with key: "
0450: 20 6b 65 79 29 0a 20 20 28 6c 65 74 2a 20 28 28   key).  (let* ((
0460: 63 72 65 61 74 65 2d 6f 6b 20 28 69 66 20 28 6e  create-ok (if (n
0470: 75 6c 6c 3f 20 63 72 65 61 74 65 2d 6e 6f 74 2d  ull? create-not-
0480: 6f 6b 29 20 23 74 20 28 63 61 72 20 63 72 65 61  ok) #t (car crea
0490: 74 65 2d 6e 6f 74 2d 6f 6b 29 29 29 0a 09 20 28  te-not-ok))).. (
04a0: 66 64 61 74 20 20 20 20 20 20 28 74 77 69 6b 69  fdat      (twiki
04b0: 3a 6b 65 79 2d 3e 66 6e 61 6d 65 20 6b 65 79 29  :key->fname key)
04c0: 29 0a 09 20 28 62 61 73 65 70 61 74 68 20 20 28  ).. (basepath  (
04d0: 73 64 61 74 2d 67 65 74 2d 74 77 69 6b 69 64 69  sdat-get-twikidi
04e0: 72 20 73 3a 73 65 73 73 69 6f 6e 29 29 0a 09 20  r s:session)).. 
04f0: 28 66 70 61 74 68 20 20 20 20 20 28 63 61 72 20  (fpath     (car 
0500: 66 64 61 74 29 29 0a 09 20 28 66 6e 61 6d 65 20  fdat)).. (fname 
0510: 20 20 20 20 28 63 61 64 72 20 66 64 61 74 29 29      (cadr fdat))
0520: 0a 09 20 28 66 75 6c 6c 6e 61 6d 65 20 20 28 63  .. (fullname  (c
0530: 6f 6e 63 20 62 61 73 65 70 61 74 68 20 22 2f 22  onc basepath "/"
0540: 20 66 70 61 74 68 20 22 2f 22 20 66 6e 61 6d 65   fpath "/" fname
0550: 29 29 0a 09 20 28 66 65 78 69 73 74 73 20 20 20  )).. (fexists   
0560: 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 66 75  (file-exists? fu
0570: 6c 6c 6e 61 6d 65 29 29 0a 09 20 28 64 62 20 20  llname)).. (db  
0580: 20 20 20 20 20 20 28 69 66 20 66 65 78 69 73 74        (if fexist
0590: 73 20 28 64 62 69 3a 6f 70 65 6e 20 27 73 71 6c  s (dbi:open 'sql
05a0: 69 74 65 33 20 28 6c 69 73 74 20 28 63 6f 6e 73  ite3 (list (cons
05b0: 20 27 64 62 6e 61 6d 65 20 66 75 6c 6c 6e 61 6d   'dbname fullnam
05c0: 65 29 29 29 20 23 66 29 29 29 0a 20 20 20 20 28  e))) #f))).    (
05d0: 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 64 62 29  if (and (not db)
05e0: 0a 09 20 20 20 20 20 28 6e 6f 74 20 63 72 65 61  ..     (not crea
05f0: 74 65 2d 6f 6b 29 29 0a 09 28 65 78 69 74 20 31  te-ok))..(exit 1
0600: 30 30 29 0a 09 28 62 65 67 69 6e 0a 09 20 20 28  00)..(begin..  (
0610: 69 66 20 28 6e 6f 74 20 66 65 78 69 73 74 73 29  if (not fexists)
0620: 0a 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09  ..      (begin..
0630: 09 3b 3b 20 28 70 72 69 6e 74 20 22 66 75 6c 6c  .;; (print "full
0640: 6e 61 6d 65 3a 20 22 20 66 75 6c 6c 6e 61 6d 65  name: " fullname
0650: 29 0a 09 09 28 74 77 69 6b 69 3a 72 65 67 69 73  )...(twiki:regis
0660: 74 65 72 2d 77 69 6b 69 20 6b 65 79 20 66 75 6c  ter-wiki key ful
0670: 6c 6e 61 6d 65 29 0a 09 09 28 73 79 73 74 65 6d  lname)...(system
0680: 20 28 63 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70   (conc "mkdir -p
0690: 20 22 20 66 70 61 74 68 29 29 20 3b 3b 20 63 72   " fpath)) ;; cr
06a0: 65 61 74 65 20 74 68 65 20 70 61 74 68 0a 09 09  eate the path...
06b0: 28 69 66 20 28 66 69 6c 65 2d 65 78 69 73 74 73  (if (file-exists
06c0: 3f 20 66 70 61 74 68 29 0a 09 09 20 20 20 20 28  ? fpath)...    (
06d0: 73 3a 6c 6f 67 20 22 4f 4b 3a 20 64 69 72 20 22  s:log "OK: dir "
06e0: 20 66 70 61 74 68 20 22 20 68 61 73 20 62 65 65   fpath " has bee
06f0: 6e 20 6d 61 64 65 22 29 0a 09 09 20 20 20 20 28  n made")...    (
0700: 73 3a 6c 6f 67 20 22 45 52 52 4f 52 3a 20 46 61  s:log "ERROR: Fa
0710: 69 6c 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  iled to make the
0720: 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 74 77   path for the tw
0730: 69 6b 69 22 29 29 0a 09 09 28 73 65 74 21 20 64  iki"))...(set! d
0740: 62 20 28 64 62 69 3a 6f 70 65 6e 20 27 73 71 6c  b (dbi:open 'sql
0750: 69 74 65 33 20 28 6c 69 73 74 20 28 63 6f 6e 73  ite3 (list (cons
0760: 20 27 64 62 6e 61 6d 65 20 66 75 6c 6c 6e 61 6d   'dbname fullnam
0770: 65 29 29 29 29 0a 09 09 28 66 6f 72 2d 65 61 63  e))))...(for-eac
0780: 68 20 0a 09 09 20 28 6c 61 6d 62 64 61 20 28 73  h ... (lambda (s
0790: 71 72 79 29 0a 09 09 20 20 20 3b 3b 20 28 70 72  qry)...   ;; (pr
07a0: 69 6e 74 20 73 71 72 79 29 0a 09 09 20 20 20 28  int sqry)...   (
07b0: 64 62 69 3a 65 78 65 63 20 64 62 20 73 71 72 79  dbi:exec db sqry
07c0: 29 29 0a 09 09 20 3b 3b 20 74 79 70 65 73 3a 20  ))... ;; types: 
07d0: 30 20 74 65 78 74 2c 20 31 20 6a 70 67 2c 20 32  0 text, 1 jpg, 2
07e0: 20 70 6e 67 2c 20 33 20 73 76 67 2c 20 34 20 73   png, 3 svg, 4 s
07f0: 70 72 65 61 64 73 68 65 65 74 2c 20 35 20 61 75  preadsheet, 5 au
0800: 64 69 6f 2c 20 36 20 76 69 64 65 6f 20 3a 3a 20  dio, 6 video :: 
0810: 62 65 74 74 65 72 20 73 70 65 63 73 20 74 6f 20  better specs to 
0820: 63 6f 6d 65 2e 2e 2e 0a 09 09 20 28 6c 69 73 74  come...... (list
0830: 0a 09 09 20 20 22 43 52 45 41 54 45 20 54 41 42  ...  "CREATE TAB
0840: 4c 45 20 70 69 63 73 20 20 20 20 20 20 28 69 64  LE pics      (id
0850: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0860: 20 4b 45 59 2c 6e 61 6d 65 20 54 45 58 54 2c 77   KEY,name TEXT,w
0870: 69 6b 69 5f 69 64 20 49 4e 54 45 47 45 52 2c 64  iki_id INTEGER,d
0880: 61 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 74 68  at_id INTEGER,th
0890: 75 6d 62 5f 64 61 74 5f 69 64 20 49 4e 54 45 47  umb_dat_id INTEG
08a0: 45 52 2c 63 72 65 61 74 65 64 5f 6f 6e 20 49 4e  ER,created_on IN
08b0: 54 45 47 45 52 2c 6f 77 6e 65 72 5f 69 64 20 49  TEGER,owner_id I
08c0: 4e 54 45 47 45 52 29 3b 22 0a 09 09 20 20 22 43  NTEGER);"...  "C
08d0: 52 45 41 54 45 20 54 41 42 4c 45 20 64 61 74 73  REATE TABLE dats
08e0: 20 20 20 20 20 20 28 69 64 20 49 4e 54 45 47 45        (id INTEGE
08f0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 6d 64  R PRIMARY KEY,md
0900: 35 73 75 6d 20 54 45 58 54 2c 64 61 74 20 42 4c  5sum TEXT,dat BL
0910: 4f 42 2c 74 79 70 65 20 49 4e 54 45 47 45 52 29  OB,type INTEGER)
0920: 3b 22 0a 09 09 20 20 3b 3b 20 6f 6e 20 65 76 65  ;"...  ;; on eve
0930: 72 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ry modification 
0940: 61 20 6e 65 77 20 74 69 64 64 6c 65 72 73 20 65  a new tiddlers e
0950: 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 2e  ntry is created.
0960: 20 57 68 65 6e 20 64 69 73 70 6c 61 79 69 6e 67   When displaying
0970: 20 74 68 65 20 74 69 64 64 6c 65 72 73 20 64 6f   the tiddlers do
0980: 3a 0a 09 09 20 20 3b 3b 20 20 20 20 73 65 6c 65  :...  ;;    sele
0990: 63 74 20 77 68 65 72 65 20 63 72 65 61 74 65 64  ct where created
09a0: 5f 6f 6e 20 3c 20 73 6f 6d 65 64 61 74 65 20 6f  _on < somedate o
09b0: 72 64 65 72 20 62 79 20 63 72 65 61 74 65 64 5f  rder by created_
09c0: 6f 6e 20 64 65 73 63 20 6c 69 6d 69 74 20 31 0a  on desc limit 1.
09d0: 09 09 20 20 22 43 52 45 41 54 45 20 54 41 42 4c  ..  "CREATE TABL
09e0: 45 20 74 69 64 64 6c 65 72 73 20 28 69 64 20 49  E tiddlers (id I
09f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0a00: 45 59 2c 77 69 6b 69 5f 69 64 20 49 4e 54 45 47  EY,wiki_id INTEG
0a10: 45 52 2c 6e 61 6d 65 20 54 45 58 54 2c 72 65 76  ER,name TEXT,rev
0a20: 20 49 4e 54 45 47 45 52 2c 64 61 74 5f 69 64 20   INTEGER,dat_id 
0a30: 49 4e 54 45 47 45 52 2c 63 72 65 61 74 65 64 5f  INTEGER,created_
0a40: 6f 6e 20 49 4e 54 45 47 45 52 2c 6f 77 6e 65 72  on INTEGER,owner
0a50: 5f 69 64 20 49 4e 54 45 47 45 52 29 3b 22 0a 09  _id INTEGER);"..
0a60: 09 20 20 3b 3b 20 72 65 76 20 61 6e 64 20 74 61  .  ;; rev and ta
0a70: 67 20 6f 6e 6c 79 20 75 74 69 6c 69 7a 65 64 20  g only utilized 
0a80: 77 68 65 6e 20 75 73 65 72 20 73 65 74 73 20 61  when user sets a
0a90: 20 74 61 67 2e 20 41 6c 6c 20 72 65 73 75 6c 74   tag. All result
0aa0: 73 20 66 72 6f 6d 20 61 20 73 65 6c 65 63 74 20  s from a select 
0ab0: 61 73 20 61 62 6f 76 65 20 66 6f 72 20 74 69 64  as above for tid
0ac0: 64 6c 65 72 73 20 61 72 65 20 73 65 74 20 74 6f  dlers are set to
0ad0: 20 74 68 65 20 74 61 67 0a 09 09 20 20 22 43 52   the tag...  "CR
0ae0: 45 41 54 45 20 54 41 42 4c 45 20 72 65 76 73 20  EATE TABLE revs 
0af0: 20 20 20 20 28 69 64 20 49 4e 54 45 47 45 52 20      (id INTEGER 
0b00: 50 52 49 4d 41 52 59 20 4b 45 59 2c 74 61 67 20  PRIMARY KEY,tag 
0b10: 54 45 58 54 29 3b 22 0a 09 09 20 20 3b 3b 20 77  TEXT);"...  ;; w
0b20: 69 6b 69 73 20 69 73 20 68 65 72 65 20 66 6f 72  ikis is here for
0b30: 20 77 68 65 6e 20 70 6f 73 74 67 72 65 73 71 6c   when postgresql
0b40: 20 73 75 70 70 6f 72 74 20 69 73 20 61 64 64 65   support is adde
0b50: 64 20 6f 72 20 69 66 20 61 20 73 75 62 20 77 69  d or if a sub wi
0b60: 6b 69 20 69 73 20 63 72 65 61 74 65 64 2e 20 0a  ki is created. .
0b70: 09 09 20 20 22 43 52 45 41 54 45 20 54 41 42 4c  ..  "CREATE TABL
0b80: 45 20 77 69 6b 69 73 20 20 20 20 28 69 64 20 49  E wikis    (id I
0b90: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0ba0: 45 59 2c 6e 61 6d 65 20 54 45 58 54 2c 63 72 65  EY,name TEXT,cre
0bb0: 61 74 65 64 5f 6f 6e 20 49 4e 54 45 47 45 52 29  ated_on INTEGER)
0bc0: 3b 22 0a 09 09 20 20 3b 3b 20 61 63 63 65 73 73  ;"...  ;; access
0bd0: 20 63 6f 6e 74 72 6f 6c 2c 20 6e 65 67 61 74 69   control, negati
0be0: 76 65 20 6e 75 6d 62 65 72 65 64 20 67 72 6f 75  ve numbered grou
0bf0: 70 73 20 61 72 65 20 70 72 69 76 61 74 65 20 67  ps are private g
0c00: 72 6f 75 70 73 2c 20 70 6f 73 74 69 76 65 20 6e  roups, postive n
0c10: 75 6d 62 65 72 65 64 20 67 72 6f 75 70 73 20 61  umbered groups a
0c20: 72 65 20 73 79 73 74 65 6d 20 67 72 6f 75 70 73  re system groups
0c30: 0a 09 09 20 20 3b 3b 20 70 65 72 6d 69 73 73 69  ...  ;; permissi
0c40: 6f 6e 73 20 61 72 65 20 6f 6e 20 61 20 70 65 72  ons are on a per
0c50: 2d 77 69 6b 69 20 67 72 61 6e 75 6c 61 72 69 74  -wiki granularit
0c60: 79 0a 09 09 20 20 3b 3b 20 61 63 63 65 73 73 3b  y...  ;; access;
0c70: 20 30 3d 6e 6f 6e 65 2c 31 3d 72 65 61 64 2c 32   0=none,1=read,2
0c80: 3d 72 65 61 64 2f 77 72 69 74 65 0a 09 09 20 20  =read/write...  
0c90: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 65  "CREATE TABLE pe
0ca0: 72 6d 73 20 20 20 20 28 69 64 20 49 4e 54 45 47  rms    (id INTEG
0cb0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 77  ER PRIMARY KEY,w
0cc0: 69 6b 69 5f 69 64 20 49 4e 54 45 47 45 52 2c 67  iki_id INTEGER,g
0cd0: 72 6f 75 70 5f 69 64 20 49 4e 54 45 47 45 52 2c  roup_id INTEGER,
0ce0: 61 63 63 65 73 73 20 49 4e 54 45 47 45 52 29 3b  access INTEGER);
0cf0: 22 0a 09 09 20 20 22 43 52 45 41 54 45 20 54 41  "...  "CREATE TA
0d00: 42 4c 45 20 67 72 6f 75 70 73 20 20 20 28 69 64  BLE groups   (id
0d10: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0d20: 20 4b 45 59 2c 6e 61 6d 65 20 54 45 58 54 29 3b   KEY,name TEXT);
0d30: 22 0a 09 09 20 20 22 43 52 45 41 54 45 20 54 41  "...  "CREATE TA
0d40: 42 4c 45 20 6d 65 6d 62 65 72 73 20 20 28 69 64  BLE members  (id
0d50: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0d60: 20 4b 45 59 2c 70 65 72 73 6f 6e 5f 69 64 20 49   KEY,person_id I
0d70: 4e 54 45 47 45 52 2c 67 72 6f 75 70 5f 69 64 20  NTEGER,group_id 
0d80: 49 4e 54 45 47 45 52 29 3b 22 0a 09 09 20 20 3b  INTEGER);"...  ;
0d90: 3b 20 73 65 74 75 70 20 61 6e 64 20 63 6f 6e 66  ; setup and conf
0da0: 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 0a 09  iguration data..
0db0: 09 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  .  "CREATE TABLE
0dc0: 20 6d 65 74 61 20 20 20 20 20 28 69 64 20 49 4e   meta     (id IN
0dd0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0de0: 59 2c 6b 65 79 20 54 45 58 54 2c 76 61 6c 20 54  Y,key TEXT,val T
0df0: 45 58 54 29 3b 22 0a 09 09 20 20 3b 3b 20 6e 65  EXT);"...  ;; ne
0e00: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
0e10: 65 6e 74 72 79 20 66 6f 72 20 2a 74 68 69 73 2a  entry for *this*
0e20: 20 74 77 69 6b 69 0a 09 09 20 20 28 63 6f 6e 63   twiki...  (conc
0e30: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 77 69   "INSERT INTO wi
0e40: 6b 69 73 20 28 69 64 2c 6e 61 6d 65 2c 63 72 65  kis (id,name,cre
0e50: 61 74 65 64 5f 6f 6e 29 20 56 41 4c 55 45 53 20  ated_on) VALUES 
0e60: 28 31 2c 27 6d 61 69 6e 27 2c 22 20 28 63 75 72  (1,'main'," (cur
0e70: 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 20 22 29  rent-seconds) ")
0e80: 3b 22 29 29 29 0a 09 09 3b 3b 20 20 20 20 20 28  ;")))...;;     (
0e90: 63 6f 6e 63 20 22 49 4e 53 45 52 54 20 49 4e 54  conc "INSERT INT
0ea0: 4f 20 74 69 64 64 6c 65 72 73 20 28 77 69 6b 69  O tiddlers (wiki
0eb0: 5f 69 64 2c 6e 61 6d 65 2c 63 72 65 61 74 65 64  _id,name,created
0ec0: 5f 6f 6e 29 20 56 41 4c 55 45 53 28 31 2c 27 4d  _on) VALUES(1,'M
0ed0: 61 69 6e 4d 65 6e 75 27 2c 22 20 28 63 75 72 72  ainMenu'," (curr
0ee0: 65 6e 74 2d 73 65 63 6f 6e 64 73 29 20 22 29 3b  ent-seconds) ");
0ef0: 22 29 29 29 29 29 0a 09 09 28 74 77 69 6b 69 3a  ")))))...(twiki:
0f00: 73 61 76 65 2d 74 69 64 64 6c 65 72 20 64 62 20  save-tiddler db 
0f10: 22 4d 61 69 6e 4d 65 6e 75 22 20 22 5b 5b 46 69  "MainMenu" "[[Fi
0f20: 72 73 74 54 69 64 64 6c 65 72 5d 5d 22 20 22 22  rstTiddler]]" ""
0f30: 20 31 20 31 29 29 29 0a 09 20 20 3b 3b 20 28 73   1 1)))..  ;; (s
0f40: 71 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d  qlite3:set-busy-
0f50: 74 69 6d 65 6f 75 74 21 28 64 62 69 3a 64 62 2d  timeout!(dbi:db-
0f60: 63 6f 6e 6e 20 64 62 29 20 31 30 30 30 30 30 30  conn db) 1000000
0f70: 29 0a 09 20 20 64 62 29 29 29 29 0a 0a 3b 3b 3d  )..  db))))..;;=
0f80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0fa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0fc0: 3d 3d 3d 3d 3d 0a 3b 3b 20 74 77 69 6b 69 73 20  =====.;; twikis 
0fd0: 28 64 62 20 6e 61 6d 69 6e 67 2c 20 73 71 6c 69  (db naming, sqli
0fe0: 74 65 20 76 73 20 70 6f 73 74 67 72 65 73 71 6c  te vs postgresql
0ff0: 2c 20 6b 65 79 73 20 65 74 63 2e 0a 3b 3b 3d 3d  , keys etc..;;==
1000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1040: 3d 3d 3d 3d 0a 0a 3b 3b 20 41 20 77 69 6b 69 20  ====..;; A wiki 
1050: 69 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  is specified by 
1060: 61 20 6c 69 73 74 20 6f 66 20 6b 65 79 73 2c 20  a list of keys, 
1070: 68 65 72 65 20 77 65 20 63 6f 6e 76 65 72 74 20  here we convert 
1080: 74 68 61 74 20 6c 69 73 74 20 74 6f 20 61 20 73  that list to a s
1090: 69 6e 67 6c 65 20 73 74 72 69 6e 67 0a 28 64 65  ingle string.(de
10a0: 66 69 6e 65 20 28 74 77 69 6b 69 3a 6b 65 79 73  fine (twiki:keys
10b0: 2d 3e 6b 65 79 20 6b 65 79 73 29 0a 20 20 28 69  ->key keys).  (i
10c0: 66 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f 20 6b 65  f (not (null? ke
10d0: 79 73 29 29 0a 20 20 20 20 20 20 28 73 74 72 69  ys)).      (stri
10e0: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28  ng-intersperse (
10f0: 6d 61 70 20 63 6f 6e 63 20 6b 65 79 73 29 20 22  map conc keys) "
1100: 20 22 29 0a 20 20 20 20 20 20 22 20 22 29 29 0a   ").      " ")).
1110: 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a  .(define (twiki:
1120: 6b 65 79 2d 3e 66 6e 61 6d 65 20 6b 65 79 29 0a  key->fname key).
1130: 20 20 28 6c 65 74 2a 20 28 3b 3b 20 28 6d 64 35    (let* (;; (md5
1140: 6b 65 79 70 61 74 68 20 28 6d 64 35 3a 64 69 67  keypath (md5:dig
1150: 65 73 74 20 6b 65 79 29 29 20 3b 3b 20 28 74 77  est key)) ;; (tw
1160: 69 6b 69 3a 6b 65 79 73 2d 3e 6b 65 79 20 6b 65  iki:keys->key ke
1170: 79 73 29 29 29 0a 09 20 28 6b 65 79 70 61 74 68  ys))).. (keypath
1180: 20 20 20 20 28 74 77 69 6b 69 3a 77 65 62 36 34      (twiki:web64
1190: 65 6e 63 20 6b 65 79 29 29 0a 09 20 28 64 65 6c  enc key)).. (del
11a0: 74 61 20 20 20 20 20 20 28 71 75 6f 74 69 65 6e  ta      (quotien
11b0: 74 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68  t (string-length
11c0: 20 6b 65 79 70 61 74 68 29 20 33 29 29 20 3b 3b   keypath) 3)) ;;
11d0: 20 0a 09 20 28 70 31 20 20 20 20 20 20 20 20 20   .. (p1         
11e0: 28 73 75 62 73 74 72 69 6e 67 20 6b 65 79 70 61  (substring keypa
11f0: 74 68 20 30 20 20 20 20 20 20 20 20 20 20 20 64  th 0           d
1200: 65 6c 74 61 29 29 20 3b 3b 20 20 30 20 20 38 29  elta)) ;;  0  8)
1210: 29 0a 09 20 28 70 32 20 20 20 20 20 20 20 20 20  ).. (p2         
1220: 28 73 75 62 73 74 72 69 6e 67 20 6b 65 79 70 61  (substring keypa
1230: 74 68 20 64 65 6c 74 61 20 20 20 20 20 20 20 28  th delta       (
1240: 2a 20 64 65 6c 74 61 20 32 29 29 29 3b 3b 20 20  * delta 2)));;  
1250: 38 20 31 36 29 29 0a 09 20 28 70 33 20 20 20 20  8 16)).. (p3    
1260: 20 20 20 20 20 28 73 75 62 73 74 72 69 6e 67 20       (substring 
1270: 6b 65 79 70 61 74 68 20 28 2a 20 64 65 6c 74 61  keypath (* delta
1280: 20 32 29 20 28 2a 20 64 65 6c 74 61 20 33 29 29   2) (* delta 3))
1290: 29 29 20 3b 3b 20 31 36 20 32 34 29 29 0a 20 20  )) ;; 16 24)).  
12a0: 20 20 28 6c 69 73 74 20 28 73 74 72 69 6e 67 2d    (list (string-
12b0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 6c 69 73  intersperse (lis
12c0: 74 20 22 74 77 69 6b 69 73 22 20 70 31 20 70 32  t "twikis" p1 p2
12d0: 20 70 33 29 20 22 2f 22 29 20 6b 65 79 70 61 74   p3) "/") keypat
12e0: 68 29 29 29 0a 0a 3b 3b 20 6c 6f 6f 6b 20 75 70  h)))..;; look up
12f0: 20 74 68 65 20 77 69 64 20 62 61 73 65 64 20 6f   the wid based o
1300: 6e 20 74 68 65 20 6b 65 79 73 2c 20 74 68 69 73  n the keys, this
1310: 20 69 73 20 75 73 65 64 20 66 6f 72 20 73 75 62   is used for sub
1320: 20 77 69 6b 69 73 20 6f 6e 6c 79 2e 20 49 2e 65   wikis only. I.e
1330: 2e 20 61 20 77 69 6b 69 20 69 6e 73 74 61 6e 74  . a wiki instant
1340: 69 61 74 65 64 20 69 6e 73 69 64 65 20 61 6e 6f  iated inside ano
1350: 74 68 65 72 20 77 69 6b 69 20 0a 3b 3b 20 67 69  ther wiki .;; gi
1360: 76 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20  ving a separate 
1370: 6e 61 6d 65 73 70 61 63 65 20 74 6f 20 61 6c 6c  namespace to all
1380: 20 74 68 65 20 74 69 64 64 6c 65 72 73 0a 28 64   the tiddlers.(d
1390: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 6e 61 6d  efine (twiki:nam
13a0: 65 2d 3e 77 69 64 20 64 62 20 6e 61 6d 65 29 20  e->wid db name) 
13b0: 0a 20 20 28 6c 65 74 20 28 28 77 69 64 20 28 64  .  (let ((wid (d
13c0: 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 20 22 53  bi:get-one db "S
13d0: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 77 69  ELECT id FROM wi
13e0: 6b 69 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 3f  kis WHERE name=?
13f0: 3b 22 20 6e 61 6d 65 29 29 29 0a 20 20 20 20 28  ;" name))).    (
1400: 69 66 20 77 69 64 20 77 69 64 0a 09 28 62 65 67  if wid wid..(beg
1410: 69 6e 0a 09 20 20 28 64 62 69 3a 65 78 65 63 20  in..  (dbi:exec 
1420: 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  db "INSERT INTO 
1430: 77 69 6b 69 73 20 28 6e 61 6d 65 2c 63 72 65 61  wikis (name,crea
1440: 74 65 64 5f 6f 6e 29 20 56 41 4c 55 45 53 28 3f  ted_on) VALUES(?
1450: 2c 3f 29 3b 22 20 6e 61 6d 65 20 28 63 75 72 72  ,?);" name (curr
1460: 65 6e 74 2d 73 65 63 6f 6e 64 73 29 29 0a 09 20  ent-seconds)).. 
1470: 20 28 74 77 69 6b 69 3a 6e 61 6d 65 2d 3e 77 69   (twiki:name->wi
1480: 64 20 64 62 20 6e 61 6d 65 29 29 29 29 29 0a 0a  d db name)))))..
1490: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
14a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14d0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 77 69 6b  ========.;; twik
14e0: 69 20 72 65 63 6f 72 64 0a 3b 3b 3d 3d 3d 3d 3d  i record.;;=====
14f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1530: 3d 0a 0a 3b 3b 20 6d 61 6b 65 2d 76 65 63 74 6f  =..;; make-vecto
1540: 72 2d 72 65 63 6f 72 64 20 74 77 69 6b 69 20 77  r-record twiki w
1550: 69 6b 69 20 77 69 64 20 6e 61 6d 65 20 6b 65 79  iki wid name key
1560: 20 64 62 68 0a 28 64 65 66 69 6e 65 20 28 6d 61   dbh.(define (ma
1570: 6b 65 2d 74 77 69 6b 69 3a 77 69 6b 69 29 28 6d  ke-twiki:wiki)(m
1580: 61 6b 65 2d 76 65 63 74 6f 72 20 35 29 29 0a 28  ake-vector 5)).(
1590: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74  define-inline (t
15a0: 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 77 69  wiki:wiki-get-wi
15b0: 64 20 20 20 20 76 65 63 29 20 20 20 20 28 76 65  d    vec)    (ve
15c0: 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20 30 29  ctor-ref  vec 0)
15d0: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
15e0: 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74   (twiki:wiki-get
15f0: 2d 6e 61 6d 65 20 20 20 76 65 63 29 20 20 20 20  -name   vec)    
1600: 28 76 65 63 74 6f 72 2d 72 65 66 20 20 76 65 63  (vector-ref  vec
1610: 20 31 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c   1)).(define-inl
1620: 69 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d  ine (twiki:wiki-
1630: 67 65 74 2d 6b 65 79 20 20 20 20 76 65 63 29 20  get-key    vec) 
1640: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20     (vector-ref  
1650: 76 65 63 20 32 29 29 0a 28 64 65 66 69 6e 65 2d  vec 2)).(define-
1660: 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 77 69  inline (twiki:wi
1670: 6b 69 2d 67 65 74 2d 64 62 68 20 20 20 20 76 65  ki-get-dbh    ve
1680: 63 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65  c)    (vector-re
1690: 66 20 20 76 65 63 20 33 29 29 0a 28 64 65 66 69  f  vec 3)).(defi
16a0: 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69  ne-inline (twiki
16b0: 3a 77 69 6b 69 2d 67 65 74 2d 70 65 72 6d 73 20  :wiki-get-perms 
16c0: 20 76 65 63 29 20 20 20 20 28 76 65 63 74 6f 72   vec)    (vector
16d0: 2d 72 65 66 20 20 76 65 63 20 34 29 29 0a 0a 28  -ref  vec 4))..(
16e0: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74  define-inline (t
16f0: 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 77 69  wiki:wiki-set-wi
1700: 64 21 20 20 20 76 65 63 20 76 61 6c 29 28 76 65  d!   vec val)(ve
1710: 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20 30 20  ctor-set! vec 0 
1720: 76 61 6c 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e  val)).(define-in
1730: 6c 69 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69  line (twiki:wiki
1740: 2d 73 65 74 2d 6e 61 6d 65 21 20 20 76 65 63 20  -set-name!  vec 
1750: 76 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74 21  val)(vector-set!
1760: 20 76 65 63 20 31 20 76 61 6c 29 29 0a 28 64 65   vec 1 val)).(de
1770: 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69  fine-inline (twi
1780: 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 6b 65 79 21  ki:wiki-set-key!
1790: 20 20 20 76 65 63 20 76 61 6c 29 28 76 65 63 74     vec val)(vect
17a0: 6f 72 2d 73 65 74 21 20 76 65 63 20 32 20 76 61  or-set! vec 2 va
17b0: 6c 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69  l)).(define-inli
17c0: 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 73  ne (twiki:wiki-s
17d0: 65 74 2d 64 62 68 21 20 20 20 76 65 63 20 76 61  et-dbh!   vec va
17e0: 6c 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76  l)(vector-set! v
17f0: 65 63 20 33 20 76 61 6c 29 29 0a 28 64 65 66 69  ec 3 val)).(defi
1800: 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69  ne-inline (twiki
1810: 3a 77 69 6b 69 2d 73 65 74 2d 70 65 72 6d 73 21  :wiki-set-perms!
1820: 20 76 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72   vec val)(vector
1830: 2d 73 65 74 21 20 76 65 63 20 34 20 76 61 6c 29  -set! vec 4 val)
1840: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
1850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1880: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74  ===========.;; t
1890: 77 69 6b 69 20 6d 69 73 63 0a 3b 3b 3d 3d 3d 3d  wiki misc.;;====
18a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18e0: 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20 68  ==..;; returns h
18f0: 65 6c 70 20 68 74 6d 6c 0a 28 64 65 66 69 6e 65  elp html.(define
1900: 20 28 74 77 69 6b 69 3a 68 65 6c 70 20 73 65 63   (twiki:help sec
1910: 74 69 6f 6e 29 0a 20 20 28 6c 65 74 20 28 28 6d  tion).  (let ((m
1920: 61 69 6e 20 28 74 77 69 6b 69 3a 64 69 76 20 0a  ain (twiki:div .
1930: 09 20 20 20 20 20 20 20 27 6e 6f 64 65 20 22 74  .       'node "t
1940: 77 69 6b 69 2d 68 65 6c 70 22 0a 09 20 20 20 20  wiki-help"..    
1950: 20 20 20 28 6c 69 73 74 20 0a 09 09 28 74 77 69     (list ...(twi
1960: 6b 69 3a 68 33 20 22 48 65 6c 70 20 73 74 75 66  ki:h3 "Help stuf
1970: 66 22 29 0a 09 09 28 74 77 69 6b 69 3a 70 72 65  f")...(twiki:pre
1980: 20 22 0a 4c 69 6e 6b 20 74 6f 20 70 61 67 65 3a   ".Link to page:
1990: 20 20 20 20 20 20 5b 5b 50 61 67 65 20 54 69 74        [[Page Tit
19a0: 6c 65 5d 5d 0a 48 65 61 64 69 6e 67 33 3a 20 20  le]].Heading3:  
19b0: 20 20 20 20 20 20 20 20 21 21 21 20 54 68 65 20          !!! The 
19c0: 68 65 61 64 69 6e 67 0a 55 6e 64 65 72 6c 69 6e  heading.Underlin
19d0: 65 3a 20 20 20 20 20 20 20 20 20 5f 5f 75 6e 64  e:         __und
19e0: 65 72 6c 69 6e 65 64 5f 5f 0a 54 61 62 6c 65 3a  erlined__.Table:
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 63               | c
1a00: 65 6c 6c 31 20 7c 20 63 65 6c 6c 32 20 7c 0a 4c  ell1 | cell2 |.L
1a10: 69 73 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  ist:            
1a20: 20 20 23 20 69 74 65 6d 31 0a 20 20 20 20 20 20    # item1.      
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 23 20               ## 
1a40: 69 74 65 6d 32 0a 42 75 6c 6c 65 74 3a 20 20 20  item2.Bullet:   
1a50: 20 20 20 20 20 20 20 20 20 2a 20 69 74 65 6d 31           * item1
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a70: 20 20 20 20 2a 2a 20 69 74 65 6d 32 0a 50 72 65      ** item2.Pre
1a80: 66 6f 72 6d 61 74 74 65 64 3a 20 20 20 20 20 20  formatted:      
1a90: 7b 7b 7b 73 74 75 66 66 20 68 65 72 65 7d 7d 7d  {{{stuff here}}}
1aa0: 0a 49 6e 73 65 72 74 20 61 20 70 69 63 74 75 72  .Insert a pictur
1ab0: 65 3a 20 20 5b 70 69 63 5b 50 69 63 4e 61 6d 65  e:  [pic[PicName
1ac0: 5d 5d 0a 4f 72 20 77 69 74 68 20 73 69 7a 65 3a  ]].Or with size:
1ad0: 20 20 20 20 20 20 5b 70 69 63 31 30 30 78 31 30        [pic100x10
1ae0: 30 5b 50 69 63 4e 61 6d 65 5d 5d 0a 55 70 6c 6f  0[PicName]].Uplo
1af0: 61 64 20 74 68 65 20 70 69 63 74 75 72 65 20 75  ad the picture u
1b00: 73 69 6e 67 20 74 68 65 20 5c 22 50 69 63 5c 22  sing the \"Pic\"
1b10: 20 6c 69 6e 6b 20 66 69 72 73 74 22 29 29 29 29   link first"))))
1b20: 29 0a 09 3b 3b 28 63 61 73 65 20 73 65 63 74 69  )..;;(case secti
1b30: 6f 6e 0a 20 20 20 20 6d 61 69 6e 29 29 0a 0a 3b  on.    main))..;
1b40: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
1b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b80: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 77 69 6b 69  =======.;; twiki
1b90: 20 61 63 63 65 73 73 20 63 6f 6e 74 72 6f 6c 0a   access control.
1ba0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
1bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1be0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 69 64 65  ========..;; ide
1bf0: 61 20 68 65 72 65 20 69 73 20 66 6f 72 20 74 68  a here is for th
1c00: 65 20 65 6e 64 20 75 73 65 72 20 74 6f 20 72 65  e end user to re
1c10: 64 65 66 69 6e 65 20 74 68 69 73 20 72 6f 75 74  define this rout
1c20: 69 6e 65 2c 0a 3b 3b 20 61 6e 64 20 63 61 6c 6c  ine,.;; and call
1c30: 20 74 77 69 6b 69 3a 69 6e 74 65 72 61 6c 2d 61   twiki:interal-a
1c40: 63 63 65 73 73 20 69 66 20 64 65 73 69 72 65 64  ccess if desired
1c50: 0a 3b 3b 20 0a 3b 3b 20 69 66 20 6f 76 65 72 72  .;; .;; if overr
1c60: 69 64 65 20 69 73 20 23 74 20 74 68 65 6e 20 67  ide is #t then g
1c70: 69 76 65 20 61 63 63 65 73 73 20 6e 6f 20 6d 61  ive access no ma
1c80: 74 74 65 72 20 77 68 61 74 0a 28 64 65 66 69 6e  tter what.(defin
1c90: 65 20 28 74 77 69 6b 69 3a 61 63 63 65 73 73 20  e (twiki:access 
1ca0: 6b 65 79 73 20 77 69 6b 69 2d 6e 61 6d 65 20 75  keys wiki-name u
1cb0: 73 65 72 2d 69 64 29 0a 20 20 27 28 72 20 77 29  ser-id).  '(r w)
1cc0: 29 0a 0a 3b 3b 20 41 64 64 20 73 75 70 70 6f 72  )..;; Add suppor
1cd0: 74 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 67 72  t for storing gr
1ce0: 6f 75 70 73 2c 20 75 73 65 72 73 20 61 6e 64 20  oups, users and 
1cf0: 61 63 63 65 73 73 20 69 6e 74 65 72 6e 61 6c 6c  access internall
1d00: 79 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 74  y.;; .(define (t
1d10: 77 69 6b 69 3a 69 6e 74 65 72 6e 61 6c 2d 61 63  wiki:internal-ac
1d20: 63 65 73 73 20 6b 65 79 73 20 77 69 6b 69 2d 6e  cess keys wiki-n
1d30: 61 6d 65 20 75 73 65 72 2d 69 64 29 0a 20 20 23  ame user-id).  #
1d40: 66 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  f)..;;==========
1d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1d90: 74 77 69 6b 69 20 72 65 67 69 73 74 72 79 0a 3b  twiki registry.;
1da0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
1db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1de0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 74 68 65 73  =======..;; thes
1df0: 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1e00: 64 65 6e 20 62 79 20 65 6e 64 20 75 73 65 72 20  den by end user 
1e10: 28 6a 75 73 74 20 63 72 65 61 74 65 20 61 20 6e  (just create a n
1e20: 65 77 20 72 6f 75 74 69 6e 65 20 62 79 20 74 68  ew routine by th
1e30: 65 20 73 61 6d 65 20 6e 61 6d 65 29 0a 0a 28 64  e same name)..(d
1e40: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 6f 70 65  efine (twiki:ope
1e50: 6e 2d 72 65 67 69 73 74 72 79 29 0a 20 20 28 6c  n-registry).  (l
1e60: 65 74 2a 20 28 28 62 61 73 65 70 61 74 68 20 20  et* ((basepath  
1e70: 28 73 64 61 74 2d 67 65 74 2d 73 72 6f 6f 74 20  (sdat-get-sroot 
1e80: 73 3a 73 65 73 73 69 6f 6e 29 29 0a 09 20 28 72  s:session)).. (r
1e90: 65 67 66 69 6c 65 20 20 20 28 63 6f 6e 63 20 62  egfile   (conc b
1ea0: 61 73 65 70 61 74 68 20 22 2f 74 77 69 6b 69 73  asepath "/twikis
1eb0: 2f 72 65 67 69 73 74 72 79 2e 64 62 22 29 29 0a  /registry.db")).
1ec0: 09 20 28 72 65 67 65 78 69 73 74 73 20 28 66 69  . (regexists (fi
1ed0: 6c 65 2d 65 78 69 73 74 73 3f 20 72 65 67 66 69  le-exists? regfi
1ee0: 6c 65 29 29 0a 09 20 28 64 62 20 20 20 20 20 20  le)).. (db      
1ef0: 20 20 28 64 62 69 3a 6f 70 65 6e 20 27 73 71 6c    (dbi:open 'sql
1f00: 69 74 65 33 20 28 6c 69 73 74 20 28 63 6f 6e 73  ite3 (list (cons
1f10: 20 27 64 62 6e 61 6d 65 20 72 65 67 66 69 6c 65   'dbname regfile
1f20: 29 29 29 29 29 0a 20 20 20 20 28 69 66 20 72 65  ))))).    (if re
1f30: 67 65 78 69 73 74 73 0a 09 64 62 0a 09 28 62 65  gexists..db..(be
1f40: 67 69 6e 0a 09 20 20 28 66 6f 72 2d 65 61 63 68  gin..  (for-each
1f50: 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74 29 28   (lambda (stmt)(
1f60: 64 62 69 3a 65 78 65 63 20 64 62 20 73 74 6d 74  dbi:exec db stmt
1f70: 29 29 0a 09 09 20 20 20 20 28 6c 69 73 74 20 22  ))...    (list "
1f80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 77 69 6b  CREATE TABLE wik
1f90: 69 73 20 28 6b 65 79 20 54 45 58 54 20 50 52 49  is (key TEXT PRI
1fa0: 4d 41 52 59 20 4b 45 59 2c 70 61 74 68 20 54 45  MARY KEY,path TE
1fb0: 58 54 2c 63 72 65 61 74 69 6f 6e 5f 64 61 74 65  XT,creation_date
1fc0: 20 49 4e 54 45 47 45 52 2c 63 72 65 61 74 6f 72   INTEGER,creator
1fd0: 5f 69 64 20 49 4e 54 45 47 45 52 29 3b 22 29 29  _id INTEGER);"))
1fe0: 0a 09 20 20 64 62 29 29 29 29 0a 0a 28 64 65 66  ..  db))))..(def
1ff0: 69 6e 65 20 28 74 77 69 6b 69 3a 72 65 67 69 73  ine (twiki:regis
2000: 74 65 72 2d 77 69 6b 69 20 6b 65 79 20 70 61 74  ter-wiki key pat
2010: 68 29 0a 20 20 28 6c 65 74 20 28 28 64 62 20 28  h).  (let ((db (
2020: 74 77 69 6b 69 3a 6f 70 65 6e 2d 72 65 67 69 73  twiki:open-regis
2030: 74 72 79 29 29 29 0a 20 20 20 20 28 64 62 69 3a  try))).    (dbi:
2040: 65 78 65 63 20 64 62 20 0a 09 20 20 20 20 20 20  exec db ..      
2050: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
2060: 43 45 20 49 4e 54 4f 20 77 69 6b 69 73 20 28 6b  CE INTO wikis (k
2070: 65 79 2c 70 61 74 68 2c 63 72 65 61 74 69 6f 6e  ey,path,creation
2080: 5f 64 61 74 65 2c 63 72 65 61 74 6f 72 5f 69 64  _date,creator_id
2090: 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  ) VALUES(?,?,?,?
20a0: 29 3b 22 0a 09 20 20 20 20 20 20 6b 65 79 20 70  );"..      key p
20b0: 61 74 68 20 28 63 75 72 72 65 6e 74 2d 73 65 63  ath (current-sec
20c0: 6f 6e 64 73 29 20 28 74 77 69 6b 69 3a 67 65 74  onds) (twiki:get
20d0: 2d 69 64 29 29 0a 20 20 20 20 28 64 62 69 3a 63  -id)).    (dbi:c
20e0: 6c 6f 73 65 20 64 62 29 29 29 0a 0a 3b 3b 3d 3d  lose db)))..;;==
20f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2130: 3d 3d 3d 3d 0a 3b 3b 20 74 69 64 64 6c 65 72 73  ====.;; tiddlers
2140: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
2150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69  =========..(defi
2190: 6e 65 20 74 77 69 6b 69 3a 74 69 64 64 6c 65 72  ne twiki:tiddler
21a0: 2d 73 65 6c 65 63 74 6f 72 20 22 53 45 4c 45 43  -selector "SELEC
21b0: 54 20 74 2e 69 64 2c 74 2e 6e 61 6d 65 2c 74 2e  T t.id,t.name,t.
21c0: 72 65 76 2c 74 2e 64 61 74 5f 69 64 2c 74 2e 63  rev,t.dat_id,t.c
21d0: 72 65 61 74 65 64 5f 6f 6e 2c 74 2e 6f 77 6e 65  reated_on,t.owne
21e0: 72 5f 69 64 20 46 52 4f 4d 20 74 69 64 64 6c 65  r_id FROM tiddle
21f0: 72 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f  rs AS t INNER JO
2200: 49 4e 20 64 61 74 73 20 41 53 20 64 20 4f 4e 20  IN dats AS d ON 
2210: 74 2e 64 61 74 5f 69 64 3d 64 2e 69 64 22 29 0a  t.dat_id=d.id").
2220: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 74  (define (twiki:t
2230: 69 64 64 6c 65 72 2d 6d 61 6b 65 29 28 6d 61 6b  iddler-make)(mak
2240: 65 2d 76 65 63 74 6f 72 20 38 20 23 66 29 29 0a  e-vector 8 #f)).
2250: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
2260: 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65  twiki:tiddler-ge
2270: 74 2d 69 64 20 20 20 20 20 20 20 20 20 20 20 76  t-id           v
2280: 65 63 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72  ec)    (vector-r
2290: 65 66 20 20 76 65 63 20 30 29 29 0a 28 64 65 66  ef  vec 0)).(def
22a0: 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b  ine-inline (twik
22b0: 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 6e 61  i:tiddler-get-na
22c0: 6d 65 20 20 20 20 20 20 20 20 20 76 65 63 29 20  me         vec) 
22d0: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20     (vector-ref  
22e0: 76 65 63 20 31 29 29 0a 28 64 65 66 69 6e 65 2d  vec 1)).(define-
22f0: 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69  inline (twiki:ti
2300: 64 64 6c 65 72 2d 67 65 74 2d 72 65 76 20 20 20  ddler-get-rev   
2310: 20 20 20 20 20 20 20 76 65 63 29 20 20 20 20 28         vec)    (
2320: 76 65 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20  vector-ref  vec 
2330: 32 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69  2)).(define-inli
2340: 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65  ne (twiki:tiddle
2350: 72 2d 67 65 74 2d 64 61 74 2d 69 64 20 20 20 20  r-get-dat-id    
2360: 20 20 20 76 65 63 29 20 20 20 20 28 76 65 63 74     vec)    (vect
2370: 6f 72 2d 72 65 66 20 20 76 65 63 20 33 29 29 0a  or-ref  vec 3)).
2380: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
2390: 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65  twiki:tiddler-ge
23a0: 74 2d 63 72 65 61 74 65 64 5f 6f 6e 20 20 20 76  t-created_on   v
23b0: 65 63 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72  ec)    (vector-r
23c0: 65 66 20 20 76 65 63 20 34 29 29 0a 28 64 65 66  ef  vec 4)).(def
23d0: 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b  ine-inline (twik
23e0: 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 6f 77  i:tiddler-get-ow
23f0: 6e 65 72 5f 69 64 20 20 20 20 20 76 65 63 29 20  ner_id     vec) 
2400: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20     (vector-ref  
2410: 76 65 63 20 35 29 29 0a 3b 3b 20 28 64 65 66 69  vec 5)).;; (defi
2420: 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69  ne-inline (twiki
2430: 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61 74  :tiddler-get-dat
2440: 2d 74 79 70 65 20 20 20 20 20 76 65 63 29 20 20  -type     vec)  
2450: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20 76    (vector-ref  v
2460: 65 63 20 36 29 29 0a 0a 28 64 65 66 69 6e 65 2d  ec 6))..(define-
2470: 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69  inline (twiki:ti
2480: 64 64 6c 65 72 2d 73 65 74 2d 69 64 21 20 20 20  ddler-set-id!   
2490: 20 20 20 20 20 20 20 76 65 63 20 76 61 6c 29 28         vec val)(
24a0: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20  vector-set! vec 
24b0: 30 20 76 61 6c 29 20 76 65 63 29 0a 28 64 65 66  0 val) vec).(def
24c0: 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b  ine-inline (twik
24d0: 69 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d 6e 61  i:tiddler-set-na
24e0: 6d 65 21 20 20 20 20 20 20 20 20 76 65 63 20 76  me!        vec v
24f0: 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20  al)(vector-set! 
2500: 76 65 63 20 31 20 76 61 6c 29 20 76 65 63 29 0a  vec 1 val) vec).
2510: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
2520: 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65  twiki:tiddler-se
2530: 74 2d 72 65 76 21 20 20 20 20 20 20 20 20 20 76  t-rev!         v
2540: 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73  ec val)(vector-s
2550: 65 74 21 20 76 65 63 20 32 20 76 61 6c 29 20 76  et! vec 2 val) v
2560: 65 63 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69  ec).(define-inli
2570: 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65  ne (twiki:tiddle
2580: 72 2d 73 65 74 2d 64 61 74 2d 69 64 21 20 20 20  r-set-dat-id!   
2590: 20 20 20 76 65 63 20 76 61 6c 29 28 76 65 63 74     vec val)(vect
25a0: 6f 72 2d 73 65 74 21 20 76 65 63 20 33 20 76 61  or-set! vec 3 va
25b0: 6c 29 20 76 65 63 29 0a 28 64 65 66 69 6e 65 2d  l) vec).(define-
25c0: 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69  inline (twiki:ti
25d0: 64 64 6c 65 72 2d 73 65 74 2d 63 72 65 61 74 65  ddler-set-create
25e0: 64 5f 6f 6e 21 20 20 76 65 63 20 76 61 6c 29 28  d_on!  vec val)(
25f0: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20  vector-set! vec 
2600: 34 20 76 61 6c 29 20 76 65 63 29 0a 3b 3b 20 28  4 val) vec).;; (
2610: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74  define-inline (t
2620: 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 74  wiki:tiddler-set
2630: 2d 6f 77 6e 65 72 5f 69 64 21 20 20 20 20 76 65  -owner_id!    ve
2640: 63 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73 65  c val)(vector-se
2650: 74 21 20 76 65 63 20 35 20 76 61 6c 29 29 0a 0a  t! vec 5 val))..
2660: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
2670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
26a0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 52 6f 75 74  ========.;; Rout
26b0: 69 6e 65 73 20 66 6f 72 20 64 69 73 70 6c 61 79  ines for display
26c0: 69 6e 67 2c 20 65 64 69 74 69 6e 67 2c 20 62 72  ing, editing, br
26d0: 6f 77 73 69 6e 67 20 65 74 63 2e 20 74 69 64 64  owsing etc. tidd
26e0: 6c 65 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  lers.;;=========
26f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 09 0a 0a  =============...
2730: 3b 3b 20 73 68 6f 75 6c 64 20 63 68 61 6e 67 65  ;; should change
2740: 20 74 68 69 73 20 74 6f 20 74 61 6b 65 20 61 20   this to take a 
2750: 74 69 64 64 6c 65 72 20 73 74 72 75 63 74 75 72  tiddler structur
2760: 65 3f 0a 3b 3b 20 54 68 69 73 20 69 73 20 74 68  e?.;; This is th
2770: 65 20 64 69 73 70 6c 61 79 20 6f 66 20 61 20 73  e display of a s
2780: 69 6e 67 6c 65 20 74 69 64 64 6c 65 72 0a 28 64  ingle tiddler.(d
2790: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 76 69 65  efine (twiki:vie
27a0: 77 20 64 61 74 20 20 74 6b 65 79 20 77 69 64 20  w dat  tkey wid 
27b0: 74 69 64 64 6c 65 72 20 77 69 6b 69 29 20 3b 3b  tiddler wiki) ;;
27c0: 20 63 6c 6f 73 65 2c 20 63 6c 6f 73 65 20 6f 74   close, close ot
27d0: 68 65 72 73 2c 20 65 64 69 74 2c 20 6d 6f 72 65  hers, edit, more
27e0: 0a 20 20 28 6c 65 74 20 28 28 69 73 2d 6e 6f 74  .  (let ((is-not
27f0: 2d 6d 61 69 6e 20 20 28 6e 6f 74 20 28 65 71 75  -main  (not (equ
2800: 61 6c 3f 20 22 4d 61 69 6e 4d 65 6e 75 22 20 28  al? "MainMenu" (
2810: 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65  twiki:tiddler-ge
2820: 74 2d 6e 61 6d 65 20 74 69 64 64 6c 65 72 29 29  t-name tiddler))
2830: 29 29 0a 09 28 65 64 69 74 2d 61 6c 6c 6f 77 65  ))..(edit-allowe
2840: 64 20 28 6d 65 6d 62 65 72 20 27 77 20 28 74 77  d (member 'w (tw
2850: 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 70 65 72  iki:wiki-get-per
2860: 6d 73 20 77 69 6b 69 29 29 29 29 0a 20 20 20 20  ms wiki)))).    
2870: 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20 22 74  (s:div 'class "t
2880: 69 64 64 6c 65 72 22 0a 09 20 20 20 28 73 3a 64  iddler"..   (s:d
2890: 69 76 20 27 63 6c 61 73 73 20 22 74 69 64 64 6c  iv 'class "tiddl
28a0: 65 72 2d 6d 65 6e 75 22 0a 09 09 20 20 28 69 66  er-menu"...  (if
28b0: 20 28 65 71 75 61 6c 3f 20 22 4d 61 69 6e 4d 65   (equal? "MainMe
28c0: 6e 75 22 20 28 74 77 69 6b 69 3a 74 69 64 64 6c  nu" (twiki:tiddl
28d0: 65 72 2d 67 65 74 2d 6e 61 6d 65 20 74 69 64 64  er-get-name tidd
28e0: 6c 65 72 29 29 0a 09 09 20 20 20 20 20 20 28 69  ler))...      (i
28f0: 66 20 65 64 69 74 2d 61 6c 6c 6f 77 65 64 0a 09  f edit-allowed..
2900: 09 09 20 20 28 6c 69 73 74 20 28 73 3a 61 20 22  ..  (list (s:a "
2910: 65 64 69 74 22 20 27 68 72 65 66 0a 09 09 09 09  edit" 'href.....
2920: 20 20 20 20 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20       (s:link-to 
2930: 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d  (twiki:get-link-
2940: 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29  back-to-current)
2950: 0a 09 09 09 09 09 09 27 65 64 69 74 5f 74 69 64  .......'edit_tid
2960: 64 6c 65 72 20 28 74 77 69 6b 69 3a 74 69 64 64  dler (twiki:tidd
2970: 6c 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64 6c  ler-get-id tiddl
2980: 65 72 29 29 29 29 0a 09 09 09 20 20 27 28 29 29  er))))....  '())
2990: 0a 09 09 20 20 20 20 20 20 28 73 3a 64 69 76 20  ...      (s:div 
29a0: 27 63 6c 61 73 73 20 22 74 69 64 64 6c 65 72 2d  'class "tiddler-
29b0: 6d 65 6e 75 2d 69 6e 74 65 72 6e 61 6c 22 0a 09  menu-internal"..
29c0: 09 20 20 20 20 20 20 20 28 73 3a 61 20 22 63 6c  .       (s:a "cl
29d0: 6f 73 65 22 20 27 68 72 65 66 20 28 73 3a 6c 69  ose" 'href (s:li
29e0: 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65 74  nk-to (twiki:get
29f0: 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75  -link-back-to-cu
2a00: 72 72 65 6e 74 29 20 27 63 6c 6f 73 65 5f 74 69  rrent) 'close_ti
2a10: 64 64 6c 65 72 20 28 74 77 69 6b 69 3a 74 69 64  ddler (twiki:tid
2a20: 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64  dler-get-id tidd
2a30: 6c 65 72 29 29 29 20 22 2e 22 0a 09 09 20 20 20  ler))) "."...   
2a40: 20 20 20 20 28 73 3a 61 20 22 63 6c 6f 73 65 20      (s:a "close 
2a50: 6f 74 68 65 72 73 22 20 27 68 72 65 66 20 28 73  others" 'href (s
2a60: 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a  :link-to (twiki:
2a70: 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f  get-link-back-to
2a80: 2d 63 75 72 72 65 6e 74 29 20 27 63 6c 6f 73 65  -current) 'close
2a90: 5f 6f 74 68 65 72 5f 74 69 64 64 6c 65 72 73 20  _other_tiddlers 
2aa0: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67  (twiki:tiddler-g
2ab0: 65 74 2d 69 64 20 74 69 64 64 6c 65 72 29 29 29  et-id tiddler)))
2ac0: 20 22 2e 22 0a 09 09 20 20 20 20 20 20 20 28 69   "."...       (i
2ad0: 66 20 65 64 69 74 2d 61 6c 6c 6f 77 65 64 0a 09  f edit-allowed..
2ae0: 09 09 20 20 20 28 73 3a 61 20 22 65 64 69 74 22  ..   (s:a "edit"
2af0: 20 20 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d    'href (s:link-
2b00: 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69  to (twiki:get-li
2b10: 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65  nk-back-to-curre
2b20: 6e 74 29 20 27 65 64 69 74 5f 74 69 64 64 6c 65  nt) 'edit_tiddle
2b30: 72 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72  r (twiki:tiddler
2b40: 2d 67 65 74 2d 69 64 20 74 69 64 64 6c 65 72 29  -get-id tiddler)
2b50: 29 29 0a 09 09 09 20 20 20 27 28 29 29 29 29 29  ))....   '()))))
2b60: 0a 09 20 20 20 20 28 73 3a 70 20 28 74 77 69 6b  ..    (s:p (twik
2b70: 69 3a 64 61 74 2d 3e 68 74 6d 6c 20 64 61 74 20  i:dat->html dat 
2b80: 77 69 6b 69 29 29 29 29 29 0a 0a 28 64 65 66 69  wiki)))))..(defi
2b90: 6e 65 20 28 74 77 69 6b 69 3a 76 69 65 77 2d 74  ne (twiki:view-t
2ba0: 69 64 64 6c 65 72 20 64 62 20 20 74 6b 65 79 20  iddler db  tkey 
2bb0: 77 69 64 20 74 69 64 64 6c 65 72 20 77 69 6b 69  wid tiddler wiki
2bc0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 64 61 74 2d  ).  (let* ((dat-
2bd0: 69 64 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65  id (twiki:tiddle
2be0: 72 2d 67 65 74 2d 64 61 74 2d 69 64 20 74 69 64  r-get-dat-id tid
2bf0: 64 6c 65 72 29 29 0a 09 20 28 64 61 74 20 20 20  dler)).. (dat   
2c00: 20 28 74 77 69 6b 69 3a 67 65 74 2d 64 61 74 20   (twiki:get-dat 
2c10: 64 62 20 64 61 74 2d 69 64 29 29 0a 09 20 28 74  db dat-id)).. (t
2c20: 6e 75 6d 20 20 20 28 74 77 69 6b 69 3a 74 69 64  num   (twiki:tid
2c30: 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64  dler-get-id tidd
2c40: 6c 65 72 29 29 29 0a 20 20 20 20 3b 3b 20 28 73  ler))).    ;; (s
2c50: 3a 6c 6f 67 20 22 74 77 69 64 3a 20 22 20 64 61  :log "twid: " da
2c60: 74 2d 69 64 20 22 20 64 61 74 3a 20 22 20 64 61  t-id " dat: " da
2c70: 74 29 0a 20 20 20 20 28 74 77 69 6b 69 3a 76 69  t).    (twiki:vi
2c80: 65 77 20 64 61 74 20 20 74 6b 65 79 20 77 69 64  ew dat  tkey wid
2c90: 20 74 69 64 64 6c 65 72 20 77 69 6b 69 29 29 29   tiddler wiki)))
2ca0: 0a 0a 3b 3b 20 63 61 6c 6c 20 77 69 74 68 20 70  ..;; call with p
2cb0: 61 72 61 6d 20 3d 3e 20 61 63 74 69 6f 6e 2d 6e  aram => action-n
2cc0: 61 6d 65 2d 6b 65 79 20 65 2e 67 2e 20 73 61 76  ame-key e.g. sav
2cd0: 65 2d 62 57 46 70 62 67 5f 5f 2d 61 47 56 73 62  e-bWFpbg__-aGVsb
2ce0: 47 38 67 62 6e 56 79 63 32 55 5f 20 28 73 61 76  G8gbnVyc2U_ (sav
2cf0: 65 20 6d 61 69 6e 20 22 68 65 6c 6c 6f 20 6e 75  e main "hello nu
2d00: 72 73 65 22 29 0a 3b 3b 20 74 68 69 73 20 6f 6e  rse").;; this on
2d10: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2d20: 20 61 6e 20 65 64 69 74 20 66 6f 72 6d 20 69 73   an edit form is
2d30: 20 73 75 62 6d 69 74 74 65 64 20 28 69 2e 65 2e   submitted (i.e.
2d40: 20 50 4f 53 54 29 0a 28 64 65 66 69 6e 65 20 28   POST).(define (
2d50: 74 77 69 6b 69 3a 61 63 74 69 6f 6e 20 70 61 72  twiki:action par
2d60: 61 6d 73 29 0a 20 20 28 69 66 20 28 61 6e 64 20  ams).  (if (and 
2d70: 28 6c 69 73 74 3f 20 70 61 72 61 6d 73 29 0a 09  (list? params)..
2d80: 20 20 20 28 3e 20 28 6c 65 6e 67 74 68 20 70 61     (> (length pa
2d90: 72 61 6d 73 29 20 30 29 29 0a 20 20 20 20 20 20  rams) 0)).      
2da0: 28 6c 65 74 2a 20 28 28 63 6d 64 6c 6e 20 28 73  (let* ((cmdln (s
2db0: 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 63 61 72  tring-split (car
2dc0: 20 70 61 72 61 6d 73 29 20 22 2d 22 29 29 0a 09   params) "-"))..
2dd0: 20 20 20 20 20 28 63 6d 64 20 20 20 28 73 74 72       (cmd   (str
2de0: 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 63 61 72  ing->symbol (car
2df0: 20 63 6d 64 6c 6e 29 29 29 0a 09 20 20 20 20 20   cmdln)))..     
2e00: 28 74 6b 65 79 20 20 28 74 77 69 6b 69 3a 77 65  (tkey  (twiki:we
2e10: 62 36 34 64 65 63 20 28 63 61 64 64 72 20 63 6d  b64dec (caddr cm
2e20: 64 6c 6e 29 29 29 0a 09 20 20 20 20 20 28 77 69  dln)))..     (wi
2e30: 64 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d  d   (string->num
2e40: 62 65 72 20 28 63 61 64 72 20 63 6d 64 6c 6e 29  ber (cadr cmdln)
2e50: 29 29 0a 09 20 20 20 20 20 28 74 64 62 20 20 20  ))..     (tdb   
2e60: 28 74 77 69 6b 69 3a 6f 70 65 6e 2d 64 62 20 74  (twiki:open-db t
2e70: 6b 65 79 29 29 29 0a 09 28 73 3a 6c 6f 67 20 22  key)))..(s:log "
2e80: 63 6d 64 6c 6e 3a 20 22 20 63 6d 64 6c 6e 20 22  cmdln: " cmdln "
2e90: 20 63 6d 64 3a 20 22 20 63 6d 64 20 22 20 74 6b   cmd: " cmd " tk
2ea0: 65 79 3a 20 22 20 74 6b 65 79 20 22 20 77 69 64  ey: " tkey " wid
2eb0: 3a 20 22 20 77 69 64 29 0a 09 28 63 61 73 65 20  : " wid)..(case 
2ec0: 63 6d 64 0a 09 20 20 28 28 73 61 76 65 29 0a 09  cmd..  ((save)..
2ed0: 20 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 63     (twiki:save-c
2ee0: 75 72 72 2d 74 69 64 64 6c 65 72 20 74 64 62 20  urr-tiddler tdb 
2ef0: 77 69 64 29 29 0a 09 20 20 28 28 73 61 76 65 70  wid))..  ((savep
2f00: 69 63 29 0a 09 20 20 20 28 73 3a 6c 6f 67 20 22  ic)..   (s:log "
2f10: 74 77 69 6b 69 3a 61 63 74 69 6f 6e 20 67 6f 74  twiki:action got
2f20: 20 74 6f 20 73 61 76 65 70 69 63 22 29 0a 09 20   to savepic").. 
2f30: 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 70 69    (twiki:save-pi
2f40: 63 2d 66 72 6f 6d 2d 66 6f 72 6d 20 74 64 62 20  c-from-form tdb 
2f50: 77 69 64 29 29 0a 09 20 20 28 28 63 61 6e 63 65  wid))..  ((cance
2f60: 6c 29 20 3b 3b 20 64 65 70 72 65 63 61 74 65 64  l) ;; deprecated
2f70: 2e 20 55 73 65 20 61 20 6c 69 6e 6b 20 66 6f 72  . Use a link for
2f80: 20 74 68 69 73 20 28 69 2e 65 20 69 6e 20 74 68   this (i.e in th
2f90: 65 20 74 77 69 6b 69 3a 74 77 69 6b 69 20 70 72  e twiki:twiki pr
2fa0: 6f 63 0a 09 20 20 20 28 73 3a 64 65 6c 21 20 28  oc..   (s:del! (
2fb0: 63 6f 6e 63 20 22 43 55 52 52 45 4e 54 5f 54 57  conc "CURRENT_TW
2fc0: 49 44 4c 45 52 5f 55 4e 44 45 52 5f 45 44 49 54  IDLER_UNDER_EDIT
2fd0: 3a 22 20 77 69 64 29 29 0a 09 20 20 20 29 29 29  :" wid))..   )))
2fe0: 29 29 0a 0a 3b 3b 20 67 65 6e 65 72 61 74 65 20  ))..;; generate 
2ff0: 61 20 66 6f 72 6d 20 66 6f 72 20 65 64 69 74 69  a form for editi
3000: 6e 67 20 61 20 74 77 69 64 64 6c 65 72 20 74 6e  ng a twiddler tn
3010: 75 6d 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  um.(define (twik
3020: 69 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 20 64  i:edit-tiddler d
3030: 62 20 74 6b 65 79 20 77 69 64 20 74 6e 75 6d 29  b tkey wid tnum)
3040: 0a 20 20 28 73 3a 6c 6f 67 20 22 74 77 69 6b 69  .  (s:log "twiki
3050: 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 3a 20 74  :edit-tiddler: t
3060: 6b 65 79 3d 22 20 74 6b 65 79 20 22 20 77 69 64  key=" tkey " wid
3070: 3a 20 22 20 77 69 64 29 0a 20 20 28 6c 65 74 2a  : " wid).  (let*
3080: 20 28 28 65 6e 63 2d 6b 65 79 20 20 28 74 77 69   ((enc-key  (twi
3090: 6b 69 3a 77 65 62 36 34 65 6e 63 20 74 6b 65 79  ki:web64enc tkey
30a0: 29 29 0a 09 20 28 74 69 64 64 61 74 73 20 20 28  )).. (tiddats  (
30b0: 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65  twiki:get-tiddle
30c0: 72 73 2d 62 79 2d 6e 75 6d 20 64 62 20 77 69 64  rs-by-num db wid
30d0: 20 28 6c 69 73 74 20 74 6e 75 6d 29 29 29 29 0a   (list tnum)))).
30e0: 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74      (if (null? t
30f0: 69 64 64 61 74 73 29 0a 09 28 6c 65 74 2a 20 28  iddats)..(let* (
3100: 28 74 69 64 20 20 20 20 30 29 0a 09 20 20 20 20  (tid    0)..    
3110: 20 20 20 28 64 61 74 2d 69 64 20 30 29 29 0a 09     (dat-id 0))..
3120: 20 20 28 73 3a 73 65 74 21 20 22 74 77 69 6b 69    (s:set! "twiki
3130: 5f 74 69 74 6c 65 22 20 22 22 29 0a 09 20 20 28  _title" "")..  (
3140: 73 3a 73 65 74 21 20 22 74 77 69 6b 69 5f 62 6f  s:set! "twiki_bo
3150: 64 79 22 20 20 22 22 29 29 0a 09 28 6c 65 74 2a  dy"  ""))..(let*
3160: 20 28 28 74 69 64 20 20 20 20 28 63 61 72 20 74   ((tid    (car t
3170: 69 64 64 61 74 73 29 29 0a 09 20 20 20 20 20 20  iddats))..      
3180: 20 28 64 61 74 2d 69 64 20 28 74 77 69 6b 69 3a   (dat-id (twiki:
3190: 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61 74 2d  tiddler-get-dat-
31a0: 69 64 20 74 69 64 29 29 29 0a 09 20 20 3b 3b 20  id tid)))..  ;; 
31b0: 28 73 3a 6c 6f 67 20 22 74 69 64 3a 20 22 20 74  (s:log "tid: " t
31c0: 69 64 20 22 20 64 61 74 2d 69 64 3a 20 22 20 64  id " dat-id: " d
31d0: 61 74 2d 69 64 29 0a 09 20 20 28 73 3a 73 65 74  at-id)..  (s:set
31e0: 21 20 22 74 77 69 6b 69 5f 74 69 74 6c 65 22 20  ! "twiki_title" 
31f0: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67  (twiki:tiddler-g
3200: 65 74 2d 6e 61 6d 65 20 74 69 64 29 29 0a 09 20  et-name tid)).. 
3210: 20 28 73 3a 73 65 74 21 20 22 74 77 69 6b 69 5f   (s:set! "twiki_
3220: 62 6f 64 79 22 20 20 28 74 77 69 6b 69 3a 67 65  body"  (twiki:ge
3230: 74 2d 64 61 74 20 64 62 20 64 61 74 2d 69 64 29  t-dat db dat-id)
3240: 29 29 29 0a 20 20 20 20 28 73 3a 66 6f 72 6d 20  ))).    (s:form 
3250: 27 61 63 74 69 6f 6e 20 28 73 3a 6c 69 6e 6b 2d  'action (s:link-
3260: 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69  to (twiki:get-li
3270: 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65  nk-back-to-curre
3280: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 20 27 61  nt)....       'a
3290: 63 74 69 6f 6e 20 28 63 6f 6e 63 20 22 74 77 69  ction (conc "twi
32a0: 6b 69 2e 73 61 76 65 2d 22 20 28 6e 75 6d 62 65  ki.save-" (numbe
32b0: 72 2d 3e 73 74 72 69 6e 67 20 77 69 64 29 20 22  r->string wid) "
32c0: 2d 22 20 65 6e 63 2d 6b 65 79 29 29 0a 09 20 20  -" enc-key))..  
32d0: 20 20 27 6d 65 74 68 6f 64 20 22 70 6f 73 74 22    'method "post"
32e0: 20 3b 3b 20 27 74 77 69 6b 69 6e 61 6d 65 20 74   ;; 'twikiname t
32f0: 6b 65 79 20 3b 3b 20 64 6f 6e 65 2c 20 63 61 6e  key ;; done, can
3300: 63 65 6c 2c 20 64 65 6c 65 74 65 0a 09 20 20 20  cel, delete..   
3310: 20 28 73 3a 69 6e 70 75 74 20 27 74 79 70 65 20   (s:input 'type 
3320: 22 73 75 62 6d 69 74 22 20 20 20 27 6e 61 6d 65  "submit"   'name
3330: 20 22 66 6f 72 6d 2d 6e 61 6d 65 22 20 27 76 61   "form-name" 'va
3340: 6c 75 65 20 22 73 61 76 65 22 20 27 74 77 69 6b  lue "save" 'twik
3350: 69 6e 61 6d 65 20 74 6b 65 79 29 0a 09 20 20 20  iname tkey)..   
3360: 20 3b 3b 20 28 73 3a 61 20 22 64 6f 6e 65 22 20   ;; (s:a "done" 
3370: 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f  'href (s:link-to
3380: 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b   (twiki:get-link
3390: 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74  -back-to-current
33a0: 29 20 27 73 61 76 65 5f 74 6d 65 6e 75 20 74 6e  ) 'save_tmenu tn
33b0: 75 6d 29 29 0a 09 20 20 20 20 28 73 3a 61 20 22  um))..    (s:a "
33c0: 63 61 6e 63 65 6c 22 20 27 68 72 65 66 20 28 73  cancel" 'href (s
33d0: 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a  :link-to (twiki:
33e0: 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f  get-link-back-to
33f0: 2d 63 75 72 72 65 6e 74 29 20 27 63 61 6e 63 65  -current) 'cance
3400: 6c 5f 74 65 64 69 74 20 74 6e 75 6d 29 29 20 22  l_tedit tnum)) "
3410: 2e 22 0a 09 20 20 20 20 28 73 3a 61 20 22 64 65  ."..    (s:a "de
3420: 6c 65 74 65 22 20 27 68 72 65 66 20 28 73 3a 6c  lete" 'href (s:l
3430: 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65  ink-to (twiki:ge
3440: 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63  t-link-back-to-c
3450: 75 72 72 65 6e 74 29 20 27 64 65 6c 65 74 65 5f  urrent) 'delete_
3460: 74 69 64 64 6c 65 72 20 74 6e 75 6d 29 29 28 73  tiddler tnum))(s
3470: 3a 62 72 29 0a 09 20 20 20 20 28 73 3a 69 6e 70  :br)..    (s:inp
3480: 75 74 2d 70 72 65 73 65 72 76 65 20 27 74 79 70  ut-preserve 'typ
3490: 65 20 22 74 65 78 74 22 20 27 6e 61 6d 65 20 22  e "text" 'name "
34a0: 74 77 69 6b 69 5f 74 69 74 6c 65 22 20 27 73 69  twiki_title" 'si
34b0: 7a 65 20 22 35 38 22 20 27 6d 61 78 6c 65 6e 67  ze "58" 'maxleng
34c0: 74 68 20 22 31 35 30 22 29 0a 09 20 20 20 20 28  th "150")..    (
34d0: 73 3a 74 65 78 74 61 72 65 61 2d 70 72 65 73 65  s:textarea-prese
34e0: 72 76 65 20 27 74 79 70 65 20 22 74 65 78 74 61  rve 'type "texta
34f0: 72 65 61 22 20 27 6e 61 6d 65 20 22 74 77 69 6b  rea" 'name "twik
3500: 69 5f 62 6f 64 79 22 20 27 72 6f 77 73 20 22 31  i_body" 'rows "1
3510: 30 22 20 27 63 6f 6c 73 20 22 36 35 22 29 0a 09  0" 'cols "65")..
3520: 20 20 20 20 28 73 3a 70 20 22 54 61 67 73 22 20      (s:p "Tags" 
3530: 28 73 3a 69 6e 70 75 74 2d 70 72 65 73 65 72 76  (s:input-preserv
3540: 65 20 27 74 79 70 65 20 22 74 65 78 74 22 20 27  e 'type "text" '
3550: 6e 61 6d 65 20 22 74 77 69 6b 69 5f 74 61 67 73  name "twiki_tags
3560: 22 20 27 73 69 7a 65 20 22 35 35 22 20 27 6d 61  " 'size "55" 'ma
3570: 78 6c 65 6e 67 74 68 20 22 31 35 30 22 29 29 29  xlength "150")))
3580: 29 29 0a 0a 3b 3b 20 73 61 76 65 20 61 20 74 69  ))..;; save a ti
3590: 64 64 6c 65 72 20 74 6f 20 74 68 65 20 64 62 20  ddler to the db 
35a0: 66 6f 72 20 74 68 65 20 74 77 69 6b 69 20 74 77  for the twiki tw
35b0: 69 6b 2c 20 67 65 74 74 69 6e 67 20 64 61 74 61  ik, getting data
35c0: 20 66 72 6f 6d 20 74 68 65 20 49 4e 50 55 54 0a   from the INPUT.
35d0: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 73  (define (twiki:s
35e0: 61 76 65 2d 63 75 72 72 2d 74 69 64 64 6c 65 72  ave-curr-tiddler
35f0: 20 74 64 62 20 77 69 64 29 0a 20 20 28 66 6f 72   tdb wid).  (for
3600: 6d 64 61 74 3a 70 72 69 6e 74 61 6c 6c 20 28 73  mdat:printall (s
3610: 64 61 74 2d 67 65 74 2d 66 6f 72 6d 64 61 74 20  dat-get-formdat 
3620: 73 3a 73 65 73 73 69 6f 6e 29 20 73 3a 6c 6f 67  s:session) s:log
3630: 29 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61 64  ).  (let* ((head
3640: 69 6e 67 20 28 73 3a 67 65 74 2d 69 6e 70 75 74  ing (s:get-input
3650: 20 27 74 77 69 6b 69 5f 74 69 74 6c 65 29 29 0a   'twiki_title)).
3660: 09 20 28 62 6f 64 79 20 20 20 20 28 73 3a 67 65  . (body    (s:ge
3670: 74 2d 69 6e 70 75 74 20 27 74 77 69 6b 69 5f 62  t-input 'twiki_b
3680: 6f 64 79 29 29 0a 09 20 28 74 61 67 73 20 20 20  ody)).. (tags   
3690: 20 28 73 3a 67 65 74 2d 69 6e 70 75 74 20 27 74   (s:get-input 't
36a0: 77 69 6b 69 5f 74 61 67 73 29 29 0a 09 20 28 75  wiki_tags)).. (u
36b0: 69 64 20 20 20 20 20 28 74 77 69 6b 69 3a 67 65  id     (twiki:ge
36c0: 74 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 28  t-id))).    ;; (
36d0: 73 3a 6c 6f 67 20 22 74 77 69 6b 69 3a 73 61 76  s:log "twiki:sav
36e0: 65 2d 63 75 72 72 2d 74 69 64 64 6c 65 72 20 68  e-curr-tiddler h
36f0: 65 61 64 69 6e 67 3a 20 22 20 68 65 61 64 69 6e  eading: " headin
3700: 67 20 22 20 62 6f 64 79 3a 20 22 20 62 6f 64 79  g " body: " body
3710: 20 22 20 74 61 67 73 3a 20 22 20 74 61 67 73 29   " tags: " tags)
3720: 0a 20 20 20 20 28 73 3a 73 65 74 21 20 27 74 77  .    (s:set! 'tw
3730: 69 6b 69 5f 74 69 74 6c 65 20 68 65 61 64 69 6e  iki_title headin
3740: 67 29 0a 20 20 20 20 28 69 66 20 62 6f 64 79 0a  g).    (if body.
3750: 09 28 62 65 67 69 6e 0a 09 20 20 28 73 65 74 21  .(begin..  (set!
3760: 20 62 6f 64 79 20 28 73 74 72 69 6e 67 2d 63 68   body (string-ch
3770: 6f 6d 70 20 62 6f 64 79 29 29 0a 09 20 20 28 73  omp body))..  (s
3780: 3a 73 65 74 21 20 27 74 77 69 6b 69 5f 62 6f 64  :set! 'twiki_bod
3790: 79 20 20 62 6f 64 79 29 29 29 0a 20 20 20 20 28  y  body))).    (
37a0: 73 3a 73 65 74 21 20 27 74 77 69 6b 69 5f 74 61  s:set! 'twiki_ta
37b0: 67 73 20 20 74 61 67 73 29 0a 20 20 20 20 28 73  gs  tags).    (s
37c0: 3a 64 65 6c 21 20 28 63 6f 6e 63 20 22 43 55 52  :del! (conc "CUR
37d0: 52 45 4e 54 5f 54 57 49 44 4c 45 52 5f 55 4e 44  RENT_TWIDLER_UND
37e0: 45 52 5f 45 44 49 54 3a 22 20 77 69 64 29 29 0a  ER_EDIT:" wid)).
37f0: 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 28      (let ((res (
3800: 74 77 69 6b 69 3a 73 61 76 65 2d 74 69 64 64 6c  twiki:save-tiddl
3810: 65 72 20 74 64 62 20 68 65 61 64 69 6e 67 20 62  er tdb heading b
3820: 6f 64 79 20 74 61 67 73 20 77 69 64 20 75 69 64  ody tags wid uid
3830: 29 29 29 0a 20 20 20 20 20 20 3b 3b 20 4e 6f 77  ))).      ;; Now
3840: 2c 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 74  , replace this t
3850: 77 69 64 64 6c 65 72 20 6e 75 6d 62 65 72 20 69  widdler number i
3860: 6e 20 74 68 65 20 76 69 65 77 20 6c 69 73 74 20  n the view list 
3870: 77 69 74 68 20 0a 20 20 20 20 20 20 3b 3b 20 74  with .      ;; t
3880: 68 65 20 6e 65 77 20 6e 75 6d 62 65 72 20 66 72  he new number fr
3890: 6f 6d 20 74 68 65 20 64 62 0a 20 20 20 20 20 20  om the db.      
38a0: 28 74 77 69 6b 69 3a 6e 6f 72 6d 61 6c 69 7a 65  (twiki:normalize
38b0: 2d 63 75 72 72 65 6e 74 2d 74 77 69 64 64 6c 65  -current-twiddle
38c0: 72 73 20 74 64 62 20 77 69 64 29 0a 20 20 20 20  rs tdb wid).    
38d0: 20 20 28 73 3a 64 65 6c 21 20 27 74 77 69 6b 69    (s:del! 'twiki
38e0: 5f 74 69 74 6c 65 29 0a 20 20 20 20 20 20 28 73  _title).      (s
38f0: 3a 64 65 6c 21 20 27 74 77 69 6b 69 5f 62 6f 64  :del! 'twiki_bod
3900: 79 29 0a 20 20 20 20 20 20 28 73 3a 64 65 6c 21  y).      (s:del!
3910: 20 27 74 77 69 6b 69 5f 74 61 67 73 29 0a 20 20   'twiki_tags).  
3920: 20 20 20 20 72 65 73 29 0a 20 20 20 20 29 29 0a      res).    )).
3930: 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a  .(define (twiki:
3940: 6e 6f 72 6d 61 6c 69 7a 65 2d 63 75 72 72 65 6e  normalize-curren
3950: 74 2d 74 77 69 64 64 6c 65 72 73 20 74 64 62 20  t-twiddlers tdb 
3960: 77 69 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 63  wid).  (let* ((c
3970: 76 61 72 20 20 20 20 20 20 28 63 6f 6e 63 20 22  var      (conc "
3980: 43 55 52 52 45 4e 54 5f 54 57 49 44 4c 45 52 53  CURRENT_TWIDLERS
3990: 3a 22 20 77 69 64 29 29 0a 09 20 28 63 75 72 72  :" wid)).. (curr
39a0: 2d 73 6c 73 74 20 28 73 3a 67 65 74 20 63 76 61  -slst (s:get cva
39b0: 72 29 29 0a 09 20 28 63 75 72 72 2d 6c 73 74 20  r)).. (curr-lst 
39c0: 20 28 6d 61 70 20 73 74 72 69 6e 67 2d 3e 6e 75   (map string->nu
39d0: 6d 62 65 72 20 28 73 74 72 69 6e 67 2d 73 70 6c  mber (string-spl
39e0: 69 74 20 63 75 72 72 2d 73 6c 73 74 20 22 2c 22  it curr-slst ","
39f0: 29 29 29 0a 09 20 28 74 64 6c 72 73 20 20 20 20  ))).. (tdlrs    
3a00: 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64   (twiki:get-tidd
3a10: 6c 65 72 73 2d 62 79 2d 6e 75 6d 20 74 64 62 20  lers-by-num tdb 
3a20: 77 69 64 20 63 75 72 72 2d 6c 73 74 29 29 0a 09  wid curr-lst))..
3a30: 20 28 6e 61 6d 65 73 20 20 20 20 20 28 72 65 6d   (names     (rem
3a40: 6f 76 65 20 28 6c 61 6d 62 64 61 20 28 74 29 28  ove (lambda (t)(
3a50: 73 74 72 69 6e 67 3d 3f 20 22 4d 61 69 6e 4d 65  string=? "MainMe
3a60: 6e 75 22 20 74 29 29 0a 09 09 09 20 20 20 20 28  nu" t))....    (
3a70: 6d 61 70 20 74 77 69 6b 69 3a 74 69 64 64 6c 65  map twiki:tiddle
3a80: 72 2d 67 65 74 2d 6e 61 6d 65 20 74 64 6c 72 73  r-get-name tdlrs
3a90: 29 29 29 0a 09 20 28 6e 65 77 6e 75 6d 73 20 20  ))).. (newnums  
3aa0: 20 28 6d 61 70 20 74 77 69 6b 69 3a 74 69 64 64   (map twiki:tidd
3ab0: 6c 65 72 2d 67 65 74 2d 69 64 20 0a 09 09 09 20  ler-get-id .... 
3ac0: 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 74 6e  (map (lambda (tn
3ad0: 29 0a 09 09 09 09 28 74 77 69 6b 69 3a 67 65 74  ).....(twiki:get
3ae0: 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d 65  -tiddler-by-name
3af0: 20 74 64 62 20 77 69 64 20 74 6e 29 29 0a 09 09   tdb wid tn))...
3b00: 09 20 20 20 20 20 20 6e 61 6d 65 73 29 29 29 29  .      names))))
3b10: 0a 20 20 20 20 28 73 3a 73 65 74 21 20 63 76 61  .    (s:set! cva
3b20: 72 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73  r (string-inters
3b30: 70 65 72 73 65 20 28 6d 61 70 20 6e 75 6d 62 65  perse (map numbe
3b40: 72 2d 3e 73 74 72 69 6e 67 20 6e 65 77 6e 75 6d  r->string newnum
3b50: 73 29 0a 09 09 09 09 20 20 20 20 20 22 2c 22 29  s).....     ",")
3b60: 29 29 29 0a 20 20 20 20 0a 3b 3b 20 67 65 6e 65  ))).    .;; gene
3b70: 72 69 63 20 73 61 76 65 20 74 69 64 64 6c 65 72  ric save tiddler
3b80: 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a  .(define (twiki:
3b90: 73 61 76 65 2d 74 69 64 64 6c 65 72 20 74 64 62  save-tiddler tdb
3ba0: 20 68 65 61 64 69 6e 67 20 62 6f 64 79 20 74 61   heading body ta
3bb0: 67 73 20 77 69 64 20 75 69 64 29 0a 20 20 20 20  gs wid uid).    
3bc0: 28 69 66 20 28 6d 69 73 63 3a 6e 6f 6e 2d 7a 65  (if (misc:non-ze
3bd0: 72 6f 2d 73 74 72 69 6e 67 20 68 65 61 64 69 6e  ro-string headin
3be0: 67 29 0a 09 28 6c 65 74 2a 20 28 28 70 72 65 76  g)..(let* ((prev
3bf0: 2d 74 69 64 20 28 74 77 69 6b 69 3a 67 65 74 2d  -tid (twiki:get-
3c00: 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d 65 20  tiddler-by-name 
3c10: 74 64 62 20 77 69 64 20 68 65 61 64 69 6e 67 29  tdb wid heading)
3c20: 29 0a 09 20 20 20 20 20 20 20 28 70 72 65 76 2d  )..       (prev-
3c30: 64 61 74 2d 69 64 20 28 69 66 20 70 72 65 76 2d  dat-id (if prev-
3c40: 74 69 64 20 0a 09 09 09 09 28 74 77 69 6b 69 3a  tid .....(twiki:
3c50: 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61 74 2d  tiddler-get-dat-
3c60: 69 64 20 70 72 65 76 2d 74 69 64 29 0a 09 09 09  id prev-tid)....
3c70: 09 2d 31 29 29 0a 09 20 20 20 20 20 20 20 28 64  .-1))..       (d
3c80: 61 74 2d 69 64 20 28 74 77 69 6b 69 3a 73 61 76  at-id (twiki:sav
3c90: 65 2d 64 61 74 20 74 64 62 20 62 6f 64 79 20 30  e-dat tdb body 0
3ca0: 29 29 29 20 3b 3b 20 30 3d 74 65 78 74 0a 09 20  ))) ;; 0=text.. 
3cb0: 20 3b 3b 20 28 73 3a 6c 6f 67 20 22 74 77 69 6b   ;; (s:log "twik
3cc0: 69 3a 73 61 76 65 2d 74 69 64 64 6c 65 72 20 64  i:save-tiddler d
3cd0: 61 74 2d 69 64 3a 20 22 20 64 61 74 2d 69 64 20  at-id: " dat-id 
3ce0: 22 20 62 6f 64 79 3a 20 22 20 62 6f 64 79 29 0a  " body: " body).
3cf0: 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 70  .  (if (equal? p
3d00: 72 65 76 2d 64 61 74 2d 69 64 20 64 61 74 2d 69  rev-dat-id dat-i
3d10: 64 29 20 3b 3b 20 6e 6f 20 6e 65 65 64 20 74 6f  d) ;; no need to
3d20: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   insert a new re
3d30: 63 6f 72 64 20 69 66 20 74 68 65 20 64 61 74 20  cord if the dat 
3d40: 64 69 64 6e 27 74 20 63 68 61 6e 67 65 0a 09 20  didn't change.. 
3d50: 20 20 20 20 20 23 74 0a 09 20 20 20 20 20 20 28       #t..      (
3d60: 64 62 69 3a 65 78 65 63 20 74 64 62 20 0a 09 09  dbi:exec tdb ...
3d70: 09 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 69  ."INSERT INTO ti
3d80: 64 64 6c 65 72 73 20 28 77 69 6b 69 5f 69 64 2c  ddlers (wiki_id,
3d90: 6e 61 6d 65 2c 64 61 74 5f 69 64 2c 63 72 65 61  name,dat_id,crea
3da0: 74 65 64 5f 6f 6e 2c 6f 77 6e 65 72 5f 69 64 29  ted_on,owner_id)
3db0: 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
3dc0: 3f 29 3b 22 0a 09 09 09 77 69 64 20 68 65 61 64  ?);"....wid head
3dd0: 69 6e 67 20 64 61 74 2d 69 64 20 28 63 75 72 72  ing dat-id (curr
3de0: 65 6e 74 2d 73 65 63 6f 6e 64 73 29 20 75 69 64  ent-seconds) uid
3df0: 29 29 0a 09 20 20 23 74 29 20 3b 3b 20 73 75 63  ))..  #t) ;; suc
3e00: 63 65 73 73 0a 09 23 66 29 29 20 20 3b 3b 20 6e  cess..#f))  ;; n
3e10: 6f 6e 2d 73 75 63 63 65 73 73 0a 0a 3b 3b 20 74  on-success..;; t
3e20: 65 78 74 3d 30 2c 20 6a 70 67 3d 31 2c 20 70 6e  ext=0, jpg=1, pn
3e30: 67 3d 32 0a 28 64 65 66 69 6e 65 20 28 74 77 69  g=2.(define (twi
3e40: 6b 69 3a 73 61 76 65 2d 64 61 74 20 64 62 20 64  ki:save-dat db d
3e50: 61 74 20 74 79 70 65 29 0a 20 20 28 6c 65 74 2a  at type).  (let*
3e60: 20 28 28 6d 64 35 73 75 6d 20 28 6d 64 35 2d 64   ((md5sum (md5-d
3e70: 69 67 65 73 74 20 64 61 74 29 29 0a 09 20 28 64  igest dat)).. (d
3e80: 61 74 69 64 20 20 28 74 77 69 6b 69 3a 64 61 74  atid  (twiki:dat
3e90: 2d 65 78 69 73 74 73 3f 20 64 62 20 6d 64 35 73  -exists? db md5s
3ea0: 75 6d 20 74 79 70 65 29 29 0a 09 20 28 64 61 74  um type)).. (dat
3eb0: 62 6c 6f 62 20 28 69 66 20 28 73 74 72 69 6e 67  blob (if (string
3ec0: 3f 20 64 61 74 29 0a 09 09 20 20 20 20 20 20 28  ? dat)...      (
3ed0: 73 74 72 69 6e 67 2d 3e 62 6c 6f 62 20 64 61 74  string->blob dat
3ee0: 29 0a 09 09 20 20 20 20 20 20 64 61 74 29 29 29  )...      dat)))
3ef0: 0a 20 20 20 20 28 69 66 20 64 61 74 69 64 0a 09  .    (if datid..
3f00: 64 61 74 69 64 0a 09 28 62 65 67 69 6e 0a 09 20  datid..(begin.. 
3f10: 20 28 63 61 73 65 20 74 79 70 65 0a 09 20 20 20   (case type..   
3f20: 20 28 28 30 29 20 20 20 28 64 62 69 3a 65 78 65   ((0)   (dbi:exe
3f30: 63 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54  c db "INSERT INT
3f40: 4f 20 64 61 74 73 20 28 6d 64 35 73 75 6d 2c 64  O dats (md5sum,d
3f50: 61 74 2c 74 79 70 65 29 20 56 41 4c 55 45 53 28  at,type) VALUES(
3f60: 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73 75 6d 20  ?,?,?);" md5sum 
3f70: 64 61 74 62 6c 6f 62 20 30 29 29 0a 09 20 20 20  datblob 0))..   
3f80: 20 28 28 31 29 20 20 20 28 64 62 69 3a 65 78 65   ((1)   (dbi:exe
3f90: 63 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54  c db "INSERT INT
3fa0: 4f 20 64 61 74 73 20 28 6d 64 35 73 75 6d 2c 64  O dats (md5sum,d
3fb0: 61 74 2c 74 79 70 65 29 20 56 41 4c 55 45 53 28  at,type) VALUES(
3fc0: 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73 75 6d 20  ?,?,?);" md5sum 
3fd0: 64 61 74 62 6c 6f 62 20 31 29 29 0a 09 20 20 20  datblob 1))..   
3fe0: 20 28 65 6c 73 65 20 20 28 64 62 69 3a 65 78 65   (else  (dbi:exe
3ff0: 63 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54  c db "INSERT INT
4000: 4f 20 64 61 74 73 20 28 6d 64 35 73 75 6d 2c 64  O dats (md5sum,d
4010: 61 74 2c 74 79 70 65 29 20 56 41 4c 55 45 53 28  at,type) VALUES(
4020: 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73 75 6d 20  ?,?,?);" md5sum 
4030: 64 61 74 62 6c 6f 62 20 74 79 70 65 29 29 29 0a  datblob type))).
4040: 09 20 20 28 74 77 69 6b 69 3a 64 61 74 2d 65 78  .  (twiki:dat-ex
4050: 69 73 74 73 3f 20 64 62 20 6d 64 35 73 75 6d 20  ists? db md5sum 
4060: 74 79 70 65 29 29 29 29 29 0a 20 20 20 20 20 20  type))))).      
4070: 20 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69   .(define (twiki
4080: 3a 64 61 74 2d 65 78 69 73 74 73 3f 20 64 62 20  :dat-exists? db 
4090: 6d 64 35 73 75 6d 20 74 79 70 65 29 0a 20 20 28  md5sum type).  (
40a0: 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 20 22  dbi:get-one db "
40b0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 64  SELECT id FROM d
40c0: 61 74 73 20 57 48 45 52 45 20 6d 64 35 73 75 6d  ats WHERE md5sum
40d0: 3d 3f 20 41 4e 44 20 74 79 70 65 3d 3f 3b 22 20  =? AND type=?;" 
40e0: 6d 64 35 73 75 6d 20 74 79 70 65 29 29 0a 0a 28  md5sum type))..(
40f0: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65  define (twiki:ge
4100: 74 2d 64 61 74 20 64 62 20 69 64 29 0a 20 20 28  t-dat db id).  (
4110: 69 66 20 28 61 6e 64 20 69 64 20 28 6e 75 6d 62  if (and id (numb
4120: 65 72 3f 20 69 64 29 29 0a 20 20 20 20 20 20 28  er? id)).      (
4130: 69 66 20 28 3c 20 69 64 20 30 29 0a 09 20 20 22  if (< id 0)..  "
4140: 22 0a 09 20 20 28 6c 65 74 20 28 28 72 65 73 20  "..  (let ((res 
4150: 28 64 62 69 3a 67 65 74 2d 6f 6e 65 2d 72 6f 77  (dbi:get-one-row
4160: 20 64 62 20 22 53 45 4c 45 43 54 20 64 61 74 2c   db "SELECT dat,
4170: 74 79 70 65 20 46 52 4f 4d 20 64 61 74 73 20 57  type FROM dats W
4180: 48 45 52 45 20 69 64 3d 3f 3b 22 20 69 64 29 29  HERE id=?;" id))
4190: 29 0a 09 20 20 20 20 28 69 66 20 72 65 73 0a 09  )..    (if res..
41a0: 09 28 63 61 73 65 20 28 76 65 63 74 6f 72 2d 72  .(case (vector-r
41b0: 65 66 20 72 65 73 20 31 29 0a 09 09 20 20 28 28  ef res 1)...  ((
41c0: 30 29 28 62 6c 6f 62 2d 3e 73 74 72 69 6e 67 20  0)(blob->string 
41d0: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 73 20  (vector-ref res 
41e0: 30 29 29 29 0a 09 09 20 20 28 65 6c 73 65 20 28  0)))...  (else (
41f0: 76 65 63 74 6f 72 2d 72 65 66 20 72 65 73 20 30  vector-ref res 0
4200: 29 29 29 0a 09 09 23 66 29 29 29 0a 20 20 20 20  )))...#f))).    
4210: 20 20 23 66 29 29 0a 0a 28 64 65 66 69 6e 65 20    #f))..(define 
4220: 28 74 77 69 6b 69 3a 6d 61 69 6e 74 5f 61 72 65  (twiki:maint_are
4230: 61 20 74 64 62 20 77 69 64 20 74 6b 65 79 20 77  a tdb wid tkey w
4240: 69 6b 69 29 0a 20 20 28 6c 65 74 20 28 28 6d 61  iki).  (let ((ma
4250: 69 6e 74 20 28 73 3a 67 65 74 2d 70 61 72 61 6d  int (s:get-param
4260: 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74 29 29 0a   'twiki_maint)).
4270: 09 28 77 72 69 74 65 2d 70 65 72 6d 20 28 6d 65  .(write-perm (me
4280: 6d 62 65 72 20 27 77 20 28 74 77 69 6b 69 3a 77  mber 'w (twiki:w
4290: 69 6b 69 2d 67 65 74 2d 70 65 72 6d 73 20 77 69  iki-get-perms wi
42a0: 6b 69 29 29 29 29 0a 20 20 20 20 28 73 3a 64 69  ki)))).    (s:di
42b0: 76 20 27 63 6c 61 73 73 20 22 74 77 69 6b 69 2d  v 'class "twiki-
42c0: 6d 65 6e 75 2d 69 6e 74 65 72 6e 61 6c 22 0a 20  menu-internal". 
42d0: 20 20 20 20 28 69 66 20 77 72 69 74 65 2d 70 65      (if write-pe
42e0: 72 6d 0a 09 20 28 6c 69 73 74 20 28 73 3a 61 20  rm.. (list (s:a 
42f0: 22 4f 72 70 68 61 6e 73 22 20 20 27 68 72 65 66  "Orphans"  'href
4300: 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69   (s:link-to (twi
4310: 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b  ki:get-link-back
4320: 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27 74 77  -to-current) 'tw
4330: 69 6b 69 5f 6d 61 69 6e 74 20 31 29 29 28 73 3a  iki_maint 1))(s:
4340: 62 72 29 0a 09 20 20 20 20 20 20 20 28 73 3a 61  br)..       (s:a
4350: 20 22 50 69 63 73 22 20 20 20 20 20 27 68 72 65   "Pics"     'hre
4360: 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77  f (s:link-to (tw
4370: 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63  iki:get-link-bac
4380: 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27 74  k-to-current) 't
4390: 77 69 6b 69 5f 6d 61 69 6e 74 20 32 29 29 28 73  wiki_maint 2))(s
43a0: 3a 62 72 29 0a 09 20 20 20 20 20 20 20 28 73 3a  :br)..       (s:
43b0: 61 20 22 48 65 6c 70 22 20 20 20 20 20 27 68 72  a "Help"     'hr
43c0: 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74  ef (s:link-to (t
43d0: 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61  wiki:get-link-ba
43e0: 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27  ck-to-current) '
43f0: 74 77 69 6b 69 5f 6d 61 69 6e 74 20 34 29 29 28  twiki_maint 4))(
4400: 73 3a 62 72 29 29 0a 09 20 27 28 29 29 0a 20 20  s:br)).. '()).  
4410: 20 20 20 28 73 3a 61 20 22 53 65 61 72 63 68 22     (s:a "Search"
4420: 20 20 20 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b     'href (s:link
4430: 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c  -to (twiki:get-l
4440: 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72  ink-back-to-curr
4450: 65 6e 74 29 20 27 74 77 69 6b 69 5f 6d 61 69 6e  ent) 'twiki_main
4460: 74 20 33 29 29 28 73 3a 62 72 29 0a 20 20 20 20  t 3))(s:br).    
4470: 20 28 63 61 73 65 20 6d 61 69 6e 74 0a 20 20 20   (case maint.   
4480: 20 20 20 20 28 28 31 29 0a 09 28 74 77 69 6b 69      ((1)..(twiki
4490: 3a 6c 69 73 74 2d 6f 72 70 68 61 6e 73 20 74 64  :list-orphans td
44a0: 62 29 29 0a 20 20 20 20 20 20 20 28 65 6c 73 65  b)).       (else
44b0: 0a 09 20 27 28 29 29 29 29 29 29 0a 0a 3b 3b 3d  .. '())))))..;;=
44c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4500: 3d 3d 3d 3d 3d 0a 3b 3b 20 4f 72 70 68 61 6e 73  =====.;; Orphans
4510: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
4520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e  =========.(defin
4560: 65 20 28 74 77 69 6b 69 3a 6d 61 6b 65 2d 74 69  e (twiki:make-ti
4570: 64 64 6c 65 72 2d 6c 69 73 74 20 74 64 6c 72 73  ddler-list tdlrs
4580: 20 2e 20 74 6e 75 6d 73 29 0a 20 20 28 63 6f 6e   . tnums).  (con
4590: 63 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73  c (string-inters
45a0: 70 65 72 73 65 20 0a 09 20 28 6d 61 70 20 63 6f  perse .. (map co
45b0: 6e 63 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69  nc (delete-dupli
45c0: 63 61 74 65 73 0a 09 09 20 20 20 20 28 61 70 70  cates...    (app
45d0: 65 6e 64 20 28 6d 61 70 20 74 77 69 6b 69 3a 74  end (map twiki:t
45e0: 69 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 64  iddler-get-id td
45f0: 6c 72 73 29 20 74 6e 75 6d 73 29 29 29 0a 09 20  lrs) tnums))).. 
4600: 22 2c 22 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ",")))..(define 
4610: 28 74 77 69 6b 69 3a 67 65 74 2d 6f 72 70 68 61  (twiki:get-orpha
4620: 6e 73 20 74 64 62 29 0a 20 20 27 28 29 29 0a 0a  ns tdb).  '())..
4630: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 6c  (define (twiki:l
4640: 69 73 74 2d 6f 72 70 68 61 6e 73 20 74 64 62 29  ist-orphans tdb)
4650: 0a 20 20 27 28 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  .  '())..;;=====
4660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46a0: 3d 0a 3b 3b 20 50 69 63 74 75 72 65 73 0a 3b 3b  =.;; Pictures.;;
46b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46f0: 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e 65 20 28  ======.(define (
4700: 74 77 69 6b 69 3a 70 69 63 5f 6d 67 6d 74 20 74  twiki:pic_mgmt t
4710: 64 62 20 77 69 64 20 74 6b 65 79 29 0a 20 20 28  db wid tkey).  (
4720: 73 3a 64 69 76 20 0a 20 20 20 28 73 3a 61 20 22  s:div .   (s:a "
4730: 41 64 64 20 70 69 63 22 20 27 68 72 65 66 20 28  Add pic" 'href (
4740: 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69  s:link-to (twiki
4750: 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74  :get-link-back-t
4760: 6f 2d 63 75 72 72 65 6e 74 29 20 27 74 77 69 6b  o-current) 'twik
4770: 69 5f 6d 61 69 6e 74 20 32 20 27 74 77 69 6b 69  i_maint 2 'twiki
4780: 5f 6d 61 69 6e 74 5f 61 64 64 5f 70 69 63 73 20  _maint_add_pics 
4790: 31 29 29 28 73 3a 62 72 29 0a 20 20 20 28 69 66  1))(s:br).   (if
47a0: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 74   (s:get-param "t
47b0: 77 69 6b 69 5f 6d 61 69 6e 74 5f 61 64 64 5f 70  wiki_maint_add_p
47c0: 69 63 73 22 29 0a 20 20 20 20 20 20 20 28 73 3a  ics").       (s:
47d0: 66 6f 72 6d 20 27 65 6e 63 74 79 70 65 20 22 6d  form 'enctype "m
47e0: 75 6c 74 69 70 61 72 74 2f 66 6f 72 6d 2d 64 61  ultipart/form-da
47f0: 74 61 22 20 3b 3b 20 27 6e 61 6d 65 20 22 64 6f  ta" ;; 'name "do
4800: 65 73 2d 61 2d 66 6f 72 6d 2d 68 61 76 65 2d 61  es-a-form-have-a
4810: 2d 6e 61 6d 65 22 0a 09 20 20 20 20 20 20 20 28  -name"..       (
4820: 73 3a 69 6e 70 75 74 20 27 74 79 70 65 20 22 66  s:input 'type "f
4830: 69 6c 65 22 20 27 6e 61 6d 65 20 22 69 6e 70 75  ile" 'name "inpu
4840: 74 2d 70 69 63 74 75 72 65 22 20 27 76 61 6c 75  t-picture" 'valu
4850: 65 20 22 55 70 6c 6f 61 64 20 70 69 63 22 29 0a  e "Upload pic").
4860: 09 20 20 20 20 20 20 20 28 73 3a 69 6e 70 75 74  .       (s:input
4870: 20 27 74 79 70 65 20 22 73 75 62 6d 69 74 22 20   'type "submit" 
4880: 27 6e 61 6d 65 20 22 73 75 62 6d 69 74 2d 70 69  'name "submit-pi
4890: 63 74 75 72 65 22 20 27 76 61 6c 75 65 20 22 53  cture" 'value "S
48a0: 75 62 6d 69 74 22 29 0a 09 20 20 20 20 20 20 20  ubmit")..       
48b0: 27 6d 65 74 68 6f 64 20 22 70 6f 73 74 22 20 0a  'method "post" .
48c0: 09 20 20 20 20 20 20 20 27 61 63 74 69 6f 6e 20  .       'action 
48d0: 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b  (s:link-to (twik
48e0: 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d  i:get-link-back-
48f0: 74 6f 2d 63 75 72 72 65 6e 74 29 20 27 61 63 74  to-current) 'act
4900: 69 6f 6e 20 28 63 6f 6e 63 20 22 74 77 69 6b 69  ion (conc "twiki
4910: 2e 73 61 76 65 70 69 63 2d 22 20 28 6e 75 6d 62  .savepic-" (numb
4920: 65 72 2d 3e 73 74 72 69 6e 67 20 77 69 64 29 20  er->string wid) 
4930: 22 2d 22 20 28 74 77 69 6b 69 3a 77 65 62 36 34  "-" (twiki:web64
4940: 65 6e 63 20 74 6b 65 79 29 29 29 0a 09 20 20 20  enc tkey)))..   
4950: 20 20 20 20 28 73 3a 69 6e 70 75 74 20 27 74 79      (s:input 'ty
4960: 70 65 20 22 74 65 78 74 22 20 27 6e 61 6d 65 20  pe "text" 'name 
4970: 22 70 69 63 74 75 72 65 2d 6e 61 6d 65 22 20 27  "picture-name" '
4980: 76 61 6c 75 65 20 22 22 29 29 0a 20 20 20 20 20  value "")).     
4990: 20 20 27 28 29 29 0a 20 20 20 28 6c 65 74 20 28    '()).   (let (
49a0: 28 70 69 63 73 20 28 64 62 69 3a 67 65 74 2d 72  (pics (dbi:get-r
49b0: 6f 77 73 20 74 64 62 20 22 53 45 4c 45 43 54 20  ows tdb "SELECT 
49c0: 69 64 2c 6e 61 6d 65 2c 64 61 74 5f 69 64 2c 74  id,name,dat_id,t
49d0: 68 75 6d 62 5f 64 61 74 5f 69 64 20 46 52 4f 4d  humb_dat_id FROM
49e0: 20 70 69 63 73 20 57 48 45 52 45 20 77 69 6b 69   pics WHERE wiki
49f0: 5f 69 64 3d 3f 3b 22 20 77 69 64 29 29 29 0a 20  _id=?;" wid))). 
4a00: 20 20 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61      (map (lambda
4a10: 20 28 70 69 63 29 0a 09 20 20 20 20 28 73 3a 64   (pic)..    (s:d
4a20: 69 76 20 27 63 6c 61 73 73 20 22 74 69 64 64 6c  iv 'class "tiddl
4a30: 65 72 74 68 75 6d 62 22 0a 09 09 20 20 20 28 73  erthumb"...   (s
4a40: 3a 69 6d 67 20 27 74 69 74 6c 65 20 28 76 65 63  :img 'title (vec
4a50: 74 6f 72 2d 72 65 66 20 70 69 63 20 31 29 20 27  tor-ref pic 1) '
4a60: 61 6c 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  alt (vector-ref 
4a70: 70 69 63 20 31 29 0a 09 09 20 09 20 20 3b 3b 20  pic 1)... .  ;; 
4a80: 27 73 72 63 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20  'src (s:link-to 
4a90: 22 74 77 69 6b 69 22 20 27 77 69 6b 69 5f 6b 65  "twiki" 'wiki_ke
4aa0: 79 20 28 74 77 69 6b 69 3a 77 65 62 36 34 65 6e  y (twiki:web64en
4ab0: 63 20 74 6b 65 79 29 20 27 69 6d 61 67 65 20 20  c tkey) 'image  
4ac0: 28 76 65 63 74 6f 72 2d 72 65 66 20 70 69 63 20  (vector-ref pic 
4ad0: 30 29 29 29 0a 09 09 20 09 20 20 27 73 72 63 20  0)))... .  'src 
4ae0: 28 73 3a 6c 69 6e 6b 2d 74 6f 20 22 74 77 69 6b  (s:link-to "twik
4af0: 69 22 20 27 77 69 6b 69 5f 6b 65 79 20 28 63 6f  i" 'wiki_key (co
4b00: 6e 63 20 28 6e 75 6d 62 65 72 2d 3e 73 74 72 69  nc (number->stri
4b10: 6e 67 20 77 69 64 29 20 22 2d 22 20 28 74 77 69  ng wid) "-" (twi
4b20: 6b 69 3a 77 65 62 36 34 65 6e 63 20 74 6b 65 79  ki:web64enc tkey
4b30: 29 29 0a 09 09 09 09 09 20 20 27 74 68 75 6d 62  ))......  'thumb
4b40: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 70 69    (vector-ref pi
4b50: 63 20 30 29 29 29 0a 09 09 20 20 20 3b 3b 20 20  c 0)))...   ;;  
4b60: 20 20 20 20 20 28 63 6f 6e 63 20 22 74 77 69 6b       (conc "twik
4b70: 69 2f 22 20 77 69 64 20 22 2f 74 68 75 6d 62 73  i/" wid "/thumbs
4b80: 2f 22 20 28 76 65 63 74 6f 72 2d 72 65 66 20 70  /" (vector-ref p
4b90: 69 63 20 30 29 29 29 29 0a 09 09 20 20 20 28 76  ic 0))))...   (v
4ba0: 65 63 74 6f 72 2d 72 65 66 20 70 69 63 20 30 29  ector-ref pic 0)
4bb0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 70 69 63   (vector-ref pic
4bc0: 20 31 29 29 29 0a 09 20 20 70 69 63 73 29 29 29   1)))..  pics)))
4bd0: 29 0a 0a 28 64 65 66 69 6e 65 20 20 28 74 77 69  )..(define  (twi
4be0: 6b 69 3a 73 61 76 65 2d 70 69 63 2d 66 72 6f 6d  ki:save-pic-from
4bf0: 2d 66 6f 72 6d 20 74 64 62 20 77 69 64 29 0a 20  -form tdb wid). 
4c00: 20 28 6c 65 74 2a 20 28 28 70 69 63 2d 64 61 74   (let* ((pic-dat
4c10: 20 20 28 73 3a 67 65 74 2d 69 6e 70 75 74 20 27    (s:get-input '
4c20: 69 6e 70 75 74 2d 70 69 63 74 75 72 65 29 29 0a  input-picture)).
4c30: 09 20 28 61 6c 74 2d 6e 61 6d 65 20 28 73 3a 67  . (alt-name (s:g
4c40: 65 74 2d 69 6e 70 75 74 20 27 70 69 63 74 75 72  et-input 'pictur
4c50: 65 2d 6e 61 6d 65 29 29 29 0a 20 20 20 20 28 69  e-name))).    (i
4c60: 66 20 70 69 63 2d 64 61 74 0a 09 28 62 65 67 69  f pic-dat..(begi
4c70: 6e 0a 09 20 20 28 73 3a 6c 6f 67 20 22 74 77 69  n..  (s:log "twi
4c80: 6b 69 3a 73 61 76 65 2d 70 69 63 2d 66 72 6f 6d  ki:save-pic-from
4c90: 2d 66 6f 72 6d 20 77 69 74 68 20 70 69 63 2d 64  -form with pic-d
4ca0: 61 74 3d 22 20 70 69 63 2d 64 61 74 20 22 20 61  at=" pic-dat " a
4cb0: 6e 64 20 61 6c 74 2d 6e 61 6d 65 3d 22 20 61 6c  nd alt-name=" al
4cc0: 74 2d 6e 61 6d 65 29 0a 09 20 20 28 74 77 69 6b  t-name)..  (twik
4cd0: 69 3a 73 61 76 65 2d 70 69 63 20 74 64 62 20 70  i:save-pic tdb p
4ce0: 69 63 2d 64 61 74 20 77 69 64 20 61 6c 74 2d 6e  ic-dat wid alt-n
4cf0: 61 6d 65 29 29 0a 09 23 66 29 29 29 0a 0a 3b 3b  ame))..#f)))..;;
4d00: 20 67 65 74 20 70 69 63 20 69 64 20 66 6f 72 20   get pic id for 
4d10: 61 20 70 69 63 20 6e 61 6d 65 2c 20 72 65 74 75  a pic name, retu
4d20: 72 6e 73 20 74 68 65 20 6c 61 74 65 73 74 0a 28  rns the latest.(
4d30: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65  define (twiki:ge
4d40: 74 2d 70 69 63 2d 69 64 20 74 64 62 20 70 69 63  t-pic-id tdb pic
4d50: 2d 6e 61 6d 65 20 77 69 64 29 0a 20 20 28 64 62  -name wid).  (db
4d60: 69 3a 67 65 74 2d 6f 6e 65 20 74 64 62 20 22 53  i:get-one tdb "S
4d70: 45 4c 45 43 54 20 70 69 63 73 2e 69 64 20 46 52  ELECT pics.id FR
4d80: 4f 4d 20 70 69 63 73 20 57 48 45 52 45 20 70 69  OM pics WHERE pi
4d90: 63 73 2e 6e 61 6d 65 3d 3f 20 41 4e 44 20 70 69  cs.name=? AND pi
4da0: 63 73 2e 77 69 6b 69 5f 69 64 3d 3f 20 4f 52 44  cs.wiki_id=? ORD
4db0: 45 52 20 42 59 20 70 69 63 73 2e 69 64 20 44 45  ER BY pics.id DE
4dc0: 53 43 20 4c 49 4d 49 54 20 31 3b 22 20 70 69 63  SC LIMIT 1;" pic
4dd0: 2d 6e 61 6d 65 20 77 69 64 29 29 0a 0a 28 64 65  -name wid))..(de
4de0: 66 69 6e 65 20 28 74 77 69 6b 69 3a 73 61 76 65  fine (twiki:save
4df0: 2d 70 69 63 20 74 64 62 20 70 69 63 2d 64 61 74  -pic tdb pic-dat
4e00: 20 77 69 64 20 61 6c 74 29 0a 20 20 28 6c 65 74   wid alt).  (let
4e10: 20 28 28 70 69 63 2d 6e 61 6d 65 20 28 63 61 72   ((pic-name (car
4e20: 20 70 69 63 2d 64 61 74 29 29 0a 09 28 70 69 63   pic-dat))..(pic
4e30: 2d 74 79 70 65 20 28 63 61 64 72 20 70 69 63 2d  -type (cadr pic-
4e40: 64 61 74 29 29 0a 09 28 70 69 63 2d 64 61 74 61  dat))..(pic-data
4e50: 20 28 63 61 64 64 72 20 70 69 63 2d 64 61 74 29   (caddr pic-dat)
4e60: 29 0a 09 3b 3b 20 49 27 6d 20 6e 6f 74 20 74 6f  )..;; I'm not to
4e70: 6f 20 68 61 70 70 79 20 77 69 74 68 20 74 68 69  o happy with thi
4e80: 73 20 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 49  s solution but I
4e90: 20 63 61 6e 27 74 20 73 65 65 6d 20 74 6f 20 63   can't seem to c
4ea0: 68 6f 6d 70 20 74 68 65 20 5c 6e 5c 64 20 66 72  homp the \n\d fr
4eb0: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
4ec0: 65 20 73 74 72 69 6e 67 0a 09 28 61 6c 74 2d 6e  e string..(alt-n
4ed0: 61 6d 65 20 28 69 66 20 61 6c 74 20 28 73 74 72  ame (if alt (str
4ee0: 69 6e 67 2d 73 75 62 73 74 69 74 75 74 65 20 28  ing-substitute (
4ef0: 72 65 67 65 78 70 20 22 5b 5e 5c 5c 77 20 5d 22  regexp "[^\\w ]"
4f00: 29 20 22 22 20 61 6c 74 20 23 74 29 20 23 66 29  ) "" alt #t) #f)
4f10: 29 29 0a 20 20 20 20 28 69 66 20 28 61 6e 64 20  )).    (if (and 
4f20: 61 6c 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28  alt-name..     (
4f30: 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65  string-match (re
4f40: 67 65 78 70 20 22 5c 5c 77 2b 22 29 20 61 6c 74  gexp "\\w+") alt
4f50: 2d 6e 61 6d 65 29 29 0a 09 28 73 65 74 21 20 70  -name))..(set! p
4f60: 69 63 2d 6e 61 6d 65 20 61 6c 74 2d 6e 61 6d 65  ic-name alt-name
4f70: 29 29 0a 20 20 20 20 28 73 3a 6c 6f 67 20 22 61  )).    (s:log "a
4f80: 6c 74 3a 20 22 20 61 6c 74 20 22 20 61 6c 74 2d  lt: " alt " alt-
4f90: 6e 61 6d 65 3a 20 22 20 61 6c 74 2d 6e 61 6d 65  name: " alt-name
4fa0: 29 0a 20 20 20 20 28 69 66 20 70 69 63 2d 64 61  ).    (if pic-da
4fb0: 74 61 0a 09 28 6c 65 74 20 28 28 64 61 74 2d 69  ta..(let ((dat-i
4fc0: 64 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 64 61  d (twiki:save-da
4fd0: 74 20 74 64 62 20 70 69 63 2d 64 61 74 61 20 28  t tdb pic-data (
4fe0: 74 77 69 6b 69 3a 6d 69 6d 65 2d 3e 74 77 69 6b  twiki:mime->twik
4ff0: 69 2d 74 79 70 65 20 70 69 63 2d 74 79 70 65 29  i-type pic-type)
5000: 29 29 0a 09 20 20 20 20 20 20 28 63 72 65 61 74  ))..      (creat
5010: 69 6f 6e 2d 74 69 6d 65 20 28 63 75 72 72 65 6e  ion-time (curren
5020: 74 2d 73 65 63 6f 6e 64 73 29 29 29 0a 09 20 20  t-seconds)))..  
5030: 3b 3b 20 28 74 77 69 6b 69 3a 64 65 6c 65 74 65  ;; (twiki:delete
5040: 2d 70 69 63 2d 62 79 2d 6e 61 6d 65 20 74 64 62  -pic-by-name tdb
5050: 20 70 69 63 2d 6e 61 6d 65 29 0a 09 20 20 28 64   pic-name)..  (d
5060: 62 69 3a 65 78 65 63 20 74 64 62 20 0a 09 09 20  bi:exec tdb ... 
5070: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
5080: 70 69 63 73 20 28 6e 61 6d 65 2c 77 69 6b 69 5f  pics (name,wiki_
5090: 69 64 2c 64 61 74 5f 69 64 2c 63 72 65 61 74 65  id,dat_id,create
50a0: 64 5f 6f 6e 2c 6f 77 6e 65 72 5f 69 64 29 20 56  d_on,owner_id) V
50b0: 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  ALUES(?,?,?,?,?)
50c0: 3b 22 0a 09 09 20 20 20 20 70 69 63 2d 6e 61 6d  ;"...    pic-nam
50d0: 65 20 77 69 64 20 64 61 74 2d 69 64 20 63 72 65  e wid dat-id cre
50e0: 61 74 69 6f 6e 2d 74 69 6d 65 20 28 74 77 69 6b  ation-time (twik
50f0: 69 3a 67 65 74 2d 69 64 29 29 0a 09 20 20 28 6c  i:get-id))..  (l
5100: 65 74 20 28 28 70 69 63 2d 69 64 20 28 74 77 69  et ((pic-id (twi
5110: 6b 69 3a 67 65 74 2d 70 69 63 2d 69 64 20 74 64  ki:get-pic-id td
5120: 62 20 70 69 63 2d 6e 61 6d 65 20 77 69 64 29 29  b pic-name wid))
5130: 29 0a 09 20 20 20 20 28 74 77 69 6b 69 3a 6d 61  )..    (twiki:ma
5140: 6b 65 2d 74 68 75 6d 62 6e 61 69 6c 20 74 64 62  ke-thumbnail tdb
5150: 20 70 69 63 2d 69 64 20 77 69 64 29 29 0a 09 20   pic-id wid)).. 
5160: 20 23 74 29 0a 09 23 66 29 29 29 0a 0a 28 64 65   #t)..#f)))..(de
5170: 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74 2d  fine (twiki:get-
5180: 70 69 63 2d 64 61 74 20 74 64 62 20 77 69 64 20  pic-dat tdb wid 
5190: 70 69 63 2d 69 64 29 0a 20 20 28 64 62 69 3a 67  pic-id).  (dbi:g
51a0: 65 74 2d 6f 6e 65 20 74 64 62 20 22 53 45 4c 45  et-one tdb "SELE
51b0: 43 54 20 64 61 74 20 46 52 4f 4d 20 70 69 63 73  CT dat FROM pics
51c0: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 64 61 74 73   INNER JOIN dats
51d0: 20 4f 4e 20 70 69 63 73 2e 64 61 74 5f 69 64 3d   ON pics.dat_id=
51e0: 64 61 74 73 2e 69 64 20 57 48 45 52 45 20 70 69  dats.id WHERE pi
51f0: 63 73 2e 69 64 3d 3f 20 41 4e 44 20 77 69 6b 69  cs.id=? AND wiki
5200: 5f 69 64 3d 3f 3b 22 20 70 69 63 2d 69 64 20 77  _id=?;" pic-id w
5210: 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74  id))..(define (t
5220: 77 69 6b 69 3a 67 65 74 2d 74 68 75 6d 62 2d 64  wiki:get-thumb-d
5230: 61 74 20 74 64 62 20 77 69 64 20 70 69 63 2d 69  at tdb wid pic-i
5240: 64 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e  d).  (dbi:get-on
5250: 65 20 74 64 62 20 22 53 45 4c 45 43 54 20 64 61  e tdb "SELECT da
5260: 74 20 46 52 4f 4d 20 70 69 63 73 20 49 4e 4e 45  t FROM pics INNE
5270: 52 20 4a 4f 49 4e 20 64 61 74 73 20 4f 4e 20 70  R JOIN dats ON p
5280: 69 63 73 2e 74 68 75 6d 62 5f 64 61 74 5f 69 64  ics.thumb_dat_id
5290: 3d 64 61 74 73 2e 69 64 20 57 48 45 52 45 20 70  =dats.id WHERE p
52a0: 69 63 73 2e 69 64 3d 3f 20 41 4e 44 20 77 69 6b  ics.id=? AND wik
52b0: 69 5f 69 64 3d 3f 3b 22 20 70 69 63 2d 69 64 20  i_id=?;" pic-id 
52c0: 77 69 64 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f  wid))..;; this o
52d0: 6e 65 20 73 65 74 73 20 75 70 20 74 68 65 20 43  ne sets up the C
52e0: 6f 6e 74 65 6e 74 20 74 79 70 65 2c 20 70 75 74  ontent type, put
52f0: 73 20 74 68 65 20 64 61 74 61 20 69 6e 74 6f 20  s the data into 
5300: 70 61 67 65 2d 64 61 74 20 61 6e 64 20 69 73 20  page-dat and is 
5310: 64 6f 6e 65 0a 28 64 65 66 69 6e 65 20 28 74 77  done.(define (tw
5320: 69 6b 69 3a 72 65 74 75 72 6e 2d 69 6d 61 67 65  iki:return-image
5330: 2d 64 61 74 20 74 64 62 20 77 69 64 20 70 69 63  -dat tdb wid pic
5340: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 64 61  -id).  (let ((da
5350: 74 20 20 28 74 77 69 6b 69 3a 67 65 74 2d 70 69  t  (twiki:get-pi
5360: 63 2d 64 61 74 20 74 64 62 20 77 69 64 20 70 69  c-dat tdb wid pi
5370: 63 2d 69 64 29 29 29 0a 20 20 20 20 28 73 3a 6c  c-id))).    (s:l
5380: 6f 67 20 22 74 77 69 6b 69 3a 72 65 74 75 72 6e  og "twiki:return
5390: 2d 69 6d 61 67 65 2d 64 61 74 20 64 61 74 20 69  -image-dat dat i
53a0: 73 3a 20 22 20 64 61 74 20 22 20 6f 66 20 73 69  s: " dat " of si
53b0: 7a 65 3a 20 22 20 28 69 66 20 28 62 6c 6f 62 3f  ze: " (if (blob?
53c0: 20 64 61 74 29 28 62 6c 6f 62 2d 73 69 7a 65 20   dat)(blob-size 
53d0: 64 61 74 29 20 22 5b 6e 6f 74 20 61 20 62 6c 6f  dat) "[not a blo
53e0: 62 5d 22 29 29 0a 20 20 20 20 28 73 64 61 74 2d  b]")).    (sdat-
53f0: 73 65 74 2d 70 61 67 65 2d 74 79 70 65 21 20 20  set-page-type!  
5400: 20 20 73 3a 73 65 73 73 69 6f 6e 20 27 69 6d 61    s:session 'ima
5410: 67 65 29 0a 20 20 20 20 28 73 64 61 74 2d 73 65  ge).    (sdat-se
5420: 74 2d 63 6f 6e 74 65 6e 74 2d 74 79 70 65 21 20  t-content-type! 
5430: 73 3a 73 65 73 73 69 6f 6e 20 22 69 6d 61 67 65  s:session "image
5440: 2f 6a 70 65 67 22 29 0a 20 20 20 20 28 73 64 61  /jpeg").    (sda
5450: 74 2d 73 65 74 2d 61 6c 74 2d 70 61 67 65 2d 64  t-set-alt-page-d
5460: 61 74 21 20 73 3a 73 65 73 73 69 6f 6e 20 64 61  at! s:session da
5470: 74 29 29 29 0a 20 20 20 20 3b 3b 20 28 73 65 73  t))).    ;; (ses
5480: 73 69 6f 6e 3a 61 6c 74 2d 6f 75 74 20 73 3a 73  sion:alt-out s:s
5490: 65 73 73 69 6f 6e 29 29 29 0a 0a 3b 3b 20 74 68  ession)))..;; th
54a0: 69 73 20 6f 6e 65 20 73 65 74 73 20 75 70 20 74  is one sets up t
54b0: 68 65 20 43 6f 6e 74 65 6e 74 20 74 79 70 65 2c  he Content type,
54c0: 20 70 75 74 73 20 74 68 65 20 64 61 74 61 20 69   puts the data i
54d0: 6e 74 6f 20 70 61 67 65 2d 64 61 74 20 61 6e 64  nto page-dat and
54e0: 20 69 73 20 64 6f 6e 65 0a 28 64 65 66 69 6e 65   is done.(define
54f0: 20 28 74 77 69 6b 69 3a 72 65 74 75 72 6e 2d 74   (twiki:return-t
5500: 68 75 6d 62 2d 64 61 74 20 74 64 62 20 77 69 64  humb-dat tdb wid
5510: 20 70 69 63 2d 69 64 29 0a 20 20 28 6c 65 74 20   pic-id).  (let 
5520: 28 28 64 61 74 20 20 28 74 77 69 6b 69 3a 67 65  ((dat  (twiki:ge
5530: 74 2d 74 68 75 6d 62 2d 64 61 74 20 74 64 62 20  t-thumb-dat tdb 
5540: 77 69 64 20 70 69 63 2d 69 64 29 29 29 0a 20 20  wid pic-id))).  
5550: 20 20 28 73 3a 6c 6f 67 20 22 74 77 69 6b 69 3a    (s:log "twiki:
5560: 72 65 74 75 72 6e 2d 69 6d 61 67 65 2d 64 61 74  return-image-dat
5570: 20 64 61 74 20 69 73 3a 20 22 20 64 61 74 20 22   dat is: " dat "
5580: 20 6f 66 20 73 69 7a 65 3a 20 22 20 28 69 66 20   of size: " (if 
5590: 28 62 6c 6f 62 3f 20 64 61 74 29 28 62 6c 6f 62  (blob? dat)(blob
55a0: 2d 73 69 7a 65 20 64 61 74 29 20 22 5b 6e 6f 74  -size dat) "[not
55b0: 20 61 20 62 6c 6f 62 5d 22 29 29 0a 20 20 20 20   a blob]")).    
55c0: 28 73 64 61 74 2d 73 65 74 2d 70 61 67 65 2d 74  (sdat-set-page-t
55d0: 79 70 65 21 20 20 20 20 73 3a 73 65 73 73 69 6f  ype!    s:sessio
55e0: 6e 20 27 69 6d 61 67 65 29 0a 20 20 20 20 28 73  n 'image).    (s
55f0: 64 61 74 2d 73 65 74 2d 63 6f 6e 74 65 6e 74 2d  dat-set-content-
5600: 74 79 70 65 21 20 73 3a 73 65 73 73 69 6f 6e 20  type! s:session 
5610: 22 69 6d 61 67 65 2f 6a 70 65 67 22 29 0a 20 20  "image/jpeg").  
5620: 20 20 28 73 64 61 74 2d 73 65 74 2d 61 6c 74 2d    (sdat-set-alt-
5630: 70 61 67 65 2d 64 61 74 21 20 73 3a 73 65 73 73  page-dat! s:sess
5640: 69 6f 6e 20 64 61 74 29 29 29 0a 20 20 20 20 3b  ion dat))).    ;
5650: 3b 20 28 73 65 73 73 69 6f 6e 3a 61 6c 74 2d 6f  ; (session:alt-o
5660: 75 74 20 73 3a 73 65 73 73 69 6f 6e 29 29 29 0a  ut s:session))).
5670: 20 20 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b    .(define (twik
5680: 69 3a 6d 61 6b 65 2d 74 68 75 6d 62 6e 61 69 6c  i:make-thumbnail
5690: 20 74 64 62 20 70 69 63 2d 69 64 20 77 69 64 29   tdb pic-id wid)
56a0: 0a 20 20 28 6c 65 74 20 28 28 69 6e 64 61 74 20  .  (let ((indat 
56b0: 20 28 74 77 69 6b 69 3a 67 65 74 2d 70 69 63 2d   (twiki:get-pic-
56c0: 64 61 74 20 74 64 62 20 77 69 64 20 70 69 63 2d  dat tdb wid pic-
56d0: 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 20 20 28  id))).    ;;   (
56e0: 6f 75 74 64 61 74 20 28 6f 70 65 6e 2d 6f 75 74  outdat (open-out
56f0: 70 75 74 2d 73 74 72 69 6e 67 29 29 29 0a 20 20  put-string))).  
5700: 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 28    (let-values ((
5710: 28 69 6e 70 20 6f 75 70 20 70 69 64 29 28 70 72  (inp oup pid)(pr
5720: 6f 63 65 73 73 20 22 63 6f 6e 76 65 72 74 22 20  ocess "convert" 
5730: 28 6c 69 73 74 20 22 2d 73 69 7a 65 22 20 22 35  (list "-size" "5
5740: 30 30 78 31 38 30 22 20 22 2d 22 20 22 2d 74 68  00x180" "-" "-th
5750: 75 6d 62 6e 61 69 6c 22 20 22 32 35 30 78 39 30  umbnail" "250x90
5760: 22 20 22 2d 75 6e 73 68 61 72 70 22 20 22 30 78  " "-unsharp" "0x
5770: 2e 35 22 20 22 2d 22 29 29 29 29 0a 09 09 28 77  .5" "-"))))...(w
5780: 72 69 74 65 2d 73 74 72 69 6e 67 20 28 62 6c 6f  rite-string (blo
5790: 62 2d 3e 73 74 72 69 6e 67 20 69 6e 64 61 74 29  b->string indat)
57a0: 20 23 66 20 6f 75 70 29 0a 09 09 28 63 6c 6f 73   #f oup)...(clos
57b0: 65 2d 69 6e 70 75 74 2d 70 6f 72 74 20 6f 75 70  e-input-port oup
57c0: 29 0a 09 09 3b 3b 20 28 77 72 69 74 65 2d 73 74  )...;; (write-st
57d0: 72 69 6e 67 20 23 66 20 69 6e 70 20 28 62 6c 6f  ring #f inp (blo
57e0: 62 2d 3e 73 74 72 69 6e 67 20 69 6e 64 61 74 29  b->string indat)
57f0: 29 0a 09 09 28 6c 65 74 20 28 28 6c 20 28 72 65  )...(let ((l (re
5800: 61 64 2d 73 74 72 69 6e 67 20 23 66 20 69 6e 70  ad-string #f inp
5810: 29 29 29 0a 09 09 20 20 28 63 6c 6f 73 65 2d 6f  )))...  (close-o
5820: 75 74 70 75 74 2d 70 6f 72 74 20 69 6e 70 29 0a  utput-port inp).
5830: 09 09 20 20 3b 3b 20 28 77 72 69 74 65 2d 73 74  ..  ;; (write-st
5840: 72 69 6e 67 20 6c 20 23 66 20 6f 75 74 64 61 74  ring l #f outdat
5850: 29 0a 09 09 20 20 28 6c 65 74 2a 20 28 28 6e 65  )...  (let* ((ne
5860: 77 64 61 74 20 28 73 74 72 69 6e 67 2d 3e 62 6c  wdat (string->bl
5870: 6f 62 20 6c 29 29 20 3b 3b 20 28 67 65 74 2d 6f  ob l)) ;; (get-o
5880: 75 74 70 75 74 2d 73 74 72 69 6e 67 20 6f 75 74  utput-string out
5890: 64 61 74 29 29 29 0a 09 09 09 20 28 64 61 74 2d  dat))).... (dat-
58a0: 69 64 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 64  id (twiki:save-d
58b0: 61 74 20 74 64 62 20 6e 65 77 64 61 74 20 32 29  at tdb newdat 2)
58c0: 29 29 20 3b 3b 20 62 75 67 3f 0a 09 09 20 20 20  )) ;; bug?...   
58d0: 20 28 64 62 69 3a 65 78 65 63 20 74 64 62 20 22   (dbi:exec tdb "
58e0: 55 50 44 41 54 45 20 70 69 63 73 20 53 45 54 20  UPDATE pics SET 
58f0: 74 68 75 6d 62 5f 64 61 74 5f 69 64 3d 3f 20 57  thumb_dat_id=? W
5900: 48 45 52 45 20 69 64 3d 3f 3b 22 20 64 61 74 2d  HERE id=?;" dat-
5910: 69 64 20 70 69 63 2d 69 64 29 0a 09 09 20 20 20  id pic-id)...   
5920: 20 64 61 74 2d 69 64 29 29 29 29 29 0a 0a 3b 3b   dat-id)))))..;;
5930: 20 6e 6f 74 20 74 65 73 74 65 64 0a 28 64 65 66   not tested.(def
5940: 69 6e 65 20 28 74 77 69 6b 69 3a 70 69 63 64 61  ine (twiki:picda
5950: 74 2d 3e 74 68 75 6d 62 64 61 74 20 70 69 63 64  t->thumbdat picd
5960: 61 74 29 0a 20 20 28 6c 65 74 2d 76 61 6c 75 65  at).  (let-value
5970: 73 20 28 28 28 69 6e 70 20 6f 75 70 20 70 69 64  s (((inp oup pid
5980: 29 28 70 72 6f 63 65 73 73 20 22 63 6f 6e 76 65  )(process "conve
5990: 72 74 22 20 3b 3b 20 28 6c 69 73 74 20 22 2d 73  rt" ;; (list "-s
59a0: 69 7a 65 22 20 22 35 30 30 78 31 38 30 22 20 22  ize" "500x180" "
59b0: 2d 22 20 22 2d 74 68 75 6d 62 6e 61 69 6c 22 20  -" "-thumbnail" 
59c0: 22 32 35 30 78 39 30 22 20 22 2d 75 6e 73 68 61  "250x90" "-unsha
59d0: 72 70 22 20 22 30 78 2e 35 22 20 22 2d 22 29 29  rp" "0x.5" "-"))
59e0: 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 6c 69  )).....      (li
59f0: 73 74 20 22 2d 73 69 7a 65 22 20 22 35 30 30 78  st "-size" "500x
5a00: 31 38 30 22 20 22 2d 22 20 22 2d 74 68 75 6d 62  180" "-" "-thumb
5a10: 6e 61 69 6c 22 20 22 32 30 30 78 37 30 22 20 22  nail" "200x70" "
5a20: 2d 75 6e 73 68 61 72 70 22 20 22 30 78 2e 35 22  -unsharp" "0x.5"
5a30: 20 22 2d 22 29 29 29 29 0a 09 20 20 20 20 20 20   "-"))))..      
5a40: 28 77 72 69 74 65 2d 73 74 72 69 6e 67 20 28 62  (write-string (b
5a50: 6c 6f 62 2d 3e 73 74 72 69 6e 67 20 70 69 63 64  lob->string picd
5a60: 61 74 29 20 23 66 20 6f 75 70 29 0a 09 20 20 20  at) #f oup)..   
5a70: 20 20 20 28 63 6c 6f 73 65 2d 69 6e 70 75 74 2d     (close-input-
5a80: 70 6f 72 74 20 6f 75 70 29 0a 09 20 20 20 20 20  port oup)..     
5a90: 20 3b 3b 20 28 77 72 69 74 65 2d 73 74 72 69 6e   ;; (write-strin
5aa0: 67 20 23 66 20 69 6e 70 20 28 62 6c 6f 62 2d 3e  g #f inp (blob->
5ab0: 73 74 72 69 6e 67 20 69 6e 64 61 74 29 29 0a 09  string indat))..
5ac0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 6c 20 28        (let ((l (
5ad0: 72 65 61 64 2d 73 74 72 69 6e 67 20 23 66 20 69  read-string #f i
5ae0: 6e 70 29 29 29 0a 09 09 28 63 6c 6f 73 65 2d 6f  np)))...(close-o
5af0: 75 74 70 75 74 2d 70 6f 72 74 20 69 6e 70 29 0a  utput-port inp).
5b00: 09 09 28 77 72 69 74 65 2d 73 74 72 69 6e 67 20  ..(write-string 
5b10: 6c 20 23 66 20 6f 75 70 29 0a 09 09 28 73 74 72  l #f oup)...(str
5b20: 69 6e 67 2d 3e 62 6c 6f 62 20 6c 29 29 29 29 0a  ing->blob l)))).
5b30: 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a  .(define (twiki:
5b40: 6d 69 6d 65 2d 3e 74 77 69 6b 69 2d 74 79 70 65  mime->twiki-type
5b50: 20 6d 69 6d 65 2d 74 79 70 65 29 0a 20 20 28 63   mime-type).  (c
5b60: 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d  ase (string->sym
5b70: 62 6f 6c 20 6d 69 6d 65 2d 74 79 70 65 29 0a 20  bol mime-type). 
5b80: 20 20 20 28 28 69 6d 61 67 65 2f 6a 70 65 67 29     ((image/jpeg)
5b90: 20 31 29 0a 20 20 20 20 28 28 69 6d 61 67 65 2f   1).    ((image/
5ba0: 70 6e 67 29 20 20 32 29 0a 20 20 20 20 28 65 6c  png)  2).    (el
5bb0: 73 65 20 30 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  se 0)))..;;=====
5bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c00: 3d 0a 3b 3b 20 57 69 6b 69 20 73 74 75 66 66 0a  =.;; Wiki stuff.
5c10: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
5c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c50: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 63 75 72  ========..;; cur
5c60: 72 2d 74 69 64 64 6c 65 72 73 20 69 73 20 61 20  r-tiddlers is a 
5c70: 6c 69 73 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  list of the name
5c80: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
5c90: 20 74 69 64 64 6c 65 72 73 20 64 69 73 70 6c 61   tiddlers displa
5ca0: 79 65 64 0a 3b 3b 20 74 69 64 64 6c 65 72 2d 75  yed.;; tiddler-u
5cb0: 6e 64 65 72 2d 65 64 69 74 20 69 73 20 74 68 65  nder-edit is the
5cc0: 20 74 69 64 64 6c 65 72 20 62 65 69 6e 67 20 65   tiddler being e
5cd0: 64 69 74 65 64 20 28 6f 72 20 23 66 20 66 6f 72  dited (or #f for
5ce0: 20 6e 6f 6e 65 29 2e 0a 28 64 65 66 69 6e 65 20   none)..(define 
5cf0: 28 74 77 69 6b 69 3a 77 69 6b 69 20 6e 61 6d 65  (twiki:wiki name
5d00: 20 6b 65 79 73 29 0a 20 20 28 6c 65 74 20 28 28   keys).  (let ((
5d10: 70 65 72 6d 73 20 20 20 28 74 77 69 6b 69 3a 61  perms   (twiki:a
5d20: 63 63 65 73 73 20 6e 61 6d 65 20 6b 65 79 73 20  ccess name keys 
5d30: 28 74 77 69 6b 69 3a 67 65 74 2d 69 64 29 29 29  (twiki:get-id)))
5d40: 29 0a 20 20 20 20 3b 3b 20 28 73 3a 6c 6f 67 20  ).    ;; (s:log 
5d50: 22 74 77 69 6b 69 3a 77 69 6b 69 20 6e 61 6d 65  "twiki:wiki name
5d60: 3a 20 5c 22 22 20 6e 61 6d 65 20 22 5c 22 20 6b  : \"" name "\" k
5d70: 65 79 73 3a 20 22 20 6b 65 79 73 29 0a 20 20 20  eys: " keys).   
5d80: 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20 6e 61   (if (or (not na
5d90: 6d 65 29 0a 09 20 20 20 20 28 73 74 72 69 6e 67  me)..    (string
5da0: 3d 3f 20 6e 61 6d 65 20 22 22 29 29 20 3b 3b 20  =? name "")) ;; 
5db0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 22 22 20  name must be "" 
5dc0: 6f 72 20 23 66 20 74 6f 20 67 65 74 20 68 65 72  or #f to get her
5dd0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
5de0: 69 6d 61 67 65 0a 09 3b 3b 20 68 61 6e 64 6c 65  image..;; handle
5df0: 20 72 65 74 75 72 6e 69 6e 67 20 70 69 63 74 75   returning pictu
5e00: 72 65 73 2c 20 6e 6f 74 65 20 6b 65 79 73 20 61  res, note keys a
5e10: 6e 64 20 6e 61 6d 65 20 61 72 65 20 69 67 6e 6f  nd name are igno
5e20: 72 65 64 20 66 6f 72 20 74 68 65 73 65 2e 20 54  red for these. T
5e30: 68 65 79 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  hey are called o
5e40: 75 74 20 69 6e 0a 09 3b 3b 20 74 68 65 20 74 77  ut in..;; the tw
5e50: 69 6b 69 2f 76 69 65 77 2e 73 63 6d 20 28 74 77  iki/view.scm (tw
5e60: 69 6b 69 3a 74 77 69 6b 69 20 22 62 6c 61 68 22  iki:twiki "blah"
5e70: 20 27 28 6e 61 64 61 20 66 6f 6f 29 29 20 63 61   '(nada foo)) ca
5e80: 6c 6c 2e 0a 09 28 6c 65 74 20 28 28 69 6d 61 67  ll...(let ((imag
5e90: 65 20 20 20 28 73 3a 67 65 74 2d 70 61 72 61 6d  e   (s:get-param
5ea0: 20 22 69 6d 61 67 65 22 29 29 0a 09 20 20 20 20   "image"))..    
5eb0: 20 20 28 74 68 75 6d 62 20 20 20 28 73 3a 67 65    (thumb   (s:ge
5ec0: 74 2d 70 61 72 61 6d 20 22 74 68 75 6d 62 22 29  t-param "thumb")
5ed0: 29 29 0a 09 20 20 28 73 3a 6c 6f 67 20 22 69 6d  ))..  (s:log "im
5ee0: 61 67 65 3a 20 22 20 69 6d 61 67 65 20 22 20 74  age: " image " t
5ef0: 68 75 6d 62 3a 20 22 20 74 68 75 6d 62 20 22 20  humb: " thumb " 
5f00: 77 69 6b 69 5f 6b 65 79 3a 20 22 20 28 73 3a 67  wiki_key: " (s:g
5f10: 65 74 2d 70 61 72 61 6d 20 27 77 69 6b 69 5f 6b  et-param 'wiki_k
5f20: 65 79 29 29 0a 09 20 20 28 69 66 20 28 61 6e 64  ey))..  (if (and
5f30: 20 28 6d 65 6d 62 65 72 20 27 72 20 70 65 72 6d   (member 'r perm
5f40: 73 29 20 69 6d 61 67 65 29 0a 09 20 20 20 20 20  s) image)..     
5f50: 20 28 6c 65 74 2a 20 28 28 76 61 72 6c 73 74 20   (let* ((varlst 
5f60: 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 73  (string-split (s
5f70: 3a 67 65 74 2d 70 61 72 61 6d 20 27 77 69 6b 69  :get-param 'wiki
5f80: 5f 6b 65 79 29 20 22 2d 22 29 29 0a 09 09 20 20  _key) "-"))...  
5f90: 20 20 20 28 74 6b 65 79 20 28 74 77 69 6b 69 3a     (tkey (twiki:
5fa0: 77 65 62 36 34 64 65 63 20 28 63 61 64 72 20 76  web64dec (cadr v
5fb0: 61 72 6c 73 74 29 29 29 0a 09 09 20 20 20 20 20  arlst)))...     
5fc0: 28 77 69 64 20 20 28 73 74 72 69 6e 67 2d 3e 6e  (wid  (string->n
5fd0: 75 6d 62 65 72 20 28 63 61 72 20 20 76 61 72 6c  umber (car  varl
5fe0: 73 74 29 29 29 0a 09 09 20 20 20 20 20 28 74 64  st)))...     (td
5ff0: 62 6e 20 28 74 77 69 6b 69 3a 6f 70 65 6e 2d 64  bn (twiki:open-d
6000: 62 20 74 6b 65 79 20 23 66 29 29 29 0a 09 09 28  b tkey #f)))...(
6010: 73 3a 6c 6f 67 20 22 74 6b 65 79 3a 20 22 20 74  s:log "tkey: " t
6020: 6b 65 79 20 22 20 69 6d 61 67 65 20 6e 75 6d 62  key " image numb
6030: 65 72 3a 20 22 20 69 6d 61 67 65 29 0a 09 09 28  er: " image)...(
6040: 74 77 69 6b 69 3a 72 65 74 75 72 6e 2d 69 6d 61  twiki:return-ima
6050: 67 65 2d 64 61 74 20 74 64 62 6e 20 77 69 64 20  ge-dat tdbn wid 
6060: 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20  (string->number 
6070: 69 6d 61 67 65 29 29 29 29 20 3b 3b 20 64 6f 20  image)))) ;; do 
6080: 6e 6f 74 20 72 65 74 75 72 6e 20 66 72 6f 6d 20  not return from 
6090: 74 77 69 6b 69 3a 72 65 74 75 72 6e 2d 69 6d 61  twiki:return-ima
60a0: 67 65 0a 09 20 20 28 69 66 20 28 61 6e 64 20 28  ge..  (if (and (
60b0: 6d 65 6d 62 65 72 20 27 72 20 70 65 72 6d 73 29  member 'r perms)
60c0: 20 74 68 75 6d 62 29 0a 09 20 20 20 20 20 20 28   thumb)..      (
60d0: 6c 65 74 2a 20 28 28 76 61 72 6c 73 74 20 28 73  let* ((varlst (s
60e0: 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 73 3a 67  tring-split (s:g
60f0: 65 74 2d 70 61 72 61 6d 20 27 77 69 6b 69 5f 6b  et-param 'wiki_k
6100: 65 79 29 20 22 2d 22 29 29 0a 09 09 20 20 20 20  ey) "-"))...    
6110: 20 28 74 6b 65 79 20 20 20 28 74 77 69 6b 69 3a   (tkey   (twiki:
6120: 77 65 62 36 34 64 65 63 20 28 63 61 64 72 20 76  web64dec (cadr v
6130: 61 72 6c 73 74 29 29 29 0a 09 09 20 20 20 20 20  arlst)))...     
6140: 28 77 69 64 20 20 20 20 28 73 74 72 69 6e 67 2d  (wid    (string-
6150: 3e 6e 75 6d 62 65 72 20 28 63 61 72 20 20 76 61  >number (car  va
6160: 72 6c 73 74 29 29 29 0a 09 09 20 20 20 20 20 28  rlst)))...     (
6170: 74 64 62 6e 20 20 20 28 74 77 69 6b 69 3a 6f 70  tdbn   (twiki:op
6180: 65 6e 2d 64 62 20 74 6b 65 79 20 23 66 29 29 29  en-db tkey #f)))
6190: 0a 09 09 28 73 3a 6c 6f 67 20 22 74 6b 65 79 3a  ...(s:log "tkey:
61a0: 20 22 20 74 6b 65 79 20 22 20 74 68 75 6d 62 20   " tkey " thumb 
61b0: 6e 75 6d 62 65 72 3a 20 22 20 69 6d 61 67 65 29  number: " image)
61c0: 0a 09 09 28 74 77 69 6b 69 3a 72 65 74 75 72 6e  ...(twiki:return
61d0: 2d 74 68 75 6d 62 2d 64 61 74 20 74 64 62 6e 20  -thumb-dat tdbn 
61e0: 77 69 64 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d  wid (string->num
61f0: 62 65 72 20 74 68 75 6d 62 29 29 29 29 29 20 3b  ber thumb))))) ;
6200: 3b 20 64 6f 20 6e 6f 74 20 72 65 74 75 72 6e 20  ; do not return 
6210: 66 72 6f 6d 20 74 77 69 6b 69 3a 72 65 74 75 72  from twiki:retur
6220: 6e 2d 69 6d 61 67 65 0a 09 28 69 66 20 28 6e 6f  n-image..(if (no
6230: 74 20 28 6d 65 6d 62 65 72 20 27 72 20 70 65 72  t (member 'r per
6240: 6d 73 29 29 20 3b 3b 20 72 65 61 64 20 61 63 63  ms)) ;; read acc
6250: 65 73 73 0a 09 20 20 20 20 27 28 29 20 3b 3b 20  ess..    '() ;; 
6260: 72 65 74 75 72 6e 20 61 20 62 6c 61 6e 6b 20 73  return a blank s
6270: 6c 61 74 65 0a 09 20 20 20 20 28 74 77 69 6b 69  late..    (twiki
6280: 3a 64 69 73 70 6c 61 79 2d 77 69 6b 69 20 6e 61  :display-wiki na
6290: 6d 65 20 6b 65 79 73 20 70 65 72 6d 73 29 29 29  me keys perms)))
62a0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69  ))..(define (twi
62b0: 6b 69 3a 64 69 73 70 6c 61 79 2d 77 69 6b 69 20  ki:display-wiki 
62c0: 6e 61 6d 65 20 6b 65 79 73 20 70 65 72 6d 73 29  name keys perms)
62d0: 0a 20 20 28 6c 65 74 2a 20 28 28 77 69 6b 69 64  .  (let* ((wikid
62e0: 61 74 20 20 28 6d 61 6b 65 2d 74 77 69 6b 69 3a  at  (make-twiki:
62f0: 77 69 6b 69 29 29 0a 09 20 28 74 6b 65 79 20 20  wiki)).. (tkey  
6300: 20 20 20 28 74 77 69 6b 69 3a 6b 65 79 73 2d 3e     (twiki:keys->
6310: 6b 65 79 20 6b 65 79 73 29 29 0a 09 20 28 74 64  key keys)).. (td
6320: 62 20 20 20 20 20 20 28 74 77 69 6b 69 3a 6f 70  b      (twiki:op
6330: 65 6e 2d 64 62 20 74 6b 65 79 29 29 0a 09 20 28  en-db tkey)).. (
6340: 77 69 64 20 20 20 20 20 20 28 74 77 69 6b 69 3a  wid      (twiki:
6350: 6e 61 6d 65 2d 3e 77 69 64 20 74 64 62 20 6e 61  name->wid tdb na
6360: 6d 65 29 29 0a 09 20 28 63 76 61 72 20 20 20 20  me)).. (cvar    
6370: 20 28 63 6f 6e 63 20 22 43 55 52 52 45 4e 54 5f   (conc "CURRENT_
6380: 54 57 49 44 4c 45 52 53 3a 22 20 77 69 64 29 29  TWIDLERS:" wid))
6390: 20 3b 3b 20 70 61 67 65 20 76 61 72 20 74 6f 20   ;; page var to 
63a0: 73 74 6f 72 65 20 63 75 72 72 65 6e 74 20 74 77  store current tw
63b0: 69 64 64 6c 65 72 73 20 62 65 69 6e 67 20 76 69  iddlers being vi
63c0: 65 77 65 64 0a 09 20 28 63 76 61 72 2d 65 64 20  ewed.. (cvar-ed 
63d0: 20 28 63 6f 6e 63 20 22 43 55 52 52 45 4e 54 5f   (conc "CURRENT_
63e0: 54 57 49 44 4c 45 52 5f 55 4e 44 45 52 5f 45 44  TWIDLER_UNDER_ED
63f0: 49 54 3a 22 20 77 69 64 29 29 0a 09 20 28 74 6e  IT:" wid)).. (tn
6400: 75 6d 65 64 69 74 20 28 69 66 20 28 73 3a 67 65  umedit (if (s:ge
6410: 74 20 63 76 61 72 2d 65 64 29 20 0a 09 09 20 20  t cvar-ed) ...  
6420: 20 20 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75       (string->nu
6430: 6d 62 65 72 20 28 73 3a 67 65 74 20 63 76 61 72  mber (s:get cvar
6440: 2d 65 64 29 29 0a 09 09 20 20 20 20 20 20 20 23  -ed))...       #
6450: 66 29 29 20 3b 3b 20 23 66 20 3d 3e 20 6e 6f 74  f)) ;; #f => not
6460: 68 69 6e 67 20 74 6f 20 65 64 69 74 2c 20 2d 31  hing to edit, -1
6470: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 74 69   create a new ti
6480: 64 64 6c 65 72 0a 09 20 28 74 6e 75 6d 76 69 65  ddler.. (tnumvie
6490: 77 20 23 66 29 0a 09 20 28 6c 6d 65 6e 75 20 20  w #f).. (lmenu  
64a0: 20 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64    (twiki:get-tid
64b0: 64 6c 65 72 73 20 74 64 62 20 77 69 64 20 28 6c  dlers tdb wid (l
64c0: 69 73 74 20 22 4d 61 69 6e 4d 65 6e 75 22 29 29  ist "MainMenu"))
64d0: 29 0a 09 20 3b 3b 20 73 74 6f 72 65 20 74 69 64  ).. ;; store tid
64e0: 64 6c 65 72 73 20 66 6f 72 20 74 68 69 73 20 70  dlers for this p
64f0: 61 67 65 2f 74 77 69 6b 69 20 69 6e 20 63 76 61  age/twiki in cva
6500: 72 20 28 69 2e 65 2e 20 43 55 52 52 45 4e 54 5f  r (i.e. CURRENT_
6510: 54 57 49 44 4c 45 52 53 3a 3c 77 69 64 3e 0a 09  TWIDLERS:<wid>..
6520: 20 28 74 64 6c 6e 75 6d 73 20 20 28 69 66 20 28   (tdlnums  (if (
6530: 73 3a 67 65 74 20 63 76 61 72 29 0a 09 09 20 20  s:get cvar)...  
6540: 20 20 20 20 20 28 6d 61 70 20 73 74 72 69 6e 67       (map string
6550: 2d 3e 6e 75 6d 62 65 72 20 28 73 74 72 69 6e 67  ->number (string
6560: 2d 73 70 6c 69 74 20 28 73 3a 67 65 74 20 63 76  -split (s:get cv
6570: 61 72 29 20 22 2c 22 29 29 0a 09 09 20 20 20 20  ar) ","))...    
6580: 20 20 20 27 28 29 29 29 20 3b 3b 20 6c 69 73 74     '())) ;; list
6590: 20 6f 66 20 74 69 64 64 6c 65 72 20 6e 75 6d 62   of tiddler numb
65a0: 65 72 73 0a 09 20 28 74 64 6c 72 73 20 20 20 20  ers.. (tdlrs    
65b0: 27 28 29 29 0a 09 20 28 74 65 64 69 74 65 64 20  '()).. (tedited 
65c0: 20 28 69 66 20 28 6d 65 6d 62 65 72 20 27 77 20   (if (member 'w 
65d0: 70 65 72 6d 73 29 20 23 66 20 23 74 29 29 20 3b  perms) #f #t)) ;
65e0: 3b 20 66 6f 72 63 65 20 6e 6f 20 65 64 69 74 73  ; force no edits
65f0: 20 69 66 20 6e 6f 74 20 61 20 77 72 69 74 65 72   if not a writer
6600: 0a 09 20 28 65 64 69 74 2d 74 6d 65 6e 75 2d 69  .. (edit-tmenu-i
6610: 64 20 28 69 66 20 28 61 6e 64 20 28 6d 65 6d 62  d (if (and (memb
6620: 65 72 20 27 77 20 70 65 72 6d 73 29 0a 09 09 09  er 'w perms)....
6630: 09 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22  . (s:get-param "
6640: 65 64 69 74 5f 74 6d 65 6e 75 22 29 29 0a 09 09  edit_tmenu"))...
6650: 09 20 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75  .    (string->nu
6660: 6d 62 65 72 20 28 73 3a 67 65 74 2d 70 61 72 61  mber (s:get-para
6670: 6d 20 22 65 64 69 74 5f 74 6d 65 6e 75 22 29 29  m "edit_tmenu"))
6680: 0a 09 09 09 20 20 20 20 23 66 29 29 0a 09 20 28  ....    #f)).. (
6690: 65 64 69 74 2d 74 69 64 64 6c 65 72 20 28 69 66  edit-tiddler (if
66a0: 20 20 28 61 6e 64 20 28 6d 65 6d 62 65 72 20 27    (and (member '
66b0: 77 20 70 65 72 6d 73 29 0a 09 09 09 09 20 28 73  w perms)..... (s
66c0: 3a 67 65 74 2d 70 61 72 61 6d 20 22 65 64 69 74  :get-param "edit
66d0: 5f 74 69 64 64 6c 65 72 22 29 29 20 3b 3b 20 74  _tiddler")) ;; t
66e0: 68 69 73 20 68 61 6e 64 6c 65 73 20 74 68 65 20  his handles the 
66f0: 22 65 64 69 74 22 20 6c 69 6e 6b 20 69 6e 20 74  "edit" link in t
6700: 68 65 20 74 69 64 64 6c 65 72 20 63 6f 6e 74 72  he tiddler contr
6710: 6f 6c 20 62 61 72 0a 09 09 09 20 20 20 20 28 6c  ol bar....    (l
6720: 65 74 20 28 28 74 20 28 74 77 69 6b 69 3a 67 65  et ((t (twiki:ge
6730: 74 2d 74 69 64 64 6c 65 72 73 2d 62 79 2d 6e 75  t-tiddlers-by-nu
6740: 6d 20 74 64 62 20 77 69 64 20 28 6c 69 73 74 20  m tdb wid (list 
6750: 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20  (string->number 
6760: 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 65 64  (s:get-param "ed
6770: 69 74 5f 74 69 64 64 6c 65 72 22 29 29 29 29 29  it_tiddler")))))
6780: 29 0a 09 09 09 20 20 20 20 20 20 28 73 3a 6c 6f  )....      (s:lo
6790: 67 20 22 74 3a 20 22 20 74 29 0a 09 09 09 20 20  g "t: " t)....  
67a0: 20 20 20 20 28 69 66 20 74 0a 09 09 09 09 20 20      (if t.....  
67b0: 28 63 61 72 20 74 20 29 20 3b 3b 20 73 68 6f 75  (car t ) ;; shou
67c0: 6c 64 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20  ld be a list of 
67d0: 6f 6e 65 0a 09 09 09 09 20 20 28 74 77 69 6b 69  one.....  (twiki
67e0: 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d 6e 61 6d  :tiddler-set-nam
67f0: 65 21 0a 09 09 09 09 20 20 20 28 74 77 69 6b 69  e!.....   (twiki
6800: 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d 69 64 21  :tiddler-set-id!
6810: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
6820: 6d 61 6b 65 29 20 2d 31 29 20 22 4e 65 77 54 69  make) -1) "NewTi
6830: 64 64 6c 65 72 22 29 29 29 0a 09 09 09 20 20 20  ddler")))....   
6840: 20 23 66 29 29 0a 09 20 28 76 69 65 77 2d 74 69   #f)).. (view-ti
6850: 64 64 6c 65 72 20 28 69 66 20 28 73 3a 67 65 74  ddler (if (s:get
6860: 2d 70 61 72 61 6d 20 22 76 69 65 77 5f 74 69 64  -param "view_tid
6870: 64 6c 65 72 22 29 0a 09 09 09 20 20 20 28 6c 65  dler")....   (le
6880: 74 2a 20 28 28 74 6e 61 6d 65 20 28 74 77 69 6b  t* ((tname (twik
6890: 69 3a 77 65 62 36 34 64 65 63 20 28 73 3a 67 65  i:web64dec (s:ge
68a0: 74 2d 70 61 72 61 6d 20 22 76 69 65 77 5f 74 69  t-param "view_ti
68b0: 64 64 6c 65 72 22 29 29 29 0a 09 09 09 09 20 20  ddler"))).....  
68c0: 28 74 20 20 20 20 20 28 74 77 69 6b 69 3a 67 65  (t     (twiki:ge
68d0: 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d  t-tiddler-by-nam
68e0: 65 20 74 64 62 20 77 69 64 20 74 6e 61 6d 65 29  e tdb wid tname)
68f0: 29 29 0a 09 09 09 20 20 20 20 20 28 73 3a 6c 6f  ))....     (s:lo
6900: 67 20 22 74 3a 20 22 20 74 29 0a 09 09 09 20 20  g "t: " t)....  
6910: 20 20 20 28 69 66 20 74 0a 09 09 09 09 20 74 20     (if t..... t 
6920: 0a 09 09 09 09 20 28 62 65 67 69 6e 0a 09 09 09  ..... (begin....
6930: 09 20 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d  .   (twiki:save-
6940: 74 69 64 64 6c 65 72 20 74 64 62 20 74 6e 61 6d  tiddler tdb tnam
6950: 65 20 28 63 6f 6e 63 20 22 21 22 20 74 6e 61 6d  e (conc "!" tnam
6960: 65 29 20 22 22 20 77 69 64 20 28 74 77 69 6b 69  e) "" wid (twiki
6970: 3a 67 65 74 2d 69 64 29 29 0a 09 09 09 09 20 20  :get-id)).....  
6980: 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64   (twiki:get-tidd
6990: 6c 65 72 2d 62 79 2d 6e 61 6d 65 20 74 64 62 20  ler-by-name tdb 
69a0: 77 69 64 20 74 6e 61 6d 65 29 29 29 29 0a 09 09  wid tname))))...
69b0: 09 20 20 20 23 66 29 29 0a 09 20 29 20 3b 3b 20  .   #f)).. ) ;; 
69c0: 69 6d 61 67 65 20 69 73 20 74 68 65 20 64 61 74  image is the dat
69d0: 5f 69 64 2c 20 6b 65 65 70 20 69 74 20 73 69 6d  _id, keep it sim
69e0: 70 6c 65 20 73 69 6c 6c 79 2e 0a 0a 20 20 20 20  ple silly...    
69f0: 28 74 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d  (twiki:wiki-set-
6a00: 77 69 64 21 20 20 77 69 6b 69 64 61 74 20 77 69  wid!  wikidat wi
6a10: 64 29 0a 20 20 20 20 28 74 77 69 6b 69 3a 77 69  d).    (twiki:wi
6a20: 6b 69 2d 73 65 74 2d 6b 65 79 21 20 20 77 69 6b  ki-set-key!  wik
6a30: 69 64 61 74 20 74 6b 65 79 29 0a 20 20 20 20 28  idat tkey).    (
6a40: 74 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 6e  twiki:wiki-set-n
6a50: 61 6d 65 21 20 77 69 6b 69 64 61 74 20 6e 61 6d  ame! wikidat nam
6a60: 65 29 0a 20 20 20 20 28 74 77 69 6b 69 3a 77 69  e).    (twiki:wi
6a70: 6b 69 2d 73 65 74 2d 64 62 68 21 20 20 77 69 6b  ki-set-dbh!  wik
6a80: 69 64 61 74 20 74 64 62 29 0a 20 20 20 20 28 74  idat tdb).    (t
6a90: 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 70 65  wiki:wiki-set-pe
6aa0: 72 6d 73 21 20 77 69 6b 69 64 61 74 20 70 65 72  rms! wikidat per
6ab0: 6d 73 29 0a 0a 20 20 20 20 3b 3b 20 28 73 3a 6c  ms)..    ;; (s:l
6ac0: 6f 67 20 22 65 64 69 74 2d 74 6d 65 6e 75 2d 69  og "edit-tmenu-i
6ad0: 64 3a 20 22 20 65 64 69 74 2d 74 6d 65 6e 75 2d  d: " edit-tmenu-
6ae0: 69 64 20 22 20 65 64 69 74 2d 74 69 64 64 6c 65  id " edit-tiddle
6af0: 72 3a 20 22 20 65 64 69 74 2d 74 69 64 64 6c 65  r: " edit-tiddle
6b00: 72 29 0a 0a 20 20 20 20 3b 3b 20 48 61 6e 64 6c  r)..    ;; Handl
6b10: 65 20 6f 74 68 65 72 20 55 52 49 20 63 6f 6d 6d  e other URI comm
6b20: 61 6e 64 73 20 68 65 72 65 0a 20 20 20 20 28 69  ands here.    (i
6b30: 66 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22  f (s:get-param "
6b40: 63 61 6e 63 65 6c 5f 74 65 64 69 74 22 29 20 3b  cancel_tedit") ;
6b50: 3b 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  ; doesn't matter
6b60: 20 77 68 69 63 68 20 74 69 64 64 6c 65 72 20 2d   which tiddler -
6b70: 20 6a 75 73 74 20 75 73 65 20 74 68 69 73 20 74   just use this t
6b80: 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 65 64 69  o cancel any edi
6b90: 74 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 73 3a  t..(begin..  (s:
6ba0: 64 65 6c 21 20 28 63 6f 6e 63 20 22 43 55 52 52  del! (conc "CURR
6bb0: 45 4e 54 5f 54 57 49 44 4c 45 52 5f 55 4e 44 45  ENT_TWIDLER_UNDE
6bc0: 52 5f 45 44 49 54 3a 22 20 77 69 64 29 29 0a 09  R_EDIT:" wid))..
6bd0: 20 20 28 73 65 74 21 20 65 64 69 74 2d 74 69 64    (set! edit-tid
6be0: 64 6c 65 72 20 23 66 29 0a 09 20 20 28 73 65 74  dler #f)..  (set
6bf0: 21 20 74 6e 75 6d 65 64 69 74 20 23 66 29 0a 09  ! tnumedit #f)..
6c00: 20 20 28 73 65 74 21 20 76 69 65 77 2d 74 69 64    (set! view-tid
6c10: 64 6c 65 72 20 23 66 29 0a 09 20 20 28 74 77 69  dler #f)..  (twi
6c20: 6b 69 3a 6e 6f 72 6d 61 6c 69 7a 65 2d 63 75 72  ki:normalize-cur
6c30: 72 65 6e 74 2d 74 77 69 64 64 6c 65 72 73 20 74  rent-twiddlers t
6c40: 64 62 20 77 69 64 29 0a 09 20 20 28 69 66 20 28  db wid)..  (if (
6c50: 73 3a 67 65 74 20 63 76 61 72 29 0a 09 20 20 20  s:get cvar)..   
6c60: 20 20 20 28 73 65 74 21 20 74 64 6c 6e 75 6d 73     (set! tdlnums
6c70: 20 28 6d 61 70 20 73 74 72 69 6e 67 2d 3e 6e 75   (map string->nu
6c80: 6d 62 65 72 20 28 73 74 72 69 6e 67 2d 73 70 6c  mber (string-spl
6c90: 69 74 20 28 73 3a 67 65 74 20 63 76 61 72 29 20  it (s:get cvar) 
6ca0: 22 2c 22 29 29 29 29 29 29 0a 20 20 20 20 28 69  ",")))))).    (i
6cb0: 66 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22  f (s:get-param "
6cc0: 64 65 6c 65 74 65 5f 74 69 64 64 6c 65 72 22 29  delete_tiddler")
6cd0: 20 27 28 29 29 0a 20 20 20 20 3b 3b 20 28 74 77   '()).    ;; (tw
6ce0: 69 6b 69 3a 64 65 6c 65 74 65 5f 74 69 64 64 6c  iki:delete_tiddl
6cf0: 65 72 20 74 64 62 20 77 69 64 20 28 73 74 72 69  er tdb wid (stri
6d00: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65  ng->number (s:ge
6d10: 74 2d 70 61 72 61 6d 20 22 64 65 6c 65 74 65 5f  t-param "delete_
6d20: 74 69 64 64 6c 65 72 22 29 29 29 29 0a 0a 20 20  tiddler"))))..  
6d30: 20 20 28 73 3a 73 65 74 21 20 22 54 57 49 4b 49    (s:set! "TWIKI
6d40: 5f 4b 45 59 22 20 74 6b 65 79 29 20 3b 3b 20 74  _KEY" tkey) ;; t
6d50: 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  his mechanism wi
6d60: 6c 6c 20 66 61 69 6c 20 66 6f 72 20 68 69 65 72  ll fail for hier
6d70: 61 72 63 68 69 61 6c 20 74 77 69 6b 69 73 0a 20  archial twikis. 
6d80: 20 20 20 3b 3b 20 6f 76 65 72 72 69 64 65 20 74     ;; override t
6d90: 68 65 20 74 77 69 64 64 6c 65 72 20 74 6f 20 65  he twiddler to e
6da0: 64 69 74 20 77 68 65 6e 20 65 64 69 74 69 6e 67  dit when editing
6db0: 20 4d 61 69 6e 4d 65 6e 75 0a 20 20 20 20 28 69   MainMenu.    (i
6dc0: 66 20 65 64 69 74 2d 74 69 64 64 6c 65 72 0a 09  f edit-tiddler..
6dd0: 28 62 65 67 69 6e 0a 09 20 20 28 73 65 74 21 20  (begin..  (set! 
6de0: 74 6e 75 6d 65 64 69 74 20 28 74 77 69 6b 69 3a  tnumedit (twiki:
6df0: 74 69 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 65  tiddler-get-id e
6e00: 64 69 74 2d 74 69 64 64 6c 65 72 29 29 0a 09 20  dit-tiddler)).. 
6e10: 20 28 73 3a 73 65 74 21 20 27 74 77 69 6b 69 5f   (s:set! 'twiki_
6e20: 74 69 74 6c 65 20 28 74 77 69 6b 69 3a 74 69 64  title (twiki:tid
6e30: 64 6c 65 72 2d 67 65 74 2d 6e 61 6d 65 20 65 64  dler-get-name ed
6e40: 69 74 2d 74 69 64 64 6c 65 72 29 29 0a 09 20 20  it-tiddler))..  
6e50: 28 73 3a 73 65 74 21 20 27 74 77 69 6b 69 5f 62  (s:set! 'twiki_b
6e60: 6f 64 79 20 20 28 74 77 69 6b 69 3a 67 65 74 2d  ody  (twiki:get-
6e70: 64 61 74 20 74 64 62 20 28 74 77 69 6b 69 3a 74  dat tdb (twiki:t
6e80: 69 64 64 6c 65 72 2d 67 65 74 2d 64 61 74 2d 69  iddler-get-dat-i
6e90: 64 20 65 64 69 74 2d 74 69 64 64 6c 65 72 29 29  d edit-tiddler))
6ea0: 29 29 29 0a 20 20 20 20 28 69 66 20 76 69 65 77  ))).    (if view
6eb0: 2d 74 69 64 64 6c 65 72 0a 09 28 62 65 67 69 6e  -tiddler..(begin
6ec0: 0a 09 20 20 28 73 65 74 21 20 74 6e 75 6d 76 69  ..  (set! tnumvi
6ed0: 65 77 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65  ew (twiki:tiddle
6ee0: 72 2d 67 65 74 2d 69 64 20 76 69 65 77 2d 74 69  r-get-id view-ti
6ef0: 64 64 6c 65 72 29 29 29 29 0a 20 20 20 20 0a 20  ddler)))).    . 
6f00: 20 20 20 3b 3b 20 4e 4f 57 20 57 48 41 54 20 46     ;; NOW WHAT F
6f10: 4f 52 20 56 49 45 57 20 2d 20 66 69 78 20 74 68  OR VIEW - fix th
6f20: 65 20 6c 69 6e 6b 73 2c 20 61 64 64 20 74 6f 20  e links, add to 
6f30: 74 64 6c 73 74 0a 0a 0a 20 20 20 20 28 69 66 20  tdlst...    (if 
6f40: 65 64 69 74 2d 74 6d 65 6e 75 2d 69 64 20 20 20  edit-tmenu-id   
6f50: 28 73 65 74 21 20 74 6e 75 6d 65 64 69 74 20 65  (set! tnumedit e
6f60: 64 69 74 2d 74 6d 65 6e 75 2d 69 64 29 29 0a 20  dit-tmenu-id)). 
6f70: 20 20 20 28 69 66 20 74 6e 75 6d 65 64 69 74 20     (if tnumedit 
6f80: 28 73 65 74 21 20 74 64 6c 6e 75 6d 73 20 28 63  (set! tdlnums (c
6f90: 6f 6e 73 20 74 6e 75 6d 65 64 69 74 20 74 64 6c  ons tnumedit tdl
6fa0: 6e 75 6d 73 29 29 29 0a 20 20 20 20 28 69 66 20  nums))).    (if 
6fb0: 74 6e 75 6d 76 69 65 77 20 28 73 65 74 21 20 74  tnumview (set! t
6fc0: 64 6c 6e 75 6d 73 20 28 63 6f 6e 73 20 74 6e 75  dlnums (cons tnu
6fd0: 6d 76 69 65 77 20 74 64 6c 6e 75 6d 73 29 29 29  mview tdlnums)))
6fe0: 0a 20 20 20 20 28 73 65 74 21 20 74 64 6c 72 73  .    (set! tdlrs
6ff0: 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64   (twiki:get-tidd
7000: 6c 65 72 73 2d 62 79 2d 6e 75 6d 20 74 64 62 20  lers-by-num tdb 
7010: 77 69 64 20 74 64 6c 6e 75 6d 73 29 29 0a 0a 20  wid tdlnums)).. 
7020: 20 20 20 3b 3b 20 72 65 6d 6f 76 65 20 74 64 6c     ;; remove tdl
7030: 72 73 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  rs from the list
7040: 20 69 66 20 63 6c 6f 73 65 5f 74 69 64 64 6c 65   if close_tiddle
7050: 72 20 63 61 6c 6c 65 64 0a 20 20 20 20 28 69 66  r called.    (if
7060: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 63   (s:get-param "c
7070: 6c 6f 73 65 5f 74 69 64 64 6c 65 72 22 29 0a 09  lose_tiddler")..
7080: 28 73 65 74 21 20 74 64 6c 72 73 20 28 6c 65 74  (set! tdlrs (let
7090: 20 28 28 74 6e 75 6d 20 28 73 74 72 69 6e 67 2d   ((tnum (string-
70a0: 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65 74 2d 70  >number (s:get-p
70b0: 61 72 61 6d 20 22 63 6c 6f 73 65 5f 74 69 64 64  aram "close_tidd
70c0: 6c 65 72 22 29 29 29 29 0a 09 09 20 20 20 20 20  ler"))))...     
70d0: 20 28 72 65 6d 6f 76 65 20 28 6c 61 6d 62 64 61   (remove (lambda
70e0: 20 28 74 29 0a 09 09 09 09 28 65 71 75 61 6c 3f   (t).....(equal?
70f0: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
7100: 67 65 74 2d 69 64 20 74 29 20 74 6e 75 6d 29 29  get-id t) tnum))
7110: 0a 09 09 09 20 20 20 20 20 20 74 64 6c 72 73 29  ....      tdlrs)
7120: 29 29 29 0a 0a 20 20 20 20 3b 3b 20 72 65 6d 6f  )))..    ;; remo
7130: 76 65 20 61 6c 6c 20 6f 74 68 65 72 73 20 69 66  ve all others if
7140: 20 63 6c 6f 73 65 5f 6f 74 68 65 72 5f 74 69 64   close_other_tid
7150: 64 6c 65 72 73 20 63 61 6c 6c 65 64 0a 20 20 20  dlers called.   
7160: 20 28 69 66 20 28 73 3a 67 65 74 2d 70 61 72 61   (if (s:get-para
7170: 6d 20 22 63 6c 6f 73 65 5f 6f 74 68 65 72 5f 74  m "close_other_t
7180: 69 64 64 6c 65 72 73 22 29 0a 09 28 73 65 74 21  iddlers")..(set!
7190: 20 74 64 6c 72 73 20 28 6c 65 74 20 28 28 74 6e   tdlrs (let ((tn
71a0: 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62  um (string->numb
71b0: 65 72 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20  er (s:get-param 
71c0: 22 63 6c 6f 73 65 5f 6f 74 68 65 72 5f 74 69 64  "close_other_tid
71d0: 64 6c 65 72 73 22 29 29 29 29 0a 09 09 20 20 20  dlers"))))...   
71e0: 20 20 20 28 72 65 6d 6f 76 65 20 28 6c 61 6d 62     (remove (lamb
71f0: 64 61 20 28 74 29 0a 09 09 09 09 28 6e 6f 74 20  da (t).....(not 
7200: 28 65 71 75 61 6c 3f 20 28 74 77 69 6b 69 3a 74  (equal? (twiki:t
7210: 69 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 29  iddler-get-id t)
7220: 20 74 6e 75 6d 29 29 29 0a 09 09 09 20 20 20 20   tnum)))....    
7230: 20 20 74 64 6c 72 73 29 29 29 29 0a 20 20 20 20    tdlrs)))).    
7240: 0a 20 20 20 20 28 73 3a 73 65 74 21 20 63 76 61  .    (s:set! cva
7250: 72 20 28 74 77 69 6b 69 3a 6d 61 6b 65 2d 74 69  r (twiki:make-ti
7260: 64 64 6c 65 72 2d 6c 69 73 74 20 74 64 6c 72 73  ddler-list tdlrs
7270: 29 29 0a 20 20 20 20 28 69 66 20 74 6e 75 6d 65  )).    (if tnume
7280: 64 69 74 20 0a 09 28 73 3a 73 65 74 21 20 63 76  dit ..(s:set! cv
7290: 61 72 2d 65 64 20 74 6e 75 6d 65 64 69 74 29 0a  ar-ed tnumedit).
72a0: 09 28 73 3a 64 65 6c 21 20 63 76 61 72 2d 65 64  .(s:del! cvar-ed
72b0: 29 29 0a 0a 20 20 20 20 3b 3b 20 6d 75 73 74 20  ))..    ;; must 
72c0: 68 61 76 65 20 61 20 4d 61 69 6e 4d 65 6e 75 20  have a MainMenu 
72d0: 74 69 64 64 6c 65 72 20 62 79 20 6e 6f 77 0a 20  tiddler by now. 
72e0: 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6c 6d     (if (null? lm
72f0: 65 6e 75 29 0a 09 28 62 65 67 69 6e 0a 09 20 20  enu)..(begin..  
7300: 28 74 77 69 6b 69 3a 73 61 76 65 2d 74 69 64 64  (twiki:save-tidd
7310: 6c 65 72 20 74 64 62 20 22 4d 61 69 6e 4d 65 6e  ler tdb "MainMen
7320: 75 22 20 22 22 20 22 22 20 77 69 64 20 28 74 77  u" "" "" wid (tw
7330: 69 6b 69 3a 67 65 74 2d 69 64 29 29 0a 09 20 20  iki:get-id))..  
7340: 28 73 65 74 21 20 6c 6d 65 6e 75 20 28 74 77 69  (set! lmenu (twi
7350: 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65 72 73 20  ki:get-tiddlers 
7360: 74 64 62 20 77 69 64 20 28 6c 69 73 74 20 22 4d  tdb wid (list "M
7370: 61 69 6e 4d 65 6e 75 22 29 29 29 29 29 0a 20 20  ainMenu"))))).  
7380: 20 20 0a 20 20 20 20 3b 3b 20 67 65 74 20 74 68    .    ;; get th
7390: 65 20 74 69 64 64 6c 65 72 73 20 66 72 6f 6d 20  e tiddlers from 
73a0: 74 68 65 20 64 62 20 6e 6f 77 0a 20 20 20 20 28  the db now.    (
73b0: 73 65 74 21 20 72 65 73 75 6c 74 0a 09 20 20 28  set! result..  (
73c0: 73 3a 64 69 76 20 27 63 6c 61 73 73 20 22 74 77  s:div 'class "tw
73d0: 69 6b 69 22 0a 09 20 20 20 3b 3b 20 66 6c 6f 61  iki"..   ;; floa
73e0: 74 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 74  t to the right t
73f0: 68 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 6e 75 0a  he control menu.
7400: 09 20 20 20 28 73 3a 64 69 76 20 27 63 6c 61 73  .   (s:div 'clas
7410: 73 20 22 74 77 69 6b 69 2d 6d 61 69 6e 2d 6d 65  s "twiki-main-me
7420: 6e 75 22 20 28 74 77 69 6b 69 3a 6d 61 69 6e 74  nu" (twiki:maint
7430: 5f 61 72 65 61 20 74 64 62 20 77 69 64 20 74 6b  _area tdb wid tk
7440: 65 79 20 77 69 6b 69 64 61 74 29 29 0a 09 20 20  ey wikidat))..  
7450: 20 28 74 77 69 6b 69 3a 76 69 65 77 2d 74 69 64   (twiki:view-tid
7460: 64 6c 65 72 20 74 64 62 20 20 74 6b 65 79 20 77  dler tdb  tkey w
7470: 69 64 20 28 63 61 72 20 6c 6d 65 6e 75 29 20 77  id (car lmenu) w
7480: 69 6b 69 64 61 74 29 0a 09 20 20 20 3b 3b 20 74  ikidat)..   ;; t
7490: 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20  his is probably 
74a0: 6e 6f 74 20 6e 65 65 64 65 64 20 61 73 20 74 68  not needed as th
74b0: 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
74c0: 20 74 6f 20 63 72 65 61 74 65 20 74 69 64 64 6c   to create tiddl
74d0: 65 72 73 20 74 68 69 73 20 77 61 79 0a 09 20 20  ers this way..  
74e0: 20 3b 3b 20 28 69 66 20 28 65 71 3f 20 74 6e 75   ;; (if (eq? tnu
74f0: 6d 65 64 69 74 20 2d 31 29 28 74 77 69 6b 69 3a  medit -1)(twiki:
7500: 65 64 69 74 2d 74 69 64 64 6c 65 72 20 74 64 62  edit-tiddler tdb
7510: 20 74 6b 65 79 20 77 69 64 20 74 6e 75 6d 65 64   tkey wid tnumed
7520: 69 74 29 20 27 28 29 29 0a 09 20 20 20 3b 3b 20  it) '())..   ;; 
7530: 69 6e 73 65 72 74 20 74 68 65 20 70 69 63 74 75  insert the pictu
7540: 72 65 20 65 64 69 74 6f 72 20 77 69 6e 64 6f 77  re editor window
7550: 20 69 66 20 65 6e 61 62 6c 65 64 0a 09 20 20 20   if enabled..   
7560: 28 69 66 20 28 65 71 75 61 6c 3f 20 28 73 3a 67  (if (equal? (s:g
7570: 65 74 2d 70 61 72 61 6d 20 22 74 77 69 6b 69 5f  et-param "twiki_
7580: 6d 61 69 6e 74 22 29 20 22 32 22 29 28 74 77 69  maint") "2")(twi
7590: 6b 69 3a 70 69 63 5f 6d 67 6d 74 20 74 64 62 20  ki:pic_mgmt tdb 
75a0: 77 69 64 20 74 6b 65 79 29 20 27 28 29 29 0a 09  wid tkey) '())..
75b0: 20 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 28     (if (equal? (
75c0: 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 74 77 69  s:get-param "twi
75d0: 6b 69 5f 6d 61 69 6e 74 22 29 20 22 34 22 29 28  ki_maint") "4")(
75e0: 74 77 69 6b 69 3a 68 65 6c 70 20 31 29 20 27 28  twiki:help 1) '(
75f0: 29 29 0a 09 20 20 20 28 69 66 20 28 6e 6f 74 20  ))..   (if (not 
7600: 28 6e 75 6c 6c 3f 20 74 64 6c 72 73 29 29 0a 09  (null? tdlrs))..
7610: 20 20 20 20 20 20 20 28 6d 61 70 20 28 6c 61 6d         (map (lam
7620: 62 64 61 20 28 74 64 6c 72 29 0a 09 09 20 20 20  bda (tdlr)...   
7630: 20 20 20 28 6c 65 74 20 28 28 74 6e 75 6d 20 20     (let ((tnum  
7640: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67  (twiki:tiddler-g
7650: 65 74 2d 69 64 20 74 64 6c 72 29 29 29 0a 09 09  et-id tdlr)))...
7660: 09 28 73 3a 6c 6f 67 20 22 74 6e 75 6d 3a 20 22  .(s:log "tnum: "
7670: 20 74 6e 75 6d 20 22 20 74 6e 75 6d 65 64 69 74   tnum " tnumedit
7680: 3a 20 22 20 74 6e 75 6d 65 64 69 74 29 0a 09 09  : " tnumedit)...
7690: 09 28 69 66 20 28 61 6e 64 20 74 6e 75 6d 65 64  .(if (and tnumed
76a0: 69 74 20 28 6e 6f 74 20 74 65 64 69 74 65 64 29  it (not tedited)
76b0: 20 28 65 71 75 61 6c 3f 20 74 6e 75 6d 65 64 69   (equal? tnumedi
76c0: 74 20 74 6e 75 6d 29 29 0a 09 09 09 20 20 20 20  t tnum))....    
76d0: 28 62 65 67 69 6e 0a 09 09 09 20 20 20 20 20 20  (begin....      
76e0: 28 73 65 74 21 20 74 65 64 69 74 65 64 20 23 74  (set! tedited #t
76f0: 29 20 3b 3b 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  ) ;; only allow 
7700: 65 64 69 74 69 6e 67 20 6f 6e 65 20 74 69 64 64  editing one tidd
7710: 6c 65 72 20 61 74 20 61 20 74 69 6d 65 0a 09 09  ler at a time...
7720: 09 20 20 20 20 20 20 28 74 77 69 6b 69 3a 65 64  .      (twiki:ed
7730: 69 74 2d 74 69 64 64 6c 65 72 20 74 64 62 20 74  it-tiddler tdb t
7740: 6b 65 79 20 77 69 64 20 74 6e 75 6d 29 29 0a 09  key wid tnum))..
7750: 09 09 20 20 20 20 28 74 77 69 6b 69 3a 76 69 65  ..    (twiki:vie
7760: 77 2d 74 69 64 64 6c 65 72 20 74 64 62 20 20 74  w-tiddler tdb  t
7770: 6b 65 79 20 77 69 64 20 74 64 6c 72 20 77 69 6b  key wid tdlr wik
7780: 69 64 61 74 29 29 29 29 0a 09 09 20 20 20 20 74  idat))))...    t
7790: 64 6c 72 73 29 0a 09 20 20 20 20 20 20 20 27 28  dlrs)..       '(
77a0: 29 29 29 29 0a 20 20 20 20 28 64 62 69 3a 63 6c  )))).    (dbi:cl
77b0: 6f 73 65 20 74 64 62 29 0a 20 20 20 20 72 65 73  ose tdb).    res
77c0: 75 6c 74 29 29 0a 0a 3b 3b 20 73 68 6f 75 6c 64  ult))..;; should
77d0: 20 64 6f 20 61 20 73 69 6e 67 6c 65 20 6d 6f 72   do a single mor
77e0: 65 20 65 66 66 69 63 69 65 6e 74 20 71 75 65 72  e efficient quer
77f0: 79 20 62 75 74 20 74 68 69 73 20 69 73 20 67 6f  y but this is go
7800: 6f 64 20 65 6e 6f 75 67 68 0a 28 64 65 66 69 6e  od enough.(defin
7810: 65 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64  e (twiki:get-tid
7820: 64 6c 65 72 73 20 64 62 20 77 69 64 20 74 6e 61  dlers db wid tna
7830: 6d 65 73 29 0a 20 20 28 61 70 70 6c 79 20 74 77  mes).  (apply tw
7840: 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65 72 73  iki:get-tiddlers
7850: 2d 62 79 2d 6e 61 6d 65 20 64 62 20 77 69 64 20  -by-name db wid 
7860: 74 6e 61 6d 65 73 29 29 0a 3b 3b 20 20 20 28 6c  tnames)).;;   (l
7870: 65 74 2a 20 28 28 74 64 6c 72 73 20 27 28 29 29  et* ((tdlrs '())
7880: 0a 3b 3b 20 09 20 3b 3b 20 28 63 6f 6e 6e 20 20  .;; . ;; (conn  
7890: 20 28 73 64 61 74 2d 67 65 74 2d 63 6f 6e 6e 20   (sdat-get-conn 
78a0: 73 3a 73 65 73 73 69 6f 6e 29 29 0a 3b 3b 20 09  s:session)).;; .
78b0: 20 28 6e 61 6d 65 6c 73 74 20 28 63 6f 6e 63 20   (namelst (conc 
78c0: 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74  "('" (string-int
78d0: 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 63 6f  ersperse (map co
78e0: 6e 63 20 74 6e 61 6d 65 73 29 20 22 27 2c 27 22  nc tnames) "','"
78f0: 29 20 22 27 29 22 29 29 0a 3b 3b 20 09 20 28 71  ) "')")).;; . (q
7900: 72 79 20 20 20 20 20 28 63 6f 6e 63 20 74 77 69  ry     (conc twi
7910: 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 6c 65 63  ki:tiddler-selec
7920: 74 6f 72 20 22 20 57 48 45 52 45 20 74 2e 77 69  tor " WHERE t.wi
7930: 6b 69 5f 69 64 3d 3f 20 41 4e 44 20 74 2e 69 64  ki_id=? AND t.id
7940: 20 49 4e 20 22 20 6e 61 6d 65 6c 73 74 20 22 3b   IN " namelst ";
7950: 22 29 29 29 0a 3b 3b 20 20 20 20 20 3b 3b 20 28  "))).;;     ;; (
7960: 70 72 69 6e 74 20 71 72 79 29 0a 3b 3b 20 20 20  print qry).;;   
7970: 20 20 28 64 62 69 3a 66 6f 72 2d 65 61 63 68 2d    (dbi:for-each-
7980: 72 6f 77 0a 3b 3b 20 20 20 20 20 20 28 6c 61 6d  row.;;      (lam
7990: 62 64 61 20 28 72 6f 77 29 0a 3b 3b 20 20 20 20  bda (row).;;    
79a0: 20 20 20 20 28 73 65 74 21 20 74 64 6c 72 73 20      (set! tdlrs 
79b0: 28 63 6f 6e 73 20 72 6f 77 20 74 64 6c 72 73 29  (cons row tdlrs)
79c0: 29 29 0a 3b 3b 20 20 20 20 20 20 64 62 20 71 72  )).;;      db qr
79d0: 79 20 77 69 64 29 0a 3b 3b 20 20 20 20 20 28 72  y wid).;;     (r
79e0: 65 76 65 72 73 65 20 74 64 6c 72 73 29 29 29 20  everse tdlrs))) 
79f0: 3b 3b 20 21 54 77 69 6b 69 5c 0a 0a 3b 3b 20 74  ;; !Twiki\..;; t
7a00: 6c 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  lst is a list of
7a10: 20 74 69 64 64 6c 65 72 20 6e 75 6d 73 0a 28 64   tiddler nums.(d
7a20: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74  efine (twiki:get
7a30: 2d 74 69 64 64 6c 65 72 73 2d 62 79 2d 6e 75 6d  -tiddlers-by-num
7a40: 20 64 62 20 77 69 64 20 74 6c 73 74 29 0a 20 20   db wid tlst).  
7a50: 3b 3b 20 28 73 3a 6c 6f 67 20 22 47 6f 74 20 74  ;; (s:log "Got t
7a60: 6f 20 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64  o twiki:get-tidd
7a70: 6c 65 72 73 20 77 69 74 68 20 6b 65 79 73 3a 20  lers with keys: 
7a80: 22 20 74 6c 73 74 20 22 20 61 6e 64 20 77 69 64  " tlst " and wid
7a90: 3a 20 22 20 77 69 64 29 0a 20 20 3b 3b 20 73 65  : " wid).  ;; se
7aa0: 6c 65 63 74 20 77 68 65 72 65 20 63 72 65 61 74  lect where creat
7ab0: 65 64 5f 6f 6e 20 3c 20 73 6f 6d 65 64 61 74 65  ed_on < somedate
7ac0: 20 6f 72 64 65 72 20 62 79 20 63 72 65 61 74 65   order by create
7ad0: 64 5f 6f 6e 20 64 65 73 63 20 6c 69 6d 69 74 20  d_on desc limit 
7ae0: 31 0a 20 20 28 6c 65 74 2a 20 28 28 74 64 6c 72  1.  (let* ((tdlr
7af0: 73 20 27 28 29 29 0a 09 20 28 74 6c 73 74 73 74  s '()).. (tlstst
7b00: 72 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73  r (string-inters
7b10: 70 65 72 73 65 20 28 6d 61 70 20 6e 75 6d 62 65  perse (map numbe
7b20: 72 2d 3e 73 74 72 69 6e 67 20 74 6c 73 74 29 20  r->string tlst) 
7b30: 22 2c 22 29 29 0a 09 20 28 61 6c 72 65 61 64 79  ",")).. (already
7b40: 2d 67 6f 74 20 28 6d 61 6b 65 2d 68 61 73 68 2d  -got (make-hash-
7b50: 74 61 62 6c 65 29 29 0a 09 20 28 71 72 79 20 20  table)).. (qry  
7b60: 20 20 28 63 6f 6e 63 20 74 77 69 6b 69 3a 74 69    (conc twiki:ti
7b70: 64 64 6c 65 72 2d 73 65 6c 65 63 74 6f 72 20 22  ddler-selector "
7b80: 20 57 48 45 52 45 20 74 2e 77 69 6b 69 5f 69 64   WHERE t.wiki_id
7b90: 3d 3f 20 41 4e 44 20 74 2e 69 64 20 49 4e 20 28  =? AND t.id IN (
7ba0: 22 20 74 6c 73 74 73 74 72 20 22 29 20 4f 52 44  " tlststr ") ORD
7bb0: 45 52 20 42 59 20 63 72 65 61 74 65 64 5f 6f 6e  ER BY created_on
7bc0: 20 44 45 53 43 3b 22 29 29 29 0a 20 20 20 20 28   DESC;"))).    (
7bd0: 64 62 69 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  dbi:for-each-row
7be0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72  .     (lambda (r
7bf0: 6f 77 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20  ow).       (let 
7c00: 28 28 74 6e 61 6d 65 20 28 74 77 69 6b 69 3a 74  ((tname (twiki:t
7c10: 69 64 64 6c 65 72 2d 67 65 74 2d 6e 61 6d 65 20  iddler-get-name 
7c20: 72 6f 77 29 29 29 0a 09 20 28 69 66 20 28 6e 6f  row))).. (if (no
7c30: 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65  t (hash-table-re
7c40: 66 2f 64 65 66 61 75 6c 74 20 61 6c 72 65 61 64  f/default alread
7c50: 79 2d 67 6f 74 20 74 6e 61 6d 65 20 23 66 29 29  y-got tname #f))
7c60: 0a 09 20 20 20 20 20 28 62 65 67 69 6e 0a 09 20  ..     (begin.. 
7c70: 20 20 20 20 20 20 28 73 65 74 21 20 74 64 6c 72        (set! tdlr
7c80: 73 20 28 63 6f 6e 73 20 72 6f 77 20 74 64 6c 72  s (cons row tdlr
7c90: 73 29 29 0a 09 20 20 20 20 20 20 20 28 68 61 73  s))..       (has
7ca0: 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 61 6c 72  h-table-set! alr
7cb0: 65 61 64 79 2d 67 6f 74 20 74 6e 61 6d 65 20 23  eady-got tname #
7cc0: 74 29 29 29 29 29 0a 20 20 20 20 20 64 62 20 71  t))))).     db q
7cd0: 72 79 20 77 69 64 29 0a 20 20 20 20 28 69 66 20  ry wid).    (if 
7ce0: 28 6e 75 6c 6c 3f 20 74 64 6c 72 73 29 20 74 64  (null? tdlrs) td
7cf0: 6c 72 73 20 28 72 65 76 65 72 73 65 20 74 64 6c  lrs (reverse tdl
7d00: 72 73 29 29 29 29 20 3b 3b 20 21 54 77 69 6b 69  rs)))) ;; !Twiki
7d10: 5c 6e 54 69 74 6c 65 2c 20 70 69 63 74 75 72 65  \nTitle, picture
7d20: 73 2c 20 65 74 63 2e 5c 6e 7b 7b 7b 5c 6e 43 6f  s, etc.\n{{{\nCo
7d30: 64 65 5c 6e 7d 7d 7d 5c 6e 5b 5b 6c 69 6e 6b 73  de\n}}}\n[[links
7d40: 5d 5d 5c 6e 7c 74 61 62 6c 65 7c 6f 66 7c 73 74  ]]\n|table|of|st
7d50: 75 66 66 7c 5c 6e 7c 6d 6f 72 65 7c 73 74 75 66  uff|\n|more|stuf
7d60: 66 7c 68 65 72 65 7c 5c 6e 22 29 29 0a 0a 3b 3b  f|here|\n"))..;;
7d70: 20 77 69 64 20 3d 20 77 69 6b 69 20 69 64 0a 3b   wid = wiki id.;
7d80: 3b 20 72 65 74 75 72 6e 73 20 61 20 6c 69 73 74  ; returns a list
7d90: 20 6f 66 20 74 77 69 6b 69 3a 74 69 64 64 6c 65   of twiki:tiddle
7da0: 72 73 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  rs.(define (twik
7db0: 69 3a 67 65 74 2d 74 69 64 64 6c 65 72 73 2d 62  i:get-tiddlers-b
7dc0: 79 2d 6e 61 6d 65 20 74 64 62 20 77 69 64 20 2e  y-name tdb wid .
7dd0: 20 6e 61 6d 65 73 29 0a 20 20 28 6c 65 74 20 28   names).  (let (
7de0: 28 74 64 6c 72 73 20 27 28 29 29 29 0a 20 20 20  (tdlrs '())).   
7df0: 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62   (for-each (lamb
7e00: 64 61 20 28 6e 61 6d 65 29 0a 09 09 28 6c 65 74  da (name)...(let
7e10: 20 28 28 74 64 6c 72 20 28 74 77 69 6b 69 3a 67   ((tdlr (twiki:g
7e20: 65 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61  et-tiddler-by-na
7e30: 6d 65 20 74 64 62 20 77 69 64 20 6e 61 6d 65 29  me tdb wid name)
7e40: 29 29 0a 09 09 20 20 28 69 66 20 74 64 6c 72 20  ))...  (if tdlr 
7e50: 28 73 65 74 21 20 74 64 6c 72 73 20 28 63 6f 6e  (set! tdlrs (con
7e60: 73 20 74 64 6c 72 20 74 64 6c 72 73 29 29 29 29  s tdlr tdlrs))))
7e70: 29 0a 09 20 20 20 20 20 20 6e 61 6d 65 73 29 0a  )..      names).
7e80: 20 20 20 20 28 72 65 76 65 72 73 65 20 74 64 6c      (reverse tdl
7e90: 72 73 29 29 29 0a 3b 3b 20 77 69 74 68 20 74 68  rs))).;; with th
7ea0: 65 20 72 69 67 68 74 20 71 75 65 72 79 20 69 74  e right query it
7eb0: 20 73 68 6f 75 6c 64 20 62 65 20 70 6f 73 73 69   should be possi
7ec0: 62 6c 65 20 74 6f 20 64 6f 20 74 68 69 73 20 6d  ble to do this m
7ed0: 75 63 68 20 66 61 73 74 65 72 20 61 70 70 72 6f  uch faster appro
7ee0: 61 63 68 20 66 6f 72 20 74 77 69 6b 69 3a 67 65  ach for twiki:ge
7ef0: 74 2d 74 69 64 64 6c 65 72 73 2d 62 79 2d 6e 61  t-tiddlers-by-na
7f00: 6d 65 0a 3b 3b 20 20 20 28 6c 65 74 20 28 28 74  me.;;   (let ((t
7f10: 64 6c 72 73 20 27 28 29 29 0a 3b 3b 20 09 28 6e  dlrs '()).;; .(n
7f20: 61 6d 65 6c 73 74 20 28 63 6f 6e 63 20 22 28 27  amelst (conc "('
7f30: 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73  " (string-inters
7f40: 70 65 72 73 65 20 6e 61 6d 65 73 20 22 27 2c 27  perse names "','
7f50: 22 29 20 22 27 29 22 29 29 29 0a 3b 3b 20 20 20  ") "')"))).;;   
7f60: 20 20 28 64 62 69 3a 66 6f 72 2d 65 61 63 68 2d    (dbi:for-each-
7f70: 72 6f 77 0a 3b 3b 20 20 20 20 20 20 28 6c 61 6d  row.;;      (lam
7f80: 62 64 61 20 28 72 6f 77 29 0a 3b 3b 20 20 20 20  bda (row).;;    
7f90: 20 20 20 20 28 73 65 74 21 20 74 64 6c 72 73 20      (set! tdlrs 
7fa0: 28 63 6f 6e 73 20 72 6f 77 20 74 64 6c 72 73 29  (cons row tdlrs)
7fb0: 29 29 0a 3b 3b 20 20 20 20 20 20 74 64 62 0a 3b  )).;;      tdb.;
7fc0: 3b 20 20 20 20 20 20 28 63 6f 6e 63 20 74 77 69  ;      (conc twi
7fd0: 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 6c 65 63  ki:tiddler-selec
7fe0: 74 6f 72 20 22 20 57 48 45 52 45 20 74 2e 77 69  tor " WHERE t.wi
7ff0: 6b 69 5f 69 64 3d 3f 20 41 4e 44 20 74 2e 6e 61  ki_id=? AND t.na
8000: 6d 65 20 49 4e 20 22 20 6e 61 6d 65 6c 73 74 29  me IN " namelst)
8010: 20 77 69 64 29 0a 3b 3b 20 20 20 20 20 28 72 65   wid).;;     (re
8020: 76 65 72 73 65 20 74 64 6c 72 73 29 29 29 0a 0a  verse tdlrs)))..
8030: 3b 3b 20 67 65 74 20 74 68 65 20 74 69 64 64 6c  ;; get the tiddl
8040: 65 72 20 77 69 74 68 20 74 68 65 20 67 69 76 65  er with the give
8050: 6e 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6d  n name and the m
8060: 61 78 20 64 61 74 65 0a 28 64 65 66 69 6e 65 20  ax date.(define 
8070: 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c  (twiki:get-tiddl
8080: 65 72 2d 62 79 2d 6e 61 6d 65 20 74 64 62 20 77  er-by-name tdb w
8090: 69 64 20 6e 61 6d 65 29 0a 20 20 28 64 62 69 3a  id name).  (dbi:
80a0: 67 65 74 2d 6f 6e 65 2d 72 6f 77 20 74 64 62 20  get-one-row tdb 
80b0: 28 63 6f 6e 63 20 74 77 69 6b 69 3a 74 69 64 64  (conc twiki:tidd
80c0: 6c 65 72 2d 73 65 6c 65 63 74 6f 72 20 22 20 57  ler-selector " W
80d0: 48 45 52 45 20 74 2e 77 69 6b 69 5f 69 64 3d 3f  HERE t.wiki_id=?
80e0: 20 41 4e 44 20 74 2e 6e 61 6d 65 3d 3f 20 4f 52   AND t.name=? OR
80f0: 44 45 52 20 42 59 20 63 72 65 61 74 65 64 5f 6f  DER BY created_o
8100: 6e 20 44 45 53 43 20 4c 49 4d 49 54 20 31 3b 22  n DESC LIMIT 1;"
8110: 29 20 77 69 64 20 6e 61 6d 65 29 29 0a 0a 28 64  ) wid name))..(d
8120: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 74 69 64  efine (twiki:tid
8130: 64 6c 65 72 2d 6e 61 6d 65 2d 3e 69 64 20 64 62  dler-name->id db
8140: 20 74 6e 61 6d 65 29 0a 20 20 28 64 62 69 3a 67   tname).  (dbi:g
8150: 65 74 2d 6f 6e 65 20 64 62 20 22 53 45 4c 45 43  et-one db "SELEC
8160: 54 20 69 64 20 46 52 4f 4d 20 74 69 64 64 6c 65  T id FROM tiddle
8170: 72 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 3f 3b  rs WHERE name=?;
8180: 22 20 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d  " tname))..;;===
8190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
81a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
81b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
81c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
81d0: 3d 3d 3d 0a 3b 3b 20 74 77 69 6b 69 20 74 65 78  ===.;; twiki tex
81e0: 74 20 66 6f 72 6d 61 74 69 6e 67 2c 20 70 61 72  t formating, par
81f0: 73 69 6e 67 20 61 6e 64 20 64 69 73 70 6c 61 79  sing and display
8200: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
8210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 74 77  =========..;; tw
8250: 69 6b 69 20 66 6f 72 6d 61 74 69 6e 67 20 72 6f  iki formating ro
8260: 75 74 69 6e 65 73 20 28 6f 76 65 72 72 69 64 65  utines (override
8270: 20 74 68 65 73 65 20 74 6f 20 63 68 61 6e 67 65   these to change
8280: 20 79 6f 75 72 20 6c 6f 6f 6b 20 61 6e 64 20 66   your look and f
8290: 65 65 6c 0a 28 64 65 66 69 6e 65 20 74 77 69 6b  eel.(define twik
82a0: 69 3a 74 77 69 6b 69 2d 74 61 67 20 20 73 3a 62  i:twiki-tag  s:b
82b0: 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ).(define twiki:
82c0: 68 33 20 20 20 20 20 20 20 20 20 73 3a 68 33 29  h3         s:h3)
82d0: 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 68  .(define twiki:h
82e0: 32 20 20 20 20 20 20 20 20 20 73 3a 68 32 29 0a  2         s:h2).
82f0: 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 68 31  (define twiki:h1
8300: 20 20 20 20 20 20 20 20 20 73 3a 68 31 29 0a 3b           s:h1).;
8310: 3b 20 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ; (define twiki:
8320: 6d 61 6b 65 2d 74 6c 69 6e 6b 20 73 3a 69 29 0a  make-tlink s:i).
8330: 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 75 6c  (define twiki:ul
8340: 20 20 20 20 20 20 20 20 20 73 3a 75 6c 29 0a 28           s:ul).(
8350: 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 6f 6c 20  define twiki:ol 
8360: 20 20 20 20 20 20 20 20 73 3a 6f 6c 29 0a 28 64          s:ol).(d
8370: 65 66 69 6e 65 20 74 77 69 6b 69 3a 6c 69 20 20  efine twiki:li  
8380: 20 20 20 20 20 20 20 73 3a 6c 69 29 0a 28 64 65         s:li).(de
8390: 66 69 6e 65 20 74 77 69 6b 69 3a 70 72 65 20 20  fine twiki:pre  
83a0: 20 20 20 20 20 20 73 3a 70 72 65 29 0a 28 64 65        s:pre).(de
83b0: 66 69 6e 65 20 74 77 69 6b 69 3a 70 20 20 20 20  fine twiki:p    
83c0: 20 20 20 20 20 20 73 3a 70 29 0a 28 64 65 66 69        s:p).(defi
83d0: 6e 65 20 74 77 69 6b 69 3a 75 20 20 20 20 20 20  ne twiki:u      
83e0: 20 20 20 20 73 3a 75 29 0a 28 64 65 66 69 6e 65      s:u).(define
83f0: 20 74 77 69 6b 69 3a 74 64 20 20 20 20 20 20 20   twiki:td       
8400: 20 20 73 3a 74 64 29 0a 28 64 65 66 69 6e 65 20    s:td).(define 
8410: 74 77 69 6b 69 3a 74 72 20 20 20 20 20 20 20 20  twiki:tr        
8420: 20 73 3a 74 72 29 0a 28 64 65 66 69 6e 65 20 74   s:tr).(define t
8430: 77 69 6b 69 3a 74 61 62 6c 65 20 20 20 20 20 20  wiki:table      
8440: 73 3a 74 61 62 6c 65 29 0a 28 64 65 66 69 6e 65  s:table).(define
8450: 20 74 77 69 6b 69 3a 64 69 76 20 20 20 20 20 20   twiki:div      
8460: 20 20 73 3a 64 69 76 29 0a 0a 28 64 65 66 69 6e    s:div)..(defin
8470: 65 20 28 74 77 69 6b 69 3a 77 65 62 36 34 65 6e  e (twiki:web64en
8480: 63 20 73 74 72 29 0a 20 20 28 73 74 72 69 6e 67  c str).  (string
8490: 2d 73 75 62 73 74 69 74 75 74 65 20 22 3d 22 20  -substitute "=" 
84a0: 22 5f 22 20 28 62 61 73 65 36 34 3a 62 61 73 65  "_" (base64:base
84b0: 36 34 2d 65 6e 63 6f 64 65 20 73 74 72 29 20 23  64-encode str) #
84c0: 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77  t))..(define (tw
84d0: 69 6b 69 3a 77 65 62 36 34 64 65 63 20 73 74 72  iki:web64dec str
84e0: 29 0a 20 20 28 62 61 73 65 36 34 3a 62 61 73 65  ).  (base64:base
84f0: 36 34 2d 64 65 63 6f 64 65 20 28 73 74 72 69 6e  64-decode (strin
8500: 67 2d 73 75 62 73 74 69 74 75 74 65 20 22 5f 22  g-substitute "_"
8510: 20 22 3d 22 20 73 74 72 20 23 74 29 29 29 0a 20   "=" str #t))). 
8520: 20 20 20 0a 28 64 65 66 69 6e 65 20 28 74 77 69     .(define (twi
8530: 6b 69 3a 6d 61 6b 65 2d 74 6c 69 6e 6b 20 74 65  ki:make-tlink te
8540: 78 74 20 74 69 64 64 6c 65 72 6e 61 6d 65 29 0a  xt tiddlername).
8550: 20 20 28 73 3a 61 20 74 65 78 74 20 27 68 72 65    (s:a text 'hre
8560: 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77  f (s:link-to (tw
8570: 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63  iki:get-link-bac
8580: 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27 76  k-to-current) 'v
8590: 69 65 77 5f 74 69 64 64 6c 65 72 20 28 74 77 69  iew_tiddler (twi
85a0: 6b 69 3a 77 65 62 36 34 65 6e 63 20 74 69 64 64  ki:web64enc tidd
85b0: 6c 65 72 6e 61 6d 65 29 29 29 29 0a 0a 28 64 65  lername))))..(de
85c0: 66 69 6e 65 20 28 74 77 69 6b 69 3a 70 69 63 20  fine (twiki:pic 
85d0: 70 69 63 2d 6e 61 6d 65 20 73 69 7a 65 20 77 69  pic-name size wi
85e0: 6b 69 29 0a 20 20 28 6c 65 74 2a 20 28 28 74 64  ki).  (let* ((td
85f0: 62 20 20 20 20 28 74 77 69 6b 69 3a 77 69 6b 69  b    (twiki:wiki
8600: 2d 67 65 74 2d 64 62 68 20 77 69 6b 69 29 29 0a  -get-dbh wiki)).
8610: 09 20 28 74 6b 65 79 20 20 20 28 74 77 69 6b 69  . (tkey   (twiki
8620: 3a 77 69 6b 69 2d 67 65 74 2d 6b 65 79 20 77 69  :wiki-get-key wi
8630: 6b 69 29 29 0a 09 20 28 78 79 20 20 20 20 20 28  ki)).. (xy     (
8640: 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 73 69 7a  string-split siz
8650: 65 20 22 78 22 29 29 0a 09 20 28 70 69 63 2d 69  e "x")).. (pic-i
8660: 64 20 28 74 77 69 6b 69 3a 67 65 74 2d 70 69 63  d (twiki:get-pic
8670: 2d 69 64 20 74 64 62 20 70 69 63 2d 6e 61 6d 65  -id tdb pic-name
8680: 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74   (twiki:wiki-get
8690: 2d 77 69 64 20 77 69 6b 69 29 29 29 0a 09 20 28  -wid wiki))).. (
86a0: 69 6d 67 2d 6c 6e 6b 20 20 28 73 3a 6c 69 6e 6b  img-lnk  (s:link
86b0: 2d 74 6f 20 22 74 77 69 6b 69 22 20 27 77 69 6b  -to "twiki" 'wik
86c0: 69 5f 6b 65 79 20 28 63 6f 6e 63 20 28 6e 75 6d  i_key (conc (num
86d0: 62 65 72 2d 3e 73 74 72 69 6e 67 20 28 74 77 69  ber->string (twi
86e0: 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 77 69 64 20  ki:wiki-get-wid 
86f0: 77 69 6b 69 29 29 20 22 2d 22 20 28 74 77 69 6b  wiki)) "-" (twik
8700: 69 3a 77 65 62 36 34 65 6e 63 20 74 6b 65 79 29  i:web64enc tkey)
8710: 29 0a 09 09 09 20 20 20 20 20 20 27 69 6d 61 67  )....      'imag
8720: 65 20 20 70 69 63 2d 69 64 29 29 29 0a 20 20 20  e  pic-id))).   
8730: 20 28 69 66 20 28 61 6e 64 20 28 3e 20 28 6c 65   (if (and (> (le
8740: 6e 67 74 68 20 78 79 29 20 31 29 0a 09 20 20 20  ngth xy) 1)..   
8750: 20 20 28 63 61 72 20 78 79 29 0a 09 20 20 20 20    (car xy)..    
8760: 20 28 63 61 64 72 20 78 79 29 29 20 3b 3b 20 79   (cadr xy)) ;; y
8770: 65 70 2c 20 68 61 76 65 20 74 77 6f 20 6e 75 6d  ep, have two num
8780: 62 65 72 73 0a 09 28 73 3a 69 6d 67 20 27 74 69  bers..(s:img 'ti
8790: 74 6c 65 20 70 69 63 2d 6e 61 6d 65 20 27 61 6c  tle pic-name 'al
87a0: 74 20 70 69 63 2d 6e 61 6d 65 20 27 77 69 64 74  t pic-name 'widt
87b0: 68 20 28 63 61 72 20 78 79 29 20 27 68 65 69 67  h (car xy) 'heig
87c0: 68 74 20 28 63 61 64 72 20 78 79 29 20 27 73 72  ht (cadr xy) 'sr
87d0: 63 20 69 6d 67 2d 6c 6e 6b 29 0a 09 28 73 3a 69  c img-lnk)..(s:i
87e0: 6d 67 20 27 74 69 74 6c 65 20 70 69 63 2d 6e 61  mg 'title pic-na
87f0: 6d 65 20 27 61 6c 74 20 70 69 63 2d 6e 61 6d 65  me 'alt pic-name
8800: 20 27 73 72 63 20 69 6d 67 2d 6c 6e 6b 29 29 29   'src img-lnk)))
8810: 29 0a 0a 3b 3b 20 6f 76 65 72 72 69 64 65 20 74  )..;; override t
8820: 68 65 73 65 20 61 6c 73 6f 0a 28 64 65 66 69 6e  hese also.(defin
8830: 65 20 28 74 77 69 6b 69 3a 67 65 74 2d 69 64 29  e (twiki:get-id)
8840: 0a 20 20 28 73 3a 73 65 73 73 69 6f 6e 2d 76 61  .  (s:session-va
8850: 72 2d 67 65 74 20 22 69 64 22 29 29 0a 0a 3b 3b  r-get "id"))..;;
8860: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 74   override this t
8870: 6f 20 73 65 74 20 6c 69 6e 6b 73 20 69 6e 73 69  o set links insi
8880: 64 65 20 77 69 6b 69 27 73 0a 28 64 65 66 69 6e  de wiki's.(defin
8890: 65 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e  e (twiki:get-lin
88a0: 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e  k-back-to-curren
88b0: 74 29 0a 20 20 28 73 3a 63 75 72 72 65 6e 74 2d  t).  (s:current-
88c0: 70 61 67 65 29 29 0a 0a 0a 3b 3b 20 72 65 67 65  page))...;; rege
88d0: 78 65 73 20 61 72 65 20 6c 69 73 74 65 64 20 69  xes are listed i
88e0: 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
88f0: 68 69 63 68 20 74 68 65 79 20 73 68 6f 75 6c 64  hich they should
8900: 20 62 65 20 63 68 65 63 6b 65 64 0a 0a 28 64 65   be checked..(de
8910: 66 69 6e 65 20 74 77 69 6b 69 3a 68 33 2d 70 61  fine twiki:h3-pa
8920: 74 74 20 28 72 65 67 65 78 70 20 22 5e 21 21 21  tt (regexp "^!!!
8930: 28 2e 2a 29 24 22 29 29 0a 28 64 65 66 69 6e 65  (.*)$")).(define
8940: 20 74 77 69 6b 69 3a 68 32 2d 70 61 74 74 20 28   twiki:h2-patt (
8950: 72 65 67 65 78 70 20 22 5e 21 21 28 2e 2a 29 24  regexp "^!!(.*)$
8960: 22 29 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b  ")).(define twik
8970: 69 3a 68 31 2d 70 61 74 74 20 28 72 65 67 65 78  i:h1-patt (regex
8980: 70 20 22 5e 21 28 2e 2a 29 24 22 29 29 0a 0a 28  p "^!(.*)$"))..(
8990: 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 74 6c 69  define twiki:tli
89a0: 6e 6b 2d 70 61 74 74 20 20 20 20 20 28 72 65 67  nk-patt     (reg
89b0: 65 78 70 20 22 5e 28 2e 2a 29 5c 5c 5b 5c 5c 5b  exp "^(.*)\\[\\[
89c0: 28 5b 5e 5c 5c 5b 5c 5c 5d 5d 2a 29 5c 5c 5d 5c  ([^\\[\\]]*)\\]\
89d0: 5c 5d 28 2e 2a 29 24 22 29 29 0a 28 64 65 66 69  \](.*)$")).(defi
89e0: 6e 65 20 74 77 69 6b 69 3a 70 69 63 2d 70 61 74  ne twiki:pic-pat
89f0: 74 20 20 20 20 20 20 20 28 72 65 67 65 78 70 20  t       (regexp 
8a00: 22 5e 28 2e 2a 29 5c 5c 5b 70 69 63 28 5b 30 2d  "^(.*)\\[pic([0-
8a10: 39 25 5d 2a 78 2a 5b 30 2d 39 25 5d 2a 29 5c 5c  9%]*x*[0-9%]*)\\
8a20: 5b 28 5b 5e 5c 5c 5b 5c 5c 5d 5d 2b 29 5c 5c 5d  [([^\\[\\]]+)\\]
8a30: 5c 5c 5d 28 2e 2a 29 24 22 29 29 0a 28 64 65 66  \\](.*)$")).(def
8a40: 69 6e 65 20 74 77 69 6b 69 3a 75 6e 64 65 72 6c  ine twiki:underl
8a50: 69 6e 65 2d 70 61 74 74 20 28 72 65 67 65 78 70  ine-patt (regexp
8a60: 20 22 5e 28 2e 2a 29 5f 5f 28 2e 2a 29 5f 5f 28   "^(.*)__(.*)__(
8a70: 2e 2a 29 24 22 29 29 0a 28 64 65 66 69 6e 65 20  .*)$")).(define 
8a80: 74 77 69 6b 69 3a 74 61 62 6c 65 2d 70 61 74 74  twiki:table-patt
8a90: 20 20 20 20 20 28 72 65 67 65 78 70 20 22 5e 5c       (regexp "^\
8aa0: 5c 7c 28 2e 2a 29 5c 5c 7c 24 22 29 29 0a 0a 3b  \|(.*)\\|$"))..;
8ab0: 3b 20 74 68 65 73 65 20 61 72 65 20 66 6f 72 20  ; these are for 
8ac0: 6d 75 6c 74 69 2d 6c 69 6e 65 20 66 6f 72 6d 61  multi-line forma
8ad0: 74 69 6e 67 0a 28 64 65 66 69 6e 65 20 74 77 69  ting.(define twi
8ae0: 6b 69 3a 6c 69 73 74 2d 70 61 74 74 20 20 20 20  ki:list-patt    
8af0: 28 72 65 67 65 78 70 20 22 5e 28 5c 5c 2a 2b 7c  (regexp "^(\\*+|
8b00: 5c 5c 23 2b 29 28 2e 2a 29 24 22 29 29 0a 28 64  \\#+)(.*)$")).(d
8b10: 65 66 69 6e 65 20 74 77 69 6b 69 3a 62 75 6c 6c  efine twiki:bull
8b20: 65 74 2d 70 61 74 74 20 20 28 72 65 67 65 78 70  et-patt  (regexp
8b30: 20 22 5e 28 5c 5c 2a 2b 29 28 2e 2a 29 24 22 29   "^(\\*+)(.*)$")
8b40: 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ).(define twiki:
8b50: 6e 75 6d 62 65 72 2d 70 61 74 74 20 20 28 72 65  number-patt  (re
8b60: 67 65 78 70 20 22 5e 28 5c 5c 23 2b 29 28 2e 2a  gexp "^(\\#+)(.*
8b70: 29 24 22 29 29 0a 28 64 65 66 69 6e 65 20 74 77  )$")).(define tw
8b80: 69 6b 69 3a 70 72 65 66 6f 72 2d 70 61 74 74 20  iki:prefor-patt 
8b90: 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 7b 5c 5c   (regexp "^\\{\\
8ba0: 7b 5c 5c 7b 24 22 29 29 0a 28 64 65 66 69 6e 65  {\\{$")).(define
8bb0: 20 74 77 69 6b 69 3a 70 72 65 66 6f 72 2d 65 6e   twiki:prefor-en
8bc0: 64 2d 70 61 74 74 20 28 72 65 67 65 78 70 20 22  d-patt (regexp "
8bd0: 5e 5c 5c 7d 5c 5c 7d 5c 5c 7d 24 22 29 29 0a 0a  ^\\}\\}\\}$"))..
8be0: 3b 3b 20 72 65 67 65 78 0a 28 64 65 66 69 6e 65  ;; regex.(define
8bf0: 20 74 3a 6d 61 74 63 68 20 20 23 66 29 0a 28 64   t:match  #f).(d
8c00: 65 66 69 6e 65 20 28 74 2d 6d 61 74 63 68 20 72  efine (t-match r
8c10: 20 73 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73   s).  (let ((res
8c20: 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 72   (string-match r
8c30: 20 73 29 29 29 0a 20 20 20 20 28 73 65 74 21 20   s))).    (set! 
8c40: 74 3a 6d 61 74 63 68 20 72 65 73 29 0a 20 20 20  t:match res).   
8c50: 20 72 65 73 29 29 0a 0a 3b 3b 20 73 68 6f 75 6c   res))..;; shoul
8c60: 64 20 73 77 69 74 63 68 20 74 6f 20 72 65 63 75  d switch to recu
8c70: 72 73 69 76 65 6c 79 20 70 72 6f 63 65 73 73 69  rsively processi
8c80: 6e 67 20 62 79 20 62 6c 6f 63 6b 3f 0a 3b 3b 20  ng by block?.;; 
8c90: 28 70 72 6f 63 65 73 73 2d 62 6c 6f 63 6b 20 64  (process-block d
8ca0: 61 74 29 0a 3b 3b 20 20 20 2e 2e 2e 0a 3b 3b 20  at).;;   ....;; 
8cb0: 20 20 28 70 72 6f 63 65 73 73 2d 62 6c 6f 63 6b    (process-block
8cc0: 20 72 65 6d 64 61 74 29 0a 28 64 65 66 69 6e 65   remdat).(define
8cd0: 20 28 74 77 69 6b 69 3a 64 61 74 2d 3e 68 74 6d   (twiki:dat->htm
8ce0: 6c 20 64 61 74 20 77 69 6b 69 29 0a 20 20 28 6c  l dat wiki).  (l
8cf0: 65 74 2a 20 28 28 69 6e 70 20 20 20 20 20 20 20  et* ((inp       
8d00: 20 28 6f 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72   (open-input-str
8d10: 69 6e 67 20 64 61 74 29 29 0a 09 20 28 6e 65 73  ing dat)).. (nes
8d20: 74 2d 64 65 70 74 68 20 30 29 20 3b 3b 20 64 65  t-depth 0) ;; de
8d30: 70 74 68 20 6f 66 20 6e 65 73 74 65 64 20 6c 69  pth of nested li
8d40: 73 74 73 0a 09 20 3b 3b 20 74 6f 6b 65 6e 20 28  sts.. ;; token (
8d50: 69 2e 65 2e 20 6c 69 6e 65 29 20 68 61 6e 64 6c  i.e. line) handl
8d60: 69 6e 67 20 73 74 75 66 66 0a 09 20 28 6e 65 78  ing stuff.. (nex
8d70: 74 2d 6c 69 6e 65 20 20 23 66 29 0a 09 20 28 70  t-line  #f).. (p
8d80: 65 65 6b 2d 6c 69 6e 65 20 20 28 6c 61 6d 62 64  eek-line  (lambd
8d90: 61 20 28 29 0a 09 09 20 20 20 20 20 20 20 6e 65  a ()...       ne
8da0: 78 74 2d 6c 69 6e 65 29 29 0a 09 20 28 67 65 74  xt-line)).. (get
8db0: 2d 6c 69 6e 65 20 20 20 28 6c 61 6d 62 64 61 20  -line   (lambda 
8dc0: 28 29 0a 09 09 20 20 20 20 20 20 20 28 6c 65 74  ()...       (let
8dd0: 20 28 28 72 65 73 20 6e 65 78 74 2d 6c 69 6e 65   ((res next-line
8de0: 29 29 0a 09 09 09 20 28 73 65 74 21 20 6e 65 78  )).... (set! nex
8df0: 74 2d 6c 69 6e 65 20 28 72 65 61 64 2d 6c 69 6e  t-line (read-lin
8e00: 65 20 69 6e 70 29 29 0a 09 09 09 20 3b 3b 20 28  e inp)).... ;; (
8e10: 70 72 69 6e 74 20 22 67 65 74 2d 6c 69 6e 65 3a  print "get-line:
8e20: 20 70 72 65 76 3d 22 20 72 65 73 20 22 20 6e 65   prev=" res " ne
8e30: 78 74 3d 22 20 6e 65 78 74 2d 6c 69 6e 65 20 22  xt=" next-line "
8e40: 5c 6e 22 29 0a 09 09 09 20 72 65 73 29 29 29 0a  \n").... res))).
8e50: 09 20 28 6c 20 20 20 20 20 20 20 20 20 20 28 67  . (l          (g
8e60: 65 74 2d 6c 69 6e 65 29 29 29 20 3b 3b 20 64 69  et-line))) ;; di
8e70: 73 63 61 72 64 20 74 68 65 20 23 66 20 69 6e 20  scard the #f in 
8e80: 6e 65 78 74 2d 6c 69 6e 65 0a 20 20 20 20 28 74  next-line.    (t
8e90: 77 69 6b 69 3a 72 65 61 64 2d 62 6c 6f 63 6b 20  wiki:read-block 
8ea0: 70 65 65 6b 2d 6c 69 6e 65 20 67 65 74 2d 6c 69  peek-line get-li
8eb0: 6e 65 20 6e 65 73 74 2d 64 65 70 74 68 20 23 66  ne nest-depth #f
8ec0: 20 77 69 6b 69 29 29 29 0a 0a 3b 3b 20 62 6c 6b   wiki)))..;; blk
8ed0: 2d 74 79 70 65 20 69 73 20 23 66 20 66 6f 72 20  -type is #f for 
8ee0: 6e 6f 74 20 69 6e 20 61 20 62 6c 6f 63 6b 20 28  not in a block (
8ef0: 69 2e 65 2e 20 61 74 20 74 6f 70 20 6c 65 76 65  i.e. at top leve
8f00: 6c 29 2c 20 27 70 72 65 20 66 6f 72 20 70 72 65  l), 'pre for pre
8f10: 66 6f 72 6d 61 74 65 64 2c 20 27 75 6c 20 6f 72  formated, 'ul or
8f20: 20 27 6f 6c 0a 3b 3b 20 63 61 6c 6c 20 77 69 74   'ol.;; call wit
8f30: 68 20 66 69 72 73 74 20 6c 69 6e 65 20 61 73 20  h first line as 
8f40: 6c 65 67 69 74 20 64 61 74 61 0a 3b 3b 20 69 2e  legit data.;; i.
8f50: 65 2e 20 66 6f 72 20 70 72 65 66 6f 72 6d 20 2d  e. for preform -
8f60: 20 73 6b 69 70 20 74 68 65 20 7b 7b 7b 20 6c 69   skip the {{{ li
8f70: 6e 65 20 74 68 65 6e 20 63 61 6c 6c 20 72 65 61  ne then call rea
8f80: 64 2d 62 6c 6f 63 6b 0a 3b 3b 20 20 20 20 20 20  d-block.;;      
8f90: 66 6f 72 20 23 20 6f 72 20 2a 20 63 61 6c 6c 20  for # or * call 
8fa0: 77 69 74 68 20 66 69 72 73 74 20 6c 69 6e 65 0a  with first line.
8fb0: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 72  (define (twiki:r
8fc0: 65 61 64 2d 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c  ead-block peek-l
8fd0: 69 6e 65 20 67 65 74 2d 6c 69 6e 65 20 6e 65 73  ine get-line nes
8fe0: 74 2d 64 65 70 74 68 20 62 6c 6b 2d 74 79 70 65  t-depth blk-type
8ff0: 20 77 69 6b 69 29 0a 20 20 28 6c 65 74 20 6c 6f   wiki).  (let lo
9000: 6f 70 20 28 28 72 65 73 20 27 28 29 29 0a 09 20  op ((res '()).. 
9010: 20 20 20 20 28 6c 20 20 20 28 70 65 65 6b 2d 6c      (l   (peek-l
9020: 69 6e 65 29 29 29 20 3b 3b 20 73 68 6f 75 6c 64  ine))) ;; should
9030: 20 74 68 69 73 20 62 65 20 61 20 70 65 65 6b 2d   this be a peek-
9040: 6c 69 6e 65 3f 20 79 65 73 21 21 0a 20 20 20 20  line? yes!!.    
9050: 3b 3b 20 28 70 72 69 6e 74 20 22 74 77 69 6b 69  ;; (print "twiki
9060: 3a 72 65 61 64 2d 62 6c 6f 63 6b 20 6c 6f 6f 70  :read-block loop
9070: 20 6e 65 73 74 2d 64 65 70 74 68 3d 22 6e 65 73   nest-depth="nes
9080: 74 2d 64 65 70 74 68 20 22 20 62 6c 6b 2d 74 79  t-depth " blk-ty
9090: 70 65 3d 22 20 62 6c 6b 2d 74 79 70 65 20 22 20  pe=" blk-type " 
90a0: 6c 3d 22 20 6c 20 22 5c 6e 20 20 72 65 73 3d 22  l=" l "\n  res="
90b0: 20 72 65 73 29 0a 20 20 20 20 28 69 66 20 28 65   res).    (if (e
90c0: 6f 66 2d 6f 62 6a 65 63 74 3f 20 6c 29 0a 09 3b  of-object? l)..;
90d0: 3b 20 77 65 20 61 72 65 20 64 6f 6e 65 21 20 72  ; we are done! r
90e0: 65 74 75 72 6e 20 74 68 65 20 6c 69 73 74 0a 09  eturn the list..
90f0: 72 65 73 0a 09 3b 3b 20 70 72 6f 63 65 73 73 20  res..;; process 
9100: 69 74 21 0a 09 28 63 6f 6e 64 0a 09 20 3b 3b 20  it!..(cond.. ;; 
9110: 68 61 6e 64 6c 65 20 70 72 65 66 6f 72 6d 61 74  handle preformat
9120: 65 64 20 74 65 78 74 0a 09 20 28 28 65 71 3f 20  ed text.. ((eq? 
9130: 62 6c 6b 2d 74 79 70 65 20 27 70 72 65 29 0a 09  blk-type 'pre)..
9140: 20 20 28 69 66 20 28 74 2d 6d 61 74 63 68 20 20    (if (t-match  
9150: 74 77 69 6b 69 3a 70 72 65 66 6f 72 2d 65 6e 64  twiki:prefor-end
9160: 2d 70 61 74 74 20 6c 29 0a 09 20 20 20 20 20 20  -patt l)..      
9170: 28 62 65 67 69 6e 0a 09 09 28 67 65 74 2d 6c 69  (begin...(get-li
9180: 6e 65 29 20 3b 3b 20 64 69 73 63 61 72 64 20 74  ne) ;; discard t
9190: 68 65 20 7d 7d 7d 0a 09 09 72 65 73 29 20 20 20  he }}}...res)   
91a0: 20 20 20 20 3b 3b 20 65 6e 64 20 6f 66 20 70 72      ;; end of pr
91b0: 65 66 6f 72 6d 61 74 74 65 64 0a 09 20 20 20 20  eformatted..    
91c0: 20 20 28 62 65 67 69 6e 0a 09 09 3b 3b 20 28 67    (begin...;; (g
91d0: 65 74 2d 6c 69 6e 65 29 20 3b 3b 20 64 69 73 63  et-line) ;; disc
91e0: 61 72 64 20 74 68 65 20 7b 7b 7b 0a 09 09 28 6c  ard the {{{...(l
91f0: 6f 6f 70 20 28 61 70 70 65 6e 64 20 72 65 73 20  oop (append res 
9200: 28 6c 69 73 74 20 28 67 65 74 2d 6c 69 6e 65 29  (list (get-line)
9210: 29 29 0a 09 09 20 20 20 20 20 20 28 70 65 65 6b  ))...      (peek
9220: 2d 6c 69 6e 65 29 29 29 29 29 0a 09 20 3b 3b 20  -line))))).. ;; 
9230: 68 61 6e 64 6c 65 20 74 61 62 6c 65 73 0a 09 20  handle tables.. 
9240: 28 28 65 71 3f 20 62 6c 6b 2d 74 79 70 65 20 27  ((eq? blk-type '
9250: 74 61 62 6c 65 29 0a 09 20 20 28 69 66 20 28 74  table)..  (if (t
9260: 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 74 61 62  -match twiki:tab
9270: 6c 65 2d 70 61 74 74 20 6c 29 0a 09 20 20 20 20  le-patt l)..    
9280: 20 20 28 6c 65 74 20 28 28 63 65 6c 73 20 20 28    (let ((cels  (
9290: 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 63 61  string-split (ca
92a0: 64 72 20 74 3a 6d 61 74 63 68 29 20 22 7c 22 29  dr t:match) "|")
92b0: 29 29 0a 09 09 28 67 65 74 2d 6c 69 6e 65 29 0a  ))...(get-line).
92c0: 09 09 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20  ..(loop (append 
92d0: 72 65 73 20 28 74 77 69 6b 69 3a 74 72 20 28 6d  res (twiki:tr (m
92e0: 61 70 20 74 77 69 6b 69 3a 74 64 20 0a 09 09 09  ap twiki:td ....
92f0: 09 09 09 20 28 6d 61 70 20 28 6c 61 6d 62 64 61  ... (map (lambda
9300: 20 28 78 29 28 74 77 69 6b 69 3a 6c 69 6e 65 2d   (x)(twiki:line-
9310: 3e 68 74 6d 6c 20 78 20 23 66 20 77 69 6b 69 29  >html x #f wiki)
9320: 29 20 63 65 6c 73 29 29 29 29 0a 09 09 20 20 20  ) cels))))...   
9330: 20 20 20 28 67 65 74 2d 6c 69 6e 65 29 29 29 0a     (get-line))).
9340: 09 20 20 20 20 20 20 72 65 73 29 29 0a 09 20 3b  .      res)).. ;
9350: 3b 20 68 61 6e 64 6c 65 20 6c 69 73 74 73 0a 09  ; handle lists..
9360: 20 28 28 6f 72 20 28 74 2d 6d 61 74 63 68 20 74   ((or (t-match t
9370: 77 69 6b 69 3a 62 75 6c 6c 65 74 2d 70 61 74 74  wiki:bullet-patt
9380: 20 6c 29 20 3b 3b 20 68 61 76 65 20 2a 0a 09 20   l) ;; have *.. 
9390: 20 20 20 20 20 28 74 2d 6d 61 74 63 68 20 74 77       (t-match tw
93a0: 69 6b 69 3a 6e 75 6d 62 65 72 2d 70 61 74 74 20  iki:number-patt 
93b0: 6c 29 29 0a 09 20 20 28 6c 65 74 2a 20 28 28 64  l))..  (let* ((d
93c0: 69 72 65 63 74 69 76 65 20 28 63 61 64 72 20 74  irective (cadr t
93d0: 3a 6d 61 74 63 68 29 29 0a 09 09 20 28 6c 65 76  :match))... (lev
93e0: 65 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 6c 65  elnum (string-le
93f0: 6e 67 74 68 20 64 69 72 65 63 74 69 76 65 29 29  ngth directive))
9400: 0a 09 09 20 28 74 65 78 74 20 20 20 20 20 28 74  ... (text     (t
9410: 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20  wiki:line->html 
9420: 28 63 61 64 64 72 20 74 3a 6d 61 74 63 68 29 20  (caddr t:match) 
9430: 23 74 20 77 69 6b 69 29 29 0a 09 09 20 28 62 74  #t wiki))... (bt
9440: 79 70 65 20 20 20 20 28 69 66 20 28 73 74 72 69  ype    (if (stri
9450: 6e 67 3d 3f 20 22 23 22 20 28 73 75 62 73 74 72  ng=? "#" (substr
9460: 69 6e 67 20 64 69 72 65 63 74 69 76 65 20 30 20  ing directive 0 
9470: 31 29 29 0a 09 09 09 20 20 20 20 20 20 20 27 6f  1))....       'o
9480: 6c 0a 09 09 09 20 20 20 20 20 20 20 27 75 6c 29  l....       'ul)
9490: 29 0a 09 09 20 28 66 75 6e 63 20 20 20 20 20 28  )... (func     (
94a0: 69 66 20 28 65 71 3f 20 62 74 79 70 65 20 27 75  if (eq? btype 'u
94b0: 6c 29 0a 09 09 09 20 20 20 20 20 20 20 74 77 69  l)....       twi
94c0: 6b 69 3a 75 6c 0a 09 09 09 20 20 20 20 20 20 20  ki:ul....       
94d0: 74 77 69 6b 69 3a 6f 6c 29 29 29 0a 09 20 20 20  twiki:ol)))..   
94e0: 20 3b 3b 20 28 70 72 69 6e 74 20 22 68 61 6e 64   ;; (print "hand
94f0: 6c 69 6e 67 20 22 20 62 74 79 70 65 20 22 3a 20  ling " btype ": 
9500: 6c 65 76 65 6c 6e 75 6d 3d 22 20 6c 65 76 65 6c  levelnum=" level
9510: 6e 75 6d 20 22 20 74 65 78 74 3d 22 20 74 65 78  num " text=" tex
9520: 74 20 22 20 6e 65 73 74 2d 64 65 70 74 68 3d 22  t " nest-depth="
9530: 20 6e 65 73 74 2d 64 65 70 74 68 20 22 20 62 6c   nest-depth " bl
9540: 6b 2d 74 79 70 65 3d 22 20 62 6c 6b 2d 74 79 70  k-type=" blk-typ
9550: 65 29 0a 09 20 20 20 20 28 63 6f 6e 64 0a 09 20  e)..    (cond.. 
9560: 20 20 20 20 28 28 6e 6f 74 20 62 6c 6b 2d 74 79      ((not blk-ty
9570: 70 65 29 20 3b 3b 20 69 2e 65 20 66 69 72 73 74  pe) ;; i.e first
9580: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   member of the l
9590: 69 73 74 21 0a 09 20 20 20 20 20 20 28 6c 6f 6f  ist!..      (loo
95a0: 70 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 66  p (append res (f
95b0: 75 6e 63 20 28 74 77 69 6b 69 3a 72 65 61 64 2d  unc (twiki:read-
95c0: 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c 69 6e 65 20  block peek-line 
95d0: 67 65 74 2d 6c 69 6e 65 20 6c 65 76 65 6c 6e 75  get-line levelnu
95e0: 6d 20 62 74 79 70 65 20 77 69 6b 69 29 29 29 0a  m btype wiki))).
95f0: 09 09 20 20 20 20 28 67 65 74 2d 6c 69 6e 65 29  ..    (get-line)
9600: 29 29 0a 09 20 20 20 20 20 28 28 3e 20 6c 65 76  ))..     ((> lev
9610: 65 6c 6e 75 6d 20 6e 65 73 74 2d 64 65 70 74 68  elnum nest-depth
9620: 29 0a 09 20 20 20 20 20 20 28 6c 6f 6f 70 20 28  )..      (loop (
9630: 61 70 70 65 6e 64 20 72 65 73 20 28 66 75 6e 63  append res (func
9640: 20 28 74 77 69 6b 69 3a 72 65 61 64 2d 62 6c 6f   (twiki:read-blo
9650: 63 6b 20 70 65 65 6b 2d 6c 69 6e 65 20 67 65 74  ck peek-line get
9660: 2d 6c 69 6e 65 20 28 2b 20 6e 65 73 74 2d 64 65  -line (+ nest-de
9670: 70 74 68 20 31 29 20 62 74 79 70 65 20 77 69 6b  pth 1) btype wik
9680: 69 29 29 29 0a 09 09 20 20 20 20 28 70 65 65 6b  i)))...    (peek
9690: 2d 6c 69 6e 65 29 29 29 0a 09 20 20 20 20 20 28  -line)))..     (
96a0: 28 3c 20 6c 65 76 65 6c 6e 75 6d 20 6e 65 73 74  (< levelnum nest
96b0: 2d 64 65 70 74 68 29 0a 09 20 20 20 20 20 20 28  -depth)..      (
96c0: 61 70 70 65 6e 64 20 72 65 73 20 28 74 77 69 6b  append res (twik
96d0: 69 3a 6c 69 20 74 65 78 74 29 29 29 20 3b 3b 20  i:li text))) ;; 
96e0: 72 65 74 75 72 6e 20 74 68 65 20 62 75 6c 6c 65  return the bulle
96f0: 74 65 64 20 69 74 65 6d 2c 20 64 6f 6e 27 74 20  ted item, don't 
9700: 67 65 74 20 74 68 65 20 6e 65 78 74 20 6c 69 6e  get the next lin
9710: 65 3f 3f 0a 09 20 20 20 20 20 28 65 6c 73 65 0a  e??..     (else.
9720: 09 20 20 20 20 20 20 28 67 65 74 2d 6c 69 6e 65  .      (get-line
9730: 29 0a 09 20 20 20 20 20 20 28 6c 6f 6f 70 20 28  )..      (loop (
9740: 61 70 70 65 6e 64 20 72 65 73 20 28 74 77 69 6b  append res (twik
9750: 69 3a 6c 69 20 74 65 78 74 29 29 0a 09 09 20 20  i:li text))...  
9760: 20 20 28 70 65 65 6b 2d 6c 69 6e 65 29 29 29 29    (peek-line))))
9770: 29 29 0a 09 20 28 28 74 2d 6d 61 74 63 68 20 74  )).. ((t-match t
9780: 77 69 6b 69 3a 70 72 65 66 6f 72 2d 70 61 74 74  wiki:prefor-patt
9790: 20 6c 29 0a 09 20 20 28 67 65 74 2d 6c 69 6e 65   l)..  (get-line
97a0: 29 20 3b 3b 20 64 69 73 63 61 72 64 20 74 68 65  ) ;; discard the
97b0: 20 7b 7b 7b 0a 09 20 20 28 6c 6f 6f 70 20 28 61   {{{..  (loop (a
97c0: 70 70 65 6e 64 20 72 65 73 20 28 74 77 69 6b 69  ppend res (twiki
97d0: 3a 70 72 65 20 28 74 77 69 6b 69 3a 72 65 61 64  :pre (twiki:read
97e0: 2d 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c 69 6e 65  -block peek-line
97f0: 20 67 65 74 2d 6c 69 6e 65 20 6e 65 73 74 2d 64   get-line nest-d
9800: 65 70 74 68 20 27 70 72 65 20 77 69 6b 69 29 29  epth 'pre wiki))
9810: 29 0a 09 09 28 70 65 65 6b 2d 6c 69 6e 65 29 29  )...(peek-line))
9820: 29 0a 09 20 28 28 74 2d 6d 61 74 63 68 20 74 77  ).. ((t-match tw
9830: 69 6b 69 3a 74 61 62 6c 65 2d 70 61 74 74 20 6c  iki:table-patt l
9840: 29 0a 09 20 20 28 67 65 74 2d 6c 69 6e 65 29 0a  )..  (get-line).
9850: 09 20 20 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64  .  (loop (append
9860: 20 72 65 73 20 28 74 77 69 6b 69 3a 74 61 62 6c   res (twiki:tabl
9870: 65 20 27 62 6f 72 64 65 72 20 31 20 27 63 65 6c  e 'border 1 'cel
9880: 6c 73 70 61 63 69 6e 67 20 30 20 28 74 77 69 6b  lspacing 0 (twik
9890: 69 3a 72 65 61 64 2d 62 6c 6f 63 6b 20 70 65 65  i:read-block pee
98a0: 6b 2d 6c 69 6e 65 20 67 65 74 2d 6c 69 6e 65 20  k-line get-line 
98b0: 30 20 27 74 61 62 6c 65 20 77 69 6b 69 29 29 29  0 'table wiki)))
98c0: 0a 09 09 28 70 65 65 6b 2d 6c 69 6e 65 29 29 29  ...(peek-line)))
98d0: 0a 09 20 28 65 6c 73 65 0a 09 20 20 28 67 65 74  .. (else..  (get
98e0: 2d 6c 69 6e 65 29 0a 09 20 20 28 6c 6f 6f 70 20  -line)..  (loop 
98f0: 28 61 70 70 65 6e 64 20 72 65 73 20 28 74 77 69  (append res (twi
9900: 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 6c 20  ki:line->html l 
9910: 23 74 20 77 69 6b 69 29 29 0a 09 09 28 70 65 65  #t wiki))...(pee
9920: 6b 2d 6c 69 6e 65 29 29 29 29 29 29 29 0a 0a 28  k-line)))))))..(
9930: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 6c 69  define (twiki:li
9940: 6e 65 2d 3e 68 74 6d 6c 20 64 61 74 20 66 69 72  ne->html dat fir
9950: 73 74 63 61 6c 6c 20 77 69 6b 69 29 0a 20 20 28  stcall wiki).  (
9960: 69 66 20 66 69 72 73 74 63 61 6c 6c 20 0a 20 20  if firstcall .  
9970: 20 20 20 20 3b 3b 20 70 72 6f 63 65 73 73 20 74      ;; process t
9980: 68 65 20 70 61 74 74 65 72 6e 73 20 74 68 61 74  he patterns that
9990: 20 74 65 73 74 20 66 6f 72 20 62 65 67 69 6e 6e   test for beginn
99a0: 69 6e 67 20 6f 66 20 6c 69 6e 65 20 6f 6e 6c 79  ing of line only
99b0: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   on the first ca
99c0: 6c 6c 0a 20 20 20 20 20 20 28 63 6f 6e 64 0a 20  ll.      (cond. 
99d0: 20 20 20 20 20 20 28 28 74 2d 6d 61 74 63 68 20        ((t-match 
99e0: 74 77 69 6b 69 3a 68 33 2d 70 61 74 74 20 64 61  twiki:h3-patt da
99f0: 74 29 0a 09 28 74 77 69 6b 69 3a 68 33 20 28 74  t)..(twiki:h3 (t
9a00: 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20  wiki:line->html 
9a10: 28 63 61 64 72 20 74 3a 6d 61 74 63 68 29 20 23  (cadr t:match) #
9a20: 66 20 77 69 6b 69 29 29 29 0a 20 20 20 20 20 20  f wiki))).      
9a30: 20 28 28 74 2d 6d 61 74 63 68 20 74 77 69 6b 69   ((t-match twiki
9a40: 3a 68 32 2d 70 61 74 74 20 64 61 74 29 0a 09 28  :h2-patt dat)..(
9a50: 74 77 69 6b 69 3a 68 32 20 28 74 77 69 6b 69 3a  twiki:h2 (twiki:
9a60: 6c 69 6e 65 2d 3e 68 74 6d 6c 20 28 63 61 64 72  line->html (cadr
9a70: 20 74 3a 6d 61 74 63 68 29 20 23 66 20 77 69 6b   t:match) #f wik
9a80: 69 29 29 29 0a 20 20 20 20 20 20 20 28 28 74 2d  i))).       ((t-
9a90: 6d 61 74 63 68 20 74 77 69 6b 69 3a 68 31 2d 70  match twiki:h1-p
9aa0: 61 74 74 20 64 61 74 29 0a 09 28 74 77 69 6b 69  att dat)..(twiki
9ab0: 3a 68 31 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d  :h1 (twiki:line-
9ac0: 3e 68 74 6d 6c 20 28 63 61 64 72 20 74 3a 6d 61  >html (cadr t:ma
9ad0: 74 63 68 29 20 23 66 20 77 69 6b 69 29 29 29 0a  tch) #f wiki))).
9ae0: 20 20 20 20 20 20 20 3b 3b 20 77 68 79 20 77 61         ;; why wa
9af0: 73 20 74 68 65 20 28 73 3a 62 72 29 20 68 65 72  s the (s:br) her
9b00: 65 3f 20 74 72 79 69 6e 67 20 77 69 74 68 6f 75  e? trying withou
9b10: 74 0a 20 20 20 20 20 20 20 28 65 6c 73 65 20 28  t.       (else (
9b20: 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c  twiki:line->html
9b30: 20 64 61 74 20 23 66 20 77 69 6b 69 29 29 29 0a   dat #f wiki))).
9b40: 20 20 20 20 20 20 20 3b 3b 20 28 65 6c 73 65 20         ;; (else 
9b50: 20 28 61 70 70 65 6e 64 20 28 74 77 69 6b 69 3a   (append (twiki:
9b60: 6c 69 6e 65 2d 3e 68 74 6d 6c 20 64 61 74 20 23  line->html dat #
9b70: 66 20 77 69 6b 69 29 28 6c 69 73 74 20 28 73 3a  f wiki)(list (s:
9b80: 62 72 29 29 29 29 29 3b 3b 20 28 73 3a 70 20 27  br)))));; (s:p '
9b90: 63 6c 61 73 73 20 22 74 69 64 64 6c 65 72 70 61  class "tiddlerpa
9ba0: 72 22 0a 20 20 20 20 20 20 3b 3b 20 6e 6f 74 20  r".      ;; not 
9bb0: 66 69 72 73 74 63 61 6c 6c 20 73 6f 20 70 72 6f  firstcall so pro
9bc0: 63 65 73 73 20 6f 74 68 65 72 20 70 61 74 74 65  cess other patte
9bd0: 72 6e 73 0a 20 20 20 20 20 20 28 63 6f 6e 64 0a  rns.      (cond.
9be0: 20 20 20 20 20 20 20 28 28 74 2d 6d 61 74 63 68         ((t-match
9bf0: 20 74 77 69 6b 69 3a 74 6c 69 6e 6b 2d 70 61 74   twiki:tlink-pat
9c00: 74 20 64 61 74 29 0a 09 28 6c 65 74 20 28 28 70  t dat)..(let ((p
9c10: 72 65 20 20 28 63 61 64 72 20 20 20 74 3a 6d 61  re  (cadr   t:ma
9c20: 74 63 68 29 29 0a 09 20 20 20 20 20 20 28 6c 6e  tch))..      (ln
9c30: 6b 20 20 28 63 61 64 64 72 20 20 74 3a 6d 61 74  k  (caddr  t:mat
9c40: 63 68 29 29 0a 09 20 20 20 20 20 20 28 70 6f 73  ch))..      (pos
9c50: 74 20 28 63 61 64 64 64 72 20 74 3a 6d 61 74 63  t (cadddr t:matc
9c60: 68 29 29 29 0a 09 20 20 28 6c 69 73 74 20 28 74  h)))..  (list (t
9c70: 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20  wiki:line->html 
9c80: 70 72 65 20 23 66 20 77 69 6b 69 29 0a 09 09 28  pre #f wiki)...(
9c90: 74 77 69 6b 69 3a 6d 61 6b 65 2d 74 6c 69 6e 6b  twiki:make-tlink
9ca0: 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74   (twiki:line->ht
9cb0: 6d 6c 20 6c 6e 6b 20 23 66 20 77 69 6b 69 29 20  ml lnk #f wiki) 
9cc0: 6c 6e 6b 29 20 3b 3b 20 73 70 65 63 69 61 6c 20  lnk) ;; special 
9cd0: 68 61 6e 64 6c 69 6e 67 0a 09 09 28 74 77 69 6b  handling...(twik
9ce0: 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 70 6f 73  i:line->html pos
9cf0: 74 20 23 66 20 77 69 6b 69 29 29 29 29 0a 20 20  t #f wiki)))).  
9d00: 20 20 20 20 20 28 28 74 2d 6d 61 74 63 68 20 74       ((t-match t
9d10: 77 69 6b 69 3a 70 69 63 2d 70 61 74 74 20 64 61  wiki:pic-patt da
9d20: 74 29 0a 09 28 6c 65 74 20 28 28 70 72 65 20 20  t)..(let ((pre  
9d30: 28 63 61 64 72 20 20 20 20 74 3a 6d 61 74 63 68  (cadr    t:match
9d40: 29 29 0a 09 20 20 20 20 20 20 28 73 69 7a 65 20  ))..      (size 
9d50: 28 63 61 64 64 72 20 20 20 74 3a 6d 61 74 63 68  (caddr   t:match
9d60: 29 29 20 0a 09 20 20 20 20 20 20 28 70 69 63 20  )) ..      (pic 
9d70: 20 28 63 61 64 64 64 72 20 20 74 3a 6d 61 74 63   (cadddr  t:matc
9d80: 68 29 29 0a 09 20 20 20 20 20 20 28 70 6f 73 74  h))..      (post
9d90: 20 28 6c 69 73 74 2d 72 65 66 20 74 3a 6d 61 74   (list-ref t:mat
9da0: 63 68 20 34 29 29 29 0a 09 20 20 28 6c 69 73 74  ch 4)))..  (list
9db0: 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74   (twiki:line->ht
9dc0: 6d 6c 20 70 72 65 20 23 66 20 77 69 6b 69 29 0a  ml pre #f wiki).
9dd0: 09 09 28 74 77 69 6b 69 3a 70 69 63 20 70 69 63  ..(twiki:pic pic
9de0: 20 73 69 7a 65 20 77 69 6b 69 29 0a 09 09 28 74   size wiki)...(t
9df0: 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20  wiki:line->html 
9e00: 70 6f 73 74 20 23 74 20 77 69 6b 69 29 29 29 29  post #t wiki))))
9e10: 0a 20 20 20 20 20 20 20 28 28 74 2d 6d 61 74 63  .       ((t-matc
9e20: 68 20 74 77 69 6b 69 3a 75 6e 64 65 72 6c 69 6e  h twiki:underlin
9e30: 65 2d 70 61 74 74 20 64 61 74 29 0a 09 28 6c 65  e-patt dat)..(le
9e40: 74 20 28 28 70 72 65 20 20 28 63 61 64 72 20 20  t ((pre  (cadr  
9e50: 20 74 3a 6d 61 74 63 68 29 29 0a 09 20 20 20 20   t:match))..    
9e60: 20 20 28 6c 6e 6b 20 20 28 63 61 64 64 72 20 20    (lnk  (caddr  
9e70: 74 3a 6d 61 74 63 68 29 29 0a 09 20 20 20 20 20  t:match))..     
9e80: 20 28 70 6f 73 74 20 28 63 61 64 64 64 72 20 74   (post (cadddr t
9e90: 3a 6d 61 74 63 68 29 29 29 0a 09 20 20 28 6c 69  :match)))..  (li
9ea0: 73 74 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e  st (twiki:line->
9eb0: 68 74 6d 6c 20 70 72 65 20 23 66 20 77 69 6b 69  html pre #f wiki
9ec0: 29 0a 09 09 28 74 77 69 6b 69 3a 75 20 28 74 77  )...(twiki:u (tw
9ed0: 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 6c  iki:line->html l
9ee0: 6e 6b 20 23 66 20 77 69 6b 69 29 29 0a 09 09 28  nk #f wiki))...(
9ef0: 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c  twiki:line->html
9f00: 20 70 6f 73 74 20 23 66 20 77 69 6b 69 29 29 29   post #f wiki)))
9f10: 29 0a 20 20 20 20 20 20 20 28 28 74 2d 6d 61 74  ).       ((t-mat
9f20: 63 68 20 74 77 69 6b 69 3a 74 61 62 6c 65 2d 70  ch twiki:table-p
9f30: 61 74 74 20 64 61 74 29 0a 09 28 6c 65 74 20 28  att dat)..(let (
9f40: 28 63 65 6c 73 20 20 28 73 74 72 69 6e 67 2d 73  (cels  (string-s
9f50: 70 6c 69 74 20 28 63 61 64 72 20 74 3a 6d 61 74  plit (cadr t:mat
9f60: 63 68 29 20 22 7c 22 29 29 29 0a 09 20 20 28 74  ch) "|")))..  (t
9f70: 77 69 6b 69 3a 74 72 20 28 6d 61 70 20 74 77 69  wiki:tr (map twi
9f80: 6b 69 3a 74 64 20 28 74 77 69 6b 69 3a 6c 69 6e  ki:td (twiki:lin
9f90: 65 2d 3e 68 74 6d 6c 20 63 65 6c 73 20 23 66 20  e->html cels #f 
9fa0: 77 69 6b 69 29 29 29 29 29 0a 20 20 20 20 20 20  wiki))))).      
9fb0: 20 28 65 6c 73 65 20 28 6c 69 73 74 20 64 61 74   (else (list dat
9fc0: 29 29 29 29 29 0a 0a 0a 23 7c 0a 28 74 77 69 6b  )))))...#|.(twik
9fd0: 69 3a 64 61 74 2d 3e 68 74 6d 6c 20 22 61 5c 6e  i:dat->html "a\n
9fe0: 7b 7b 7b 5c 6e 62 5c 6e 63 5c 6e 64 5c 6e 7d 7d  {{{\nb\nc\nd\n}}
9ff0: 7d 5c 6e 21 65 5c 6e 5b 5b 66 5d 5d 5c 6e 5b 5b  }\n!e\n[[f]]\n[[
a000: 67 5d 5d 5c 6e 2a 68 22 20 77 69 6b 69 29 0a 28  g]]\n*h" wiki).(
a010: 73 3a 6f 75 74 70 75 74 20 28 63 75 72 72 65 6e  s:output (curren
a020: 74 2d 6f 75 74 70 75 74 2d 70 6f 72 74 29 20 28  t-output-port) (
a030: 74 77 69 6b 69 3a 64 61 74 2d 3e 68 74 6d 6c 20  twiki:dat->html 
a040: 22 21 54 65 73 74 69 6e 67 20 5b 5b 6d 79 20 66  "!Testing [[my f
a050: 69 72 73 74 20 6c 69 6e 6b 5d 5d 5c 6e 2a 20 54  irst link]]\n* T
a060: 65 73 74 5c 6e 2a 20 46 6f 6f 5c 6e 62 6c 61 68  est\n* Foo\nblah
a070: 22 20 77 69 6b 69 29 29 20 20 20 0a 28 73 3a 6f  " wiki))   .(s:o
a080: 75 74 70 75 74 20 28 63 75 72 72 65 6e 74 2d 6f  utput (current-o
a090: 75 74 70 75 74 2d 70 6f 72 74 29 20 28 74 77 69  utput-port) (twi
a0a0: 6b 69 3a 64 61 74 2d 3e 68 74 6d 6c 20 22 5b 5b  ki:dat->html "[[
a0b0: 61 5d 5d 5c 6e 7b 7b 7b 5c 6e 62 5c 6e 20 20 63  a]]\n{{{\nb\n  c
a0c0: 5c 6e 20 20 20 64 5c 6e 7d 7d 7d 5c 6e 2a 78 5c  \n   d\n}}}\n*x\
a0d0: 6e 5b 5b 66 5d 5d 5c 6e 5b 5b 67 5d 5d 5c 6e 2a  n[[f]]\n[[g]]\n*
a0e0: 68 22 20 77 69 6b 69 29 29 0a 28 73 3a 6f 75 74  h" wiki)).(s:out
a0f0: 70 75 74 20 28 63 75 72 72 65 6e 74 2d 6f 75 74  put (current-out
a100: 70 75 74 2d 70 6f 72 74 29 0a 7c 23 0a 0a        put-port).|#..