Artifact 705f97d8d579dfd5150a21076db9d29853e0fc2d:


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 0a 3b 3b 20 54  d5 base64)..;; T
0190: 4f 44 4f 0a 3b 3b 0a 3b 3b 20 2a 20 49 6e 6c 69  ODO.;;.;; * Inli
01a0: 6e 65 20 74 69 64 64 6c 65 72 73 20 5b 69 6e 6c  ne tiddlers [inl
01b0: 69 6e 65 5b 54 69 64 64 6c 65 72 4e 61 6d 65 5d  ine[TiddlerName]
01c0: 5d 0a 3b 3b 20 2a 20 50 69 63 73 20 20 20 20 20  ].;; * Pics     
01d0: 20 20 20 20 20 20 20 5b 70 69 63 20 58 20 59 5b         [pic X Y[
01e0: 70 69 63 6e 61 6d 65 2e 6a 70 67 5d 5d 0a 3b 3b  picname.jpg]].;;
01f0: 20 2a 20 4d 6f 76 65 20 74 77 69 6b 69 20 70 61   * Move twiki pa
0200: 72 73 69 6e 67 2f 65 78 70 61 6e 64 69 6e 67 20  rsing/expanding 
0210: 74 6f 20 6d 61 74 74 73 75 74 69 6c 73 20 61 73  to mattsutils as
0220: 20 6c 6f 61 64 61 62 6c 65 20 6d 6f 64 75 6c 65   loadable module
0230: 0a 0a 3b 3b 20 52 6f 75 74 69 6e 65 73 20 69 6e  ..;; Routines in
0240: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 6f 76 65  tended to be ove
0250: 72 72 69 64 64 65 6e 20 62 79 20 65 6e 64 20 75  rridden by end u
0260: 73 65 72 73 0a 3b 3b 20 20 28 74 77 69 6b 69 3a  sers.;;  (twiki:
0270: 61 63 63 65 73 73 20 6b 65 79 73 20 77 69 6b 69  access keys wiki
0280: 2d 6e 61 6d 65 20 75 73 65 72 2d 69 64 29 0a 3b  -name user-id).;
0290: 3b 20 73 65 61 72 63 68 20 74 68 65 20 63 6f 64  ; search the cod
02a0: 65 20 66 6f 72 20 22 6f 76 65 72 72 69 64 65 22  e for "override"
02b0: 20 66 6f 72 20 6d 6f 72 65 2e 0a 0a 3b 3b 20 74   for more...;; t
02c0: 77 69 6b 69 20 63 73 73 0a 3b 3b 20 3d 3d 3d 3d  wiki css.;; ====
02d0: 3d 3d 3d 3d 3d 0a 3b 3b 20 42 6c 6f 63 6b 20 20  =====.;; Block  
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61                ta
02f0: 67 0a 3b 3b 20 2d 2d 2d 2d 2d 20 20 20 20 20 20  g.;; -----      
0300: 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 0a 3b 3b            ---.;;
0310: 20 74 77 69 6b 69 20 20 20 20 20 20 20 20 20 20   twiki          
0320: 20 20 20 20 20 20 74 77 69 6b 69 0a 3b 3b 20 74        twiki.;; t
0330: 77 69 6b 69 20 62 6f 64 79 20 64 69 76 20 20 20  wiki body div   
0340: 20 20 20 20 74 77 69 6b 69 2d 6e 6f 64 65 0a 3b      twiki-node.;
0350: 3b 20 74 77 69 6b 69 20 6d 61 69 6e 20 6d 65 6e  ; twiki main men
0360: 75 20 20 20 20 20 20 74 77 69 6b 69 2d 6d 61 69  u      twiki-mai
0370: 6e 2d 6d 65 6e 75 0a 0a 3b 3b 20 54 68 69 73 20  n-menu..;; This 
0380: 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  is the currently
0390: 20 73 75 70 70 6f 72 74 65 64 20 6d 65 63 68 61   supported mecha
03a0: 6e 69 73 6d 2e 20 50 6f 73 74 67 72 65 73 20 77  nism. Postgres w
03b0: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 6c 61 74  ill be added lat
03c0: 65 72 20 2d 6d 72 77 2d 20 37 2f 32 36 2f 32 30  er -mrw- 7/26/20
03d0: 30 39 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 74  09.;;.(define (t
03e0: 77 69 6b 69 3a 6f 70 65 6e 2d 64 62 20 6b 65 79  wiki:open-db key
03f0: 20 2e 20 63 72 65 61 74 65 2d 6e 6f 74 2d 6f 6b   . create-not-ok
0400: 29 0a 20 20 3b 3b 20 28 73 3a 6c 6f 67 20 22 47  ).  ;; (s:log "G
0410: 6f 74 20 74 6f 20 74 77 69 6b 69 3a 6f 70 65 6e  ot to twiki:open
0420: 2d 64 62 20 77 69 74 68 20 6b 65 79 3a 20 22 20  -db with key: " 
0430: 6b 65 79 29 0a 20 20 28 6c 65 74 2a 20 28 28 63  key).  (let* ((c
0440: 72 65 61 74 65 2d 6f 6b 20 28 69 66 20 28 6e 75  reate-ok (if (nu
0450: 6c 6c 3f 20 63 72 65 61 74 65 2d 6e 6f 74 2d 6f  ll? create-not-o
0460: 6b 29 20 23 74 20 28 63 61 72 20 63 72 65 61 74  k) #t (car creat
0470: 65 2d 6e 6f 74 2d 6f 6b 29 29 29 0a 09 20 28 66  e-not-ok))).. (f
0480: 64 61 74 20 20 20 20 20 20 28 74 77 69 6b 69 3a  dat      (twiki:
0490: 6b 65 79 2d 3e 66 6e 61 6d 65 20 6b 65 79 29 29  key->fname key))
04a0: 0a 09 20 28 62 61 73 65 70 61 74 68 20 20 28 73  .. (basepath  (s
04b0: 6c 6f 74 2d 72 65 66 20 73 3a 73 65 73 73 69 6f  lot-ref s:sessio
04c0: 6e 20 27 74 77 69 6b 69 64 69 72 29 29 0a 09 20  n 'twikidir)).. 
04d0: 28 66 70 61 74 68 20 20 20 20 20 28 63 61 72 20  (fpath     (car 
04e0: 66 64 61 74 29 29 0a 09 20 28 66 6e 61 6d 65 20  fdat)).. (fname 
04f0: 20 20 20 20 28 63 61 64 72 20 66 64 61 74 29 29      (cadr fdat))
0500: 0a 09 20 28 66 75 6c 6c 6e 61 6d 65 20 20 28 63  .. (fullname  (c
0510: 6f 6e 63 20 62 61 73 65 70 61 74 68 20 22 2f 22  onc basepath "/"
0520: 20 66 70 61 74 68 20 22 2f 22 20 66 6e 61 6d 65   fpath "/" fname
0530: 29 29 0a 09 20 28 66 65 78 69 73 74 73 20 20 20  )).. (fexists   
0540: 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 66 75  (file-exists? fu
0550: 6c 6c 6e 61 6d 65 29 29 0a 09 20 28 64 62 20 20  llname)).. (db  
0560: 20 20 20 20 20 20 28 69 66 20 66 65 78 69 73 74        (if fexist
0570: 73 20 28 64 62 69 3a 6f 70 65 6e 20 27 73 71 6c  s (dbi:open 'sql
0580: 69 74 65 33 20 28 6c 69 73 74 20 28 63 6f 6e 73  ite3 (list (cons
0590: 20 27 64 62 6e 61 6d 65 20 66 75 6c 6c 6e 61 6d   'dbname fullnam
05a0: 65 29 29 29 20 23 66 29 29 29 0a 20 20 20 20 28  e))) #f))).    (
05b0: 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 64 62 29  if (and (not db)
05c0: 0a 09 20 20 20 20 20 28 6e 6f 74 20 63 72 65 61  ..     (not crea
05d0: 74 65 2d 6f 6b 29 29 0a 09 28 65 78 69 74 20 31  te-ok))..(exit 1
05e0: 30 30 29 0a 09 28 62 65 67 69 6e 0a 09 20 20 28  00)..(begin..  (
05f0: 69 66 20 28 6e 6f 74 20 66 65 78 69 73 74 73 29  if (not fexists)
0600: 0a 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09  ..      (begin..
0610: 09 3b 3b 20 28 70 72 69 6e 74 20 22 66 75 6c 6c  .;; (print "full
0620: 6e 61 6d 65 3a 20 22 20 66 75 6c 6c 6e 61 6d 65  name: " fullname
0630: 29 0a 09 09 28 74 77 69 6b 69 3a 72 65 67 69 73  )...(twiki:regis
0640: 74 65 72 2d 77 69 6b 69 20 6b 65 79 20 66 75 6c  ter-wiki key ful
0650: 6c 6e 61 6d 65 29 0a 09 09 28 73 79 73 74 65 6d  lname)...(system
0660: 20 28 63 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70   (conc "mkdir -p
0670: 20 22 20 66 70 61 74 68 29 29 20 3b 3b 20 63 72   " fpath)) ;; cr
0680: 65 61 74 65 20 74 68 65 20 70 61 74 68 0a 09 09  eate the path...
0690: 28 73 65 74 21 20 64 62 20 28 64 62 69 3a 6f 70  (set! db (dbi:op
06a0: 65 6e 20 27 73 71 6c 69 74 65 33 20 28 6c 69 73  en 'sqlite3 (lis
06b0: 74 20 28 63 6f 6e 73 20 27 64 62 6e 61 6d 65 20  t (cons 'dbname 
06c0: 66 75 6c 6c 6e 61 6d 65 29 29 29 29 0a 09 09 28  fullname))))...(
06d0: 66 6f 72 2d 65 61 63 68 20 0a 09 09 20 28 6c 61  for-each ... (la
06e0: 6d 62 64 61 20 28 73 71 72 79 29 0a 09 09 20 20  mbda (sqry)...  
06f0: 20 3b 3b 20 28 70 72 69 6e 74 20 73 71 72 79 29   ;; (print sqry)
0700: 0a 09 09 20 20 20 28 64 62 69 3a 65 78 65 63 20  ...   (dbi:exec 
0710: 64 62 20 73 71 72 79 29 29 0a 09 09 20 3b 3b 20  db sqry))... ;; 
0720: 74 79 70 65 73 3a 20 30 20 74 65 78 74 2c 20 31  types: 0 text, 1
0730: 20 6a 70 67 2c 20 32 20 70 6e 67 2c 20 33 20 73   jpg, 2 png, 3 s
0740: 76 67 2c 20 34 20 73 70 72 65 61 64 73 68 65 65  vg, 4 spreadshee
0750: 74 2c 20 35 20 61 75 64 69 6f 2c 20 36 20 76 69  t, 5 audio, 6 vi
0760: 64 65 6f 20 3a 3a 20 62 65 74 74 65 72 20 73 70  deo :: better sp
0770: 65 63 73 20 74 6f 20 63 6f 6d 65 2e 2e 2e 0a 09  ecs to come.....
0780: 09 20 28 6c 69 73 74 0a 09 09 20 20 22 43 52 45  . (list...  "CRE
0790: 41 54 45 20 54 41 42 4c 45 20 70 69 63 73 20 20  ATE TABLE pics  
07a0: 20 20 20 20 28 69 64 20 49 4e 54 45 47 45 52 20      (id INTEGER 
07b0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 6e 61 6d 65  PRIMARY KEY,name
07c0: 20 54 45 58 54 2c 77 69 6b 69 5f 69 64 20 49 4e   TEXT,wiki_id IN
07d0: 54 45 47 45 52 2c 64 61 74 5f 69 64 20 49 4e 54  TEGER,dat_id INT
07e0: 45 47 45 52 2c 74 68 75 6d 62 5f 64 61 74 5f 69  EGER,thumb_dat_i
07f0: 64 20 49 4e 54 45 47 45 52 2c 63 72 65 61 74 65  d INTEGER,create
0800: 64 5f 6f 6e 20 49 4e 54 45 47 45 52 2c 6f 77 6e  d_on INTEGER,own
0810: 65 72 5f 69 64 20 49 4e 54 45 47 45 52 29 3b 22  er_id INTEGER);"
0820: 0a 09 09 20 20 22 43 52 45 41 54 45 20 54 41 42  ...  "CREATE TAB
0830: 4c 45 20 64 61 74 73 20 20 20 20 20 20 28 69 64  LE dats      (id
0840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0850: 20 4b 45 59 2c 6d 64 35 73 75 6d 20 54 45 58 54   KEY,md5sum TEXT
0860: 2c 64 61 74 20 42 4c 4f 42 2c 74 79 70 65 20 49  ,dat BLOB,type I
0870: 4e 54 45 47 45 52 29 3b 22 0a 09 09 20 20 3b 3b  NTEGER);"...  ;;
0880: 20 6f 6e 20 65 76 65 72 79 20 6d 6f 64 69 66 69   on every modifi
0890: 63 61 74 69 6f 6e 20 61 20 6e 65 77 20 74 69 64  cation a new tid
08a0: 64 6c 65 72 73 20 65 6e 74 72 79 20 69 73 20 63  dlers entry is c
08b0: 72 65 61 74 65 64 2e 20 57 68 65 6e 20 64 69 73  reated. When dis
08c0: 70 6c 61 79 69 6e 67 20 74 68 65 20 74 69 64 64  playing the tidd
08d0: 6c 65 72 73 20 64 6f 3a 0a 09 09 20 20 3b 3b 20  lers do:...  ;; 
08e0: 20 20 20 73 65 6c 65 63 74 20 77 68 65 72 65 20     select where 
08f0: 63 72 65 61 74 65 64 5f 6f 6e 20 3c 20 73 6f 6d  created_on < som
0900: 65 64 61 74 65 20 6f 72 64 65 72 20 62 79 20 63  edate order by c
0910: 72 65 61 74 65 64 5f 6f 6e 20 64 65 73 63 20 6c  reated_on desc l
0920: 69 6d 69 74 20 31 0a 09 09 20 20 22 43 52 45 41  imit 1...  "CREA
0930: 54 45 20 54 41 42 4c 45 20 74 69 64 64 6c 65 72  TE TABLE tiddler
0940: 73 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  s (id INTEGER PR
0950: 49 4d 41 52 59 20 4b 45 59 2c 77 69 6b 69 5f 69  IMARY KEY,wiki_i
0960: 64 20 49 4e 54 45 47 45 52 2c 6e 61 6d 65 20 54  d INTEGER,name T
0970: 45 58 54 2c 72 65 76 20 49 4e 54 45 47 45 52 2c  EXT,rev INTEGER,
0980: 64 61 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 63  dat_id INTEGER,c
0990: 72 65 61 74 65 64 5f 6f 6e 20 49 4e 54 45 47 45  reated_on INTEGE
09a0: 52 2c 6f 77 6e 65 72 5f 69 64 20 49 4e 54 45 47  R,owner_id INTEG
09b0: 45 52 29 3b 22 0a 09 09 20 20 3b 3b 20 72 65 76  ER);"...  ;; rev
09c0: 20 61 6e 64 20 74 61 67 20 6f 6e 6c 79 20 75 74   and tag only ut
09d0: 69 6c 69 7a 65 64 20 77 68 65 6e 20 75 73 65 72  ilized when user
09e0: 20 73 65 74 73 20 61 20 74 61 67 2e 20 41 6c 6c   sets a tag. All
09f0: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 20   results from a 
0a00: 73 65 6c 65 63 74 20 61 73 20 61 62 6f 76 65 20  select as above 
0a10: 66 6f 72 20 74 69 64 64 6c 65 72 73 20 61 72 65  for tiddlers are
0a20: 20 73 65 74 20 74 6f 20 74 68 65 20 74 61 67 0a   set to the tag.
0a30: 09 09 20 20 22 43 52 45 41 54 45 20 54 41 42 4c  ..  "CREATE TABL
0a40: 45 20 72 65 76 73 20 20 20 20 20 28 69 64 20 49  E revs     (id I
0a50: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0a60: 45 59 2c 74 61 67 20 54 45 58 54 29 3b 22 0a 09  EY,tag TEXT);"..
0a70: 09 20 20 3b 3b 20 77 69 6b 69 73 20 69 73 20 68  .  ;; wikis is h
0a80: 65 72 65 20 66 6f 72 20 77 68 65 6e 20 70 6f 73  ere for when pos
0a90: 74 67 72 65 73 71 6c 20 73 75 70 70 6f 72 74 20  tgresql support 
0aa0: 69 73 20 61 64 64 65 64 20 6f 72 20 69 66 20 61  is added or if a
0ab0: 20 73 75 62 20 77 69 6b 69 20 69 73 20 63 72 65   sub wiki is cre
0ac0: 61 74 65 64 2e 20 0a 09 09 20 20 22 43 52 45 41  ated. ...  "CREA
0ad0: 54 45 20 54 41 42 4c 45 20 77 69 6b 69 73 20 20  TE TABLE wikis  
0ae0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52    (id INTEGER PR
0af0: 49 4d 41 52 59 20 4b 45 59 2c 6e 61 6d 65 20 54  IMARY KEY,name T
0b00: 45 58 54 2c 63 72 65 61 74 65 64 5f 6f 6e 20 49  EXT,created_on I
0b10: 4e 54 45 47 45 52 29 3b 22 0a 09 09 20 20 3b 3b  NTEGER);"...  ;;
0b20: 20 61 63 63 65 73 73 20 63 6f 6e 74 72 6f 6c 2c   access control,
0b30: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
0b40: 65 64 20 67 72 6f 75 70 73 20 61 72 65 20 70 72  ed groups are pr
0b50: 69 76 61 74 65 20 67 72 6f 75 70 73 2c 20 70 6f  ivate groups, po
0b60: 73 74 69 76 65 20 6e 75 6d 62 65 72 65 64 20 67  stive numbered g
0b70: 72 6f 75 70 73 20 61 72 65 20 73 79 73 74 65 6d  roups are system
0b80: 20 67 72 6f 75 70 73 0a 09 09 20 20 3b 3b 20 70   groups...  ;; p
0b90: 65 72 6d 69 73 73 69 6f 6e 73 20 61 72 65 20 6f  ermissions are o
0ba0: 6e 20 61 20 70 65 72 2d 77 69 6b 69 20 67 72 61  n a per-wiki gra
0bb0: 6e 75 6c 61 72 69 74 79 0a 09 09 20 20 3b 3b 20  nularity...  ;; 
0bc0: 61 63 63 65 73 73 3b 20 30 3d 6e 6f 6e 65 2c 31  access; 0=none,1
0bd0: 3d 72 65 61 64 2c 32 3d 72 65 61 64 2f 77 72 69  =read,2=read/wri
0be0: 74 65 0a 09 09 20 20 22 43 52 45 41 54 45 20 54  te...  "CREATE T
0bf0: 41 42 4c 45 20 70 65 72 6d 73 20 20 20 20 28 69  ABLE perms    (i
0c00: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
0c10: 59 20 4b 45 59 2c 77 69 6b 69 5f 69 64 20 49 4e  Y KEY,wiki_id IN
0c20: 54 45 47 45 52 2c 67 72 6f 75 70 5f 69 64 20 49  TEGER,group_id I
0c30: 4e 54 45 47 45 52 2c 61 63 63 65 73 73 20 49 4e  NTEGER,access IN
0c40: 54 45 47 45 52 29 3b 22 0a 09 09 20 20 22 43 52  TEGER);"...  "CR
0c50: 45 41 54 45 20 54 41 42 4c 45 20 67 72 6f 75 70  EATE TABLE group
0c60: 73 20 20 20 28 69 64 20 49 4e 54 45 47 45 52 20  s   (id INTEGER 
0c70: 50 52 49 4d 41 52 59 20 4b 45 59 2c 6e 61 6d 65  PRIMARY KEY,name
0c80: 20 54 45 58 54 29 3b 22 0a 09 09 20 20 22 43 52   TEXT);"...  "CR
0c90: 45 41 54 45 20 54 41 42 4c 45 20 6d 65 6d 62 65  EATE TABLE membe
0ca0: 72 73 20 20 28 69 64 20 49 4e 54 45 47 45 52 20  rs  (id INTEGER 
0cb0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 70 65 72 73  PRIMARY KEY,pers
0cc0: 6f 6e 5f 69 64 20 49 4e 54 45 47 45 52 2c 67 72  on_id INTEGER,gr
0cd0: 6f 75 70 5f 69 64 20 49 4e 54 45 47 45 52 29 3b  oup_id INTEGER);
0ce0: 22 0a 09 09 20 20 3b 3b 20 73 65 74 75 70 20 61  "...  ;; setup a
0cf0: 6e 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  nd configuration
0d00: 20 64 61 74 61 0a 09 09 20 20 22 43 52 45 41 54   data...  "CREAT
0d10: 45 20 54 41 42 4c 45 20 6d 65 74 61 20 20 20 20  E TABLE meta    
0d20: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
0d30: 4d 41 52 59 20 4b 45 59 2c 6b 65 79 20 54 45 58  MARY KEY,key TEX
0d40: 54 2c 76 61 6c 20 54 45 58 54 29 3b 22 0a 09 09  T,val TEXT);"...
0d50: 20 20 3b 3b 20 6e 65 65 64 20 74 6f 20 63 72 65    ;; need to cre
0d60: 61 74 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ate an entry for
0d70: 20 2a 74 68 69 73 2a 20 74 77 69 6b 69 0a 09 09   *this* twiki...
0d80: 20 20 28 63 6f 6e 63 20 22 49 4e 53 45 52 54 20    (conc "INSERT 
0d90: 49 4e 54 4f 20 77 69 6b 69 73 20 28 69 64 2c 6e  INTO wikis (id,n
0da0: 61 6d 65 2c 63 72 65 61 74 65 64 5f 6f 6e 29 20  ame,created_on) 
0db0: 56 41 4c 55 45 53 20 28 31 2c 27 6d 61 69 6e 27  VALUES (1,'main'
0dc0: 2c 22 20 28 63 75 72 72 65 6e 74 2d 73 65 63 6f  ," (current-seco
0dd0: 6e 64 73 29 20 22 29 3b 22 29 29 29 0a 09 09 3b  nds) ");")))...;
0de0: 3b 20 20 20 20 20 28 63 6f 6e 63 20 22 49 4e 53  ;     (conc "INS
0df0: 45 52 54 20 49 4e 54 4f 20 74 69 64 64 6c 65 72  ERT INTO tiddler
0e00: 73 20 28 77 69 6b 69 5f 69 64 2c 6e 61 6d 65 2c  s (wiki_id,name,
0e10: 63 72 65 61 74 65 64 5f 6f 6e 29 20 56 41 4c 55  created_on) VALU
0e20: 45 53 28 31 2c 27 4d 61 69 6e 4d 65 6e 75 27 2c  ES(1,'MainMenu',
0e30: 22 20 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e  " (current-secon
0e40: 64 73 29 20 22 29 3b 22 29 29 29 29 29 0a 09 09  ds) ");")))))...
0e50: 28 74 77 69 6b 69 3a 73 61 76 65 2d 74 69 64 64  (twiki:save-tidd
0e60: 6c 65 72 20 64 62 20 22 4d 61 69 6e 4d 65 6e 75  ler db "MainMenu
0e70: 22 20 22 5b 5b 46 69 72 73 74 54 69 64 64 6c 65  " "[[FirstTiddle
0e80: 72 5d 5d 22 20 22 22 20 31 20 31 29 29 29 0a 09  r]]" "" 1 1)))..
0e90: 20 20 28 73 71 6c 69 74 65 33 3a 73 65 74 2d 62    (sqlite3:set-b
0ea0: 75 73 79 2d 74 69 6d 65 6f 75 74 21 28 64 62 69  usy-timeout!(dbi
0eb0: 3a 64 62 2d 63 6f 6e 6e 20 64 62 29 20 31 30 30  :db-conn db) 100
0ec0: 30 30 30 30 29 0a 09 20 20 64 62 29 29 29 29 0a  0000)..  db)))).
0ed0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
0ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 77 69  =========.;; twi
0f20: 6b 69 73 20 28 64 62 20 6e 61 6d 69 6e 67 2c 20  kis (db naming, 
0f30: 73 71 6c 69 74 65 20 76 73 20 70 6f 73 74 67 72  sqlite vs postgr
0f40: 65 73 71 6c 2c 20 6b 65 79 73 20 65 74 63 2e 0a  esql, keys etc..
0f50: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 0a 3b 3b 20 41 20 77  ========..;; A w
0fa0: 69 6b 69 20 69 73 20 73 70 65 63 69 66 69 65 64  iki is specified
0fb0: 20 62 79 20 61 20 6c 69 73 74 20 6f 66 20 6b 65   by a list of ke
0fc0: 79 73 2c 20 68 65 72 65 20 77 65 20 63 6f 6e 76  ys, here we conv
0fd0: 65 72 74 20 74 68 61 74 20 6c 69 73 74 20 74 6f  ert that list to
0fe0: 20 61 20 73 69 6e 67 6c 65 20 73 74 72 69 6e 67   a single string
0ff0: 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a  .(define (twiki:
1000: 6b 65 79 73 2d 3e 6b 65 79 20 6b 65 79 73 29 0a  keys->key keys).
1010: 20 20 28 69 66 20 28 6e 6f 74 20 28 6e 75 6c 6c    (if (not (null
1020: 3f 20 6b 65 79 73 29 29 0a 20 20 20 20 20 20 28  ? keys)).      (
1030: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
1040: 73 65 20 28 6d 61 70 20 63 6f 6e 63 20 6b 65 79  se (map conc key
1050: 73 29 20 22 20 22 29 0a 20 20 20 20 20 20 22 20  s) " ").      " 
1060: 22 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77  "))..(define (tw
1070: 69 6b 69 3a 6b 65 79 2d 3e 66 6e 61 6d 65 20 6b  iki:key->fname k
1080: 65 79 29 0a 20 20 28 6c 65 74 2a 20 28 3b 3b 20  ey).  (let* (;; 
1090: 28 6d 64 35 6b 65 79 70 61 74 68 20 28 6d 64 35  (md5keypath (md5
10a0: 3a 64 69 67 65 73 74 20 6b 65 79 29 29 20 3b 3b  :digest key)) ;;
10b0: 20 28 74 77 69 6b 69 3a 6b 65 79 73 2d 3e 6b 65   (twiki:keys->ke
10c0: 79 20 6b 65 79 73 29 29 29 0a 09 20 28 6b 65 79  y keys))).. (key
10d0: 70 61 74 68 20 20 20 20 28 74 77 69 6b 69 3a 77  path    (twiki:w
10e0: 65 62 36 34 65 6e 63 20 6b 65 79 29 29 0a 09 20  eb64enc key)).. 
10f0: 28 64 65 6c 74 61 20 20 20 20 20 20 28 71 75 6f  (delta      (quo
1100: 74 69 65 6e 74 20 28 73 74 72 69 6e 67 2d 6c 65  tient (string-le
1110: 6e 67 74 68 20 6b 65 79 70 61 74 68 29 20 33 29  ngth keypath) 3)
1120: 29 20 3b 3b 20 0a 09 20 28 70 31 20 20 20 20 20  ) ;; .. (p1     
1130: 20 20 20 20 28 73 75 62 73 74 72 69 6e 67 20 6b      (substring k
1140: 65 79 70 61 74 68 20 30 20 20 20 20 20 20 20 20  eypath 0        
1150: 20 20 20 64 65 6c 74 61 29 29 20 3b 3b 20 20 30     delta)) ;;  0
1160: 20 20 38 29 29 0a 09 20 28 70 32 20 20 20 20 20    8)).. (p2     
1170: 20 20 20 20 28 73 75 62 73 74 72 69 6e 67 20 6b      (substring k
1180: 65 79 70 61 74 68 20 64 65 6c 74 61 20 20 20 20  eypath delta    
1190: 20 20 20 28 2a 20 64 65 6c 74 61 20 32 29 29 29     (* delta 2)))
11a0: 3b 3b 20 20 38 20 31 36 29 29 0a 09 20 28 70 33  ;;  8 16)).. (p3
11b0: 20 20 20 20 20 20 20 20 20 28 73 75 62 73 74 72           (substr
11c0: 69 6e 67 20 6b 65 79 70 61 74 68 20 28 2a 20 64  ing keypath (* d
11d0: 65 6c 74 61 20 32 29 20 28 2a 20 64 65 6c 74 61  elta 2) (* delta
11e0: 20 33 29 29 29 29 20 3b 3b 20 31 36 20 32 34 29   3)))) ;; 16 24)
11f0: 29 0a 20 20 20 20 28 6c 69 73 74 20 28 73 74 72  ).    (list (str
1200: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
1210: 28 6c 69 73 74 20 22 74 77 69 6b 69 73 22 20 70  (list "twikis" p
1220: 31 20 70 32 20 70 33 29 20 22 2f 22 29 20 6b 65  1 p2 p3) "/") ke
1230: 79 70 61 74 68 29 29 29 0a 0a 3b 3b 20 6c 6f 6f  ypath)))..;; loo
1240: 6b 20 75 70 20 74 68 65 20 77 69 64 20 62 61 73  k up the wid bas
1250: 65 64 20 6f 6e 20 74 68 65 20 6b 65 79 73 2c 20  ed on the keys, 
1260: 74 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  this is used for
1270: 20 73 75 62 20 77 69 6b 69 73 20 6f 6e 6c 79 2e   sub wikis only.
1280: 20 49 2e 65 2e 20 61 20 77 69 6b 69 20 69 6e 73   I.e. a wiki ins
1290: 74 61 6e 74 69 61 74 65 64 20 69 6e 73 69 64 65  tantiated inside
12a0: 20 61 6e 6f 74 68 65 72 20 77 69 6b 69 20 0a 3b   another wiki .;
12b0: 3b 20 67 69 76 69 6e 67 20 61 20 73 65 70 61 72  ; giving a separ
12c0: 61 74 65 20 6e 61 6d 65 73 70 61 63 65 20 74 6f  ate namespace to
12d0: 20 61 6c 6c 20 74 68 65 20 74 69 64 64 6c 65 72   all the tiddler
12e0: 73 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  s.(define (twiki
12f0: 3a 6e 61 6d 65 2d 3e 77 69 64 20 64 62 20 6e 61  :name->wid db na
1300: 6d 65 29 20 3b 3b 20 28 73 6c 6f 74 2d 72 65 66  me) ;; (slot-ref
1310: 20 73 3a 73 65 73 73 69 6f 6e 20 27 63 6f 6e 6e   s:session 'conn
1320: 29 0a 20 20 28 6c 65 74 20 28 28 77 69 64 20 28  ).  (let ((wid (
1330: 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 20 22  dbi:get-one db "
1340: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 77  SELECT id FROM w
1350: 69 6b 69 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  ikis WHERE name=
1360: 3f 3b 22 20 6e 61 6d 65 29 29 29 0a 20 20 20 20  ?;" name))).    
1370: 28 69 66 20 77 69 64 20 77 69 64 0a 09 28 62 65  (if wid wid..(be
1380: 67 69 6e 0a 09 20 20 28 64 62 69 3a 65 78 65 63  gin..  (dbi:exec
1390: 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   db "INSERT INTO
13a0: 20 77 69 6b 69 73 20 28 6e 61 6d 65 2c 63 72 65   wikis (name,cre
13b0: 61 74 65 64 5f 6f 6e 29 20 56 41 4c 55 45 53 28  ated_on) VALUES(
13c0: 3f 2c 3f 29 3b 22 20 6e 61 6d 65 20 28 63 75 72  ?,?);" name (cur
13d0: 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 29 0a 09  rent-seconds))..
13e0: 20 20 28 74 77 69 6b 69 3a 6e 61 6d 65 2d 3e 77    (twiki:name->w
13f0: 69 64 20 64 62 20 6e 61 6d 65 29 29 29 29 29 0a  id db name))))).
1400: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
1410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 77 69  =========.;; twi
1450: 6b 69 20 72 65 63 6f 72 64 0a 3b 3b 3d 3d 3d 3d  ki record.;;====
1460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14a0: 3d 3d 0a 0a 3b 3b 20 6d 61 6b 65 2d 76 65 63 74  ==..;; make-vect
14b0: 6f 72 2d 72 65 63 6f 72 64 20 74 77 69 6b 69 20  or-record twiki 
14c0: 77 69 6b 69 20 77 69 64 20 6e 61 6d 65 20 6b 65  wiki wid name ke
14d0: 79 20 64 62 68 0a 28 64 65 66 69 6e 65 20 28 6d  y dbh.(define (m
14e0: 61 6b 65 2d 74 77 69 6b 69 3a 77 69 6b 69 29 28  ake-twiki:wiki)(
14f0: 6d 61 6b 65 2d 76 65 63 74 6f 72 20 35 29 29 0a  make-vector 5)).
1500: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
1510: 74 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 77  twiki:wiki-get-w
1520: 69 64 20 20 20 20 76 65 63 29 20 20 20 20 28 76  id    vec)    (v
1530: 65 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20 30  ector-ref  vec 0
1540: 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e  )).(define-inlin
1550: 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 67 65  e (twiki:wiki-ge
1560: 74 2d 6e 61 6d 65 20 20 20 76 65 63 29 20 20 20  t-name   vec)   
1570: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20 76 65   (vector-ref  ve
1580: 63 20 31 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e  c 1)).(define-in
1590: 6c 69 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69  line (twiki:wiki
15a0: 2d 67 65 74 2d 6b 65 79 20 20 20 20 76 65 63 29  -get-key    vec)
15b0: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20      (vector-ref 
15c0: 20 76 65 63 20 32 29 29 0a 28 64 65 66 69 6e 65   vec 2)).(define
15d0: 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 77  -inline (twiki:w
15e0: 69 6b 69 2d 67 65 74 2d 64 62 68 20 20 20 20 76  iki-get-dbh    v
15f0: 65 63 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72  ec)    (vector-r
1600: 65 66 20 20 76 65 63 20 33 29 29 0a 28 64 65 66  ef  vec 3)).(def
1610: 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b  ine-inline (twik
1620: 69 3a 77 69 6b 69 2d 67 65 74 2d 70 65 72 6d 73  i:wiki-get-perms
1630: 20 20 76 65 63 29 20 20 20 20 28 76 65 63 74 6f    vec)    (vecto
1640: 72 2d 72 65 66 20 20 76 65 63 20 34 29 29 0a 0a  r-ref  vec 4))..
1650: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
1660: 74 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 77  twiki:wiki-set-w
1670: 69 64 21 20 20 20 76 65 63 20 76 61 6c 29 28 76  id!   vec val)(v
1680: 65 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20 30  ector-set! vec 0
1690: 20 76 61 6c 29 29 0a 28 64 65 66 69 6e 65 2d 69   val)).(define-i
16a0: 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b  nline (twiki:wik
16b0: 69 2d 73 65 74 2d 6e 61 6d 65 21 20 20 76 65 63  i-set-name!  vec
16c0: 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74   val)(vector-set
16d0: 21 20 76 65 63 20 31 20 76 61 6c 29 29 0a 28 64  ! vec 1 val)).(d
16e0: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77  efine-inline (tw
16f0: 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 6b 65 79  iki:wiki-set-key
1700: 21 20 20 20 76 65 63 20 76 61 6c 29 28 76 65 63  !   vec val)(vec
1710: 74 6f 72 2d 73 65 74 21 20 76 65 63 20 32 20 76  tor-set! vec 2 v
1720: 61 6c 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c  al)).(define-inl
1730: 69 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d  ine (twiki:wiki-
1740: 73 65 74 2d 64 62 68 21 20 20 20 76 65 63 20 76  set-dbh!   vec v
1750: 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20  al)(vector-set! 
1760: 76 65 63 20 33 20 76 61 6c 29 29 0a 28 64 65 66  vec 3 val)).(def
1770: 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b  ine-inline (twik
1780: 69 3a 77 69 6b 69 2d 73 65 74 2d 70 65 72 6d 73  i:wiki-set-perms
1790: 21 20 76 65 63 20 76 61 6c 29 28 76 65 63 74 6f  ! vec val)(vecto
17a0: 72 2d 73 65 74 21 20 76 65 63 20 34 20 76 61 6c  r-set! vec 4 val
17b0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
17c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
17d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
17e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
17f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1800: 74 77 69 6b 69 20 6d 69 73 63 0a 3b 3b 3d 3d 3d  twiki misc.;;===
1810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1850: 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20  ===..;; returns 
1860: 68 65 6c 70 20 68 74 6d 6c 0a 28 64 65 66 69 6e  help html.(defin
1870: 65 20 28 74 77 69 6b 69 3a 68 65 6c 70 20 73 65  e (twiki:help se
1880: 63 74 69 6f 6e 29 0a 20 20 28 6c 65 74 20 28 28  ction).  (let ((
1890: 6d 61 69 6e 20 28 74 77 69 6b 69 3a 64 69 76 20  main (twiki:div 
18a0: 0a 09 20 20 20 20 20 20 20 27 6e 6f 64 65 20 22  ..       'node "
18b0: 74 77 69 6b 69 2d 68 65 6c 70 22 0a 09 20 20 20  twiki-help"..   
18c0: 20 20 20 20 28 6c 69 73 74 20 0a 09 09 28 74 77      (list ...(tw
18d0: 69 6b 69 3a 68 33 20 22 48 65 6c 70 20 73 74 75  iki:h3 "Help stu
18e0: 66 66 22 29 0a 09 09 28 74 77 69 6b 69 3a 70 72  ff")...(twiki:pr
18f0: 65 20 22 0a 4c 69 6e 6b 20 74 6f 20 70 61 67 65  e ".Link to page
1900: 3a 20 20 20 20 20 20 5b 5b 50 61 67 65 20 54 69  :      [[Page Ti
1910: 74 6c 65 5d 5d 0a 48 65 61 64 69 6e 67 33 3a 20  tle]].Heading3: 
1920: 20 20 20 20 20 20 20 20 20 21 21 21 20 54 68 65           !!! The
1930: 20 68 65 61 64 69 6e 67 0a 55 6e 64 65 72 6c 69   heading.Underli
1940: 6e 65 3a 20 20 20 20 20 20 20 20 20 5f 5f 75 6e  ne:         __un
1950: 64 65 72 6c 69 6e 65 64 5f 5f 0a 54 61 62 6c 65  derlined__.Table
1960: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20  :             | 
1970: 63 65 6c 6c 31 20 7c 20 63 65 6c 6c 32 20 7c 0a  cell1 | cell2 |.
1980: 4c 69 73 74 3a 20 20 20 20 20 20 20 20 20 20 20  List:           
1990: 20 20 20 23 20 69 74 65 6d 31 0a 20 20 20 20 20     # item1.     
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 23                ##
19b0: 20 69 74 65 6d 32 0a 42 75 6c 6c 65 74 3a 20 20   item2.Bullet:  
19c0: 20 20 20 20 20 20 20 20 20 20 2a 20 69 74 65 6d            * item
19d0: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1.              
19e0: 20 20 20 20 20 2a 2a 20 69 74 65 6d 32 0a 50 72       ** item2.Pr
19f0: 65 66 6f 72 6d 61 74 74 65 64 3a 20 20 20 20 20  eformatted:     
1a00: 20 7b 7b 7b 73 74 75 66 66 20 68 65 72 65 7d 7d   {{{stuff here}}
1a10: 7d 0a 49 6e 73 65 72 74 20 61 20 70 69 63 74 75  }.Insert a pictu
1a20: 72 65 3a 20 20 5b 70 69 63 5b 50 69 63 4e 61 6d  re:  [pic[PicNam
1a30: 65 5d 5d 0a 4f 72 20 77 69 74 68 20 73 69 7a 65  e]].Or with size
1a40: 3a 20 20 20 20 20 20 5b 70 69 63 31 30 30 78 31  :      [pic100x1
1a50: 30 30 5b 50 69 63 4e 61 6d 65 5d 5d 0a 55 70 6c  00[PicName]].Upl
1a60: 6f 61 64 20 74 68 65 20 70 69 63 74 75 72 65 20  oad the picture 
1a70: 75 73 69 6e 67 20 74 68 65 20 5c 22 50 69 63 5c  using the \"Pic\
1a80: 22 20 6c 69 6e 6b 20 66 69 72 73 74 22 29 29 29  " link first")))
1a90: 29 29 0a 09 3b 3b 28 63 61 73 65 20 73 65 63 74  ))..;;(case sect
1aa0: 69 6f 6e 0a 20 20 20 20 6d 61 69 6e 29 29 0a 0a  ion.    main))..
1ab0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
1ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1af0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 77 69 6b  ========.;; twik
1b00: 69 20 61 63 63 65 73 73 20 63 6f 6e 74 72 6f 6c  i access control
1b10: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
1b20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b40: 3d 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 0a 0a 3b 3b 20 69 64  =========..;; id
1b60: 65 61 20 68 65 72 65 20 69 73 20 66 6f 72 20 74  ea here is for t
1b70: 68 65 20 65 6e 64 20 75 73 65 72 20 74 6f 20 72  he end user to r
1b80: 65 64 65 66 69 6e 65 20 74 68 69 73 20 72 6f 75  edefine this rou
1b90: 74 69 6e 65 2c 0a 3b 3b 20 61 6e 64 20 63 61 6c  tine,.;; and cal
1ba0: 6c 20 74 77 69 6b 69 3a 69 6e 74 65 72 61 6c 2d  l twiki:interal-
1bb0: 61 63 63 65 73 73 20 69 66 20 64 65 73 69 72 65  access if desire
1bc0: 64 0a 3b 3b 20 0a 3b 3b 20 69 66 20 6f 76 65 72  d.;; .;; if over
1bd0: 72 69 64 65 20 69 73 20 23 74 20 74 68 65 6e 20  ride is #t then 
1be0: 67 69 76 65 20 61 63 63 65 73 73 20 6e 6f 20 6d  give access no m
1bf0: 61 74 74 65 72 20 77 68 61 74 0a 28 64 65 66 69  atter what.(defi
1c00: 6e 65 20 28 74 77 69 6b 69 3a 61 63 63 65 73 73  ne (twiki:access
1c10: 20 6b 65 79 73 20 77 69 6b 69 2d 6e 61 6d 65 20   keys wiki-name 
1c20: 75 73 65 72 2d 69 64 29 0a 20 20 27 28 72 20 77  user-id).  '(r w
1c30: 29 29 0a 0a 3b 3b 20 41 64 64 20 73 75 70 70 6f  ))..;; Add suppo
1c40: 72 74 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 67  rt for storing g
1c50: 72 6f 75 70 73 2c 20 75 73 65 72 73 20 61 6e 64  roups, users and
1c60: 20 61 63 63 65 73 73 20 69 6e 74 65 72 6e 61 6c   access internal
1c70: 6c 79 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28  ly.;; .(define (
1c80: 74 77 69 6b 69 3a 69 6e 74 65 72 6e 61 6c 2d 61  twiki:internal-a
1c90: 63 63 65 73 73 20 6b 65 79 73 20 77 69 6b 69 2d  ccess keys wiki-
1ca0: 6e 61 6d 65 20 75 73 65 72 2d 69 64 29 0a 20 20  name user-id).  
1cb0: 23 66 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  #f)..;;=========
1cc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1cd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ce0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1cf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
1d00: 20 74 77 69 6b 69 20 72 65 67 69 73 74 72 79 0a   twiki registry.
1d10: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
1d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d50: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 74 68 65  ========..;; the
1d60: 73 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  se can be overri
1d70: 64 64 65 6e 20 62 79 20 65 6e 64 20 75 73 65 72  dden by end user
1d80: 20 28 6a 75 73 74 20 63 72 65 61 74 65 20 61 20   (just create a 
1d90: 6e 65 77 20 72 6f 75 74 69 6e 65 20 62 79 20 74  new routine by t
1da0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 29 0a 0a 28  he same name)..(
1db0: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 6f 70  define (twiki:op
1dc0: 65 6e 2d 72 65 67 69 73 74 72 79 29 0a 20 20 28  en-registry).  (
1dd0: 6c 65 74 2a 20 28 28 62 61 73 65 70 61 74 68 20  let* ((basepath 
1de0: 20 28 73 6c 6f 74 2d 72 65 66 20 73 3a 73 65 73   (slot-ref s:ses
1df0: 73 69 6f 6e 20 27 73 72 6f 6f 74 29 29 0a 09 20  sion 'sroot)).. 
1e00: 28 72 65 67 66 69 6c 65 20 20 20 28 63 6f 6e 63  (regfile   (conc
1e10: 20 62 61 73 65 70 61 74 68 20 22 2f 74 77 69 6b   basepath "/twik
1e20: 69 73 2f 72 65 67 69 73 74 72 79 2e 64 62 22 29  is/registry.db")
1e30: 29 0a 09 20 28 72 65 67 65 78 69 73 74 73 20 28  ).. (regexists (
1e40: 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 72 65 67  file-exists? reg
1e50: 66 69 6c 65 29 29 0a 09 20 28 64 62 20 20 20 20  file)).. (db    
1e60: 20 20 20 20 28 64 62 69 3a 6f 70 65 6e 20 27 73      (dbi:open 's
1e70: 71 6c 69 74 65 33 20 28 6c 69 73 74 20 28 63 6f  qlite3 (list (co
1e80: 6e 73 20 27 64 62 6e 61 6d 65 20 72 65 67 66 69  ns 'dbname regfi
1e90: 6c 65 29 29 29 29 29 0a 20 20 20 20 28 69 66 20  le))))).    (if 
1ea0: 72 65 67 65 78 69 73 74 73 0a 09 64 62 0a 09 28  regexists..db..(
1eb0: 62 65 67 69 6e 0a 09 20 20 28 66 6f 72 2d 65 61  begin..  (for-ea
1ec0: 63 68 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74  ch (lambda (stmt
1ed0: 29 28 64 62 69 3a 65 78 65 63 20 64 62 20 73 74  )(dbi:exec db st
1ee0: 6d 74 29 29 0a 09 09 20 20 20 20 28 6c 69 73 74  mt))...    (list
1ef0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 77   "CREATE TABLE w
1f00: 69 6b 69 73 20 28 6b 65 79 20 54 45 58 54 20 50  ikis (key TEXT P
1f10: 52 49 4d 41 52 59 20 4b 45 59 2c 70 61 74 68 20  RIMARY KEY,path 
1f20: 54 45 58 54 2c 63 72 65 61 74 69 6f 6e 5f 64 61  TEXT,creation_da
1f30: 74 65 20 49 4e 54 45 47 45 52 2c 63 72 65 61 74  te INTEGER,creat
1f40: 6f 72 5f 69 64 20 49 4e 54 45 47 45 52 29 3b 22  or_id INTEGER);"
1f50: 29 29 0a 09 20 20 64 62 29 29 29 29 0a 0a 28 64  ))..  db))))..(d
1f60: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 72 65 67  efine (twiki:reg
1f70: 69 73 74 65 72 2d 77 69 6b 69 20 6b 65 79 20 70  ister-wiki key p
1f80: 61 74 68 29 0a 20 20 28 6c 65 74 20 28 28 64 62  ath).  (let ((db
1f90: 20 28 74 77 69 6b 69 3a 6f 70 65 6e 2d 72 65 67   (twiki:open-reg
1fa0: 69 73 74 72 79 29 29 29 0a 20 20 20 20 28 64 62  istry))).    (db
1fb0: 69 3a 65 78 65 63 20 64 62 20 0a 09 20 20 20 20  i:exec db ..    
1fc0: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50    "INSERT OR REP
1fd0: 4c 41 43 45 20 49 4e 54 4f 20 77 69 6b 69 73 20  LACE INTO wikis 
1fe0: 28 6b 65 79 2c 70 61 74 68 2c 63 72 65 61 74 69  (key,path,creati
1ff0: 6f 6e 5f 64 61 74 65 2c 63 72 65 61 74 6f 72 5f  on_date,creator_
2000: 69 64 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  id) VALUES(?,?,?
2010: 2c 3f 29 3b 22 0a 09 20 20 20 20 20 20 6b 65 79  ,?);"..      key
2020: 20 70 61 74 68 20 28 63 75 72 72 65 6e 74 2d 73   path (current-s
2030: 65 63 6f 6e 64 73 29 20 28 74 77 69 6b 69 3a 67  econds) (twiki:g
2040: 65 74 2d 69 64 29 29 0a 20 20 20 20 28 64 62 69  et-id)).    (dbi
2050: 3a 63 6c 6f 73 65 20 64 62 29 29 29 0a 0a 3b 3b  :close db)))..;;
2060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2090: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20a0: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 69 64 64 6c 65  ======.;; tiddle
20b0: 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  rs.;;===========
20c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
2100: 66 69 6e 65 20 74 77 69 6b 69 3a 74 69 64 64 6c  fine twiki:tiddl
2110: 65 72 2d 73 65 6c 65 63 74 6f 72 20 22 53 45 4c  er-selector "SEL
2120: 45 43 54 20 74 2e 69 64 2c 74 2e 6e 61 6d 65 2c  ECT t.id,t.name,
2130: 74 2e 72 65 76 2c 74 2e 64 61 74 5f 69 64 2c 74  t.rev,t.dat_id,t
2140: 2e 63 72 65 61 74 65 64 5f 6f 6e 2c 74 2e 6f 77  .created_on,t.ow
2150: 6e 65 72 5f 69 64 20 46 52 4f 4d 20 74 69 64 64  ner_id FROM tidd
2160: 6c 65 72 73 20 41 53 20 74 20 49 4e 4e 45 52 20  lers AS t INNER 
2170: 4a 4f 49 4e 20 64 61 74 73 20 41 53 20 64 20 4f  JOIN dats AS d O
2180: 4e 20 74 2e 64 61 74 5f 69 64 3d 64 2e 69 64 22  N t.dat_id=d.id"
2190: 29 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  ).(define (twiki
21a0: 3a 74 69 64 64 6c 65 72 2d 6d 61 6b 65 29 28 6d  :tiddler-make)(m
21b0: 61 6b 65 2d 76 65 63 74 6f 72 20 38 20 23 66 29  ake-vector 8 #f)
21c0: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
21d0: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
21e0: 67 65 74 2d 69 64 20 20 20 20 20 20 20 20 20 20  get-id          
21f0: 20 76 65 63 29 20 20 20 20 28 76 65 63 74 6f 72   vec)    (vector
2200: 2d 72 65 66 20 20 76 65 63 20 30 29 29 0a 28 64  -ref  vec 0)).(d
2210: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77  efine-inline (tw
2220: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d  iki:tiddler-get-
2230: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 76 65 63  name         vec
2240: 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66  )    (vector-ref
2250: 20 20 76 65 63 20 31 29 29 0a 28 64 65 66 69 6e    vec 1)).(defin
2260: 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a  e-inline (twiki:
2270: 74 69 64 64 6c 65 72 2d 67 65 74 2d 72 65 76 20  tiddler-get-rev 
2280: 20 20 20 20 20 20 20 20 20 76 65 63 29 20 20 20           vec)   
2290: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20 76 65   (vector-ref  ve
22a0: 63 20 32 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e  c 2)).(define-in
22b0: 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64  line (twiki:tidd
22c0: 6c 65 72 2d 67 65 74 2d 64 61 74 2d 69 64 20 20  ler-get-dat-id  
22d0: 20 20 20 20 20 76 65 63 29 20 20 20 20 28 76 65       vec)    (ve
22e0: 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20 33 29  ctor-ref  vec 3)
22f0: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
2300: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
2310: 67 65 74 2d 63 72 65 61 74 65 64 5f 6f 6e 20 20  get-created_on  
2320: 20 76 65 63 29 20 20 20 20 28 76 65 63 74 6f 72   vec)    (vector
2330: 2d 72 65 66 20 20 76 65 63 20 34 29 29 0a 28 64  -ref  vec 4)).(d
2340: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77  efine-inline (tw
2350: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d  iki:tiddler-get-
2360: 6f 77 6e 65 72 5f 69 64 20 20 20 20 20 76 65 63  owner_id     vec
2370: 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66  )    (vector-ref
2380: 20 20 76 65 63 20 35 29 29 0a 3b 3b 20 28 64 65    vec 5)).;; (de
2390: 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69  fine-inline (twi
23a0: 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 64  ki:tiddler-get-d
23b0: 61 74 2d 74 79 70 65 20 20 20 20 20 76 65 63 29  at-type     vec)
23c0: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20      (vector-ref 
23d0: 20 76 65 63 20 36 29 29 0a 0a 28 64 65 66 69 6e   vec 6))..(defin
23e0: 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a  e-inline (twiki:
23f0: 74 69 64 64 6c 65 72 2d 73 65 74 2d 69 64 21 20  tiddler-set-id! 
2400: 20 20 20 20 20 20 20 20 20 76 65 63 20 76 61 6c           vec val
2410: 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65  )(vector-set! ve
2420: 63 20 30 20 76 61 6c 29 20 76 65 63 29 0a 28 64  c 0 val) vec).(d
2430: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77  efine-inline (tw
2440: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d  iki:tiddler-set-
2450: 6e 61 6d 65 21 20 20 20 20 20 20 20 20 76 65 63  name!        vec
2460: 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74   val)(vector-set
2470: 21 20 76 65 63 20 31 20 76 61 6c 29 20 76 65 63  ! vec 1 val) vec
2480: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
2490: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
24a0: 73 65 74 2d 72 65 76 21 20 20 20 20 20 20 20 20  set-rev!        
24b0: 20 76 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72   vec val)(vector
24c0: 2d 73 65 74 21 20 76 65 63 20 32 20 76 61 6c 29  -set! vec 2 val)
24d0: 20 76 65 63 29 0a 28 64 65 66 69 6e 65 2d 69 6e   vec).(define-in
24e0: 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64  line (twiki:tidd
24f0: 6c 65 72 2d 73 65 74 2d 64 61 74 2d 69 64 21 20  ler-set-dat-id! 
2500: 20 20 20 20 20 76 65 63 20 76 61 6c 29 28 76 65       vec val)(ve
2510: 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20 33 20  ctor-set! vec 3 
2520: 76 61 6c 29 20 76 65 63 29 0a 28 64 65 66 69 6e  val) vec).(defin
2530: 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a  e-inline (twiki:
2540: 74 69 64 64 6c 65 72 2d 73 65 74 2d 63 72 65 61  tiddler-set-crea
2550: 74 65 64 5f 6f 6e 21 20 20 76 65 63 20 76 61 6c  ted_on!  vec val
2560: 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65  )(vector-set! ve
2570: 63 20 34 20 76 61 6c 29 20 76 65 63 29 0a 3b 3b  c 4 val) vec).;;
2580: 20 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20   (define-inline 
2590: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73  (twiki:tiddler-s
25a0: 65 74 2d 6f 77 6e 65 72 5f 69 64 21 20 20 20 20  et-owner_id!    
25b0: 76 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72 2d  vec val)(vector-
25c0: 73 65 74 21 20 76 65 63 20 35 20 76 61 6c 29 29  set! vec 5 val))
25d0: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
25e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 52 6f  ==========.;; Ro
2620: 75 74 69 6e 65 73 20 66 6f 72 20 64 69 73 70 6c  utines for displ
2630: 61 79 69 6e 67 2c 20 65 64 69 74 69 6e 67 2c 20  aying, editing, 
2640: 62 72 6f 77 73 69 6e 67 20 65 74 63 2e 20 74 69  browsing etc. ti
2650: 64 64 6c 65 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  ddlers.;;=======
2660: 3d 3d 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 09  ===============.
26a0: 0a 0a 3b 3b 20 73 68 6f 75 6c 64 20 63 68 61 6e  ..;; should chan
26b0: 67 65 20 74 68 69 73 20 74 6f 20 74 61 6b 65 20  ge this to take 
26c0: 61 20 74 69 64 64 6c 65 72 20 73 74 72 75 63 74  a tiddler struct
26d0: 75 72 65 3f 0a 3b 3b 20 54 68 69 73 20 69 73 20  ure?.;; This is 
26e0: 74 68 65 20 64 69 73 70 6c 61 79 20 6f 66 20 61  the display of a
26f0: 20 73 69 6e 67 6c 65 20 74 69 64 64 6c 65 72 0a   single tiddler.
2700: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 76  (define (twiki:v
2710: 69 65 77 20 64 61 74 20 20 74 6b 65 79 20 77 69  iew dat  tkey wi
2720: 64 20 74 69 64 64 6c 65 72 20 77 69 6b 69 29 20  d tiddler wiki) 
2730: 3b 3b 20 63 6c 6f 73 65 2c 20 63 6c 6f 73 65 20  ;; close, close 
2740: 6f 74 68 65 72 73 2c 20 65 64 69 74 2c 20 6d 6f  others, edit, mo
2750: 72 65 0a 20 20 28 6c 65 74 20 28 28 69 73 2d 6e  re.  (let ((is-n
2760: 6f 74 2d 6d 61 69 6e 20 20 28 6e 6f 74 20 28 65  ot-main  (not (e
2770: 71 75 61 6c 3f 20 22 4d 61 69 6e 4d 65 6e 75 22  qual? "MainMenu"
2780: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
2790: 67 65 74 2d 6e 61 6d 65 20 74 69 64 64 6c 65 72  get-name tiddler
27a0: 29 29 29 29 0a 09 28 65 64 69 74 2d 61 6c 6c 6f  ))))..(edit-allo
27b0: 77 65 64 20 28 6d 65 6d 62 65 72 20 27 77 20 28  wed (member 'w (
27c0: 74 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 70  twiki:wiki-get-p
27d0: 65 72 6d 73 20 77 69 6b 69 29 29 29 29 0a 20 20  erms wiki)))).  
27e0: 20 20 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20    (s:div 'class 
27f0: 22 74 69 64 64 6c 65 72 22 0a 09 20 20 20 28 73  "tiddler"..   (s
2800: 3a 64 69 76 20 27 63 6c 61 73 73 20 22 74 69 64  :div 'class "tid
2810: 64 6c 65 72 2d 6d 65 6e 75 22 0a 09 09 20 20 28  dler-menu"...  (
2820: 69 66 20 28 65 71 75 61 6c 3f 20 22 4d 61 69 6e  if (equal? "Main
2830: 4d 65 6e 75 22 20 28 74 77 69 6b 69 3a 74 69 64  Menu" (twiki:tid
2840: 64 6c 65 72 2d 67 65 74 2d 6e 61 6d 65 20 74 69  dler-get-name ti
2850: 64 64 6c 65 72 29 29 0a 09 09 20 20 20 20 20 20  ddler))...      
2860: 28 69 66 20 65 64 69 74 2d 61 6c 6c 6f 77 65 64  (if edit-allowed
2870: 0a 09 09 09 20 20 28 6c 69 73 74 20 28 73 3a 61  ....  (list (s:a
2880: 20 22 65 64 69 74 22 20 27 68 72 65 66 0a 09 09   "edit" 'href...
2890: 09 09 20 20 20 20 20 28 73 3a 6c 69 6e 6b 2d 74  ..     (s:link-t
28a0: 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e  o (twiki:get-lin
28b0: 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e  k-back-to-curren
28c0: 74 29 0a 09 09 09 09 09 09 27 65 64 69 74 5f 74  t).......'edit_t
28d0: 69 64 64 6c 65 72 20 28 74 77 69 6b 69 3a 74 69  iddler (twiki:ti
28e0: 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 69 64  ddler-get-id tid
28f0: 64 6c 65 72 29 29 29 29 0a 09 09 09 20 20 27 28  dler))))....  '(
2900: 29 29 0a 09 09 20 20 20 20 20 20 28 73 3a 64 69  ))...      (s:di
2910: 76 20 27 63 6c 61 73 73 20 22 74 69 64 64 6c 65  v 'class "tiddle
2920: 72 2d 6d 65 6e 75 2d 69 6e 74 65 72 6e 61 6c 22  r-menu-internal"
2930: 0a 09 09 20 20 20 20 20 20 20 28 73 3a 61 20 22  ...       (s:a "
2940: 63 6c 6f 73 65 22 20 27 68 72 65 66 20 28 73 3a  close" 'href (s:
2950: 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67  link-to (twiki:g
2960: 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d  et-link-back-to-
2970: 63 75 72 72 65 6e 74 29 20 27 63 6c 6f 73 65 5f  current) 'close_
2980: 74 69 64 64 6c 65 72 20 28 74 77 69 6b 69 3a 74  tiddler (twiki:t
2990: 69 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 69  iddler-get-id ti
29a0: 64 64 6c 65 72 29 29 29 20 22 2e 22 0a 09 09 20  ddler))) "."... 
29b0: 20 20 20 20 20 20 28 73 3a 61 20 22 63 6c 6f 73        (s:a "clos
29c0: 65 20 6f 74 68 65 72 73 22 20 27 68 72 65 66 20  e others" 'href 
29d0: 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b  (s:link-to (twik
29e0: 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d  i:get-link-back-
29f0: 74 6f 2d 63 75 72 72 65 6e 74 29 20 27 63 6c 6f  to-current) 'clo
2a00: 73 65 5f 6f 74 68 65 72 5f 74 69 64 64 6c 65 72  se_other_tiddler
2a10: 73 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72  s (twiki:tiddler
2a20: 2d 67 65 74 2d 69 64 20 74 69 64 64 6c 65 72 29  -get-id tiddler)
2a30: 29 29 20 22 2e 22 0a 09 09 20 20 20 20 20 20 20  )) "."...       
2a40: 28 69 66 20 65 64 69 74 2d 61 6c 6c 6f 77 65 64  (if edit-allowed
2a50: 0a 09 09 09 20 20 20 28 73 3a 61 20 22 65 64 69  ....   (s:a "edi
2a60: 74 22 20 20 27 68 72 65 66 20 28 73 3a 6c 69 6e  t"  'href (s:lin
2a70: 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d  k-to (twiki:get-
2a80: 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72  link-back-to-cur
2a90: 72 65 6e 74 29 20 27 65 64 69 74 5f 74 69 64 64  rent) 'edit_tidd
2aa0: 6c 65 72 20 28 74 77 69 6b 69 3a 74 69 64 64 6c  ler (twiki:tiddl
2ab0: 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64 6c 65  er-get-id tiddle
2ac0: 72 29 29 29 0a 09 09 09 20 20 20 27 28 29 29 29  r)))....   '()))
2ad0: 29 29 0a 09 20 20 20 20 28 73 3a 70 20 28 74 77  ))..    (s:p (tw
2ae0: 69 6b 69 3a 64 61 74 2d 3e 68 74 6d 6c 20 64 61  iki:dat->html da
2af0: 74 20 77 69 6b 69 29 29 29 29 29 0a 0a 28 64 65  t wiki)))))..(de
2b00: 66 69 6e 65 20 28 74 77 69 6b 69 3a 76 69 65 77  fine (twiki:view
2b10: 2d 74 69 64 64 6c 65 72 20 64 62 20 20 74 6b 65  -tiddler db  tke
2b20: 79 20 77 69 64 20 74 69 64 64 6c 65 72 20 77 69  y wid tiddler wi
2b30: 6b 69 29 0a 20 20 28 6c 65 74 2a 20 28 28 64 61  ki).  (let* ((da
2b40: 74 2d 69 64 20 28 74 77 69 6b 69 3a 74 69 64 64  t-id (twiki:tidd
2b50: 6c 65 72 2d 67 65 74 2d 64 61 74 2d 69 64 20 74  ler-get-dat-id t
2b60: 69 64 64 6c 65 72 29 29 0a 09 20 28 64 61 74 20  iddler)).. (dat 
2b70: 20 20 20 28 74 77 69 6b 69 3a 67 65 74 2d 64 61     (twiki:get-da
2b80: 74 20 64 62 20 64 61 74 2d 69 64 29 29 0a 09 20  t db dat-id)).. 
2b90: 28 74 6e 75 6d 20 20 20 28 74 77 69 6b 69 3a 74  (tnum   (twiki:t
2ba0: 69 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 69  iddler-get-id ti
2bb0: 64 64 6c 65 72 29 29 29 0a 20 20 20 20 3b 3b 20  ddler))).    ;; 
2bc0: 28 73 3a 6c 6f 67 20 22 74 77 69 64 3a 20 22 20  (s:log "twid: " 
2bd0: 64 61 74 2d 69 64 20 22 20 64 61 74 3a 20 22 20  dat-id " dat: " 
2be0: 64 61 74 29 0a 20 20 20 20 28 74 77 69 6b 69 3a  dat).    (twiki:
2bf0: 76 69 65 77 20 64 61 74 20 20 74 6b 65 79 20 77  view dat  tkey w
2c00: 69 64 20 74 69 64 64 6c 65 72 20 77 69 6b 69 29  id tiddler wiki)
2c10: 29 29 0a 0a 3b 3b 20 63 61 6c 6c 20 77 69 74 68  ))..;; call with
2c20: 20 70 61 72 61 6d 20 3d 3e 20 61 63 74 69 6f 6e   param => action
2c30: 2d 6e 61 6d 65 2d 6b 65 79 20 65 2e 67 2e 20 73  -name-key e.g. s
2c40: 61 76 65 2d 62 57 46 70 62 67 5f 5f 2d 61 47 56  ave-bWFpbg__-aGV
2c50: 73 62 47 38 67 62 6e 56 79 63 32 55 5f 20 28 73  sbG8gbnVyc2U_ (s
2c60: 61 76 65 20 6d 61 69 6e 20 22 68 65 6c 6c 6f 20  ave main "hello 
2c70: 6e 75 72 73 65 22 29 0a 3b 3b 20 74 68 69 73 20  nurse").;; this 
2c80: 6f 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  one is called wh
2c90: 65 6e 20 61 6e 20 65 64 69 74 20 66 6f 72 6d 20  en an edit form 
2ca0: 69 73 20 73 75 62 6d 69 74 74 65 64 20 28 69 2e  is submitted (i.
2cb0: 65 2e 20 50 4f 53 54 29 0a 28 64 65 66 69 6e 65  e. POST).(define
2cc0: 20 28 74 77 69 6b 69 3a 61 63 74 69 6f 6e 20 70   (twiki:action p
2cd0: 61 72 61 6d 73 29 0a 20 20 28 69 66 20 28 61 6e  arams).  (if (an
2ce0: 64 20 28 6c 69 73 74 3f 20 70 61 72 61 6d 73 29  d (list? params)
2cf0: 0a 09 20 20 20 28 3e 20 28 6c 65 6e 67 74 68 20  ..   (> (length 
2d00: 70 61 72 61 6d 73 29 20 30 29 29 0a 20 20 20 20  params) 0)).    
2d10: 20 20 28 6c 65 74 2a 20 28 28 63 6d 64 6c 6e 20    (let* ((cmdln 
2d20: 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 63  (string-split (c
2d30: 61 72 20 70 61 72 61 6d 73 29 20 22 2d 22 29 29  ar params) "-"))
2d40: 0a 09 20 20 20 20 20 28 63 6d 64 20 20 20 28 73  ..     (cmd   (s
2d50: 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 63  tring->symbol (c
2d60: 61 72 20 63 6d 64 6c 6e 29 29 29 0a 09 20 20 20  ar cmdln)))..   
2d70: 20 20 28 74 6b 65 79 20 20 28 74 77 69 6b 69 3a    (tkey  (twiki:
2d80: 77 65 62 36 34 64 65 63 20 28 63 61 64 64 72 20  web64dec (caddr 
2d90: 63 6d 64 6c 6e 29 29 29 0a 09 20 20 20 20 20 28  cmdln)))..     (
2da0: 77 69 64 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e  wid   (string->n
2db0: 75 6d 62 65 72 20 28 63 61 64 72 20 63 6d 64 6c  umber (cadr cmdl
2dc0: 6e 29 29 29 0a 09 20 20 20 20 20 28 74 64 62 20  n)))..     (tdb 
2dd0: 20 20 28 74 77 69 6b 69 3a 6f 70 65 6e 2d 64 62    (twiki:open-db
2de0: 20 74 6b 65 79 29 29 29 0a 09 28 73 3a 6c 6f 67   tkey)))..(s:log
2df0: 20 22 63 6d 64 6c 6e 3a 20 22 20 63 6d 64 6c 6e   "cmdln: " cmdln
2e00: 20 22 20 63 6d 64 3a 20 22 20 63 6d 64 20 22 20   " cmd: " cmd " 
2e10: 74 6b 65 79 3a 20 22 20 74 6b 65 79 20 22 20 77  tkey: " tkey " w
2e20: 69 64 3a 20 22 20 77 69 64 29 0a 09 28 63 61 73  id: " wid)..(cas
2e30: 65 20 63 6d 64 0a 09 20 20 28 28 73 61 76 65 29  e cmd..  ((save)
2e40: 0a 09 20 20 20 28 74 77 69 6b 69 3a 73 61 76 65  ..   (twiki:save
2e50: 2d 63 75 72 72 2d 74 69 64 64 6c 65 72 20 74 64  -curr-tiddler td
2e60: 62 20 77 69 64 29 29 0a 09 20 20 28 28 73 61 76  b wid))..  ((sav
2e70: 65 70 69 63 29 0a 09 20 20 20 28 73 3a 6c 6f 67  epic)..   (s:log
2e80: 20 22 74 77 69 6b 69 3a 61 63 74 69 6f 6e 20 67   "twiki:action g
2e90: 6f 74 20 74 6f 20 73 61 76 65 70 69 63 22 29 0a  ot to savepic").
2ea0: 09 20 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d  .   (twiki:save-
2eb0: 70 69 63 2d 66 72 6f 6d 2d 66 6f 72 6d 20 74 64  pic-from-form td
2ec0: 62 20 77 69 64 29 29 0a 09 20 20 28 28 63 61 6e  b wid))..  ((can
2ed0: 63 65 6c 29 20 3b 3b 20 64 65 70 72 65 63 61 74  cel) ;; deprecat
2ee0: 65 64 2e 20 55 73 65 20 61 20 6c 69 6e 6b 20 66  ed. Use a link f
2ef0: 6f 72 20 74 68 69 73 20 28 69 2e 65 20 69 6e 20  or this (i.e in 
2f00: 74 68 65 20 74 77 69 6b 69 3a 74 77 69 6b 69 20  the twiki:twiki 
2f10: 70 72 6f 63 0a 09 20 20 20 28 73 3a 64 65 6c 21  proc..   (s:del!
2f20: 20 28 63 6f 6e 63 20 22 43 55 52 52 45 4e 54 5f   (conc "CURRENT_
2f30: 54 57 49 44 4c 45 52 5f 55 4e 44 45 52 5f 45 44  TWIDLER_UNDER_ED
2f40: 49 54 3a 22 20 77 69 64 29 29 0a 09 20 20 20 29  IT:" wid))..   )
2f50: 29 29 29 29 0a 0a 3b 3b 20 67 65 6e 65 72 61 74  ))))..;; generat
2f60: 65 20 61 20 66 6f 72 6d 20 66 6f 72 20 65 64 69  e a form for edi
2f70: 74 69 6e 67 20 61 20 74 77 69 64 64 6c 65 72 20  ting a twiddler 
2f80: 74 6e 75 6d 0a 28 64 65 66 69 6e 65 20 28 74 77  tnum.(define (tw
2f90: 69 6b 69 3a 65 64 69 74 2d 74 69 64 64 6c 65 72  iki:edit-tiddler
2fa0: 20 64 62 20 74 6b 65 79 20 77 69 64 20 74 6e 75   db tkey wid tnu
2fb0: 6d 29 0a 20 20 28 73 3a 6c 6f 67 20 22 74 77 69  m).  (s:log "twi
2fc0: 6b 69 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 3a  ki:edit-tiddler:
2fd0: 20 74 6b 65 79 3d 22 20 74 6b 65 79 20 22 20 77   tkey=" tkey " w
2fe0: 69 64 3a 20 22 20 77 69 64 29 0a 20 20 28 6c 65  id: " wid).  (le
2ff0: 74 2a 20 28 28 65 6e 63 2d 6b 65 79 20 20 28 74  t* ((enc-key  (t
3000: 77 69 6b 69 3a 77 65 62 36 34 65 6e 63 20 74 6b  wiki:web64enc tk
3010: 65 79 29 29 0a 09 20 28 74 69 64 64 61 74 73 20  ey)).. (tiddats 
3020: 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64   (twiki:get-tidd
3030: 6c 65 72 73 2d 62 79 2d 6e 75 6d 20 64 62 20 77  lers-by-num db w
3040: 69 64 20 28 6c 69 73 74 20 74 6e 75 6d 29 29 29  id (list tnum)))
3050: 29 0a 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f  ).    (if (null?
3060: 20 74 69 64 64 61 74 73 29 0a 09 28 6c 65 74 2a   tiddats)..(let*
3070: 20 28 28 74 69 64 20 20 20 20 30 29 0a 09 20 20   ((tid    0)..  
3080: 20 20 20 20 20 28 64 61 74 2d 69 64 20 30 29 29       (dat-id 0))
3090: 0a 09 20 20 28 73 3a 73 65 74 21 20 22 74 77 69  ..  (s:set! "twi
30a0: 6b 69 5f 74 69 74 6c 65 22 20 22 22 29 0a 09 20  ki_title" "").. 
30b0: 20 28 73 3a 73 65 74 21 20 22 74 77 69 6b 69 5f   (s:set! "twiki_
30c0: 62 6f 64 79 22 20 20 22 22 29 29 0a 09 28 6c 65  body"  ""))..(le
30d0: 74 2a 20 28 28 74 69 64 20 20 20 20 28 63 61 72  t* ((tid    (car
30e0: 20 74 69 64 64 61 74 73 29 29 0a 09 20 20 20 20   tiddats))..    
30f0: 20 20 20 28 64 61 74 2d 69 64 20 28 74 77 69 6b     (dat-id (twik
3100: 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61  i:tiddler-get-da
3110: 74 2d 69 64 20 74 69 64 29 29 29 0a 09 20 20 3b  t-id tid)))..  ;
3120: 3b 20 28 73 3a 6c 6f 67 20 22 74 69 64 3a 20 22  ; (s:log "tid: "
3130: 20 74 69 64 20 22 20 64 61 74 2d 69 64 3a 20 22   tid " dat-id: "
3140: 20 64 61 74 2d 69 64 29 0a 09 20 20 28 73 3a 73   dat-id)..  (s:s
3150: 65 74 21 20 22 74 77 69 6b 69 5f 74 69 74 6c 65  et! "twiki_title
3160: 22 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72  " (twiki:tiddler
3170: 2d 67 65 74 2d 6e 61 6d 65 20 74 69 64 29 29 0a  -get-name tid)).
3180: 09 20 20 28 73 3a 73 65 74 21 20 22 74 77 69 6b  .  (s:set! "twik
3190: 69 5f 62 6f 64 79 22 20 20 28 74 77 69 6b 69 3a  i_body"  (twiki:
31a0: 67 65 74 2d 64 61 74 20 64 62 20 64 61 74 2d 69  get-dat db dat-i
31b0: 64 29 29 29 29 0a 20 20 20 20 28 73 3a 66 6f 72  d)))).    (s:for
31c0: 6d 20 27 61 63 74 69 6f 6e 20 28 73 3a 6c 69 6e  m 'action (s:lin
31d0: 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d  k-to (twiki:get-
31e0: 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72  link-back-to-cur
31f0: 72 65 6e 74 29 0a 09 09 09 20 20 20 20 20 20 20  rent)....       
3200: 27 61 63 74 69 6f 6e 20 28 63 6f 6e 63 20 22 74  'action (conc "t
3210: 77 69 6b 69 2e 73 61 76 65 2d 22 20 28 6e 75 6d  wiki.save-" (num
3220: 62 65 72 2d 3e 73 74 72 69 6e 67 20 77 69 64 29  ber->string wid)
3230: 20 22 2d 22 20 65 6e 63 2d 6b 65 79 29 29 0a 09   "-" enc-key))..
3240: 20 20 20 20 27 6d 65 74 68 6f 64 20 22 70 6f 73      'method "pos
3250: 74 22 20 3b 3b 20 27 74 77 69 6b 69 6e 61 6d 65  t" ;; 'twikiname
3260: 20 74 6b 65 79 20 3b 3b 20 64 6f 6e 65 2c 20 63   tkey ;; done, c
3270: 61 6e 63 65 6c 2c 20 64 65 6c 65 74 65 0a 09 20  ancel, delete.. 
3280: 20 20 20 28 73 3a 69 6e 70 75 74 20 27 74 79 70     (s:input 'typ
3290: 65 20 22 73 75 62 6d 69 74 22 20 20 20 27 6e 61  e "submit"   'na
32a0: 6d 65 20 22 66 6f 72 6d 2d 6e 61 6d 65 22 20 27  me "form-name" '
32b0: 76 61 6c 75 65 20 22 73 61 76 65 22 20 27 74 77  value "save" 'tw
32c0: 69 6b 69 6e 61 6d 65 20 74 6b 65 79 29 0a 09 20  ikiname tkey).. 
32d0: 20 20 20 3b 3b 20 28 73 3a 61 20 22 64 6f 6e 65     ;; (s:a "done
32e0: 22 20 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d  " 'href (s:link-
32f0: 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69  to (twiki:get-li
3300: 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65  nk-back-to-curre
3310: 6e 74 29 20 27 73 61 76 65 5f 74 6d 65 6e 75 20  nt) 'save_tmenu 
3320: 74 6e 75 6d 29 29 0a 09 20 20 20 20 28 73 3a 61  tnum))..    (s:a
3330: 20 22 63 61 6e 63 65 6c 22 20 27 68 72 65 66 20   "cancel" 'href 
3340: 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b  (s:link-to (twik
3350: 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d  i:get-link-back-
3360: 74 6f 2d 63 75 72 72 65 6e 74 29 20 27 63 61 6e  to-current) 'can
3370: 63 65 6c 5f 74 65 64 69 74 20 74 6e 75 6d 29 29  cel_tedit tnum))
3380: 20 22 2e 22 0a 09 20 20 20 20 28 73 3a 61 20 22   "."..    (s:a "
3390: 64 65 6c 65 74 65 22 20 27 68 72 65 66 20 28 73  delete" 'href (s
33a0: 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a  :link-to (twiki:
33b0: 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f  get-link-back-to
33c0: 2d 63 75 72 72 65 6e 74 29 20 27 64 65 6c 65 74  -current) 'delet
33d0: 65 5f 74 69 64 64 6c 65 72 20 74 6e 75 6d 29 29  e_tiddler tnum))
33e0: 28 73 3a 62 72 29 0a 09 20 20 20 20 28 73 3a 69  (s:br)..    (s:i
33f0: 6e 70 75 74 2d 70 72 65 73 65 72 76 65 20 27 74  nput-preserve 't
3400: 79 70 65 20 22 74 65 78 74 22 20 27 6e 61 6d 65  ype "text" 'name
3410: 20 22 74 77 69 6b 69 5f 74 69 74 6c 65 22 20 27   "twiki_title" '
3420: 73 69 7a 65 20 22 35 38 22 20 27 6d 61 78 6c 65  size "58" 'maxle
3430: 6e 67 74 68 20 22 31 35 30 22 29 0a 09 20 20 20  ngth "150")..   
3440: 20 28 73 3a 74 65 78 74 61 72 65 61 2d 70 72 65   (s:textarea-pre
3450: 73 65 72 76 65 20 27 74 79 70 65 20 22 74 65 78  serve 'type "tex
3460: 74 61 72 65 61 22 20 27 6e 61 6d 65 20 22 74 77  tarea" 'name "tw
3470: 69 6b 69 5f 62 6f 64 79 22 20 27 72 6f 77 73 20  iki_body" 'rows 
3480: 22 31 30 22 20 27 63 6f 6c 73 20 22 36 35 22 29  "10" 'cols "65")
3490: 0a 09 20 20 20 20 28 73 3a 70 20 22 54 61 67 73  ..    (s:p "Tags
34a0: 22 20 28 73 3a 69 6e 70 75 74 2d 70 72 65 73 65  " (s:input-prese
34b0: 72 76 65 20 27 74 79 70 65 20 22 74 65 78 74 22  rve 'type "text"
34c0: 20 27 6e 61 6d 65 20 22 74 77 69 6b 69 5f 74 61   'name "twiki_ta
34d0: 67 73 22 20 27 73 69 7a 65 20 22 35 35 22 20 27  gs" 'size "55" '
34e0: 6d 61 78 6c 65 6e 67 74 68 20 22 31 35 30 22 29  maxlength "150")
34f0: 29 29 29 29 0a 0a 3b 3b 20 73 61 76 65 20 61 20  ))))..;; save a 
3500: 74 69 64 64 6c 65 72 20 74 6f 20 74 68 65 20 64  tiddler to the d
3510: 62 20 66 6f 72 20 74 68 65 20 74 77 69 6b 69 20  b for the twiki 
3520: 74 77 69 6b 2c 20 67 65 74 74 69 6e 67 20 64 61  twik, getting da
3530: 74 61 20 66 72 6f 6d 20 74 68 65 20 49 4e 50 55  ta from the INPU
3540: 54 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  T.(define (twiki
3550: 3a 73 61 76 65 2d 63 75 72 72 2d 74 69 64 64 6c  :save-curr-tiddl
3560: 65 72 20 74 64 62 20 77 69 64 29 0a 20 20 28 66  er tdb wid).  (f
3570: 6f 72 6d 64 61 74 3a 70 72 69 6e 74 61 6c 6c 20  ormdat:printall 
3580: 28 73 6c 6f 74 2d 72 65 66 20 73 3a 73 65 73 73  (slot-ref s:sess
3590: 69 6f 6e 20 27 66 6f 72 6d 64 61 74 29 20 73 3a  ion 'formdat) s:
35a0: 6c 6f 67 29 0a 20 20 28 6c 65 74 2a 20 28 28 68  log).  (let* ((h
35b0: 65 61 64 69 6e 67 20 28 73 3a 67 65 74 2d 69 6e  eading (s:get-in
35c0: 70 75 74 20 27 74 77 69 6b 69 5f 74 69 74 6c 65  put 'twiki_title
35d0: 29 29 0a 09 20 28 62 6f 64 79 20 20 20 20 28 73  )).. (body    (s
35e0: 3a 67 65 74 2d 69 6e 70 75 74 20 27 74 77 69 6b  :get-input 'twik
35f0: 69 5f 62 6f 64 79 29 29 0a 09 20 28 74 61 67 73  i_body)).. (tags
3600: 20 20 20 20 28 73 3a 67 65 74 2d 69 6e 70 75 74      (s:get-input
3610: 20 27 74 77 69 6b 69 5f 74 61 67 73 29 29 0a 09   'twiki_tags))..
3620: 20 28 75 69 64 20 20 20 20 20 28 74 77 69 6b 69   (uid     (twiki
3630: 3a 67 65 74 2d 69 64 29 29 29 0a 20 20 20 20 3b  :get-id))).    ;
3640: 3b 20 28 73 3a 6c 6f 67 20 22 74 77 69 6b 69 3a  ; (s:log "twiki:
3650: 73 61 76 65 2d 63 75 72 72 2d 74 69 64 64 6c 65  save-curr-tiddle
3660: 72 20 68 65 61 64 69 6e 67 3a 20 22 20 68 65 61  r heading: " hea
3670: 64 69 6e 67 20 22 20 62 6f 64 79 3a 20 22 20 62  ding " body: " b
3680: 6f 64 79 20 22 20 74 61 67 73 3a 20 22 20 74 61  ody " tags: " ta
3690: 67 73 29 0a 20 20 20 20 28 73 3a 73 65 74 21 20  gs).    (s:set! 
36a0: 27 74 77 69 6b 69 5f 74 69 74 6c 65 20 68 65 61  'twiki_title hea
36b0: 64 69 6e 67 29 0a 20 20 20 20 28 69 66 20 62 6f  ding).    (if bo
36c0: 64 79 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 73  dy..(begin..  (s
36d0: 65 74 21 20 62 6f 64 79 20 28 73 74 72 69 6e 67  et! body (string
36e0: 2d 63 68 6f 6d 70 20 62 6f 64 79 29 29 0a 09 20  -chomp body)).. 
36f0: 20 28 73 3a 73 65 74 21 20 27 74 77 69 6b 69 5f   (s:set! 'twiki_
3700: 62 6f 64 79 20 20 62 6f 64 79 29 29 29 0a 20 20  body  body))).  
3710: 20 20 28 73 3a 73 65 74 21 20 27 74 77 69 6b 69    (s:set! 'twiki
3720: 5f 74 61 67 73 20 20 74 61 67 73 29 0a 20 20 20  _tags  tags).   
3730: 20 28 73 3a 64 65 6c 21 20 28 63 6f 6e 63 20 22   (s:del! (conc "
3740: 43 55 52 52 45 4e 54 5f 54 57 49 44 4c 45 52 5f  CURRENT_TWIDLER_
3750: 55 4e 44 45 52 5f 45 44 49 54 3a 22 20 77 69 64  UNDER_EDIT:" wid
3760: 29 29 0a 20 20 20 20 28 6c 65 74 20 28 28 72 65  )).    (let ((re
3770: 73 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 74 69  s (twiki:save-ti
3780: 64 64 6c 65 72 20 74 64 62 20 68 65 61 64 69 6e  ddler tdb headin
3790: 67 20 62 6f 64 79 20 74 61 67 73 20 77 69 64 20  g body tags wid 
37a0: 75 69 64 29 29 29 0a 20 20 20 20 20 20 3b 3b 20  uid))).      ;; 
37b0: 4e 6f 77 2c 20 72 65 70 6c 61 63 65 20 74 68 69  Now, replace thi
37c0: 73 20 74 77 69 64 64 6c 65 72 20 6e 75 6d 62 65  s twiddler numbe
37d0: 72 20 69 6e 20 74 68 65 20 76 69 65 77 20 6c 69  r in the view li
37e0: 73 74 20 77 69 74 68 20 0a 20 20 20 20 20 20 3b  st with .      ;
37f0: 3b 20 74 68 65 20 6e 65 77 20 6e 75 6d 62 65 72  ; the new number
3800: 20 66 72 6f 6d 20 74 68 65 20 64 62 0a 20 20 20   from the db.   
3810: 20 20 20 28 74 77 69 6b 69 3a 6e 6f 72 6d 61 6c     (twiki:normal
3820: 69 7a 65 2d 63 75 72 72 65 6e 74 2d 74 77 69 64  ize-current-twid
3830: 64 6c 65 72 73 20 74 64 62 20 77 69 64 29 0a 20  dlers tdb wid). 
3840: 20 20 20 20 20 28 73 3a 64 65 6c 21 20 27 74 77       (s:del! 'tw
3850: 69 6b 69 5f 74 69 74 6c 65 29 0a 20 20 20 20 20  iki_title).     
3860: 20 28 73 3a 64 65 6c 21 20 27 74 77 69 6b 69 5f   (s:del! 'twiki_
3870: 62 6f 64 79 29 0a 20 20 20 20 20 20 28 73 3a 64  body).      (s:d
3880: 65 6c 21 20 27 74 77 69 6b 69 5f 74 61 67 73 29  el! 'twiki_tags)
3890: 0a 20 20 20 20 20 20 72 65 73 29 0a 20 20 20 20  .      res).    
38a0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69  ))..(define (twi
38b0: 6b 69 3a 6e 6f 72 6d 61 6c 69 7a 65 2d 63 75 72  ki:normalize-cur
38c0: 72 65 6e 74 2d 74 77 69 64 64 6c 65 72 73 20 74  rent-twiddlers t
38d0: 64 62 20 77 69 64 29 0a 20 20 28 6c 65 74 2a 20  db wid).  (let* 
38e0: 28 28 63 76 61 72 20 20 20 20 20 20 28 63 6f 6e  ((cvar      (con
38f0: 63 20 22 43 55 52 52 45 4e 54 5f 54 57 49 44 4c  c "CURRENT_TWIDL
3900: 45 52 53 3a 22 20 77 69 64 29 29 0a 09 20 28 63  ERS:" wid)).. (c
3910: 75 72 72 2d 73 6c 73 74 20 28 73 3a 67 65 74 20  urr-slst (s:get 
3920: 63 76 61 72 29 29 0a 09 20 28 63 75 72 72 2d 6c  cvar)).. (curr-l
3930: 73 74 20 20 28 6d 61 70 20 73 74 72 69 6e 67 2d  st  (map string-
3940: 3e 6e 75 6d 62 65 72 20 28 73 74 72 69 6e 67 2d  >number (string-
3950: 73 70 6c 69 74 20 63 75 72 72 2d 73 6c 73 74 20  split curr-slst 
3960: 22 2c 22 29 29 29 0a 09 20 28 74 64 6c 72 73 20  ","))).. (tdlrs 
3970: 20 20 20 20 28 74 77 69 6b 69 3a 67 65 74 2d 74      (twiki:get-t
3980: 69 64 64 6c 65 72 73 2d 62 79 2d 6e 75 6d 20 74  iddlers-by-num t
3990: 64 62 20 77 69 64 20 63 75 72 72 2d 6c 73 74 29  db wid curr-lst)
39a0: 29 0a 09 20 28 6e 61 6d 65 73 20 20 20 20 20 28  ).. (names     (
39b0: 72 65 6d 6f 76 65 20 28 6c 61 6d 62 64 61 20 28  remove (lambda (
39c0: 74 29 28 73 74 72 69 6e 67 3d 3f 20 22 4d 61 69  t)(string=? "Mai
39d0: 6e 4d 65 6e 75 22 20 74 29 29 0a 09 09 09 20 20  nMenu" t))....  
39e0: 20 20 28 6d 61 70 20 74 77 69 6b 69 3a 74 69 64    (map twiki:tid
39f0: 64 6c 65 72 2d 67 65 74 2d 6e 61 6d 65 20 74 64  dler-get-name td
3a00: 6c 72 73 29 29 29 0a 09 20 28 6e 65 77 6e 75 6d  lrs))).. (newnum
3a10: 73 20 20 20 28 6d 61 70 20 74 77 69 6b 69 3a 74  s   (map twiki:t
3a20: 69 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 0a 09  iddler-get-id ..
3a30: 09 09 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20  .. (map (lambda 
3a40: 28 74 6e 29 0a 09 09 09 09 28 74 77 69 6b 69 3a  (tn).....(twiki:
3a50: 67 65 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e  get-tiddler-by-n
3a60: 61 6d 65 20 74 64 62 20 77 69 64 20 74 6e 29 29  ame tdb wid tn))
3a70: 0a 09 09 09 20 20 20 20 20 20 6e 61 6d 65 73 29  ....      names)
3a80: 29 29 29 0a 20 20 20 20 28 73 3a 73 65 74 21 20  ))).    (s:set! 
3a90: 63 76 61 72 20 28 73 74 72 69 6e 67 2d 69 6e 74  cvar (string-int
3aa0: 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 6e 75  ersperse (map nu
3ab0: 6d 62 65 72 2d 3e 73 74 72 69 6e 67 20 6e 65 77  mber->string new
3ac0: 6e 75 6d 73 29 0a 09 09 09 09 20 20 20 20 20 22  nums).....     "
3ad0: 2c 22 29 29 29 29 0a 20 20 20 20 0a 3b 3b 20 67  ,")))).    .;; g
3ae0: 65 6e 65 72 69 63 20 73 61 76 65 20 74 69 64 64  eneric save tidd
3af0: 6c 65 72 0a 28 64 65 66 69 6e 65 20 28 74 77 69  ler.(define (twi
3b00: 6b 69 3a 73 61 76 65 2d 74 69 64 64 6c 65 72 20  ki:save-tiddler 
3b10: 74 64 62 20 68 65 61 64 69 6e 67 20 62 6f 64 79  tdb heading body
3b20: 20 74 61 67 73 20 77 69 64 20 75 69 64 29 0a 20   tags wid uid). 
3b30: 20 20 20 28 69 66 20 28 6d 69 73 63 3a 6e 6f 6e     (if (misc:non
3b40: 2d 7a 65 72 6f 2d 73 74 72 69 6e 67 20 68 65 61  -zero-string hea
3b50: 64 69 6e 67 29 0a 09 28 6c 65 74 2a 20 28 28 70  ding)..(let* ((p
3b60: 72 65 76 2d 74 69 64 20 28 74 77 69 6b 69 3a 67  rev-tid (twiki:g
3b70: 65 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61  et-tiddler-by-na
3b80: 6d 65 20 74 64 62 20 77 69 64 20 68 65 61 64 69  me tdb wid headi
3b90: 6e 67 29 29 0a 09 20 20 20 20 20 20 20 28 70 72  ng))..       (pr
3ba0: 65 76 2d 64 61 74 2d 69 64 20 28 69 66 20 70 72  ev-dat-id (if pr
3bb0: 65 76 2d 74 69 64 20 0a 09 09 09 09 28 74 77 69  ev-tid .....(twi
3bc0: 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 64  ki:tiddler-get-d
3bd0: 61 74 2d 69 64 20 70 72 65 76 2d 74 69 64 29 0a  at-id prev-tid).
3be0: 09 09 09 09 2d 31 29 29 0a 09 20 20 20 20 20 20  ....-1))..      
3bf0: 20 28 64 61 74 2d 69 64 20 28 74 77 69 6b 69 3a   (dat-id (twiki:
3c00: 73 61 76 65 2d 64 61 74 20 74 64 62 20 62 6f 64  save-dat tdb bod
3c10: 79 20 30 29 29 29 20 3b 3b 20 30 3d 74 65 78 74  y 0))) ;; 0=text
3c20: 0a 09 20 20 3b 3b 20 28 73 3a 6c 6f 67 20 22 74  ..  ;; (s:log "t
3c30: 77 69 6b 69 3a 73 61 76 65 2d 74 69 64 64 6c 65  wiki:save-tiddle
3c40: 72 20 64 61 74 2d 69 64 3a 20 22 20 64 61 74 2d  r dat-id: " dat-
3c50: 69 64 20 22 20 62 6f 64 79 3a 20 22 20 62 6f 64  id " body: " bod
3c60: 79 29 0a 09 20 20 28 69 66 20 28 65 71 75 61 6c  y)..  (if (equal
3c70: 3f 20 70 72 65 76 2d 64 61 74 2d 69 64 20 64 61  ? prev-dat-id da
3c80: 74 2d 69 64 29 20 3b 3b 20 6e 6f 20 6e 65 65 64  t-id) ;; no need
3c90: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
3ca0: 20 72 65 63 6f 72 64 20 69 66 20 74 68 65 20 64   record if the d
3cb0: 61 74 20 64 69 64 6e 27 74 20 63 68 61 6e 67 65  at didn't change
3cc0: 0a 09 20 20 20 20 20 20 23 74 0a 09 20 20 20 20  ..      #t..    
3cd0: 20 20 28 64 62 69 3a 65 78 65 63 20 74 64 62 20    (dbi:exec tdb 
3ce0: 0a 09 09 09 22 49 4e 53 45 52 54 20 49 4e 54 4f  ...."INSERT INTO
3cf0: 20 74 69 64 64 6c 65 72 73 20 28 77 69 6b 69 5f   tiddlers (wiki_
3d00: 69 64 2c 6e 61 6d 65 2c 64 61 74 5f 69 64 2c 63  id,name,dat_id,c
3d10: 72 65 61 74 65 64 5f 6f 6e 2c 6f 77 6e 65 72 5f  reated_on,owner_
3d20: 69 64 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  id) VALUES(?,?,?
3d30: 2c 3f 2c 3f 29 3b 22 0a 09 09 09 77 69 64 20 68  ,?,?);"....wid h
3d40: 65 61 64 69 6e 67 20 64 61 74 2d 69 64 20 28 63  eading dat-id (c
3d50: 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 20  urrent-seconds) 
3d60: 75 69 64 29 29 0a 09 20 20 23 74 29 20 3b 3b 20  uid))..  #t) ;; 
3d70: 73 75 63 63 65 73 73 0a 09 23 66 29 29 20 20 3b  success..#f))  ;
3d80: 3b 20 6e 6f 6e 2d 73 75 63 63 65 73 73 0a 0a 3b  ; non-success..;
3d90: 3b 20 74 65 78 74 3d 30 2c 20 6a 70 67 3d 31 2c  ; text=0, jpg=1,
3da0: 20 70 6e 67 3d 32 0a 28 64 65 66 69 6e 65 20 28   png=2.(define (
3db0: 74 77 69 6b 69 3a 73 61 76 65 2d 64 61 74 20 64  twiki:save-dat d
3dc0: 62 20 64 61 74 20 74 79 70 65 29 0a 20 20 28 6c  b dat type).  (l
3dd0: 65 74 2a 20 28 28 6d 64 35 73 75 6d 20 28 6d 64  et* ((md5sum (md
3de0: 35 3a 64 69 67 65 73 74 20 64 61 74 29 29 0a 09  5:digest dat))..
3df0: 20 28 64 61 74 69 64 20 20 28 74 77 69 6b 69 3a   (datid  (twiki:
3e00: 64 61 74 2d 65 78 69 73 74 73 3f 20 64 62 20 6d  dat-exists? db m
3e10: 64 35 73 75 6d 20 74 79 70 65 29 29 0a 09 20 28  d5sum type)).. (
3e20: 64 61 74 62 6c 6f 62 20 28 69 66 20 28 73 74 72  datblob (if (str
3e30: 69 6e 67 3f 20 64 61 74 29 0a 09 09 20 20 20 20  ing? dat)...    
3e40: 20 20 28 73 74 72 69 6e 67 2d 3e 62 6c 6f 62 20    (string->blob 
3e50: 64 61 74 29 0a 09 09 20 20 20 20 20 20 64 61 74  dat)...      dat
3e60: 29 29 29 0a 20 20 20 20 28 69 66 20 64 61 74 69  ))).    (if dati
3e70: 64 0a 09 64 61 74 69 64 0a 09 28 62 65 67 69 6e  d..datid..(begin
3e80: 0a 09 20 20 28 63 61 73 65 20 74 79 70 65 0a 09  ..  (case type..
3e90: 20 20 20 20 28 28 30 29 20 20 20 28 64 62 69 3a      ((0)   (dbi:
3ea0: 65 78 65 63 20 64 62 20 22 49 4e 53 45 52 54 20  exec db "INSERT 
3eb0: 49 4e 54 4f 20 64 61 74 73 20 28 6d 64 35 73 75  INTO dats (md5su
3ec0: 6d 2c 64 61 74 2c 74 79 70 65 29 20 56 41 4c 55  m,dat,type) VALU
3ed0: 45 53 28 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73  ES(?,?,?);" md5s
3ee0: 75 6d 20 64 61 74 62 6c 6f 62 20 30 29 29 0a 09  um datblob 0))..
3ef0: 20 20 20 20 28 28 31 29 20 20 20 28 64 62 69 3a      ((1)   (dbi:
3f00: 65 78 65 63 20 64 62 20 22 49 4e 53 45 52 54 20  exec db "INSERT 
3f10: 49 4e 54 4f 20 64 61 74 73 20 28 6d 64 35 73 75  INTO dats (md5su
3f20: 6d 2c 64 61 74 2c 74 79 70 65 29 20 56 41 4c 55  m,dat,type) VALU
3f30: 45 53 28 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73  ES(?,?,?);" md5s
3f40: 75 6d 20 64 61 74 62 6c 6f 62 20 31 29 29 0a 09  um datblob 1))..
3f50: 20 20 20 20 28 65 6c 73 65 20 20 28 64 62 69 3a      (else  (dbi:
3f60: 65 78 65 63 20 64 62 20 22 49 4e 53 45 52 54 20  exec db "INSERT 
3f70: 49 4e 54 4f 20 64 61 74 73 20 28 6d 64 35 73 75  INTO dats (md5su
3f80: 6d 2c 64 61 74 2c 74 79 70 65 29 20 56 41 4c 55  m,dat,type) VALU
3f90: 45 53 28 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73  ES(?,?,?);" md5s
3fa0: 75 6d 20 64 61 74 62 6c 6f 62 20 74 79 70 65 29  um datblob type)
3fb0: 29 29 0a 09 20 20 28 74 77 69 6b 69 3a 64 61 74  ))..  (twiki:dat
3fc0: 2d 65 78 69 73 74 73 3f 20 64 62 20 6d 64 35 73  -exists? db md5s
3fd0: 75 6d 20 74 79 70 65 29 29 29 29 29 0a 20 20 20  um type))))).   
3fe0: 20 20 20 20 0a 28 64 65 66 69 6e 65 20 28 74 77      .(define (tw
3ff0: 69 6b 69 3a 64 61 74 2d 65 78 69 73 74 73 3f 20  iki:dat-exists? 
4000: 64 62 20 6d 64 35 73 75 6d 20 74 79 70 65 29 0a  db md5sum type).
4010: 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64    (dbi:get-one d
4020: 62 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f  b "SELECT id FRO
4030: 4d 20 64 61 74 73 20 57 48 45 52 45 20 6d 64 35  M dats WHERE md5
4040: 73 75 6d 3d 3f 20 41 4e 44 20 74 79 70 65 3d 3f  sum=? AND type=?
4050: 3b 22 20 6d 64 35 73 75 6d 20 74 79 70 65 29 29  ;" md5sum type))
4060: 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  ..(define (twiki
4070: 3a 67 65 74 2d 64 61 74 20 64 62 20 69 64 29 0a  :get-dat db id).
4080: 20 20 28 69 66 20 28 61 6e 64 20 69 64 20 28 6e    (if (and id (n
4090: 75 6d 62 65 72 3f 20 69 64 29 29 0a 20 20 20 20  umber? id)).    
40a0: 20 20 28 69 66 20 28 3c 20 69 64 20 30 29 0a 09    (if (< id 0)..
40b0: 20 20 22 22 0a 09 20 20 28 6c 65 74 20 28 28 72    ""..  (let ((r
40c0: 65 73 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 2d  es (dbi:get-one-
40d0: 72 6f 77 20 64 62 20 22 53 45 4c 45 43 54 20 64  row db "SELECT d
40e0: 61 74 2c 74 79 70 65 20 46 52 4f 4d 20 64 61 74  at,type FROM dat
40f0: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 69  s WHERE id=?;" i
4100: 64 29 29 29 0a 09 20 20 20 20 28 69 66 20 72 65  d)))..    (if re
4110: 73 0a 09 09 28 63 61 73 65 20 28 76 65 63 74 6f  s...(case (vecto
4120: 72 2d 72 65 66 20 72 65 73 20 31 29 0a 09 09 20  r-ref res 1)... 
4130: 20 28 28 30 29 28 62 6c 6f 62 2d 3e 73 74 72 69   ((0)(blob->stri
4140: 6e 67 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72  ng (vector-ref r
4150: 65 73 20 30 29 29 29 0a 09 09 20 20 28 65 6c 73  es 0)))...  (els
4160: 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65  e (vector-ref re
4170: 73 20 30 29 29 29 0a 09 09 23 66 29 29 29 0a 20  s 0)))...#f))). 
4180: 20 20 20 20 20 23 66 29 29 0a 0a 28 64 65 66 69       #f))..(defi
4190: 6e 65 20 28 74 77 69 6b 69 3a 6d 61 69 6e 74 5f  ne (twiki:maint_
41a0: 61 72 65 61 20 74 64 62 20 77 69 64 20 74 6b 65  area tdb wid tke
41b0: 79 20 77 69 6b 69 29 0a 20 20 28 6c 65 74 20 28  y wiki).  (let (
41c0: 28 6d 61 69 6e 74 20 28 73 3a 67 65 74 2d 70 61  (maint (s:get-pa
41d0: 72 61 6d 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74  ram 'twiki_maint
41e0: 29 29 0a 09 28 77 72 69 74 65 2d 70 65 72 6d 20  ))..(write-perm 
41f0: 28 6d 65 6d 62 65 72 20 27 77 20 28 74 77 69 6b  (member 'w (twik
4200: 69 3a 77 69 6b 69 2d 67 65 74 2d 70 65 72 6d 73  i:wiki-get-perms
4210: 20 77 69 6b 69 29 29 29 29 0a 20 20 20 20 28 73   wiki)))).    (s
4220: 3a 64 69 76 20 27 63 6c 61 73 73 20 22 74 77 69  :div 'class "twi
4230: 6b 69 2d 6d 65 6e 75 2d 69 6e 74 65 72 6e 61 6c  ki-menu-internal
4240: 22 0a 20 20 20 20 20 28 69 66 20 77 72 69 74 65  ".     (if write
4250: 2d 70 65 72 6d 0a 09 20 28 6c 69 73 74 20 28 73  -perm.. (list (s
4260: 3a 61 20 22 4f 72 70 68 61 6e 73 22 20 20 27 68  :a "Orphans"  'h
4270: 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28  ref (s:link-to (
4280: 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62  twiki:get-link-b
4290: 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20  ack-to-current) 
42a0: 27 74 77 69 6b 69 5f 6d 61 69 6e 74 20 31 29 29  'twiki_maint 1))
42b0: 28 73 3a 62 72 29 0a 09 20 20 20 20 20 20 20 28  (s:br)..       (
42c0: 73 3a 61 20 22 50 69 63 73 22 20 20 20 20 20 27  s:a "Pics"     '
42d0: 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20  href (s:link-to 
42e0: 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d  (twiki:get-link-
42f0: 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29  back-to-current)
4300: 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74 20 32 29   'twiki_maint 2)
4310: 29 28 73 3a 62 72 29 0a 09 20 20 20 20 20 20 20  )(s:br)..       
4320: 28 73 3a 61 20 22 48 65 6c 70 22 20 20 20 20 20  (s:a "Help"     
4330: 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f  'href (s:link-to
4340: 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b   (twiki:get-link
4350: 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74  -back-to-current
4360: 29 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74 20 34  ) 'twiki_maint 4
4370: 29 29 28 73 3a 62 72 29 29 0a 09 20 27 28 29 29  ))(s:br)).. '())
4380: 0a 20 20 20 20 20 28 73 3a 61 20 22 53 65 61 72  .     (s:a "Sear
4390: 63 68 22 20 20 20 27 68 72 65 66 20 28 73 3a 6c  ch"   'href (s:l
43a0: 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65  ink-to (twiki:ge
43b0: 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63  t-link-back-to-c
43c0: 75 72 72 65 6e 74 29 20 27 74 77 69 6b 69 5f 6d  urrent) 'twiki_m
43d0: 61 69 6e 74 20 33 29 29 28 73 3a 62 72 29 0a 20  aint 3))(s:br). 
43e0: 20 20 20 20 28 63 61 73 65 20 6d 61 69 6e 74 0a      (case maint.
43f0: 20 20 20 20 20 20 20 28 28 31 29 0a 09 28 74 77         ((1)..(tw
4400: 69 6b 69 3a 6c 69 73 74 2d 6f 72 70 68 61 6e 73  iki:list-orphans
4410: 20 74 64 62 29 29 0a 20 20 20 20 20 20 20 28 65   tdb)).       (e
4420: 6c 73 65 0a 09 20 27 28 29 29 29 29 29 29 0a 0a  lse.. '())))))..
4430: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
4440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4470: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4f 72 70 68  ========.;; Orph
4480: 61 6e 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ans.;;==========
4490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65  ============.(de
44d0: 66 69 6e 65 20 28 74 77 69 6b 69 3a 6d 61 6b 65  fine (twiki:make
44e0: 2d 74 69 64 64 6c 65 72 2d 6c 69 73 74 20 74 64  -tiddler-list td
44f0: 6c 72 73 20 2e 20 74 6e 75 6d 73 29 0a 20 20 28  lrs . tnums).  (
4500: 63 6f 6e 63 20 28 73 74 72 69 6e 67 2d 69 6e 74  conc (string-int
4510: 65 72 73 70 65 72 73 65 20 0a 09 20 28 6d 61 70  ersperse .. (map
4520: 20 63 6f 6e 63 20 28 64 65 6c 65 74 65 2d 64 75   conc (delete-du
4530: 70 6c 69 63 61 74 65 73 0a 09 09 20 20 20 20 28  plicates...    (
4540: 61 70 70 65 6e 64 20 28 6d 61 70 20 74 77 69 6b  append (map twik
4550: 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 69 64  i:tiddler-get-id
4560: 20 74 64 6c 72 73 29 20 74 6e 75 6d 73 29 29 29   tdlrs) tnums)))
4570: 0a 09 20 22 2c 22 29 29 29 0a 0a 28 64 65 66 69  .. ",")))..(defi
4580: 6e 65 20 28 74 77 69 6b 69 3a 67 65 74 2d 6f 72  ne (twiki:get-or
4590: 70 68 61 6e 73 20 74 64 62 29 0a 20 20 27 28 29  phans tdb).  '()
45a0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  )..(define (twik
45b0: 69 3a 6c 69 73 74 2d 6f 72 70 68 61 6e 73 20 74  i:list-orphans t
45c0: 64 62 29 0a 20 20 27 28 29 29 0a 0a 3b 3b 3d 3d  db).  '())..;;==
45d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
45e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
45f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4610: 3d 3d 3d 3d 0a 3b 3b 20 50 69 63 74 75 72 65 73  ====.;; Pictures
4620: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
4630: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4640: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e  =========.(defin
4670: 65 20 28 74 77 69 6b 69 3a 70 69 63 5f 6d 67 6d  e (twiki:pic_mgm
4680: 74 20 74 64 62 20 77 69 64 20 74 6b 65 79 29 0a  t tdb wid tkey).
4690: 20 20 28 73 3a 64 69 76 20 0a 20 20 20 28 73 3a    (s:div .   (s:
46a0: 61 20 22 41 64 64 20 70 69 63 22 20 27 68 72 65  a "Add pic" 'hre
46b0: 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77  f (s:link-to (tw
46c0: 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63  iki:get-link-bac
46d0: 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27 74  k-to-current) 't
46e0: 77 69 6b 69 5f 6d 61 69 6e 74 20 32 20 27 74 77  wiki_maint 2 'tw
46f0: 69 6b 69 5f 6d 61 69 6e 74 5f 61 64 64 5f 70 69  iki_maint_add_pi
4700: 63 73 20 31 29 29 28 73 3a 62 72 29 0a 20 20 20  cs 1))(s:br).   
4710: 28 69 66 20 28 73 3a 67 65 74 2d 70 61 72 61 6d  (if (s:get-param
4720: 20 22 74 77 69 6b 69 5f 6d 61 69 6e 74 5f 61 64   "twiki_maint_ad
4730: 64 5f 70 69 63 73 22 29 0a 20 20 20 20 20 20 20  d_pics").       
4740: 28 73 3a 66 6f 72 6d 20 27 65 6e 63 74 79 70 65  (s:form 'enctype
4750: 20 22 6d 75 6c 74 69 70 61 72 74 2f 66 6f 72 6d   "multipart/form
4760: 2d 64 61 74 61 22 20 3b 3b 20 27 6e 61 6d 65 20  -data" ;; 'name 
4770: 22 64 6f 65 73 2d 61 2d 66 6f 72 6d 2d 68 61 76  "does-a-form-hav
4780: 65 2d 61 2d 6e 61 6d 65 22 0a 09 20 20 20 20 20  e-a-name"..     
4790: 20 20 28 73 3a 69 6e 70 75 74 20 27 74 79 70 65    (s:input 'type
47a0: 20 22 66 69 6c 65 22 20 27 6e 61 6d 65 20 22 69   "file" 'name "i
47b0: 6e 70 75 74 2d 70 69 63 74 75 72 65 22 20 27 76  nput-picture" 'v
47c0: 61 6c 75 65 20 22 55 70 6c 6f 61 64 20 70 69 63  alue "Upload pic
47d0: 22 29 0a 09 20 20 20 20 20 20 20 28 73 3a 69 6e  ")..       (s:in
47e0: 70 75 74 20 27 74 79 70 65 20 22 73 75 62 6d 69  put 'type "submi
47f0: 74 22 20 27 6e 61 6d 65 20 22 73 75 62 6d 69 74  t" 'name "submit
4800: 2d 70 69 63 74 75 72 65 22 20 27 76 61 6c 75 65  -picture" 'value
4810: 20 22 53 75 62 6d 69 74 22 29 0a 09 20 20 20 20   "Submit")..    
4820: 20 20 20 27 6d 65 74 68 6f 64 20 22 70 6f 73 74     'method "post
4830: 22 20 0a 09 20 20 20 20 20 20 20 27 61 63 74 69  " ..       'acti
4840: 6f 6e 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74  on (s:link-to (t
4850: 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61  wiki:get-link-ba
4860: 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27  ck-to-current) '
4870: 61 63 74 69 6f 6e 20 28 63 6f 6e 63 20 22 74 77  action (conc "tw
4880: 69 6b 69 2e 73 61 76 65 70 69 63 2d 22 20 28 6e  iki.savepic-" (n
4890: 75 6d 62 65 72 2d 3e 73 74 72 69 6e 67 20 77 69  umber->string wi
48a0: 64 29 20 22 2d 22 20 28 74 77 69 6b 69 3a 77 65  d) "-" (twiki:we
48b0: 62 36 34 65 6e 63 20 74 6b 65 79 29 29 29 0a 09  b64enc tkey)))..
48c0: 20 20 20 20 20 20 20 28 73 3a 69 6e 70 75 74 20         (s:input 
48d0: 27 74 79 70 65 20 22 74 65 78 74 22 20 27 6e 61  'type "text" 'na
48e0: 6d 65 20 22 70 69 63 74 75 72 65 2d 6e 61 6d 65  me "picture-name
48f0: 22 20 27 76 61 6c 75 65 20 22 22 29 29 0a 20 20  " 'value "")).  
4900: 20 20 20 20 20 27 28 29 29 0a 20 20 20 28 6c 65       '()).   (le
4910: 74 20 28 28 70 69 63 73 20 28 64 62 69 3a 67 65  t ((pics (dbi:ge
4920: 74 2d 72 6f 77 73 20 74 64 62 20 22 53 45 4c 45  t-rows tdb "SELE
4930: 43 54 20 69 64 2c 6e 61 6d 65 2c 64 61 74 5f 69  CT id,name,dat_i
4940: 64 2c 74 68 75 6d 62 5f 64 61 74 5f 69 64 20 46  d,thumb_dat_id F
4950: 52 4f 4d 20 70 69 63 73 20 57 48 45 52 45 20 77  ROM pics WHERE w
4960: 69 6b 69 5f 69 64 3d 3f 3b 22 20 77 69 64 29 29  iki_id=?;" wid))
4970: 29 0a 20 20 20 20 20 28 6d 61 70 20 28 6c 61 6d  ).     (map (lam
4980: 62 64 61 20 28 70 69 63 29 0a 09 20 20 20 20 28  bda (pic)..    (
4990: 73 3a 64 69 76 20 27 63 6c 61 73 73 20 22 74 69  s:div 'class "ti
49a0: 64 64 6c 65 72 74 68 75 6d 62 22 0a 09 09 20 20  ddlerthumb"...  
49b0: 20 28 73 3a 69 6d 67 20 27 74 69 74 6c 65 20 28   (s:img 'title (
49c0: 76 65 63 74 6f 72 2d 72 65 66 20 70 69 63 20 31  vector-ref pic 1
49d0: 29 20 27 61 6c 74 20 28 76 65 63 74 6f 72 2d 72  ) 'alt (vector-r
49e0: 65 66 20 70 69 63 20 31 29 0a 09 09 20 09 20 20  ef pic 1)... .  
49f0: 3b 3b 20 27 73 72 63 20 28 73 3a 6c 69 6e 6b 2d  ;; 'src (s:link-
4a00: 74 6f 20 22 74 77 69 6b 69 22 20 27 77 69 6b 69  to "twiki" 'wiki
4a10: 5f 6b 65 79 20 28 74 77 69 6b 69 3a 77 65 62 36  _key (twiki:web6
4a20: 34 65 6e 63 20 74 6b 65 79 29 20 27 69 6d 61 67  4enc tkey) 'imag
4a30: 65 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 70  e  (vector-ref p
4a40: 69 63 20 30 29 29 29 0a 09 09 20 09 20 20 27 73  ic 0)))... .  's
4a50: 72 63 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 22 74  rc (s:link-to "t
4a60: 77 69 6b 69 22 20 27 77 69 6b 69 5f 6b 65 79 20  wiki" 'wiki_key 
4a70: 28 63 6f 6e 63 20 28 6e 75 6d 62 65 72 2d 3e 73  (conc (number->s
4a80: 74 72 69 6e 67 20 77 69 64 29 20 22 2d 22 20 28  tring wid) "-" (
4a90: 74 77 69 6b 69 3a 77 65 62 36 34 65 6e 63 20 74  twiki:web64enc t
4aa0: 6b 65 79 29 29 0a 09 09 09 09 09 20 20 27 74 68  key))......  'th
4ab0: 75 6d 62 20 20 28 76 65 63 74 6f 72 2d 72 65 66  umb  (vector-ref
4ac0: 20 70 69 63 20 30 29 29 29 0a 09 09 20 20 20 3b   pic 0)))...   ;
4ad0: 3b 20 20 20 20 20 20 20 28 63 6f 6e 63 20 22 74  ;       (conc "t
4ae0: 77 69 6b 69 2f 22 20 77 69 64 20 22 2f 74 68 75  wiki/" wid "/thu
4af0: 6d 62 73 2f 22 20 28 76 65 63 74 6f 72 2d 72 65  mbs/" (vector-re
4b00: 66 20 70 69 63 20 30 29 29 29 29 0a 09 09 20 20  f pic 0))))...  
4b10: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 70 69 63   (vector-ref pic
4b20: 20 30 29 20 28 76 65 63 74 6f 72 2d 72 65 66 20   0) (vector-ref 
4b30: 70 69 63 20 31 29 29 29 0a 09 20 20 70 69 63 73  pic 1)))..  pics
4b40: 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 20 28  ))))..(define  (
4b50: 74 77 69 6b 69 3a 73 61 76 65 2d 70 69 63 2d 66  twiki:save-pic-f
4b60: 72 6f 6d 2d 66 6f 72 6d 20 74 64 62 20 77 69 64  rom-form tdb wid
4b70: 29 0a 20 20 28 6c 65 74 2a 20 28 28 70 69 63 2d  ).  (let* ((pic-
4b80: 64 61 74 20 20 28 73 3a 67 65 74 2d 69 6e 70 75  dat  (s:get-inpu
4b90: 74 20 27 69 6e 70 75 74 2d 70 69 63 74 75 72 65  t 'input-picture
4ba0: 29 29 0a 09 20 28 61 6c 74 2d 6e 61 6d 65 20 28  )).. (alt-name (
4bb0: 73 3a 67 65 74 2d 69 6e 70 75 74 20 27 70 69 63  s:get-input 'pic
4bc0: 74 75 72 65 2d 6e 61 6d 65 29 29 29 0a 20 20 20  ture-name))).   
4bd0: 20 28 69 66 20 70 69 63 2d 64 61 74 0a 09 28 62   (if pic-dat..(b
4be0: 65 67 69 6e 0a 09 20 20 28 73 3a 6c 6f 67 20 22  egin..  (s:log "
4bf0: 74 77 69 6b 69 3a 73 61 76 65 2d 70 69 63 2d 66  twiki:save-pic-f
4c00: 72 6f 6d 2d 66 6f 72 6d 20 77 69 74 68 20 70 69  rom-form with pi
4c10: 63 2d 64 61 74 3d 22 20 70 69 63 2d 64 61 74 20  c-dat=" pic-dat 
4c20: 22 20 61 6e 64 20 61 6c 74 2d 6e 61 6d 65 3d 22  " and alt-name="
4c30: 20 61 6c 74 2d 6e 61 6d 65 29 0a 09 20 20 28 74   alt-name)..  (t
4c40: 77 69 6b 69 3a 73 61 76 65 2d 70 69 63 20 74 64  wiki:save-pic td
4c50: 62 20 70 69 63 2d 64 61 74 20 77 69 64 20 61 6c  b pic-dat wid al
4c60: 74 2d 6e 61 6d 65 29 29 0a 09 23 66 29 29 29 0a  t-name))..#f))).
4c70: 0a 3b 3b 20 67 65 74 20 70 69 63 20 69 64 20 66  .;; get pic id f
4c80: 6f 72 20 61 20 70 69 63 20 6e 61 6d 65 2c 20 72  or a pic name, r
4c90: 65 74 75 72 6e 73 20 74 68 65 20 6c 61 74 65 73  eturns the lates
4ca0: 74 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  t.(define (twiki
4cb0: 3a 67 65 74 2d 70 69 63 2d 69 64 20 74 64 62 20  :get-pic-id tdb 
4cc0: 70 69 63 2d 6e 61 6d 65 20 77 69 64 29 0a 20 20  pic-name wid).  
4cd0: 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 74 64 62  (dbi:get-one tdb
4ce0: 20 22 53 45 4c 45 43 54 20 70 69 63 73 2e 69 64   "SELECT pics.id
4cf0: 20 46 52 4f 4d 20 70 69 63 73 20 57 48 45 52 45   FROM pics WHERE
4d00: 20 70 69 63 73 2e 6e 61 6d 65 3d 3f 20 41 4e 44   pics.name=? AND
4d10: 20 70 69 63 73 2e 77 69 6b 69 5f 69 64 3d 3f 20   pics.wiki_id=? 
4d20: 4f 52 44 45 52 20 42 59 20 70 69 63 73 2e 69 64  ORDER BY pics.id
4d30: 20 44 45 53 43 20 4c 49 4d 49 54 20 31 3b 22 20   DESC LIMIT 1;" 
4d40: 70 69 63 2d 6e 61 6d 65 20 77 69 64 29 29 0a 0a  pic-name wid))..
4d50: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 73  (define (twiki:s
4d60: 61 76 65 2d 70 69 63 20 74 64 62 20 70 69 63 2d  ave-pic tdb pic-
4d70: 64 61 74 20 77 69 64 20 61 6c 74 29 0a 20 20 28  dat wid alt).  (
4d80: 6c 65 74 20 28 28 70 69 63 2d 6e 61 6d 65 20 28  let ((pic-name (
4d90: 63 61 72 20 70 69 63 2d 64 61 74 29 29 0a 09 28  car pic-dat))..(
4da0: 70 69 63 2d 74 79 70 65 20 28 63 61 64 72 20 70  pic-type (cadr p
4db0: 69 63 2d 64 61 74 29 29 0a 09 28 70 69 63 2d 64  ic-dat))..(pic-d
4dc0: 61 74 61 20 28 63 61 64 64 72 20 70 69 63 2d 64  ata (caddr pic-d
4dd0: 61 74 29 29 0a 09 3b 3b 20 49 27 6d 20 6e 6f 74  at))..;; I'm not
4de0: 20 74 6f 6f 20 68 61 70 70 79 20 77 69 74 68 20   too happy with 
4df0: 74 68 69 73 20 73 6f 6c 75 74 69 6f 6e 20 62 75  this solution bu
4e00: 74 20 49 20 63 61 6e 27 74 20 73 65 65 6d 20 74  t I can't seem t
4e10: 6f 20 63 68 6f 6d 70 20 74 68 65 20 5c 6e 5c 64  o chomp the \n\d
4e20: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
4e30: 20 74 68 65 20 73 74 72 69 6e 67 0a 09 28 61 6c   the string..(al
4e40: 74 2d 6e 61 6d 65 20 28 69 66 20 61 6c 74 20 28  t-name (if alt (
4e50: 73 74 72 69 6e 67 2d 73 75 62 73 74 69 74 75 74  string-substitut
4e60: 65 20 28 72 65 67 65 78 70 20 22 5b 5e 5c 5c 77  e (regexp "[^\\w
4e70: 20 5d 22 29 20 22 22 20 61 6c 74 20 23 74 29 20   ]") "" alt #t) 
4e80: 23 66 29 29 29 0a 20 20 20 20 28 69 66 20 28 61  #f))).    (if (a
4e90: 6e 64 20 61 6c 74 2d 6e 61 6d 65 0a 09 20 20 20  nd alt-name..   
4ea0: 20 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20    (string-match 
4eb0: 28 72 65 67 65 78 70 20 22 5c 5c 77 2b 22 29 20  (regexp "\\w+") 
4ec0: 61 6c 74 2d 6e 61 6d 65 29 29 0a 09 28 73 65 74  alt-name))..(set
4ed0: 21 20 70 69 63 2d 6e 61 6d 65 20 61 6c 74 2d 6e  ! pic-name alt-n
4ee0: 61 6d 65 29 29 0a 20 20 20 20 28 73 3a 6c 6f 67  ame)).    (s:log
4ef0: 20 22 61 6c 74 3a 20 22 20 61 6c 74 20 22 20 61   "alt: " alt " a
4f00: 6c 74 2d 6e 61 6d 65 3a 20 22 20 61 6c 74 2d 6e  lt-name: " alt-n
4f10: 61 6d 65 29 0a 20 20 20 20 28 69 66 20 70 69 63  ame).    (if pic
4f20: 2d 64 61 74 61 0a 09 28 6c 65 74 20 28 28 64 61  -data..(let ((da
4f30: 74 2d 69 64 20 28 74 77 69 6b 69 3a 73 61 76 65  t-id (twiki:save
4f40: 2d 64 61 74 20 74 64 62 20 70 69 63 2d 64 61 74  -dat tdb pic-dat
4f50: 61 20 28 74 77 69 6b 69 3a 6d 69 6d 65 2d 3e 74  a (twiki:mime->t
4f60: 77 69 6b 69 2d 74 79 70 65 20 70 69 63 2d 74 79  wiki-type pic-ty
4f70: 70 65 29 29 29 0a 09 20 20 20 20 20 20 28 63 72  pe)))..      (cr
4f80: 65 61 74 69 6f 6e 2d 74 69 6d 65 20 28 63 75 72  eation-time (cur
4f90: 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 29 29 0a  rent-seconds))).
4fa0: 09 20 20 3b 3b 20 28 74 77 69 6b 69 3a 64 65 6c  .  ;; (twiki:del
4fb0: 65 74 65 2d 70 69 63 2d 62 79 2d 6e 61 6d 65 20  ete-pic-by-name 
4fc0: 74 64 62 20 70 69 63 2d 6e 61 6d 65 29 0a 09 20  tdb pic-name).. 
4fd0: 20 28 64 62 69 3a 65 78 65 63 20 74 64 62 20 0a   (dbi:exec tdb .
4fe0: 09 09 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ..    "INSERT IN
4ff0: 54 4f 20 70 69 63 73 20 28 6e 61 6d 65 2c 77 69  TO pics (name,wi
5000: 6b 69 5f 69 64 2c 64 61 74 5f 69 64 2c 63 72 65  ki_id,dat_id,cre
5010: 61 74 65 64 5f 6f 6e 2c 6f 77 6e 65 72 5f 69 64  ated_on,owner_id
5020: 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  ) VALUES(?,?,?,?
5030: 2c 3f 29 3b 22 0a 09 09 20 20 20 20 70 69 63 2d  ,?);"...    pic-
5040: 6e 61 6d 65 20 77 69 64 20 64 61 74 2d 69 64 20  name wid dat-id 
5050: 63 72 65 61 74 69 6f 6e 2d 74 69 6d 65 20 28 74  creation-time (t
5060: 77 69 6b 69 3a 67 65 74 2d 69 64 29 29 0a 09 20  wiki:get-id)).. 
5070: 20 28 6c 65 74 20 28 28 70 69 63 2d 69 64 20 28   (let ((pic-id (
5080: 74 77 69 6b 69 3a 67 65 74 2d 70 69 63 2d 69 64  twiki:get-pic-id
5090: 20 74 64 62 20 70 69 63 2d 6e 61 6d 65 20 77 69   tdb pic-name wi
50a0: 64 29 29 29 0a 09 20 20 20 20 28 74 77 69 6b 69  d)))..    (twiki
50b0: 3a 6d 61 6b 65 2d 74 68 75 6d 62 6e 61 69 6c 20  :make-thumbnail 
50c0: 74 64 62 20 70 69 63 2d 69 64 20 77 69 64 29 29  tdb pic-id wid))
50d0: 0a 09 20 20 23 74 29 0a 09 23 66 29 29 29 0a 0a  ..  #t)..#f)))..
50e0: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 67  (define (twiki:g
50f0: 65 74 2d 70 69 63 2d 64 61 74 20 74 64 62 20 77  et-pic-dat tdb w
5100: 69 64 20 70 69 63 2d 69 64 29 0a 20 20 28 64 62  id pic-id).  (db
5110: 69 3a 67 65 74 2d 6f 6e 65 20 74 64 62 20 22 53  i:get-one tdb "S
5120: 45 4c 45 43 54 20 64 61 74 20 46 52 4f 4d 20 70  ELECT dat FROM p
5130: 69 63 73 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 64  ics INNER JOIN d
5140: 61 74 73 20 4f 4e 20 70 69 63 73 2e 64 61 74 5f  ats ON pics.dat_
5150: 69 64 3d 64 61 74 73 2e 69 64 20 57 48 45 52 45  id=dats.id WHERE
5160: 20 70 69 63 73 2e 69 64 3d 3f 20 41 4e 44 20 77   pics.id=? AND w
5170: 69 6b 69 5f 69 64 3d 3f 3b 22 20 70 69 63 2d 69  iki_id=?;" pic-i
5180: 64 20 77 69 64 29 29 0a 0a 28 64 65 66 69 6e 65  d wid))..(define
5190: 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 68 75 6d   (twiki:get-thum
51a0: 62 2d 64 61 74 20 74 64 62 20 77 69 64 20 70 69  b-dat tdb wid pi
51b0: 63 2d 69 64 29 0a 20 20 28 64 62 69 3a 67 65 74  c-id).  (dbi:get
51c0: 2d 6f 6e 65 20 74 64 62 20 22 53 45 4c 45 43 54  -one tdb "SELECT
51d0: 20 64 61 74 20 46 52 4f 4d 20 70 69 63 73 20 49   dat FROM pics I
51e0: 4e 4e 45 52 20 4a 4f 49 4e 20 64 61 74 73 20 4f  NNER JOIN dats O
51f0: 4e 20 70 69 63 73 2e 74 68 75 6d 62 5f 64 61 74  N pics.thumb_dat
5200: 5f 69 64 3d 64 61 74 73 2e 69 64 20 57 48 45 52  _id=dats.id WHER
5210: 45 20 70 69 63 73 2e 69 64 3d 3f 20 41 4e 44 20  E pics.id=? AND 
5220: 77 69 6b 69 5f 69 64 3d 3f 3b 22 20 70 69 63 2d  wiki_id=?;" pic-
5230: 69 64 20 77 69 64 29 29 0a 0a 3b 3b 20 74 68 69  id wid))..;; thi
5240: 73 20 6f 6e 65 20 73 65 74 73 20 75 70 20 74 68  s one sets up th
5250: 65 20 43 6f 6e 74 65 6e 74 20 74 79 70 65 2c 20  e Content type, 
5260: 70 75 74 73 20 74 68 65 20 64 61 74 61 20 69 6e  puts the data in
5270: 74 6f 20 70 61 67 65 2d 64 61 74 20 61 6e 64 20  to page-dat and 
5280: 69 73 20 64 6f 6e 65 0a 28 64 65 66 69 6e 65 20  is done.(define 
5290: 28 74 77 69 6b 69 3a 72 65 74 75 72 6e 2d 69 6d  (twiki:return-im
52a0: 61 67 65 2d 64 61 74 20 74 64 62 20 77 69 64 20  age-dat tdb wid 
52b0: 70 69 63 2d 69 64 29 0a 20 20 28 6c 65 74 20 28  pic-id).  (let (
52c0: 28 64 61 74 20 20 28 74 77 69 6b 69 3a 67 65 74  (dat  (twiki:get
52d0: 2d 70 69 63 2d 64 61 74 20 74 64 62 20 77 69 64  -pic-dat tdb wid
52e0: 20 70 69 63 2d 69 64 29 29 29 0a 20 20 20 20 28   pic-id))).    (
52f0: 73 3a 6c 6f 67 20 22 74 77 69 6b 69 3a 72 65 74  s:log "twiki:ret
5300: 75 72 6e 2d 69 6d 61 67 65 2d 64 61 74 20 64 61  urn-image-dat da
5310: 74 20 69 73 3a 20 22 20 64 61 74 20 22 20 6f 66  t is: " dat " of
5320: 20 73 69 7a 65 3a 20 22 20 28 69 66 20 28 62 6c   size: " (if (bl
5330: 6f 62 3f 20 64 61 74 29 28 62 6c 6f 62 2d 73 69  ob? dat)(blob-si
5340: 7a 65 20 64 61 74 29 20 22 5b 6e 6f 74 20 61 20  ze dat) "[not a 
5350: 62 6c 6f 62 5d 22 29 29 0a 20 20 20 20 28 73 6c  blob]")).    (sl
5360: 6f 74 2d 73 65 74 21 20 73 3a 73 65 73 73 69 6f  ot-set! s:sessio
5370: 6e 20 27 70 61 67 65 2d 74 79 70 65 20 27 69 6d  n 'page-type 'im
5380: 61 67 65 29 0a 20 20 20 20 28 73 6c 6f 74 2d 73  age).    (slot-s
5390: 65 74 21 20 73 3a 73 65 73 73 69 6f 6e 20 27 63  et! s:session 'c
53a0: 6f 6e 74 65 6e 74 2d 74 79 70 65 20 22 69 6d 61  ontent-type "ima
53b0: 67 65 2f 6a 70 65 67 22 29 0a 20 20 20 20 28 73  ge/jpeg").    (s
53c0: 6c 6f 74 2d 73 65 74 21 20 73 3a 73 65 73 73 69  lot-set! s:sessi
53d0: 6f 6e 20 27 61 6c 74 2d 70 61 67 65 2d 64 61 74  on 'alt-page-dat
53e0: 20 64 61 74 29 29 29 0a 20 20 20 20 3b 3b 20 28   dat))).    ;; (
53f0: 73 65 73 73 69 6f 6e 3a 61 6c 74 2d 6f 75 74 20  session:alt-out 
5400: 73 3a 73 65 73 73 69 6f 6e 29 29 29 0a 0a 3b 3b  s:session)))..;;
5410: 20 74 68 69 73 20 6f 6e 65 20 73 65 74 73 20 75   this one sets u
5420: 70 20 74 68 65 20 43 6f 6e 74 65 6e 74 20 74 79  p the Content ty
5430: 70 65 2c 20 70 75 74 73 20 74 68 65 20 64 61 74  pe, puts the dat
5440: 61 20 69 6e 74 6f 20 70 61 67 65 2d 64 61 74 20  a into page-dat 
5450: 61 6e 64 20 69 73 20 64 6f 6e 65 0a 28 64 65 66  and is done.(def
5460: 69 6e 65 20 28 74 77 69 6b 69 3a 72 65 74 75 72  ine (twiki:retur
5470: 6e 2d 74 68 75 6d 62 2d 64 61 74 20 74 64 62 20  n-thumb-dat tdb 
5480: 77 69 64 20 70 69 63 2d 69 64 29 0a 20 20 28 6c  wid pic-id).  (l
5490: 65 74 20 28 28 64 61 74 20 20 28 74 77 69 6b 69  et ((dat  (twiki
54a0: 3a 67 65 74 2d 74 68 75 6d 62 2d 64 61 74 20 74  :get-thumb-dat t
54b0: 64 62 20 77 69 64 20 70 69 63 2d 69 64 29 29 29  db wid pic-id)))
54c0: 0a 20 20 20 20 28 73 3a 6c 6f 67 20 22 74 77 69  .    (s:log "twi
54d0: 6b 69 3a 72 65 74 75 72 6e 2d 69 6d 61 67 65 2d  ki:return-image-
54e0: 64 61 74 20 64 61 74 20 69 73 3a 20 22 20 64 61  dat dat is: " da
54f0: 74 20 22 20 6f 66 20 73 69 7a 65 3a 20 22 20 28  t " of size: " (
5500: 69 66 20 28 62 6c 6f 62 3f 20 64 61 74 29 28 62  if (blob? dat)(b
5510: 6c 6f 62 2d 73 69 7a 65 20 64 61 74 29 20 22 5b  lob-size dat) "[
5520: 6e 6f 74 20 61 20 62 6c 6f 62 5d 22 29 29 0a 20  not a blob]")). 
5530: 20 20 20 28 73 6c 6f 74 2d 73 65 74 21 20 73 3a     (slot-set! s:
5540: 73 65 73 73 69 6f 6e 20 27 70 61 67 65 2d 74 79  session 'page-ty
5550: 70 65 20 27 69 6d 61 67 65 29 0a 20 20 20 20 28  pe 'image).    (
5560: 73 6c 6f 74 2d 73 65 74 21 20 73 3a 73 65 73 73  slot-set! s:sess
5570: 69 6f 6e 20 27 63 6f 6e 74 65 6e 74 2d 74 79 70  ion 'content-typ
5580: 65 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 29 0a  e "image/jpeg").
5590: 20 20 20 20 28 73 6c 6f 74 2d 73 65 74 21 20 73      (slot-set! s
55a0: 3a 73 65 73 73 69 6f 6e 20 27 61 6c 74 2d 70 61  :session 'alt-pa
55b0: 67 65 2d 64 61 74 20 64 61 74 29 29 29 0a 20 20  ge-dat dat))).  
55c0: 20 20 3b 3b 20 28 73 65 73 73 69 6f 6e 3a 61 6c    ;; (session:al
55d0: 74 2d 6f 75 74 20 73 3a 73 65 73 73 69 6f 6e 29  t-out s:session)
55e0: 29 29 0a 20 20 0a 28 64 65 66 69 6e 65 20 28 74  )).  .(define (t
55f0: 77 69 6b 69 3a 6d 61 6b 65 2d 74 68 75 6d 62 6e  wiki:make-thumbn
5600: 61 69 6c 20 74 64 62 20 70 69 63 2d 69 64 20 77  ail tdb pic-id w
5610: 69 64 29 0a 20 20 28 6c 65 74 20 28 28 69 6e 64  id).  (let ((ind
5620: 61 74 20 20 28 74 77 69 6b 69 3a 67 65 74 2d 70  at  (twiki:get-p
5630: 69 63 2d 64 61 74 20 74 64 62 20 77 69 64 20 70  ic-dat tdb wid p
5640: 69 63 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20  ic-id))).    ;; 
5650: 20 20 28 6f 75 74 64 61 74 20 28 6f 70 65 6e 2d    (outdat (open-
5660: 6f 75 74 70 75 74 2d 73 74 72 69 6e 67 29 29 29  output-string)))
5670: 0a 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73  .    (let-values
5680: 20 28 28 28 69 6e 70 20 6f 75 70 20 70 69 64 29   (((inp oup pid)
5690: 28 70 72 6f 63 65 73 73 20 22 63 6f 6e 76 65 72  (process "conver
56a0: 74 22 20 28 6c 69 73 74 20 22 2d 73 69 7a 65 22  t" (list "-size"
56b0: 20 22 35 30 30 78 31 38 30 22 20 22 2d 22 20 22   "500x180" "-" "
56c0: 2d 74 68 75 6d 62 6e 61 69 6c 22 20 22 32 35 30  -thumbnail" "250
56d0: 78 39 30 22 20 22 2d 75 6e 73 68 61 72 70 22 20  x90" "-unsharp" 
56e0: 22 30 78 2e 35 22 20 22 2d 22 29 29 29 29 0a 09  "0x.5" "-"))))..
56f0: 09 28 77 72 69 74 65 2d 73 74 72 69 6e 67 20 28  .(write-string (
5700: 62 6c 6f 62 2d 3e 73 74 72 69 6e 67 20 69 6e 64  blob->string ind
5710: 61 74 29 20 23 66 20 6f 75 70 29 0a 09 09 28 63  at) #f oup)...(c
5720: 6c 6f 73 65 2d 69 6e 70 75 74 2d 70 6f 72 74 20  lose-input-port 
5730: 6f 75 70 29 0a 09 09 3b 3b 20 28 77 72 69 74 65  oup)...;; (write
5740: 2d 73 74 72 69 6e 67 20 23 66 20 69 6e 70 20 28  -string #f inp (
5750: 62 6c 6f 62 2d 3e 73 74 72 69 6e 67 20 69 6e 64  blob->string ind
5760: 61 74 29 29 0a 09 09 28 6c 65 74 20 28 28 6c 20  at))...(let ((l 
5770: 28 72 65 61 64 2d 73 74 72 69 6e 67 20 23 66 20  (read-string #f 
5780: 69 6e 70 29 29 29 0a 09 09 20 20 28 63 6c 6f 73  inp)))...  (clos
5790: 65 2d 6f 75 74 70 75 74 2d 70 6f 72 74 20 69 6e  e-output-port in
57a0: 70 29 0a 09 09 20 20 3b 3b 20 28 77 72 69 74 65  p)...  ;; (write
57b0: 2d 73 74 72 69 6e 67 20 6c 20 23 66 20 6f 75 74  -string l #f out
57c0: 64 61 74 29 0a 09 09 20 20 28 6c 65 74 2a 20 28  dat)...  (let* (
57d0: 28 6e 65 77 64 61 74 20 28 73 74 72 69 6e 67 2d  (newdat (string-
57e0: 3e 62 6c 6f 62 20 6c 29 29 20 3b 3b 20 28 67 65  >blob l)) ;; (ge
57f0: 74 2d 6f 75 74 70 75 74 2d 73 74 72 69 6e 67 20  t-output-string 
5800: 6f 75 74 64 61 74 29 29 29 0a 09 09 09 20 28 64  outdat))).... (d
5810: 61 74 2d 69 64 20 28 74 77 69 6b 69 3a 73 61 76  at-id (twiki:sav
5820: 65 2d 64 61 74 20 74 64 62 20 6e 65 77 64 61 74  e-dat tdb newdat
5830: 20 32 29 29 29 20 3b 3b 20 62 75 67 3f 0a 09 09   2))) ;; bug?...
5840: 20 20 20 20 28 64 62 69 3a 65 78 65 63 20 74 64      (dbi:exec td
5850: 62 20 22 55 50 44 41 54 45 20 70 69 63 73 20 53  b "UPDATE pics S
5860: 45 54 20 74 68 75 6d 62 5f 64 61 74 5f 69 64 3d  ET thumb_dat_id=
5870: 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 64  ? WHERE id=?;" d
5880: 61 74 2d 69 64 20 70 69 63 2d 69 64 29 0a 09 09  at-id pic-id)...
5890: 20 20 20 20 64 61 74 2d 69 64 29 29 29 29 29 0a      dat-id))))).
58a0: 0a 3b 3b 20 6e 6f 74 20 74 65 73 74 65 64 0a 28  .;; not tested.(
58b0: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 70 69  define (twiki:pi
58c0: 63 64 61 74 2d 3e 74 68 75 6d 62 64 61 74 20 70  cdat->thumbdat p
58d0: 69 63 64 61 74 29 0a 20 20 28 6c 65 74 2d 76 61  icdat).  (let-va
58e0: 6c 75 65 73 20 28 28 28 69 6e 70 20 6f 75 70 20  lues (((inp oup 
58f0: 70 69 64 29 28 70 72 6f 63 65 73 73 20 22 63 6f  pid)(process "co
5900: 6e 76 65 72 74 22 20 3b 3b 20 28 6c 69 73 74 20  nvert" ;; (list 
5910: 22 2d 73 69 7a 65 22 20 22 35 30 30 78 31 38 30  "-size" "500x180
5920: 22 20 22 2d 22 20 22 2d 74 68 75 6d 62 6e 61 69  " "-" "-thumbnai
5930: 6c 22 20 22 32 35 30 78 39 30 22 20 22 2d 75 6e  l" "250x90" "-un
5940: 73 68 61 72 70 22 20 22 30 78 2e 35 22 20 22 2d  sharp" "0x.5" "-
5950: 22 29 29 29 29 0a 09 09 09 09 20 20 20 20 20 20  ")))).....      
5960: 28 6c 69 73 74 20 22 2d 73 69 7a 65 22 20 22 35  (list "-size" "5
5970: 30 30 78 31 38 30 22 20 22 2d 22 20 22 2d 74 68  00x180" "-" "-th
5980: 75 6d 62 6e 61 69 6c 22 20 22 32 30 30 78 37 30  umbnail" "200x70
5990: 22 20 22 2d 75 6e 73 68 61 72 70 22 20 22 30 78  " "-unsharp" "0x
59a0: 2e 35 22 20 22 2d 22 29 29 29 29 0a 09 20 20 20  .5" "-"))))..   
59b0: 20 20 20 28 77 72 69 74 65 2d 73 74 72 69 6e 67     (write-string
59c0: 20 28 62 6c 6f 62 2d 3e 73 74 72 69 6e 67 20 70   (blob->string p
59d0: 69 63 64 61 74 29 20 23 66 20 6f 75 70 29 0a 09  icdat) #f oup)..
59e0: 20 20 20 20 20 20 28 63 6c 6f 73 65 2d 69 6e 70        (close-inp
59f0: 75 74 2d 70 6f 72 74 20 6f 75 70 29 0a 09 20 20  ut-port oup)..  
5a00: 20 20 20 20 3b 3b 20 28 77 72 69 74 65 2d 73 74      ;; (write-st
5a10: 72 69 6e 67 20 23 66 20 69 6e 70 20 28 62 6c 6f  ring #f inp (blo
5a20: 62 2d 3e 73 74 72 69 6e 67 20 69 6e 64 61 74 29  b->string indat)
5a30: 29 0a 09 20 20 20 20 20 20 28 6c 65 74 20 28 28  )..      (let ((
5a40: 6c 20 28 72 65 61 64 2d 73 74 72 69 6e 67 20 23  l (read-string #
5a50: 66 20 69 6e 70 29 29 29 0a 09 09 28 63 6c 6f 73  f inp)))...(clos
5a60: 65 2d 6f 75 74 70 75 74 2d 70 6f 72 74 20 69 6e  e-output-port in
5a70: 70 29 0a 09 09 28 77 72 69 74 65 2d 73 74 72 69  p)...(write-stri
5a80: 6e 67 20 6c 20 23 66 20 6f 75 70 29 0a 09 09 28  ng l #f oup)...(
5a90: 73 74 72 69 6e 67 2d 3e 62 6c 6f 62 20 6c 29 29  string->blob l))
5aa0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69  ))..(define (twi
5ab0: 6b 69 3a 6d 69 6d 65 2d 3e 74 77 69 6b 69 2d 74  ki:mime->twiki-t
5ac0: 79 70 65 20 6d 69 6d 65 2d 74 79 70 65 29 0a 20  ype mime-type). 
5ad0: 20 28 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e   (case (string->
5ae0: 73 79 6d 62 6f 6c 20 6d 69 6d 65 2d 74 79 70 65  symbol mime-type
5af0: 29 0a 20 20 20 20 28 28 69 6d 61 67 65 2f 6a 70  ).    ((image/jp
5b00: 65 67 29 20 31 29 0a 20 20 20 20 28 28 69 6d 61  eg) 1).    ((ima
5b10: 67 65 2f 70 6e 67 29 20 20 32 29 0a 20 20 20 20  ge/png)  2).    
5b20: 28 65 6c 73 65 20 30 29 29 29 0a 0a 3b 3b 3d 3d  (else 0)))..;;==
5b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5b70: 3d 3d 3d 3d 0a 3b 3b 20 57 69 6b 69 20 73 74 75  ====.;; Wiki stu
5b80: 66 66 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ff.;;===========
5b90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ba0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20  ===========..;; 
5bd0: 63 75 72 72 2d 74 69 64 64 6c 65 72 73 20 69 73  curr-tiddlers is
5be0: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 20 6e   a list of the n
5bf0: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  ames of the curr
5c00: 65 6e 74 20 74 69 64 64 6c 65 72 73 20 64 69 73  ent tiddlers dis
5c10: 70 6c 61 79 65 64 0a 3b 3b 20 74 69 64 64 6c 65  played.;; tiddle
5c20: 72 2d 75 6e 64 65 72 2d 65 64 69 74 20 69 73 20  r-under-edit is 
5c30: 74 68 65 20 74 69 64 64 6c 65 72 20 62 65 69 6e  the tiddler bein
5c40: 67 20 65 64 69 74 65 64 20 28 6f 72 20 23 66 20  g edited (or #f 
5c50: 66 6f 72 20 6e 6f 6e 65 29 2e 0a 28 64 65 66 69  for none)..(defi
5c60: 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 20 6e  ne (twiki:wiki n
5c70: 61 6d 65 20 6b 65 79 73 29 0a 20 20 28 6c 65 74  ame keys).  (let
5c80: 20 28 28 70 65 72 6d 73 20 20 20 28 74 77 69 6b   ((perms   (twik
5c90: 69 3a 61 63 63 65 73 73 20 6e 61 6d 65 20 6b 65  i:access name ke
5ca0: 79 73 20 28 74 77 69 6b 69 3a 67 65 74 2d 69 64  ys (twiki:get-id
5cb0: 29 29 29 29 0a 20 20 20 20 3b 3b 20 28 73 3a 6c  )))).    ;; (s:l
5cc0: 6f 67 20 22 74 77 69 6b 69 3a 77 69 6b 69 20 6e  og "twiki:wiki n
5cd0: 61 6d 65 3a 20 5c 22 22 20 6e 61 6d 65 20 22 5c  ame: \"" name "\
5ce0: 22 20 6b 65 79 73 3a 20 22 20 6b 65 79 73 29 0a  " keys: " keys).
5cf0: 20 20 20 20 28 69 66 20 28 6f 72 20 28 6e 6f 74      (if (or (not
5d00: 20 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 74 72   name)..    (str
5d10: 69 6e 67 3d 3f 20 6e 61 6d 65 20 22 22 29 29 20  ing=? name "")) 
5d20: 3b 3b 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  ;; name must be 
5d30: 22 22 20 6f 72 20 23 66 20 74 6f 20 67 65 74 20  "" or #f to get 
5d40: 68 65 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  here and return 
5d50: 61 6e 20 69 6d 61 67 65 0a 09 3b 3b 20 68 61 6e  an image..;; han
5d60: 64 6c 65 20 72 65 74 75 72 6e 69 6e 67 20 70 69  dle returning pi
5d70: 63 74 75 72 65 73 2c 20 6e 6f 74 65 20 6b 65 79  ctures, note key
5d80: 73 20 61 6e 64 20 6e 61 6d 65 20 61 72 65 20 69  s and name are i
5d90: 67 6e 6f 72 65 64 20 66 6f 72 20 74 68 65 73 65  gnored for these
5da0: 2e 20 54 68 65 79 20 61 72 65 20 63 61 6c 6c 65  . They are calle
5db0: 64 20 6f 75 74 20 69 6e 0a 09 3b 3b 20 74 68 65  d out in..;; the
5dc0: 20 74 77 69 6b 69 2f 76 69 65 77 2e 73 63 6d 20   twiki/view.scm 
5dd0: 28 74 77 69 6b 69 3a 74 77 69 6b 69 20 22 62 6c  (twiki:twiki "bl
5de0: 61 68 22 20 27 28 6e 61 64 61 20 66 6f 6f 29 29  ah" '(nada foo))
5df0: 20 63 61 6c 6c 2e 0a 09 28 6c 65 74 20 28 28 69   call...(let ((i
5e00: 6d 61 67 65 20 20 20 28 73 3a 67 65 74 2d 70 61  mage   (s:get-pa
5e10: 72 61 6d 20 22 69 6d 61 67 65 22 29 29 0a 09 20  ram "image")).. 
5e20: 20 20 20 20 20 28 74 68 75 6d 62 20 20 20 28 73       (thumb   (s
5e30: 3a 67 65 74 2d 70 61 72 61 6d 20 22 74 68 75 6d  :get-param "thum
5e40: 62 22 29 29 29 0a 09 20 20 28 73 3a 6c 6f 67 20  b")))..  (s:log 
5e50: 22 69 6d 61 67 65 3a 20 22 20 69 6d 61 67 65 20  "image: " image 
5e60: 22 20 74 68 75 6d 62 3a 20 22 20 74 68 75 6d 62  " thumb: " thumb
5e70: 20 22 20 77 69 6b 69 5f 6b 65 79 3a 20 22 20 28   " wiki_key: " (
5e80: 73 3a 67 65 74 2d 70 61 72 61 6d 20 27 77 69 6b  s:get-param 'wik
5e90: 69 5f 6b 65 79 29 29 0a 09 20 20 28 69 66 20 28  i_key))..  (if (
5ea0: 61 6e 64 20 28 6d 65 6d 62 65 72 20 27 72 20 70  and (member 'r p
5eb0: 65 72 6d 73 29 20 69 6d 61 67 65 29 0a 09 20 20  erms) image)..  
5ec0: 20 20 20 20 28 6c 65 74 2a 20 28 28 76 61 72 6c      (let* ((varl
5ed0: 73 74 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74  st (string-split
5ee0: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 27 77   (s:get-param 'w
5ef0: 69 6b 69 5f 6b 65 79 29 20 22 2d 22 29 29 0a 09  iki_key) "-"))..
5f00: 09 20 20 20 20 20 28 74 6b 65 79 20 28 74 77 69  .     (tkey (twi
5f10: 6b 69 3a 77 65 62 36 34 64 65 63 20 28 63 61 64  ki:web64dec (cad
5f20: 72 20 76 61 72 6c 73 74 29 29 29 0a 09 09 20 20  r varlst)))...  
5f30: 20 20 20 28 77 69 64 20 20 28 73 74 72 69 6e 67     (wid  (string
5f40: 2d 3e 6e 75 6d 62 65 72 20 28 63 61 72 20 20 76  ->number (car  v
5f50: 61 72 6c 73 74 29 29 29 0a 09 09 20 20 20 20 20  arlst)))...     
5f60: 28 74 64 62 6e 20 28 74 77 69 6b 69 3a 6f 70 65  (tdbn (twiki:ope
5f70: 6e 2d 64 62 20 74 6b 65 79 20 23 66 29 29 29 0a  n-db tkey #f))).
5f80: 09 09 28 73 3a 6c 6f 67 20 22 74 6b 65 79 3a 20  ..(s:log "tkey: 
5f90: 22 20 74 6b 65 79 20 22 20 69 6d 61 67 65 20 6e  " tkey " image n
5fa0: 75 6d 62 65 72 3a 20 22 20 69 6d 61 67 65 29 0a  umber: " image).
5fb0: 09 09 28 74 77 69 6b 69 3a 72 65 74 75 72 6e 2d  ..(twiki:return-
5fc0: 69 6d 61 67 65 2d 64 61 74 20 74 64 62 6e 20 77  image-dat tdbn w
5fd0: 69 64 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62  id (string->numb
5fe0: 65 72 20 69 6d 61 67 65 29 29 29 29 20 3b 3b 20  er image)))) ;; 
5ff0: 64 6f 20 6e 6f 74 20 72 65 74 75 72 6e 20 66 72  do not return fr
6000: 6f 6d 20 74 77 69 6b 69 3a 72 65 74 75 72 6e 2d  om twiki:return-
6010: 69 6d 61 67 65 0a 09 20 20 28 69 66 20 28 61 6e  image..  (if (an
6020: 64 20 28 6d 65 6d 62 65 72 20 27 72 20 70 65 72  d (member 'r per
6030: 6d 73 29 20 74 68 75 6d 62 29 0a 09 20 20 20 20  ms) thumb)..    
6040: 20 20 28 6c 65 74 2a 20 28 28 76 61 72 6c 73 74    (let* ((varlst
6050: 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 28   (string-split (
6060: 73 3a 67 65 74 2d 70 61 72 61 6d 20 27 77 69 6b  s:get-param 'wik
6070: 69 5f 6b 65 79 29 20 22 2d 22 29 29 0a 09 09 20  i_key) "-"))... 
6080: 20 20 20 20 28 74 6b 65 79 20 20 20 28 74 77 69      (tkey   (twi
6090: 6b 69 3a 77 65 62 36 34 64 65 63 20 28 63 61 64  ki:web64dec (cad
60a0: 72 20 76 61 72 6c 73 74 29 29 29 0a 09 09 20 20  r varlst)))...  
60b0: 20 20 20 28 77 69 64 20 20 20 20 28 73 74 72 69     (wid    (stri
60c0: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 63 61 72 20  ng->number (car 
60d0: 20 76 61 72 6c 73 74 29 29 29 0a 09 09 20 20 20   varlst)))...   
60e0: 20 20 28 74 64 62 6e 20 20 20 28 74 77 69 6b 69    (tdbn   (twiki
60f0: 3a 6f 70 65 6e 2d 64 62 20 74 6b 65 79 20 23 66  :open-db tkey #f
6100: 29 29 29 0a 09 09 28 73 3a 6c 6f 67 20 22 74 6b  )))...(s:log "tk
6110: 65 79 3a 20 22 20 74 6b 65 79 20 22 20 74 68 75  ey: " tkey " thu
6120: 6d 62 20 6e 75 6d 62 65 72 3a 20 22 20 69 6d 61  mb number: " ima
6130: 67 65 29 0a 09 09 28 74 77 69 6b 69 3a 72 65 74  ge)...(twiki:ret
6140: 75 72 6e 2d 74 68 75 6d 62 2d 64 61 74 20 74 64  urn-thumb-dat td
6150: 62 6e 20 77 69 64 20 28 73 74 72 69 6e 67 2d 3e  bn wid (string->
6160: 6e 75 6d 62 65 72 20 74 68 75 6d 62 29 29 29 29  number thumb))))
6170: 29 20 3b 3b 20 64 6f 20 6e 6f 74 20 72 65 74 75  ) ;; do not retu
6180: 72 6e 20 66 72 6f 6d 20 74 77 69 6b 69 3a 72 65  rn from twiki:re
6190: 74 75 72 6e 2d 69 6d 61 67 65 0a 09 28 69 66 20  turn-image..(if 
61a0: 28 6e 6f 74 20 28 6d 65 6d 62 65 72 20 27 72 20  (not (member 'r 
61b0: 70 65 72 6d 73 29 29 20 3b 3b 20 72 65 61 64 20  perms)) ;; read 
61c0: 61 63 63 65 73 73 0a 09 20 20 20 20 27 28 29 20  access..    '() 
61d0: 3b 3b 20 72 65 74 75 72 6e 20 61 20 62 6c 61 6e  ;; return a blan
61e0: 6b 20 73 6c 61 74 65 0a 09 20 20 20 20 28 74 77  k slate..    (tw
61f0: 69 6b 69 3a 64 69 73 70 6c 61 79 2d 77 69 6b 69  iki:display-wiki
6200: 20 6e 61 6d 65 20 6b 65 79 73 20 70 65 72 6d 73   name keys perms
6210: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  )))))..(define (
6220: 74 77 69 6b 69 3a 64 69 73 70 6c 61 79 2d 77 69  twiki:display-wi
6230: 6b 69 20 6e 61 6d 65 20 6b 65 79 73 20 70 65 72  ki name keys per
6240: 6d 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 77 69  ms).  (let* ((wi
6250: 6b 69 64 61 74 20 20 28 6d 61 6b 65 2d 74 77 69  kidat  (make-twi
6260: 6b 69 3a 77 69 6b 69 29 29 0a 09 20 28 74 6b 65  ki:wiki)).. (tke
6270: 79 20 20 20 20 20 28 74 77 69 6b 69 3a 6b 65 79  y     (twiki:key
6280: 73 2d 3e 6b 65 79 20 6b 65 79 73 29 29 0a 09 20  s->key keys)).. 
6290: 28 74 64 62 20 20 20 20 20 20 28 74 77 69 6b 69  (tdb      (twiki
62a0: 3a 6f 70 65 6e 2d 64 62 20 74 6b 65 79 29 29 0a  :open-db tkey)).
62b0: 09 20 28 77 69 64 20 20 20 20 20 20 28 74 77 69  . (wid      (twi
62c0: 6b 69 3a 6e 61 6d 65 2d 3e 77 69 64 20 74 64 62  ki:name->wid tdb
62d0: 20 6e 61 6d 65 29 29 0a 09 20 28 63 76 61 72 20   name)).. (cvar 
62e0: 20 20 20 20 28 63 6f 6e 63 20 22 43 55 52 52 45      (conc "CURRE
62f0: 4e 54 5f 54 57 49 44 4c 45 52 53 3a 22 20 77 69  NT_TWIDLERS:" wi
6300: 64 29 29 20 3b 3b 20 70 61 67 65 20 76 61 72 20  d)) ;; page var 
6310: 74 6f 20 73 74 6f 72 65 20 63 75 72 72 65 6e 74  to store current
6320: 20 74 77 69 64 64 6c 65 72 73 20 62 65 69 6e 67   twiddlers being
6330: 20 76 69 65 77 65 64 0a 09 20 28 63 76 61 72 2d   viewed.. (cvar-
6340: 65 64 20 20 28 63 6f 6e 63 20 22 43 55 52 52 45  ed  (conc "CURRE
6350: 4e 54 5f 54 57 49 44 4c 45 52 5f 55 4e 44 45 52  NT_TWIDLER_UNDER
6360: 5f 45 44 49 54 3a 22 20 77 69 64 29 29 0a 09 20  _EDIT:" wid)).. 
6370: 28 74 6e 75 6d 65 64 69 74 20 28 69 66 20 28 73  (tnumedit (if (s
6380: 3a 67 65 74 20 63 76 61 72 2d 65 64 29 20 0a 09  :get cvar-ed) ..
6390: 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d  .       (string-
63a0: 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65 74 20 63  >number (s:get c
63b0: 76 61 72 2d 65 64 29 29 0a 09 09 20 20 20 20 20  var-ed))...     
63c0: 20 20 23 66 29 29 20 3b 3b 20 23 66 20 3d 3e 20    #f)) ;; #f => 
63d0: 6e 6f 74 68 69 6e 67 20 74 6f 20 65 64 69 74 2c  nothing to edit,
63e0: 20 2d 31 20 63 72 65 61 74 65 20 61 20 6e 65 77   -1 create a new
63f0: 20 74 69 64 64 6c 65 72 0a 09 20 28 74 6e 75 6d   tiddler.. (tnum
6400: 76 69 65 77 20 23 66 29 0a 09 20 28 6c 6d 65 6e  view #f).. (lmen
6410: 75 20 20 20 20 28 74 77 69 6b 69 3a 67 65 74 2d  u    (twiki:get-
6420: 74 69 64 64 6c 65 72 73 20 74 64 62 20 77 69 64  tiddlers tdb wid
6430: 20 28 6c 69 73 74 20 22 4d 61 69 6e 4d 65 6e 75   (list "MainMenu
6440: 22 29 29 29 0a 09 20 3b 3b 20 73 74 6f 72 65 20  "))).. ;; store 
6450: 74 69 64 64 6c 65 72 73 20 66 6f 72 20 74 68 69  tiddlers for thi
6460: 73 20 70 61 67 65 2f 74 77 69 6b 69 20 69 6e 20  s page/twiki in 
6470: 63 76 61 72 20 28 69 2e 65 2e 20 43 55 52 52 45  cvar (i.e. CURRE
6480: 4e 54 5f 54 57 49 44 4c 45 52 53 3a 3c 77 69 64  NT_TWIDLERS:<wid
6490: 3e 0a 09 20 28 74 64 6c 6e 75 6d 73 20 20 28 69  >.. (tdlnums  (i
64a0: 66 20 28 73 3a 67 65 74 20 63 76 61 72 29 0a 09  f (s:get cvar)..
64b0: 09 20 20 20 20 20 20 20 28 6d 61 70 20 73 74 72  .       (map str
64c0: 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73 74 72  ing->number (str
64d0: 69 6e 67 2d 73 70 6c 69 74 20 28 73 3a 67 65 74  ing-split (s:get
64e0: 20 63 76 61 72 29 20 22 2c 22 29 29 0a 09 09 20   cvar) ","))... 
64f0: 20 20 20 20 20 20 27 28 29 29 29 20 3b 3b 20 6c        '())) ;; l
6500: 69 73 74 20 6f 66 20 74 69 64 64 6c 65 72 20 6e  ist of tiddler n
6510: 75 6d 62 65 72 73 0a 09 20 28 74 64 6c 72 73 20  umbers.. (tdlrs 
6520: 20 20 20 27 28 29 29 0a 09 20 28 74 65 64 69 74     '()).. (tedit
6530: 65 64 20 20 28 69 66 20 28 6d 65 6d 62 65 72 20  ed  (if (member 
6540: 27 77 20 70 65 72 6d 73 29 20 23 66 20 23 74 29  'w perms) #f #t)
6550: 29 20 3b 3b 20 66 6f 72 63 65 20 6e 6f 20 65 64  ) ;; force no ed
6560: 69 74 73 20 69 66 20 6e 6f 74 20 61 20 77 72 69  its if not a wri
6570: 74 65 72 0a 09 20 28 65 64 69 74 2d 74 6d 65 6e  ter.. (edit-tmen
6580: 75 2d 69 64 20 28 69 66 20 28 61 6e 64 20 28 6d  u-id (if (and (m
6590: 65 6d 62 65 72 20 27 77 20 70 65 72 6d 73 29 0a  ember 'w perms).
65a0: 09 09 09 09 20 28 73 3a 67 65 74 2d 70 61 72 61  .... (s:get-para
65b0: 6d 20 22 65 64 69 74 5f 74 6d 65 6e 75 22 29 29  m "edit_tmenu"))
65c0: 0a 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d  ....    (string-
65d0: 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65 74 2d 70  >number (s:get-p
65e0: 61 72 61 6d 20 22 65 64 69 74 5f 74 6d 65 6e 75  aram "edit_tmenu
65f0: 22 29 29 0a 09 09 09 20 20 20 20 23 66 29 29 0a  "))....    #f)).
6600: 09 20 28 65 64 69 74 2d 74 69 64 64 6c 65 72 20  . (edit-tiddler 
6610: 28 69 66 20 20 28 61 6e 64 20 28 6d 65 6d 62 65  (if  (and (membe
6620: 72 20 27 77 20 70 65 72 6d 73 29 0a 09 09 09 09  r 'w perms).....
6630: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 65   (s:get-param "e
6640: 64 69 74 5f 74 69 64 64 6c 65 72 22 29 29 20 3b  dit_tiddler")) ;
6650: 3b 20 74 68 69 73 20 68 61 6e 64 6c 65 73 20 74  ; this handles t
6660: 68 65 20 22 65 64 69 74 22 20 6c 69 6e 6b 20 69  he "edit" link i
6670: 6e 20 74 68 65 20 74 69 64 64 6c 65 72 20 63 6f  n the tiddler co
6680: 6e 74 72 6f 6c 20 62 61 72 0a 09 09 09 20 20 20  ntrol bar....   
6690: 20 28 6c 65 74 20 28 28 74 20 28 74 77 69 6b 69   (let ((t (twiki
66a0: 3a 67 65 74 2d 74 69 64 64 6c 65 72 73 2d 62 79  :get-tiddlers-by
66b0: 2d 6e 75 6d 20 74 64 62 20 77 69 64 20 28 6c 69  -num tdb wid (li
66c0: 73 74 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62  st (string->numb
66d0: 65 72 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20  er (s:get-param 
66e0: 22 65 64 69 74 5f 74 69 64 64 6c 65 72 22 29 29  "edit_tiddler"))
66f0: 29 29 29 29 0a 09 09 09 20 20 20 20 20 20 28 73  ))))....      (s
6700: 3a 6c 6f 67 20 22 74 3a 20 22 20 74 29 0a 09 09  :log "t: " t)...
6710: 09 20 20 20 20 20 20 28 69 66 20 74 0a 09 09 09  .      (if t....
6720: 09 20 20 28 63 61 72 20 74 20 29 20 3b 3b 20 73  .  (car t ) ;; s
6730: 68 6f 75 6c 64 20 62 65 20 61 20 6c 69 73 74 20  hould be a list 
6740: 6f 66 20 6f 6e 65 0a 09 09 09 09 20 20 28 74 77  of one.....  (tw
6750: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d  iki:tiddler-set-
6760: 6e 61 6d 65 21 0a 09 09 09 09 20 20 20 28 74 77  name!.....   (tw
6770: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d  iki:tiddler-set-
6780: 69 64 21 20 28 74 77 69 6b 69 3a 74 69 64 64 6c  id! (twiki:tiddl
6790: 65 72 2d 6d 61 6b 65 29 20 2d 31 29 20 22 4e 65  er-make) -1) "Ne
67a0: 77 54 69 64 64 6c 65 72 22 29 29 29 0a 09 09 09  wTiddler")))....
67b0: 20 20 20 20 23 66 29 29 0a 09 20 28 76 69 65 77      #f)).. (view
67c0: 2d 74 69 64 64 6c 65 72 20 28 69 66 20 28 73 3a  -tiddler (if (s:
67d0: 67 65 74 2d 70 61 72 61 6d 20 22 76 69 65 77 5f  get-param "view_
67e0: 74 69 64 64 6c 65 72 22 29 0a 09 09 09 20 20 20  tiddler")....   
67f0: 28 6c 65 74 2a 20 28 28 74 6e 61 6d 65 20 28 74  (let* ((tname (t
6800: 77 69 6b 69 3a 77 65 62 36 34 64 65 63 20 28 73  wiki:web64dec (s
6810: 3a 67 65 74 2d 70 61 72 61 6d 20 22 76 69 65 77  :get-param "view
6820: 5f 74 69 64 64 6c 65 72 22 29 29 29 0a 09 09 09  _tiddler")))....
6830: 09 20 20 28 74 20 20 20 20 20 28 74 77 69 6b 69  .  (t     (twiki
6840: 3a 67 65 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d  :get-tiddler-by-
6850: 6e 61 6d 65 20 74 64 62 20 77 69 64 20 74 6e 61  name tdb wid tna
6860: 6d 65 29 29 29 0a 09 09 09 20 20 20 20 20 28 73  me)))....     (s
6870: 3a 6c 6f 67 20 22 74 3a 20 22 20 74 29 0a 09 09  :log "t: " t)...
6880: 09 20 20 20 20 20 28 69 66 20 74 0a 09 09 09 09  .     (if t.....
6890: 20 74 20 0a 09 09 09 09 20 28 62 65 67 69 6e 0a   t ..... (begin.
68a0: 09 09 09 09 20 20 20 28 74 77 69 6b 69 3a 73 61  ....   (twiki:sa
68b0: 76 65 2d 74 69 64 64 6c 65 72 20 74 64 62 20 74  ve-tiddler tdb t
68c0: 6e 61 6d 65 20 28 63 6f 6e 63 20 22 21 22 20 74  name (conc "!" t
68d0: 6e 61 6d 65 29 20 22 22 20 77 69 64 20 28 74 77  name) "" wid (tw
68e0: 69 6b 69 3a 67 65 74 2d 69 64 29 29 0a 09 09 09  iki:get-id))....
68f0: 09 20 20 20 28 74 77 69 6b 69 3a 67 65 74 2d 74  .   (twiki:get-t
6900: 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d 65 20 74  iddler-by-name t
6910: 64 62 20 77 69 64 20 74 6e 61 6d 65 29 29 29 29  db wid tname))))
6920: 0a 09 09 09 20 20 20 23 66 29 29 0a 09 20 29 20  ....   #f)).. ) 
6930: 3b 3b 20 69 6d 61 67 65 20 69 73 20 74 68 65 20  ;; image is the 
6940: 64 61 74 5f 69 64 2c 20 6b 65 65 70 20 69 74 20  dat_id, keep it 
6950: 73 69 6d 70 6c 65 20 73 69 6c 6c 79 2e 0a 0a 20  simple silly... 
6960: 20 20 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 73     (twiki:wiki-s
6970: 65 74 2d 77 69 64 21 20 20 77 69 6b 69 64 61 74  et-wid!  wikidat
6980: 20 77 69 64 29 0a 20 20 20 20 28 74 77 69 6b 69   wid).    (twiki
6990: 3a 77 69 6b 69 2d 73 65 74 2d 6b 65 79 21 20 20  :wiki-set-key!  
69a0: 77 69 6b 69 64 61 74 20 74 6b 65 79 29 0a 20 20  wikidat tkey).  
69b0: 20 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 73 65    (twiki:wiki-se
69c0: 74 2d 6e 61 6d 65 21 20 77 69 6b 69 64 61 74 20  t-name! wikidat 
69d0: 6e 61 6d 65 29 0a 20 20 20 20 28 74 77 69 6b 69  name).    (twiki
69e0: 3a 77 69 6b 69 2d 73 65 74 2d 64 62 68 21 20 20  :wiki-set-dbh!  
69f0: 77 69 6b 69 64 61 74 20 74 64 62 29 0a 20 20 20  wikidat tdb).   
6a00: 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74   (twiki:wiki-set
6a10: 2d 70 65 72 6d 73 21 20 77 69 6b 69 64 61 74 20  -perms! wikidat 
6a20: 70 65 72 6d 73 29 0a 0a 20 20 20 20 3b 3b 20 28  perms)..    ;; (
6a30: 73 3a 6c 6f 67 20 22 65 64 69 74 2d 74 6d 65 6e  s:log "edit-tmen
6a40: 75 2d 69 64 3a 20 22 20 65 64 69 74 2d 74 6d 65  u-id: " edit-tme
6a50: 6e 75 2d 69 64 20 22 20 65 64 69 74 2d 74 69 64  nu-id " edit-tid
6a60: 64 6c 65 72 3a 20 22 20 65 64 69 74 2d 74 69 64  dler: " edit-tid
6a70: 64 6c 65 72 29 0a 0a 20 20 20 20 3b 3b 20 48 61  dler)..    ;; Ha
6a80: 6e 64 6c 65 20 6f 74 68 65 72 20 55 52 49 20 63  ndle other URI c
6a90: 6f 6d 6d 61 6e 64 73 20 68 65 72 65 0a 20 20 20  ommands here.   
6aa0: 20 28 69 66 20 28 73 3a 67 65 74 2d 70 61 72 61   (if (s:get-para
6ab0: 6d 20 22 63 61 6e 63 65 6c 5f 74 65 64 69 74 22  m "cancel_tedit"
6ac0: 29 20 3b 3b 20 64 6f 65 73 6e 27 74 20 6d 61 74  ) ;; doesn't mat
6ad0: 74 65 72 20 77 68 69 63 68 20 74 69 64 64 6c 65  ter which tiddle
6ae0: 72 20 2d 20 6a 75 73 74 20 75 73 65 20 74 68 69  r - just use thi
6af0: 73 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20  s to cancel any 
6b00: 65 64 69 74 0a 09 28 62 65 67 69 6e 0a 09 20 20  edit..(begin..  
6b10: 28 73 3a 64 65 6c 21 20 28 63 6f 6e 63 20 22 43  (s:del! (conc "C
6b20: 55 52 52 45 4e 54 5f 54 57 49 44 4c 45 52 5f 55  URRENT_TWIDLER_U
6b30: 4e 44 45 52 5f 45 44 49 54 3a 22 20 77 69 64 29  NDER_EDIT:" wid)
6b40: 29 0a 09 20 20 28 73 65 74 21 20 65 64 69 74 2d  )..  (set! edit-
6b50: 74 69 64 64 6c 65 72 20 23 66 29 0a 09 20 20 28  tiddler #f)..  (
6b60: 73 65 74 21 20 74 6e 75 6d 65 64 69 74 20 23 66  set! tnumedit #f
6b70: 29 0a 09 20 20 28 73 65 74 21 20 76 69 65 77 2d  )..  (set! view-
6b80: 74 69 64 64 6c 65 72 20 23 66 29 0a 09 20 20 28  tiddler #f)..  (
6b90: 74 77 69 6b 69 3a 6e 6f 72 6d 61 6c 69 7a 65 2d  twiki:normalize-
6ba0: 63 75 72 72 65 6e 74 2d 74 77 69 64 64 6c 65 72  current-twiddler
6bb0: 73 20 74 64 62 20 77 69 64 29 0a 09 20 20 28 69  s tdb wid)..  (i
6bc0: 66 20 28 73 3a 67 65 74 20 63 76 61 72 29 0a 09  f (s:get cvar)..
6bd0: 20 20 20 20 20 20 28 73 65 74 21 20 74 64 6c 6e        (set! tdln
6be0: 75 6d 73 20 28 6d 61 70 20 73 74 72 69 6e 67 2d  ums (map string-
6bf0: 3e 6e 75 6d 62 65 72 20 28 73 74 72 69 6e 67 2d  >number (string-
6c00: 73 70 6c 69 74 20 28 73 3a 67 65 74 20 63 76 61  split (s:get cva
6c10: 72 29 20 22 2c 22 29 29 29 29 29 29 0a 20 20 20  r) ",")))))).   
6c20: 20 28 69 66 20 28 73 3a 67 65 74 2d 70 61 72 61   (if (s:get-para
6c30: 6d 20 22 64 65 6c 65 74 65 5f 74 69 64 64 6c 65  m "delete_tiddle
6c40: 72 22 29 20 27 28 29 29 0a 20 20 20 20 3b 3b 20  r") '()).    ;; 
6c50: 28 74 77 69 6b 69 3a 64 65 6c 65 74 65 5f 74 69  (twiki:delete_ti
6c60: 64 64 6c 65 72 20 74 64 62 20 77 69 64 20 28 73  ddler tdb wid (s
6c70: 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73  tring->number (s
6c80: 3a 67 65 74 2d 70 61 72 61 6d 20 22 64 65 6c 65  :get-param "dele
6c90: 74 65 5f 74 69 64 64 6c 65 72 22 29 29 29 29 0a  te_tiddler")))).
6ca0: 0a 20 20 20 20 28 73 3a 73 65 74 21 20 22 54 57  .    (s:set! "TW
6cb0: 49 4b 49 5f 4b 45 59 22 20 74 6b 65 79 29 20 3b  IKI_KEY" tkey) ;
6cc0: 3b 20 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d  ; this mechanism
6cd0: 20 77 69 6c 6c 20 66 61 69 6c 20 66 6f 72 20 68   will fail for h
6ce0: 69 65 72 61 72 63 68 69 61 6c 20 74 77 69 6b 69  ierarchial twiki
6cf0: 73 0a 20 20 20 20 3b 3b 20 6f 76 65 72 72 69 64  s.    ;; overrid
6d00: 65 20 74 68 65 20 74 77 69 64 64 6c 65 72 20 74  e the twiddler t
6d10: 6f 20 65 64 69 74 20 77 68 65 6e 20 65 64 69 74  o edit when edit
6d20: 69 6e 67 20 4d 61 69 6e 4d 65 6e 75 0a 20 20 20  ing MainMenu.   
6d30: 20 28 69 66 20 65 64 69 74 2d 74 69 64 64 6c 65   (if edit-tiddle
6d40: 72 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 73 65  r..(begin..  (se
6d50: 74 21 20 74 6e 75 6d 65 64 69 74 20 28 74 77 69  t! tnumedit (twi
6d60: 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 69  ki:tiddler-get-i
6d70: 64 20 65 64 69 74 2d 74 69 64 64 6c 65 72 29 29  d edit-tiddler))
6d80: 0a 09 20 20 28 73 3a 73 65 74 21 20 27 74 77 69  ..  (s:set! 'twi
6d90: 6b 69 5f 74 69 74 6c 65 20 28 74 77 69 6b 69 3a  ki_title (twiki:
6da0: 74 69 64 64 6c 65 72 2d 67 65 74 2d 6e 61 6d 65  tiddler-get-name
6db0: 20 65 64 69 74 2d 74 69 64 64 6c 65 72 29 29 0a   edit-tiddler)).
6dc0: 09 20 20 28 73 3a 73 65 74 21 20 27 74 77 69 6b  .  (s:set! 'twik
6dd0: 69 5f 62 6f 64 79 20 20 28 74 77 69 6b 69 3a 67  i_body  (twiki:g
6de0: 65 74 2d 64 61 74 20 74 64 62 20 28 74 77 69 6b  et-dat tdb (twik
6df0: 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61  i:tiddler-get-da
6e00: 74 2d 69 64 20 65 64 69 74 2d 74 69 64 64 6c 65  t-id edit-tiddle
6e10: 72 29 29 29 29 29 0a 20 20 20 20 28 69 66 20 76  r))))).    (if v
6e20: 69 65 77 2d 74 69 64 64 6c 65 72 0a 09 28 62 65  iew-tiddler..(be
6e30: 67 69 6e 0a 09 20 20 28 73 65 74 21 20 74 6e 75  gin..  (set! tnu
6e40: 6d 76 69 65 77 20 28 74 77 69 6b 69 3a 74 69 64  mview (twiki:tid
6e50: 64 6c 65 72 2d 67 65 74 2d 69 64 20 76 69 65 77  dler-get-id view
6e60: 2d 74 69 64 64 6c 65 72 29 29 29 29 0a 20 20 20  -tiddler)))).   
6e70: 20 0a 20 20 20 20 3b 3b 20 4e 4f 57 20 57 48 41   .    ;; NOW WHA
6e80: 54 20 46 4f 52 20 56 49 45 57 20 2d 20 66 69 78  T FOR VIEW - fix
6e90: 20 74 68 65 20 6c 69 6e 6b 73 2c 20 61 64 64 20   the links, add 
6ea0: 74 6f 20 74 64 6c 73 74 0a 0a 0a 20 20 20 20 28  to tdlst...    (
6eb0: 69 66 20 65 64 69 74 2d 74 6d 65 6e 75 2d 69 64  if edit-tmenu-id
6ec0: 20 20 20 28 73 65 74 21 20 74 6e 75 6d 65 64 69     (set! tnumedi
6ed0: 74 20 65 64 69 74 2d 74 6d 65 6e 75 2d 69 64 29  t edit-tmenu-id)
6ee0: 29 0a 20 20 20 20 28 69 66 20 74 6e 75 6d 65 64  ).    (if tnumed
6ef0: 69 74 20 28 73 65 74 21 20 74 64 6c 6e 75 6d 73  it (set! tdlnums
6f00: 20 28 63 6f 6e 73 20 74 6e 75 6d 65 64 69 74 20   (cons tnumedit 
6f10: 74 64 6c 6e 75 6d 73 29 29 29 0a 20 20 20 20 28  tdlnums))).    (
6f20: 69 66 20 74 6e 75 6d 76 69 65 77 20 28 73 65 74  if tnumview (set
6f30: 21 20 74 64 6c 6e 75 6d 73 20 28 63 6f 6e 73 20  ! tdlnums (cons 
6f40: 74 6e 75 6d 76 69 65 77 20 74 64 6c 6e 75 6d 73  tnumview tdlnums
6f50: 29 29 29 0a 20 20 20 20 28 73 65 74 21 20 74 64  ))).    (set! td
6f60: 6c 72 73 20 28 74 77 69 6b 69 3a 67 65 74 2d 74  lrs (twiki:get-t
6f70: 69 64 64 6c 65 72 73 2d 62 79 2d 6e 75 6d 20 74  iddlers-by-num t
6f80: 64 62 20 77 69 64 20 74 64 6c 6e 75 6d 73 29 29  db wid tdlnums))
6f90: 0a 0a 20 20 20 20 3b 3b 20 72 65 6d 6f 76 65 20  ..    ;; remove 
6fa0: 74 64 6c 72 73 20 66 72 6f 6d 20 74 68 65 20 6c  tdlrs from the l
6fb0: 69 73 74 20 69 66 20 63 6c 6f 73 65 5f 74 69 64  ist if close_tid
6fc0: 64 6c 65 72 20 63 61 6c 6c 65 64 0a 20 20 20 20  dler called.    
6fd0: 28 69 66 20 28 73 3a 67 65 74 2d 70 61 72 61 6d  (if (s:get-param
6fe0: 20 22 63 6c 6f 73 65 5f 74 69 64 64 6c 65 72 22   "close_tiddler"
6ff0: 29 0a 09 28 73 65 74 21 20 74 64 6c 72 73 20 28  )..(set! tdlrs (
7000: 6c 65 74 20 28 28 74 6e 75 6d 20 28 73 74 72 69  let ((tnum (stri
7010: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65  ng->number (s:ge
7020: 74 2d 70 61 72 61 6d 20 22 63 6c 6f 73 65 5f 74  t-param "close_t
7030: 69 64 64 6c 65 72 22 29 29 29 29 0a 09 09 20 20  iddler"))))...  
7040: 20 20 20 20 28 72 65 6d 6f 76 65 20 28 6c 61 6d      (remove (lam
7050: 62 64 61 20 28 74 29 0a 09 09 09 09 28 65 71 75  bda (t).....(equ
7060: 61 6c 3f 20 28 74 77 69 6b 69 3a 74 69 64 64 6c  al? (twiki:tiddl
7070: 65 72 2d 67 65 74 2d 69 64 20 74 29 20 74 6e 75  er-get-id t) tnu
7080: 6d 29 29 0a 09 09 09 20 20 20 20 20 20 74 64 6c  m))....      tdl
7090: 72 73 29 29 29 29 0a 0a 20 20 20 20 3b 3b 20 72  rs))))..    ;; r
70a0: 65 6d 6f 76 65 20 61 6c 6c 20 6f 74 68 65 72 73  emove all others
70b0: 20 69 66 20 63 6c 6f 73 65 5f 6f 74 68 65 72 5f   if close_other_
70c0: 74 69 64 64 6c 65 72 73 20 63 61 6c 6c 65 64 0a  tiddlers called.
70d0: 20 20 20 20 28 69 66 20 28 73 3a 67 65 74 2d 70      (if (s:get-p
70e0: 61 72 61 6d 20 22 63 6c 6f 73 65 5f 6f 74 68 65  aram "close_othe
70f0: 72 5f 74 69 64 64 6c 65 72 73 22 29 0a 09 28 73  r_tiddlers")..(s
7100: 65 74 21 20 74 64 6c 72 73 20 28 6c 65 74 20 28  et! tdlrs (let (
7110: 28 74 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e  (tnum (string->n
7120: 75 6d 62 65 72 20 28 73 3a 67 65 74 2d 70 61 72  umber (s:get-par
7130: 61 6d 20 22 63 6c 6f 73 65 5f 6f 74 68 65 72 5f  am "close_other_
7140: 74 69 64 64 6c 65 72 73 22 29 29 29 29 0a 09 09  tiddlers"))))...
7150: 20 20 20 20 20 20 28 72 65 6d 6f 76 65 20 28 6c        (remove (l
7160: 61 6d 62 64 61 20 28 74 29 0a 09 09 09 09 28 6e  ambda (t).....(n
7170: 6f 74 20 28 65 71 75 61 6c 3f 20 28 74 77 69 6b  ot (equal? (twik
7180: 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 69 64  i:tiddler-get-id
7190: 20 74 29 20 74 6e 75 6d 29 29 29 0a 09 09 09 20   t) tnum))).... 
71a0: 20 20 20 20 20 74 64 6c 72 73 29 29 29 29 0a 20       tdlrs)))). 
71b0: 20 20 20 0a 20 20 20 20 28 73 3a 73 65 74 21 20     .    (s:set! 
71c0: 63 76 61 72 20 28 74 77 69 6b 69 3a 6d 61 6b 65  cvar (twiki:make
71d0: 2d 74 69 64 64 6c 65 72 2d 6c 69 73 74 20 74 64  -tiddler-list td
71e0: 6c 72 73 29 29 0a 20 20 20 20 28 69 66 20 74 6e  lrs)).    (if tn
71f0: 75 6d 65 64 69 74 20 0a 09 28 73 3a 73 65 74 21  umedit ..(s:set!
7200: 20 63 76 61 72 2d 65 64 20 74 6e 75 6d 65 64 69   cvar-ed tnumedi
7210: 74 29 0a 09 28 73 3a 64 65 6c 21 20 63 76 61 72  t)..(s:del! cvar
7220: 2d 65 64 29 29 0a 0a 20 20 20 20 3b 3b 20 6d 75  -ed))..    ;; mu
7230: 73 74 20 68 61 76 65 20 61 20 4d 61 69 6e 4d 65  st have a MainMe
7240: 6e 75 20 74 69 64 64 6c 65 72 20 62 79 20 6e 6f  nu tiddler by no
7250: 77 0a 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f  w.    (if (null?
7260: 20 6c 6d 65 6e 75 29 0a 09 28 62 65 67 69 6e 0a   lmenu)..(begin.
7270: 09 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 74  .  (twiki:save-t
7280: 69 64 64 6c 65 72 20 74 64 62 20 22 4d 61 69 6e  iddler tdb "Main
7290: 4d 65 6e 75 22 20 22 22 20 22 22 20 77 69 64 20  Menu" "" "" wid 
72a0: 28 74 77 69 6b 69 3a 67 65 74 2d 69 64 29 29 0a  (twiki:get-id)).
72b0: 09 20 20 28 73 65 74 21 20 6c 6d 65 6e 75 20 28  .  (set! lmenu (
72c0: 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65  twiki:get-tiddle
72d0: 72 73 20 74 64 62 20 77 69 64 20 28 6c 69 73 74  rs tdb wid (list
72e0: 20 22 4d 61 69 6e 4d 65 6e 75 22 29 29 29 29 29   "MainMenu")))))
72f0: 0a 20 20 20 20 0a 20 20 20 20 3b 3b 20 67 65 74  .    .    ;; get
7300: 20 74 68 65 20 74 69 64 64 6c 65 72 73 20 66 72   the tiddlers fr
7310: 6f 6d 20 74 68 65 20 64 62 20 6e 6f 77 0a 20 20  om the db now.  
7320: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 0a 09    (set! result..
7330: 20 20 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20    (s:div 'class 
7340: 22 74 77 69 6b 69 22 0a 09 20 20 20 3b 3b 20 66  "twiki"..   ;; f
7350: 6c 6f 61 74 20 74 6f 20 74 68 65 20 72 69 67 68  loat to the righ
7360: 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6d 65  t the control me
7370: 6e 75 0a 09 20 20 20 28 73 3a 64 69 76 20 27 63  nu..   (s:div 'c
7380: 6c 61 73 73 20 22 74 77 69 6b 69 2d 6d 61 69 6e  lass "twiki-main
7390: 2d 6d 65 6e 75 22 20 28 74 77 69 6b 69 3a 6d 61  -menu" (twiki:ma
73a0: 69 6e 74 5f 61 72 65 61 20 74 64 62 20 77 69 64  int_area tdb wid
73b0: 20 74 6b 65 79 20 77 69 6b 69 64 61 74 29 29 0a   tkey wikidat)).
73c0: 09 20 20 20 28 74 77 69 6b 69 3a 76 69 65 77 2d  .   (twiki:view-
73d0: 74 69 64 64 6c 65 72 20 74 64 62 20 20 74 6b 65  tiddler tdb  tke
73e0: 79 20 77 69 64 20 28 63 61 72 20 6c 6d 65 6e 75  y wid (car lmenu
73f0: 29 20 77 69 6b 69 64 61 74 29 0a 09 20 20 20 3b  ) wikidat)..   ;
7400: 3b 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62  ; this is probab
7410: 6c 79 20 6e 6f 74 20 6e 65 65 64 65 64 20 61 73  ly not needed as
7420: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   there is no rea
7430: 73 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 74 69  son to create ti
7440: 64 64 6c 65 72 73 20 74 68 69 73 20 77 61 79 0a  ddlers this way.
7450: 09 20 20 20 3b 3b 20 28 69 66 20 28 65 71 3f 20  .   ;; (if (eq? 
7460: 74 6e 75 6d 65 64 69 74 20 2d 31 29 28 74 77 69  tnumedit -1)(twi
7470: 6b 69 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 20  ki:edit-tiddler 
7480: 74 64 62 20 74 6b 65 79 20 77 69 64 20 74 6e 75  tdb tkey wid tnu
7490: 6d 65 64 69 74 29 20 27 28 29 29 0a 09 20 20 20  medit) '())..   
74a0: 3b 3b 20 69 6e 73 65 72 74 20 74 68 65 20 70 69  ;; insert the pi
74b0: 63 74 75 72 65 20 65 64 69 74 6f 72 20 77 69 6e  cture editor win
74c0: 64 6f 77 20 69 66 20 65 6e 61 62 6c 65 64 0a 09  dow if enabled..
74d0: 20 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 28     (if (equal? (
74e0: 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 74 77 69  s:get-param "twi
74f0: 6b 69 5f 6d 61 69 6e 74 22 29 20 22 32 22 29 28  ki_maint") "2")(
7500: 74 77 69 6b 69 3a 70 69 63 5f 6d 67 6d 74 20 74  twiki:pic_mgmt t
7510: 64 62 20 77 69 64 20 74 6b 65 79 29 20 27 28 29  db wid tkey) '()
7520: 29 0a 09 20 20 20 28 69 66 20 28 65 71 75 61 6c  )..   (if (equal
7530: 3f 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22  ? (s:get-param "
7540: 74 77 69 6b 69 5f 6d 61 69 6e 74 22 29 20 22 34  twiki_maint") "4
7550: 22 29 28 74 77 69 6b 69 3a 68 65 6c 70 20 31 29  ")(twiki:help 1)
7560: 20 27 28 29 29 0a 09 20 20 20 28 69 66 20 28 6e   '())..   (if (n
7570: 6f 74 20 28 6e 75 6c 6c 3f 20 74 64 6c 72 73 29  ot (null? tdlrs)
7580: 29 0a 09 20 20 20 20 20 20 20 28 6d 61 70 20 28  )..       (map (
7590: 6c 61 6d 62 64 61 20 28 74 64 6c 72 29 0a 09 09  lambda (tdlr)...
75a0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 74 6e 75        (let ((tnu
75b0: 6d 20 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65  m  (twiki:tiddle
75c0: 72 2d 67 65 74 2d 69 64 20 74 64 6c 72 29 29 29  r-get-id tdlr)))
75d0: 0a 09 09 09 28 73 3a 6c 6f 67 20 22 74 6e 75 6d  ....(s:log "tnum
75e0: 3a 20 22 20 74 6e 75 6d 20 22 20 74 6e 75 6d 65  : " tnum " tnume
75f0: 64 69 74 3a 20 22 20 74 6e 75 6d 65 64 69 74 29  dit: " tnumedit)
7600: 0a 09 09 09 28 69 66 20 28 61 6e 64 20 74 6e 75  ....(if (and tnu
7610: 6d 65 64 69 74 20 28 6e 6f 74 20 74 65 64 69 74  medit (not tedit
7620: 65 64 29 20 28 65 71 75 61 6c 3f 20 74 6e 75 6d  ed) (equal? tnum
7630: 65 64 69 74 20 74 6e 75 6d 29 29 0a 09 09 09 20  edit tnum)).... 
7640: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20     (begin....   
7650: 20 20 20 28 73 65 74 21 20 74 65 64 69 74 65 64     (set! tedited
7660: 20 23 74 29 20 3b 3b 20 6f 6e 6c 79 20 61 6c 6c   #t) ;; only all
7670: 6f 77 20 65 64 69 74 69 6e 67 20 6f 6e 65 20 74  ow editing one t
7680: 69 64 64 6c 65 72 20 61 74 20 61 20 74 69 6d 65  iddler at a time
7690: 0a 09 09 09 20 20 20 20 20 20 28 74 77 69 6b 69  ....      (twiki
76a0: 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 20 74 64  :edit-tiddler td
76b0: 62 20 74 6b 65 79 20 77 69 64 20 74 6e 75 6d 29  b tkey wid tnum)
76c0: 29 0a 09 09 09 20 20 20 20 28 74 77 69 6b 69 3a  )....    (twiki:
76d0: 76 69 65 77 2d 74 69 64 64 6c 65 72 20 74 64 62  view-tiddler tdb
76e0: 20 20 74 6b 65 79 20 77 69 64 20 74 64 6c 72 20    tkey wid tdlr 
76f0: 77 69 6b 69 64 61 74 29 29 29 29 0a 09 09 20 20  wikidat))))...  
7700: 20 20 74 64 6c 72 73 29 0a 09 20 20 20 20 20 20    tdlrs)..      
7710: 20 27 28 29 29 29 29 0a 20 20 20 20 28 64 62 69   '()))).    (dbi
7720: 3a 63 6c 6f 73 65 20 74 64 62 29 0a 20 20 20 20  :close tdb).    
7730: 72 65 73 75 6c 74 29 29 0a 0a 3b 3b 20 73 68 6f  result))..;; sho
7740: 75 6c 64 20 64 6f 20 61 20 73 69 6e 67 6c 65 20  uld do a single 
7750: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 71  more efficient q
7760: 75 65 72 79 20 62 75 74 20 74 68 69 73 20 69 73  uery but this is
7770: 20 67 6f 6f 64 20 65 6e 6f 75 67 68 0a 28 64 65   good enough.(de
7780: 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74 2d  fine (twiki:get-
7790: 74 69 64 64 6c 65 72 73 20 64 62 20 77 69 64 20  tiddlers db wid 
77a0: 74 6e 61 6d 65 73 29 0a 20 20 28 61 70 70 6c 79  tnames).  (apply
77b0: 20 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c   twiki:get-tiddl
77c0: 65 72 73 2d 62 79 2d 6e 61 6d 65 20 64 62 20 77  ers-by-name db w
77d0: 69 64 20 74 6e 61 6d 65 73 29 29 0a 3b 3b 20 20  id tnames)).;;  
77e0: 20 28 6c 65 74 2a 20 28 28 74 64 6c 72 73 20 27   (let* ((tdlrs '
77f0: 28 29 29 0a 3b 3b 20 09 20 3b 3b 20 28 63 6f 6e  ()).;; . ;; (con
7800: 6e 20 20 20 28 73 6c 6f 74 2d 72 65 66 20 73 3a  n   (slot-ref s:
7810: 73 65 73 73 69 6f 6e 20 27 63 6f 6e 6e 29 29 0a  session 'conn)).
7820: 3b 3b 20 09 20 28 6e 61 6d 65 6c 73 74 20 28 63  ;; . (namelst (c
7830: 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69 6e 67  onc "('" (string
7840: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61  -intersperse (ma
7850: 70 20 63 6f 6e 63 20 74 6e 61 6d 65 73 29 20 22  p conc tnames) "
7860: 27 2c 27 22 29 20 22 27 29 22 29 29 0a 3b 3b 20  ','") "')")).;; 
7870: 09 20 28 71 72 79 20 20 20 20 20 28 63 6f 6e 63  . (qry     (conc
7880: 20 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73   twiki:tiddler-s
7890: 65 6c 65 63 74 6f 72 20 22 20 57 48 45 52 45 20  elector " WHERE 
78a0: 74 2e 77 69 6b 69 5f 69 64 3d 3f 20 41 4e 44 20  t.wiki_id=? AND 
78b0: 74 2e 69 64 20 49 4e 20 22 20 6e 61 6d 65 6c 73  t.id IN " namels
78c0: 74 20 22 3b 22 29 29 29 0a 3b 3b 20 20 20 20 20  t ";"))).;;     
78d0: 3b 3b 20 28 70 72 69 6e 74 20 71 72 79 29 0a 3b  ;; (print qry).;
78e0: 3b 20 20 20 20 20 28 64 62 69 3a 66 6f 72 2d 65  ;     (dbi:for-e
78f0: 61 63 68 2d 72 6f 77 0a 3b 3b 20 20 20 20 20 20  ach-row.;;      
7900: 28 6c 61 6d 62 64 61 20 28 72 6f 77 29 0a 3b 3b  (lambda (row).;;
7910: 20 20 20 20 20 20 20 20 28 73 65 74 21 20 74 64          (set! td
7920: 6c 72 73 20 28 63 6f 6e 73 20 72 6f 77 20 74 64  lrs (cons row td
7930: 6c 72 73 29 29 29 0a 3b 3b 20 20 20 20 20 20 64  lrs))).;;      d
7940: 62 20 71 72 79 20 77 69 64 29 0a 3b 3b 20 20 20  b qry wid).;;   
7950: 20 20 28 72 65 76 65 72 73 65 20 74 64 6c 72 73    (reverse tdlrs
7960: 29 29 29 20 3b 3b 20 21 54 77 69 6b 69 5c 0a 0a  ))) ;; !Twiki\..
7970: 3b 3b 20 74 6c 73 74 20 69 73 20 61 20 6c 69 73  ;; tlst is a lis
7980: 74 20 6f 66 20 74 69 64 64 6c 65 72 20 6e 75 6d  t of tiddler num
7990: 73 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  s.(define (twiki
79a0: 3a 67 65 74 2d 74 69 64 64 6c 65 72 73 2d 62 79  :get-tiddlers-by
79b0: 2d 6e 75 6d 20 64 62 20 77 69 64 20 74 6c 73 74  -num db wid tlst
79c0: 29 0a 20 20 3b 3b 20 28 73 3a 6c 6f 67 20 22 47  ).  ;; (s:log "G
79d0: 6f 74 20 74 6f 20 74 77 69 6b 69 3a 67 65 74 2d  ot to twiki:get-
79e0: 74 69 64 64 6c 65 72 73 20 77 69 74 68 20 6b 65  tiddlers with ke
79f0: 79 73 3a 20 22 20 74 6c 73 74 20 22 20 61 6e 64  ys: " tlst " and
7a00: 20 77 69 64 3a 20 22 20 77 69 64 29 0a 20 20 3b   wid: " wid).  ;
7a10: 3b 20 73 65 6c 65 63 74 20 77 68 65 72 65 20 63  ; select where c
7a20: 72 65 61 74 65 64 5f 6f 6e 20 3c 20 73 6f 6d 65  reated_on < some
7a30: 64 61 74 65 20 6f 72 64 65 72 20 62 79 20 63 72  date order by cr
7a40: 65 61 74 65 64 5f 6f 6e 20 64 65 73 63 20 6c 69  eated_on desc li
7a50: 6d 69 74 20 31 0a 20 20 28 6c 65 74 2a 20 28 28  mit 1.  (let* ((
7a60: 74 64 6c 72 73 20 27 28 29 29 0a 09 20 28 74 6c  tdlrs '()).. (tl
7a70: 73 74 73 74 72 20 28 73 74 72 69 6e 67 2d 69 6e  ststr (string-in
7a80: 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 6e  tersperse (map n
7a90: 75 6d 62 65 72 2d 3e 73 74 72 69 6e 67 20 74 6c  umber->string tl
7aa0: 73 74 29 20 22 2c 22 29 29 0a 09 20 28 61 6c 72  st) ",")).. (alr
7ab0: 65 61 64 79 2d 67 6f 74 20 28 6d 61 6b 65 2d 68  eady-got (make-h
7ac0: 61 73 68 2d 74 61 62 6c 65 29 29 0a 09 20 28 71  ash-table)).. (q
7ad0: 72 79 20 20 20 20 28 63 6f 6e 63 20 74 77 69 6b  ry    (conc twik
7ae0: 69 3a 74 69 64 64 6c 65 72 2d 73 65 6c 65 63 74  i:tiddler-select
7af0: 6f 72 20 22 20 57 48 45 52 45 20 74 2e 77 69 6b  or " WHERE t.wik
7b00: 69 5f 69 64 3d 3f 20 41 4e 44 20 74 2e 69 64 20  i_id=? AND t.id 
7b10: 49 4e 20 28 22 20 74 6c 73 74 73 74 72 20 22 29  IN (" tlststr ")
7b20: 20 4f 52 44 45 52 20 42 59 20 63 72 65 61 74 65   ORDER BY create
7b30: 64 5f 6f 6e 20 44 45 53 43 3b 22 29 29 29 0a 09  d_on DESC;")))..
7b40: 3b 3b 20 28 63 6f 6e 6e 20 20 20 28 73 6c 6f 74  ;; (conn   (slot
7b50: 2d 72 65 66 20 73 3a 73 65 73 73 69 6f 6e 20 27  -ref s:session '
7b60: 63 6f 6e 6e 29 29 0a 20 20 20 20 3b 3b 20 28 70  conn)).    ;; (p
7b70: 72 69 6e 74 20 22 71 72 79 3a 20 22 20 71 72 79  rint "qry: " qry
7b80: 29 0a 20 20 20 20 28 64 62 69 3a 66 6f 72 2d 65  ).    (dbi:for-e
7b90: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
7ba0: 6d 62 64 61 20 28 72 6f 77 29 0a 20 20 20 20 20  mbda (row).     
7bb0: 20 20 28 6c 65 74 20 28 28 74 6e 61 6d 65 20 28    (let ((tname (
7bc0: 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65  twiki:tiddler-ge
7bd0: 74 2d 6e 61 6d 65 20 72 6f 77 29 29 29 0a 09 20  t-name row))).. 
7be0: 28 69 66 20 28 6e 6f 74 20 28 68 61 73 68 2d 74  (if (not (hash-t
7bf0: 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74  able-ref/default
7c00: 20 61 6c 72 65 61 64 79 2d 67 6f 74 20 74 6e 61   already-got tna
7c10: 6d 65 20 23 66 29 29 0a 09 20 20 20 20 20 28 62  me #f))..     (b
7c20: 65 67 69 6e 0a 09 20 20 20 20 20 20 20 28 73 65  egin..       (se
7c30: 74 21 20 74 64 6c 72 73 20 28 63 6f 6e 73 20 72  t! tdlrs (cons r
7c40: 6f 77 20 74 64 6c 72 73 29 29 0a 09 20 20 20 20  ow tdlrs))..    
7c50: 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73     (hash-table-s
7c60: 65 74 21 20 61 6c 72 65 61 64 79 2d 67 6f 74 20  et! already-got 
7c70: 74 6e 61 6d 65 20 23 74 29 29 29 29 29 0a 20 20  tname #t))))).  
7c80: 20 20 20 64 62 20 71 72 79 20 77 69 64 29 0a 20     db qry wid). 
7c90: 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74 64     (if (null? td
7ca0: 6c 72 73 29 20 74 64 6c 72 73 20 28 72 65 76 65  lrs) tdlrs (reve
7cb0: 72 73 65 20 74 64 6c 72 73 29 29 29 29 20 3b 3b  rse tdlrs)))) ;;
7cc0: 20 21 54 77 69 6b 69 5c 6e 54 69 74 6c 65 2c 20   !Twiki\nTitle, 
7cd0: 70 69 63 74 75 72 65 73 2c 20 65 74 63 2e 5c 6e  pictures, etc.\n
7ce0: 7b 7b 7b 5c 6e 43 6f 64 65 5c 6e 7d 7d 7d 5c 6e  {{{\nCode\n}}}\n
7cf0: 5b 5b 6c 69 6e 6b 73 5d 5d 5c 6e 7c 74 61 62 6c  [[links]]\n|tabl
7d00: 65 7c 6f 66 7c 73 74 75 66 66 7c 5c 6e 7c 6d 6f  e|of|stuff|\n|mo
7d10: 72 65 7c 73 74 75 66 66 7c 68 65 72 65 7c 5c 6e  re|stuff|here|\n
7d20: 22 29 29 0a 0a 3b 3b 20 77 69 64 20 3d 20 77 69  "))..;; wid = wi
7d30: 6b 69 20 69 64 0a 3b 3b 20 72 65 74 75 72 6e 73  ki id.;; returns
7d40: 20 61 20 6c 69 73 74 20 6f 66 20 74 77 69 6b 69   a list of twiki
7d50: 3a 74 69 64 64 6c 65 72 73 0a 28 64 65 66 69 6e  :tiddlers.(defin
7d60: 65 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64  e (twiki:get-tid
7d70: 64 6c 65 72 73 2d 62 79 2d 6e 61 6d 65 20 74 64  dlers-by-name td
7d80: 62 20 77 69 64 20 2e 20 6e 61 6d 65 73 29 0a 20  b wid . names). 
7d90: 20 28 6c 65 74 20 28 28 74 64 6c 72 73 20 27 28   (let ((tdlrs '(
7da0: 29 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63  ))).    (for-eac
7db0: 68 20 28 6c 61 6d 62 64 61 20 28 6e 61 6d 65 29  h (lambda (name)
7dc0: 0a 09 09 28 6c 65 74 20 28 28 74 64 6c 72 20 28  ...(let ((tdlr (
7dd0: 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65  twiki:get-tiddle
7de0: 72 2d 62 79 2d 6e 61 6d 65 20 74 64 62 20 77 69  r-by-name tdb wi
7df0: 64 20 6e 61 6d 65 29 29 29 0a 09 09 20 20 28 69  d name)))...  (i
7e00: 66 20 74 64 6c 72 20 28 73 65 74 21 20 74 64 6c  f tdlr (set! tdl
7e10: 72 73 20 28 63 6f 6e 73 20 74 64 6c 72 20 74 64  rs (cons tdlr td
7e20: 6c 72 73 29 29 29 29 29 0a 09 20 20 20 20 20 20  lrs)))))..      
7e30: 6e 61 6d 65 73 29 0a 20 20 20 20 28 72 65 76 65  names).    (reve
7e40: 72 73 65 20 74 64 6c 72 73 29 29 29 0a 3b 3b 20  rse tdlrs))).;; 
7e50: 77 69 74 68 20 74 68 65 20 72 69 67 68 74 20 71  with the right q
7e60: 75 65 72 79 20 69 74 20 73 68 6f 75 6c 64 20 62  uery it should b
7e70: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  e possible to do
7e80: 20 74 68 69 73 20 6d 75 63 68 20 66 61 73 74 65   this much faste
7e90: 72 20 61 70 70 72 6f 61 63 68 20 66 6f 72 20 74  r approach for t
7ea0: 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65 72  wiki:get-tiddler
7eb0: 73 2d 62 79 2d 6e 61 6d 65 0a 3b 3b 20 20 20 28  s-by-name.;;   (
7ec0: 6c 65 74 20 28 28 74 64 6c 72 73 20 27 28 29 29  let ((tdlrs '())
7ed0: 0a 3b 3b 20 09 28 6e 61 6d 65 6c 73 74 20 28 63  .;; .(namelst (c
7ee0: 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69 6e 67  onc "('" (string
7ef0: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6e 61 6d  -intersperse nam
7f00: 65 73 20 22 27 2c 27 22 29 20 22 27 29 22 29 29  es "','") "')"))
7f10: 29 0a 3b 3b 20 20 20 20 20 28 64 62 69 3a 66 6f  ).;;     (dbi:fo
7f20: 72 2d 65 61 63 68 2d 72 6f 77 0a 3b 3b 20 20 20  r-each-row.;;   
7f30: 20 20 20 28 6c 61 6d 62 64 61 20 28 72 6f 77 29     (lambda (row)
7f40: 0a 3b 3b 20 20 20 20 20 20 20 20 28 73 65 74 21  .;;        (set!
7f50: 20 74 64 6c 72 73 20 28 63 6f 6e 73 20 72 6f 77   tdlrs (cons row
7f60: 20 74 64 6c 72 73 29 29 29 0a 3b 3b 20 20 20 20   tdlrs))).;;    
7f70: 20 20 74 64 62 0a 3b 3b 20 20 20 20 20 20 28 63    tdb.;;      (c
7f80: 6f 6e 63 20 74 77 69 6b 69 3a 74 69 64 64 6c 65  onc twiki:tiddle
7f90: 72 2d 73 65 6c 65 63 74 6f 72 20 22 20 57 48 45  r-selector " WHE
7fa0: 52 45 20 74 2e 77 69 6b 69 5f 69 64 3d 3f 20 41  RE t.wiki_id=? A
7fb0: 4e 44 20 74 2e 6e 61 6d 65 20 49 4e 20 22 20 6e  ND t.name IN " n
7fc0: 61 6d 65 6c 73 74 29 20 77 69 64 29 0a 3b 3b 20  amelst) wid).;; 
7fd0: 20 20 20 20 28 72 65 76 65 72 73 65 20 74 64 6c      (reverse tdl
7fe0: 72 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20 74 68  rs)))..;; get th
7ff0: 65 20 74 69 64 64 6c 65 72 20 77 69 74 68 20 74  e tiddler with t
8000: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 20 61 6e  he given name an
8010: 64 20 74 68 65 20 6d 61 78 20 64 61 74 65 0a 28  d the max date.(
8020: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65  define (twiki:ge
8030: 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d  t-tiddler-by-nam
8040: 65 20 74 64 62 20 77 69 64 20 6e 61 6d 65 29 0a  e tdb wid name).
8050: 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 2d 72    (dbi:get-one-r
8060: 6f 77 20 74 64 62 20 28 63 6f 6e 63 20 74 77 69  ow tdb (conc twi
8070: 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 6c 65 63  ki:tiddler-selec
8080: 74 6f 72 20 22 20 57 48 45 52 45 20 74 2e 77 69  tor " WHERE t.wi
8090: 6b 69 5f 69 64 3d 3f 20 41 4e 44 20 74 2e 6e 61  ki_id=? AND t.na
80a0: 6d 65 3d 3f 20 4f 52 44 45 52 20 42 59 20 63 72  me=? ORDER BY cr
80b0: 65 61 74 65 64 5f 6f 6e 20 44 45 53 43 20 4c 49  eated_on DESC LI
80c0: 4d 49 54 20 31 3b 22 29 20 77 69 64 20 6e 61 6d  MIT 1;") wid nam
80d0: 65 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77  e))..(define (tw
80e0: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 6e 61 6d 65  iki:tiddler-name
80f0: 2d 3e 69 64 20 64 62 20 74 6e 61 6d 65 29 0a 20  ->id db tname). 
8100: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62   (dbi:get-one db
8110: 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d   "SELECT id FROM
8120: 20 74 69 64 64 6c 65 72 73 20 57 48 45 52 45 20   tiddlers WHERE 
8130: 6e 61 6d 65 3d 3f 3b 22 20 74 6e 61 6d 65 29 29  name=?;" tname))
8140: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
8150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 77  ==========.;; tw
8190: 69 6b 69 20 74 65 78 74 20 66 6f 72 6d 61 74 69  iki text formati
81a0: 6e 67 2c 20 70 61 72 73 69 6e 67 20 61 6e 64 20  ng, parsing and 
81b0: 64 69 73 70 6c 61 79 0a 3b 3b 3d 3d 3d 3d 3d 3d  display.;;======
81c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
81d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
81e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
81f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8200: 0a 0a 3b 3b 20 74 77 69 6b 69 20 66 6f 72 6d 61  ..;; twiki forma
8210: 74 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 28 6f  ting routines (o
8220: 76 65 72 72 69 64 65 20 74 68 65 73 65 20 74 6f  verride these to
8230: 20 63 68 61 6e 67 65 20 79 6f 75 72 20 6c 6f 6f   change your loo
8240: 6b 20 61 6e 64 20 66 65 65 6c 0a 28 64 65 66 69  k and feel.(defi
8250: 6e 65 20 74 77 69 6b 69 3a 74 77 69 6b 69 2d 74  ne twiki:twiki-t
8260: 61 67 20 20 73 3a 62 29 0a 28 64 65 66 69 6e 65  ag  s:b).(define
8270: 20 74 77 69 6b 69 3a 68 33 20 20 20 20 20 20 20   twiki:h3       
8280: 20 20 73 3a 68 33 29 0a 28 64 65 66 69 6e 65 20    s:h3).(define 
8290: 74 77 69 6b 69 3a 68 32 20 20 20 20 20 20 20 20  twiki:h2        
82a0: 20 73 3a 68 32 29 0a 28 64 65 66 69 6e 65 20 74   s:h2).(define t
82b0: 77 69 6b 69 3a 68 31 20 20 20 20 20 20 20 20 20  wiki:h1         
82c0: 73 3a 68 31 29 0a 3b 3b 20 28 64 65 66 69 6e 65  s:h1).;; (define
82d0: 20 74 77 69 6b 69 3a 6d 61 6b 65 2d 74 6c 69 6e   twiki:make-tlin
82e0: 6b 20 73 3a 69 29 0a 28 64 65 66 69 6e 65 20 74  k s:i).(define t
82f0: 77 69 6b 69 3a 75 6c 20 20 20 20 20 20 20 20 20  wiki:ul         
8300: 73 3a 75 6c 29 0a 28 64 65 66 69 6e 65 20 74 77  s:ul).(define tw
8310: 69 6b 69 3a 6f 6c 20 20 20 20 20 20 20 20 20 73  iki:ol         s
8320: 3a 6f 6c 29 0a 28 64 65 66 69 6e 65 20 74 77 69  :ol).(define twi
8330: 6b 69 3a 6c 69 20 20 20 20 20 20 20 20 20 73 3a  ki:li         s:
8340: 6c 69 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b  li).(define twik
8350: 69 3a 70 72 65 20 20 20 20 20 20 20 20 73 3a 70  i:pre        s:p
8360: 72 65 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b  re).(define twik
8370: 69 3a 70 20 20 20 20 20 20 20 20 20 20 73 3a 70  i:p          s:p
8380: 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ).(define twiki:
8390: 75 20 20 20 20 20 20 20 20 20 20 73 3a 75 29 0a  u          s:u).
83a0: 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 74 64  (define twiki:td
83b0: 20 20 20 20 20 20 20 20 20 73 3a 74 64 29 0a 28           s:td).(
83c0: 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 74 72 20  define twiki:tr 
83d0: 20 20 20 20 20 20 20 20 73 3a 74 72 29 0a 28 64          s:tr).(d
83e0: 65 66 69 6e 65 20 74 77 69 6b 69 3a 74 61 62 6c  efine twiki:tabl
83f0: 65 20 20 20 20 20 20 73 3a 74 61 62 6c 65 29 0a  e      s:table).
8400: 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 64 69  (define twiki:di
8410: 76 20 20 20 20 20 20 20 20 73 3a 64 69 76 29 0a  v        s:div).
8420: 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a  .(define (twiki:
8430: 77 65 62 36 34 65 6e 63 20 73 74 72 29 0a 20 20  web64enc str).  
8440: 28 73 74 72 69 6e 67 2d 73 75 62 73 74 69 74 75  (string-substitu
8450: 74 65 20 22 3d 22 20 22 5f 22 20 28 62 61 73 65  te "=" "_" (base
8460: 36 34 3a 65 6e 63 6f 64 65 20 73 74 72 29 20 23  64:encode str) #
8470: 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77  t))..(define (tw
8480: 69 6b 69 3a 77 65 62 36 34 64 65 63 20 73 74 72  iki:web64dec str
8490: 29 0a 20 20 28 62 61 73 65 36 34 3a 64 65 63 6f  ).  (base64:deco
84a0: 64 65 20 28 73 74 72 69 6e 67 2d 73 75 62 73 74  de (string-subst
84b0: 69 74 75 74 65 20 22 5f 22 20 22 3d 22 20 73 74  itute "_" "=" st
84c0: 72 20 23 74 29 29 29 0a 20 20 20 20 0a 28 64 65  r #t))).    .(de
84d0: 66 69 6e 65 20 28 74 77 69 6b 69 3a 6d 61 6b 65  fine (twiki:make
84e0: 2d 74 6c 69 6e 6b 20 74 65 78 74 20 74 69 64 64  -tlink text tidd
84f0: 6c 65 72 6e 61 6d 65 29 0a 20 20 28 73 3a 61 20  lername).  (s:a 
8500: 74 65 78 74 20 27 68 72 65 66 20 28 73 3a 6c 69  text 'href (s:li
8510: 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65 74  nk-to (twiki:get
8520: 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75  -link-back-to-cu
8530: 72 72 65 6e 74 29 20 27 76 69 65 77 5f 74 69 64  rrent) 'view_tid
8540: 64 6c 65 72 20 28 74 77 69 6b 69 3a 77 65 62 36  dler (twiki:web6
8550: 34 65 6e 63 20 74 69 64 64 6c 65 72 6e 61 6d 65  4enc tiddlername
8560: 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74  ))))..(define (t
8570: 77 69 6b 69 3a 70 69 63 20 70 69 63 2d 6e 61 6d  wiki:pic pic-nam
8580: 65 20 73 69 7a 65 20 77 69 6b 69 29 0a 20 20 28  e size wiki).  (
8590: 6c 65 74 2a 20 28 28 74 64 62 20 20 20 20 28 74  let* ((tdb    (t
85a0: 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 64 62  wiki:wiki-get-db
85b0: 68 20 77 69 6b 69 29 29 0a 09 20 28 74 6b 65 79  h wiki)).. (tkey
85c0: 20 20 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 67     (twiki:wiki-g
85d0: 65 74 2d 6b 65 79 20 77 69 6b 69 29 29 0a 09 20  et-key wiki)).. 
85e0: 28 78 79 20 20 20 20 20 28 73 74 72 69 6e 67 2d  (xy     (string-
85f0: 73 70 6c 69 74 20 73 69 7a 65 20 22 78 22 29 29  split size "x"))
8600: 0a 09 20 28 70 69 63 2d 69 64 20 28 74 77 69 6b  .. (pic-id (twik
8610: 69 3a 67 65 74 2d 70 69 63 2d 69 64 20 74 64 62  i:get-pic-id tdb
8620: 20 70 69 63 2d 6e 61 6d 65 20 28 74 77 69 6b 69   pic-name (twiki
8630: 3a 77 69 6b 69 2d 67 65 74 2d 77 69 64 20 77 69  :wiki-get-wid wi
8640: 6b 69 29 29 29 0a 09 20 28 69 6d 67 2d 6c 6e 6b  ki))).. (img-lnk
8650: 20 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 22 74 77    (s:link-to "tw
8660: 69 6b 69 22 20 27 77 69 6b 69 5f 6b 65 79 20 28  iki" 'wiki_key (
8670: 63 6f 6e 63 20 28 6e 75 6d 62 65 72 2d 3e 73 74  conc (number->st
8680: 72 69 6e 67 20 28 74 77 69 6b 69 3a 77 69 6b 69  ring (twiki:wiki
8690: 2d 67 65 74 2d 77 69 64 20 77 69 6b 69 29 29 20  -get-wid wiki)) 
86a0: 22 2d 22 20 28 74 77 69 6b 69 3a 77 65 62 36 34  "-" (twiki:web64
86b0: 65 6e 63 20 74 6b 65 79 29 29 0a 09 09 09 20 20  enc tkey))....  
86c0: 20 20 20 20 27 69 6d 61 67 65 20 20 70 69 63 2d      'image  pic-
86d0: 69 64 29 29 29 0a 20 20 20 20 28 69 66 20 28 61  id))).    (if (a
86e0: 6e 64 20 28 3e 20 28 6c 65 6e 67 74 68 20 78 79  nd (> (length xy
86f0: 29 20 31 29 0a 09 20 20 20 20 20 28 63 61 72 20  ) 1)..     (car 
8700: 78 79 29 0a 09 20 20 20 20 20 28 63 61 64 72 20  xy)..     (cadr 
8710: 78 79 29 29 20 3b 3b 20 79 65 70 2c 20 68 61 76  xy)) ;; yep, hav
8720: 65 20 74 77 6f 20 6e 75 6d 62 65 72 73 0a 09 28  e two numbers..(
8730: 73 3a 69 6d 67 20 27 74 69 74 6c 65 20 70 69 63  s:img 'title pic
8740: 2d 6e 61 6d 65 20 27 61 6c 74 20 70 69 63 2d 6e  -name 'alt pic-n
8750: 61 6d 65 20 27 77 69 64 74 68 20 28 63 61 72 20  ame 'width (car 
8760: 78 79 29 20 27 68 65 69 67 68 74 20 28 63 61 64  xy) 'height (cad
8770: 72 20 78 79 29 20 27 73 72 63 20 69 6d 67 2d 6c  r xy) 'src img-l
8780: 6e 6b 29 0a 09 28 73 3a 69 6d 67 20 27 74 69 74  nk)..(s:img 'tit
8790: 6c 65 20 70 69 63 2d 6e 61 6d 65 20 27 61 6c 74  le pic-name 'alt
87a0: 20 70 69 63 2d 6e 61 6d 65 20 27 73 72 63 20 69   pic-name 'src i
87b0: 6d 67 2d 6c 6e 6b 29 29 29 29 0a 0a 3b 3b 20 6f  mg-lnk))))..;; o
87c0: 76 65 72 72 69 64 65 20 74 68 65 73 65 20 61 6c  verride these al
87d0: 73 6f 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  so.(define (twik
87e0: 69 3a 67 65 74 2d 69 64 29 0a 20 20 28 73 3a 73  i:get-id).  (s:s
87f0: 65 73 73 69 6f 6e 2d 76 61 72 2d 67 65 74 20 22  ession-var-get "
8800: 69 64 22 29 29 0a 0a 3b 3b 20 6f 76 65 72 72 69  id"))..;; overri
8810: 64 65 20 74 68 69 73 20 74 6f 20 73 65 74 20 6c  de this to set l
8820: 69 6e 6b 73 20 69 6e 73 69 64 65 20 77 69 6b 69  inks inside wiki
8830: 27 73 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  's.(define (twik
8840: 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d  i:get-link-back-
8850: 74 6f 2d 63 75 72 72 65 6e 74 29 0a 20 20 28 73  to-current).  (s
8860: 3a 63 75 72 72 65 6e 74 2d 70 61 67 65 29 29 0a  :current-page)).
8870: 0a 0a 3b 3b 20 72 65 67 65 78 65 73 20 61 72 65  ..;; regexes are
8880: 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20 6f   listed in the o
8890: 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
88a0: 65 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 65  ey should be che
88b0: 63 6b 65 64 0a 0a 28 64 65 66 69 6e 65 20 74 77  cked..(define tw
88c0: 69 6b 69 3a 68 33 2d 70 61 74 74 20 28 72 65 67  iki:h3-patt (reg
88d0: 65 78 70 20 22 5e 21 21 21 28 2e 2a 29 24 22 29  exp "^!!!(.*)$")
88e0: 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ).(define twiki:
88f0: 68 32 2d 70 61 74 74 20 28 72 65 67 65 78 70 20  h2-patt (regexp 
8900: 22 5e 21 21 28 2e 2a 29 24 22 29 29 0a 28 64 65  "^!!(.*)$")).(de
8910: 66 69 6e 65 20 74 77 69 6b 69 3a 68 31 2d 70 61  fine twiki:h1-pa
8920: 74 74 20 28 72 65 67 65 78 70 20 22 5e 21 28 2e  tt (regexp "^!(.
8930: 2a 29 24 22 29 29 0a 0a 28 64 65 66 69 6e 65 20  *)$"))..(define 
8940: 74 77 69 6b 69 3a 74 6c 69 6e 6b 2d 70 61 74 74  twiki:tlink-patt
8950: 20 20 20 20 20 28 72 65 67 65 78 70 20 22 5e 28       (regexp "^(
8960: 2e 2a 29 5c 5c 5b 5c 5c 5b 28 5b 5e 5c 5c 5b 5c  .*)\\[\\[([^\\[\
8970: 5c 5d 5d 2a 29 5c 5c 5d 5c 5c 5d 28 2e 2a 29 24  \]]*)\\]\\](.*)$
8980: 22 29 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b  ")).(define twik
8990: 69 3a 70 69 63 2d 70 61 74 74 20 20 20 20 20 20  i:pic-patt      
89a0: 20 28 72 65 67 65 78 70 20 22 5e 28 2e 2a 29 5c   (regexp "^(.*)\
89b0: 5c 5b 70 69 63 28 5b 30 2d 39 25 5d 2a 78 2a 5b  \[pic([0-9%]*x*[
89c0: 30 2d 39 25 5d 2a 29 5c 5c 5b 28 5b 5e 5c 5c 5b  0-9%]*)\\[([^\\[
89d0: 5c 5c 5d 5d 2b 29 5c 5c 5d 5c 5c 5d 28 2e 2a 29  \\]]+)\\]\\](.*)
89e0: 24 22 29 29 0a 28 64 65 66 69 6e 65 20 74 77 69  $")).(define twi
89f0: 6b 69 3a 75 6e 64 65 72 6c 69 6e 65 2d 70 61 74  ki:underline-pat
8a00: 74 20 28 72 65 67 65 78 70 20 22 5e 28 2e 2a 29  t (regexp "^(.*)
8a10: 5f 5f 28 2e 2a 29 5f 5f 28 2e 2a 29 24 22 29 29  __(.*)__(.*)$"))
8a20: 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 74  .(define twiki:t
8a30: 61 62 6c 65 2d 70 61 74 74 20 20 20 20 20 28 72  able-patt     (r
8a40: 65 67 65 78 70 20 22 5e 5c 5c 7c 28 2e 2a 29 5c  egexp "^\\|(.*)\
8a50: 5c 7c 24 22 29 29 0a 0a 3b 3b 20 74 68 65 73 65  \|$"))..;; these
8a60: 20 61 72 65 20 66 6f 72 20 6d 75 6c 74 69 2d 6c   are for multi-l
8a70: 69 6e 65 20 66 6f 72 6d 61 74 69 6e 67 0a 28 64  ine formating.(d
8a80: 65 66 69 6e 65 20 74 77 69 6b 69 3a 6c 69 73 74  efine twiki:list
8a90: 2d 70 61 74 74 20 20 20 20 28 72 65 67 65 78 70  -patt    (regexp
8aa0: 20 22 5e 28 5c 5c 2a 2b 7c 5c 5c 23 2b 29 28 2e   "^(\\*+|\\#+)(.
8ab0: 2a 29 24 22 29 29 0a 28 64 65 66 69 6e 65 20 74  *)$")).(define t
8ac0: 77 69 6b 69 3a 62 75 6c 6c 65 74 2d 70 61 74 74  wiki:bullet-patt
8ad0: 20 20 28 72 65 67 65 78 70 20 22 5e 28 5c 5c 2a    (regexp "^(\\*
8ae0: 2b 29 28 2e 2a 29 24 22 29 29 0a 28 64 65 66 69  +)(.*)$")).(defi
8af0: 6e 65 20 74 77 69 6b 69 3a 6e 75 6d 62 65 72 2d  ne twiki:number-
8b00: 70 61 74 74 20 20 28 72 65 67 65 78 70 20 22 5e  patt  (regexp "^
8b10: 28 5c 5c 23 2b 29 28 2e 2a 29 24 22 29 29 0a 28  (\\#+)(.*)$")).(
8b20: 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 70 72 65  define twiki:pre
8b30: 66 6f 72 2d 70 61 74 74 20 20 28 72 65 67 65 78  for-patt  (regex
8b40: 70 20 22 5e 5c 5c 7b 5c 5c 7b 5c 5c 7b 24 22 29  p "^\\{\\{\\{$")
8b50: 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ).(define twiki:
8b60: 70 72 65 66 6f 72 2d 65 6e 64 2d 70 61 74 74 20  prefor-end-patt 
8b70: 28 72 65 67 65 78 70 20 22 5e 5c 5c 7d 5c 5c 7d  (regexp "^\\}\\}
8b80: 5c 5c 7d 24 22 29 29 0a 0a 3b 3b 20 72 65 67 65  \\}$"))..;; rege
8b90: 78 0a 28 64 65 66 69 6e 65 20 74 3a 6d 61 74 63  x.(define t:matc
8ba0: 68 20 20 23 66 29 0a 28 64 65 66 69 6e 65 20 28  h  #f).(define (
8bb0: 74 2d 6d 61 74 63 68 20 72 20 73 29 0a 20 20 28  t-match r s).  (
8bc0: 6c 65 74 20 28 28 72 65 73 20 28 73 74 72 69 6e  let ((res (strin
8bd0: 67 2d 6d 61 74 63 68 20 72 20 73 29 29 29 0a 20  g-match r s))). 
8be0: 20 20 20 28 73 65 74 21 20 74 3a 6d 61 74 63 68     (set! t:match
8bf0: 20 72 65 73 29 0a 20 20 20 20 72 65 73 29 29 0a   res).    res)).
8c00: 0a 3b 3b 20 73 68 6f 75 6c 64 20 73 77 69 74 63  .;; should switc
8c10: 68 20 74 6f 20 72 65 63 75 72 73 69 76 65 6c 79  h to recursively
8c20: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 62   processing by b
8c30: 6c 6f 63 6b 3f 0a 3b 3b 20 28 70 72 6f 63 65 73  lock?.;; (proces
8c40: 73 2d 62 6c 6f 63 6b 20 64 61 74 29 0a 3b 3b 20  s-block dat).;; 
8c50: 20 20 2e 2e 2e 0a 3b 3b 20 20 20 28 70 72 6f 63    ....;;   (proc
8c60: 65 73 73 2d 62 6c 6f 63 6b 20 72 65 6d 64 61 74  ess-block remdat
8c70: 29 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  ).(define (twiki
8c80: 3a 64 61 74 2d 3e 68 74 6d 6c 20 64 61 74 20 77  :dat->html dat w
8c90: 69 6b 69 29 0a 20 20 28 6c 65 74 2a 20 28 28 69  iki).  (let* ((i
8ca0: 6e 70 20 20 20 20 20 20 20 20 28 6f 70 65 6e 2d  np        (open-
8cb0: 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 64 61 74  input-string dat
8cc0: 29 29 0a 09 20 28 6e 65 73 74 2d 64 65 70 74 68  )).. (nest-depth
8cd0: 20 30 29 20 3b 3b 20 64 65 70 74 68 20 6f 66 20   0) ;; depth of 
8ce0: 6e 65 73 74 65 64 20 6c 69 73 74 73 0a 09 20 3b  nested lists.. ;
8cf0: 3b 20 74 6f 6b 65 6e 20 28 69 2e 65 2e 20 6c 69  ; token (i.e. li
8d00: 6e 65 29 20 68 61 6e 64 6c 69 6e 67 20 73 74 75  ne) handling stu
8d10: 66 66 0a 09 20 28 6e 65 78 74 2d 6c 69 6e 65 20  ff.. (next-line 
8d20: 20 23 66 29 0a 09 20 28 70 65 65 6b 2d 6c 69 6e   #f).. (peek-lin
8d30: 65 20 20 28 6c 61 6d 62 64 61 20 28 29 0a 09 09  e  (lambda ()...
8d40: 20 20 20 20 20 20 20 6e 65 78 74 2d 6c 69 6e 65         next-line
8d50: 29 29 0a 09 20 28 67 65 74 2d 6c 69 6e 65 20 20  )).. (get-line  
8d60: 20 28 6c 61 6d 62 64 61 20 28 29 0a 09 09 20 20   (lambda ()...  
8d70: 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20       (let ((res 
8d80: 6e 65 78 74 2d 6c 69 6e 65 29 29 0a 09 09 09 20  next-line)).... 
8d90: 28 73 65 74 21 20 6e 65 78 74 2d 6c 69 6e 65 20  (set! next-line 
8da0: 28 72 65 61 64 2d 6c 69 6e 65 20 69 6e 70 29 29  (read-line inp))
8db0: 0a 09 09 09 20 3b 3b 20 28 70 72 69 6e 74 20 22  .... ;; (print "
8dc0: 67 65 74 2d 6c 69 6e 65 3a 20 70 72 65 76 3d 22  get-line: prev="
8dd0: 20 72 65 73 20 22 20 6e 65 78 74 3d 22 20 6e 65   res " next=" ne
8de0: 78 74 2d 6c 69 6e 65 20 22 5c 6e 22 29 0a 09 09  xt-line "\n")...
8df0: 09 20 72 65 73 29 29 29 0a 09 20 28 6c 20 20 20  . res))).. (l   
8e00: 20 20 20 20 20 20 20 28 67 65 74 2d 6c 69 6e 65         (get-line
8e10: 29 29 29 20 3b 3b 20 64 69 73 63 61 72 64 20 74  ))) ;; discard t
8e20: 68 65 20 23 66 20 69 6e 20 6e 65 78 74 2d 6c 69  he #f in next-li
8e30: 6e 65 0a 20 20 20 20 28 74 77 69 6b 69 3a 72 65  ne.    (twiki:re
8e40: 61 64 2d 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c 69  ad-block peek-li
8e50: 6e 65 20 67 65 74 2d 6c 69 6e 65 20 6e 65 73 74  ne get-line nest
8e60: 2d 64 65 70 74 68 20 23 66 20 77 69 6b 69 29 29  -depth #f wiki))
8e70: 29 0a 0a 3b 3b 20 62 6c 6b 2d 74 79 70 65 20 69  )..;; blk-type i
8e80: 73 20 23 66 20 66 6f 72 20 6e 6f 74 20 69 6e 20  s #f for not in 
8e90: 61 20 62 6c 6f 63 6b 20 28 69 2e 65 2e 20 61 74  a block (i.e. at
8ea0: 20 74 6f 70 20 6c 65 76 65 6c 29 2c 20 27 70 72   top level), 'pr
8eb0: 65 20 66 6f 72 20 70 72 65 66 6f 72 6d 61 74 65  e for preformate
8ec0: 64 2c 20 27 75 6c 20 6f 72 20 27 6f 6c 0a 3b 3b  d, 'ul or 'ol.;;
8ed0: 20 63 61 6c 6c 20 77 69 74 68 20 66 69 72 73 74   call with first
8ee0: 20 6c 69 6e 65 20 61 73 20 6c 65 67 69 74 20 64   line as legit d
8ef0: 61 74 61 0a 3b 3b 20 69 2e 65 2e 20 66 6f 72 20  ata.;; i.e. for 
8f00: 70 72 65 66 6f 72 6d 20 2d 20 73 6b 69 70 20 74  preform - skip t
8f10: 68 65 20 7b 7b 7b 20 6c 69 6e 65 20 74 68 65 6e  he {{{ line then
8f20: 20 63 61 6c 6c 20 72 65 61 64 2d 62 6c 6f 63 6b   call read-block
8f30: 0a 3b 3b 20 20 20 20 20 20 66 6f 72 20 23 20 6f  .;;      for # o
8f40: 72 20 2a 20 63 61 6c 6c 20 77 69 74 68 20 66 69  r * call with fi
8f50: 72 73 74 20 6c 69 6e 65 0a 28 64 65 66 69 6e 65  rst line.(define
8f60: 20 28 74 77 69 6b 69 3a 72 65 61 64 2d 62 6c 6f   (twiki:read-blo
8f70: 63 6b 20 70 65 65 6b 2d 6c 69 6e 65 20 67 65 74  ck peek-line get
8f80: 2d 6c 69 6e 65 20 6e 65 73 74 2d 64 65 70 74 68  -line nest-depth
8f90: 20 62 6c 6b 2d 74 79 70 65 20 77 69 6b 69 29 0a   blk-type wiki).
8fa0: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 72 65    (let loop ((re
8fb0: 73 20 27 28 29 29 0a 09 20 20 20 20 20 28 6c 20  s '())..     (l 
8fc0: 20 20 28 70 65 65 6b 2d 6c 69 6e 65 29 29 29 20    (peek-line))) 
8fd0: 3b 3b 20 73 68 6f 75 6c 64 20 74 68 69 73 20 62  ;; should this b
8fe0: 65 20 61 20 70 65 65 6b 2d 6c 69 6e 65 3f 20 79  e a peek-line? y
8ff0: 65 73 21 21 0a 20 20 20 20 3b 3b 20 28 70 72 69  es!!.    ;; (pri
9000: 6e 74 20 22 74 77 69 6b 69 3a 72 65 61 64 2d 62  nt "twiki:read-b
9010: 6c 6f 63 6b 20 6c 6f 6f 70 20 6e 65 73 74 2d 64  lock loop nest-d
9020: 65 70 74 68 3d 22 6e 65 73 74 2d 64 65 70 74 68  epth="nest-depth
9030: 20 22 20 62 6c 6b 2d 74 79 70 65 3d 22 20 62 6c   " blk-type=" bl
9040: 6b 2d 74 79 70 65 20 22 20 6c 3d 22 20 6c 20 22  k-type " l=" l "
9050: 5c 6e 20 20 72 65 73 3d 22 20 72 65 73 29 0a 20  \n  res=" res). 
9060: 20 20 20 28 69 66 20 28 65 6f 66 2d 6f 62 6a 65     (if (eof-obje
9070: 63 74 3f 20 6c 29 0a 09 3b 3b 20 77 65 20 61 72  ct? l)..;; we ar
9080: 65 20 64 6f 6e 65 21 20 72 65 74 75 72 6e 20 74  e done! return t
9090: 68 65 20 6c 69 73 74 0a 09 72 65 73 0a 09 3b 3b  he list..res..;;
90a0: 20 70 72 6f 63 65 73 73 20 69 74 21 0a 09 28 63   process it!..(c
90b0: 6f 6e 64 0a 09 20 3b 3b 20 68 61 6e 64 6c 65 20  ond.. ;; handle 
90c0: 70 72 65 66 6f 72 6d 61 74 65 64 20 74 65 78 74  preformated text
90d0: 0a 09 20 28 28 65 71 3f 20 62 6c 6b 2d 74 79 70  .. ((eq? blk-typ
90e0: 65 20 27 70 72 65 29 0a 09 20 20 28 69 66 20 28  e 'pre)..  (if (
90f0: 74 2d 6d 61 74 63 68 20 20 74 77 69 6b 69 3a 70  t-match  twiki:p
9100: 72 65 66 6f 72 2d 65 6e 64 2d 70 61 74 74 20 6c  refor-end-patt l
9110: 29 0a 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a  )..      (begin.
9120: 09 09 28 67 65 74 2d 6c 69 6e 65 29 20 3b 3b 20  ..(get-line) ;; 
9130: 64 69 73 63 61 72 64 20 74 68 65 20 7d 7d 7d 0a  discard the }}}.
9140: 09 09 72 65 73 29 20 20 20 20 20 20 20 3b 3b 20  ..res)       ;; 
9150: 65 6e 64 20 6f 66 20 70 72 65 66 6f 72 6d 61 74  end of preformat
9160: 74 65 64 0a 09 20 20 20 20 20 20 28 62 65 67 69  ted..      (begi
9170: 6e 0a 09 09 3b 3b 20 28 67 65 74 2d 6c 69 6e 65  n...;; (get-line
9180: 29 20 3b 3b 20 64 69 73 63 61 72 64 20 74 68 65  ) ;; discard the
9190: 20 7b 7b 7b 0a 09 09 28 6c 6f 6f 70 20 28 61 70   {{{...(loop (ap
91a0: 70 65 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28  pend res (list (
91b0: 67 65 74 2d 6c 69 6e 65 29 29 29 0a 09 09 20 20  get-line)))...  
91c0: 20 20 20 20 28 70 65 65 6b 2d 6c 69 6e 65 29 29      (peek-line))
91d0: 29 29 29 0a 09 20 3b 3b 20 68 61 6e 64 6c 65 20  ))).. ;; handle 
91e0: 74 61 62 6c 65 73 0a 09 20 28 28 65 71 3f 20 62  tables.. ((eq? b
91f0: 6c 6b 2d 74 79 70 65 20 27 74 61 62 6c 65 29 0a  lk-type 'table).
9200: 09 20 20 28 69 66 20 28 74 2d 6d 61 74 63 68 20  .  (if (t-match 
9210: 74 77 69 6b 69 3a 74 61 62 6c 65 2d 70 61 74 74  twiki:table-patt
9220: 20 6c 29 0a 09 20 20 20 20 20 20 28 6c 65 74 20   l)..      (let 
9230: 28 28 63 65 6c 73 20 20 28 73 74 72 69 6e 67 2d  ((cels  (string-
9240: 73 70 6c 69 74 20 28 63 61 64 72 20 74 3a 6d 61  split (cadr t:ma
9250: 74 63 68 29 20 22 7c 22 29 29 29 0a 09 09 28 67  tch) "|")))...(g
9260: 65 74 2d 6c 69 6e 65 29 0a 09 09 28 6c 6f 6f 70  et-line)...(loop
9270: 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 74 77   (append res (tw
9280: 69 6b 69 3a 74 72 20 28 6d 61 70 20 74 77 69 6b  iki:tr (map twik
9290: 69 3a 74 64 20 0a 09 09 09 09 09 09 20 28 6d 61  i:td ....... (ma
92a0: 70 20 28 6c 61 6d 62 64 61 20 28 78 29 28 74 77  p (lambda (x)(tw
92b0: 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 78  iki:line->html x
92c0: 20 23 66 20 77 69 6b 69 29 29 20 63 65 6c 73 29   #f wiki)) cels)
92d0: 29 29 29 0a 09 09 20 20 20 20 20 20 28 67 65 74  )))...      (get
92e0: 2d 6c 69 6e 65 29 29 29 0a 09 20 20 20 20 20 20  -line)))..      
92f0: 72 65 73 29 29 0a 09 20 3b 3b 20 68 61 6e 64 6c  res)).. ;; handl
9300: 65 20 6c 69 73 74 73 0a 09 20 28 28 6f 72 20 28  e lists.. ((or (
9310: 74 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 62 75  t-match twiki:bu
9320: 6c 6c 65 74 2d 70 61 74 74 20 6c 29 20 3b 3b 20  llet-patt l) ;; 
9330: 68 61 76 65 20 2a 0a 09 20 20 20 20 20 20 28 74  have *..      (t
9340: 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 6e 75 6d  -match twiki:num
9350: 62 65 72 2d 70 61 74 74 20 6c 29 29 0a 09 20 20  ber-patt l))..  
9360: 28 6c 65 74 2a 20 28 28 64 69 72 65 63 74 69 76  (let* ((directiv
9370: 65 20 28 63 61 64 72 20 74 3a 6d 61 74 63 68 29  e (cadr t:match)
9380: 29 0a 09 09 20 28 6c 65 76 65 6c 6e 75 6d 20 28  )... (levelnum (
9390: 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 64 69  string-length di
93a0: 72 65 63 74 69 76 65 29 29 0a 09 09 20 28 74 65  rective))... (te
93b0: 78 74 20 20 20 20 20 28 74 77 69 6b 69 3a 6c 69  xt     (twiki:li
93c0: 6e 65 2d 3e 68 74 6d 6c 20 28 63 61 64 64 72 20  ne->html (caddr 
93d0: 74 3a 6d 61 74 63 68 29 20 23 74 20 77 69 6b 69  t:match) #t wiki
93e0: 29 29 0a 09 09 20 28 62 74 79 70 65 20 20 20 20  ))... (btype    
93f0: 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 22 23  (if (string=? "#
9400: 22 20 28 73 75 62 73 74 72 69 6e 67 20 64 69 72  " (substring dir
9410: 65 63 74 69 76 65 20 30 20 31 29 29 0a 09 09 09  ective 0 1))....
9420: 20 20 20 20 20 20 20 27 6f 6c 0a 09 09 09 20 20         'ol....  
9430: 20 20 20 20 20 27 75 6c 29 29 0a 09 09 20 28 66       'ul))... (f
9440: 75 6e 63 20 20 20 20 20 28 69 66 20 28 65 71 3f  unc     (if (eq?
9450: 20 62 74 79 70 65 20 27 75 6c 29 0a 09 09 09 20   btype 'ul).... 
9460: 20 20 20 20 20 20 74 77 69 6b 69 3a 75 6c 0a 09        twiki:ul..
9470: 09 09 20 20 20 20 20 20 20 74 77 69 6b 69 3a 6f  ..       twiki:o
9480: 6c 29 29 29 0a 09 20 20 20 20 3b 3b 20 28 70 72  l)))..    ;; (pr
9490: 69 6e 74 20 22 68 61 6e 64 6c 69 6e 67 20 22 20  int "handling " 
94a0: 62 74 79 70 65 20 22 3a 20 6c 65 76 65 6c 6e 75  btype ": levelnu
94b0: 6d 3d 22 20 6c 65 76 65 6c 6e 75 6d 20 22 20 74  m=" levelnum " t
94c0: 65 78 74 3d 22 20 74 65 78 74 20 22 20 6e 65 73  ext=" text " nes
94d0: 74 2d 64 65 70 74 68 3d 22 20 6e 65 73 74 2d 64  t-depth=" nest-d
94e0: 65 70 74 68 20 22 20 62 6c 6b 2d 74 79 70 65 3d  epth " blk-type=
94f0: 22 20 62 6c 6b 2d 74 79 70 65 29 0a 09 20 20 20  " blk-type)..   
9500: 20 28 63 6f 6e 64 0a 09 20 20 20 20 20 28 28 6e   (cond..     ((n
9510: 6f 74 20 62 6c 6b 2d 74 79 70 65 29 20 3b 3b 20  ot blk-type) ;; 
9520: 69 2e 65 20 66 69 72 73 74 20 6d 65 6d 62 65 72  i.e first member
9530: 20 6f 66 20 74 68 65 20 6c 69 73 74 21 0a 09 20   of the list!.. 
9540: 20 20 20 20 20 28 6c 6f 6f 70 20 28 61 70 70 65       (loop (appe
9550: 6e 64 20 72 65 73 20 28 66 75 6e 63 20 28 74 77  nd res (func (tw
9560: 69 6b 69 3a 72 65 61 64 2d 62 6c 6f 63 6b 20 70  iki:read-block p
9570: 65 65 6b 2d 6c 69 6e 65 20 67 65 74 2d 6c 69 6e  eek-line get-lin
9580: 65 20 6c 65 76 65 6c 6e 75 6d 20 62 74 79 70 65  e levelnum btype
9590: 20 77 69 6b 69 29 29 29 0a 09 09 20 20 20 20 28   wiki)))...    (
95a0: 67 65 74 2d 6c 69 6e 65 29 29 29 0a 09 20 20 20  get-line)))..   
95b0: 20 20 28 28 3e 20 6c 65 76 65 6c 6e 75 6d 20 6e    ((> levelnum n
95c0: 65 73 74 2d 64 65 70 74 68 29 0a 09 20 20 20 20  est-depth)..    
95d0: 20 20 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20    (loop (append 
95e0: 72 65 73 20 28 66 75 6e 63 20 28 74 77 69 6b 69  res (func (twiki
95f0: 3a 72 65 61 64 2d 62 6c 6f 63 6b 20 70 65 65 6b  :read-block peek
9600: 2d 6c 69 6e 65 20 67 65 74 2d 6c 69 6e 65 20 28  -line get-line (
9610: 2b 20 6e 65 73 74 2d 64 65 70 74 68 20 31 29 20  + nest-depth 1) 
9620: 62 74 79 70 65 20 77 69 6b 69 29 29 29 0a 09 09  btype wiki)))...
9630: 20 20 20 20 28 70 65 65 6b 2d 6c 69 6e 65 29 29      (peek-line))
9640: 29 0a 09 20 20 20 20 20 28 28 3c 20 6c 65 76 65  )..     ((< leve
9650: 6c 6e 75 6d 20 6e 65 73 74 2d 64 65 70 74 68 29  lnum nest-depth)
9660: 0a 09 20 20 20 20 20 20 28 61 70 70 65 6e 64 20  ..      (append 
9670: 72 65 73 20 28 74 77 69 6b 69 3a 6c 69 20 74 65  res (twiki:li te
9680: 78 74 29 29 29 20 3b 3b 20 72 65 74 75 72 6e 20  xt))) ;; return 
9690: 74 68 65 20 62 75 6c 6c 65 74 65 64 20 69 74 65  the bulleted ite
96a0: 6d 2c 20 64 6f 6e 27 74 20 67 65 74 20 74 68 65  m, don't get the
96b0: 20 6e 65 78 74 20 6c 69 6e 65 3f 3f 0a 09 20 20   next line??..  
96c0: 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 20     (else..      
96d0: 28 67 65 74 2d 6c 69 6e 65 29 0a 09 20 20 20 20  (get-line)..    
96e0: 20 20 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20    (loop (append 
96f0: 72 65 73 20 28 74 77 69 6b 69 3a 6c 69 20 74 65  res (twiki:li te
9700: 78 74 29 29 0a 09 09 20 20 20 20 28 70 65 65 6b  xt))...    (peek
9710: 2d 6c 69 6e 65 29 29 29 29 29 29 0a 09 20 28 28  -line)))))).. ((
9720: 74 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 70 72  t-match twiki:pr
9730: 65 66 6f 72 2d 70 61 74 74 20 6c 29 0a 09 20 20  efor-patt l)..  
9740: 28 67 65 74 2d 6c 69 6e 65 29 20 3b 3b 20 64 69  (get-line) ;; di
9750: 73 63 61 72 64 20 74 68 65 20 7b 7b 7b 0a 09 20  scard the {{{.. 
9760: 20 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20 72   (loop (append r
9770: 65 73 20 28 74 77 69 6b 69 3a 70 72 65 20 28 74  es (twiki:pre (t
9780: 77 69 6b 69 3a 72 65 61 64 2d 62 6c 6f 63 6b 20  wiki:read-block 
9790: 70 65 65 6b 2d 6c 69 6e 65 20 67 65 74 2d 6c 69  peek-line get-li
97a0: 6e 65 20 6e 65 73 74 2d 64 65 70 74 68 20 27 70  ne nest-depth 'p
97b0: 72 65 20 77 69 6b 69 29 29 29 0a 09 09 28 70 65  re wiki)))...(pe
97c0: 65 6b 2d 6c 69 6e 65 29 29 29 0a 09 20 28 28 74  ek-line))).. ((t
97d0: 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 74 61 62  -match twiki:tab
97e0: 6c 65 2d 70 61 74 74 20 6c 29 0a 09 20 20 28 67  le-patt l)..  (g
97f0: 65 74 2d 6c 69 6e 65 29 0a 09 20 20 28 6c 6f 6f  et-line)..  (loo
9800: 70 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 74  p (append res (t
9810: 77 69 6b 69 3a 74 61 62 6c 65 20 27 62 6f 72 64  wiki:table 'bord
9820: 65 72 20 31 20 27 63 65 6c 6c 73 70 61 63 69 6e  er 1 'cellspacin
9830: 67 20 30 20 28 74 77 69 6b 69 3a 72 65 61 64 2d  g 0 (twiki:read-
9840: 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c 69 6e 65 20  block peek-line 
9850: 67 65 74 2d 6c 69 6e 65 20 30 20 27 74 61 62 6c  get-line 0 'tabl
9860: 65 20 77 69 6b 69 29 29 29 0a 09 09 28 70 65 65  e wiki)))...(pee
9870: 6b 2d 6c 69 6e 65 29 29 29 0a 09 20 28 65 6c 73  k-line))).. (els
9880: 65 0a 09 20 20 28 67 65 74 2d 6c 69 6e 65 29 0a  e..  (get-line).
9890: 09 20 20 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64  .  (loop (append
98a0: 20 72 65 73 20 28 74 77 69 6b 69 3a 6c 69 6e 65   res (twiki:line
98b0: 2d 3e 68 74 6d 6c 20 6c 20 23 74 20 77 69 6b 69  ->html l #t wiki
98c0: 29 29 0a 09 09 28 70 65 65 6b 2d 6c 69 6e 65 29  ))...(peek-line)
98d0: 29 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ))))))..(define 
98e0: 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d  (twiki:line->htm
98f0: 6c 20 64 61 74 20 66 69 72 73 74 63 61 6c 6c 20  l dat firstcall 
9900: 77 69 6b 69 29 0a 20 20 28 69 66 20 66 69 72 73  wiki).  (if firs
9910: 74 63 61 6c 6c 20 0a 20 20 20 20 20 20 3b 3b 20  tcall .      ;; 
9920: 70 72 6f 63 65 73 73 20 74 68 65 20 70 61 74 74  process the patt
9930: 65 72 6e 73 20 74 68 61 74 20 74 65 73 74 20 66  erns that test f
9940: 6f 72 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  or beginning of 
9950: 6c 69 6e 65 20 6f 6e 6c 79 20 6f 6e 20 74 68 65  line only on the
9960: 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
9970: 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 20 20 28    (cond.       (
9980: 28 74 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 68  (t-match twiki:h
9990: 33 2d 70 61 74 74 20 64 61 74 29 0a 09 28 74 77  3-patt dat)..(tw
99a0: 69 6b 69 3a 68 33 20 28 74 77 69 6b 69 3a 6c 69  iki:h3 (twiki:li
99b0: 6e 65 2d 3e 68 74 6d 6c 20 28 63 61 64 72 20 74  ne->html (cadr t
99c0: 3a 6d 61 74 63 68 29 20 23 66 20 77 69 6b 69 29  :match) #f wiki)
99d0: 29 29 0a 20 20 20 20 20 20 20 28 28 74 2d 6d 61  )).       ((t-ma
99e0: 74 63 68 20 74 77 69 6b 69 3a 68 32 2d 70 61 74  tch twiki:h2-pat
99f0: 74 20 64 61 74 29 0a 09 28 74 77 69 6b 69 3a 68  t dat)..(twiki:h
9a00: 32 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68  2 (twiki:line->h
9a10: 74 6d 6c 20 28 63 61 64 72 20 74 3a 6d 61 74 63  tml (cadr t:matc
9a20: 68 29 20 23 66 20 77 69 6b 69 29 29 29 0a 20 20  h) #f wiki))).  
9a30: 20 20 20 20 20 28 28 74 2d 6d 61 74 63 68 20 74       ((t-match t
9a40: 77 69 6b 69 3a 68 31 2d 70 61 74 74 20 64 61 74  wiki:h1-patt dat
9a50: 29 0a 09 28 74 77 69 6b 69 3a 68 31 20 28 74 77  )..(twiki:h1 (tw
9a60: 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 28  iki:line->html (
9a70: 63 61 64 72 20 74 3a 6d 61 74 63 68 29 20 23 66  cadr t:match) #f
9a80: 20 77 69 6b 69 29 29 29 0a 20 20 20 20 20 20 20   wiki))).       
9a90: 3b 3b 20 77 68 79 20 77 61 73 20 74 68 65 20 28  ;; why was the (
9aa0: 73 3a 62 72 29 20 68 65 72 65 3f 20 74 72 79 69  s:br) here? tryi
9ab0: 6e 67 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20  ng without.     
9ac0: 20 20 28 65 6c 73 65 20 28 74 77 69 6b 69 3a 6c    (else (twiki:l
9ad0: 69 6e 65 2d 3e 68 74 6d 6c 20 64 61 74 20 23 66  ine->html dat #f
9ae0: 20 77 69 6b 69 29 29 29 0a 20 20 20 20 20 20 20   wiki))).       
9af0: 3b 3b 20 28 65 6c 73 65 20 20 28 61 70 70 65 6e  ;; (else  (appen
9b00: 64 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68  d (twiki:line->h
9b10: 74 6d 6c 20 64 61 74 20 23 66 20 77 69 6b 69 29  tml dat #f wiki)
9b20: 28 6c 69 73 74 20 28 73 3a 62 72 29 29 29 29 29  (list (s:br)))))
9b30: 3b 3b 20 28 73 3a 70 20 27 63 6c 61 73 73 20 22  ;; (s:p 'class "
9b40: 74 69 64 64 6c 65 72 70 61 72 22 0a 20 20 20 20  tiddlerpar".    
9b50: 20 20 3b 3b 20 6e 6f 74 20 66 69 72 73 74 63 61    ;; not firstca
9b60: 6c 6c 20 73 6f 20 70 72 6f 63 65 73 73 20 6f 74  ll so process ot
9b70: 68 65 72 20 70 61 74 74 65 72 6e 73 0a 20 20 20  her patterns.   
9b80: 20 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 20 20     (cond.       
9b90: 28 28 74 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a  ((t-match twiki:
9ba0: 74 6c 69 6e 6b 2d 70 61 74 74 20 64 61 74 29 0a  tlink-patt dat).
9bb0: 09 28 6c 65 74 20 28 28 70 72 65 20 20 28 63 61  .(let ((pre  (ca
9bc0: 64 72 20 20 20 74 3a 6d 61 74 63 68 29 29 0a 09  dr   t:match))..
9bd0: 20 20 20 20 20 20 28 6c 6e 6b 20 20 28 63 61 64        (lnk  (cad
9be0: 64 72 20 20 74 3a 6d 61 74 63 68 29 29 0a 09 20  dr  t:match)).. 
9bf0: 20 20 20 20 20 28 70 6f 73 74 20 28 63 61 64 64       (post (cadd
9c00: 64 72 20 74 3a 6d 61 74 63 68 29 29 29 0a 09 20  dr t:match))).. 
9c10: 20 28 6c 69 73 74 20 28 74 77 69 6b 69 3a 6c 69   (list (twiki:li
9c20: 6e 65 2d 3e 68 74 6d 6c 20 70 72 65 20 23 66 20  ne->html pre #f 
9c30: 77 69 6b 69 29 0a 09 09 28 74 77 69 6b 69 3a 6d  wiki)...(twiki:m
9c40: 61 6b 65 2d 74 6c 69 6e 6b 20 28 74 77 69 6b 69  ake-tlink (twiki
9c50: 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 6c 6e 6b 20  :line->html lnk 
9c60: 23 66 20 77 69 6b 69 29 20 6c 6e 6b 29 20 3b 3b  #f wiki) lnk) ;;
9c70: 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
9c80: 67 0a 09 09 28 74 77 69 6b 69 3a 6c 69 6e 65 2d  g...(twiki:line-
9c90: 3e 68 74 6d 6c 20 70 6f 73 74 20 23 66 20 77 69  >html post #f wi
9ca0: 6b 69 29 29 29 29 0a 20 20 20 20 20 20 20 28 28  ki)))).       ((
9cb0: 74 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 70 69  t-match twiki:pi
9cc0: 63 2d 70 61 74 74 20 64 61 74 29 0a 09 28 6c 65  c-patt dat)..(le
9cd0: 74 20 28 28 70 72 65 20 20 28 63 61 64 72 20 20  t ((pre  (cadr  
9ce0: 20 20 74 3a 6d 61 74 63 68 29 29 0a 09 20 20 20    t:match))..   
9cf0: 20 20 20 28 73 69 7a 65 20 28 63 61 64 64 72 20     (size (caddr 
9d00: 20 20 74 3a 6d 61 74 63 68 29 29 20 0a 09 20 20    t:match)) ..  
9d10: 20 20 20 20 28 70 69 63 20 20 28 63 61 64 64 64      (pic  (caddd
9d20: 72 20 20 74 3a 6d 61 74 63 68 29 29 0a 09 20 20  r  t:match))..  
9d30: 20 20 20 20 28 70 6f 73 74 20 28 6c 69 73 74 2d      (post (list-
9d40: 72 65 66 20 74 3a 6d 61 74 63 68 20 34 29 29 29  ref t:match 4)))
9d50: 0a 09 20 20 28 6c 69 73 74 20 28 74 77 69 6b 69  ..  (list (twiki
9d60: 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 70 72 65 20  :line->html pre 
9d70: 23 66 20 77 69 6b 69 29 0a 09 09 28 74 77 69 6b  #f wiki)...(twik
9d80: 69 3a 70 69 63 20 70 69 63 20 73 69 7a 65 20 77  i:pic pic size w
9d90: 69 6b 69 29 0a 09 09 28 74 77 69 6b 69 3a 6c 69  iki)...(twiki:li
9da0: 6e 65 2d 3e 68 74 6d 6c 20 70 6f 73 74 20 23 74  ne->html post #t
9db0: 20 77 69 6b 69 29 29 29 29 0a 20 20 20 20 20 20   wiki)))).      
9dc0: 20 28 28 74 2d 6d 61 74 63 68 20 74 77 69 6b 69   ((t-match twiki
9dd0: 3a 75 6e 64 65 72 6c 69 6e 65 2d 70 61 74 74 20  :underline-patt 
9de0: 64 61 74 29 0a 09 28 6c 65 74 20 28 28 70 72 65  dat)..(let ((pre
9df0: 20 20 28 63 61 64 72 20 20 20 74 3a 6d 61 74 63    (cadr   t:matc
9e00: 68 29 29 0a 09 20 20 20 20 20 20 28 6c 6e 6b 20  h))..      (lnk 
9e10: 20 28 63 61 64 64 72 20 20 74 3a 6d 61 74 63 68   (caddr  t:match
9e20: 29 29 0a 09 20 20 20 20 20 20 28 70 6f 73 74 20  ))..      (post 
9e30: 28 63 61 64 64 64 72 20 74 3a 6d 61 74 63 68 29  (cadddr t:match)
9e40: 29 29 0a 09 20 20 28 6c 69 73 74 20 28 74 77 69  ))..  (list (twi
9e50: 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 70 72  ki:line->html pr
9e60: 65 20 23 66 20 77 69 6b 69 29 0a 09 09 28 74 77  e #f wiki)...(tw
9e70: 69 6b 69 3a 75 20 28 74 77 69 6b 69 3a 6c 69 6e  iki:u (twiki:lin
9e80: 65 2d 3e 68 74 6d 6c 20 6c 6e 6b 20 23 66 20 77  e->html lnk #f w
9e90: 69 6b 69 29 29 0a 09 09 28 74 77 69 6b 69 3a 6c  iki))...(twiki:l
9ea0: 69 6e 65 2d 3e 68 74 6d 6c 20 70 6f 73 74 20 23  ine->html post #
9eb0: 66 20 77 69 6b 69 29 29 29 29 0a 20 20 20 20 20  f wiki)))).     
9ec0: 20 20 28 28 74 2d 6d 61 74 63 68 20 74 77 69 6b    ((t-match twik
9ed0: 69 3a 74 61 62 6c 65 2d 70 61 74 74 20 64 61 74  i:table-patt dat
9ee0: 29 0a 09 28 6c 65 74 20 28 28 63 65 6c 73 20 20  )..(let ((cels  
9ef0: 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 63  (string-split (c
9f00: 61 64 72 20 74 3a 6d 61 74 63 68 29 20 22 7c 22  adr t:match) "|"
9f10: 29 29 29 0a 09 20 20 28 74 77 69 6b 69 3a 74 72  )))..  (twiki:tr
9f20: 20 28 6d 61 70 20 74 77 69 6b 69 3a 74 64 20 28   (map twiki:td (
9f30: 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c  twiki:line->html
9f40: 20 63 65 6c 73 20 23 66 20 77 69 6b 69 29 29 29   cels #f wiki)))
9f50: 29 29 0a 20 20 20 20 20 20 20 28 65 6c 73 65 20  )).       (else 
9f60: 28 6c 69 73 74 20 64 61 74 29 29 29 29 29 0a 0a  (list dat)))))..
9f70: 0a 23 7c 0a 28 74 77 69 6b 69 3a 64 61 74 2d 3e  .#|.(twiki:dat->
9f80: 68 74 6d 6c 20 22 61 5c 6e 7b 7b 7b 5c 6e 62 5c  html "a\n{{{\nb\
9f90: 6e 63 5c 6e 64 5c 6e 7d 7d 7d 5c 6e 21 65 5c 6e  nc\nd\n}}}\n!e\n
9fa0: 5b 5b 66 5d 5d 5c 6e 5b 5b 67 5d 5d 5c 6e 2a 68  [[f]]\n[[g]]\n*h
9fb0: 22 20 77 69 6b 69 29 0a 28 73 3a 6f 75 74 70 75  " wiki).(s:outpu
9fc0: 74 20 28 63 75 72 72 65 6e 74 2d 6f 75 74 70 75  t (current-outpu
9fd0: 74 2d 70 6f 72 74 29 20 28 74 77 69 6b 69 3a 64  t-port) (twiki:d
9fe0: 61 74 2d 3e 68 74 6d 6c 20 22 21 54 65 73 74 69  at->html "!Testi
9ff0: 6e 67 20 5b 5b 6d 79 20 66 69 72 73 74 20 6c 69  ng [[my first li
a000: 6e 6b 5d 5d 5c 6e 2a 20 54 65 73 74 5c 6e 2a 20  nk]]\n* Test\n* 
a010: 46 6f 6f 5c 6e 62 6c 61 68 22 20 77 69 6b 69 29  Foo\nblah" wiki)
a020: 29 20 20 20 0a 28 73 3a 6f 75 74 70 75 74 20 28  )   .(s:output (
a030: 63 75 72 72 65 6e 74 2d 6f 75 74 70 75 74 2d 70  current-output-p
a040: 6f 72 74 29 20 28 74 77 69 6b 69 3a 64 61 74 2d  ort) (twiki:dat-
a050: 3e 68 74 6d 6c 20 22 5b 5b 61 5d 5d 5c 6e 7b 7b  >html "[[a]]\n{{
a060: 7b 5c 6e 62 5c 6e 20 20 63 5c 6e 20 20 20 64 5c  {\nb\n  c\n   d\
a070: 6e 7d 7d 7d 5c 6e 2a 78 5c 6e 5b 5b 66 5d 5d 5c  n}}}\n*x\n[[f]]\
a080: 6e 5b 5b 67 5d 5d 5c 6e 2a 68 22 20 77 69 6b 69  n[[g]]\n*h" wiki
a090: 29 29 0a 28 73 3a 6f 75 74 70 75 74 20 28 63 75  )).(s:output (cu
a0a0: 72 72 65 6e 74 2d 6f 75 74 70 75 74 2d 70 6f 72  rrent-output-por
a0b0: 74 29 0a 7c 23 0a 0a                             t).|#..