Artifact 8375211898d2711a1119c538c7aecc3564e4f044:


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 54   for more...;; T
02c0: 68 69 73 20 69 73 20 74 68 65 20 63 75 72 72 65  his is the curre
02d0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6d  ntly supported m
02e0: 65 63 68 61 6e 69 73 6d 2e 20 50 6f 73 74 67 72  echanism. Postgr
02f0: 65 73 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  es will be added
0300: 20 6c 61 74 65 72 20 2d 6d 72 77 2d 20 37 2f 32   later -mrw- 7/2
0310: 36 2f 32 30 30 39 0a 3b 3b 0a 28 64 65 66 69 6e  6/2009.;;.(defin
0320: 65 20 28 74 77 69 6b 69 3a 6f 70 65 6e 2d 64 62  e (twiki:open-db
0330: 20 6b 65 79 20 2e 20 63 72 65 61 74 65 2d 6e 6f   key . create-no
0340: 74 2d 6f 6b 29 0a 20 20 3b 3b 20 28 73 3a 6c 6f  t-ok).  ;; (s:lo
0350: 67 20 22 47 6f 74 20 74 6f 20 74 77 69 6b 69 3a  g "Got to twiki:
0360: 6f 70 65 6e 2d 64 62 20 77 69 74 68 20 6b 65 79  open-db with key
0370: 3a 20 22 20 6b 65 79 29 0a 20 20 28 6c 65 74 2a  : " key).  (let*
0380: 20 28 28 63 72 65 61 74 65 2d 6f 6b 20 28 69 66   ((create-ok (if
0390: 20 28 6e 75 6c 6c 3f 20 63 72 65 61 74 65 2d 6e   (null? create-n
03a0: 6f 74 2d 6f 6b 29 20 23 74 20 28 63 61 72 20 63  ot-ok) #t (car c
03b0: 72 65 61 74 65 2d 6e 6f 74 2d 6f 6b 29 29 29 0a  reate-not-ok))).
03c0: 09 20 28 66 64 61 74 20 20 20 20 20 20 28 74 77  . (fdat      (tw
03d0: 69 6b 69 3a 6b 65 79 2d 3e 66 6e 61 6d 65 20 6b  iki:key->fname k
03e0: 65 79 29 29 0a 09 20 28 62 61 73 65 70 61 74 68  ey)).. (basepath
03f0: 20 20 28 73 6c 6f 74 2d 72 65 66 20 73 3a 73 65    (slot-ref s:se
0400: 73 73 69 6f 6e 20 27 74 77 69 6b 69 64 69 72 29  ssion 'twikidir)
0410: 29 0a 09 20 28 66 70 61 74 68 20 20 20 20 20 28  ).. (fpath     (
0420: 63 61 72 20 66 64 61 74 29 29 0a 09 20 28 66 6e  car fdat)).. (fn
0430: 61 6d 65 20 20 20 20 20 28 63 61 64 72 20 66 64  ame     (cadr fd
0440: 61 74 29 29 0a 09 20 28 66 75 6c 6c 6e 61 6d 65  at)).. (fullname
0450: 20 20 28 63 6f 6e 63 20 62 61 73 65 70 61 74 68    (conc basepath
0460: 20 22 2f 22 20 66 70 61 74 68 20 22 2f 22 20 66   "/" fpath "/" f
0470: 6e 61 6d 65 29 29 0a 09 20 28 66 65 78 69 73 74  name)).. (fexist
0480: 73 20 20 20 28 66 69 6c 65 2d 65 78 69 73 74 73  s   (file-exists
0490: 3f 20 66 75 6c 6c 6e 61 6d 65 29 29 0a 09 20 28  ? fullname)).. (
04a0: 64 62 20 20 20 20 20 20 20 20 28 69 66 20 66 65  db        (if fe
04b0: 78 69 73 74 73 20 28 64 62 69 3a 6f 70 65 6e 20  xists (dbi:open 
04c0: 27 73 71 6c 69 74 65 33 20 28 6c 69 73 74 20 28  'sqlite3 (list (
04d0: 63 6f 6e 73 20 27 64 62 6e 61 6d 65 20 66 75 6c  cons 'dbname ful
04e0: 6c 6e 61 6d 65 29 29 29 20 23 66 29 29 29 0a 20  lname))) #f))). 
04f0: 20 20 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74     (if (and (not
0500: 20 64 62 29 0a 09 20 20 20 20 20 28 6e 6f 74 20   db)..     (not 
0510: 63 72 65 61 74 65 2d 6f 6b 29 29 0a 09 28 65 78  create-ok))..(ex
0520: 69 74 20 31 30 30 29 0a 09 28 62 65 67 69 6e 0a  it 100)..(begin.
0530: 09 20 20 28 69 66 20 28 6e 6f 74 20 66 65 78 69  .  (if (not fexi
0540: 73 74 73 29 0a 09 20 20 20 20 20 20 28 62 65 67  sts)..      (beg
0550: 69 6e 0a 09 09 3b 3b 20 28 70 72 69 6e 74 20 22  in...;; (print "
0560: 66 75 6c 6c 6e 61 6d 65 3a 20 22 20 66 75 6c 6c  fullname: " full
0570: 6e 61 6d 65 29 0a 09 09 28 74 77 69 6b 69 3a 72  name)...(twiki:r
0580: 65 67 69 73 74 65 72 2d 77 69 6b 69 20 6b 65 79  egister-wiki key
0590: 20 66 75 6c 6c 6e 61 6d 65 29 0a 09 09 28 73 79   fullname)...(sy
05a0: 73 74 65 6d 20 28 63 6f 6e 63 20 22 6d 6b 64 69  stem (conc "mkdi
05b0: 72 20 2d 70 20 22 20 66 70 61 74 68 29 29 20 3b  r -p " fpath)) ;
05c0: 3b 20 63 72 65 61 74 65 20 74 68 65 20 70 61 74  ; create the pat
05d0: 68 0a 09 09 28 73 65 74 21 20 64 62 20 28 64 62  h...(set! db (db
05e0: 69 3a 6f 70 65 6e 20 27 73 71 6c 69 74 65 33 20  i:open 'sqlite3 
05f0: 28 6c 69 73 74 20 28 63 6f 6e 73 20 27 64 62 6e  (list (cons 'dbn
0600: 61 6d 65 20 66 75 6c 6c 6e 61 6d 65 29 29 29 29  ame fullname))))
0610: 0a 09 09 28 66 6f 72 2d 65 61 63 68 20 0a 09 09  ...(for-each ...
0620: 20 28 6c 61 6d 62 64 61 20 28 73 71 72 79 29 0a   (lambda (sqry).
0630: 09 09 20 20 20 3b 3b 20 28 70 72 69 6e 74 20 73  ..   ;; (print s
0640: 71 72 79 29 0a 09 09 20 20 20 28 64 62 69 3a 65  qry)...   (dbi:e
0650: 78 65 63 20 64 62 20 73 71 72 79 29 29 0a 09 09  xec db sqry))...
0660: 20 3b 3b 20 74 79 70 65 73 3a 20 30 20 74 65 78   ;; types: 0 tex
0670: 74 2c 20 31 20 6a 70 67 2c 20 32 20 70 6e 67 2c  t, 1 jpg, 2 png,
0680: 20 33 20 73 76 67 2c 20 34 20 73 70 72 65 61 64   3 svg, 4 spread
0690: 73 68 65 65 74 2c 20 35 20 61 75 64 69 6f 2c 20  sheet, 5 audio, 
06a0: 36 20 76 69 64 65 6f 20 3a 3a 20 62 65 74 74 65  6 video :: bette
06b0: 72 20 73 70 65 63 73 20 74 6f 20 63 6f 6d 65 2e  r specs to come.
06c0: 2e 2e 0a 09 09 20 28 6c 69 73 74 0a 09 09 20 20  ..... (list...  
06d0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 69  "CREATE TABLE pi
06e0: 63 73 20 20 20 20 20 20 28 69 64 20 49 4e 54 45  cs      (id INTE
06f0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0700: 6e 61 6d 65 20 54 45 58 54 2c 77 69 6b 69 5f 69  name TEXT,wiki_i
0710: 64 20 49 4e 54 45 47 45 52 2c 64 61 74 5f 69 64  d INTEGER,dat_id
0720: 20 49 4e 54 45 47 45 52 2c 74 68 75 6d 62 5f 64   INTEGER,thumb_d
0730: 61 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 63 72  at_id INTEGER,cr
0740: 65 61 74 65 64 5f 6f 6e 20 49 4e 54 45 47 45 52  eated_on INTEGER
0750: 2c 6f 77 6e 65 72 5f 69 64 20 49 4e 54 45 47 45  ,owner_id INTEGE
0760: 52 29 3b 22 0a 09 09 20 20 22 43 52 45 41 54 45  R);"...  "CREATE
0770: 20 54 41 42 4c 45 20 64 61 74 73 20 20 20 20 20   TABLE dats     
0780: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
0790: 4d 41 52 59 20 4b 45 59 2c 6d 64 35 73 75 6d 20  MARY KEY,md5sum 
07a0: 54 45 58 54 2c 64 61 74 20 42 4c 4f 42 2c 74 79  TEXT,dat BLOB,ty
07b0: 70 65 20 49 4e 54 45 47 45 52 29 3b 22 0a 09 09  pe INTEGER);"...
07c0: 20 20 3b 3b 20 6f 6e 20 65 76 65 72 79 20 6d 6f    ;; on every mo
07d0: 64 69 66 69 63 61 74 69 6f 6e 20 61 20 6e 65 77  dification a new
07e0: 20 74 69 64 64 6c 65 72 73 20 65 6e 74 72 79 20   tiddlers entry 
07f0: 69 73 20 63 72 65 61 74 65 64 2e 20 57 68 65 6e  is created. When
0800: 20 64 69 73 70 6c 61 79 69 6e 67 20 74 68 65 20   displaying the 
0810: 74 69 64 64 6c 65 72 73 20 64 6f 3a 0a 09 09 20  tiddlers do:... 
0820: 20 3b 3b 20 20 20 20 73 65 6c 65 63 74 20 77 68   ;;    select wh
0830: 65 72 65 20 63 72 65 61 74 65 64 5f 6f 6e 20 3c  ere created_on <
0840: 20 73 6f 6d 65 64 61 74 65 20 6f 72 64 65 72 20   somedate order 
0850: 62 79 20 63 72 65 61 74 65 64 5f 6f 6e 20 64 65  by created_on de
0860: 73 63 20 6c 69 6d 69 74 20 31 0a 09 09 20 20 22  sc limit 1...  "
0870: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 69 64  CREATE TABLE tid
0880: 64 6c 65 72 73 20 28 69 64 20 49 4e 54 45 47 45  dlers (id INTEGE
0890: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 77 69  R PRIMARY KEY,wi
08a0: 6b 69 5f 69 64 20 49 4e 54 45 47 45 52 2c 6e 61  ki_id INTEGER,na
08b0: 6d 65 20 54 45 58 54 2c 72 65 76 20 49 4e 54 45  me TEXT,rev INTE
08c0: 47 45 52 2c 64 61 74 5f 69 64 20 49 4e 54 45 47  GER,dat_id INTEG
08d0: 45 52 2c 63 72 65 61 74 65 64 5f 6f 6e 20 49 4e  ER,created_on IN
08e0: 54 45 47 45 52 2c 6f 77 6e 65 72 5f 69 64 20 49  TEGER,owner_id I
08f0: 4e 54 45 47 45 52 29 3b 22 0a 09 09 20 20 3b 3b  NTEGER);"...  ;;
0900: 20 72 65 76 20 61 6e 64 20 74 61 67 20 6f 6e 6c   rev and tag onl
0910: 79 20 75 74 69 6c 69 7a 65 64 20 77 68 65 6e 20  y utilized when 
0920: 75 73 65 72 20 73 65 74 73 20 61 20 74 61 67 2e  user sets a tag.
0930: 20 41 6c 6c 20 72 65 73 75 6c 74 73 20 66 72 6f   All results fro
0940: 6d 20 61 20 73 65 6c 65 63 74 20 61 73 20 61 62  m a select as ab
0950: 6f 76 65 20 66 6f 72 20 74 69 64 64 6c 65 72 73  ove for tiddlers
0960: 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20   are set to the 
0970: 74 61 67 0a 09 09 20 20 22 43 52 45 41 54 45 20  tag...  "CREATE 
0980: 54 41 42 4c 45 20 72 65 76 73 20 20 20 20 20 28  TABLE revs     (
0990: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
09a0: 52 59 20 4b 45 59 2c 74 61 67 20 54 45 58 54 29  RY KEY,tag TEXT)
09b0: 3b 22 0a 09 09 20 20 3b 3b 20 77 69 6b 69 73 20  ;"...  ;; wikis 
09c0: 69 73 20 68 65 72 65 20 66 6f 72 20 77 68 65 6e  is here for when
09d0: 20 70 6f 73 74 67 72 65 73 71 6c 20 73 75 70 70   postgresql supp
09e0: 6f 72 74 20 69 73 20 61 64 64 65 64 20 6f 72 20  ort is added or 
09f0: 69 66 20 61 20 73 75 62 20 77 69 6b 69 20 69 73  if a sub wiki is
0a00: 20 63 72 65 61 74 65 64 2e 20 0a 09 09 20 20 22   created. ...  "
0a10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 77 69 6b  CREATE TABLE wik
0a20: 69 73 20 20 20 20 28 69 64 20 49 4e 54 45 47 45  is    (id INTEGE
0a30: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 6e 61  R PRIMARY KEY,na
0a40: 6d 65 20 54 45 58 54 2c 63 72 65 61 74 65 64 5f  me TEXT,created_
0a50: 6f 6e 20 49 4e 54 45 47 45 52 29 3b 22 0a 09 09  on INTEGER);"...
0a60: 20 20 3b 3b 20 61 63 63 65 73 73 20 63 6f 6e 74    ;; access cont
0a70: 72 6f 6c 2c 20 6e 65 67 61 74 69 76 65 20 6e 75  rol, negative nu
0a80: 6d 62 65 72 65 64 20 67 72 6f 75 70 73 20 61 72  mbered groups ar
0a90: 65 20 70 72 69 76 61 74 65 20 67 72 6f 75 70 73  e private groups
0aa0: 2c 20 70 6f 73 74 69 76 65 20 6e 75 6d 62 65 72  , postive number
0ab0: 65 64 20 67 72 6f 75 70 73 20 61 72 65 20 73 79  ed groups are sy
0ac0: 73 74 65 6d 20 67 72 6f 75 70 73 0a 09 09 20 20  stem groups...  
0ad0: 3b 3b 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  ;; permissions a
0ae0: 72 65 20 6f 6e 20 61 20 70 65 72 2d 77 69 6b 69  re on a per-wiki
0af0: 20 67 72 61 6e 75 6c 61 72 69 74 79 0a 09 09 20   granularity... 
0b00: 20 3b 3b 20 61 63 63 65 73 73 3b 20 30 3d 6e 6f   ;; access; 0=no
0b10: 6e 65 2c 31 3d 72 65 61 64 2c 32 3d 72 65 61 64  ne,1=read,2=read
0b20: 2f 77 72 69 74 65 0a 09 09 20 20 22 43 52 45 41  /write...  "CREA
0b30: 54 45 20 54 41 42 4c 45 20 70 65 72 6d 73 20 20  TE TABLE perms  
0b40: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52    (id INTEGER PR
0b50: 49 4d 41 52 59 20 4b 45 59 2c 77 69 6b 69 5f 69  IMARY KEY,wiki_i
0b60: 64 20 49 4e 54 45 47 45 52 2c 67 72 6f 75 70 5f  d INTEGER,group_
0b70: 69 64 20 49 4e 54 45 47 45 52 2c 61 63 63 65 73  id INTEGER,acces
0b80: 73 20 49 4e 54 45 47 45 52 29 3b 22 0a 09 09 20  s INTEGER);"... 
0b90: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 67   "CREATE TABLE g
0ba0: 72 6f 75 70 73 20 20 20 28 69 64 20 49 4e 54 45  roups   (id INTE
0bb0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0bc0: 6e 61 6d 65 20 54 45 58 54 29 3b 22 0a 09 09 20  name TEXT);"... 
0bd0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d   "CREATE TABLE m
0be0: 65 6d 62 65 72 73 20 20 28 69 64 20 49 4e 54 45  embers  (id INTE
0bf0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0c00: 70 65 72 73 6f 6e 5f 69 64 20 49 4e 54 45 47 45  person_id INTEGE
0c10: 52 2c 67 72 6f 75 70 5f 69 64 20 49 4e 54 45 47  R,group_id INTEG
0c20: 45 52 29 3b 22 0a 09 09 20 20 3b 3b 20 73 65 74  ER);"...  ;; set
0c30: 75 70 20 61 6e 64 20 63 6f 6e 66 69 67 75 72 61  up and configura
0c40: 74 69 6f 6e 20 64 61 74 61 0a 09 09 20 20 22 43  tion data...  "C
0c50: 52 45 41 54 45 20 54 41 42 4c 45 20 6d 65 74 61  REATE TABLE meta
0c60: 20 20 20 20 20 28 69 64 20 49 4e 54 45 47 45 52       (id INTEGER
0c70: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 6b 65 79   PRIMARY KEY,key
0c80: 20 54 45 58 54 2c 76 61 6c 20 54 45 58 54 29 3b   TEXT,val TEXT);
0c90: 22 0a 09 09 20 20 3b 3b 20 6e 65 65 64 20 74 6f  "...  ;; need to
0ca0: 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74 72 79   create an entry
0cb0: 20 66 6f 72 20 2a 74 68 69 73 2a 20 74 77 69 6b   for *this* twik
0cc0: 69 0a 09 09 20 20 28 63 6f 6e 63 20 22 49 4e 53  i...  (conc "INS
0cd0: 45 52 54 20 49 4e 54 4f 20 77 69 6b 69 73 20 28  ERT INTO wikis (
0ce0: 69 64 2c 6e 61 6d 65 2c 63 72 65 61 74 65 64 5f  id,name,created_
0cf0: 6f 6e 29 20 56 41 4c 55 45 53 20 28 31 2c 27 6d  on) VALUES (1,'m
0d00: 61 69 6e 27 2c 22 20 28 63 75 72 72 65 6e 74 2d  ain'," (current-
0d10: 73 65 63 6f 6e 64 73 29 20 22 29 3b 22 29 29 29  seconds) ");")))
0d20: 0a 09 09 3b 3b 20 20 20 20 20 28 63 6f 6e 63 20  ...;;     (conc 
0d30: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 69 64  "INSERT INTO tid
0d40: 64 6c 65 72 73 20 28 77 69 6b 69 5f 69 64 2c 6e  dlers (wiki_id,n
0d50: 61 6d 65 2c 63 72 65 61 74 65 64 5f 6f 6e 29 20  ame,created_on) 
0d60: 56 41 4c 55 45 53 28 31 2c 27 4d 61 69 6e 4d 65  VALUES(1,'MainMe
0d70: 6e 75 27 2c 22 20 28 63 75 72 72 65 6e 74 2d 73  nu'," (current-s
0d80: 65 63 6f 6e 64 73 29 20 22 29 3b 22 29 29 29 29  econds) ");"))))
0d90: 29 0a 09 09 28 74 77 69 6b 69 3a 73 61 76 65 2d  )...(twiki:save-
0da0: 74 69 64 64 6c 65 72 20 64 62 20 22 4d 61 69 6e  tiddler db "Main
0db0: 4d 65 6e 75 22 20 22 5b 5b 46 69 72 73 74 54 69  Menu" "[[FirstTi
0dc0: 64 64 6c 65 72 5d 5d 22 20 22 22 20 31 20 31 29  ddler]]" "" 1 1)
0dd0: 29 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 73  ))..  (sqlite3:s
0de0: 65 74 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 21  et-busy-timeout!
0df0: 28 64 62 69 3a 64 62 2d 63 6f 6e 6e 20 64 62 29  (dbi:db-conn db)
0e00: 20 31 30 30 30 30 30 30 29 0a 09 20 20 64 62 29   1000000)..  db)
0e10: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )))..;;=========
0e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
0e60: 20 74 77 69 6b 69 73 20 28 64 62 20 6e 61 6d 69   twikis (db nami
0e70: 6e 67 2c 20 73 71 6c 69 74 65 20 76 73 20 70 6f  ng, sqlite vs po
0e80: 73 74 67 72 65 73 71 6c 2c 20 6b 65 79 73 20 65  stgresql, keys e
0e90: 74 63 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  tc..;;==========
0ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b  ============..;;
0ee0: 20 41 20 77 69 6b 69 20 69 73 20 73 70 65 63 69   A wiki is speci
0ef0: 66 69 65 64 20 62 79 20 61 20 6c 69 73 74 20 6f  fied by a list o
0f00: 66 20 6b 65 79 73 2c 20 68 65 72 65 20 77 65 20  f keys, here we 
0f10: 63 6f 6e 76 65 72 74 20 74 68 61 74 20 6c 69 73  convert that lis
0f20: 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74  t to a single st
0f30: 72 69 6e 67 0a 28 64 65 66 69 6e 65 20 28 74 77  ring.(define (tw
0f40: 69 6b 69 3a 6b 65 79 73 2d 3e 6b 65 79 20 6b 65  iki:keys->key ke
0f50: 79 73 29 0a 20 20 28 69 66 20 28 6e 6f 74 20 28  ys).  (if (not (
0f60: 6e 75 6c 6c 3f 20 6b 65 79 73 29 29 0a 20 20 20  null? keys)).   
0f70: 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72     (string-inter
0f80: 73 70 65 72 73 65 20 28 6d 61 70 20 63 6f 6e 63  sperse (map conc
0f90: 20 6b 65 79 73 29 20 22 20 22 29 0a 20 20 20 20   keys) " ").    
0fa0: 20 20 22 20 22 29 29 0a 0a 28 64 65 66 69 6e 65    " "))..(define
0fb0: 20 28 74 77 69 6b 69 3a 6b 65 79 2d 3e 66 6e 61   (twiki:key->fna
0fc0: 6d 65 20 6b 65 79 29 0a 20 20 28 6c 65 74 2a 20  me key).  (let* 
0fd0: 28 3b 3b 20 28 6d 64 35 6b 65 79 70 61 74 68 20  (;; (md5keypath 
0fe0: 28 6d 64 35 3a 64 69 67 65 73 74 20 6b 65 79 29  (md5:digest key)
0ff0: 29 20 3b 3b 20 28 74 77 69 6b 69 3a 6b 65 79 73  ) ;; (twiki:keys
1000: 2d 3e 6b 65 79 20 6b 65 79 73 29 29 29 0a 09 20  ->key keys))).. 
1010: 28 6b 65 79 70 61 74 68 20 20 20 20 28 74 77 69  (keypath    (twi
1020: 6b 69 3a 77 65 62 36 34 65 6e 63 20 6b 65 79 29  ki:web64enc key)
1030: 29 0a 09 20 28 64 65 6c 74 61 20 20 20 20 20 20  ).. (delta      
1040: 28 71 75 6f 74 69 65 6e 74 20 28 73 74 72 69 6e  (quotient (strin
1050: 67 2d 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 68  g-length keypath
1060: 29 20 33 29 29 20 3b 3b 20 0a 09 20 28 70 31 20  ) 3)) ;; .. (p1 
1070: 20 20 20 20 20 20 20 20 28 73 75 62 73 74 72 69          (substri
1080: 6e 67 20 6b 65 79 70 61 74 68 20 30 20 20 20 20  ng keypath 0    
1090: 20 20 20 20 20 20 20 64 65 6c 74 61 29 29 20 3b         delta)) ;
10a0: 3b 20 20 30 20 20 38 29 29 0a 09 20 28 70 32 20  ;  0  8)).. (p2 
10b0: 20 20 20 20 20 20 20 20 28 73 75 62 73 74 72 69          (substri
10c0: 6e 67 20 6b 65 79 70 61 74 68 20 64 65 6c 74 61  ng keypath delta
10d0: 20 20 20 20 20 20 20 28 2a 20 64 65 6c 74 61 20         (* delta 
10e0: 32 29 29 29 3b 3b 20 20 38 20 31 36 29 29 0a 09  2)));;  8 16))..
10f0: 20 28 70 33 20 20 20 20 20 20 20 20 20 28 73 75   (p3         (su
1100: 62 73 74 72 69 6e 67 20 6b 65 79 70 61 74 68 20  bstring keypath 
1110: 28 2a 20 64 65 6c 74 61 20 32 29 20 28 2a 20 64  (* delta 2) (* d
1120: 65 6c 74 61 20 33 29 29 29 29 20 3b 3b 20 31 36  elta 3)))) ;; 16
1130: 20 32 34 29 29 0a 20 20 20 20 28 6c 69 73 74 20   24)).    (list 
1140: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
1150: 72 73 65 20 28 6c 69 73 74 20 22 74 77 69 6b 69  rse (list "twiki
1160: 73 22 20 70 31 20 70 32 20 70 33 29 20 22 2f 22  s" p1 p2 p3) "/"
1170: 29 20 6b 65 79 70 61 74 68 29 29 29 0a 0a 3b 3b  ) keypath)))..;;
1180: 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 77 69 64   look up the wid
1190: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6b 65   based on the ke
11a0: 79 73 2c 20 74 68 69 73 20 69 73 20 75 73 65 64  ys, this is used
11b0: 20 66 6f 72 20 73 75 62 20 77 69 6b 69 73 20 6f   for sub wikis o
11c0: 6e 6c 79 2e 20 49 2e 65 2e 20 61 20 77 69 6b 69  nly. I.e. a wiki
11d0: 20 69 6e 73 74 61 6e 74 69 61 74 65 64 20 69 6e   instantiated in
11e0: 73 69 64 65 20 61 6e 6f 74 68 65 72 20 77 69 6b  side another wik
11f0: 69 20 0a 3b 3b 20 67 69 76 69 6e 67 20 61 20 73  i .;; giving a s
1200: 65 70 61 72 61 74 65 20 6e 61 6d 65 73 70 61 63  eparate namespac
1210: 65 20 74 6f 20 61 6c 6c 20 74 68 65 20 74 69 64  e to all the tid
1220: 64 6c 65 72 73 0a 28 64 65 66 69 6e 65 20 28 74  dlers.(define (t
1230: 77 69 6b 69 3a 6e 61 6d 65 2d 3e 77 69 64 20 64  wiki:name->wid d
1240: 62 20 6e 61 6d 65 29 20 3b 3b 20 28 73 6c 6f 74  b name) ;; (slot
1250: 2d 72 65 66 20 73 3a 73 65 73 73 69 6f 6e 20 27  -ref s:session '
1260: 63 6f 6e 6e 29 0a 20 20 28 6c 65 74 20 28 28 77  conn).  (let ((w
1270: 69 64 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20  id (dbi:get-one 
1280: 64 62 20 22 53 45 4c 45 43 54 20 69 64 20 46 52  db "SELECT id FR
1290: 4f 4d 20 77 69 6b 69 73 20 57 48 45 52 45 20 6e  OM wikis WHERE n
12a0: 61 6d 65 3d 3f 3b 22 20 6e 61 6d 65 29 29 29 0a  ame=?;" name))).
12b0: 20 20 20 20 28 69 66 20 77 69 64 20 77 69 64 0a      (if wid wid.
12c0: 09 28 62 65 67 69 6e 0a 09 20 20 28 64 62 69 3a  .(begin..  (dbi:
12d0: 65 78 65 63 20 64 62 20 22 49 4e 53 45 52 54 20  exec db "INSERT 
12e0: 49 4e 54 4f 20 77 69 6b 69 73 20 28 6e 61 6d 65  INTO wikis (name
12f0: 2c 63 72 65 61 74 65 64 5f 6f 6e 29 20 56 41 4c  ,created_on) VAL
1300: 55 45 53 28 3f 2c 3f 29 3b 22 20 6e 61 6d 65 20  UES(?,?);" name 
1310: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73  (current-seconds
1320: 29 29 0a 09 20 20 28 74 77 69 6b 69 3a 6e 61 6d  ))..  (twiki:nam
1330: 65 2d 3e 77 69 64 20 64 62 20 6e 61 6d 65 29 29  e->wid db name))
1340: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )))..;;=========
1350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1380: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
1390: 20 74 77 69 6b 69 20 72 65 63 6f 72 64 0a 3b 3b   twiki record.;;
13a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13e0: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 6d 61 6b 65 2d  ======..;; make-
13f0: 76 65 63 74 6f 72 2d 72 65 63 6f 72 64 20 74 77  vector-record tw
1400: 69 6b 69 20 77 69 6b 69 20 77 69 64 20 6e 61 6d  iki wiki wid nam
1410: 65 20 6b 65 79 20 64 62 68 0a 28 64 65 66 69 6e  e key dbh.(defin
1420: 65 20 28 6d 61 6b 65 2d 74 77 69 6b 69 3a 77 69  e (make-twiki:wi
1430: 6b 69 29 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20  ki)(make-vector 
1440: 35 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69  5)).(define-inli
1450: 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 67  ne (twiki:wiki-g
1460: 65 74 2d 77 69 64 20 20 20 20 76 65 63 29 20 20  et-wid    vec)  
1470: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20 76    (vector-ref  v
1480: 65 63 20 30 29 29 0a 28 64 65 66 69 6e 65 2d 69  ec 0)).(define-i
1490: 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b  nline (twiki:wik
14a0: 69 2d 67 65 74 2d 6e 61 6d 65 20 20 20 76 65 63  i-get-name   vec
14b0: 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66  )    (vector-ref
14c0: 20 20 76 65 63 20 31 29 29 0a 28 64 65 66 69 6e    vec 1)).(defin
14d0: 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a  e-inline (twiki:
14e0: 77 69 6b 69 2d 67 65 74 2d 6b 65 79 20 20 20 20  wiki-get-key    
14f0: 76 65 63 29 20 20 20 20 28 76 65 63 74 6f 72 2d  vec)    (vector-
1500: 72 65 66 20 20 76 65 63 20 32 29 29 0a 28 64 65  ref  vec 2)).(de
1510: 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69  fine-inline (twi
1520: 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 64 62 68 20  ki:wiki-get-dbh 
1530: 20 20 20 76 65 63 29 20 20 20 20 28 76 65 63 74     vec)    (vect
1540: 6f 72 2d 72 65 66 20 20 76 65 63 20 33 29 29 0a  or-ref  vec 3)).
1550: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
1560: 74 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 70  twiki:wiki-get-p
1570: 65 72 6d 73 20 20 76 65 63 29 20 20 20 20 28 76  erms  vec)    (v
1580: 65 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20 34  ector-ref  vec 4
1590: 29 29 0a 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69  ))..(define-inli
15a0: 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 73  ne (twiki:wiki-s
15b0: 65 74 2d 77 69 64 21 20 20 20 76 65 63 20 76 61  et-wid!   vec va
15c0: 6c 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76  l)(vector-set! v
15d0: 65 63 20 30 20 76 61 6c 29 29 0a 28 64 65 66 69  ec 0 val)).(defi
15e0: 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69  ne-inline (twiki
15f0: 3a 77 69 6b 69 2d 73 65 74 2d 6e 61 6d 65 21 20  :wiki-set-name! 
1600: 20 76 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72   vec val)(vector
1610: 2d 73 65 74 21 20 76 65 63 20 31 20 76 61 6c 29  -set! vec 1 val)
1620: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
1630: 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74   (twiki:wiki-set
1640: 2d 6b 65 79 21 20 20 20 76 65 63 20 76 61 6c 29  -key!   vec val)
1650: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65 63  (vector-set! vec
1660: 20 32 20 76 61 6c 29 29 0a 28 64 65 66 69 6e 65   2 val)).(define
1670: 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a 77  -inline (twiki:w
1680: 69 6b 69 2d 73 65 74 2d 64 62 68 21 20 20 20 76  iki-set-dbh!   v
1690: 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73  ec val)(vector-s
16a0: 65 74 21 20 76 65 63 20 33 20 76 61 6c 29 29 0a  et! vec 3 val)).
16b0: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
16c0: 74 77 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 70  twiki:wiki-set-p
16d0: 65 72 6d 73 21 20 76 65 63 20 76 61 6c 29 28 76  erms! vec val)(v
16e0: 65 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20 34  ector-set! vec 4
16f0: 20 76 61 6c 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d   val))..;;======
1700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1740: 0a 3b 3b 20 74 77 69 6b 69 20 6d 69 73 63 0a 3b  .;; twiki misc.;
1750: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
1760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1790: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75  =======..;; retu
17a0: 72 6e 73 20 68 65 6c 70 20 68 74 6d 6c 0a 28 64  rns help html.(d
17b0: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 68 65 6c  efine (twiki:hel
17c0: 70 20 73 65 63 74 69 6f 6e 29 0a 20 20 28 6c 65  p section).  (le
17d0: 74 20 28 28 6d 61 69 6e 20 28 74 77 69 6b 69 3a  t ((main (twiki:
17e0: 64 69 76 20 0a 09 20 20 20 20 20 20 20 27 6e 6f  div ..       'no
17f0: 64 65 20 22 74 77 69 6b 69 2d 68 65 6c 70 22 0a  de "twiki-help".
1800: 09 20 20 20 20 20 20 20 28 6c 69 73 74 20 0a 09  .       (list ..
1810: 09 28 74 77 69 6b 69 3a 68 33 20 22 48 65 6c 70  .(twiki:h3 "Help
1820: 20 73 74 75 66 66 22 29 0a 09 09 28 74 77 69 6b   stuff")...(twik
1830: 69 3a 70 72 65 20 22 0a 4c 69 6e 6b 20 74 6f 20  i:pre ".Link to 
1840: 70 61 67 65 3a 20 20 20 20 20 20 5b 5b 50 61 67  page:      [[Pag
1850: 65 20 54 69 74 6c 65 5d 5d 0a 48 65 61 64 69 6e  e Title]].Headin
1860: 67 33 3a 20 20 20 20 20 20 20 20 20 20 21 21 21  g3:          !!!
1870: 20 54 68 65 20 68 65 61 64 69 6e 67 0a 55 6e 64   The heading.Und
1880: 65 72 6c 69 6e 65 3a 20 20 20 20 20 20 20 20 20  erline:         
1890: 5f 5f 75 6e 64 65 72 6c 69 6e 65 64 5f 5f 0a 54  __underlined__.T
18a0: 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20 20  able:           
18b0: 20 20 7c 20 63 65 6c 6c 31 20 7c 20 63 65 6c 6c    | cell1 | cell
18c0: 32 20 7c 0a 4c 69 73 74 3a 20 20 20 20 20 20 20  2 |.List:       
18d0: 20 20 20 20 20 20 20 23 20 69 74 65 6d 31 0a 20         # item1. 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 23 23 20 69 74 65 6d 32 0a 42 75 6c 6c 65    ## item2.Bulle
1900: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 2a 20  t:            * 
1910: 69 74 65 6d 31 0a 20 20 20 20 20 20 20 20 20 20  item1.          
1920: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 65 6d           ** item
1930: 32 0a 50 72 65 66 6f 72 6d 61 74 74 65 64 3a 20  2.Preformatted: 
1940: 20 20 20 20 20 7b 7b 7b 73 74 75 66 66 20 68 65       {{{stuff he
1950: 72 65 7d 7d 7d 0a 49 6e 73 65 72 74 20 61 20 70  re}}}.Insert a p
1960: 69 63 74 75 72 65 3a 20 20 5b 70 69 63 5b 50 69  icture:  [pic[Pi
1970: 63 4e 61 6d 65 5d 5d 0a 4f 72 20 77 69 74 68 20  cName]].Or with 
1980: 73 69 7a 65 3a 20 20 20 20 20 20 5b 70 69 63 31  size:      [pic1
1990: 30 30 78 31 30 30 5b 50 69 63 4e 61 6d 65 5d 5d  00x100[PicName]]
19a0: 0a 55 70 6c 6f 61 64 20 74 68 65 20 70 69 63 74  .Upload the pict
19b0: 75 72 65 20 75 73 69 6e 67 20 74 68 65 20 5c 22  ure using the \"
19c0: 50 69 63 5c 22 20 6c 69 6e 6b 20 66 69 72 73 74  Pic\" link first
19d0: 22 29 29 29 29 29 0a 09 3b 3b 28 63 61 73 65 20  ")))))..;;(case 
19e0: 73 65 63 74 69 6f 6e 0a 20 20 20 20 6d 61 69 6e  section.    main
19f0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
1a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1a40: 74 77 69 6b 69 20 61 63 63 65 73 73 20 63 6f 6e  twiki access con
1a50: 74 72 6f 6c 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  trol.;;=========
1a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b  =============..;
1aa0: 3b 20 69 64 65 61 20 68 65 72 65 20 69 73 20 66  ; idea here is f
1ab0: 6f 72 20 74 68 65 20 65 6e 64 20 75 73 65 72 20  or the end user 
1ac0: 74 6f 20 72 65 64 65 66 69 6e 65 20 74 68 69 73  to redefine this
1ad0: 20 72 6f 75 74 69 6e 65 2c 0a 3b 3b 20 61 6e 64   routine,.;; and
1ae0: 20 63 61 6c 6c 20 74 77 69 6b 69 3a 69 6e 74 65   call twiki:inte
1af0: 72 61 6c 2d 61 63 63 65 73 73 20 69 66 20 64 65  ral-access if de
1b00: 73 69 72 65 64 0a 3b 3b 20 0a 3b 3b 20 69 66 20  sired.;; .;; if 
1b10: 6f 76 65 72 72 69 64 65 20 69 73 20 23 74 20 74  override is #t t
1b20: 68 65 6e 20 67 69 76 65 20 61 63 63 65 73 73 20  hen give access 
1b30: 6e 6f 20 6d 61 74 74 65 72 20 77 68 61 74 0a 28  no matter what.(
1b40: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 61 63  define (twiki:ac
1b50: 63 65 73 73 20 6b 65 79 73 20 77 69 6b 69 2d 6e  cess keys wiki-n
1b60: 61 6d 65 20 75 73 65 72 2d 69 64 29 0a 20 20 27  ame user-id).  '
1b70: 28 72 20 77 29 29 0a 0a 3b 3b 20 41 64 64 20 73  (r w))..;; Add s
1b80: 75 70 70 6f 72 74 20 66 6f 72 20 73 74 6f 72 69  upport for stori
1b90: 6e 67 20 67 72 6f 75 70 73 2c 20 75 73 65 72 73  ng groups, users
1ba0: 20 61 6e 64 20 61 63 63 65 73 73 20 69 6e 74 65   and access inte
1bb0: 72 6e 61 6c 6c 79 0a 3b 3b 20 0a 28 64 65 66 69  rnally.;; .(defi
1bc0: 6e 65 20 28 74 77 69 6b 69 3a 69 6e 74 65 72 6e  ne (twiki:intern
1bd0: 61 6c 2d 61 63 63 65 73 73 20 6b 65 79 73 20 77  al-access keys w
1be0: 69 6b 69 2d 6e 61 6d 65 20 75 73 65 72 2d 69 64  iki-name user-id
1bf0: 29 0a 20 20 23 66 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  ).  #f)..;;=====
1c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c40: 3d 0a 3b 3b 20 74 77 69 6b 69 20 72 65 67 69 73  =.;; twiki regis
1c50: 74 72 79 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  try.;;==========
1c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b  ============..;;
1ca0: 20 74 68 65 73 65 20 63 61 6e 20 62 65 20 6f 76   these can be ov
1cb0: 65 72 72 69 64 64 65 6e 20 62 79 20 65 6e 64 20  erridden by end 
1cc0: 75 73 65 72 20 28 6a 75 73 74 20 63 72 65 61 74  user (just creat
1cd0: 65 20 61 20 6e 65 77 20 72 6f 75 74 69 6e 65 20  e a new routine 
1ce0: 62 79 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  by the same name
1cf0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  )..(define (twik
1d00: 69 3a 6f 70 65 6e 2d 72 65 67 69 73 74 72 79 29  i:open-registry)
1d10: 0a 20 20 28 6c 65 74 2a 20 28 28 62 61 73 65 70  .  (let* ((basep
1d20: 61 74 68 20 20 28 73 6c 6f 74 2d 72 65 66 20 73  ath  (slot-ref s
1d30: 3a 73 65 73 73 69 6f 6e 20 27 73 72 6f 6f 74 29  :session 'sroot)
1d40: 29 0a 09 20 28 72 65 67 66 69 6c 65 20 20 20 28  ).. (regfile   (
1d50: 63 6f 6e 63 20 62 61 73 65 70 61 74 68 20 22 2f  conc basepath "/
1d60: 74 77 69 6b 69 73 2f 72 65 67 69 73 74 72 79 2e  twikis/registry.
1d70: 64 62 22 29 29 0a 09 20 28 72 65 67 65 78 69 73  db")).. (regexis
1d80: 74 73 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f  ts (file-exists?
1d90: 20 72 65 67 66 69 6c 65 29 29 0a 09 20 28 64 62   regfile)).. (db
1da0: 20 20 20 20 20 20 20 20 28 64 62 69 3a 6f 70 65          (dbi:ope
1db0: 6e 20 27 73 71 6c 69 74 65 33 20 28 6c 69 73 74  n 'sqlite3 (list
1dc0: 20 28 63 6f 6e 73 20 27 64 62 6e 61 6d 65 20 72   (cons 'dbname r
1dd0: 65 67 66 69 6c 65 29 29 29 29 29 0a 20 20 20 20  egfile))))).    
1de0: 28 69 66 20 72 65 67 65 78 69 73 74 73 0a 09 64  (if regexists..d
1df0: 62 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 66 6f  b..(begin..  (fo
1e00: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
1e10: 73 74 6d 74 29 28 64 62 69 3a 65 78 65 63 20 64  stmt)(dbi:exec d
1e20: 62 20 73 74 6d 74 29 29 0a 09 09 20 20 20 20 28  b stmt))...    (
1e30: 6c 69 73 74 20 22 43 52 45 41 54 45 20 54 41 42  list "CREATE TAB
1e40: 4c 45 20 77 69 6b 69 73 20 28 6b 65 79 20 54 45  LE wikis (key TE
1e50: 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 70  XT PRIMARY KEY,p
1e60: 61 74 68 20 54 45 58 54 2c 63 72 65 61 74 69 6f  ath TEXT,creatio
1e70: 6e 5f 64 61 74 65 20 49 4e 54 45 47 45 52 2c 63  n_date INTEGER,c
1e80: 72 65 61 74 6f 72 5f 69 64 20 49 4e 54 45 47 45  reator_id INTEGE
1e90: 52 29 3b 22 29 29 0a 09 20 20 64 62 29 29 29 29  R);"))..  db))))
1ea0: 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  ..(define (twiki
1eb0: 3a 72 65 67 69 73 74 65 72 2d 77 69 6b 69 20 6b  :register-wiki k
1ec0: 65 79 20 70 61 74 68 29 0a 20 20 28 6c 65 74 20  ey path).  (let 
1ed0: 28 28 64 62 20 28 74 77 69 6b 69 3a 6f 70 65 6e  ((db (twiki:open
1ee0: 2d 72 65 67 69 73 74 72 79 29 29 29 0a 20 20 20  -registry))).   
1ef0: 20 28 64 62 69 3a 65 78 65 63 20 64 62 20 0a 09   (dbi:exec db ..
1f00: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52        "INSERT OR
1f10: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 77 69   REPLACE INTO wi
1f20: 6b 69 73 20 28 6b 65 79 2c 70 61 74 68 2c 63 72  kis (key,path,cr
1f30: 65 61 74 69 6f 6e 5f 64 61 74 65 2c 63 72 65 61  eation_date,crea
1f40: 74 6f 72 5f 69 64 29 20 56 41 4c 55 45 53 28 3f  tor_id) VALUES(?
1f50: 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 20 20 20 20 20  ,?,?,?);"..     
1f60: 20 6b 65 79 20 70 61 74 68 20 28 63 75 72 72 65   key path (curre
1f70: 6e 74 2d 73 65 63 6f 6e 64 73 29 20 28 74 77 69  nt-seconds) (twi
1f80: 6b 69 3a 67 65 74 2d 69 64 29 29 0a 20 20 20 20  ki:get-id)).    
1f90: 28 64 62 69 3a 63 6c 6f 73 65 20 64 62 29 29 29  (dbi:close db)))
1fa0: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
1fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 74 69  ==========.;; ti
1ff0: 64 64 6c 65 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  ddlers.;;=======
2000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
2040: 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 74  .(define twiki:t
2050: 69 64 64 6c 65 72 2d 73 65 6c 65 63 74 6f 72 20  iddler-selector 
2060: 22 53 45 4c 45 43 54 20 74 2e 69 64 2c 74 2e 6e  "SELECT t.id,t.n
2070: 61 6d 65 2c 74 2e 72 65 76 2c 74 2e 64 61 74 5f  ame,t.rev,t.dat_
2080: 69 64 2c 74 2e 63 72 65 61 74 65 64 5f 6f 6e 2c  id,t.created_on,
2090: 74 2e 6f 77 6e 65 72 5f 69 64 20 46 52 4f 4d 20  t.owner_id FROM 
20a0: 74 69 64 64 6c 65 72 73 20 41 53 20 74 20 49 4e  tiddlers AS t IN
20b0: 4e 45 52 20 4a 4f 49 4e 20 64 61 74 73 20 41 53  NER JOIN dats AS
20c0: 20 64 20 4f 4e 20 74 2e 64 61 74 5f 69 64 3d 64   d ON t.dat_id=d
20d0: 2e 69 64 22 29 0a 28 64 65 66 69 6e 65 20 28 74  .id").(define (t
20e0: 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 6d 61 6b  wiki:tiddler-mak
20f0: 65 29 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20 38  e)(make-vector 8
2100: 20 23 66 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e   #f)).(define-in
2110: 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64  line (twiki:tidd
2120: 6c 65 72 2d 67 65 74 2d 69 64 20 20 20 20 20 20  ler-get-id      
2130: 20 20 20 20 20 76 65 63 29 20 20 20 20 28 76 65       vec)    (ve
2140: 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20 30 29  ctor-ref  vec 0)
2150: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
2160: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
2170: 67 65 74 2d 6e 61 6d 65 20 20 20 20 20 20 20 20  get-name        
2180: 20 76 65 63 29 20 20 20 20 28 76 65 63 74 6f 72   vec)    (vector
2190: 2d 72 65 66 20 20 76 65 63 20 31 29 29 0a 28 64  -ref  vec 1)).(d
21a0: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77  efine-inline (tw
21b0: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d  iki:tiddler-get-
21c0: 72 65 76 20 20 20 20 20 20 20 20 20 20 76 65 63  rev          vec
21d0: 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66  )    (vector-ref
21e0: 20 20 76 65 63 20 32 29 29 0a 28 64 65 66 69 6e    vec 2)).(defin
21f0: 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a  e-inline (twiki:
2200: 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61 74 2d  tiddler-get-dat-
2210: 69 64 20 20 20 20 20 20 20 76 65 63 29 20 20 20  id       vec)   
2220: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20 76 65   (vector-ref  ve
2230: 63 20 33 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e  c 3)).(define-in
2240: 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64  line (twiki:tidd
2250: 6c 65 72 2d 67 65 74 2d 63 72 65 61 74 65 64 5f  ler-get-created_
2260: 6f 6e 20 20 20 76 65 63 29 20 20 20 20 28 76 65  on   vec)    (ve
2270: 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20 34 29  ctor-ref  vec 4)
2280: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
2290: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
22a0: 67 65 74 2d 6f 77 6e 65 72 5f 69 64 20 20 20 20  get-owner_id    
22b0: 20 76 65 63 29 20 20 20 20 28 76 65 63 74 6f 72   vec)    (vector
22c0: 2d 72 65 66 20 20 76 65 63 20 35 29 29 0a 3b 3b  -ref  vec 5)).;;
22d0: 20 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20   (define-inline 
22e0: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67  (twiki:tiddler-g
22f0: 65 74 2d 64 61 74 2d 74 79 70 65 20 20 20 20 20  et-dat-type     
2300: 76 65 63 29 20 20 20 20 28 76 65 63 74 6f 72 2d  vec)    (vector-
2310: 72 65 66 20 20 76 65 63 20 36 29 29 0a 0a 28 64  ref  vec 6))..(d
2320: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77  efine-inline (tw
2330: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d  iki:tiddler-set-
2340: 69 64 21 20 20 20 20 20 20 20 20 20 20 76 65 63  id!          vec
2350: 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74   val)(vector-set
2360: 21 20 76 65 63 20 30 20 76 61 6c 29 20 76 65 63  ! vec 0 val) vec
2370: 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65  ).(define-inline
2380: 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d   (twiki:tiddler-
2390: 73 65 74 2d 6e 61 6d 65 21 20 20 20 20 20 20 20  set-name!       
23a0: 20 76 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72   vec val)(vector
23b0: 2d 73 65 74 21 20 76 65 63 20 31 20 76 61 6c 29  -set! vec 1 val)
23c0: 20 76 65 63 29 0a 28 64 65 66 69 6e 65 2d 69 6e   vec).(define-in
23d0: 6c 69 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64  line (twiki:tidd
23e0: 6c 65 72 2d 73 65 74 2d 72 65 76 21 20 20 20 20  ler-set-rev!    
23f0: 20 20 20 20 20 76 65 63 20 76 61 6c 29 28 76 65       vec val)(ve
2400: 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20 32 20  ctor-set! vec 2 
2410: 76 61 6c 29 20 76 65 63 29 0a 28 64 65 66 69 6e  val) vec).(defin
2420: 65 2d 69 6e 6c 69 6e 65 20 28 74 77 69 6b 69 3a  e-inline (twiki:
2430: 74 69 64 64 6c 65 72 2d 73 65 74 2d 64 61 74 2d  tiddler-set-dat-
2440: 69 64 21 20 20 20 20 20 20 76 65 63 20 76 61 6c  id!      vec val
2450: 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65  )(vector-set! ve
2460: 63 20 33 20 76 61 6c 29 20 76 65 63 29 0a 28 64  c 3 val) vec).(d
2470: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 74 77  efine-inline (tw
2480: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 74 2d  iki:tiddler-set-
2490: 63 72 65 61 74 65 64 5f 6f 6e 21 20 20 76 65 63  created_on!  vec
24a0: 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74   val)(vector-set
24b0: 21 20 76 65 63 20 34 20 76 61 6c 29 20 76 65 63  ! vec 4 val) vec
24c0: 29 0a 3b 3b 20 28 64 65 66 69 6e 65 2d 69 6e 6c  ).;; (define-inl
24d0: 69 6e 65 20 28 74 77 69 6b 69 3a 74 69 64 64 6c  ine (twiki:tiddl
24e0: 65 72 2d 73 65 74 2d 6f 77 6e 65 72 5f 69 64 21  er-set-owner_id!
24f0: 20 20 20 20 76 65 63 20 76 61 6c 29 28 76 65 63      vec val)(vec
2500: 74 6f 72 2d 73 65 74 21 20 76 65 63 20 35 20 76  tor-set! vec 5 v
2510: 61 6c 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  al))..;;========
2520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
2560: 3b 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 64  ; Routines for d
2570: 69 73 70 6c 61 79 69 6e 67 2c 20 65 64 69 74 69  isplaying, editi
2580: 6e 67 2c 20 62 72 6f 77 73 69 6e 67 20 65 74 63  ng, browsing etc
2590: 2e 20 74 69 64 64 6c 65 72 73 0a 3b 3b 3d 3d 3d  . tiddlers.;;===
25a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25e0: 3d 3d 3d 09 0a 0a 3b 3b 20 73 68 6f 75 6c 64 20  ===...;; should 
25f0: 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 74  change this to t
2600: 61 6b 65 20 61 20 74 69 64 64 6c 65 72 20 73 74  ake a tiddler st
2610: 72 75 63 74 75 72 65 3f 0a 28 64 65 66 69 6e 65  ructure?.(define
2620: 20 28 74 77 69 6b 69 3a 76 69 65 77 20 64 61 74   (twiki:view dat
2630: 20 20 74 6b 65 79 20 77 69 64 20 74 69 64 64 6c    tkey wid tiddl
2640: 65 72 20 77 69 6b 69 29 20 3b 3b 20 63 6c 6f 73  er wiki) ;; clos
2650: 65 2c 20 63 6c 6f 73 65 20 6f 74 68 65 72 73 2c  e, close others,
2660: 20 65 64 69 74 2c 20 6d 6f 72 65 0a 20 20 28 6c   edit, more.  (l
2670: 65 74 20 28 28 69 73 2d 6e 6f 74 2d 6d 61 69 6e  et ((is-not-main
2680: 20 20 28 6e 6f 74 20 28 65 71 75 61 6c 3f 20 22    (not (equal? "
2690: 4d 61 69 6e 4d 65 6e 75 22 20 28 74 77 69 6b 69  MainMenu" (twiki
26a0: 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 6e 61 6d  :tiddler-get-nam
26b0: 65 20 74 69 64 64 6c 65 72 29 29 29 29 0a 09 28  e tiddler))))..(
26c0: 65 64 69 74 2d 61 6c 6c 6f 77 65 64 20 28 6d 65  edit-allowed (me
26d0: 6d 62 65 72 20 27 77 20 28 74 77 69 6b 69 3a 77  mber 'w (twiki:w
26e0: 69 6b 69 2d 67 65 74 2d 70 65 72 6d 73 20 77 69  iki-get-perms wi
26f0: 6b 69 29 29 29 29 0a 20 20 20 20 28 73 3a 64 69  ki)))).    (s:di
2700: 76 20 27 63 6c 61 73 73 20 22 6e 6f 64 65 22 20  v 'class "node" 
2710: 3b 3b 20 22 6e 6f 64 65 22 0a 09 20 20 20 3b 3b  ;; "node"..   ;;
2720: 20 28 73 3a 68 72 20 20 22 20 22 29 0a 09 20 20   (s:hr  " ")..  
2730: 20 3b 3b 20 28 73 3a 70 20 27 63 6c 61 73 73 20   ;; (s:p 'class 
2740: 28 69 66 20 69 73 2d 6e 6f 74 2d 6d 61 69 6e 20  (if is-not-main 
2750: 22 66 6c 6f 61 74 2d 6c 65 66 74 22 20 22 66 6c  "float-left" "fl
2760: 6f 61 74 2d 6c 65 66 74 2d 6d 65 6e 75 22 29 0a  oat-left-menu").
2770: 09 3b 3b 20 20 20 20 28 73 3a 70 20 27 63 6c 61  .;;    (s:p 'cla
2780: 73 73 20 28 69 66 20 69 73 2d 6e 6f 74 2d 6d 61  ss (if is-not-ma
2790: 69 6e 20 22 66 6c 6f 61 74 2d 6c 65 66 74 22 20  in "float-left" 
27a0: 22 66 6c 6f 61 74 2d 72 69 67 68 74 22 29 0a 09  "float-right")..
27b0: 3b 3b 20 09 28 69 66 20 69 73 2d 6e 6f 74 2d 6d  ;; .(if is-not-m
27c0: 61 69 6e 0a 09 3b 3b 20 09 20 20 20 20 28 73 3a  ain..;; .    (s:
27d0: 62 69 67 20 28 73 3a 62 20 28 74 77 69 6b 69 3a  big (s:b (twiki:
27e0: 74 69 64 64 6c 65 72 2d 67 65 74 2d 6e 61 6d 65  tiddler-get-name
27f0: 20 74 69 64 64 6c 65 72 29 29 29 0a 09 3b 3b 20   tiddler)))..;; 
2800: 09 20 20 20 20 28 73 3a 73 6d 61 6c 6c 20 3b 3b  .    (s:small ;;
2810: 20 28 73 3a 62 20 22 4d 65 6e 75 22 29 0a 09 3b   (s:b "Menu")..;
2820: 3b 20 09 09 20 20 20 20 20 28 69 66 20 65 64 69  ; ..     (if edi
2830: 74 2d 61 6c 6c 6f 77 65 64 0a 09 3b 3b 20 09 09  t-allowed..;; ..
2840: 09 20 28 6c 69 73 74 20 22 28 22 0a 09 3b 3b 20  . (list "("..;; 
2850: 09 09 09 20 20 20 20 20 20 20 28 73 3a 61 20 22  ...       (s:a "
2860: 65 64 69 74 22 20 27 68 72 65 66 0a 09 3b 3b 20  edit" 'href..;; 
2870: 09 09 09 09 20 20 20 20 28 73 3a 6c 69 6e 6b 2d  ....    (s:link-
2880: 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69  to (twiki:get-li
2890: 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65  nk-back-to-curre
28a0: 6e 74 29 0a 09 3b 3b 20 09 09 09 09 09 20 20 20  nt)..;; .....   
28b0: 20 20 20 20 27 65 64 69 74 5f 74 69 64 64 6c 65      'edit_tiddle
28c0: 72 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72  r (twiki:tiddler
28d0: 2d 67 65 74 2d 69 64 20 74 69 64 64 6c 65 72 29  -get-id tiddler)
28e0: 29 29 20 22 29 22 29 0a 09 3b 3b 20 09 09 09 20  )) ")")..;; ... 
28f0: 27 28 29 29 29 29 29 0a 09 20 20 20 28 73 3a 64  '()))))..   (s:d
2900: 69 76 20 27 63 6c 61 73 73 20 22 74 69 64 64 6c  iv 'class "tiddl
2910: 65 72 22 0a 09 20 20 20 20 28 73 3a 70 20 27 63  er"..    (s:p 'c
2920: 6c 61 73 73 20 22 74 69 64 64 6c 65 72 63 6f 6d  lass "tiddlercom
2930: 6d 61 6e 64 73 22 0a 09 09 20 20 20 20 28 69 66  mands"...    (if
2940: 20 28 65 71 75 61 6c 3f 20 22 4d 61 69 6e 4d 65   (equal? "MainMe
2950: 6e 75 22 20 28 74 77 69 6b 69 3a 74 69 64 64 6c  nu" (twiki:tiddl
2960: 65 72 2d 67 65 74 2d 6e 61 6d 65 20 74 69 64 64  er-get-name tidd
2970: 6c 65 72 29 29 0a 09 09 09 28 69 66 20 65 64 69  ler))....(if edi
2980: 74 2d 61 6c 6c 6f 77 65 64 0a 09 09 09 20 20 20  t-allowed....   
2990: 20 28 6c 69 73 74 20 28 73 3a 61 20 22 65 64 69   (list (s:a "edi
29a0: 74 22 20 27 68 72 65 66 0a 09 09 09 09 20 20 20  t" 'href.....   
29b0: 20 20 20 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28      (s:link-to (
29c0: 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62  twiki:get-link-b
29d0: 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 0a  ack-to-current).
29e0: 09 09 09 09 09 09 20 20 27 65 64 69 74 5f 74 69  ......  'edit_ti
29f0: 64 64 6c 65 72 20 28 74 77 69 6b 69 3a 74 69 64  ddler (twiki:tid
2a00: 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64  dler-get-id tidd
2a10: 6c 65 72 29 29 29 29 0a 09 09 09 20 20 20 20 27  ler))))....    '
2a20: 28 29 29 0a 09 09 09 28 6c 69 73 74 20 0a 09 09  ())....(list ...
2a30: 09 20 28 73 3a 61 20 22 63 6c 6f 73 65 22 20 27  . (s:a "close" '
2a40: 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20  href (s:link-to 
2a50: 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d  (twiki:get-link-
2a60: 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29  back-to-current)
2a70: 20 27 63 6c 6f 73 65 5f 74 69 64 64 6c 65 72 20   'close_tiddler 
2a80: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67  (twiki:tiddler-g
2a90: 65 74 2d 69 64 20 74 69 64 64 6c 65 72 29 29 29  et-id tiddler)))
2aa0: 20 22 2e 22 0a 09 09 09 20 28 73 3a 61 20 22 63   ".".... (s:a "c
2ab0: 6c 6f 73 65 20 6f 74 68 65 72 73 22 20 27 68 72  lose others" 'hr
2ac0: 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74  ef (s:link-to (t
2ad0: 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61  wiki:get-link-ba
2ae0: 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27  ck-to-current) '
2af0: 63 6c 6f 73 65 5f 6f 74 68 65 72 5f 74 69 64 64  close_other_tidd
2b00: 6c 65 72 73 20 28 74 77 69 6b 69 3a 74 69 64 64  lers (twiki:tidd
2b10: 6c 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64 6c  ler-get-id tiddl
2b20: 65 72 29 29 29 20 22 2e 22 0a 09 09 09 20 28 69  er))) ".".... (i
2b30: 66 20 65 64 69 74 2d 61 6c 6c 6f 77 65 64 0a 09  f edit-allowed..
2b40: 09 09 20 20 20 20 20 28 73 3a 61 20 22 65 64 69  ..     (s:a "edi
2b50: 74 22 20 20 27 68 72 65 66 20 28 73 3a 6c 69 6e  t"  'href (s:lin
2b60: 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d  k-to (twiki:get-
2b70: 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72  link-back-to-cur
2b80: 72 65 6e 74 29 20 27 65 64 69 74 5f 74 69 64 64  rent) 'edit_tidd
2b90: 6c 65 72 20 28 74 77 69 6b 69 3a 74 69 64 64 6c  ler (twiki:tiddl
2ba0: 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64 6c 65  er-get-id tiddle
2bb0: 72 29 29 29 0a 09 09 09 20 20 20 20 20 27 28 29  r)))....     '()
2bc0: 29 29 29 29 0a 09 20 20 20 20 3b 3b 20 28 73 3a  ))))..    ;; (s:
2bd0: 70 20 27 63 6c 61 73 73 20 22 74 69 64 64 6c 65  p 'class "tiddle
2be0: 72 2d 73 6b 69 70 2d 70 61 72 22 20 22 2d 22 29  r-skip-par" "-")
2bf0: 0a 09 20 20 20 20 3b 3b 20 28 73 3a 70 20 22 2e  ..    ;; (s:p ".
2c00: 22 29 0a 09 20 20 20 20 3b 3b 20 28 73 3a 70 20  ")..    ;; (s:p 
2c10: 20 28 74 77 69 6b 69 3a 64 61 74 2d 3e 68 74 6d   (twiki:dat->htm
2c20: 6c 20 64 61 74 20 77 69 6b 69 29 20 28 73 3a 62  l dat wiki) (s:b
2c30: 72 29 29 29 29 29 29 0a 09 20 20 20 20 28 73 3a  r))))))..    (s:
2c40: 70 20 28 74 77 69 6b 69 3a 64 61 74 2d 3e 68 74  p (twiki:dat->ht
2c50: 6d 6c 20 64 61 74 20 77 69 6b 69 29 29 29 29 29  ml dat wiki)))))
2c60: 29 0a 3b 3b 20 09 20 20 20 20 20 28 6c 65 74 20  ).;; .     (let 
2c70: 28 28 74 77 68 74 6d 6c 20 28 74 77 69 6b 69 3a  ((twhtml (twiki:
2c80: 64 61 74 2d 3e 68 74 6d 6c 20 64 61 74 20 77 69  dat->html dat wi
2c90: 6b 69 29 29 29 20 3b 3b 20 6c 65 74 27 73 20 74  ki))) ;; let's t
2ca0: 72 79 20 74 6f 20 66 6f 72 63 65 20 61 20 6d 69  ry to force a mi
2cb0: 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 70 61 72  nimum of one par
2cc0: 61 67 72 61 70 68 0a 3b 3b 20 09 20 20 20 20 20  agraph.;; .     
2cd0: 20 28 69 66 20 28 3c 20 28 6c 65 6e 67 74 68 20   (if (< (length 
2ce0: 74 77 68 74 6d 6c 29 20 32 29 0a 3b 3b 20 09 09  twhtml) 2).;; ..
2cf0: 20 20 28 73 3a 70 20 74 77 68 74 6d 6c 20 28 73    (s:p twhtml (s
2d00: 3a 62 72 29 29 0a 3b 3b 20 09 09 20 20 74 77 68  :br)).;; ..  twh
2d10: 74 6d 6c 29 29 29 29 29 29 0a 0a 28 64 65 66 69  tml))))))..(defi
2d20: 6e 65 20 28 74 77 69 6b 69 3a 76 69 65 77 2d 74  ne (twiki:view-t
2d30: 69 64 64 6c 65 72 20 64 62 20 20 74 6b 65 79 20  iddler db  tkey 
2d40: 77 69 64 20 74 69 64 64 6c 65 72 20 77 69 6b 69  wid tiddler wiki
2d50: 29 0a 20 20 28 6c 65 74 2a 20 28 28 64 61 74 2d  ).  (let* ((dat-
2d60: 69 64 20 28 74 77 69 6b 69 3a 74 69 64 64 6c 65  id (twiki:tiddle
2d70: 72 2d 67 65 74 2d 64 61 74 2d 69 64 20 74 69 64  r-get-dat-id tid
2d80: 64 6c 65 72 29 29 0a 09 20 28 64 61 74 20 20 20  dler)).. (dat   
2d90: 20 28 74 77 69 6b 69 3a 67 65 74 2d 64 61 74 20   (twiki:get-dat 
2da0: 64 62 20 64 61 74 2d 69 64 29 29 0a 09 20 28 74  db dat-id)).. (t
2db0: 6e 75 6d 20 20 20 28 74 77 69 6b 69 3a 74 69 64  num   (twiki:tid
2dc0: 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 69 64 64  dler-get-id tidd
2dd0: 6c 65 72 29 29 29 0a 20 20 20 20 3b 3b 20 28 73  ler))).    ;; (s
2de0: 3a 6c 6f 67 20 22 74 77 69 64 3a 20 22 20 64 61  :log "twid: " da
2df0: 74 2d 69 64 20 22 20 64 61 74 3a 20 22 20 64 61  t-id " dat: " da
2e00: 74 29 0a 20 20 20 20 28 74 77 69 6b 69 3a 76 69  t).    (twiki:vi
2e10: 65 77 20 64 61 74 20 20 74 6b 65 79 20 77 69 64  ew dat  tkey wid
2e20: 20 74 69 64 64 6c 65 72 20 77 69 6b 69 29 29 29   tiddler wiki)))
2e30: 0a 0a 3b 3b 20 63 61 6c 6c 20 77 69 74 68 20 70  ..;; call with p
2e40: 61 72 61 6d 20 3d 3e 20 61 63 74 69 6f 6e 2d 6e  aram => action-n
2e50: 61 6d 65 2d 6b 65 79 20 65 2e 67 2e 20 73 61 76  ame-key e.g. sav
2e60: 65 2d 62 57 46 70 62 67 5f 5f 2d 61 47 56 73 62  e-bWFpbg__-aGVsb
2e70: 47 38 67 62 6e 56 79 63 32 55 5f 20 28 73 61 76  G8gbnVyc2U_ (sav
2e80: 65 20 6d 61 69 6e 20 22 68 65 6c 6c 6f 20 6e 75  e main "hello nu
2e90: 72 73 65 22 29 0a 3b 3b 20 74 68 69 73 20 6f 6e  rse").;; this on
2ea0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2eb0: 20 61 6e 20 65 64 69 74 20 66 6f 72 6d 20 69 73   an edit form is
2ec0: 20 73 75 62 6d 69 74 74 65 64 20 28 69 2e 65 2e   submitted (i.e.
2ed0: 20 50 4f 53 54 29 0a 28 64 65 66 69 6e 65 20 28   POST).(define (
2ee0: 74 77 69 6b 69 3a 61 63 74 69 6f 6e 20 70 61 72  twiki:action par
2ef0: 61 6d 73 29 0a 20 20 28 69 66 20 28 61 6e 64 20  ams).  (if (and 
2f00: 28 6c 69 73 74 3f 20 70 61 72 61 6d 73 29 0a 09  (list? params)..
2f10: 20 20 20 28 3e 20 28 6c 65 6e 67 74 68 20 70 61     (> (length pa
2f20: 72 61 6d 73 29 20 30 29 29 0a 20 20 20 20 20 20  rams) 0)).      
2f30: 28 6c 65 74 2a 20 28 28 63 6d 64 6c 6e 20 28 73  (let* ((cmdln (s
2f40: 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 63 61 72  tring-split (car
2f50: 20 70 61 72 61 6d 73 29 20 22 2d 22 29 29 0a 09   params) "-"))..
2f60: 20 20 20 20 20 28 63 6d 64 20 20 20 28 73 74 72       (cmd   (str
2f70: 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 63 61 72  ing->symbol (car
2f80: 20 63 6d 64 6c 6e 29 29 29 0a 09 20 20 20 20 20   cmdln)))..     
2f90: 28 74 6b 65 79 20 20 28 74 77 69 6b 69 3a 77 65  (tkey  (twiki:we
2fa0: 62 36 34 64 65 63 20 28 63 61 64 64 72 20 63 6d  b64dec (caddr cm
2fb0: 64 6c 6e 29 29 29 0a 09 20 20 20 20 20 28 77 69  dln)))..     (wi
2fc0: 64 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d  d   (string->num
2fd0: 62 65 72 20 28 63 61 64 72 20 63 6d 64 6c 6e 29  ber (cadr cmdln)
2fe0: 29 29 0a 09 20 20 20 20 20 28 74 64 62 20 20 20  ))..     (tdb   
2ff0: 28 74 77 69 6b 69 3a 6f 70 65 6e 2d 64 62 20 74  (twiki:open-db t
3000: 6b 65 79 29 29 29 0a 09 28 73 3a 6c 6f 67 20 22  key)))..(s:log "
3010: 63 6d 64 6c 6e 3a 20 22 20 63 6d 64 6c 6e 20 22  cmdln: " cmdln "
3020: 20 63 6d 64 3a 20 22 20 63 6d 64 20 22 20 74 6b   cmd: " cmd " tk
3030: 65 79 3a 20 22 20 74 6b 65 79 20 22 20 77 69 64  ey: " tkey " wid
3040: 3a 20 22 20 77 69 64 29 0a 09 28 63 61 73 65 20  : " wid)..(case 
3050: 63 6d 64 0a 09 20 20 28 28 73 61 76 65 29 0a 09  cmd..  ((save)..
3060: 20 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 63     (twiki:save-c
3070: 75 72 72 2d 74 69 64 64 6c 65 72 20 74 64 62 20  urr-tiddler tdb 
3080: 77 69 64 29 29 0a 09 20 20 28 28 73 61 76 65 70  wid))..  ((savep
3090: 69 63 29 0a 09 20 20 20 28 73 3a 6c 6f 67 20 22  ic)..   (s:log "
30a0: 74 77 69 6b 69 3a 61 63 74 69 6f 6e 20 67 6f 74  twiki:action got
30b0: 20 74 6f 20 73 61 76 65 70 69 63 22 29 0a 09 20   to savepic").. 
30c0: 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 70 69    (twiki:save-pi
30d0: 63 2d 66 72 6f 6d 2d 66 6f 72 6d 20 74 64 62 20  c-from-form tdb 
30e0: 77 69 64 29 29 0a 09 20 20 28 28 63 61 6e 63 65  wid))..  ((cance
30f0: 6c 29 20 3b 3b 20 64 65 70 72 65 63 61 74 65 64  l) ;; deprecated
3100: 2e 20 55 73 65 20 61 20 6c 69 6e 6b 20 66 6f 72  . Use a link for
3110: 20 74 68 69 73 20 28 69 2e 65 20 69 6e 20 74 68   this (i.e in th
3120: 65 20 74 77 69 6b 69 3a 74 77 69 6b 69 20 70 72  e twiki:twiki pr
3130: 6f 63 0a 09 20 20 20 28 73 3a 64 65 6c 21 20 28  oc..   (s:del! (
3140: 63 6f 6e 63 20 22 43 55 52 52 45 4e 54 5f 54 57  conc "CURRENT_TW
3150: 49 44 4c 45 52 5f 55 4e 44 45 52 5f 45 44 49 54  IDLER_UNDER_EDIT
3160: 3a 22 20 77 69 64 29 29 0a 09 20 20 20 29 29 29  :" wid))..   )))
3170: 29 29 0a 0a 3b 3b 20 67 65 6e 65 72 61 74 65 20  ))..;; generate 
3180: 61 20 66 6f 72 6d 20 66 6f 72 20 65 64 69 74 69  a form for editi
3190: 6e 67 20 61 20 74 77 69 64 64 6c 65 72 20 74 6e  ng a twiddler tn
31a0: 75 6d 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  um.(define (twik
31b0: 69 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 20 64  i:edit-tiddler d
31c0: 62 20 74 6b 65 79 20 77 69 64 20 74 6e 75 6d 29  b tkey wid tnum)
31d0: 0a 20 20 28 73 3a 6c 6f 67 20 22 74 77 69 6b 69  .  (s:log "twiki
31e0: 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 3a 20 74  :edit-tiddler: t
31f0: 6b 65 79 3d 22 20 74 6b 65 79 20 22 20 77 69 64  key=" tkey " wid
3200: 3a 20 22 20 77 69 64 29 0a 20 20 28 6c 65 74 2a  : " wid).  (let*
3210: 20 28 28 65 6e 63 2d 6b 65 79 20 20 28 74 77 69   ((enc-key  (twi
3220: 6b 69 3a 77 65 62 36 34 65 6e 63 20 74 6b 65 79  ki:web64enc tkey
3230: 29 29 0a 09 20 28 74 69 64 64 61 74 73 20 20 28  )).. (tiddats  (
3240: 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65  twiki:get-tiddle
3250: 72 73 2d 62 79 2d 6e 75 6d 20 64 62 20 77 69 64  rs-by-num db wid
3260: 20 28 6c 69 73 74 20 74 6e 75 6d 29 29 29 29 0a   (list tnum)))).
3270: 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74      (if (null? t
3280: 69 64 64 61 74 73 29 0a 09 28 6c 65 74 2a 20 28  iddats)..(let* (
3290: 28 74 69 64 20 20 20 20 30 29 0a 09 20 20 20 20  (tid    0)..    
32a0: 20 20 20 28 64 61 74 2d 69 64 20 30 29 29 0a 09     (dat-id 0))..
32b0: 20 20 28 73 3a 73 65 74 21 20 22 74 77 69 6b 69    (s:set! "twiki
32c0: 5f 74 69 74 6c 65 22 20 22 22 29 0a 09 20 20 28  _title" "")..  (
32d0: 73 3a 73 65 74 21 20 22 74 77 69 6b 69 5f 62 6f  s:set! "twiki_bo
32e0: 64 79 22 20 20 22 22 29 29 0a 09 28 6c 65 74 2a  dy"  ""))..(let*
32f0: 20 28 28 74 69 64 20 20 20 20 28 63 61 72 20 74   ((tid    (car t
3300: 69 64 64 61 74 73 29 29 0a 09 20 20 20 20 20 20  iddats))..      
3310: 20 28 64 61 74 2d 69 64 20 28 74 77 69 6b 69 3a   (dat-id (twiki:
3320: 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61 74 2d  tiddler-get-dat-
3330: 69 64 20 74 69 64 29 29 29 0a 09 20 20 3b 3b 20  id tid)))..  ;; 
3340: 28 73 3a 6c 6f 67 20 22 74 69 64 3a 20 22 20 74  (s:log "tid: " t
3350: 69 64 20 22 20 64 61 74 2d 69 64 3a 20 22 20 64  id " dat-id: " d
3360: 61 74 2d 69 64 29 0a 09 20 20 28 73 3a 73 65 74  at-id)..  (s:set
3370: 21 20 22 74 77 69 6b 69 5f 74 69 74 6c 65 22 20  ! "twiki_title" 
3380: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67  (twiki:tiddler-g
3390: 65 74 2d 6e 61 6d 65 20 74 69 64 29 29 0a 09 20  et-name tid)).. 
33a0: 20 28 73 3a 73 65 74 21 20 22 74 77 69 6b 69 5f   (s:set! "twiki_
33b0: 62 6f 64 79 22 20 20 28 74 77 69 6b 69 3a 67 65  body"  (twiki:ge
33c0: 74 2d 64 61 74 20 64 62 20 64 61 74 2d 69 64 29  t-dat db dat-id)
33d0: 29 29 29 0a 20 20 20 20 28 73 3a 66 6f 72 6d 20  ))).    (s:form 
33e0: 27 61 63 74 69 6f 6e 20 28 73 3a 6c 69 6e 6b 2d  'action (s:link-
33f0: 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69  to (twiki:get-li
3400: 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65  nk-back-to-curre
3410: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 20 27 61  nt)....       'a
3420: 63 74 69 6f 6e 20 28 63 6f 6e 63 20 22 74 77 69  ction (conc "twi
3430: 6b 69 2e 73 61 76 65 2d 22 20 28 6e 75 6d 62 65  ki.save-" (numbe
3440: 72 2d 3e 73 74 72 69 6e 67 20 77 69 64 29 20 22  r->string wid) "
3450: 2d 22 20 65 6e 63 2d 6b 65 79 29 29 0a 09 20 20  -" enc-key))..  
3460: 20 20 27 6d 65 74 68 6f 64 20 22 70 6f 73 74 22    'method "post"
3470: 20 3b 3b 20 27 74 77 69 6b 69 6e 61 6d 65 20 74   ;; 'twikiname t
3480: 6b 65 79 20 3b 3b 20 64 6f 6e 65 2c 20 63 61 6e  key ;; done, can
3490: 63 65 6c 2c 20 64 65 6c 65 74 65 0a 09 20 20 20  cel, delete..   
34a0: 20 28 73 3a 69 6e 70 75 74 20 27 74 79 70 65 20   (s:input 'type 
34b0: 22 73 75 62 6d 69 74 22 20 20 20 27 6e 61 6d 65  "submit"   'name
34c0: 20 22 66 6f 72 6d 2d 6e 61 6d 65 22 20 27 76 61   "form-name" 'va
34d0: 6c 75 65 20 22 73 61 76 65 22 20 27 74 77 69 6b  lue "save" 'twik
34e0: 69 6e 61 6d 65 20 74 6b 65 79 29 0a 09 20 20 20  iname tkey)..   
34f0: 20 3b 3b 20 28 73 3a 61 20 22 64 6f 6e 65 22 20   ;; (s:a "done" 
3500: 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f  'href (s:link-to
3510: 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b   (twiki:get-link
3520: 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74  -back-to-current
3530: 29 20 27 73 61 76 65 5f 74 6d 65 6e 75 20 74 6e  ) 'save_tmenu tn
3540: 75 6d 29 29 0a 09 20 20 20 20 28 73 3a 61 20 22  um))..    (s:a "
3550: 63 61 6e 63 65 6c 22 20 27 68 72 65 66 20 28 73  cancel" 'href (s
3560: 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a  :link-to (twiki:
3570: 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f  get-link-back-to
3580: 2d 63 75 72 72 65 6e 74 29 20 27 63 61 6e 63 65  -current) 'cance
3590: 6c 5f 74 65 64 69 74 20 74 6e 75 6d 29 29 20 22  l_tedit tnum)) "
35a0: 2e 22 0a 09 20 20 20 20 28 73 3a 61 20 22 64 65  ."..    (s:a "de
35b0: 6c 65 74 65 22 20 27 68 72 65 66 20 28 73 3a 6c  lete" 'href (s:l
35c0: 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65  ink-to (twiki:ge
35d0: 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63  t-link-back-to-c
35e0: 75 72 72 65 6e 74 29 20 27 64 65 6c 65 74 65 5f  urrent) 'delete_
35f0: 74 69 64 64 6c 65 72 20 74 6e 75 6d 29 29 28 73  tiddler tnum))(s
3600: 3a 62 72 29 0a 09 20 20 20 20 28 73 3a 69 6e 70  :br)..    (s:inp
3610: 75 74 2d 70 72 65 73 65 72 76 65 20 27 74 79 70  ut-preserve 'typ
3620: 65 20 22 74 65 78 74 22 20 27 6e 61 6d 65 20 22  e "text" 'name "
3630: 74 77 69 6b 69 5f 74 69 74 6c 65 22 20 27 73 69  twiki_title" 'si
3640: 7a 65 20 22 35 38 22 20 27 6d 61 78 6c 65 6e 67  ze "58" 'maxleng
3650: 74 68 20 22 31 35 30 22 29 0a 09 20 20 20 20 28  th "150")..    (
3660: 73 3a 74 65 78 74 61 72 65 61 2d 70 72 65 73 65  s:textarea-prese
3670: 72 76 65 20 27 74 79 70 65 20 22 74 65 78 74 61  rve 'type "texta
3680: 72 65 61 22 20 27 6e 61 6d 65 20 22 74 77 69 6b  rea" 'name "twik
3690: 69 5f 62 6f 64 79 22 20 27 72 6f 77 73 20 22 31  i_body" 'rows "1
36a0: 30 22 20 27 63 6f 6c 73 20 22 36 35 22 29 0a 09  0" 'cols "65")..
36b0: 20 20 20 20 28 73 3a 70 20 22 54 61 67 73 22 20      (s:p "Tags" 
36c0: 28 73 3a 69 6e 70 75 74 2d 70 72 65 73 65 72 76  (s:input-preserv
36d0: 65 20 27 74 79 70 65 20 22 74 65 78 74 22 20 27  e 'type "text" '
36e0: 6e 61 6d 65 20 22 74 77 69 6b 69 5f 74 61 67 73  name "twiki_tags
36f0: 22 20 27 73 69 7a 65 20 22 35 35 22 20 27 6d 61  " 'size "55" 'ma
3700: 78 6c 65 6e 67 74 68 20 22 31 35 30 22 29 29 29  xlength "150")))
3710: 29 29 0a 0a 3b 3b 20 73 61 76 65 20 61 20 74 69  ))..;; save a ti
3720: 64 64 6c 65 72 20 74 6f 20 74 68 65 20 64 62 20  ddler to the db 
3730: 66 6f 72 20 74 68 65 20 74 77 69 6b 69 20 74 77  for the twiki tw
3740: 69 6b 2c 20 67 65 74 74 69 6e 67 20 64 61 74 61  ik, getting data
3750: 20 66 72 6f 6d 20 74 68 65 20 49 4e 50 55 54 0a   from the INPUT.
3760: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 73  (define (twiki:s
3770: 61 76 65 2d 63 75 72 72 2d 74 69 64 64 6c 65 72  ave-curr-tiddler
3780: 20 74 64 62 20 77 69 64 29 0a 20 20 28 66 6f 72   tdb wid).  (for
3790: 6d 64 61 74 3a 70 72 69 6e 74 61 6c 6c 20 28 73  mdat:printall (s
37a0: 6c 6f 74 2d 72 65 66 20 73 3a 73 65 73 73 69 6f  lot-ref s:sessio
37b0: 6e 20 27 66 6f 72 6d 64 61 74 29 20 73 3a 6c 6f  n 'formdat) s:lo
37c0: 67 29 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61  g).  (let* ((hea
37d0: 64 69 6e 67 20 28 73 3a 67 65 74 2d 69 6e 70 75  ding (s:get-inpu
37e0: 74 20 27 74 77 69 6b 69 5f 74 69 74 6c 65 29 29  t 'twiki_title))
37f0: 0a 09 20 28 62 6f 64 79 20 20 20 20 28 73 3a 67  .. (body    (s:g
3800: 65 74 2d 69 6e 70 75 74 20 27 74 77 69 6b 69 5f  et-input 'twiki_
3810: 62 6f 64 79 29 29 0a 09 20 28 74 61 67 73 20 20  body)).. (tags  
3820: 20 20 28 73 3a 67 65 74 2d 69 6e 70 75 74 20 27    (s:get-input '
3830: 74 77 69 6b 69 5f 74 61 67 73 29 29 0a 09 20 28  twiki_tags)).. (
3840: 75 69 64 20 20 20 20 20 28 74 77 69 6b 69 3a 67  uid     (twiki:g
3850: 65 74 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20  et-id))).    ;; 
3860: 28 73 3a 6c 6f 67 20 22 74 77 69 6b 69 3a 73 61  (s:log "twiki:sa
3870: 76 65 2d 63 75 72 72 2d 74 69 64 64 6c 65 72 20  ve-curr-tiddler 
3880: 68 65 61 64 69 6e 67 3a 20 22 20 68 65 61 64 69  heading: " headi
3890: 6e 67 20 22 20 62 6f 64 79 3a 20 22 20 62 6f 64  ng " body: " bod
38a0: 79 20 22 20 74 61 67 73 3a 20 22 20 74 61 67 73  y " tags: " tags
38b0: 29 0a 20 20 20 20 28 73 3a 73 65 74 21 20 27 74  ).    (s:set! 't
38c0: 77 69 6b 69 5f 74 69 74 6c 65 20 68 65 61 64 69  wiki_title headi
38d0: 6e 67 29 0a 20 20 20 20 28 69 66 20 62 6f 64 79  ng).    (if body
38e0: 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 73 65 74  ..(begin..  (set
38f0: 21 20 62 6f 64 79 20 28 73 74 72 69 6e 67 2d 63  ! body (string-c
3900: 68 6f 6d 70 20 62 6f 64 79 29 29 0a 09 20 20 28  homp body))..  (
3910: 73 3a 73 65 74 21 20 27 74 77 69 6b 69 5f 62 6f  s:set! 'twiki_bo
3920: 64 79 20 20 62 6f 64 79 29 29 29 0a 20 20 20 20  dy  body))).    
3930: 28 73 3a 73 65 74 21 20 27 74 77 69 6b 69 5f 74  (s:set! 'twiki_t
3940: 61 67 73 20 20 74 61 67 73 29 0a 20 20 20 20 28  ags  tags).    (
3950: 73 3a 64 65 6c 21 20 28 63 6f 6e 63 20 22 43 55  s:del! (conc "CU
3960: 52 52 45 4e 54 5f 54 57 49 44 4c 45 52 5f 55 4e  RRENT_TWIDLER_UN
3970: 44 45 52 5f 45 44 49 54 3a 22 20 77 69 64 29 29  DER_EDIT:" wid))
3980: 0a 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20  .    (let ((res 
3990: 28 74 77 69 6b 69 3a 73 61 76 65 2d 74 69 64 64  (twiki:save-tidd
39a0: 6c 65 72 20 74 64 62 20 68 65 61 64 69 6e 67 20  ler tdb heading 
39b0: 62 6f 64 79 20 74 61 67 73 20 77 69 64 20 75 69  body tags wid ui
39c0: 64 29 29 29 0a 20 20 20 20 20 20 3b 3b 20 4e 6f  d))).      ;; No
39d0: 77 2c 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  w, replace this 
39e0: 74 77 69 64 64 6c 65 72 20 6e 75 6d 62 65 72 20  twiddler number 
39f0: 69 6e 20 74 68 65 20 76 69 65 77 20 6c 69 73 74  in the view list
3a00: 20 77 69 74 68 20 0a 20 20 20 20 20 20 3b 3b 20   with .      ;; 
3a10: 74 68 65 20 6e 65 77 20 6e 75 6d 62 65 72 20 66  the new number f
3a20: 72 6f 6d 20 74 68 65 20 64 62 0a 20 20 20 20 20  rom the db.     
3a30: 20 28 74 77 69 6b 69 3a 6e 6f 72 6d 61 6c 69 7a   (twiki:normaliz
3a40: 65 2d 63 75 72 72 65 6e 74 2d 74 77 69 64 64 6c  e-current-twiddl
3a50: 65 72 73 20 74 64 62 20 77 69 64 29 0a 20 20 20  ers tdb wid).   
3a60: 20 20 20 28 73 3a 64 65 6c 21 20 27 74 77 69 6b     (s:del! 'twik
3a70: 69 5f 74 69 74 6c 65 29 0a 20 20 20 20 20 20 28  i_title).      (
3a80: 73 3a 64 65 6c 21 20 27 74 77 69 6b 69 5f 62 6f  s:del! 'twiki_bo
3a90: 64 79 29 0a 20 20 20 20 20 20 28 73 3a 64 65 6c  dy).      (s:del
3aa0: 21 20 27 74 77 69 6b 69 5f 74 61 67 73 29 0a 20  ! 'twiki_tags). 
3ab0: 20 20 20 20 20 72 65 73 29 0a 20 20 20 20 29 29       res).    ))
3ac0: 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  ..(define (twiki
3ad0: 3a 6e 6f 72 6d 61 6c 69 7a 65 2d 63 75 72 72 65  :normalize-curre
3ae0: 6e 74 2d 74 77 69 64 64 6c 65 72 73 20 74 64 62  nt-twiddlers tdb
3af0: 20 77 69 64 29 0a 20 20 28 6c 65 74 2a 20 28 28   wid).  (let* ((
3b00: 63 76 61 72 20 20 20 20 20 20 28 63 6f 6e 63 20  cvar      (conc 
3b10: 22 43 55 52 52 45 4e 54 5f 54 57 49 44 4c 45 52  "CURRENT_TWIDLER
3b20: 53 3a 22 20 77 69 64 29 29 0a 09 20 28 63 75 72  S:" wid)).. (cur
3b30: 72 2d 73 6c 73 74 20 28 73 3a 67 65 74 20 63 76  r-slst (s:get cv
3b40: 61 72 29 29 0a 09 20 28 63 75 72 72 2d 6c 73 74  ar)).. (curr-lst
3b50: 20 20 28 6d 61 70 20 73 74 72 69 6e 67 2d 3e 6e    (map string->n
3b60: 75 6d 62 65 72 20 28 73 74 72 69 6e 67 2d 73 70  umber (string-sp
3b70: 6c 69 74 20 63 75 72 72 2d 73 6c 73 74 20 22 2c  lit curr-slst ",
3b80: 22 29 29 29 0a 09 20 28 74 64 6c 72 73 20 20 20  "))).. (tdlrs   
3b90: 20 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64    (twiki:get-tid
3ba0: 64 6c 65 72 73 2d 62 79 2d 6e 75 6d 20 74 64 62  dlers-by-num tdb
3bb0: 20 77 69 64 20 63 75 72 72 2d 6c 73 74 29 29 0a   wid curr-lst)).
3bc0: 09 20 28 6e 61 6d 65 73 20 20 20 20 20 28 72 65  . (names     (re
3bd0: 6d 6f 76 65 20 28 6c 61 6d 62 64 61 20 28 74 29  move (lambda (t)
3be0: 28 73 74 72 69 6e 67 3d 3f 20 22 4d 61 69 6e 4d  (string=? "MainM
3bf0: 65 6e 75 22 20 74 29 29 0a 09 09 09 20 20 20 20  enu" t))....    
3c00: 28 6d 61 70 20 74 77 69 6b 69 3a 74 69 64 64 6c  (map twiki:tiddl
3c10: 65 72 2d 67 65 74 2d 6e 61 6d 65 20 74 64 6c 72  er-get-name tdlr
3c20: 73 29 29 29 0a 09 20 28 6e 65 77 6e 75 6d 73 20  s))).. (newnums 
3c30: 20 20 28 6d 61 70 20 74 77 69 6b 69 3a 74 69 64    (map twiki:tid
3c40: 64 6c 65 72 2d 67 65 74 2d 69 64 20 0a 09 09 09  dler-get-id ....
3c50: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 74   (map (lambda (t
3c60: 6e 29 0a 09 09 09 09 28 74 77 69 6b 69 3a 67 65  n).....(twiki:ge
3c70: 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d  t-tiddler-by-nam
3c80: 65 20 74 64 62 20 77 69 64 20 74 6e 29 29 0a 09  e tdb wid tn))..
3c90: 09 09 20 20 20 20 20 20 6e 61 6d 65 73 29 29 29  ..      names)))
3ca0: 29 0a 20 20 20 20 28 73 3a 73 65 74 21 20 63 76  ).    (s:set! cv
3cb0: 61 72 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72  ar (string-inter
3cc0: 73 70 65 72 73 65 20 28 6d 61 70 20 6e 75 6d 62  sperse (map numb
3cd0: 65 72 2d 3e 73 74 72 69 6e 67 20 6e 65 77 6e 75  er->string newnu
3ce0: 6d 73 29 0a 09 09 09 09 20 20 20 20 20 22 2c 22  ms).....     ","
3cf0: 29 29 29 29 0a 20 20 20 20 0a 3b 3b 20 67 65 6e  )))).    .;; gen
3d00: 65 72 69 63 20 73 61 76 65 20 74 69 64 64 6c 65  eric save tiddle
3d10: 72 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  r.(define (twiki
3d20: 3a 73 61 76 65 2d 74 69 64 64 6c 65 72 20 74 64  :save-tiddler td
3d30: 62 20 68 65 61 64 69 6e 67 20 62 6f 64 79 20 74  b heading body t
3d40: 61 67 73 20 77 69 64 20 75 69 64 29 0a 20 20 20  ags wid uid).   
3d50: 20 28 69 66 20 28 6d 69 73 63 3a 6e 6f 6e 2d 7a   (if (misc:non-z
3d60: 65 72 6f 2d 73 74 72 69 6e 67 20 68 65 61 64 69  ero-string headi
3d70: 6e 67 29 0a 09 28 6c 65 74 2a 20 28 28 70 72 65  ng)..(let* ((pre
3d80: 76 2d 74 69 64 20 28 74 77 69 6b 69 3a 67 65 74  v-tid (twiki:get
3d90: 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d 65  -tiddler-by-name
3da0: 20 74 64 62 20 77 69 64 20 68 65 61 64 69 6e 67   tdb wid heading
3db0: 29 29 0a 09 20 20 20 20 20 20 20 28 70 72 65 76  ))..       (prev
3dc0: 2d 64 61 74 2d 69 64 20 28 69 66 20 70 72 65 76  -dat-id (if prev
3dd0: 2d 74 69 64 20 0a 09 09 09 09 28 74 77 69 6b 69  -tid .....(twiki
3de0: 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 64 61 74  :tiddler-get-dat
3df0: 2d 69 64 20 70 72 65 76 2d 74 69 64 29 0a 09 09  -id prev-tid)...
3e00: 09 09 2d 31 29 29 0a 09 20 20 20 20 20 20 20 28  ..-1))..       (
3e10: 64 61 74 2d 69 64 20 28 74 77 69 6b 69 3a 73 61  dat-id (twiki:sa
3e20: 76 65 2d 64 61 74 20 74 64 62 20 62 6f 64 79 20  ve-dat tdb body 
3e30: 30 29 29 29 20 3b 3b 20 30 3d 74 65 78 74 0a 09  0))) ;; 0=text..
3e40: 20 20 3b 3b 20 28 73 3a 6c 6f 67 20 22 74 77 69    ;; (s:log "twi
3e50: 6b 69 3a 73 61 76 65 2d 74 69 64 64 6c 65 72 20  ki:save-tiddler 
3e60: 64 61 74 2d 69 64 3a 20 22 20 64 61 74 2d 69 64  dat-id: " dat-id
3e70: 20 22 20 62 6f 64 79 3a 20 22 20 62 6f 64 79 29   " body: " body)
3e80: 0a 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20  ..  (if (equal? 
3e90: 70 72 65 76 2d 64 61 74 2d 69 64 20 64 61 74 2d  prev-dat-id dat-
3ea0: 69 64 29 20 3b 3b 20 6e 6f 20 6e 65 65 64 20 74  id) ;; no need t
3eb0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 72  o insert a new r
3ec0: 65 63 6f 72 64 20 69 66 20 74 68 65 20 64 61 74  ecord if the dat
3ed0: 20 64 69 64 6e 27 74 20 63 68 61 6e 67 65 0a 09   didn't change..
3ee0: 20 20 20 20 20 20 23 74 0a 09 20 20 20 20 20 20        #t..      
3ef0: 28 64 62 69 3a 65 78 65 63 20 74 64 62 20 0a 09  (dbi:exec tdb ..
3f00: 09 09 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .."INSERT INTO t
3f10: 69 64 64 6c 65 72 73 20 28 77 69 6b 69 5f 69 64  iddlers (wiki_id
3f20: 2c 6e 61 6d 65 2c 64 61 74 5f 69 64 2c 63 72 65  ,name,dat_id,cre
3f30: 61 74 65 64 5f 6f 6e 2c 6f 77 6e 65 72 5f 69 64  ated_on,owner_id
3f40: 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  ) VALUES(?,?,?,?
3f50: 2c 3f 29 3b 22 0a 09 09 09 77 69 64 20 68 65 61  ,?);"....wid hea
3f60: 64 69 6e 67 20 64 61 74 2d 69 64 20 28 63 75 72  ding dat-id (cur
3f70: 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 20 75 69  rent-seconds) ui
3f80: 64 29 29 0a 09 20 20 23 74 29 20 3b 3b 20 73 75  d))..  #t) ;; su
3f90: 63 63 65 73 73 0a 09 23 66 29 29 20 20 3b 3b 20  ccess..#f))  ;; 
3fa0: 6e 6f 6e 2d 73 75 63 63 65 73 73 0a 0a 3b 3b 20  non-success..;; 
3fb0: 74 65 78 74 3d 30 2c 20 6a 70 67 3d 31 2c 20 70  text=0, jpg=1, p
3fc0: 6e 67 3d 32 0a 28 64 65 66 69 6e 65 20 28 74 77  ng=2.(define (tw
3fd0: 69 6b 69 3a 73 61 76 65 2d 64 61 74 20 64 62 20  iki:save-dat db 
3fe0: 64 61 74 20 74 79 70 65 29 0a 20 20 28 6c 65 74  dat type).  (let
3ff0: 2a 20 28 28 6d 64 35 73 75 6d 20 28 6d 64 35 3a  * ((md5sum (md5:
4000: 64 69 67 65 73 74 20 64 61 74 29 29 0a 09 20 28  digest dat)).. (
4010: 64 61 74 69 64 20 20 28 74 77 69 6b 69 3a 64 61  datid  (twiki:da
4020: 74 2d 65 78 69 73 74 73 3f 20 64 62 20 6d 64 35  t-exists? db md5
4030: 73 75 6d 20 74 79 70 65 29 29 0a 09 20 28 64 61  sum type)).. (da
4040: 74 62 6c 6f 62 20 28 69 66 20 28 73 74 72 69 6e  tblob (if (strin
4050: 67 3f 20 64 61 74 29 0a 09 09 20 20 20 20 20 20  g? dat)...      
4060: 28 73 74 72 69 6e 67 2d 3e 62 6c 6f 62 20 64 61  (string->blob da
4070: 74 29 0a 09 09 20 20 20 20 20 20 64 61 74 29 29  t)...      dat))
4080: 29 0a 20 20 20 20 28 69 66 20 64 61 74 69 64 0a  ).    (if datid.
4090: 09 64 61 74 69 64 0a 09 28 62 65 67 69 6e 0a 09  .datid..(begin..
40a0: 20 20 28 63 61 73 65 20 74 79 70 65 0a 09 20 20    (case type..  
40b0: 20 20 28 28 30 29 20 20 20 28 64 62 69 3a 65 78    ((0)   (dbi:ex
40c0: 65 63 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e  ec db "INSERT IN
40d0: 54 4f 20 64 61 74 73 20 28 6d 64 35 73 75 6d 2c  TO dats (md5sum,
40e0: 64 61 74 2c 74 79 70 65 29 20 56 41 4c 55 45 53  dat,type) VALUES
40f0: 28 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73 75 6d  (?,?,?);" md5sum
4100: 20 64 61 74 62 6c 6f 62 20 30 29 29 0a 09 20 20   datblob 0))..  
4110: 20 20 28 28 31 29 20 20 20 28 64 62 69 3a 65 78    ((1)   (dbi:ex
4120: 65 63 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e  ec db "INSERT IN
4130: 54 4f 20 64 61 74 73 20 28 6d 64 35 73 75 6d 2c  TO dats (md5sum,
4140: 64 61 74 2c 74 79 70 65 29 20 56 41 4c 55 45 53  dat,type) VALUES
4150: 28 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73 75 6d  (?,?,?);" md5sum
4160: 20 64 61 74 62 6c 6f 62 20 31 29 29 0a 09 20 20   datblob 1))..  
4170: 20 20 28 65 6c 73 65 20 20 28 64 62 69 3a 65 78    (else  (dbi:ex
4180: 65 63 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e  ec db "INSERT IN
4190: 54 4f 20 64 61 74 73 20 28 6d 64 35 73 75 6d 2c  TO dats (md5sum,
41a0: 64 61 74 2c 74 79 70 65 29 20 56 41 4c 55 45 53  dat,type) VALUES
41b0: 28 3f 2c 3f 2c 3f 29 3b 22 20 6d 64 35 73 75 6d  (?,?,?);" md5sum
41c0: 20 64 61 74 62 6c 6f 62 20 74 79 70 65 29 29 29   datblob type)))
41d0: 0a 09 20 20 28 74 77 69 6b 69 3a 64 61 74 2d 65  ..  (twiki:dat-e
41e0: 78 69 73 74 73 3f 20 64 62 20 6d 64 35 73 75 6d  xists? db md5sum
41f0: 20 74 79 70 65 29 29 29 29 29 0a 20 20 20 20 20   type))))).     
4200: 20 20 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b    .(define (twik
4210: 69 3a 64 61 74 2d 65 78 69 73 74 73 3f 20 64 62  i:dat-exists? db
4220: 20 6d 64 35 73 75 6d 20 74 79 70 65 29 0a 20 20   md5sum type).  
4230: 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 20  (dbi:get-one db 
4240: 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  "SELECT id FROM 
4250: 64 61 74 73 20 57 48 45 52 45 20 6d 64 35 73 75  dats WHERE md5su
4260: 6d 3d 3f 20 41 4e 44 20 74 79 70 65 3d 3f 3b 22  m=? AND type=?;"
4270: 20 6d 64 35 73 75 6d 20 74 79 70 65 29 29 0a 0a   md5sum type))..
4280: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 67  (define (twiki:g
4290: 65 74 2d 64 61 74 20 64 62 20 69 64 29 0a 20 20  et-dat db id).  
42a0: 28 69 66 20 28 61 6e 64 20 69 64 20 28 6e 75 6d  (if (and id (num
42b0: 62 65 72 3f 20 69 64 29 29 0a 20 20 20 20 20 20  ber? id)).      
42c0: 28 69 66 20 28 3c 20 69 64 20 30 29 0a 09 20 20  (if (< id 0)..  
42d0: 22 22 0a 09 20 20 28 6c 65 74 20 28 28 72 65 73  ""..  (let ((res
42e0: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 2d 72 6f   (dbi:get-one-ro
42f0: 77 20 64 62 20 22 53 45 4c 45 43 54 20 64 61 74  w db "SELECT dat
4300: 2c 74 79 70 65 20 46 52 4f 4d 20 64 61 74 73 20  ,type FROM dats 
4310: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 69 64 29  WHERE id=?;" id)
4320: 29 29 0a 09 20 20 20 20 28 69 66 20 72 65 73 0a  ))..    (if res.
4330: 09 09 28 63 61 73 65 20 28 76 65 63 74 6f 72 2d  ..(case (vector-
4340: 72 65 66 20 72 65 73 20 31 29 0a 09 09 20 20 28  ref res 1)...  (
4350: 28 30 29 28 62 6c 6f 62 2d 3e 73 74 72 69 6e 67  (0)(blob->string
4360: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 73   (vector-ref res
4370: 20 30 29 29 29 0a 09 09 20 20 28 65 6c 73 65 20   0)))...  (else 
4380: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 73 20  (vector-ref res 
4390: 30 29 29 29 0a 09 09 23 66 29 29 29 0a 20 20 20  0)))...#f))).   
43a0: 20 20 20 23 66 29 29 0a 0a 28 64 65 66 69 6e 65     #f))..(define
43b0: 20 28 74 77 69 6b 69 3a 6d 61 69 6e 74 5f 61 72   (twiki:maint_ar
43c0: 65 61 20 74 64 62 20 77 69 64 20 74 6b 65 79 20  ea tdb wid tkey 
43d0: 77 69 6b 69 29 0a 20 20 28 6c 65 74 20 28 28 6d  wiki).  (let ((m
43e0: 61 69 6e 74 20 28 73 3a 67 65 74 2d 70 61 72 61  aint (s:get-para
43f0: 6d 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74 29 29  m 'twiki_maint))
4400: 0a 09 28 77 72 69 74 65 2d 70 65 72 6d 20 28 6d  ..(write-perm (m
4410: 65 6d 62 65 72 20 27 77 20 28 74 77 69 6b 69 3a  ember 'w (twiki:
4420: 77 69 6b 69 2d 67 65 74 2d 70 65 72 6d 73 20 77  wiki-get-perms w
4430: 69 6b 69 29 29 29 29 0a 20 20 20 20 28 73 3a 64  iki)))).    (s:d
4440: 69 76 20 3b 3b 20 27 63 6c 61 73 73 20 22 6e 6f  iv ;; 'class "no
4450: 64 65 22 20 0a 20 20 20 20 20 28 69 66 20 77 72  de" .     (if wr
4460: 69 74 65 2d 70 65 72 6d 0a 09 20 28 6c 69 73 74  ite-perm.. (list
4470: 20 28 73 3a 61 20 22 4f 72 70 68 61 6e 73 22 20   (s:a "Orphans" 
4480: 20 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74   'href (s:link-t
4490: 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e  o (twiki:get-lin
44a0: 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e  k-back-to-curren
44b0: 74 29 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74 20  t) 'twiki_maint 
44c0: 31 29 29 28 73 3a 62 72 29 0a 09 20 20 20 20 20  1))(s:br)..     
44d0: 20 20 28 73 3a 61 20 22 50 69 63 73 22 20 20 20    (s:a "Pics"   
44e0: 20 20 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d    'href (s:link-
44f0: 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69  to (twiki:get-li
4500: 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65  nk-back-to-curre
4510: 6e 74 29 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74  nt) 'twiki_maint
4520: 20 32 29 29 28 73 3a 62 72 29 0a 09 20 20 20 20   2))(s:br)..    
4530: 20 20 20 28 73 3a 61 20 22 48 65 6c 70 22 20 20     (s:a "Help"  
4540: 20 20 20 27 68 72 65 66 20 28 73 3a 6c 69 6e 6b     'href (s:link
4550: 2d 74 6f 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c  -to (twiki:get-l
4560: 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72  ink-back-to-curr
4570: 65 6e 74 29 20 27 74 77 69 6b 69 5f 6d 61 69 6e  ent) 'twiki_main
4580: 74 20 34 29 29 28 73 3a 62 72 29 29 0a 09 20 27  t 4))(s:br)).. '
4590: 28 29 29 0a 20 20 20 20 20 28 73 3a 61 20 22 53  ()).     (s:a "S
45a0: 65 61 72 63 68 22 20 20 20 27 68 72 65 66 20 28  earch"   'href (
45b0: 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74 77 69 6b 69  s:link-to (twiki
45c0: 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61 63 6b 2d 74  :get-link-back-t
45d0: 6f 2d 63 75 72 72 65 6e 74 29 20 27 74 77 69 6b  o-current) 'twik
45e0: 69 5f 6d 61 69 6e 74 20 33 29 29 28 73 3a 62 72  i_maint 3))(s:br
45f0: 29 0a 20 20 20 20 20 28 63 61 73 65 20 6d 61 69  ).     (case mai
4600: 6e 74 0a 20 20 20 20 20 20 20 28 28 31 29 0a 09  nt.       ((1)..
4610: 28 74 77 69 6b 69 3a 6c 69 73 74 2d 6f 72 70 68  (twiki:list-orph
4620: 61 6e 73 20 74 64 62 29 29 0a 20 20 20 20 20 20  ans tdb)).      
4630: 20 28 65 6c 73 65 0a 09 20 27 28 29 29 29 29 29   (else.. '()))))
4640: 29 0a 0a 3b 3b 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 3d 3d 3d 3d 3d 3d 3d  ================
4670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4f  ===========.;; O
4690: 72 70 68 61 6e 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  rphans.;;=======
46a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
46d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
46e0: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 6d  (define (twiki:m
46f0: 61 6b 65 2d 74 69 64 64 6c 65 72 2d 6c 69 73 74  ake-tiddler-list
4700: 20 74 64 6c 72 73 20 2e 20 74 6e 75 6d 73 29 0a   tdlrs . tnums).
4710: 20 20 28 63 6f 6e 63 20 28 73 74 72 69 6e 67 2d    (conc (string-
4720: 69 6e 74 65 72 73 70 65 72 73 65 20 0a 09 20 28  intersperse .. (
4730: 6d 61 70 20 63 6f 6e 63 20 28 64 65 6c 65 74 65  map conc (delete
4740: 2d 64 75 70 6c 69 63 61 74 65 73 0a 09 09 20 20  -duplicates...  
4750: 20 20 28 61 70 70 65 6e 64 20 28 6d 61 70 20 74    (append (map t
4760: 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74  wiki:tiddler-get
4770: 2d 69 64 20 74 64 6c 72 73 29 20 74 6e 75 6d 73  -id tdlrs) tnums
4780: 29 29 29 0a 09 20 22 2c 22 29 29 29 0a 0a 28 64  ))).. ",")))..(d
4790: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74  efine (twiki:get
47a0: 2d 6f 72 70 68 61 6e 73 20 74 64 62 29 0a 20 20  -orphans tdb).  
47b0: 27 28 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74  '())..(define (t
47c0: 77 69 6b 69 3a 6c 69 73 74 2d 6f 72 70 68 61 6e  wiki:list-orphan
47d0: 73 20 74 64 62 29 0a 20 20 27 28 29 29 0a 0a 3b  s tdb).  '())..;
47e0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
47f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4820: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 50 69 63 74 75  =======.;; Pictu
4830: 72 65 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  res.;;==========
4840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65  ============.(de
4880: 66 69 6e 65 20 28 74 77 69 6b 69 3a 70 69 63 5f  fine (twiki:pic_
4890: 6d 67 6d 74 20 74 64 62 20 77 69 64 20 74 6b 65  mgmt tdb wid tke
48a0: 79 29 0a 20 20 28 73 3a 64 69 76 20 0a 20 20 20  y).  (s:div .   
48b0: 28 73 3a 61 20 22 41 64 64 20 70 69 63 22 20 27  (s:a "Add pic" '
48c0: 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20  href (s:link-to 
48d0: 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d  (twiki:get-link-
48e0: 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29  back-to-current)
48f0: 20 27 74 77 69 6b 69 5f 6d 61 69 6e 74 20 32 20   'twiki_maint 2 
4900: 27 74 77 69 6b 69 5f 6d 61 69 6e 74 5f 61 64 64  'twiki_maint_add
4910: 5f 70 69 63 73 20 31 29 29 28 73 3a 62 72 29 0a  _pics 1))(s:br).
4920: 20 20 20 28 69 66 20 28 73 3a 67 65 74 2d 70 61     (if (s:get-pa
4930: 72 61 6d 20 22 74 77 69 6b 69 5f 6d 61 69 6e 74  ram "twiki_maint
4940: 5f 61 64 64 5f 70 69 63 73 22 29 0a 20 20 20 20  _add_pics").    
4950: 20 20 20 28 73 3a 66 6f 72 6d 20 27 65 6e 63 74     (s:form 'enct
4960: 79 70 65 20 22 6d 75 6c 74 69 70 61 72 74 2f 66  ype "multipart/f
4970: 6f 72 6d 2d 64 61 74 61 22 20 3b 3b 20 27 6e 61  orm-data" ;; 'na
4980: 6d 65 20 22 64 6f 65 73 2d 61 2d 66 6f 72 6d 2d  me "does-a-form-
4990: 68 61 76 65 2d 61 2d 6e 61 6d 65 22 0a 09 20 20  have-a-name"..  
49a0: 20 20 20 20 20 28 73 3a 69 6e 70 75 74 20 27 74       (s:input 't
49b0: 79 70 65 20 22 66 69 6c 65 22 20 27 6e 61 6d 65  ype "file" 'name
49c0: 20 22 69 6e 70 75 74 2d 70 69 63 74 75 72 65 22   "input-picture"
49d0: 20 27 76 61 6c 75 65 20 22 55 70 6c 6f 61 64 20   'value "Upload 
49e0: 70 69 63 22 29 0a 09 20 20 20 20 20 20 20 28 73  pic")..       (s
49f0: 3a 69 6e 70 75 74 20 27 74 79 70 65 20 22 73 75  :input 'type "su
4a00: 62 6d 69 74 22 20 27 6e 61 6d 65 20 22 73 75 62  bmit" 'name "sub
4a10: 6d 69 74 2d 70 69 63 74 75 72 65 22 20 27 76 61  mit-picture" 'va
4a20: 6c 75 65 20 22 53 75 62 6d 69 74 22 29 0a 09 20  lue "Submit").. 
4a30: 20 20 20 20 20 20 27 6d 65 74 68 6f 64 20 22 70        'method "p
4a40: 6f 73 74 22 20 0a 09 20 20 20 20 20 20 20 27 61  ost" ..       'a
4a50: 63 74 69 6f 6e 20 28 73 3a 6c 69 6e 6b 2d 74 6f  ction (s:link-to
4a60: 20 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b   (twiki:get-link
4a70: 2d 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74  -back-to-current
4a80: 29 20 27 61 63 74 69 6f 6e 20 28 63 6f 6e 63 20  ) 'action (conc 
4a90: 22 74 77 69 6b 69 2e 73 61 76 65 70 69 63 2d 22  "twiki.savepic-"
4aa0: 20 28 6e 75 6d 62 65 72 2d 3e 73 74 72 69 6e 67   (number->string
4ab0: 20 77 69 64 29 20 22 2d 22 20 28 74 77 69 6b 69   wid) "-" (twiki
4ac0: 3a 77 65 62 36 34 65 6e 63 20 74 6b 65 79 29 29  :web64enc tkey))
4ad0: 29 0a 09 20 20 20 20 20 20 20 28 73 3a 69 6e 70  )..       (s:inp
4ae0: 75 74 20 27 74 79 70 65 20 22 74 65 78 74 22 20  ut 'type "text" 
4af0: 27 6e 61 6d 65 20 22 70 69 63 74 75 72 65 2d 6e  'name "picture-n
4b00: 61 6d 65 22 20 27 76 61 6c 75 65 20 22 22 29 29  ame" 'value ""))
4b10: 0a 20 20 20 20 20 20 20 27 28 29 29 0a 20 20 20  .       '()).   
4b20: 28 6c 65 74 20 28 28 70 69 63 73 20 28 64 62 69  (let ((pics (dbi
4b30: 3a 67 65 74 2d 72 6f 77 73 20 74 64 62 20 22 53  :get-rows tdb "S
4b40: 45 4c 45 43 54 20 69 64 2c 6e 61 6d 65 2c 64 61  ELECT id,name,da
4b50: 74 5f 69 64 2c 74 68 75 6d 62 5f 64 61 74 5f 69  t_id,thumb_dat_i
4b60: 64 20 46 52 4f 4d 20 70 69 63 73 20 57 48 45 52  d FROM pics WHER
4b70: 45 20 77 69 6b 69 5f 69 64 3d 3f 3b 22 20 77 69  E wiki_id=?;" wi
4b80: 64 29 29 29 0a 20 20 20 20 20 28 6d 61 70 20 28  d))).     (map (
4b90: 6c 61 6d 62 64 61 20 28 70 69 63 29 0a 09 20 20  lambda (pic)..  
4ba0: 20 20 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20    (s:div 'class 
4bb0: 22 74 69 64 64 6c 65 72 74 68 75 6d 62 22 0a 09  "tiddlerthumb"..
4bc0: 09 20 20 20 28 73 3a 69 6d 67 20 27 74 69 74 6c  .   (s:img 'titl
4bd0: 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20 70 69  e (vector-ref pi
4be0: 63 20 31 29 20 27 61 6c 74 20 28 76 65 63 74 6f  c 1) 'alt (vecto
4bf0: 72 2d 72 65 66 20 70 69 63 20 31 29 0a 09 09 20  r-ref pic 1)... 
4c00: 09 20 20 3b 3b 20 27 73 72 63 20 28 73 3a 6c 69  .  ;; 'src (s:li
4c10: 6e 6b 2d 74 6f 20 22 74 77 69 6b 69 22 20 27 77  nk-to "twiki" 'w
4c20: 69 6b 69 5f 6b 65 79 20 28 74 77 69 6b 69 3a 77  iki_key (twiki:w
4c30: 65 62 36 34 65 6e 63 20 74 6b 65 79 29 20 27 69  eb64enc tkey) 'i
4c40: 6d 61 67 65 20 20 28 76 65 63 74 6f 72 2d 72 65  mage  (vector-re
4c50: 66 20 70 69 63 20 30 29 29 29 0a 09 09 20 09 20  f pic 0)))... . 
4c60: 20 27 73 72 63 20 28 73 3a 6c 69 6e 6b 2d 74 6f   'src (s:link-to
4c70: 20 22 74 77 69 6b 69 22 20 27 77 69 6b 69 5f 6b   "twiki" 'wiki_k
4c80: 65 79 20 28 63 6f 6e 63 20 28 6e 75 6d 62 65 72  ey (conc (number
4c90: 2d 3e 73 74 72 69 6e 67 20 77 69 64 29 20 22 2d  ->string wid) "-
4ca0: 22 20 28 74 77 69 6b 69 3a 77 65 62 36 34 65 6e  " (twiki:web64en
4cb0: 63 20 74 6b 65 79 29 29 0a 09 09 09 09 09 20 20  c tkey))......  
4cc0: 27 74 68 75 6d 62 20 20 28 76 65 63 74 6f 72 2d  'thumb  (vector-
4cd0: 72 65 66 20 70 69 63 20 30 29 29 29 0a 09 09 20  ref pic 0)))... 
4ce0: 20 20 3b 3b 20 20 20 20 20 20 20 28 63 6f 6e 63    ;;       (conc
4cf0: 20 22 74 77 69 6b 69 2f 22 20 77 69 64 20 22 2f   "twiki/" wid "/
4d00: 74 68 75 6d 62 73 2f 22 20 28 76 65 63 74 6f 72  thumbs/" (vector
4d10: 2d 72 65 66 20 70 69 63 20 30 29 29 29 29 0a 09  -ref pic 0))))..
4d20: 09 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20  .   (vector-ref 
4d30: 70 69 63 20 30 29 20 28 76 65 63 74 6f 72 2d 72  pic 0) (vector-r
4d40: 65 66 20 70 69 63 20 31 29 29 29 0a 09 20 20 70  ef pic 1)))..  p
4d50: 69 63 73 29 29 29 29 0a 0a 28 64 65 66 69 6e 65  ics))))..(define
4d60: 20 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 70 69    (twiki:save-pi
4d70: 63 2d 66 72 6f 6d 2d 66 6f 72 6d 20 74 64 62 20  c-from-form tdb 
4d80: 77 69 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 70  wid).  (let* ((p
4d90: 69 63 2d 64 61 74 20 20 28 73 3a 67 65 74 2d 69  ic-dat  (s:get-i
4da0: 6e 70 75 74 20 27 69 6e 70 75 74 2d 70 69 63 74  nput 'input-pict
4db0: 75 72 65 29 29 0a 09 20 28 61 6c 74 2d 6e 61 6d  ure)).. (alt-nam
4dc0: 65 20 28 73 3a 67 65 74 2d 69 6e 70 75 74 20 27  e (s:get-input '
4dd0: 70 69 63 74 75 72 65 2d 6e 61 6d 65 29 29 29 0a  picture-name))).
4de0: 20 20 20 20 28 69 66 20 70 69 63 2d 64 61 74 0a      (if pic-dat.
4df0: 09 28 62 65 67 69 6e 0a 09 20 20 28 73 3a 6c 6f  .(begin..  (s:lo
4e00: 67 20 22 74 77 69 6b 69 3a 73 61 76 65 2d 70 69  g "twiki:save-pi
4e10: 63 2d 66 72 6f 6d 2d 66 6f 72 6d 20 77 69 74 68  c-from-form with
4e20: 20 70 69 63 2d 64 61 74 3d 22 20 70 69 63 2d 64   pic-dat=" pic-d
4e30: 61 74 20 22 20 61 6e 64 20 61 6c 74 2d 6e 61 6d  at " and alt-nam
4e40: 65 3d 22 20 61 6c 74 2d 6e 61 6d 65 29 0a 09 20  e=" alt-name).. 
4e50: 20 28 74 77 69 6b 69 3a 73 61 76 65 2d 70 69 63   (twiki:save-pic
4e60: 20 74 64 62 20 70 69 63 2d 64 61 74 20 77 69 64   tdb pic-dat wid
4e70: 20 61 6c 74 2d 6e 61 6d 65 29 29 0a 09 23 66 29   alt-name))..#f)
4e80: 29 29 0a 0a 3b 3b 20 67 65 74 20 70 69 63 20 69  ))..;; get pic i
4e90: 64 20 66 6f 72 20 61 20 70 69 63 20 6e 61 6d 65  d for a pic name
4ea0: 2c 20 72 65 74 75 72 6e 73 20 74 68 65 20 6c 61  , returns the la
4eb0: 74 65 73 74 0a 28 64 65 66 69 6e 65 20 28 74 77  test.(define (tw
4ec0: 69 6b 69 3a 67 65 74 2d 70 69 63 2d 69 64 20 74  iki:get-pic-id t
4ed0: 64 62 20 70 69 63 2d 6e 61 6d 65 20 77 69 64 29  db pic-name wid)
4ee0: 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20  .  (dbi:get-one 
4ef0: 74 64 62 20 22 53 45 4c 45 43 54 20 70 69 63 73  tdb "SELECT pics
4f00: 2e 69 64 20 46 52 4f 4d 20 70 69 63 73 20 57 48  .id FROM pics WH
4f10: 45 52 45 20 70 69 63 73 2e 6e 61 6d 65 3d 3f 20  ERE pics.name=? 
4f20: 41 4e 44 20 70 69 63 73 2e 77 69 6b 69 5f 69 64  AND pics.wiki_id
4f30: 3d 3f 20 4f 52 44 45 52 20 42 59 20 70 69 63 73  =? ORDER BY pics
4f40: 2e 69 64 20 44 45 53 43 20 4c 49 4d 49 54 20 31  .id DESC LIMIT 1
4f50: 3b 22 20 70 69 63 2d 6e 61 6d 65 20 77 69 64 29  ;" pic-name wid)
4f60: 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  )..(define (twik
4f70: 69 3a 73 61 76 65 2d 70 69 63 20 74 64 62 20 70  i:save-pic tdb p
4f80: 69 63 2d 64 61 74 20 77 69 64 20 61 6c 74 29 0a  ic-dat wid alt).
4f90: 20 20 28 6c 65 74 20 28 28 70 69 63 2d 6e 61 6d    (let ((pic-nam
4fa0: 65 20 28 63 61 72 20 70 69 63 2d 64 61 74 29 29  e (car pic-dat))
4fb0: 0a 09 28 70 69 63 2d 74 79 70 65 20 28 63 61 64  ..(pic-type (cad
4fc0: 72 20 70 69 63 2d 64 61 74 29 29 0a 09 28 70 69  r pic-dat))..(pi
4fd0: 63 2d 64 61 74 61 20 28 63 61 64 64 72 20 70 69  c-data (caddr pi
4fe0: 63 2d 64 61 74 29 29 0a 09 3b 3b 20 49 27 6d 20  c-dat))..;; I'm 
4ff0: 6e 6f 74 20 74 6f 6f 20 68 61 70 70 79 20 77 69  not too happy wi
5000: 74 68 20 74 68 69 73 20 73 6f 6c 75 74 69 6f 6e  th this solution
5010: 20 62 75 74 20 49 20 63 61 6e 27 74 20 73 65 65   but I can't see
5020: 6d 20 74 6f 20 63 68 6f 6d 70 20 74 68 65 20 5c  m to chomp the \
5030: 6e 5c 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  n\d from the end
5040: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a 09   of the string..
5050: 28 61 6c 74 2d 6e 61 6d 65 20 28 69 66 20 61 6c  (alt-name (if al
5060: 74 20 28 73 74 72 69 6e 67 2d 73 75 62 73 74 69  t (string-substi
5070: 74 75 74 65 20 28 72 65 67 65 78 70 20 22 5b 5e  tute (regexp "[^
5080: 5c 5c 77 20 5d 22 29 20 22 22 20 61 6c 74 20 23  \\w ]") "" alt #
5090: 74 29 20 23 66 29 29 29 0a 20 20 20 20 28 69 66  t) #f))).    (if
50a0: 20 28 61 6e 64 20 61 6c 74 2d 6e 61 6d 65 0a 09   (and alt-name..
50b0: 20 20 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74       (string-mat
50c0: 63 68 20 28 72 65 67 65 78 70 20 22 5c 5c 77 2b  ch (regexp "\\w+
50d0: 22 29 20 61 6c 74 2d 6e 61 6d 65 29 29 0a 09 28  ") alt-name))..(
50e0: 73 65 74 21 20 70 69 63 2d 6e 61 6d 65 20 61 6c  set! pic-name al
50f0: 74 2d 6e 61 6d 65 29 29 0a 20 20 20 20 28 73 3a  t-name)).    (s:
5100: 6c 6f 67 20 22 61 6c 74 3a 20 22 20 61 6c 74 20  log "alt: " alt 
5110: 22 20 61 6c 74 2d 6e 61 6d 65 3a 20 22 20 61 6c  " alt-name: " al
5120: 74 2d 6e 61 6d 65 29 0a 20 20 20 20 28 69 66 20  t-name).    (if 
5130: 70 69 63 2d 64 61 74 61 0a 09 28 6c 65 74 20 28  pic-data..(let (
5140: 28 64 61 74 2d 69 64 20 28 74 77 69 6b 69 3a 73  (dat-id (twiki:s
5150: 61 76 65 2d 64 61 74 20 74 64 62 20 70 69 63 2d  ave-dat tdb pic-
5160: 64 61 74 61 20 28 74 77 69 6b 69 3a 6d 69 6d 65  data (twiki:mime
5170: 2d 3e 74 77 69 6b 69 2d 74 79 70 65 20 70 69 63  ->twiki-type pic
5180: 2d 74 79 70 65 29 29 29 0a 09 20 20 20 20 20 20  -type)))..      
5190: 28 63 72 65 61 74 69 6f 6e 2d 74 69 6d 65 20 28  (creation-time (
51a0: 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29  current-seconds)
51b0: 29 29 0a 09 20 20 3b 3b 20 28 74 77 69 6b 69 3a  ))..  ;; (twiki:
51c0: 64 65 6c 65 74 65 2d 70 69 63 2d 62 79 2d 6e 61  delete-pic-by-na
51d0: 6d 65 20 74 64 62 20 70 69 63 2d 6e 61 6d 65 29  me tdb pic-name)
51e0: 0a 09 20 20 28 64 62 69 3a 65 78 65 63 20 74 64  ..  (dbi:exec td
51f0: 62 20 0a 09 09 20 20 20 20 22 49 4e 53 45 52 54  b ...    "INSERT
5200: 20 49 4e 54 4f 20 70 69 63 73 20 28 6e 61 6d 65   INTO pics (name
5210: 2c 77 69 6b 69 5f 69 64 2c 64 61 74 5f 69 64 2c  ,wiki_id,dat_id,
5220: 63 72 65 61 74 65 64 5f 6f 6e 2c 6f 77 6e 65 72  created_on,owner
5230: 5f 69 64 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c  _id) VALUES(?,?,
5240: 3f 2c 3f 2c 3f 29 3b 22 0a 09 09 20 20 20 20 70  ?,?,?);"...    p
5250: 69 63 2d 6e 61 6d 65 20 77 69 64 20 64 61 74 2d  ic-name wid dat-
5260: 69 64 20 63 72 65 61 74 69 6f 6e 2d 74 69 6d 65  id creation-time
5270: 20 28 74 77 69 6b 69 3a 67 65 74 2d 69 64 29 29   (twiki:get-id))
5280: 0a 09 20 20 28 6c 65 74 20 28 28 70 69 63 2d 69  ..  (let ((pic-i
5290: 64 20 28 74 77 69 6b 69 3a 67 65 74 2d 70 69 63  d (twiki:get-pic
52a0: 2d 69 64 20 74 64 62 20 70 69 63 2d 6e 61 6d 65  -id tdb pic-name
52b0: 20 77 69 64 29 29 29 0a 09 20 20 20 20 28 74 77   wid)))..    (tw
52c0: 69 6b 69 3a 6d 61 6b 65 2d 74 68 75 6d 62 6e 61  iki:make-thumbna
52d0: 69 6c 20 74 64 62 20 70 69 63 2d 69 64 20 77 69  il tdb pic-id wi
52e0: 64 29 29 0a 09 20 20 23 74 29 0a 09 23 66 29 29  d))..  #t)..#f))
52f0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  )..(define (twik
5300: 69 3a 67 65 74 2d 70 69 63 2d 64 61 74 20 74 64  i:get-pic-dat td
5310: 62 20 77 69 64 20 70 69 63 2d 69 64 29 0a 20 20  b wid pic-id).  
5320: 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 74 64 62  (dbi:get-one tdb
5330: 20 22 53 45 4c 45 43 54 20 64 61 74 20 46 52 4f   "SELECT dat FRO
5340: 4d 20 70 69 63 73 20 49 4e 4e 45 52 20 4a 4f 49  M pics INNER JOI
5350: 4e 20 64 61 74 73 20 4f 4e 20 70 69 63 73 2e 64  N dats ON pics.d
5360: 61 74 5f 69 64 3d 64 61 74 73 2e 69 64 20 57 48  at_id=dats.id WH
5370: 45 52 45 20 70 69 63 73 2e 69 64 3d 3f 20 41 4e  ERE pics.id=? AN
5380: 44 20 77 69 6b 69 5f 69 64 3d 3f 3b 22 20 70 69  D wiki_id=?;" pi
5390: 63 2d 69 64 20 77 69 64 29 29 0a 0a 28 64 65 66  c-id wid))..(def
53a0: 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74 2d 74  ine (twiki:get-t
53b0: 68 75 6d 62 2d 64 61 74 20 74 64 62 20 77 69 64  humb-dat tdb wid
53c0: 20 70 69 63 2d 69 64 29 0a 20 20 28 64 62 69 3a   pic-id).  (dbi:
53d0: 67 65 74 2d 6f 6e 65 20 74 64 62 20 22 53 45 4c  get-one tdb "SEL
53e0: 45 43 54 20 64 61 74 20 46 52 4f 4d 20 70 69 63  ECT dat FROM pic
53f0: 73 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 64 61 74  s INNER JOIN dat
5400: 73 20 4f 4e 20 70 69 63 73 2e 74 68 75 6d 62 5f  s ON pics.thumb_
5410: 64 61 74 5f 69 64 3d 64 61 74 73 2e 69 64 20 57  dat_id=dats.id W
5420: 48 45 52 45 20 70 69 63 73 2e 69 64 3d 3f 20 41  HERE pics.id=? A
5430: 4e 44 20 77 69 6b 69 5f 69 64 3d 3f 3b 22 20 70  ND wiki_id=?;" p
5440: 69 63 2d 69 64 20 77 69 64 29 29 0a 0a 3b 3b 20  ic-id wid))..;; 
5450: 74 68 69 73 20 6f 6e 65 20 73 65 74 73 20 75 70  this one sets up
5460: 20 74 68 65 20 43 6f 6e 74 65 6e 74 20 74 79 70   the Content typ
5470: 65 2c 20 70 75 74 73 20 74 68 65 20 64 61 74 61  e, puts the data
5480: 20 69 6e 74 6f 20 70 61 67 65 2d 64 61 74 20 61   into page-dat a
5490: 6e 64 20 69 73 20 64 6f 6e 65 0a 28 64 65 66 69  nd is done.(defi
54a0: 6e 65 20 28 74 77 69 6b 69 3a 72 65 74 75 72 6e  ne (twiki:return
54b0: 2d 69 6d 61 67 65 2d 64 61 74 20 74 64 62 20 77  -image-dat tdb w
54c0: 69 64 20 70 69 63 2d 69 64 29 0a 20 20 28 6c 65  id pic-id).  (le
54d0: 74 20 28 28 64 61 74 20 20 28 74 77 69 6b 69 3a  t ((dat  (twiki:
54e0: 67 65 74 2d 70 69 63 2d 64 61 74 20 74 64 62 20  get-pic-dat tdb 
54f0: 77 69 64 20 70 69 63 2d 69 64 29 29 29 0a 20 20  wid pic-id))).  
5500: 20 20 28 73 3a 6c 6f 67 20 22 74 77 69 6b 69 3a    (s:log "twiki:
5510: 72 65 74 75 72 6e 2d 69 6d 61 67 65 2d 64 61 74  return-image-dat
5520: 20 64 61 74 20 69 73 3a 20 22 20 64 61 74 20 22   dat is: " dat "
5530: 20 6f 66 20 73 69 7a 65 3a 20 22 20 28 69 66 20   of size: " (if 
5540: 28 62 6c 6f 62 3f 20 64 61 74 29 28 62 6c 6f 62  (blob? dat)(blob
5550: 2d 73 69 7a 65 20 64 61 74 29 20 22 5b 6e 6f 74  -size dat) "[not
5560: 20 61 20 62 6c 6f 62 5d 22 29 29 0a 20 20 20 20   a blob]")).    
5570: 28 73 6c 6f 74 2d 73 65 74 21 20 73 3a 73 65 73  (slot-set! s:ses
5580: 73 69 6f 6e 20 27 70 61 67 65 2d 74 79 70 65 20  sion 'page-type 
5590: 27 69 6d 61 67 65 29 0a 20 20 20 20 28 73 6c 6f  'image).    (slo
55a0: 74 2d 73 65 74 21 20 73 3a 73 65 73 73 69 6f 6e  t-set! s:session
55b0: 20 27 63 6f 6e 74 65 6e 74 2d 74 79 70 65 20 22   'content-type "
55c0: 69 6d 61 67 65 2f 6a 70 65 67 22 29 0a 20 20 20  image/jpeg").   
55d0: 20 28 73 6c 6f 74 2d 73 65 74 21 20 73 3a 73 65   (slot-set! s:se
55e0: 73 73 69 6f 6e 20 27 61 6c 74 2d 70 61 67 65 2d  ssion 'alt-page-
55f0: 64 61 74 20 64 61 74 29 29 29 0a 20 20 20 20 3b  dat dat))).    ;
5600: 3b 20 28 73 65 73 73 69 6f 6e 3a 61 6c 74 2d 6f  ; (session:alt-o
5610: 75 74 20 73 3a 73 65 73 73 69 6f 6e 29 29 29 0a  ut s:session))).
5620: 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 73 65 74  .;; this one set
5630: 73 20 75 70 20 74 68 65 20 43 6f 6e 74 65 6e 74  s up the Content
5640: 20 74 79 70 65 2c 20 70 75 74 73 20 74 68 65 20   type, puts the 
5650: 64 61 74 61 20 69 6e 74 6f 20 70 61 67 65 2d 64  data into page-d
5660: 61 74 20 61 6e 64 20 69 73 20 64 6f 6e 65 0a 28  at and is done.(
5670: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 72 65  define (twiki:re
5680: 74 75 72 6e 2d 74 68 75 6d 62 2d 64 61 74 20 74  turn-thumb-dat t
5690: 64 62 20 77 69 64 20 70 69 63 2d 69 64 29 0a 20  db wid pic-id). 
56a0: 20 28 6c 65 74 20 28 28 64 61 74 20 20 28 74 77   (let ((dat  (tw
56b0: 69 6b 69 3a 67 65 74 2d 74 68 75 6d 62 2d 64 61  iki:get-thumb-da
56c0: 74 20 74 64 62 20 77 69 64 20 70 69 63 2d 69 64  t tdb wid pic-id
56d0: 29 29 29 0a 20 20 20 20 28 73 3a 6c 6f 67 20 22  ))).    (s:log "
56e0: 74 77 69 6b 69 3a 72 65 74 75 72 6e 2d 69 6d 61  twiki:return-ima
56f0: 67 65 2d 64 61 74 20 64 61 74 20 69 73 3a 20 22  ge-dat dat is: "
5700: 20 64 61 74 20 22 20 6f 66 20 73 69 7a 65 3a 20   dat " of size: 
5710: 22 20 28 69 66 20 28 62 6c 6f 62 3f 20 64 61 74  " (if (blob? dat
5720: 29 28 62 6c 6f 62 2d 73 69 7a 65 20 64 61 74 29  )(blob-size dat)
5730: 20 22 5b 6e 6f 74 20 61 20 62 6c 6f 62 5d 22 29   "[not a blob]")
5740: 29 0a 20 20 20 20 28 73 6c 6f 74 2d 73 65 74 21  ).    (slot-set!
5750: 20 73 3a 73 65 73 73 69 6f 6e 20 27 70 61 67 65   s:session 'page
5760: 2d 74 79 70 65 20 27 69 6d 61 67 65 29 0a 20 20  -type 'image).  
5770: 20 20 28 73 6c 6f 74 2d 73 65 74 21 20 73 3a 73    (slot-set! s:s
5780: 65 73 73 69 6f 6e 20 27 63 6f 6e 74 65 6e 74 2d  ession 'content-
5790: 74 79 70 65 20 22 69 6d 61 67 65 2f 6a 70 65 67  type "image/jpeg
57a0: 22 29 0a 20 20 20 20 28 73 6c 6f 74 2d 73 65 74  ").    (slot-set
57b0: 21 20 73 3a 73 65 73 73 69 6f 6e 20 27 61 6c 74  ! s:session 'alt
57c0: 2d 70 61 67 65 2d 64 61 74 20 64 61 74 29 29 29  -page-dat dat)))
57d0: 0a 20 20 20 20 3b 3b 20 28 73 65 73 73 69 6f 6e  .    ;; (session
57e0: 3a 61 6c 74 2d 6f 75 74 20 73 3a 73 65 73 73 69  :alt-out s:sessi
57f0: 6f 6e 29 29 29 0a 20 20 0a 28 64 65 66 69 6e 65  on))).  .(define
5800: 20 28 74 77 69 6b 69 3a 6d 61 6b 65 2d 74 68 75   (twiki:make-thu
5810: 6d 62 6e 61 69 6c 20 74 64 62 20 70 69 63 2d 69  mbnail tdb pic-i
5820: 64 20 77 69 64 29 0a 20 20 28 6c 65 74 20 28 28  d wid).  (let ((
5830: 69 6e 64 61 74 20 20 28 74 77 69 6b 69 3a 67 65  indat  (twiki:ge
5840: 74 2d 70 69 63 2d 64 61 74 20 74 64 62 20 77 69  t-pic-dat tdb wi
5850: 64 20 70 69 63 2d 69 64 29 29 29 0a 20 20 20 20  d pic-id))).    
5860: 3b 3b 20 20 20 28 6f 75 74 64 61 74 20 28 6f 70  ;;   (outdat (op
5870: 65 6e 2d 6f 75 74 70 75 74 2d 73 74 72 69 6e 67  en-output-string
5880: 29 29 29 0a 20 20 20 20 28 6c 65 74 2d 76 61 6c  ))).    (let-val
5890: 75 65 73 20 28 28 28 69 6e 70 20 6f 75 70 20 70  ues (((inp oup p
58a0: 69 64 29 28 70 72 6f 63 65 73 73 20 22 63 6f 6e  id)(process "con
58b0: 76 65 72 74 22 20 28 6c 69 73 74 20 22 2d 73 69  vert" (list "-si
58c0: 7a 65 22 20 22 35 30 30 78 31 38 30 22 20 22 2d  ze" "500x180" "-
58d0: 22 20 22 2d 74 68 75 6d 62 6e 61 69 6c 22 20 22  " "-thumbnail" "
58e0: 32 35 30 78 39 30 22 20 22 2d 75 6e 73 68 61 72  250x90" "-unshar
58f0: 70 22 20 22 30 78 2e 35 22 20 22 2d 22 29 29 29  p" "0x.5" "-")))
5900: 29 0a 09 09 28 77 72 69 74 65 2d 73 74 72 69 6e  )...(write-strin
5910: 67 20 28 62 6c 6f 62 2d 3e 73 74 72 69 6e 67 20  g (blob->string 
5920: 69 6e 64 61 74 29 20 23 66 20 6f 75 70 29 0a 09  indat) #f oup)..
5930: 09 28 63 6c 6f 73 65 2d 69 6e 70 75 74 2d 70 6f  .(close-input-po
5940: 72 74 20 6f 75 70 29 0a 09 09 3b 3b 20 28 77 72  rt oup)...;; (wr
5950: 69 74 65 2d 73 74 72 69 6e 67 20 23 66 20 69 6e  ite-string #f in
5960: 70 20 28 62 6c 6f 62 2d 3e 73 74 72 69 6e 67 20  p (blob->string 
5970: 69 6e 64 61 74 29 29 0a 09 09 28 6c 65 74 20 28  indat))...(let (
5980: 28 6c 20 28 72 65 61 64 2d 73 74 72 69 6e 67 20  (l (read-string 
5990: 23 66 20 69 6e 70 29 29 29 0a 09 09 20 20 28 63  #f inp)))...  (c
59a0: 6c 6f 73 65 2d 6f 75 74 70 75 74 2d 70 6f 72 74  lose-output-port
59b0: 20 69 6e 70 29 0a 09 09 20 20 3b 3b 20 28 77 72   inp)...  ;; (wr
59c0: 69 74 65 2d 73 74 72 69 6e 67 20 6c 20 23 66 20  ite-string l #f 
59d0: 6f 75 74 64 61 74 29 0a 09 09 20 20 28 6c 65 74  outdat)...  (let
59e0: 2a 20 28 28 6e 65 77 64 61 74 20 28 73 74 72 69  * ((newdat (stri
59f0: 6e 67 2d 3e 62 6c 6f 62 20 6c 29 29 20 3b 3b 20  ng->blob l)) ;; 
5a00: 28 67 65 74 2d 6f 75 74 70 75 74 2d 73 74 72 69  (get-output-stri
5a10: 6e 67 20 6f 75 74 64 61 74 29 29 29 0a 09 09 09  ng outdat)))....
5a20: 20 28 64 61 74 2d 69 64 20 28 74 77 69 6b 69 3a   (dat-id (twiki:
5a30: 73 61 76 65 2d 64 61 74 20 74 64 62 20 6e 65 77  save-dat tdb new
5a40: 64 61 74 20 32 29 29 29 20 3b 3b 20 62 75 67 3f  dat 2))) ;; bug?
5a50: 0a 09 09 20 20 20 20 28 64 62 69 3a 65 78 65 63  ...    (dbi:exec
5a60: 20 74 64 62 20 22 55 50 44 41 54 45 20 70 69 63   tdb "UPDATE pic
5a70: 73 20 53 45 54 20 74 68 75 6d 62 5f 64 61 74 5f  s SET thumb_dat_
5a80: 69 64 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b  id=? WHERE id=?;
5a90: 22 20 64 61 74 2d 69 64 20 70 69 63 2d 69 64 29  " dat-id pic-id)
5aa0: 0a 09 09 20 20 20 20 64 61 74 2d 69 64 29 29 29  ...    dat-id)))
5ab0: 29 29 0a 0a 3b 3b 20 6e 6f 74 20 74 65 73 74 65  ))..;; not teste
5ac0: 64 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  d.(define (twiki
5ad0: 3a 70 69 63 64 61 74 2d 3e 74 68 75 6d 62 64 61  :picdat->thumbda
5ae0: 74 20 70 69 63 64 61 74 29 0a 20 20 28 6c 65 74  t picdat).  (let
5af0: 2d 76 61 6c 75 65 73 20 28 28 28 69 6e 70 20 6f  -values (((inp o
5b00: 75 70 20 70 69 64 29 28 70 72 6f 63 65 73 73 20  up pid)(process 
5b10: 22 63 6f 6e 76 65 72 74 22 20 3b 3b 20 28 6c 69  "convert" ;; (li
5b20: 73 74 20 22 2d 73 69 7a 65 22 20 22 35 30 30 78  st "-size" "500x
5b30: 31 38 30 22 20 22 2d 22 20 22 2d 74 68 75 6d 62  180" "-" "-thumb
5b40: 6e 61 69 6c 22 20 22 32 35 30 78 39 30 22 20 22  nail" "250x90" "
5b50: 2d 75 6e 73 68 61 72 70 22 20 22 30 78 2e 35 22  -unsharp" "0x.5"
5b60: 20 22 2d 22 29 29 29 29 0a 09 09 09 09 20 20 20   "-")))).....   
5b70: 20 20 20 28 6c 69 73 74 20 22 2d 73 69 7a 65 22     (list "-size"
5b80: 20 22 35 30 30 78 31 38 30 22 20 22 2d 22 20 22   "500x180" "-" "
5b90: 2d 74 68 75 6d 62 6e 61 69 6c 22 20 22 32 30 30  -thumbnail" "200
5ba0: 78 37 30 22 20 22 2d 75 6e 73 68 61 72 70 22 20  x70" "-unsharp" 
5bb0: 22 30 78 2e 35 22 20 22 2d 22 29 29 29 29 0a 09  "0x.5" "-"))))..
5bc0: 20 20 20 20 20 20 28 77 72 69 74 65 2d 73 74 72        (write-str
5bd0: 69 6e 67 20 28 62 6c 6f 62 2d 3e 73 74 72 69 6e  ing (blob->strin
5be0: 67 20 70 69 63 64 61 74 29 20 23 66 20 6f 75 70  g picdat) #f oup
5bf0: 29 0a 09 20 20 20 20 20 20 28 63 6c 6f 73 65 2d  )..      (close-
5c00: 69 6e 70 75 74 2d 70 6f 72 74 20 6f 75 70 29 0a  input-port oup).
5c10: 09 20 20 20 20 20 20 3b 3b 20 28 77 72 69 74 65  .      ;; (write
5c20: 2d 73 74 72 69 6e 67 20 23 66 20 69 6e 70 20 28  -string #f inp (
5c30: 62 6c 6f 62 2d 3e 73 74 72 69 6e 67 20 69 6e 64  blob->string ind
5c40: 61 74 29 29 0a 09 20 20 20 20 20 20 28 6c 65 74  at))..      (let
5c50: 20 28 28 6c 20 28 72 65 61 64 2d 73 74 72 69 6e   ((l (read-strin
5c60: 67 20 23 66 20 69 6e 70 29 29 29 0a 09 09 28 63  g #f inp)))...(c
5c70: 6c 6f 73 65 2d 6f 75 74 70 75 74 2d 70 6f 72 74  lose-output-port
5c80: 20 69 6e 70 29 0a 09 09 28 77 72 69 74 65 2d 73   inp)...(write-s
5c90: 74 72 69 6e 67 20 6c 20 23 66 20 6f 75 70 29 0a  tring l #f oup).
5ca0: 09 09 28 73 74 72 69 6e 67 2d 3e 62 6c 6f 62 20  ..(string->blob 
5cb0: 6c 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  l))))..(define (
5cc0: 74 77 69 6b 69 3a 6d 69 6d 65 2d 3e 74 77 69 6b  twiki:mime->twik
5cd0: 69 2d 74 79 70 65 20 6d 69 6d 65 2d 74 79 70 65  i-type mime-type
5ce0: 29 0a 20 20 28 63 61 73 65 20 28 73 74 72 69 6e  ).  (case (strin
5cf0: 67 2d 3e 73 79 6d 62 6f 6c 20 6d 69 6d 65 2d 74  g->symbol mime-t
5d00: 79 70 65 29 0a 20 20 20 20 28 28 69 6d 61 67 65  ype).    ((image
5d10: 2f 6a 70 65 67 29 20 31 29 0a 20 20 20 20 28 28  /jpeg) 1).    ((
5d20: 69 6d 61 67 65 2f 70 6e 67 29 20 20 32 29 0a 20  image/png)  2). 
5d30: 20 20 20 28 65 6c 73 65 20 30 29 29 29 0a 0a 3b     (else 0)))..;
5d40: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
5d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5d80: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 57 69 6b 69 20  =======.;; Wiki 
5d90: 73 74 75 66 66 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  stuff.;;========
5da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
5de0: 3b 3b 20 63 75 72 72 2d 74 69 64 64 6c 65 72 73  ;; curr-tiddlers
5df0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 68   is a list of th
5e00: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
5e10: 75 72 72 65 6e 74 20 74 69 64 64 6c 65 72 73 20  urrent tiddlers 
5e20: 64 69 73 70 6c 61 79 65 64 0a 3b 3b 20 74 69 64  displayed.;; tid
5e30: 64 6c 65 72 2d 75 6e 64 65 72 2d 65 64 69 74 20  dler-under-edit 
5e40: 69 73 20 74 68 65 20 74 69 64 64 6c 65 72 20 62  is the tiddler b
5e50: 65 69 6e 67 20 65 64 69 74 65 64 20 28 6f 72 20  eing edited (or 
5e60: 23 66 20 66 6f 72 20 6e 6f 6e 65 29 2e 0a 28 64  #f for none)..(d
5e70: 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 77 69 6b  efine (twiki:wik
5e80: 69 20 6e 61 6d 65 20 6b 65 79 73 29 0a 20 20 28  i name keys).  (
5e90: 6c 65 74 20 28 28 70 65 72 6d 73 20 20 20 28 74  let ((perms   (t
5ea0: 77 69 6b 69 3a 61 63 63 65 73 73 20 6e 61 6d 65  wiki:access name
5eb0: 20 6b 65 79 73 20 28 74 77 69 6b 69 3a 67 65 74   keys (twiki:get
5ec0: 2d 69 64 29 29 29 29 0a 20 20 20 20 3b 3b 20 28  -id)))).    ;; (
5ed0: 73 3a 6c 6f 67 20 22 74 77 69 6b 69 3a 77 69 6b  s:log "twiki:wik
5ee0: 69 20 6e 61 6d 65 3a 20 5c 22 22 20 6e 61 6d 65  i name: \"" name
5ef0: 20 22 5c 22 20 6b 65 79 73 3a 20 22 20 6b 65 79   "\" keys: " key
5f00: 73 29 0a 20 20 20 20 28 69 66 20 28 6f 72 20 28  s).    (if (or (
5f10: 6e 6f 74 20 6e 61 6d 65 29 0a 09 20 20 20 20 28  not name)..    (
5f20: 73 74 72 69 6e 67 3d 3f 20 6e 61 6d 65 20 22 22  string=? name ""
5f30: 29 29 20 3b 3b 20 6e 61 6d 65 20 6d 75 73 74 20  )) ;; name must 
5f40: 62 65 20 22 22 20 6f 72 20 23 66 20 74 6f 20 67  be "" or #f to g
5f50: 65 74 20 68 65 72 65 20 61 6e 64 20 72 65 74 75  et here and retu
5f60: 72 6e 20 61 6e 20 69 6d 61 67 65 0a 09 3b 3b 20  rn an image..;; 
5f70: 68 61 6e 64 6c 65 20 72 65 74 75 72 6e 69 6e 67  handle returning
5f80: 20 70 69 63 74 75 72 65 73 2c 20 6e 6f 74 65 20   pictures, note 
5f90: 6b 65 79 73 20 61 6e 64 20 6e 61 6d 65 20 61 72  keys and name ar
5fa0: 65 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 74 68  e ignored for th
5fb0: 65 73 65 2e 20 54 68 65 79 20 61 72 65 20 63 61  ese. They are ca
5fc0: 6c 6c 65 64 20 6f 75 74 20 69 6e 0a 09 3b 3b 20  lled out in..;; 
5fd0: 74 68 65 20 74 77 69 6b 69 2f 76 69 65 77 2e 73  the twiki/view.s
5fe0: 63 6d 20 28 74 77 69 6b 69 3a 74 77 69 6b 69 20  cm (twiki:twiki 
5ff0: 22 62 6c 61 68 22 20 27 28 6e 61 64 61 20 66 6f  "blah" '(nada fo
6000: 6f 29 29 20 63 61 6c 6c 2e 0a 09 28 6c 65 74 20  o)) call...(let 
6010: 28 28 69 6d 61 67 65 20 20 20 28 73 3a 67 65 74  ((image   (s:get
6020: 2d 70 61 72 61 6d 20 22 69 6d 61 67 65 22 29 29  -param "image"))
6030: 0a 09 20 20 20 20 20 20 28 74 68 75 6d 62 20 20  ..      (thumb  
6040: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 74   (s:get-param "t
6050: 68 75 6d 62 22 29 29 29 0a 09 20 20 28 73 3a 6c  humb")))..  (s:l
6060: 6f 67 20 22 69 6d 61 67 65 3a 20 22 20 69 6d 61  og "image: " ima
6070: 67 65 20 22 20 74 68 75 6d 62 3a 20 22 20 74 68  ge " thumb: " th
6080: 75 6d 62 20 22 20 77 69 6b 69 5f 6b 65 79 3a 20  umb " wiki_key: 
6090: 22 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 27  " (s:get-param '
60a0: 77 69 6b 69 5f 6b 65 79 29 29 0a 09 20 20 28 69  wiki_key))..  (i
60b0: 66 20 28 61 6e 64 20 28 6d 65 6d 62 65 72 20 27  f (and (member '
60c0: 72 20 70 65 72 6d 73 29 20 69 6d 61 67 65 29 0a  r perms) image).
60d0: 09 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 76  .      (let* ((v
60e0: 61 72 6c 73 74 20 28 73 74 72 69 6e 67 2d 73 70  arlst (string-sp
60f0: 6c 69 74 20 28 73 3a 67 65 74 2d 70 61 72 61 6d  lit (s:get-param
6100: 20 27 77 69 6b 69 5f 6b 65 79 29 20 22 2d 22 29   'wiki_key) "-")
6110: 29 0a 09 09 20 20 20 20 20 28 74 6b 65 79 20 28  )...     (tkey (
6120: 74 77 69 6b 69 3a 77 65 62 36 34 64 65 63 20 28  twiki:web64dec (
6130: 63 61 64 72 20 76 61 72 6c 73 74 29 29 29 0a 09  cadr varlst)))..
6140: 09 20 20 20 20 20 28 77 69 64 20 20 28 73 74 72  .     (wid  (str
6150: 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 63 61 72  ing->number (car
6160: 20 20 76 61 72 6c 73 74 29 29 29 0a 09 09 20 20    varlst)))...  
6170: 20 20 20 28 74 64 62 6e 20 28 74 77 69 6b 69 3a     (tdbn (twiki:
6180: 6f 70 65 6e 2d 64 62 20 74 6b 65 79 20 23 66 29  open-db tkey #f)
6190: 29 29 0a 09 09 28 73 3a 6c 6f 67 20 22 74 6b 65  ))...(s:log "tke
61a0: 79 3a 20 22 20 74 6b 65 79 20 22 20 69 6d 61 67  y: " tkey " imag
61b0: 65 20 6e 75 6d 62 65 72 3a 20 22 20 69 6d 61 67  e number: " imag
61c0: 65 29 0a 09 09 28 74 77 69 6b 69 3a 72 65 74 75  e)...(twiki:retu
61d0: 72 6e 2d 69 6d 61 67 65 2d 64 61 74 20 74 64 62  rn-image-dat tdb
61e0: 6e 20 77 69 64 20 28 73 74 72 69 6e 67 2d 3e 6e  n wid (string->n
61f0: 75 6d 62 65 72 20 69 6d 61 67 65 29 29 29 29 20  umber image)))) 
6200: 3b 3b 20 64 6f 20 6e 6f 74 20 72 65 74 75 72 6e  ;; do not return
6210: 20 66 72 6f 6d 20 74 77 69 6b 69 3a 72 65 74 75   from twiki:retu
6220: 72 6e 2d 69 6d 61 67 65 0a 09 20 20 28 69 66 20  rn-image..  (if 
6230: 28 61 6e 64 20 28 6d 65 6d 62 65 72 20 27 72 20  (and (member 'r 
6240: 70 65 72 6d 73 29 20 74 68 75 6d 62 29 0a 09 20  perms) thumb).. 
6250: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 76 61 72       (let* ((var
6260: 6c 73 74 20 28 73 74 72 69 6e 67 2d 73 70 6c 69  lst (string-spli
6270: 74 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 27  t (s:get-param '
6280: 77 69 6b 69 5f 6b 65 79 29 20 22 2d 22 29 29 0a  wiki_key) "-")).
6290: 09 09 20 20 20 20 20 28 74 6b 65 79 20 20 20 28  ..     (tkey   (
62a0: 74 77 69 6b 69 3a 77 65 62 36 34 64 65 63 20 28  twiki:web64dec (
62b0: 63 61 64 72 20 76 61 72 6c 73 74 29 29 29 0a 09  cadr varlst)))..
62c0: 09 20 20 20 20 20 28 77 69 64 20 20 20 20 28 73  .     (wid    (s
62d0: 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 63  tring->number (c
62e0: 61 72 20 20 76 61 72 6c 73 74 29 29 29 0a 09 09  ar  varlst)))...
62f0: 20 20 20 20 20 28 74 64 62 6e 20 20 20 28 74 77       (tdbn   (tw
6300: 69 6b 69 3a 6f 70 65 6e 2d 64 62 20 74 6b 65 79  iki:open-db tkey
6310: 20 23 66 29 29 29 0a 09 09 28 73 3a 6c 6f 67 20   #f)))...(s:log 
6320: 22 74 6b 65 79 3a 20 22 20 74 6b 65 79 20 22 20  "tkey: " tkey " 
6330: 74 68 75 6d 62 20 6e 75 6d 62 65 72 3a 20 22 20  thumb number: " 
6340: 69 6d 61 67 65 29 0a 09 09 28 74 77 69 6b 69 3a  image)...(twiki:
6350: 72 65 74 75 72 6e 2d 74 68 75 6d 62 2d 64 61 74  return-thumb-dat
6360: 20 74 64 62 6e 20 77 69 64 20 28 73 74 72 69 6e   tdbn wid (strin
6370: 67 2d 3e 6e 75 6d 62 65 72 20 74 68 75 6d 62 29  g->number thumb)
6380: 29 29 29 29 20 3b 3b 20 64 6f 20 6e 6f 74 20 72  )))) ;; do not r
6390: 65 74 75 72 6e 20 66 72 6f 6d 20 74 77 69 6b 69  eturn from twiki
63a0: 3a 72 65 74 75 72 6e 2d 69 6d 61 67 65 0a 09 28  :return-image..(
63b0: 69 66 20 28 6e 6f 74 20 28 6d 65 6d 62 65 72 20  if (not (member 
63c0: 27 72 20 70 65 72 6d 73 29 29 20 3b 3b 20 72 65  'r perms)) ;; re
63d0: 61 64 20 61 63 63 65 73 73 0a 09 20 20 20 20 27  ad access..    '
63e0: 28 29 20 3b 3b 20 72 65 74 75 72 6e 20 61 20 62  () ;; return a b
63f0: 6c 61 6e 6b 20 73 6c 61 74 65 0a 09 20 20 20 20  lank slate..    
6400: 28 74 77 69 6b 69 3a 64 69 73 70 6c 61 79 2d 77  (twiki:display-w
6410: 69 6b 69 20 6e 61 6d 65 20 6b 65 79 73 20 70 65  iki name keys pe
6420: 72 6d 73 29 29 29 29 29 0a 0a 28 64 65 66 69 6e  rms)))))..(defin
6430: 65 20 28 74 77 69 6b 69 3a 64 69 73 70 6c 61 79  e (twiki:display
6440: 2d 77 69 6b 69 20 6e 61 6d 65 20 6b 65 79 73 20  -wiki name keys 
6450: 70 65 72 6d 73 29 0a 20 20 28 6c 65 74 2a 20 28  perms).  (let* (
6460: 28 77 69 6b 69 64 61 74 20 20 28 6d 61 6b 65 2d  (wikidat  (make-
6470: 74 77 69 6b 69 3a 77 69 6b 69 29 29 0a 09 20 28  twiki:wiki)).. (
6480: 74 6b 65 79 20 20 20 20 20 28 74 77 69 6b 69 3a  tkey     (twiki:
6490: 6b 65 79 73 2d 3e 6b 65 79 20 6b 65 79 73 29 29  keys->key keys))
64a0: 0a 09 20 28 74 64 62 20 20 20 20 20 20 28 74 77  .. (tdb      (tw
64b0: 69 6b 69 3a 6f 70 65 6e 2d 64 62 20 74 6b 65 79  iki:open-db tkey
64c0: 29 29 0a 09 20 28 77 69 64 20 20 20 20 20 20 28  )).. (wid      (
64d0: 74 77 69 6b 69 3a 6e 61 6d 65 2d 3e 77 69 64 20  twiki:name->wid 
64e0: 74 64 62 20 6e 61 6d 65 29 29 0a 09 20 28 63 76  tdb name)).. (cv
64f0: 61 72 20 20 20 20 20 28 63 6f 6e 63 20 22 43 55  ar     (conc "CU
6500: 52 52 45 4e 54 5f 54 57 49 44 4c 45 52 53 3a 22  RRENT_TWIDLERS:"
6510: 20 77 69 64 29 29 20 3b 3b 20 70 61 67 65 20 76   wid)) ;; page v
6520: 61 72 20 74 6f 20 73 74 6f 72 65 20 63 75 72 72  ar to store curr
6530: 65 6e 74 20 74 77 69 64 64 6c 65 72 73 20 62 65  ent twiddlers be
6540: 69 6e 67 20 76 69 65 77 65 64 0a 09 20 28 63 76  ing viewed.. (cv
6550: 61 72 2d 65 64 20 20 28 63 6f 6e 63 20 22 43 55  ar-ed  (conc "CU
6560: 52 52 45 4e 54 5f 54 57 49 44 4c 45 52 5f 55 4e  RRENT_TWIDLER_UN
6570: 44 45 52 5f 45 44 49 54 3a 22 20 77 69 64 29 29  DER_EDIT:" wid))
6580: 0a 09 20 28 74 6e 75 6d 65 64 69 74 20 28 69 66  .. (tnumedit (if
6590: 20 28 73 3a 67 65 74 20 63 76 61 72 2d 65 64 29   (s:get cvar-ed)
65a0: 20 0a 09 09 20 20 20 20 20 20 20 28 73 74 72 69   ...       (stri
65b0: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65  ng->number (s:ge
65c0: 74 20 63 76 61 72 2d 65 64 29 29 0a 09 09 20 20  t cvar-ed))...  
65d0: 20 20 20 20 20 23 66 29 29 20 3b 3b 20 23 66 20       #f)) ;; #f 
65e0: 3d 3e 20 6e 6f 74 68 69 6e 67 20 74 6f 20 65 64  => nothing to ed
65f0: 69 74 2c 20 2d 31 20 63 72 65 61 74 65 20 61 20  it, -1 create a 
6600: 6e 65 77 20 74 69 64 64 6c 65 72 0a 09 20 28 74  new tiddler.. (t
6610: 6e 75 6d 76 69 65 77 20 23 66 29 0a 09 20 28 6c  numview #f).. (l
6620: 6d 65 6e 75 20 20 20 20 28 74 77 69 6b 69 3a 67  menu    (twiki:g
6630: 65 74 2d 74 69 64 64 6c 65 72 73 20 74 64 62 20  et-tiddlers tdb 
6640: 77 69 64 20 28 6c 69 73 74 20 22 4d 61 69 6e 4d  wid (list "MainM
6650: 65 6e 75 22 29 29 29 0a 09 20 3b 3b 20 73 74 6f  enu"))).. ;; sto
6660: 72 65 20 74 69 64 64 6c 65 72 73 20 66 6f 72 20  re tiddlers for 
6670: 74 68 69 73 20 70 61 67 65 2f 74 77 69 6b 69 20  this page/twiki 
6680: 69 6e 20 63 76 61 72 20 28 69 2e 65 2e 20 43 55  in cvar (i.e. CU
6690: 52 52 45 4e 54 5f 54 57 49 44 4c 45 52 53 3a 3c  RRENT_TWIDLERS:<
66a0: 77 69 64 3e 0a 09 20 28 74 64 6c 6e 75 6d 73 20  wid>.. (tdlnums 
66b0: 20 28 69 66 20 28 73 3a 67 65 74 20 63 76 61 72   (if (s:get cvar
66c0: 29 0a 09 09 20 20 20 20 20 20 20 28 6d 61 70 20  )...       (map 
66d0: 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28  string->number (
66e0: 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 28 73 3a  string-split (s:
66f0: 67 65 74 20 63 76 61 72 29 20 22 2c 22 29 29 0a  get cvar) ",")).
6700: 09 09 20 20 20 20 20 20 20 27 28 29 29 29 20 3b  ..       '())) ;
6710: 3b 20 6c 69 73 74 20 6f 66 20 74 69 64 64 6c 65  ; list of tiddle
6720: 72 20 6e 75 6d 62 65 72 73 0a 09 20 28 74 64 6c  r numbers.. (tdl
6730: 72 73 20 20 20 20 27 28 29 29 0a 09 20 28 74 65  rs    '()).. (te
6740: 64 69 74 65 64 20 20 28 69 66 20 28 6d 65 6d 62  dited  (if (memb
6750: 65 72 20 27 77 20 70 65 72 6d 73 29 20 23 66 20  er 'w perms) #f 
6760: 23 74 29 29 20 3b 3b 20 66 6f 72 63 65 20 6e 6f  #t)) ;; force no
6770: 20 65 64 69 74 73 20 69 66 20 6e 6f 74 20 61 20   edits if not a 
6780: 77 72 69 74 65 72 0a 09 20 28 65 64 69 74 2d 74  writer.. (edit-t
6790: 6d 65 6e 75 2d 69 64 20 28 69 66 20 28 61 6e 64  menu-id (if (and
67a0: 20 28 6d 65 6d 62 65 72 20 27 77 20 70 65 72 6d   (member 'w perm
67b0: 73 29 0a 09 09 09 09 20 28 73 3a 67 65 74 2d 70  s)..... (s:get-p
67c0: 61 72 61 6d 20 22 65 64 69 74 5f 74 6d 65 6e 75  aram "edit_tmenu
67d0: 22 29 29 0a 09 09 09 20 20 20 20 28 73 74 72 69  "))....    (stri
67e0: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65  ng->number (s:ge
67f0: 74 2d 70 61 72 61 6d 20 22 65 64 69 74 5f 74 6d  t-param "edit_tm
6800: 65 6e 75 22 29 29 0a 09 09 09 20 20 20 20 23 66  enu"))....    #f
6810: 29 29 0a 09 20 28 65 64 69 74 2d 74 69 64 64 6c  )).. (edit-tiddl
6820: 65 72 20 28 69 66 20 20 28 61 6e 64 20 28 6d 65  er (if  (and (me
6830: 6d 62 65 72 20 27 77 20 70 65 72 6d 73 29 0a 09  mber 'w perms)..
6840: 09 09 09 20 28 73 3a 67 65 74 2d 70 61 72 61 6d  ... (s:get-param
6850: 20 22 65 64 69 74 5f 74 69 64 64 6c 65 72 22 29   "edit_tiddler")
6860: 29 20 3b 3b 20 74 68 69 73 20 68 61 6e 64 6c 65  ) ;; this handle
6870: 73 20 74 68 65 20 22 65 64 69 74 22 20 6c 69 6e  s the "edit" lin
6880: 6b 20 69 6e 20 74 68 65 20 74 69 64 64 6c 65 72  k in the tiddler
6890: 20 63 6f 6e 74 72 6f 6c 20 62 61 72 0a 09 09 09   control bar....
68a0: 20 20 20 20 28 6c 65 74 20 28 28 74 20 28 74 77      (let ((t (tw
68b0: 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65 72 73  iki:get-tiddlers
68c0: 2d 62 79 2d 6e 75 6d 20 74 64 62 20 77 69 64 20  -by-num tdb wid 
68d0: 28 6c 69 73 74 20 28 73 74 72 69 6e 67 2d 3e 6e  (list (string->n
68e0: 75 6d 62 65 72 20 28 73 3a 67 65 74 2d 70 61 72  umber (s:get-par
68f0: 61 6d 20 22 65 64 69 74 5f 74 69 64 64 6c 65 72  am "edit_tiddler
6900: 22 29 29 29 29 29 29 0a 09 09 09 20 20 20 20 20  "))))))....     
6910: 20 28 73 3a 6c 6f 67 20 22 74 3a 20 22 20 74 29   (s:log "t: " t)
6920: 0a 09 09 09 20 20 20 20 20 20 28 69 66 20 74 0a  ....      (if t.
6930: 09 09 09 09 20 20 28 63 61 72 20 74 20 29 20 3b  ....  (car t ) ;
6940: 3b 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6c 69  ; should be a li
6950: 73 74 20 6f 66 20 6f 6e 65 0a 09 09 09 09 20 20  st of one.....  
6960: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73  (twiki:tiddler-s
6970: 65 74 2d 6e 61 6d 65 21 0a 09 09 09 09 20 20 20  et-name!.....   
6980: 28 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73  (twiki:tiddler-s
6990: 65 74 2d 69 64 21 20 28 74 77 69 6b 69 3a 74 69  et-id! (twiki:ti
69a0: 64 64 6c 65 72 2d 6d 61 6b 65 29 20 2d 31 29 20  ddler-make) -1) 
69b0: 22 4e 65 77 54 69 64 64 6c 65 72 22 29 29 29 0a  "NewTiddler"))).
69c0: 09 09 09 20 20 20 20 23 66 29 29 0a 09 20 28 76  ...    #f)).. (v
69d0: 69 65 77 2d 74 69 64 64 6c 65 72 20 28 69 66 20  iew-tiddler (if 
69e0: 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 76 69  (s:get-param "vi
69f0: 65 77 5f 74 69 64 64 6c 65 72 22 29 0a 09 09 09  ew_tiddler")....
6a00: 20 20 20 28 6c 65 74 2a 20 28 28 74 6e 61 6d 65     (let* ((tname
6a10: 20 28 74 77 69 6b 69 3a 77 65 62 36 34 64 65 63   (twiki:web64dec
6a20: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 76   (s:get-param "v
6a30: 69 65 77 5f 74 69 64 64 6c 65 72 22 29 29 29 0a  iew_tiddler"))).
6a40: 09 09 09 09 20 20 28 74 20 20 20 20 20 28 74 77  ....  (t     (tw
6a50: 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65 72 2d  iki:get-tiddler-
6a60: 62 79 2d 6e 61 6d 65 20 74 64 62 20 77 69 64 20  by-name tdb wid 
6a70: 74 6e 61 6d 65 29 29 29 0a 09 09 09 20 20 20 20  tname)))....    
6a80: 20 28 73 3a 6c 6f 67 20 22 74 3a 20 22 20 74 29   (s:log "t: " t)
6a90: 0a 09 09 09 20 20 20 20 20 28 69 66 20 74 0a 09  ....     (if t..
6aa0: 09 09 09 20 74 20 0a 09 09 09 09 20 28 62 65 67  ... t ..... (beg
6ab0: 69 6e 0a 09 09 09 09 20 20 20 28 74 77 69 6b 69  in.....   (twiki
6ac0: 3a 73 61 76 65 2d 74 69 64 64 6c 65 72 20 74 64  :save-tiddler td
6ad0: 62 20 74 6e 61 6d 65 20 28 63 6f 6e 63 20 22 21  b tname (conc "!
6ae0: 22 20 74 6e 61 6d 65 29 20 22 22 20 77 69 64 20  " tname) "" wid 
6af0: 28 74 77 69 6b 69 3a 67 65 74 2d 69 64 29 29 0a  (twiki:get-id)).
6b00: 09 09 09 09 20 20 20 28 74 77 69 6b 69 3a 67 65  ....   (twiki:ge
6b10: 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e 61 6d  t-tiddler-by-nam
6b20: 65 20 74 64 62 20 77 69 64 20 74 6e 61 6d 65 29  e tdb wid tname)
6b30: 29 29 29 0a 09 09 09 20 20 20 23 66 29 29 0a 09  )))....   #f))..
6b40: 20 29 20 3b 3b 20 69 6d 61 67 65 20 69 73 20 74   ) ;; image is t
6b50: 68 65 20 64 61 74 5f 69 64 2c 20 6b 65 65 70 20  he dat_id, keep 
6b60: 69 74 20 73 69 6d 70 6c 65 20 73 69 6c 6c 79 2e  it simple silly.
6b70: 0a 0a 20 20 20 20 28 74 77 69 6b 69 3a 77 69 6b  ..    (twiki:wik
6b80: 69 2d 73 65 74 2d 77 69 64 21 20 20 77 69 6b 69  i-set-wid!  wiki
6b90: 64 61 74 20 77 69 64 29 0a 20 20 20 20 28 74 77  dat wid).    (tw
6ba0: 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 6b 65 79  iki:wiki-set-key
6bb0: 21 20 20 77 69 6b 69 64 61 74 20 74 6b 65 79 29  !  wikidat tkey)
6bc0: 0a 20 20 20 20 28 74 77 69 6b 69 3a 77 69 6b 69  .    (twiki:wiki
6bd0: 2d 73 65 74 2d 6e 61 6d 65 21 20 77 69 6b 69 64  -set-name! wikid
6be0: 61 74 20 6e 61 6d 65 29 0a 20 20 20 20 28 74 77  at name).    (tw
6bf0: 69 6b 69 3a 77 69 6b 69 2d 73 65 74 2d 64 62 68  iki:wiki-set-dbh
6c00: 21 20 20 77 69 6b 69 64 61 74 20 74 64 62 29 0a  !  wikidat tdb).
6c10: 20 20 20 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d      (twiki:wiki-
6c20: 73 65 74 2d 70 65 72 6d 73 21 20 77 69 6b 69 64  set-perms! wikid
6c30: 61 74 20 70 65 72 6d 73 29 0a 0a 20 20 20 20 3b  at perms)..    ;
6c40: 3b 20 28 73 3a 6c 6f 67 20 22 65 64 69 74 2d 74  ; (s:log "edit-t
6c50: 6d 65 6e 75 2d 69 64 3a 20 22 20 65 64 69 74 2d  menu-id: " edit-
6c60: 74 6d 65 6e 75 2d 69 64 20 22 20 65 64 69 74 2d  tmenu-id " edit-
6c70: 74 69 64 64 6c 65 72 3a 20 22 20 65 64 69 74 2d  tiddler: " edit-
6c80: 74 69 64 64 6c 65 72 29 0a 0a 20 20 20 20 3b 3b  tiddler)..    ;;
6c90: 20 48 61 6e 64 6c 65 20 6f 74 68 65 72 20 55 52   Handle other UR
6ca0: 49 20 63 6f 6d 6d 61 6e 64 73 20 68 65 72 65 0a  I commands here.
6cb0: 20 20 20 20 28 69 66 20 28 73 3a 67 65 74 2d 70      (if (s:get-p
6cc0: 61 72 61 6d 20 22 63 61 6e 63 65 6c 5f 74 65 64  aram "cancel_ted
6cd0: 69 74 22 29 20 3b 3b 20 64 6f 65 73 6e 27 74 20  it") ;; doesn't 
6ce0: 6d 61 74 74 65 72 20 77 68 69 63 68 20 74 69 64  matter which tid
6cf0: 64 6c 65 72 20 2d 20 6a 75 73 74 20 75 73 65 20  dler - just use 
6d00: 74 68 69 73 20 74 6f 20 63 61 6e 63 65 6c 20 61  this to cancel a
6d10: 6e 79 20 65 64 69 74 0a 09 28 62 65 67 69 6e 0a  ny edit..(begin.
6d20: 09 20 20 28 73 3a 64 65 6c 21 20 28 63 6f 6e 63  .  (s:del! (conc
6d30: 20 22 43 55 52 52 45 4e 54 5f 54 57 49 44 4c 45   "CURRENT_TWIDLE
6d40: 52 5f 55 4e 44 45 52 5f 45 44 49 54 3a 22 20 77  R_UNDER_EDIT:" w
6d50: 69 64 29 29 0a 09 20 20 28 73 65 74 21 20 65 64  id))..  (set! ed
6d60: 69 74 2d 74 69 64 64 6c 65 72 20 23 66 29 0a 09  it-tiddler #f)..
6d70: 20 20 28 73 65 74 21 20 74 6e 75 6d 65 64 69 74    (set! tnumedit
6d80: 20 23 66 29 0a 09 20 20 28 73 65 74 21 20 76 69   #f)..  (set! vi
6d90: 65 77 2d 74 69 64 64 6c 65 72 20 23 66 29 0a 09  ew-tiddler #f)..
6da0: 20 20 28 74 77 69 6b 69 3a 6e 6f 72 6d 61 6c 69    (twiki:normali
6db0: 7a 65 2d 63 75 72 72 65 6e 74 2d 74 77 69 64 64  ze-current-twidd
6dc0: 6c 65 72 73 20 74 64 62 20 77 69 64 29 0a 09 20  lers tdb wid).. 
6dd0: 20 28 69 66 20 28 73 3a 67 65 74 20 63 76 61 72   (if (s:get cvar
6de0: 29 0a 09 20 20 20 20 20 20 28 73 65 74 21 20 74  )..      (set! t
6df0: 64 6c 6e 75 6d 73 20 28 6d 61 70 20 73 74 72 69  dlnums (map stri
6e00: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73 74 72 69  ng->number (stri
6e10: 6e 67 2d 73 70 6c 69 74 20 28 73 3a 67 65 74 20  ng-split (s:get 
6e20: 63 76 61 72 29 20 22 2c 22 29 29 29 29 29 29 0a  cvar) ",")))))).
6e30: 20 20 20 20 28 69 66 20 28 73 3a 67 65 74 2d 70      (if (s:get-p
6e40: 61 72 61 6d 20 22 64 65 6c 65 74 65 5f 74 69 64  aram "delete_tid
6e50: 64 6c 65 72 22 29 20 27 28 29 29 0a 20 20 20 20  dler") '()).    
6e60: 3b 3b 20 28 74 77 69 6b 69 3a 64 65 6c 65 74 65  ;; (twiki:delete
6e70: 5f 74 69 64 64 6c 65 72 20 74 64 62 20 77 69 64  _tiddler tdb wid
6e80: 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72   (string->number
6e90: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 64   (s:get-param "d
6ea0: 65 6c 65 74 65 5f 74 69 64 64 6c 65 72 22 29 29  elete_tiddler"))
6eb0: 29 29 0a 0a 20 20 20 20 28 73 3a 73 65 74 21 20  ))..    (s:set! 
6ec0: 22 54 57 49 4b 49 5f 4b 45 59 22 20 74 6b 65 79  "TWIKI_KEY" tkey
6ed0: 29 20 3b 3b 20 74 68 69 73 20 6d 65 63 68 61 6e  ) ;; this mechan
6ee0: 69 73 6d 20 77 69 6c 6c 20 66 61 69 6c 20 66 6f  ism will fail fo
6ef0: 72 20 68 69 65 72 61 72 63 68 69 61 6c 20 74 77  r hierarchial tw
6f00: 69 6b 69 73 0a 20 20 20 20 3b 3b 20 6f 76 65 72  ikis.    ;; over
6f10: 72 69 64 65 20 74 68 65 20 74 77 69 64 64 6c 65  ride the twiddle
6f20: 72 20 74 6f 20 65 64 69 74 20 77 68 65 6e 20 65  r to edit when e
6f30: 64 69 74 69 6e 67 20 4d 61 69 6e 4d 65 6e 75 0a  diting MainMenu.
6f40: 20 20 20 20 28 69 66 20 65 64 69 74 2d 74 69 64      (if edit-tid
6f50: 64 6c 65 72 0a 09 28 62 65 67 69 6e 0a 09 20 20  dler..(begin..  
6f60: 28 73 65 74 21 20 74 6e 75 6d 65 64 69 74 20 28  (set! tnumedit (
6f70: 74 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65  twiki:tiddler-ge
6f80: 74 2d 69 64 20 65 64 69 74 2d 74 69 64 64 6c 65  t-id edit-tiddle
6f90: 72 29 29 0a 09 20 20 28 73 3a 73 65 74 21 20 27  r))..  (s:set! '
6fa0: 74 77 69 6b 69 5f 74 69 74 6c 65 20 28 74 77 69  twiki_title (twi
6fb0: 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74 2d 6e  ki:tiddler-get-n
6fc0: 61 6d 65 20 65 64 69 74 2d 74 69 64 64 6c 65 72  ame edit-tiddler
6fd0: 29 29 0a 09 20 20 28 73 3a 73 65 74 21 20 27 74  ))..  (s:set! 't
6fe0: 77 69 6b 69 5f 62 6f 64 79 20 20 28 74 77 69 6b  wiki_body  (twik
6ff0: 69 3a 67 65 74 2d 64 61 74 20 74 64 62 20 28 74  i:get-dat tdb (t
7000: 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74  wiki:tiddler-get
7010: 2d 64 61 74 2d 69 64 20 65 64 69 74 2d 74 69 64  -dat-id edit-tid
7020: 64 6c 65 72 29 29 29 29 29 0a 20 20 20 20 28 69  dler))))).    (i
7030: 66 20 76 69 65 77 2d 74 69 64 64 6c 65 72 0a 09  f view-tiddler..
7040: 28 62 65 67 69 6e 0a 09 20 20 28 73 65 74 21 20  (begin..  (set! 
7050: 74 6e 75 6d 76 69 65 77 20 28 74 77 69 6b 69 3a  tnumview (twiki:
7060: 74 69 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 76  tiddler-get-id v
7070: 69 65 77 2d 74 69 64 64 6c 65 72 29 29 29 29 0a  iew-tiddler)))).
7080: 20 20 20 20 0a 20 20 20 20 3b 3b 20 4e 4f 57 20      .    ;; NOW 
7090: 57 48 41 54 20 46 4f 52 20 56 49 45 57 20 2d 20  WHAT FOR VIEW - 
70a0: 66 69 78 20 74 68 65 20 6c 69 6e 6b 73 2c 20 61  fix the links, a
70b0: 64 64 20 74 6f 20 74 64 6c 73 74 0a 0a 0a 20 20  dd to tdlst...  
70c0: 20 20 28 69 66 20 65 64 69 74 2d 74 6d 65 6e 75    (if edit-tmenu
70d0: 2d 69 64 20 20 20 28 73 65 74 21 20 74 6e 75 6d  -id   (set! tnum
70e0: 65 64 69 74 20 65 64 69 74 2d 74 6d 65 6e 75 2d  edit edit-tmenu-
70f0: 69 64 29 29 0a 20 20 20 20 28 69 66 20 74 6e 75  id)).    (if tnu
7100: 6d 65 64 69 74 20 28 73 65 74 21 20 74 64 6c 6e  medit (set! tdln
7110: 75 6d 73 20 28 63 6f 6e 73 20 74 6e 75 6d 65 64  ums (cons tnumed
7120: 69 74 20 74 64 6c 6e 75 6d 73 29 29 29 0a 20 20  it tdlnums))).  
7130: 20 20 28 69 66 20 74 6e 75 6d 76 69 65 77 20 28    (if tnumview (
7140: 73 65 74 21 20 74 64 6c 6e 75 6d 73 20 28 63 6f  set! tdlnums (co
7150: 6e 73 20 74 6e 75 6d 76 69 65 77 20 74 64 6c 6e  ns tnumview tdln
7160: 75 6d 73 29 29 29 0a 20 20 20 20 28 73 65 74 21  ums))).    (set!
7170: 20 74 64 6c 72 73 20 28 74 77 69 6b 69 3a 67 65   tdlrs (twiki:ge
7180: 74 2d 74 69 64 64 6c 65 72 73 2d 62 79 2d 6e 75  t-tiddlers-by-nu
7190: 6d 20 74 64 62 20 77 69 64 20 74 64 6c 6e 75 6d  m tdb wid tdlnum
71a0: 73 29 29 0a 0a 20 20 20 20 3b 3b 20 72 65 6d 6f  s))..    ;; remo
71b0: 76 65 20 74 64 6c 72 73 20 66 72 6f 6d 20 74 68  ve tdlrs from th
71c0: 65 20 6c 69 73 74 20 69 66 20 63 6c 6f 73 65 5f  e list if close_
71d0: 74 69 64 64 6c 65 72 20 63 61 6c 6c 65 64 0a 20  tiddler called. 
71e0: 20 20 20 28 69 66 20 28 73 3a 67 65 74 2d 70 61     (if (s:get-pa
71f0: 72 61 6d 20 22 63 6c 6f 73 65 5f 74 69 64 64 6c  ram "close_tiddl
7200: 65 72 22 29 0a 09 28 73 65 74 21 20 74 64 6c 72  er")..(set! tdlr
7210: 73 20 28 6c 65 74 20 28 28 74 6e 75 6d 20 28 73  s (let ((tnum (s
7220: 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 73  tring->number (s
7230: 3a 67 65 74 2d 70 61 72 61 6d 20 22 63 6c 6f 73  :get-param "clos
7240: 65 5f 74 69 64 64 6c 65 72 22 29 29 29 29 0a 09  e_tiddler"))))..
7250: 09 20 20 20 20 20 20 28 72 65 6d 6f 76 65 20 28  .      (remove (
7260: 6c 61 6d 62 64 61 20 28 74 29 0a 09 09 09 09 28  lambda (t).....(
7270: 65 71 75 61 6c 3f 20 28 74 77 69 6b 69 3a 74 69  equal? (twiki:ti
7280: 64 64 6c 65 72 2d 67 65 74 2d 69 64 20 74 29 20  ddler-get-id t) 
7290: 74 6e 75 6d 29 29 0a 09 09 09 20 20 20 20 20 20  tnum))....      
72a0: 74 64 6c 72 73 29 29 29 29 0a 0a 20 20 20 20 3b  tdlrs))))..    ;
72b0: 3b 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6f 74 68  ; remove all oth
72c0: 65 72 73 20 69 66 20 63 6c 6f 73 65 5f 6f 74 68  ers if close_oth
72d0: 65 72 5f 74 69 64 64 6c 65 72 73 20 63 61 6c 6c  er_tiddlers call
72e0: 65 64 0a 20 20 20 20 28 69 66 20 28 73 3a 67 65  ed.    (if (s:ge
72f0: 74 2d 70 61 72 61 6d 20 22 63 6c 6f 73 65 5f 6f  t-param "close_o
7300: 74 68 65 72 5f 74 69 64 64 6c 65 72 73 22 29 0a  ther_tiddlers").
7310: 09 28 73 65 74 21 20 74 64 6c 72 73 20 28 6c 65  .(set! tdlrs (le
7320: 74 20 28 28 74 6e 75 6d 20 28 73 74 72 69 6e 67  t ((tnum (string
7330: 2d 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65 74 2d  ->number (s:get-
7340: 70 61 72 61 6d 20 22 63 6c 6f 73 65 5f 6f 74 68  param "close_oth
7350: 65 72 5f 74 69 64 64 6c 65 72 73 22 29 29 29 29  er_tiddlers"))))
7360: 0a 09 09 20 20 20 20 20 20 28 72 65 6d 6f 76 65  ...      (remove
7370: 20 28 6c 61 6d 62 64 61 20 28 74 29 0a 09 09 09   (lambda (t)....
7380: 09 28 6e 6f 74 20 28 65 71 75 61 6c 3f 20 28 74  .(not (equal? (t
7390: 77 69 6b 69 3a 74 69 64 64 6c 65 72 2d 67 65 74  wiki:tiddler-get
73a0: 2d 69 64 20 74 29 20 74 6e 75 6d 29 29 29 0a 09  -id t) tnum)))..
73b0: 09 09 20 20 20 20 20 20 74 64 6c 72 73 29 29 29  ..      tdlrs)))
73c0: 29 0a 20 20 20 20 0a 20 20 20 20 28 73 3a 73 65  ).    .    (s:se
73d0: 74 21 20 63 76 61 72 20 28 74 77 69 6b 69 3a 6d  t! cvar (twiki:m
73e0: 61 6b 65 2d 74 69 64 64 6c 65 72 2d 6c 69 73 74  ake-tiddler-list
73f0: 20 74 64 6c 72 73 29 29 0a 20 20 20 20 28 69 66   tdlrs)).    (if
7400: 20 74 6e 75 6d 65 64 69 74 20 0a 09 28 73 3a 73   tnumedit ..(s:s
7410: 65 74 21 20 63 76 61 72 2d 65 64 20 74 6e 75 6d  et! cvar-ed tnum
7420: 65 64 69 74 29 0a 09 28 73 3a 64 65 6c 21 20 63  edit)..(s:del! c
7430: 76 61 72 2d 65 64 29 29 0a 0a 20 20 20 20 3b 3b  var-ed))..    ;;
7440: 20 6d 75 73 74 20 68 61 76 65 20 61 20 4d 61 69   must have a Mai
7450: 6e 4d 65 6e 75 20 74 69 64 64 6c 65 72 20 62 79  nMenu tiddler by
7460: 20 6e 6f 77 0a 20 20 20 20 28 69 66 20 28 6e 75   now.    (if (nu
7470: 6c 6c 3f 20 6c 6d 65 6e 75 29 0a 09 28 62 65 67  ll? lmenu)..(beg
7480: 69 6e 0a 09 20 20 28 74 77 69 6b 69 3a 73 61 76  in..  (twiki:sav
7490: 65 2d 74 69 64 64 6c 65 72 20 74 64 62 20 22 4d  e-tiddler tdb "M
74a0: 61 69 6e 4d 65 6e 75 22 20 22 22 20 22 22 20 77  ainMenu" "" "" w
74b0: 69 64 20 28 74 77 69 6b 69 3a 67 65 74 2d 69 64  id (twiki:get-id
74c0: 29 29 0a 09 20 20 28 73 65 74 21 20 6c 6d 65 6e  ))..  (set! lmen
74d0: 75 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64  u (twiki:get-tid
74e0: 64 6c 65 72 73 20 74 64 62 20 77 69 64 20 28 6c  dlers tdb wid (l
74f0: 69 73 74 20 22 4d 61 69 6e 4d 65 6e 75 22 29 29  ist "MainMenu"))
7500: 29 29 29 0a 20 20 20 20 0a 20 20 20 20 3b 3b 20  ))).    .    ;; 
7510: 67 65 74 20 74 68 65 20 74 69 64 64 6c 65 72 73  get the tiddlers
7520: 20 66 72 6f 6d 20 74 68 65 20 64 62 20 6e 6f 77   from the db now
7530: 0a 20 20 20 20 28 73 65 74 21 20 72 65 73 75 6c  .    (set! resul
7540: 74 0a 09 20 20 28 73 3a 74 61 62 6c 65 0a 09 20  t..  (s:table.. 
7550: 20 20 3b 3b 20 3b 3b 20 41 20 68 65 61 64 65 72    ;; ;; A header
7560: 20 72 6f 77 20 4d 61 69 6e 4d 65 6e 75 20 20 20   row MainMenu   
7570: 57 69 6b 69 4e 61 6d 65 20 20 20 20 4f 74 68 65  WikiName    Othe
7580: 72 0a 09 20 20 20 3b 3b 20 28 73 3a 74 72 0a 09  r..   ;; (s:tr..
7590: 20 20 20 3b 3b 20 20 28 73 3a 74 64 0a 09 20 20     ;;  (s:td..  
75a0: 20 3b 3b 20 20 20 28 6c 65 74 20 28 28 6d 61 69   ;;   (let ((mai
75b0: 6e 2d 6d 65 6e 75 2d 74 6e 75 6d 20 20 28 74 77  n-menu-tnum  (tw
75c0: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 6e 61 6d 65  iki:tiddler-name
75d0: 2d 3e 69 64 20 74 64 62 20 22 4d 61 69 6e 4d 65  ->id tdb "MainMe
75e0: 6e 75 22 29 29 29 0a 09 20 20 20 3b 3b 20 20 20  nu")))..   ;;   
75f0: 20 20 28 69 66 20 65 64 69 74 2d 74 6d 65 6e 75    (if edit-tmenu
7600: 2d 69 64 0a 09 20 20 20 3b 3b 20 20 20 20 20 20  -id..   ;;      
7610: 20 20 20 22 4d 61 69 6e 4d 65 6e 75 22 0a 09 20     "MainMenu".. 
7620: 20 20 3b 3b 20 20 20 20 20 20 20 20 20 28 73 3a    ;;         (s:
7630: 61 20 22 4d 61 69 6e 4d 65 6e 75 22 20 27 68 72  a "MainMenu" 'hr
7640: 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 28 74  ef (s:link-to (t
7650: 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d 62 61  wiki:get-link-ba
7660: 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29 20 27  ck-to-current) '
7670: 65 64 69 74 5f 74 6d 65 6e 75 20 6d 61 69 6e 2d  edit_tmenu main-
7680: 6d 65 6e 75 2d 74 6e 75 6d 29 29 29 29 29 0a 09  menu-tnum)))))..
7690: 20 20 20 3b 3b 20 20 28 73 3a 74 64 20 28 74 77     ;;  (s:td (tw
76a0: 69 6b 69 3a 6b 65 79 2d 3e 66 6e 61 6d 65 20 74  iki:key->fname t
76b0: 6b 65 79 29 29 20 20 20 20 0a 09 20 20 20 3b 3b  key))    ..   ;;
76c0: 20 20 28 73 3a 74 64 20 22 22 29 29 0a 09 20 20    (s:td ""))..  
76d0: 20 28 73 3a 74 72 0a 09 20 20 20 20 3b 3b 20 54   (s:tr..    ;; T
76e0: 68 65 20 6d 65 6e 75 20 63 6f 6c 75 6d 6e 20 28  he menu column (
76f0: 6d 75 73 74 20 64 6f 20 61 6c 6c 20 74 68 69 73  must do all this
7700: 20 77 69 74 68 20 63 73 73 20 73 6f 6d 65 20 74   with css some t
7710: 69 6d 65 29 0a 09 20 20 20 20 3b 3b 20 4a 75 6c  ime)..    ;; Jul
7720: 79 20 35 2c 20 32 30 31 30 2c 20 61 74 74 65 6d  y 5, 2010, attem
7730: 70 74 69 6e 67 20 74 6f 20 73 77 69 74 63 68 20  pting to switch 
7740: 74 6f 20 61 20 74 6f 70 20 6d 65 6e 75 0a 09 20  to a top menu.. 
7750: 20 20 20 3b 3b 20 28 73 3a 74 64 20 27 63 6c 61     ;; (s:td 'cla
7760: 73 73 20 22 63 6f 6c 31 2d 74 69 64 64 6c 65 72  ss "col1-tiddler
7770: 22 20 28 74 77 69 6b 69 3a 76 69 65 77 2d 74 69  " (twiki:view-ti
7780: 64 64 6c 65 72 20 74 64 62 20 20 74 6b 65 79 20  ddler tdb  tkey 
7790: 77 69 64 20 28 63 61 72 20 6c 6d 65 6e 75 29 20  wid (car lmenu) 
77a0: 77 69 6b 69 64 61 74 29 29 0a 09 20 20 20 20 28  wikidat))..    (
77b0: 73 3a 74 64 20 27 63 6c 61 73 73 20 22 63 6f 6c  s:td 'class "col
77c0: 32 2d 74 69 64 64 6c 65 72 22 20 28 74 77 69 6b  2-tiddler" (twik
77d0: 69 3a 76 69 65 77 2d 74 69 64 64 6c 65 72 20 74  i:view-tiddler t
77e0: 64 62 20 20 74 6b 65 79 20 77 69 64 20 28 63 61  db  tkey wid (ca
77f0: 72 20 6c 6d 65 6e 75 29 20 77 69 6b 69 64 61 74  r lmenu) wikidat
7800: 29 20 27 63 6f 6c 73 70 61 6e 20 22 32 22 29 29  ) 'colspan "2"))
7810: 0a 09 20 20 20 28 73 3a 74 72 0a 09 20 20 20 20  ..   (s:tr..    
7820: 28 73 3a 74 64 20 27 63 6c 61 73 73 20 22 63 6f  (s:td 'class "co
7830: 6c 32 2d 74 69 64 64 6c 65 72 22 20 0a 09 09 20  l2-tiddler" ... 
7840: 20 3b 3b 20 74 68 69 73 20 69 73 20 70 72 6f 62   ;; this is prob
7850: 61 62 6c 79 20 6e 6f 74 20 6e 65 65 64 65 64 20  ably not needed 
7860: 61 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  as there is no r
7870: 65 61 73 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  eason to create 
7880: 74 69 64 64 6c 65 72 73 20 74 68 69 73 20 77 61  tiddlers this wa
7890: 79 0a 09 09 20 20 3b 3b 20 28 69 66 20 28 65 71  y...  ;; (if (eq
78a0: 3f 20 74 6e 75 6d 65 64 69 74 20 2d 31 29 28 74  ? tnumedit -1)(t
78b0: 77 69 6b 69 3a 65 64 69 74 2d 74 69 64 64 6c 65  wiki:edit-tiddle
78c0: 72 20 74 64 62 20 74 6b 65 79 20 77 69 64 20 74  r tdb tkey wid t
78d0: 6e 75 6d 65 64 69 74 29 20 27 28 29 29 0a 09 09  numedit) '())...
78e0: 20 20 3b 3b 20 69 6e 73 65 72 74 20 74 68 65 20    ;; insert the 
78f0: 70 69 63 74 75 72 65 20 65 64 69 74 6f 72 20 77  picture editor w
7900: 69 6e 64 6f 77 20 69 66 20 65 6e 61 62 6c 65 64  indow if enabled
7910: 0a 09 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f  ...  (if (equal?
7920: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 74   (s:get-param "t
7930: 77 69 6b 69 5f 6d 61 69 6e 74 22 29 20 22 32 22  wiki_maint") "2"
7940: 29 28 74 77 69 6b 69 3a 70 69 63 5f 6d 67 6d 74  )(twiki:pic_mgmt
7950: 20 74 64 62 20 77 69 64 20 74 6b 65 79 29 20 27   tdb wid tkey) '
7960: 28 29 29 0a 09 09 20 20 28 69 66 20 28 65 71 75  ())...  (if (equ
7970: 61 6c 3f 20 28 73 3a 67 65 74 2d 70 61 72 61 6d  al? (s:get-param
7980: 20 22 74 77 69 6b 69 5f 6d 61 69 6e 74 22 29 20   "twiki_maint") 
7990: 22 34 22 29 28 74 77 69 6b 69 3a 68 65 6c 70 20  "4")(twiki:help 
79a0: 31 29 20 27 28 29 29 0a 09 09 20 20 28 69 66 20  1) '())...  (if 
79b0: 28 6e 6f 74 20 28 6e 75 6c 6c 3f 20 74 64 6c 72  (not (null? tdlr
79c0: 73 29 29 0a 09 09 20 20 20 20 20 20 28 6d 61 70  s))...      (map
79d0: 20 28 6c 61 6d 62 64 61 20 28 74 64 6c 72 29 0a   (lambda (tdlr).
79e0: 09 09 09 20 20 20 20 20 28 6c 65 74 20 28 28 74  ...     (let ((t
79f0: 6e 75 6d 20 20 28 74 77 69 6b 69 3a 74 69 64 64  num  (twiki:tidd
7a00: 6c 65 72 2d 67 65 74 2d 69 64 20 74 64 6c 72 29  ler-get-id tdlr)
7a10: 29 29 0a 09 09 09 20 20 20 20 20 20 20 28 73 3a  ))....       (s:
7a20: 6c 6f 67 20 22 74 6e 75 6d 3a 20 22 20 74 6e 75  log "tnum: " tnu
7a30: 6d 20 22 20 74 6e 75 6d 65 64 69 74 3a 20 22 20  m " tnumedit: " 
7a40: 74 6e 75 6d 65 64 69 74 29 0a 09 09 09 20 20 20  tnumedit)....   
7a50: 20 20 20 20 28 69 66 20 28 61 6e 64 20 74 6e 75      (if (and tnu
7a60: 6d 65 64 69 74 20 28 6e 6f 74 20 74 65 64 69 74  medit (not tedit
7a70: 65 64 29 20 28 65 71 75 61 6c 3f 20 74 6e 75 6d  ed) (equal? tnum
7a80: 65 64 69 74 20 74 6e 75 6d 29 29 0a 09 09 09 09  edit tnum)).....
7a90: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 09 20 20     (begin.....  
7aa0: 20 20 20 28 73 65 74 21 20 74 65 64 69 74 65 64     (set! tedited
7ab0: 20 23 74 29 20 3b 3b 20 6f 6e 6c 79 20 61 6c 6c   #t) ;; only all
7ac0: 6f 77 20 65 64 69 74 69 6e 67 20 6f 6e 65 20 74  ow editing one t
7ad0: 69 64 64 6c 65 72 20 61 74 20 61 20 74 69 6d 65  iddler at a time
7ae0: 0a 09 09 09 09 20 20 20 20 20 28 74 77 69 6b 69  .....     (twiki
7af0: 3a 65 64 69 74 2d 74 69 64 64 6c 65 72 20 74 64  :edit-tiddler td
7b00: 62 20 74 6b 65 79 20 77 69 64 20 74 6e 75 6d 29  b tkey wid tnum)
7b10: 29 0a 09 09 09 09 20 20 20 28 74 77 69 6b 69 3a  ).....   (twiki:
7b20: 76 69 65 77 2d 74 69 64 64 6c 65 72 20 74 64 62  view-tiddler tdb
7b30: 20 20 74 6b 65 79 20 77 69 64 20 74 64 6c 72 20    tkey wid tdlr 
7b40: 77 69 6b 69 64 61 74 29 29 29 29 0a 09 09 09 20  wikidat)))).... 
7b50: 20 20 74 64 6c 72 73 29 0a 09 09 20 20 20 20 20    tdlrs)...     
7b60: 20 27 28 29 29 29 0a 09 20 20 20 20 28 73 3a 74   '()))..    (s:t
7b70: 64 20 20 27 76 61 6c 69 67 6e 20 22 74 6f 70 22  d  'valign "top"
7b80: 20 27 63 6c 61 73 73 20 22 74 69 64 64 6c 65 72   'class "tiddler
7b90: 2d 74 6f 70 22 20 28 74 77 69 6b 69 3a 6d 61 69  -top" (twiki:mai
7ba0: 6e 74 5f 61 72 65 61 20 74 64 62 20 77 69 64 20  nt_area tdb wid 
7bb0: 74 6b 65 79 20 77 69 6b 69 64 61 74 29 29 29 29  tkey wikidat))))
7bc0: 29 0a 20 20 20 20 28 64 62 69 3a 63 6c 6f 73 65  ).    (dbi:close
7bd0: 20 74 64 62 29 0a 20 20 20 20 72 65 73 75 6c 74   tdb).    result
7be0: 29 29 0a 0a 3b 3b 20 73 68 6f 75 6c 64 20 64 6f  ))..;; should do
7bf0: 20 61 20 73 69 6e 67 6c 65 20 6d 6f 72 65 20 65   a single more e
7c00: 66 66 69 63 69 65 6e 74 20 71 75 65 72 79 20 62  fficient query b
7c10: 75 74 20 74 68 69 73 20 69 73 20 67 6f 6f 64 20  ut this is good 
7c20: 65 6e 6f 75 67 68 0a 28 64 65 66 69 6e 65 20 28  enough.(define (
7c30: 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65  twiki:get-tiddle
7c40: 72 73 20 64 62 20 77 69 64 20 74 6e 61 6d 65 73  rs db wid tnames
7c50: 29 0a 20 20 28 61 70 70 6c 79 20 74 77 69 6b 69  ).  (apply twiki
7c60: 3a 67 65 74 2d 74 69 64 64 6c 65 72 73 2d 62 79  :get-tiddlers-by
7c70: 2d 6e 61 6d 65 20 64 62 20 77 69 64 20 74 6e 61  -name db wid tna
7c80: 6d 65 73 29 29 0a 3b 3b 20 20 20 28 6c 65 74 2a  mes)).;;   (let*
7c90: 20 28 28 74 64 6c 72 73 20 27 28 29 29 0a 3b 3b   ((tdlrs '()).;;
7ca0: 20 09 20 3b 3b 20 28 63 6f 6e 6e 20 20 20 28 73   . ;; (conn   (s
7cb0: 6c 6f 74 2d 72 65 66 20 73 3a 73 65 73 73 69 6f  lot-ref s:sessio
7cc0: 6e 20 27 63 6f 6e 6e 29 29 0a 3b 3b 20 09 20 28  n 'conn)).;; . (
7cd0: 6e 61 6d 65 6c 73 74 20 28 63 6f 6e 63 20 22 28  namelst (conc "(
7ce0: 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72  '" (string-inter
7cf0: 73 70 65 72 73 65 20 28 6d 61 70 20 63 6f 6e 63  sperse (map conc
7d00: 20 74 6e 61 6d 65 73 29 20 22 27 2c 27 22 29 20   tnames) "','") 
7d10: 22 27 29 22 29 29 0a 3b 3b 20 09 20 28 71 72 79  "')")).;; . (qry
7d20: 20 20 20 20 20 28 63 6f 6e 63 20 74 77 69 6b 69       (conc twiki
7d30: 3a 74 69 64 64 6c 65 72 2d 73 65 6c 65 63 74 6f  :tiddler-selecto
7d40: 72 20 22 20 57 48 45 52 45 20 74 2e 77 69 6b 69  r " WHERE t.wiki
7d50: 5f 69 64 3d 3f 20 41 4e 44 20 74 2e 69 64 20 49  _id=? AND t.id I
7d60: 4e 20 22 20 6e 61 6d 65 6c 73 74 20 22 3b 22 29  N " namelst ";")
7d70: 29 29 0a 3b 3b 20 20 20 20 20 3b 3b 20 28 70 72  )).;;     ;; (pr
7d80: 69 6e 74 20 71 72 79 29 0a 3b 3b 20 20 20 20 20  int qry).;;     
7d90: 28 64 62 69 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  (dbi:for-each-ro
7da0: 77 0a 3b 3b 20 20 20 20 20 20 28 6c 61 6d 62 64  w.;;      (lambd
7db0: 61 20 28 72 6f 77 29 0a 3b 3b 20 20 20 20 20 20  a (row).;;      
7dc0: 20 20 28 73 65 74 21 20 74 64 6c 72 73 20 28 63    (set! tdlrs (c
7dd0: 6f 6e 73 20 72 6f 77 20 74 64 6c 72 73 29 29 29  ons row tdlrs)))
7de0: 0a 3b 3b 20 20 20 20 20 20 64 62 20 71 72 79 20  .;;      db qry 
7df0: 77 69 64 29 0a 3b 3b 20 20 20 20 20 28 72 65 76  wid).;;     (rev
7e00: 65 72 73 65 20 74 64 6c 72 73 29 29 29 20 3b 3b  erse tdlrs))) ;;
7e10: 20 21 54 77 69 6b 69 5c 0a 0a 3b 3b 20 74 6c 73   !Twiki\..;; tls
7e20: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  t is a list of t
7e30: 69 64 64 6c 65 72 20 6e 75 6d 73 0a 28 64 65 66  iddler nums.(def
7e40: 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74 2d 74  ine (twiki:get-t
7e50: 69 64 64 6c 65 72 73 2d 62 79 2d 6e 75 6d 20 64  iddlers-by-num d
7e60: 62 20 77 69 64 20 74 6c 73 74 29 0a 20 20 3b 3b  b wid tlst).  ;;
7e70: 20 28 73 3a 6c 6f 67 20 22 47 6f 74 20 74 6f 20   (s:log "Got to 
7e80: 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65  twiki:get-tiddle
7e90: 72 73 20 77 69 74 68 20 6b 65 79 73 3a 20 22 20  rs with keys: " 
7ea0: 74 6c 73 74 20 22 20 61 6e 64 20 77 69 64 3a 20  tlst " and wid: 
7eb0: 22 20 77 69 64 29 0a 20 20 3b 3b 20 73 65 6c 65  " wid).  ;; sele
7ec0: 63 74 20 77 68 65 72 65 20 63 72 65 61 74 65 64  ct where created
7ed0: 5f 6f 6e 20 3c 20 73 6f 6d 65 64 61 74 65 20 6f  _on < somedate o
7ee0: 72 64 65 72 20 62 79 20 63 72 65 61 74 65 64 5f  rder by created_
7ef0: 6f 6e 20 64 65 73 63 20 6c 69 6d 69 74 20 31 0a  on desc limit 1.
7f00: 20 20 28 6c 65 74 2a 20 28 28 74 64 6c 72 73 20    (let* ((tdlrs 
7f10: 27 28 29 29 0a 09 20 28 74 6c 73 74 73 74 72 20  '()).. (tlststr 
7f20: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
7f30: 72 73 65 20 28 6d 61 70 20 6e 75 6d 62 65 72 2d  rse (map number-
7f40: 3e 73 74 72 69 6e 67 20 74 6c 73 74 29 20 22 2c  >string tlst) ",
7f50: 22 29 29 0a 09 20 28 61 6c 72 65 61 64 79 2d 67  ")).. (already-g
7f60: 6f 74 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61  ot (make-hash-ta
7f70: 62 6c 65 29 29 0a 09 20 28 71 72 79 20 20 20 20  ble)).. (qry    
7f80: 28 63 6f 6e 63 20 74 77 69 6b 69 3a 74 69 64 64  (conc twiki:tidd
7f90: 6c 65 72 2d 73 65 6c 65 63 74 6f 72 20 22 20 57  ler-selector " W
7fa0: 48 45 52 45 20 74 2e 77 69 6b 69 5f 69 64 3d 3f  HERE t.wiki_id=?
7fb0: 20 41 4e 44 20 74 2e 69 64 20 49 4e 20 28 22 20   AND t.id IN (" 
7fc0: 74 6c 73 74 73 74 72 20 22 29 20 4f 52 44 45 52  tlststr ") ORDER
7fd0: 20 42 59 20 63 72 65 61 74 65 64 5f 6f 6e 20 44   BY created_on D
7fe0: 45 53 43 3b 22 29 29 29 0a 09 3b 3b 20 28 63 6f  ESC;")))..;; (co
7ff0: 6e 6e 20 20 20 28 73 6c 6f 74 2d 72 65 66 20 73  nn   (slot-ref s
8000: 3a 73 65 73 73 69 6f 6e 20 27 63 6f 6e 6e 29 29  :session 'conn))
8010: 0a 20 20 20 20 3b 3b 20 28 70 72 69 6e 74 20 22  .    ;; (print "
8020: 71 72 79 3a 20 22 20 71 72 79 29 0a 20 20 20 20  qry: " qry).    
8030: 28 64 62 69 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  (dbi:for-each-ro
8040: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  w.     (lambda (
8050: 72 6f 77 29 0a 20 20 20 20 20 20 20 28 6c 65 74  row).       (let
8060: 20 28 28 74 6e 61 6d 65 20 28 74 77 69 6b 69 3a   ((tname (twiki:
8070: 74 69 64 64 6c 65 72 2d 67 65 74 2d 6e 61 6d 65  tiddler-get-name
8080: 20 72 6f 77 29 29 29 0a 09 20 28 69 66 20 28 6e   row))).. (if (n
8090: 6f 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72  ot (hash-table-r
80a0: 65 66 2f 64 65 66 61 75 6c 74 20 61 6c 72 65 61  ef/default alrea
80b0: 64 79 2d 67 6f 74 20 74 6e 61 6d 65 20 23 66 29  dy-got tname #f)
80c0: 29 0a 09 20 20 20 20 20 28 62 65 67 69 6e 0a 09  )..     (begin..
80d0: 20 20 20 20 20 20 20 28 73 65 74 21 20 74 64 6c         (set! tdl
80e0: 72 73 20 28 63 6f 6e 73 20 72 6f 77 20 74 64 6c  rs (cons row tdl
80f0: 72 73 29 29 0a 09 20 20 20 20 20 20 20 28 68 61  rs))..       (ha
8100: 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 61 6c  sh-table-set! al
8110: 72 65 61 64 79 2d 67 6f 74 20 74 6e 61 6d 65 20  ready-got tname 
8120: 23 74 29 29 29 29 29 0a 20 20 20 20 20 64 62 20  #t))))).     db 
8130: 71 72 79 20 77 69 64 29 0a 20 20 20 20 28 69 66  qry wid).    (if
8140: 20 28 6e 75 6c 6c 3f 20 74 64 6c 72 73 29 20 74   (null? tdlrs) t
8150: 64 6c 72 73 20 28 72 65 76 65 72 73 65 20 74 64  dlrs (reverse td
8160: 6c 72 73 29 29 29 29 20 3b 3b 20 21 54 77 69 6b  lrs)))) ;; !Twik
8170: 69 5c 6e 54 69 74 6c 65 2c 20 70 69 63 74 75 72  i\nTitle, pictur
8180: 65 73 2c 20 65 74 63 2e 5c 6e 7b 7b 7b 5c 6e 43  es, etc.\n{{{\nC
8190: 6f 64 65 5c 6e 7d 7d 7d 5c 6e 5b 5b 6c 69 6e 6b  ode\n}}}\n[[link
81a0: 73 5d 5d 5c 6e 7c 74 61 62 6c 65 7c 6f 66 7c 73  s]]\n|table|of|s
81b0: 74 75 66 66 7c 5c 6e 7c 6d 6f 72 65 7c 73 74 75  tuff|\n|more|stu
81c0: 66 66 7c 68 65 72 65 7c 5c 6e 22 29 29 0a 0a 3b  ff|here|\n"))..;
81d0: 3b 20 77 69 64 20 3d 20 77 69 6b 69 20 69 64 0a  ; wid = wiki id.
81e0: 3b 3b 20 72 65 74 75 72 6e 73 20 61 20 6c 69 73  ;; returns a lis
81f0: 74 20 6f 66 20 74 77 69 6b 69 3a 74 69 64 64 6c  t of twiki:tiddl
8200: 65 72 73 0a 28 64 65 66 69 6e 65 20 28 74 77 69  ers.(define (twi
8210: 6b 69 3a 67 65 74 2d 74 69 64 64 6c 65 72 73 2d  ki:get-tiddlers-
8220: 62 79 2d 6e 61 6d 65 20 74 64 62 20 77 69 64 20  by-name tdb wid 
8230: 2e 20 6e 61 6d 65 73 29 0a 20 20 28 6c 65 74 20  . names).  (let 
8240: 28 28 74 64 6c 72 73 20 27 28 29 29 29 0a 20 20  ((tdlrs '())).  
8250: 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d    (for-each (lam
8260: 62 64 61 20 28 6e 61 6d 65 29 0a 09 09 28 6c 65  bda (name)...(le
8270: 74 20 28 28 74 64 6c 72 20 28 74 77 69 6b 69 3a  t ((tdlr (twiki:
8280: 67 65 74 2d 74 69 64 64 6c 65 72 2d 62 79 2d 6e  get-tiddler-by-n
8290: 61 6d 65 20 74 64 62 20 77 69 64 20 6e 61 6d 65  ame tdb wid name
82a0: 29 29 29 0a 09 09 20 20 28 69 66 20 74 64 6c 72  )))...  (if tdlr
82b0: 20 28 73 65 74 21 20 74 64 6c 72 73 20 28 63 6f   (set! tdlrs (co
82c0: 6e 73 20 74 64 6c 72 20 74 64 6c 72 73 29 29 29  ns tdlr tdlrs)))
82d0: 29 29 0a 09 20 20 20 20 20 20 6e 61 6d 65 73 29  ))..      names)
82e0: 0a 20 20 20 20 28 72 65 76 65 72 73 65 20 74 64  .    (reverse td
82f0: 6c 72 73 29 29 29 0a 3b 3b 20 77 69 74 68 20 74  lrs))).;; with t
8300: 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 69  he right query i
8310: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 6f 73 73  t should be poss
8320: 69 62 6c 65 20 74 6f 20 64 6f 20 74 68 69 73 20  ible to do this 
8330: 6d 75 63 68 20 66 61 73 74 65 72 20 61 70 70 72  much faster appr
8340: 6f 61 63 68 20 66 6f 72 20 74 77 69 6b 69 3a 67  oach for twiki:g
8350: 65 74 2d 74 69 64 64 6c 65 72 73 2d 62 79 2d 6e  et-tiddlers-by-n
8360: 61 6d 65 0a 3b 3b 20 20 20 28 6c 65 74 20 28 28  ame.;;   (let ((
8370: 74 64 6c 72 73 20 27 28 29 29 0a 3b 3b 20 09 28  tdlrs '()).;; .(
8380: 6e 61 6d 65 6c 73 74 20 28 63 6f 6e 63 20 22 28  namelst (conc "(
8390: 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72  '" (string-inter
83a0: 73 70 65 72 73 65 20 6e 61 6d 65 73 20 22 27 2c  sperse names "',
83b0: 27 22 29 20 22 27 29 22 29 29 29 0a 3b 3b 20 20  '") "')"))).;;  
83c0: 20 20 20 28 64 62 69 3a 66 6f 72 2d 65 61 63 68     (dbi:for-each
83d0: 2d 72 6f 77 0a 3b 3b 20 20 20 20 20 20 28 6c 61  -row.;;      (la
83e0: 6d 62 64 61 20 28 72 6f 77 29 0a 3b 3b 20 20 20  mbda (row).;;   
83f0: 20 20 20 20 20 28 73 65 74 21 20 74 64 6c 72 73       (set! tdlrs
8400: 20 28 63 6f 6e 73 20 72 6f 77 20 74 64 6c 72 73   (cons row tdlrs
8410: 29 29 29 0a 3b 3b 20 20 20 20 20 20 74 64 62 0a  ))).;;      tdb.
8420: 3b 3b 20 20 20 20 20 20 28 63 6f 6e 63 20 74 77  ;;      (conc tw
8430: 69 6b 69 3a 74 69 64 64 6c 65 72 2d 73 65 6c 65  iki:tiddler-sele
8440: 63 74 6f 72 20 22 20 57 48 45 52 45 20 74 2e 77  ctor " WHERE t.w
8450: 69 6b 69 5f 69 64 3d 3f 20 41 4e 44 20 74 2e 6e  iki_id=? AND t.n
8460: 61 6d 65 20 49 4e 20 22 20 6e 61 6d 65 6c 73 74  ame IN " namelst
8470: 29 20 77 69 64 29 0a 3b 3b 20 20 20 20 20 28 72  ) wid).;;     (r
8480: 65 76 65 72 73 65 20 74 64 6c 72 73 29 29 29 0a  everse tdlrs))).
8490: 0a 3b 3b 20 67 65 74 20 74 68 65 20 74 69 64 64  .;; get the tidd
84a0: 6c 65 72 20 77 69 74 68 20 74 68 65 20 67 69 76  ler with the giv
84b0: 65 6e 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  en name and the 
84c0: 6d 61 78 20 64 61 74 65 0a 28 64 65 66 69 6e 65  max date.(define
84d0: 20 28 74 77 69 6b 69 3a 67 65 74 2d 74 69 64 64   (twiki:get-tidd
84e0: 6c 65 72 2d 62 79 2d 6e 61 6d 65 20 74 64 62 20  ler-by-name tdb 
84f0: 77 69 64 20 6e 61 6d 65 29 0a 20 20 28 64 62 69  wid name).  (dbi
8500: 3a 67 65 74 2d 6f 6e 65 2d 72 6f 77 20 74 64 62  :get-one-row tdb
8510: 20 28 63 6f 6e 63 20 74 77 69 6b 69 3a 74 69 64   (conc twiki:tid
8520: 64 6c 65 72 2d 73 65 6c 65 63 74 6f 72 20 22 20  dler-selector " 
8530: 57 48 45 52 45 20 74 2e 77 69 6b 69 5f 69 64 3d  WHERE t.wiki_id=
8540: 3f 20 41 4e 44 20 74 2e 6e 61 6d 65 3d 3f 20 4f  ? AND t.name=? O
8550: 52 44 45 52 20 42 59 20 63 72 65 61 74 65 64 5f  RDER BY created_
8560: 6f 6e 20 44 45 53 43 20 4c 49 4d 49 54 20 31 3b  on DESC LIMIT 1;
8570: 22 29 20 77 69 64 20 6e 61 6d 65 29 29 0a 0a 28  ") wid name))..(
8580: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 74 69  define (twiki:ti
8590: 64 64 6c 65 72 2d 6e 61 6d 65 2d 3e 69 64 20 64  ddler-name->id d
85a0: 62 20 74 6e 61 6d 65 29 0a 20 20 28 64 62 69 3a  b tname).  (dbi:
85b0: 67 65 74 2d 6f 6e 65 20 64 62 20 22 53 45 4c 45  get-one db "SELE
85c0: 43 54 20 69 64 20 46 52 4f 4d 20 74 69 64 64 6c  CT id FROM tiddl
85d0: 65 72 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 3f  ers WHERE name=?
85e0: 3b 22 20 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d  ;" tname))..;;==
85f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8630: 3d 3d 3d 3d 0a 3b 3b 20 74 77 69 6b 69 20 74 65  ====.;; twiki te
8640: 78 74 20 66 6f 72 6d 61 74 69 6e 67 2c 20 70 61  xt formating, pa
8650: 72 73 69 6e 67 20 61 6e 64 20 64 69 73 70 6c 61  rsing and displa
8660: 79 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  y.;;============
8670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
86a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 74  ==========..;; t
86b0: 77 69 6b 69 20 66 6f 72 6d 61 74 69 6e 67 20 72  wiki formating r
86c0: 6f 75 74 69 6e 65 73 20 28 6f 76 65 72 72 69 64  outines (overrid
86d0: 65 20 74 68 65 73 65 20 74 6f 20 63 68 61 6e 67  e these to chang
86e0: 65 20 79 6f 75 72 20 6c 6f 6f 6b 20 61 6e 64 20  e your look and 
86f0: 66 65 65 6c 0a 28 64 65 66 69 6e 65 20 74 77 69  feel.(define twi
8700: 6b 69 3a 74 77 69 6b 69 2d 74 61 67 20 20 73 3a  ki:twiki-tag  s:
8710: 62 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69  b).(define twiki
8720: 3a 68 33 20 20 20 20 20 20 20 20 20 73 3a 68 33  :h3         s:h3
8730: 29 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ).(define twiki:
8740: 68 32 20 20 20 20 20 20 20 20 20 73 3a 68 32 29  h2         s:h2)
8750: 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 68  .(define twiki:h
8760: 31 20 20 20 20 20 20 20 20 20 73 3a 68 31 29 0a  1         s:h1).
8770: 3b 3b 20 28 64 65 66 69 6e 65 20 74 77 69 6b 69  ;; (define twiki
8780: 3a 6d 61 6b 65 2d 74 6c 69 6e 6b 20 73 3a 69 29  :make-tlink s:i)
8790: 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 75  .(define twiki:u
87a0: 6c 20 20 20 20 20 20 20 20 20 73 3a 75 6c 29 0a  l         s:ul).
87b0: 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 6f 6c  (define twiki:ol
87c0: 20 20 20 20 20 20 20 20 20 73 3a 6f 6c 29 0a 28           s:ol).(
87d0: 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 6c 69 20  define twiki:li 
87e0: 20 20 20 20 20 20 20 20 73 3a 6c 69 29 0a 28 64          s:li).(d
87f0: 65 66 69 6e 65 20 74 77 69 6b 69 3a 70 72 65 20  efine twiki:pre 
8800: 20 20 20 20 20 20 20 73 3a 70 72 65 29 0a 28 64         s:pre).(d
8810: 65 66 69 6e 65 20 74 77 69 6b 69 3a 70 20 20 20  efine twiki:p   
8820: 20 20 20 20 20 20 20 73 3a 70 29 0a 28 64 65 66         s:p).(def
8830: 69 6e 65 20 74 77 69 6b 69 3a 75 20 20 20 20 20  ine twiki:u     
8840: 20 20 20 20 20 73 3a 75 29 0a 28 64 65 66 69 6e       s:u).(defin
8850: 65 20 74 77 69 6b 69 3a 74 64 20 20 20 20 20 20  e twiki:td      
8860: 20 20 20 73 3a 74 64 29 0a 28 64 65 66 69 6e 65     s:td).(define
8870: 20 74 77 69 6b 69 3a 74 72 20 20 20 20 20 20 20   twiki:tr       
8880: 20 20 73 3a 74 72 29 0a 28 64 65 66 69 6e 65 20    s:tr).(define 
8890: 74 77 69 6b 69 3a 74 61 62 6c 65 20 20 20 20 20  twiki:table     
88a0: 20 73 3a 74 61 62 6c 65 29 0a 28 64 65 66 69 6e   s:table).(defin
88b0: 65 20 74 77 69 6b 69 3a 64 69 76 20 20 20 20 20  e twiki:div     
88c0: 20 20 20 73 3a 64 69 76 29 0a 0a 28 64 65 66 69     s:div)..(defi
88d0: 6e 65 20 28 74 77 69 6b 69 3a 77 65 62 36 34 65  ne (twiki:web64e
88e0: 6e 63 20 73 74 72 29 0a 20 20 28 73 74 72 69 6e  nc str).  (strin
88f0: 67 2d 73 75 62 73 74 69 74 75 74 65 20 22 3d 22  g-substitute "="
8900: 20 22 5f 22 20 28 62 61 73 65 36 34 3a 65 6e 63   "_" (base64:enc
8910: 6f 64 65 20 73 74 72 29 20 23 74 29 29 0a 0a 28  ode str) #t))..(
8920: 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 77 65  define (twiki:we
8930: 62 36 34 64 65 63 20 73 74 72 29 0a 20 20 28 62  b64dec str).  (b
8940: 61 73 65 36 34 3a 64 65 63 6f 64 65 20 28 73 74  ase64:decode (st
8950: 72 69 6e 67 2d 73 75 62 73 74 69 74 75 74 65 20  ring-substitute 
8960: 22 5f 22 20 22 3d 22 20 73 74 72 20 23 74 29 29  "_" "=" str #t))
8970: 29 0a 20 20 20 20 0a 28 64 65 66 69 6e 65 20 28  ).    .(define (
8980: 74 77 69 6b 69 3a 6d 61 6b 65 2d 74 6c 69 6e 6b  twiki:make-tlink
8990: 20 74 65 78 74 20 74 69 64 64 6c 65 72 6e 61 6d   text tiddlernam
89a0: 65 29 0a 20 20 28 73 3a 61 20 74 65 78 74 20 27  e).  (s:a text '
89b0: 68 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20  href (s:link-to 
89c0: 28 74 77 69 6b 69 3a 67 65 74 2d 6c 69 6e 6b 2d  (twiki:get-link-
89d0: 62 61 63 6b 2d 74 6f 2d 63 75 72 72 65 6e 74 29  back-to-current)
89e0: 20 27 76 69 65 77 5f 74 69 64 64 6c 65 72 20 28   'view_tiddler (
89f0: 74 77 69 6b 69 3a 77 65 62 36 34 65 6e 63 20 74  twiki:web64enc t
8a00: 69 64 64 6c 65 72 6e 61 6d 65 29 29 29 29 0a 0a  iddlername))))..
8a10: 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69 3a 70  (define (twiki:p
8a20: 69 63 20 70 69 63 2d 6e 61 6d 65 20 73 69 7a 65  ic pic-name size
8a30: 20 77 69 6b 69 29 0a 20 20 28 6c 65 74 2a 20 28   wiki).  (let* (
8a40: 28 74 64 62 20 20 20 20 28 74 77 69 6b 69 3a 77  (tdb    (twiki:w
8a50: 69 6b 69 2d 67 65 74 2d 64 62 68 20 77 69 6b 69  iki-get-dbh wiki
8a60: 29 29 0a 09 20 28 74 6b 65 79 20 20 20 28 74 77  )).. (tkey   (tw
8a70: 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 6b 65 79  iki:wiki-get-key
8a80: 20 77 69 6b 69 29 29 0a 09 20 28 78 79 20 20 20   wiki)).. (xy   
8a90: 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20    (string-split 
8aa0: 73 69 7a 65 20 22 78 22 29 29 0a 09 20 28 70 69  size "x")).. (pi
8ab0: 63 2d 69 64 20 28 74 77 69 6b 69 3a 67 65 74 2d  c-id (twiki:get-
8ac0: 70 69 63 2d 69 64 20 74 64 62 20 70 69 63 2d 6e  pic-id tdb pic-n
8ad0: 61 6d 65 20 28 74 77 69 6b 69 3a 77 69 6b 69 2d  ame (twiki:wiki-
8ae0: 67 65 74 2d 77 69 64 20 77 69 6b 69 29 29 29 0a  get-wid wiki))).
8af0: 09 20 28 69 6d 67 2d 6c 6e 6b 20 20 28 73 3a 6c  . (img-lnk  (s:l
8b00: 69 6e 6b 2d 74 6f 20 22 74 77 69 6b 69 22 20 27  ink-to "twiki" '
8b10: 77 69 6b 69 5f 6b 65 79 20 28 63 6f 6e 63 20 28  wiki_key (conc (
8b20: 6e 75 6d 62 65 72 2d 3e 73 74 72 69 6e 67 20 28  number->string (
8b30: 74 77 69 6b 69 3a 77 69 6b 69 2d 67 65 74 2d 77  twiki:wiki-get-w
8b40: 69 64 20 77 69 6b 69 29 29 20 22 2d 22 20 28 74  id wiki)) "-" (t
8b50: 77 69 6b 69 3a 77 65 62 36 34 65 6e 63 20 74 6b  wiki:web64enc tk
8b60: 65 79 29 29 0a 09 09 09 20 20 20 20 20 20 27 69  ey))....      'i
8b70: 6d 61 67 65 20 20 70 69 63 2d 69 64 29 29 29 0a  mage  pic-id))).
8b80: 20 20 20 20 28 69 66 20 28 61 6e 64 20 28 3e 20      (if (and (> 
8b90: 28 6c 65 6e 67 74 68 20 78 79 29 20 31 29 0a 09  (length xy) 1)..
8ba0: 20 20 20 20 20 28 63 61 72 20 78 79 29 0a 09 20       (car xy).. 
8bb0: 20 20 20 20 28 63 61 64 72 20 78 79 29 29 20 3b      (cadr xy)) ;
8bc0: 3b 20 79 65 70 2c 20 68 61 76 65 20 74 77 6f 20  ; yep, have two 
8bd0: 6e 75 6d 62 65 72 73 0a 09 28 73 3a 69 6d 67 20  numbers..(s:img 
8be0: 27 74 69 74 6c 65 20 70 69 63 2d 6e 61 6d 65 20  'title pic-name 
8bf0: 27 61 6c 74 20 70 69 63 2d 6e 61 6d 65 20 27 77  'alt pic-name 'w
8c00: 69 64 74 68 20 28 63 61 72 20 78 79 29 20 27 68  idth (car xy) 'h
8c10: 65 69 67 68 74 20 28 63 61 64 72 20 78 79 29 20  eight (cadr xy) 
8c20: 27 73 72 63 20 69 6d 67 2d 6c 6e 6b 29 0a 09 28  'src img-lnk)..(
8c30: 73 3a 69 6d 67 20 27 74 69 74 6c 65 20 70 69 63  s:img 'title pic
8c40: 2d 6e 61 6d 65 20 27 61 6c 74 20 70 69 63 2d 6e  -name 'alt pic-n
8c50: 61 6d 65 20 27 73 72 63 20 69 6d 67 2d 6c 6e 6b  ame 'src img-lnk
8c60: 29 29 29 29 0a 0a 3b 3b 20 6f 76 65 72 72 69 64  ))))..;; overrid
8c70: 65 20 74 68 65 73 65 20 61 6c 73 6f 0a 28 64 65  e these also.(de
8c80: 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74 2d  fine (twiki:get-
8c90: 69 64 29 0a 20 20 28 73 3a 73 65 73 73 69 6f 6e  id).  (s:session
8ca0: 2d 76 61 72 2d 67 65 74 20 22 69 64 22 29 29 0a  -var-get "id")).
8cb0: 0a 3b 3b 20 6f 76 65 72 72 69 64 65 20 74 68 69  .;; override thi
8cc0: 73 20 74 6f 20 73 65 74 20 6c 69 6e 6b 73 20 69  s to set links i
8cd0: 6e 73 69 64 65 20 77 69 6b 69 27 73 0a 28 64 65  nside wiki's.(de
8ce0: 66 69 6e 65 20 28 74 77 69 6b 69 3a 67 65 74 2d  fine (twiki:get-
8cf0: 6c 69 6e 6b 2d 62 61 63 6b 2d 74 6f 2d 63 75 72  link-back-to-cur
8d00: 72 65 6e 74 29 0a 20 20 28 73 3a 63 75 72 72 65  rent).  (s:curre
8d10: 6e 74 2d 70 61 67 65 29 29 0a 0a 0a 3b 3b 20 72  nt-page))...;; r
8d20: 65 67 65 78 65 73 20 61 72 65 20 6c 69 73 74 65  egexes are liste
8d30: 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
8d40: 6e 20 77 68 69 63 68 20 74 68 65 79 20 73 68 6f  n which they sho
8d50: 75 6c 64 20 62 65 20 63 68 65 63 6b 65 64 0a 0a  uld be checked..
8d60: 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 68 33  (define twiki:h3
8d70: 2d 70 61 74 74 20 28 72 65 67 65 78 70 20 22 5e  -patt (regexp "^
8d80: 21 21 21 28 2e 2a 29 24 22 29 29 0a 28 64 65 66  !!!(.*)$")).(def
8d90: 69 6e 65 20 74 77 69 6b 69 3a 68 32 2d 70 61 74  ine twiki:h2-pat
8da0: 74 20 28 72 65 67 65 78 70 20 22 5e 21 21 28 2e  t (regexp "^!!(.
8db0: 2a 29 24 22 29 29 0a 28 64 65 66 69 6e 65 20 74  *)$")).(define t
8dc0: 77 69 6b 69 3a 68 31 2d 70 61 74 74 20 28 72 65  wiki:h1-patt (re
8dd0: 67 65 78 70 20 22 5e 21 28 2e 2a 29 24 22 29 29  gexp "^!(.*)$"))
8de0: 0a 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a  ..(define twiki:
8df0: 74 6c 69 6e 6b 2d 70 61 74 74 20 20 20 20 20 28  tlink-patt     (
8e00: 72 65 67 65 78 70 20 22 5e 28 2e 2a 29 5c 5c 5b  regexp "^(.*)\\[
8e10: 5c 5c 5b 28 5b 5e 5c 5c 5b 5c 5c 5d 5d 2a 29 5c  \\[([^\\[\\]]*)\
8e20: 5c 5d 5c 5c 5d 28 2e 2a 29 24 22 29 29 0a 28 64  \]\\](.*)$")).(d
8e30: 65 66 69 6e 65 20 74 77 69 6b 69 3a 70 69 63 2d  efine twiki:pic-
8e40: 70 61 74 74 20 20 20 20 20 20 20 28 72 65 67 65  patt       (rege
8e50: 78 70 20 22 5e 28 2e 2a 29 5c 5c 5b 70 69 63 28  xp "^(.*)\\[pic(
8e60: 5b 30 2d 39 25 5d 2a 78 2a 5b 30 2d 39 25 5d 2a  [0-9%]*x*[0-9%]*
8e70: 29 5c 5c 5b 28 5b 5e 5c 5c 5b 5c 5c 5d 5d 2b 29  )\\[([^\\[\\]]+)
8e80: 5c 5c 5d 5c 5c 5d 28 2e 2a 29 24 22 29 29 0a 28  \\]\\](.*)$")).(
8e90: 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 75 6e 64  define twiki:und
8ea0: 65 72 6c 69 6e 65 2d 70 61 74 74 20 28 72 65 67  erline-patt (reg
8eb0: 65 78 70 20 22 5e 28 2e 2a 29 5f 5f 28 2e 2a 29  exp "^(.*)__(.*)
8ec0: 5f 5f 28 2e 2a 29 24 22 29 29 0a 28 64 65 66 69  __(.*)$")).(defi
8ed0: 6e 65 20 74 77 69 6b 69 3a 74 61 62 6c 65 2d 70  ne twiki:table-p
8ee0: 61 74 74 20 20 20 20 20 28 72 65 67 65 78 70 20  att     (regexp 
8ef0: 22 5e 5c 5c 7c 28 2e 2a 29 5c 5c 7c 24 22 29 29  "^\\|(.*)\\|$"))
8f00: 0a 0a 3b 3b 20 74 68 65 73 65 20 61 72 65 20 66  ..;; these are f
8f10: 6f 72 20 6d 75 6c 74 69 2d 6c 69 6e 65 20 66 6f  or multi-line fo
8f20: 72 6d 61 74 69 6e 67 0a 28 64 65 66 69 6e 65 20  rmating.(define 
8f30: 74 77 69 6b 69 3a 6c 69 73 74 2d 70 61 74 74 20  twiki:list-patt 
8f40: 20 20 20 28 72 65 67 65 78 70 20 22 5e 28 5c 5c     (regexp "^(\\
8f50: 2a 2b 7c 5c 5c 23 2b 29 28 2e 2a 29 24 22 29 29  *+|\\#+)(.*)$"))
8f60: 0a 28 64 65 66 69 6e 65 20 74 77 69 6b 69 3a 62  .(define twiki:b
8f70: 75 6c 6c 65 74 2d 70 61 74 74 20 20 28 72 65 67  ullet-patt  (reg
8f80: 65 78 70 20 22 5e 28 5c 5c 2a 2b 29 28 2e 2a 29  exp "^(\\*+)(.*)
8f90: 24 22 29 29 0a 28 64 65 66 69 6e 65 20 74 77 69  $")).(define twi
8fa0: 6b 69 3a 6e 75 6d 62 65 72 2d 70 61 74 74 20 20  ki:number-patt  
8fb0: 28 72 65 67 65 78 70 20 22 5e 28 5c 5c 23 2b 29  (regexp "^(\\#+)
8fc0: 28 2e 2a 29 24 22 29 29 0a 28 64 65 66 69 6e 65  (.*)$")).(define
8fd0: 20 74 77 69 6b 69 3a 70 72 65 66 6f 72 2d 70 61   twiki:prefor-pa
8fe0: 74 74 20 20 28 72 65 67 65 78 70 20 22 5e 5c 5c  tt  (regexp "^\\
8ff0: 7b 5c 5c 7b 5c 5c 7b 24 22 29 29 0a 28 64 65 66  {\\{\\{$")).(def
9000: 69 6e 65 20 74 77 69 6b 69 3a 70 72 65 66 6f 72  ine twiki:prefor
9010: 2d 65 6e 64 2d 70 61 74 74 20 28 72 65 67 65 78  -end-patt (regex
9020: 70 20 22 5e 5c 5c 7d 5c 5c 7d 5c 5c 7d 24 22 29  p "^\\}\\}\\}$")
9030: 29 0a 0a 3b 3b 20 72 65 67 65 78 0a 28 64 65 66  )..;; regex.(def
9040: 69 6e 65 20 74 3a 6d 61 74 63 68 20 20 23 66 29  ine t:match  #f)
9050: 0a 28 64 65 66 69 6e 65 20 28 74 2d 6d 61 74 63  .(define (t-matc
9060: 68 20 72 20 73 29 0a 20 20 28 6c 65 74 20 28 28  h r s).  (let ((
9070: 72 65 73 20 28 73 74 72 69 6e 67 2d 6d 61 74 63  res (string-matc
9080: 68 20 72 20 73 29 29 29 0a 20 20 20 20 28 73 65  h r s))).    (se
9090: 74 21 20 74 3a 6d 61 74 63 68 20 72 65 73 29 0a  t! t:match res).
90a0: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 73 68      res))..;; sh
90b0: 6f 75 6c 64 20 73 77 69 74 63 68 20 74 6f 20 72  ould switch to r
90c0: 65 63 75 72 73 69 76 65 6c 79 20 70 72 6f 63 65  ecursively proce
90d0: 73 73 69 6e 67 20 62 79 20 62 6c 6f 63 6b 3f 0a  ssing by block?.
90e0: 3b 3b 20 28 70 72 6f 63 65 73 73 2d 62 6c 6f 63  ;; (process-bloc
90f0: 6b 20 64 61 74 29 0a 3b 3b 20 20 20 2e 2e 2e 0a  k dat).;;   ....
9100: 3b 3b 20 20 20 28 70 72 6f 63 65 73 73 2d 62 6c  ;;   (process-bl
9110: 6f 63 6b 20 72 65 6d 64 61 74 29 0a 28 64 65 66  ock remdat).(def
9120: 69 6e 65 20 28 74 77 69 6b 69 3a 64 61 74 2d 3e  ine (twiki:dat->
9130: 68 74 6d 6c 20 64 61 74 20 77 69 6b 69 29 0a 20  html dat wiki). 
9140: 20 28 6c 65 74 2a 20 28 28 69 6e 70 20 20 20 20   (let* ((inp    
9150: 20 20 20 20 28 6f 70 65 6e 2d 69 6e 70 75 74 2d      (open-input-
9160: 73 74 72 69 6e 67 20 64 61 74 29 29 0a 09 20 28  string dat)).. (
9170: 6e 65 73 74 2d 64 65 70 74 68 20 30 29 20 3b 3b  nest-depth 0) ;;
9180: 20 64 65 70 74 68 20 6f 66 20 6e 65 73 74 65 64   depth of nested
9190: 20 6c 69 73 74 73 0a 09 20 3b 3b 20 74 6f 6b 65   lists.. ;; toke
91a0: 6e 20 28 69 2e 65 2e 20 6c 69 6e 65 29 20 68 61  n (i.e. line) ha
91b0: 6e 64 6c 69 6e 67 20 73 74 75 66 66 0a 09 20 28  ndling stuff.. (
91c0: 6e 65 78 74 2d 6c 69 6e 65 20 20 23 66 29 0a 09  next-line  #f)..
91d0: 20 28 70 65 65 6b 2d 6c 69 6e 65 20 20 28 6c 61   (peek-line  (la
91e0: 6d 62 64 61 20 28 29 0a 09 09 20 20 20 20 20 20  mbda ()...      
91f0: 20 6e 65 78 74 2d 6c 69 6e 65 29 29 0a 09 20 28   next-line)).. (
9200: 67 65 74 2d 6c 69 6e 65 20 20 20 28 6c 61 6d 62  get-line   (lamb
9210: 64 61 20 28 29 0a 09 09 20 20 20 20 20 20 20 28  da ()...       (
9220: 6c 65 74 20 28 28 72 65 73 20 6e 65 78 74 2d 6c  let ((res next-l
9230: 69 6e 65 29 29 0a 09 09 09 20 28 73 65 74 21 20  ine)).... (set! 
9240: 6e 65 78 74 2d 6c 69 6e 65 20 28 72 65 61 64 2d  next-line (read-
9250: 6c 69 6e 65 20 69 6e 70 29 29 0a 09 09 09 20 3b  line inp)).... ;
9260: 3b 20 28 70 72 69 6e 74 20 22 67 65 74 2d 6c 69  ; (print "get-li
9270: 6e 65 3a 20 70 72 65 76 3d 22 20 72 65 73 20 22  ne: prev=" res "
9280: 20 6e 65 78 74 3d 22 20 6e 65 78 74 2d 6c 69 6e   next=" next-lin
9290: 65 20 22 5c 6e 22 29 0a 09 09 09 20 72 65 73 29  e "\n").... res)
92a0: 29 29 0a 09 20 28 6c 20 20 20 20 20 20 20 20 20  )).. (l         
92b0: 20 28 67 65 74 2d 6c 69 6e 65 29 29 29 20 3b 3b   (get-line))) ;;
92c0: 20 64 69 73 63 61 72 64 20 74 68 65 20 23 66 20   discard the #f 
92d0: 69 6e 20 6e 65 78 74 2d 6c 69 6e 65 0a 20 20 20  in next-line.   
92e0: 20 28 74 77 69 6b 69 3a 72 65 61 64 2d 62 6c 6f   (twiki:read-blo
92f0: 63 6b 20 70 65 65 6b 2d 6c 69 6e 65 20 67 65 74  ck peek-line get
9300: 2d 6c 69 6e 65 20 6e 65 73 74 2d 64 65 70 74 68  -line nest-depth
9310: 20 23 66 20 77 69 6b 69 29 29 29 0a 0a 3b 3b 20   #f wiki)))..;; 
9320: 62 6c 6b 2d 74 79 70 65 20 69 73 20 23 66 20 66  blk-type is #f f
9330: 6f 72 20 6e 6f 74 20 69 6e 20 61 20 62 6c 6f 63  or not in a bloc
9340: 6b 20 28 69 2e 65 2e 20 61 74 20 74 6f 70 20 6c  k (i.e. at top l
9350: 65 76 65 6c 29 2c 20 27 70 72 65 20 66 6f 72 20  evel), 'pre for 
9360: 70 72 65 66 6f 72 6d 61 74 65 64 2c 20 27 75 6c  preformated, 'ul
9370: 20 6f 72 20 27 6f 6c 0a 3b 3b 20 63 61 6c 6c 20   or 'ol.;; call 
9380: 77 69 74 68 20 66 69 72 73 74 20 6c 69 6e 65 20  with first line 
9390: 61 73 20 6c 65 67 69 74 20 64 61 74 61 0a 3b 3b  as legit data.;;
93a0: 20 69 2e 65 2e 20 66 6f 72 20 70 72 65 66 6f 72   i.e. for prefor
93b0: 6d 20 2d 20 73 6b 69 70 20 74 68 65 20 7b 7b 7b  m - skip the {{{
93c0: 20 6c 69 6e 65 20 74 68 65 6e 20 63 61 6c 6c 20   line then call 
93d0: 72 65 61 64 2d 62 6c 6f 63 6b 0a 3b 3b 20 20 20  read-block.;;   
93e0: 20 20 20 66 6f 72 20 23 20 6f 72 20 2a 20 63 61     for # or * ca
93f0: 6c 6c 20 77 69 74 68 20 66 69 72 73 74 20 6c 69  ll with first li
9400: 6e 65 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b  ne.(define (twik
9410: 69 3a 72 65 61 64 2d 62 6c 6f 63 6b 20 70 65 65  i:read-block pee
9420: 6b 2d 6c 69 6e 65 20 67 65 74 2d 6c 69 6e 65 20  k-line get-line 
9430: 6e 65 73 74 2d 64 65 70 74 68 20 62 6c 6b 2d 74  nest-depth blk-t
9440: 79 70 65 20 77 69 6b 69 29 0a 20 20 28 6c 65 74  ype wiki).  (let
9450: 20 6c 6f 6f 70 20 28 28 72 65 73 20 27 28 29 29   loop ((res '())
9460: 0a 09 20 20 20 20 20 28 6c 20 20 20 28 70 65 65  ..     (l   (pee
9470: 6b 2d 6c 69 6e 65 29 29 29 20 3b 3b 20 73 68 6f  k-line))) ;; sho
9480: 75 6c 64 20 74 68 69 73 20 62 65 20 61 20 70 65  uld this be a pe
9490: 65 6b 2d 6c 69 6e 65 3f 20 79 65 73 21 21 0a 20  ek-line? yes!!. 
94a0: 20 20 20 3b 3b 20 28 70 72 69 6e 74 20 22 74 77     ;; (print "tw
94b0: 69 6b 69 3a 72 65 61 64 2d 62 6c 6f 63 6b 20 6c  iki:read-block l
94c0: 6f 6f 70 20 6e 65 73 74 2d 64 65 70 74 68 3d 22  oop nest-depth="
94d0: 6e 65 73 74 2d 64 65 70 74 68 20 22 20 62 6c 6b  nest-depth " blk
94e0: 2d 74 79 70 65 3d 22 20 62 6c 6b 2d 74 79 70 65  -type=" blk-type
94f0: 20 22 20 6c 3d 22 20 6c 20 22 5c 6e 20 20 72 65   " l=" l "\n  re
9500: 73 3d 22 20 72 65 73 29 0a 20 20 20 20 28 69 66  s=" res).    (if
9510: 20 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20 6c 29   (eof-object? l)
9520: 0a 09 3b 3b 20 77 65 20 61 72 65 20 64 6f 6e 65  ..;; we are done
9530: 21 20 72 65 74 75 72 6e 20 74 68 65 20 6c 69 73  ! return the lis
9540: 74 0a 09 72 65 73 0a 09 3b 3b 20 70 72 6f 63 65  t..res..;; proce
9550: 73 73 20 69 74 21 0a 09 28 63 6f 6e 64 0a 09 20  ss it!..(cond.. 
9560: 3b 3b 20 68 61 6e 64 6c 65 20 70 72 65 66 6f 72  ;; handle prefor
9570: 6d 61 74 65 64 20 74 65 78 74 0a 09 20 28 28 65  mated text.. ((e
9580: 71 3f 20 62 6c 6b 2d 74 79 70 65 20 27 70 72 65  q? blk-type 'pre
9590: 29 0a 09 20 20 28 69 66 20 28 74 2d 6d 61 74 63  )..  (if (t-matc
95a0: 68 20 20 74 77 69 6b 69 3a 70 72 65 66 6f 72 2d  h  twiki:prefor-
95b0: 65 6e 64 2d 70 61 74 74 20 6c 29 0a 09 20 20 20  end-patt l)..   
95c0: 20 20 20 28 62 65 67 69 6e 0a 09 09 28 67 65 74     (begin...(get
95d0: 2d 6c 69 6e 65 29 20 3b 3b 20 64 69 73 63 61 72  -line) ;; discar
95e0: 64 20 74 68 65 20 7d 7d 7d 0a 09 09 72 65 73 29  d the }}}...res)
95f0: 20 20 20 20 20 20 20 3b 3b 20 65 6e 64 20 6f 66         ;; end of
9600: 20 70 72 65 66 6f 72 6d 61 74 74 65 64 0a 09 20   preformatted.. 
9610: 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 3b 3b       (begin...;;
9620: 20 28 67 65 74 2d 6c 69 6e 65 29 20 3b 3b 20 64   (get-line) ;; d
9630: 69 73 63 61 72 64 20 74 68 65 20 7b 7b 7b 0a 09  iscard the {{{..
9640: 09 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20 72  .(loop (append r
9650: 65 73 20 28 6c 69 73 74 20 28 67 65 74 2d 6c 69  es (list (get-li
9660: 6e 65 29 29 29 0a 09 09 20 20 20 20 20 20 28 70  ne)))...      (p
9670: 65 65 6b 2d 6c 69 6e 65 29 29 29 29 29 0a 09 20  eek-line))))).. 
9680: 3b 3b 20 68 61 6e 64 6c 65 20 74 61 62 6c 65 73  ;; handle tables
9690: 0a 09 20 28 28 65 71 3f 20 62 6c 6b 2d 74 79 70  .. ((eq? blk-typ
96a0: 65 20 27 74 61 62 6c 65 29 0a 09 20 20 28 69 66  e 'table)..  (if
96b0: 20 28 74 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a   (t-match twiki:
96c0: 74 61 62 6c 65 2d 70 61 74 74 20 6c 29 0a 09 20  table-patt l).. 
96d0: 20 20 20 20 20 28 6c 65 74 20 28 28 63 65 6c 73       (let ((cels
96e0: 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20    (string-split 
96f0: 28 63 61 64 72 20 74 3a 6d 61 74 63 68 29 20 22  (cadr t:match) "
9700: 7c 22 29 29 29 0a 09 09 28 67 65 74 2d 6c 69 6e  |")))...(get-lin
9710: 65 29 0a 09 09 28 6c 6f 6f 70 20 28 61 70 70 65  e)...(loop (appe
9720: 6e 64 20 72 65 73 20 28 74 77 69 6b 69 3a 74 72  nd res (twiki:tr
9730: 20 28 6d 61 70 20 74 77 69 6b 69 3a 74 64 20 0a   (map twiki:td .
9740: 09 09 09 09 09 09 20 28 6d 61 70 20 28 6c 61 6d  ...... (map (lam
9750: 62 64 61 20 28 78 29 28 74 77 69 6b 69 3a 6c 69  bda (x)(twiki:li
9760: 6e 65 2d 3e 68 74 6d 6c 20 78 20 23 66 20 77 69  ne->html x #f wi
9770: 6b 69 29 29 20 63 65 6c 73 29 29 29 29 0a 09 09  ki)) cels))))...
9780: 20 20 20 20 20 20 28 67 65 74 2d 6c 69 6e 65 29        (get-line)
9790: 29 29 0a 09 20 20 20 20 20 20 72 65 73 29 29 0a  ))..      res)).
97a0: 09 20 3b 3b 20 68 61 6e 64 6c 65 20 6c 69 73 74  . ;; handle list
97b0: 73 0a 09 20 28 28 6f 72 20 28 74 2d 6d 61 74 63  s.. ((or (t-matc
97c0: 68 20 74 77 69 6b 69 3a 62 75 6c 6c 65 74 2d 70  h twiki:bullet-p
97d0: 61 74 74 20 6c 29 20 3b 3b 20 68 61 76 65 20 2a  att l) ;; have *
97e0: 0a 09 20 20 20 20 20 20 28 74 2d 6d 61 74 63 68  ..      (t-match
97f0: 20 74 77 69 6b 69 3a 6e 75 6d 62 65 72 2d 70 61   twiki:number-pa
9800: 74 74 20 6c 29 29 0a 09 20 20 28 6c 65 74 2a 20  tt l))..  (let* 
9810: 28 28 64 69 72 65 63 74 69 76 65 20 28 63 61 64  ((directive (cad
9820: 72 20 74 3a 6d 61 74 63 68 29 29 0a 09 09 20 28  r t:match))... (
9830: 6c 65 76 65 6c 6e 75 6d 20 28 73 74 72 69 6e 67  levelnum (string
9840: 2d 6c 65 6e 67 74 68 20 64 69 72 65 63 74 69 76  -length directiv
9850: 65 29 29 0a 09 09 20 28 74 65 78 74 20 20 20 20  e))... (text    
9860: 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74   (twiki:line->ht
9870: 6d 6c 20 28 63 61 64 64 72 20 74 3a 6d 61 74 63  ml (caddr t:matc
9880: 68 29 20 23 74 20 77 69 6b 69 29 29 0a 09 09 20  h) #t wiki))... 
9890: 28 62 74 79 70 65 20 20 20 20 28 69 66 20 28 73  (btype    (if (s
98a0: 74 72 69 6e 67 3d 3f 20 22 23 22 20 28 73 75 62  tring=? "#" (sub
98b0: 73 74 72 69 6e 67 20 64 69 72 65 63 74 69 76 65  string directive
98c0: 20 30 20 31 29 29 0a 09 09 09 20 20 20 20 20 20   0 1))....      
98d0: 20 27 6f 6c 0a 09 09 09 20 20 20 20 20 20 20 27   'ol....       '
98e0: 75 6c 29 29 0a 09 09 20 28 66 75 6e 63 20 20 20  ul))... (func   
98f0: 20 20 28 69 66 20 28 65 71 3f 20 62 74 79 70 65    (if (eq? btype
9900: 20 27 75 6c 29 0a 09 09 09 20 20 20 20 20 20 20   'ul)....       
9910: 74 77 69 6b 69 3a 75 6c 0a 09 09 09 20 20 20 20  twiki:ul....    
9920: 20 20 20 74 77 69 6b 69 3a 6f 6c 29 29 29 0a 09     twiki:ol)))..
9930: 20 20 20 20 3b 3b 20 28 70 72 69 6e 74 20 22 68      ;; (print "h
9940: 61 6e 64 6c 69 6e 67 20 22 20 62 74 79 70 65 20  andling " btype 
9950: 22 3a 20 6c 65 76 65 6c 6e 75 6d 3d 22 20 6c 65  ": levelnum=" le
9960: 76 65 6c 6e 75 6d 20 22 20 74 65 78 74 3d 22 20  velnum " text=" 
9970: 74 65 78 74 20 22 20 6e 65 73 74 2d 64 65 70 74  text " nest-dept
9980: 68 3d 22 20 6e 65 73 74 2d 64 65 70 74 68 20 22  h=" nest-depth "
9990: 20 62 6c 6b 2d 74 79 70 65 3d 22 20 62 6c 6b 2d   blk-type=" blk-
99a0: 74 79 70 65 29 0a 09 20 20 20 20 28 63 6f 6e 64  type)..    (cond
99b0: 0a 09 20 20 20 20 20 28 28 6e 6f 74 20 62 6c 6b  ..     ((not blk
99c0: 2d 74 79 70 65 29 20 3b 3b 20 69 2e 65 20 66 69  -type) ;; i.e fi
99d0: 72 73 74 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  rst member of th
99e0: 65 20 6c 69 73 74 21 0a 09 20 20 20 20 20 20 28  e list!..      (
99f0: 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20 72 65 73  loop (append res
9a00: 20 28 66 75 6e 63 20 28 74 77 69 6b 69 3a 72 65   (func (twiki:re
9a10: 61 64 2d 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c 69  ad-block peek-li
9a20: 6e 65 20 67 65 74 2d 6c 69 6e 65 20 6c 65 76 65  ne get-line leve
9a30: 6c 6e 75 6d 20 62 74 79 70 65 20 77 69 6b 69 29  lnum btype wiki)
9a40: 29 29 0a 09 09 20 20 20 20 28 67 65 74 2d 6c 69  ))...    (get-li
9a50: 6e 65 29 29 29 0a 09 20 20 20 20 20 28 28 3e 20  ne)))..     ((> 
9a60: 6c 65 76 65 6c 6e 75 6d 20 6e 65 73 74 2d 64 65  levelnum nest-de
9a70: 70 74 68 29 0a 09 20 20 20 20 20 20 28 6c 6f 6f  pth)..      (loo
9a80: 70 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 66  p (append res (f
9a90: 75 6e 63 20 28 74 77 69 6b 69 3a 72 65 61 64 2d  unc (twiki:read-
9aa0: 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c 69 6e 65 20  block peek-line 
9ab0: 67 65 74 2d 6c 69 6e 65 20 28 2b 20 6e 65 73 74  get-line (+ nest
9ac0: 2d 64 65 70 74 68 20 31 29 20 62 74 79 70 65 20  -depth 1) btype 
9ad0: 77 69 6b 69 29 29 29 0a 09 09 20 20 20 20 28 70  wiki)))...    (p
9ae0: 65 65 6b 2d 6c 69 6e 65 29 29 29 0a 09 20 20 20  eek-line)))..   
9af0: 20 20 28 28 3c 20 6c 65 76 65 6c 6e 75 6d 20 6e    ((< levelnum n
9b00: 65 73 74 2d 64 65 70 74 68 29 0a 09 20 20 20 20  est-depth)..    
9b10: 20 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 74    (append res (t
9b20: 77 69 6b 69 3a 6c 69 20 74 65 78 74 29 29 29 20  wiki:li text))) 
9b30: 3b 3b 20 72 65 74 75 72 6e 20 74 68 65 20 62 75  ;; return the bu
9b40: 6c 6c 65 74 65 64 20 69 74 65 6d 2c 20 64 6f 6e  lleted item, don
9b50: 27 74 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  't get the next 
9b60: 6c 69 6e 65 3f 3f 0a 09 20 20 20 20 20 28 65 6c  line??..     (el
9b70: 73 65 0a 09 20 20 20 20 20 20 28 67 65 74 2d 6c  se..      (get-l
9b80: 69 6e 65 29 0a 09 20 20 20 20 20 20 28 6c 6f 6f  ine)..      (loo
9b90: 70 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 74  p (append res (t
9ba0: 77 69 6b 69 3a 6c 69 20 74 65 78 74 29 29 0a 09  wiki:li text))..
9bb0: 09 20 20 20 20 28 70 65 65 6b 2d 6c 69 6e 65 29  .    (peek-line)
9bc0: 29 29 29 29 29 0a 09 20 28 28 74 2d 6d 61 74 63  ))))).. ((t-matc
9bd0: 68 20 74 77 69 6b 69 3a 70 72 65 66 6f 72 2d 70  h twiki:prefor-p
9be0: 61 74 74 20 6c 29 0a 09 20 20 28 67 65 74 2d 6c  att l)..  (get-l
9bf0: 69 6e 65 29 20 3b 3b 20 64 69 73 63 61 72 64 20  ine) ;; discard 
9c00: 74 68 65 20 7b 7b 7b 0a 09 20 20 28 6c 6f 6f 70  the {{{..  (loop
9c10: 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 74 77   (append res (tw
9c20: 69 6b 69 3a 70 72 65 20 28 74 77 69 6b 69 3a 72  iki:pre (twiki:r
9c30: 65 61 64 2d 62 6c 6f 63 6b 20 70 65 65 6b 2d 6c  ead-block peek-l
9c40: 69 6e 65 20 67 65 74 2d 6c 69 6e 65 20 6e 65 73  ine get-line nes
9c50: 74 2d 64 65 70 74 68 20 27 70 72 65 20 77 69 6b  t-depth 'pre wik
9c60: 69 29 29 29 0a 09 09 28 70 65 65 6b 2d 6c 69 6e  i)))...(peek-lin
9c70: 65 29 29 29 0a 09 20 28 28 74 2d 6d 61 74 63 68  e))).. ((t-match
9c80: 20 74 77 69 6b 69 3a 74 61 62 6c 65 2d 70 61 74   twiki:table-pat
9c90: 74 20 6c 29 0a 09 20 20 28 67 65 74 2d 6c 69 6e  t l)..  (get-lin
9ca0: 65 29 0a 09 20 20 28 6c 6f 6f 70 20 28 61 70 70  e)..  (loop (app
9cb0: 65 6e 64 20 72 65 73 20 28 74 77 69 6b 69 3a 74  end res (twiki:t
9cc0: 61 62 6c 65 20 27 62 6f 72 64 65 72 20 31 20 27  able 'border 1 '
9cd0: 63 65 6c 6c 73 70 61 63 69 6e 67 20 30 20 28 74  cellspacing 0 (t
9ce0: 77 69 6b 69 3a 72 65 61 64 2d 62 6c 6f 63 6b 20  wiki:read-block 
9cf0: 70 65 65 6b 2d 6c 69 6e 65 20 67 65 74 2d 6c 69  peek-line get-li
9d00: 6e 65 20 30 20 27 74 61 62 6c 65 20 77 69 6b 69  ne 0 'table wiki
9d10: 29 29 29 0a 09 09 28 70 65 65 6b 2d 6c 69 6e 65  )))...(peek-line
9d20: 29 29 29 0a 09 20 28 65 6c 73 65 0a 09 20 20 28  ))).. (else..  (
9d30: 67 65 74 2d 6c 69 6e 65 29 0a 09 20 20 28 6c 6f  get-line)..  (lo
9d40: 6f 70 20 28 61 70 70 65 6e 64 20 72 65 73 20 28  op (append res (
9d50: 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c  twiki:line->html
9d60: 20 6c 20 23 74 20 77 69 6b 69 29 29 0a 09 09 28   l #t wiki))...(
9d70: 70 65 65 6b 2d 6c 69 6e 65 29 29 29 29 29 29 29  peek-line)))))))
9d80: 0a 0a 28 64 65 66 69 6e 65 20 28 74 77 69 6b 69  ..(define (twiki
9d90: 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 64 61 74 20  :line->html dat 
9da0: 66 69 72 73 74 63 61 6c 6c 20 77 69 6b 69 29 0a  firstcall wiki).
9db0: 20 20 28 69 66 20 66 69 72 73 74 63 61 6c 6c 20    (if firstcall 
9dc0: 0a 20 20 20 20 20 20 3b 3b 20 70 72 6f 63 65 73  .      ;; proces
9dd0: 73 20 74 68 65 20 70 61 74 74 65 72 6e 73 20 74  s the patterns t
9de0: 68 61 74 20 74 65 73 74 20 66 6f 72 20 62 65 67  hat test for beg
9df0: 69 6e 6e 69 6e 67 20 6f 66 20 6c 69 6e 65 20 6f  inning of line o
9e00: 6e 6c 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  nly on the first
9e10: 20 63 61 6c 6c 0a 20 20 20 20 20 20 28 63 6f 6e   call.      (con
9e20: 64 0a 20 20 20 20 20 20 20 28 28 74 2d 6d 61 74  d.       ((t-mat
9e30: 63 68 20 74 77 69 6b 69 3a 68 33 2d 70 61 74 74  ch twiki:h3-patt
9e40: 20 64 61 74 29 0a 09 28 74 77 69 6b 69 3a 68 33   dat)..(twiki:h3
9e50: 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74   (twiki:line->ht
9e60: 6d 6c 20 28 63 61 64 72 20 74 3a 6d 61 74 63 68  ml (cadr t:match
9e70: 29 20 23 66 20 77 69 6b 69 29 29 29 0a 20 20 20  ) #f wiki))).   
9e80: 20 20 20 20 28 28 74 2d 6d 61 74 63 68 20 74 77      ((t-match tw
9e90: 69 6b 69 3a 68 32 2d 70 61 74 74 20 64 61 74 29  iki:h2-patt dat)
9ea0: 0a 09 28 74 77 69 6b 69 3a 68 32 20 28 74 77 69  ..(twiki:h2 (twi
9eb0: 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 28 63  ki:line->html (c
9ec0: 61 64 72 20 74 3a 6d 61 74 63 68 29 20 23 66 20  adr t:match) #f 
9ed0: 77 69 6b 69 29 29 29 0a 20 20 20 20 20 20 20 28  wiki))).       (
9ee0: 28 74 2d 6d 61 74 63 68 20 74 77 69 6b 69 3a 68  (t-match twiki:h
9ef0: 31 2d 70 61 74 74 20 64 61 74 29 0a 09 28 74 77  1-patt dat)..(tw
9f00: 69 6b 69 3a 68 31 20 28 74 77 69 6b 69 3a 6c 69  iki:h1 (twiki:li
9f10: 6e 65 2d 3e 68 74 6d 6c 20 28 63 61 64 72 20 74  ne->html (cadr t
9f20: 3a 6d 61 74 63 68 29 20 23 66 20 77 69 6b 69 29  :match) #f wiki)
9f30: 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 77 68 79  )).       ;; why
9f40: 20 77 61 73 20 74 68 65 20 28 73 3a 62 72 29 20   was the (s:br) 
9f50: 68 65 72 65 3f 20 74 72 79 69 6e 67 20 77 69 74  here? trying wit
9f60: 68 6f 75 74 0a 20 20 20 20 20 20 20 28 65 6c 73  hout.       (els
9f70: 65 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68  e (twiki:line->h
9f80: 74 6d 6c 20 64 61 74 20 23 66 20 77 69 6b 69 29  tml dat #f wiki)
9f90: 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 28 65 6c  )).       ;; (el
9fa0: 73 65 20 20 28 61 70 70 65 6e 64 20 28 74 77 69  se  (append (twi
9fb0: 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20 64 61  ki:line->html da
9fc0: 74 20 23 66 20 77 69 6b 69 29 28 6c 69 73 74 20  t #f wiki)(list 
9fd0: 28 73 3a 62 72 29 29 29 29 29 3b 3b 20 28 73 3a  (s:br)))));; (s:
9fe0: 70 20 27 63 6c 61 73 73 20 22 74 69 64 64 6c 65  p 'class "tiddle
9ff0: 72 70 61 72 22 0a 20 20 20 20 20 20 3b 3b 20 6e  rpar".      ;; n
a000: 6f 74 20 66 69 72 73 74 63 61 6c 6c 20 73 6f 20  ot firstcall so 
a010: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 70 61  process other pa
a020: 74 74 65 72 6e 73 0a 20 20 20 20 20 20 28 63 6f  tterns.      (co
a030: 6e 64 0a 20 20 20 20 20 20 20 28 28 74 2d 6d 61  nd.       ((t-ma
a040: 74 63 68 20 74 77 69 6b 69 3a 74 6c 69 6e 6b 2d  tch twiki:tlink-
a050: 70 61 74 74 20 64 61 74 29 0a 09 28 6c 65 74 20  patt dat)..(let 
a060: 28 28 70 72 65 20 20 28 63 61 64 72 20 20 20 74  ((pre  (cadr   t
a070: 3a 6d 61 74 63 68 29 29 0a 09 20 20 20 20 20 20  :match))..      
a080: 28 6c 6e 6b 20 20 28 63 61 64 64 72 20 20 74 3a  (lnk  (caddr  t:
a090: 6d 61 74 63 68 29 29 0a 09 20 20 20 20 20 20 28  match))..      (
a0a0: 70 6f 73 74 20 28 63 61 64 64 64 72 20 74 3a 6d  post (cadddr t:m
a0b0: 61 74 63 68 29 29 29 0a 09 20 20 28 6c 69 73 74  atch)))..  (list
a0c0: 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74   (twiki:line->ht
a0d0: 6d 6c 20 70 72 65 20 23 66 20 77 69 6b 69 29 0a  ml pre #f wiki).
a0e0: 09 09 28 74 77 69 6b 69 3a 6d 61 6b 65 2d 74 6c  ..(twiki:make-tl
a0f0: 69 6e 6b 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d  ink (twiki:line-
a100: 3e 68 74 6d 6c 20 6c 6e 6b 20 23 66 20 77 69 6b  >html lnk #f wik
a110: 69 29 20 6c 6e 6b 29 20 3b 3b 20 73 70 65 63 69  i) lnk) ;; speci
a120: 61 6c 20 68 61 6e 64 6c 69 6e 67 0a 09 09 28 74  al handling...(t
a130: 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d 6c 20  wiki:line->html 
a140: 70 6f 73 74 20 23 66 20 77 69 6b 69 29 29 29 29  post #f wiki))))
a150: 0a 20 20 20 20 20 20 20 28 28 74 2d 6d 61 74 63  .       ((t-matc
a160: 68 20 74 77 69 6b 69 3a 70 69 63 2d 70 61 74 74  h twiki:pic-patt
a170: 20 64 61 74 29 0a 09 28 6c 65 74 20 28 28 70 72   dat)..(let ((pr
a180: 65 20 20 28 63 61 64 72 20 20 20 20 74 3a 6d 61  e  (cadr    t:ma
a190: 74 63 68 29 29 0a 09 20 20 20 20 20 20 28 73 69  tch))..      (si
a1a0: 7a 65 20 28 63 61 64 64 72 20 20 20 74 3a 6d 61  ze (caddr   t:ma
a1b0: 74 63 68 29 29 20 0a 09 20 20 20 20 20 20 28 70  tch)) ..      (p
a1c0: 69 63 20 20 28 63 61 64 64 64 72 20 20 74 3a 6d  ic  (cadddr  t:m
a1d0: 61 74 63 68 29 29 0a 09 20 20 20 20 20 20 28 70  atch))..      (p
a1e0: 6f 73 74 20 28 6c 69 73 74 2d 72 65 66 20 74 3a  ost (list-ref t:
a1f0: 6d 61 74 63 68 20 34 29 29 29 0a 09 20 20 28 6c  match 4)))..  (l
a200: 69 73 74 20 28 74 77 69 6b 69 3a 6c 69 6e 65 2d  ist (twiki:line-
a210: 3e 68 74 6d 6c 20 70 72 65 20 23 66 20 77 69 6b  >html pre #f wik
a220: 69 29 0a 09 09 28 74 77 69 6b 69 3a 70 69 63 20  i)...(twiki:pic 
a230: 70 69 63 20 73 69 7a 65 20 77 69 6b 69 29 0a 09  pic size wiki)..
a240: 09 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74  .(twiki:line->ht
a250: 6d 6c 20 70 6f 73 74 20 23 74 20 77 69 6b 69 29  ml post #t wiki)
a260: 29 29 29 0a 20 20 20 20 20 20 20 28 28 74 2d 6d  ))).       ((t-m
a270: 61 74 63 68 20 74 77 69 6b 69 3a 75 6e 64 65 72  atch twiki:under
a280: 6c 69 6e 65 2d 70 61 74 74 20 64 61 74 29 0a 09  line-patt dat)..
a290: 28 6c 65 74 20 28 28 70 72 65 20 20 28 63 61 64  (let ((pre  (cad
a2a0: 72 20 20 20 74 3a 6d 61 74 63 68 29 29 0a 09 20  r   t:match)).. 
a2b0: 20 20 20 20 20 28 6c 6e 6b 20 20 28 63 61 64 64       (lnk  (cadd
a2c0: 72 20 20 74 3a 6d 61 74 63 68 29 29 0a 09 20 20  r  t:match))..  
a2d0: 20 20 20 20 28 70 6f 73 74 20 28 63 61 64 64 64      (post (caddd
a2e0: 72 20 74 3a 6d 61 74 63 68 29 29 29 0a 09 20 20  r t:match)))..  
a2f0: 28 6c 69 73 74 20 28 74 77 69 6b 69 3a 6c 69 6e  (list (twiki:lin
a300: 65 2d 3e 68 74 6d 6c 20 70 72 65 20 23 66 20 77  e->html pre #f w
a310: 69 6b 69 29 0a 09 09 28 74 77 69 6b 69 3a 75 20  iki)...(twiki:u 
a320: 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68 74 6d  (twiki:line->htm
a330: 6c 20 6c 6e 6b 20 23 66 20 77 69 6b 69 29 29 0a  l lnk #f wiki)).
a340: 09 09 28 74 77 69 6b 69 3a 6c 69 6e 65 2d 3e 68  ..(twiki:line->h
a350: 74 6d 6c 20 70 6f 73 74 20 23 66 20 77 69 6b 69  tml post #f wiki
a360: 29 29 29 29 0a 20 20 20 20 20 20 20 28 28 74 2d  )))).       ((t-
a370: 6d 61 74 63 68 20 74 77 69 6b 69 3a 74 61 62 6c  match twiki:tabl
a380: 65 2d 70 61 74 74 20 64 61 74 29 0a 09 28 6c 65  e-patt dat)..(le
a390: 74 20 28 28 63 65 6c 73 20 20 28 73 74 72 69 6e  t ((cels  (strin
a3a0: 67 2d 73 70 6c 69 74 20 28 63 61 64 72 20 74 3a  g-split (cadr t:
a3b0: 6d 61 74 63 68 29 20 22 7c 22 29 29 29 0a 09 20  match) "|"))).. 
a3c0: 20 28 74 77 69 6b 69 3a 74 72 20 28 6d 61 70 20   (twiki:tr (map 
a3d0: 74 77 69 6b 69 3a 74 64 20 28 74 77 69 6b 69 3a  twiki:td (twiki:
a3e0: 6c 69 6e 65 2d 3e 68 74 6d 6c 20 63 65 6c 73 20  line->html cels 
a3f0: 23 66 20 77 69 6b 69 29 29 29 29 29 0a 20 20 20  #f wiki))))).   
a400: 20 20 20 20 28 65 6c 73 65 20 28 6c 69 73 74 20      (else (list 
a410: 64 61 74 29 29 29 29 29 0a 0a 0a 23 7c 0a 28 74  dat)))))...#|.(t
a420: 77 69 6b 69 3a 64 61 74 2d 3e 68 74 6d 6c 20 22  wiki:dat->html "
a430: 61 5c 6e 7b 7b 7b 5c 6e 62 5c 6e 63 5c 6e 64 5c  a\n{{{\nb\nc\nd\
a440: 6e 7d 7d 7d 5c 6e 21 65 5c 6e 5b 5b 66 5d 5d 5c  n}}}\n!e\n[[f]]\
a450: 6e 5b 5b 67 5d 5d 5c 6e 2a 68 22 20 77 69 6b 69  n[[g]]\n*h" wiki
a460: 29 0a 28 73 3a 6f 75 74 70 75 74 20 28 63 75 72  ).(s:output (cur
a470: 72 65 6e 74 2d 6f 75 74 70 75 74 2d 70 6f 72 74  rent-output-port
a480: 29 20 28 74 77 69 6b 69 3a 64 61 74 2d 3e 68 74  ) (twiki:dat->ht
a490: 6d 6c 20 22 21 54 65 73 74 69 6e 67 20 5b 5b 6d  ml "!Testing [[m
a4a0: 79 20 66 69 72 73 74 20 6c 69 6e 6b 5d 5d 5c 6e  y first link]]\n
a4b0: 2a 20 54 65 73 74 5c 6e 2a 20 46 6f 6f 5c 6e 62  * Test\n* Foo\nb
a4c0: 6c 61 68 22 20 77 69 6b 69 29 29 20 20 20 0a 28  lah" wiki))   .(
a4d0: 73 3a 6f 75 74 70 75 74 20 28 63 75 72 72 65 6e  s:output (curren
a4e0: 74 2d 6f 75 74 70 75 74 2d 70 6f 72 74 29 20 28  t-output-port) (
a4f0: 74 77 69 6b 69 3a 64 61 74 2d 3e 68 74 6d 6c 20  twiki:dat->html 
a500: 22 5b 5b 61 5d 5d 5c 6e 7b 7b 7b 5c 6e 62 5c 6e  "[[a]]\n{{{\nb\n
a510: 20 20 63 5c 6e 20 20 20 64 5c 6e 7d 7d 7d 5c 6e    c\n   d\n}}}\n
a520: 2a 78 5c 6e 5b 5b 66 5d 5d 5c 6e 5b 5b 67 5d 5d  *x\n[[f]]\n[[g]]
a530: 5c 6e 2a 68 22 20 77 69 6b 69 29 29 0a 28 73 3a  \n*h" wiki)).(s:
a540: 6f 75 74 70 75 74 20 28 63 75 72 72 65 6e 74 2d  output (current-
a550: 6f 75 74 70 75 74 2d 70 6f 72 74 29 0a 7c 23 0a  output-port).|#.
a560: 0a                                               .