Documentation Source Text

Hex Artifact Content
Login

Artifact b7c51b40a456e19d796bdef18cc64d8f17895ee8:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 68  #!/usr/bin/tclsh
0010: 0a 23 0a 23 20 54 68 69 73 20 73 63 72 69 70 74  .#.# This script
0020: 20 70 72 6f 63 65 73 73 65 73 20 72 61 77 20 64   processes raw d
0030: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 73 6f 75  ocumentation sou
0040: 72 63 65 20 74 65 78 74 20 69 6e 74 6f 20 69 74  rce text into it
0050: 73 20 66 69 6e 61 6c 20 66 6f 72 6d 20 0a 23 20  s final form .# 
0060: 66 6f 72 20 64 69 73 70 6c 61 79 2e 20 20 54 68  for display.  Th
0070: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 63 74  e processing act
0080: 69 6f 6e 73 20 61 72 65 20 64 65 73 63 72 69 62  ions are describ
0090: 65 64 20 62 65 6c 6f 77 2e 0a 23 0a 23 20 49 6e  ed below..#.# In
00a0: 76 6f 6b 65 20 74 68 69 73 20 63 6f 6d 6d 61 6e  voke this comman
00b0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a  d as follows:.#.
00c0: 23 20 20 20 20 20 20 20 74 63 6c 73 68 20 77 72  #       tclsh wr
00d0: 61 70 2e 74 63 6c 20 24 28 44 4f 43 29 20 24 28  ap.tcl $(DOC) $(
00e0: 53 52 43 29 20 24 28 44 45 53 54 29 20 73 6f 75  SRC) $(DEST) sou
00f0: 72 63 65 31 2e 69 6e 20 73 6f 75 72 63 65 32 2e  rce1.in source2.
0100: 69 6e 20 2e 2e 2e 0a 23 0a 23 20 54 68 65 20 24  in ....#.# The $
0110: 28 44 4f 43 29 20 61 6e 64 20 24 28 53 52 43 29  (DOC) and $(SRC)
0120: 20 76 61 6c 75 65 73 20 61 72 65 20 74 68 65 20   values are the 
0130: 6e 61 6d 65 73 20 6f 66 20 64 69 72 65 63 74 6f  names of directo
0140: 72 69 65 73 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ries containing.
0150: 23 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  # the documentat
0160: 69 6f 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 70  ion source and p
0170: 72 6f 67 72 61 6d 20 73 6f 75 72 63 65 2e 20 20  rogram source.  
0180: 24 28 44 45 53 54 29 20 69 73 20 74 68 65 20 6e  $(DEST) is the n
0190: 61 6d 65 20 6f 66 0a 23 20 6f 66 20 74 68 65 20  ame of.# of the 
01a0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
01b0: 67 65 6e 65 72 61 74 65 64 20 48 54 4d 4c 20 69  generated HTML i
01c0: 73 20 77 72 69 74 74 65 6e 2e 20 20 73 6f 75 72  s written.  sour
01d0: 63 65 4e 2e 69 6e 20 69 73 20 74 68 65 0a 23 20  ceN.in is the.# 
01e0: 69 6e 70 75 74 20 66 69 6c 65 20 74 6f 20 62 65  input file to be
01f0: 20 70 72 6f 63 65 73 73 65 64 2e 20 20 54 68 65   processed.  The
0200: 20 6f 75 74 70 75 74 20 69 73 20 73 6f 75 72 63   output is sourc
0210: 65 4e 2e 68 74 6d 6c 20 69 6e 20 74 68 65 0a 23  eN.html in the.#
0220: 20 6c 6f 63 61 6c 20 64 69 72 65 63 74 6f 72 79   local directory
0230: 2e 0a 23 0a 23 20 43 68 61 6e 67 65 73 20 6d 61  ..#.# Changes ma
0240: 64 65 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  de to the source
0250: 20 66 69 6c 65 73 3a 0a 23 0a 23 20 20 20 20 20   files:.#.#     
0260: 2a 20 20 41 6e 20 61 70 70 72 6f 70 72 69 61 74  *  An appropriat
0270: 65 20 68 65 61 64 65 72 20 69 73 20 70 72 65 70  e header is prep
0280: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
0290: 65 2e 20 20 0a 23 0a 23 20 20 20 20 20 2a 20 20  e.  .#.#     *  
02a0: 41 6e 79 20 3c 74 69 74 6c 65 3e 2e 2e 2e 3c 2f  Any <title>...</
02b0: 74 69 74 6c 65 3e 20 69 6e 20 74 68 65 20 69 6e  title> in the in
02c0: 70 75 74 20 69 73 20 6d 6f 76 65 64 20 69 6e 74  put is moved int
02d0: 6f 20 74 68 65 20 70 72 65 70 65 6e 64 65 64 0a  o the prepended.
02e0: 23 20 20 20 20 20 20 20 20 68 65 61 64 65 72 2e  #        header.
02f0: 0a 23 0a 23 20 20 20 20 20 2a 20 20 41 6e 20 61  .#.#     *  An a
0300: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 6f 74 65  ppropriate foote
0310: 72 20 69 73 20 61 70 70 65 6e 64 65 64 2e 0a 23  r is appended..#
0320: 0a 23 20 20 20 20 20 2a 20 20 53 63 72 69 70 74  .#     *  Script
0330: 73 20 77 69 74 68 69 6e 20 3c 74 63 6c 3e 2e 2e  s within <tcl>..
0340: 2e 3c 2f 74 63 6c 3e 20 61 72 65 20 65 76 61 6c  .</tcl> are eval
0350: 75 61 74 65 64 2e 20 20 4f 75 74 70 75 74 20 74  uated.  Output t
0360: 68 61 74 0a 23 20 20 20 20 20 20 20 20 69 73 20  hat.#        is 
0370: 65 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  emitted from the
0380: 73 65 20 73 63 72 69 70 74 73 20 62 79 20 22 68  se scripts by "h
0390: 64 5f 70 75 74 73 22 20 6f 72 20 22 68 64 5f 72  d_puts" or "hd_r
03a0: 65 73 6f 6c 76 65 22 0a 23 20 20 20 20 20 20 20  esolve".#       
03b0: 20 70 72 6f 63 65 64 75 72 65 73 20 61 70 70 65   procedures appe
03c0: 61 72 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ars in place of 
03d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 63 72  the original scr
03e0: 69 70 74 2e 0a 23 0a 23 20 20 20 20 20 2a 20 20  ipt..#.#     *  
03f0: 48 79 70 65 72 6c 69 6e 6b 73 20 77 69 74 68 69  Hyperlinks withi
0400: 6e 20 5b 2e 2e 2e 5d 20 61 72 65 20 72 65 73 6f  n [...] are reso
0410: 6c 76 65 64 2e 0a 23 0a 23 20 41 20 74 77 6f 2d  lved..#.# A two-
0420: 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 69  pass algorithm i
0430: 73 20 75 73 65 64 2e 20 20 54 68 65 20 66 69 72  s used.  The fir
0440: 73 74 20 70 61 73 73 20 63 6f 6c 6c 65 63 74 73  st pass collects
0450: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 23 20   the names of.# 
0460: 68 79 70 65 72 6c 69 6e 6b 20 74 61 72 67 65 74  hyperlink target
0470: 73 2c 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  s, requirements 
0480: 74 65 78 74 2c 20 61 6e 64 20 6f 74 68 65 72 20  text, and other 
0490: 67 6c 6f 62 61 6c 20 69 6e 66 6f 72 6d 61 74 69  global informati
04a0: 6f 6e 2e 0a 23 20 54 68 65 20 73 65 63 6f 6e 64  on..# The second
04b0: 20 70 61 73 73 20 75 73 65 73 20 74 68 65 20 64   pass uses the d
04c0: 61 74 61 20 67 61 74 68 65 72 65 64 20 6f 6e 20  ata gathered on 
04d0: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 20 74  the first pass t
04e0: 6f 20 67 65 6e 65 72 61 74 65 0a 23 20 74 68 65  o generate.# the
04f0: 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 2e 0a 23   final output..#
0500: 0a 73 65 74 20 44 4f 43 20 5b 6c 69 6e 64 65 78  .set DOC [lindex
0510: 20 24 61 72 67 76 20 30 5d 0a 73 65 74 20 53 52   $argv 0].set SR
0520: 43 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20  C [lindex $argv 
0530: 31 5d 0a 73 65 74 20 44 45 53 54 20 5b 6c 69 6e  1].set DEST [lin
0540: 64 65 78 20 24 61 72 67 76 20 32 5d 0a 73 65 74  dex $argv 2].set
0550: 20 48 4f 4d 45 44 49 52 20 5b 70 77 64 5d 20 20   HOMEDIR [pwd]  
0560: 20 20 20 20 20 20 20 20 20 20 3b 23 20 41 6c 73            ;# Als
0570: 6f 20 72 65 6d 65 6d 62 65 72 20 6f 75 72 20 68  o remember our h
0580: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 2e 0a 0a  ome directory...
0590: 23 20 4c 6f 61 64 20 74 68 65 20 73 79 6e 74 61  # Load the synta
05a0: 78 20 64 69 61 67 72 61 6d 20 6c 69 6e 6b 61 67  x diagram linkag
05b0: 65 20 64 61 74 61 0a 23 0a 73 6f 75 72 63 65 20  e data.#.source 
05c0: 24 44 4f 43 2f 61 72 74 2f 73 79 6e 74 61 78 2f  $DOC/art/syntax/
05d0: 73 79 6e 74 61 78 5f 6c 69 6e 6b 61 67 65 2e 74  syntax_linkage.t
05e0: 63 6c 0a 0a 0a 23 20 54 68 69 73 20 69 73 20 74  cl...# This is t
05f0: 68 65 20 66 69 72 73 74 2d 70 61 73 73 20 69 6d  he first-pass im
0600: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0610: 70 72 6f 63 65 64 75 72 65 20 74 68 61 74 20 72  procedure that r
0620: 65 6e 64 65 72 73 0a 23 20 68 79 70 65 72 6c 69  enders.# hyperli
0630: 6e 6b 73 2e 20 20 44 6f 20 6e 6f 74 20 65 76 65  nks.  Do not eve
0640: 6e 20 62 6f 74 68 65 72 20 74 72 79 69 6e 67 20  n bother trying 
0650: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 64  to do anything d
0660: 75 72 69 6e 67 20 74 68 65 0a 23 20 66 69 72 73  uring the.# firs
0670: 74 20 70 61 73 73 2e 20 20 57 65 20 68 61 76 65  t pass.  We have
0680: 20 74 6f 20 63 6f 6c 6c 65 63 74 20 6b 65 79 77   to collect keyw
0690: 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ord information 
06a0: 62 65 66 6f 72 65 20 74 68 65 0a 23 20 68 79 70  before the.# hyp
06b0: 65 72 6c 69 6e 6b 73 20 61 72 65 20 6d 65 61 6e  erlinks are mean
06c0: 69 6e 67 66 75 6c 2e 20 20 0a 23 0a 70 72 6f 63  ingful.  .#.proc
06d0: 20 68 64 5f 72 65 73 6f 6c 76 65 20 7b 74 65 78   hd_resolve {tex
06e0: 74 7d 20 7b 0a 20 20 68 64 5f 70 75 74 73 20 24  t} {.  hd_puts $
06f0: 74 65 78 74 0a 7d 0a 0a 23 20 54 68 69 73 20 69  text.}..# This i
0700: 73 20 74 68 65 20 73 65 63 6f 6e 64 2d 70 61 73  s the second-pas
0710: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
0720: 20 6f 66 20 74 68 65 20 70 72 6f 63 65 64 75 72   of the procedur
0730: 65 20 74 68 61 74 0a 23 20 72 65 6e 64 65 72 73  e that.# renders
0740: 20 68 79 70 65 72 6c 69 6e 6b 73 2e 20 20 43 6f   hyperlinks.  Co
0750: 6e 76 65 72 74 20 61 6c 6c 20 68 79 70 65 72 6c  nvert all hyperl
0760: 69 6e 6b 73 20 69 6e 20 24 74 65 78 74 20 69 6e  inks in $text in
0770: 74 6f 20 0a 23 20 61 70 70 72 6f 70 72 69 61 74  to .# appropriat
0780: 65 20 3c 61 20 68 72 65 66 3d 22 22 3e 20 6d 61  e <a href=""> ma
0790: 72 6b 75 70 2e 0a 23 0a 23 20 4c 69 6e 6b 73 20  rkup..#.# Links 
07a0: 74 6f 20 6b 65 79 77 6f 72 64 73 20 77 69 74 68  to keywords with
07b0: 69 6e 20 74 68 65 20 73 61 6d 65 20 6d 61 69 6e  in the same main
07c0: 20 66 69 6c 65 20 61 72 65 20 72 65 73 6f 6c 76   file are resolv
07d0: 65 64 20 75 73 69 6e 67 0a 23 20 24 3a 3a 6c 6c  ed using.# $::ll
07e0: 69 6e 6b 28 29 20 69 66 20 70 6f 73 73 69 62 6c  ink() if possibl
07f0: 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c 69  e.  All other li
0800: 6e 6b 73 20 61 6e 64 20 6c 69 6e 6b 73 20 74 68  nks and links th
0810: 61 74 20 63 6f 75 6c 64 0a 23 20 6e 6f 74 20 62  at could.# not b
0820: 65 20 72 65 73 6f 6c 76 65 64 20 75 73 69 6e 67  e resolved using
0830: 20 24 3a 3a 6c 6c 69 6e 6b 28 29 20 61 72 65 20   $::llink() are 
0840: 72 65 73 6f 6c 76 65 64 20 75 73 69 6e 67 20 24  resolved using $
0850: 3a 3a 67 6c 69 6e 6b 28 29 2e 0a 23 20 0a 70 72  ::glink()..# .pr
0860: 6f 63 20 68 64 5f 72 65 73 6f 6c 76 65 5f 32 6e  oc hd_resolve_2n
0870: 64 70 61 73 73 20 7b 74 65 78 74 7d 20 7b 0a 20  dpass {text} {. 
0880: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 5b   regsub -all {\[
0890: 28 2e 2a 3f 29 5c 5d 7d 20 24 74 65 78 74 20 5c  (.*?)\]} $text \
08a0: 0a 20 20 20 20 20 20 22 5c 31 37 35 3b 20 68 64  .      "\175; hd
08b0: 5f 72 65 73 6f 6c 76 65 5f 6f 6e 65 20 5c 31 37  _resolve_one \17
08c0: 33 5c 5c 31 5c 31 37 35 3b 20 68 64 5f 70 75 74  3\\1\175; hd_put
08d0: 73 20 5c 31 37 33 22 20 74 65 78 74 0a 20 20 65  s \173" text.  e
08e0: 76 61 6c 20 22 68 64 5f 70 75 74 73 20 5c 31 37  val "hd_puts \17
08f0: 33 24 74 65 78 74 5c 31 37 35 22 0a 7d 0a 70 72  3$text\175".}.pr
0900: 6f 63 20 68 64 5f 72 65 73 6f 6c 76 65 5f 6f 6e  oc hd_resolve_on
0910: 65 20 7b 78 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  e {x} {.  if {[s
0920: 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
0930: 20 24 78 5d 7d 20 7b 0a 20 20 20 20 68 64 5f 70   $x]} {.    hd_p
0940: 75 74 73 20 5c 5b 24 78 5c 5d 0a 20 20 20 20 72  uts \[$x\].    r
0950: 65 74 75 72 6e 0a 20 20 7d 0a 20 20 73 65 74 20  eturn.  }.  set 
0960: 78 32 20 5b 73 70 6c 69 74 20 24 78 20 7c 5d 0a  x2 [split $x |].
0970: 20 20 73 65 74 20 6b 77 20 5b 73 74 72 69 6e 67    set kw [string
0980: 20 74 72 69 6d 20 5b 6c 69 6e 64 65 78 20 24 78   trim [lindex $x
0990: 32 20 30 5d 5d 0a 20 20 69 66 20 7b 5b 6c 6c 65  2 0]].  if {[lle
09a0: 6e 67 74 68 20 24 78 32 5d 3d 3d 31 7d 20 7b 0a  ngth $x2]==1} {.
09b0: 20 20 20 20 73 65 74 20 63 6f 6e 74 65 6e 74 20      set content 
09c0: 24 6b 77 0a 20 20 20 20 72 65 67 73 75 62 20 7b  $kw.    regsub {
09d0: 5c 28 5b 5e 29 5d 2a 5c 29 7d 20 24 63 6f 6e 74  \([^)]*\)} $cont
09e0: 65 6e 74 20 7b 7d 20 6b 77 0a 20 20 20 20 72 65  ent {} kw.    re
09f0: 67 73 75 62 20 7b 3d 2e 2a 7d 20 24 6b 77 20 7b  gsub {=.*} $kw {
0a00: 7d 20 6b 77 0a 20 20 20 20 72 65 67 73 75 62 20  } kw.    regsub 
0a10: 2d 61 6c 6c 20 7b 5b 5e 61 2d 7a 41 2d 5a 30 2d  -all {[^a-zA-Z0-
0a20: 39 5f 2e 23 2f 20 2d 5d 7d 20 24 6b 77 20 7b 7d  9_.#/ -]} $kw {}
0a30: 20 6b 77 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   kw.  } else {. 
0a40: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b     regsub -all {
0a50: 5b 5e 61 2d 7a 41 2d 5a 30 2d 39 5f 2e 23 2f 20  [^a-zA-Z0-9_.#/ 
0a60: 2d 5d 7d 20 24 6b 77 20 7b 7d 20 6b 77 0a 20 20  -]} $kw {} kw.  
0a70: 20 20 73 65 74 20 63 6f 6e 74 65 6e 74 20 5b 73    set content [s
0a80: 74 72 69 6e 67 20 74 72 69 6d 20 5b 6c 69 6e 64  tring trim [lind
0a90: 65 78 20 24 78 32 20 31 5d 5d 0a 20 20 7d 0a 20  ex $x2 1]].  }. 
0aa0: 20 67 6c 6f 62 61 6c 20 68 64 20 6c 6c 69 6e 6b   global hd llink
0ab0: 20 67 6c 69 6e 6b 20 62 61 63 6b 6c 69 6e 6b 0a   glink backlink.
0ac0: 20 20 69 66 20 7b 24 68 64 28 65 6e 61 62 6c 65    if {$hd(enable
0ad0: 2d 6d 61 69 6e 29 7d 20 7b 0a 20 20 20 20 73 65  -main)} {.    se
0ae0: 74 20 66 6e 20 24 68 64 28 66 6e 2d 6d 61 69 6e  t fn $hd(fn-main
0af0: 29 0a 20 20 20 20 69 66 20 7b 24 68 64 28 66 72  ).    if {$hd(fr
0b00: 61 67 6d 65 6e 74 29 21 3d 22 22 7d 20 7b 0a 20  agment)!=""} {. 
0b10: 20 20 20 20 20 73 65 74 20 73 72 63 75 72 6c 20       set srcurl 
0b20: 24 66 6e 23 24 68 64 28 66 72 61 67 6d 65 6e 74  $fn#$hd(fragment
0b30: 29 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ).    } else {. 
0b40: 20 20 20 20 20 73 65 74 20 73 72 63 75 72 6c 20       set srcurl 
0b50: 24 66 6e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  $fn.    }.    if
0b60: 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5b 54 74 5d   {[regexp {^[Tt]
0b70: 69 63 6b 65 74 20 23 28 5c 64 2b 29 24 7d 20 24  icket #(\d+)$} $
0b80: 6b 77 20 61 6c 6c 20 74 6b 74 69 64 5d 7d 20 7b  kw all tktid]} {
0b90: 0a 20 20 20 20 20 20 73 65 74 20 75 72 6c 20 68  .      set url h
0ba0: 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
0bb0: 2e 6f 72 67 2f 63 76 73 74 72 61 63 2f 74 6b 74  .org/cvstrac/tkt
0bc0: 76 69 65 77 3f 74 6e 3d 24 74 6b 74 69 64 0a 20  view?tn=$tktid. 
0bd0: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
0be0: 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e 29 20 5c  line $hd(main) \
0bf0: 0a 20 20 20 20 20 20 20 20 22 3c 61 20 68 72 65  .        "<a hre
0c00: 66 3d 5c 22 24 75 72 6c 5c 22 3e 24 63 6f 6e 74  f=\"$url\">$cont
0c10: 65 6e 74 3c 2f 61 3e 22 0a 20 20 20 20 7d 20 65  ent</a>".    } e
0c20: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
0c30: 73 74 73 20 6c 6c 69 6e 6b 28 24 66 6e 3a 24 6b  sts llink($fn:$k
0c40: 77 29 5d 7d 20 7b 0a 20 20 20 20 20 20 70 75 74  w)]} {.      put
0c50: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64  s -nonewline $hd
0c60: 28 6d 61 69 6e 29 20 5c 0a 20 20 20 20 20 20 20  (main) \.       
0c70: 20 22 3c 61 20 68 72 65 66 3d 5c 22 24 68 64 28   "<a href=\"$hd(
0c80: 72 6f 6f 74 70 61 74 68 2d 6d 61 69 6e 29 24 6c  rootpath-main)$l
0c90: 6c 69 6e 6b 28 24 66 6e 3a 24 6b 77 29 5c 22 3e  link($fn:$kw)\">
0ca0: 24 63 6f 6e 74 65 6e 74 3c 2f 61 3e 22 0a 20 20  $content</a>".  
0cb0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
0cc0: 6f 20 65 78 69 73 74 73 20 67 6c 69 6e 6b 28 24  o exists glink($
0cd0: 6b 77 29 5d 7d 20 7b 0a 20 20 20 20 20 20 70 75  kw)]} {.      pu
0ce0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68  ts -nonewline $h
0cf0: 64 28 6d 61 69 6e 29 20 5c 0a 20 20 20 20 20 20  d(main) \.      
0d00: 20 20 22 3c 61 20 68 72 65 66 3d 5c 22 24 68 64    "<a href=\"$hd
0d10: 28 72 6f 6f 74 70 61 74 68 2d 6d 61 69 6e 29 24  (rootpath-main)$
0d20: 67 6c 69 6e 6b 28 24 6b 77 29 5c 22 3e 24 63 6f  glink($kw)\">$co
0d30: 6e 74 65 6e 74 3c 2f 61 3e 22 0a 20 20 20 20 7d  ntent</a>".    }
0d40: 20 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70   elseif {[regexp
0d50: 20 7b 5c 2e 67 69 66 24 7d 20 24 6b 77 5d 7d 20   {\.gif$} $kw]} 
0d60: 7b 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f  {.      puts -no
0d70: 6e 65 77 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e  newline $hd(main
0d80: 29 20 5c 0a 20 20 20 20 20 20 20 20 22 3c 69 6d  ) \.        "<im
0d90: 67 20 73 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74  g src=\"$hd(root
0da0: 70 61 74 68 2d 6d 61 69 6e 29 69 6d 61 67 65 73  path-main)images
0db0: 2f 24 6b 77 5c 22 3e 22 0a 20 20 20 20 7d 20 65  /$kw\">".    } e
0dc0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 75 74 73  lse {.      puts
0dd0: 20 73 74 64 65 72 72 20 22 45 52 52 4f 52 3a 20   stderr "ERROR: 
0de0: 75 6e 6b 6e 6f 77 6e 20 68 79 70 65 72 6c 69 6e  unknown hyperlin
0df0: 6b 20 74 61 72 67 65 74 3a 20 24 6b 77 22 0a 20  k target: $kw". 
0e00: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
0e10: 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e 29 20 22  line $hd(main) "
0e20: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 72 65  <font color=\"re
0e30: 64 5c 22 3e 24 63 6f 6e 74 65 6e 74 3c 2f 66 6f  d\">$content</fo
0e40: 6e 74 3e 22 0a 20 20 20 20 7d 0a 20 20 20 20 6c  nt>".    }.    l
0e50: 61 70 70 65 6e 64 20 62 61 63 6b 6c 69 6e 6b 28  append backlink(
0e60: 24 6b 77 29 20 24 73 72 63 75 72 6c 0a 20 20 7d  $kw) $srcurl.  }
0e70: 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61 62 6c  .  if {$hd(enabl
0e80: 65 2d 61 75 78 29 7d 20 7b 0a 20 20 20 20 69 66  e-aux)} {.    if
0e90: 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5b 54 74 5d   {[regexp {^[Tt]
0ea0: 69 63 6b 65 74 20 23 28 5c 64 2b 29 24 7d 20 24  icket #(\d+)$} $
0eb0: 6b 77 20 61 6c 6c 20 74 6b 74 69 64 5d 7d 20 7b  kw all tktid]} {
0ec0: 0a 20 20 20 20 20 20 73 65 74 20 75 72 6c 20 68  .      set url h
0ed0: 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
0ee0: 2e 6f 72 67 2f 63 76 73 74 72 61 63 2f 74 6b 74  .org/cvstrac/tkt
0ef0: 76 69 65 77 3f 74 6e 3d 24 74 6b 74 69 64 0a 20  view?tn=$tktid. 
0f00: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
0f10: 6c 69 6e 65 20 24 68 64 28 61 75 78 29 20 5c 0a  line $hd(aux) \.
0f20: 20 20 20 20 20 20 20 20 22 3c 61 20 68 72 65 66          "<a href
0f30: 3d 5c 22 24 75 72 6c 5c 22 3e 24 63 6f 6e 74 65  =\"$url\">$conte
0f40: 6e 74 3c 2f 61 3e 22 0a 20 20 20 20 7d 20 65 6c  nt</a>".    } el
0f50: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
0f60: 74 73 20 67 6c 69 6e 6b 28 24 6b 77 29 5d 7d 20  ts glink($kw)]} 
0f70: 7b 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f  {.      puts -no
0f80: 6e 65 77 6c 69 6e 65 20 24 68 64 28 61 75 78 29  newline $hd(aux)
0f90: 20 5c 0a 20 20 20 20 20 20 20 20 22 3c 61 20 68   \.        "<a h
0fa0: 72 65 66 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61  ref=\"$hd(rootpa
0fb0: 74 68 2d 61 75 78 29 24 67 6c 69 6e 6b 28 24 6b  th-aux)$glink($k
0fc0: 77 29 5c 22 3e 24 63 6f 6e 74 65 6e 74 3c 2f 61  w)\">$content</a
0fd0: 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20  >".    } elseif 
0fe0: 7b 5b 72 65 67 65 78 70 20 7b 5c 2e 67 69 66 24  {[regexp {\.gif$
0ff0: 7d 20 24 6b 77 5d 7d 20 7b 0a 20 20 20 20 20 20  } $kw]} {.      
1000: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1010: 24 68 64 28 6d 61 69 6e 29 20 5c 0a 20 20 20 20  $hd(main) \.    
1020: 20 20 20 20 22 3c 69 6d 67 20 73 72 63 3d 5c 22      "<img src=\"
1030: 24 68 64 28 72 6f 6f 74 70 61 74 68 2d 61 75 78  $hd(rootpath-aux
1040: 29 69 6d 61 67 65 73 2f 24 6b 77 5c 22 3e 22 0a  )images/$kw\">".
1050: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1060: 20 20 20 70 75 74 73 20 73 74 64 65 72 72 20 22     puts stderr "
1070: 45 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 68  ERROR: unknown h
1080: 79 70 65 72 6c 69 6e 6b 20 74 61 72 67 65 74 3a  yperlink target:
1090: 20 24 6b 77 22 0a 20 20 20 20 20 20 70 75 74 73   $kw".      puts
10a0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64 28   -nonewline $hd(
10b0: 61 75 78 29 20 22 3c 66 6f 6e 74 20 63 6f 6c 6f  aux) "<font colo
10c0: 72 3d 5c 22 72 65 64 5c 22 3e 24 63 6f 6e 74 65  r=\"red\">$conte
10d0: 6e 74 3c 2f 66 6f 6e 74 3e 22 0a 20 20 20 20 7d  nt</font>".    }
10e0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 62 61 63  .    lappend bac
10f0: 6b 6c 69 6e 6b 28 24 6b 77 29 20 24 68 64 28 66  klink($kw) $hd(f
1100: 6e 2d 61 75 78 29 0a 20 20 7d 0a 7d 0a 0a 0a 0a  n-aux).  }.}....
1110: 23 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  # Record the fac
1120: 74 20 74 68 61 74 20 61 6c 6c 20 6b 65 79 77 6f  t that all keywo
1130: 72 64 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65  rds given in the
1140: 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 73   argument list s
1150: 68 6f 75 6c 64 0a 23 20 63 61 75 73 65 20 61 20  hould.# cause a 
1160: 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 75 72 72  jump to the curr
1170: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
1180: 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65  the current file
1190: 2e 0a 23 0a 23 20 49 66 20 6f 6e 6c 79 20 74 68  ..#.# If only th
11a0: 65 20 6d 61 69 6e 20 6f 75 74 70 75 74 20 66 69  e main output fi
11b0: 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e  le is open, then
11c0: 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
11d0: 74 6f 20 74 68 65 0a 23 20 6b 65 79 77 6f 72 64  to the.# keyword
11e0: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6d 61 69   jump to the mai
11f0: 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
1200: 49 66 20 62 6f 74 68 20 6d 61 69 6e 20 61 6e 64  If both main and
1210: 20 61 75 78 20 61 72 65 0a 23 20 6f 70 65 6e 20   aux are.# open 
1220: 74 68 65 6e 20 72 65 66 65 72 65 6e 63 65 73 20  then references 
1230: 69 6e 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  in the main file
1240: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6d 61 69   jump to the mai
1250: 6e 20 66 69 6c 65 20 61 6e 64 20 61 6c 6c 0a 23  n file and all.#
1260: 20 6f 74 68 65 72 20 72 65 66 65 72 65 6e 63 65   other reference
1270: 73 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 75  s jump to the au
1280: 78 69 6c 69 61 72 79 20 66 69 6c 65 2e 0a 23 0a  xiliary file..#.
1290: 23 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  # This procedure
12a0: 20 69 73 20 6f 6e 6c 79 20 61 63 74 69 76 65 20   is only active 
12b0: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
12c0: 20 70 61 73 73 20 77 68 65 6e 20 77 65 20 61 72   pass when we ar
12d0: 65 0a 23 20 63 6f 6c 6c 65 63 74 69 6e 67 20 68  e.# collecting h
12e0: 79 70 65 72 6c 69 6e 6b 20 69 6e 66 6f 72 6d 61  yperlink informa
12f0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 70 72 6f 63  tion.  This proc
1300: 65 64 75 72 65 20 69 73 20 72 65 64 65 66 69 6e  edure is redefin
1310: 65 64 20 74 6f 0a 23 20 62 65 20 61 20 6e 6f 2d  ed to.# be a no-
1320: 6f 70 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  op before the st
1330: 61 72 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  art of the secon
1340: 64 20 70 61 73 73 2e 0a 23 0a 70 72 6f 63 20 68  d pass..#.proc h
1350: 64 5f 6b 65 79 77 6f 72 64 73 20 7b 61 72 67 73  d_keywords {args
1360: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 67 6c 69  } {.  global gli
1370: 6e 6b 20 6c 6c 69 6e 6b 20 68 64 0a 20 20 69 66  nk llink hd.  if
1380: 20 7b 24 68 64 28 66 72 61 67 6d 65 6e 74 29 3d   {$hd(fragment)=
1390: 3d 22 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 6c  =""} {.    set l
13a0: 75 72 6c 20 24 68 64 28 66 6e 2d 6d 61 69 6e 29  url $hd(fn-main)
13b0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
13c0: 73 65 74 20 6c 75 72 6c 20 22 23 24 68 64 28 66  set lurl "#$hd(f
13d0: 72 61 67 6d 65 6e 74 29 22 0a 20 20 7d 0a 20 20  ragment)".  }.  
13e0: 73 65 74 20 66 6e 20 24 68 64 28 66 6e 2d 6d 61  set fn $hd(fn-ma
13f0: 69 6e 29 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20  in).  if {[info 
1400: 65 78 69 73 74 73 20 68 64 28 61 75 78 29 5d 7d  exists hd(aux)]}
1410: 20 7b 0a 20 20 20 20 73 65 74 20 67 75 72 6c 20   {.    set gurl 
1420: 24 68 64 28 66 6e 2d 61 75 78 29 0a 20 20 7d 20  $hd(fn-aux).  } 
1430: 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 67  else {.    set g
1440: 75 72 6c 20 7b 7d 0a 20 20 20 20 69 66 20 7b 24  url {}.    if {$
1450: 68 64 28 66 72 61 67 6d 65 6e 74 29 21 3d 22 22  hd(fragment)!=""
1460: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6c 75  } {.      set lu
1470: 72 6c 20 24 68 64 28 66 6e 2d 6d 61 69 6e 29 23  rl $hd(fn-main)#
1480: 24 68 64 28 66 72 61 67 6d 65 6e 74 29 0a 20 20  $hd(fragment).  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 65 61 63    }.  }.  foreac
14a0: 68 20 61 20 24 61 72 67 73 20 7b 0a 20 20 20 20  h a $args {.    
14b0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
14c0: 20 67 6c 69 6e 6b 28 24 61 29 5d 7d 20 7b 0a 20   glink($a)]} {. 
14d0: 20 20 20 20 20 70 75 74 73 20 73 74 64 65 72 72       puts stderr
14e0: 20 22 57 41 52 4e 49 4e 47 3a 20 64 75 70 6c 69   "WARNING: dupli
14f0: 63 61 74 65 20 6b 65 79 77 6f 72 64 20 5c 22 24  cate keyword \"$
1500: 61 5c 22 20 2d 20 24 67 6c 69 6e 6b 28 24 61 29  a\" - $glink($a)
1510: 20 61 6e 64 20 24 6c 75 72 6c 22 0a 20 20 20 20   and $lurl".    
1520: 7d 0a 20 20 20 20 69 66 20 7b 24 67 75 72 6c 3d  }.    if {$gurl=
1530: 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  =""} {.      set
1540: 20 67 6c 69 6e 6b 28 24 61 29 20 24 6c 75 72 6c   glink($a) $lurl
1550: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1560: 20 20 20 20 73 65 74 20 67 6c 69 6e 6b 28 24 61      set glink($a
1570: 29 20 24 67 75 72 6c 0a 20 20 20 20 20 20 73 65  ) $gurl.      se
1580: 74 20 6c 6c 69 6e 6b 28 24 66 6e 3a 24 61 29 20  t llink($fn:$a) 
1590: 24 6c 75 72 6c 0a 20 20 20 20 7d 0a 20 20 7d 0a  $lurl.    }.  }.
15a0: 7d 0a 0a 23 20 53 74 61 72 74 20 61 20 6e 65 77  }..# Start a new
15b0: 20 66 72 61 67 6d 65 6e 74 20 69 6e 20 74 68 65   fragment in the
15c0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 20 47 69 76   main file.  Giv
15d0: 65 20 74 68 65 20 6e 65 77 20 66 72 61 67 6d 65  e the new fragme
15e0: 6e 74 20 74 68 65 0a 23 20 69 6e 64 69 63 61 74  nt the.# indicat
15f0: 65 64 20 6e 61 6d 65 2e 20 20 41 6e 79 20 6b 65  ed name.  Any ke
1600: 79 77 6f 72 64 73 20 64 65 66 69 6e 65 64 20 61  ywords defined a
1610: 66 74 65 72 20 74 68 69 73 20 70 6f 69 6e 74 20  fter this point 
1620: 77 69 6c 6c 20 72 65 66 65 72 0a 23 20 74 6f 20  will refer.# to 
1630: 74 68 65 20 66 72 61 67 6d 65 6e 74 2c 20 6e 6f  the fragment, no
1640: 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  t to the beginni
1650: 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ng of the file..
1660: 23 0a 23 20 4f 6e 6c 79 20 74 68 65 20 6d 61 69  #.# Only the mai
1670: 6e 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20  n file may have 
1680: 66 72 61 67 6d 65 6e 74 73 2e 20 20 41 75 78 69  fragments.  Auxi
1690: 6c 69 61 72 79 20 66 69 6c 65 73 20 61 72 65 20  liary files are 
16a0: 61 73 73 75 6d 65 64 0a 23 20 74 6f 20 62 65 20  assumed.# to be 
16b0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
16c0: 74 20 66 72 61 67 6d 65 6e 74 73 20 61 72 65 20  t fragments are 
16d0: 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 23 0a 70  not helpful..#.p
16e0: 72 6f 63 20 68 64 5f 66 72 61 67 6d 65 6e 74 20  roc hd_fragment 
16f0: 7b 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  {name args} {.  
1700: 67 6c 6f 62 61 6c 20 68 64 0a 20 20 73 65 74 20  global hd.  set 
1710: 68 64 28 66 72 61 67 6d 65 6e 74 29 20 24 6e 61  hd(fragment) $na
1720: 6d 65 0a 20 20 70 75 74 73 20 24 68 64 28 6d 61  me.  puts $hd(ma
1730: 69 6e 29 20 22 3c 61 20 6e 61 6d 65 3d 5c 22 24  in) "<a name=\"$
1740: 6e 61 6d 65 5c 22 3e 3c 2f 61 3e 22 0a 20 20 65  name\"></a>".  e
1750: 76 61 6c 20 68 64 5f 6b 65 79 77 6f 72 64 73 20  val hd_keywords 
1760: 24 61 72 67 73 0a 7d 0a 0a 23 20 57 72 69 74 65  $args.}..# Write
1770: 20 72 61 77 20 6f 75 74 70 75 74 20 74 6f 20 62   raw output to b
1780: 6f 74 68 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  oth the main fil
1790: 65 20 61 6e 64 20 74 68 65 20 61 75 78 69 6c 69  e and the auxili
17a0: 61 72 79 2e 20 20 4f 6e 6c 79 20 77 72 69 74 65  ary.  Only write
17b0: 0a 23 20 74 6f 20 66 69 6c 65 73 20 74 68 61 74  .# to files that
17c0: 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 0a 23 0a   are enabled..#.
17d0: 70 72 6f 63 20 68 64 5f 70 75 74 73 20 7b 74 65  proc hd_puts {te
17e0: 78 74 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 68  xt} {.  global h
17f0: 64 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61 62  d.  if {$hd(enab
1800: 6c 65 2d 6d 61 69 6e 29 7d 20 7b 0a 20 20 20 20  le-main)} {.    
1810: 73 65 74 20 66 6e 20 24 68 64 28 66 6e 2d 6d 61  set fn $hd(fn-ma
1820: 69 6e 29 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f  in).    puts -no
1830: 6e 65 77 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e  newline $hd(main
1840: 29 20 24 74 65 78 74 0a 20 20 7d 0a 20 20 69 66  ) $text.  }.  if
1850: 20 7b 24 68 64 28 65 6e 61 62 6c 65 2d 61 75 78   {$hd(enable-aux
1860: 29 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 6e 20  )} {.    set fn 
1870: 24 68 64 28 66 6e 2d 61 75 78 29 0a 20 20 20 20  $hd(fn-aux).    
1880: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1890: 24 68 64 28 61 75 78 29 20 24 74 65 78 74 0a 20  $hd(aux) $text. 
18a0: 20 7d 0a 20 20 0a 20 20 23 20 4f 75 72 20 70 61   }.  .  # Our pa
18b0: 67 65 6c 69 6e 6b 20 70 72 6f 63 65 73 73 69 6e  gelink processin
18c0: 67 20 62 61 73 65 64 20 6f 66 66 20 74 68 65 20  g based off the 
18d0: 67 6c 6f 62 61 6c 73 0a 20 20 23 20 6c 6c 69 6e  globals.  # llin
18e0: 6b 2c 20 67 6c 69 6e 6b 2c 20 61 6e 64 20 62 61  k, glink, and ba
18f0: 63 6b 6c 69 6e 6b 20 67 65 6e 65 72 61 74 65 64  cklink generated
1900: 20 64 75 72 69 6e 67 20 68 64 5f 72 65 73 6f 6c   during hd_resol
1910: 76 65 0a 20 20 23 20 70 72 6f 63 65 73 73 69 6e  ve.  # processin
1920: 67 20 64 6f 65 73 6e 27 74 20 63 61 74 63 68 20  g doesn't catch 
1930: 6c 69 6e 6b 73 20 6f 75 74 70 75 74 74 65 64 20  links outputted 
1940: 64 69 72 65 63 74 6c 79 0a 20 20 23 20 77 69 74  directly.  # wit
1950: 68 20 68 64 5f 70 75 74 73 2e 20 20 54 68 69 73  h hd_puts.  This
1960: 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 20 74   code attempts t
1970: 6f 20 61 64 64 20 74 68 6f 73 65 20 6c 69 6e 6b  o add those link
1980: 73 20 74 6f 0a 20 20 23 20 6f 75 72 20 70 61 67  s to.  # our pag
1990: 65 6c 69 6e 6b 20 61 72 72 61 79 2e 0a 20 20 67  elink array..  g
19a0: 6c 6f 62 61 6c 20 70 61 67 65 6c 69 6e 6b 0a 20  lobal pagelink. 
19b0: 20 73 65 74 20 72 65 66 73 20 5b 72 65 67 65 78   set refs [regex
19c0: 70 20 2d 61 6c 6c 20 2d 69 6e 6c 69 6e 65 20 7b  p -all -inline {
19d0: 68 72 65 66 3d 5c 22 28 2e 2a 3f 29 5c 22 7d 20  href=\"(.*?)\"} 
19e0: 24 74 65 78 74 5d 0a 20 20 66 6f 72 65 61 63 68  $text].  foreach
19f0: 20 7b 68 72 65 66 20 72 65 66 7d 20 24 72 65 66   {href ref} $ref
1a00: 73 20 7b 0a 20 20 20 20 72 65 67 73 75 62 20 7b  s {.    regsub {
1a10: 23 2e 2a 7d 20 24 72 65 66 20 7b 7d 20 72 65 66  #.*} $ref {} ref
1a20: 32 0a 20 20 20 20 72 65 67 73 75 62 20 7b 68 74  2.    regsub {ht
1a30: 74 70 3a 5c 2f 5c 2f 77 77 77 5c 2e 73 71 6c 69  tp:\/\/www\.sqli
1a40: 74 65 5c 2e 6f 72 67 5c 2f 7d 20 24 72 65 66 32  te\.org\/} $ref2
1a50: 20 7b 7d 20 72 65 66 33 0a 20 20 20 20 72 65 67   {} ref3.    reg
1a60: 73 75 62 20 7b 5c 2e 5c 2e 5c 2f 7d 20 24 72 65  sub {\.\.\/} $re
1a70: 66 33 20 7b 7d 20 72 65 66 34 0a 20 20 20 20 69  f3 {} ref4.    i
1a80: 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 68 74 74  f {[regexp {^htt
1a90: 70 7d 20 24 72 65 66 34 5d 7d 20 63 6f 6e 74 69  p} $ref4]} conti
1aa0: 6e 75 65 0a 20 20 20 20 69 66 20 7b 24 72 65 66  nue.    if {$ref
1ab0: 34 3d 3d 22 22 7d 20 63 6f 6e 74 69 6e 75 65 0a  4==""} continue.
1ac0: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
1ad0: 7b 5c 2e 68 74 6d 6c 24 7d 20 24 72 65 66 34 5d  {\.html$} $ref4]
1ae0: 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  } {.      lappen
1af0: 64 20 70 61 67 65 6c 69 6e 6b 28 24 72 65 66 34  d pagelink($ref4
1b00: 29 20 24 66 6e 0a 20 20 20 20 7d 0a 20 20 7d 0a  ) $fn.    }.  }.
1b10: 7d 0a 70 72 6f 63 20 68 64 5f 70 75 74 73 6e 6c  }.proc hd_putsnl
1b20: 20 7b 74 65 78 74 7d 20 7b 0a 20 20 68 64 5f 70   {text} {.  hd_p
1b30: 75 74 73 20 24 74 65 78 74 5c 6e 0a 7d 0a 0a 23  uts $text\n.}..#
1b40: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1b50: 6c 65 20 74 68 65 20 6d 61 69 6e 20 6f 75 74 70  le the main outp
1b60: 75 74 20 66 69 6c 65 2e 0a 23 0a 70 72 6f 63 20  ut file..#.proc 
1b70: 68 64 5f 65 6e 61 62 6c 65 5f 6d 61 69 6e 20 7b  hd_enable_main {
1b80: 62 6f 6f 6c 65 61 6e 7d 20 7b 0a 20 20 67 6c 6f  boolean} {.  glo
1b90: 62 61 6c 20 68 64 0a 20 20 73 65 74 20 68 64 28  bal hd.  set hd(
1ba0: 65 6e 61 62 6c 65 2d 6d 61 69 6e 29 20 24 62 6f  enable-main) $bo
1bb0: 6f 6c 65 61 6e 0a 7d 0a 0a 23 20 45 6e 61 62 6c  olean.}..# Enabl
1bc0: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
1bd0: 20 61 75 78 69 6c 69 61 72 79 20 6f 75 74 70 75   auxiliary outpu
1be0: 74 20 66 69 6c 65 2e 0a 23 0a 70 72 6f 63 20 68  t file..#.proc h
1bf0: 64 5f 65 6e 61 62 6c 65 5f 61 75 78 20 7b 62 6f  d_enable_aux {bo
1c00: 6f 6c 65 61 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61  olean} {.  globa
1c10: 6c 20 68 64 0a 20 20 73 65 74 20 68 64 28 65 6e  l hd.  set hd(en
1c20: 61 62 6c 65 2d 61 75 78 29 20 24 62 6f 6f 6c 65  able-aux) $boole
1c30: 61 6e 0a 7d 0a 73 65 74 20 68 64 28 65 6e 61 62  an.}.set hd(enab
1c40: 6c 65 2d 61 75 78 29 20 30 0a 0a 23 20 4f 70 65  le-aux) 0..# Ope
1c50: 6e 20 74 68 65 20 6d 61 69 6e 20 6f 75 74 70 75  n the main outpu
1c60: 74 20 66 69 6c 65 2e 20 20 24 66 69 6c 65 6e 61  t file.  $filena
1c70: 6d 65 20 69 73 20 72 65 6c 61 74 69 76 65 20 74  me is relative t
1c80: 6f 20 24 3a 3a 44 45 53 54 2e 20 20 0a 23 0a 70  o $::DEST.  .#.p
1c90: 72 6f 63 20 68 64 5f 6f 70 65 6e 5f 6d 61 69 6e  roc hd_open_main
1ca0: 20 7b 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20   {filename} {.  
1cb0: 67 6c 6f 62 61 6c 20 68 64 20 44 45 53 54 0a 20  global hd DEST. 
1cc0: 20 68 64 5f 63 6c 6f 73 65 5f 6d 61 69 6e 0a 20   hd_close_main. 
1cd0: 20 73 65 74 20 68 64 28 66 6e 2d 6d 61 69 6e 29   set hd(fn-main)
1ce0: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 73 65 74   $filename.  set
1cf0: 20 68 64 28 72 6f 6f 74 70 61 74 68 2d 6d 61 69   hd(rootpath-mai
1d00: 6e 29 20 5b 68 64 5f 72 6f 6f 74 70 61 74 68 20  n) [hd_rootpath 
1d10: 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 73 65 74  $filename].  set
1d20: 20 68 64 28 6d 61 69 6e 29 20 5b 6f 70 65 6e 20   hd(main) [open 
1d30: 24 44 45 53 54 2f 24 66 69 6c 65 6e 61 6d 65 20  $DEST/$filename 
1d40: 77 5d 0a 20 20 73 65 74 20 68 64 28 65 6e 61 62  w].  set hd(enab
1d50: 6c 65 2d 6d 61 69 6e 29 20 31 0a 20 20 73 65 74  le-main) 1.  set
1d60: 20 68 64 28 66 72 61 67 6d 65 6e 74 29 20 7b 7d   hd(fragment) {}
1d70: 0a 20 20 67 6c 6f 62 61 6c 20 70 61 67 65 6c 69  .  global pageli
1d80: 6e 6b 0a 20 20 6c 61 70 70 65 6e 64 20 70 61 67  nk.  lappend pag
1d90: 65 6c 69 6e 6b 28 24 66 69 6c 65 6e 61 6d 65 29  elink($filename)
1da0: 20 24 66 69 6c 65 6e 61 6d 65 0a 7d 0a 0a 23 20   $filename.}..# 
1db0: 49 66 20 24 66 69 6c 65 6e 61 6d 65 20 69 73 20  If $filename is 
1dc0: 61 20 70 61 74 68 20 66 72 6f 6d 20 24 3a 3a 44  a path from $::D
1dd0: 45 53 54 20 74 6f 20 61 20 66 69 6c 65 2c 20 72  EST to a file, r
1de0: 65 74 75 72 6e 20 61 20 70 61 74 68 0a 23 20 66  eturn a path.# f
1df0: 72 6f 6d 20 74 68 65 20 64 69 72 65 63 74 6f 72  rom the director
1e00: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 24 66 69  y containing $fi
1e10: 6c 65 6e 61 6d 65 20 62 61 63 6b 20 74 6f 20 74  lename back to t
1e20: 68 65 20 64 69 72 65 63 74 6f 72 79 20 24 3a 3a  he directory $::
1e30: 44 45 53 54 2e 0a 23 0a 70 72 6f 63 20 68 64 5f  DEST..#.proc hd_
1e40: 72 6f 6f 74 70 61 74 68 20 7b 66 69 6c 65 6e 61  rootpath {filena
1e50: 6d 65 7d 20 7b 0a 20 20 73 65 74 20 75 70 20 7b  me} {.  set up {
1e60: 7d 0a 20 20 73 65 74 20 6e 20 5b 6c 6c 65 6e 67  }.  set n [lleng
1e70: 74 68 20 5b 73 70 6c 69 74 20 24 66 69 6c 65 6e  th [split $filen
1e80: 61 6d 65 20 2f 5d 5d 0a 20 20 69 66 20 7b 24 6e  ame /]].  if {$n
1e90: 3c 3d 31 7d 20 7b 0a 20 20 20 20 72 65 74 75 72  <=1} {.    retur
1ea0: 6e 20 7b 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n {}.  } else {.
1eb0: 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69      return [stri
1ec0: 6e 67 20 72 65 70 65 61 74 20 2e 2e 2f 20 5b 65  ng repeat ../ [e
1ed0: 78 70 72 20 7b 24 6e 2d 31 7d 5d 5d 0a 20 20 7d  xpr {$n-1}]].  }
1ee0: 0a 7d 0a 0a 23 20 43 6c 6f 73 65 20 74 68 65 20  .}..# Close the 
1ef0: 6d 61 69 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  main output file
1f00: 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 63 6c 6f 73  ..#.proc hd_clos
1f10: 65 5f 6d 61 69 6e 20 7b 7d 20 7b 0a 20 20 67 6c  e_main {} {.  gl
1f20: 6f 62 61 6c 20 68 64 0a 20 20 68 64 5f 63 6c 6f  obal hd.  hd_clo
1f30: 73 65 5f 61 75 78 0a 20 20 69 66 20 7b 5b 69 6e  se_aux.  if {[in
1f40: 66 6f 20 65 78 69 73 74 73 20 68 64 28 6d 61 69  fo exists hd(mai
1f50: 6e 29 5d 7d 20 7b 0a 20 20 20 20 70 75 74 73 20  n)]} {.    puts 
1f60: 24 68 64 28 6d 61 69 6e 29 20 24 68 64 28 66 6f  $hd(main) $hd(fo
1f70: 6f 74 65 72 29 0a 20 20 20 20 63 6c 6f 73 65 20  oter).    close 
1f80: 24 68 64 28 6d 61 69 6e 29 0a 20 20 20 20 75 6e  $hd(main).    un
1f90: 73 65 74 20 68 64 28 6d 61 69 6e 29 0a 20 20 7d  set hd(main).  }
1fa0: 0a 7d 0a 0a 23 20 4f 70 65 6e 20 74 68 65 20 61  .}..# Open the a
1fb0: 75 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20  uxiliary output 
1fc0: 66 69 6c 65 2e 0a 23 0a 23 20 4d 6f 73 74 20 64  file..#.# Most d
1fd0: 6f 63 75 6d 65 6e 74 73 20 68 61 76 65 20 6f 6e  ocuments have on
1fe0: 6c 79 20 61 20 6d 61 69 6e 20 66 69 6c 65 20 61  ly a main file a
1ff0: 6e 64 20 6e 6f 20 61 75 78 69 6c 69 61 72 79 2e  nd no auxiliary.
2000: 20 20 48 6f 77 65 76 65 72 2c 20 73 6f 6d 65 0a    However, some.
2010: 23 20 6c 61 72 67 65 20 64 6f 63 75 6d 65 6e 74  # large document
2020: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 75 70 20  s are broken up 
2030: 69 6e 74 6f 20 73 6d 61 6c 6c 65 72 20 70 69 65  into smaller pie
2040: 63 65 73 20 77 68 65 72 65 20 65 61 63 68 20 73  ces where each s
2050: 6d 61 6c 6c 65 72 20 70 69 65 63 65 0a 23 20 69  maller piece.# i
2060: 73 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 66  s an auxiliary f
2070: 69 6c 65 2e 20 20 54 68 65 72 65 20 77 69 6c 6c  ile.  There will
2080: 20 74 79 70 69 63 61 6c 6c 79 20 62 65 20 65 69   typically be ei
2090: 74 68 65 72 20 6d 61 6e 79 20 61 75 78 69 6c 69  ther many auxili
20a0: 61 72 79 20 66 69 6c 65 73 0a 23 20 6f 72 20 6e  ary files.# or n
20b0: 6f 20 61 75 78 69 6c 69 61 72 79 20 66 69 6c 65  o auxiliary file
20c0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
20d0: 68 20 65 61 63 68 20 6d 61 69 6e 20 66 69 6c 65  h each main file
20e0: 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 6f 70 65 6e  ..#.proc hd_open
20f0: 5f 61 75 78 20 7b 66 69 6c 65 6e 61 6d 65 7d 20  _aux {filename} 
2100: 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 20 44 45  {.  global hd DE
2110: 53 54 0a 20 20 68 64 5f 63 6c 6f 73 65 5f 61 75  ST.  hd_close_au
2120: 78 0a 20 20 73 65 74 20 68 64 28 66 6e 2d 61 75  x.  set hd(fn-au
2130: 78 29 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 73  x) $filename.  s
2140: 65 74 20 68 64 28 72 6f 6f 74 70 61 74 68 2d 61  et hd(rootpath-a
2150: 75 78 29 20 5b 68 64 5f 72 6f 6f 74 70 61 74 68  ux) [hd_rootpath
2160: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 73 65   $filename].  se
2170: 74 20 68 64 28 61 75 78 29 20 5b 6f 70 65 6e 20  t hd(aux) [open 
2180: 24 44 45 53 54 2f 24 66 69 6c 65 6e 61 6d 65 20  $DEST/$filename 
2190: 77 5d 0a 20 20 73 65 74 20 68 64 28 65 6e 61 62  w].  set hd(enab
21a0: 6c 65 2d 61 75 78 29 20 31 0a 20 20 67 6c 6f 62  le-aux) 1.  glob
21b0: 61 6c 20 70 61 67 65 6c 69 6e 6b 0a 20 20 6c 61  al pagelink.  la
21c0: 70 70 65 6e 64 20 70 61 67 65 6c 69 6e 6b 28 24  ppend pagelink($
21d0: 66 69 6c 65 6e 61 6d 65 29 20 24 66 69 6c 65 6e  filename) $filen
21e0: 61 6d 65 0a 7d 0a 0a 23 20 43 6c 6f 73 65 20 74  ame.}..# Close t
21f0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 6f 75 74  he auxiliary out
2200: 70 75 74 20 66 69 6c 65 0a 23 0a 70 72 6f 63 20  put file.#.proc 
2210: 68 64 5f 63 6c 6f 73 65 5f 61 75 78 20 7b 7d 20  hd_close_aux {} 
2220: 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a 20 20  {.  global hd.  
2230: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2240: 20 68 64 28 61 75 78 29 5d 7d 20 7b 0a 20 20 20   hd(aux)]} {.   
2250: 20 70 75 74 73 20 24 68 64 28 61 75 78 29 20 24   puts $hd(aux) $
2260: 68 64 28 66 6f 6f 74 65 72 29 0a 20 20 20 20 63  hd(footer).    c
2270: 6c 6f 73 65 20 24 68 64 28 61 75 78 29 0a 20 20  lose $hd(aux).  
2280: 20 20 75 6e 73 65 74 20 68 64 28 61 75 78 29 0a    unset hd(aux).
2290: 20 20 20 20 73 65 74 20 68 64 28 65 6e 61 62 6c      set hd(enabl
22a0: 65 2d 61 75 78 29 20 30 0a 20 20 20 20 73 65 74  e-aux) 0.    set
22b0: 20 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29   hd(enable-main)
22c0: 20 31 0a 20 20 7d 0a 7d 0a 0a 0a 23 20 68 64 5f   1.  }.}...# hd_
22d0: 70 75 74 73 69 6e 34 20 69 73 20 6c 69 6b 65 20  putsin4 is like 
22e0: 70 75 74 73 20 65 78 63 65 70 74 20 74 68 61 74  puts except that
22f0: 20 69 74 20 72 65 6d 6f 76 65 73 20 74 68 65 20   it removes the 
2300: 66 69 72 73 74 20 34 20 69 6e 64 65 6e 74 61 74  first 4 indentat
2310: 69 6f 6e 0a 23 20 63 68 61 72 61 63 74 65 72 73  ion.# characters
2320: 20 66 72 6f 6d 20 65 61 63 68 20 6c 69 6e 65 2e   from each line.
2330: 20 20 49 74 20 61 6c 73 6f 20 64 6f 65 73 20 76    It also does v
2340: 61 72 69 61 62 6c 65 20 73 75 62 73 74 69 74 75  ariable substitu
2350: 74 69 6f 6e 20 69 6e 0a 23 20 74 68 65 20 6e 61  tion in.# the na
2360: 6d 65 73 70 61 63 65 20 6f 66 20 69 74 73 20 63  mespace of its c
2370: 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
2380: 2e 0a 23 0a 70 72 6f 63 20 70 75 74 73 69 6e 34  ..#.proc putsin4
2390: 20 7b 66 64 20 74 65 78 74 7d 20 7b 0a 20 20 72   {fd text} {.  r
23a0: 65 67 73 75 62 20 2d 61 6c 6c 20 22 5c 6e 20 20  egsub -all "\n  
23b0: 20 20 22 20 24 74 65 78 74 20 5c 6e 20 74 65 78    " $text \n tex
23c0: 74 0a 20 20 70 75 74 73 20 24 66 64 20 5b 75 70  t.  puts $fd [up
23d0: 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75  level 1 [list su
23e0: 62 73 74 20 2d 6e 6f 62 61 63 6b 20 2d 6e 6f 63  bst -noback -noc
23f0: 6f 6d 20 24 74 65 78 74 5d 5d 0a 7d 0a 0a 23 20  om $text]].}..# 
2400: 41 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 77  A procedure to w
2410: 72 69 74 65 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  rite the common 
2420: 68 65 61 64 65 72 20 66 6f 75 6e 64 20 6f 6e 20  header found on 
2430: 65 76 65 72 79 20 48 54 4d 4c 20 66 69 6c 65 20  every HTML file 
2440: 6f 6e 0a 23 20 74 68 65 20 53 51 4c 69 74 65 20  on.# the SQLite 
2450: 77 65 62 73 69 74 65 2e 0a 23 0a 70 72 6f 63 20  website..#.proc 
2460: 68 64 5f 68 65 61 64 65 72 20 7b 74 69 74 6c 65  hd_header {title
2470: 20 7b 73 72 63 66 69 6c 65 20 7b 7d 7d 7d 20 7b   {srcfile {}}} {
2480: 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a 20 20 73  .  global hd.  s
2490: 65 74 20 73 61 76 65 64 5f 65 6e 61 62 6c 65 20  et saved_enable 
24a0: 24 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29  $hd(enable-main)
24b0: 0a 20 20 69 66 20 7b 24 73 72 63 66 69 6c 65 3d  .  if {$srcfile=
24c0: 3d 22 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 66  =""} {.    set f
24d0: 64 20 24 68 64 28 61 75 78 29 0a 20 20 20 20 73  d $hd(aux).    s
24e0: 65 74 20 70 61 74 68 20 24 68 64 28 72 6f 6f 74  et path $hd(root
24f0: 70 61 74 68 2d 61 75 78 29 0a 20 20 7d 20 65 6c  path-aux).  } el
2500: 73 65 20 7b 0a 20 20 20 20 73 65 74 20 66 64 20  se {.    set fd 
2510: 24 68 64 28 6d 61 69 6e 29 0a 20 20 20 20 73 65  $hd(main).    se
2520: 74 20 70 61 74 68 20 24 68 64 28 72 6f 6f 74 70  t path $hd(rootp
2530: 61 74 68 2d 6d 61 69 6e 29 0a 20 20 7d 0a 20 20  ath-main).  }.  
2540: 70 75 74 73 20 24 66 64 20 7b 3c 21 44 4f 43 54  puts $fd {<!DOCT
2550: 59 50 45 20 48 54 4d 4c 20 50 55 42 4c 49 43 20  YPE HTML PUBLIC 
2560: 22 2d 2f 2f 57 33 43 2f 2f 44 54 44 20 48 54 4d  "-//W3C//DTD HTM
2570: 4c 20 34 2e 30 31 2f 2f 45 4e 22 20 22 68 74 74  L 4.01//EN" "htt
2580: 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 54  p://www.w3.org/T
2590: 52 2f 68 74 6d 6c 34 2f 73 74 72 69 63 74 2e 64  R/html4/strict.d
25a0: 74 64 22 3e 7d 0a 20 20 70 75 74 73 20 24 66 64  td">}.  puts $fd
25b0: 20 7b 3c 68 74 6d 6c 3e 3c 68 65 61 64 3e 7d 0a   {<html><head>}.
25c0: 20 20 70 75 74 73 20 24 66 64 20 22 3c 74 69 74    puts $fd "<tit
25d0: 6c 65 3e 24 74 69 74 6c 65 3c 2f 74 69 74 6c 65  le>$title</title
25e0: 3e 22 0a 20 20 70 75 74 73 69 6e 34 20 24 66 64  >".  putsin4 $fd
25f0: 20 7b 3c 73 74 79 6c 65 20 74 79 70 65 3d 22 74   {<style type="t
2600: 65 78 74 2f 63 73 73 22 3e 0a 20 20 20 20 62 6f  ext/css">.    bo
2610: 64 79 20 7b 0a 20 20 20 20 20 20 20 20 6d 61 72  dy {.        mar
2620: 67 69 6e 3a 20 61 75 74 6f 3b 0a 20 20 20 20 20  gin: auto;.     
2630: 20 20 20 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20     font-family: 
2640: 73 61 6e 73 2d 73 65 72 69 66 3b 0a 20 20 20 20  sans-serif;.    
2650: 20 20 20 20 70 61 64 64 69 6e 67 3a 20 38 70 78      padding: 8px
2660: 20 31 25 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a   1%;.    }.    .
2670: 20 20 20 20 61 20 7b 20 63 6f 6c 6f 72 3a 20 23      a { color: #
2680: 34 35 37 33 35 66 20 7d 0a 20 20 20 20 61 3a 76  45735f }.    a:v
2690: 69 73 69 74 65 64 20 7b 20 63 6f 6c 6f 72 3a 20  isited { color: 
26a0: 23 37 33 34 35 35 39 20 7d 0a 20 20 20 20 0a 20  #734559 }.    . 
26b0: 20 20 20 2e 6c 6f 67 6f 20 7b 20 70 6f 73 69 74     .logo { posit
26c0: 69 6f 6e 3a 61 62 73 6f 6c 75 74 65 3b 20 6d 61  ion:absolute; ma
26d0: 72 67 69 6e 3a 33 70 78 3b 20 7d 0a 20 20 20 20  rgin:3px; }.    
26e0: 2e 74 61 67 6c 69 6e 65 20 7b 0a 20 20 20 20 20  .tagline {.     
26f0: 20 66 6c 6f 61 74 3a 72 69 67 68 74 3b 0a 20 20   float:right;.  
2700: 20 20 20 20 74 65 78 74 2d 61 6c 69 67 6e 3a 72      text-align:r
2710: 69 67 68 74 3b 0a 20 20 20 20 20 20 66 6f 6e 74  ight;.      font
2720: 2d 73 74 79 6c 65 3a 69 74 61 6c 69 63 3b 0a 20  -style:italic;. 
2730: 20 20 20 20 20 77 69 64 74 68 3a 32 34 30 70 78       width:240px
2740: 3b 0a 20 20 20 20 20 20 6d 61 72 67 69 6e 3a 31  ;.      margin:1
2750: 32 70 78 3b 0a 20 20 20 20 20 20 6d 61 72 67 69  2px;.      margi
2760: 6e 2d 74 6f 70 3a 35 38 70 78 3b 0a 20 20 20 20  n-top:58px;.    
2770: 7d 0a 20 20 20 20 0a 20 20 20 20 2e 74 6f 6f 6c  }.    .    .tool
2780: 62 61 72 20 7b 0a 20 20 20 20 20 20 66 6f 6e 74  bar {.      font
2790: 2d 76 61 72 69 61 6e 74 3a 20 73 6d 61 6c 6c 2d  -variant: small-
27a0: 63 61 70 73 3b 0a 20 20 20 20 20 20 74 65 78 74  caps;.      text
27b0: 2d 61 6c 69 67 6e 3a 20 63 65 6e 74 65 72 3b 0a  -align: center;.
27c0: 20 20 20 20 20 20 6c 69 6e 65 2d 68 65 69 67 68        line-heigh
27d0: 74 3a 20 31 2e 36 65 6d 3b 0a 20 20 20 20 20 20  t: 1.6em;.      
27e0: 6d 61 72 67 69 6e 3a 20 30 3b 0a 20 20 20 20 20  margin: 0;.     
27f0: 20 70 61 64 64 69 6e 67 3a 31 70 78 20 38 70 78   padding:1px 8px
2800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2e 74 6f 6f  ;.    }.    .too
2810: 6c 62 61 72 20 61 20 7b 20 63 6f 6c 6f 72 3a 20  lbar a { color: 
2820: 77 68 69 74 65 3b 20 74 65 78 74 2d 64 65 63 6f  white; text-deco
2830: 72 61 74 69 6f 6e 3a 20 6e 6f 6e 65 3b 20 70 61  ration: none; pa
2840: 64 64 69 6e 67 3a 20 36 70 78 20 31 32 70 78 3b  dding: 6px 12px;
2850: 20 7d 0a 20 20 20 20 2e 74 6f 6f 6c 62 61 72 20   }.    .toolbar 
2860: 61 3a 76 69 73 69 74 65 64 20 7b 20 63 6f 6c 6f  a:visited { colo
2870: 72 3a 20 77 68 69 74 65 3b 20 7d 0a 20 20 20 20  r: white; }.    
2880: 2e 74 6f 6f 6c 62 61 72 20 61 3a 68 6f 76 65 72  .toolbar a:hover
2890: 20 7b 20 63 6f 6c 6f 72 3a 20 23 38 30 61 37 39   { color: #80a79
28a0: 36 3b 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 77  6; background: w
28b0: 68 69 74 65 3b 20 7d 0a 20 20 20 20 0a 20 20 20  hite; }.    .   
28c0: 20 2e 63 6f 6e 74 65 6e 74 20 20 20 20 7b 20 6d   .content    { m
28d0: 61 72 67 69 6e 3a 20 35 25 3b 20 7d 0a 20 20 20  argin: 5%; }.   
28e0: 20 2e 63 6f 6e 74 65 6e 74 20 64 74 20 7b 20 66   .content dt { f
28f0: 6f 6e 74 2d 77 65 69 67 68 74 3a 62 6f 6c 64 3b  ont-weight:bold;
2900: 20 7d 0a 20 20 20 20 2e 63 6f 6e 74 65 6e 74 20   }.    .content 
2910: 64 64 20 7b 20 6d 61 72 67 69 6e 2d 62 6f 74 74  dd { margin-bott
2920: 6f 6d 3a 20 32 35 70 78 3b 20 6d 61 72 67 69 6e  om: 25px; margin
2930: 2d 6c 65 66 74 3a 32 30 25 3b 20 7d 0a 20 20 20  -left:20%; }.   
2940: 20 2e 63 6f 6e 74 65 6e 74 20 75 6c 20 7b 20 70   .content ul { p
2950: 61 64 64 69 6e 67 3a 30 70 78 3b 20 70 61 64 64  adding:0px; padd
2960: 69 6e 67 2d 6c 65 66 74 3a 20 31 35 70 78 3b 20  ing-left: 15px; 
2970: 6d 61 72 67 69 6e 3a 30 70 78 3b 20 7d 0a 20 20  margin:0px; }.  
2980: 20 20 0a 20 20 20 20 2f 2a 20 72 6f 75 6e 64 65    .    /* rounde
2990: 64 20 63 6f 72 6e 65 72 73 20 2a 2f 0a 20 20 20  d corners */.   
29a0: 20 2e 73 65 20 20 7b 20 62 61 63 6b 67 72 6f 75   .se  { backgrou
29b0: 6e 64 3a 20 75 72 6c 28 24 7b 70 61 74 68 7d 69  nd: url(${path}i
29c0: 6d 61 67 65 73 2f 73 65 2e 70 6e 67 29 20 31 30  mages/se.png) 10
29d0: 30 25 20 31 30 30 25 20 6e 6f 2d 72 65 70 65 61  0% 100% no-repea
29e0: 74 20 23 38 30 61 37 39 36 7d 0a 20 20 20 20 2e  t #80a796}.    .
29f0: 73 77 20 20 7b 20 62 61 63 6b 67 72 6f 75 6e 64  sw  { background
2a00: 3a 20 75 72 6c 28 24 7b 70 61 74 68 7d 69 6d 61  : url(${path}ima
2a10: 67 65 73 2f 73 77 2e 70 6e 67 29 20 30 25 20 31  ges/sw.png) 0% 1
2a20: 30 30 25 20 6e 6f 2d 72 65 70 65 61 74 20 7d 0a  00% no-repeat }.
2a30: 20 20 20 20 2e 6e 65 20 20 7b 20 62 61 63 6b 67      .ne  { backg
2a40: 72 6f 75 6e 64 3a 20 75 72 6c 28 24 7b 70 61 74  round: url(${pat
2a50: 68 7d 69 6d 61 67 65 73 2f 6e 65 2e 70 6e 67 29  h}images/ne.png)
2a60: 20 31 30 30 25 20 30 25 20 6e 6f 2d 72 65 70 65   100% 0% no-repe
2a70: 61 74 20 7d 0a 20 20 20 20 2e 6e 77 20 20 7b 20  at }.    .nw  { 
2a80: 62 61 63 6b 67 72 6f 75 6e 64 3a 20 75 72 6c 28  background: url(
2a90: 24 7b 70 61 74 68 7d 69 6d 61 67 65 73 2f 6e 77  ${path}images/nw
2aa0: 2e 70 6e 67 29 20 30 25 20 30 25 20 6e 6f 2d 72  .png) 0% 0% no-r
2ab0: 65 70 65 61 74 20 7d 0a 0a 20 20 20 20 3c 2f 73  epeat }..    </s
2ac0: 74 79 6c 65 3e 0a 20 20 20 20 3c 6d 65 74 61 20  tyle>.    <meta 
2ad0: 68 74 74 70 2d 65 71 75 69 76 3d 22 63 6f 6e 74  http-equiv="cont
2ae0: 65 6e 74 2d 74 79 70 65 22 20 63 6f 6e 74 65 6e  ent-type" conten
2af0: 74 3d 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68  t="text/html; ch
2b00: 61 72 73 65 74 3d 55 54 46 2d 38 22 3e 0a 20 20  arset=UTF-8">.  
2b10: 7d 0a 20 20 70 75 74 73 20 24 66 64 20 7b 3c 2f  }.  puts $fd {</
2b20: 68 65 61 64 3e 7d 0a 20 20 70 75 74 73 69 6e 34  head>}.  putsin4
2b30: 20 24 66 64 20 7b 3c 62 6f 64 79 3e 0a 20 20 20   $fd {<body>.   
2b40: 20 3c 64 69 76 3e 3c 21 2d 2d 20 63 6f 6e 74 61   <div><!-- conta
2b50: 69 6e 65 72 20 64 69 76 20 74 6f 20 73 61 74 69  iner div to sati
2b60: 73 66 79 20 76 61 6c 69 64 61 74 6f 72 20 2d 2d  sfy validator --
2b70: 3e 0a 20 20 20 20 0a 20 20 20 20 3c 61 20 68 72  >.    .    <a hr
2b80: 65 66 3d 22 24 7b 70 61 74 68 7d 69 6e 64 65 78  ef="${path}index
2b90: 2e 68 74 6d 6c 22 3e 0a 20 20 20 20 3c 69 6d 67  .html">.    <img
2ba0: 20 63 6c 61 73 73 3d 22 6c 6f 67 6f 22 20 73 72   class="logo" sr
2bb0: 63 3d 22 24 7b 70 61 74 68 7d 69 6d 61 67 65 73  c="${path}images
2bc0: 2f 53 51 4c 69 74 65 2e 67 69 66 22 20 61 6c 74  /SQLite.gif" alt
2bd0: 3d 22 53 51 4c 69 74 65 20 4c 6f 67 6f 22 0a 20  ="SQLite Logo". 
2be0: 20 20 20 20 62 6f 72 64 65 72 3d 22 30 22 3e 3c      border="0"><
2bf0: 2f 61 3e 0a 20 20 20 20 3c 64 69 76 3e 3c 21 2d  /a>.    <div><!-
2c00: 2d 20 49 45 20 68 61 63 6b 20 74 6f 20 70 72 65  - IE hack to pre
2c10: 76 65 6e 74 20 64 69 73 61 70 70 65 61 72 69 6e  vent disappearin
2c20: 67 20 6c 6f 67 6f 2d 2d 3e 3c 2f 64 69 76 3e 0a  g logo--></div>.
2c30: 20 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22      <div class="
2c40: 74 61 67 6c 69 6e 65 22 3e 53 6d 61 6c 6c 2e 20  tagline">Small. 
2c50: 46 61 73 74 2e 20 52 65 6c 69 61 62 6c 65 2e 3c  Fast. Reliable.<
2c60: 62 72 3e 43 68 6f 6f 73 65 20 61 6e 79 20 74 68  br>Choose any th
2c70: 72 65 65 2e 3c 2f 64 69 76 3e 0a 0a 20 20 20 20  ree.</div>..    
2c80: 3c 74 61 62 6c 65 20 77 69 64 74 68 3d 31 30 30  <table width=100
2c90: 25 20 73 74 79 6c 65 3d 22 63 6c 65 61 72 3a 62  % style="clear:b
2ca0: 6f 74 68 22 3e 3c 74 72 3e 3c 74 64 3e 0a 20 20  oth"><tr><td>.  
2cb0: 20 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22      <div class="
2cc0: 73 65 22 3e 3c 64 69 76 20 63 6c 61 73 73 3d 22  se"><div class="
2cd0: 73 77 22 3e 3c 64 69 76 20 63 6c 61 73 73 3d 22  sw"><div class="
2ce0: 6e 65 22 3e 3c 64 69 76 20 63 6c 61 73 73 3d 22  ne"><div class="
2cf0: 6e 77 22 3e 0a 20 20 20 20 20 20 3c 64 69 76 20  nw">.      <div 
2d00: 63 6c 61 73 73 3d 22 74 6f 6f 6c 62 61 72 22 3e  class="toolbar">
2d10: 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72 65 66  .        <a href
2d20: 3d 22 24 7b 70 61 74 68 7d 61 62 6f 75 74 2e 68  ="${path}about.h
2d30: 74 6d 6c 22 3e 41 62 6f 75 74 3c 2f 61 3e 0a 20  tml">About</a>. 
2d40: 20 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22         <a href="
2d50: 24 7b 70 61 74 68 7d 73 69 74 65 6d 61 70 2e 68  ${path}sitemap.h
2d60: 74 6d 6c 22 3e 53 69 74 65 6d 61 70 3c 2f 61 3e  tml">Sitemap</a>
2d70: 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72 65 66  .        <a href
2d80: 3d 22 24 7b 70 61 74 68 7d 64 6f 63 73 2e 68 74  ="${path}docs.ht
2d90: 6d 6c 22 3e 44 6f 63 75 6d 65 6e 74 61 74 69 6f  ml">Documentatio
2da0: 6e 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20 3c 61  n</a>.        <a
2db0: 20 68 72 65 66 3d 22 24 7b 70 61 74 68 7d 64 6f   href="${path}do
2dc0: 77 6e 6c 6f 61 64 2e 68 74 6d 6c 22 3e 44 6f 77  wnload.html">Dow
2dd0: 6e 6c 6f 61 64 3c 2f 61 3e 0a 20 20 20 20 20 20  nload</a>.      
2de0: 20 20 3c 61 20 68 72 65 66 3d 22 24 7b 70 61 74    <a href="${pat
2df0: 68 7d 63 6f 70 79 72 69 67 68 74 2e 68 74 6d 6c  h}copyright.html
2e00: 22 3e 4c 69 63 65 6e 73 65 3c 2f 61 3e 0a 20 20  ">License</a>.  
2e10: 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 24        <a href="$
2e20: 7b 70 61 74 68 7d 6e 65 77 73 2e 68 74 6d 6c 22  {path}news.html"
2e30: 3e 4e 65 77 73 3c 2f 61 3e 0a 20 20 20 20 20 20  >News</a>.      
2e40: 20 20 3c 61 20 68 72 65 66 3d 22 24 7b 70 61 74    <a href="${pat
2e50: 68 7d 64 65 76 2e 68 74 6d 6c 22 3e 44 65 76 65  h}dev.html">Deve
2e60: 6c 6f 70 65 72 73 3c 2f 61 3e 0a 20 20 20 20 20  lopers</a>.     
2e70: 20 20 20 3c 61 20 68 72 65 66 3d 22 24 7b 70 61     <a href="${pa
2e80: 74 68 7d 73 75 70 70 6f 72 74 2e 68 74 6d 6c 22  th}support.html"
2e90: 3e 53 75 70 70 6f 72 74 3c 2f 61 3e 0a 20 20 20  >Support</a>.   
2ea0: 20 20 20 3c 2f 64 69 76 3e 3c 2f 64 69 76 3e 3c     </div></div><
2eb0: 2f 64 69 76 3e 3c 2f 64 69 76 3e 3c 2f 64 69 76  /div></div></div
2ec0: 3e 0a 20 20 20 20 3c 2f 74 64 3e 3c 2f 74 72 3e  >.    </td></tr>
2ed0: 3c 2f 74 61 62 6c 65 3e 0a 20 20 7d 0a 20 20 69  </table>.  }.  i
2ee0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
2ef0: 44 52 41 46 54 5d 7d 20 7b 0a 20 20 20 20 70 75  DRAFT]} {.    pu
2f00: 74 73 69 6e 34 20 24 66 64 20 7b 0a 20 20 20 20  tsin4 $fd {.    
2f10: 20 20 3c 70 20 61 6c 69 67 6e 3d 22 63 65 6e 74    <p align="cent
2f20: 65 72 22 3e 3c 66 6f 6e 74 20 73 69 7a 65 3d 22  er"><font size="
2f30: 36 22 20 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 2a  6" color="red">*
2f40: 2a 2a 20 44 52 41 46 54 20 2a 2a 2a 3c 2f 66 6f  ** DRAFT ***</fo
2f50: 6e 74 3e 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20  nt></p>.    }.  
2f60: 7d 0a 20 20 69 66 20 7b 24 73 72 63 66 69 6c 65  }.  if {$srcfile
2f70: 21 3d 22 22 7d 20 7b 0a 20 20 20 20 69 66 20 7b  !=""} {.    if {
2f80: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 44 52 41  [file exists DRA
2f90: 46 54 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  FT]} {.      set
2fa0: 20 68 64 28 66 6f 6f 74 65 72 29 20 7b 0a 20 20   hd(footer) {.  
2fb0: 20 20 20 20 20 20 3c 70 20 61 6c 69 67 6e 3d 22        <p align="
2fc0: 63 65 6e 74 65 72 22 3e 3c 66 6f 6e 74 20 73 69  center"><font si
2fd0: 7a 65 3d 22 36 22 20 63 6f 6c 6f 72 3d 22 72 65  ze="6" color="re
2fe0: 64 22 3e 2a 2a 2a 20 44 52 41 46 54 20 2a 2a 2a  d">*** DRAFT ***
2ff0: 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 0a 20 20 20 20  </font></p>.    
3000: 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
3010: 0a 20 20 20 20 20 20 73 65 74 20 68 64 28 66 6f  .      set hd(fo
3020: 6f 74 65 72 29 20 7b 7d 0a 20 20 20 20 7d 0a 20  oter) {}.    }. 
3030: 20 20 20 61 70 70 65 6e 64 20 68 64 28 66 6f 6f     append hd(foo
3040: 74 65 72 29 20 22 3c 68 72 3e 3c 73 6d 61 6c 6c  ter) "<hr><small
3050: 3e 3c 69 3e 5c 6e 22 0a 20 20 20 20 73 65 74 20  ><i>\n".    set 
3060: 6d 74 69 6d 65 20 5b 66 69 6c 65 20 6d 74 69 6d  mtime [file mtim
3070: 65 20 24 73 72 63 66 69 6c 65 5d 0a 20 20 20 20  e $srcfile].    
3080: 73 65 74 20 64 61 74 65 20 5b 63 6c 6f 63 6b 20  set date [clock 
3090: 66 6f 72 6d 61 74 20 24 6d 74 69 6d 65 20 2d 66  format $mtime -f
30a0: 6f 72 6d 61 74 20 7b 25 59 2f 25 6d 2f 25 64 20  ormat {%Y/%m/%d 
30b0: 25 48 3a 25 4d 3a 25 53 20 55 54 43 7d 20 2d 67  %H:%M:%S UTC} -g
30c0: 6d 74 20 31 5d 0a 20 20 20 20 61 70 70 65 6e 64  mt 1].    append
30d0: 20 68 64 28 66 6f 6f 74 65 72 29 20 22 54 68 69   hd(footer) "Thi
30e0: 73 20 70 61 67 65 20 6c 61 73 74 20 6d 6f 64 69  s page last modi
30f0: 66 69 65 64 20 24 64 61 74 65 5c 6e 22 0a 20 20  fied $date\n".  
3100: 20 20 61 70 70 65 6e 64 20 68 64 28 66 6f 6f 74    append hd(foot
3110: 65 72 29 20 22 3c 2f 69 3e 3c 2f 73 6d 61 6c 6c  er) "</i></small
3120: 3e 3c 2f 64 69 76 3e 3c 2f 62 6f 64 79 3e 3c 2f  ></div></body></
3130: 68 74 6d 6c 3e 22 0a 20 20 7d 20 65 6c 73 65 20  html>".  } else 
3140: 7b 0a 20 20 20 20 73 65 74 20 68 64 28 65 6e 61  {.    set hd(ena
3150: 62 6c 65 2d 6d 61 69 6e 29 20 24 73 61 76 65 64  ble-main) $saved
3160: 5f 65 6e 61 62 6c 65 0a 20 20 7d 0a 7d 0a 0a 23  _enable.  }.}..#
3170: 20 49 6e 73 65 72 74 20 61 20 62 75 62 62 6c 65   Insert a bubble
3180: 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20   syntax diagram 
3190: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
31a0: 0a 23 0a 70 72 6f 63 20 42 75 62 62 6c 65 44 69  .#.proc BubbleDi
31b0: 61 67 72 61 6d 20 7b 6e 61 6d 65 20 7b 61 6e 6f  agram {name {ano
31c0: 6e 79 6d 6f 75 73 5f 66 6c 61 67 20 30 7d 7d 20  nymous_flag 0}} 
31d0: 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a 0a 20  {.  global hd.. 
31e0: 20 23 69 66 20 7b 21 24 61 6e 6f 6e 79 6d 6f 75   #if {!$anonymou
31f0: 73 5f 66 6c 61 67 7d 20 7b 0a 20 20 23 20 20 68  s_flag} {.  #  h
3200: 64 5f 72 65 73 6f 6c 76 65 20 22 3c 68 34 3e 5c  d_resolve "<h4>\
3210: 5b 24 6e 61 6d 65 3a 5c 5d 3c 2f 68 34 3e 22 0a  [$name:\]</h4>".
3220: 20 20 23 7d 0a 20 20 68 64 5f 72 65 73 6f 6c 76    #}.  hd_resolv
3230: 65 20 22 3c 68 34 3e 5c 5b 24 6e 61 6d 65 3a 5c  e "<h4>\[$name:\
3240: 5d 3c 2f 68 34 3e 22 0a 20 20 69 66 20 7b 24 68  ]</h4>".  if {$h
3250: 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29 7d 20  d(enable-main)} 
3260: 7b 0a 20 20 20 20 70 75 74 73 20 24 68 64 28 6d  {.    puts $hd(m
3270: 61 69 6e 29 20 22 3c 62 6c 6f 63 6b 71 75 6f 74  ain) "<blockquot
3280: 65 3e 5c 0a 20 20 20 20 20 20 20 20 3c 69 6d 67  e>\.        <img
3290: 20 73 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70   src=\"$hd(rootp
32a0: 61 74 68 2d 6d 61 69 6e 29 69 6d 61 67 65 73 2f  ath-main)images/
32b0: 73 79 6e 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66  syntax/$name.gif
32c0: 5c 22 3e 3c 2f 69 6d 67 3e 5c 0a 20 20 20 20 20  \"></img>\.     
32d0: 20 20 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e     </blockquote>
32e0: 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 68 64 28  ".  }.  if {$hd(
32f0: 65 6e 61 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20  enable-aux)} {. 
3300: 20 20 20 70 75 74 73 20 24 68 64 28 61 75 78 29     puts $hd(aux)
3310: 20 22 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 5c 0a   "<blockquote>\.
3320: 20 20 20 20 20 20 20 20 3c 69 6d 67 20 73 72 63          <img src
3330: 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74 68 2d  =\"$hd(rootpath-
3340: 61 75 78 29 69 6d 61 67 65 73 2f 73 79 6e 74 61  aux)images/synta
3350: 78 2f 24 6e 61 6d 65 2e 67 69 66 5c 22 3e 3c 2f  x/$name.gif\"></
3360: 69 6d 67 3e 5c 0a 20 20 20 20 20 20 20 20 3c 2f  img>\.        </
3370: 62 6c 6f 63 6b 71 75 6f 74 65 3e 22 0a 20 20 7d  blockquote>".  }
3380: 0a 7d 0a 0a 23 20 52 65 63 6f 72 64 20 61 20 72  .}..# Record a r
3390: 65 71 75 69 72 65 6d 65 6e 74 2e 20 20 54 68 69  equirement.  Thi
33a0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  s procedure is a
33b0: 63 74 69 76 65 20 6f 6e 6c 79 20 66 6f 72 20 74  ctive only for t
33c0: 68 65 20 66 69 72 73 74 0a 23 20 70 61 73 73 2e  he first.# pass.
33d0: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65    This procedure
33e0: 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70   becomes a no-op
33f0: 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
3400: 70 61 73 73 2e 20 20 44 75 72 69 6e 67 0a 23 20  pass.  During.# 
3410: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 2c  the second pass,
3420: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 6c 69   requirements li
3430: 73 74 69 6e 67 20 72 65 70 6f 72 74 20 67 65 6e  sting report gen
3440: 65 72 61 74 6f 72 73 20 63 61 6e 20 75 73 65 20  erators can use 
3450: 74 68 65 0a 23 20 64 61 74 61 20 61 63 63 75 6d  the.# data accum
3460: 75 6c 61 74 65 64 20 64 75 72 69 6e 67 20 74 68  ulated during th
3470: 65 20 66 69 72 73 74 20 70 61 73 73 20 74 6f 20  e first pass to 
3480: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 69 72 20  construct their 
3490: 72 65 70 6f 72 74 73 2e 0a 23 0a 23 20 49 66 20  reports..#.# If 
34a0: 74 68 65 20 22 76 65 72 62 61 74 69 6d 22 20 61  the "verbatim" a
34b0: 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
34c0: 20 74 68 65 6e 20 74 68 65 20 72 65 71 75 69 72   then the requir
34d0: 65 6d 65 6e 74 20 74 65 78 74 20 69 73 0a 23 20  ement text is.# 
34e0: 72 65 6e 64 65 72 65 64 20 61 73 20 69 73 2e 20  rendered as is. 
34f0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
3500: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
3510: 20 74 65 78 74 20 69 73 20 61 73 73 75 6d 65 64   text is assumed
3520: 20 74 6f 0a 23 20 62 65 20 76 61 6c 69 64 20 48   to.# be valid H
3530: 54 4d 4c 20 77 69 74 68 20 61 6c 6c 20 68 79 70  TML with all hyp
3540: 65 72 6c 69 6e 6b 73 20 61 6c 72 65 61 64 79 20  erlinks already 
3550: 72 65 73 6f 6c 76 65 64 2e 20 20 49 66 20 74 68  resolved.  If th
3560: 65 20 22 76 65 72 62 61 74 69 6d 22 0a 23 20 61  e "verbatim".# a
3570: 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
3580: 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 20 74   (the default) t
3590: 68 65 6e 20 74 68 65 20 72 65 71 75 69 72 65 6d  hen the requirem
35a0: 65 6e 74 20 74 65 78 74 20 69 73 20 72 65 6e 64  ent text is rend
35b0: 65 72 65 64 0a 23 20 75 73 69 6e 67 20 68 64 5f  ered.# using hd_
35c0: 72 65 6e 64 65 72 20 77 68 69 63 68 20 77 69 6c  render which wil
35d0: 6c 20 66 69 6e 64 20 61 6e 20 65 78 70 61 6e 64  l find an expand
35e0: 20 68 79 70 65 72 6c 69 6e 6b 73 20 77 69 74 68   hyperlinks with
35f0: 69 6e 20 74 68 65 20 74 65 78 74 2e 0a 23 0a 23  in the text..#.#
3600: 20 54 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 61   The "comment" a
3610: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 62  rgument is non-b
3620: 69 6e 64 69 6e 67 20 63 6f 6d 6d 65 6e 74 61 72  inding commentar
3630: 79 20 61 6e 64 20 65 78 70 6c 61 6e 61 74 69 6f  y and explanatio
3640: 6e 20 74 68 61 74 0a 23 20 61 63 63 6f 6d 70 61  n that.# accompa
3650: 6e 69 65 73 20 74 68 65 20 72 65 71 75 69 72 65  nies the require
3660: 6d 65 6e 74 2e 0a 23 0a 70 72 6f 63 20 68 64 5f  ment..#.proc hd_
3670: 72 65 71 75 69 72 65 6d 65 6e 74 20 7b 69 64 20  requirement {id 
3680: 74 65 78 74 20 64 65 72 69 76 65 64 66 72 6f 6d  text derivedfrom
3690: 20 63 6f 6d 6d 65 6e 74 7d 20 7b 0a 20 20 67 6c   comment} {.  gl
36a0: 6f 62 61 6c 20 41 4c 4c 52 45 51 20 41 4c 4c 52  obal ALLREQ ALLR
36b0: 45 51 5f 44 45 52 49 56 45 44 46 52 4f 4d 20 41  EQ_DERIVEDFROM A
36c0: 4c 4c 52 45 51 5f 43 4f 4d 0a 20 20 69 66 20 7b  LLREQ_COM.  if {
36d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 41 4c 4c  [info exists ALL
36e0: 52 45 51 28 24 69 64 29 5d 7d 20 7b 0a 20 20 20  REQ($id)]} {.   
36f0: 20 70 75 74 73 20 73 74 64 65 72 72 20 22 64 75   puts stderr "du
3700: 70 6c 69 63 61 74 65 20 72 65 71 75 69 72 65 6d  plicate requirem
3710: 65 6e 74 20 6c 61 62 65 6c 3a 20 24 69 64 22 0a  ent label: $id".
3720: 20 20 7d 0a 20 20 73 65 74 20 41 4c 4c 52 45 51    }.  set ALLREQ
3730: 5f 44 45 52 49 56 45 44 46 52 4f 4d 28 24 69 64  _DERIVEDFROM($id
3740: 29 20 24 64 65 72 69 76 65 64 66 72 6f 6d 0a 20  ) $derivedfrom. 
3750: 20 73 65 74 20 41 4c 4c 52 45 51 28 24 69 64 29   set ALLREQ($id)
3760: 20 24 74 65 78 74 0a 20 20 73 65 74 20 41 4c 4c   $text.  set ALL
3770: 52 45 51 5f 43 4f 4d 28 24 69 64 29 20 24 63 6f  REQ_COM($id) $co
3780: 6d 6d 65 6e 74 0a 7d 0a 0a 23 20 52 65 61 64 20  mment.}..# Read 
3790: 61 20 62 6c 6f 63 6b 20 6f 66 20 72 65 71 75 69  a block of requi
37a0: 72 65 6d 65 6e 74 73 20 66 72 6f 6d 20 61 6e 20  rements from an 
37b0: 41 53 43 49 49 20 74 65 78 74 20 66 69 6c 65 2e  ASCII text file.
37c0: 20 20 53 74 6f 72 65 20 74 68 65 0a 23 20 69 6e    Store the.# in
37d0: 66 6f 72 6d 61 74 69 6f 6e 20 6f 62 74 61 69 6e  formation obtain
37e0: 65 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 76  ed in a global v
37f0: 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 20 62 79  ariable named by
3800: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
3810: 6d 65 74 65 72 2e 0a 23 0a 70 72 6f 63 20 68 64  meter..#.proc hd
3820: 5f 72 65 61 64 5f 72 65 71 75 69 72 65 6d 65 6e  _read_requiremen
3830: 74 5f 66 69 6c 65 20 7b 66 69 6c 65 6e 61 6d 65  t_file {filename
3840: 20 76 61 72 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c   varname} {.  gl
3850: 6f 62 61 6c 20 68 64 5f 72 65 71 5f 72 64 72 0a  obal hd_req_rdr.
3860: 20 20 68 64 5f 72 65 73 65 74 5f 72 65 71 75 69    hd_reset_requi
3870: 72 65 6d 65 6e 74 5f 72 65 61 64 65 72 0a 20 20  rement_reader.  
3880: 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 24 66 69  set in [open $fi
3890: 6c 65 6e 61 6d 65 5d 0a 20 20 77 68 69 6c 65 20  lename].  while 
38a0: 7b 21 5b 65 6f 66 20 24 69 6e 5d 7d 20 7b 0a 20  {![eof $in]} {. 
38b0: 20 20 20 73 65 74 20 6c 69 6e 65 20 5b 67 65 74     set line [get
38c0: 73 20 24 69 6e 5d 0a 20 20 20 20 69 66 20 7b 5b  s $in].    if {[
38d0: 72 65 67 65 78 70 20 7b 5e 28 48 4c 52 7c 55 4e  regexp {^(HLR|UN
38e0: 44 45 46 7c 53 59 53 52 45 51 29 20 2b 28 5b 4c  DEF|SYSREQ) +([L
38f0: 48 53 55 5d 5c 64 2b 29 20 2a 28 2e 2a 29 7d 20  HSU]\d+) *(.*)} 
3900: 24 6c 69 6e 65 20 61 6c 6c 20 74 79 70 65 20 72  $line all type r
3910: 6e 20 64 66 5d 7d 20 7b 0a 20 20 20 20 20 20 68  n df]} {.      h
3920: 64 5f 61 64 64 5f 6f 6e 65 5f 72 65 71 75 69 72  d_add_one_requir
3930: 65 6d 65 6e 74 20 24 76 61 72 6e 61 6d 65 0a 20  ement $varname. 
3940: 20 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f       set hd_req_
3950: 72 64 72 28 72 6e 29 20 24 72 6e 0a 20 20 20 20  rdr(rn) $rn.    
3960: 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72    set hd_req_rdr
3970: 28 64 65 72 69 76 65 64 29 20 24 64 66 0a 20 20  (derived) $df.  
3980: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72    } elseif {[str
3990: 69 6e 67 20 74 72 69 6d 20 24 6c 69 6e 65 5d 3d  ing trim $line]=
39a0: 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 69 66 20  =""} {.      if 
39b0: 7b 24 68 64 5f 72 65 71 5f 72 64 72 28 62 6f 64  {$hd_req_rdr(bod
39c0: 79 29 3d 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20  y)==""} {.      
39d0: 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72    set hd_req_rdr
39e0: 28 62 6f 64 79 29 20 24 68 64 5f 72 65 71 5f 72  (body) $hd_req_r
39f0: 64 72 28 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20  dr(comment).    
3a00: 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72      set hd_req_r
3a10: 64 72 28 63 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20  dr(comment) {}. 
3a20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
3a30: 20 20 20 20 20 20 61 70 70 65 6e 64 20 68 64 5f        append hd_
3a40: 72 65 71 5f 72 64 72 28 63 6f 6d 6d 65 6e 74 29  req_rdr(comment)
3a50: 20 5c 6e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   \n.      }.    
3a60: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 61  } else {.      a
3a70: 70 70 65 6e 64 20 68 64 5f 72 65 71 5f 72 64 72  ppend hd_req_rdr
3a80: 28 63 6f 6d 6d 65 6e 74 29 20 24 6c 69 6e 65 5c  (comment) $line\
3a90: 6e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 68 64  n.    }.  }.  hd
3aa0: 5f 61 64 64 5f 6f 6e 65 5f 72 65 71 75 69 72 65  _add_one_require
3ab0: 6d 65 6e 74 20 24 76 61 72 6e 61 6d 65 0a 20 20  ment $varname.  
3ac0: 63 6c 6f 73 65 20 24 69 6e 0a 20 20 0a 7d 0a 70  close $in.  .}.p
3ad0: 72 6f 63 20 68 64 5f 72 65 73 65 74 5f 72 65 71  roc hd_reset_req
3ae0: 75 69 72 65 6d 65 6e 74 5f 72 65 61 64 65 72 20  uirement_reader 
3af0: 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64  {} {.  global hd
3b00: 5f 72 65 71 5f 72 64 72 0a 20 20 73 65 74 20 68  _req_rdr.  set h
3b10: 64 5f 72 65 71 5f 72 64 72 28 72 6e 29 20 7b 7d  d_req_rdr(rn) {}
3b20: 0a 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72 64  .  set hd_req_rd
3b30: 72 28 63 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20 20  r(comment) {}.  
3b40: 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72 28 62  set hd_req_rdr(b
3b50: 6f 64 79 29 20 7b 7d 0a 20 20 73 65 74 20 68 64  ody) {}.  set hd
3b60: 5f 72 65 71 5f 72 64 72 28 64 65 72 69 76 65 64  _req_rdr(derived
3b70: 29 20 7b 7d 0a 7d 0a 70 72 6f 63 20 68 64 5f 61  ) {}.}.proc hd_a
3b80: 64 64 5f 6f 6e 65 5f 72 65 71 75 69 72 65 6d 65  dd_one_requireme
3b90: 6e 74 20 7b 76 61 72 6e 61 6d 65 7d 20 7b 0a 20  nt {varname} {. 
3ba0: 20 67 6c 6f 62 61 6c 20 68 64 5f 72 65 71 5f 72   global hd_req_r
3bb0: 64 72 0a 20 20 73 65 74 20 72 6e 20 24 68 64 5f  dr.  set rn $hd_
3bc0: 72 65 71 5f 72 64 72 28 72 6e 29 0a 20 20 69 66  req_rdr(rn).  if
3bd0: 20 7b 24 72 6e 21 3d 22 22 7d 20 7b 0a 20 20 20   {$rn!=""} {.   
3be0: 20 69 66 20 7b 24 68 64 5f 72 65 71 5f 72 64 72   if {$hd_req_rdr
3bf0: 28 62 6f 64 79 29 3d 3d 22 22 7d 20 7b 0a 20 20  (body)==""} {.  
3c00: 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72      set hd_req_r
3c10: 64 72 28 62 6f 64 79 29 20 24 68 64 5f 72 65 71  dr(body) $hd_req
3c20: 5f 72 64 72 28 63 6f 6d 6d 65 6e 74 29 0a 20 20  _rdr(comment).  
3c30: 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72      set hd_req_r
3c40: 64 72 28 63 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20  dr(comment) {}. 
3c50: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 62 20 5b     }.    set b [
3c60: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 68 64 5f  string trim $hd_
3c70: 72 65 71 5f 72 64 72 28 62 6f 64 79 29 5d 0a 20  req_rdr(body)]. 
3c80: 20 20 20 73 65 74 20 63 20 5b 73 74 72 69 6e 67     set c [string
3c90: 20 74 72 69 6d 20 24 68 64 5f 72 65 71 5f 72 64   trim $hd_req_rd
3ca0: 72 28 63 6f 6d 6d 65 6e 74 29 5d 0a 20 20 20 20  r(comment)].    
3cb0: 73 65 74 20 3a 3a 24 7b 76 61 72 6e 61 6d 65 7d  set ::${varname}
3cc0: 28 24 72 6e 29 20 5b 6c 69 73 74 20 24 68 64 5f  ($rn) [list $hd_
3cd0: 72 65 71 5f 72 64 72 28 64 65 72 69 76 65 64 29  req_rdr(derived)
3ce0: 20 24 62 20 24 63 5d 0a 20 20 20 20 6c 61 70 70   $b $c].    lapp
3cf0: 65 6e 64 20 3a 3a 24 7b 76 61 72 6e 61 6d 65 7d  end ::${varname}
3d00: 28 2a 29 20 24 72 6e 0a 20 20 7d 0a 20 20 68 64  (*) $rn.  }.  hd
3d10: 5f 72 65 73 65 74 5f 72 65 71 75 69 72 65 6d 65  _reset_requireme
3d20: 6e 74 5f 72 65 61 64 65 72 0a 7d 0a 0a 23 20 46  nt_reader.}..# F
3d30: 69 72 73 74 20 70 61 73 73 2e 20 20 50 72 6f 63  irst pass.  Proc
3d40: 65 73 73 20 61 6c 6c 20 66 69 6c 65 73 2e 20 20  ess all files.  
3d50: 42 75 74 20 64 6f 20 6e 6f 74 20 72 65 6e 64 65  But do not rende
3d60: 72 20 68 79 70 65 72 6c 69 6e 6b 73 2e 0a 23 20  r hyperlinks..# 
3d70: 4d 65 72 65 6c 79 20 63 6f 6c 6c 65 63 74 20 6b  Merely collect k
3d80: 65 79 77 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69  eyword informati
3d90: 6f 6e 20 73 6f 20 74 68 61 74 20 68 79 70 65 72  on so that hyper
3da0: 6c 69 6e 6b 73 20 63 61 6e 20 62 65 0a 23 20 63  links can be.# c
3db0: 6f 72 72 65 63 74 6c 79 20 72 65 6e 64 65 72 65  orrectly rendere
3dc0: 64 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  d on the second 
3dd0: 70 61 73 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20  pass..#.foreach 
3de0: 69 6e 66 69 6c 65 20 5b 6c 72 61 6e 67 65 20 24  infile [lrange $
3df0: 61 72 67 76 20 33 20 65 6e 64 5d 20 7b 0a 20 20  argv 3 end] {.  
3e00: 63 64 20 24 48 4f 4d 45 44 49 52 0a 20 20 70 75  cd $HOMEDIR.  pu
3e10: 74 73 20 22 50 72 6f 63 65 73 73 69 6e 67 20 24  ts "Processing $
3e20: 69 6e 66 69 6c 65 22 0a 20 20 73 65 74 20 66 64  infile".  set fd
3e30: 20 5b 6f 70 65 6e 20 24 69 6e 66 69 6c 65 20 72   [open $infile r
3e40: 5d 0a 20 20 73 65 74 20 69 6e 20 5b 72 65 61 64  ].  set in [read
3e50: 20 24 66 64 5d 0a 20 20 63 6c 6f 73 65 20 24 66   $fd].  close $f
3e60: 64 0a 20 20 73 65 74 20 74 69 74 6c 65 20 7b 4e  d.  set title {N
3e70: 6f 20 54 69 74 6c 65 7d 0a 20 20 72 65 67 65 78  o Title}.  regex
3e80: 70 20 7b 3c 74 69 74 6c 65 3e 28 5b 5e 5c 6e 5d  p {<title>([^\n]
3e90: 2a 29 3c 2f 74 69 74 6c 65 3e 7d 20 24 69 6e 20  *)</title>} $in 
3ea0: 61 6c 6c 20 74 69 74 6c 65 0a 20 20 72 65 67 73  all title.  regs
3eb0: 75 62 20 7b 3c 74 69 74 6c 65 3e 5b 5e 5c 6e 5d  ub {<title>[^\n]
3ec0: 2a 3c 2f 74 69 74 6c 65 3e 7d 20 24 69 6e 20 7b  *</title>} $in {
3ed0: 7d 20 69 6e 0a 20 20 73 65 74 20 6f 75 74 66 69  } in.  set outfi
3ee0: 6c 65 20 5b 66 69 6c 65 20 72 6f 6f 74 20 5b 66  le [file root [f
3ef0: 69 6c 65 20 74 61 69 6c 20 24 69 6e 66 69 6c 65  ile tail $infile
3f00: 5d 5d 2e 68 74 6d 6c 0a 20 20 68 64 5f 6f 70 65  ]].html.  hd_ope
3f10: 6e 5f 6d 61 69 6e 20 24 6f 75 74 66 69 6c 65 0a  n_main $outfile.
3f20: 20 20 68 64 5f 68 65 61 64 65 72 20 24 74 69 74    hd_header $tit
3f30: 6c 65 20 24 69 6e 66 69 6c 65 0a 20 20 72 65 67  le $infile.  reg
3f40: 73 75 62 20 2d 61 6c 6c 20 7b 3c 74 63 6c 3e 7d  sub -all {<tcl>}
3f50: 20 24 69 6e 20 22 5c 31 37 35 3b 20 65 76 61 6c   $in "\175; eval
3f60: 20 5c 31 37 33 22 20 69 6e 0a 20 20 72 65 67 73   \173" in.  regs
3f70: 75 62 20 2d 61 6c 6c 20 7b 3c 2f 74 63 6c 3e 7d  ub -all {</tcl>}
3f80: 20 24 69 6e 20 22 5c 31 37 35 3b 20 68 64 5f 70   $in "\175; hd_p
3f90: 75 74 73 20 5c 31 37 33 22 20 69 6e 0a 20 20 65  uts \173" in.  e
3fa0: 76 61 6c 20 22 68 64 5f 70 75 74 73 20 5c 31 37  val "hd_puts \17
3fb0: 33 24 69 6e 5c 31 37 35 22 0a 20 20 63 64 20 24  3$in\175".  cd $
3fc0: 3a 3a 48 4f 4d 45 44 49 52 0a 20 20 68 64 5f 63  ::HOMEDIR.  hd_c
3fd0: 6c 6f 73 65 5f 6d 61 69 6e 0a 7d 0a 0a 23 20 53  lose_main.}..# S
3fe0: 65 63 6f 6e 64 20 70 61 73 73 2e 20 20 50 72 6f  econd pass.  Pro
3ff0: 63 65 73 73 20 61 6c 6c 20 66 69 6c 65 73 20 61  cess all files a
4000: 67 61 69 6e 2e 20 20 54 68 69 73 20 74 69 6d 65  gain.  This time
4010: 20 72 65 6e 64 65 72 20 68 79 70 65 72 6c 69 6e   render hyperlin
4020: 6b 73 0a 23 20 61 63 63 6f 72 64 69 6e 67 20 74  ks.# according t
4030: 6f 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e  o the keyword in
4040: 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 6c 6c 65 63  formation collec
4050: 74 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ted on the first
4060: 20 70 61 73 73 2e 0a 23 0a 70 72 6f 63 20 68 64   pass..#.proc hd
4070: 5f 6b 65 79 77 6f 72 64 73 20 7b 61 72 67 73 7d  _keywords {args}
4080: 20 7b 7d 0a 72 65 6e 61 6d 65 20 68 64 5f 72 65   {}.rename hd_re
4090: 73 6f 6c 76 65 20 7b 7d 0a 72 65 6e 61 6d 65 20  solve {}.rename 
40a0: 68 64 5f 72 65 73 6f 6c 76 65 5f 32 6e 64 70 61  hd_resolve_2ndpa
40b0: 73 73 20 68 64 5f 72 65 73 6f 6c 76 65 0a 70 72  ss hd_resolve.pr
40c0: 6f 63 20 68 64 5f 72 65 71 75 69 72 65 6d 65 6e  oc hd_requiremen
40d0: 74 20 7b 61 72 67 73 7d 20 7b 7d 0a 66 6f 72 65  t {args} {}.fore
40e0: 61 63 68 20 69 6e 66 69 6c 65 20 5b 6c 72 61 6e  ach infile [lran
40f0: 67 65 20 24 61 72 67 76 20 33 20 65 6e 64 5d 20  ge $argv 3 end] 
4100: 7b 0a 20 20 63 64 20 24 48 4f 4d 45 44 49 52 0a  {.  cd $HOMEDIR.
4110: 20 20 70 75 74 73 20 22 50 72 6f 63 65 73 73 69    puts "Processi
4120: 6e 67 20 24 69 6e 66 69 6c 65 22 0a 20 20 73 65  ng $infile".  se
4130: 74 20 66 64 20 5b 6f 70 65 6e 20 24 69 6e 66 69  t fd [open $infi
4140: 6c 65 20 72 5d 0a 20 20 73 65 74 20 69 6e 20 5b  le r].  set in [
4150: 72 65 61 64 20 24 66 64 5d 0a 20 20 63 6c 6f 73  read $fd].  clos
4160: 65 20 24 66 64 0a 20 20 73 65 74 20 74 69 74 6c  e $fd.  set titl
4170: 65 20 7b 4e 6f 20 54 69 74 6c 65 7d 0a 20 20 72  e {No Title}.  r
4180: 65 67 65 78 70 20 7b 3c 74 69 74 6c 65 3e 28 5b  egexp {<title>([
4190: 5e 5c 6e 5d 2a 29 3c 2f 74 69 74 6c 65 3e 7d 20  ^\n]*)</title>} 
41a0: 24 69 6e 20 61 6c 6c 20 74 69 74 6c 65 0a 20 20  $in all title.  
41b0: 72 65 67 73 75 62 20 7b 3c 74 69 74 6c 65 3e 5b  regsub {<title>[
41c0: 5e 5c 6e 5d 2a 3c 2f 74 69 74 6c 65 3e 7d 20 24  ^\n]*</title>} $
41d0: 69 6e 20 7b 7d 20 69 6e 0a 20 20 73 65 74 20 6f  in {} in.  set o
41e0: 75 74 66 69 6c 65 20 5b 66 69 6c 65 20 72 6f 6f  utfile [file roo
41f0: 74 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e  t [file tail $in
4200: 66 69 6c 65 5d 5d 2e 68 74 6d 6c 0a 20 20 68 64  file]].html.  hd
4210: 5f 6f 70 65 6e 5f 6d 61 69 6e 20 24 6f 75 74 66  _open_main $outf
4220: 69 6c 65 0a 20 20 68 64 5f 68 65 61 64 65 72 20  ile.  hd_header 
4230: 24 74 69 74 6c 65 20 24 69 6e 66 69 6c 65 0a 20  $title $infile. 
4240: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 74   regsub -all {<t
4250: 63 6c 3e 7d 20 24 69 6e 20 22 5c 31 37 35 3b 20  cl>} $in "\175; 
4260: 65 76 61 6c 20 5c 31 37 33 22 20 69 6e 0a 20 20  eval \173" in.  
4270: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 2f 74  regsub -all {</t
4280: 63 6c 3e 7d 20 24 69 6e 20 22 5c 31 37 35 3b 20  cl>} $in "\175; 
4290: 68 64 5f 72 65 73 6f 6c 76 65 20 5c 31 37 33 22  hd_resolve \173"
42a0: 20 69 6e 0a 20 20 65 76 61 6c 20 22 68 64 5f 72   in.  eval "hd_r
42b0: 65 73 6f 6c 76 65 20 5c 31 37 33 24 69 6e 5c 31  esolve \173$in\1
42c0: 37 35 22 0a 20 20 63 64 20 24 3a 3a 48 4f 4d 45  75".  cd $::HOME
42d0: 44 49 52 0a 20 20 68 64 5f 63 6c 6f 73 65 5f 6d  DIR.  hd_close_m
42e0: 61 69 6e 0a 7d 0a 0a 23 20 47 65 6e 65 72 61 74  ain.}..# Generat
42f0: 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 73 68 6f  e a document sho
4300: 77 69 6e 67 20 74 68 65 20 68 79 70 65 72 6c 69  wing the hyperli
4310: 6e 6b 20 6b 65 79 77 6f 72 64 73 20 61 6e 64 20  nk keywords and 
4320: 74 68 65 69 72 0a 23 20 74 61 72 67 65 74 73 2e  their.# targets.
4330: 0a 23 0a 68 64 5f 6f 70 65 6e 5f 6d 61 69 6e 20  .#.hd_open_main 
4340: 64 6f 63 5f 6b 65 79 77 6f 72 64 5f 63 72 6f 73  doc_keyword_cros
4350: 73 72 65 66 2e 68 74 6d 6c 0a 68 64 5f 68 65 61  sref.html.hd_hea
4360: 64 65 72 20 7b 4b 65 79 77 6f 72 64 20 43 72 6f  der {Keyword Cro
4370: 73 73 72 65 66 65 72 65 6e 63 65 7d 20 24 44 4f  ssreference} $DO
4380: 43 2f 77 72 61 70 2e 74 63 6c 0a 68 64 5f 70 75  C/wrap.tcl.hd_pu
4390: 74 73 20 22 3c 75 6c 3e 22 0a 66 6f 72 65 61 63  ts "<ul>".foreac
43a0: 68 20 78 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74  h x [lsort -dict
43b0: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 67 6c   [array names gl
43c0: 69 6e 6b 5d 5d 20 7b 0a 20 20 73 65 74 20 79 20  ink]] {.  set y 
43d0: 24 67 6c 69 6e 6b 28 24 78 29 0a 20 20 68 64 5f  $glink($x).  hd_
43e0: 70 75 74 73 20 22 3c 6c 69 3e 24 78 20 2d 20 3c  puts "<li>$x - <
43f0: 61 20 68 72 65 66 3d 5c 22 24 79 5c 22 3e 24 79  a href=\"$y\">$y
4400: 3c 2f 61 3e 3c 2f 6c 69 3e 22 0a 20 20 6c 61 70  </a></li>".  lap
4410: 70 65 6e 64 20 72 65 76 67 6c 69 6e 6b 28 24 79  pend revglink($y
4420: 29 20 24 78 0a 7d 0a 68 64 5f 70 75 74 73 20 22  ) $x.}.hd_puts "
4430: 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f 73 65 5f  </ul>".hd_close_
4440: 6d 61 69 6e 0a 0a 68 64 5f 6f 70 65 6e 5f 6d 61  main..hd_open_ma
4450: 69 6e 20 64 6f 63 5f 74 61 72 67 65 74 5f 63 72  in doc_target_cr
4460: 6f 73 73 72 65 66 2e 68 74 6d 6c 0a 68 64 5f 68  ossref.html.hd_h
4470: 65 61 64 65 72 20 7b 54 61 72 67 65 74 20 43 72  eader {Target Cr
4480: 6f 73 73 72 65 66 65 72 65 6e 63 65 7d 20 24 44  ossreference} $D
4490: 4f 43 2f 77 72 61 70 2e 74 63 6c 0a 68 64 5f 70  OC/wrap.tcl.hd_p
44a0: 75 74 73 20 22 3c 75 6c 3e 22 0a 66 6f 72 65 61  uts "<ul>".forea
44b0: 63 68 20 79 20 5b 6c 73 6f 72 74 20 5b 61 72 72  ch y [lsort [arr
44c0: 61 79 20 6e 61 6d 65 73 20 72 65 76 67 6c 69 6e  ay names revglin
44d0: 6b 5d 5d 20 7b 0a 20 20 68 64 5f 70 75 74 73 20  k]] {.  hd_puts 
44e0: 22 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 5c 22 24  "<li><a href=\"$
44f0: 79 5c 22 3e 24 79 3c 2f 61 3e 20 2d 20 5b 6c 73  y\">$y</a> - [ls
4500: 6f 72 74 20 24 72 65 76 67 6c 69 6e 6b 28 24 79  ort $revglink($y
4510: 29 5d 3c 2f 6c 69 3e 22 0a 7d 0a 68 64 5f 70 75  )]</li>".}.hd_pu
4520: 74 73 20 22 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c  ts "</ul>".hd_cl
4530: 6f 73 65 5f 6d 61 69 6e 0a 0a 68 64 5f 6f 70 65  ose_main..hd_ope
4540: 6e 5f 6d 61 69 6e 20 64 6f 63 5f 62 61 63 6b 6c  n_main doc_backl
4550: 69 6e 6b 5f 63 72 6f 73 73 72 65 66 2e 68 74 6d  ink_crossref.htm
4560: 6c 0a 68 64 5f 68 65 61 64 65 72 20 7b 42 61 63  l.hd_header {Bac
4570: 6b 6c 69 6e 6b 20 43 72 6f 73 73 72 65 66 65 72  klink Crossrefer
4580: 65 6e 63 65 7d 20 24 44 4f 43 2f 77 72 61 70 2e  ence} $DOC/wrap.
4590: 74 63 6c 0a 68 64 5f 70 75 74 73 20 22 3c 75 6c  tcl.hd_puts "<ul
45a0: 3e 22 0a 66 6f 72 65 61 63 68 20 6b 77 20 5b 6c  >".foreach kw [l
45b0: 73 6f 72 74 20 5b 61 72 72 61 79 20 6e 61 6d 65  sort [array name
45c0: 73 20 62 61 63 6b 6c 69 6e 6b 5d 5d 20 7b 0a 20  s backlink]] {. 
45d0: 20 68 64 5f 70 75 74 73 20 22 3c 6c 69 3e 24 6b   hd_puts "<li>$k
45e0: 77 20 2d 22 0a 20 20 73 65 74 20 70 72 65 76 20  w -".  set prev 
45f0: 7b 7d 0a 20 20 66 6f 72 65 61 63 68 20 72 65 66  {}.  foreach ref
4600: 20 5b 6c 73 6f 72 74 20 24 62 61 63 6b 6c 69 6e   [lsort $backlin
4610: 6b 28 24 6b 77 29 5d 20 7b 0a 20 20 20 20 69 66  k($kw)] {.    if
4620: 20 7b 24 72 65 66 3d 3d 24 70 72 65 76 7d 20 63   {$ref==$prev} c
4630: 6f 6e 74 69 6e 75 65 0a 20 20 20 20 73 65 74 20  ontinue.    set 
4640: 70 72 65 76 20 24 72 65 66 0a 20 20 20 20 68 64  prev $ref.    hd
4650: 5f 70 75 74 73 20 22 20 20 3c 61 20 68 72 65 66  _puts "  <a href
4660: 3d 5c 22 24 72 65 66 5c 22 3e 24 72 65 66 3c 2f  =\"$ref\">$ref</
4670: 61 3e 22 0a 20 20 7d 0a 7d 0a 68 64 5f 70 75 74  a>".  }.}.hd_put
4680: 73 20 22 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f  s "</ul>".hd_clo
4690: 73 65 5f 6d 61 69 6e 0a 0a 68 64 5f 6f 70 65 6e  se_main..hd_open
46a0: 5f 6d 61 69 6e 20 64 6f 63 5f 70 61 67 65 6c 69  _main doc_pageli
46b0: 6e 6b 5f 63 72 6f 73 73 72 65 66 2e 68 74 6d 6c  nk_crossref.html
46c0: 0a 68 64 5f 68 65 61 64 65 72 20 7b 50 61 67 65  .hd_header {Page
46d0: 6c 69 6e 6b 20 43 72 6f 73 73 72 65 66 65 72 65  link Crossrefere
46e0: 6e 63 65 7d 20 24 44 4f 43 2f 77 72 61 70 2e 74  nce} $DOC/wrap.t
46f0: 63 6c 0a 68 64 5f 70 75 74 73 20 22 3c 70 3e 54  cl.hd_puts "<p>T
4700: 61 72 67 65 74 20 50 61 67 65 20 2d 20 57 68 69  arget Page - Whi
4710: 63 68 20 70 61 67 65 73 20 72 65 66 65 72 65 6e  ch pages referen
4720: 63 65 20 69 74 2e 3c 2f 70 3e 22 0a 68 64 5f 70  ce it.</p>".hd_p
4730: 75 74 73 20 22 3c 70 3e 50 61 67 65 73 20 6d 61  uts "<p>Pages ma
4740: 74 63 68 69 6e 67 20 28 6e 65 77 73 7c 63 68 61  tching (news|cha
4750: 6e 67 65 73 7c 72 65 6c 65 61 73 65 6c 6f 67 7c  nges|releaselog|
4760: 5c 5b 30 2d 39 5d 74 6f 5c 5b 30 2d 39 5d 7c 5e  \[0-9]to\[0-9]|^
4770: 64 6f 63 5f 2e 2a 5f 63 72 6f 73 73 72 65 66 29  doc_.*_crossref)
4780: 20 61 72 65 20 73 6b 69 70 70 65 64 2e 3c 2f 70   are skipped.</p
4790: 3e 22 0a 68 64 5f 70 75 74 73 20 22 3c 75 6c 3e  >".hd_puts "<ul>
47a0: 22 0a 66 6f 72 65 61 63 68 20 79 20 5b 6c 73 6f  ".foreach y [lso
47b0: 72 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20  rt [array names 
47c0: 72 65 76 67 6c 69 6e 6b 5d 5d 20 7b 0a 20 20 72  revglink]] {.  r
47d0: 65 67 73 75 62 20 7b 23 2e 2a 7d 20 24 79 20 7b  egsub {#.*} $y {
47e0: 7d 20 79 32 0a 20 20 66 6f 72 65 61 63 68 20 6b  } y2.  foreach k
47f0: 77 20 5b 6c 73 6f 72 74 20 24 72 65 76 67 6c 69  w [lsort $revgli
4800: 6e 6b 28 24 79 29 5d 20 7b 0a 20 20 20 20 69 66  nk($y)] {.    if
4810: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 62   {[info exists b
4820: 61 63 6b 6c 69 6e 6b 28 24 6b 77 29 5d 7d 20 7b  acklink($kw)]} {
4830: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  .      foreach r
4840: 65 66 20 5b 6c 73 6f 72 74 20 24 62 61 63 6b 6c  ef [lsort $backl
4850: 69 6e 6b 28 24 6b 77 29 5d 20 7b 0a 20 20 20 20  ink($kw)] {.    
4860: 20 20 20 20 72 65 67 73 75 62 20 7b 23 2e 2a 7d      regsub {#.*}
4870: 20 24 72 65 66 20 7b 7d 20 72 65 66 32 0a 20 20   $ref {} ref2.  
4880: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 61        lappend pa
4890: 67 65 6c 69 6e 6b 28 24 79 32 29 20 24 72 65 66  gelink($y2) $ref
48a0: 32 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  2.      }.    }.
48b0: 20 20 7d 0a 7d 0a 66 6f 72 65 61 63 68 20 79 20    }.}.foreach y 
48c0: 5b 6c 73 6f 72 74 20 5b 61 72 72 61 79 20 6e 61  [lsort [array na
48d0: 6d 65 73 20 70 61 67 65 6c 69 6e 6b 5d 5d 20 7b  mes pagelink]] {
48e0: 0a 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b  .  if {[regexp {
48f0: 28 6e 65 77 73 7c 63 68 61 6e 67 65 73 7c 72 65  (news|changes|re
4900: 6c 65 61 73 65 6c 6f 67 7c 5b 30 2d 39 5d 74 6f  leaselog|[0-9]to
4910: 5b 30 2d 39 5d 7c 5e 64 6f 63 5f 2e 2a 5f 63 72  [0-9]|^doc_.*_cr
4920: 6f 73 73 72 65 66 29 7d 20 24 79 5d 7d 20 63 6f  ossref)} $y]} co
4930: 6e 74 69 6e 75 65 0a 20 20 68 64 5f 70 75 74 73  ntinue.  hd_puts
4940: 20 22 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 5c 22   "<li><a href=\"
4950: 24 79 5c 22 3e 24 79 3c 2f 61 3e 20 2d 20 22 0a  $y\">$y</a> - ".
4960: 20 20 73 65 74 20 70 72 65 76 20 7b 7d 0a 20 20    set prev {}.  
4970: 66 6f 72 65 61 63 68 20 72 65 66 20 5b 6c 73 6f  foreach ref [lso
4980: 72 74 20 24 70 61 67 65 6c 69 6e 6b 28 24 79 29  rt $pagelink($y)
4990: 5d 20 7b 0a 20 20 20 20 69 66 20 7b 24 72 65 66  ] {.    if {$ref
49a0: 3d 3d 24 70 72 65 76 7d 20 63 6f 6e 74 69 6e 75  ==$prev} continu
49b0: 65 0a 20 20 20 20 69 66 20 7b 24 72 65 66 3d 3d  e.    if {$ref==
49c0: 24 79 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20  $y} continue.   
49d0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 28 6e   if {[regexp {(n
49e0: 65 77 73 7c 63 68 61 6e 67 65 73 7c 72 65 6c 65  ews|changes|rele
49f0: 61 73 65 6c 6f 67 7c 5b 30 2d 39 5d 74 6f 5b 30  aselog|[0-9]to[0
4a00: 2d 39 5d 7c 5e 64 6f 63 5f 2e 2a 5f 63 72 6f 73  -9]|^doc_.*_cros
4a10: 73 72 65 66 29 7d 20 24 72 65 66 5d 7d 20 63 6f  sref)} $ref]} co
4a20: 6e 74 69 6e 75 65 0a 20 20 20 20 68 64 5f 70 75  ntinue.    hd_pu
4a30: 74 73 20 22 3c 61 20 68 72 65 66 3d 5c 22 24 72  ts "<a href=\"$r
4a40: 65 66 5c 22 3e 24 72 65 66 3c 2f 61 3e 20 22 0a  ef\">$ref</a> ".
4a50: 20 20 20 20 73 65 74 20 70 72 65 76 20 24 72 65      set prev $re
4a60: 66 0a 20 20 7d 0a 20 20 68 64 5f 70 75 74 73 20  f.  }.  hd_puts 
4a70: 22 3c 2f 6c 69 3e 22 0a 7d 0a 68 64 5f 70 75 74  "</li>".}.hd_put
4a80: 73 20 22 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f  s "</ul>".hd_clo
4a90: 73 65 5f 6d 61 69 6e 0a                          se_main.