Hex Artifact Content
Not logged in

Artifact 12488f8f7c88977fc96aac7bc509938e27a251be:

File src/wikiformat.c part of check-in [55dc2abc60] - Some elements moved to correct order in wiki AllowedMarkup array. Removed hardcoded link in resolveHyperlink and also made it handle outside links, such as http, ftp, mailto, etc... When looking for valid HTML codes, I changed isalpha to isalnum so that H1, H2, etc... would be recognized. Better code for setting inital checkout db entry. by jnc on 2007-09-24 01:38:45.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 64 6f 20 66 6f 72 6d 61 74 74 69 6e 67 20  o do formatting 
0390: 6f 66 20 77 69 6b 69 20 74 65 78 74 2e 0a 2a 2f  of wiki text..*/
03a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
03b0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63  t.h>.#include "c
03c0: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64  onfig.h".#includ
03d0: 65 20 22 77 69 6b 69 66 6f 72 6d 61 74 2e 68 22  e "wikiformat.h"
03e0: 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a  ..#if INTERFACE.
03f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 77 69  /*.** Allowed wi
0400: 6b 69 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ki transformatio
0410: 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2f 0a  n operations.*/.
0420: 23 64 65 66 69 6e 65 20 57 49 4b 49 5f 4e 4f 46  #define WIKI_NOF
0430: 4f 4c 4c 4f 57 20 20 20 20 20 20 20 30 78 30 30  OLLOW       0x00
0440: 31 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 5f 48  1.#define WIKI_H
0450: 54 4d 4c 20 20 20 20 20 20 20 20 20 20 20 30 78  TML           0x
0460: 30 30 32 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  002.#endif.../*.
0470: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
0480: 20 6f 6e 6c 79 20 6d 61 72 6b 75 70 20 61 74 74   only markup att
0490: 72 69 62 75 74 65 73 20 61 6c 6c 6f 77 65 64 2e  ributes allowed.
04a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 54 54 52  .*/.#define ATTR
04b0: 5f 41 4c 49 47 4e 20 20 20 20 20 20 20 20 20 20  _ALIGN          
04c0: 20 20 20 20 30 78 30 30 30 30 30 31 0a 23 64 65      0x000001.#de
04d0: 66 69 6e 65 20 41 54 54 52 5f 41 4c 54 20 20 20  fine ATTR_ALT   
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
04f0: 30 30 30 30 32 0a 23 64 65 66 69 6e 65 20 41 54  00002.#define AT
0500: 54 52 5f 42 47 43 4f 4c 4f 52 20 20 20 20 20 20  TR_BGCOLOR      
0510: 20 20 20 20 20 20 30 78 30 30 30 30 30 34 0a 23        0x000004.#
0520: 64 65 66 69 6e 65 20 41 54 54 52 5f 42 4f 52 44  define ATTR_BORD
0530: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
0540: 78 30 30 30 30 30 38 0a 23 64 65 66 69 6e 65 20  x000008.#define 
0550: 41 54 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e 47  ATTR_CELLPADDING
0560: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30          0x000010
0570: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 43 45  .#define ATTR_CE
0580: 4c 4c 53 50 41 43 49 4e 47 20 20 20 20 20 20 20  LLSPACING       
0590: 20 30 78 30 30 30 30 32 30 0a 23 64 65 66 69 6e   0x000020.#defin
05a0: 65 20 41 54 54 52 5f 43 4c 45 41 52 20 20 20 20  e ATTR_CLEAR    
05b0: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30            0x0000
05c0: 34 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  40.#define ATTR_
05d0: 43 4f 4c 4f 52 20 20 20 20 20 20 20 20 20 20 20  COLOR           
05e0: 20 20 20 30 78 30 30 30 30 38 30 0a 23 64 65 66     0x000080.#def
05f0: 69 6e 65 20 41 54 54 52 5f 43 4f 4c 53 50 41 4e  ine ATTR_COLSPAN
0600: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30              0x00
0610: 30 31 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54  0100.#define ATT
0620: 52 5f 43 4f 4d 50 41 43 54 20 20 20 20 20 20 20  R_COMPACT       
0630: 20 20 20 20 20 30 78 30 30 30 32 30 30 0a 23 64       0x000200.#d
0640: 65 66 69 6e 65 20 41 54 54 52 5f 46 41 43 45 20  efine ATTR_FACE 
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0660: 30 30 30 34 30 30 0a 23 64 65 66 69 6e 65 20 41  000400.#define A
0670: 54 54 52 5f 48 45 49 47 48 54 20 20 20 20 20 20  TTR_HEIGHT      
0680: 20 20 20 20 20 20 20 30 78 30 30 30 38 30 30 0a         0x000800.
0690: 23 64 65 66 69 6e 65 20 41 54 54 52 5f 48 52 45  #define ATTR_HRE
06a0: 46 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  F               
06b0: 30 78 30 30 31 30 30 30 0a 23 64 65 66 69 6e 65  0x001000.#define
06c0: 20 41 54 54 52 5f 48 53 50 41 43 45 20 20 20 20   ATTR_HSPACE    
06d0: 20 20 20 20 20 20 20 20 20 30 78 30 30 32 30 30           0x00200
06e0: 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 49  0.#define ATTR_I
06f0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
0700: 20 20 30 78 30 30 34 30 30 30 0a 23 64 65 66 69    0x004000.#defi
0710: 6e 65 20 41 54 54 52 5f 52 4f 57 53 50 41 4e 20  ne ATTR_ROWSPAN 
0720: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 38             0x008
0730: 30 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52  000.#define ATTR
0740: 5f 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20  _SIZE           
0750: 20 20 20 20 30 78 30 31 30 30 30 30 0a 23 64 65      0x010000.#de
0760: 66 69 6e 65 20 41 54 54 52 5f 53 52 43 20 20 20  fine ATTR_SRC   
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0780: 32 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41 54  20000.#define AT
0790: 54 52 5f 53 54 41 52 54 20 20 20 20 20 20 20 20  TR_START        
07a0: 20 20 20 20 20 20 30 78 30 34 30 30 30 30 0a 23        0x040000.#
07b0: 64 65 66 69 6e 65 20 41 54 54 52 5f 54 59 50 45  define ATTR_TYPE
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
07d0: 78 30 38 30 30 30 30 0a 23 64 65 66 69 6e 65 20  x080000.#define 
07e0: 41 54 54 52 5f 56 41 4c 49 47 4e 20 20 20 20 20  ATTR_VALIGN     
07f0: 20 20 20 20 20 20 20 20 30 78 31 30 30 30 30 30          0x100000
0800: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 56 41  .#define ATTR_VA
0810: 4c 55 45 20 20 20 20 20 20 20 20 20 20 20 20 20  LUE             
0820: 20 30 78 32 30 30 30 30 30 0a 23 64 65 66 69 6e   0x200000.#defin
0830: 65 20 41 54 54 52 5f 56 53 50 41 43 45 20 20 20  e ATTR_VSPACE   
0840: 20 20 20 20 20 20 20 20 20 20 30 78 34 30 30 30            0x4000
0850: 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  00.#define ATTR_
0860: 57 49 44 54 48 20 20 20 20 20 20 20 20 20 20 20  WIDTH           
0870: 20 20 20 30 78 38 30 30 30 30 30 0a 0a 73 74 61     0x800000..sta
0880: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
0890: 20 41 6c 6c 6f 77 65 64 41 74 74 72 69 62 75 74   AllowedAttribut
08a0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e {.  const char
08b0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67   *zName;.  unsig
08c0: 6e 65 64 20 69 6e 74 20 69 4d 61 73 6b 3b 0a 7d  ned int iMask;.}
08d0: 20 61 41 74 74 72 69 62 75 74 65 5b 5d 20 3d 20   aAttribute[] = 
08e0: 7b 0a 20 20 7b 20 22 61 6c 69 67 6e 22 2c 20 20  {.  { "align",  
08f0: 20 20 20 20 20 20 20 41 54 54 52 5f 41 4c 49 47         ATTR_ALIG
0900: 4e 2c 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  N,          },. 
0910: 20 7b 20 22 61 6c 74 22 2c 20 20 20 20 20 20 20   { "alt",       
0920: 20 20 20 20 41 54 54 52 5f 41 4c 54 2c 20 20 20      ATTR_ALT,   
0930: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0940: 22 62 67 63 6f 6c 6f 72 22 2c 20 20 20 20 20 20  "bgcolor",      
0950: 20 41 54 54 52 5f 42 47 43 4f 4c 4f 52 2c 20 20   ATTR_BGCOLOR,  
0960: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 62 6f        },.  { "bo
0970: 72 64 65 72 22 2c 20 20 20 20 20 20 20 20 41 54  rder",        AT
0980: 54 52 5f 42 4f 52 44 45 52 2c 20 20 20 20 20 20  TR_BORDER,      
0990: 20 20 20 7d 2c 0a 20 20 7b 20 22 63 65 6c 6c 70     },.  { "cellp
09a0: 61 64 64 69 6e 67 22 2c 20 20 20 41 54 54 52 5f  adding",   ATTR_
09b0: 43 45 4c 4c 50 41 44 44 49 4e 47 2c 20 20 20 20  CELLPADDING,    
09c0: 7d 2c 0a 20 20 7b 20 22 63 65 6c 6c 73 70 61 63  },.  { "cellspac
09d0: 69 6e 67 22 2c 20 20 20 41 54 54 52 5f 43 45 4c  ing",   ATTR_CEL
09e0: 4c 53 50 41 43 49 4e 47 2c 20 20 20 20 7d 2c 0a  LSPACING,    },.
09f0: 20 20 7b 20 22 63 6c 65 61 72 22 2c 20 20 20 20    { "clear",    
0a00: 20 20 20 20 20 41 54 54 52 5f 43 4c 45 41 52 2c       ATTR_CLEAR,
0a10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
0a20: 20 22 63 6f 6c 6f 72 22 2c 20 20 20 20 20 20 20   "color",       
0a30: 20 20 41 54 54 52 5f 43 4f 4c 4f 52 2c 20 20 20    ATTR_COLOR,   
0a40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63         },.  { "c
0a50: 6f 6c 73 70 61 6e 22 2c 20 20 20 20 20 20 20 41  olspan",       A
0a60: 54 54 52 5f 43 4f 4c 53 50 41 4e 2c 20 20 20 20  TTR_COLSPAN,    
0a70: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6d 70      },.  { "comp
0a80: 61 63 74 22 2c 20 20 20 20 20 20 20 41 54 54 52  act",       ATTR
0a90: 5f 43 4f 4d 50 41 43 54 2c 20 20 20 20 20 20 20  _COMPACT,       
0aa0: 20 7d 2c 0a 20 20 7b 20 22 66 61 63 65 22 2c 20   },.  { "face", 
0ab0: 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 46 41           ATTR_FA
0ac0: 43 45 2c 20 20 20 20 20 20 20 20 20 20 20 7d 2c  CE,           },
0ad0: 0a 20 20 7b 20 22 68 65 69 67 68 74 22 2c 20 20  .  { "height",  
0ae0: 20 20 20 20 20 20 41 54 54 52 5f 48 45 49 47 48        ATTR_HEIGH
0af0: 54 2c 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  T,         },.  
0b00: 7b 20 22 68 72 65 66 22 2c 20 20 20 20 20 20 20  { "href",       
0b10: 20 20 20 41 54 54 52 5f 48 52 45 46 2c 20 20 20     ATTR_HREF,   
0b20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
0b30: 68 73 70 61 63 65 22 2c 20 20 20 20 20 20 20 20  hspace",        
0b40: 41 54 54 52 5f 48 53 50 41 43 45 2c 20 20 20 20  ATTR_HSPACE,    
0b50: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 69 64 22       },.  { "id"
0b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 41 54 54  ,            ATT
0b70: 52 5f 49 44 2c 20 20 20 20 20 20 20 20 20 20 20  R_ID,           
0b80: 20 20 7d 2c 0a 20 20 7b 20 22 72 6f 77 73 70 61    },.  { "rowspa
0b90: 6e 22 2c 20 20 20 20 20 20 20 41 54 54 52 5f 52  n",       ATTR_R
0ba0: 4f 57 53 50 41 4e 2c 20 20 20 20 20 20 20 20 7d  OWSPAN,        }
0bb0: 2c 0a 20 20 7b 20 22 73 69 7a 65 22 2c 20 20 20  ,.  { "size",   
0bc0: 20 20 20 20 20 20 20 41 54 54 52 5f 53 49 5a 45         ATTR_SIZE
0bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ,           },. 
0be0: 20 7b 20 22 73 72 63 22 2c 20 20 20 20 20 20 20   { "src",       
0bf0: 20 20 20 20 41 54 54 52 5f 53 52 43 2c 20 20 20      ATTR_SRC,   
0c00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0c10: 22 73 74 61 72 74 22 2c 20 20 20 20 20 20 20 20  "start",        
0c20: 20 41 54 54 52 5f 53 54 41 52 54 2c 20 20 20 20   ATTR_START,    
0c30: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 74 79        },.  { "ty
0c40: 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 41 54  pe",          AT
0c50: 54 52 5f 54 59 50 45 2c 20 20 20 20 20 20 20 20  TR_TYPE,        
0c60: 20 20 20 7d 2c 0a 20 20 7b 20 22 76 61 6c 69 67     },.  { "valig
0c70: 6e 22 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f  n",        ATTR_
0c80: 56 41 4c 49 47 4e 2c 20 20 20 20 20 20 20 20 20  VALIGN,         
0c90: 7d 2c 0a 20 20 7b 20 22 76 61 6c 75 65 22 2c 20  },.  { "value", 
0ca0: 20 20 20 20 20 20 20 20 41 54 54 52 5f 56 41 4c          ATTR_VAL
0cb0: 55 45 2c 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  UE,          },.
0cc0: 20 20 7b 20 22 76 73 70 61 63 65 22 2c 20 20 20    { "vspace",   
0cd0: 20 20 20 20 20 41 54 54 52 5f 56 53 50 41 43 45       ATTR_VSPACE
0ce0: 2c 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b  ,         },.  {
0cf0: 20 22 77 69 64 74 68 22 2c 20 20 20 20 20 20 20   "width",       
0d00: 20 20 41 54 54 52 5f 57 49 44 54 48 2c 20 20 20    ATTR_WIDTH,   
0d10: 20 20 20 20 20 20 20 7d 2c 0a 7d 3b 0a 0a 2f 2a         },.};../*
0d20: 0a 2a 2a 20 55 73 65 20 62 69 6e 61 72 79 20 73  .** Use binary s
0d30: 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20  earch to locate 
0d40: 61 20 74 61 67 20 69 6e 20 74 68 65 20 61 41 74  a tag in the aAt
0d50: 74 72 69 62 75 74 65 5b 5d 20 74 61 62 6c 65 2e  tribute[] table.
0d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
0d70: 69 6e 64 41 74 74 72 28 63 6f 6e 73 74 20 63 68  indAttr(const ch
0d80: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
0d90: 20 63 2c 20 66 69 72 73 74 2c 20 6c 61 73 74 3b   c, first, last;
0da0: 0a 20 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  .  first = 0;.  
0db0: 6c 61 73 74 20 3d 20 73 69 7a 65 6f 66 28 61 41  last = sizeof(aA
0dc0: 74 74 72 69 62 75 74 65 29 2f 73 69 7a 65 6f 66  ttribute)/sizeof
0dd0: 28 61 41 74 74 72 69 62 75 74 65 5b 30 5d 29 20  (aAttribute[0]) 
0de0: 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 66 69  - 1;.  while( fi
0df0: 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20  rst<=last ){.   
0e00: 20 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73 74   i = (first+last
0e10: 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 74 72  )/2;.    c = str
0e20: 63 6d 70 28 61 41 74 74 72 69 62 75 74 65 5b 69  cmp(aAttribute[i
0e30: 5d 2e 7a 4e 61 6d 65 2c 20 7a 29 3b 0a 20 20 20  ].zName, z);.   
0e40: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
0e50: 20 20 20 72 65 74 75 72 6e 20 61 41 74 74 72 69     return aAttri
0e60: 62 75 74 65 5b 69 5d 2e 69 4d 61 73 6b 3b 0a 20  bute[i].iMask;. 
0e70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30     }else if( c<0
0e80: 20 29 7b 0a 20 20 20 20 20 20 66 69 72 73 74 20   ){.      first 
0e90: 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  = i+1;.    }else
0ea0: 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 69  {.      last = i
0eb0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
0ec0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 0a 2f  return 0;.}..../
0ed0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 6d 61 72  *.** Allowed mar
0ee0: 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  kup..**.** Excep
0ef0: 74 20 66 6f 72 20 4d 41 52 4b 55 50 5f 49 4e 56  t for MARKUP_INV
0f00: 41 4c 49 44 2c 20 74 68 69 73 20 6d 75 73 74 20  ALID, this must 
0f10: 61 6c 6c 20 62 65 20 69 6e 20 61 6c 70 68 61 62  all be in alphab
0f20: 65 74 69 63 61 6c 20 6f 72 64 65 72 0a 2a 2a 20  etical order.** 
0f30: 61 6e 64 20 69 6e 20 6e 75 6d 65 72 69 63 61 6c  and in numerical
0f40: 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20   sequence.  The 
0f50: 66 69 72 73 74 20 6d 61 72 6b 75 70 20 74 79 70  first markup typ
0f60: 65 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2e 0a  e must be zero..
0f70: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  ** The value for
0f80: 20 4d 41 52 4b 55 50 5f 58 59 5a 20 6d 75 73 74   MARKUP_XYZ must
0f90: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
0fa0: 68 65 20 3c 78 79 7a 3e 20 65 6e 74 72 79 20 0a  he <xyz> entry .
0fb0: 2a 2a 20 69 6e 20 61 41 6c 6c 6f 77 65 64 4d 61  ** in aAllowedMa
0fc0: 72 6b 75 70 5b 5d 2e 0a 2a 2f 0a 23 64 65 66 69  rkup[]..*/.#defi
0fd0: 6e 65 20 4d 41 52 4b 55 50 5f 49 4e 56 41 4c 49  ne MARKUP_INVALI
0fe0: 44 20 20 20 20 20 20 20 20 20 32 35 35 0a 23 64  D         255.#d
0ff0: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 41 20 20  efine MARKUP_A  
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1010: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1020: 41 44 44 52 45 53 53 20 20 20 20 20 20 20 20 20  ADDRESS         
1030: 20 20 31 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b    1.#define MARK
1040: 55 50 5f 42 20 20 20 20 20 20 20 20 20 20 20 20  UP_B            
1050: 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4d       2.#define M
1060: 41 52 4b 55 50 5f 42 49 47 20 20 20 20 20 20 20  ARKUP_BIG       
1070: 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e          3.#defin
1080: 65 20 4d 41 52 4b 55 50 5f 42 4c 4f 43 4b 51 55  e MARKUP_BLOCKQU
1090: 4f 54 45 20 20 20 20 20 20 20 20 34 0a 23 64 65  OTE        4.#de
10a0: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42 52 20 20  fine MARKUP_BR  
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 0a                5.
10c0: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 43  #define MARKUP_C
10d0: 45 4e 54 45 52 20 20 20 20 20 20 20 20 20 20 20  ENTER           
10e0: 20 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55   6.#define MARKU
10f0: 50 5f 43 49 54 45 20 20 20 20 20 20 20 20 20 20  P_CITE          
1100: 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 4d 41      7.#define MA
1110: 52 4b 55 50 5f 43 4f 44 45 20 20 20 20 20 20 20  RKUP_CODE       
1120: 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65         8.#define
1130: 20 4d 41 52 4b 55 50 5f 44 44 20 20 20 20 20 20   MARKUP_DD      
1140: 20 20 20 20 20 20 20 20 20 20 39 0a 23 64 65 66            9.#def
1150: 69 6e 65 20 4d 41 52 4b 55 50 5f 44 46 4e 20 20  ine MARKUP_DFN  
1160: 20 20 20 20 20 20 20 20 20 20 20 20 31 30 0a 23              10.#
1170: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 44 4c  define MARKUP_DL
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1190: 31 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  1.#define MARKUP
11a0: 5f 44 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _DT             
11b0: 20 20 31 32 0a 23 64 65 66 69 6e 65 20 4d 41 52    12.#define MAR
11c0: 4b 55 50 5f 45 4d 20 20 20 20 20 20 20 20 20 20  KUP_EM          
11d0: 20 20 20 20 20 31 33 0a 23 64 65 66 69 6e 65 20       13.#define 
11e0: 4d 41 52 4b 55 50 5f 46 4f 4e 54 20 20 20 20 20  MARKUP_FONT     
11f0: 20 20 20 20 20 20 20 20 31 34 0a 23 64 65 66 69          14.#defi
1200: 6e 65 20 4d 41 52 4b 55 50 5f 48 31 20 20 20 20  ne MARKUP_H1    
1210: 20 20 20 20 20 20 20 20 20 20 20 31 35 0a 23 64             15.#d
1220: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48 32 20  efine MARKUP_H2 
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 36                16
1240: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1250: 48 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H3              
1260: 20 31 37 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   17.#define MARK
1270: 55 50 5f 48 34 20 20 20 20 20 20 20 20 20 20 20  UP_H4           
1280: 20 20 20 20 31 38 0a 23 64 65 66 69 6e 65 20 4d      18.#define M
1290: 41 52 4b 55 50 5f 48 35 20 20 20 20 20 20 20 20  ARKUP_H5        
12a0: 20 20 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e         19.#defin
12b0: 65 20 4d 41 52 4b 55 50 5f 48 36 20 20 20 20 20  e MARKUP_H6     
12c0: 20 20 20 20 20 20 20 20 20 20 32 30 0a 23 64 65            20.#de
12d0: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48 52 20 20  fine MARKUP_HR  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 31 0a               21.
12f0: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 49  #define MARKUP_I
1300: 4d 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MG              
1310: 32 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  22.#define MARKU
1320: 50 5f 49 20 20 20 20 20 20 20 20 20 20 20 20 20  P_I             
1330: 20 20 20 32 33 0a 23 64 65 66 69 6e 65 20 4d 41     23.#define MA
1340: 52 4b 55 50 5f 4b 42 44 20 20 20 20 20 20 20 20  RKUP_KBD        
1350: 20 20 20 20 20 20 32 34 0a 23 64 65 66 69 6e 65        24.#define
1360: 20 4d 41 52 4b 55 50 5f 4c 49 20 20 20 20 20 20   MARKUP_LI      
1370: 20 20 20 20 20 20 20 20 20 32 35 0a 23 64 65 66           25.#def
1380: 69 6e 65 20 4d 41 52 4b 55 50 5f 4e 4f 42 52 20  ine MARKUP_NOBR 
1390: 20 20 20 20 20 20 20 20 20 20 20 20 32 36 0a 23              26.#
13a0: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 4e 4f  define MARKUP_NO
13b0: 57 49 4b 49 20 20 20 20 20 20 20 20 20 20 20 32  WIKI           2
13c0: 37 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  7.#define MARKUP
13d0: 5f 4f 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  _OL             
13e0: 20 20 32 38 0a 23 64 65 66 69 6e 65 20 4d 41 52    28.#define MAR
13f0: 4b 55 50 5f 50 20 20 20 20 20 20 20 20 20 20 20  KUP_P           
1400: 20 20 20 20 20 32 39 0a 23 64 65 66 69 6e 65 20       29.#define 
1410: 4d 41 52 4b 55 50 5f 50 52 45 20 20 20 20 20 20  MARKUP_PRE      
1420: 20 20 20 20 20 20 20 20 33 30 0a 23 64 65 66 69          30.#defi
1430: 6e 65 20 4d 41 52 4b 55 50 5f 53 20 20 20 20 20  ne MARKUP_S     
1440: 20 20 20 20 20 20 20 20 20 20 20 33 31 0a 23 64             31.#d
1450: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53 41 4d  efine MARKUP_SAM
1460: 50 20 20 20 20 20 20 20 20 20 20 20 20 20 33 32  P             32
1470: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1480: 53 4d 41 4c 4c 20 20 20 20 20 20 20 20 20 20 20  SMALL           
1490: 20 33 33 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   33.#define MARK
14a0: 55 50 5f 53 54 52 49 4b 45 20 20 20 20 20 20 20  UP_STRIKE       
14b0: 20 20 20 20 33 34 0a 23 64 65 66 69 6e 65 20 4d      34.#define M
14c0: 41 52 4b 55 50 5f 53 54 52 4f 4e 47 20 20 20 20  ARKUP_STRONG    
14d0: 20 20 20 20 20 20 20 33 35 0a 23 64 65 66 69 6e         35.#defin
14e0: 65 20 4d 41 52 4b 55 50 5f 53 55 42 20 20 20 20  e MARKUP_SUB    
14f0: 20 20 20 20 20 20 20 20 20 20 33 36 0a 23 64 65            36.#de
1500: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53 55 50 20  fine MARKUP_SUP 
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 37 0a               37.
1520: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 54  #define MARKUP_T
1530: 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  ABLE            
1540: 33 38 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  38.#define MARKU
1550: 50 5f 54 44 20 20 20 20 20 20 20 20 20 20 20 20  P_TD            
1560: 20 20 20 33 39 0a 23 64 65 66 69 6e 65 20 4d 41     39.#define MA
1570: 52 4b 55 50 5f 54 48 20 20 20 20 20 20 20 20 20  RKUP_TH         
1580: 20 20 20 20 20 20 34 30 0a 23 64 65 66 69 6e 65        40.#define
1590: 20 4d 41 52 4b 55 50 5f 54 52 20 20 20 20 20 20   MARKUP_TR      
15a0: 20 20 20 20 20 20 20 20 20 34 31 0a 23 64 65 66           41.#def
15b0: 69 6e 65 20 4d 41 52 4b 55 50 5f 54 54 20 20 20  ine MARKUP_TT   
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 34 32 0a 23              42.#
15d0: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 55 20  define MARKUP_U 
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
15f0: 33 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  3.#define MARKUP
1600: 5f 55 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  _UL             
1610: 20 20 34 34 0a 23 64 65 66 69 6e 65 20 4d 41 52    44.#define MAR
1620: 4b 55 50 5f 56 41 52 20 20 20 20 20 20 20 20 20  KUP_VAR         
1630: 20 20 20 20 20 34 35 0a 23 64 65 66 69 6e 65 20       45.#define 
1640: 4d 41 52 4b 55 50 5f 56 45 52 42 41 54 49 4d 20  MARKUP_VERBATIM 
1650: 20 20 20 20 20 20 20 20 34 36 0a 0a 2f 2a 0a 2a          46../*.*
1660: 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 6d 61  * The various ma
1670: 72 6b 75 70 20 69 73 20 64 69 76 69 64 65 64 20  rkup is divided 
1680: 69 6e 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  into the followi
1690: 6e 67 20 74 79 70 65 73 3a 0a 2a 2f 0a 23 64 65  ng types:.*/.#de
16a0: 66 69 6e 65 20 4d 55 54 59 50 45 5f 53 49 4e 47  fine MUTYPE_SING
16b0: 4c 45 20 20 20 20 20 20 30 78 30 30 30 31 20 20  LE      0x0001  
16c0: 20 2f 2a 20 3c 69 6d 67 3e 2c 20 3c 62 72 3e 2c   /* <img>, <br>,
16d0: 20 6f 72 20 3c 68 72 3e 20 2a 2f 0a 23 64 65 66   or <hr> */.#def
16e0: 69 6e 65 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b  ine MUTYPE_BLOCK
16f0: 20 20 20 20 20 20 20 30 78 30 30 30 32 20 20 20         0x0002   
1700: 2f 2a 20 46 6f 72 6d 73 20 61 20 6e 65 77 20 70  /* Forms a new p
1710: 61 72 61 67 72 61 70 68 2e 20 65 78 3a 20 3c 70  aragraph. ex: <p
1720: 3e 2c 20 3c 68 32 3e 20 2a 2f 0a 23 64 65 66 69  >, <h2> */.#defi
1730: 6e 65 20 4d 55 54 59 50 45 5f 46 4f 4e 54 20 20  ne MUTYPE_FONT  
1740: 20 20 20 20 20 20 30 78 30 30 30 34 20 20 20 2f        0x0004   /
1750: 2a 20 46 6f 6e 74 20 63 68 61 6e 67 65 73 2e 20  * Font changes. 
1760: 65 78 3a 20 3c 62 3e 2c 20 3c 66 6f 6e 74 3e 2c  ex: <b>, <font>,
1770: 20 3c 73 75 62 3e 20 2a 2f 0a 23 64 65 66 69 6e   <sub> */.#defin
1780: 65 20 4d 55 54 59 50 45 5f 4c 49 4e 4b 20 20 20  e MUTYPE_LINK   
1790: 20 20 20 20 20 30 78 30 30 30 38 20 20 20 2f 2a       0x0008   /*
17a0: 20 48 79 70 65 72 6c 69 6e 6b 3a 20 3c 61 3e 20   Hyperlink: <a> 
17b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50  */.#define MUTYP
17c0: 45 5f 4c 49 53 54 20 20 20 20 20 20 20 20 30 78  E_LIST        0x
17d0: 30 30 31 30 20 20 20 2f 2a 20 4c 69 73 74 73 2e  0010   /* Lists.
17e0: 20 20 3c 6f 6c 3e 2c 20 3c 75 6c 3e 2c 20 6f 72    <ol>, <ul>, or
17f0: 20 3c 64 6c 3e 20 2a 2f 0a 23 64 65 66 69 6e 65   <dl> */.#define
1800: 20 4d 55 54 59 50 45 5f 4c 49 20 20 20 20 20 20   MUTYPE_LI      
1810: 20 20 20 20 30 78 30 30 32 30 20 20 20 2f 2a 20      0x0020   /* 
1820: 4c 69 73 74 20 69 74 65 6d 73 2e 20 20 3c 6c 69  List items.  <li
1830: 3e 2c 20 3c 64 64 3e 2c 20 3c 64 74 3e 20 2a 2f  >, <dd>, <dt> */
1840: 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f  .#define MUTYPE_
1850: 54 41 42 4c 45 20 20 20 20 20 20 20 30 78 30 30  TABLE       0x00
1860: 34 30 20 20 20 2f 2a 20 3c 74 61 62 6c 65 3e 20  40   /* <table> 
1870: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50  */.#define MUTYP
1880: 45 5f 54 52 20 20 20 20 20 20 20 20 20 20 30 78  E_TR          0x
1890: 30 30 38 30 20 20 20 2f 2a 20 3c 74 72 3e 20 2a  0080   /* <tr> *
18a0: 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45  /.#define MUTYPE
18b0: 5f 54 44 20 20 20 20 20 20 20 20 20 20 30 78 30  _TD          0x0
18c0: 31 30 30 20 20 20 2f 2a 20 3c 74 64 3e 20 6f 72  100   /* <td> or
18d0: 20 3c 74 68 3e 20 2a 2f 0a 23 64 65 66 69 6e 65   <th> */.#define
18e0: 20 4d 55 54 59 50 45 5f 53 50 45 43 49 41 4c 20   MUTYPE_SPECIAL 
18f0: 20 20 20 20 30 78 30 32 30 30 20 20 20 2f 2a 20      0x0200   /* 
1900: 3c 6e 6f 77 69 6b 69 3e 20 6f 72 20 3c 76 65 72  <nowiki> or <ver
1910: 62 61 74 69 6d 3e 20 2a 2f 0a 23 64 65 66 69 6e  batim> */.#defin
1920: 65 20 4d 55 54 59 50 45 5f 48 59 50 45 52 4c 49  e MUTYPE_HYPERLI
1930: 4e 4b 20 20 20 30 78 30 34 30 30 20 20 20 2f 2a  NK   0x0400   /*
1940: 20 3c 61 3e 20 2a 2f 0a 0a 23 64 65 66 69 6e 65   <a> */..#define
1950: 20 4d 55 54 59 50 45 5f 53 54 41 43 4b 20 20 28   MUTYPE_STACK  (
1960: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 20 7c 20 4d  MUTYPE_BLOCK | M
1970: 55 54 59 50 45 5f 46 4f 4e 54 20 7c 20 4d 55 54  UTYPE_FONT | MUT
1980: 59 50 45 5f 4c 49 53 54 20 7c 20 4d 55 54 59 50  YPE_LIST | MUTYP
1990: 45 5f 54 41 42 4c 45 29 0a 0a 73 74 61 74 69 63  E_TABLE)..static
19a0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 41 6c   const struct Al
19b0: 6c 6f 77 65 64 4d 61 72 6b 75 70 20 7b 0a 20 20  lowedMarkup {.  
19c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19d0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
19e0: 20 6f 66 20 74 68 65 20 6d 61 72 6b 75 70 20 2a   of the markup *
19f0: 2f 0a 20 20 63 68 61 72 20 69 43 6f 64 65 3b 20  /.  char iCode; 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a10: 54 68 65 20 4d 41 52 4b 55 50 5f 2a 20 63 6f 64  The MARKUP_* cod
1a20: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74  e */.  short int
1a30: 20 69 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   iType;         
1a40: 2f 2a 20 54 68 65 20 4d 55 54 59 50 45 5f 2a 20  /* The MUTYPE_* 
1a50: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c  code */.  int al
1a60: 6c 6f 77 65 64 41 74 74 72 3b 20 20 20 20 20 20  lowedAttr;      
1a70: 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 61 74     /* Allowed at
1a80: 74 72 69 62 75 74 65 73 20 6f 6e 20 74 68 69 73  tributes on this
1a90: 20 6d 61 72 6b 75 70 20 2a 2f 0a 7d 20 61 4d 61   markup */.} aMa
1aa0: 72 6b 75 70 5b 5d 20 3d 20 7b 0a 20 7b 20 22 61  rkup[] = {. { "a
1ab0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 4d  ",             M
1ac0: 41 52 4b 55 50 5f 41 2c 20 20 20 20 20 20 20 20  ARKUP_A,        
1ad0: 20 20 20 20 4d 55 54 59 50 45 5f 48 59 50 45 52      MUTYPE_HYPER
1ae0: 4c 49 4e 4b 2c 20 20 20 20 20 41 54 54 52 5f 48  LINK,     ATTR_H
1af0: 52 45 46 20 7d 2c 0a 20 7b 20 22 61 64 64 72 65  REF },. { "addre
1b00: 73 73 22 2c 20 20 20 20 20 20 20 4d 41 52 4b 55  ss",       MARKU
1b10: 50 5f 41 44 44 52 45 53 53 2c 20 20 20 20 20 20  P_ADDRESS,      
1b20: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
1b30: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
1b40: 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b",             
1b50: 4d 41 52 4b 55 50 5f 42 2c 20 20 20 20 20 20 20  MARKUP_B,       
1b60: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
1b70: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
1b80: 0a 20 7b 20 22 62 69 67 22 2c 20 20 20 20 20 20  . { "big",      
1b90: 20 20 20 20 20 4d 41 52 4b 55 50 5f 42 49 47 2c       MARKUP_BIG,
1ba0: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1bb0: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
1bc0: 30 20 20 7d 2c 0a 20 7b 20 22 62 6c 6f 63 6b 71  0  },. { "blockq
1bd0: 75 6f 74 65 22 2c 20 20 20 20 4d 41 52 4b 55 50  uote",    MARKUP
1be0: 5f 42 4c 4f 43 4b 51 55 4f 54 45 2c 20 20 20 4d  _BLOCKQUOTE,   M
1bf0: 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20  UTYPE_BLOCK,    
1c00: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 62       0  },. { "b
1c10: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  r",            M
1c20: 41 52 4b 55 50 5f 42 52 2c 20 20 20 20 20 20 20  ARKUP_BR,       
1c30: 20 20 20 20 4d 55 54 59 50 45 5f 53 49 4e 47 4c      MUTYPE_SINGL
1c40: 45 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f 43  E,        ATTR_C
1c50: 4c 45 41 52 20 20 7d 2c 0a 20 7b 20 22 63 65 6e  LEAR  },. { "cen
1c60: 74 65 72 22 2c 20 20 20 20 20 20 20 20 4d 41 52  ter",        MAR
1c70: 4b 55 50 5f 43 45 4e 54 45 52 2c 20 20 20 20 20  KUP_CENTER,     
1c80: 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20    MUTYPE_BLOCK, 
1c90: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b          0  },. {
1ca0: 20 22 63 69 74 65 22 2c 20 20 20 20 20 20 20 20   "cite",        
1cb0: 20 20 4d 41 52 4b 55 50 5f 43 49 54 45 2c 20 20    MARKUP_CITE,  
1cc0: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f         MUTYPE_FO
1cd0: 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  NT,          0  
1ce0: 7d 2c 0a 20 7b 20 22 63 6f 64 65 22 2c 20 20 20  },. { "code",   
1cf0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 43 4f         MARKUP_CO
1d00: 44 45 2c 20 20 20 20 20 20 20 20 20 4d 55 54 59  DE,         MUTY
1d10: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
1d20: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 64 64 22 2c    0  },. { "dd",
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b              MARK
1d40: 55 50 5f 44 44 2c 20 20 20 20 20 20 20 20 20 20  UP_DD,          
1d50: 20 4d 55 54 59 50 45 5f 4c 49 2c 20 20 20 20 20   MUTYPE_LI,     
1d60: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20         0  },. { 
1d70: 22 64 66 6e 22 2c 20 20 20 20 20 20 20 20 20 20  "dfn",          
1d80: 20 4d 41 52 4b 55 50 5f 44 46 4e 2c 20 20 20 20   MARKUP_DFN,    
1d90: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
1da0: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
1db0: 2c 0a 20 7b 20 22 64 6c 22 2c 20 20 20 20 20 20  ,. { "dl",      
1dc0: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 4c 2c        MARKUP_DL,
1dd0: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
1de0: 45 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20  E_LIST,         
1df0: 20 41 54 54 52 5f 43 4f 4d 50 41 43 54 20 7d 2c   ATTR_COMPACT },
1e00: 0a 20 7b 20 22 64 74 22 2c 20 20 20 20 20 20 20  . { "dt",       
1e10: 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 54 2c 20       MARKUP_DT, 
1e20: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1e30: 5f 4c 49 2c 20 20 20 20 20 20 20 20 20 20 20 20  _LI,            
1e40: 30 20 20 7d 2c 0a 20 7b 20 22 65 6d 22 2c 20 20  0  },. { "em",  
1e50: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
1e60: 5f 45 4d 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _EM,           M
1e70: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
1e80: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 66       0  },. { "f
1e90: 6f 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 4d  ont",          M
1ea0: 41 52 4b 55 50 5f 46 4f 4e 54 2c 20 20 20 20 20  ARKUP_FONT,     
1eb0: 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c      MUTYPE_FONT,
1ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed0: 20 20 20 20 20 41 54 54 52 5f 43 4f 4c 4f 52 7c       ATTR_COLOR|
1ee0: 41 54 54 52 5f 46 41 43 45 7c 41 54 54 52 5f 53  ATTR_FACE|ATTR_S
1ef0: 49 5a 45 20 20 20 7d 2c 0a 20 7b 20 22 68 31 22  IZE   },. { "h1"
1f00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52  ,            MAR
1f10: 4b 55 50 5f 48 31 2c 20 20 20 20 20 20 20 20 20  KUP_H1,         
1f20: 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20    MUTYPE_BLOCK, 
1f30: 20 20 20 20 20 20 20 20 41 54 54 52 5f 41 4c 49          ATTR_ALI
1f40: 47 4e 20 20 7d 2c 0a 20 7b 20 22 68 32 22 2c 20  GN  },. { "h2", 
1f50: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
1f60: 50 5f 48 32 2c 20 20 20 20 20 20 20 20 20 20 20  P_H2,           
1f70: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
1f80: 20 20 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e        ATTR_ALIGN
1f90: 20 20 7d 2c 0a 20 7b 20 22 68 33 22 2c 20 20 20    },. { "h3",   
1fa0: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
1fb0: 48 33 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55  H3,           MU
1fc0: 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20  TYPE_BLOCK,     
1fd0: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 20 20      ATTR_ALIGN  
1fe0: 7d 2c 0a 20 7b 20 22 68 34 22 2c 20 20 20 20 20  },. { "h4",     
1ff0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 34         MARKUP_H4
2000: 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59  ,           MUTY
2010: 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20  PE_BLOCK,       
2020: 20 20 41 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c    ATTR_ALIGN  },
2030: 0a 20 7b 20 22 68 35 22 2c 20 20 20 20 20 20 20  . { "h5",       
2040: 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 35 2c 20       MARKUP_H5, 
2050: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2060: 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  _BLOCK,         
2070: 41 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20  ATTR_ALIGN  },. 
2080: 7b 20 22 68 36 22 2c 20 20 20 20 20 20 20 20 20  { "h6",         
2090: 20 20 20 4d 41 52 4b 55 50 5f 48 36 2c 20 20 20     MARKUP_H6,   
20a0: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42          MUTYPE_B
20b0: 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41 54  LOCK,         AT
20c0: 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20  TR_ALIGN  },. { 
20d0: 22 68 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  "hr",           
20e0: 20 4d 41 52 4b 55 50 5f 48 52 2c 20 20 20 20 20   MARKUP_HR,     
20f0: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 53 49 4e        MUTYPE_SIN
2100: 47 4c 45 2c 20 20 20 20 20 20 20 20 0a 20 20 20  GLE,        .   
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41 54 54 52   ATTR_ALIGN|ATTR
2130: 5f 43 4f 4c 4f 52 7c 41 54 54 52 5f 53 49 5a 45  _COLOR|ATTR_SIZE
2140: 7c 41 54 54 52 5f 57 49 44 54 48 20 20 7d 2c 0a  |ATTR_WIDTH  },.
2150: 20 7b 20 22 69 6d 67 22 2c 20 20 20 20 20 20 20   { "img",       
2160: 20 20 20 20 4d 41 52 4b 55 50 5f 49 4d 47 2c 20      MARKUP_IMG, 
2170: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2180: 53 49 4e 47 4c 45 2c 20 20 20 20 20 20 20 20 0a  SINGLE,        .
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
21b0: 54 54 52 5f 41 4c 54 7c 41 54 54 52 5f 42 4f 52  TTR_ALT|ATTR_BOR
21c0: 44 45 52 7c 41 54 54 52 5f 48 45 49 47 48 54 7c  DER|ATTR_HEIGHT|
21d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e0: 20 20 20 20 20 41 54 54 52 5f 48 53 50 41 43 45       ATTR_HSPACE
21f0: 7c 41 54 54 52 5f 53 52 43 7c 41 54 54 52 5f 56  |ATTR_SRC|ATTR_V
2200: 53 50 41 43 45 7c 41 54 54 52 5f 57 49 44 54 48  SPACE|ATTR_WIDTH
2210: 20 20 7d 2c 0a 20 7b 20 22 69 22 2c 20 20 20 20    },. { "i",    
2220: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2230: 49 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 55  I,            MU
2240: 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20  TYPE_FONT,      
2250: 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 6b 62      0  },. { "kb
2260: 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 4d 41  d",           MA
2270: 52 4b 55 50 5f 4b 42 44 2c 20 20 20 20 20 20 20  RKUP_KBD,       
2280: 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20     MUTYPE_FONT, 
2290: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20           0  },. 
22a0: 7b 20 22 6c 69 22 2c 20 20 20 20 20 20 20 20 20  { "li",         
22b0: 20 20 20 4d 41 52 4b 55 50 5f 4c 49 2c 20 20 20     MARKUP_LI,   
22c0: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 4c          MUTYPE_L
22d0: 49 2c 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  I,            . 
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 41 54 54 52 5f 54 59 50 45 7c 41 54 54     ATTR_TYPE|ATT
2300: 52 5f 56 41 4c 55 45 20 20 7d 2c 0a 20 7b 20 22  R_VALUE  },. { "
2310: 6e 6f 62 72 22 2c 20 20 20 20 20 20 20 20 20 20  nobr",          
2320: 4d 41 52 4b 55 50 5f 4e 4f 42 52 2c 20 20 20 20  MARKUP_NOBR,    
2330: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
2340: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2350: 0a 20 7b 20 22 6e 6f 77 69 6b 69 22 2c 20 20 20  . { "nowiki",   
2360: 20 20 20 20 20 4d 41 52 4b 55 50 5f 4e 4f 57 49       MARKUP_NOWI
2370: 4b 49 2c 20 20 20 20 20 20 20 4d 55 54 59 50 45  KI,       MUTYPE
2380: 5f 53 50 45 43 49 41 4c 2c 20 20 20 20 20 20 20  _SPECIAL,       
2390: 30 20 20 7d 2c 0a 20 7b 20 22 6f 6c 22 2c 20 20  0  },. { "ol",  
23a0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
23b0: 5f 4f 4c 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _OL,           M
23c0: 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20 20  UTYPE_LIST,     
23d0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
23e0: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 53            ATTR_S
23f0: 54 41 52 54 7c 41 54 54 52 5f 54 59 50 45 7c 41  TART|ATTR_TYPE|A
2400: 54 54 52 5f 43 4f 4d 50 41 43 54 20 20 7d 2c 0a  TTR_COMPACT  },.
2410: 20 7b 20 22 70 22 2c 20 20 20 20 20 20 20 20 20   { "p",         
2420: 20 20 20 20 4d 41 52 4b 55 50 5f 50 2c 20 20 20      MARKUP_P,   
2430: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2440: 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41  BLOCK,         A
2450: 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b  TTR_ALIGN  },. {
2460: 20 22 70 72 65 22 2c 20 20 20 20 20 20 20 20 20   "pre",         
2470: 20 20 4d 41 52 4b 55 50 5f 50 52 45 2c 20 20 20    MARKUP_PRE,   
2480: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c         MUTYPE_BL
2490: 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20  OCK,         0  
24a0: 7d 2c 0a 20 7b 20 22 73 22 2c 20 20 20 20 20 20  },. { "s",      
24b0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 2c         MARKUP_S,
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59              MUTY
24d0: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
24e0: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 73 61 6d 70    0  },. { "samp
24f0: 22 2c 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b  ",          MARK
2500: 55 50 5f 53 41 4d 50 2c 20 20 20 20 20 20 20 20  UP_SAMP,        
2510: 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20   MUTYPE_FONT,   
2520: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20         0  },. { 
2530: 22 73 6d 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  "small",        
2540: 20 4d 41 52 4b 55 50 5f 53 4d 41 4c 4c 2c 20 20   MARKUP_SMALL,  
2550: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
2560: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
2570: 2c 0a 20 7b 20 22 73 74 72 69 6b 65 22 2c 20 20  ,. { "strike",  
2580: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 54 52        MARKUP_STR
2590: 49 4b 45 2c 20 20 20 20 20 20 20 4d 55 54 59 50  IKE,       MUTYP
25a0: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
25b0: 20 30 20 20 7d 2c 0a 20 7b 20 22 73 74 72 6f 6e   0  },. { "stron
25c0: 67 22 2c 20 20 20 20 20 20 20 20 4d 41 52 4b 55  g",        MARKU
25d0: 50 5f 53 54 52 4f 4e 47 2c 20 20 20 20 20 20 20  P_STRONG,       
25e0: 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20  MUTYPE_FONT,    
25f0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
2600: 73 75 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  sub",           
2610: 4d 41 52 4b 55 50 5f 53 55 42 2c 20 20 20 20 20  MARKUP_SUB,     
2620: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
2630: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2640: 0a 20 7b 20 22 73 75 70 22 2c 20 20 20 20 20 20  . { "sup",      
2650: 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 55 50 2c       MARKUP_SUP,
2660: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2670: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
2680: 30 20 20 7d 2c 0a 20 7b 20 22 74 61 62 6c 65 22  0  },. { "table"
2690: 2c 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50  ,         MARKUP
26a0: 5f 54 41 42 4c 45 2c 20 20 20 20 20 20 20 20 4d  _TABLE,        M
26b0: 55 54 59 50 45 5f 54 41 42 4c 45 2c 20 20 20 20  UTYPE_TABLE,    
26c0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
26d0: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 41            ATTR_A
26e0: 4c 49 47 4e 7c 41 54 54 52 5f 42 47 43 4f 4c 4f  LIGN|ATTR_BGCOLO
26f0: 52 7c 41 54 54 52 5f 42 4f 52 44 45 52 7c 41 54  R|ATTR_BORDER|AT
2700: 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e 47 7c 0a  TR_CELLPADDING|.
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 41 54 54 52 5f 43 45 4c 4c 53 50 41      ATTR_CELLSPA
2730: 43 49 4e 47 7c 41 54 54 52 5f 48 53 50 41 43 45  CING|ATTR_HSPACE
2740: 7c 41 54 54 52 5f 56 53 50 41 43 45 20 20 7d 2c  |ATTR_VSPACE  },
2750: 0a 20 7b 20 22 74 64 22 2c 20 20 20 20 20 20 20  . { "td",       
2760: 20 20 20 20 20 4d 41 52 4b 55 50 5f 54 44 2c 20       MARKUP_TD, 
2770: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2780: 5f 54 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  _TD,            
2790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27a0: 20 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c       ATTR_ALIGN|
27b0: 41 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 41 54 54  ATTR_BGCOLOR|ATT
27c0: 52 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20  R_COLSPAN|.     
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
27e0: 54 54 52 5f 52 4f 57 53 50 41 4e 7c 41 54 54 52  TTR_ROWSPAN|ATTR
27f0: 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22  _VALIGN  },. { "
2800: 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
2810: 4d 41 52 4b 55 50 5f 54 48 2c 20 20 20 20 20 20  MARKUP_TH,      
2820: 20 20 20 20 20 4d 55 54 59 50 45 5f 54 44 2c 0a       MUTYPE_TD,.
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
2850: 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 41 54 54 52  TTR_BGCOLOR|ATTR
2860: 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20 20  _COLSPAN|.      
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 54                AT
2880: 54 52 5f 52 4f 57 53 50 41 4e 7c 41 54 54 52 5f  TR_ROWSPAN|ATTR_
2890: 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 74  VALIGN  },. { "t
28a0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  r",            M
28b0: 41 52 4b 55 50 5f 54 52 2c 20 20 20 20 20 20 20  ARKUP_TR,       
28c0: 20 20 20 20 4d 55 54 59 50 45 5f 54 52 2c 20 0a      MUTYPE_TR, .
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
28f0: 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 7c 41 54 54  TTR_BGCOLOR||ATT
2900: 52 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20  R_VALIGN  },. { 
2910: 22 74 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  "tt",           
2920: 20 4d 41 52 4b 55 50 5f 54 54 2c 20 20 20 20 20   MARKUP_TT,     
2930: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
2940: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
2950: 2c 0a 20 7b 20 22 75 22 2c 20 20 20 20 20 20 20  ,. { "u",       
2960: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 55 2c 20        MARKUP_U, 
2970: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
2980: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
2990: 20 30 20 20 7d 2c 0a 20 7b 20 22 75 6c 22 2c 20   0  },. { "ul", 
29a0: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
29b0: 50 5f 55 4c 2c 20 20 20 20 20 20 20 20 20 20 20  P_UL,           
29c0: 4d 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20  MUTYPE_LIST,    
29d0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
29e0: 20 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f             ATTR_
29f0: 54 59 50 45 7c 41 54 54 52 5f 43 4f 4d 50 41 43  TYPE|ATTR_COMPAC
2a00: 54 20 20 7d 2c 0a 20 7b 20 22 76 61 72 22 2c 20  T  },. { "var", 
2a10: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2a20: 5f 56 41 52 2c 20 20 20 20 20 20 20 20 20 20 4d  _VAR,          M
2a30: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2a40: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 76       0  },. { "v
2a50: 65 72 62 61 74 69 6d 22 2c 20 20 20 20 20 20 4d  erbatim",      M
2a60: 41 52 4b 55 50 5f 56 45 52 42 41 54 49 4d 2c 20  ARKUP_VERBATIM, 
2a70: 20 20 20 20 4d 55 54 59 50 45 5f 53 50 45 43 49      MUTYPE_SPECI
2a80: 41 4c 2c 20 20 20 20 20 20 20 41 54 54 52 5f 49  AL,       ATTR_I
2a90: 44 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55  D },.};../*.** U
2aa0: 73 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  se binary search
2ab0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 74 61 67   to locate a tag
2ac0: 20 69 6e 20 74 68 65 20 61 4d 61 72 6b 75 70 5b   in the aMarkup[
2ad0: 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ] table..*/.stat
2ae0: 69 63 20 69 6e 74 20 66 69 6e 64 54 61 67 28 63  ic int findTag(c
2af0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
2b00: 20 69 6e 74 20 69 2c 20 63 2c 20 66 69 72 73 74   int i, c, first
2b10: 2c 20 6c 61 73 74 3b 0a 20 20 66 69 72 73 74 20  , last;.  first 
2b20: 3d 20 30 3b 0a 20 20 6c 61 73 74 20 3d 20 73 69  = 0;.  last = si
2b30: 7a 65 6f 66 28 61 4d 61 72 6b 75 70 29 2f 73 69  zeof(aMarkup)/si
2b40: 7a 65 6f 66 28 61 4d 61 72 6b 75 70 5b 30 5d 29  zeof(aMarkup[0])
2b50: 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 66   - 1;.  while( f
2b60: 69 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20  irst<=last ){.  
2b70: 20 20 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73    i = (first+las
2b80: 74 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 74  t)/2;.    c = st
2b90: 72 63 6d 70 28 61 4d 61 72 6b 75 70 5b 69 5d 2e  rcmp(aMarkup[i].
2ba0: 7a 4e 61 6d 65 2c 20 7a 29 3b 0a 20 20 20 20 69  zName, z);.    i
2bb0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
2bc0: 20 61 73 73 65 72 74 28 20 61 4d 61 72 6b 75 70   assert( aMarkup
2bd0: 5b 69 5d 2e 69 43 6f 64 65 3d 3d 69 20 29 3b 0a  [i].iCode==i );.
2be0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
2bf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c      }else if( c<
2c00: 30 20 29 7b 0a 20 20 20 20 20 20 66 69 72 73 74  0 ){.      first
2c10: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 65 6c 73   = i+1;.    }els
2c20: 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  e{.      last = 
2c30: 69 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i-1;.    }.  }. 
2c40: 20 72 65 74 75 72 6e 20 4d 41 52 4b 55 50 5f 49   return MARKUP_I
2c50: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
2c60: 20 54 6f 6b 65 6e 20 74 79 70 65 73 0a 2a 2f 0a   Token types.*/.
2c70: 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 4d 41  #define TOKEN_MA
2c80: 52 4b 55 50 20 20 20 20 20 20 20 20 31 20 20 20  RKUP        1   
2c90: 20 2f 2a 20 3c 2e 2e 2e 3e 20 2a 2f 0a 23 64 65   /* <...> */.#de
2ca0: 66 69 6e 65 20 54 4f 4b 45 4e 5f 43 48 41 52 41  fine TOKEN_CHARA
2cb0: 43 54 45 52 20 20 20 20 20 32 20 20 20 20 2f 2a  CTER     2    /*
2cc0: 20 22 26 22 20 6f 72 20 22 3c 22 20 6e 6f 74 20   "&" or "<" not 
2cd0: 70 61 72 74 20 6f 66 20 6d 61 72 6b 75 70 20 2a  part of markup *
2ce0: 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f  /.#define TOKEN_
2cf0: 4c 49 4e 4b 20 20 20 20 20 20 20 20 20 20 33 20  LINK          3 
2d00: 20 20 20 2f 2a 20 5b 2e 2e 2e 5d 20 2a 2f 0a 23     /* [...] */.#
2d10: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 50 41 52  define TOKEN_PAR
2d20: 41 47 52 41 50 48 20 20 20 20 20 34 20 20 20 20  AGRAPH     4    
2d30: 2f 2a 20 62 6c 61 6e 6b 20 6c 69 6e 65 73 20 2a  /* blank lines *
2d40: 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f  /.#define TOKEN_
2d50: 4e 45 57 4c 49 4e 45 20 20 20 20 20 20 20 35 20  NEWLINE       5 
2d60: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 22     /* A single "
2d70: 5c 6e 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  \n" */.#define T
2d80: 4f 4b 45 4e 5f 42 55 4c 4c 45 54 20 20 20 20 20  OKEN_BULLET     
2d90: 20 20 20 36 20 20 20 20 2f 2a 20 20 22 20 20 2a     6    /*  "  *
2da0: 20 20 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54    " */.#define T
2db0: 4f 4b 45 4e 5f 45 4e 55 4d 20 20 20 20 20 20 20  OKEN_ENUM       
2dc0: 20 20 20 37 20 20 20 20 2f 2a 20 20 22 20 20 5c     7    /*  "  \
2dd0: 28 3f 5c 64 2b 5b 2e 29 5d 3f 20 20 22 20 2a 2f  (?\d+[.)]?  " */
2de0: 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 49  .#define TOKEN_I
2df0: 4e 44 45 4e 54 20 20 20 20 20 20 20 20 38 20 20  NDENT        8  
2e00: 20 20 2f 2a 20 20 22 20 20 20 22 20 2a 2f 0a 23    /*  "   " */.#
2e10: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 54 45 58  define TOKEN_TEX
2e20: 54 20 20 20 20 20 20 20 20 20 20 39 20 20 20 20  T          9    
2e30: 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 61  /* None of the a
2e40: 62 6f 76 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  bove */../*.** S
2e50: 74 61 74 65 20 66 6c 61 67 73 0a 2a 2f 0a 23 64  tate flags.*/.#d
2e60: 65 66 69 6e 65 20 41 54 5f 4e 45 57 4c 49 4e 45  efine AT_NEWLINE
2e70: 20 20 20 20 20 20 20 20 30 78 30 30 31 20 20 2f          0x001  /
2e80: 2a 20 41 74 20 73 74 61 72 74 20 6f 66 20 61 20  * At start of a 
2e90: 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  line */.#define 
2ea0: 41 54 5f 50 41 52 41 47 52 41 50 48 20 20 20 20  AT_PARAGRAPH    
2eb0: 20 20 30 78 30 30 32 20 20 2f 2a 20 41 74 20 73    0x002  /* At s
2ec0: 74 61 72 74 20 6f 66 20 61 20 70 61 72 61 67 72  tart of a paragr
2ed0: 61 70 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41  aph */.#define A
2ee0: 4c 4c 4f 57 5f 57 49 4b 49 20 20 20 20 20 20 20  LLOW_WIKI       
2ef0: 20 30 78 30 30 34 20 20 2f 2a 20 41 6c 6c 6f 77   0x004  /* Allow
2f00: 20 77 69 6b 69 20 6d 61 72 6b 75 70 20 2a 2f 0a   wiki markup */.
2f10: 23 64 65 66 69 6e 65 20 46 4f 4e 54 5f 4d 41 52  #define FONT_MAR
2f20: 4b 55 50 5f 4f 4e 4c 59 20 20 30 78 30 30 38 20  KUP_ONLY  0x008 
2f30: 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 4d   /* Only allow M
2f40: 55 54 59 50 45 5f 46 4f 4e 54 20 6d 61 72 6b 75  UTYPE_FONT marku
2f50: 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 5f  p */.#define IN_
2f60: 4c 49 53 54 20 20 20 20 20 20 20 20 20 20 20 30  LIST           0
2f70: 78 30 31 30 20 20 2f 2a 20 57 69 74 68 69 6e 20  x010  /* Within 
2f80: 3c 75 6c 3e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a  <ul> */../*.** z
2f90: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 22 3c 22   points to a "<"
2fa0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 43 68 65   character.  Che
2fb0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
2fc0: 73 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  s is the start o
2fd0: 66 0a 2a 2a 20 61 20 76 61 6c 69 64 20 6d 61 72  f.** a valid mar
2fe0: 6b 75 70 2e 20 20 49 66 20 69 74 20 69 73 2c 20  kup.  If it is, 
2ff0: 72 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  return the total
3000: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
3010: 63 74 65 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  cters in.** the 
3020: 6d 61 72 6b 75 70 20 69 6e 63 6c 75 64 69 6e 67  markup including
3030: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 3c 22   the initial "<"
3040: 20 61 6e 64 20 74 68 65 20 74 65 72 6d 69 6e 61   and the termina
3050: 74 69 6e 67 20 22 3e 22 2e 20 20 49 66 0a 2a 2a  ting ">".  If.**
3060: 20 69 74 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d   it is not well-
3070: 66 6f 72 6d 65 64 20 6d 61 72 6b 75 70 2c 20 72  formed markup, r
3080: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3090: 69 63 20 69 6e 74 20 6d 61 72 6b 75 70 4c 65 6e  ic int markupLen
30a0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
30b0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 31 3b  z){.  int n = 1;
30c0: 0a 20 20 69 6e 74 20 69 6e 70 61 72 65 6e 20 3d  .  int inparen =
30d0: 20 30 3b 0a 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d   0;.  if( z[n]==
30e0: 27 2f 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '/' ){ n++; }.  
30f0: 69 66 28 20 21 69 73 61 6c 70 68 61 28 7a 5b 6e  if( !isalpha(z[n
3100: 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ]) ) return 0;. 
3110: 20 77 68 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28   while( isalnum(
3120: 7a 5b 6e 5d 29 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  z[n]) ){ n++; }.
3130: 20 20 69 66 28 20 7a 5b 6e 5d 21 3d 27 3e 27 20    if( z[n]!='>' 
3140: 26 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6e 5d  && !isspace(z[n]
3150: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
3160: 77 68 69 6c 65 28 20 7a 5b 6e 5d 20 26 26 20 28  while( z[n] && (
3170: 7a 5b 6e 5d 21 3d 27 3e 27 20 7c 7c 20 69 6e 70  z[n]!='>' || inp
3180: 61 72 65 6e 29 20 29 7b 0a 20 20 20 20 69 66 28  aren) ){.    if(
3190: 20 7a 5b 6e 5d 3d 3d 27 22 27 20 29 7b 0a 20 20   z[n]=='"' ){.  
31a0: 20 20 20 20 69 6e 70 61 72 65 6e 20 3d 20 21 69      inparen = !i
31b0: 6e 70 61 72 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  nparen;.    }.  
31c0: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
31d0: 20 7a 5b 6e 5d 21 3d 27 3e 27 20 29 20 72 65 74   z[n]!='>' ) ret
31e0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
31f0: 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 20  n+1;.}../*.** z 
3200: 70 6f 69 6e 74 73 20 74 6f 20 61 20 22 5c 6e 22  points to a "\n"
3210: 20 63 68 61 72 61 63 74 65 72 2e 20 20 43 68 65   character.  Che
3220: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
3230: 73 20 6e 65 77 6c 69 6e 65 20 69 73 0a 2a 2a 20  s newline is.** 
3240: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6f 6e 65 20  followed by one 
3250: 6f 72 20 6d 6f 72 65 20 62 6c 61 6e 6b 20 6c 69  or more blank li
3260: 6e 65 73 2e 20 20 49 66 20 69 74 20 69 73 2c 20  nes.  If it is, 
3270: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
3280: 72 0a 2a 2a 20 6f 66 20 63 68 61 72 61 63 74 65  r.** of characte
3290: 72 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  rs through the c
32a0: 6c 6f 73 69 6e 67 20 22 5c 6e 22 2e 20 20 49 66  losing "\n".  If
32b0: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 30 2e 0a   not, return 0..
32c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
32d0: 72 61 67 72 61 70 68 42 72 65 61 6b 4c 65 6e 67  ragraphBreakLeng
32e0: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
32f0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
3300: 20 69 6e 74 20 6e 4e 65 77 6c 69 6e 65 20 3d 20   int nNewline = 
3310: 31 3b 0a 20 20 66 6f 72 28 69 3d 31 2c 20 6e 3d  1;.  for(i=1, n=
3320: 30 3b 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29  0; isspace(z[i])
3330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
3340: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  z[i]=='\n' ){.  
3350: 20 20 20 20 6e 4e 65 77 6c 69 6e 65 2b 2b 3b 0a      nNewline++;.
3360: 20 20 20 20 20 20 6e 20 3d 20 69 3b 0a 20 20 20        n = i;.   
3370: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4e 65   }.  }.  if( nNe
3380: 77 6c 69 6e 65 3e 3d 32 20 29 7b 0a 20 20 20 20  wline>=2 ){.    
3390: 72 65 74 75 72 6e 20 6e 2b 31 3b 0a 20 20 7d 65  return n+1;.  }e
33a0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
33b0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
33c0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
33d0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
33e0: 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 20 22  until the next "
33f0: 69 6e 74 65 72 65 73 74 69 6e 67 22 0a 2a 2a 20  interesting".** 
3400: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
3410: 2a 20 49 6e 74 65 72 65 73 74 69 6e 67 20 63 68  * Interesting ch
3420: 61 72 61 63 74 65 72 73 20 61 72 65 3a 0a 2a 2a  aracters are:.**
3430: 0a 2a 2a 20 20 20 20 20 20 3c 0a 2a 2a 20 20 20  .**      <.**   
3440: 20 20 20 26 0a 2a 2a 20 20 20 20 20 20 5c 6e 0a     &.**      \n.
3450: 2a 2a 20 20 20 20 20 20 5b 0a 2a 2a 0a 2a 2a 20  **      [.**.** 
3460: 54 68 65 20 22 5b 22 20 61 6e 64 20 22 5c 6e 22  The "[" and "\n"
3470: 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
3480: 65 72 65 64 20 69 6e 74 65 72 65 73 74 69 6e 67  ered interesting
3490: 20 69 66 20 74 68 65 20 22 75 73 65 57 69 6b 69   if the "useWiki
34a0: 22 0a 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74  ".** flag is set
34b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34c0: 74 65 78 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  textLength(const
34d0: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 75 73   char *z, int us
34e0: 65 57 69 6b 69 29 7b 0a 20 20 69 6e 74 20 6e 20  eWiki){.  int n 
34f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  = 0;.  int c;.  
3500: 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 5b 30 5d  while( (c = z[0]
3510: 29 21 3d 30 20 26 26 20 63 21 3d 27 3c 27 20 26  )!=0 && c!='<' &
3520: 26 20 63 21 3d 27 26 27 20 26 26 0a 20 20 20 20  & c!='&' &&.    
3530: 20 20 20 20 20 20 20 20 20 20 20 28 75 73 65 57             (useW
3540: 69 6b 69 3d 3d 30 20 7c 7c 20 28 63 21 3d 27 5b  iki==0 || (c!='[
3550: 27 20 26 26 20 63 21 3d 27 5c 6e 27 29 29 20 29  ' && c!='\n')) )
3560: 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7a  {.    n++;.    z
3570: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
3580: 20 6e 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   n; .}../*.** Re
3590: 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 5b 5d  turn true if z[]
35a0: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 6e 20   begins with an 
35b0: 48 54 4d 4c 20 63 68 61 72 61 63 74 65 72 20 65  HTML character e
35c0: 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  lement..*/.stati
35d0: 63 20 69 6e 74 20 69 73 45 6c 65 6d 65 6e 74 28  c int isElement(
35e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
35f0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
3600: 74 28 20 7a 5b 30 5d 3d 3d 27 26 27 20 29 3b 0a  t( z[0]=='&' );.
3610: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 23 27 20    if( z[1]=='#' 
3620: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  ){.    for(i=2; 
3630: 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 3b 20 69  isdigit(z[i]); i
3640: 2b 2b 29 7b 7d 0a 20 20 20 20 72 65 74 75 72 6e  ++){}.    return
3650: 20 69 3e 32 20 26 26 20 7a 5b 69 5d 3d 3d 27 3b   i>2 && z[i]==';
3660: 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ';.  }else{.    
3670: 66 6f 72 28 69 3d 31 3b 20 69 73 61 6c 70 68 61  for(i=1; isalpha
3680: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
3690: 20 20 20 72 65 74 75 72 6e 20 69 3e 31 20 26 26     return i>1 &&
36a0: 20 7a 5b 69 5d 3d 3d 27 3b 27 3b 0a 20 20 7d 0a   z[i]==';';.  }.
36b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
36c0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 7a 5b 5d  o see if the z[]
36d0: 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 62   string is the b
36e0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77 69  eginning of a wi
36f0: 6b 69 20 62 75 6c 6c 65 74 2e 0a 2a 2a 20 49 66  ki bullet..** If
3700: 20 69 74 20 69 73 2c 20 72 65 74 75 72 6e 20 74   it is, return t
3710: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
3720: 20 62 75 6c 6c 65 74 20 74 65 78 74 2e 20 20 4f   bullet text.  O
3730: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
3740: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3750: 20 62 75 6c 6c 65 74 4c 65 6e 67 74 68 28 63 6f   bulletLength(co
3760: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
3770: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 6e 20 3d 20  int i, n;.  n = 
3780: 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68  0;.  i = 0;.  wh
3790: 69 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20 27 20 7c  ile( z[n]==' ' |
37a0: 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 7b 0a  | z[n]=='\t' ){.
37b0: 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c      if( z[n]=='\
37c0: 74 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 2b  t' ) i++;.    i+
37d0: 2b 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  +;.    n++;.  }.
37e0: 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 7a 5b 6e    if( i<2 || z[n
37f0: 5d 21 3d 27 2a 27 20 29 20 72 65 74 75 72 6e 20  ]!='*' ) return 
3800: 30 3b 0a 20 20 6e 2b 2b 3b 0a 20 20 69 20 3d 20  0;.  n++;.  i = 
3810: 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d  0;.  while( z[n]
3820: 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27  ==' ' || z[n]=='
3830: 5c 74 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  \t' ){.    if( z
3840: 5b 6e 5d 3d 3d 27 5c 74 27 20 29 20 69 2b 2b 3b  [n]=='\t' ) i++;
3850: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b  .    i++;.    n+
3860: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 32  +;.  }.  if( i<2
3870: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 5d   || isspace(z[n]
3880: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
3890: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
38a0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
38b0: 69 66 20 74 68 65 20 7a 5b 5d 20 73 74 72 69 6e  if the z[] strin
38c0: 67 20 69 73 20 74 68 65 20 62 65 67 69 6e 6e 69  g is the beginni
38d0: 6e 67 20 6f 66 20 61 6e 20 69 6e 64 65 6e 74 65  ng of an indente
38e0: 64 0a 2a 2a 20 70 61 72 61 67 72 61 70 68 2e 20  d.** paragraph. 
38f0: 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72   If it is, retur
3900: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
3910: 74 68 65 20 69 6e 64 65 6e 74 2e 20 20 4f 74 68  the indent.  Oth
3920: 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
3930: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
3940: 74 20 69 6e 64 65 6e 74 4c 65 6e 67 74 68 28 63  t indentLength(c
3950: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
3960: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 6e 20 3d   int i, n;.  n =
3970: 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77   0;.  i = 0;.  w
3980: 68 69 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20 27 20  hile( z[n]==' ' 
3990: 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 7b  || z[n]=='\t' ){
39a0: 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27  .    if( z[n]=='
39b0: 5c 74 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69  \t' ) i++;.    i
39c0: 2b 2b 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d  ++;.    n++;.  }
39d0: 0a 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 69 73  .  if( i<2 || is
39e0: 73 70 61 63 65 28 7a 5b 6e 5d 29 20 29 20 72 65  space(z[n]) ) re
39f0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
3a00: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65   n;.}../*.** Che
3a10: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
3a20: 20 7a 5b 5d 20 73 74 72 69 6e 67 20 69 73 20 61   z[] string is a
3a30: 20 77 69 6b 69 20 68 79 70 65 72 6c 69 6e 6b 2e   wiki hyperlink.
3a40: 20 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 72    If it is,.** r
3a50: 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
3a60: 20 6f 66 20 74 68 65 20 68 79 70 65 72 6c 69 6e   of the hyperlin
3a70: 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65  k.  Otherwise re
3a80: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
3a90: 63 20 69 6e 74 20 6c 69 6e 6b 4c 65 6e 67 74 68  c int linkLength
3aa0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
3ab0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
3ac0: 72 74 28 20 7a 5b 30 5d 3d 3d 27 5b 27 20 29 3b  rt( z[0]=='[' );
3ad0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d  .  for(n=0; z[n]
3ae0: 20 26 26 20 7a 5b 6e 5d 21 3d 27 5d 27 3b 20 6e   && z[n]!=']'; n
3af0: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 5b 6e 5d  ++){}.  if( z[n]
3b00: 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 72 65 74  ==']' ){.    ret
3b10: 75 72 6e 20 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65  urn n+1;.  }else
3b20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
3b30: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 7a 20    }.}.../*.** z 
3b40: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
3b50: 61 72 74 20 6f 66 20 61 20 74 6f 6b 65 6e 2e 20  art of a token. 
3b60: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
3b70: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
3b80: 65 72 73 20 69 6e 20 74 68 61 74 20 74 6f 6b 65  ers in that toke
3b90: 6e 2e 20 20 57 72 69 74 65 20 74 68 65 20 74 6f  n.  Write the to
3ba0: 6b 65 6e 20 74 79 70 65 20 69 6e 74 6f 20 2a 70  ken type into *p
3bb0: 54 6f 6b 65 6e 54 79 70 65 2e 0a 2a 2f 0a 73 74  TokenType..*/.st
3bc0: 61 74 69 63 20 69 6e 74 20 6e 65 78 74 54 6f 6b  atic int nextTok
3bd0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
3be0: 2c 20 69 6e 74 20 73 74 61 74 65 2c 20 69 6e 74  , int state, int
3bf0: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 29 7b 0a 20   *pTokenType){. 
3c00: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 7a 5b   int n;.  if( z[
3c10: 30 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 6e  0]=='<' ){.    n
3c20: 20 3d 20 6d 61 72 6b 75 70 4c 65 6e 67 74 68 28   = markupLength(
3c30: 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20  z);.    if( n>0 
3c40: 29 7b 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65 6e  ){.      *pToken
3c50: 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 4d 41 52  Type = TOKEN_MAR
3c60: 4b 55 50 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KUP;.      retur
3c70: 6e 20 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n n;.    }else{.
3c80: 20 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70        *pTokenTyp
3c90: 65 20 3d 20 54 4f 4b 45 4e 5f 43 48 41 52 41 43  e = TOKEN_CHARAC
3ca0: 54 45 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72  TER;.      retur
3cb0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
3cc0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 26 27 20 26   if( z[0]=='&' &
3cd0: 26 20 21 69 73 45 6c 65 6d 65 6e 74 28 7a 29 20  & !isElement(z) 
3ce0: 29 7b 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79  ){.    *pTokenTy
3cf0: 70 65 20 3d 20 54 4f 4b 45 4e 5f 43 48 41 52 41  pe = TOKEN_CHARA
3d00: 43 54 45 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  CTER;.    return
3d10: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 73   1;.  }.  if( (s
3d20: 74 61 74 65 20 26 20 41 4c 4c 4f 57 5f 57 49 4b  tate & ALLOW_WIK
3d30: 49 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  I)!=0 ){.    if(
3d40: 20 7a 5b 30 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20   z[0]=='\n' ){. 
3d50: 20 20 20 20 20 6e 20 3d 20 70 61 72 61 67 72 61       n = paragra
3d60: 70 68 42 72 65 61 6b 4c 65 6e 67 74 68 28 7a 29  phBreakLength(z)
3d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
3d80: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f 6b  ){.        *pTok
3d90: 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 50  enType = TOKEN_P
3da0: 41 52 41 47 52 41 50 48 3b 0a 20 20 20 20 20 20  ARAGRAPH;.      
3db0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20    return n;.    
3dc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 73 70    }else if( issp
3dd0: 61 63 65 28 7a 5b 31 5d 29 20 29 7b 0a 20 20 20  ace(z[1]) ){.   
3de0: 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65       *pTokenType
3df0: 20 3d 20 54 4f 4b 45 4e 5f 4e 45 57 4c 49 4e 45   = TOKEN_NEWLINE
3e00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3e10: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
3e20: 7d 0a 20 20 20 20 69 66 28 20 28 73 74 61 74 65  }.    if( (state
3e30: 20 26 20 41 54 5f 4e 45 57 4c 49 4e 45 29 21 3d   & AT_NEWLINE)!=
3e40: 30 20 2f 2a 20 26 26 20 28 73 74 61 74 65 20 26  0 /* && (state &
3e50: 20 28 41 54 5f 50 41 52 41 47 52 41 50 48 7c 49   (AT_PARAGRAPH|I
3e60: 4e 5f 4c 49 53 54 29 29 21 3d 30 20 2a 2f 0a 20  N_LIST))!=0 */. 
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 69              && i
3e80: 73 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a  sspace(z[0]) ){.
3e90: 20 20 20 20 20 20 6e 20 3d 20 62 75 6c 6c 65 74        n = bullet
3ea0: 4c 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20  Length(z);.     
3eb0: 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
3ec0: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20      *pTokenType 
3ed0: 3d 20 54 4f 4b 45 4e 5f 42 55 4c 4c 45 54 3b 0a  = TOKEN_BULLET;.
3ee0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
3ef0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 30 0a  ;.      }.#if 0.
3f00: 20 20 20 20 20 20 6e 20 3d 20 65 6e 75 6d 4c 65        n = enumLe
3f10: 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20 20 69  ngth(z);.      i
3f20: 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( n>0 ){.      
3f30: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20    *pTokenType = 
3f40: 54 4f 4b 45 4e 5f 45 4e 55 4d 3b 0a 20 20 20 20  TOKEN_ENUM;.    
3f50: 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20      return n;.  
3f60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
3f70: 20 7d 0a 20 20 20 20 69 66 28 20 28 73 74 61 74   }.    if( (stat
3f80: 65 20 26 20 41 54 5f 50 41 52 41 47 52 41 50 48  e & AT_PARAGRAPH
3f90: 29 21 3d 30 20 26 26 20 69 73 73 70 61 63 65 28  )!=0 && isspace(
3fa0: 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6e  z[0]) ){.      n
3fb0: 20 3d 20 69 6e 64 65 6e 74 4c 65 6e 67 74 68 28   = indentLength(
3fc0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  z);.      if( n>
3fd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54  0 ){.        *pT
3fe0: 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e  okenType = TOKEN
3ff0: 5f 49 4e 44 45 4e 54 3b 0a 20 20 20 20 20 20 20  _INDENT;.       
4000: 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 20   return n;.     
4010: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4020: 20 7a 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 28 6e   z[0]=='[' && (n
4030: 20 3d 20 6c 69 6e 6b 4c 65 6e 67 74 68 28 7a 29   = linkLength(z)
4040: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 54  )>0 ){.      *pT
4050: 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e  okenType = TOKEN
4060: 5f 4c 49 4e 4b 3b 0a 20 20 20 20 20 20 72 65 74  _LINK;.      ret
4070: 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn n;.    }.  }
4080: 0a 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d  .  *pTokenType =
4090: 20 54 4f 4b 45 4e 5f 54 45 58 54 3b 0a 20 20 72   TOKEN_TEXT;.  r
40a0: 65 74 75 72 6e 20 31 20 2b 20 74 65 78 74 4c 65  eturn 1 + textLe
40b0: 6e 67 74 68 28 7a 2b 31 2c 20 73 74 61 74 65 20  ngth(z+1, state 
40c0: 26 20 41 4c 4c 4f 57 5f 57 49 4b 49 29 3b 0a 7d  & ALLOW_WIKI);.}
40d0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ../*.** A single
40e0: 20 6d 61 72 6b 75 70 20 69 73 20 70 61 72 73 65   markup is parse
40f0: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 61 6e  d into an instan
4100: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
4110: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
4120: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
4130: 75 63 74 20 50 61 72 73 65 64 4d 61 72 6b 75 70  uct ParsedMarkup
4140: 20 50 61 72 73 65 64 4d 61 72 6b 75 70 3b 0a 73   ParsedMarkup;.s
4150: 74 72 75 63 74 20 50 61 72 73 65 64 4d 61 72 6b  truct ParsedMark
4160: 75 70 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  up {.  unsigned 
4170: 63 68 61 72 20 65 6e 64 54 61 67 3b 20 20 20 2f  char endTag;   /
4180: 2a 20 54 72 75 65 20 69 66 20 3c 2f 2e 2e 2e 3e  * True if </...>
4190: 20 69 6e 73 74 65 61 64 20 6f 66 20 3c 2e 2e 2e   instead of <...
41a0: 3e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  > */.  unsigned 
41b0: 63 68 61 72 20 69 43 6f 64 65 3b 20 20 20 20 2f  char iCode;    /
41c0: 2a 20 4d 41 52 4b 55 50 5f 2a 20 2a 2f 0a 20 20  * MARKUP_* */.  
41d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e 41  unsigned char nA
41e0: 74 74 72 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ttr;    /* Numbe
41f0: 72 20 6f 66 20 61 74 74 72 69 62 75 74 65 73 20  r of attributes 
4200: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68  */.  unsigned sh
4210: 6f 72 74 20 69 54 79 70 65 3b 20 20 20 2f 2a 20  ort iType;   /* 
4220: 4d 55 54 59 50 45 5f 2a 20 2a 2f 0a 20 20 73 74  MUTYPE_* */.  st
4230: 72 75 63 74 20 7b 0a 20 20 20 20 75 6e 73 69 67  ruct {.    unsig
4240: 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65 3b 20  ned char iCode; 
4250: 20 20 20 20 2f 2a 20 41 54 54 52 5f 2a 20 2a 2f      /* ATTR_* */
4260: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75  .    char *zValu
4270: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4280: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   Argument to thi
4290: 73 20 61 74 74 72 69 62 75 74 65 2e 20 20 4d 69  s attribute.  Mi
42a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
42b0: 20 20 20 63 68 61 72 20 63 54 65 72 6d 3b 20 20     char cTerm;  
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
42d0: 72 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74  riginal argument
42e0: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 68 61   termination cha
42f0: 72 61 63 74 65 72 20 2a 2f 0a 20 20 7d 20 61 41  racter */.  } aA
4300: 74 74 72 5b 31 30 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a  ttr[10];.};../*.
4310: 2a 2a 20 7a 5b 5d 20 69 73 20 61 6e 20 48 54 4d  ** z[] is an HTM
4320: 4c 20 6d 61 72 6b 75 70 20 65 6c 65 6d 65 6e 74  L markup element
4330: 20 2d 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61   - something tha
4340: 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 27 3c  t begins with '<
4350: 27 2e 0a 2a 2a 20 50 61 72 73 65 20 74 68 69 73  '..** Parse this
4360: 20 65 6c 65 6d 65 6e 74 20 69 6e 74 6f 20 74 68   element into th
4370: 65 20 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  e p structure..*
4380: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
4390: 20 6f 66 20 7a 5b 5d 20 6d 69 67 68 74 20 62 65   of z[] might be
43a0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 63 6f 6e   modified by con
43b0: 76 65 72 74 69 6e 67 20 63 68 61 72 61 63 74 65  verting characte
43c0: 72 73 20 0a 2a 2a 20 74 6f 20 6c 6f 77 65 72 63  rs .** to lowerc
43d0: 61 73 65 20 61 6e 64 20 62 79 20 69 6e 73 65 72  ase and by inser
43e0: 74 69 6e 67 20 73 6f 6d 65 20 22 5c 30 30 30 22  ting some "\000"
43f0: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
4400: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
4410: 65 4d 61 72 6b 75 70 28 50 61 72 73 65 64 4d 61  eMarkup(ParsedMa
4420: 72 6b 75 70 20 2a 70 2c 20 63 68 61 72 20 2a 7a  rkup *p, char *z
4430: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20  ){.  int i, c;. 
4440: 20 63 68 61 72 20 2a 7a 54 61 67 2c 20 2a 7a 56   char *zTag, *zV
4450: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 73 65 65 6e  alue;.  int seen
4460: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 5b 31   = 0;..  if( z[1
4470: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 70 2d  ]=='/' ){.    p-
4480: 3e 65 6e 64 54 61 67 20 3d 20 31 3b 0a 20 20 20  >endTag = 1;.   
4490: 20 69 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b   i = 2;.  }else{
44a0: 0a 20 20 20 20 70 2d 3e 65 6e 64 54 61 67 20 3d  .    p->endTag =
44b0: 20 30 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20   0;.    i = 1;. 
44c0: 20 7d 0a 20 20 7a 54 61 67 20 3d 20 26 7a 5b 69   }.  zTag = &z[i
44d0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 61 6c  ];.  while( isal
44e0: 6e 75 6d 28 7a 5b 69 5d 29 20 29 7b 20 0a 20 20  num(z[i]) ){ .  
44f0: 20 20 7a 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72    z[i] = tolower
4500: 28 7a 5b 69 5d 29 3b 0a 20 20 20 20 69 2b 2b 3b  (z[i]);.    i++;
4510: 0a 20 20 7d 0a 20 20 63 20 3d 20 7a 5b 69 5d 3b  .  }.  c = z[i];
4520: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 70  .  z[i] = 0;.  p
4530: 2d 3e 69 43 6f 64 65 20 3d 20 66 69 6e 64 54 61  ->iCode = findTa
4540: 67 28 7a 54 61 67 29 3b 0a 20 20 70 2d 3e 69 54  g(zTag);.  p->iT
4550: 79 70 65 20 3d 20 61 4d 61 72 6b 75 70 5b 70 2d  ype = aMarkup[p-
4560: 3e 69 43 6f 64 65 5d 2e 69 54 79 70 65 3b 0a 20  >iCode].iType;. 
4570: 20 70 2d 3e 6e 41 74 74 72 20 3d 20 30 3b 0a 20   p->nAttr = 0;. 
4580: 20 7a 5b 69 5d 20 3d 20 63 3b 0a 20 20 77 68 69   z[i] = c;.  whi
4590: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d  le( isspace(z[i]
45a0: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 77 68  ) ){ i++; }.  wh
45b0: 69 6c 65 28 20 70 2d 3e 6e 41 74 74 72 3c 38 20  ile( p->nAttr<8 
45c0: 26 26 20 69 73 61 6c 70 68 61 28 7a 5b 69 5d 29  && isalpha(z[i])
45d0: 20 29 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 26   ){.    zTag = &
45e0: 7a 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  z[i];.    while(
45f0: 20 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 29   isalnum(z[i]) )
4600: 7b 20 0a 20 20 20 20 20 20 7a 5b 69 5d 20 3d 20  { .      z[i] = 
4610: 74 6f 6c 6f 77 65 72 28 7a 5b 69 5d 29 3b 0a 20  tolower(z[i]);. 
4620: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
4630: 20 20 20 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20      c = z[i];.  
4640: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    z[i] = 0;.    
4650: 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74 74  p->aAttr[p->nAtt
4660: 72 5d 2e 69 43 6f 64 65 20 3d 20 66 69 6e 64 41  r].iCode = findA
4670: 74 74 72 28 7a 54 61 67 29 3b 0a 20 20 20 20 7a  ttr(zTag);.    z
4680: 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 77 68 69  [i] = c;.    whi
4690: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d  le( isspace(z[i]
46a0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
46b0: 69 66 28 20 7a 5b 69 5d 21 3d 27 3d 27 20 29 7b  if( z[i]!='=' ){
46c0: 0a 20 20 20 20 20 20 70 2d 3e 61 41 74 74 72 5b  .      p->aAttr[
46d0: 70 2d 3e 6e 41 74 74 72 5d 2e 7a 56 61 6c 75 65  p->nAttr].zValue
46e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
46f0: 41 74 74 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 63  Attr[p->nAttr].c
4700: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
4710: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
4720: 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
4730: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
4740: 65 28 7a 5b 69 5d 29 20 29 7b 20 7a 2b 2b 3b 20  e(z[i]) ){ z++; 
4750: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d  }.      if( z[i]
4760: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
4770: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 56   i++;.        zV
4780: 61 6c 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20  alue = &z[i];.  
4790: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69        while( z[i
47a0: 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 22 27 20 29  ] && z[i]!='"' )
47b0: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d  { i++; }.      }
47c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 56  else{.        zV
47d0: 61 6c 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20  alue = &z[i];.  
47e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 21 69 73        while( !is
47f0: 73 70 61 63 65 28 7a 5b 69 5d 29 20 26 26 20 7a  space(z[i]) && z
4800: 5b 69 5d 21 3d 27 3e 27 20 29 7b 20 7a 2b 2b 3b  [i]!='>' ){ z++;
4810: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
4820: 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74   p->aAttr[p->nAt
4830: 74 72 5d 2e 7a 56 61 6c 75 65 20 3d 20 7a 56 61  tr].zValue = zVa
4840: 6c 75 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41  lue;.      p->aA
4850: 74 74 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 63 54  ttr[p->nAttr].cT
4860: 65 72 6d 20 3d 20 63 20 3d 20 7a 5b 69 5d 3b 0a  erm = c = z[i];.
4870: 20 20 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a        z[i] = 0;.
4880: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
4890: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 74 74  .    if( p->aAtt
48a0: 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 69 43 6f 64  r[p->nAttr].iCod
48b0: 65 21 3d 30 20 26 26 20 28 73 65 65 6e 20 26 20  e!=0 && (seen & 
48c0: 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74 74  p->aAttr[p->nAtt
48d0: 72 5d 2e 69 43 6f 64 65 29 3d 3d 30 20 29 7b 0a  r].iCode)==0 ){.
48e0: 20 20 20 20 20 20 73 65 65 6e 20 7c 3d 20 70 2d        seen |= p-
48f0: 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74 74 72 5d  >aAttr[p->nAttr]
4900: 2e 69 43 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  .iCode;.      p-
4910: 3e 6e 41 74 74 72 2b 2b 3b 0a 20 20 20 20 7d 0a  >nAttr++;.    }.
4920: 20 20 20 20 69 66 28 20 63 3d 3d 27 3e 27 20 29      if( c=='>' )
4930: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f   break;.  }.}../
4940: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6d 61 72 6b  *.** Render mark
4950: 75 70 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  up on the given 
4960: 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
4970: 76 6f 69 64 20 72 65 6e 64 65 72 4d 61 72 6b 75  void renderMarku
4980: 70 28 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 50 61  p(Blob *pOut, Pa
4990: 72 73 65 64 4d 61 72 6b 75 70 20 2a 70 29 7b 0a  rsedMarkup *p){.
49a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
49b0: 2d 3e 65 6e 64 54 61 67 20 29 7b 0a 20 20 20 20  ->endTag ){.    
49c0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75  blob_appendf(pOu
49d0: 74 2c 20 22 3c 2f 25 73 3e 22 2c 20 61 4d 61 72  t, "</%s>", aMar
49e0: 6b 75 70 5b 70 2d 3e 69 43 6f 64 65 5d 2e 7a 4e  kup[p->iCode].zN
49f0: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
4a00: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
4a10: 70 4f 75 74 2c 20 22 3c 25 73 22 2c 20 61 4d 61  pOut, "<%s", aMa
4a20: 72 6b 75 70 5b 70 2d 3e 69 43 6f 64 65 5d 2e 7a  rkup[p->iCode].z
4a30: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Name);.    for(i
4a40: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 74 74 72 3b 20  =0; i<p->nAttr; 
4a50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  i++){.      blob
4a60: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22  _appendf(pOut, "
4a70: 20 25 73 22 2c 20 61 41 74 74 72 69 62 75 74 65   %s", aAttribute
4a80: 5b 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 69 43 6f  [p->aAttr[i].iCo
4a90: 64 65 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  de]);.      if( 
4aa0: 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 7a 56 61 6c  p->aAttr[i].zVal
4ab0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  ue ){.        bl
4ac0: 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  ob_appendf(pOut,
4ad0: 20 22 3d 5c 22 25 73 5c 22 22 2c 20 70 2d 3e 61   "=\"%s\"", p->a
4ae0: 41 74 74 72 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b  Attr[i].zValue);
4af0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4b00: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
4b10: 4f 75 74 2c 20 22 3e 22 2c 20 31 29 3b 0a 20 20  Out, ">", 1);.  
4b20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
4b30: 74 68 65 20 6d 61 72 6b 75 70 20 77 61 73 20 70  the markup was p
4b40: 61 72 73 65 64 2c 20 73 6f 6d 65 20 22 5c 30 30  arsed, some "\00
4b50: 30 22 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  0" may have been
4b60: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 20 54 68   inserted..** Th
4b70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
4b80: 72 65 73 20 74 6f 20 74 68 6f 73 65 20 22 5c 30  res to those "\0
4b90: 30 30 22 20 76 61 6c 75 65 73 20 62 61 63 6b 20  00" values back 
4ba0: 74 6f 20 74 68 65 69 72 0a 2a 2a 20 6f 72 69 67  to their.** orig
4bb0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f  inal content..*/
4bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 70  .static void unp
4bd0: 61 72 73 65 4d 61 72 6b 75 70 28 50 61 72 73 65  arseMarkup(Parse
4be0: 64 4d 61 72 6b 75 70 20 2a 70 29 7b 0a 20 20 69  dMarkup *p){.  i
4bf0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69  nt i, n;.  for(i
4c00: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 74 74 72 3b 20  =0; i<p->nAttr; 
4c10: 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
4c20: 7a 20 3d 20 70 2d 3e 61 41 74 74 72 5b 69 5d 2e  z = p->aAttr[i].
4c30: 7a 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20  zValue;.    if( 
4c40: 7a 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  z==0 ) continue;
4c50: 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  .    n = strlen(
4c60: 7a 29 3b 0a 20 20 20 20 7a 5b 6e 5d 20 3d 20 70  z);.    z[n] = p
4c70: 2d 3e 61 41 74 74 72 5b 69 5d 2e 63 54 65 72 6d  ->aAttr[i].cTerm
4c80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
4c90: 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
4ca0: 74 68 65 20 72 65 6e 64 65 72 69 6e 67 20 65 6e  the rendering en
4cb0: 67 69 6e 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  gine.*/.typedef 
4cc0: 73 74 72 75 63 74 20 52 65 6e 64 65 72 65 72 20  struct Renderer 
4cd0: 52 65 6e 64 65 72 65 72 3b 0a 73 74 72 75 63 74  Renderer;.struct
4ce0: 20 52 65 6e 64 65 72 65 72 20 7b 0a 20 20 42 6c   Renderer {.  Bl
4cf0: 6f 62 20 2a 70 4f 75 74 3b 20 20 20 20 20 20 20  ob *pOut;       
4d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
4d10: 70 75 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20  put appended to 
4d20: 74 68 69 73 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  this blob */.  i
4d30: 6e 74 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  nt state;       
4d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
4d50: 61 67 20 74 68 61 74 20 67 6f 76 65 72 6e 20 72  ag that govern r
4d60: 65 6e 64 65 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  endering */.  in
4d70: 74 20 69 6e 56 65 72 62 61 74 69 6d 3b 20 20 20  t inVerbatim;   
4d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d90: 65 20 69 6e 20 3c 76 65 72 62 61 74 69 6d 3e 20  e in <verbatim> 
4da0: 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72  mode */.  int pr
4db0: 65 56 65 72 62 53 74 61 74 65 3b 20 20 20 20 20  eVerbState;     
4dc0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
4dd0: 66 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  f state prior to
4de0: 20 76 65 72 62 61 74 69 6d 20 2a 2f 0a 20 20 63   verbatim */.  c
4df0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 65 72 62  onst char *zVerb
4e00: 61 74 69 6d 49 64 3b 20 20 20 20 2f 2a 20 54 68  atimId;    /* Th
4e10: 65 20 69 64 3d 20 61 74 74 72 69 62 75 74 65 20  e id= attribute 
4e20: 6f 66 20 3c 76 65 72 62 61 74 69 6d 3e 20 2a 2f  of <verbatim> */
4e30: 0a 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20  .  int nStack;  
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4e60: 65 6e 74 73 20 6f 6e 20 74 68 65 20 73 74 61 63  ents on the stac
4e70: 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  k */.  int nAllo
4e80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4e90: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
4ea0: 63 61 74 65 64 20 66 6f 72 20 61 53 74 61 63 6b  cated for aStack
4eb0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
4ec0: 68 61 72 20 2a 61 53 74 61 63 6b 3b 20 20 20 20  har *aStack;    
4ed0: 20 20 2f 2a 20 4f 70 65 6e 20 6d 61 72 6b 75 70    /* Open markup
4ee0: 20 73 74 61 63 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   stack */.};../*
4ef0: 0a 2a 2a 20 50 6f 70 20 61 20 73 69 6e 67 6c 65  .** Pop a single
4f00: 20 65 6c 65 6d 65 6e 74 20 6f 66 66 20 6f 66 20   element off of 
4f10: 74 68 65 20 73 74 61 63 6b 2e 20 20 41 73 20 74  the stack.  As t
4f20: 68 65 20 65 6c 65 6d 65 6e 74 20 69 73 20 70 6f  he element is po
4f30: 70 70 65 64 2c 0a 2a 2a 20 6f 75 74 70 75 74 20  pped,.** output 
4f40: 69 74 73 20 65 6e 64 20 74 61 67 2e 0a 2a 2f 0a  its end tag..*/.
4f50: 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 53  static void popS
4f60: 74 61 63 6b 28 52 65 6e 64 65 72 65 72 20 2a 70  tack(Renderer *p
4f70: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 53 74 61  ){.  if( p->nSta
4f80: 63 6b 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 74  ck ){.    p->nSt
4f90: 61 63 6b 2d 2d 3b 0a 20 20 20 20 62 6c 6f 62 5f  ack--;.    blob_
4fa0: 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c  appendf(p->pOut,
4fb0: 20 22 3c 2f 25 73 3e 22 2c 20 61 4d 61 72 6b 75   "</%s>", aMarku
4fc0: 70 5b 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e  p[p->aStack[p->n
4fd0: 53 74 61 63 6b 5d 5d 2e 7a 4e 61 6d 65 29 3b 0a  Stack]].zName);.
4fe0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73    }.}../*.** Pus
4ff0: 68 20 61 20 6e 65 77 20 6d 61 72 6b 75 70 20 76  h a new markup v
5000: 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 74  alue onto the st
5010: 61 63 6b 2e 20 20 45 6e 6c 61 72 67 65 20 74 68  ack.  Enlarge th
5020: 65 20 73 74 61 63 6b 0a 2a 2a 20 69 66 20 6e 65  e stack.** if ne
5030: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
5040: 69 63 20 76 6f 69 64 20 70 75 73 68 53 74 61 63  ic void pushStac
5050: 6b 28 52 65 6e 64 65 72 65 72 20 2a 70 2c 20 69  k(Renderer *p, i
5060: 6e 74 20 65 6c 65 6d 29 7b 0a 20 20 69 66 28 20  nt elem){.  if( 
5070: 70 2d 3e 6e 53 74 61 63 6b 3e 3d 70 2d 3e 6e 41  p->nStack>=p->nA
5080: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
5090: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
50a0: 63 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 70  c*2 + 100;.    p
50b0: 2d 3e 61 53 74 61 63 6b 20 3d 20 72 65 61 6c 6c  ->aStack = reall
50c0: 6f 63 28 70 2d 3e 61 53 74 61 63 6b 2c 20 70 2d  oc(p->aStack, p-
50d0: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
50e0: 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29  ( p->aStack==0 )
50f0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
5100: 61 6e 69 63 28 22 6f 75 74 20 6f 66 20 6d 65 6d  anic("out of mem
5110: 6f 72 79 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ory");.    }.  }
5120: 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e  .  p->aStack[p->
5130: 6e 53 74 61 63 6b 2b 2b 5d 20 3d 20 65 6c 65 6d  nStack++] = elem
5140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74  ;.}../*.** Pop t
5150: 68 65 20 73 74 61 63 6b 20 75 6e 74 69 6c 20 74  he stack until t
5160: 68 65 20 74 6f 70 2d 6d 6f 73 74 20 69 54 61 67  he top-most iTag
5170: 20 65 6c 65 6d 65 6e 74 20 69 73 20 72 65 6d 6f   element is remo
5180: 76 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65  ved..** If there
5190: 20 69 73 20 6e 6f 20 69 54 61 67 20 65 6c 65 6d   is no iTag elem
51a0: 65 6e 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ent on the stack
51b0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
51c0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  * is a no-op..*/
51d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70  .static void pop
51e0: 53 74 61 63 6b 54 6f 54 61 67 28 52 65 6e 64 65  StackToTag(Rende
51f0: 72 65 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 67  rer *p, int iTag
5200: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5210: 72 28 69 3d 70 2d 3e 6e 53 74 61 63 6b 2d 31 3b  r(i=p->nStack-1;
5220: 20 69 3e 3d 30 20 26 26 20 70 2d 3e 61 53 74 61   i>=0 && p->aSta
5230: 63 6b 5b 69 5d 21 3d 69 54 61 67 3b 20 69 2d 2d  ck[i]!=iTag; i--
5240: 29 7b 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20  ){}.  if( i<0 ) 
5250: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
5260: 20 70 2d 3e 6e 53 74 61 63 6b 3e 69 20 29 7b 0a   p->nStack>i ){.
5270: 20 20 20 20 70 6f 70 53 74 61 63 6b 28 70 29 3b      popStack(p);
5280: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
5290: 70 20 74 68 65 20 73 74 61 63 6b 20 75 6e 74 69  p the stack unti
52a0: 6c 20 74 68 65 20 74 6f 70 2d 6d 6f 73 74 20 65  l the top-most e
52b0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 74  lement of the st
52c0: 61 63 6b 0a 2a 2a 20 69 73 20 61 6e 20 65 6c 65  ack.** is an ele
52d0: 6d 65 6e 74 20 74 68 61 74 20 6d 61 74 63 68 65  ment that matche
52e0: 73 20 74 68 65 20 74 79 70 65 20 69 6e 20 69 4d  s the type in iM
52f0: 61 73 6b 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ask.  Return.** 
5300: 74 72 75 65 20 6f 6e 20 73 75 63 63 65 73 73 2e  true on success.
5310: 20 20 49 66 20 74 68 65 20 73 74 61 63 6b 20 64    If the stack d
5320: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
5330: 65 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20  element.** that 
5340: 6d 61 74 63 68 65 73 20 69 4d 61 73 6b 2c 20 74  matches iMask, t
5350: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 73 74  hen leave the st
5360: 61 63 6b 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ack unchanged an
5370: 64 0a 2a 2a 20 72 65 74 75 72 6e 20 66 61 6c 73  d.** return fals
5380: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5390: 20 62 61 63 6b 75 70 54 6f 54 79 70 65 28 52 65   backupToType(Re
53a0: 6e 64 65 72 65 72 20 2a 70 2c 20 69 6e 74 20 69  nderer *p, int i
53b0: 4d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Mask){.  int i;.
53c0: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 74 61 63    for(i=p->nStac
53d0: 6b 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28 61 4d  k-1; i>=0 && (aM
53e0: 61 72 6b 75 70 5b 70 2d 3e 61 53 74 61 63 6b 5b  arkup[p->aStack[
53f0: 69 5d 5d 2e 69 54 79 70 65 26 69 4d 61 73 6b 29  i]].iType&iMask)
5400: 3d 3d 30 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  ==0; i--){}.  if
5410: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( i<0 ) return 0
5420: 3b 0a 20 20 69 2b 2b 3b 0a 20 20 77 68 69 6c 65  ;.  i++;.  while
5430: 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 69 20 29 7b  ( p->nStack>i ){
5440: 0a 20 20 20 20 70 6f 70 53 74 61 63 6b 28 70 29  .    popStack(p)
5450: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
5460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6d  ;.}../*.** Add m
5470: 69 73 73 69 6e 67 20 6d 61 72 6b 75 70 20 69 6e  issing markup in
5480: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
5490: 20 77 72 69 74 69 6e 67 20 74 65 78 74 2e 0a 2a   writing text..*
54a0: 2a 0a 2a 2a 20 22 4d 69 73 73 69 6e 67 22 20 6d  *.** "Missing" m
54b0: 61 72 6b 75 70 20 61 72 65 20 74 68 69 6e 67 73  arkup are things
54c0: 20 6c 69 6b 65 20 73 74 61 72 74 20 74 61 67 73   like start tags
54d0: 20 66 6f 72 20 74 61 62 6c 65 20 72 6f 77 73 0a   for table rows.
54e0: 2a 2a 20 6f 72 20 74 61 62 6c 65 20 63 6f 6c 75  ** or table colu
54f0: 6d 6e 73 20 6f 72 20 70 61 72 61 67 72 61 70 68  mns or paragraph
5500: 73 20 74 68 61 74 20 61 72 65 20 6f 6d 69 74 74  s that are omitt
5510: 65 64 20 66 72 6f 6d 20 69 6e 70 75 74 2e 0a 2a  ed from input..*
5520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
5530: 64 4d 69 73 73 69 6e 67 4d 61 72 6b 75 70 28 52  dMissingMarkup(R
5540: 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20 20 2f  enderer *p){.  /
5550: 2a 20 54 42 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  * TBD */.}../*.*
5560: 2a 20 52 65 73 6f 6c 76 65 20 61 20 68 79 70 65  * Resolve a hype
5570: 72 6c 69 6e 6b 2e 20 20 54 68 65 20 61 72 67 75  rlink.  The argu
5580: 6d 65 6e 74 20 69 73 20 74 68 65 20 63 6f 6e 74  ment is the cont
5590: 65 6e 74 20 6f 66 20 74 68 65 20 5b 2e 2e 2e 5d  ent of the [...]
55a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 77 69 6b 69 2e  .** in the wiki.
55b0: 20 20 41 70 70 65 6e 64 20 74 68 65 20 55 52 4c    Append the URL
55c0: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6f   to the output o
55d0: 66 20 74 68 65 20 52 65 6e 64 65 72 65 72 2e 0a  f the Renderer..
55e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
55f0: 65 73 6f 6c 76 65 48 79 70 65 72 6c 69 6e 6b 28  esolveHyperlink(
5600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
5610: 67 65 74 2c 20 52 65 6e 64 65 72 65 72 20 2a 70  get, Renderer *p
5620: 29 7b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  ){.  if( strncmp
5630: 28 7a 54 61 72 67 65 74 2c 20 22 68 74 74 70 3a  (zTarget, "http:
5640: 22 2c 20 35 29 3d 3d 30 20 0a 20 20 20 7c 7c 20  ", 5)==0 .   || 
5650: 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c  strncmp(zTarget,
5660: 20 22 68 74 74 70 73 3a 22 2c 20 36 29 3d 3d 30   "https:", 6)==0
5670: 0a 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a  .   || strncmp(z
5680: 54 61 72 67 65 74 2c 20 22 66 74 70 3a 22 2c 20  Target, "ftp:", 
5690: 34 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 74 72  4)==0 .   || str
56a0: 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c 20 22 6d  ncmp(zTarget, "m
56b0: 61 69 6c 74 6f 3a 22 2c 20 37 29 3d 3d 30 0a 20  ailto:", 7)==0. 
56c0: 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54 61    || strncmp(zTa
56d0: 72 67 65 74 2c 20 22 67 6f 70 68 65 72 3a 22 2c  rget, "gopher:",
56e0: 20 37 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20   7)==0.  ){.    
56f0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e  blob_appendf(p->
5700: 70 4f 75 74 2c 20 7a 54 61 72 67 65 74 29 3b 0a  pOut, zTarget);.
5710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f    }else{.    blo
5720: 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75  b_appendf(p->pOu
5730: 74 2c 20 22 25 73 2f 77 69 6b 69 2f 25 54 22 2c  t, "%s/wiki/%T",
5740: 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54 61   g.zBaseURL, zTa
5750: 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rget);.  }.}../*
5760: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
5770: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   if the given pa
5780: 72 73 65 64 20 6d 61 72 6b 75 70 20 69 73 20 74  rsed markup is t
5790: 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 3c 2f  he correct.** </
57a0: 76 65 72 62 61 74 69 6d 3e 20 74 61 67 2e 0a 2a  verbatim> tag..*
57b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e 64  /.static int end
57c0: 56 65 72 62 61 74 69 6d 28 52 65 6e 64 65 72 65  Verbatim(Rendere
57d0: 72 20 2a 70 2c 20 50 61 72 73 65 64 4d 61 72 6b  r *p, ParsedMark
57e0: 75 70 20 2a 70 4d 61 72 6b 75 70 29 7b 0a 20 20  up *pMarkup){.  
57f0: 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73 65 72  char *z;.  asser
5800: 74 28 20 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d  t( p->inVerbatim
5810: 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 72 6b 75   );.  if( pMarku
5820: 70 2d 3e 69 43 6f 64 65 21 3d 4d 41 52 4b 55 50  p->iCode!=MARKUP
5830: 5f 56 45 52 42 41 54 49 4d 20 29 20 72 65 74 75  _VERBATIM ) retu
5840: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 4d 61  rn 0;.  if( !pMa
5850: 72 6b 75 70 2d 3e 65 6e 64 54 61 67 20 29 20 72  rkup->endTag ) r
5860: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
5870: 2d 3e 7a 56 65 72 62 61 74 69 6d 49 64 3d 3d 30  ->zVerbatimId==0
5880: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
5890: 66 28 20 70 4d 61 72 6b 75 70 2d 3e 6e 41 74 74  f( pMarkup->nAtt
58a0: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
58b0: 0a 20 20 7a 20 3d 20 70 4d 61 72 6b 75 70 2d 3e  .  z = pMarkup->
58c0: 61 41 74 74 72 5b 30 5d 2e 7a 56 61 6c 75 65 3b  aAttr[0].zValue;
58d0: 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70  .  return strcmp
58e0: 28 7a 2c 20 70 2d 3e 7a 56 65 72 62 61 74 69 6d  (z, p->zVerbatim
58f0: 49 64 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Id)==0;.}../*.**
5900: 20 52 65 74 75 72 6e 20 74 68 65 20 4d 55 54 59   Return the MUTY
5910: 50 45 20 66 6f 72 20 74 68 65 20 74 6f 70 20 6f  PE for the top o
5920: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  f the stack..*/.
5930: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 63 6b  static int stack
5940: 54 6f 70 54 79 70 65 28 52 65 6e 64 65 72 65 72  TopType(Renderer
5950: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e   *p){.  if( p->n
5960: 53 74 61 63 6b 3c 3d 30 20 29 20 72 65 74 75 72  Stack<=0 ) retur
5970: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4d  n 0;.  return aM
5980: 61 72 6b 75 70 5b 70 2d 3e 61 53 74 61 63 6b 5b  arkup[p->aStack[
5990: 70 2d 3e 6e 53 74 61 63 6b 2d 31 5d 5d 2e 69 54  p->nStack-1]].iT
59a0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ype;.}../*.** Co
59b0: 6e 76 65 72 74 20 74 68 65 20 77 69 6b 69 20 69  nvert the wiki i
59c0: 6e 20 7a 5b 5d 20 69 6e 74 6f 20 68 74 6d 6c 20  n z[] into html 
59d0: 69 6e 20 74 68 65 20 72 65 6e 64 65 72 65 72 20  in the renderer 
59e0: 70 2e 20 20 54 68 65 0a 2a 2a 20 72 65 6e 64 65  p.  The.** rende
59f0: 72 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  rer has already 
5a00: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
5a10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5a20: 74 69 6e 65 20 77 69 6c 6c 20 70 72 6f 62 61 62  tine will probab
5a30: 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f  ly modify the co
5a40: 6e 74 65 6e 74 20 6f 66 20 7a 5b 5d 2e 0a 2a 2f  ntent of z[]..*/
5a50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6b  .static void wik
5a60: 69 5f 72 65 6e 64 65 72 28 52 65 6e 64 65 72 65  i_render(Rendere
5a70: 72 20 2a 70 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  r *p, char *z){.
5a80: 20 20 69 6e 74 20 74 6f 6b 65 6e 54 79 70 65 3b    int tokenType;
5a90: 0a 20 20 50 61 72 73 65 64 4d 61 72 6b 75 70 20  .  ParsedMarkup 
5aa0: 6d 61 72 6b 75 70 3b 0a 20 20 69 6e 74 20 6e 3b  markup;.  int n;
5ab0: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20  ..  while( z[0] 
5ac0: 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 65 78 74 54  ){.    n = nextT
5ad0: 6f 6b 65 6e 28 7a 2c 20 70 2d 3e 73 74 61 74 65  oken(z, p->state
5ae0: 2c 20 26 74 6f 6b 65 6e 54 79 70 65 29 3b 0a 20  , &tokenType);. 
5af0: 20 20 20 70 2d 3e 73 74 61 74 65 20 26 3d 20 7e     p->state &= ~
5b00: 28 41 54 5f 4e 45 57 4c 49 4e 45 7c 41 54 5f 50  (AT_NEWLINE|AT_P
5b10: 41 52 41 47 52 41 50 48 29 3b 0a 20 20 20 20 73  ARAGRAPH);.    s
5b20: 77 69 74 63 68 28 20 74 6f 6b 65 6e 54 79 70 65  witch( tokenType
5b30: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
5b40: 4f 4b 45 4e 5f 50 41 52 41 47 52 41 50 48 3a 20  OKEN_PARAGRAPH: 
5b50: 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61  {.        blob_a
5b60: 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22  ppend(p->pOut, "
5b70: 5c 6e 5c 6e 3c 70 3e 22 2c 20 2d 31 29 3b 0a 20  \n\n<p>", -1);. 
5b80: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
5b90: 7c 3d 20 41 54 5f 50 41 52 41 47 52 41 50 48 7c  |= AT_PARAGRAPH|
5ba0: 41 54 5f 4e 45 57 4c 49 4e 45 3b 0a 20 20 20 20  AT_NEWLINE;.    
5bb0: 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61      popStackToTa
5bc0: 67 28 70 2c 20 4d 41 52 4b 55 50 5f 50 29 3b 0a  g(p, MARKUP_P);.
5bd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
5bf0: 65 20 54 4f 4b 45 4e 5f 4e 45 57 4c 49 4e 45 3a  e TOKEN_NEWLINE:
5c00: 20 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f   {.        blob_
5c10: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
5c20: 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  "\n", 1);.      
5c30: 20 20 70 2d 3e 73 74 61 74 65 20 7c 3d 20 41 54    p->state |= AT
5c40: 5f 4e 45 57 4c 49 4e 45 3b 0a 20 20 20 20 20 20  _NEWLINE;.      
5c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5c60: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45  .      case TOKE
5c70: 4e 5f 42 55 4c 4c 45 54 3a 20 7b 0a 20 20 20 20  N_BULLET: {.    
5c80: 20 20 20 20 69 66 28 20 62 61 63 6b 75 70 54 6f      if( backupTo
5c90: 54 79 70 65 28 70 2c 20 4d 55 54 59 50 45 5f 4c  Type(p, MUTYPE_L
5ca0: 49 53 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  IST)==0 ){.     
5cb0: 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70       pushStack(p
5cc0: 2c 20 4d 41 52 4b 55 50 5f 55 4c 29 3b 0a 20 20  , MARKUP_UL);.  
5cd0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
5ce0: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 75  end(p->pOut, "<u
5cf0: 6c 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  l>", 4);.       
5d00: 20 7d 0a 20 20 20 20 20 20 20 20 70 75 73 68 53   }.        pushS
5d10: 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4c  tack(p, MARKUP_L
5d20: 49 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62  I);.        blob
5d30: 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c  _append(p->pOut,
5d40: 20 22 3c 6c 69 3e 22 2c 20 34 29 3b 0a 20 20 20   "<li>", 4);.   
5d50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5d60: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
5d70: 4f 4b 45 4e 5f 43 48 41 52 41 43 54 45 52 3a 20  OKEN_CHARACTER: 
5d80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
5d90: 30 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20  0]=='<' ){.     
5da0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
5db0: 28 70 2d 3e 70 4f 75 74 2c 20 22 26 6c 74 3b 22  (p->pOut, "&lt;"
5dc0: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
5dd0: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 26  lse if( z[0]=='&
5de0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  ' ){.          b
5df0: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
5e00: 75 74 2c 20 22 26 61 6d 70 3b 22 2c 20 35 29 3b  ut, "&amp;", 5);
5e10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5e30: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b  }.      case TOK
5e40: 45 4e 5f 4c 49 4e 4b 3a 20 7b 0a 20 20 20 20 20  EN_LINK: {.     
5e50: 20 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74     char *zTarget
5e60: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
5e70: 7a 44 69 73 70 6c 61 79 20 3d 20 30 3b 0a 20 20  zDisplay = 0;.  
5e80: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
5e90: 20 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 74       int savedSt
5ea0: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 61 64 64  ate;.        add
5eb0: 4d 69 73 73 69 6e 67 4d 61 72 6b 75 70 28 70 29  MissingMarkup(p)
5ec0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 72 67 65  ;.        zTarge
5ed0: 74 20 3d 20 26 7a 5b 31 5d 3b 0a 20 20 20 20 20  t = &z[1];.     
5ee0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 7a 5b 69 5d     for(i=1; z[i]
5ef0: 20 26 26 20 7a 5b 69 5d 21 3d 27 5d 27 3b 20 69   && z[i]!=']'; i
5f00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
5f10: 66 28 20 7a 5b 69 5d 3d 3d 27 7c 27 20 26 26 20  f( z[i]=='|' && 
5f20: 7a 44 69 73 70 6c 61 79 3d 3d 30 20 29 7b 0a 20  zDisplay==0 ){. 
5f30: 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 73 70             zDisp
5f40: 6c 61 79 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20  lay = &z[i+1];. 
5f50: 20 20 20 20 20 20 20 20 20 20 20 7a 5b 69 5d 20             z[i] 
5f60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
5f70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5f80: 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 20     z[i] = 0;.   
5f90: 20 20 20 20 20 69 66 28 20 7a 44 69 73 70 6c 61       if( zDispla
5fa0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
5fb0: 20 20 7a 44 69 73 70 6c 61 79 20 3d 20 7a 54 61    zDisplay = zTa
5fc0: 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  rget;.        }e
5fd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
5fe0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a  hile( isspace(*z
5ff0: 44 69 73 70 6c 61 79 29 20 29 20 7a 44 69 73 70  Display) ) zDisp
6000: 6c 61 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  lay++;.        }
6010: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
6020: 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c  pend(p->pOut, "<
6030: 61 20 68 72 65 66 3d 5c 22 22 2c 20 2d 31 29 3b  a href=\"", -1);
6040: 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65  .        resolve
6050: 48 79 70 65 72 6c 69 6e 6b 28 7a 54 61 72 67 65  Hyperlink(zTarge
6060: 74 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 62  t, p);.        b
6070: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
6080: 75 74 2c 20 22 5c 22 3e 22 2c 20 2d 31 29 3b 0a  ut, "\">", -1);.
6090: 20 20 20 20 20 20 20 20 73 61 76 65 64 53 74 61          savedSta
60a0: 74 65 20 3d 20 70 2d 3e 73 74 61 74 65 3b 0a 20  te = p->state;. 
60b0: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
60c0: 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a  &= ~ALLOW_WIKI;.
60d0: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
60e0: 20 7c 3d 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f   |= FONT_MARKUP_
60f0: 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 77 69  ONLY;.        wi
6100: 6b 69 5f 72 65 6e 64 65 72 28 70 2c 20 7a 44 69  ki_render(p, zDi
6110: 73 70 6c 61 79 29 3b 0a 20 20 20 20 20 20 20 20  splay);.        
6120: 70 2d 3e 73 74 61 74 65 20 3d 20 73 61 76 65 64  p->state = saved
6130: 53 74 61 74 65 3b 0a 20 20 20 20 20 20 20 20 62  State;.        b
6140: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
6150: 75 74 2c 20 22 3c 2f 61 3e 22 2c 20 34 29 3b 0a  ut, "</a>", 4);.
6160: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
6180: 65 20 54 4f 4b 45 4e 5f 54 45 58 54 3a 20 7b 0a  e TOKEN_TEXT: {.
6190: 20 20 20 20 20 20 20 20 61 64 64 4d 69 73 73 69          addMissi
61a0: 6e 67 4d 61 72 6b 75 70 28 70 29 3b 0a 20 20 20  ngMarkup(p);.   
61b0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
61c0: 28 70 2d 3e 70 4f 75 74 2c 20 7a 2c 20 6e 29 3b  (p->pOut, z, n);
61d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
61e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
61f0: 73 65 20 54 4f 4b 45 4e 5f 4d 41 52 4b 55 50 3a  se TOKEN_MARKUP:
6200: 20 7b 0a 20 20 20 20 20 20 20 20 70 61 72 73 65   {.        parse
6210: 4d 61 72 6b 75 70 28 26 6d 61 72 6b 75 70 2c 20  Markup(&markup, 
6220: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
6230: 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d 20 29 7b  p->inVerbatim ){
6240: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
6250: 6e 64 56 65 72 62 61 74 69 6d 28 70 2c 20 26 6d  ndVerbatim(p, &m
6260: 61 72 6b 75 70 29 20 29 7b 0a 20 20 20 20 20 20  arkup) ){.      
6270: 20 20 20 20 20 20 70 2d 3e 69 6e 56 65 72 62 61        p->inVerba
6280: 74 69 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tim = 0;.       
6290: 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 3d 20       p->state = 
62a0: 70 2d 3e 70 72 65 56 65 72 62 53 74 61 74 65 3b  p->preVerbState;
62b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f  .            blo
62c0: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
62d0: 2c 20 22 3c 2f 70 72 65 3e 22 2c 20 36 29 3b 0a  , "</pre>", 6);.
62e0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
62f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 70  .            unp
6300: 61 72 73 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b  arseMarkup(&mark
6310: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  up);.           
6320: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e   blob_append(p->
6330: 70 4f 75 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29  pOut, "&lt;", 4)
6340: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  ;.            n 
6350: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
6360: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6370: 66 28 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 3d  f( markup.iCode=
6380: 3d 4d 41 52 4b 55 50 5f 49 4e 56 41 4c 49 44 20  =MARKUP_INVALID 
6390: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  ){.          blo
63a0: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
63b0: 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a 20 20  , "&lt;", 4);.  
63c0: 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20          n = 1;. 
63d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
63e0: 20 28 6d 61 72 6b 75 70 2e 69 54 79 70 65 26 4d   (markup.iType&M
63f0: 55 54 59 50 45 5f 46 4f 4e 54 29 3d 3d 30 0a 20  UTYPE_FONT)==0. 
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 20 20 26 26 20 28 70 2d 3e 73 74 61 74 65 20     && (p->state 
6420: 26 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f 4f 4e  & FONT_MARKUP_ON
6430: 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
6440: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
6450: 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  g */.        }el
6460: 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 43  se if( markup.iC
6470: 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f 4e 4f 57 49  ode==MARKUP_NOWI
6480: 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  KI ){.          
6490: 69 66 28 20 6d 61 72 6b 75 70 2e 65 6e 64 54 61  if( markup.endTa
64a0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
64b0: 20 70 2d 3e 73 74 61 74 65 20 7c 3d 20 41 4c 4c   p->state |= ALL
64c0: 4f 57 5f 57 49 4b 49 3b 0a 20 20 20 20 20 20 20  OW_WIKI;.       
64d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64e0: 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 26        p->state &
64f0: 3d 20 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20 20  = ALLOW_WIKI;.  
6500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6510: 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b    }else if( mark
6520: 75 70 2e 65 6e 64 54 61 67 20 29 7b 0a 20 20 20  up.endTag ){.   
6530: 20 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54         popStackT
6540: 6f 54 61 67 28 70 2c 20 6d 61 72 6b 75 70 2e 69  oTag(p, markup.i
6550: 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Code);.        }
6560: 65 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e  else if( markup.
6570: 69 43 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f 56 45  iCode==MARKUP_VE
6580: 52 42 41 54 49 4d 20 29 7b 0a 20 20 20 20 20 20  RBATIM ){.      
6590: 20 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 6e      if( markup.n
65a0: 41 74 74 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Attr==1 ){.     
65b0: 20 20 20 20 20 20 20 70 2d 3e 7a 56 65 72 62 61         p->zVerba
65c0: 74 69 6d 49 64 20 3d 20 6d 61 72 6b 75 70 2e 61  timId = markup.a
65d0: 41 74 74 72 5b 30 5d 2e 7a 56 61 6c 75 65 3b 0a  Attr[0].zValue;.
65e0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
65f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
6600: 7a 56 65 72 62 61 74 69 6d 49 64 20 3d 20 30 3b  zVerbatimId = 0;
6610: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6620: 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65 72 62         p->inVerb
6630: 61 74 69 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  atim = 1;.      
6640: 20 20 20 20 70 2d 3e 70 72 65 56 65 72 62 53 74      p->preVerbSt
6650: 61 74 65 20 3d 20 70 2d 3e 73 74 61 74 65 3b 0a  ate = p->state;.
6660: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61            p->sta
6670: 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b  te &= ~ALLOW_WIK
6680: 49 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  I;.          blo
6690: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
66a0: 2c 20 22 3c 70 72 65 3e 22 2c 20 35 29 3b 0a 20  , "<pre>", 5);. 
66b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
66c0: 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d   markup.iType==M
66d0: 55 54 59 50 45 5f 4c 49 20 29 7b 0a 20 20 20 20  UTYPE_LI ){.    
66e0: 20 20 20 20 20 20 69 66 28 20 62 61 63 6b 75 70        if( backup
66f0: 54 6f 54 79 70 65 28 70 2c 20 4d 55 54 59 50 45  ToType(p, MUTYPE
6700: 5f 4c 49 53 54 29 3d 3d 30 20 29 7b 0a 20 20 20  _LIST)==0 ){.   
6710: 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61           pushSta
6720: 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 55 4c 29  ck(p, MARKUP_UL)
6730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  ;.            bl
6740: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
6750: 74 2c 20 22 3c 75 6c 3e 22 2c 20 34 29 3b 0a 20  t, "<ul>", 4);. 
6760: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6770: 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70       pushStack(p
6780: 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a 20 20  , MARKUP_LI);.  
6790: 20 20 20 20 20 20 20 20 72 65 6e 64 65 72 4d 61          renderMa
67a0: 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d  rkup(p->pOut, &m
67b0: 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  arkup);.        
67c0: 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70  }else if( markup
67d0: 2e 69 54 79 70 65 3d 3d 4d 55 54 59 50 45 5f 54  .iType==MUTYPE_T
67e0: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  R ){.          i
67f0: 66 28 20 62 61 63 6b 75 70 54 6f 54 79 70 65 28  f( backupToType(
6800: 70 2c 20 4d 55 54 59 50 45 5f 54 41 42 4c 45 29  p, MUTYPE_TABLE)
6810: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6820: 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52  pushStack(p, MAR
6830: 4b 55 50 5f 54 52 29 3b 0a 20 20 20 20 20 20 20  KUP_TR);.       
6840: 20 20 20 20 20 72 65 6e 64 65 72 4d 61 72 6b 75       renderMarku
6850: 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d 61 72 6b  p(p->pOut, &mark
6860: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  up);.          }
6870: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6880: 66 28 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d  f( markup.iType=
6890: 3d 4d 55 54 59 50 45 5f 54 44 20 29 7b 0a 20 20  =MUTYPE_TD ){.  
68a0: 20 20 20 20 20 20 20 20 69 66 28 20 62 61 63 6b          if( back
68b0: 75 70 54 6f 54 79 70 65 28 70 2c 20 4d 55 54 59  upToType(p, MUTY
68c0: 50 45 5f 54 41 42 4c 45 7c 4d 55 54 59 50 45 5f  PE_TABLE|MUTYPE_
68d0: 54 52 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TR) ){.         
68e0: 20 20 20 69 66 28 20 73 74 61 63 6b 54 6f 70 54     if( stackTopT
68f0: 79 70 65 28 70 29 3d 3d 4d 55 54 59 50 45 5f 54  ype(p)==MUTYPE_T
6900: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
6910: 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28        pushStack(
6920: 70 2c 20 4d 41 52 4b 55 50 5f 54 52 29 3b 0a 20  p, MARKUP_TR);. 
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
6940: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
6950: 2c 20 22 3c 74 72 3e 22 2c 20 34 29 3b 0a 20 20  , "<tr>", 4);.  
6960: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6970: 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63          pushStac
6980: 6b 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64  k(p, markup.iCod
6990: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
69a0: 72 65 6e 64 65 72 4d 61 72 6b 75 70 28 70 2d 3e  renderMarkup(p->
69b0: 70 4f 75 74 2c 20 26 6d 61 72 6b 75 70 29 3b 0a  pOut, &markup);.
69c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
69d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
69e0: 20 20 20 20 20 69 66 28 20 28 6d 61 72 6b 75 70       if( (markup
69f0: 2e 69 54 79 70 65 20 26 20 4d 55 54 59 50 45 5f  .iType & MUTYPE_
6a00: 53 54 41 43 4b 20 29 21 3d 30 20 29 7b 0a 20 20  STACK )!=0 ){.  
6a10: 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74            pushSt
6a20: 61 63 6b 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43  ack(p, markup.iC
6a30: 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
6a40: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 6e 64  }.          rend
6a50: 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74  erMarkup(p->pOut
6a60: 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20  , &markup);.    
6a70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
6a80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6a90: 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20   }.    z += n;. 
6aa0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61   }.}.../*.** Tra
6ab0: 6e 73 66 6f 72 6d 20 74 68 65 20 74 65 78 74 20  nsform the text 
6ac0: 69 6e 20 74 68 65 20 70 49 6e 20 62 6c 6f 62 2e  in the pIn blob.
6ad0: 20 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75    Write the resu
6ae0: 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
6af0: 70 4f 75 74 20 62 6c 6f 62 2e 20 20 54 68 65 20  pOut blob.  The 
6b00: 70 4f 75 74 20 62 6c 6f 62 20 73 68 6f 75 6c 64  pOut blob should
6b10: 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20 69   already be.** i
6b20: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
6b30: 20 6f 75 74 70 75 74 20 69 73 20 6d 65 72 65 6c   output is merel
6b40: 79 20 61 70 70 65 6e 64 65 64 20 74 6f 20 70 4f  y appended to pO
6b50: 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72  ut..**.** The tr
6b60: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 63 61  ansformations ca
6b70: 72 72 69 65 64 20 6f 75 74 20 64 65 70 65 6e 64  rried out depend
6b80: 20 6f 6e 20 74 68 65 20 6f 70 73 20 66 6c 61 67   on the ops flag
6b90: 3a 0a 2a 2a 0a 2a 2a 20 57 49 4b 49 5f 4e 4f 46  :.**.** WIKI_NOF
6ba0: 4f 4c 4c 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OLLOW.**.**     
6bb0: 2a 20 41 64 64 20 74 68 65 20 6e 6f 66 6f 6c 6c  * Add the nofoll
6bc0: 6f 77 20 61 74 74 72 69 62 75 74 65 20 74 6f 20  ow attribute to 
6bd0: 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 73 0a 2a  external links.*
6be0: 2a 0a 2a 2a 20 57 49 4b 49 5f 48 54 4d 4c 0a 2a  *.** WIKI_HTML.*
6bf0: 2a 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 6e 76 65  *.**     * Conve
6c00: 72 74 20 77 69 6b 69 20 69 6e 74 6f 20 48 54 4d  rt wiki into HTM
6c10: 4c 0a 2a 2a 20 20 20 20 20 2a 20 52 65 6d 6f 76  L.**     * Remov
6c20: 65 20 3c 6e 6f 77 69 6b 69 3e 20 61 6e 64 20 3c  e <nowiki> and <
6c30: 76 65 72 62 61 74 69 75 6d 3e 0a 2a 2a 20 20 20  verbatium>.**   
6c40: 20 20 2a 20 43 6f 6e 76 65 72 74 20 26 20 69 6e    * Convert & in
6c50: 74 6f 20 26 61 6d 70 3b 0a 2a 2a 20 20 20 20 20  to &amp;.**     
6c60: 2a 20 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6d  * Unrecognized m
6c70: 61 72 6b 75 70 20 61 6e 64 20 6d 61 72 6b 75 70  arkup and markup
6c80: 20 77 69 74 68 69 6e 20 3c 76 65 72 62 61 74 69   within <verbati
6c90: 6d 3e 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 63  m>.**       is c
6ca0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 26 6c  onverted into &l
6cb0: 74 3b 2e 2e 2e 26 67 74 3b 0a 2a 2a 20 20 20 20  t;...&gt;.**    
6cc0: 20 2a 20 55 6e 61 75 74 68 6f 72 69 7a 65 64 20   * Unauthorized 
6cd0: 61 74 74 72 69 62 75 74 65 73 20 6f 6e 20 6d 61  attributes on ma
6ce0: 72 6b 75 70 20 61 72 65 20 72 65 6d 6f 76 65 64  rkup are removed
6cf0: 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 63 6f  .*/.void wiki_co
6d00: 6e 76 65 72 74 28 42 6c 6f 62 20 2a 70 49 6e 2c  nvert(Blob *pIn,
6d10: 20 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 69 6e 74   Blob *pOut, int
6d20: 20 6f 70 73 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ops){.  char *z
6d30: 3b 0a 20 20 52 65 6e 64 65 72 65 72 20 72 65 6e  ;.  Renderer ren
6d40: 64 65 72 65 72 3b 0a 20 20 0a 20 20 6d 65 6d 73  derer;.  .  mems
6d50: 65 74 28 26 72 65 6e 64 65 72 65 72 2c 20 30 2c  et(&renderer, 0,
6d60: 20 73 69 7a 65 6f 66 28 72 65 6e 64 65 72 65 72   sizeof(renderer
6d70: 29 29 3b 0a 20 20 72 65 6e 64 65 72 65 72 2e 73  ));.  renderer.s
6d80: 74 61 74 65 20 3d 20 41 4c 4c 4f 57 5f 57 49 4b  tate = ALLOW_WIK
6d90: 49 7c 41 54 5f 4e 45 57 4c 49 4e 45 7c 41 54 5f  I|AT_NEWLINE|AT_
6da0: 50 41 52 41 47 52 41 50 48 3b 0a 20 20 72 65 6e  PARAGRAPH;.  ren
6db0: 64 65 72 65 72 2e 70 4f 75 74 20 3d 20 70 4f 75  derer.pOut = pOu
6dc0: 74 3b 0a 0a 20 20 7a 20 3d 20 62 6c 6f 62 5f 73  t;..  z = blob_s
6dd0: 74 72 28 70 49 6e 29 3b 0a 20 20 77 69 6b 69 5f  tr(pIn);.  wiki_
6de0: 72 65 6e 64 65 72 28 26 72 65 6e 64 65 72 65 72  render(&renderer
6df0: 2c 20 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  , z);.  while( r
6e00: 65 6e 64 65 72 65 72 2e 6e 53 74 61 63 6b 20 29  enderer.nStack )
6e10: 7b 0a 20 20 20 20 70 6f 70 53 74 61 63 6b 28 26  {.    popStack(&
6e20: 72 65 6e 64 65 72 65 72 29 3b 0a 20 20 7d 0a 20  renderer);.  }. 
6e30: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75   blob_append(pOu
6e40: 74 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 66  t, "\n", 1);.  f
6e50: 72 65 65 28 72 65 6e 64 65 72 65 72 2e 61 53 74  ree(renderer.aSt
6e60: 61 63 6b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ack);.}.../*.** 
6e70: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 77 69  COMMAND: test-wi
6e80: 6b 69 2d 72 65 6e 64 65 72 0a 2a 2f 0a 76 6f 69  ki-render.*/.voi
6e90: 64 20 74 65 73 74 5f 77 69 6b 69 5f 72 65 6e 64  d test_wiki_rend
6ea0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62  er(void){.  Blob
6eb0: 20 69 6e 2c 20 6f 75 74 3b 0a 20 20 69 66 28 20   in, out;.  if( 
6ec0: 67 2e 61 72 67 63 21 3d 33 20 29 20 75 73 61 67  g.argc!=3 ) usag
6ed0: 65 28 22 46 49 4c 45 22 29 3b 0a 20 20 62 6c 6f  e("FILE");.  blo
6ee0: 62 5f 7a 65 72 6f 28 26 6f 75 74 29 3b 0a 20 20  b_zero(&out);.  
6ef0: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66  blob_read_from_f
6f00: 69 6c 65 28 26 69 6e 2c 20 67 2e 61 72 67 76 5b  ile(&in, g.argv[
6f10: 32 5d 29 3b 0a 20 20 77 69 6b 69 5f 63 6f 6e 76  2]);.  wiki_conv
6f20: 65 72 74 28 26 69 6e 2c 20 26 6f 75 74 2c 20 57  ert(&in, &out, W
6f30: 49 4b 49 5f 48 54 4d 4c 29 3b 0a 20 20 62 6c 6f  IKI_HTML);.  blo
6f40: 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c 65 28  b_write_to_file(
6f50: 26 6f 75 74 2c 20 22 2d 22 29 3b 0a 7d 0a        &out, "-");.}.