Documentation Source Text

Hex Artifact Content
Login

Artifact 4604e87f77a1463f4f1bcaef28879d76295f81df:


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 24 28 44 45 53 54 29 20 64 69 72 65 63 74 6f   $(DEST) directo
0230: 72 79 2e 0a 23 0a 23 20 43 68 61 6e 67 65 73 20  ry..#.# Changes 
0240: 6d 61 64 65 20 74 6f 20 74 68 65 20 73 6f 75 72  made to the sour
0250: 63 65 20 66 69 6c 65 73 3a 0a 23 0a 23 20 20 20  ce files:.#.#   
0260: 20 20 2a 20 20 41 6e 20 61 70 70 72 6f 70 72 69    *  An appropri
0270: 61 74 65 20 68 65 61 64 65 72 20 28 63 6f 6e 74  ate header (cont
0280: 61 69 6e 69 6e 67 20 74 68 65 20 53 51 4c 69 74  aining the SQLit
0290: 65 20 6c 6f 67 6f 20 61 6e 64 20 73 74 61 6e 64  e logo and stand
02a0: 61 72 64 0a 23 20 20 20 20 20 20 20 20 6d 65 6e  ard.#        men
02b0: 75 20 62 61 72 29 20 69 73 20 70 72 65 70 65 6e  u bar) is prepen
02c0: 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ded to the file.
02d0: 20 20 0a 23 0a 23 20 20 20 20 20 2a 20 20 41 6e    .#.#     *  An
02e0: 79 20 3c 74 69 74 6c 65 3e 2e 2e 2e 3c 2f 74 69  y <title>...</ti
02f0: 74 6c 65 3e 20 69 6e 20 74 68 65 20 69 6e 70 75  tle> in the inpu
0300: 74 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  t is moved into 
0310: 74 68 65 20 70 72 65 70 65 6e 64 65 64 0a 23 20  the prepended.# 
0320: 20 20 20 20 20 20 20 68 65 61 64 65 72 2e 0a 23         header..#
0330: 0a 23 20 20 20 20 20 2a 20 20 41 6e 20 61 70 70  .#     *  An app
0340: 72 6f 70 72 69 61 74 65 20 66 6f 6f 74 65 72 20  ropriate footer 
0350: 69 73 20 61 70 70 65 6e 64 65 64 2e 0a 23 0a 23  is appended..#.#
0360: 20 20 20 20 20 2a 20 20 53 63 72 69 70 74 73 20       *  Scripts 
0370: 77 69 74 68 69 6e 20 3c 74 63 6c 3e 2e 2e 2e 3c  within <tcl>...<
0380: 2f 74 63 6c 3e 20 61 72 65 20 65 76 61 6c 75 61  /tcl> are evalua
0390: 74 65 64 2e 20 20 4f 75 74 70 75 74 20 74 68 61  ted.  Output tha
03a0: 74 0a 23 20 20 20 20 20 20 20 20 69 73 20 65 6d  t.#        is em
03b0: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 73 65  itted from these
03c0: 20 73 63 72 69 70 74 73 20 62 79 20 22 68 64 5f   scripts by "hd_
03d0: 70 75 74 73 22 20 6f 72 20 22 68 64 5f 72 65 73  puts" or "hd_res
03e0: 6f 6c 76 65 22 0a 23 20 20 20 20 20 20 20 20 70  olve".#        p
03f0: 72 6f 63 65 64 75 72 65 73 20 61 70 70 65 61 72  rocedures appear
0400: 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
0410: 65 20 6f 72 69 67 69 6e 61 6c 20 73 63 72 69 70  e original scrip
0420: 74 2e 0a 23 0a 23 20 20 20 20 20 2a 20 20 48 79  t..#.#     *  Hy
0430: 70 65 72 6c 69 6e 6b 73 20 77 69 74 68 69 6e 20  perlinks within 
0440: 5b 2e 2e 2e 5d 20 61 72 65 20 72 65 73 6f 6c 76  [...] are resolv
0450: 65 64 2e 0a 23 0a 23 20 41 20 74 77 6f 2d 70 61  ed..#.# A two-pa
0460: 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ss algorithm is 
0470: 75 73 65 64 2e 20 20 54 68 65 20 66 69 72 73 74  used.  The first
0480: 20 70 61 73 73 20 63 6f 6c 6c 65 63 74 73 20 74   pass collects t
0490: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 23 20 68 79  he names of.# hy
04a0: 70 65 72 6c 69 6e 6b 20 74 61 72 67 65 74 73 2c  perlink targets,
04b0: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 74 65   requirements te
04c0: 78 74 2c 20 61 6e 64 20 6f 74 68 65 72 20 67 6c  xt, and other gl
04d0: 6f 62 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  obal information
04e0: 2e 0a 23 20 54 68 65 20 73 65 63 6f 6e 64 20 70  ..# The second p
04f0: 61 73 73 20 75 73 65 73 20 74 68 65 20 64 61 74  ass uses the dat
0500: 61 20 67 61 74 68 65 72 65 64 20 6f 6e 20 74 68  a gathered on th
0510: 65 20 66 69 72 73 74 20 70 61 73 73 20 74 6f 20  e first pass to 
0520: 67 65 6e 65 72 61 74 65 0a 23 20 74 68 65 20 66  generate.# the f
0530: 69 6e 61 6c 20 6f 75 74 70 75 74 2e 0a 23 0a 73  inal output..#.s
0540: 65 74 20 44 4f 43 20 5b 6c 69 6e 64 65 78 20 24  et DOC [lindex $
0550: 61 72 67 76 20 30 5d 0a 73 65 74 20 53 52 43 20  argv 0].set SRC 
0560: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 31 5d  [lindex $argv 1]
0570: 0a 73 65 74 20 44 45 53 54 20 5b 6c 69 6e 64 65  .set DEST [linde
0580: 78 20 24 61 72 67 76 20 32 5d 0a 73 65 74 20 48  x $argv 2].set H
0590: 4f 4d 45 44 49 52 20 5b 70 77 64 5d 20 20 20 20  OMEDIR [pwd]    
05a0: 20 20 20 20 20 20 20 20 3b 23 20 41 6c 73 6f 20          ;# Also 
05b0: 72 65 6d 65 6d 62 65 72 20 6f 75 72 20 68 6f 6d  remember our hom
05c0: 65 20 64 69 72 65 63 74 6f 72 79 2e 0a 0a 73 6f  e directory...so
05d0: 75 72 63 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  urce [file dirna
05e0: 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d  me [info script]
05f0: 5d 2f 70 61 67 65 73 2f 66 61 6e 63 79 66 6f 72  ]/pages/fancyfor
0600: 6d 61 74 2e 74 63 6c 0a 0a 23 20 4f 70 65 6e 20  mat.tcl..# Open 
0610: 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61 62  the SQLite datab
0620: 61 73 65 2e 0a 23 0a 73 71 6c 69 74 65 33 20 64  ase..#.sqlite3 d
0630: 62 20 64 6f 63 69 6e 66 6f 2e 64 62 0a 64 62 20  b docinfo.db.db 
0640: 65 76 61 6c 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  eval {.  BEGIN;.
0650: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 69    DELETE FROM li
0660: 6e 6b 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  nk;.  DELETE FRO
0670: 4d 20 6b 65 79 77 6f 72 64 3b 0a 20 20 44 45 4c  M keyword;.  DEL
0680: 45 54 45 20 46 52 4f 4d 20 66 72 61 67 6d 65 6e  ETE FROM fragmen
0690: 74 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  t;.  DELETE FROM
06a0: 20 70 61 67 65 3b 0a 7d 0a 0a 23 20 4c 6f 61 64   page;.}..# Load
06b0: 20 74 68 65 20 73 79 6e 74 61 78 20 64 69 61 67   the syntax diag
06c0: 72 61 6d 20 6c 69 6e 6b 61 67 65 20 64 61 74 61  ram linkage data
06d0: 0a 23 0a 73 6f 75 72 63 65 20 24 44 4f 43 2f 61  .#.source $DOC/a
06e0: 72 74 2f 73 79 6e 74 61 78 2f 73 79 6e 74 61 78  rt/syntax/syntax
06f0: 5f 6c 69 6e 6b 61 67 65 2e 74 63 6c 0a 0a 0a 23  _linkage.tcl...#
0700: 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
0710: 73 74 2d 70 61 73 73 20 69 6d 70 6c 65 6d 65 6e  st-pass implemen
0720: 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 63 65 64  tation of proced
0730: 75 72 65 20 74 68 61 74 20 72 65 6e 64 65 72 73  ure that renders
0740: 0a 23 20 68 79 70 65 72 6c 69 6e 6b 73 2e 20 20  .# hyperlinks.  
0750: 44 6f 20 6e 6f 74 20 65 76 65 6e 20 62 6f 74 68  Do not even both
0760: 65 72 20 74 72 79 69 6e 67 20 74 6f 20 64 6f 20  er trying to do 
0770: 61 6e 79 74 68 69 6e 67 20 64 75 72 69 6e 67 20  anything during 
0780: 74 68 65 0a 23 20 66 69 72 73 74 20 70 61 73 73  the.# first pass
0790: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 63 6f  .  We have to co
07a0: 6c 6c 65 63 74 20 6b 65 79 77 6f 72 64 20 69 6e  llect keyword in
07b0: 66 6f 72 6d 61 74 69 6f 6e 20 62 65 66 6f 72 65  formation before
07c0: 20 74 68 65 0a 23 20 68 79 70 65 72 6c 69 6e 6b   the.# hyperlink
07d0: 73 20 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c  s are meaningful
07e0: 2e 20 20 0a 23 0a 70 72 6f 63 20 68 64 5f 72 65  .  .#.proc hd_re
07f0: 73 6f 6c 76 65 20 7b 74 65 78 74 7d 20 7b 0a 20  solve {text} {. 
0800: 20 68 64 5f 70 75 74 73 20 24 74 65 78 74 0a 7d   hd_puts $text.}
0810: 0a 0a 23 20 54 68 69 73 20 69 73 20 74 68 65 20  ..# This is the 
0820: 73 65 63 6f 6e 64 2d 70 61 73 73 20 69 6d 70 6c  second-pass impl
0830: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
0840: 65 20 70 72 6f 63 65 64 75 72 65 20 74 68 61 74  e procedure that
0850: 0a 23 20 72 65 6e 64 65 72 73 20 68 79 70 65 72  .# renders hyper
0860: 6c 69 6e 6b 73 2e 20 20 43 6f 6e 76 65 72 74 20  links.  Convert 
0870: 61 6c 6c 20 68 79 70 65 72 6c 69 6e 6b 73 20 69  all hyperlinks i
0880: 6e 20 24 74 65 78 74 20 69 6e 74 6f 20 0a 23 20  n $text into .# 
0890: 61 70 70 72 6f 70 72 69 61 74 65 20 3c 61 20 68  appropriate <a h
08a0: 72 65 66 3d 22 22 3e 20 6d 61 72 6b 75 70 2e 0a  ref=""> markup..
08b0: 23 0a 23 20 4c 69 6e 6b 73 20 74 6f 20 6b 65 79  #.# Links to key
08c0: 77 6f 72 64 73 20 77 69 74 68 69 6e 20 74 68 65  words within the
08d0: 20 73 61 6d 65 20 6d 61 69 6e 20 66 69 6c 65 20   same main file 
08e0: 61 72 65 20 72 65 73 6f 6c 76 65 64 20 75 73 69  are resolved usi
08f0: 6e 67 0a 23 20 24 3a 3a 6c 6c 69 6e 6b 28 29 20  ng.# $::llink() 
0900: 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 20 41 6c  if possible.  Al
0910: 6c 20 6f 74 68 65 72 20 6c 69 6e 6b 73 20 61 6e  l other links an
0920: 64 20 6c 69 6e 6b 73 20 74 68 61 74 20 63 6f 75  d links that cou
0930: 6c 64 0a 23 20 6e 6f 74 20 62 65 20 72 65 73 6f  ld.# not be reso
0940: 6c 76 65 64 20 75 73 69 6e 67 20 24 3a 3a 6c 6c  lved using $::ll
0950: 69 6e 6b 28 29 20 61 72 65 20 72 65 73 6f 6c 76  ink() are resolv
0960: 65 64 20 75 73 69 6e 67 20 24 3a 3a 67 6c 69 6e  ed using $::glin
0970: 6b 28 29 2e 0a 23 20 0a 70 72 6f 63 20 68 64 5f  k()..# .proc hd_
0980: 72 65 73 6f 6c 76 65 5f 32 6e 64 70 61 73 73 20  resolve_2ndpass 
0990: 7b 74 65 78 74 7d 20 7b 0a 20 20 72 65 67 73 75  {text} {.  regsu
09a0: 62 20 2d 61 6c 6c 20 7b 5c 5b 28 2e 2a 3f 29 5c  b -all {\[(.*?)\
09b0: 5d 7d 20 24 74 65 78 74 20 5c 0a 20 20 20 20 20  ]} $text \.     
09c0: 20 22 5c 31 37 35 3b 20 68 64 5f 72 65 73 6f 6c   "\175; hd_resol
09d0: 76 65 5f 6f 6e 65 20 5c 31 37 33 5c 5c 31 5c 31  ve_one \173\\1\1
09e0: 37 35 3b 20 68 64 5f 70 75 74 73 20 5c 31 37 33  75; hd_puts \173
09f0: 22 20 74 65 78 74 0a 20 20 65 76 61 6c 20 22 68  " text.  eval "h
0a00: 64 5f 70 75 74 73 20 5c 31 37 33 24 74 65 78 74  d_puts \173$text
0a10: 5c 31 37 35 22 0a 7d 0a 70 72 6f 63 20 68 64 5f  \175".}.proc hd_
0a20: 72 65 73 6f 6c 76 65 5f 6f 6e 65 20 7b 78 7d 20  resolve_one {x} 
0a30: 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  {.  if {[string 
0a40: 69 73 20 69 6e 74 65 67 65 72 20 24 78 5d 7d 20  is integer $x]} 
0a50: 7b 0a 20 20 20 20 68 64 5f 70 75 74 73 20 5c 5b  {.    hd_puts \[
0a60: 24 78 5c 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a  $x\].    return.
0a70: 20 20 7d 0a 20 20 73 65 74 20 78 32 20 5b 73 70    }.  set x2 [sp
0a80: 6c 69 74 20 24 78 20 7c 5d 0a 20 20 73 65 74 20  lit $x |].  set 
0a90: 6b 77 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  kw [string trim 
0aa0: 5b 6c 69 6e 64 65 78 20 24 78 32 20 30 5d 5d 0a  [lindex $x2 0]].
0ab0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
0ac0: 78 32 5d 3d 3d 31 7d 20 7b 0a 20 20 20 20 73 65  x2]==1} {.    se
0ad0: 74 20 63 6f 6e 74 65 6e 74 20 24 6b 77 0a 20 20  t content $kw.  
0ae0: 20 20 72 65 67 73 75 62 20 7b 5c 28 5b 5e 29 5d    regsub {\([^)]
0af0: 2a 5c 29 7d 20 24 63 6f 6e 74 65 6e 74 20 7b 7d  *\)} $content {}
0b00: 20 6b 77 0a 20 20 20 20 69 66 20 7b 21 5b 72 65   kw.    if {![re
0b10: 67 65 78 70 20 7b 5e 68 74 74 70 7d 20 24 6b 77  gexp {^http} $kw
0b20: 5d 7d 20 7b 72 65 67 73 75 62 20 7b 3d 2e 2a 7d  ]} {regsub {=.*}
0b30: 20 24 6b 77 20 7b 7d 20 6b 77 7d 0a 20 20 7d 20   $kw {} kw}.  } 
0b40: 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 63  else {.    set c
0b50: 6f 6e 74 65 6e 74 20 5b 73 74 72 69 6e 67 20 74  ontent [string t
0b60: 72 69 6d 20 5b 6c 69 6e 64 65 78 20 24 78 32 20  rim [lindex $x2 
0b70: 31 5d 5d 0a 20 20 7d 0a 20 20 69 66 20 7b 21 5b  1]].  }.  if {![
0b80: 72 65 67 65 78 70 20 7b 5e 68 74 74 70 73 3f 3a  regexp {^https?:
0b90: 7d 20 24 6b 77 5d 7d 20 7b 0a 20 20 20 20 72 65  } $kw]} {.    re
0ba0: 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 5e 61 2d 7a  gsub -all {[^a-z
0bb0: 41 2d 5a 30 2d 39 5f 2e 23 2f 20 2d 5d 7d 20 24  A-Z0-9_.#/ -]} $
0bc0: 6b 77 20 7b 7d 20 6b 77 0a 20 20 7d 0a 20 20 67  kw {} kw.  }.  g
0bd0: 6c 6f 62 61 6c 20 68 64 20 6c 6c 69 6e 6b 20 67  lobal hd llink g
0be0: 6c 69 6e 6b 20 62 61 63 6b 6c 69 6e 6b 0a 20 20  link backlink.  
0bf0: 69 66 20 7b 24 68 64 28 65 6e 61 62 6c 65 2d 6d  if {$hd(enable-m
0c00: 61 69 6e 29 7d 20 7b 0a 20 20 20 20 73 65 74 20  ain)} {.    set 
0c10: 66 6e 20 24 68 64 28 66 6e 2d 6d 61 69 6e 29 0a  fn $hd(fn-main).
0c20: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
0c30: 7b 5e 68 74 74 70 73 3f 3a 7d 20 24 6b 77 5d 7d  {^https?:} $kw]}
0c40: 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e   {.      puts -n
0c50: 6f 6e 65 77 6c 69 6e 65 20 24 68 64 28 6d 61 69  onewline $hd(mai
0c60: 6e 29 20 5c 0a 20 20 20 20 20 20 20 20 22 3c 61  n) \.        "<a
0c70: 20 68 72 65 66 3d 5c 22 24 6b 77 5c 22 3e 24 63   href=\"$kw\">$c
0c80: 6f 6e 74 65 6e 74 3c 2f 61 3e 22 0a 20 20 20 20  ontent</a>".    
0c90: 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78  } elseif {[regex
0ca0: 70 20 7b 5e 5b 54 74 5d 69 63 6b 65 74 20 23 28  p {^[Tt]icket #(
0cb0: 5c 64 2b 29 24 7d 20 24 6b 77 20 61 6c 6c 20 74  \d+)$} $kw all t
0cc0: 6b 74 69 64 5d 7d 20 7b 0a 20 20 20 20 20 20 73  ktid]} {.      s
0cd0: 65 74 20 75 72 6c 20 68 74 74 70 3a 2f 2f 77 77  et url http://ww
0ce0: 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 63 76 73  w.sqlite.org/cvs
0cf0: 74 72 61 63 2f 74 6b 74 76 69 65 77 3f 74 6e 3d  trac/tktview?tn=
0d00: 24 74 6b 74 69 64 0a 20 20 20 20 20 20 70 75 74  $tktid.      put
0d10: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64  s -nonewline $hd
0d20: 28 6d 61 69 6e 29 20 5c 0a 20 20 20 20 20 20 20  (main) \.       
0d30: 20 22 3c 61 20 68 72 65 66 3d 5c 22 24 75 72 6c   "<a href=\"$url
0d40: 5c 22 3e 24 63 6f 6e 74 65 6e 74 3c 2f 61 3e 22  \">$content</a>"
0d50: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b  .    } elseif {[
0d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 6c 6c 69 6e  info exists llin
0d70: 6b 28 24 66 6e 3a 24 6b 77 29 5d 7d 20 7b 0a 20  k($fn:$kw)]} {. 
0d80: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
0d90: 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e 29 20 5c  line $hd(main) \
0da0: 0a 20 20 20 20 20 20 20 20 22 3c 61 20 68 72 65  .        "<a hre
0db0: 66 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74 68  f=\"$hd(rootpath
0dc0: 2d 6d 61 69 6e 29 24 6c 6c 69 6e 6b 28 24 66 6e  -main)$llink($fn
0dd0: 3a 24 6b 77 29 5c 22 3e 24 63 6f 6e 74 65 6e 74  :$kw)\">$content
0de0: 3c 2f 61 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65  </a>".    } else
0df0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
0e00: 20 67 6c 69 6e 6b 28 24 6b 77 29 5d 7d 20 7b 0a   glink($kw)]} {.
0e10: 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65        puts -none
0e20: 77 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e 29 20  wline $hd(main) 
0e30: 5c 0a 20 20 20 20 20 20 20 20 22 3c 61 20 68 72  \.        "<a hr
0e40: 65 66 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74  ef=\"$hd(rootpat
0e50: 68 2d 6d 61 69 6e 29 24 67 6c 69 6e 6b 28 24 6b  h-main)$glink($k
0e60: 77 29 5c 22 3e 24 63 6f 6e 74 65 6e 74 3c 2f 61  w)\">$content</a
0e70: 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20  >".    } elseif 
0e80: 7b 5b 72 65 67 65 78 70 20 7b 5c 2e 67 69 66 24  {[regexp {\.gif$
0e90: 7d 20 24 6b 77 5d 7d 20 7b 0a 20 20 20 20 20 20  } $kw]} {.      
0ea0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
0eb0: 24 68 64 28 6d 61 69 6e 29 20 5c 0a 20 20 20 20  $hd(main) \.    
0ec0: 20 20 20 20 22 3c 69 6d 67 20 73 72 63 3d 5c 22      "<img src=\"
0ed0: 24 68 64 28 72 6f 6f 74 70 61 74 68 2d 6d 61 69  $hd(rootpath-mai
0ee0: 6e 29 69 6d 61 67 65 73 2f 24 6b 77 5c 22 3e 22  n)images/$kw\">"
0ef0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
0f00: 20 20 20 20 70 75 74 73 20 73 74 64 65 72 72 20      puts stderr 
0f10: 22 45 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20  "ERROR: unknown 
0f20: 68 79 70 65 72 6c 69 6e 6b 20 74 61 72 67 65 74  hyperlink target
0f30: 3a 20 24 6b 77 22 0a 20 20 20 20 20 20 70 75 74  : $kw".      put
0f40: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64  s -nonewline $hd
0f50: 28 6d 61 69 6e 29 20 22 3c 66 6f 6e 74 20 63 6f  (main) "<font co
0f60: 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e 24 63 6f 6e  lor=\"red\">$con
0f70: 74 65 6e 74 3c 2f 66 6f 6e 74 3e 22 0a 20 20 20  tent</font>".   
0f80: 20 7d 0a 20 20 20 20 69 66 20 7b 24 68 64 28 66   }.    if {$hd(f
0f90: 72 61 67 6d 65 6e 74 29 21 3d 22 22 7d 20 7b 0a  ragment)!=""} {.
0fa0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 62 61        lappend ba
0fb0: 63 6b 6c 69 6e 6b 28 24 6b 77 29 20 24 66 6e 23  cklink($kw) $fn#
0fc0: 24 68 64 28 66 72 61 67 6d 65 6e 74 29 0a 20 20  $hd(fragment).  
0fd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
0fe0: 20 6c 61 70 70 65 6e 64 20 62 61 63 6b 6c 69 6e   lappend backlin
0ff0: 6b 28 24 6b 77 29 20 24 66 6e 0a 20 20 20 20 7d  k($kw) $fn.    }
1000: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 68 64 28 65  .  }.  if {$hd(e
1010: 6e 61 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20 20  nable-aux)} {.  
1020: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e    if {[regexp {^
1030: 68 74 74 70 73 3f 3a 7d 20 24 6b 77 5d 7d 20 7b  https?:} $kw]} {
1040: 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e  .      puts -non
1050: 65 77 6c 69 6e 65 20 24 68 64 28 61 75 78 29 20  ewline $hd(aux) 
1060: 5c 0a 20 20 20 20 20 20 20 20 22 3c 61 20 68 72  \.        "<a hr
1070: 65 66 3d 5c 22 24 6b 77 5c 22 3e 24 63 6f 6e 74  ef=\"$kw\">$cont
1080: 65 6e 74 3c 2f 61 3e 22 0a 20 20 20 20 7d 20 65  ent</a>".    } e
1090: 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70 20 7b  lseif {[regexp {
10a0: 5e 5b 54 74 5d 69 63 6b 65 74 20 23 28 5c 64 2b  ^[Tt]icket #(\d+
10b0: 29 24 7d 20 24 6b 77 20 61 6c 6c 20 74 6b 74 69  )$} $kw all tkti
10c0: 64 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  d]} {.      set 
10d0: 75 72 6c 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  url http://www.s
10e0: 71 6c 69 74 65 2e 6f 72 67 2f 63 76 73 74 72 61  qlite.org/cvstra
10f0: 63 2f 74 6b 74 76 69 65 77 3f 74 6e 3d 24 74 6b  c/tktview?tn=$tk
1100: 74 69 64 0a 20 20 20 20 20 20 70 75 74 73 20 2d  tid.      puts -
1110: 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64 28 61 75  nonewline $hd(au
1120: 78 29 20 5c 0a 20 20 20 20 20 20 20 20 22 3c 61  x) \.        "<a
1130: 20 68 72 65 66 3d 5c 22 24 75 72 6c 5c 22 3e 24   href=\"$url\">$
1140: 63 6f 6e 74 65 6e 74 3c 2f 61 3e 22 0a 20 20 20  content</a>".   
1150: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
1160: 20 65 78 69 73 74 73 20 67 6c 69 6e 6b 28 24 6b   exists glink($k
1170: 77 29 5d 7d 20 7b 0a 20 20 20 20 20 20 70 75 74  w)]} {.      put
1180: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64  s -nonewline $hd
1190: 28 61 75 78 29 20 5c 0a 20 20 20 20 20 20 20 20  (aux) \.        
11a0: 22 3c 61 20 68 72 65 66 3d 5c 22 24 68 64 28 72  "<a href=\"$hd(r
11b0: 6f 6f 74 70 61 74 68 2d 61 75 78 29 24 67 6c 69  ootpath-aux)$gli
11c0: 6e 6b 28 24 6b 77 29 5c 22 3e 24 63 6f 6e 74 65  nk($kw)\">$conte
11d0: 6e 74 3c 2f 61 3e 22 0a 20 20 20 20 7d 20 65 6c  nt</a>".    } el
11e0: 73 65 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5c  seif {[regexp {\
11f0: 2e 67 69 66 24 7d 20 24 6b 77 5d 7d 20 7b 0a 20  .gif$} $kw]} {. 
1200: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
1210: 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e 29 20 5c  line $hd(main) \
1220: 0a 20 20 20 20 20 20 20 20 22 3c 69 6d 67 20 73  .        "<img s
1230: 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74  rc=\"$hd(rootpat
1240: 68 2d 61 75 78 29 69 6d 61 67 65 73 2f 24 6b 77  h-aux)images/$kw
1250: 5c 22 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65 20  \">".    } else 
1260: 7b 0a 20 20 20 20 20 20 70 75 74 73 20 73 74 64  {.      puts std
1270: 65 72 72 20 22 45 52 52 4f 52 3a 20 75 6e 6b 6e  err "ERROR: unkn
1280: 6f 77 6e 20 68 79 70 65 72 6c 69 6e 6b 20 74 61  own hyperlink ta
1290: 72 67 65 74 3a 20 24 6b 77 22 0a 20 20 20 20 20  rget: $kw".     
12a0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
12b0: 20 24 68 64 28 61 75 78 29 20 22 3c 66 6f 6e 74   $hd(aux) "<font
12c0: 20 63 6f 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e 24   color=\"red\">$
12d0: 63 6f 6e 74 65 6e 74 3c 2f 66 6f 6e 74 3e 22 0a  content</font>".
12e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 24 68      }.    if {$h
12f0: 64 28 61 75 78 2d 66 72 61 67 6d 65 6e 74 29 21  d(aux-fragment)!
1300: 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70  =""} {.      lap
1310: 70 65 6e 64 20 62 61 63 6b 6c 69 6e 6b 28 24 6b  pend backlink($k
1320: 77 29 20 24 68 64 28 66 6e 2d 61 75 78 29 23 24  w) $hd(fn-aux)#$
1330: 68 64 28 61 75 78 2d 66 72 61 67 6d 65 6e 74 29  hd(aux-fragment)
1340: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1350: 20 20 20 20 6c 61 70 70 65 6e 64 20 62 61 63 6b      lappend back
1360: 6c 69 6e 6b 28 24 6b 77 29 20 24 68 64 28 66 6e  link($kw) $hd(fn
1370: 2d 61 75 78 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  -aux).    }.  }.
1380: 7d 0a 0a 0a 0a 23 20 52 65 63 6f 72 64 20 74 68  }....# Record th
1390: 65 20 66 61 63 74 20 74 68 61 74 20 61 6c 6c 20  e fact that all 
13a0: 6b 65 79 77 6f 72 64 73 20 67 69 76 65 6e 20 69  keywords given i
13b0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6c  n the argument l
13c0: 69 73 74 20 73 68 6f 75 6c 64 0a 23 20 63 61 75  ist should.# cau
13d0: 73 65 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  se a jump to the
13e0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
13f0: 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1400: 20 66 69 6c 65 2e 0a 23 0a 23 20 49 66 20 6f 6e   file..#.# If on
1410: 6c 79 20 74 68 65 20 6d 61 69 6e 20 6f 75 74 70  ly the main outp
1420: 75 74 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  ut file is open,
1430: 20 74 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   then all refere
1440: 6e 63 65 73 20 74 6f 20 74 68 65 0a 23 20 6b 65  nces to the.# ke
1450: 79 77 6f 72 64 20 6a 75 6d 70 20 74 6f 20 74 68  yword jump to th
1460: 65 20 6d 61 69 6e 20 6f 75 74 70 75 74 20 66 69  e main output fi
1470: 6c 65 2e 20 20 49 66 20 62 6f 74 68 20 6d 61 69  le.  If both mai
1480: 6e 20 61 6e 64 20 61 75 78 20 61 72 65 0a 23 20  n and aux are.# 
1490: 6f 70 65 6e 20 74 68 65 6e 20 72 65 66 65 72 65  open then refere
14a0: 6e 63 65 73 20 66 72 6f 6d 20 77 69 74 68 69 6e  nces from within
14b0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6a   the main file j
14c0: 75 6d 70 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  ump to the main 
14d0: 66 69 6c 65 0a 23 20 61 6e 64 20 61 6c 6c 20 6f  file.# and all o
14e0: 74 68 65 72 20 72 65 66 65 72 65 6e 63 65 73 20  ther references 
14f0: 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 75 78 69  jump to the auxi
1500: 6c 69 61 72 79 20 66 69 6c 65 2e 0a 23 0a 23 20  liary file..#.# 
1510: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
1520: 73 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 64 75  s only active du
1530: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ring the first p
1540: 61 73 73 20 77 68 65 6e 20 77 65 20 61 72 65 0a  ass when we are.
1550: 23 20 63 6f 6c 6c 65 63 74 69 6e 67 20 68 79 70  # collecting hyp
1560: 65 72 6c 69 6e 6b 20 69 6e 66 6f 72 6d 61 74 69  erlink informati
1570: 6f 6e 2e 20 20 54 68 69 73 20 70 72 6f 63 65 64  on.  This proced
1580: 75 72 65 20 69 73 20 72 65 64 65 66 69 6e 65 64  ure is redefined
1590: 20 74 6f 0a 23 20 62 65 20 61 20 6e 6f 2d 6f 70   to.# be a no-op
15a0: 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 72   before the star
15b0: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
15c0: 70 61 73 73 2e 0a 23 0a 70 72 6f 63 20 68 64 5f  pass..#.proc hd_
15d0: 6b 65 79 77 6f 72 64 73 20 7b 61 72 67 73 7d 20  keywords {args} 
15e0: 7b 0a 20 20 67 6c 6f 62 61 6c 20 67 6c 69 6e 6b  {.  global glink
15f0: 20 6c 6c 69 6e 6b 20 68 64 0a 20 20 69 66 20 7b   llink hd.  if {
1600: 24 68 64 28 66 72 61 67 6d 65 6e 74 29 3d 3d 22  $hd(fragment)=="
1610: 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 6c 75 72  "} {.    set lur
1620: 6c 20 24 68 64 28 66 6e 2d 6d 61 69 6e 29 0a 20  l $hd(fn-main). 
1630: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65   } else {.    se
1640: 74 20 6c 75 72 6c 20 22 23 24 68 64 28 66 72 61  t lurl "#$hd(fra
1650: 67 6d 65 6e 74 29 22 0a 20 20 7d 0a 20 20 73 65  gment)".  }.  se
1660: 74 20 66 6e 20 24 68 64 28 66 6e 2d 6d 61 69 6e  t fn $hd(fn-main
1670: 29 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78  ).  if {[info ex
1680: 69 73 74 73 20 68 64 28 61 75 78 29 5d 7d 20 7b  ists hd(aux)]} {
1690: 0a 20 20 20 20 73 65 74 20 67 75 72 6c 20 24 68  .    set gurl $h
16a0: 64 28 66 6e 2d 61 75 78 29 0a 20 20 20 20 69 66  d(fn-aux).    if
16b0: 20 7b 24 68 64 28 61 75 78 2d 66 72 61 67 6d 65   {$hd(aux-fragme
16c0: 6e 74 29 21 3d 22 22 7d 20 7b 0a 20 20 20 20 20  nt)!=""} {.     
16d0: 20 61 70 70 65 6e 64 20 67 75 72 6c 20 22 23 24   append gurl "#$
16e0: 68 64 28 61 75 78 2d 66 72 61 67 6d 65 6e 74 29  hd(aux-fragment)
16f0: 22 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ".    }.  } else
1700: 20 7b 0a 20 20 20 20 73 65 74 20 67 75 72 6c 20   {.    set gurl 
1710: 7b 7d 0a 20 20 20 20 69 66 20 7b 24 68 64 28 66  {}.    if {$hd(f
1720: 72 61 67 6d 65 6e 74 29 21 3d 22 22 7d 20 7b 0a  ragment)!=""} {.
1730: 20 20 20 20 20 20 73 65 74 20 6c 75 72 6c 20 24        set lurl $
1740: 68 64 28 66 6e 2d 6d 61 69 6e 29 23 24 68 64 28  hd(fn-main)#$hd(
1750: 66 72 61 67 6d 65 6e 74 29 0a 20 20 20 20 7d 0a  fragment).    }.
1760: 20 20 7d 0a 20 20 73 65 74 20 6f 76 65 72 72 69    }.  set overri
1770: 64 65 5f 66 6c 61 67 20 30 0a 20 20 66 6f 72 65  de_flag 0.  fore
1780: 61 63 68 20 61 20 24 61 72 67 73 20 7b 0a 20 20  ach a $args {.  
1790: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e    if {[regexp {^
17a0: 2d 2b 28 2e 2a 29 7d 20 24 61 20 61 6c 6c 20 70  -+(.*)} $a all p
17b0: 61 72 61 6d 5d 7d 20 7b 0a 20 20 20 20 20 20 73  aram]} {.      s
17c0: 77 69 74 63 68 20 24 70 61 72 61 6d 20 7b 0a 20  witch $param {. 
17d0: 20 20 20 20 20 20 20 22 6f 76 65 72 72 69 64 65         "override
17e0: 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 73  " {.           s
17f0: 65 74 20 6f 76 65 72 72 69 64 65 5f 66 6c 61 67  et override_flag
1800: 20 31 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   1.        }.   
1810: 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 20       default {. 
1820: 20 20 20 20 20 20 20 20 20 20 70 75 74 73 20 73            puts s
1830: 74 64 65 72 72 20 22 45 52 52 4f 52 3a 20 75 6e  tderr "ERROR: un
1840: 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 3a  known parameter:
1850: 20 24 61 22 0a 20 20 20 20 20 20 20 20 7d 0a 20   $a".        }. 
1860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
1870: 74 69 6e 75 65 0a 20 20 20 20 7d 0a 20 20 20 20  tinue.    }.    
1880: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5c 2a  if {[regexp {^\*
1890: 7d 20 24 61 5d 7d 20 7b 0a 20 20 20 20 20 20 73  } $a]} {.      s
18a0: 65 74 20 76 69 73 69 62 6c 65 20 30 0a 20 20 20  et visible 0.   
18b0: 20 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67     set a [string
18c0: 20 72 61 6e 67 65 20 24 61 20 31 20 65 6e 64 5d   range $a 1 end]
18d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18e0: 20 20 20 20 73 65 74 20 76 69 73 69 62 6c 65 20      set visible 
18f0: 31 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 73  1.    }.    regs
1900: 75 62 20 2d 61 6c 6c 20 7b 5b 5e 61 2d 7a 41 2d  ub -all {[^a-zA-
1910: 5a 30 2d 39 5f 2e 23 2f 20 2d 5d 7d 20 24 61 20  Z0-9_.#/ -]} $a 
1920: 7b 7d 20 6b 77 0a 20 20 20 20 69 66 20 7b 5b 69  {} kw.    if {[i
1930: 6e 66 6f 20 65 78 69 73 74 73 20 67 6c 69 6e 6b  nfo exists glink
1940: 28 24 6b 77 29 5d 7d 20 7b 0a 20 20 20 20 20 20  ($kw)]} {.      
1950: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1960: 20 68 64 28 61 75 78 29 5d 20 26 26 20 24 67 6c   hd(aux)] && $gl
1970: 69 6e 6b 28 24 6b 77 29 3d 3d 24 68 64 28 66 6e  ink($kw)==$hd(fn
1980: 2d 61 75 78 29 7d 20 7b 0a 20 20 20 20 20 20 20  -aux)} {.       
1990: 20 64 62 20 65 76 61 6c 20 7b 44 45 4c 45 54 45   db eval {DELETE
19a0: 20 46 52 4f 4d 20 6b 65 79 77 6f 72 64 20 57 48   FROM keyword WH
19b0: 45 52 45 20 6b 77 3d 24 6b 77 7d 0a 20 20 20 20  ERE kw=$kw}.    
19c0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 6f 76 65    } elseif {$ove
19d0: 72 72 69 64 65 5f 66 6c 61 67 3d 3d 30 7d 20 7b  rride_flag==0} {
19e0: 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 73 74  .        puts st
19f0: 64 65 72 72 20 22 57 41 52 4e 49 4e 47 3a 20 64  derr "WARNING: d
1a00: 75 70 6c 69 63 61 74 65 20 6b 65 79 77 6f 72 64  uplicate keyword
1a10: 20 5c 22 24 6b 77 5c 22 20 2d 20 24 67 6c 69 6e   \"$kw\" - $glin
1a20: 6b 28 24 6b 77 29 20 61 6e 64 20 24 6c 75 72 6c  k($kw) and $lurl
1a30: 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ".      }.    }.
1a40: 20 20 20 20 69 66 20 7b 24 67 75 72 6c 3d 3d 22      if {$gurl=="
1a50: 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 67  "} {.      set g
1a60: 6c 69 6e 6b 28 24 6b 77 29 20 24 6c 75 72 6c 0a  link($kw) $lurl.
1a70: 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49        db eval {I
1a80: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
1a90: 49 4e 54 4f 20 6b 65 79 77 6f 72 64 28 6b 77 2c  INTO keyword(kw,
1aa0: 66 72 61 67 6d 65 6e 74 2c 69 6e 64 65 78 4b 77  fragment,indexKw
1ab0: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
1ac0: 20 20 20 56 41 4c 55 45 53 28 24 61 2c 24 6c 75     VALUES($a,$lu
1ad0: 72 6c 2c 24 76 69 73 69 62 6c 65 29 7d 0a 20 20  rl,$visible)}.  
1ae0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1af0: 20 73 65 74 20 67 6c 69 6e 6b 28 24 6b 77 29 20   set glink($kw) 
1b00: 24 67 75 72 6c 0a 20 20 20 20 20 20 73 65 74 20  $gurl.      set 
1b10: 6c 6c 69 6e 6b 28 24 66 6e 3a 24 6b 77 29 20 24  llink($fn:$kw) $
1b20: 6c 75 72 6c 0a 20 20 20 20 20 20 64 62 20 65 76  lurl.      db ev
1b30: 61 6c 20 7b 49 4e 53 45 52 54 20 4f 52 20 49 47  al {INSERT OR IG
1b40: 4e 4f 52 45 20 49 4e 54 4f 20 6b 65 79 77 6f 72  NORE INTO keywor
1b50: 64 28 6b 77 2c 66 72 61 67 6d 65 6e 74 2c 69 6e  d(kw,fragment,in
1b60: 64 65 78 4b 77 29 20 0a 20 20 20 20 20 20 20 20  dexKw) .        
1b70: 20 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 24          VALUES($
1b80: 61 2c 24 67 75 72 6c 2c 24 76 69 73 69 62 6c 65  a,$gurl,$visible
1b90: 29 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  )}.    }.  }.}..
1ba0: 23 20 53 74 61 72 74 20 61 20 6e 65 77 20 66 72  # Start a new fr
1bb0: 61 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 6d 61  agment in the ma
1bc0: 69 6e 20 66 69 6c 65 2e 20 20 47 69 76 65 20 74  in file.  Give t
1bd0: 68 65 20 6e 65 77 20 66 72 61 67 6d 65 6e 74 20  he new fragment 
1be0: 74 68 65 0a 23 20 69 6e 64 69 63 61 74 65 64 20  the.# indicated 
1bf0: 6e 61 6d 65 2e 20 20 41 6e 79 20 6b 65 79 77 6f  name.  Any keywo
1c00: 72 64 73 20 64 65 66 69 6e 65 64 20 61 66 74 65  rds defined afte
1c10: 72 20 74 68 69 73 20 70 6f 69 6e 74 20 77 69 6c  r this point wil
1c20: 6c 20 72 65 66 65 72 0a 23 20 74 6f 20 74 68 65  l refer.# to the
1c30: 20 66 72 61 67 6d 65 6e 74 2c 20 6e 6f 74 20 74   fragment, not t
1c40: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1c50: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 23 0a 70  of the file..#.p
1c60: 72 6f 63 20 68 64 5f 66 72 61 67 6d 65 6e 74 20  roc hd_fragment 
1c70: 7b 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  {name args} {.  
1c80: 67 6c 6f 62 61 6c 20 68 64 0a 20 20 73 65 74 20  global hd.  set 
1c90: 68 64 28 66 72 61 67 6d 65 6e 74 29 20 24 6e 61  hd(fragment) $na
1ca0: 6d 65 0a 20 20 70 75 74 73 20 24 68 64 28 6d 61  me.  puts $hd(ma
1cb0: 69 6e 29 20 22 3c 61 20 6e 61 6d 65 3d 5c 22 24  in) "<a name=\"$
1cc0: 6e 61 6d 65 5c 22 3e 3c 2f 61 3e 22 0a 20 20 69  name\"></a>".  i
1cd0: 66 20 7b 24 68 64 28 65 6e 61 62 6c 65 2d 61 75  f {$hd(enable-au
1ce0: 78 29 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 24  x)} {.    puts $
1cf0: 68 64 28 61 75 78 29 20 22 3c 61 20 6e 61 6d 65  hd(aux) "<a name
1d00: 3d 5c 22 24 6e 61 6d 65 5c 22 3e 3c 2f 61 3e 22  =\"$name\"></a>"
1d10: 0a 20 20 20 20 73 65 74 20 68 64 28 61 75 78 2d  .    set hd(aux-
1d20: 66 72 61 67 6d 65 6e 74 29 20 24 6e 61 6d 65 0a  fragment) $name.
1d30: 20 20 7d 0a 20 20 65 76 61 6c 20 68 64 5f 6b 65    }.  eval hd_ke
1d40: 79 77 6f 72 64 73 20 24 61 72 67 73 0a 7d 0a 0a  ywords $args.}..
1d50: 23 20 57 72 69 74 65 20 72 61 77 20 6f 75 74 70  # Write raw outp
1d60: 75 74 20 74 6f 20 62 6f 74 68 20 74 68 65 20 6d  ut to both the m
1d70: 61 69 6e 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ain file and the
1d80: 20 61 75 78 69 6c 69 61 72 79 2e 20 20 4f 6e 6c   auxiliary.  Onl
1d90: 79 20 77 72 69 74 65 0a 23 20 74 6f 20 66 69 6c  y write.# to fil
1da0: 65 73 20 74 68 61 74 20 61 72 65 20 65 6e 61 62  es that are enab
1db0: 6c 65 64 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 70  led..#.proc hd_p
1dc0: 75 74 73 20 7b 74 65 78 74 7d 20 7b 0a 20 20 67  uts {text} {.  g
1dd0: 6c 6f 62 61 6c 20 68 64 0a 20 20 69 66 20 7b 24  lobal hd.  if {$
1de0: 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29 7d  hd(enable-main)}
1df0: 20 7b 0a 20 20 20 20 73 65 74 20 66 6e 20 24 68   {.    set fn $h
1e00: 64 28 66 6e 2d 6d 61 69 6e 29 0a 20 20 20 20 70  d(fn-main).    p
1e10: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
1e20: 68 64 28 6d 61 69 6e 29 20 24 74 65 78 74 0a 20  hd(main) $text. 
1e30: 20 7d 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61   }.  if {$hd(ena
1e40: 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20 20 20 20  ble-aux)} {.    
1e50: 73 65 74 20 66 6e 20 24 68 64 28 66 6e 2d 61 75  set fn $hd(fn-au
1e60: 78 29 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e  x).    puts -non
1e70: 65 77 6c 69 6e 65 20 24 68 64 28 61 75 78 29 20  ewline $hd(aux) 
1e80: 24 74 65 78 74 0a 20 20 7d 0a 20 20 0a 20 20 23  $text.  }.  .  #
1e90: 20 4f 75 72 20 70 61 67 65 6c 69 6e 6b 20 70 72   Our pagelink pr
1ea0: 6f 63 65 73 73 69 6e 67 20 62 61 73 65 64 20 6f  ocessing based o
1eb0: 66 66 20 74 68 65 20 67 6c 6f 62 61 6c 73 0a 20  ff the globals. 
1ec0: 20 23 20 6c 6c 69 6e 6b 2c 20 67 6c 69 6e 6b 2c   # llink, glink,
1ed0: 20 61 6e 64 20 62 61 63 6b 6c 69 6e 6b 20 67 65   and backlink ge
1ee0: 6e 65 72 61 74 65 64 20 64 75 72 69 6e 67 20 68  nerated during h
1ef0: 64 5f 72 65 73 6f 6c 76 65 0a 20 20 23 20 70 72  d_resolve.  # pr
1f00: 6f 63 65 73 73 69 6e 67 20 64 6f 65 73 6e 27 74  ocessing doesn't
1f10: 20 63 61 74 63 68 20 6c 69 6e 6b 73 20 6f 75 74   catch links out
1f20: 70 75 74 74 65 64 20 64 69 72 65 63 74 6c 79 0a  putted directly.
1f30: 20 20 23 20 77 69 74 68 20 68 64 5f 70 75 74 73    # with hd_puts
1f40: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 61 74 74  .  This code att
1f50: 65 6d 70 74 73 20 74 6f 20 61 64 64 20 74 68 6f  empts to add tho
1f60: 73 65 20 6c 69 6e 6b 73 20 74 6f 0a 20 20 23 20  se links to.  # 
1f70: 6f 75 72 20 70 61 67 65 6c 69 6e 6b 20 61 72 72  our pagelink arr
1f80: 61 79 2e 0a 20 20 67 6c 6f 62 61 6c 20 70 61 67  ay..  global pag
1f90: 65 6c 69 6e 6b 0a 20 20 73 65 74 20 72 65 66 73  elink.  set refs
1fa0: 20 5b 72 65 67 65 78 70 20 2d 61 6c 6c 20 2d 69   [regexp -all -i
1fb0: 6e 6c 69 6e 65 20 7b 68 72 65 66 3d 5c 22 28 2e  nline {href=\"(.
1fc0: 2a 3f 29 5c 22 7d 20 24 74 65 78 74 5d 0a 20 20  *?)\"} $text].  
1fd0: 66 6f 72 65 61 63 68 20 7b 68 72 65 66 20 72 65  foreach {href re
1fe0: 66 7d 20 24 72 65 66 73 20 7b 0a 20 20 20 20 72  f} $refs {.    r
1ff0: 65 67 73 75 62 20 7b 23 2e 2a 7d 20 24 72 65 66  egsub {#.*} $ref
2000: 20 7b 7d 20 72 65 66 32 0a 20 20 20 20 72 65 67   {} ref2.    reg
2010: 73 75 62 20 7b 68 74 74 70 3a 5c 2f 5c 2f 77 77  sub {http:\/\/ww
2020: 77 5c 2e 73 71 6c 69 74 65 5c 2e 6f 72 67 5c 2f  w\.sqlite\.org\/
2030: 7d 20 24 72 65 66 32 20 7b 7d 20 72 65 66 33 0a  } $ref2 {} ref3.
2040: 20 20 20 20 72 65 67 73 75 62 20 7b 5c 2e 5c 2e      regsub {\.\.
2050: 5c 2f 7d 20 24 72 65 66 33 20 7b 7d 20 72 65 66  \/} $ref3 {} ref
2060: 34 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78  4.    if {[regex
2070: 70 20 7b 5e 68 74 74 70 7d 20 24 72 65 66 34 5d  p {^http} $ref4]
2080: 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 69  } continue.    i
2090: 66 20 7b 24 72 65 66 34 3d 3d 22 22 7d 20 63 6f  f {$ref4==""} co
20a0: 6e 74 69 6e 75 65 0a 20 20 20 20 69 66 20 7b 5b  ntinue.    if {[
20b0: 72 65 67 65 78 70 20 7b 5c 2e 68 74 6d 6c 24 7d  regexp {\.html$}
20c0: 20 24 72 65 66 34 5d 7d 20 7b 0a 20 20 20 20 20   $ref4]} {.     
20d0: 20 6c 61 70 70 65 6e 64 20 70 61 67 65 6c 69 6e   lappend pagelin
20e0: 6b 28 24 72 65 66 34 29 20 24 66 6e 0a 20 20 20  k($ref4) $fn.   
20f0: 20 7d 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 68 64   }.  }.}.proc hd
2100: 5f 70 75 74 73 6e 6c 20 7b 74 65 78 74 7d 20 7b  _putsnl {text} {
2110: 0a 20 20 68 64 5f 70 75 74 73 20 24 74 65 78 74  .  hd_puts $text
2120: 5c 6e 0a 7d 0a 0a 23 20 45 6e 61 62 6c 65 20 6f  \n.}..# Enable o
2130: 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61  r disable the ma
2140: 69 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a  in output file..
2150: 23 0a 70 72 6f 63 20 68 64 5f 65 6e 61 62 6c 65  #.proc hd_enable
2160: 5f 6d 61 69 6e 20 7b 62 6f 6f 6c 65 61 6e 7d 20  _main {boolean} 
2170: 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a 20 20  {.  global hd.  
2180: 73 65 74 20 68 64 28 65 6e 61 62 6c 65 2d 6d 61  set hd(enable-ma
2190: 69 6e 29 20 24 62 6f 6f 6c 65 61 6e 0a 7d 0a 0a  in) $boolean.}..
21a0: 23 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  # Enable or disa
21b0: 62 6c 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ble the auxiliar
21c0: 79 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a 23  y output file..#
21d0: 0a 70 72 6f 63 20 68 64 5f 65 6e 61 62 6c 65 5f  .proc hd_enable_
21e0: 61 75 78 20 7b 62 6f 6f 6c 65 61 6e 7d 20 7b 0a  aux {boolean} {.
21f0: 20 20 67 6c 6f 62 61 6c 20 68 64 0a 20 20 73 65    global hd.  se
2200: 74 20 68 64 28 65 6e 61 62 6c 65 2d 61 75 78 29  t hd(enable-aux)
2210: 20 24 62 6f 6f 6c 65 61 6e 0a 7d 0a 73 65 74 20   $boolean.}.set 
2220: 68 64 28 65 6e 61 62 6c 65 2d 61 75 78 29 20 30  hd(enable-aux) 0
2230: 0a 0a 23 20 4f 70 65 6e 20 74 68 65 20 6d 61 69  ..# Open the mai
2240: 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
2250: 24 66 69 6c 65 6e 61 6d 65 20 69 73 20 72 65 6c  $filename is rel
2260: 61 74 69 76 65 20 74 6f 20 24 3a 3a 44 45 53 54  ative to $::DEST
2270: 2e 20 20 0a 23 0a 70 72 6f 63 20 68 64 5f 6f 70  .  .#.proc hd_op
2280: 65 6e 5f 6d 61 69 6e 20 7b 66 69 6c 65 6e 61 6d  en_main {filenam
2290: 65 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64  e} {.  global hd
22a0: 20 44 45 53 54 0a 20 20 68 64 5f 63 6c 6f 73 65   DEST.  hd_close
22b0: 5f 6d 61 69 6e 0a 20 20 73 65 74 20 68 64 28 66  _main.  set hd(f
22c0: 6e 2d 6d 61 69 6e 29 20 24 66 69 6c 65 6e 61 6d  n-main) $filenam
22d0: 65 0a 20 20 73 65 74 20 68 64 28 72 6f 6f 74 70  e.  set hd(rootp
22e0: 61 74 68 2d 6d 61 69 6e 29 20 5b 68 64 5f 72 6f  ath-main) [hd_ro
22f0: 6f 74 70 61 74 68 20 24 66 69 6c 65 6e 61 6d 65  otpath $filename
2300: 5d 0a 20 20 73 65 74 20 68 64 28 6d 61 69 6e 29  ].  set hd(main)
2310: 20 5b 6f 70 65 6e 20 24 44 45 53 54 2f 24 66 69   [open $DEST/$fi
2320: 6c 65 6e 61 6d 65 20 77 5d 0a 20 20 73 65 74 20  lename w].  set 
2330: 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29 20  hd(enable-main) 
2340: 31 0a 20 20 73 65 74 20 68 64 28 65 6e 61 62 6c  1.  set hd(enabl
2350: 65 2d 61 75 78 29 20 30 0a 20 20 73 65 74 20 68  e-aux) 0.  set h
2360: 64 28 66 72 61 67 6d 65 6e 74 29 20 7b 7d 0a 20  d(fragment) {}. 
2370: 20 67 6c 6f 62 61 6c 20 70 61 67 65 6c 69 6e 6b   global pagelink
2380: 0a 20 20 6c 61 70 70 65 6e 64 20 70 61 67 65 6c  .  lappend pagel
2390: 69 6e 6b 28 24 66 69 6c 65 6e 61 6d 65 29 20 24  ink($filename) $
23a0: 66 69 6c 65 6e 61 6d 65 0a 7d 0a 0a 23 20 49 66  filename.}..# If
23b0: 20 24 66 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   $filename is a 
23c0: 70 61 74 68 20 66 72 6f 6d 20 24 3a 3a 44 45 53  path from $::DES
23d0: 54 20 74 6f 20 61 20 66 69 6c 65 2c 20 72 65 74  T to a file, ret
23e0: 75 72 6e 20 61 20 70 61 74 68 0a 23 20 66 72 6f  urn a path.# fro
23f0: 6d 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  m the directory 
2400: 63 6f 6e 74 61 69 6e 69 6e 67 20 24 66 69 6c 65  containing $file
2410: 6e 61 6d 65 20 62 61 63 6b 20 74 6f 20 74 68 65  name back to the
2420: 20 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 44 45   directory $::DE
2430: 53 54 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 72 6f  ST..#.proc hd_ro
2440: 6f 74 70 61 74 68 20 7b 66 69 6c 65 6e 61 6d 65  otpath {filename
2450: 7d 20 7b 0a 20 20 73 65 74 20 75 70 20 7b 7d 0a  } {.  set up {}.
2460: 20 20 73 65 74 20 6e 20 5b 6c 6c 65 6e 67 74 68    set n [llength
2470: 20 5b 73 70 6c 69 74 20 24 66 69 6c 65 6e 61 6d   [split $filenam
2480: 65 20 2f 5d 5d 0a 20 20 69 66 20 7b 24 6e 3c 3d  e /]].  if {$n<=
2490: 31 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1} {.    return 
24a0: 7b 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  {}.  } else {.  
24b0: 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67    return [string
24c0: 20 72 65 70 65 61 74 20 2e 2e 2f 20 5b 65 78 70   repeat ../ [exp
24d0: 72 20 7b 24 6e 2d 31 7d 5d 5d 0a 20 20 7d 0a 7d  r {$n-1}]].  }.}
24e0: 0a 0a 23 20 43 6c 6f 73 65 20 74 68 65 20 6d 61  ..# Close the ma
24f0: 69 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a  in output file..
2500: 23 0a 70 72 6f 63 20 68 64 5f 63 6c 6f 73 65 5f  #.proc hd_close_
2510: 6d 61 69 6e 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62  main {} {.  glob
2520: 61 6c 20 68 64 0a 20 20 68 64 5f 63 6c 6f 73 65  al hd.  hd_close
2530: 5f 61 75 78 0a 20 20 69 66 20 7b 5b 69 6e 66 6f  _aux.  if {[info
2540: 20 65 78 69 73 74 73 20 68 64 28 6d 61 69 6e 29   exists hd(main)
2550: 5d 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 24 68  ]} {.    puts $h
2560: 64 28 6d 61 69 6e 29 20 24 68 64 28 66 6f 6f 74  d(main) $hd(foot
2570: 65 72 29 0a 20 20 20 20 63 6c 6f 73 65 20 24 68  er).    close $h
2580: 64 28 6d 61 69 6e 29 0a 20 20 20 20 75 6e 73 65  d(main).    unse
2590: 74 20 68 64 28 6d 61 69 6e 29 0a 20 20 7d 0a 7d  t hd(main).  }.}
25a0: 0a 0a 23 20 4f 70 65 6e 20 74 68 65 20 61 75 78  ..# Open the aux
25b0: 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20 66 69  iliary output fi
25c0: 6c 65 2e 0a 23 0a 23 20 4d 6f 73 74 20 64 6f 63  le..#.# Most doc
25d0: 75 6d 65 6e 74 73 20 68 61 76 65 20 6f 6e 6c 79  uments have only
25e0: 20 61 20 6d 61 69 6e 20 66 69 6c 65 20 61 6e 64   a main file and
25f0: 20 6e 6f 20 61 75 78 69 6c 69 61 72 79 2e 20 20   no auxiliary.  
2600: 48 6f 77 65 76 65 72 2c 20 73 6f 6d 65 0a 23 20  However, some.# 
2610: 6c 61 72 67 65 20 64 6f 63 75 6d 65 6e 74 73 20  large documents 
2620: 61 72 65 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e  are broken up in
2630: 74 6f 20 73 6d 61 6c 6c 65 72 20 70 69 65 63 65  to smaller piece
2640: 73 20 77 68 65 72 65 20 65 61 63 68 20 73 6d 61  s where each sma
2650: 6c 6c 65 72 20 70 69 65 63 65 0a 23 20 69 73 20  ller piece.# is 
2660: 61 6e 20 61 75 78 69 6c 69 61 72 79 20 66 69 6c  an auxiliary fil
2670: 65 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 74  e.  There will t
2680: 79 70 69 63 61 6c 6c 79 20 62 65 20 65 69 74 68  ypically be eith
2690: 65 72 20 6d 61 6e 79 20 61 75 78 69 6c 69 61 72  er many auxiliar
26a0: 79 20 66 69 6c 65 73 0a 23 20 6f 72 20 6e 6f 20  y files.# or no 
26b0: 61 75 78 69 6c 69 61 72 79 20 66 69 6c 65 73 20  auxiliary files 
26c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26d0: 65 61 63 68 20 6d 61 69 6e 20 66 69 6c 65 2e 0a  each main file..
26e0: 23 0a 70 72 6f 63 20 68 64 5f 6f 70 65 6e 5f 61  #.proc hd_open_a
26f0: 75 78 20 7b 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a  ux {filename} {.
2700: 20 20 67 6c 6f 62 61 6c 20 68 64 20 44 45 53 54    global hd DEST
2710: 0a 20 20 68 64 5f 63 6c 6f 73 65 5f 61 75 78 0a  .  hd_close_aux.
2720: 20 20 73 65 74 20 68 64 28 66 6e 2d 61 75 78 29    set hd(fn-aux)
2730: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 73 65 74   $filename.  set
2740: 20 68 64 28 72 6f 6f 74 70 61 74 68 2d 61 75 78   hd(rootpath-aux
2750: 29 20 5b 68 64 5f 72 6f 6f 74 70 61 74 68 20 24  ) [hd_rootpath $
2760: 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 73 65 74 20  filename].  set 
2770: 68 64 28 61 75 78 29 20 5b 6f 70 65 6e 20 24 44  hd(aux) [open $D
2780: 45 53 54 2f 24 66 69 6c 65 6e 61 6d 65 20 77 5d  EST/$filename w]
2790: 0a 20 20 73 65 74 20 68 64 28 65 6e 61 62 6c 65  .  set hd(enable
27a0: 2d 61 75 78 29 20 31 0a 20 20 73 65 74 20 68 64  -aux) 1.  set hd
27b0: 28 61 75 78 2d 66 72 61 67 6d 65 6e 74 29 20 7b  (aux-fragment) {
27c0: 7d 0a 20 20 67 6c 6f 62 61 6c 20 70 61 67 65 6c  }.  global pagel
27d0: 69 6e 6b 0a 20 20 6c 61 70 70 65 6e 64 20 70 61  ink.  lappend pa
27e0: 67 65 6c 69 6e 6b 28 24 66 69 6c 65 6e 61 6d 65  gelink($filename
27f0: 29 20 24 66 69 6c 65 6e 61 6d 65 0a 7d 0a 0a 23  ) $filename.}..#
2800: 20 43 6c 6f 73 65 20 74 68 65 20 61 75 78 69 6c   Close the auxil
2810: 69 61 72 79 20 6f 75 74 70 75 74 20 66 69 6c 65  iary output file
2820: 0a 23 0a 70 72 6f 63 20 68 64 5f 63 6c 6f 73 65  .#.proc hd_close
2830: 5f 61 75 78 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62  _aux {} {.  glob
2840: 61 6c 20 68 64 0a 20 20 69 66 20 7b 5b 69 6e 66  al hd.  if {[inf
2850: 6f 20 65 78 69 73 74 73 20 68 64 28 61 75 78 29  o exists hd(aux)
2860: 5d 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 24 68  ]} {.    puts $h
2870: 64 28 61 75 78 29 20 24 68 64 28 66 6f 6f 74 65  d(aux) $hd(foote
2880: 72 29 0a 20 20 20 20 63 6c 6f 73 65 20 24 68 64  r).    close $hd
2890: 28 61 75 78 29 0a 20 20 20 20 75 6e 73 65 74 20  (aux).    unset 
28a0: 68 64 28 61 75 78 29 0a 20 20 20 20 73 65 74 20  hd(aux).    set 
28b0: 68 64 28 65 6e 61 62 6c 65 2d 61 75 78 29 20 30  hd(enable-aux) 0
28c0: 0a 20 20 20 20 73 65 74 20 68 64 28 65 6e 61 62  .    set hd(enab
28d0: 6c 65 2d 6d 61 69 6e 29 20 31 0a 20 20 7d 0a 7d  le-main) 1.  }.}
28e0: 0a 0a 0a 23 20 68 64 5f 70 75 74 73 69 6e 34 20  ...# hd_putsin4 
28f0: 69 73 20 6c 69 6b 65 20 70 75 74 73 20 65 78 63  is like puts exc
2900: 65 70 74 20 74 68 61 74 20 69 74 20 72 65 6d 6f  ept that it remo
2910: 76 65 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ves the first 4 
2920: 69 6e 64 65 6e 74 61 74 69 6f 6e 0a 23 20 63 68  indentation.# ch
2930: 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61  aracters from ea
2940: 63 68 20 6c 69 6e 65 2e 20 20 49 74 20 61 6c 73  ch line.  It als
2950: 6f 20 64 6f 65 73 20 76 61 72 69 61 62 6c 65 20  o does variable 
2960: 73 75 62 73 74 69 74 75 74 69 6f 6e 20 69 6e 0a  substitution in.
2970: 23 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 20  # the namespace 
2980: 6f 66 20 69 74 73 20 63 61 6c 6c 69 6e 67 20 70  of its calling p
2990: 72 6f 63 65 64 75 72 65 2e 0a 23 0a 70 72 6f 63  rocedure..#.proc
29a0: 20 70 75 74 73 69 6e 34 20 7b 66 64 20 74 65 78   putsin4 {fd tex
29b0: 74 7d 20 7b 0a 20 20 72 65 67 73 75 62 20 2d 61  t} {.  regsub -a
29c0: 6c 6c 20 22 5c 6e 20 20 20 20 22 20 24 74 65 78  ll "\n    " $tex
29d0: 74 20 5c 6e 20 74 65 78 74 0a 20 20 70 75 74 73  t \n text.  puts
29e0: 20 24 66 64 20 5b 75 70 6c 65 76 65 6c 20 31 20   $fd [uplevel 1 
29f0: 5b 6c 69 73 74 20 73 75 62 73 74 20 2d 6e 6f 62  [list subst -nob
2a00: 61 63 6b 20 2d 6e 6f 63 6f 6d 20 24 74 65 78 74  ack -nocom $text
2a10: 5d 5d 0a 7d 0a 0a 23 20 52 65 74 75 72 6e 20 61  ]].}..# Return a
2a20: 20 67 6c 6f 62 61 6c 6c 79 20 75 6e 69 71 75 65   globally unique
2a30: 20 6f 62 6a 65 63 74 20 69 64 0a 23 0a 73 65 74   object id.#.set
2a40: 20 68 64 5f 69 64 5f 63 6f 75 6e 74 65 72 20 30   hd_id_counter 0
2a50: 0a 70 72 6f 63 20 68 64 5f 69 64 20 7b 7d 20 7b  .proc hd_id {} {
2a60: 0a 20 20 67 6c 6f 62 61 6c 20 68 64 5f 69 64 5f  .  global hd_id_
2a70: 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72 20 68  counter.  incr h
2a80: 64 5f 69 64 5f 63 6f 75 6e 74 65 72 0a 20 20 72  d_id_counter.  r
2a90: 65 74 75 72 6e 20 78 24 68 64 5f 69 64 5f 63 6f  eturn x$hd_id_co
2aa0: 75 6e 74 65 72 0a 7d 0a 0a 23 20 41 20 70 72 6f  unter.}..# A pro
2ab0: 63 65 64 75 72 65 20 74 6f 20 77 72 69 74 65 20  cedure to write 
2ac0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 68 65 61 64 65  the common heade
2ad0: 72 20 66 6f 75 6e 64 20 6f 6e 20 65 76 65 72 79  r found on every
2ae0: 20 48 54 4d 4c 20 66 69 6c 65 20 6f 6e 0a 23 20   HTML file on.# 
2af0: 74 68 65 20 53 51 4c 69 74 65 20 77 65 62 73 69  the SQLite websi
2b00: 74 65 2e 0a 23 0a 23 23 23 23 23 23 23 23 23 23  te..#.##########
2b10: 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 4e 4f  ###########.# NO
2b20: 54 45 3a 20 20 54 68 69 73 20 63 6f 64 65 20 69  TE:  This code i
2b30: 73 20 63 6f 70 69 65 64 20 61 6e 64 20 72 65 75  s copied and reu
2b40: 73 65 64 20 69 6e 20 6d 61 74 72 69 78 2e 74 63  sed in matrix.tc
2b50: 6c 2e 20 20 57 68 65 6e 20 6d 61 6b 69 6e 67 0a  l.  When making.
2b60: 23 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 69  # changes to thi
2b70: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
2b80: 2c 20 62 65 20 73 75 72 65 20 74 6f 20 61 6c 73  , be sure to als
2b90: 6f 20 63 68 61 6e 67 65 20 6d 61 74 72 69 78 2e  o change matrix.
2ba0: 74 63 6c 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 68  tcl..#.proc hd_h
2bb0: 65 61 64 65 72 20 7b 74 69 74 6c 65 20 7b 73 72  eader {title {sr
2bc0: 63 66 69 6c 65 20 7b 7d 7d 7d 20 7b 0a 20 20 67  cfile {}}} {.  g
2bd0: 6c 6f 62 61 6c 20 68 64 0a 20 20 73 65 74 20 73  lobal hd.  set s
2be0: 61 76 65 64 5f 65 6e 61 62 6c 65 20 24 68 64 28  aved_enable $hd(
2bf0: 65 6e 61 62 6c 65 2d 6d 61 69 6e 29 0a 20 20 69  enable-main).  i
2c00: 66 20 7b 24 73 72 63 66 69 6c 65 3d 3d 22 22 7d  f {$srcfile==""}
2c10: 20 7b 0a 20 20 20 20 73 65 74 20 66 64 20 24 68   {.    set fd $h
2c20: 64 28 61 75 78 29 0a 20 20 20 20 73 65 74 20 70  d(aux).    set p
2c30: 61 74 68 20 24 68 64 28 72 6f 6f 74 70 61 74 68  ath $hd(rootpath
2c40: 2d 61 75 78 29 0a 20 20 7d 20 65 6c 73 65 20 7b  -aux).  } else {
2c50: 0a 20 20 20 20 73 65 74 20 66 64 20 24 68 64 28  .    set fd $hd(
2c60: 6d 61 69 6e 29 0a 20 20 20 20 73 65 74 20 70 61  main).    set pa
2c70: 74 68 20 24 68 64 28 72 6f 6f 74 70 61 74 68 2d  th $hd(rootpath-
2c80: 6d 61 69 6e 29 0a 20 20 7d 0a 20 20 70 75 74 73  main).  }.  puts
2c90: 20 24 66 64 20 7b 3c 21 44 4f 43 54 59 50 45 20   $fd {<!DOCTYPE 
2ca0: 48 54 4d 4c 20 50 55 42 4c 49 43 20 22 2d 2f 2f  HTML PUBLIC "-//
2cb0: 57 33 43 2f 2f 44 54 44 20 48 54 4d 4c 20 34 2e  W3C//DTD HTML 4.
2cc0: 30 31 2f 2f 45 4e 22 20 22 68 74 74 70 3a 2f 2f  01//EN" "http://
2cd0: 77 77 77 2e 77 33 2e 6f 72 67 2f 54 52 2f 68 74  www.w3.org/TR/ht
2ce0: 6d 6c 34 2f 73 74 72 69 63 74 2e 64 74 64 22 3e  ml4/strict.dtd">
2cf0: 7d 0a 20 20 70 75 74 73 20 24 66 64 20 7b 3c 68  }.  puts $fd {<h
2d00: 74 6d 6c 3e 3c 68 65 61 64 3e 7d 0a 20 20 70 75  tml><head>}.  pu
2d10: 74 73 20 24 66 64 20 7b 3c 6d 65 74 61 20 68 74  ts $fd {<meta ht
2d20: 74 70 2d 65 71 75 69 76 3d 22 63 6f 6e 74 65 6e  tp-equiv="conten
2d30: 74 2d 74 79 70 65 22 20 63 6f 6e 74 65 6e 74 3d  t-type" content=
2d40: 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72  "text/html; char
2d50: 73 65 74 3d 55 54 46 2d 38 22 3e 7d 0a 20 20 70  set=UTF-8">}.  p
2d60: 75 74 73 20 24 66 64 20 22 3c 74 69 74 6c 65 3e  uts $fd "<title>
2d70: 24 74 69 74 6c 65 3c 2f 74 69 74 6c 65 3e 22 0a  $title</title>".
2d80: 20 20 70 75 74 73 69 6e 34 20 24 66 64 20 7b 3c    putsin4 $fd {<
2d90: 73 74 79 6c 65 20 74 79 70 65 3d 22 74 65 78 74  style type="text
2da0: 2f 63 73 73 22 3e 0a 20 20 20 20 62 6f 64 79 20  /css">.    body 
2db0: 7b 0a 20 20 20 20 20 20 20 20 6d 61 72 67 69 6e  {.        margin
2dc0: 3a 20 61 75 74 6f 3b 0a 20 20 20 20 20 20 20 20  : auto;.        
2dd0: 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 56 65 72  font-family: Ver
2de0: 64 61 6e 61 2c 20 73 61 6e 73 2d 73 65 72 69 66  dana, sans-serif
2df0: 3b 0a 20 20 20 20 20 20 20 20 70 61 64 64 69 6e  ;.        paddin
2e00: 67 3a 20 38 70 78 20 31 25 3b 0a 20 20 20 20 7d  g: 8px 1%;.    }
2e10: 0a 20 20 20 20 0a 20 20 20 20 61 20 7b 20 63 6f  .    .    a { co
2e20: 6c 6f 72 3a 20 23 30 34 34 61 36 34 20 7d 0a 20  lor: #044a64 }. 
2e30: 20 20 20 61 3a 76 69 73 69 74 65 64 20 7b 20 63     a:visited { c
2e40: 6f 6c 6f 72 3a 20 23 37 33 34 35 35 39 20 7d 0a  olor: #734559 }.
2e50: 20 20 20 20 0a 20 20 20 20 2e 6c 6f 67 6f 20 7b      .    .logo {
2e60: 20 70 6f 73 69 74 69 6f 6e 3a 61 62 73 6f 6c 75   position:absolu
2e70: 74 65 3b 20 6d 61 72 67 69 6e 3a 33 70 78 3b 20  te; margin:3px; 
2e80: 7d 0a 20 20 20 20 2e 74 61 67 6c 69 6e 65 20 7b  }.    .tagline {
2e90: 0a 20 20 20 20 20 20 66 6c 6f 61 74 3a 72 69 67  .      float:rig
2ea0: 68 74 3b 0a 20 20 20 20 20 20 74 65 78 74 2d 61  ht;.      text-a
2eb0: 6c 69 67 6e 3a 72 69 67 68 74 3b 0a 20 20 20 20  lign:right;.    
2ec0: 20 20 66 6f 6e 74 2d 73 74 79 6c 65 3a 69 74 61    font-style:ita
2ed0: 6c 69 63 3b 0a 20 20 20 20 20 20 77 69 64 74 68  lic;.      width
2ee0: 3a 33 30 30 70 78 3b 0a 20 20 20 20 20 20 6d 61  :300px;.      ma
2ef0: 72 67 69 6e 3a 31 32 70 78 3b 0a 20 20 20 20 20  rgin:12px;.     
2f00: 20 6d 61 72 67 69 6e 2d 74 6f 70 3a 35 38 70 78   margin-top:58px
2f10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2e 6d 65  ;.    }..    .me
2f20: 6e 75 62 61 72 20 7b 0a 20 20 20 20 20 20 63 6c  nubar {.      cl
2f30: 65 61 72 3a 20 62 6f 74 68 3b 0a 20 20 20 20 20  ear: both;.     
2f40: 20 62 6f 72 64 65 72 2d 72 61 64 69 75 73 3a 20   border-radius: 
2f50: 38 70 78 3b 0a 20 20 20 20 20 20 62 61 63 6b 67  8px;.      backg
2f60: 72 6f 75 6e 64 3a 20 23 30 34 34 61 36 34 3b 0a  round: #044a64;.
2f70: 20 20 20 20 20 20 70 61 64 64 69 6e 67 3a 20 30        padding: 0
2f80: 70 78 3b 0a 20 20 20 20 20 20 6d 61 72 67 69 6e  px;.      margin
2f90: 3a 20 30 70 78 3b 0a 20 20 20 20 20 20 63 65 6c  : 0px;.      cel
2fa0: 6c 2d 73 70 61 63 69 6e 67 3a 20 30 70 78 3b 0a  l-spacing: 0px;.
2fb0: 20 20 20 20 7d 20 20 20 20 0a 20 20 20 20 2e 74      }    .    .t
2fc0: 6f 6f 6c 62 61 72 20 7b 0a 20 20 20 20 20 20 74  oolbar {.      t
2fd0: 65 78 74 2d 61 6c 69 67 6e 3a 20 63 65 6e 74 65  ext-align: cente
2fe0: 72 3b 0a 20 20 20 20 20 20 6c 69 6e 65 2d 68 65  r;.      line-he
2ff0: 69 67 68 74 3a 20 31 2e 36 65 6d 3b 0a 20 20 20  ight: 1.6em;.   
3000: 20 20 20 6d 61 72 67 69 6e 3a 20 30 3b 0a 20 20     margin: 0;.  
3010: 20 20 20 20 70 61 64 64 69 6e 67 3a 20 30 70 78      padding: 0px
3020: 20 38 70 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20   8px;.    }.    
3030: 2e 74 6f 6f 6c 62 61 72 20 61 20 7b 20 63 6f 6c  .toolbar a { col
3040: 6f 72 3a 20 77 68 69 74 65 3b 20 74 65 78 74 2d  or: white; text-
3050: 64 65 63 6f 72 61 74 69 6f 6e 3a 20 6e 6f 6e 65  decoration: none
3060: 3b 20 70 61 64 64 69 6e 67 3a 20 36 70 78 20 31  ; padding: 6px 1
3070: 32 70 78 3b 20 7d 0a 20 20 20 20 2e 74 6f 6f 6c  2px; }.    .tool
3080: 62 61 72 20 61 3a 76 69 73 69 74 65 64 20 7b 20  bar a:visited { 
3090: 63 6f 6c 6f 72 3a 20 77 68 69 74 65 3b 20 7d 0a  color: white; }.
30a0: 20 20 20 20 2e 74 6f 6f 6c 62 61 72 20 61 3a 68      .toolbar a:h
30b0: 6f 76 65 72 20 7b 20 63 6f 6c 6f 72 3a 20 23 30  over { color: #0
30c0: 34 34 61 36 34 3b 20 62 61 63 6b 67 72 6f 75 6e  44a64; backgroun
30d0: 64 3a 20 77 68 69 74 65 3b 20 7d 0a 20 20 20 20  d: white; }.    
30e0: 0a 20 20 20 20 2e 63 6f 6e 74 65 6e 74 20 20 20  .    .content   
30f0: 20 7b 20 6d 61 72 67 69 6e 3a 20 35 25 3b 20 7d   { margin: 5%; }
3100: 0a 20 20 20 20 2e 63 6f 6e 74 65 6e 74 20 64 74  .    .content dt
3110: 20 7b 20 66 6f 6e 74 2d 77 65 69 67 68 74 3a 62   { font-weight:b
3120: 6f 6c 64 3b 20 7d 0a 20 20 20 20 2e 63 6f 6e 74  old; }.    .cont
3130: 65 6e 74 20 64 64 20 7b 20 6d 61 72 67 69 6e 2d  ent dd { margin-
3140: 62 6f 74 74 6f 6d 3a 20 32 35 70 78 3b 20 6d 61  bottom: 25px; ma
3150: 72 67 69 6e 2d 6c 65 66 74 3a 32 30 25 3b 20 7d  rgin-left:20%; }
3160: 0a 20 20 20 20 2e 63 6f 6e 74 65 6e 74 20 75 6c  .    .content ul
3170: 20 7b 20 70 61 64 64 69 6e 67 3a 30 70 78 3b 20   { padding:0px; 
3180: 70 61 64 64 69 6e 67 2d 6c 65 66 74 3a 20 31 35  padding-left: 15
3190: 70 78 3b 20 6d 61 72 67 69 6e 3a 30 70 78 3b 20  px; margin:0px; 
31a0: 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 54 68  }.    .    /* Th
31b0: 69 6e 67 73 20 66 6f 72 20 22 66 61 6e 63 79 66  ings for "fancyf
31c0: 6f 72 6d 61 74 22 20 64 6f 63 75 6d 65 6e 74 73  ormat" documents
31d0: 20 73 74 61 72 74 20 68 65 72 65 2e 20 2a 2f 0a   start here. */.
31e0: 20 20 20 20 2e 66 61 6e 63 79 20 69 6d 67 2b 70      .fancy img+p
31f0: 20 7b 66 6f 6e 74 2d 73 74 79 6c 65 3a 69 74 61   {font-style:ita
3200: 6c 69 63 7d 0a 20 20 20 20 2e 66 61 6e 63 79 20  lic}.    .fancy 
3210: 2e 63 6f 64 65 62 6c 6f 63 6b 20 69 20 7b 20 63  .codeblock i { c
3220: 6f 6c 6f 72 3a 20 64 61 72 6b 62 6c 75 65 3b 20  olor: darkblue; 
3230: 7d 0a 20 20 20 20 2e 66 61 6e 63 79 20 68 31 2c  }.    .fancy h1,
3240: 2e 66 61 6e 63 79 20 68 32 2c 2e 66 61 6e 63 79  .fancy h2,.fancy
3250: 20 68 33 2c 2e 66 61 6e 63 79 20 68 34 20 7b 66   h3,.fancy h4 {f
3260: 6f 6e 74 2d 77 65 69 67 68 74 3a 6e 6f 72 6d 61  ont-weight:norma
3270: 6c 3b 63 6f 6c 6f 72 3a 23 30 34 34 61 36 34 7d  l;color:#044a64}
3280: 0a 20 20 20 20 2e 66 61 6e 63 79 20 68 32 20 7b  .    .fancy h2 {
3290: 20 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 20 31 30   margin-left: 10
32a0: 70 78 20 7d 0a 20 20 20 20 2e 66 61 6e 63 79 20  px }.    .fancy 
32b0: 68 33 20 7b 20 6d 61 72 67 69 6e 2d 6c 65 66 74  h3 { margin-left
32c0: 3a 20 32 30 70 78 20 7d 0a 20 20 20 20 2e 66 61  : 20px }.    .fa
32d0: 6e 63 79 20 68 34 20 7b 20 6d 61 72 67 69 6e 2d  ncy h4 { margin-
32e0: 6c 65 66 74 3a 20 33 30 70 78 20 7d 0a 20 20 20  left: 30px }.   
32f0: 20 2e 66 61 6e 63 79 20 74 68 20 7b 77 68 69 74   .fancy th {whit
3300: 65 2d 73 70 61 63 65 3a 6e 6f 77 72 61 70 3b 74  e-space:nowrap;t
3310: 65 78 74 2d 61 6c 69 67 6e 3a 6c 65 66 74 3b 62  ext-align:left;b
3320: 6f 72 64 65 72 2d 62 6f 74 74 6f 6d 3a 73 6f 6c  order-bottom:sol
3330: 69 64 20 31 70 78 20 23 34 34 34 7d 0a 20 20 20  id 1px #444}.   
3340: 20 2e 66 61 6e 63 79 20 74 68 2c 20 2e 66 61 6e   .fancy th, .fan
3350: 63 79 20 74 64 20 7b 70 61 64 64 69 6e 67 3a 20  cy td {padding: 
3360: 30 2e 32 65 6d 20 31 65 78 3b 20 76 65 72 74 69  0.2em 1ex; verti
3370: 63 61 6c 2d 61 6c 69 67 6e 3a 74 6f 70 7d 0a 20  cal-align:top}. 
3380: 20 20 20 2e 66 61 6e 63 79 20 23 74 6f 63 20 61     .fancy #toc a
3390: 20 20 20 20 20 20 20 20 7b 20 63 6f 6c 6f 72 3a          { color:
33a0: 20 64 61 72 6b 62 6c 75 65 20 3b 20 74 65 78 74   darkblue ; text
33b0: 2d 64 65 63 6f 72 61 74 69 6f 6e 3a 20 6e 6f 6e  -decoration: non
33c0: 65 20 7d 0a 20 20 20 20 2e 66 61 6e 63 79 20 2e  e }.    .fancy .
33d0: 74 6f 64 6f 20 20 20 20 20 20 20 20 20 7b 20 63  todo         { c
33e0: 6f 6c 6f 72 3a 20 23 41 41 33 33 33 33 20 3b 20  olor: #AA3333 ; 
33f0: 66 6f 6e 74 2d 73 74 79 6c 65 20 3a 20 69 74 61  font-style : ita
3400: 6c 69 63 20 7d 0a 20 20 20 20 2e 66 61 6e 63 79  lic }.    .fancy
3410: 20 2e 74 6f 64 6f 3a 62 65 66 6f 72 65 20 20 7b   .todo:before  {
3420: 20 63 6f 6e 74 65 6e 74 3a 20 27 54 4f 44 4f 3a   content: 'TODO:
3430: 27 20 7d 0a 20 20 20 20 2e 66 61 6e 63 79 20 70  ' }.    .fancy p
3440: 2e 74 6f 64 6f 20 20 20 20 20 20 20 20 7b 20 62  .todo        { b
3450: 6f 72 64 65 72 3a 20 73 6f 6c 69 64 20 23 41 41  order: solid #AA
3460: 33 33 33 33 20 31 70 78 3b 20 70 61 64 64 69 6e  3333 1px; paddin
3470: 67 3a 20 31 65 78 20 7d 0a 20 20 20 20 2e 66 61  g: 1ex }.    .fa
3480: 6e 63 79 20 69 6d 67 20 7b 20 64 69 73 70 6c 61  ncy img { displa
3490: 79 3a 62 6c 6f 63 6b 3b 20 7d 0a 20 20 20 20 2e  y:block; }.    .
34a0: 66 61 6e 63 79 20 3a 6c 69 6e 6b 3a 68 6f 76 65  fancy :link:hove
34b0: 72 2c 20 2e 66 61 6e 63 79 20 3a 76 69 73 69 74  r, .fancy :visit
34c0: 65 64 3a 68 6f 76 65 72 20 7b 20 62 61 63 6b 67  ed:hover { backg
34d0: 72 6f 75 6e 64 3a 20 77 68 65 61 74 20 7d 0a 20  round: wheat }. 
34e0: 20 20 20 2e 66 61 6e 63 79 20 70 2c 2e 66 61 6e     .fancy p,.fan
34f0: 63 79 20 75 6c 2c 2e 66 61 6e 63 79 20 6f 6c 20  cy ul,.fancy ol 
3500: 7b 20 6d 61 72 67 69 6e 3a 20 31 65 6d 20 35 65  { margin: 1em 5e
3510: 78 20 7d 0a 20 20 20 20 2e 66 61 6e 63 79 20 6c  x }.    .fancy l
3520: 69 20 70 20 7b 20 6d 61 72 67 69 6e 3a 20 31 65  i p { margin: 1e
3530: 6d 20 30 20 7d 0a 20 20 20 20 2f 2a 20 45 6e 64  m 0 }.    /* End
3540: 20 6f 66 20 22 66 61 6e 63 79 66 6f 72 6d 61 74   of "fancyformat
3550: 22 20 73 70 65 63 69 66 69 63 20 72 75 6c 65 73  " specific rules
3560: 2e 20 2a 2f 0a 0a 20 20 20 20 3c 2f 73 74 79 6c  . */..    </styl
3570: 65 3e 0a 20 20 7d 0a 20 20 70 75 74 73 20 24 66  e>.  }.  puts $f
3580: 64 20 7b 3c 2f 68 65 61 64 3e 7d 0a 20 20 69 66  d {</head>}.  if
3590: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 44   {[file exists D
35a0: 52 41 46 54 5d 7d 20 7b 0a 20 20 20 20 73 65 74  RAFT]} {.    set
35b0: 20 74 61 67 6c 69 6e 65 20 7b 3c 66 6f 6e 74 20   tagline {<font 
35c0: 73 69 7a 65 3d 22 36 22 20 63 6f 6c 6f 72 3d 22  size="6" color="
35d0: 72 65 64 22 3e 2a 2a 2a 20 44 52 41 46 54 20 2a  red">*** DRAFT *
35e0: 2a 2a 3c 2f 66 6f 6e 74 3e 7d 0a 20 20 7d 20 65  **</font>}.  } e
35f0: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 74 61  lse {.    set ta
3600: 67 6c 69 6e 65 20 7b 53 6d 61 6c 6c 2e 20 46 61  gline {Small. Fa
3610: 73 74 2e 20 52 65 6c 69 61 62 6c 65 2e 3c 62 72  st. Reliable.<br
3620: 3e 43 68 6f 6f 73 65 20 61 6e 79 20 74 68 72 65  >Choose any thre
3630: 65 2e 7d 0a 20 20 7d 0a 20 20 70 75 74 73 69 6e  e.}.  }.  putsin
3640: 34 20 24 66 64 20 7b 3c 62 6f 64 79 3e 0a 20 20  4 $fd {<body>.  
3650: 20 20 3c 64 69 76 3e 3c 21 2d 2d 20 63 6f 6e 74    <div><!-- cont
3660: 61 69 6e 65 72 20 64 69 76 20 74 6f 20 73 61 74  ainer div to sat
3670: 69 73 66 79 20 76 61 6c 69 64 61 74 6f 72 20 2d  isfy validator -
3680: 2d 3e 0a 20 20 20 20 0a 20 20 20 20 3c 61 20 68  ->.    .    <a h
3690: 72 65 66 3d 22 24 7b 70 61 74 68 7d 69 6e 64 65  ref="${path}inde
36a0: 78 2e 68 74 6d 6c 22 3e 0a 20 20 20 20 3c 69 6d  x.html">.    <im
36b0: 67 20 63 6c 61 73 73 3d 22 6c 6f 67 6f 22 20 73  g class="logo" s
36c0: 72 63 3d 22 24 7b 70 61 74 68 7d 69 6d 61 67 65  rc="${path}image
36d0: 73 2f 73 71 6c 69 74 65 33 37 30 5f 62 61 6e 6e  s/sqlite370_bann
36e0: 65 72 2e 67 69 66 22 20 61 6c 74 3d 22 53 51 4c  er.gif" alt="SQL
36f0: 69 74 65 20 4c 6f 67 6f 22 0a 20 20 20 20 20 62  ite Logo".     b
3700: 6f 72 64 65 72 3d 22 30 22 3e 3c 2f 61 3e 0a 20  order="0"></a>. 
3710: 20 20 20 3c 64 69 76 3e 3c 21 2d 2d 20 49 45 20     <div><!-- IE 
3720: 68 61 63 6b 20 74 6f 20 70 72 65 76 65 6e 74 20  hack to prevent 
3730: 64 69 73 61 70 70 65 61 72 69 6e 67 20 6c 6f 67  disappearing log
3740: 6f 2d 2d 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 3c  o--></div>.    <
3750: 64 69 76 20 63 6c 61 73 73 3d 22 74 61 67 6c 69  div class="tagli
3760: 6e 65 22 3e 24 7b 74 61 67 6c 69 6e 65 7d 3c 2f  ne">${tagline}</
3770: 64 69 76 3e 0a 0a 20 20 20 20 3c 74 61 62 6c 65  div>..    <table
3780: 20 77 69 64 74 68 3d 31 30 30 25 20 63 6c 61 73   width=100% clas
3790: 73 3d 22 6d 65 6e 75 62 61 72 22 3e 3c 74 72 3e  s="menubar"><tr>
37a0: 0a 20 20 20 20 20 20 3c 74 64 20 77 69 64 74 68  .      <td width
37b0: 3d 31 30 30 25 3e 0a 20 20 20 20 20 20 3c 64 69  =100%>.      <di
37c0: 76 20 63 6c 61 73 73 3d 22 74 6f 6f 6c 62 61 72  v class="toolbar
37d0: 22 3e 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72  ">.        <a hr
37e0: 65 66 3d 22 24 7b 70 61 74 68 7d 61 62 6f 75 74  ef="${path}about
37f0: 2e 68 74 6d 6c 22 3e 41 62 6f 75 74 3c 2f 61 3e  .html">About</a>
3800: 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72 65 66  .        <a href
3810: 3d 22 24 7b 70 61 74 68 7d 73 69 74 65 6d 61 70  ="${path}sitemap
3820: 2e 68 74 6d 6c 22 3e 53 69 74 65 6d 61 70 3c 2f  .html">Sitemap</
3830: 61 3e 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72  a>.        <a hr
3840: 65 66 3d 22 24 7b 70 61 74 68 7d 64 6f 63 73 2e  ef="${path}docs.
3850: 68 74 6d 6c 22 3e 44 6f 63 75 6d 65 6e 74 61 74  html">Documentat
3860: 69 6f 6e 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20  ion</a>.        
3870: 3c 61 20 68 72 65 66 3d 22 24 7b 70 61 74 68 7d  <a href="${path}
3880: 64 6f 77 6e 6c 6f 61 64 2e 68 74 6d 6c 22 3e 44  download.html">D
3890: 6f 77 6e 6c 6f 61 64 3c 2f 61 3e 0a 20 20 20 20  ownload</a>.    
38a0: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 24 7b 70      <a href="${p
38b0: 61 74 68 7d 63 6f 70 79 72 69 67 68 74 2e 68 74  ath}copyright.ht
38c0: 6d 6c 22 3e 4c 69 63 65 6e 73 65 3c 2f 61 3e 0a  ml">License</a>.
38d0: 20 20 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d          <a href=
38e0: 22 24 7b 70 61 74 68 7d 6e 65 77 73 2e 68 74 6d  "${path}news.htm
38f0: 6c 22 3e 4e 65 77 73 3c 2f 61 3e 0a 20 20 20 20  l">News</a>.    
3900: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 24 7b 70      <a href="${p
3910: 61 74 68 7d 73 75 70 70 6f 72 74 2e 68 74 6d 6c  ath}support.html
3920: 22 3e 53 75 70 70 6f 72 74 3c 2f 61 3e 0a 20 20  ">Support</a>.  
3930: 20 20 20 20 3c 2f 64 69 76 3e 7d 0a 0a 20 20 69      </div>}..  i
3940: 66 20 7b 31 7d 20 7b 0a 20 20 20 20 70 75 74 73  f {1} {.    puts
3950: 69 6e 34 20 24 66 64 20 7b 3c 73 63 72 69 70 74  in4 $fd {<script
3960: 3e 0a 20 20 20 20 20 20 67 4d 73 67 20 3d 20 22  >.      gMsg = "
3970: 53 65 61 72 63 68 20 53 51 4c 69 74 65 20 44 6f  Search SQLite Do
3980: 63 73 2e 2e 2e 22 0a 20 20 20 20 20 20 66 75 6e  cs...".      fun
3990: 63 74 69 6f 6e 20 65 6e 74 65 72 73 65 61 72 63  ction entersearc
39a0: 68 28 29 20 7b 0a 20 20 20 20 20 20 20 20 76 61  h() {.        va
39b0: 72 20 71 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67  r q = document.g
39c0: 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 71  etElementById("q
39d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
39e0: 71 2e 76 61 6c 75 65 20 3d 3d 20 67 4d 73 67 20  q.value == gMsg 
39f0: 29 20 7b 20 71 2e 76 61 6c 75 65 20 3d 20 22 22  ) { q.value = ""
3a00: 20 7d 0a 20 20 20 20 20 20 20 20 71 2e 73 74 79   }.        q.sty
3a10: 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 62 6c 61 63  le.color = "blac
3a20: 6b 22 0a 20 20 20 20 20 20 20 20 71 2e 73 74 79  k".        q.sty
3a30: 6c 65 2e 66 6f 6e 74 53 74 79 6c 65 20 3d 20 22  le.fontStyle = "
3a40: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 7d 0a  normal".      }.
3a50: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 6c        function l
3a60: 65 61 76 65 73 65 61 72 63 68 28 29 20 7b 0a 20  eavesearch() {. 
3a70: 20 20 20 20 20 20 20 76 61 72 20 71 20 3d 20 64         var q = d
3a80: 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65  ocument.getEleme
3a90: 6e 74 42 79 49 64 28 22 71 22 29 3b 0a 20 20 20  ntById("q");.   
3aa0: 20 20 20 20 20 69 66 28 20 71 2e 76 61 6c 75 65       if( q.value
3ab0: 20 3d 3d 20 22 22 20 29 20 7b 20 0a 20 20 20 20   == "" ) { .    
3ac0: 20 20 20 20 20 20 71 2e 76 61 6c 75 65 20 3d 20        q.value = 
3ad0: 67 4d 73 67 0a 20 20 20 20 20 20 20 20 20 20 71  gMsg.          q
3ae0: 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22  .style.color = "
3af0: 23 30 34 34 61 36 34 22 0a 20 20 20 20 20 20 20  #044a64".       
3b00: 20 20 20 71 2e 73 74 79 6c 65 2e 66 6f 6e 74 53     q.style.fontS
3b10: 74 79 6c 65 20 3d 20 22 69 74 61 6c 69 63 22 0a  tyle = "italic".
3b20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3b30: 7d 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  }.      function
3b40: 20 68 69 64 65 6f 72 73 68 6f 77 28 62 74 6e 2c   hideorshow(btn,
3b50: 6f 62 6a 29 7b 0a 20 20 20 20 20 20 20 20 76 61  obj){.        va
3b60: 72 20 78 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67  r x = document.g
3b70: 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 6f 62  etElementById(ob
3b80: 6a 29 3b 0a 20 20 20 20 20 20 20 20 76 61 72 20  j);.        var 
3b90: 62 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74  b = document.get
3ba0: 45 6c 65 6d 65 6e 74 42 79 49 64 28 62 74 6e 29  ElementById(btn)
3bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 2e  ;.        if( x.
3bc0: 73 74 79 6c 65 2e 64 69 73 70 6c 61 79 21 3d 27  style.display!='
3bd0: 6e 6f 6e 65 27 20 29 7b 0a 20 20 20 20 20 20 20  none' ){.       
3be0: 20 20 20 78 2e 73 74 79 6c 65 2e 64 69 73 70 6c     x.style.displ
3bf0: 61 79 20 3d 20 27 6e 6f 6e 65 27 3b 0a 20 20 20  ay = 'none';.   
3c00: 20 20 20 20 20 20 20 62 2e 69 6e 6e 65 72 48 54         b.innerHT
3c10: 4d 4c 3d 27 73 68 6f 77 27 3b 0a 20 20 20 20 20  ML='show';.     
3c20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3c30: 20 20 20 20 78 2e 73 74 79 6c 65 2e 64 69 73 70      x.style.disp
3c40: 6c 61 79 20 3d 20 27 27 3b 0a 20 20 20 20 20 20  lay = '';.      
3c50: 20 20 20 20 62 2e 69 6e 6e 65 72 48 54 4d 4c 3d      b.innerHTML=
3c60: 27 68 69 64 65 27 3b 0a 20 20 20 20 20 20 20 20  'hide';.        
3c70: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
3c80: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 7d 0a   false;.      }.
3c90: 20 20 20 20 3c 2f 73 63 72 69 70 74 3e 7d 0a 20      </script>}. 
3ca0: 20 7d 0a 20 20 69 66 20 7b 31 7d 20 7b 0a 20 20   }.  if {1} {.  
3cb0: 20 20 70 75 74 73 69 6e 34 20 24 66 64 20 7b 3c    putsin4 $fd {<
3cc0: 74 64 3e 0a 20 20 20 20 20 20 20 20 3c 64 69 76  td>.        <div
3cd0: 20 73 74 79 6c 65 3d 22 70 61 64 64 69 6e 67 3a   style="padding:
3ce0: 30 20 31 65 6d 20 30 70 78 20 30 3b 77 68 69 74  0 1em 0px 0;whit
3cf0: 65 2d 73 70 61 63 65 3a 6e 6f 77 72 61 70 22 3e  e-space:nowrap">
3d00: 0a 20 20 20 20 20 20 20 20 3c 66 6f 72 6d 20 6e  .        <form n
3d10: 61 6d 65 3d 66 20 6d 65 74 68 6f 64 3d 22 47 45  ame=f method="GE
3d20: 54 22 20 61 63 74 69 6f 6e 3d 22 68 74 74 70 73  T" action="https
3d30: 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
3d40: 67 2f 73 65 61 72 63 68 22 3e 0a 20 20 20 20 20  g/search">.     
3d50: 20 20 20 20 20 3c 69 6e 70 75 74 20 69 64 3d 71       <input id=q
3d60: 20 6e 61 6d 65 3d 71 20 74 79 70 65 3d 74 65 78   name=q type=tex
3d70: 74 0a 20 20 20 20 20 20 20 20 20 20 20 6f 6e 66  t.           onf
3d80: 6f 63 75 73 3d 22 65 6e 74 65 72 73 65 61 72 63  ocus="entersearc
3d90: 68 28 29 22 20 6f 6e 62 6c 75 72 3d 22 6c 65 61  h()" onblur="lea
3da0: 76 65 73 65 61 72 63 68 28 29 22 20 73 74 79 6c  vesearch()" styl
3db0: 65 3d 22 77 69 64 74 68 3a 32 34 65 78 3b 70 61  e="width:24ex;pa
3dc0: 64 64 69 6e 67 3a 31 70 78 20 31 65 78 3b 20 62  dding:1px 1ex; b
3dd0: 6f 72 64 65 72 3a 73 6f 6c 69 64 20 77 68 69 74  order:solid whit
3de0: 65 20 31 70 78 3b 20 66 6f 6e 74 2d 73 69 7a 65  e 1px; font-size
3df0: 3a 30 2e 39 65 6d 20 3b 20 66 6f 6e 74 2d 73 74  :0.9em ; font-st
3e00: 79 6c 65 3a 69 74 61 6c 69 63 3b 63 6f 6c 6f 72  yle:italic;color
3e10: 3a 23 30 34 34 61 36 34 3b 22 20 76 61 6c 75 65  :#044a64;" value
3e20: 3d 22 53 65 61 72 63 68 20 53 51 4c 69 74 65 20  ="Search SQLite 
3e30: 44 6f 63 73 2e 2e 2e 22 3e 0a 20 20 20 20 20 20  Docs...">.      
3e40: 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d      <input type=
3e50: 73 75 62 6d 69 74 20 76 61 6c 75 65 3d 22 47 6f  submit value="Go
3e60: 22 20 73 74 79 6c 65 3d 22 62 6f 72 64 65 72 3a  " style="border:
3e70: 73 6f 6c 69 64 20 77 68 69 74 65 20 31 70 78 3b  solid white 1px;
3e80: 62 61 63 6b 67 72 6f 75 6e 64 2d 63 6f 6c 6f 72  background-color
3e90: 3a 23 30 34 34 61 36 34 3b 63 6f 6c 6f 72 3a 77  :#044a64;color:w
3ea0: 68 69 74 65 3b 66 6f 6e 74 2d 73 69 7a 65 3a 30  hite;font-size:0
3eb0: 2e 39 65 6d 3b 70 61 64 64 69 6e 67 3a 30 20 31  .9em;padding:0 1
3ec0: 65 78 22 3e 0a 20 20 20 20 20 20 20 20 3c 2f 66  ex">.        </f
3ed0: 6f 72 6d 3e 0a 20 20 20 20 20 20 20 20 3c 2f 64  orm>.        </d
3ee0: 69 76 3e 0a 20 20 20 20 20 20 3c 2f 74 61 62 6c  iv>.      </tabl
3ef0: 65 3e 7d 0a 20 20 7d 0a 20 20 70 75 74 73 69 6e  e>}.  }.  putsin
3f00: 34 20 24 66 64 20 7b 0a 20 20 20 20 3c 64 69 76  4 $fd {.    <div
3f10: 20 63 6c 61 73 73 3d 73 74 61 72 74 73 65 61 72   class=startsear
3f20: 63 68 3e 3c 2f 64 69 76 3e 0a 20 20 7d 0a 20 20  ch></div>.  }.  
3f30: 69 66 20 7b 24 73 72 63 66 69 6c 65 21 3d 22 22  if {$srcfile!=""
3f40: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 66 69 6c  } {.    if {[fil
3f50: 65 20 65 78 69 73 74 73 20 44 52 41 46 54 5d 7d  e exists DRAFT]}
3f60: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 68 64 28   {.      set hd(
3f70: 66 6f 6f 74 65 72 29 20 7b 0a 20 20 20 20 20 20  footer) {.      
3f80: 20 20 3c 70 20 61 6c 69 67 6e 3d 22 63 65 6e 74    <p align="cent
3f90: 65 72 22 3e 3c 66 6f 6e 74 20 73 69 7a 65 3d 22  er"><font size="
3fa0: 36 22 20 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 2a  6" color="red">*
3fb0: 2a 2a 20 44 52 41 46 54 20 2a 2a 2a 3c 2f 66 6f  ** DRAFT ***</fo
3fc0: 6e 74 3e 3c 2f 70 3e 0a 20 20 20 20 20 20 7d 0a  nt></p>.      }.
3fd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
3fe0: 20 20 20 73 65 74 20 68 64 28 66 6f 6f 74 65 72     set hd(footer
3ff0: 29 20 7b 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 65  ) {}.    }.  } e
4000: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 68 64  lse {.    set hd
4010: 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29 20 24 73  (enable-main) $s
4020: 61 76 65 64 5f 65 6e 61 62 6c 65 0a 20 20 7d 0a  aved_enable.  }.
4030: 7d 0a 0a 23 20 49 6e 73 65 72 74 20 61 20 62 75  }..# Insert a bu
4040: 62 62 6c 65 20 73 79 6e 74 61 78 20 64 69 61 67  bble syntax diag
4050: 72 61 6d 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ram into the out
4060: 70 75 74 2e 0a 23 0a 70 72 6f 63 20 42 75 62 62  put..#.proc Bubb
4070: 6c 65 44 69 61 67 72 61 6d 20 7b 6e 61 6d 65 20  leDiagram {name 
4080: 7b 61 6e 6f 6e 79 6d 6f 75 73 5f 66 6c 61 67 20  {anonymous_flag 
4090: 30 7d 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 68  0}} {.  global h
40a0: 64 0a 0a 20 20 23 69 66 20 7b 21 24 61 6e 6f 6e  d..  #if {!$anon
40b0: 79 6d 6f 75 73 5f 66 6c 61 67 7d 20 7b 0a 20 20  ymous_flag} {.  
40c0: 23 20 20 68 64 5f 72 65 73 6f 6c 76 65 20 22 3c  #  hd_resolve "<
40d0: 68 34 3e 5c 5b 24 6e 61 6d 65 3a 5c 5d 3c 2f 68  h4>\[$name:\]</h
40e0: 34 3e 22 0a 20 20 23 7d 0a 20 20 68 64 5f 72 65  4>".  #}.  hd_re
40f0: 73 6f 6c 76 65 20 22 3c 70 3e 3c 62 3e 5c 5b 24  solve "<p><b>\[$
4100: 6e 61 6d 65 3a 5c 5d 3c 2f 62 3e 3c 2f 70 3e 22  name:\]</b></p>"
4110: 0a 20 20 73 65 74 20 61 6c 74 20 22 61 6c 74 3d  .  set alt "alt=
4120: 5c 22 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d  \"syntax diagram
4130: 20 24 6e 61 6d 65 5c 22 22 0a 20 20 69 66 20 7b   $name\"".  if {
4140: 24 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29  $hd(enable-main)
4150: 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 24 68 64  } {.    puts $hd
4160: 28 6d 61 69 6e 29 20 22 3c 62 6c 6f 63 6b 71 75  (main) "<blockqu
4170: 6f 74 65 3e 5c 6e 5c 0a 20 20 20 20 20 20 20 20  ote>\n\.        
4180: 3c 69 6d 67 20 24 61 6c 74 20 73 72 63 3d 5c 22  <img $alt src=\"
4190: 24 68 64 28 72 6f 6f 74 70 61 74 68 2d 6d 61 69  $hd(rootpath-mai
41a0: 6e 29 69 6d 61 67 65 73 2f 73 79 6e 74 61 78 2f  n)images/syntax/
41b0: 24 6e 61 6d 65 2e 67 69 66 5c 22 3e 3c 2f 69 6d  $name.gif\"></im
41c0: 67 3e 5c 6e 5c 0a 20 20 20 20 20 20 20 20 3c 2f  g>\n\.        </
41d0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 22 0a 20 20 7d  blockquote>".  }
41e0: 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61 62 6c  .  if {$hd(enabl
41f0: 65 2d 61 75 78 29 7d 20 7b 0a 20 20 20 20 70 75  e-aux)} {.    pu
4200: 74 73 20 24 68 64 28 61 75 78 29 20 22 3c 62 6c  ts $hd(aux) "<bl
4210: 6f 63 6b 71 75 6f 74 65 3e 5c 6e 5c 0a 20 20 20  ockquote>\n\.   
4220: 20 20 20 20 20 3c 69 6d 67 20 24 61 6c 74 20 73       <img $alt s
4230: 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74  rc=\"$hd(rootpat
4240: 68 2d 61 75 78 29 69 6d 61 67 65 73 2f 73 79 6e  h-aux)images/syn
4250: 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66 5c 22 3e  tax/$name.gif\">
4260: 3c 2f 69 6d 67 3e 5c 6e 5c 0a 20 20 20 20 20 20  </img>\n\.      
4270: 20 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 22    </blockquote>"
4280: 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 48 69 64 64  .  }.}.proc Hidd
4290: 65 6e 42 75 62 62 6c 65 44 69 61 67 72 61 6d 20  enBubbleDiagram 
42a0: 7b 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f 62 61  {name} {.  globa
42b0: 6c 20 68 64 0a 20 20 73 65 74 20 61 6c 74 20 22  l hd.  set alt "
42c0: 61 6c 74 3d 5c 22 73 79 6e 74 61 78 20 64 69 61  alt=\"syntax dia
42d0: 67 72 61 6d 20 24 6e 61 6d 65 5c 22 22 0a 20 20  gram $name\"".  
42e0: 68 64 5f 72 65 73 6f 6c 76 65 20 22 3c 70 3e 3c  hd_resolve "<p><
42f0: 62 3e 5c 5b 24 6e 61 6d 65 3a 5c 5d 3c 2f 62 3e  b>\[$name:\]</b>
4300: 20 22 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61   ".  if {$hd(ena
4310: 62 6c 65 2d 6d 61 69 6e 29 7d 20 7b 0a 20 20 20  ble-main)} {.   
4320: 20 73 65 74 20 61 20 5b 68 64 5f 69 64 5d 0a 20   set a [hd_id]. 
4330: 20 20 20 73 65 74 20 62 20 5b 68 64 5f 69 64 5d     set b [hd_id]
4340: 0a 20 20 20 20 70 75 74 73 20 24 68 64 28 6d 61  .    puts $hd(ma
4350: 69 6e 29 20 5c 0a 20 20 20 20 20 22 3c 62 75 74  in) \.     "<but
4360: 74 6f 6e 20 69 64 3d 27 24 61 27 20 6f 6e 63 6c  ton id='$a' oncl
4370: 69 63 6b 3d 27 68 69 64 65 6f 72 73 68 6f 77 28  ick='hideorshow(
4380: 5c 22 24 61 5c 22 2c 5c 22 24 62 5c 22 29 27 3e  \"$a\",\"$b\")'>
4390: 73 68 6f 77 3c 2f 62 75 74 74 6f 6e 3e 5c 0a 20  show</button>\. 
43a0: 20 20 20 20 20 3c 2f 70 3e 5c 6e 5c 0a 20 20 20       </p>\n\.   
43b0: 20 20 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 20 69     <blockquote i
43c0: 64 3d 27 24 62 27 20 73 74 79 6c 65 3d 27 64 69  d='$b' style='di
43d0: 73 70 6c 61 79 3a 6e 6f 6e 65 3b 27 3e 5c 6e 5c  splay:none;'>\n\
43e0: 0a 20 20 20 20 20 20 3c 69 6d 67 20 24 61 6c 74  .      <img $alt
43f0: 20 73 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70   src=\"$hd(rootp
4400: 61 74 68 2d 6d 61 69 6e 29 69 6d 61 67 65 73 2f  ath-main)images/
4410: 73 79 6e 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66  syntax/$name.gif
4420: 5c 22 3e 3c 2f 69 6d 67 3e 5c 6e 5c 0a 20 20 20  \"></img>\n\.   
4430: 20 20 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e     </blockquote>
4440: 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 68 64 28  ".  }.  if {$hd(
4450: 65 6e 61 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20  enable-aux)} {. 
4460: 20 20 20 73 65 74 20 61 20 5b 68 64 5f 69 64 5d     set a [hd_id]
4470: 0a 20 20 20 20 73 65 74 20 62 20 5b 68 64 5f 69  .    set b [hd_i
4480: 64 5d 0a 20 20 20 20 70 75 74 73 20 24 68 64 28  d].    puts $hd(
4490: 61 75 78 29 20 5c 0a 20 20 20 20 20 22 3c 62 75  aux) \.     "<bu
44a0: 74 74 6f 6e 20 69 64 3d 27 24 61 27 20 6f 6e 63  tton id='$a' onc
44b0: 6c 69 63 6b 3d 27 68 69 64 65 6f 72 73 68 6f 77  lick='hideorshow
44c0: 28 5c 22 24 61 5c 22 2c 5c 22 24 62 5c 22 29 27  (\"$a\",\"$b\")'
44d0: 3e 73 68 6f 77 3c 2f 62 75 74 74 6f 6e 3e 5c 0a  >show</button>\.
44e0: 20 20 20 20 20 20 3c 2f 70 3e 5c 6e 5c 0a 20 20        </p>\n\.  
44f0: 20 20 20 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 20      <blockquote 
4500: 69 64 3d 27 24 62 27 20 73 74 79 6c 65 3d 27 64  id='$b' style='d
4510: 69 73 70 6c 61 79 3a 6e 6f 6e 65 3b 27 3e 5c 6e  isplay:none;'>\n
4520: 5c 0a 20 20 20 20 20 20 3c 69 6d 67 20 24 61 6c  \.      <img $al
4530: 74 20 73 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74  t src=\"$hd(root
4540: 70 61 74 68 2d 61 75 78 29 69 6d 61 67 65 73 2f  path-aux)images/
4550: 73 79 6e 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66  syntax/$name.gif
4560: 5c 22 3e 3c 2f 69 6d 67 3e 5c 6e 5c 0a 20 20 20  \"></img>\n\.   
4570: 20 20 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e     </blockquote>
4580: 22 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 52 65 63  ".  }.}.proc Rec
4590: 75 72 73 69 76 65 42 75 62 62 6c 65 44 69 61 67  ursiveBubbleDiag
45a0: 72 61 6d 5f 68 65 6c 70 65 72 20 7b 63 6c 61 73  ram_helper {clas
45b0: 73 20 6e 61 6d 65 20 6f 70 65 6e 6c 69 73 74 20  s name openlist 
45c0: 65 78 63 6c 75 64 65 7d 20 7b 0a 20 20 67 6c 6f  exclude} {.  glo
45d0: 62 61 6c 20 68 64 20 73 79 6e 74 61 78 5f 6c 69  bal hd syntax_li
45e0: 6e 6b 61 67 65 0a 20 20 73 65 74 20 61 6c 74 20  nkage.  set alt 
45f0: 22 61 6c 74 3d 5c 22 73 79 6e 74 61 78 20 64 69  "alt=\"syntax di
4600: 61 67 72 61 6d 20 24 6e 61 6d 65 5c 22 22 0a 20  agram $name\"". 
4610: 20 68 64 5f 72 65 73 6f 6c 76 65 20 22 3c 70 3e   hd_resolve "<p>
4620: 3c 62 3e 5c 5b 24 6e 61 6d 65 3a 5c 5d 3c 2f 62  <b>\[$name:\]</b
4630: 3e 5c 6e 22 0a 20 20 73 65 74 20 61 20 5b 68 64  >\n".  set a [hd
4640: 5f 69 64 5d 0a 20 20 73 65 74 20 62 20 5b 68 64  _id].  set b [hd
4650: 5f 69 64 5d 0a 20 20 73 65 74 20 6f 70 65 6e 66  _id].  set openf
4660: 6c 61 67 20 30 0a 20 20 73 65 74 20 6f 70 65 6e  lag 0.  set open
4670: 32 20 7b 7d 0a 20 20 66 6f 72 65 61 63 68 20 78  2 {}.  foreach x
4680: 20 24 6f 70 65 6e 6c 69 73 74 20 7b 0a 20 20 20   $openlist {.   
4690: 20 69 66 20 7b 24 78 3d 3d 24 6e 61 6d 65 7d 20   if {$x==$name} 
46a0: 7b 0a 20 20 20 20 20 20 73 65 74 20 6f 70 65 6e  {.      set open
46b0: 66 6c 61 67 20 31 0a 20 20 20 20 7d 20 65 6c 73  flag 1.    } els
46c0: 65 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  e {.      lappen
46d0: 64 20 6f 70 65 6e 32 20 24 78 0a 20 20 20 20 7d  d open2 $x.    }
46e0: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 6f 70 65 6e  .  }.  if {$open
46f0: 66 6c 61 67 7d 20 7b 0a 20 20 20 20 70 75 74 73  flag} {.    puts
4700: 20 24 68 64 28 24 63 6c 61 73 73 29 20 5c 0a 20   $hd($class) \. 
4710: 20 20 20 20 20 22 3c 62 75 74 74 6f 6e 20 69 64       "<button id
4720: 3d 27 24 61 27 20 6f 6e 63 6c 69 63 6b 3d 27 68  ='$a' onclick='h
4730: 69 64 65 6f 72 73 68 6f 77 28 5c 22 24 61 5c 22  ideorshow(\"$a\"
4740: 2c 5c 22 24 62 5c 22 29 27 3e 68 69 64 65 3c 2f  ,\"$b\")'>hide</
4750: 62 75 74 74 6f 6e 3e 3c 2f 70 3e 5c 6e 5c 0a 20  button></p>\n\. 
4760: 20 20 20 20 20 20 3c 62 6c 6f 63 6b 71 75 6f 74        <blockquot
4770: 65 20 69 64 3d 27 24 62 27 3e 5c 6e 5c 0a 20 20  e id='$b'>\n\.  
4780: 20 20 20 20 20 3c 69 6d 67 20 24 61 6c 74 20 73       <img $alt s
4790: 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74  rc=\"$hd(rootpat
47a0: 68 2d 24 63 6c 61 73 73 29 69 6d 61 67 65 73 2f  h-$class)images/
47b0: 73 79 6e 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66  syntax/$name.gif
47c0: 5c 22 20 2f 3e 22 0a 20 20 7d 20 65 6c 73 65 20  \" />".  } else 
47d0: 7b 0a 20 20 20 20 70 75 74 73 20 24 68 64 28 24  {.    puts $hd($
47e0: 63 6c 61 73 73 29 20 5c 0a 20 20 20 20 20 20 22  class) \.      "
47f0: 3c 62 75 74 74 6f 6e 20 69 64 3d 27 24 61 27 20  <button id='$a' 
4800: 6f 6e 63 6c 69 63 6b 3d 27 68 69 64 65 6f 72 73  onclick='hideors
4810: 68 6f 77 28 5c 22 24 61 5c 22 2c 5c 22 24 62 5c  how(\"$a\",\"$b\
4820: 22 29 27 3e 73 68 6f 77 3c 2f 62 75 74 74 6f 6e  ")'>show</button
4830: 3e 3c 2f 70 3e 5c 6e 5c 0a 20 20 20 20 20 20 20  ></p>\n\.       
4840: 3c 62 6c 6f 63 6b 71 75 6f 74 65 20 69 64 3d 27  <blockquote id='
4850: 24 62 27 20 73 74 79 6c 65 3d 27 64 69 73 70 6c  $b' style='displ
4860: 61 79 3a 6e 6f 6e 65 3b 27 3e 5c 6e 5c 0a 20 20  ay:none;'>\n\.  
4870: 20 20 20 20 20 3c 69 6d 67 20 24 61 6c 74 20 73       <img $alt s
4880: 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74  rc=\"$hd(rootpat
4890: 68 2d 24 63 6c 61 73 73 29 69 6d 61 67 65 73 2f  h-$class)images/
48a0: 73 79 6e 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66  syntax/$name.gif
48b0: 5c 22 20 2f 3e 22 0a 20 20 7d 0a 20 20 69 66 20  \" />".  }.  if 
48c0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73 79  {[info exists sy
48d0: 6e 74 61 78 5f 6c 69 6e 6b 61 67 65 28 24 6e 61  ntax_linkage($na
48e0: 6d 65 29 5d 7d 20 7b 0a 20 20 20 20 66 6f 72 65  me)]} {.    fore
48f0: 61 63 68 20 7b 63 78 20 70 78 7d 20 24 73 79 6e  ach {cx px} $syn
4900: 74 61 78 5f 6c 69 6e 6b 61 67 65 28 24 6e 61 6d  tax_linkage($nam
4910: 65 29 20 62 72 65 61 6b 0a 20 20 20 20 66 6f 72  e) break.    for
4920: 65 61 63 68 20 63 20 24 63 78 20 7b 0a 20 20 20  each c $cx {.   
4930: 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
4940: 24 65 78 63 6c 75 64 65 20 24 63 5d 3e 3d 30 7d  $exclude $c]>=0}
4950: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20   continue.      
4960: 52 65 63 75 72 73 69 76 65 42 75 62 62 6c 65 44  RecursiveBubbleD
4970: 69 61 67 72 61 6d 5f 68 65 6c 70 65 72 20 24 63  iagram_helper $c
4980: 6c 61 73 73 20 24 63 20 24 6f 70 65 6e 32 20 5b  lass $c $open2 [
4990: 63 6f 6e 63 61 74 20 24 65 78 63 6c 75 64 65 20  concat $exclude 
49a0: 24 63 78 5d 0a 20 20 20 20 7d 20 20 0a 20 20 7d  $cx].    }  .  }
49b0: 0a 20 20 70 75 74 73 20 24 68 64 28 24 63 6c 61  .  puts $hd($cla
49c0: 73 73 29 20 22 3c 2f 62 6c 6f 63 6b 71 75 6f 74  ss) "</blockquot
49d0: 65 3e 22 0a 7d 0a 70 72 6f 63 20 52 65 63 75 72  e>".}.proc Recur
49e0: 73 69 76 65 42 75 62 62 6c 65 44 69 61 67 72 61  siveBubbleDiagra
49f0: 6d 20 7b 61 72 67 73 7d 20 7b 0a 20 20 67 6c 6f  m {args} {.  glo
4a00: 62 61 6c 20 68 64 0a 20 20 73 65 74 20 73 68 6f  bal hd.  set sho
4a10: 77 20 31 0a 20 20 73 65 74 20 61 32 20 7b 7d 0a  w 1.  set a2 {}.
4a20: 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24    foreach name $
4a30: 61 72 67 73 20 7b 0a 20 20 20 20 69 66 20 7b 24  args {.    if {$
4a40: 6e 61 6d 65 3d 3d 22 2d 2d 69 6e 69 74 69 61 6c  name=="--initial
4a50: 6c 79 2d 68 69 64 64 65 6e 22 7d 20 7b 0a 20 20  ly-hidden"} {.  
4a60: 20 20 20 20 73 65 74 20 73 68 6f 77 20 30 0a 20      set show 0. 
4a70: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
4a80: 20 20 6c 61 70 70 65 6e 64 20 61 32 20 24 6e 61    lappend a2 $na
4a90: 6d 65 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  me.    }.  }.  i
4aa0: 66 20 7b 24 73 68 6f 77 7d 20 7b 0a 20 20 20 20  f {$show} {.    
4ab0: 73 65 74 20 73 68 6f 77 6c 69 73 74 20 24 61 32  set showlist $a2
4ac0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
4ad0: 73 65 74 20 73 68 6f 77 6c 69 73 74 20 7b 7d 0a  set showlist {}.
4ae0: 20 20 7d 0a 20 20 73 65 74 20 6e 61 6d 65 20 5b    }.  set name [
4af0: 6c 69 6e 64 65 78 20 24 61 32 20 30 5d 0a 20 20  lindex $a2 0].  
4b00: 69 66 20 7b 24 68 64 28 65 6e 61 62 6c 65 2d 6d  if {$hd(enable-m
4b10: 61 69 6e 29 7d 20 7b 0a 20 20 20 20 52 65 63 75  ain)} {.    Recu
4b20: 72 73 69 76 65 42 75 62 62 6c 65 44 69 61 67 72  rsiveBubbleDiagr
4b30: 61 6d 5f 68 65 6c 70 65 72 20 6d 61 69 6e 20 24  am_helper main $
4b40: 6e 61 6d 65 20 24 73 68 6f 77 6c 69 73 74 20 24  name $showlist $
4b50: 6e 61 6d 65 0a 20 20 7d 0a 20 20 69 66 20 7b 24  name.  }.  if {$
4b60: 68 64 28 65 6e 61 62 6c 65 2d 61 75 78 29 7d 20  hd(enable-aux)} 
4b70: 7b 0a 20 20 20 20 52 65 63 75 72 73 69 76 65 42  {.    RecursiveB
4b80: 75 62 62 6c 65 44 69 61 67 72 61 6d 5f 68 65 6c  ubbleDiagram_hel
4b90: 70 65 72 20 61 75 78 20 24 6e 61 6d 65 20 24 73  per aux $name $s
4ba0: 68 6f 77 6c 69 73 74 20 24 6e 61 6d 65 0a 20 20  howlist $name.  
4bb0: 7d 0a 7d 0a 0a 0a 0a 23 20 49 6e 73 65 72 74 20  }.}....# Insert 
4bc0: 61 20 53 65 65 20 41 6c 73 6f 20 6c 69 6e 65 20  a See Also line 
4bd0: 66 6f 72 20 72 65 6c 61 74 65 64 20 62 75 62 62  for related bubb
4be0: 6c 65 0a 0a 23 20 52 65 63 6f 72 64 20 61 20 72  le..# Record a r
4bf0: 65 71 75 69 72 65 6d 65 6e 74 2e 20 20 54 68 69  equirement.  Thi
4c00: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  s procedure is a
4c10: 63 74 69 76 65 20 6f 6e 6c 79 20 66 6f 72 20 74  ctive only for t
4c20: 68 65 20 66 69 72 73 74 0a 23 20 70 61 73 73 2e  he first.# pass.
4c30: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65    This procedure
4c40: 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70   becomes a no-op
4c50: 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
4c60: 70 61 73 73 2e 20 20 44 75 72 69 6e 67 0a 23 20  pass.  During.# 
4c70: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 2c  the second pass,
4c80: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 6c 69   requirements li
4c90: 73 74 69 6e 67 20 72 65 70 6f 72 74 20 67 65 6e  sting report gen
4ca0: 65 72 61 74 6f 72 73 20 63 61 6e 20 75 73 65 20  erators can use 
4cb0: 74 68 65 0a 23 20 64 61 74 61 20 61 63 63 75 6d  the.# data accum
4cc0: 75 6c 61 74 65 64 20 64 75 72 69 6e 67 20 74 68  ulated during th
4cd0: 65 20 66 69 72 73 74 20 70 61 73 73 20 74 6f 20  e first pass to 
4ce0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 69 72 20  construct their 
4cf0: 72 65 70 6f 72 74 73 2e 0a 23 0a 23 20 49 66 20  reports..#.# If 
4d00: 74 68 65 20 22 76 65 72 62 61 74 69 6d 22 20 61  the "verbatim" a
4d10: 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
4d20: 20 74 68 65 6e 20 74 68 65 20 72 65 71 75 69 72   then the requir
4d30: 65 6d 65 6e 74 20 74 65 78 74 20 69 73 0a 23 20  ement text is.# 
4d40: 72 65 6e 64 65 72 65 64 20 61 73 20 69 73 2e 20  rendered as is. 
4d50: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
4d60: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
4d70: 20 74 65 78 74 20 69 73 20 61 73 73 75 6d 65 64   text is assumed
4d80: 20 74 6f 0a 23 20 62 65 20 76 61 6c 69 64 20 48   to.# be valid H
4d90: 54 4d 4c 20 77 69 74 68 20 61 6c 6c 20 68 79 70  TML with all hyp
4da0: 65 72 6c 69 6e 6b 73 20 61 6c 72 65 61 64 79 20  erlinks already 
4db0: 72 65 73 6f 6c 76 65 64 2e 20 20 49 66 20 74 68  resolved.  If th
4dc0: 65 20 22 76 65 72 62 61 74 69 6d 22 0a 23 20 61  e "verbatim".# a
4dd0: 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
4de0: 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 20 74   (the default) t
4df0: 68 65 6e 20 74 68 65 20 72 65 71 75 69 72 65 6d  hen the requirem
4e00: 65 6e 74 20 74 65 78 74 20 69 73 20 72 65 6e 64  ent text is rend
4e10: 65 72 65 64 0a 23 20 75 73 69 6e 67 20 68 64 5f  ered.# using hd_
4e20: 72 65 6e 64 65 72 20 77 68 69 63 68 20 77 69 6c  render which wil
4e30: 6c 20 66 69 6e 64 20 61 6e 20 65 78 70 61 6e 64  l find an expand
4e40: 20 68 79 70 65 72 6c 69 6e 6b 73 20 77 69 74 68   hyperlinks with
4e50: 69 6e 20 74 68 65 20 74 65 78 74 2e 0a 23 0a 23  in the text..#.#
4e60: 20 54 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 61   The "comment" a
4e70: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 62  rgument is non-b
4e80: 69 6e 64 69 6e 67 20 63 6f 6d 6d 65 6e 74 61 72  inding commentar
4e90: 79 20 61 6e 64 20 65 78 70 6c 61 6e 61 74 69 6f  y and explanatio
4ea0: 6e 20 74 68 61 74 0a 23 20 61 63 63 6f 6d 70 61  n that.# accompa
4eb0: 6e 69 65 73 20 74 68 65 20 72 65 71 75 69 72 65  nies the require
4ec0: 6d 65 6e 74 2e 0a 23 0a 70 72 6f 63 20 68 64 5f  ment..#.proc hd_
4ed0: 72 65 71 75 69 72 65 6d 65 6e 74 20 7b 69 64 20  requirement {id 
4ee0: 74 65 78 74 20 64 65 72 69 76 65 64 66 72 6f 6d  text derivedfrom
4ef0: 20 63 6f 6d 6d 65 6e 74 7d 20 7b 0a 20 20 67 6c   comment} {.  gl
4f00: 6f 62 61 6c 20 41 4c 4c 52 45 51 20 41 4c 4c 52  obal ALLREQ ALLR
4f10: 45 51 5f 44 45 52 49 56 45 44 46 52 4f 4d 20 41  EQ_DERIVEDFROM A
4f20: 4c 4c 52 45 51 5f 43 4f 4d 0a 20 20 69 66 20 7b  LLREQ_COM.  if {
4f30: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 41 4c 4c  [info exists ALL
4f40: 52 45 51 28 24 69 64 29 5d 7d 20 7b 0a 20 20 20  REQ($id)]} {.   
4f50: 20 70 75 74 73 20 73 74 64 65 72 72 20 22 64 75   puts stderr "du
4f60: 70 6c 69 63 61 74 65 20 72 65 71 75 69 72 65 6d  plicate requirem
4f70: 65 6e 74 20 6c 61 62 65 6c 3a 20 24 69 64 22 0a  ent label: $id".
4f80: 20 20 7d 0a 20 20 73 65 74 20 41 4c 4c 52 45 51    }.  set ALLREQ
4f90: 5f 44 45 52 49 56 45 44 46 52 4f 4d 28 24 69 64  _DERIVEDFROM($id
4fa0: 29 20 24 64 65 72 69 76 65 64 66 72 6f 6d 0a 20  ) $derivedfrom. 
4fb0: 20 73 65 74 20 41 4c 4c 52 45 51 28 24 69 64 29   set ALLREQ($id)
4fc0: 20 24 74 65 78 74 0a 20 20 73 65 74 20 41 4c 4c   $text.  set ALL
4fd0: 52 45 51 5f 43 4f 4d 28 24 69 64 29 20 24 63 6f  REQ_COM($id) $co
4fe0: 6d 6d 65 6e 74 0a 7d 0a 0a 23 20 52 65 61 64 20  mment.}..# Read 
4ff0: 61 20 62 6c 6f 63 6b 20 6f 66 20 72 65 71 75 69  a block of requi
5000: 72 65 6d 65 6e 74 73 20 66 72 6f 6d 20 61 6e 20  rements from an 
5010: 41 53 43 49 49 20 74 65 78 74 20 66 69 6c 65 2e  ASCII text file.
5020: 20 20 53 74 6f 72 65 20 74 68 65 0a 23 20 69 6e    Store the.# in
5030: 66 6f 72 6d 61 74 69 6f 6e 20 6f 62 74 61 69 6e  formation obtain
5040: 65 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 76  ed in a global v
5050: 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 20 62 79  ariable named by
5060: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
5070: 6d 65 74 65 72 2e 0a 23 0a 70 72 6f 63 20 68 64  meter..#.proc hd
5080: 5f 72 65 61 64 5f 72 65 71 75 69 72 65 6d 65 6e  _read_requiremen
5090: 74 5f 66 69 6c 65 20 7b 66 69 6c 65 6e 61 6d 65  t_file {filename
50a0: 20 76 61 72 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c   varname} {.  gl
50b0: 6f 62 61 6c 20 68 64 5f 72 65 71 5f 72 64 72 0a  obal hd_req_rdr.
50c0: 20 20 68 64 5f 72 65 73 65 74 5f 72 65 71 75 69    hd_reset_requi
50d0: 72 65 6d 65 6e 74 5f 72 65 61 64 65 72 0a 20 20  rement_reader.  
50e0: 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 24 66 69  set in [open $fi
50f0: 6c 65 6e 61 6d 65 5d 0a 20 20 77 68 69 6c 65 20  lename].  while 
5100: 7b 21 5b 65 6f 66 20 24 69 6e 5d 7d 20 7b 0a 20  {![eof $in]} {. 
5110: 20 20 20 73 65 74 20 6c 69 6e 65 20 5b 67 65 74     set line [get
5120: 73 20 24 69 6e 5d 0a 20 20 20 20 69 66 20 7b 5b  s $in].    if {[
5130: 72 65 67 65 78 70 20 7b 5e 28 48 4c 52 7c 55 4e  regexp {^(HLR|UN
5140: 44 45 46 7c 53 59 53 52 45 51 29 20 2b 28 5b 4c  DEF|SYSREQ) +([L
5150: 48 53 55 5d 5c 64 2b 29 20 2a 28 2e 2a 29 7d 20  HSU]\d+) *(.*)} 
5160: 24 6c 69 6e 65 20 61 6c 6c 20 74 79 70 65 20 72  $line all type r
5170: 6e 20 64 66 5d 7d 20 7b 0a 20 20 20 20 20 20 68  n df]} {.      h
5180: 64 5f 61 64 64 5f 6f 6e 65 5f 72 65 71 75 69 72  d_add_one_requir
5190: 65 6d 65 6e 74 20 24 76 61 72 6e 61 6d 65 0a 20  ement $varname. 
51a0: 20 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f       set hd_req_
51b0: 72 64 72 28 72 6e 29 20 24 72 6e 0a 20 20 20 20  rdr(rn) $rn.    
51c0: 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72    set hd_req_rdr
51d0: 28 64 65 72 69 76 65 64 29 20 24 64 66 0a 20 20  (derived) $df.  
51e0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72    } elseif {[str
51f0: 69 6e 67 20 74 72 69 6d 20 24 6c 69 6e 65 5d 3d  ing trim $line]=
5200: 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 69 66 20  =""} {.      if 
5210: 7b 24 68 64 5f 72 65 71 5f 72 64 72 28 62 6f 64  {$hd_req_rdr(bod
5220: 79 29 3d 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20  y)==""} {.      
5230: 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72    set hd_req_rdr
5240: 28 62 6f 64 79 29 20 24 68 64 5f 72 65 71 5f 72  (body) $hd_req_r
5250: 64 72 28 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20  dr(comment).    
5260: 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72      set hd_req_r
5270: 64 72 28 63 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20  dr(comment) {}. 
5280: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
5290: 20 20 20 20 20 20 61 70 70 65 6e 64 20 68 64 5f        append hd_
52a0: 72 65 71 5f 72 64 72 28 63 6f 6d 6d 65 6e 74 29  req_rdr(comment)
52b0: 20 5c 6e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   \n.      }.    
52c0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 61  } else {.      a
52d0: 70 70 65 6e 64 20 68 64 5f 72 65 71 5f 72 64 72  ppend hd_req_rdr
52e0: 28 63 6f 6d 6d 65 6e 74 29 20 24 6c 69 6e 65 5c  (comment) $line\
52f0: 6e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 68 64  n.    }.  }.  hd
5300: 5f 61 64 64 5f 6f 6e 65 5f 72 65 71 75 69 72 65  _add_one_require
5310: 6d 65 6e 74 20 24 76 61 72 6e 61 6d 65 0a 20 20  ment $varname.  
5320: 63 6c 6f 73 65 20 24 69 6e 0a 20 20 0a 7d 0a 70  close $in.  .}.p
5330: 72 6f 63 20 68 64 5f 72 65 73 65 74 5f 72 65 71  roc hd_reset_req
5340: 75 69 72 65 6d 65 6e 74 5f 72 65 61 64 65 72 20  uirement_reader 
5350: 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64  {} {.  global hd
5360: 5f 72 65 71 5f 72 64 72 0a 20 20 73 65 74 20 68  _req_rdr.  set h
5370: 64 5f 72 65 71 5f 72 64 72 28 72 6e 29 20 7b 7d  d_req_rdr(rn) {}
5380: 0a 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72 64  .  set hd_req_rd
5390: 72 28 63 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20 20  r(comment) {}.  
53a0: 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72 28 62  set hd_req_rdr(b
53b0: 6f 64 79 29 20 7b 7d 0a 20 20 73 65 74 20 68 64  ody) {}.  set hd
53c0: 5f 72 65 71 5f 72 64 72 28 64 65 72 69 76 65 64  _req_rdr(derived
53d0: 29 20 7b 7d 0a 7d 0a 70 72 6f 63 20 68 64 5f 61  ) {}.}.proc hd_a
53e0: 64 64 5f 6f 6e 65 5f 72 65 71 75 69 72 65 6d 65  dd_one_requireme
53f0: 6e 74 20 7b 76 61 72 6e 61 6d 65 7d 20 7b 0a 20  nt {varname} {. 
5400: 20 67 6c 6f 62 61 6c 20 68 64 5f 72 65 71 5f 72   global hd_req_r
5410: 64 72 0a 20 20 73 65 74 20 72 6e 20 24 68 64 5f  dr.  set rn $hd_
5420: 72 65 71 5f 72 64 72 28 72 6e 29 0a 20 20 69 66  req_rdr(rn).  if
5430: 20 7b 24 72 6e 21 3d 22 22 7d 20 7b 0a 20 20 20   {$rn!=""} {.   
5440: 20 69 66 20 7b 24 68 64 5f 72 65 71 5f 72 64 72   if {$hd_req_rdr
5450: 28 62 6f 64 79 29 3d 3d 22 22 7d 20 7b 0a 20 20  (body)==""} {.  
5460: 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72      set hd_req_r
5470: 64 72 28 62 6f 64 79 29 20 24 68 64 5f 72 65 71  dr(body) $hd_req
5480: 5f 72 64 72 28 63 6f 6d 6d 65 6e 74 29 0a 20 20  _rdr(comment).  
5490: 20 20 20 20 73 65 74 20 68 64 5f 72 65 71 5f 72      set hd_req_r
54a0: 64 72 28 63 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20  dr(comment) {}. 
54b0: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 62 20 5b     }.    set b [
54c0: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 68 64 5f  string trim $hd_
54d0: 72 65 71 5f 72 64 72 28 62 6f 64 79 29 5d 0a 20  req_rdr(body)]. 
54e0: 20 20 20 73 65 74 20 63 20 5b 73 74 72 69 6e 67     set c [string
54f0: 20 74 72 69 6d 20 24 68 64 5f 72 65 71 5f 72 64   trim $hd_req_rd
5500: 72 28 63 6f 6d 6d 65 6e 74 29 5d 0a 20 20 20 20  r(comment)].    
5510: 73 65 74 20 3a 3a 24 7b 76 61 72 6e 61 6d 65 7d  set ::${varname}
5520: 28 24 72 6e 29 20 5b 6c 69 73 74 20 24 68 64 5f  ($rn) [list $hd_
5530: 72 65 71 5f 72 64 72 28 64 65 72 69 76 65 64 29  req_rdr(derived)
5540: 20 24 62 20 24 63 5d 0a 20 20 20 20 6c 61 70 70   $b $c].    lapp
5550: 65 6e 64 20 3a 3a 24 7b 76 61 72 6e 61 6d 65 7d  end ::${varname}
5560: 28 2a 29 20 24 72 6e 0a 20 20 7d 0a 20 20 68 64  (*) $rn.  }.  hd
5570: 5f 72 65 73 65 74 5f 72 65 71 75 69 72 65 6d 65  _reset_requireme
5580: 6e 74 5f 72 65 61 64 65 72 0a 7d 0a 0a 23 20 46  nt_reader.}..# F
5590: 69 72 73 74 20 70 61 73 73 2e 20 20 50 72 6f 63  irst pass.  Proc
55a0: 65 73 73 20 61 6c 6c 20 66 69 6c 65 73 2e 20 20  ess all files.  
55b0: 42 75 74 20 64 6f 20 6e 6f 74 20 72 65 6e 64 65  But do not rende
55c0: 72 20 68 79 70 65 72 6c 69 6e 6b 73 2e 0a 23 20  r hyperlinks..# 
55d0: 4d 65 72 65 6c 79 20 63 6f 6c 6c 65 63 74 20 6b  Merely collect k
55e0: 65 79 77 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69  eyword informati
55f0: 6f 6e 20 73 6f 20 74 68 61 74 20 68 79 70 65 72  on so that hyper
5600: 6c 69 6e 6b 73 20 63 61 6e 20 62 65 0a 23 20 63  links can be.# c
5610: 6f 72 72 65 63 74 6c 79 20 72 65 6e 64 65 72 65  orrectly rendere
5620: 64 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  d on the second 
5630: 70 61 73 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20  pass..#.foreach 
5640: 69 6e 66 69 6c 65 20 5b 6c 72 61 6e 67 65 20 24  infile [lrange $
5650: 61 72 67 76 20 33 20 65 6e 64 5d 20 7b 0a 20 20  argv 3 end] {.  
5660: 63 64 20 24 48 4f 4d 45 44 49 52 0a 20 20 70 75  cd $HOMEDIR.  pu
5670: 74 73 20 22 50 72 6f 63 65 73 73 69 6e 67 20 24  ts "Processing $
5680: 69 6e 66 69 6c 65 22 0a 20 20 73 65 74 20 66 64  infile".  set fd
5690: 20 5b 6f 70 65 6e 20 24 69 6e 66 69 6c 65 20 72   [open $infile r
56a0: 5d 0a 20 20 73 65 74 20 69 6e 20 5b 72 65 61 64  ].  set in [read
56b0: 20 24 66 64 5d 0a 20 20 63 6c 6f 73 65 20 24 66   $fd].  close $f
56c0: 64 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  d.  if {[string 
56d0: 66 69 72 73 74 20 3c 74 61 62 6c 65 5f 6f 66 5f  first <table_of_
56e0: 63 6f 6e 74 65 6e 74 73 3e 20 24 69 6e 5d 3e 3d  contents> $in]>=
56f0: 30 7d 20 7b 20 73 65 74 20 69 6e 20 5b 61 64 64  0} { set in [add
5700: 74 6f 63 20 24 69 6e 5d 20 7d 0a 20 20 73 65 74  toc $in] }.  set
5710: 20 74 69 74 6c 65 20 7b 4e 6f 20 54 69 74 6c 65   title {No Title
5720: 7d 0a 20 20 72 65 67 65 78 70 20 7b 3c 74 69 74  }.  regexp {<tit
5730: 6c 65 3e 28 5b 5e 5c 6e 5d 2a 29 3c 2f 74 69 74  le>([^\n]*)</tit
5740: 6c 65 3e 7d 20 24 69 6e 20 61 6c 6c 20 74 69 74  le>} $in all tit
5750: 6c 65 0a 20 20 72 65 67 73 75 62 20 7b 3c 74 69  le.  regsub {<ti
5760: 74 6c 65 3e 5b 5e 5c 6e 5d 2a 3c 2f 74 69 74 6c  tle>[^\n]*</titl
5770: 65 3e 7d 20 24 69 6e 20 7b 7d 20 69 6e 0a 20 20  e>} $in {} in.  
5780: 73 65 74 20 6f 75 74 66 69 6c 65 20 5b 66 69 6c  set outfile [fil
5790: 65 20 72 6f 6f 74 20 5b 66 69 6c 65 20 74 61 69  e root [file tai
57a0: 6c 20 24 69 6e 66 69 6c 65 5d 5d 2e 68 74 6d 6c  l $infile]].html
57b0: 0a 20 20 68 64 5f 6f 70 65 6e 5f 6d 61 69 6e 20  .  hd_open_main 
57c0: 24 6f 75 74 66 69 6c 65 0a 20 20 64 62 20 65 76  $outfile.  db ev
57d0: 61 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  al {.    INSERT 
57e0: 49 4e 54 4f 20 70 61 67 65 28 66 69 6c 65 6e 61  INTO page(filena
57f0: 6d 65 2c 70 61 67 65 74 69 74 6c 65 29 0a 20 20  me,pagetitle).  
5800: 20 20 56 41 4c 55 45 53 28 24 6f 75 74 66 69 6c    VALUES($outfil
5810: 65 2c 24 74 69 74 6c 65 29 3b 0a 20 20 7d 0a 20  e,$title);.  }. 
5820: 20 73 65 74 20 68 28 70 61 67 65 69 64 29 20 5b   set h(pageid) [
5830: 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db last_insert_r
5840: 6f 77 69 64 5d 0a 20 20 68 64 5f 68 65 61 64 65  owid].  hd_heade
5850: 72 20 24 74 69 74 6c 65 20 24 69 6e 66 69 6c 65  r $title $infile
5860: 0a 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b  .  regsub -all {
5870: 3c 74 63 6c 3e 7d 20 24 69 6e 20 22 5c 31 37 35  <tcl>} $in "\175
5880: 3b 20 65 76 61 6c 20 5c 31 37 33 22 20 69 6e 0a  ; eval \173" in.
5890: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c    regsub -all {<
58a0: 2f 74 63 6c 3e 7d 20 24 69 6e 20 22 5c 31 37 35  /tcl>} $in "\175
58b0: 3b 20 68 64 5f 70 75 74 73 20 5c 31 37 33 22 20  ; hd_puts \173" 
58c0: 69 6e 0a 20 20 65 76 61 6c 20 22 68 64 5f 70 75  in.  eval "hd_pu
58d0: 74 73 20 5c 31 37 33 24 69 6e 5c 31 37 35 22 0a  ts \173$in\175".
58e0: 20 20 63 64 20 24 3a 3a 48 4f 4d 45 44 49 52 0a    cd $::HOMEDIR.
58f0: 20 20 68 64 5f 63 6c 6f 73 65 5f 6d 61 69 6e 0a    hd_close_main.
5900: 7d 0a 0a 23 20 53 65 63 6f 6e 64 20 70 61 73 73  }..# Second pass
5910: 2e 20 20 50 72 6f 63 65 73 73 20 61 6c 6c 20 66  .  Process all f
5920: 69 6c 65 73 20 61 67 61 69 6e 2e 20 20 54 68 69  iles again.  Thi
5930: 73 20 74 69 6d 65 20 72 65 6e 64 65 72 20 68 79  s time render hy
5940: 70 65 72 6c 69 6e 6b 73 0a 23 20 61 63 63 6f 72  perlinks.# accor
5950: 64 69 6e 67 20 74 6f 20 74 68 65 20 6b 65 79 77  ding to the keyw
5960: 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ord information 
5970: 63 6f 6c 6c 65 63 74 65 64 20 6f 6e 20 74 68 65  collected on the
5980: 20 66 69 72 73 74 20 70 61 73 73 2e 0a 23 0a 70   first pass..#.p
5990: 72 6f 63 20 68 64 5f 6b 65 79 77 6f 72 64 73 20  roc hd_keywords 
59a0: 7b 61 72 67 73 7d 20 7b 7d 0a 72 65 6e 61 6d 65  {args} {}.rename
59b0: 20 68 64 5f 72 65 73 6f 6c 76 65 20 7b 7d 0a 72   hd_resolve {}.r
59c0: 65 6e 61 6d 65 20 68 64 5f 72 65 73 6f 6c 76 65  ename hd_resolve
59d0: 5f 32 6e 64 70 61 73 73 20 68 64 5f 72 65 73 6f  _2ndpass hd_reso
59e0: 6c 76 65 0a 70 72 6f 63 20 68 64 5f 72 65 71 75  lve.proc hd_requ
59f0: 69 72 65 6d 65 6e 74 20 7b 61 72 67 73 7d 20 7b  irement {args} {
5a00: 7d 0a 66 6f 72 65 61 63 68 20 69 6e 66 69 6c 65  }.foreach infile
5a10: 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 76 20 33   [lrange $argv 3
5a20: 20 65 6e 64 5d 20 7b 0a 20 20 63 64 20 24 48 4f   end] {.  cd $HO
5a30: 4d 45 44 49 52 0a 20 20 70 75 74 73 20 22 50 72  MEDIR.  puts "Pr
5a40: 6f 63 65 73 73 69 6e 67 20 24 69 6e 66 69 6c 65  ocessing $infile
5a50: 22 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  ".  set fd [open
5a60: 20 24 69 6e 66 69 6c 65 20 72 5d 0a 20 20 73 65   $infile r].  se
5a70: 74 20 69 6e 20 5b 72 65 61 64 20 24 66 64 5d 0a  t in [read $fd].
5a80: 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 69 66    close $fd.  if
5a90: 20 7b 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20   {[string first 
5aa0: 3c 74 61 62 6c 65 5f 6f 66 5f 63 6f 6e 74 65 6e  <table_of_conten
5ab0: 74 73 3e 20 24 69 6e 5d 3e 3d 30 7d 20 7b 20 73  ts> $in]>=0} { s
5ac0: 65 74 20 69 6e 20 5b 61 64 64 74 6f 63 20 24 69  et in [addtoc $i
5ad0: 6e 5d 20 7d 0a 20 20 73 65 74 20 74 69 74 6c 65  n] }.  set title
5ae0: 20 7b 4e 6f 20 54 69 74 6c 65 7d 0a 20 20 72 65   {No Title}.  re
5af0: 67 65 78 70 20 7b 3c 74 69 74 6c 65 3e 28 5b 5e  gexp {<title>([^
5b00: 5c 6e 5d 2a 29 3c 2f 74 69 74 6c 65 3e 7d 20 24  \n]*)</title>} $
5b10: 69 6e 20 61 6c 6c 20 74 69 74 6c 65 0a 20 20 72  in all title.  r
5b20: 65 67 73 75 62 20 7b 3c 74 69 74 6c 65 3e 5b 5e  egsub {<title>[^
5b30: 5c 6e 5d 2a 3c 2f 74 69 74 6c 65 3e 7d 20 24 69  \n]*</title>} $i
5b40: 6e 20 7b 7d 20 69 6e 0a 20 20 73 65 74 20 6f 75  n {} in.  set ou
5b50: 74 66 69 6c 65 20 5b 66 69 6c 65 20 72 6f 6f 74  tfile [file root
5b60: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 66   [file tail $inf
5b70: 69 6c 65 5d 5d 2e 68 74 6d 6c 0a 20 20 68 64 5f  ile]].html.  hd_
5b80: 6f 70 65 6e 5f 6d 61 69 6e 20 24 6f 75 74 66 69  open_main $outfi
5b90: 6c 65 0a 20 20 68 64 5f 68 65 61 64 65 72 20 24  le.  hd_header $
5ba0: 74 69 74 6c 65 20 24 69 6e 66 69 6c 65 0a 20 20  title $infile.  
5bb0: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 74 63  regsub -all {<tc
5bc0: 6c 3e 7d 20 24 69 6e 20 22 5c 31 37 35 3b 20 65  l>} $in "\175; e
5bd0: 76 61 6c 20 5c 31 37 33 22 20 69 6e 0a 20 20 72  val \173" in.  r
5be0: 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 2f 74 63  egsub -all {</tc
5bf0: 6c 3e 7d 20 24 69 6e 20 22 5c 31 37 35 3b 20 68  l>} $in "\175; h
5c00: 64 5f 72 65 73 6f 6c 76 65 20 5c 31 37 33 22 20  d_resolve \173" 
5c10: 69 6e 0a 20 20 65 76 61 6c 20 22 68 64 5f 72 65  in.  eval "hd_re
5c20: 73 6f 6c 76 65 20 5c 31 37 33 24 69 6e 5c 31 37  solve \173$in\17
5c30: 35 22 0a 20 20 63 64 20 24 3a 3a 48 4f 4d 45 44  5".  cd $::HOMED
5c40: 49 52 0a 20 20 68 64 5f 63 6c 6f 73 65 5f 6d 61  IR.  hd_close_ma
5c50: 69 6e 0a 7d 0a 0a 23 20 47 65 6e 65 72 61 74 65  in.}..# Generate
5c60: 20 61 20 64 6f 63 75 6d 65 6e 74 20 73 68 6f 77   a document show
5c70: 69 6e 67 20 74 68 65 20 68 79 70 65 72 6c 69 6e  ing the hyperlin
5c80: 6b 20 6b 65 79 77 6f 72 64 73 20 61 6e 64 20 74  k keywords and t
5c90: 68 65 69 72 0a 23 20 74 61 72 67 65 74 73 2e 0a  heir.# targets..
5ca0: 23 0a 68 64 5f 6f 70 65 6e 5f 6d 61 69 6e 20 64  #.hd_open_main d
5cb0: 6f 63 5f 6b 65 79 77 6f 72 64 5f 63 72 6f 73 73  oc_keyword_cross
5cc0: 72 65 66 2e 68 74 6d 6c 0a 68 64 5f 68 65 61 64  ref.html.hd_head
5cd0: 65 72 20 7b 4b 65 79 77 6f 72 64 20 43 72 6f 73  er {Keyword Cros
5ce0: 73 72 65 66 65 72 65 6e 63 65 7d 20 24 44 4f 43  sreference} $DOC
5cf0: 2f 77 72 61 70 2e 74 63 6c 0a 68 64 5f 70 75 74  /wrap.tcl.hd_put
5d00: 73 20 22 3c 75 6c 3e 22 0a 66 6f 72 65 61 63 68  s "<ul>".foreach
5d10: 20 78 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20   x [lsort -dict 
5d20: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 67 6c 69  [array names gli
5d30: 6e 6b 5d 5d 20 7b 0a 20 20 73 65 74 20 79 20 24  nk]] {.  set y $
5d40: 67 6c 69 6e 6b 28 24 78 29 0a 20 20 68 64 5f 70  glink($x).  hd_p
5d50: 75 74 73 20 22 3c 6c 69 3e 24 78 20 2d 20 3c 61  uts "<li>$x - <a
5d60: 20 68 72 65 66 3d 5c 22 24 79 5c 22 3e 24 79 3c   href=\"$y\">$y<
5d70: 2f 61 3e 3c 2f 6c 69 3e 22 0a 20 20 6c 61 70 70  /a></li>".  lapp
5d80: 65 6e 64 20 72 65 76 67 6c 69 6e 6b 28 24 79 29  end revglink($y)
5d90: 20 24 78 0a 7d 0a 68 64 5f 70 75 74 73 20 22 3c   $x.}.hd_puts "<
5da0: 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f 73 65 5f 6d  /ul>".hd_close_m
5db0: 61 69 6e 0a 0a 68 64 5f 6f 70 65 6e 5f 6d 61 69  ain..hd_open_mai
5dc0: 6e 20 64 6f 63 5f 74 61 72 67 65 74 5f 63 72 6f  n doc_target_cro
5dd0: 73 73 72 65 66 2e 68 74 6d 6c 0a 68 64 5f 68 65  ssref.html.hd_he
5de0: 61 64 65 72 20 7b 54 61 72 67 65 74 20 43 72 6f  ader {Target Cro
5df0: 73 73 72 65 66 65 72 65 6e 63 65 7d 20 24 44 4f  ssreference} $DO
5e00: 43 2f 77 72 61 70 2e 74 63 6c 0a 68 64 5f 70 75  C/wrap.tcl.hd_pu
5e10: 74 73 20 22 3c 75 6c 3e 22 0a 66 6f 72 65 61 63  ts "<ul>".foreac
5e20: 68 20 79 20 5b 6c 73 6f 72 74 20 5b 61 72 72 61  h y [lsort [arra
5e30: 79 20 6e 61 6d 65 73 20 72 65 76 67 6c 69 6e 6b  y names revglink
5e40: 5d 5d 20 7b 0a 20 20 68 64 5f 70 75 74 73 20 22  ]] {.  hd_puts "
5e50: 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 5c 22 24 79  <li><a href=\"$y
5e60: 5c 22 3e 24 79 3c 2f 61 3e 20 2d 20 5b 6c 73 6f  \">$y</a> - [lso
5e70: 72 74 20 24 72 65 76 67 6c 69 6e 6b 28 24 79 29  rt $revglink($y)
5e80: 5d 3c 2f 6c 69 3e 22 0a 7d 0a 68 64 5f 70 75 74  ]</li>".}.hd_put
5e90: 73 20 22 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f  s "</ul>".hd_clo
5ea0: 73 65 5f 6d 61 69 6e 0a 0a 68 64 5f 6f 70 65 6e  se_main..hd_open
5eb0: 5f 6d 61 69 6e 20 64 6f 63 5f 62 61 63 6b 6c 69  _main doc_backli
5ec0: 6e 6b 5f 63 72 6f 73 73 72 65 66 2e 68 74 6d 6c  nk_crossref.html
5ed0: 0a 68 64 5f 68 65 61 64 65 72 20 7b 42 61 63 6b  .hd_header {Back
5ee0: 6c 69 6e 6b 20 43 72 6f 73 73 72 65 66 65 72 65  link Crossrefere
5ef0: 6e 63 65 7d 20 24 44 4f 43 2f 77 72 61 70 2e 74  nce} $DOC/wrap.t
5f00: 63 6c 0a 68 64 5f 70 75 74 73 20 22 3c 75 6c 3e  cl.hd_puts "<ul>
5f10: 22 0a 66 6f 72 65 61 63 68 20 6b 77 20 5b 6c 73  ".foreach kw [ls
5f20: 6f 72 74 20 2d 6e 6f 63 61 73 65 20 5b 61 72 72  ort -nocase [arr
5f30: 61 79 20 6e 61 6d 65 73 20 62 61 63 6b 6c 69 6e  ay names backlin
5f40: 6b 5d 5d 20 7b 0a 20 20 68 64 5f 70 75 74 73 20  k]] {.  hd_puts 
5f50: 22 3c 6c 69 3e 24 6b 77 20 2d 22 0a 20 20 73 65  "<li>$kw -".  se
5f60: 74 20 70 72 65 76 20 7b 7d 0a 20 20 66 6f 72 65  t prev {}.  fore
5f70: 61 63 68 20 72 65 66 20 5b 6c 73 6f 72 74 20 24  ach ref [lsort $
5f80: 62 61 63 6b 6c 69 6e 6b 28 24 6b 77 29 5d 20 7b  backlink($kw)] {
5f90: 0a 20 20 20 20 69 66 20 7b 24 72 65 66 3d 3d 24  .    if {$ref==$
5fa0: 70 72 65 76 7d 20 63 6f 6e 74 69 6e 75 65 0a 20  prev} continue. 
5fb0: 20 20 20 73 65 74 20 70 72 65 76 20 24 72 65 66     set prev $ref
5fc0: 0a 20 20 20 20 68 64 5f 70 75 74 73 20 22 20 20  .    hd_puts "  
5fd0: 3c 61 20 68 72 65 66 3d 5c 22 24 72 65 66 5c 22  <a href=\"$ref\"
5fe0: 3e 24 72 65 66 3c 2f 61 3e 22 0a 20 20 7d 0a 7d  >$ref</a>".  }.}
5ff0: 0a 68 64 5f 70 75 74 73 20 22 3c 2f 75 6c 3e 22  .hd_puts "</ul>"
6000: 0a 68 64 5f 63 6c 6f 73 65 5f 6d 61 69 6e 0a 0a  .hd_close_main..
6010: 68 64 5f 6f 70 65 6e 5f 6d 61 69 6e 20 64 6f 63  hd_open_main doc
6020: 5f 70 61 67 65 6c 69 6e 6b 5f 63 72 6f 73 73 72  _pagelink_crossr
6030: 65 66 2e 68 74 6d 6c 0a 68 64 5f 68 65 61 64 65  ef.html.hd_heade
6040: 72 20 7b 50 61 67 65 6c 69 6e 6b 20 43 72 6f 73  r {Pagelink Cros
6050: 73 72 65 66 65 72 65 6e 63 65 7d 20 24 44 4f 43  sreference} $DOC
6060: 2f 77 72 61 70 2e 74 63 6c 0a 68 64 5f 70 75 74  /wrap.tcl.hd_put
6070: 73 20 22 3c 70 3e 54 61 72 67 65 74 20 50 61 67  s "<p>Target Pag
6080: 65 20 2d 20 57 68 69 63 68 20 70 61 67 65 73 20  e - Which pages 
6090: 72 65 66 65 72 65 6e 63 65 20 69 74 2e 3c 2f 70  reference it.</p
60a0: 3e 22 0a 68 64 5f 70 75 74 73 20 22 3c 70 3e 50  >".hd_puts "<p>P
60b0: 61 67 65 73 20 6d 61 74 63 68 69 6e 67 20 28 6e  ages matching (n
60c0: 65 77 73 7c 63 68 61 6e 67 65 73 7c 72 65 6c 65  ews|changes|rele
60d0: 61 73 65 6c 6f 67 7c 5c 5b 30 2d 39 5d 74 6f 5c  aselog|\[0-9]to\
60e0: 5b 30 2d 39 5d 7c 26 23 39 34 3b 64 6f 63 5f 2e  [0-9]|&#94;doc_.
60f0: 2a 5f 63 72 6f 73 73 72 65 66 29 20 61 72 65 20  *_crossref) are 
6100: 73 6b 69 70 70 65 64 2e 3c 2f 70 3e 22 0a 68 64  skipped.</p>".hd
6110: 5f 70 75 74 73 20 22 3c 75 6c 3e 22 0a 66 6f 72  _puts "<ul>".for
6120: 65 61 63 68 20 79 20 5b 6c 73 6f 72 74 20 5b 61  each y [lsort [a
6130: 72 72 61 79 20 6e 61 6d 65 73 20 72 65 76 67 6c  rray names revgl
6140: 69 6e 6b 5d 5d 20 7b 0a 20 20 72 65 67 73 75 62  ink]] {.  regsub
6150: 20 7b 23 2e 2a 7d 20 24 79 20 7b 7d 20 79 32 0a   {#.*} $y {} y2.
6160: 20 20 66 6f 72 65 61 63 68 20 6b 77 20 5b 6c 73    foreach kw [ls
6170: 6f 72 74 20 24 72 65 76 67 6c 69 6e 6b 28 24 79  ort $revglink($y
6180: 29 5d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 69 6e  )] {.    if {[in
6190: 66 6f 20 65 78 69 73 74 73 20 62 61 63 6b 6c 69  fo exists backli
61a0: 6e 6b 28 24 6b 77 29 5d 7d 20 7b 0a 20 20 20 20  nk($kw)]} {.    
61b0: 20 20 66 6f 72 65 61 63 68 20 72 65 66 20 5b 6c    foreach ref [l
61c0: 73 6f 72 74 20 24 62 61 63 6b 6c 69 6e 6b 28 24  sort $backlink($
61d0: 6b 77 29 5d 20 7b 0a 20 20 20 20 20 20 20 20 72  kw)] {.        r
61e0: 65 67 73 75 62 20 7b 23 2e 2a 7d 20 24 72 65 66  egsub {#.*} $ref
61f0: 20 7b 7d 20 72 65 66 32 0a 20 20 20 20 20 20 20   {} ref2.       
6200: 20 6c 61 70 70 65 6e 64 20 70 61 67 65 6c 69 6e   lappend pagelin
6210: 6b 28 24 79 32 29 20 24 72 65 66 32 0a 20 20 20  k($y2) $ref2.   
6220: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
6230: 0a 66 6f 72 65 61 63 68 20 79 20 5b 6c 73 6f 72  .foreach y [lsor
6240: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 70  t [array names p
6250: 61 67 65 6c 69 6e 6b 5d 5d 20 7b 0a 20 20 69 66  agelink]] {.  if
6260: 20 7b 5b 72 65 67 65 78 70 20 7b 28 6e 65 77 73   {[regexp {(news
6270: 7c 63 68 61 6e 67 65 73 7c 72 65 6c 65 61 73 65  |changes|release
6280: 6c 6f 67 7c 5b 30 2d 39 5d 74 6f 5b 30 2d 39 5d  log|[0-9]to[0-9]
6290: 7c 5e 64 6f 63 5f 2e 2a 5f 63 72 6f 73 73 72 65  |^doc_.*_crossre
62a0: 66 29 7d 20 24 79 5d 7d 20 63 6f 6e 74 69 6e 75  f)} $y]} continu
62b0: 65 0a 20 20 68 64 5f 70 75 74 73 20 22 3c 6c 69  e.  hd_puts "<li
62c0: 3e 3c 61 20 68 72 65 66 3d 5c 22 24 79 5c 22 3e  ><a href=\"$y\">
62d0: 24 79 3c 2f 61 3e 20 2d 20 22 0a 20 20 73 65 74  $y</a> - ".  set
62e0: 20 70 72 65 76 20 7b 7d 0a 20 20 66 6f 72 65 61   prev {}.  forea
62f0: 63 68 20 72 65 66 20 5b 6c 73 6f 72 74 20 24 70  ch ref [lsort $p
6300: 61 67 65 6c 69 6e 6b 28 24 79 29 5d 20 7b 0a 20  agelink($y)] {. 
6310: 20 20 20 69 66 20 7b 24 72 65 66 3d 3d 24 70 72     if {$ref==$pr
6320: 65 76 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20  ev} continue.   
6330: 20 69 66 20 7b 24 72 65 66 3d 3d 24 79 7d 20 63   if {$ref==$y} c
6340: 6f 6e 74 69 6e 75 65 0a 20 20 20 20 69 66 20 7b  ontinue.    if {
6350: 5b 72 65 67 65 78 70 20 7b 28 6e 65 77 73 7c 63  [regexp {(news|c
6360: 68 61 6e 67 65 73 7c 72 65 6c 65 61 73 65 6c 6f  hanges|releaselo
6370: 67 7c 5b 30 2d 39 5d 74 6f 5b 30 2d 39 5d 7c 5e  g|[0-9]to[0-9]|^
6380: 64 6f 63 5f 2e 2a 5f 63 72 6f 73 73 72 65 66 29  doc_.*_crossref)
6390: 7d 20 24 72 65 66 5d 7d 20 63 6f 6e 74 69 6e 75  } $ref]} continu
63a0: 65 0a 20 20 20 20 68 64 5f 70 75 74 73 20 22 3c  e.    hd_puts "<
63b0: 61 20 68 72 65 66 3d 5c 22 24 72 65 66 5c 22 3e  a href=\"$ref\">
63c0: 24 72 65 66 3c 2f 61 3e 20 22 0a 20 20 20 20 73  $ref</a> ".    s
63d0: 65 74 20 70 72 65 76 20 24 72 65 66 0a 20 20 7d  et prev $ref.  }
63e0: 0a 20 20 68 64 5f 70 75 74 73 20 22 3c 2f 6c 69  .  hd_puts "</li
63f0: 3e 22 0a 7d 0a 68 64 5f 70 75 74 73 20 22 3c 2f  >".}.hd_puts "</
6400: 75 6c 3e 22 0a 68 64 5f 63 6c 6f 73 65 5f 6d 61  ul>".hd_close_ma
6410: 69 6e 0a 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49  in.db eval COMMI
6420: 54 0a                                            T.