◊(Local Yarn Code "Hex Artifact Content")

Artifact f45f757058b686bdf8fd3b810f41205cb3d608fd970a6e5c947c4071f1bfd324:


0000: 23 6c 61 6e 67 20 72 61 63 6b 65 74 2f 62 61 73  #lang racket/bas
0010: 65 0a 0a 3b 20 53 50 44 58 2d 4c 69 63 65 6e 73  e..; SPDX-Licens
0020: 65 2d 49 64 65 6e 74 69 66 69 65 72 3a 20 42 6c  e-Identifier: Bl
0030: 75 65 4f 61 6b 2d 31 2e 30 2e 30 0a 3b 20 54 68  ueOak-1.0.0.; Th
0040: 69 73 20 66 69 6c 65 20 69 73 20 6c 69 63 65 6e  is file is licen
0050: 73 65 64 20 75 6e 64 65 72 20 74 68 65 20 42 6c  sed under the Bl
0060: 75 65 20 4f 61 6b 20 4d 6f 64 65 6c 20 4c 69 63  ue Oak Model Lic
0070: 65 6e 73 65 20 31 2e 30 2e 30 2e 0a 0a 28 72 65  ense 1.0.0...(re
0080: 71 75 69 72 65 20 64 65 74 61 20 64 62 2f 62 61  quire deta db/ba
0090: 73 65 20 64 62 2f 73 71 6c 69 74 65 33 20 74 68  se db/sqlite3 th
00a0: 72 65 61 64 69 6e 67 20 74 78 65 78 70 72 20 67  reading txexpr g
00b0: 72 65 67 6f 72 29 0a 0a 28 72 65 71 75 69 72 65  regor)..(require
00c0: 20 72 61 63 6b 65 74 2f 6d 61 74 63 68 0a 20 20   racket/match.  
00d0: 20 20 20 20 20 20 20 72 61 63 6b 65 74 2f 73 74         racket/st
00e0: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 20 70 6f  ring.         po
00f0: 6c 6c 65 6e 2f 70 61 67 65 74 72 65 65 0a 20 20  llen/pagetree.  
0100: 20 20 20 20 20 20 20 70 6f 6c 6c 65 6e 2f 74 65         pollen/te
0110: 6d 70 6c 61 74 65 0a 20 20 20 20 20 20 20 20 20  mplate.         
0120: 28 65 78 63 65 70 74 2d 69 6e 20 70 6f 6c 6c 65  (except-in polle
0130: 6e 2f 63 6f 72 65 20 73 65 6c 65 63 74 29 20 3b  n/core select) ;
0140: 20 61 76 6f 69 64 20 63 6f 6e 66 6c 69 63 74 20   avoid conflict 
0150: 77 69 74 68 20 64 65 74 61 0a 20 20 20 20 20 20  with deta.      
0160: 20 20 20 70 6f 6c 6c 65 6e 2f 73 65 74 75 70 29     pollen/setup)
0170: 0a 0a 28 72 65 71 75 69 72 65 20 22 64 75 73 74  ..(require "dust
0180: 2e 72 6b 74 22 20 22 73 6e 69 70 70 65 74 73 2d  .rkt" "snippets-
0190: 68 74 6d 6c 2e 72 6b 74 22 29 0a 0a 28 70 72 6f  html.rkt")..(pro
01a0: 76 69 64 65 20 69 6e 69 74 2d 63 61 63 68 65 2d  vide init-cache-
01b0: 64 62 21 0a 20 20 20 20 20 20 20 20 20 63 61 63  db!.         cac
01c0: 68 65 2d 63 6f 6e 6e 20 20 20 20 20 20 20 20 20  he-conn         
01d0: 20 20 20 3b 20 54 68 65 20 6d 6f 73 74 20 65 6c     ; The most el
01e0: 69 67 69 62 6c 65 20 62 61 63 68 65 6c 6f 72 20  igible bachelor 
01f0: 69 6e 20 4e 65 6f 20 59 6f 6b 79 6f 0a 20 20 20  in Neo Yokyo.   
0200: 20 20 20 20 20 20 70 61 72 73 65 2d 61 6e 64 2d        parse-and-
0210: 63 61 63 68 65 2d 61 72 74 69 63 6c 65 21 0a 20  cache-article!. 
0220: 20 20 20 20 20 20 20 20 63 61 63 68 65 2d 73 65          cache-se
0230: 72 69 65 73 21 0a 20 20 20 20 20 20 20 20 20 63  ries!.         c
0240: 75 72 72 65 6e 74 2d 70 6c 61 69 6e 2d 74 69 74  urrent-plain-tit
0250: 6c 65 0a 20 20 20 20 20 20 20 20 20 28 73 63 68  le.         (sch
0260: 65 6d 61 2d 6f 75 74 20 63 61 63 68 65 3a 61 72  ema-out cache:ar
0270: 74 69 63 6c 65 29 0a 20 20 20 20 20 20 20 20 20  ticle).         
0280: 28 73 63 68 65 6d 61 2d 6f 75 74 20 63 61 63 68  (schema-out cach
0290: 65 3a 6e 6f 74 65 29 0a 20 20 20 20 20 20 20 20  e:note).        
02a0: 20 28 73 63 68 65 6d 61 2d 6f 75 74 20 63 61 63   (schema-out cac
02b0: 68 65 3a 73 65 72 69 65 73 29 0a 20 20 20 20 20  he:series).     
02c0: 20 20 20 20 28 73 63 68 65 6d 61 2d 6f 75 74 20      (schema-out 
02d0: 63 61 63 68 65 3a 69 6e 64 65 78 2d 65 6e 74 72  cache:index-entr
02e0: 79 29 0a 20 20 20 20 20 20 20 20 20 61 72 74 69  y).         arti
02f0: 63 6c 65 73 0a 20 20 20 20 20 20 20 20 20 61 72  cles.         ar
0300: 74 69 63 6c 65 73 2b 6e 6f 74 65 73 0a 20 20 20  ticles+notes.   
0310: 20 20 20 20 20 20 6c 69 73 74 69 6e 67 2d 68 74        listing-ht
0320: 6d 6c 73 0a 20 20 20 20 20 20 20 20 20 3c 6c 69  mls.         <li
0330: 73 74 69 6e 67 2d 66 75 6c 6c 3e 0a 20 20 20 20  sting-full>.    
0340: 20 20 20 20 20 3c 6c 69 73 74 69 6e 67 2d 65 78       <listing-ex
0350: 63 65 72 70 74 3e 0a 20 20 20 20 20 20 20 20 20  cerpt>.         
0360: 3c 6c 69 73 74 69 6e 67 2d 73 68 6f 72 74 3e 0a  <listing-short>.
0370: 20 20 20 20 20 20 20 20 20 75 6e 66 65 6e 63 65           unfence
0380: 29 0a 0a 3b 3b 20 43 61 63 68 65 20 44 42 20 61  )..;; Cache DB a
0390: 6e 64 20 53 63 68 65 6d 61 73 0a 0a 28 64 65 66  nd Schemas..(def
03a0: 69 6e 65 20 44 42 46 49 4c 45 20 28 62 75 69 6c  ine DBFILE (buil
03b0: 64 2d 70 61 74 68 20 28 63 75 72 72 65 6e 74 2d  d-path (current-
03c0: 70 72 6f 6a 65 63 74 2d 72 6f 6f 74 29 20 22 76  project-root) "v
03d0: 69 74 72 65 6f 75 73 2e 73 71 6c 69 74 65 22 29  itreous.sqlite")
03e0: 29 0a 28 64 65 66 69 6e 65 20 63 61 63 68 65 2d  ).(define cache-
03f0: 63 6f 6e 6e 20 28 73 71 6c 69 74 65 33 2d 63 6f  conn (sqlite3-co
0400: 6e 6e 65 63 74 20 23 3a 64 61 74 61 62 61 73 65  nnect #:database
0410: 20 44 42 46 49 4c 45 20 23 3a 6d 6f 64 65 20 27   DBFILE #:mode '
0420: 63 72 65 61 74 65 29 29 0a 0a 28 64 65 66 69 6e  create))..(defin
0430: 65 20 63 75 72 72 65 6e 74 2d 70 6c 61 69 6e 2d  e current-plain-
0440: 74 69 74 6c 65 20 28 6d 61 6b 65 2d 70 61 72 61  title (make-para
0450: 6d 65 74 65 72 20 22 76 6f 69 64 22 29 29 0a 0a  meter "void"))..
0460: 28 64 65 66 69 6e 65 2d 73 63 68 65 6d 61 20 63  (define-schema c
0470: 61 63 68 65 3a 61 72 74 69 63 6c 65 20 23 3a 74  ache:article #:t
0480: 61 62 6c 65 20 22 61 72 74 69 63 6c 65 73 22 0a  able "articles".
0490: 20 20 28 5b 69 64 20 20 20 20 20 20 20 20 20 20    ([id          
04a0: 20 20 20 20 20 20 20 20 20 69 64 2f 66 20 23 3a           id/f #:
04b0: 70 72 69 6d 61 72 79 2d 6b 65 79 20 23 3a 61 75  primary-key #:au
04c0: 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 5d 0a 20 20  to-increment].  
04d0: 20 5b 70 61 67 65 20 20 20 20 20 20 20 20 20 20   [page          
04e0: 20 20 20 20 20 20 20 73 79 6d 62 6f 6c 2f 66 5d         symbol/f]
04f0: 0a 20 20 20 5b 74 69 74 6c 65 2d 70 6c 61 69 6e  .   [title-plain
0500: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
0510: 2f 66 5d 0a 20 20 20 5b 74 69 74 6c 65 2d 68 74  /f].   [title-ht
0520: 6d 6c 2d 66 6c 6f 77 20 20 20 20 20 20 73 74 72  ml-flow      str
0530: 69 6e 67 2f 66 5d 0a 20 20 20 5b 74 69 74 6c 65  ing/f].   [title
0540: 2d 73 70 65 63 69 66 69 65 64 3f 20 20 20 20 20  -specified?     
0550: 62 6f 6f 6c 65 61 6e 2f 66 5d 0a 20 20 20 5b 70  boolean/f].   [p
0560: 75 62 6c 69 73 68 65 64 20 20 20 20 20 20 20 20  ublished        
0570: 20 20 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20 20      string/f].  
0580: 20 5b 75 70 64 61 74 65 64 20 20 20 20 20 20 20   [updated       
0590: 20 20 20 20 20 20 20 73 74 72 69 6e 67 2f 66 5d         string/f]
05a0: 0a 20 20 20 5b 61 75 74 68 6f 72 20 20 20 20 20  .   [author     
05b0: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
05c0: 2f 66 5d 0a 20 20 20 5b 63 6f 6e 63 65 61 6c 20  /f].   [conceal 
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
05e0: 69 6e 67 2f 66 5d 0a 20 20 20 5b 73 65 72 69 65  ing/f].   [serie
05f0: 73 2d 70 61 67 65 20 20 20 20 20 20 20 20 20 20  s-page          
0600: 73 79 6d 62 6f 6c 2f 66 5d 0a 20 20 20 5b 6e 6f  symbol/f].   [no
0610: 75 6e 2d 73 69 6e 67 75 6c 61 72 20 20 20 20 20  un-singular     
0620: 20 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20 20 20     string/f].   
0630: 5b 6e 6f 74 65 2d 63 6f 75 6e 74 20 20 20 20 20  [note-count     
0640: 20 20 20 20 20 20 69 6e 74 65 67 65 72 2f 66 5d        integer/f]
0650: 0a 20 20 20 5b 64 6f 63 2d 68 74 6d 6c 20 20 20  .   [doc-html   
0660: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
0670: 2f 66 5d 0a 20 20 20 5b 64 69 73 70 6f 73 69 74  /f].   [disposit
0680: 69 6f 6e 20 20 20 20 20 20 20 20 20 20 73 74 72  ion          str
0690: 69 6e 67 2f 66 5d 0a 20 20 20 5b 64 69 73 70 2d  ing/f].   [disp-
06a0: 68 74 6d 6c 2d 61 6e 63 68 6f 72 20 20 20 20 20  html-anchor     
06b0: 73 74 72 69 6e 67 2f 66 5d 0a 20 20 20 5b 6c 69  string/f].   [li
06c0: 73 74 69 6e 67 2d 66 75 6c 6c 2d 68 74 6d 6c 20  sting-full-html 
06d0: 20 20 20 73 74 72 69 6e 67 2f 66 5d 20 20 20 3b     string/f]   ;
06e0: 20 66 75 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 75   full content bu
06f0: 74 20 77 69 74 68 6f 75 74 20 6e 6f 74 65 73 0a  t without notes.
0700: 20 20 20 5b 6c 69 73 74 69 6e 67 2d 65 78 63 65     [listing-exce
0710: 72 70 74 2d 68 74 6d 6c 20 73 74 72 69 6e 67 2f  rpt-html string/
0720: 66 5d 20 20 20 3b 20 4e 6f 74 20 75 73 65 64 20  f]   ; Not used 
0730: 66 6f 72 20 6e 6f 77 0a 20 20 20 5b 6c 69 73 74  for now.   [list
0740: 69 6e 67 2d 73 68 6f 72 74 2d 68 74 6d 6c 20 20  ing-short-html  
0750: 20 73 74 72 69 6e 67 2f 66 5d 29 29 20 3b 20 44   string/f])) ; D
0760: 61 74 65 20 61 6e 64 20 74 69 74 6c 65 20 6f 6e  ate and title on
0770: 6c 79 0a 0a 28 64 65 66 69 6e 65 2d 73 63 68 65  ly..(define-sche
0780: 6d 61 20 63 61 63 68 65 3a 6e 6f 74 65 20 23 3a  ma cache:note #:
0790: 74 61 62 6c 65 20 22 6e 6f 74 65 73 22 0a 20 20  table "notes".  
07a0: 28 5b 69 64 20 20 20 20 20 20 20 20 20 20 20 20  ([id            
07b0: 20 20 20 20 20 20 20 69 64 2f 66 20 23 3a 70 72         id/f #:pr
07c0: 69 6d 61 72 79 2d 6b 65 79 20 23 3a 61 75 74 6f  imary-key #:auto
07d0: 2d 69 6e 63 72 65 6d 65 6e 74 5d 0a 20 20 20 5b  -increment].   [
07e0: 70 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  page            
07f0: 20 20 20 20 20 73 79 6d 62 6f 6c 2f 66 5d 0a 20       symbol/f]. 
0800: 20 20 5b 68 74 6d 6c 2d 61 6e 63 68 6f 72 20 20    [html-anchor  
0810: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 2f 66          string/f
0820: 5d 0a 20 20 20 5b 74 69 74 6c 65 2d 68 74 6d 6c  ].   [title-html
0830: 2d 66 6c 6f 77 20 20 20 20 20 20 73 74 72 69 6e  -flow      strin
0840: 67 2f 66 5d 20 3b 20 4e 6f 20 62 6c 6f 63 6b 2d  g/f] ; No block-
0850: 6c 65 76 65 6c 20 48 54 4d 4c 20 65 6c 65 6d 65  level HTML eleme
0860: 6e 74 73 0a 20 20 20 5b 74 69 74 6c 65 2d 70 6c  nts.   [title-pl
0870: 61 69 6e 20 20 20 20 20 20 20 20 20 20 73 74 72  ain          str
0880: 69 6e 67 2f 66 5d 0a 20 20 20 5b 61 75 74 68 6f  ing/f].   [autho
0890: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
08a0: 73 74 72 69 6e 67 2f 66 5d 0a 20 20 20 5b 61 75  string/f].   [au
08b0: 74 68 6f 72 2d 75 72 6c 20 20 20 20 20 20 20 20  thor-url        
08c0: 20 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20 20 20     string/f].   
08d0: 5b 70 75 62 6c 69 73 68 65 64 20 20 20 20 20 20  [published      
08e0: 20 20 20 20 20 20 73 74 72 69 6e 67 2f 66 5d 0a        string/f].
08f0: 20 20 20 5b 64 69 73 70 6f 73 69 74 69 6f 6e 20     [disposition 
0900: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 2f           string/
0910: 66 5d 0a 20 20 20 5b 63 6f 6e 74 65 6e 74 2d 68  f].   [content-h
0920: 74 6d 6c 20 20 20 20 20 20 20 20 20 73 74 72 69  tml         stri
0930: 6e 67 2f 66 5d 0a 20 20 20 5b 73 65 72 69 65 73  ng/f].   [series
0940: 2d 70 61 67 65 20 20 20 20 20 20 20 20 20 20 73  -page          s
0950: 79 6d 62 6f 6c 2f 66 5d 0a 20 20 20 5b 63 6f 6e  ymbol/f].   [con
0960: 63 65 61 6c 20 20 20 20 20 20 20 20 20 20 20 20  ceal            
0970: 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20 20 20 5b    string/f].   [
0980: 6c 69 73 74 69 6e 67 2d 66 75 6c 6c 2d 68 74 6d  listing-full-htm
0990: 6c 20 20 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20  l    string/f]. 
09a0: 20 20 5b 6c 69 73 74 69 6e 67 2d 65 78 63 65 72    [listing-excer
09b0: 70 74 2d 68 74 6d 6c 20 73 74 72 69 6e 67 2f 66  pt-html string/f
09c0: 5d 20 20 20 3b 20 4e 6f 74 20 75 73 65 64 20 66  ]   ; Not used f
09d0: 6f 72 20 6e 6f 77 0a 20 20 20 5b 6c 69 73 74 69  or now.   [listi
09e0: 6e 67 2d 73 68 6f 72 74 2d 68 74 6d 6c 20 20 20  ng-short-html   
09f0: 73 74 72 69 6e 67 2f 66 5d 29 29 20 3b 20 44 61  string/f])) ; Da
0a00: 74 65 20 61 6e 64 20 74 69 74 6c 65 20 6f 6e 6c  te and title onl
0a10: 79 0a 0a 28 64 65 66 69 6e 65 2d 73 63 68 65 6d  y..(define-schem
0a20: 61 20 63 61 63 68 65 3a 73 65 72 69 65 73 20 23  a cache:series #
0a30: 3a 74 61 62 6c 65 20 22 73 65 72 69 65 73 22 0a  :table "series".
0a40: 20 20 28 5b 69 64 20 20 20 20 20 20 20 20 20 20    ([id          
0a50: 20 20 69 64 2f 66 20 23 3a 70 72 69 6d 61 72 79    id/f #:primary
0a60: 2d 6b 65 79 20 23 3a 61 75 74 6f 2d 69 6e 63 72  -key #:auto-incr
0a70: 65 6d 65 6e 74 5d 0a 20 20 20 5b 70 61 67 65 20  ement].   [page 
0a80: 20 20 20 20 20 20 20 20 20 73 79 6d 62 6f 6c 2f           symbol/
0a90: 66 5d 0a 20 20 20 5b 74 69 74 6c 65 20 20 20 20  f].   [title    
0aa0: 20 20 20 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20       string/f]. 
0ab0: 20 20 5b 70 75 62 6c 69 73 68 65 64 20 20 20 20    [published    
0ac0: 20 73 74 72 69 6e 67 2f 66 5d 0a 20 20 20 5b 6e   string/f].   [n
0ad0: 6f 75 6e 2d 70 6c 75 72 61 6c 20 20 20 73 74 72  oun-plural   str
0ae0: 69 6e 67 2f 66 5d 0a 20 20 20 5b 6e 6f 75 6e 2d  ing/f].   [noun-
0af0: 73 69 6e 67 75 6c 61 72 20 73 74 72 69 6e 67 2f  singular string/
0b00: 66 5d 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 63  f]))..(define-sc
0b10: 68 65 6d 61 20 63 61 63 68 65 3a 69 6e 64 65 78  hema cache:index
0b20: 2d 65 6e 74 72 79 20 23 3a 74 61 62 6c 65 20 22  -entry #:table "
0b30: 69 6e 64 65 78 5f 65 6e 74 72 69 65 73 22 0a 20  index_entries". 
0b40: 20 28 5b 69 64 20 20 20 20 20 20 20 20 20 20 69   ([id          i
0b50: 64 2f 66 20 23 3a 70 72 69 6d 61 72 79 2d 6b 65  d/f #:primary-ke
0b60: 79 20 23 3a 61 75 74 6f 2d 69 6e 63 72 65 6d 65  y #:auto-increme
0b70: 6e 74 5d 0a 20 20 20 5b 65 6e 74 72 79 20 20 20  nt].   [entry   
0b80: 20 20 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20 20      string/f].  
0b90: 20 5b 73 75 62 65 6e 74 72 79 20 20 20 20 73 74   [subentry    st
0ba0: 72 69 6e 67 2f 66 5d 0a 20 20 20 5b 70 61 67 65  ring/f].   [page
0bb0: 20 20 20 20 20 20 20 20 73 79 6d 62 6f 6c 2f 66          symbol/f
0bc0: 5d 0a 20 20 20 5b 68 74 6d 6c 2d 61 6e 63 68 6f  ].   [html-ancho
0bd0: 72 20 73 74 72 69 6e 67 2f 66 5d 29 29 0a 0a 28  r string/f]))..(
0be0: 64 65 66 69 6e 65 2d 73 63 68 65 6d 61 20 6c 69  define-schema li
0bf0: 73 74 69 6e 67 0a 20 20 23 3a 76 69 72 74 75 61  sting.  #:virtua
0c00: 6c 0a 20 20 28 5b 68 74 6d 6c 20 20 20 20 20 20  l.  ([html      
0c10: 20 20 73 74 72 69 6e 67 2f 66 5d 0a 20 20 20 5b    string/f].   [
0c20: 70 75 62 6c 69 73 68 65 64 20 20 20 64 61 74 65  published   date
0c30: 2f 66 5d 0a 20 20 20 5b 73 65 72 69 65 73 2d 70  /f].   [series-p
0c40: 61 67 65 20 73 79 6d 62 6f 6c 2f 66 5d 29 29 0a  age symbol/f])).
0c50: 0a 28 64 65 66 69 6e 65 20 28 69 6e 69 74 2d 63  .(define (init-c
0c60: 61 63 68 65 2d 64 62 21 29 0a 20 20 28 63 72 65  ache-db!).  (cre
0c70: 61 74 65 2d 74 61 62 6c 65 21 20 63 61 63 68 65  ate-table! cache
0c80: 2d 63 6f 6e 6e 20 27 63 61 63 68 65 3a 61 72 74  -conn 'cache:art
0c90: 69 63 6c 65 29 0a 20 20 28 63 72 65 61 74 65 2d  icle).  (create-
0ca0: 74 61 62 6c 65 21 20 63 61 63 68 65 2d 63 6f 6e  table! cache-con
0cb0: 6e 20 27 63 61 63 68 65 3a 6e 6f 74 65 29 0a 20  n 'cache:note). 
0cc0: 20 28 63 72 65 61 74 65 2d 74 61 62 6c 65 21 20   (create-table! 
0cd0: 63 61 63 68 65 2d 63 6f 6e 6e 20 27 63 61 63 68  cache-conn 'cach
0ce0: 65 3a 73 65 72 69 65 73 29 0a 20 20 28 63 72 65  e:series).  (cre
0cf0: 61 74 65 2d 74 61 62 6c 65 21 20 63 61 63 68 65  ate-table! cache
0d00: 2d 63 6f 6e 6e 20 27 63 61 63 68 65 3a 69 6e 64  -conn 'cache:ind
0d10: 65 78 2d 65 6e 74 72 79 29 29 0a 0a 28 64 65 66  ex-entry))..(def
0d20: 69 6e 65 20 28 64 65 6c 65 74 65 2d 61 72 74 69  ine (delete-arti
0d30: 63 6c 65 21 20 70 61 67 65 29 0a 20 20 28 71 75  cle! page).  (qu
0d40: 65 72 79 2d 65 78 65 63 20 63 61 63 68 65 2d 63  ery-exec cache-c
0d50: 6f 6e 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  onn.            
0d60: 20 20 28 7e 3e 20 28 66 72 6f 6d 20 63 61 63 68    (~> (from cach
0d70: 65 3a 61 72 74 69 63 6c 65 20 23 3a 61 73 20 61  e:article #:as a
0d80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0d90: 20 20 20 20 28 77 68 65 72 65 20 28 3d 20 61 2e      (where (= a.
0da0: 70 61 67 65 20 2c 28 66 6f 72 6d 61 74 20 22 7e  page ,(format "~
0db0: 61 22 20 70 61 67 65 29 29 29 0a 20 20 20 20 20  a" page))).     
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 6c               del
0dd0: 65 74 65 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ete)))..(define 
0de0: 28 64 65 6c 65 74 65 2d 6e 6f 74 65 73 21 20 70  (delete-notes! p
0df0: 61 67 65 29 0a 20 20 28 71 75 65 72 79 2d 65 78  age).  (query-ex
0e00: 65 63 20 63 61 63 68 65 2d 63 6f 6e 6e 0a 20 20  ec cache-conn.  
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 28 7e 3e 20              (~> 
0e20: 28 66 72 6f 6d 20 63 61 63 68 65 3a 6e 6f 74 65  (from cache:note
0e30: 20 23 3a 61 73 20 6e 29 0a 20 20 20 20 20 20 20   #:as n).       
0e40: 20 20 20 20 20 20 20 20 20 20 20 28 77 68 65 72             (wher
0e50: 65 20 28 3d 20 6e 2e 70 61 67 65 20 2c 28 66 6f  e (= n.page ,(fo
0e60: 72 6d 61 74 20 22 7e 61 22 20 70 61 67 65 29 29  rmat "~a" page))
0e70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0e80: 20 20 20 20 64 65 6c 65 74 65 29 29 29 0a 0a 0a      delete)))...
0e90: 3b 3b 20 53 61 76 65 20 61 6e 20 61 72 74 69 63  ;; Save an artic
0ea0: 6c 65 20 61 6e 64 20 69 74 73 20 6e 6f 74 65 73  le and its notes
0eb0: 20 28 69 66 20 61 6e 79 29 20 74 6f 20 74 68 65   (if any) to the
0ec0: 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 72   database, and r
0ed0: 65 74 75 72 6e 20 74 68 65 0a 3b 3b 20 72 65 6e  eturn the.;; ren
0ee0: 64 65 72 65 64 20 48 54 4d 4c 20 6f 66 20 74 68  dered HTML of th
0ef0: 65 20 63 6f 6d 70 6c 65 74 65 20 61 72 74 69 63  e complete artic
0f00: 6c 65 2e 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28  le..;;.(define (
0f10: 70 61 72 73 65 2d 61 6e 64 2d 63 61 63 68 65 2d  parse-and-cache-
0f20: 61 72 74 69 63 6c 65 21 20 70 61 67 65 6e 6f 64  article! pagenod
0f30: 65 20 64 6f 63 29 0a 20 20 28 64 65 66 69 6e 65  e doc).  (define
0f40: 2d 76 61 6c 75 65 73 20 28 64 6f 63 2d 6e 6f 2d  -values (doc-no-
0f50: 74 69 74 6c 65 20 6d 61 79 62 65 2d 74 69 74 6c  title maybe-titl
0f60: 65 29 0a 20 20 20 20 28 73 70 6c 69 74 66 2d 74  e).    (splitf-t
0f70: 78 65 78 70 72 20 64 6f 63 20 28 6d 61 6b 65 2d  xexpr doc (make-
0f80: 74 61 67 2d 70 72 65 64 69 63 61 74 65 20 27 74  tag-predicate 't
0f90: 69 74 6c 65 29 29 29 0a 20 20 28 64 65 66 69 6e  itle))).  (defin
0fa0: 65 2d 76 61 6c 75 65 73 20 28 62 6f 64 79 2d 74  e-values (body-t
0fb0: 78 70 72 20 6e 6f 74 65 2d 74 78 70 72 73 29 0a  xpr note-txprs).
0fc0: 20 20 20 20 28 73 70 6c 69 74 66 2d 74 78 65 78      (splitf-txex
0fd0: 70 72 20 64 6f 63 2d 6e 6f 2d 74 69 74 6c 65 20  pr doc-no-title 
0fe0: 28 6d 61 6b 65 2d 74 61 67 2d 70 72 65 64 69 63  (make-tag-predic
0ff0: 61 74 65 20 27 6e 6f 74 65 29 29 29 0a 20 20 28  ate 'note))).  (
1000: 64 65 66 69 6e 65 2d 76 61 6c 75 65 73 20 28 64  define-values (d
1010: 69 73 70 6f 73 69 74 69 6f 6e 20 64 69 73 70 2d  isposition disp-
1020: 6e 6f 74 65 2d 69 64 29 0a 20 20 20 20 28 6e 6f  note-id).    (no
1030: 74 65 73 2d 3e 6c 61 73 74 2d 64 69 73 70 6f 73  tes->last-dispos
1040: 69 74 69 6f 6e 2d 76 61 6c 75 65 73 20 6e 6f 74  ition-values not
1050: 65 2d 74 78 70 72 73 29 29 0a 0a 20 20 28 6c 65  e-txprs))..  (le
1060: 74 2a 20 28 5b 70 75 62 64 61 74 65 20 28 73 65  t* ([pubdate (se
1070: 6c 65 63 74 2d 66 72 6f 6d 2d 6d 65 74 61 73 20  lect-from-metas 
1080: 27 70 75 62 6c 69 73 68 65 64 20 28 63 75 72 72  'published (curr
1090: 65 6e 74 2d 6d 65 74 61 73 29 29 5d 0a 20 20 20  ent-metas))].   
10a0: 20 20 20 20 20 20 5b 64 6f 63 2d 68 74 6d 6c 20        [doc-html 
10b0: 20 20 20 28 2d 3e 68 74 6d 6c 20 62 6f 64 79 2d     (->html body-
10c0: 74 78 70 72 20 23 3a 73 70 6c 69 63 65 3f 20 23  txpr #:splice? #
10d0: 74 29 5d 0a 20 20 20 20 20 20 20 20 20 5b 74 69  t)].         [ti
10e0: 74 6c 65 2d 73 70 65 63 69 66 69 65 64 3f 20 28  tle-specified? (
10f0: 6e 6f 74 20 28 65 71 75 61 6c 3f 20 27 28 29 20  not (equal? '() 
1100: 6d 61 79 62 65 2d 74 69 74 6c 65 29 29 5d 0a 20  maybe-title))]. 
1110: 20 20 20 20 20 20 20 20 5b 74 69 74 6c 65 2d 76          [title-v
1120: 61 6c 20 20 20 28 69 66 20 28 6e 6f 74 20 28 6e  al   (if (not (n
1130: 75 6c 6c 3f 20 6d 61 79 62 65 2d 74 69 74 6c 65  ull? maybe-title
1140: 29 29 20 28 63 61 72 20 6d 61 79 62 65 2d 74 69  )) (car maybe-ti
1150: 74 6c 65 29 20 28 63 68 65 63 6b 2d 66 6f 72 2d  tle) (check-for-
1160: 70 6f 65 6d 2d 74 69 74 6c 65 20 64 6f 63 29 29  poem-title doc))
1170: 5d 0a 20 20 20 20 20 20 20 20 20 5b 74 69 74 6c  ].         [titl
1180: 65 2d 74 78 20 20 20 20 28 6d 61 6b 65 2d 61 72  e-tx    (make-ar
1190: 74 69 63 6c 65 2d 74 69 74 6c 65 20 70 61 67 65  ticle-title page
11a0: 6e 6f 64 65 20 74 69 74 6c 65 2d 76 61 6c 20 62  node title-val b
11b0: 6f 64 79 2d 74 78 70 72 20 64 69 73 70 6f 73 69  ody-txpr disposi
11c0: 74 69 6f 6e 20 64 69 73 70 2d 6e 6f 74 65 2d 69  tion disp-note-i
11d0: 64 29 5d 0a 20 20 20 20 20 20 20 20 20 5b 74 69  d)].         [ti
11e0: 74 6c 65 2d 68 74 6d 6c 20 20 28 2d 3e 68 74 6d  tle-html  (->htm
11f0: 6c 20 74 69 74 6c 65 2d 74 78 20 23 3a 73 70 6c  l title-tx #:spl
1200: 69 63 65 3f 20 23 74 29 5d 0a 20 20 20 20 20 20  ice? #t)].      
1210: 20 20 20 5b 74 69 74 6c 65 2d 70 6c 61 69 6e 20     [title-plain 
1220: 28 74 78 2d 73 74 72 73 20 74 69 74 6c 65 2d 74  (tx-strs title-t
1230: 78 29 5d 0a 20 20 20 20 20 20 20 20 20 5b 68 65  x)].         [he
1240: 61 64 65 72 20 20 20 20 20 20 28 68 74 6d 6c 24  ader      (html$
1250: 2d 61 72 74 69 63 6c 65 2d 6f 70 65 6e 20 70 61  -article-open pa
1260: 67 65 6e 6f 64 65 20 74 69 74 6c 65 2d 73 70 65  genode title-spe
1270: 63 69 66 69 65 64 3f 20 74 69 74 6c 65 2d 74 78  cified? title-tx
1280: 20 70 75 62 64 61 74 65 29 5d 0a 20 20 20 20 20   pubdate)].     
1290: 20 20 20 20 5b 73 65 72 69 65 73 2d 6e 6f 64 65      [series-node
12a0: 20 28 6d 65 74 61 73 2d 73 65 72 69 65 73 2d 70   (metas-series-p
12b0: 61 67 65 6e 6f 64 65 29 5d 0a 20 20 20 20 20 20  agenode)].      
12c0: 20 20 20 5b 66 6f 6f 74 65 72 74 65 78 74 20 20     [footertext  
12d0: 28 6d 61 6b 65 2d 61 72 74 69 63 6c 65 2d 66 6f  (make-article-fo
12e0: 6f 74 65 72 74 65 78 74 20 70 61 67 65 6e 6f 64  otertext pagenod
12f0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 73 65 72 69 65 73 2d 6e 6f 64 65 0a 20 20 20   series-node.   
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 70              disp
1360: 6f 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  osition.        
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 64 69 73 70 2d 6e 6f 74 65         disp-note
13a0: 2d 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  -id.            
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 28 6c 65 6e 67 74 68 20 6e 6f 74 65 2d     (length note-
13e0: 74 78 70 72 73 29 29 5d 0a 20 20 20 20 20 20 20  txprs))].       
13f0: 20 20 5b 66 6f 6f 74 65 72 20 28 68 74 6d 6c 24    [footer (html$
1400: 2d 61 72 74 69 63 6c 65 2d 63 6c 6f 73 65 20 66  -article-close f
1410: 6f 6f 74 65 72 74 65 78 74 29 5d 0a 20 20 20 20  ootertext)].    
1420: 20 20 20 20 20 5b 6c 69 73 74 69 6e 67 2d 73 68       [listing-sh
1430: 6f 72 74 20 28 68 74 6d 6c 24 2d 61 72 74 69 63  ort (html$-artic
1440: 6c 65 2d 6c 69 73 74 69 6e 67 2d 73 68 6f 72 74  le-listing-short
1450: 20 70 61 67 65 6e 6f 64 65 20 70 75 62 64 61 74   pagenode pubdat
1460: 65 20 74 69 74 6c 65 2d 68 74 6d 6c 29 5d 0a 20  e title-html)]. 
1470: 20 20 20 20 20 20 20 20 5b 6e 6f 74 65 73 2d 73          [notes-s
1480: 65 63 74 69 6f 6e 2d 68 74 6d 6c 20 28 63 61 63  ection-html (cac
1490: 68 65 2d 6e 6f 74 65 73 21 20 70 61 67 65 6e 6f  he-notes! pageno
14a0: 64 65 20 74 69 74 6c 65 2d 70 6c 61 69 6e 20 6e  de title-plain n
14b0: 6f 74 65 2d 74 78 70 72 73 29 5d 29 0a 20 20 20  ote-txprs)]).   
14c0: 20 28 63 61 63 68 65 2d 69 6e 64 65 78 2d 65 6e   (cache-index-en
14d0: 74 72 69 65 73 21 20 70 61 67 65 6e 6f 64 65 20  tries! pagenode 
14e0: 64 6f 63 29 20 3b 20 6e 6f 74 65 20 6f 72 69 67  doc) ; note orig
14f0: 69 6e 61 6c 20 64 6f 63 20 69 73 20 75 73 65 64  inal doc is used
1500: 20 68 65 72 65 0a 20 20 20 20 28 63 75 72 72 65   here.    (curre
1510: 6e 74 2d 70 6c 61 69 6e 2d 74 69 74 6c 65 20 74  nt-plain-title t
1520: 69 74 6c 65 2d 70 6c 61 69 6e 29 0a 20 20 20 20  itle-plain).    
1530: 28 64 65 6c 65 74 65 2d 61 72 74 69 63 6c 65 21  (delete-article!
1540: 20 70 61 67 65 6e 6f 64 65 29 0a 20 20 20 20 28   pagenode).    (
1550: 69 6e 73 65 72 74 2d 6f 6e 65 21 20 63 61 63 68  insert-one! cach
1560: 65 2d 63 6f 6e 6e 0a 20 20 20 20 20 20 20 20 20  e-conn.         
1570: 20 20 20 20 20 20 20 20 28 6d 61 6b 65 2d 63 61          (make-ca
1580: 63 68 65 3a 61 72 74 69 63 6c 65 0a 20 20 20 20  che:article.    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 3a                #:
15a0: 70 61 67 65 20 70 61 67 65 6e 6f 64 65 0a 20 20  page pagenode.  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 23 3a 74 69 74 6c 65 2d 70 6c 61 69 6e 20 74 69  #:title-plain ti
15d0: 74 6c 65 2d 70 6c 61 69 6e 0a 20 20 20 20 20 20  tle-plain.      
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 23 3a 74 69              #:ti
15f0: 74 6c 65 2d 68 74 6d 6c 2d 66 6c 6f 77 20 74 69  tle-html-flow ti
1600: 74 6c 65 2d 68 74 6d 6c 0a 20 20 20 20 20 20 20  tle-html.       
1610: 20 20 20 20 20 20 20 20 20 20 20 23 3a 74 69 74             #:tit
1620: 6c 65 2d 73 70 65 63 69 66 69 65 64 3f 20 74 69  le-specified? ti
1630: 74 6c 65 2d 73 70 65 63 69 66 69 65 64 3f 0a 20  tle-specified?. 
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 23 3a 70 75 62 6c 69 73 68 65 64 20 70 75 62   #:published pub
1660: 64 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 20  date.           
1670: 20 20 20 20 20 20 20 23 3a 75 70 64 61 74 65 64         #:updated
1680: 20 28 6d 61 79 62 65 2d 6d 65 74 61 20 27 75 70   (maybe-meta 'up
1690: 64 61 74 65 64 29 0a 20 20 20 20 20 20 20 20 20  dated).         
16a0: 20 20 20 20 20 20 20 20 20 23 3a 61 75 74 68 6f           #:autho
16b0: 72 20 28 6d 61 79 62 65 2d 6d 65 74 61 20 27 61  r (maybe-meta 'a
16c0: 75 74 68 6f 72 20 64 65 66 61 75 6c 74 2d 61 75  uthor default-au
16d0: 74 68 6f 72 6e 61 6d 65 29 0a 20 20 20 20 20 20  thorname).      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 23 3a 63 6f              #:co
16f0: 6e 63 65 61 6c 20 28 6d 61 79 62 65 2d 6d 65 74  nceal (maybe-met
1700: 61 20 27 63 6f 6e 63 65 61 6c 29 0a 20 20 20 20  a 'conceal).    
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 3a                #:
1720: 73 65 72 69 65 73 2d 70 61 67 65 20 73 65 72 69  series-page seri
1730: 65 73 2d 6e 6f 64 65 0a 20 20 20 20 20 20 20 20  es-node.        
1740: 20 20 20 20 20 20 20 20 20 20 23 3a 6e 6f 75 6e            #:noun
1750: 2d 73 69 6e 67 75 6c 61 72 20 28 6d 61 79 62 65  -singular (maybe
1760: 2d 6d 65 74 61 20 27 6e 6f 75 6e 20 28 73 65 72  -meta 'noun (ser
1770: 69 65 73 2d 6d 65 74 61 73 2d 6e 6f 75 6e 29 29  ies-metas-noun))
1780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1790: 20 20 20 23 3a 6e 6f 74 65 2d 63 6f 75 6e 74 20     #:note-count 
17a0: 28 6c 65 6e 67 74 68 20 6e 6f 74 65 2d 74 78 70  (length note-txp
17b0: 72 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  rs).            
17c0: 20 20 20 20 20 20 23 3a 64 6f 63 2d 68 74 6d 6c        #:doc-html
17d0: 20 64 6f 63 2d 68 74 6d 6c 0a 20 20 20 20 20 20   doc-html.      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 23 3a 64 69              #:di
17f0: 73 70 6f 73 69 74 69 6f 6e 20 64 69 73 70 6f 73  sposition dispos
1800: 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ition.          
1810: 20 20 20 20 20 20 20 20 23 3a 64 69 73 70 2d 68          #:disp-h
1820: 74 6d 6c 2d 61 6e 63 68 6f 72 20 64 69 73 70 2d  tml-anchor disp-
1830: 6e 6f 74 65 2d 69 64 0a 20 20 20 20 20 20 20 20  note-id.        
1840: 20 20 20 20 20 20 20 20 20 20 23 3a 6c 69 73 74            #:list
1850: 69 6e 67 2d 66 75 6c 6c 2d 68 74 6d 6c 20 28 73  ing-full-html (s
1860: 74 72 69 6e 67 2d 61 70 70 65 6e 64 20 68 65 61  tring-append hea
1870: 64 65 72 20 64 6f 63 2d 68 74 6d 6c 20 66 6f 6f  der doc-html foo
1880: 74 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  ter).           
1890: 20 20 20 20 20 20 20 23 3a 6c 69 73 74 69 6e 67         #:listing
18a0: 2d 65 78 63 65 72 70 74 2d 68 74 6d 6c 20 22 22  -excerpt-html ""
18b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18c0: 20 20 20 23 3a 6c 69 73 74 69 6e 67 2d 73 68 6f     #:listing-sho
18d0: 72 74 2d 68 74 6d 6c 20 6c 69 73 74 69 6e 67 2d  rt-html listing-
18e0: 73 68 6f 72 74 29 29 0a 20 20 20 20 28 73 74 72  short)).    (str
18f0: 69 6e 67 2d 61 70 70 65 6e 64 20 68 65 61 64 65  ing-append heade
1900: 72 20 64 6f 63 2d 68 74 6d 6c 20 6e 6f 74 65 73  r doc-html notes
1910: 2d 73 65 63 74 69 6f 6e 2d 68 74 6d 6c 20 66 6f  -section-html fo
1920: 6f 74 65 72 29 29 29 0a 0a 28 64 65 66 69 6e 65  oter)))..(define
1930: 20 28 63 68 65 63 6b 2d 66 6f 72 2d 70 6f 65 6d   (check-for-poem
1940: 2d 74 69 74 6c 65 20 64 6f 63 2d 74 78 70 72 29  -title doc-txpr)
1950: 0a 20 20 28 6d 61 74 63 68 20 28 63 61 72 20 28  .  (match (car (
1960: 67 65 74 2d 65 6c 65 6d 65 6e 74 73 20 64 6f 63  get-elements doc
1970: 2d 74 78 70 72 29 29 0a 20 20 20 20 5b 28 74 78  -txpr)).    [(tx
1980: 65 78 70 72 20 27 64 69 76 0a 20 20 20 20 20 20  expr 'div.      
1990: 20 20 20 20 20 20 20 28 6c 69 73 74 20 28 6c 69         (list (li
19a0: 73 74 20 27 63 6c 61 73 73 20 22 70 6f 65 6d 22  st 'class "poem"
19b0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
19c0: 28 6c 69 73 74 2a 20 28 74 78 65 78 70 72 20 27  (list* (txexpr '
19d0: 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p.              
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
19f0: 69 73 74 20 28 6c 69 73 74 20 27 63 6c 61 73 73  ist (list 'class
1a00: 20 22 76 65 72 73 65 2d 68 65 61 64 69 6e 67 22   "verse-heading"
1a10: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1a30: 65 61 64 69 6e 67 2d 65 6c 65 6d 73 29 0a 20 20  eading-elems).  
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 5f 29 29 0a 20 20 20 20 20 60 28 74 69 74    _)).     `(tit
1a60: 6c 65 20 28 73 70 61 6e 20 5b 5b 63 6c 61 73 73  le (span [[class
1a70: 20 22 73 6d 61 6c 6c 63 61 70 73 22 5d 5d 20 22   "smallcaps"]] "
1a80: e2 80 98 22 20 2c 40 68 65 61 64 69 6e 67 2d 65  ..." ,@heading-e
1a90: 6c 65 6d 73 20 22 e2 80 99 22 29 29 5d 0a 20 20  lems "..."))].  
1aa0: 20 20 5b 5f 20 27 28 29 5d 29 29 0a 0a 3b 3b 20    [_ '()]))..;; 
1ab0: 52 65 74 75 72 6e 20 61 20 74 69 74 6c 65 20 74  Return a title t
1ac0: 78 65 78 70 72 20 66 6f 72 20 74 68 65 20 63 75  xexpr for the cu
1ad0: 72 72 65 6e 74 20 61 72 74 69 63 6c 65 2c 20 63  rrent article, c
1ae0: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 64 65  onstructing a de
1af0: 66 61 75 6c 74 20 69 66 20 6e 6f 20 74 69 74 6c  fault if no titl
1b00: 65 20 74 65 78 74 20 77 61 73 20 73 70 65 63 69  e text was speci
1b10: 66 69 65 64 2e 0a 28 64 65 66 69 6e 65 20 28 6d  fied..(define (m
1b20: 61 6b 65 2d 61 72 74 69 63 6c 65 2d 74 69 74 6c  ake-article-titl
1b30: 65 20 70 61 67 65 6e 6f 64 65 20 73 75 70 70 6c  e pagenode suppl
1b40: 69 65 64 2d 74 69 74 6c 65 20 62 6f 64 79 2d 74  ied-title body-t
1b50: 78 20 64 69 73 70 6f 73 69 74 69 6f 6e 20 64 69  x disposition di
1b60: 73 70 2d 6e 6f 74 65 2d 69 64 29 0a 20 20 28 64  sp-note-id).  (d
1b70: 65 66 69 6e 65 20 74 69 74 6c 65 2d 65 6c 65 6d  efine title-elem
1b80: 73 0a 20 20 20 20 28 63 6f 6e 64 20 5b 28 6e 75  s.    (cond [(nu
1b90: 6c 6c 3f 20 73 75 70 70 6c 69 65 64 2d 74 69 74  ll? supplied-tit
1ba0: 6c 65 29 20 28 6c 69 73 74 20 28 64 65 66 61 75  le) (list (defau
1bb0: 6c 74 2d 74 69 74 6c 65 20 28 67 65 74 2d 65 6c  lt-title (get-el
1bc0: 65 6d 65 6e 74 73 20 62 6f 64 79 2d 74 78 29 29  ements body-tx))
1bd0: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 5b 65 6c  )].          [el
1be0: 73 65 20 28 67 65 74 2d 65 6c 65 6d 65 6e 74 73  se (get-elements
1bf0: 20 73 75 70 70 6c 69 65 64 2d 74 69 74 6c 65 29   supplied-title)
1c00: 5d 29 29 0a 20 20 0a 20 20 28 64 65 66 69 6e 65  ])).  .  (define
1c10: 20 64 69 73 70 6f 73 69 74 69 6f 6e 2d 70 61 72   disposition-par
1c20: 74 0a 20 20 20 20 28 63 6f 6e 64 20 5b 28 6e 6f  t.    (cond [(no
1c30: 6e 2d 65 6d 70 74 79 2d 73 74 72 69 6e 67 3f 20  n-empty-string? 
1c40: 64 69 73 70 6f 73 69 74 69 6f 6e 29 0a 20 20 20  disposition).   
1c50: 20 20 20 20 20 20 20 20 28 64 65 66 69 6e 65 2d          (define-
1c60: 76 61 6c 75 65 73 20 28 6d 61 72 6b 20 5f 29 20  values (mark _) 
1c70: 28 64 69 73 70 6f 73 69 74 69 6f 6e 2d 76 61 6c  (disposition-val
1c80: 75 65 73 20 64 69 73 70 6f 73 69 74 69 6f 6e 29  ues disposition)
1c90: 29 0a 20 20 20 20 20 20 20 20 20 20 20 60 28 61  ).           `(a
1ca0: 20 5b 5b 63 6c 61 73 73 20 22 64 69 73 70 6f 73   [[class "dispos
1cb0: 69 74 69 6f 6e 2d 6d 61 72 6b 22 5d 20 0a 20 20  ition-mark"] .  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 68                [h
1cd0: 72 65 66 20 2c 28 66 6f 72 6d 61 74 20 22 7e 61  ref ,(format "~a
1ce0: 7e 61 23 7e 61 22 20 77 65 62 2d 72 6f 6f 74 20  ~a#~a" web-root 
1cf0: 70 61 67 65 6e 6f 64 65 20 64 69 73 70 2d 6e 6f  pagenode disp-no
1d00: 74 65 2d 69 64 29 5d 5d 20 0a 20 20 20 20 20 20  te-id)]] .      
1d10: 20 20 20 20 20 20 20 20 20 2c 6d 61 72 6b 29 5d           ,mark)]
1d20: 0a 20 20 20 20 20 20 20 20 20 20 5b 65 6c 73 65  .          [else
1d30: 20 22 22 5d 29 29 0a 20 20 3b 3b 20 52 65 74 75   ""])).  ;; Retu
1d40: 72 6e 73 20 61 20 74 78 65 78 70 72 2c 20 74 68  rns a txexpr, th
1d50: 65 20 74 61 67 20 77 69 6c 6c 20 62 65 20 64 69  e tag will be di
1d60: 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1d70: 65 6d 70 6c 61 74 65 2f 73 6e 69 70 70 65 74 73  emplate/snippets
1d80: 0a 20 20 60 28 74 69 74 6c 65 20 2c 40 74 69 74  .  `(title ,@tit
1d90: 6c 65 2d 65 6c 65 6d 73 20 2c 64 69 73 70 6f 73  le-elems ,dispos
1da0: 69 74 69 6f 6e 2d 70 61 72 74 29 29 0a 0a 3b 3b  ition-part))..;;
1db0: 20 43 6f 6e 76 65 72 74 20 61 20 62 75 6e 63 68   Convert a bunch
1dc0: 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   of information 
1dd0: 61 62 6f 75 74 20 61 6e 20 61 72 74 69 63 6c 65  about an article
1de0: 20 69 6e 74 6f 20 73 6f 6d 65 20 6e 69 63 65 20   into some nice 
1df0: 45 6e 67 6c 69 73 68 20 61 6e 64 20 6c 69 6e 6b  English and link
1e00: 73 2e 0a 28 64 65 66 69 6e 65 20 28 6d 61 6b 65  s..(define (make
1e10: 2d 61 72 74 69 63 6c 65 2d 66 6f 6f 74 65 72 74  -article-footert
1e20: 65 78 74 20 70 61 67 65 6e 6f 64 65 20 73 65 72  ext pagenode ser
1e30: 69 65 73 20 64 69 73 70 6f 73 69 74 69 6f 6e 20  ies disposition 
1e40: 64 69 73 70 2d 6e 6f 74 65 2d 69 64 20 6e 6f 74  disp-note-id not
1e50: 65 2d 63 6f 75 6e 74 29 0a 20 20 28 64 65 66 69  e-count).  (defi
1e60: 6e 65 20 73 65 72 69 65 73 2d 70 61 72 74 0a 20  ne series-part. 
1e70: 20 20 20 28 6d 61 74 63 68 20 28 73 65 72 69 65     (match (serie
1e80: 73 2d 6d 65 74 61 73 2d 74 69 74 6c 65 29 0a 20  s-metas-title). 
1e90: 20 20 20 20 20 5b 28 3f 20 6e 6f 6e 2d 65 6d 70       [(? non-emp
1ea0: 74 79 2d 73 74 72 69 6e 67 3f 20 73 2d 74 69 74  ty-string? s-tit
1eb0: 6c 65 29 0a 20 20 20 20 20 20 20 28 66 6f 72 6d  le).       (form
1ec0: 61 74 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d  at "<span class=
1ed0: 5c 22 73 65 72 69 65 73 2d 70 61 72 74 5c 22 3e  \"series-part\">
1ee0: 54 68 69 73 20 69 73 20 7e 61 2c 20 70 61 72 74  This is ~a, part
1ef0: 20 6f 66 20 3c 61 20 68 72 65 66 3d 5c 22 2f 7e   of <a href=\"/~
1f00: 61 5c 22 3e e2 80 98 7e 61 e2 80 99 3c 2f 61 3e  a\">...~a...</a>
1f10: 2e 3c 2f 73 70 61 6e 3e 22 0a 20 20 20 20 20 20  .</span>".      
1f20: 20 20 20 20 20 20 20 20 20 28 73 65 72 69 65 73           (series
1f30: 2d 6d 65 74 61 73 2d 6e 6f 75 6e 29 0a 20 20 20  -metas-noun).   
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 72 69              seri
1f50: 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  es.             
1f60: 20 20 73 2d 74 69 74 6c 65 29 5d 0a 20 20 20 20    s-title)].    
1f70: 20 20 5b 5f 20 22 22 5d 29 29 0a 20 20 28 64 65    [_ ""])).  (de
1f80: 66 69 6e 65 20 64 69 73 70 2d 70 61 72 74 0a 20  fine disp-part. 
1f90: 20 20 20 28 63 6f 6e 64 20 5b 28 6e 6f 6e 2d 65     (cond [(non-e
1fa0: 6d 70 74 79 2d 73 74 72 69 6e 67 3f 20 64 69 73  mpty-string? dis
1fb0: 70 6f 73 69 74 69 6f 6e 29 0a 20 20 20 20 20 20  position).      
1fc0: 20 20 20 20 20 28 64 65 66 69 6e 65 2d 76 61 6c       (define-val
1fd0: 75 65 73 20 28 6d 61 72 6b 20 76 65 72 62 29 20  ues (mark verb) 
1fe0: 28 64 69 73 70 6f 73 69 74 69 6f 6e 2d 76 61 6c  (disposition-val
1ff0: 75 65 73 20 64 69 73 70 6f 73 69 74 69 6f 6e 29  ues disposition)
2000: 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 66 6f  ).           (fo
2010: 72 6d 61 74 20 22 4e 6f 77 20 63 6f 6e 73 69 64  rmat "Now consid
2020: 65 72 65 64 20 3c 61 20 68 72 65 66 3d 5c 22 2f  ered <a href=\"/
2030: 7e 61 23 7e 61 5c 22 3e 7e 61 3c 2f 61 3e 2e 22  ~a#~a\">~a</a>."
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2050: 20 20 20 20 70 61 67 65 6e 6f 64 65 0a 20 20 20      pagenode.   
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 64 69 73 70 2d 6e 6f 74 65 2d 69 64 0a 20 20 20  disp-note-id.   
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 76 65 72 62 29 5d 0a 20 20 20 20 20 20 20 20 20  verb)].         
20a0: 20 5b 65 6c 73 65 20 22 22 5d 29 29 0a 20 20 28   [else ""])).  (
20b0: 64 65 66 69 6e 65 20 6e 6f 74 65 73 2d 70 61 72  define notes-par
20c0: 74 0a 20 20 20 20 28 63 6f 6e 64 20 5b 28 6e 6f  t.    (cond [(no
20d0: 74 65 2d 63 6f 75 6e 74 20 2e 20 3e 20 2e 20 31  te-count . > . 1
20e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 66 6f  ).           (fo
20f0: 72 6d 61 74 20 22 54 68 65 72 65 20 61 72 65 20  rmat "There are 
2100: 3c 61 20 68 72 65 66 3d 5c 22 2f 7e 61 23 66 75  <a href=\"/~a#fu
2110: 72 74 68 65 72 6e 6f 74 65 73 5c 22 3e 7e 61 20  rthernotes\">~a 
2120: 6e 6f 74 65 73 3c 2f 61 3e 20 61 70 70 65 6e 64  notes</a> append
2130: 65 64 2e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ed.".           
2140: 20 20 20 20 20 20 20 20 70 61 67 65 6e 6f 64 65          pagenode
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 6e 6f 74 65 2d 63 6f 75 6e 74 29 5d      note-count)]
2170: 0a 20 20 20 20 20 20 20 20 20 20 5b 28 61 6e 64  .          [(and
2180: 20 28 6e 6f 74 65 2d 63 6f 75 6e 74 20 2e 20 3e   (note-count . >
2190: 20 2e 20 30 29 20 28 73 74 72 69 6e 67 3d 3f 20   . 0) (string=? 
21a0: 64 69 73 70 6f 73 69 74 69 6f 6e 20 22 22 29 29  disposition ""))
21b0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 66 6f 72  .           (for
21c0: 6d 61 74 20 22 54 68 65 72 65 20 69 73 20 3c 61  mat "There is <a
21d0: 20 68 72 65 66 3d 5c 22 2f 7e 61 23 66 75 72 74   href=\"/~a#furt
21e0: 68 65 72 6e 6f 74 65 73 5c 22 3e 61 20 6e 6f 74  hernotes\">a not
21f0: 65 3c 2f 61 3e 20 61 70 70 65 6e 64 65 64 2e 22  e</a> appended."
2200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2210: 20 20 20 20 70 61 67 65 6e 6f 64 65 29 5d 0a 20      pagenode)]. 
2220: 20 20 20 20 20 20 20 20 20 5b 65 6c 73 65 20 22           [else "
2230: 22 5d 29 29 0a 20 20 0a 20 20 28 63 6f 6e 64 20  "])).  .  (cond 
2240: 5b 28 6f 72 6d 61 70 20 6e 6f 6e 2d 65 6d 70 74  [(ormap non-empt
2250: 79 2d 73 74 72 69 6e 67 3f 20 28 6c 69 73 74 20  y-string? (list 
2260: 73 65 72 69 65 73 2d 70 61 72 74 20 64 69 73 70  series-part disp
2270: 2d 70 61 72 74 20 6e 6f 74 65 73 2d 70 61 72 74  -part notes-part
2280: 29 29 0a 20 20 20 20 20 20 20 20 20 28 73 74 72  )).         (str
2290: 69 6e 67 2d 6a 6f 69 6e 20 28 6c 69 73 74 20 73  ing-join (list s
22a0: 65 72 69 65 73 2d 70 61 72 74 20 64 69 73 70 2d  eries-part disp-
22b0: 70 61 72 74 20 6e 6f 74 65 73 2d 70 61 72 74 29  part notes-part)
22c0: 29 5d 0a 20 20 20 20 20 20 20 20 5b 65 6c 73 65  )].        [else
22d0: 20 22 22 5d 29 29 0a 0a 3b 3b 20 7e 7e 7e 20 4e   ""]))..;; ~~~ N
22e0: 6f 74 65 73 20 7e 7e 7e 0a 0a 28 64 65 66 69 6e  otes ~~~..(defin
22f0: 65 20 28 63 61 63 68 65 2d 6e 6f 74 65 73 21 20  e (cache-notes! 
2300: 70 61 67 65 6e 6f 64 65 20 70 61 72 65 6e 74 2d  pagenode parent-
2310: 74 69 74 6c 65 20 6e 6f 74 65 2d 74 78 70 72 73  title note-txprs
2320: 29 0a 20 20 28 71 75 65 72 79 2d 65 78 65 63 20  ).  (query-exec 
2330: 63 61 63 68 65 2d 63 6f 6e 6e 20 28 64 65 6c 65  cache-conn (dele
2340: 74 65 20 28 7e 3e 20 28 66 72 6f 6d 20 63 61 63  te (~> (from cac
2350: 68 65 3a 6e 6f 74 65 20 23 3a 61 73 20 6e 29 0a  he:note #:as n).
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 28 77 68 65 72 65 20 28 3d 20 6e       (where (= n
2390: 2e 70 61 67 65 20 2c 28 73 79 6d 62 6f 6c 2d 3e  .page ,(symbol->
23a0: 73 74 72 69 6e 67 20 70 61 67 65 6e 6f 64 65 29  string pagenode)
23b0: 29 29 29 29 29 0a 20 20 28 63 6f 6e 64 20 5b 28  ))))).  (cond [(
23c0: 6e 6f 74 20 28 6e 75 6c 6c 3f 20 6e 6f 74 65 2d  not (null? note-
23d0: 74 78 70 72 73 29 29 0a 20 20 20 20 20 20 20 20  txprs)).        
23e0: 20 28 64 65 66 69 6e 65 20 6e 6f 74 65 2d 68 74   (define note-ht
23f0: 6d 6c 73 0a 20 20 20 20 20 20 20 20 20 20 20 28  mls.           (
2400: 66 6f 72 2f 6c 69 73 74 20 28 5b 6e 20 28 69 6e  for/list ([n (in
2410: 2d 6c 69 73 74 20 6e 6f 74 65 2d 74 78 70 72 73  -list note-txprs
2420: 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  )]).            
2430: 20 28 63 61 63 68 65 2d 6e 6f 74 65 21 20 6e 20   (cache-note! n 
2440: 70 61 67 65 6e 6f 64 65 20 70 61 72 65 6e 74 2d  pagenode parent-
2450: 74 69 74 6c 65 29 29 29 0a 20 20 20 20 20 20 20  title))).       
2460: 20 20 28 68 74 6d 6c 24 2d 6e 6f 74 65 73 2d 73    (html$-notes-s
2470: 65 63 74 69 6f 6e 20 6e 6f 74 65 2d 68 74 6d 6c  ection note-html
2480: 73 29 5d 0a 20 20 20 20 20 20 20 20 5b 65 6c 73  s)].        [els
2490: 65 20 22 22 5d 29 29 0a 0a 3b 3b 20 53 61 76 65  e ""]))..;; Save
24a0: 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 6e   an individual n
24b0: 6f 74 65 20 74 6f 20 74 68 65 20 44 42 20 61 6e  ote to the DB an
24c0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 48 54 4d  d return the HTM
24d0: 4c 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 65 74  L of the complet
24e0: 65 20 6e 6f 74 65 20 61 73 0a 3b 3b 20 69 74 20  e note as.;; it 
24f0: 73 68 6f 75 6c 64 20 61 70 70 65 61 72 20 6f 6e  should appear on
2500: 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 61   an individual a
2510: 72 74 69 63 6c 65 20 70 61 67 65 0a 28 64 65 66  rticle page.(def
2520: 69 6e 65 20 28 63 61 63 68 65 2d 6e 6f 74 65 21  ine (cache-note!
2530: 20 6e 6f 74 65 2d 74 78 20 70 61 67 65 6e 6f 64   note-tx pagenod
2540: 65 20 70 61 72 65 6e 74 2d 74 69 74 6c 65 2d 70  e parent-title-p
2550: 6c 61 69 6e 29 0a 20 20 28 64 65 66 69 6e 65 2d  lain).  (define-
2560: 76 61 6c 75 65 73 20 28 5f 20 61 74 74 72 73 20  values (_ attrs 
2570: 65 6c 65 6d 73 29 20 28 74 78 65 78 70 72 2d 3e  elems) (txexpr->
2580: 76 61 6c 75 65 73 20 6e 6f 74 65 2d 74 78 29 29  values note-tx))
2590: 0a 20 20 28 64 65 66 69 6e 65 20 64 69 73 70 6f  .  (define dispo
25a0: 73 69 74 69 6f 6e 2d 61 74 74 72 20 28 6d 61 79  sition-attr (may
25b0: 62 65 2d 61 74 74 72 20 27 64 69 73 70 6f 73 69  be-attr 'disposi
25c0: 74 69 6f 6e 20 61 74 74 72 73 29 29 0a 20 20 28  tion attrs)).  (
25d0: 64 65 66 69 6e 65 20 6e 6f 74 65 2d 64 61 74 65  define note-date
25e0: 20 28 6d 61 79 62 65 2d 61 74 74 72 20 27 64 61   (maybe-attr 'da
25f0: 74 65 20 61 74 74 72 73 29 29 0a 20 20 0a 20 20  te attrs)).  .  
2600: 3b 3b 20 43 68 65 63 6b 20 72 65 71 75 69 72 65  ;; Check require
2610: 64 20 61 74 74 72 69 62 75 74 65 73 0a 20 20 28  d attributes.  (
2620: 75 6e 6c 65 73 73 20 28 6e 6f 6e 2d 65 6d 70 74  unless (non-empt
2630: 79 2d 73 74 72 69 6e 67 3f 20 6e 6f 74 65 2d 64  y-string? note-d
2640: 61 74 65 29 0a 20 20 20 20 28 72 61 69 73 65 2d  ate).    (raise-
2650: 61 72 67 75 6d 65 6e 74 73 2d 65 72 72 6f 72 20  arguments-error 
2660: 27 6e 6f 74 65 20 22 72 65 71 75 69 72 65 64 20  'note "required 
2670: 61 74 74 72 20 6d 69 73 73 69 6e 67 3a 20 64 61  attr missing: da
2680: 74 65 22 20 22 61 74 74 72 73 22 20 61 74 74 72  te" "attrs" attr
2690: 73 29 29 0a 20 20 28 75 6e 6c 65 73 73 20 28 6f  s)).  (unless (o
26a0: 72 20 28 73 74 72 69 6e 67 3d 3f 20 22 22 20 64  r (string=? "" d
26b0: 69 73 70 6f 73 69 74 69 6f 6e 2d 61 74 74 72 29  isposition-attr)
26c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
26d0: 3e 3d 20 28 6c 65 6e 67 74 68 20 28 73 74 72 69  >= (length (stri
26e0: 6e 67 2d 73 70 6c 69 74 20 64 69 73 70 6f 73 69  ng-split disposi
26f0: 74 69 6f 6e 2d 61 74 74 72 29 29 20 32 29 29 0a  tion-attr)) 2)).
2700: 20 20 20 20 28 72 61 69 73 65 2d 61 72 67 75 6d      (raise-argum
2710: 65 6e 74 73 2d 65 72 72 6f 72 20 27 6e 6f 74 65  ents-error 'note
2720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2730: 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 75 73              "mus
2740: 74 20 62 65 20 69 6e 20 66 6f 72 6d 61 74 20 5c  t be in format \
2750: 22 5b 73 79 6d 62 6f 6c 5d 20 5b 70 61 73 74 2d  "[symbol] [past-
2760: 74 65 6e 73 65 2d 76 65 72 62 5d 5c 22 22 0a 20  tense-verb]\"". 
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 20 20 20 20 20 20 20 22 64 69 73 70 6f            "dispo
2790: 73 69 74 69 6f 6e 20 61 74 74 72 22 0a 20 20 20  sition attr".   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 20 20 20 64 69 73 70 6f 73 69 74          disposit
27c0: 69 6f 6e 2d 61 74 74 72 29 29 0a 20 20 28 64 65  ion-attr)).  (de
27d0: 66 69 6e 65 2d 76 61 6c 75 65 73 20 28 64 69 73  fine-values (dis
27e0: 70 2d 6d 61 72 6b 20 64 69 73 70 2d 76 65 72 62  p-mark disp-verb
27f0: 29 20 28 64 69 73 70 6f 73 69 74 69 6f 6e 2d 76  ) (disposition-v
2800: 61 6c 75 65 73 20 64 69 73 70 6f 73 69 74 69 6f  alues dispositio
2810: 6e 2d 61 74 74 72 29 29 0a 20 20 28 6c 65 74 2a  n-attr)).  (let*
2820: 20 28 5b 6e 6f 74 65 2d 69 64 20 28 62 75 69 6c   ([note-id (buil
2830: 64 2d 6e 6f 74 65 2d 69 64 20 6e 6f 74 65 2d 74  d-note-id note-t
2840: 78 29 5d 0a 20 20 20 20 20 20 20 20 20 5b 74 69  x)].         [ti
2850: 74 6c 65 2d 74 78 20 28 6d 61 6b 65 2d 6e 6f 74  tle-tx (make-not
2860: 65 2d 74 69 74 6c 65 20 70 61 67 65 6e 6f 64 65  e-title pagenode
2870: 20 70 61 72 65 6e 74 2d 74 69 74 6c 65 2d 70 6c   parent-title-pl
2880: 61 69 6e 29 5d 0a 20 20 20 20 20 20 20 20 20 5b  ain)].         [
2890: 74 69 74 6c 65 2d 68 74 6d 6c 20 28 2d 3e 68 74  title-html (->ht
28a0: 6d 6c 20 74 69 74 6c 65 2d 74 78 20 23 3a 73 70  ml title-tx #:sp
28b0: 6c 69 63 65 3f 20 23 74 29 5d 0a 20 20 20 20 20  lice? #t)].     
28c0: 20 20 20 20 5b 61 75 74 68 6f 72 20 28 6d 61 79      [author (may
28d0: 62 65 2d 61 74 74 72 20 27 61 75 74 68 6f 72 20  be-attr 'author 
28e0: 61 74 74 72 73 20 64 65 66 61 75 6c 74 2d 61 75  attrs default-au
28f0: 74 68 6f 72 6e 61 6d 65 29 5d 0a 20 20 20 20 20  thorname)].     
2900: 20 20 20 20 5b 61 75 74 68 6f 72 2d 75 72 6c 20      [author-url 
2910: 28 6d 61 79 62 65 2d 61 74 74 72 20 27 61 75 74  (maybe-attr 'aut
2920: 68 6f 72 2d 75 72 6c 20 61 74 74 72 73 29 5d 0a  hor-url attrs)].
2930: 20 20 20 20 20 20 20 20 20 5b 63 6f 6e 74 65 6e           [conten
2940: 74 2d 68 74 6d 6c 20 28 68 74 6d 6c 24 2d 6e 6f  t-html (html$-no
2950: 74 65 2d 63 6f 6e 74 65 6e 74 73 20 64 69 73 70  te-contents disp
2960: 2d 6d 61 72 6b 20 64 69 73 70 2d 76 65 72 62 20  -mark disp-verb 
2970: 65 6c 65 6d 73 29 5d 29 0a 20 20 20 20 28 69 6e  elems)]).    (in
2980: 73 65 72 74 2d 6f 6e 65 21 20 63 61 63 68 65 2d  sert-one! cache-
2990: 63 6f 6e 6e 0a 20 20 20 20 20 20 20 20 20 20 20  conn.           
29a0: 20 20 20 20 20 20 28 6d 61 6b 65 2d 63 61 63 68        (make-cach
29b0: 65 3a 6e 6f 74 65 0a 20 20 20 20 20 20 20 20 20  e:note.         
29c0: 20 20 20 20 20 20 20 20 20 23 3a 70 61 67 65 20           #:page 
29d0: 70 61 67 65 6e 6f 64 65 0a 20 20 20 20 20 20 20  pagenode.       
29e0: 20 20 20 20 20 20 20 20 20 20 20 23 3a 68 74 6d             #:htm
29f0: 6c 2d 61 6e 63 68 6f 72 20 6e 6f 74 65 2d 69 64  l-anchor note-id
2a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a10: 20 20 20 23 3a 74 69 74 6c 65 2d 68 74 6d 6c 2d     #:title-html-
2a20: 66 6c 6f 77 20 74 69 74 6c 65 2d 68 74 6d 6c 0a  flow title-html.
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 23 3a 74 69 74 6c 65 2d 70 6c 61 69 6e 20    #:title-plain 
2a50: 28 74 78 2d 73 74 72 73 20 74 69 74 6c 65 2d 74  (tx-strs title-t
2a60: 78 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x).             
2a70: 20 20 20 20 20 23 3a 70 75 62 6c 69 73 68 65 64       #:published
2a80: 20 6e 6f 74 65 2d 64 61 74 65 0a 20 20 20 20 20   note-date.     
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 3a 61               #:a
2aa0: 75 74 68 6f 72 20 61 75 74 68 6f 72 0a 20 20 20  uthor author.   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2ac0: 3a 61 75 74 68 6f 72 2d 75 72 6c 20 61 75 74 68  :author-url auth
2ad0: 6f 72 2d 75 72 6c 0a 20 20 20 20 20 20 20 20 20  or-url.         
2ae0: 20 20 20 20 20 20 20 20 20 23 3a 64 69 73 70 6f           #:dispo
2af0: 73 69 74 69 6f 6e 20 64 69 73 70 6f 73 69 74 69  sition dispositi
2b00: 6f 6e 2d 61 74 74 72 0a 20 20 20 20 20 20 20 20  on-attr.        
2b10: 20 20 20 20 20 20 20 20 20 20 23 3a 73 65 72 69            #:seri
2b20: 65 73 2d 70 61 67 65 20 28 6d 65 74 61 73 2d 73  es-page (metas-s
2b30: 65 72 69 65 73 2d 70 61 67 65 6e 6f 64 65 29 0a  eries-pagenode).
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 23 3a 63 6f 6e 63 65 61 6c 20 28 6f 72 20    #:conceal (or 
2b60: 28 6d 61 79 62 65 2d 61 74 74 72 20 27 63 6f 6e  (maybe-attr 'con
2b70: 63 65 61 6c 20 61 74 74 72 73 20 23 66 29 20 28  ceal attrs #f) (
2b80: 6d 61 79 62 65 2d 6d 65 74 61 20 27 63 6f 6e 63  maybe-meta 'conc
2b90: 65 61 6c 29 29 0a 20 20 20 20 20 20 20 20 20 20  eal)).          
2ba0: 20 20 20 20 20 20 20 20 23 3a 63 6f 6e 74 65 6e          #:conten
2bb0: 74 2d 68 74 6d 6c 20 63 6f 6e 74 65 6e 74 2d 68  t-html content-h
2bc0: 74 6d 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tml.            
2bd0: 20 20 20 20 20 20 23 3a 6c 69 73 74 69 6e 67 2d        #:listing-
2be0: 66 75 6c 6c 2d 68 74 6d 6c 20 28 68 74 6d 6c 24  full-html (html$
2bf0: 2d 6e 6f 74 65 2d 6c 69 73 74 69 6e 67 2d 66 75  -note-listing-fu
2c00: 6c 6c 20 70 61 67 65 6e 6f 64 65 0a 20 20 20 20  ll pagenode.    
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 65 2d             note-
2c50: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  id.             
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 74 69 74 6c 65 2d 68 74 6d 6c 0a 20 20 20    title-html.   
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 65              note
2ce0: 2d 64 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  -date.          
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 63 6f 6e 74 65 6e 74 2d 68 74 6d       content-htm
2d30: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 61 75 74 68 6f 72 0a 20 20 20 20 20 20 20 20   author.        
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 20 20 61 75 74 68 6f 72 2d 75 72         author-ur
2dc0: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l).             
2dd0: 20 20 20 20 20 23 3a 6c 69 73 74 69 6e 67 2d 65       #:listing-e
2de0: 78 63 65 72 70 74 2d 68 74 6d 6c 20 22 22 0a 20  xcerpt-html "". 
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 23 3a 6c 69 73 74 69 6e 67 2d 73 68 6f 72 74   #:listing-short
2e10: 2d 68 74 6d 6c 20 22 22 29 29 0a 20 20 20 20 28  -html "")).    (
2e20: 68 74 6d 6c 24 2d 6e 6f 74 65 2d 69 6e 2d 61 72  html$-note-in-ar
2e30: 74 69 63 6c 65 20 6e 6f 74 65 2d 69 64 20 6e 6f  ticle note-id no
2e40: 74 65 2d 64 61 74 65 20 63 6f 6e 74 65 6e 74 2d  te-date content-
2e50: 68 74 6d 6c 20 61 75 74 68 6f 72 20 61 75 74 68  html author auth
2e60: 6f 72 2d 75 72 6c 29 29 29 0a 0a 28 64 65 66 69  or-url)))..(defi
2e70: 6e 65 20 28 6d 61 6b 65 2d 6e 6f 74 65 2d 74 69  ne (make-note-ti
2e80: 74 6c 65 20 70 61 67 65 6e 6f 64 65 20 70 61 72  tle pagenode par
2e90: 65 6e 74 2d 74 69 74 6c 65 2d 70 6c 61 69 6e 29  ent-title-plain)
2ea0: 0a 20 20 60 28 6e 6f 74 65 2d 74 69 74 6c 65 20  .  `(note-title 
2eb0: 22 52 65 3a 20 22 20 28 61 20 5b 5b 63 6c 61 73  "Re: " (a [[clas
2ec0: 73 20 22 63 72 6f 73 73 2d 72 65 66 65 72 65 6e  s "cross-referen
2ed0: 63 65 22 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ce"].           
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2ef0: 68 72 65 66 20 2c 28 66 6f 72 6d 61 74 20 22 7e  href ,(format "~
2f00: 61 7e 61 22 20 77 65 62 2d 72 6f 6f 74 20 70 61  a~a" web-root pa
2f10: 67 65 6e 6f 64 65 29 5d 5d 0a 20 20 20 20 20 20  genode)]].      
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 2c 70 61 72 65 6e 74 2d 74 69 74 6c 65     ,parent-title
2f40: 2d 70 6c 61 69 6e 29 29 29 0a 0a 3b 3b 20 7e 7e  -plain)))..;; ~~
2f50: 7e 20 4b 65 79 77 6f 72 64 20 49 6e 64 65 78 20  ~ Keyword Index 
2f60: 45 6e 74 72 69 65 73 20 7e 7e 7e 0a 0a 3b 3b 20  Entries ~~~..;; 
2f70: 28 70 72 69 76 61 74 65 29 20 43 6f 6e 76 65 72  (private) Conver
2f80: 74 20 61 6e 20 65 6e 74 72 79 20 6b 65 79 20 69  t an entry key i
2f90: 6e 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 61 74  nto a list of at
2fa0: 20 6d 6f 73 74 20 74 77 6f 20 65 6c 65 6d 65 6e   most two elemen
2fb0: 74 73 2c 0a 3b 3b 20 61 20 6d 61 69 6e 20 65 6e  ts,.;; a main en
2fc0: 74 72 79 20 61 6e 64 20 61 20 73 75 62 2d 65 6e  try and a sub-en
2fd0: 74 72 79 2e 0a 3b 3b 20 20 20 22 65 6e 74 72 79  try..;;   "entry
2fe0: 22 20 e2 86 92 20 27 28 22 65 6e 74 72 79 22 20  " ... '("entry" 
2ff0: 22 22 29 0a 3b 3b 20 20 20 22 65 6e 74 72 79 21  "").;;   "entry!
3000: 73 75 62 22 20 e2 86 92 20 27 28 22 65 6e 74 72  sub" ... '("entr
3010: 79 22 20 22 73 75 62 22 29 0a 3b 3b 20 20 20 22  y" "sub").;;   "
3020: 65 6e 74 72 79 21 73 75 62 21 77 68 79 3f 21 3f  entry!sub!why?!?
3030: 20 27 28 22 65 6e 74 72 79 22 20 22 73 75 62 22   '("entry" "sub"
3040: 29 0a 28 64 65 66 69 6e 65 20 28 73 70 6c 69 74  ).(define (split
3050: 2d 65 6e 74 72 79 20 73 74 72 29 0a 20 20 28 64  -entry str).  (d
3060: 65 66 69 6e 65 20 73 70 6c 69 74 73 20 28 73 74  efine splits (st
3070: 72 69 6e 67 2d 73 70 6c 69 74 20 73 74 72 20 22  ring-split str "
3080: 21 22 29 29 0a 20 20 28 6c 69 73 74 20 28 63 61  !")).  (list (ca
3090: 72 20 73 70 6c 69 74 73 29 0a 20 20 20 20 20 20  r splits).      
30a0: 20 20 28 63 61 64 72 20 28 61 70 70 65 6e 64 20    (cadr (append 
30b0: 73 70 6c 69 74 73 20 28 6c 69 73 74 20 22 22 29  splits (list "")
30c0: 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 69  ))))..(define (i
30d0: 6e 64 65 78 2d 65 6e 74 72 79 2d 74 78 70 72 3f  ndex-entry-txpr?
30e0: 20 74 78 29 0a 20 20 28 61 6e 64 20 28 74 78 65   tx).  (and (txe
30f0: 78 70 72 3f 20 74 78 29 0a 20 20 20 20 20 20 20  xpr? tx).       
3100: 28 73 74 72 69 6e 67 3d 3f 20 22 69 6e 64 65 78  (string=? "index
3110: 2d 6c 69 6e 6b 22 20 28 61 74 74 72 2d 72 65 66  -link" (attr-ref
3120: 20 74 78 20 27 63 6c 61 73 73 20 22 22 29 29 20   tx 'class "")) 
3130: 3b 20 73 65 65 20 64 65 66 69 6e 69 74 69 6f 6e  ; see definition
3140: 20 6f 66 20 68 74 6d 6c 2d 69 6e 64 65 78 0a 20   of html-index. 
3150: 20 20 20 20 20 20 28 61 74 74 72 2d 72 65 66 20        (attr-ref 
3160: 74 78 20 27 64 61 74 61 2d 69 6e 64 65 78 2d 65  tx 'data-index-e
3170: 6e 74 72 79 20 23 66 29 29 29 0a 0a 28 64 65 66  ntry #f)))..(def
3180: 69 6e 65 20 28 74 78 65 78 70 72 2d 3e 69 6e 64  ine (txexpr->ind
3190: 65 78 2d 65 6e 74 72 79 20 74 78 20 70 61 67 65  ex-entry tx page
31a0: 6e 6f 64 65 29 0a 20 20 28 6d 61 74 63 68 20 28  node).  (match (
31b0: 73 70 6c 69 74 2d 65 6e 74 72 79 20 28 61 74 74  split-entry (att
31c0: 72 2d 72 65 66 20 74 78 20 27 64 61 74 61 2d 69  r-ref tx 'data-i
31d0: 6e 64 65 78 2d 65 6e 74 72 79 29 29 0a 20 20 20  ndex-entry)).   
31e0: 20 5b 28 6c 69 73 74 20 6d 61 69 6e 20 73 75 62   [(list main sub
31f0: 29 0a 20 20 20 20 20 28 6d 61 6b 65 2d 63 61 63  ).     (make-cac
3200: 68 65 3a 69 6e 64 65 78 2d 65 6e 74 72 79 0a 20  he:index-entry. 
3210: 20 20 20 20 20 23 3a 65 6e 74 72 79 20 6d 61 69       #:entry mai
3220: 6e 0a 20 20 20 20 20 20 23 3a 73 75 62 65 6e 74  n.      #:subent
3230: 72 79 20 73 75 62 0a 20 20 20 20 20 20 23 3a 70  ry sub.      #:p
3240: 61 67 65 20 70 61 67 65 6e 6f 64 65 0a 20 20 20  age pagenode.   
3250: 20 20 20 23 3a 68 74 6d 6c 2d 61 6e 63 68 6f 72     #:html-anchor
3260: 20 28 61 74 74 72 2d 72 65 66 20 74 78 20 27 69   (attr-ref tx 'i
3270: 64 29 29 5d 29 29 0a 0a 3b 3b 20 53 61 76 65 20  d))]))..;; Save 
3280: 61 6e 79 20 69 6e 64 65 78 20 65 6e 74 72 69 65  any index entrie
3290: 73 20 69 6e 20 64 6f 63 20 74 6f 20 74 68 65 20  s in doc to the 
32a0: 53 51 4c 69 74 65 20 63 61 63 68 65 2e 0a 3b 3b  SQLite cache..;;
32b0: 20 53 75 62 2d 65 6e 74 72 69 65 73 20 61 72 65   Sub-entries are
32c0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 22 21   specified by "!
32d0: 22 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 6b  " in the index k
32e0: 65 79 0a 28 64 65 66 69 6e 65 20 28 63 61 63 68  ey.(define (cach
32f0: 65 2d 69 6e 64 65 78 2d 65 6e 74 72 69 65 73 21  e-index-entries!
3300: 20 70 61 67 65 6e 6f 64 65 20 64 6f 63 29 0a 20   pagenode doc). 
3310: 20 28 64 65 66 69 6e 65 2d 76 61 6c 75 65 73 20   (define-values 
3320: 28 5f 20 65 6e 74 72 79 2d 74 78 73 29 20 28 73  (_ entry-txs) (s
3330: 70 6c 69 74 66 2d 74 78 65 78 70 72 20 64 6f 63  plitf-txexpr doc
3340: 20 69 6e 64 65 78 2d 65 6e 74 72 79 2d 74 78 70   index-entry-txp
3350: 72 3f 29 29 0a 20 20 3b 20 4e 61 69 76 65 20 69  r?)).  ; Naive i
3360: 64 65 6d 70 6f 74 65 6e 63 65 3a 20 64 65 6c 65  dempotence: dele
3370: 74 65 20 61 6e 64 20 72 65 2d 69 6e 73 65 72 74  te and re-insert
3380: 20 61 6c 6c 20 69 6e 64 65 78 20 65 6e 74 72 69   all index entri
3390: 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 64 6f  es every time do
33a0: 63 20 69 73 20 72 65 6e 64 65 72 65 64 2e 0a 20  c is rendered.. 
33b0: 20 28 71 75 65 72 79 2d 65 78 65 63 20 63 61 63   (query-exec cac
33c0: 68 65 2d 63 6f 6e 6e 20 28 64 65 6c 65 74 65 20  he-conn (delete 
33d0: 28 7e 3e 20 28 66 72 6f 6d 20 63 61 63 68 65 3a  (~> (from cache:
33e0: 69 6e 64 65 78 2d 65 6e 74 72 79 20 23 3a 61 73  index-entry #:as
33f0: 20 65 6e 74 72 79 29 0a 20 20 20 20 20 20 20 20   entry).        
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 77 68               (wh
3420: 65 72 65 20 28 3d 20 65 6e 74 72 79 2e 70 61 67  ere (= entry.pag
3430: 65 20 2c 28 73 79 6d 62 6f 6c 2d 3e 73 74 72 69  e ,(symbol->stri
3440: 6e 67 20 70 61 67 65 6e 6f 64 65 29 29 29 29 29  ng pagenode)))))
3450: 29 0a 20 20 28 75 6e 6c 65 73 73 20 28 6e 75 6c  ).  (unless (nul
3460: 6c 3f 20 65 6e 74 72 79 2d 74 78 73 29 0a 20 20  l? entry-txs).  
3470: 20 20 28 76 6f 69 64 0a 20 20 20 20 20 28 61 70    (void.     (ap
3480: 70 6c 79 20 69 6e 73 65 72 74 21 20 63 61 63 68  ply insert! cach
3490: 65 2d 63 6f 6e 6e 0a 20 20 20 20 20 20 20 20 20  e-conn.         
34a0: 20 20 20 28 66 6f 72 2f 6c 69 73 74 20 28 5b 65     (for/list ([e
34b0: 74 78 20 28 69 6e 2d 6c 69 73 74 20 65 6e 74 72  tx (in-list entr
34c0: 79 2d 74 78 73 29 5d 29 0a 20 20 20 20 20 20 20  y-txs)]).       
34d0: 20 20 20 20 20 20 20 28 74 78 65 78 70 72 2d 3e         (txexpr->
34e0: 69 6e 64 65 78 2d 65 6e 74 72 79 20 65 74 78 20  index-entry etx 
34f0: 70 61 67 65 6e 6f 64 65 29 29 29 29 29 29 0a 0a  pagenode))))))..
3500: 3b 3b 0a 3b 3b 20 20 7e 7e 7e 20 46 65 74 63 68  ;;.;;  ~~~ Fetch
3510: 69 6e 67 20 61 72 74 69 63 6c 65 73 20 61 6e 64  ing articles and
3520: 20 6e 6f 74 65 73 20 7e 7e 7e 0a 3b 3b 0a 0a 3b   notes ~~~.;;..;
3530: 3b 20 28 50 72 69 76 61 74 65 20 75 73 65 29 20  ; (Private use) 
3540: 43 6f 6e 76 65 6e 69 65 63 65 20 66 75 6e 63 74  Conveniece funct
3550: 69 6f 6e 20 66 6f 72 20 74 68 65 20 57 48 45 52  ion for the WHER
3560: 45 20 60 73 65 72 69 65 73 2d 70 61 67 65 60 20  E `series-page` 
3570: 63 6c 61 75 73 65 0a 28 64 65 66 69 6e 65 20 28  clause.(define (
3580: 77 68 65 72 65 2d 73 65 72 69 65 73 20 71 20 73  where-series q s
3590: 29 0a 20 20 28 64 65 66 69 6e 65 20 28 73 2d 3e  ).  (define (s->
35a0: 70 20 78 29 20 28 66 6f 72 6d 61 74 20 22 7e 61  p x) (format "~a
35b0: 2f 7e 61 2e 68 74 6d 6c 22 20 73 65 72 69 65 73  /~a.html" series
35c0: 2d 66 6f 6c 64 65 72 20 78 29 29 0a 20 20 28 6d  -folder x)).  (m
35d0: 61 74 63 68 20 73 0a 20 20 20 20 5b 28 6c 69 73  atch s.    [(lis
35e0: 74 20 73 65 72 69 65 73 20 2e 2e 2e 29 0a 20 20  t series ...).  
35f0: 20 20 20 28 77 68 65 72 65 20 71 20 28 69 6e 20     (where q (in 
3600: 61 2e 73 65 72 69 65 73 2d 70 61 67 65 20 2c 28  a.series-page ,(
3610: 6d 61 70 20 73 2d 3e 70 20 73 65 72 69 65 73 29  map s->p series)
3620: 29 29 5d 20 3b 20 57 48 45 52 45 20 73 65 72 69  ))] ; WHERE seri
3630: 65 73 2d 70 61 67 65 20 49 4e 20 28 69 74 65 6d  es-page IN (item
3640: 31 20 2e 2e 2e 29 0a 20 20 20 20 5b 28 6f 72 20  1 ...).    [(or 
3650: 28 3f 20 73 74 72 69 6e 67 3f 20 73 65 72 69 65  (? string? serie
3660: 73 29 20 28 3f 20 73 79 6d 62 6f 6c 3f 20 73 65  s) (? symbol? se
3670: 72 69 65 73 29 29 0a 20 20 20 20 20 28 77 68 65  ries)).     (whe
3680: 72 65 20 71 20 28 3d 20 61 2e 73 65 72 69 65 73  re q (= a.series
3690: 2d 70 61 67 65 20 2c 28 73 2d 3e 70 20 73 65 72  -page ,(s->p ser
36a0: 69 65 73 29 29 29 5d 20 20 20 20 20 20 3b 20 57  ies)))]      ; W
36b0: 48 45 52 45 20 73 65 72 69 65 73 2d 70 61 67 65  HERE series-page
36c0: 20 3d 20 22 69 74 65 6d 22 0a 20 20 20 20 5b 23   = "item".    [#
36d0: 74 0a 20 20 20 20 20 28 77 68 65 72 65 20 71 20  t.     (where q 
36e0: 28 3d 20 61 2e 73 65 72 69 65 73 2d 70 61 67 65  (= a.series-page
36f0: 20 2c 28 70 61 74 68 2d 3e 73 74 72 69 6e 67 20   ,(path->string 
3700: 28 68 65 72 65 2d 6f 75 74 70 75 74 2d 70 61 74  (here-output-pat
3710: 68 29 29 29 29 5d 0a 20 20 20 20 5b 5f 20 71 5d  h))))].    [_ q]
3720: 29 29 0a 0a 3b 3b 20 28 50 72 69 76 61 74 65 20  ))..;; (Private 
3730: 75 73 65 29 20 43 6f 6e 76 65 6e 69 65 6e 63 65  use) Convenience
3740: 20 66 6f 72 20 74 68 65 20 57 48 45 52 45 20 60   for the WHERE `
3750: 63 6f 6e 63 65 61 6c 60 20 4e 4f 54 20 4c 49 4b  conceal` NOT LIK
3760: 45 20 63 6c 61 75 73 65 0a 28 64 65 66 69 6e 65  E clause.(define
3770: 20 28 77 68 65 72 65 2d 6e 6f 74 2d 63 6f 6e 63   (where-not-conc
3780: 65 61 6c 65 64 20 71 29 0a 20 20 28 64 65 66 69  ealed q).  (defi
3790: 6e 65 20 62 61 73 65 2d 63 6c 61 75 73 65 20 28  ne base-clause (
37a0: 77 68 65 72 65 20 71 20 28 6e 6f 74 20 28 6c 69  where q (not (li
37b0: 6b 65 20 61 2e 63 6f 6e 63 65 61 6c 20 22 25 61  ke a.conceal "%a
37c0: 6c 6c 25 22 29 29 29 29 0a 20 20 28 6d 61 74 63  ll%")))).  (matc
37d0: 68 20 28 6c 69 73 74 69 6e 67 2d 63 6f 6e 74 65  h (listing-conte
37e0: 78 74 29 0a 20 20 20 20 5b 22 22 20 62 61 73 65  xt).    ["" base
37f0: 2d 63 6c 61 75 73 65 5d 0a 20 20 20 20 5b 28 76  -clause].    [(v
3800: 61 72 20 63 6f 6e 74 65 78 74 29 20 28 77 68 65  ar context) (whe
3810: 72 65 20 62 61 73 65 2d 63 6c 61 75 73 65 20 28  re base-clause (
3820: 6e 6f 74 20 28 6c 69 6b 65 20 61 2e 63 6f 6e 63  not (like a.conc
3830: 65 61 6c 20 2c 28 66 6f 72 6d 61 74 20 22 25 7e  eal ,(format "%~
3840: 61 25 22 20 63 6f 6e 74 65 78 74 29 29 29 29 5d  a%" context))))]
3850: 29 29 0a 0a 3b 3b 20 4e 65 65 64 65 64 20 74 6f  ))..;; Needed to
3860: 20 22 70 61 72 61 6d 65 74 65 72 69 7a 65 22 20   "parameterize" 
3870: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 3b 3b 20  column names.;; 
3880: 73 65 65 20 68 74 74 70 73 3a 2f 2f 67 69 74 68  see https://gith
3890: 75 62 2e 63 6f 6d 2f 42 6f 67 64 61 6e 70 2f 64  ub.com/Bogdanp/d
38a0: 65 74 61 2f 69 73 73 75 65 73 2f 31 34 23 69 73  eta/issues/14#is
38b0: 73 75 65 63 6f 6d 6d 65 6e 74 2d 35 37 33 33 34  suecomment-57334
38c0: 34 39 32 38 0a 28 72 65 71 75 69 72 65 20 28 70  4928.(require (p
38d0: 72 65 66 69 78 2d 69 6e 20 61 73 74 3a 20 64 65  refix-in ast: de
38e0: 74 61 2f 70 72 69 76 61 74 65 2f 61 73 74 29 29  ta/private/ast))
38f0: 0a 0a 3b 3b 20 42 75 69 6c 64 73 20 61 20 71 75  ..;; Builds a qu
3900: 65 72 79 20 74 6f 20 66 65 74 63 68 20 61 72 74  ery to fetch art
3910: 69 63 6c 65 73 0a 28 64 65 66 69 6e 65 20 28 61  icles.(define (a
3920: 72 74 69 63 6c 65 73 20 74 79 70 65 20 23 3a 73  rticles type #:s
3930: 65 72 69 65 73 20 5b 73 20 23 74 5d 20 23 3a 6c  eries [s #t] #:l
3940: 69 6d 69 74 20 5b 6c 69 6d 20 2d 31 5d 20 23 3a  imit [lim -1] #:
3950: 6f 72 64 65 72 20 5b 6f 72 64 20 27 64 65 73 63  order [ord 'desc
3960: 5d 29 0a 20 20 28 64 65 66 69 6e 65 20 68 74 6d  ]).  (define htm
3970: 6c 2d 66 69 65 6c 64 20 28 66 6f 72 6d 61 74 20  l-field (format 
3980: 22 6c 69 73 74 69 6e 67 5f 7e 61 5f 68 74 6d 6c  "listing_~a_html
3990: 22 20 74 79 70 65 29 29 0a 20 20 28 7e 3e 20 28  " type)).  (~> (
39a0: 66 72 6f 6d 20 63 61 63 68 65 3a 61 72 74 69 63  from cache:artic
39b0: 6c 65 20 23 3a 61 73 20 61 29 0a 20 20 20 20 20  le #:as a).     
39c0: 20 28 73 65 6c 65 63 74 20 28 66 72 61 67 6d 65   (select (fragme
39d0: 6e 74 20 28 61 73 74 3a 61 73 20 28 61 73 74 3a  nt (ast:as (ast:
39e0: 71 75 61 6c 69 66 69 65 64 20 22 61 22 20 68 74  qualified "a" ht
39f0: 6d 6c 2d 66 69 65 6c 64 29 20 22 68 74 6d 6c 22  ml-field) "html"
3a00: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
3a10: 20 61 2e 70 75 62 6c 69 73 68 65 64 0a 20 20 20   a.published.   
3a20: 20 20 20 20 20 20 20 20 20 20 20 61 2e 73 65 72             a.ser
3a30: 69 65 73 2d 70 61 67 65 0a 20 20 20 20 20 20 20  ies-page.       
3a40: 20 20 20 20 20 20 20 61 2e 63 6f 6e 63 65 61 6c         a.conceal
3a50: 29 0a 20 20 20 20 20 20 28 77 68 65 72 65 2d 73  ).      (where-s
3a60: 65 72 69 65 73 20 73 29 0a 20 20 20 20 20 20 28  eries s).      (
3a70: 77 68 65 72 65 2d 6e 6f 74 2d 63 6f 6e 63 65 61  where-not-concea
3a80: 6c 65 64 29 0a 20 20 20 20 20 20 28 6c 69 6d 69  led).      (limi
3a90: 74 20 2c 6c 69 6d 29 0a 20 20 20 20 20 20 28 6f  t ,lim).      (o
3aa0: 72 64 65 72 2d 62 79 20 28 5b 61 2e 70 75 62 6c  rder-by ([a.publ
3ab0: 69 73 68 65 64 20 2c 6f 72 64 5d 29 29 0a 20 20  ished ,ord])).  
3ac0: 20 20 20 20 28 70 72 6f 6a 65 63 74 2d 6f 6e 74      (project-ont
3ad0: 6f 20 6c 69 73 74 69 6e 67 2d 73 63 68 65 6d 61  o listing-schema
3ae0: 29 29 29 0a 0a 3b 3b 20 42 75 69 6c 64 73 20 61  )))..;; Builds a
3af0: 20 71 75 65 72 79 20 74 68 61 74 20 72 65 74 75   query that retu
3b00: 72 6e 73 20 61 72 74 69 63 6c 65 73 20 61 6e 64  rns articles and
3b10: 20 6e 6f 74 65 73 20 69 6e 74 65 72 6d 69 6e 67   notes interming
3b20: 6c 65 64 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61  led chronologica
3b30: 6c 6c 79 0a 28 64 65 66 69 6e 65 20 28 61 72 74  lly.(define (art
3b40: 69 63 6c 65 73 2b 6e 6f 74 65 73 20 74 79 70 65  icles+notes type
3b50: 20 23 3a 73 65 72 69 65 73 20 5b 73 20 23 74 5d   #:series [s #t]
3b60: 20 23 3a 6c 69 6d 69 74 20 5b 6c 69 6d 20 2d 31   #:limit [lim -1
3b70: 5d 20 23 3a 6f 72 64 65 72 20 5b 6f 72 64 20 27  ] #:order [ord '
3b80: 64 65 73 63 5d 29 0a 20 20 28 64 65 66 69 6e 65  desc]).  (define
3b90: 20 68 74 6d 6c 2d 66 69 65 6c 64 20 28 66 6f 72   html-field (for
3ba0: 6d 61 74 20 22 6c 69 73 74 69 6e 67 5f 7e 61 5f  mat "listing_~a_
3bb0: 68 74 6d 6c 22 20 74 79 70 65 29 29 0a 20 20 28  html" type)).  (
3bc0: 7e 3e 20 28 66 72 6f 6d 20 28 73 75 62 71 75 65  ~> (from (subque
3bd0: 72 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ry.             
3be0: 28 7e 3e 20 28 66 72 6f 6d 20 63 61 63 68 65 3a  (~> (from cache:
3bf0: 61 72 74 69 63 6c 65 20 23 3a 61 73 20 41 29 0a  article #:as A).
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 28 73 65 6c 65 63 74 20 28 66 72 61 67 6d 65   (select (fragme
3c20: 6e 74 20 28 61 73 74 3a 61 73 20 28 61 73 74 3a  nt (ast:as (ast:
3c30: 71 75 61 6c 69 66 69 65 64 20 22 41 22 20 68 74  qualified "A" ht
3c40: 6d 6c 2d 66 69 65 6c 64 29 20 22 68 74 6d 6c 22  ml-field) "html"
3c50: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 41 2e 70 75              A.pu
3c70: 62 6c 69 73 68 65 64 0a 20 20 20 20 20 20 20 20  blished.        
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 41 2e 73 65 72 69 65 73 2d 70 61 67 65 0a 20   A.series-page. 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 20 41 2e 63 6f 6e 63 65 61          A.concea
3cc0: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l).             
3cd0: 20 20 20 20 28 75 6e 69 6f 6e 0a 20 20 20 20 20      (union.     
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 7e 3e               (~>
3cf0: 20 28 66 72 6f 6d 20 63 61 63 68 65 3a 6e 6f 74   (from cache:not
3d00: 65 20 23 3a 61 73 20 4e 29 0a 20 20 20 20 20 20  e #:as N).      
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 28 73 65 6c 65 63 74 20 28 66 72 61 67 6d 65 6e  (select (fragmen
3d30: 74 20 28 61 73 74 3a 61 73 20 28 61 73 74 3a 71  t (ast:as (ast:q
3d40: 75 61 6c 69 66 69 65 64 20 22 4e 22 20 68 74 6d  ualified "N" htm
3d50: 6c 2d 66 69 65 6c 64 29 20 22 68 74 6d 6c 22 29  l-field) "html")
3d60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 4e 2e 70 75 62 6c 69 73 68 65 64 0a 20 20 20 20  N.published.    
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 20 20 20 20 20 20 20 4e 2e 73 65 72 69            N.seri
3db0: 65 73 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  es-page.        
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 4e 2e 63 6f 6e 63 65 61 6c 29        N.conceal)
3de0: 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  )))).           
3df0: 20 23 3a 61 73 20 61 29 0a 20 20 20 20 20 20 28   #:as a).      (
3e00: 77 68 65 72 65 2d 73 65 72 69 65 73 20 73 29 0a  where-series s).
3e10: 20 20 20 20 20 20 28 77 68 65 72 65 2d 6e 6f 74        (where-not
3e20: 2d 63 6f 6e 63 65 61 6c 65 64 29 0a 20 20 20 20  -concealed).    
3e30: 20 20 28 6c 69 6d 69 74 20 2c 6c 69 6d 29 0a 20    (limit ,lim). 
3e40: 20 20 20 20 20 28 6f 72 64 65 72 2d 62 79 20 28       (order-by (
3e50: 5b 61 2e 70 75 62 6c 69 73 68 65 64 20 2c 6f 72  [a.published ,or
3e60: 64 5d 29 29 0a 20 20 20 20 20 20 28 70 72 6f 6a  d])).      (proj
3e70: 65 63 74 2d 6f 6e 74 6f 20 6c 69 73 74 69 6e 67  ect-onto listing
3e80: 2d 73 63 68 65 6d 61 29 29 29 0a 0a 3b 3b 20 47  -schema)))..;; G
3e90: 65 74 20 61 6c 6c 20 74 68 65 20 61 20 6c 69 73  et all the a lis
3ea0: 74 20 6f 66 20 74 68 65 20 48 54 4d 4c 20 61 6c  t of the HTML al
3eb0: 6c 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  l the results in
3ec0: 20 61 20 71 75 65 72 79 0a 28 64 65 66 69 6e 65   a query.(define
3ed0: 20 28 6c 69 73 74 69 6e 67 2d 68 74 6d 6c 73 20   (listing-htmls 
3ee0: 6c 69 73 74 2d 71 75 65 72 79 29 0a 20 20 28 66  list-query).  (f
3ef0: 6f 72 2f 6c 69 73 74 20 28 5b 6c 20 28 69 6e 2d  or/list ([l (in-
3f00: 65 6e 74 69 74 69 65 73 20 63 61 63 68 65 2d 63  entities cache-c
3f10: 6f 6e 6e 20 6c 69 73 74 2d 71 75 65 72 79 29 5d  onn list-query)]
3f20: 29 0a 20 20 20 20 28 6c 69 73 74 69 6e 67 2d 68  ).    (listing-h
3f30: 74 6d 6c 20 6c 29 29 29 0a 0a 3b 3b 20 52 65 74  tml l)))..;; Ret
3f40: 75 72 6e 20 63 61 63 68 65 64 20 48 54 4d 4c 20  urn cached HTML 
3f50: 6f 66 20 61 72 74 69 63 6c 65 73 20 61 6e 64 2f  of articles and/
3f60: 6f 72 20 6e 6f 74 65 73 2c 20 66 65 6e 63 65 64  or notes, fenced
3f70: 20 77 69 74 68 69 6e 20 61 20 73 74 79 6c 65 20   within a style 
3f80: 74 78 65 78 70 72 20 74 6f 20 70 72 65 76 65 6e  txexpr to preven
3f90: 74 20 69 74 20 62 65 69 6e 67 0a 3b 3b 20 65 73  t it being.;; es
3fa0: 63 61 70 65 64 20 62 79 20 2d 3e 68 74 6d 6c 2e  caped by ->html.
3fb0: 20 53 65 65 20 61 6c 73 6f 3a 20 64 65 66 69 6e   See also: defin
3fc0: 69 74 69 6f 6e 20 6f 66 20 60 75 6e 66 65 6e 63  ition of `unfenc
3fd0: 65 60 0a 0a 3b 3b 20 45 2e 67 2e 3a 20 28 3c 6c  e`..;; E.g.: (<l
3fe0: 69 73 74 69 6e 67 2d 66 75 6c 6c 3e 20 61 72 74  isting-full> art
3ff0: 69 63 6c 65 73 2b 6e 6f 74 65 73 29 0a 28 64 65  icles+notes).(de
4000: 66 69 6e 65 20 28 3c 6c 69 73 74 69 6e 67 2d 66  fine (<listing-f
4010: 75 6c 6c 3e 20 71 75 65 72 79 2d 66 75 6e 63 20  ull> query-func 
4020: 23 3a 73 65 72 69 65 73 20 5b 73 20 23 74 5d 20  #:series [s #t] 
4030: 23 3a 6c 69 6d 69 74 20 5b 6c 69 6d 20 2d 31 5d  #:limit [lim -1]
4040: 20 23 3a 6f 72 64 65 72 20 5b 6f 72 64 20 27 64   #:order [ord 'd
4050: 65 73 63 5d 29 0a 20 20 60 28 73 74 79 6c 65 20  esc]).  `(style 
4060: 2c 40 28 6c 69 73 74 69 6e 67 2d 68 74 6d 6c 73  ,@(listing-htmls
4070: 20 28 71 75 65 72 79 2d 66 75 6e 63 20 27 66 75   (query-func 'fu
4080: 6c 6c 20 23 3a 73 65 72 69 65 73 20 73 20 23 3a  ll #:series s #:
4090: 6c 69 6d 69 74 20 6c 69 6d 20 23 3a 6f 72 64 65  limit lim #:orde
40a0: 72 20 6f 72 64 29 29 29 29 0a 3b 3b 20 20 20 20  r ord)))).;;    
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 5e 5e 5e 5e 5e 0a 0a 28 64 65 66 69 6e 65 20   ^^^^^..(define 
40e0: 28 3c 6c 69 73 74 69 6e 67 2d 65 78 63 65 72 70  (<listing-excerp
40f0: 74 3e 20 71 75 65 72 79 2d 66 75 6e 63 20 23 3a  t> query-func #:
4100: 73 65 72 69 65 73 20 5b 73 20 23 74 5d 20 23 3a  series [s #t] #:
4110: 6c 69 6d 69 74 20 5b 6c 69 6d 20 2d 31 5d 20 23  limit [lim -1] #
4120: 3a 6f 72 64 65 72 20 5b 6f 72 64 20 27 64 65 73  :order [ord 'des
4130: 63 5d 29 0a 20 20 60 28 73 74 79 6c 65 20 2c 40  c]).  `(style ,@
4140: 28 6c 69 73 74 69 6e 67 2d 68 74 6d 6c 73 20 28  (listing-htmls (
4150: 71 75 65 72 79 2d 66 75 6e 63 20 27 65 78 63 65  query-func 'exce
4160: 72 70 74 20 23 3a 73 65 72 69 65 73 20 73 20 23  rpt #:series s #
4170: 3a 6c 69 6d 69 74 20 6c 69 6d 20 23 3a 6f 72 64  :limit lim #:ord
4180: 65 72 20 6f 72 64 29 29 29 29 0a 3b 3b 20 20 20  er ord)))).;;   
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 0a 0a 28 64 65 66    ^^^^^^^^..(def
41c0: 69 6e 65 20 28 3c 6c 69 73 74 69 6e 67 2d 73 68  ine (<listing-sh
41d0: 6f 72 74 3e 20 71 75 65 72 79 2d 66 75 6e 63 20  ort> query-func 
41e0: 23 3a 73 65 72 69 65 73 20 5b 73 20 23 74 5d 20  #:series [s #t] 
41f0: 23 3a 6c 69 6d 69 74 20 5b 6c 69 6d 20 2d 31 5d  #:limit [lim -1]
4200: 20 23 3a 6f 72 64 65 72 20 5b 6f 72 64 20 27 64   #:order [ord 'd
4210: 65 73 63 5d 29 0a 20 20 60 28 73 74 79 6c 65 20  esc]).  `(style 
4220: 22 3c 75 6c 20 63 6c 61 73 73 3d 5c 22 61 72 74  "<ul class=\"art
4230: 69 63 6c 65 2d 6c 69 73 74 5c 22 3e 22 0a 20 20  icle-list\">".  
4240: 20 20 20 20 20 20 20 20 2c 40 28 6c 69 73 74 69          ,@(listi
4250: 6e 67 2d 68 74 6d 6c 73 20 28 71 75 65 72 79 2d  ng-htmls (query-
4260: 66 75 6e 63 20 27 73 68 6f 72 74 20 23 3a 73 65  func 'short #:se
4270: 72 69 65 73 20 73 20 23 3a 6c 69 6d 69 74 20 6c  ries s #:limit l
4280: 69 6d 20 23 3a 6f 72 64 65 72 20 6f 72 64 29 29  im #:order ord))
4290: 0a 20 20 20 20 20 20 20 20 20 20 22 3c 2f 75 6c  .          "</ul
42a0: 3e 22 29 29 20 3b 3b 20 20 20 20 20 20 20 20 20  >")) ;;         
42b0: 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 0a 0a          ^^^^^^..
42c0: 3b 3b 20 52 65 6d 6f 76 65 20 22 3c 73 74 79 6c  ;; Remove "<styl
42d0: 65 3e 22 20 61 6e 64 20 22 3c 2f 73 74 79 6c 65  e>" and "</style
42e0: 3e 22 20 69 6e 74 72 6f 64 75 63 65 64 20 62 79  >" introduced by
42f0: 20 75 73 69 6e 67 20 2d 3e 68 74 6d 6c 20 6f 6e   using ->html on
4300: 20 64 6f 63 73 20 63 6f 6e 74 61 69 6e 69 6e 67   docs containing
4310: 20 6f 75 74 70 75 74 20 66 72 6f 6d 0a 3b 3b 20   output from.;; 
4320: 6c 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  listing function
4330: 73 0a 28 64 65 66 69 6e 65 20 28 75 6e 66 65 6e  s.(define (unfen
4340: 63 65 20 68 74 6d 6c 2d 73 74 72 29 0a 20 20 28  ce html-str).  (
4350: 72 65 67 65 78 70 2d 72 65 70 6c 61 63 65 2a 20  regexp-replace* 
4360: 23 70 78 22 3c 5b 5c 5c 2f 5d 7b 30 2c 31 7d 73  #px"<[\\/]{0,1}s
4370: 74 79 6c 65 3e 22 20 68 74 6d 6c 2d 73 74 72 20  tyle>" html-str 
4380: 22 22 29 29 0a 0a 3b 3b 20 53 61 76 65 20 74 68  ""))..;; Save th
4390: 65 20 63 75 72 72 65 6e 74 20 61 72 74 69 63 6c  e current articl
43a0: 65 20 74 6f 20 74 68 65 20 60 73 65 72 69 65 73  e to the `series
43b0: 60 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 53  ` table of the S
43c0: 51 4c 69 74 65 20 63 61 63 68 65 0a 3b 3b 20 53  QLite cache.;; S
43d0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
43e0: 66 72 6f 6d 20 61 20 74 65 6d 70 6c 61 74 65 20  from a template 
43f0: 66 6f 72 20 73 65 72 69 65 73 20 70 61 67 65 73  for series pages
4400: 0a 28 64 65 66 69 6e 65 20 28 63 61 63 68 65 2d  .(define (cache-
4410: 73 65 72 69 65 73 21 29 0a 20 20 28 64 65 66 69  series!).  (defi
4420: 6e 65 20 68 65 72 65 2d 70 61 67 65 20 28 70 61  ne here-page (pa
4430: 74 68 2d 3e 73 74 72 69 6e 67 20 28 68 65 72 65  th->string (here
4440: 2d 6f 75 74 70 75 74 2d 70 61 74 68 29 29 29 0a  -output-path))).
4450: 20 20 28 71 75 65 72 79 2d 65 78 65 63 20 63 61    (query-exec ca
4460: 63 68 65 2d 63 6f 6e 6e 0a 20 20 20 20 20 20 20  che-conn.       
4470: 20 20 20 20 20 20 20 28 64 65 6c 65 74 65 20 28         (delete (
4480: 7e 3e 20 28 66 72 6f 6d 20 63 61 63 68 65 3a 73  ~> (from cache:s
4490: 65 72 69 65 73 20 23 3a 61 73 20 73 29 0a 20 20  eries #:as s).  
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 20 20 20 20 20 20 28 77 68 65 72 65 20 28          (where (
44c0: 3d 20 73 2e 70 61 67 65 20 2c 68 65 72 65 2d 70  = s.page ,here-p
44d0: 61 67 65 29 29 29 29 29 0a 20 20 28 76 6f 69 64  age))))).  (void
44e0: 0a 20 20 20 28 69 6e 73 65 72 74 2d 6f 6e 65 21  .   (insert-one!
44f0: 20 63 61 63 68 65 2d 63 6f 6e 6e 0a 20 20 20 20   cache-conn.    
4500: 20 20 20 20 20 20 20 20 20 20 20 20 28 6d 61 6b              (mak
4510: 65 2d 63 61 63 68 65 3a 73 65 72 69 65 73 0a 20  e-cache:series. 
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 23 3a 70 61 67 65 20 28 73 74 72 69 6e 67 2d 3e  #:page (string->
4540: 73 79 6d 62 6f 6c 20 68 65 72 65 2d 70 61 67 65  symbol here-page
4550: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4560: 20 20 20 23 3a 74 69 74 6c 65 20 28 68 61 73 68     #:title (hash
4570: 2d 72 65 66 20 28 63 75 72 72 65 6e 74 2d 6d 65  -ref (current-me
4580: 74 61 73 29 20 27 74 69 74 6c 65 29 0a 20 20 20  tas) 'title).   
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 3a                #:
45a0: 70 75 62 6c 69 73 68 65 64 20 28 68 61 73 68 2d  published (hash-
45b0: 72 65 66 20 28 63 75 72 72 65 6e 74 2d 6d 65 74  ref (current-met
45c0: 61 73 29 20 27 70 75 62 6c 69 73 68 65 64 20 22  as) 'published "
45d0: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ").             
45e0: 20 20 20 20 23 3a 6e 6f 75 6e 2d 70 6c 75 72 61      #:noun-plura
45f0: 6c 20 28 68 61 73 68 2d 72 65 66 20 28 63 75 72  l (hash-ref (cur
4600: 72 65 6e 74 2d 6d 65 74 61 73 29 20 27 6e 6f 75  rent-metas) 'nou
4610: 6e 2d 70 6c 75 72 61 6c 20 22 22 29 0a 20 20 20  n-plural "").   
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 3a                #:
4630: 6e 6f 75 6e 2d 73 69 6e 67 75 6c 61 72 20 28 68  noun-singular (h
4640: 61 73 68 2d 72 65 66 20 28 63 75 72 72 65 6e 74  ash-ref (current
4650: 2d 6d 65 74 61 73 29 20 27 6e 6f 75 6e 2d 73 69  -metas) 'noun-si
4660: 6e 67 75 6c 61 72 20 22 22 29 29 29 29 29        ngular "")))))