Artifact 1c2965ad326a43c98bfea73f8933cce29259e442:


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 31 2c 20 4d 61 74 74 68 65 77 20  7-2011, Matthew 
0020: 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20 0a 3b 3b 20  Welland..;; .;; 
0030: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0040: 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20   made available 
0050: 75 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47 50  under the GNU GP
0060: 4c 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f 72  L version 2.0 or
0070: 0a 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53 65  .;;  greater. Se
0080: 65 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69  e the accompanyi
0090: 6e 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 20  ng file COPYING 
00a0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b 20  for details..;; 
00b0: 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61  .;;  This progra
00c0: 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  m is distributed
00d0: 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52   WITHOUT ANY WAR
00e0: 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65  RANTY; without e
00f0: 76 65 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70 6c  ven the.;;  impl
0100: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 20  ied warranty of 
0110: 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20  MERCHANTABILITY 
0120: 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41  or FITNESS FOR A
0130: 20 50 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20 20   PARTICULAR.;;  
0140: 50 55 52 50 4f 53 45 2e 0a 0a 3b 3b 20 28 64 65  PURPOSE...;; (de
0150: 63 6c 61 72 65 20 28 75 6e 69 74 20 68 74 6d 6c  clare (unit html
0160: 2d 66 69 6c 74 65 72 29 29 0a 0a 28 6d 6f 64 75  -filter))..(modu
0170: 6c 65 20 68 74 6d 6c 2d 66 69 6c 74 65 72 0a 20  le html-filter. 
0180: 20 20 20 2a 0a 0a 28 69 6d 70 6f 72 74 20 63 68     *..(import ch
0190: 69 63 6b 65 6e 20 73 63 68 65 6d 65 20 64 61 74  icken scheme dat
01a0: 61 2d 73 74 72 75 63 74 75 72 65 73 20 65 78 74  a-structures ext
01b0: 72 61 73 20 73 72 66 69 2d 31 33 20 70 6f 72 74  ras srfi-13 port
01c0: 73 20 29 0a 28 75 73 65 20 6d 69 73 63 2d 73 74  s ).(use misc-st
01d0: 6d 6c 29 0a 0a 28 72 65 71 75 69 72 65 2d 65 78  ml)..(require-ex
01e0: 74 65 6e 73 69 6f 6e 20 72 65 67 65 78 29 0a 0a  tension regex)..
01f0: 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  ;; .(define (s:s
0200: 70 6c 69 74 2d 73 74 72 69 6e 67 20 73 74 72 6e  plit-string strn
0210: 67 20 64 65 6c 69 6d 29 0a 20 20 28 69 66 20 28  g delim).  (if (
0220: 65 71 3f 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67  eq? (string-leng
0230: 74 68 20 73 74 72 6e 67 29 20 30 29 20 28 6c 69  th strng) 0) (li
0240: 73 74 20 73 74 72 6e 67 29 0a 20 20 20 20 20 20  st strng).      
0250: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65 61 64  (let loop ((head
0260: 20 28 6d 61 6b 65 2d 73 74 72 69 6e 67 20 31 20   (make-string 1 
0270: 28 63 61 72 20 28 73 74 72 69 6e 67 2d 3e 6c 69  (car (string->li
0280: 73 74 20 73 74 72 6e 67 29 29 29 29 0a 09 09 20  st strng))))... 
0290: 28 74 61 69 6c 20 28 63 64 72 20 28 73 74 72 69  (tail (cdr (stri
02a0: 6e 67 2d 3e 6c 69 73 74 20 73 74 72 6e 67 29 29  ng->list strng))
02b0: 29 0a 09 09 20 28 64 65 73 74 20 27 28 29 29 0a  )... (dest '()).
02c0: 09 09 20 28 74 65 6d 70 20 22 22 29 29 0a 09 28  .. (temp ""))..(
02d0: 63 6f 6e 64 20 28 28 65 71 75 61 6c 3f 20 68 65  cond ((equal? he
02e0: 61 64 20 64 65 6c 69 6d 29 0a 09 20 20 20 20 20  ad delim)..     
02f0: 20 20 28 73 65 74 21 20 64 65 73 74 20 28 61 70    (set! dest (ap
0300: 70 65 6e 64 20 64 65 73 74 20 28 6c 69 73 74 20  pend dest (list 
0310: 74 65 6d 70 29 29 29 0a 09 20 20 20 20 20 20 20  temp)))..       
0320: 28 73 65 74 21 20 74 65 6d 70 20 22 22 29 29 0a  (set! temp "")).
0330: 09 20 20 20 20 20 20 28 28 6e 75 6c 6c 3f 20 68  .      ((null? h
0340: 65 61 64 29 20 0a 09 20 20 20 20 20 20 20 28 73  ead) ..       (s
0350: 65 74 21 20 64 65 73 74 20 28 61 70 70 65 6e 64  et! dest (append
0360: 20 64 65 73 74 20 28 6c 69 73 74 20 74 65 6d 70   dest (list temp
0370: 29 29 29 29 0a 09 20 20 20 20 20 20 28 65 6c 73  ))))..      (els
0380: 65 20 28 73 65 74 21 20 74 65 6d 70 20 28 73 74  e (set! temp (st
0390: 72 69 6e 67 2d 61 70 70 65 6e 64 20 74 65 6d 70  ring-append temp
03a0: 20 68 65 61 64 29 29 29 29 20 3b 3b 20 65 6e 64   head)))) ;; end
03b0: 20 69 66 0a 09 28 63 6f 6e 64 20 28 28 6e 75 6c   if..(cond ((nul
03c0: 6c 3f 20 74 61 69 6c 29 0a 09 20 20 20 20 20 20  l? tail)..      
03d0: 20 28 73 65 74 21 20 64 65 73 74 20 28 61 70 70   (set! dest (app
03e0: 65 6e 64 20 64 65 73 74 20 28 6c 69 73 74 20 74  end dest (list t
03f0: 65 6d 70 29 29 29 20 64 65 73 74 29 0a 09 20 20  emp))) dest)..  
0400: 20 20 20 20 28 65 6c 73 65 20 28 6c 6f 6f 70 20      (else (loop 
0410: 28 6d 61 6b 65 2d 73 74 72 69 6e 67 20 31 20 28  (make-string 1 (
0420: 63 61 72 20 74 61 69 6c 29 29 20 28 63 64 72 20  car tail)) (cdr 
0430: 74 61 69 6c 29 20 64 65 73 74 20 74 65 6d 70 29  tail) dest temp)
0440: 29 29 29 29 29 0a 0a 3b 3b 20 61 6c 6c 6f 77 65  )))))..;; allowe
0450: 64 2d 74 61 67 73 20 69 73 20 61 20 6c 69 73 74  d-tags is a list
0460: 20 6f 66 20 74 61 67 73 20 61 73 20 73 79 6d 62   of tags as symb
0470: 6f 6c 73 3a 0a 3b 3b 20 20 20 27 28 61 20 62 20  ols:.;;   '(a b 
0480: 63 65 6e 74 65 72 20 70 20 61 29 0a 3b 3b 20 70  center p a).;; p
0490: 61 72 73 69 6e 67 20 69 73 20 73 69 6d 70 6c 69  arsing is simpli
04a0: 73 74 69 63 20 61 6e 64 20 74 68 65 20 72 65 73  stic and the res
04b0: 70 6f 6e 73 65 20 63 6f 6e 73 65 72 76 61 74 69  ponse conservati
04c0: 76 65 0a 3b 3b 20 69 66 20 61 20 3c 20 69 73 20  ve.;; if a < is 
04d0: 66 6f 75 6e 64 20 77 69 74 68 6f 75 74 20 74 68  found without th
04e0: 65 20 74 61 67 20 61 6e 64 20 63 6c 6f 73 69 6e  e tag and closin
04f0: 67 20 3e 20 74 68 65 6e 0a 3b 3b 20 74 68 65 20  g > then.;; the 
0500: 3c 20 6f 72 20 3e 20 69 73 20 72 65 70 6c 61 63  < or > is replac
0510: 65 64 20 77 69 74 68 20 26 6c 74 3b 20 6f 72 20  ed with &lt; or 
0520: 26 67 74 3b 20 77 69 74 68 6f 75 74 20 0a 3b 3b  &gt; without .;;
0530: 20 65 76 65 6e 20 74 72 79 69 6e 67 20 68 61 72   even trying har
0540: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
0550: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6c 65  if there is a le
0560: 67 69 74 20 74 61 67 20 0a 3b 3b 20 62 75 72 69  git tag .;; buri
0570: 65 64 20 69 6e 20 74 68 65 20 74 65 78 74 20 73  ed in the text s
0580: 6f 6d 65 77 68 65 72 65 2e 0a 3b 3b 20 61 20 6c  omewhere..;; a l
0590: 69 73 74 20 6f 66 20 73 74 72 69 6e 67 73 20 69  ist of strings i
05a0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 3b 3b 0a 3b  s returned..;;.;
05b0: 3b 20 4e 4f 54 45 53 0a 3b 3b 20 31 2e 20 63 61  ; NOTES.;; 1. ca
05c0: 73 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  se is important 
05d0: 69 6e 20 74 68 65 20 61 6c 6c 6f 77 65 64 2d 74  in the allowed-t
05e0: 61 67 73 20 6c 69 73 74 21 0a 3b 3b 20 32 2e 20  ags list!.;; 2. 
05f0: 6f 6e 6c 79 20 22 73 6f 6c 69 64 22 20 74 61 67  only "solid" tag
0600: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 20  s are supported 
0610: 69 2e 65 2e 20 3c 61 20 68 72 65 66 3d 22 66 6f  i.e. <a href="fo
0620: 6f 22 3e 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  o"> will not wor
0630: 6b 3f 0a 3b 3b 0a 0a 3b 3b 20 28 73 3a 63 67 69  k?.;;..;; (s:cgi
0640: 2d 6f 75 74 20 28 65 76 61 6c 20 28 73 3a 6f 75  -out (eval (s:ou
0650: 74 70 75 74 20 28 73 3a 68 74 6d 6c 2d 66 69 6c  tput (s:html-fil
0660: 74 65 72 20 22 68 65 6c 6c 6f 3c 62 3e 67 6f 6f  ter "hello<b>goo
0670: 64 62 79 65 3c 2f 62 3e 3c 62 3e 20 65 68 22 20  dbye</b><b> eh" 
0680: 27 28 61 20 62 20 69 29 29 29 29 0a 0a 3b 3b 20  '(a b i))))..;; 
0690: 73 74 72 61 74 65 67 79 0a 3b 3b 20 31 2e 20 63  strategy.;; 1. c
06a0: 6f 6e 76 65 72 74 20 5c 6e 20 74 6f 20 3c 6c 69  onvert \n to <li
06b0: 6e 65 66 65 65 64 3e 0a 3b 3b 20 32 2e 20 53 70  nefeed>.;; 2. Sp
06c0: 6c 69 74 20 6f 6e 20 22 3c 22 0a 3b 3b 20 33 2e  lit on "<".;; 3.
06d0: 20 53 70 6c 69 74 20 6f 6e 20 22 3e 22 0a 3b 3b   Split on ">".;;
06e0: 20 34 2e 20 46 69 78 0a 28 64 65 66 69 6e 65 20   4. Fix.(define 
06f0: 28 73 3a 68 74 6d 6c 2d 66 69 6c 74 65 72 20 69  (s:html-filter i
0700: 6e 70 75 74 2d 74 65 78 74 20 61 6c 6c 6f 77 65  nput-text allowe
0710: 64 2d 74 61 67 73 29 0a 20 20 28 6c 65 74 2a 20  d-tags).  (let* 
0720: 28 28 74 6f 6b 73 20 20 20 28 73 3a 73 74 72 2d  ((toks   (s:str-
0730: 3e 74 6f 6b 73 20 69 6e 70 75 74 2d 74 65 78 74  >toks input-text
0740: 29 29 0a 09 20 28 74 6d 70 20 20 20 20 28 73 3a  )).. (tmp    (s:
0750: 74 6f 6b 73 2d 3e 73 74 6d 6c 20 27 28 73 3a 6e  toks->stml '(s:n
0760: 75 6c 6c 29 20 23 66 20 74 6f 6b 73 20 61 6c 6c  ull) #f toks all
0770: 6f 77 65 64 2d 74 61 67 73 29 29 0a 09 20 28 72  owed-tags)).. (r
0780: 65 73 20 20 20 20 28 63 61 72 20 74 6d 70 29 29  es    (car tmp))
0790: 0a 09 20 28 6e 78 74 74 61 67 20 28 63 61 64 72  .. (nxttag (cadr
07a0: 20 74 6d 70 29 29 0a 09 20 28 72 65 6d 20 20 20   tmp)).. (rem   
07b0: 20 28 63 61 64 64 72 20 74 6d 70 29 29 29 0a 20   (caddr tmp))). 
07c0: 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e     res))..(defin
07d0: 65 20 28 73 3a 68 74 6d 6c 2d 66 69 6c 74 65 72  e (s:html-filter
07e0: 2d 3e 73 74 72 69 6e 67 20 69 6e 70 75 74 2d 74  ->string input-t
07f0: 65 78 74 20 61 6c 6c 6f 77 65 64 2d 74 61 67 73  ext allowed-tags
0800: 29 0a 20 20 28 6c 65 74 20 28 28 6f 73 74 72 20  ).  (let ((ostr 
0810: 28 6f 70 65 6e 2d 6f 75 74 70 75 74 2d 73 74 72  (open-output-str
0820: 69 6e 67 29 29 29 0a 20 20 20 20 3b 3b 3b 20 28  ing))).    ;;; (
0830: 73 3a 6f 75 74 70 75 74 2d 6e 65 77 20 6f 73 74  s:output-new ost
0840: 72 20 28 73 3a 68 74 6d 6c 2d 66 69 6c 74 65 72  r (s:html-filter
0850: 20 69 6e 70 75 74 2d 74 65 78 74 20 61 6c 6c 6f   input-text allo
0860: 77 65 64 2d 74 61 67 73 29 29 0a 20 20 20 20 28  wed-tags)).    (
0870: 73 3a 6f 75 74 70 75 74 2d 6e 65 77 20 6f 73 74  s:output-new ost
0880: 72 20 28 63 61 72 20 28 65 76 61 6c 20 28 73 3a  r (car (eval (s:
0890: 68 74 6d 6c 2d 66 69 6c 74 65 72 20 69 6e 70 75  html-filter inpu
08a0: 74 2d 74 65 78 74 20 61 6c 6c 6f 77 65 64 2d 74  t-text allowed-t
08b0: 61 67 73 29 29 29 29 0a 20 20 20 20 28 73 74 72  ags)))).    (str
08c0: 69 6e 67 2d 63 68 6f 6d 70 20 28 67 65 74 2d 6f  ing-chomp (get-o
08d0: 75 74 70 75 74 2d 73 74 72 69 6e 67 20 6f 73 74  utput-string ost
08e0: 72 29 29 29 29 20 3b 3b 20 64 6f 6e 27 74 20 6e  r)))) ;; don't n
08f0: 65 65 64 20 74 68 65 20 6c 69 6e 65 66 65 65 64  eed the linefeed
0900: 2c 20 63 6f 75 6c 64 20 73 74 6f 70 20 61 64 64  , could stop add
0910: 69 6e 67 20 69 74 20 2e 2e 2e 0a 09 0a 3b 3b 20  ing it ......;; 
0920: 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 72      (if (null? r
0930: 65 6d 29 0a 3b 3b 20 09 72 65 73 20 27 28 29 29  em).;; .res '())
0940: 0a 3b 3b 20 09 28 73 3a 74 6f 6b 73 2d 3e 73 74  .;; .(s:toks->st
0950: 6d 6c 20 28 69 66 20 28 6c 69 73 74 3f 20 72 65  ml (if (list? re
0960: 73 29 20 72 65 73 20 27 28 29 29 20 23 66 20 72  s) res '()) #f r
0970: 65 6d 20 61 6c 6c 6f 77 65 64 2d 74 61 67 73 29  em allowed-tags)
0980: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a  )))..(define (s:
0990: 73 74 72 2d 3e 74 6f 6b 73 20 73 74 72 29 0a 20  str->toks str). 
09a0: 20 28 61 70 70 6c 79 20 61 70 70 65 6e 64 20 28   (apply append (
09b0: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 74 6f 6b  map (lambda (tok
09c0: 29 0a 09 09 20 20 20 20 20 20 20 28 69 6e 74 65  )...       (inte
09d0: 72 73 70 65 72 73 65 20 28 73 3a 73 70 6c 69 74  rsperse (s:split
09e0: 2d 73 74 72 69 6e 67 20 74 6f 6b 20 22 3e 22 29  -string tok ">")
09f0: 20 22 3e 22 29 29 20 0a 09 09 20 20 20 20 20 28   ">")) ...     (
0a00: 69 6e 74 65 72 73 70 65 72 73 65 20 28 73 3a 73  intersperse (s:s
0a10: 70 6c 69 74 2d 73 74 72 69 6e 67 20 73 74 72 20  plit-string str 
0a20: 22 3c 22 29 20 22 3c 22 29 29 29 29 0a 0a 28 64  "<") "<"))))..(d
0a30: 65 66 69 6e 65 20 28 73 3a 74 61 67 2d 3e 73 74  efine (s:tag->st
0a40: 6d 6c 20 74 61 67 29 0a 20 20 28 73 74 72 69 6e  ml tag).  (strin
0a50: 67 2d 3e 73 79 6d 62 6f 6c 20 28 73 74 72 69 6e  g->symbol (strin
0a60: 67 2d 61 70 70 65 6e 64 20 22 73 3a 22 20 28 73  g-append "s:" (s
0a70: 79 6d 62 6f 6c 2d 3e 73 74 72 69 6e 67 20 74 61  ymbol->string ta
0a80: 67 29 29 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20  g))))...(define 
0a90: 28 73 3a 74 6f 6b 73 2d 3e 73 74 6d 6c 20 72 65  (s:toks->stml re
0aa0: 73 20 74 61 67 20 72 65 6d 20 61 6c 6c 6f 77 65  s tag rem allowe
0ab0: 64 29 0a 20 20 3b 3b 20 28 70 72 69 6e 74 20 22  d).  ;; (print "
0ac0: 74 61 67 3a 20 22 20 74 61 67 20 22 20 72 65 6d  tag: " tag " rem
0ad0: 3a 20 22 20 72 65 6d 29 0a 20 20 28 69 66 20 28  : " rem).  (if (
0ae0: 6e 75 6c 6c 3f 20 72 65 6d 29 0a 20 20 20 20 20  null? rem).     
0af0: 20 28 6c 69 73 74 20 28 61 70 70 65 6e 64 20 72   (list (append r
0b00: 65 73 20 28 69 66 20 74 61 67 0a 09 09 09 20 20  es (if tag....  
0b10: 20 20 28 6c 69 73 74 20 28 73 3a 74 61 67 2d 3e    (list (s:tag->
0b20: 73 74 6d 6c 20 74 61 67 29 29 0a 09 09 09 09 27  stml tag)).....'
0b30: 28 29 29 29 20 23 66 20 27 28 29 20 61 6c 6c 6f  ())) #f '() allo
0b40: 77 65 64 29 20 3b 3b 20 74 68 65 20 63 61 73 65  wed) ;; the case
0b50: 20 6f 66 20 61 20 6c 6f 6e 65 20 74 61 67 20 0a   of a lone tag .
0b60: 20 20 20 20 20 20 3b 3b 20 68 61 6e 64 6c 65 20        ;; handle 
0b70: 61 20 73 74 61 72 74 69 6e 67 20 74 61 67 0a 20  a starting tag. 
0b80: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 74 6d 70       (let* ((tmp
0b90: 20 20 20 20 20 20 20 28 73 3a 75 70 74 6f 2d 74         (s:upto-t
0ba0: 61 67 20 72 65 6d 20 61 6c 6c 6f 77 65 64 29 29  ag rem allowed))
0bb0: 0a 09 20 20 20 20 20 28 74 78 74 20 20 20 20 20  ..     (txt     
0bc0: 20 20 28 63 61 72 20 74 6d 70 29 29 20 20 20 20    (car tmp))    
0bd0: 20 20 3b 3b 20 74 68 69 73 20 74 78 74 20 67 6f    ;; this txt go
0be0: 65 73 20 77 69 74 68 20 74 61 67 21 21 21 0a 09  es with tag!!!..
0bf0: 20 20 20 20 20 28 6e 65 78 74 74 61 67 20 20 20       (nexttag   
0c00: 28 63 61 64 72 20 74 6d 70 29 29 20 20 20 20 20  (cadr tmp))     
0c10: 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 20 4e  ;; this is the N
0c20: 45 58 54 20 44 41 4d 4e 20 74 61 67 21 0a 09 20  EXT DAMN tag!.. 
0c30: 20 20 20 20 28 62 65 67 69 6e 2d 74 61 67 20 28      (begin-tag (
0c40: 63 61 64 64 72 20 74 6d 70 29 29 0a 09 20 20 20  caddr tmp))..   
0c50: 20 20 28 6e 65 77 72 65 6d 20 20 20 20 28 63 61    (newrem    (ca
0c60: 64 64 64 72 20 74 6d 70 29 29 29 0a 09 3b 3b 20  dddr tmp)))..;; 
0c70: 28 70 72 69 6e 74 20 22 74 78 74 3a 20 20 20 20  (print "txt:    
0c80: 20 20 20 20 22 20 74 78 74 20 22 5c 6e 6e 65 78      " txt "\nnex
0c90: 74 74 61 67 3a 20 20 20 20 22 20 6e 65 78 74 74  ttag:    " nextt
0ca0: 61 67 20 22 5c 6e 62 65 67 69 6e 2d 74 61 67 3a  ag "\nbegin-tag:
0cb0: 20 20 22 20 62 65 67 69 6e 2d 74 61 67 20 22 5c    " begin-tag "\
0cc0: 6e 6e 65 77 72 65 6d 3a 20 20 20 20 20 22 20 6e  nnewrem:     " n
0cd0: 65 77 72 65 6d 20 22 5c 6e 72 65 73 3a 20 20 20  ewrem "\nres:   
0ce0: 20 20 20 20 20 22 20 72 65 73 20 22 5c 6e 22 29       " res "\n")
0cf0: 0a 09 28 69 66 20 62 65 67 69 6e 2d 74 61 67 20  ..(if begin-tag 
0d00: 3b 3b 20 6e 65 73 74 20 74 68 65 20 66 6f 6c 6c  ;; nest the foll
0d10: 6f 77 69 6e 67 20 73 74 75 66 66 0a 09 20 20 20  owing stuff..   
0d20: 20 28 6c 65 74 2a 20 28 28 63 68 69 6c 64 64 61   (let* ((childda
0d30: 74 20 28 73 3a 74 6f 6b 73 2d 3e 73 74 6d 6c 20  t (s:toks->stml 
0d40: 27 28 29 20 6e 65 78 74 74 61 67 20 6e 65 77 72  '() nexttag newr
0d50: 65 6d 20 61 6c 6c 6f 77 65 64 29 29 0a 09 09 20  em allowed))... 
0d60: 20 20 28 63 68 69 6c 64 20 20 20 20 28 63 61 72    (child    (car
0d70: 20 63 68 69 6c 64 64 61 74 29 29 0a 09 09 20 20   childdat))...  
0d80: 20 28 6e 65 77 74 61 67 20 20 20 28 63 61 64 72   (newtag   (cadr
0d90: 20 63 68 69 6c 64 64 61 74 29 29 0a 09 09 20 20   childdat))...  
0da0: 20 28 6e 65 77 72 65 6d 32 20 20 28 63 61 64 64   (newrem2  (cadd
0db0: 72 20 63 68 69 6c 64 64 61 74 29 29 0a 09 09 20  r childdat))... 
0dc0: 20 20 28 61 6c 6c 6f 77 65 64 20 20 28 63 61 64    (allowed  (cad
0dd0: 64 64 72 20 63 68 69 6c 64 64 61 74 29 29 29 20  ddr childdat))) 
0de0: 3b 3b 20 79 61 2c 20 69 74 20 73 68 6f 75 6c 64  ;; ya, it should
0df0: 6e 27 74 20 68 61 76 65 20 63 68 61 6e 67 65 64  n't have changed
0e00: 0a 09 20 20 20 20 20 20 28 69 66 20 74 61 67 20  ..      (if tag 
0e10: 0a 09 09 20 20 28 73 3a 74 6f 6b 73 2d 3e 73 74  ...  (s:toks->st
0e20: 6d 6c 20 28 61 70 70 65 6e 64 20 72 65 73 20 28  ml (append res (
0e30: 6c 69 73 74 20 28 61 70 70 65 6e 64 20 28 6c 69  list (append (li
0e40: 73 74 20 28 73 3a 74 61 67 2d 3e 73 74 6d 6c 20  st (s:tag->stml 
0e50: 74 61 67 29 29 20 63 68 69 6c 64 20 28 6c 69 73  tag)) child (lis
0e60: 74 20 74 78 74 29 29 29 29 0a 09 09 09 09 6e 65  t txt)))).....ne
0e70: 77 74 61 67 20 6e 65 77 72 65 6d 32 20 61 6c 6c  wtag newrem2 all
0e80: 6f 77 65 64 29 0a 09 09 20 20 28 73 3a 74 6f 6b  owed)...  (s:tok
0e90: 73 2d 3e 73 74 6d 6c 20 28 61 70 70 65 6e 64 20  s->stml (append 
0ea0: 72 65 73 20 28 6c 69 73 74 20 74 78 74 29 20 63  res (list txt) c
0eb0: 68 69 6c 64 29 0a 09 09 09 09 6e 65 77 74 61 67  hild).....newtag
0ec0: 20 6e 65 77 72 65 6d 32 20 61 6c 6c 6f 77 65 64   newrem2 allowed
0ed0: 29 29 29 0a 09 20 20 20 20 3b 3b 20 69 74 20 6d  )))..    ;; it m
0ee0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6e  ust have been an
0ef0: 20 65 6e 64 20 74 61 67 0a 09 20 20 20 20 28 6c   end tag..    (l
0f00: 69 73 74 20 28 61 70 70 65 6e 64 20 72 65 73 20  ist (append res 
0f10: 28 6c 69 73 74 20 0a 09 09 09 20 20 20 20 20 20  (list ....      
0f20: 20 28 69 66 20 74 61 67 0a 09 09 09 09 20 20 20   (if tag.....   
0f30: 28 6c 69 73 74 20 28 73 3a 74 61 67 2d 3e 73 74  (list (s:tag->st
0f40: 6d 6c 20 74 61 67 29 20 74 78 74 29 0a 09 09 09  ml tag) txt)....
0f50: 09 20 20 20 74 78 74 29 29 29 0a 09 09 20 20 23  .   txt)))...  #
0f60: 66 0a 09 09 20 20 6e 65 77 72 65 6d 0a 09 09 20  f...  newrem... 
0f70: 20 61 6c 6c 6f 77 65 64 29 29 29 29 29 0a 0a 0a   allowed)))))...
0f80: 3b 3b 20 22 3c 22 20 22 62 22 20 22 3e 22 20 20  ;; "<" "b" ">"  
0f90: 3d 3e 20 22 3c 62 3e 22 0a 3b 3b 20 22 3c 22 0a  => "<b>".;; "<".
0fa0: 3b 3b 20 28 64 65 66 69 6e 65 20 28 73 3a 72 65  ;; (define (s:re
0fb0: 62 75 69 6c 64 2d 74 61 67 73 20 69 6e 70 75 74  build-tags input
0fc0: 2d 6c 69 73 74 29 0a 0a 3b 3b 20 28 22 62 6c 61  -list)..;; ("bla
0fd0: 68 20 62 6c 61 68 22 20 22 3c 22 20 22 62 22 20  h blah" "<" "b" 
0fe0: 22 3e 22 20 22 6d 6f 72 65 20 73 74 75 66 66 22  ">" "more stuff"
0ff0: 20 22 3c 22 20 22 69 22 20 22 3e 22 20 29 20 0a   "<" "i" ">" ) .
1000: 3b 3b 20 20 20 20 20 3d 3e 20 28 22 62 6c 61 68  ;;     => ("blah
1010: 20 62 6c 61 68 22 20 62 20 23 74 20 28 20 22 6d   blah" b #t ( "m
1020: 6f 72 65 20 73 74 75 66 66 22 20 22 3c 22 20 22  ore stuff" "<" "
1030: 69 22 20 22 3e 22 20 29 29 0a 3b 3b 20 28 22 62  i" ">" )).;; ("b
1040: 6c 61 68 20 62 6c 61 68 22 20 22 3c 22 20 22 2f  lah blah" "<" "/
1050: 62 22 20 22 3e 22 20 22 6d 6f 72 65 20 73 74 75  b" ">" "more stu
1060: 66 66 22 20 22 3c 22 20 22 69 22 20 22 3e 22 20  ff" "<" "i" ">" 
1070: 29 20 0a 3b 3b 20 20 20 20 20 3d 3e 20 28 22 62  ) .;;     => ("b
1080: 6c 61 68 20 62 6c 61 68 22 20 62 20 23 66 20 28  lah blah" b #f (
1090: 20 22 6d 6f 72 65 20 73 74 75 66 66 22 20 22 3c   "more stuff" "<
10a0: 22 20 22 69 22 20 22 3e 22 20 29 29 0a 28 64 65  " "i" ">" )).(de
10b0: 66 69 6e 65 20 28 73 3a 75 70 74 6f 2d 74 61 67  fine (s:upto-tag
10c0: 20 69 6e 6c 73 74 20 61 6c 6c 6f 77 65 64 2d 74   inlst allowed-t
10d0: 61 67 73 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c  ags).  (if (null
10e0: 3f 20 69 6e 6c 73 74 29 20 69 6e 6c 73 74 0a 20  ? inlst) inlst. 
10f0: 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28       (let loop (
1100: 28 74 6f 6b 20 20 28 63 61 72 20 69 6e 6c 73 74  (tok  (car inlst
1110: 29 29 0a 09 09 20 28 74 61 69 6c 20 28 63 64 72  ))... (tail (cdr
1120: 20 69 6e 6c 73 74 29 29 0a 09 09 20 28 70 72 65   inlst))... (pre
1130: 6c 20 22 22 29 29 20 3b 3b 20 63 72 65 61 74 65  l "")) ;; create
1140: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 61 20 6c   a string or a l
1150: 69 73 74 20 6f 66 20 73 74 72 69 6e 67 20 70 61  ist of string pa
1160: 72 74 73 3f 0a 09 28 69 66 20 28 73 74 72 69 6e  rts?..(if (strin
1170: 67 3d 3f 20 74 6f 6b 20 22 3c 22 29 20 3b 3b 20  g=? tok "<") ;; 
1180: 6d 69 67 68 74 20 68 61 76 65 20 61 20 74 61 67  might have a tag
1190: 0a 09 20 20 20 20 28 69 66 20 28 3e 20 28 6c 65  ..    (if (> (le
11a0: 6e 67 74 68 20 74 61 69 6c 29 20 31 29 20 3b 3b  ngth tail) 1) ;;
11b0: 20 74 6f 20 62 65 20 61 20 74 61 67 2c 20 6e 65   to be a tag, ne
11c0: 65 64 20 74 61 67 20 61 6e 64 20 63 6c 6f 73 69  ed tag and closi
11d0: 6e 67 20 22 3e 22 0a 09 09 28 6c 65 74 20 28 28  ng ">"...(let ((
11e0: 74 61 67 20 28 63 61 72 20 74 61 69 6c 29 29 0a  tag (car tail)).
11f0: 09 09 20 20 20 20 20 20 28 65 6e 64 20 28 63 61  ..      (end (ca
1200: 64 72 20 74 61 69 6c 29 29 0a 09 09 20 20 20 20  dr tail))...    
1210: 20 20 28 72 65 6d 20 28 63 64 64 72 20 74 61 69    (rem (cddr tai
1220: 6c 29 29 29 20 0a 09 09 20 20 28 69 66 20 28 73  l))) ...  (if (s
1230: 74 72 69 6e 67 3d 3f 20 65 6e 64 20 22 3e 22 29  tring=? end ">")
1240: 20 3b 3b 20 79 65 70 2c 20 69 74 20 69 73 20 70   ;; yep, it is p
1250: 72 6f 62 61 62 6c 79 20 61 20 74 61 67 0a 09 09  robably a tag...
1260: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 74 72        (let* ((tr
1270: 69 6d 2d 74 61 67 20 28 69 66 20 20 28 73 74 72  im-tag (if  (str
1280: 69 6e 67 3d 3f 20 22 2f 22 20 28 73 75 62 73 74  ing=? "/" (subst
1290: 72 69 6e 67 20 74 61 67 20 30 20 31 29 29 0a 09  ring tag 0 1))..
12a0: 09 09 09 09 20 20 20 20 28 73 75 62 73 74 72 69  ....    (substri
12b0: 6e 67 20 74 61 67 20 31 20 28 73 74 72 69 6e 67  ng tag 1 (string
12c0: 2d 6c 65 6e 67 74 68 20 74 61 67 29 29 20 23 66  -length tag)) #f
12d0: 29 29 0a 09 09 09 20 20 20 20 20 28 74 61 67 2d  ))....     (tag-
12e0: 73 79 6d 20 20 28 73 74 72 69 6e 67 2d 3e 73 79  sym  (string->sy
12f0: 6d 62 6f 6c 20 28 69 66 20 74 72 69 6d 2d 74 61  mbol (if trim-ta
1300: 67 20 74 72 69 6d 2d 74 61 67 20 74 61 67 29 29  g trim-tag tag))
1310: 29 29 0a 09 09 09 28 69 66 20 28 6d 65 6d 62 65  ))....(if (membe
1320: 72 20 74 61 67 2d 73 79 6d 20 61 6c 6c 6f 77 65  r tag-sym allowe
1330: 64 2d 74 61 67 73 29 0a 09 09 09 20 20 20 20 3b  d-tags)....    ;
1340: 3b 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 74  ; have a valid t
1350: 61 67 2c 20 72 65 62 75 69 6c 64 20 69 74 20 61  ag, rebuild it a
1360: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
1370: 73 75 6c 74 0a 09 09 09 20 20 20 20 28 6c 69 73  sult....    (lis
1380: 74 20 70 72 65 6c 20 74 61 67 2d 73 79 6d 20 28  t prel tag-sym (
1390: 69 66 20 74 72 69 6d 2d 74 61 67 20 23 66 20 23  if trim-tag #f #
13a0: 74 29 20 72 65 6d 29 0a 09 09 09 20 20 20 20 3b  t) rem)....    ;
13b0: 3b 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 74 61  ; not a valid ta
13c0: 67 2c 20 63 6f 6e 76 65 72 74 20 22 3c 22 20 61  g, convert "<" a
13d0: 6e 64 20 22 3e 22 20 61 6e 64 20 61 64 64 20 61  nd ">" and add a
13e0: 6c 6c 20 74 6f 20 70 72 65 6c 0a 09 09 09 20 20  ll to prel....  
13f0: 20 20 28 6c 65 74 20 28 28 6e 65 77 70 72 65 6c    (let ((newprel
1400: 20 28 73 74 72 69 6e 67 2d 61 70 70 65 6e 64 20   (string-append 
1410: 70 72 65 6c 20 22 26 6c 74 3b 22 20 74 61 67 20  prel "&lt;" tag 
1420: 22 26 67 74 3b 22 29 29 29 0a 09 09 09 20 20 20  "&gt;")))....   
1430: 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 72 65     (if (null? re
1440: 6d 29 28 6c 69 73 74 20 6e 65 77 70 72 65 6c 20  m)(list newprel 
1450: 23 66 20 23 66 20 27 28 29 29 20 3b 3b 20 72 65  #f #f '()) ;; re
1460: 74 75 72 6e 20 6e 65 77 70 72 65 6c 20 2d 20 61  turn newprel - a
1470: 64 64 20 23 66 20 23 66 20 3f 3f 3f 0a 09 09 09  dd #f #f ???....
1480: 09 20 20 28 6c 6f 6f 70 20 28 63 61 72 20 72 65  .  (loop (car re
1490: 6d 29 28 63 64 72 20 72 65 6d 29 20 6e 65 77 70  m)(cdr rem) newp
14a0: 72 65 6c 29 29 29 29 29 0a 09 09 20 20 20 20 20  rel)))))...     
14b0: 20 3b 3b 20 73 6f 2c 20 69 74 20 77 61 73 6e 27   ;; so, it wasn'
14c0: 74 20 61 20 74 61 67 0a 09 09 20 20 20 20 20 20  t a tag...      
14d0: 28 6c 65 74 20 28 28 6e 65 77 70 72 65 6c 20 28  (let ((newprel (
14e0: 73 74 72 69 6e 67 2d 61 70 70 65 6e 64 20 70 72  string-append pr
14f0: 65 6c 20 22 26 6c 74 3b 22 20 74 61 67 29 29 29  el "&lt;" tag)))
1500: 0a 09 09 09 28 69 66 20 28 6e 75 6c 6c 3f 20 74  ....(if (null? t
1510: 61 69 6c 29 0a 09 09 09 20 20 20 20 28 6c 69 73  ail)....    (lis
1520: 74 20 6e 65 77 70 72 65 6c 20 23 66 20 23 66 20  t newprel #f #f 
1530: 27 28 29 29 0a 09 09 09 20 20 20 20 28 6c 6f 6f  '())....    (loo
1540: 70 20 28 63 61 72 20 72 65 6d 29 28 63 64 72 20  p (car rem)(cdr 
1550: 72 65 6d 29 20 6e 65 77 70 72 65 6c 29 29 29 29  rem) newprel))))
1560: 29 0a 09 09 3b 3b 20 74 6f 6f 20 73 68 6f 72 74  )...;; too short
1570: 20 74 6f 20 62 65 20 61 20 74 61 67 0a 09 09 28   to be a tag...(
1580: 6c 69 73 74 20 28 61 70 70 6c 79 20 73 74 72 69  list (apply stri
1590: 6e 67 2d 61 70 70 65 6e 64 20 70 72 65 6c 20 22  ng-append prel "
15a0: 26 6c 74 3b 22 20 74 61 69 6c 29 20 23 66 20 23  &lt;" tail) #f #
15b0: 66 20 27 28 29 29 29 0a 09 20 20 20 20 28 69 66  f '()))..    (if
15c0: 20 28 6e 75 6c 6c 3f 20 74 61 69 6c 29 20 0a 09   (null? tail) ..
15d0: 09 3b 3b 20 77 65 27 72 65 20 64 6f 6e 65 0a 09  .;; we're done..
15e0: 09 28 6c 69 73 74 20 28 73 74 72 69 6e 67 2d 61  .(list (string-a
15f0: 70 70 65 6e 64 20 70 72 65 6c 20 74 6f 6b 29 20  ppend prel tok) 
1600: 23 66 20 23 66 20 27 28 29 29 0a 09 09 28 6c 6f  #f #f '())...(lo
1610: 6f 70 20 28 63 61 72 20 74 61 69 6c 29 28 63 64  op (car tail)(cd
1620: 72 20 74 61 69 6c 29 28 73 74 72 69 6e 67 2d 61  r tail)(string-a
1630: 70 70 65 6e 64 20 70 72 65 6c 20 74 6f 6b 29 29  ppend prel tok))
1640: 29 29 29 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20  )))))...(define 
1650: 28 73 3a 64 69 76 79 2d 75 70 2d 63 67 69 2d 73  (s:divy-up-cgi-s
1660: 74 72 20 69 6e 73 74 72 29 0a 20 20 28 6d 61 70  tr instr).  (map
1670: 20 28 6c 61 6d 62 64 61 20 28 78 29 20 28 73 74   (lambda (x) (st
1680: 72 69 6e 67 2d 73 70 6c 69 74 20 78 20 22 3d 22  ring-split x "="
1690: 29 29 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74  )) (string-split
16a0: 20 69 6e 73 74 72 20 22 26 22 29 29 29 0a 0a 28   instr "&")))..(
16b0: 64 65 66 69 6e 65 20 28 73 3a 64 65 63 6f 64 65  define (s:decode
16c0: 2d 73 74 72 20 69 6e 73 74 72 29 0a 20 20 28 6c  -str instr).  (l
16d0: 65 74 2a 20 28 28 61 62 63 20 28 73 74 72 69 6e  et* ((abc (strin
16e0: 67 2d 73 75 62 73 74 69 74 75 74 65 20 22 5c 5c  g-substitute "\\
16f0: 2b 22 20 22 20 22 20 69 6e 73 74 72 20 23 74 29  +" " " instr #t)
1700: 29 0a 09 20 28 74 6f 6b 73 20 28 73 3a 73 70 6c  ).. (toks (s:spl
1710: 69 74 2d 73 74 72 69 6e 67 20 61 62 63 20 22 25  it-string abc "%
1720: 22 29 29 29 0a 20 20 20 20 28 69 66 20 28 3c 20  "))).    (if (< 
1730: 28 6c 65 6e 67 74 68 20 74 6f 6b 73 29 20 32 29  (length toks) 2)
1740: 20 61 62 63 0a 09 28 6c 65 74 20 6c 6f 6f 70 20   abc..(let loop 
1750: 28 28 68 65 61 64 20 28 63 61 64 72 20 74 6f 6b  ((head (cadr tok
1760: 73 29 29 0a 09 09 20 20 20 28 74 61 69 6c 20 28  s))...   (tail (
1770: 63 64 64 72 20 74 6f 6b 73 29 29 0a 09 09 20 20  cddr toks))...  
1780: 20 28 72 65 73 75 6c 74 20 28 63 61 72 20 74 6f   (result (car to
1790: 6b 73 29 29 29 0a 09 20 20 28 69 66 20 28 73 74  ks)))..  (if (st
17a0: 72 69 6e 67 3d 3f 20 68 65 61 64 20 22 22 29 0a  ring=? head "").
17b0: 09 20 20 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  .      (if (null
17c0: 3f 20 74 61 69 6c 29 0a 09 09 20 20 72 65 73 75  ? tail)...  resu
17d0: 6c 74 0a 09 09 20 20 28 6c 6f 6f 70 20 28 63 61  lt...  (loop (ca
17e0: 72 20 74 61 69 6c 29 28 63 64 72 20 74 61 69 6c  r tail)(cdr tail
17f0: 29 20 72 65 73 75 6c 74 29 29 0a 09 20 20 20 20  ) result))..    
1800: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 20 28 73    (let* ((key (s
1810: 75 62 73 74 72 69 6e 67 20 68 65 61 64 20 30 20  ubstring head 0 
1820: 32 29 29 0a 09 09 20 20 20 20 20 28 72 65 6d 20  2))...     (rem 
1830: 28 73 75 62 73 74 72 69 6e 67 20 68 65 61 64 20  (substring head 
1840: 32 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68  2 (string-length
1850: 20 68 65 61 64 29 29 29 0a 09 09 20 20 20 20 20   head)))...     
1860: 28 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75  (num (string->nu
1870: 6d 62 65 72 20 6b 65 79 20 31 36 29 29 0a 09 09  mber key 16))...
1880: 20 20 20 20 20 28 63 68 20 20 28 69 66 20 28 61       (ch  (if (a
1890: 6e 64 20 28 6e 75 6d 62 65 72 3f 20 6e 75 6d 29  nd (number? num)
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 28 65 78 61 63 74 3f 20 6e 75 6d 29      (exact? num)
18d0: 29 0a 09 09 09 20 20 20 20 20 20 28 69 6e 74 65  )....      (inte
18e0: 67 65 72 2d 3e 63 68 61 72 20 6e 75 6d 29 0a 09  ger->char num)..
18f0: 09 09 20 20 20 20 20 20 23 66 29 29 20 3b 3b 20  ..      #f)) ;; 
1900: 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1910: 2e 20 49 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  . I will probabl
1920: 79 20 72 65 67 72 65 74 20 74 68 69 73 20 73 6f  y regret this so
1930: 6d 65 20 64 61 79 0a 09 09 20 20 20 20 20 28 63  me day...     (c
1940: 68 73 74 72 20 20 28 69 66 20 63 68 20 28 6d 61  hstr  (if ch (ma
1950: 6b 65 2d 73 74 72 69 6e 67 20 31 20 63 68 29 20  ke-string 1 ch) 
1960: 22 22 29 29 0a 09 09 20 20 20 20 20 28 6e 65 77  ""))...     (new
1970: 72 65 73 20 28 69 66 20 63 68 0a 09 09 09 09 20  res (if ch..... 
1980: 28 73 74 72 69 6e 67 2d 61 70 70 65 6e 64 20 72  (string-append r
1990: 65 73 75 6c 74 20 63 68 73 74 72 20 72 65 6d 29  esult chstr rem)
19a0: 0a 09 09 09 09 20 28 73 74 72 69 6e 67 2d 61 70  ..... (string-ap
19b0: 70 65 6e 64 20 72 65 73 75 6c 74 20 68 65 61 64  pend result head
19c0: 29 29 29 29 0a 09 09 3b 3b 20 28 70 72 69 6e 74  ))))...;; (print
19d0: 20 22 68 65 61 64 3a 20 22 20 68 65 61 64 20 22   "head: " head "
19e0: 20 6e 75 6d 3a 20 22 20 6e 75 6d 20 22 20 63 68   num: " num " ch
19f0: 3a 20 7c 22 20 63 68 20 22 7c 20 63 68 73 74 72  : |" ch "| chstr
1a00: 3a 20 22 20 63 68 73 74 72 29 0a 09 09 28 69 66  : " chstr)...(if
1a10: 20 28 6e 75 6c 6c 3f 20 74 61 69 6c 29 0a 09 09   (null? tail)...
1a20: 20 20 20 20 6e 65 77 72 65 73 0a 09 09 20 20 20      newres...   
1a30: 20 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 69 6c   (loop (car tail
1a40: 29 28 63 64 72 20 74 61 69 6c 29 20 6e 65 77 72  )(cdr tail) newr
1a50: 65 73 29 29 29 29 29 29 29 29 0a 0a 3b 3b 20 70  es))))))))..;; p
1a60: 72 6f 62 61 62 6c 79 20 61 20 62 75 67 3a 0a 3b  robably a bug:.;
1a70: 3b 0a 3b 3b 20 28 73 3a 70 72 6f 63 65 73 73 2d  ;.;; (s:process-
1a80: 63 67 69 2d 69 6e 70 75 74 20 22 3d 62 61 72 22  cgi-input "=bar"
1a90: 29 0a 3b 3b 20 3d 3e 20 28 28 62 61 72 20 22 22  ).;; => ((bar ""
1aa0: 29 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 73  )).;;.(define (s
1ab0: 3a 70 72 6f 63 65 73 73 2d 63 67 69 2d 69 6e 70  :process-cgi-inp
1ac0: 75 74 20 69 6e 73 74 72 29 0a 20 20 28 6d 61 70  ut instr).  (map
1ad0: 20 28 6c 61 6d 62 64 61 20 28 78 79 29 0a 20 20   (lambda (xy).  
1ae0: 20 20 20 20 20 20 20 28 6c 69 73 74 20 28 73 74         (list (st
1af0: 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 73 3a  ring->symbol (s:
1b00: 64 65 63 6f 64 65 2d 73 74 72 20 28 63 61 72 20  decode-str (car 
1b10: 78 79 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  xy))).          
1b20: 20 20 20 20 20 28 69 66 20 28 65 71 3f 20 28 6c       (if (eq? (l
1b30: 65 6e 67 74 68 20 78 79 29 20 31 29 20 0a 20 20  ength xy) 1) .  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20   "".            
1b60: 20 20 20 20 20 20 20 28 73 3a 64 65 63 6f 64 65         (s:decode
1b70: 2d 73 74 72 20 28 63 61 64 72 20 78 79 29 29 29  -str (cadr xy)))
1b80: 29 29 0a 20 20 20 20 20 20 20 20 20 28 73 3a 64  )).         (s:d
1b90: 69 76 79 2d 75 70 2d 63 67 69 2d 73 74 72 20 69  ivy-up-cgi-str i
1ba0: 6e 73 74 72 29 29 29 0a 0a 3b 3b 20 66 6f 72 20  nstr)))..;; for 
1bb0: 74 65 73 74 69 6e 67 20 2d 2d 20 64 65 6c 65 74  testing -- delet
1bc0: 6d 65 0a 3b 3b 20 28 64 65 66 69 6e 65 20 62 6c  me.;; (define bl
1bd0: 61 68 20 22 70 6f 73 74 5f 74 69 74 6c 65 3d 25  ah "post_title=%
1be0: 32 42 25 32 42 25 32 42 25 32 42 25 32 42 25 32  2B%2B%2B%2B%2B%2
1bf0: 42 25 32 42 25 32 42 25 32 42 25 32 42 25 32 42  B%2B%2B%2B%2B%2B
1c00: 68 65 6c 6c 6f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  hello-----------
1c10: 2d 2d 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 25 32 36  --+++++++++++%26
1c20: 25 32 36 25 32 36 25 32 36 25 32 36 25 32 36 25  %26%26%26%26%26%
1c30: 32 36 25 32 36 25 32 36 25 34 30 25 34 30 25 34  26%26%26%40%40%4
1c40: 30 25 34 30 25 34 30 25 34 30 25 34 30 25 34 30  0%40%40%40%40%40
1c50: 25 34 30 26 70 6f 73 74 5f 62 6f 64 79 3d 25 32  %40&post_body=%2
1c60: 42 25 32 42 25 32 42 25 32 42 25 32 42 25 32 42  B%2B%2B%2B%2B%2B
1c70: 25 32 42 25 32 42 25 32 42 25 32 42 25 32 42 68  %2B%2B%2B%2B%2Bh
1c80: 65 6c 6c 6f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ello------------
1c90: 2d 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 25 32 36 25  -+++++++++++%26%
1ca0: 32 36 25 32 36 25 32 36 25 32 36 25 32 36 25 32  26%26%26%26%26%2
1cb0: 36 25 32 36 25 32 36 25 34 30 25 34 30 25 34 30  6%26%26%40%40%40
1cc0: 25 34 30 25 34 30 25 34 30 25 34 30 25 34 30 25  %40%40%40%40%40%
1cd0: 34 30 25 30 44 25 30 41 25 30 44 25 30 41 25 32  40%0D%0A%0D%0A%2
1ce0: 42 25 32 42 25 32 42 25 32 42 25 32 42 25 32 42  B%2B%2B%2B%2B%2B
1cf0: 25 32 42 25 32 42 25 32 42 25 32 42 25 32 42 68  %2B%2B%2B%2B%2Bh
1d00: 65 6c 6c 6f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ello------------
1d10: 2d 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 25 32 36 25  -+++++++++++%26%
1d20: 32 36 25 32 36 25 32 36 25 32 36 25 32 36 25 32  26%26%26%26%26%2
1d30: 36 25 32 36 25 32 36 25 34 30 25 34 30 25 34 30  6%26%26%40%40%40
1d40: 25 34 30 25 34 30 25 34 30 25 34 30 25 34 30 25  %40%40%40%40%40%
1d50: 34 30 25 30 44 25 30 41 25 30 44 25 30 41 25 30  40%0D%0A%0D%0A%0
1d60: 44 25 30 41 25 32 42 25 32 42 25 32 42 25 32 42  D%0A%2B%2B%2B%2B
1d70: 25 32 42 25 32 42 25 32 42 25 32 42 25 32 42 25  %2B%2B%2B%2B%2B%
1d80: 32 42 25 32 42 68 65 6c 6c 6f 2d 2d 2d 2d 2d 2d  2B%2Bhello------
1d90: 2d 2d 2d 2d 2d 2d 2d 2b 2b 2b 2b 2b 2b 2b 2b 2b  -------+++++++++
1da0: 2b 2b 25 32 36 25 32 36 25 32 36 25 32 36 25 32  ++%26%26%26%26%2
1db0: 36 25 32 36 25 32 36 25 32 36 25 32 36 25 34 30  6%26%26%26%26%40
1dc0: 25 34 30 25 34 30 25 34 30 25 34 30 25 34 30 25  %40%40%40%40%40%
1dd0: 34 30 25 34 30 25 34 30 26 6e 65 77 5f 70 6f 73  40%40%40&new_pos
1de0: 74 3d 53 75 62 6d 69 74 22 29 0a 3b 3b 20 28 64  t=Submit").;; (d
1df0: 65 66 69 6e 65 20 62 6c 61 68 32 20 22 70 6f 73  efine blah2 "pos
1e00: 74 5f 74 69 74 6c 65 3d 35 25 32 35 26 70 6f 73  t_title=5%25&pos
1e10: 74 5f 62 6f 64 79 3d 61 6e 64 2b 31 30 25 32 35  t_body=and+10%25
1e20: 26 6e 65 77 5f 70 6f 73 74 3d 53 75 62 6d 69 74  &new_post=Submit
1e30: 22 29 0a 29 0a                                   ").).