Hex Artifact Content
Not logged in

Artifact 43e274f49a92f4606908d4f8990365ee03ea2a99:

File src/wikiformat.c part of check-in [1bbc5b7e6c] - Fix bugs in the rendering of HTML markup with multiple attributes. This clears up a problem in displaying the "concepts.wiki" documentation file. by drh on 2008-05-16 00:56:01.

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 64 65 66 69 6e 65 20 57 49 4b 49  002.#define WIKI
0470: 5f 49 4e 4c 49 4e 45 20 20 20 20 20 20 20 20 20  _INLINE         
0480: 30 78 30 30 34 20 20 2f 2a 20 44 6f 20 6e 6f 74  0x004  /* Do not
0490: 20 73 75 72 72 6f 75 6e 64 20 77 69 74 68 20 3c   surround with <
04a0: 70 3e 2e 2e 3c 2f 70 3e 20 2a 2f 0a 23 64 65 66  p>..</p> */.#def
04b0: 69 6e 65 20 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b  ine WIKI_NOBLOCK
04c0: 20 20 20 20 20 20 20 20 30 78 30 30 38 20 20 2f          0x008  /
04d0: 2a 20 4e 6f 20 62 6c 6f 63 6b 20 6d 61 72 6b 75  * No block marku
04e0: 70 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f  p of any kind */
04f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
0500: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 6f 6e  These are the on
0510: 6c 79 20 6d 61 72 6b 75 70 20 61 74 74 72 69 62  ly markup attrib
0520: 75 74 65 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f  utes allowed..*/
0530: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 41 4c  .#define ATTR_AL
0540: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
0550: 20 30 78 30 30 30 30 30 30 31 0a 23 64 65 66 69   0x0000001.#defi
0560: 6e 65 20 41 54 54 52 5f 41 4c 54 20 20 20 20 20  ne ATTR_ALT     
0570: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
0580: 30 30 30 32 0a 23 64 65 66 69 6e 65 20 41 54 54  0002.#define ATT
0590: 52 5f 42 47 43 4f 4c 4f 52 20 20 20 20 20 20 20  R_BGCOLOR       
05a0: 20 20 20 20 20 30 78 30 30 30 30 30 30 34 0a 23       0x0000004.#
05b0: 64 65 66 69 6e 65 20 41 54 54 52 5f 42 4f 52 44  define ATTR_BORD
05c0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
05d0: 78 30 30 30 30 30 30 38 0a 23 64 65 66 69 6e 65  x0000008.#define
05e0: 20 41 54 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e   ATTR_CELLPADDIN
05f0: 47 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30  G        0x00000
0600: 31 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  10.#define ATTR_
0610: 43 45 4c 4c 53 50 41 43 49 4e 47 20 20 20 20 20  CELLSPACING     
0620: 20 20 20 30 78 30 30 30 30 30 32 30 0a 23 64 65     0x0000020.#de
0630: 66 69 6e 65 20 41 54 54 52 5f 43 4c 45 41 52 20  fine ATTR_CLEAR 
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0650: 30 30 30 30 34 30 0a 23 64 65 66 69 6e 65 20 41  000040.#define A
0660: 54 54 52 5f 43 4f 4c 4f 52 20 20 20 20 20 20 20  TTR_COLOR       
0670: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 38 30         0x0000080
0680: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 43 4f  .#define ATTR_CO
0690: 4c 53 50 41 4e 20 20 20 20 20 20 20 20 20 20 20  LSPAN           
06a0: 20 30 78 30 30 30 30 31 30 30 0a 23 64 65 66 69   0x0000100.#defi
06b0: 6e 65 20 41 54 54 52 5f 43 4f 4d 50 41 43 54 20  ne ATTR_COMPACT 
06c0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
06d0: 30 32 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54  0200.#define ATT
06e0: 52 5f 46 41 43 45 20 20 20 20 20 20 20 20 20 20  R_FACE          
06f0: 20 20 20 20 20 30 78 30 30 30 30 34 30 30 0a 23       0x0000400.#
0700: 64 65 66 69 6e 65 20 41 54 54 52 5f 48 45 49 47  define ATTR_HEIG
0710: 48 54 20 20 20 20 20 20 20 20 20 20 20 20 20 30  HT             0
0720: 78 30 30 30 30 38 30 30 0a 23 64 65 66 69 6e 65  x0000800.#define
0730: 20 41 54 54 52 5f 48 52 45 46 20 20 20 20 20 20   ATTR_HREF      
0740: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 31 30           0x00010
0750: 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  00.#define ATTR_
0760: 48 53 50 41 43 45 20 20 20 20 20 20 20 20 20 20  HSPACE          
0770: 20 20 20 30 78 30 30 30 32 30 30 30 0a 23 64 65     0x0002000.#de
0780: 66 69 6e 65 20 41 54 54 52 5f 49 44 20 20 20 20  fine ATTR_ID    
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
07a0: 30 30 34 30 30 30 0a 23 64 65 66 69 6e 65 20 41  004000.#define A
07b0: 54 54 52 5f 4e 41 4d 45 20 20 20 20 20 20 20 20  TTR_NAME        
07c0: 20 20 20 20 20 20 20 30 78 30 30 30 38 30 30 30         0x0008000
07d0: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 52 4f  .#define ATTR_RO
07e0: 57 53 50 41 4e 20 20 20 20 20 20 20 20 20 20 20  WSPAN           
07f0: 20 30 78 30 30 31 30 30 30 30 0a 23 64 65 66 69   0x0010000.#defi
0800: 6e 65 20 41 54 54 52 5f 53 49 5a 45 20 20 20 20  ne ATTR_SIZE    
0810: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 32             0x002
0820: 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54  0000.#define ATT
0830: 52 5f 53 52 43 20 20 20 20 20 20 20 20 20 20 20  R_SRC           
0840: 20 20 20 20 20 30 78 30 30 34 30 30 30 30 0a 23       0x0040000.#
0850: 64 65 66 69 6e 65 20 41 54 54 52 5f 53 54 41 52  define ATTR_STAR
0860: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  T              0
0870: 78 30 30 38 30 30 30 30 0a 23 64 65 66 69 6e 65  x0080000.#define
0880: 20 41 54 54 52 5f 54 59 50 45 20 20 20 20 20 20   ATTR_TYPE      
0890: 20 20 20 20 20 20 20 20 20 30 78 30 31 30 30 30           0x01000
08a0: 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  00.#define ATTR_
08b0: 56 41 4c 49 47 4e 20 20 20 20 20 20 20 20 20 20  VALIGN          
08c0: 20 20 20 30 78 30 32 30 30 30 30 30 0a 23 64 65     0x0200000.#de
08d0: 66 69 6e 65 20 41 54 54 52 5f 56 41 4c 55 45 20  fine ATTR_VALUE 
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
08f0: 34 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41  400000.#define A
0900: 54 54 52 5f 56 53 50 41 43 45 20 20 20 20 20 20  TTR_VSPACE      
0910: 20 20 20 20 20 20 20 30 78 30 38 30 30 30 30 30         0x0800000
0920: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 57 49  .#define ATTR_WI
0930: 44 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  DTH             
0940: 20 30 78 31 30 30 30 30 30 30 0a 0a 73 74 61 74   0x1000000..stat
0950: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0960: 41 6c 6c 6f 77 65 64 41 74 74 72 69 62 75 74 65  AllowedAttribute
0970: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
0980: 2a 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67 6e  *zName;.  unsign
0990: 65 64 20 69 6e 74 20 69 4d 61 73 6b 3b 0a 7d 20  ed int iMask;.} 
09a0: 61 41 74 74 72 69 62 75 74 65 5b 5d 20 3d 20 7b  aAttribute[] = {
09b0: 0a 20 20 7b 20 30 2c 20 30 20 7d 2c 0a 20 20 7b  .  { 0, 0 },.  {
09c0: 20 22 61 6c 69 67 6e 22 2c 20 20 20 20 20 20 20   "align",       
09d0: 20 20 41 54 54 52 5f 41 4c 49 47 4e 2c 20 20 20    ATTR_ALIGN,   
09e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61         },.  { "a
09f0: 6c 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 41  lt",           A
0a00: 54 54 52 5f 41 4c 54 2c 20 20 20 20 20 20 20 20  TTR_ALT,        
0a10: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 62 67 63 6f      },.  { "bgco
0a20: 6c 6f 72 22 2c 20 20 20 20 20 20 20 41 54 54 52  lor",       ATTR
0a30: 5f 42 47 43 4f 4c 4f 52 2c 20 20 20 20 20 20 20  _BGCOLOR,       
0a40: 20 7d 2c 0a 20 20 7b 20 22 62 6f 72 64 65 72 22   },.  { "border"
0a50: 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f 42 4f  ,        ATTR_BO
0a60: 52 44 45 52 2c 20 20 20 20 20 20 20 20 20 7d 2c  RDER,         },
0a70: 0a 20 20 7b 20 22 63 65 6c 6c 70 61 64 64 69 6e  .  { "cellpaddin
0a80: 67 22 2c 20 20 20 41 54 54 52 5f 43 45 4c 4c 50  g",   ATTR_CELLP
0a90: 41 44 44 49 4e 47 2c 20 20 20 20 7d 2c 0a 20 20  ADDING,    },.  
0aa0: 7b 20 22 63 65 6c 6c 73 70 61 63 69 6e 67 22 2c  { "cellspacing",
0ab0: 20 20 20 41 54 54 52 5f 43 45 4c 4c 53 50 41 43     ATTR_CELLSPAC
0ac0: 49 4e 47 2c 20 20 20 20 7d 2c 0a 20 20 7b 20 22  ING,    },.  { "
0ad0: 63 6c 65 61 72 22 2c 20 20 20 20 20 20 20 20 20  clear",         
0ae0: 41 54 54 52 5f 43 4c 45 41 52 2c 20 20 20 20 20  ATTR_CLEAR,     
0af0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6c       },.  { "col
0b00: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 41 54 54  or",         ATT
0b10: 52 5f 43 4f 4c 4f 52 2c 20 20 20 20 20 20 20 20  R_COLOR,        
0b20: 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6c 73 70 61    },.  { "colspa
0b30: 6e 22 2c 20 20 20 20 20 20 20 41 54 54 52 5f 43  n",       ATTR_C
0b40: 4f 4c 53 50 41 4e 2c 20 20 20 20 20 20 20 20 7d  OLSPAN,        }
0b50: 2c 0a 20 20 7b 20 22 63 6f 6d 70 61 63 74 22 2c  ,.  { "compact",
0b60: 20 20 20 20 20 20 20 41 54 54 52 5f 43 4f 4d 50         ATTR_COMP
0b70: 41 43 54 2c 20 20 20 20 20 20 20 20 7d 2c 0a 20  ACT,        },. 
0b80: 20 7b 20 22 66 61 63 65 22 2c 20 20 20 20 20 20   { "face",      
0b90: 20 20 20 20 41 54 54 52 5f 46 41 43 45 2c 20 20      ATTR_FACE,  
0ba0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0bb0: 22 68 65 69 67 68 74 22 2c 20 20 20 20 20 20 20  "height",       
0bc0: 20 41 54 54 52 5f 48 45 49 47 48 54 2c 20 20 20   ATTR_HEIGHT,   
0bd0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 68 72        },.  { "hr
0be0: 65 66 22 2c 20 20 20 20 20 20 20 20 20 20 41 54  ef",          AT
0bf0: 54 52 5f 48 52 45 46 2c 20 20 20 20 20 20 20 20  TR_HREF,        
0c00: 20 20 20 7d 2c 0a 20 20 7b 20 22 68 73 70 61 63     },.  { "hspac
0c10: 65 22 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f  e",        ATTR_
0c20: 48 53 50 41 43 45 2c 20 20 20 20 20 20 20 20 20  HSPACE,         
0c30: 7d 2c 0a 20 20 7b 20 22 69 64 22 2c 20 20 20 20  },.  { "id",    
0c40: 20 20 20 20 20 20 20 20 41 54 54 52 5f 49 44 2c          ATTR_ID,
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
0c60: 20 20 7b 20 22 6e 61 6d 65 22 2c 20 20 20 20 20    { "name",     
0c70: 20 20 20 20 20 41 54 54 52 5f 4e 41 4d 45 2c 20       ATTR_NAME, 
0c80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
0c90: 20 22 72 6f 77 73 70 61 6e 22 2c 20 20 20 20 20   "rowspan",     
0ca0: 20 20 41 54 54 52 5f 52 4f 57 53 50 41 4e 2c 20    ATTR_ROWSPAN, 
0cb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73         },.  { "s
0cc0: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 41  ize",          A
0cd0: 54 54 52 5f 53 49 5a 45 2c 20 20 20 20 20 20 20  TTR_SIZE,       
0ce0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 72 63 22      },.  { "src"
0cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 41 54 54 52  ,           ATTR
0d00: 5f 53 52 43 2c 20 20 20 20 20 20 20 20 20 20 20  _SRC,           
0d10: 20 7d 2c 0a 20 20 7b 20 22 73 74 61 72 74 22 2c   },.  { "start",
0d20: 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 53 54           ATTR_ST
0d30: 41 52 54 2c 20 20 20 20 20 20 20 20 20 20 7d 2c  ART,          },
0d40: 0a 20 20 7b 20 22 74 79 70 65 22 2c 20 20 20 20  .  { "type",    
0d50: 20 20 20 20 20 20 41 54 54 52 5f 54 59 50 45 2c        ATTR_TYPE,
0d60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0d70: 7b 20 22 76 61 6c 69 67 6e 22 2c 20 20 20 20 20  { "valign",     
0d80: 20 20 20 41 54 54 52 5f 56 41 4c 49 47 4e 2c 20     ATTR_VALIGN, 
0d90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
0da0: 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20  value",         
0db0: 41 54 54 52 5f 56 41 4c 55 45 2c 20 20 20 20 20  ATTR_VALUE,     
0dc0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 76 73 70       },.  { "vsp
0dd0: 61 63 65 22 2c 20 20 20 20 20 20 20 20 41 54 54  ace",        ATT
0de0: 52 5f 56 53 50 41 43 45 2c 20 20 20 20 20 20 20  R_VSPACE,       
0df0: 20 20 7d 2c 0a 20 20 7b 20 22 77 69 64 74 68 22    },.  { "width"
0e00: 2c 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 57  ,         ATTR_W
0e10: 49 44 54 48 2c 20 20 20 20 20 20 20 20 20 20 7d  IDTH,          }
0e20: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20  ,.};../*.** Use 
0e30: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
0e40: 20 6c 6f 63 61 74 65 20 61 20 74 61 67 20 69 6e   locate a tag in
0e50: 20 74 68 65 20 61 41 74 74 72 69 62 75 74 65 5b   the aAttribute[
0e60: 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ] table..*/.stat
0e70: 69 63 20 69 6e 74 20 66 69 6e 64 41 74 74 72 28  ic int findAttr(
0e80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0e90: 20 20 69 6e 74 20 69 2c 20 63 2c 20 66 69 72 73    int i, c, firs
0ea0: 74 2c 20 6c 61 73 74 3b 0a 20 20 66 69 72 73 74  t, last;.  first
0eb0: 20 3d 20 31 3b 0a 20 20 6c 61 73 74 20 3d 20 73   = 1;.  last = s
0ec0: 69 7a 65 6f 66 28 61 41 74 74 72 69 62 75 74 65  izeof(aAttribute
0ed0: 29 2f 73 69 7a 65 6f 66 28 61 41 74 74 72 69 62  )/sizeof(aAttrib
0ee0: 75 74 65 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 77  ute[0]) - 1;.  w
0ef0: 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c 61 73  hile( first<=las
0f00: 74 20 29 7b 0a 20 20 20 20 69 20 3d 20 28 66 69  t ){.    i = (fi
0f10: 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20  rst+last)/2;.   
0f20: 20 63 20 3d 20 73 74 72 63 6d 70 28 61 41 74 74   c = strcmp(aAtt
0f30: 72 69 62 75 74 65 5b 69 5d 2e 7a 4e 61 6d 65 2c  ribute[i].zName,
0f40: 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d   z);.    if( c==
0f50: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
0f60: 6e 20 69 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n i;.    }else i
0f70: 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
0f80: 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20  first = i+1;.   
0f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
0fa0: 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20 7d 0a  st = i-1;.    }.
0fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
0fc0: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  }..../*.** Allow
0fd0: 65 64 20 6d 61 72 6b 75 70 2e 0a 2a 2a 0a 2a 2a  ed markup..**.**
0fe0: 20 45 78 63 65 70 74 20 66 6f 72 20 4d 41 52 4b   Except for MARK
0ff0: 55 50 5f 49 4e 56 41 4c 49 44 2c 20 74 68 69 73  UP_INVALID, this
1000: 20 6d 75 73 74 20 61 6c 6c 20 62 65 20 69 6e 20   must all be in 
1010: 61 6c 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64  alphabetical ord
1020: 65 72 0a 2a 2a 20 61 6e 64 20 69 6e 20 6e 75 6d  er.** and in num
1030: 65 72 69 63 61 6c 20 73 65 71 75 65 6e 63 65 2e  erical sequence.
1040: 20 20 54 68 65 20 66 69 72 73 74 20 6d 61 72 6b    The first mark
1050: 75 70 20 74 79 70 65 20 6d 75 73 74 20 62 65 20  up type must be 
1060: 7a 65 72 6f 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  zero..** The val
1070: 75 65 20 66 6f 72 20 4d 41 52 4b 55 50 5f 58 59  ue for MARKUP_XY
1080: 5a 20 6d 75 73 74 20 63 6f 72 72 65 73 70 6f 6e  Z must correspon
1090: 64 20 74 6f 20 74 68 65 20 3c 78 79 7a 3e 20 65  d to the <xyz> e
10a0: 6e 74 72 79 20 0a 2a 2a 20 69 6e 20 61 41 6c 6c  ntry .** in aAll
10b0: 6f 77 65 64 4d 61 72 6b 75 70 5b 5d 2e 0a 2a 2f  owedMarkup[]..*/
10c0: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
10d0: 49 4e 56 41 4c 49 44 20 20 20 20 20 20 20 20 20  INVALID         
10e0: 20 20 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b    0.#define MARK
10f0: 55 50 5f 41 20 20 20 20 20 20 20 20 20 20 20 20  UP_A            
1100: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4d       1.#define M
1110: 41 52 4b 55 50 5f 41 44 44 52 45 53 53 20 20 20  ARKUP_ADDRESS   
1120: 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e          2.#defin
1130: 65 20 4d 41 52 4b 55 50 5f 42 20 20 20 20 20 20  e MARKUP_B      
1140: 20 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65             3.#de
1150: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42 49 47 20  fine MARKUP_BIG 
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 0a                4.
1170: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42  #define MARKUP_B
1180: 4c 4f 43 4b 51 55 4f 54 45 20 20 20 20 20 20 20  LOCKQUOTE       
1190: 20 35 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55   5.#define MARKU
11a0: 50 5f 42 52 20 20 20 20 20 20 20 20 20 20 20 20  P_BR            
11b0: 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4d 41      6.#define MA
11c0: 52 4b 55 50 5f 43 45 4e 54 45 52 20 20 20 20 20  RKUP_CENTER     
11d0: 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65         7.#define
11e0: 20 4d 41 52 4b 55 50 5f 43 49 54 45 20 20 20 20   MARKUP_CITE    
11f0: 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66            8.#def
1200: 69 6e 65 20 4d 41 52 4b 55 50 5f 43 4f 44 45 20  ine MARKUP_CODE 
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23               9.#
1220: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 44 44  define MARKUP_DD
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1240: 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  0.#define MARKUP
1250: 5f 44 46 4e 20 20 20 20 20 20 20 20 20 20 20 20  _DFN            
1260: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4d 41 52    11.#define MAR
1270: 4b 55 50 5f 44 4c 20 20 20 20 20 20 20 20 20 20  KUP_DL          
1280: 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65 20       12.#define 
1290: 4d 41 52 4b 55 50 5f 44 54 20 20 20 20 20 20 20  MARKUP_DT       
12a0: 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66 69          13.#defi
12b0: 6e 65 20 4d 41 52 4b 55 50 5f 45 4d 20 20 20 20  ne MARKUP_EM    
12c0: 20 20 20 20 20 20 20 20 20 20 20 31 34 0a 23 64             14.#d
12d0: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 46 4f 4e  efine MARKUP_FON
12e0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35  T             15
12f0: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1300: 48 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H1              
1310: 20 31 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   16.#define MARK
1320: 55 50 5f 48 32 20 20 20 20 20 20 20 20 20 20 20  UP_H2           
1330: 20 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 4d      17.#define M
1340: 41 52 4b 55 50 5f 48 33 20 20 20 20 20 20 20 20  ARKUP_H3        
1350: 20 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e         18.#defin
1360: 65 20 4d 41 52 4b 55 50 5f 48 34 20 20 20 20 20  e MARKUP_H4     
1370: 20 20 20 20 20 20 20 20 20 20 31 39 0a 23 64 65            19.#de
1380: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48 35 20 20  fine MARKUP_H5  
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 0a               20.
13a0: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48  #define MARKUP_H
13b0: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13c0: 32 31 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  21.#define MARKU
13d0: 50 5f 48 52 20 20 20 20 20 20 20 20 20 20 20 20  P_HR            
13e0: 20 20 20 32 32 0a 23 64 65 66 69 6e 65 20 4d 41     22.#define MA
13f0: 52 4b 55 50 5f 49 20 20 20 20 20 20 20 20 20 20  RKUP_I          
1400: 20 20 20 20 20 20 32 33 0a 23 64 65 66 69 6e 65        23.#define
1410: 20 4d 41 52 4b 55 50 5f 49 4d 47 20 20 20 20 20   MARKUP_IMG     
1420: 20 20 20 20 20 20 20 20 20 32 34 0a 23 64 65 66           24.#def
1430: 69 6e 65 20 4d 41 52 4b 55 50 5f 4b 42 44 20 20  ine MARKUP_KBD  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 32 35 0a 23              25.#
1450: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 4c 49  define MARKUP_LI
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
1470: 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  6.#define MARKUP
1480: 5f 4e 4f 42 52 20 20 20 20 20 20 20 20 20 20 20  _NOBR           
1490: 20 20 32 37 0a 23 64 65 66 69 6e 65 20 4d 41 52    27.#define MAR
14a0: 4b 55 50 5f 4e 4f 57 49 4b 49 20 20 20 20 20 20  KUP_NOWIKI      
14b0: 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e 65 20       28.#define 
14c0: 4d 41 52 4b 55 50 5f 4f 4c 20 20 20 20 20 20 20  MARKUP_OL       
14d0: 20 20 20 20 20 20 20 20 32 39 0a 23 64 65 66 69          29.#defi
14e0: 6e 65 20 4d 41 52 4b 55 50 5f 50 20 20 20 20 20  ne MARKUP_P     
14f0: 20 20 20 20 20 20 20 20 20 20 20 33 30 0a 23 64             30.#d
1500: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 50 52 45  efine MARKUP_PRE
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 31                31
1520: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1530: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
1540: 20 33 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   32.#define MARK
1550: 55 50 5f 53 41 4d 50 20 20 20 20 20 20 20 20 20  UP_SAMP         
1560: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 4d      33.#define M
1570: 41 52 4b 55 50 5f 53 4d 41 4c 4c 20 20 20 20 20  ARKUP_SMALL     
1580: 20 20 20 20 20 20 20 33 34 0a 23 64 65 66 69 6e         34.#defin
1590: 65 20 4d 41 52 4b 55 50 5f 53 54 52 49 4b 45 20  e MARKUP_STRIKE 
15a0: 20 20 20 20 20 20 20 20 20 20 33 35 0a 23 64 65            35.#de
15b0: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53 54 52 4f  fine MARKUP_STRO
15c0: 4e 47 20 20 20 20 20 20 20 20 20 20 20 33 36 0a  NG           36.
15d0: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53  #define MARKUP_S
15e0: 55 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  UB              
15f0: 33 37 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  37.#define MARKU
1600: 50 5f 53 55 50 20 20 20 20 20 20 20 20 20 20 20  P_SUP           
1610: 20 20 20 33 38 0a 23 64 65 66 69 6e 65 20 4d 41     38.#define MA
1620: 52 4b 55 50 5f 54 41 42 4c 45 20 20 20 20 20 20  RKUP_TABLE      
1630: 20 20 20 20 20 20 33 39 0a 23 64 65 66 69 6e 65        39.#define
1640: 20 4d 41 52 4b 55 50 5f 54 44 20 20 20 20 20 20   MARKUP_TD      
1650: 20 20 20 20 20 20 20 20 20 34 30 0a 23 64 65 66           40.#def
1660: 69 6e 65 20 4d 41 52 4b 55 50 5f 54 48 20 20 20  ine MARKUP_TH   
1670: 20 20 20 20 20 20 20 20 20 20 20 20 34 31 0a 23              41.#
1680: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 54 52  define MARKUP_TR
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
16a0: 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  2.#define MARKUP
16b0: 5f 54 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _TT             
16c0: 20 20 34 33 0a 23 64 65 66 69 6e 65 20 4d 41 52    43.#define MAR
16d0: 4b 55 50 5f 55 20 20 20 20 20 20 20 20 20 20 20  KUP_U           
16e0: 20 20 20 20 20 34 34 0a 23 64 65 66 69 6e 65 20       44.#define 
16f0: 4d 41 52 4b 55 50 5f 55 4c 20 20 20 20 20 20 20  MARKUP_UL       
1700: 20 20 20 20 20 20 20 20 34 35 0a 23 64 65 66 69          45.#defi
1710: 6e 65 20 4d 41 52 4b 55 50 5f 56 41 52 20 20 20  ne MARKUP_VAR   
1720: 20 20 20 20 20 20 20 20 20 20 20 34 36 0a 23 64             46.#d
1730: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 56 45 52  efine MARKUP_VER
1740: 42 41 54 49 4d 20 20 20 20 20 20 20 20 20 34 37  BATIM         47
1750: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69  ../*.** The vari
1760: 6f 75 73 20 6d 61 72 6b 75 70 20 69 73 20 64 69  ous markup is di
1770: 76 69 64 65 64 20 69 6e 74 6f 20 74 68 65 20 66  vided into the f
1780: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 73 3a 0a  ollowing types:.
1790: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50  */.#define MUTYP
17a0: 45 5f 53 49 4e 47 4c 45 20 20 20 20 20 20 30 78  E_SINGLE      0x
17b0: 30 30 30 31 20 20 20 2f 2a 20 3c 69 6d 67 3e 2c  0001   /* <img>,
17c0: 20 3c 62 72 3e 2c 20 6f 72 20 3c 68 72 3e 20 2a   <br>, or <hr> *
17d0: 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45  /.#define MUTYPE
17e0: 5f 42 4c 4f 43 4b 20 20 20 20 20 20 20 30 78 30  _BLOCK       0x0
17f0: 30 30 32 20 20 20 2f 2a 20 46 6f 72 6d 73 20 61  002   /* Forms a
1800: 20 6e 65 77 20 70 61 72 61 67 72 61 70 68 2e 20   new paragraph. 
1810: 65 78 3a 20 3c 70 3e 2c 20 3c 68 32 3e 20 2a 2f  ex: <p>, <h2> */
1820: 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f  .#define MUTYPE_
1830: 46 4f 4e 54 20 20 20 20 20 20 20 20 30 78 30 30  FONT        0x00
1840: 30 34 20 20 20 2f 2a 20 46 6f 6e 74 20 63 68 61  04   /* Font cha
1850: 6e 67 65 73 2e 20 65 78 3a 20 3c 62 3e 2c 20 3c  nges. ex: <b>, <
1860: 66 6f 6e 74 3e 2c 20 3c 73 75 62 3e 20 2a 2f 0a  font>, <sub> */.
1870: 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 4c  #define MUTYPE_L
1880: 49 53 54 20 20 20 20 20 20 20 20 30 78 30 30 31  IST        0x001
1890: 30 20 20 20 2f 2a 20 4c 69 73 74 73 2e 20 20 3c  0   /* Lists.  <
18a0: 6f 6c 3e 2c 20 3c 75 6c 3e 2c 20 6f 72 20 3c 64  ol>, <ul>, or <d
18b0: 6c 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55  l> */.#define MU
18c0: 54 59 50 45 5f 4c 49 20 20 20 20 20 20 20 20 20  TYPE_LI         
18d0: 20 30 78 30 30 32 30 20 20 20 2f 2a 20 4c 69 73   0x0020   /* Lis
18e0: 74 20 69 74 65 6d 73 2e 20 20 3c 6c 69 3e 2c 20  t items.  <li>, 
18f0: 3c 64 64 3e 2c 20 3c 64 74 3e 20 2a 2f 0a 23 64  <dd>, <dt> */.#d
1900: 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 54 41 42  efine MUTYPE_TAB
1910: 4c 45 20 20 20 20 20 20 20 30 78 30 30 34 30 20  LE       0x0040 
1920: 20 20 2f 2a 20 3c 74 61 62 6c 65 3e 20 2a 2f 0a    /* <table> */.
1930: 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 54  #define MUTYPE_T
1940: 52 20 20 20 20 20 20 20 20 20 20 30 78 30 30 38  R          0x008
1950: 30 20 20 20 2f 2a 20 3c 74 72 3e 20 2a 2f 0a 23  0   /* <tr> */.#
1960: 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 54 44  define MUTYPE_TD
1970: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 30 30            0x0100
1980: 20 20 20 2f 2a 20 3c 74 64 3e 20 6f 72 20 3c 74     /* <td> or <t
1990: 68 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55  h> */.#define MU
19a0: 54 59 50 45 5f 53 50 45 43 49 41 4c 20 20 20 20  TYPE_SPECIAL    
19b0: 20 30 78 30 32 30 30 20 20 20 2f 2a 20 3c 6e 6f   0x0200   /* <no
19c0: 77 69 6b 69 3e 20 6f 72 20 3c 76 65 72 62 61 74  wiki> or <verbat
19d0: 69 6d 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  im> */.#define M
19e0: 55 54 59 50 45 5f 48 59 50 45 52 4c 49 4e 4b 20  UTYPE_HYPERLINK 
19f0: 20 20 30 78 30 34 30 30 20 20 20 2f 2a 20 3c 61    0x0400   /* <a
1a00: 3e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  > */../*.** Thes
1a10: 65 20 6d 61 72 6b 75 70 20 74 79 70 65 73 20 6d  e markup types m
1a20: 75 73 74 20 68 61 76 65 20 61 6e 20 65 6e 64 20  ust have an end 
1a30: 74 61 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tag..*/.#define 
1a40: 4d 55 54 59 50 45 5f 53 54 41 43 4b 20 20 28 4d  MUTYPE_STACK  (M
1a50: 55 54 59 50 45 5f 42 4c 4f 43 4b 20 7c 20 4d 55  UTYPE_BLOCK | MU
1a60: 54 59 50 45 5f 46 4f 4e 54 20 7c 20 4d 55 54 59  TYPE_FONT | MUTY
1a70: 50 45 5f 4c 49 53 54 20 7c 20 4d 55 54 59 50 45  PE_LIST | MUTYPE
1a80: 5f 54 41 42 4c 45 29 0a 0a 2f 2a 0a 2a 2a 20 54  _TABLE)../*.** T
1a90: 68 69 73 20 6d 61 72 6b 75 70 20 74 79 70 65 73  his markup types
1aa0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 66 6f 72   are allowed for
1ab0: 20 22 69 6e 6c 69 6e 65 22 20 74 65 78 74 2e 0a   "inline" text..
1ac0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50  */.#define MUTYP
1ad0: 45 5f 49 4e 4c 49 4e 45 20 28 4d 55 54 59 50 45  E_INLINE (MUTYPE
1ae0: 5f 46 4f 4e 54 20 7c 20 4d 55 54 59 50 45 5f 48  _FONT | MUTYPE_H
1af0: 59 50 45 52 4c 49 4e 4b 29 0a 0a 73 74 61 74 69  YPERLINK)..stati
1b00: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 41  c const struct A
1b10: 6c 6c 6f 77 65 64 4d 61 72 6b 75 70 20 7b 0a 20  llowedMarkup {. 
1b20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1b30: 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  me;       /* Nam
1b40: 65 20 6f 66 20 74 68 65 20 6d 61 72 6b 75 70 20  e of the markup 
1b50: 2a 2f 0a 20 20 63 68 61 72 20 69 43 6f 64 65 3b  */.  char iCode;
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b70: 20 54 68 65 20 4d 41 52 4b 55 50 5f 2a 20 63 6f   The MARKUP_* co
1b80: 64 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  de */.  short in
1b90: 74 20 69 54 79 70 65 3b 20 20 20 20 20 20 20 20  t iType;        
1ba0: 20 2f 2a 20 54 68 65 20 4d 55 54 59 50 45 5f 2a   /* The MUTYPE_*
1bb0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 61   code */.  int a
1bc0: 6c 6c 6f 77 65 64 41 74 74 72 3b 20 20 20 20 20  llowedAttr;     
1bd0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 61      /* Allowed a
1be0: 74 74 72 69 62 75 74 65 73 20 6f 6e 20 74 68 69  ttributes on thi
1bf0: 73 20 6d 61 72 6b 75 70 20 2a 2f 0a 7d 20 61 4d  s markup */.} aM
1c00: 61 72 6b 75 70 5b 5d 20 3d 20 7b 0a 20 7b 20 30  arkup[] = {. { 0
1c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c20: 4d 41 52 4b 55 50 5f 49 4e 56 41 4c 49 44 2c 20  MARKUP_INVALID, 
1c30: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
1c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c             0  },
1c50: 0a 20 7b 20 22 61 22 2c 20 20 20 20 20 20 20 20  . { "a",        
1c60: 20 20 20 20 20 4d 41 52 4b 55 50 5f 41 2c 20 20       MARKUP_A,  
1c70: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1c80: 5f 48 59 50 45 52 4c 49 4e 4b 2c 0a 20 20 20 20  _HYPERLINK,.    
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 41 54 54 52 5f 48 52 45 46 7c 41 54 54 52 5f 4e  ATTR_HREF|ATTR_N
1cb0: 41 4d 45 20 7d 2c 0a 20 7b 20 22 61 64 64 72 65  AME },. { "addre
1cc0: 73 73 22 2c 20 20 20 20 20 20 20 4d 41 52 4b 55  ss",       MARKU
1cd0: 50 5f 41 44 44 52 45 53 53 2c 20 20 20 20 20 20  P_ADDRESS,      
1ce0: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
1cf0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
1d00: 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b",             
1d10: 4d 41 52 4b 55 50 5f 42 2c 20 20 20 20 20 20 20  MARKUP_B,       
1d20: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
1d30: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
1d40: 0a 20 7b 20 22 62 69 67 22 2c 20 20 20 20 20 20  . { "big",      
1d50: 20 20 20 20 20 4d 41 52 4b 55 50 5f 42 49 47 2c       MARKUP_BIG,
1d60: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1d70: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
1d80: 30 20 20 7d 2c 0a 20 7b 20 22 62 6c 6f 63 6b 71  0  },. { "blockq
1d90: 75 6f 74 65 22 2c 20 20 20 20 4d 41 52 4b 55 50  uote",    MARKUP
1da0: 5f 42 4c 4f 43 4b 51 55 4f 54 45 2c 20 20 20 4d  _BLOCKQUOTE,   M
1db0: 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20  UTYPE_BLOCK,    
1dc0: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 62       0  },. { "b
1dd0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  r",            M
1de0: 41 52 4b 55 50 5f 42 52 2c 20 20 20 20 20 20 20  ARKUP_BR,       
1df0: 20 20 20 20 4d 55 54 59 50 45 5f 53 49 4e 47 4c      MUTYPE_SINGL
1e00: 45 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f 43  E,        ATTR_C
1e10: 4c 45 41 52 20 20 7d 2c 0a 20 7b 20 22 63 65 6e  LEAR  },. { "cen
1e20: 74 65 72 22 2c 20 20 20 20 20 20 20 20 4d 41 52  ter",        MAR
1e30: 4b 55 50 5f 43 45 4e 54 45 52 2c 20 20 20 20 20  KUP_CENTER,     
1e40: 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20    MUTYPE_BLOCK, 
1e50: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b          0  },. {
1e60: 20 22 63 69 74 65 22 2c 20 20 20 20 20 20 20 20   "cite",        
1e70: 20 20 4d 41 52 4b 55 50 5f 43 49 54 45 2c 20 20    MARKUP_CITE,  
1e80: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f         MUTYPE_FO
1e90: 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  NT,          0  
1ea0: 7d 2c 0a 20 7b 20 22 63 6f 64 65 22 2c 20 20 20  },. { "code",   
1eb0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 43 4f         MARKUP_CO
1ec0: 44 45 2c 20 20 20 20 20 20 20 20 20 4d 55 54 59  DE,         MUTY
1ed0: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
1ee0: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 64 64 22 2c    0  },. { "dd",
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b              MARK
1f00: 55 50 5f 44 44 2c 20 20 20 20 20 20 20 20 20 20  UP_DD,          
1f10: 20 4d 55 54 59 50 45 5f 4c 49 2c 20 20 20 20 20   MUTYPE_LI,     
1f20: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20         0  },. { 
1f30: 22 64 66 6e 22 2c 20 20 20 20 20 20 20 20 20 20  "dfn",          
1f40: 20 4d 41 52 4b 55 50 5f 44 46 4e 2c 20 20 20 20   MARKUP_DFN,    
1f50: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
1f60: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
1f70: 2c 0a 20 7b 20 22 64 6c 22 2c 20 20 20 20 20 20  ,. { "dl",      
1f80: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 4c 2c        MARKUP_DL,
1f90: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
1fa0: 45 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20  E_LIST,         
1fb0: 20 41 54 54 52 5f 43 4f 4d 50 41 43 54 20 7d 2c   ATTR_COMPACT },
1fc0: 0a 20 7b 20 22 64 74 22 2c 20 20 20 20 20 20 20  . { "dt",       
1fd0: 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 54 2c 20       MARKUP_DT, 
1fe0: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1ff0: 5f 4c 49 2c 20 20 20 20 20 20 20 20 20 20 20 20  _LI,            
2000: 30 20 20 7d 2c 0a 20 7b 20 22 65 6d 22 2c 20 20  0  },. { "em",  
2010: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2020: 5f 45 4d 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _EM,           M
2030: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2040: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 66       0  },. { "f
2050: 6f 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 4d  ont",          M
2060: 41 52 4b 55 50 5f 46 4f 4e 54 2c 20 20 20 20 20  ARKUP_FONT,     
2070: 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c      MUTYPE_FONT,
2080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2090: 20 20 20 20 20 41 54 54 52 5f 43 4f 4c 4f 52 7c       ATTR_COLOR|
20a0: 41 54 54 52 5f 46 41 43 45 7c 41 54 54 52 5f 53  ATTR_FACE|ATTR_S
20b0: 49 5a 45 20 20 20 7d 2c 0a 20 7b 20 22 68 31 22  IZE   },. { "h1"
20c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52  ,            MAR
20d0: 4b 55 50 5f 48 31 2c 20 20 20 20 20 20 20 20 20  KUP_H1,         
20e0: 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20    MUTYPE_BLOCK, 
20f0: 20 20 20 20 20 20 20 20 41 54 54 52 5f 41 4c 49          ATTR_ALI
2100: 47 4e 20 20 7d 2c 0a 20 7b 20 22 68 32 22 2c 20  GN  },. { "h2", 
2110: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2120: 50 5f 48 32 2c 20 20 20 20 20 20 20 20 20 20 20  P_H2,           
2130: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
2140: 20 20 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e        ATTR_ALIGN
2150: 20 20 7d 2c 0a 20 7b 20 22 68 33 22 2c 20 20 20    },. { "h3",   
2160: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2170: 48 33 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55  H3,           MU
2180: 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20  TYPE_BLOCK,     
2190: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 20 20      ATTR_ALIGN  
21a0: 7d 2c 0a 20 7b 20 22 68 34 22 2c 20 20 20 20 20  },. { "h4",     
21b0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 34         MARKUP_H4
21c0: 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59  ,           MUTY
21d0: 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20  PE_BLOCK,       
21e0: 20 20 41 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c    ATTR_ALIGN  },
21f0: 0a 20 7b 20 22 68 35 22 2c 20 20 20 20 20 20 20  . { "h5",       
2200: 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 35 2c 20       MARKUP_H5, 
2210: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2220: 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  _BLOCK,         
2230: 41 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20  ATTR_ALIGN  },. 
2240: 7b 20 22 68 36 22 2c 20 20 20 20 20 20 20 20 20  { "h6",         
2250: 20 20 20 4d 41 52 4b 55 50 5f 48 36 2c 20 20 20     MARKUP_H6,   
2260: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42          MUTYPE_B
2270: 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41 54  LOCK,         AT
2280: 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20  TR_ALIGN  },. { 
2290: 22 68 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  "hr",           
22a0: 20 4d 41 52 4b 55 50 5f 48 52 2c 20 20 20 20 20   MARKUP_HR,     
22b0: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 53 49 4e        MUTYPE_SIN
22c0: 47 4c 45 2c 20 20 20 20 20 20 20 20 0a 20 20 20  GLE,        .   
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41 54 54 52   ATTR_ALIGN|ATTR
22f0: 5f 43 4f 4c 4f 52 7c 41 54 54 52 5f 53 49 5a 45  _COLOR|ATTR_SIZE
2300: 7c 41 54 54 52 5f 57 49 44 54 48 20 20 7d 2c 0a  |ATTR_WIDTH  },.
2310: 20 7b 20 22 69 22 2c 20 20 20 20 20 20 20 20 20   { "i",         
2320: 20 20 20 20 4d 41 52 4b 55 50 5f 49 2c 20 20 20      MARKUP_I,   
2330: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2340: 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30  FONT,          0
2350: 20 20 7d 2c 0a 20 7b 20 22 69 6d 67 22 2c 20 20    },. { "img",  
2360: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2370: 49 4d 47 2c 20 20 20 20 20 20 20 20 20 20 4d 55  IMG,          MU
2380: 54 59 50 45 5f 53 49 4e 47 4c 45 2c 20 20 20 20  TYPE_SINGLE,    
2390: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
23a0: 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 41 4c           ATTR_AL
23b0: 49 47 4e 7c 41 54 54 52 5f 41 4c 54 7c 41 54 54  IGN|ATTR_ALT|ATT
23c0: 52 5f 42 4f 52 44 45 52 7c 41 54 54 52 5f 48 45  R_BORDER|ATTR_HE
23d0: 49 47 48 54 7c 0a 20 20 20 20 20 20 20 20 20 20  IGHT|.          
23e0: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 48            ATTR_H
23f0: 53 50 41 43 45 7c 41 54 54 52 5f 53 52 43 7c 41  SPACE|ATTR_SRC|A
2400: 54 54 52 5f 56 53 50 41 43 45 7c 41 54 54 52 5f  TTR_VSPACE|ATTR_
2410: 57 49 44 54 48 20 20 7d 2c 0a 20 7b 20 22 6b 62  WIDTH  },. { "kb
2420: 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 4d 41  d",           MA
2430: 52 4b 55 50 5f 4b 42 44 2c 20 20 20 20 20 20 20  RKUP_KBD,       
2440: 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20     MUTYPE_FONT, 
2450: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20           0  },. 
2460: 7b 20 22 6c 69 22 2c 20 20 20 20 20 20 20 20 20  { "li",         
2470: 20 20 20 4d 41 52 4b 55 50 5f 4c 49 2c 20 20 20     MARKUP_LI,   
2480: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 4c          MUTYPE_L
2490: 49 2c 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  I,            . 
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 41 54 54 52 5f 54 59 50 45 7c 41 54 54     ATTR_TYPE|ATT
24c0: 52 5f 56 41 4c 55 45 20 20 7d 2c 0a 20 7b 20 22  R_VALUE  },. { "
24d0: 6e 6f 62 72 22 2c 20 20 20 20 20 20 20 20 20 20  nobr",          
24e0: 4d 41 52 4b 55 50 5f 4e 4f 42 52 2c 20 20 20 20  MARKUP_NOBR,    
24f0: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
2500: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2510: 0a 20 7b 20 22 6e 6f 77 69 6b 69 22 2c 20 20 20  . { "nowiki",   
2520: 20 20 20 20 20 4d 41 52 4b 55 50 5f 4e 4f 57 49       MARKUP_NOWI
2530: 4b 49 2c 20 20 20 20 20 20 20 4d 55 54 59 50 45  KI,       MUTYPE
2540: 5f 53 50 45 43 49 41 4c 2c 20 20 20 20 20 20 20  _SPECIAL,       
2550: 30 20 20 7d 2c 0a 20 7b 20 22 6f 6c 22 2c 20 20  0  },. { "ol",  
2560: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2570: 5f 4f 4c 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _OL,           M
2580: 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20 20  UTYPE_LIST,     
2590: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
25a0: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 53            ATTR_S
25b0: 54 41 52 54 7c 41 54 54 52 5f 54 59 50 45 7c 41  TART|ATTR_TYPE|A
25c0: 54 54 52 5f 43 4f 4d 50 41 43 54 20 20 7d 2c 0a  TTR_COMPACT  },.
25d0: 20 7b 20 22 70 22 2c 20 20 20 20 20 20 20 20 20   { "p",         
25e0: 20 20 20 20 4d 41 52 4b 55 50 5f 50 2c 20 20 20      MARKUP_P,   
25f0: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2600: 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41  BLOCK,         A
2610: 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b  TTR_ALIGN  },. {
2620: 20 22 70 72 65 22 2c 20 20 20 20 20 20 20 20 20   "pre",         
2630: 20 20 4d 41 52 4b 55 50 5f 50 52 45 2c 20 20 20    MARKUP_PRE,   
2640: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c         MUTYPE_BL
2650: 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20  OCK,         0  
2660: 7d 2c 0a 20 7b 20 22 73 22 2c 20 20 20 20 20 20  },. { "s",      
2670: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 2c         MARKUP_S,
2680: 20 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59              MUTY
2690: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
26a0: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 73 61 6d 70    0  },. { "samp
26b0: 22 2c 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b  ",          MARK
26c0: 55 50 5f 53 41 4d 50 2c 20 20 20 20 20 20 20 20  UP_SAMP,        
26d0: 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20   MUTYPE_FONT,   
26e0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20         0  },. { 
26f0: 22 73 6d 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  "small",        
2700: 20 4d 41 52 4b 55 50 5f 53 4d 41 4c 4c 2c 20 20   MARKUP_SMALL,  
2710: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
2720: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
2730: 2c 0a 20 7b 20 22 73 74 72 69 6b 65 22 2c 20 20  ,. { "strike",  
2740: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 54 52        MARKUP_STR
2750: 49 4b 45 2c 20 20 20 20 20 20 20 4d 55 54 59 50  IKE,       MUTYP
2760: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
2770: 20 30 20 20 7d 2c 0a 20 7b 20 22 73 74 72 6f 6e   0  },. { "stron
2780: 67 22 2c 20 20 20 20 20 20 20 20 4d 41 52 4b 55  g",        MARKU
2790: 50 5f 53 54 52 4f 4e 47 2c 20 20 20 20 20 20 20  P_STRONG,       
27a0: 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20  MUTYPE_FONT,    
27b0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
27c0: 73 75 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  sub",           
27d0: 4d 41 52 4b 55 50 5f 53 55 42 2c 20 20 20 20 20  MARKUP_SUB,     
27e0: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
27f0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2800: 0a 20 7b 20 22 73 75 70 22 2c 20 20 20 20 20 20  . { "sup",      
2810: 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 55 50 2c       MARKUP_SUP,
2820: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2830: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
2840: 30 20 20 7d 2c 0a 20 7b 20 22 74 61 62 6c 65 22  0  },. { "table"
2850: 2c 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50  ,         MARKUP
2860: 5f 54 41 42 4c 45 2c 20 20 20 20 20 20 20 20 4d  _TABLE,        M
2870: 55 54 59 50 45 5f 54 41 42 4c 45 2c 20 20 20 20  UTYPE_TABLE,    
2880: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
2890: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 41            ATTR_A
28a0: 4c 49 47 4e 7c 41 54 54 52 5f 42 47 43 4f 4c 4f  LIGN|ATTR_BGCOLO
28b0: 52 7c 41 54 54 52 5f 42 4f 52 44 45 52 7c 41 54  R|ATTR_BORDER|AT
28c0: 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e 47 7c 0a  TR_CELLPADDING|.
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 43 45 4c 4c 53 50 41      ATTR_CELLSPA
28f0: 43 49 4e 47 7c 41 54 54 52 5f 48 53 50 41 43 45  CING|ATTR_HSPACE
2900: 7c 41 54 54 52 5f 56 53 50 41 43 45 20 20 7d 2c  |ATTR_VSPACE  },
2910: 0a 20 7b 20 22 74 64 22 2c 20 20 20 20 20 20 20  . { "td",       
2920: 20 20 20 20 20 4d 41 52 4b 55 50 5f 54 44 2c 20       MARKUP_TD, 
2930: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2940: 5f 54 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  _TD,            
2950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2960: 20 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c       ATTR_ALIGN|
2970: 41 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 41 54 54  ATTR_BGCOLOR|ATT
2980: 52 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20  R_COLSPAN|.     
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
29a0: 54 54 52 5f 52 4f 57 53 50 41 4e 7c 41 54 54 52  TTR_ROWSPAN|ATTR
29b0: 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22  _VALIGN  },. { "
29c0: 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
29d0: 4d 41 52 4b 55 50 5f 54 48 2c 20 20 20 20 20 20  MARKUP_TH,      
29e0: 20 20 20 20 20 4d 55 54 59 50 45 5f 54 44 2c 0a       MUTYPE_TD,.
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
2a10: 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 41 54 54 52  TTR_BGCOLOR|ATTR
2a20: 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20 20  _COLSPAN|.      
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 54                AT
2a40: 54 52 5f 52 4f 57 53 50 41 4e 7c 41 54 54 52 5f  TR_ROWSPAN|ATTR_
2a50: 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 74  VALIGN  },. { "t
2a60: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  r",            M
2a70: 41 52 4b 55 50 5f 54 52 2c 20 20 20 20 20 20 20  ARKUP_TR,       
2a80: 20 20 20 20 4d 55 54 59 50 45 5f 54 52 2c 20 0a      MUTYPE_TR, .
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
2ab0: 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 7c 41 54 54  TTR_BGCOLOR||ATT
2ac0: 52 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20  R_VALIGN  },. { 
2ad0: 22 74 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  "tt",           
2ae0: 20 4d 41 52 4b 55 50 5f 54 54 2c 20 20 20 20 20   MARKUP_TT,     
2af0: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
2b00: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
2b10: 2c 0a 20 7b 20 22 75 22 2c 20 20 20 20 20 20 20  ,. { "u",       
2b20: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 55 2c 20        MARKUP_U, 
2b30: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
2b40: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
2b50: 20 30 20 20 7d 2c 0a 20 7b 20 22 75 6c 22 2c 20   0  },. { "ul", 
2b60: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2b70: 50 5f 55 4c 2c 20 20 20 20 20 20 20 20 20 20 20  P_UL,           
2b80: 4d 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20  MUTYPE_LIST,    
2b90: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
2ba0: 20 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f             ATTR_
2bb0: 54 59 50 45 7c 41 54 54 52 5f 43 4f 4d 50 41 43  TYPE|ATTR_COMPAC
2bc0: 54 20 20 7d 2c 0a 20 7b 20 22 76 61 72 22 2c 20  T  },. { "var", 
2bd0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2be0: 5f 56 41 52 2c 20 20 20 20 20 20 20 20 20 20 4d  _VAR,          M
2bf0: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2c00: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 76       0  },. { "v
2c10: 65 72 62 61 74 69 6d 22 2c 20 20 20 20 20 20 4d  erbatim",      M
2c20: 41 52 4b 55 50 5f 56 45 52 42 41 54 49 4d 2c 20  ARKUP_VERBATIM, 
2c30: 20 20 20 20 4d 55 54 59 50 45 5f 53 50 45 43 49      MUTYPE_SPECI
2c40: 41 4c 2c 20 20 20 20 20 20 20 41 54 54 52 5f 49  AL,       ATTR_I
2c50: 44 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55  D },.};../*.** U
2c60: 73 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  se binary search
2c70: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 74 61 67   to locate a tag
2c80: 20 69 6e 20 74 68 65 20 61 4d 61 72 6b 75 70 5b   in the aMarkup[
2c90: 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ] table..*/.stat
2ca0: 69 63 20 69 6e 74 20 66 69 6e 64 54 61 67 28 63  ic int findTag(c
2cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
2cc0: 20 69 6e 74 20 69 2c 20 63 2c 20 66 69 72 73 74   int i, c, first
2cd0: 2c 20 6c 61 73 74 3b 0a 20 20 66 69 72 73 74 20  , last;.  first 
2ce0: 3d 20 31 3b 0a 20 20 6c 61 73 74 20 3d 20 73 69  = 1;.  last = si
2cf0: 7a 65 6f 66 28 61 4d 61 72 6b 75 70 29 2f 73 69  zeof(aMarkup)/si
2d00: 7a 65 6f 66 28 61 4d 61 72 6b 75 70 5b 30 5d 29  zeof(aMarkup[0])
2d10: 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 66   - 1;.  while( f
2d20: 69 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20  irst<=last ){.  
2d30: 20 20 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73    i = (first+las
2d40: 74 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 74  t)/2;.    c = st
2d50: 72 63 6d 70 28 61 4d 61 72 6b 75 70 5b 69 5d 2e  rcmp(aMarkup[i].
2d60: 7a 4e 61 6d 65 2c 20 7a 29 3b 0a 20 20 20 20 69  zName, z);.    i
2d70: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
2d80: 20 61 73 73 65 72 74 28 20 61 4d 61 72 6b 75 70   assert( aMarkup
2d90: 5b 69 5d 2e 69 43 6f 64 65 3d 3d 69 20 29 3b 0a  [i].iCode==i );.
2da0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
2db0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c      }else if( c<
2dc0: 30 20 29 7b 0a 20 20 20 20 20 20 66 69 72 73 74  0 ){.      first
2dd0: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 65 6c 73   = i+1;.    }els
2de0: 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  e{.      last = 
2df0: 69 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i-1;.    }.  }. 
2e00: 20 72 65 74 75 72 6e 20 4d 41 52 4b 55 50 5f 49   return MARKUP_I
2e10: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
2e20: 20 54 6f 6b 65 6e 20 74 79 70 65 73 0a 2a 2f 0a   Token types.*/.
2e30: 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 4d 41  #define TOKEN_MA
2e40: 52 4b 55 50 20 20 20 20 20 20 20 20 31 20 20 20  RKUP        1   
2e50: 20 2f 2a 20 3c 2e 2e 2e 3e 20 2a 2f 0a 23 64 65   /* <...> */.#de
2e60: 66 69 6e 65 20 54 4f 4b 45 4e 5f 43 48 41 52 41  fine TOKEN_CHARA
2e70: 43 54 45 52 20 20 20 20 20 32 20 20 20 20 2f 2a  CTER     2    /*
2e80: 20 22 26 22 20 6f 72 20 22 3c 22 20 6e 6f 74 20   "&" or "<" not 
2e90: 70 61 72 74 20 6f 66 20 6d 61 72 6b 75 70 20 2a  part of markup *
2ea0: 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f  /.#define TOKEN_
2eb0: 4c 49 4e 4b 20 20 20 20 20 20 20 20 20 20 33 20  LINK          3 
2ec0: 20 20 20 2f 2a 20 5b 2e 2e 2e 5d 20 2a 2f 0a 23     /* [...] */.#
2ed0: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 50 41 52  define TOKEN_PAR
2ee0: 41 47 52 41 50 48 20 20 20 20 20 34 20 20 20 20  AGRAPH     4    
2ef0: 2f 2a 20 62 6c 61 6e 6b 20 6c 69 6e 65 73 20 2a  /* blank lines *
2f00: 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f  /.#define TOKEN_
2f10: 4e 45 57 4c 49 4e 45 20 20 20 20 20 20 20 35 20  NEWLINE       5 
2f20: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 22     /* A single "
2f30: 5c 6e 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  \n" */.#define T
2f40: 4f 4b 45 4e 5f 42 55 4c 4c 45 54 20 20 20 20 20  OKEN_BULLET     
2f50: 20 20 20 36 20 20 20 20 2f 2a 20 20 22 20 20 2a     6    /*  "  *
2f60: 20 20 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54    " */.#define T
2f70: 4f 4b 45 4e 5f 45 4e 55 4d 20 20 20 20 20 20 20  OKEN_ENUM       
2f80: 20 20 20 37 20 20 20 20 2f 2a 20 20 22 20 20 5c     7    /*  "  \
2f90: 28 3f 5c 64 2b 5b 2e 29 5d 3f 20 20 22 20 2a 2f  (?\d+[.)]?  " */
2fa0: 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 49  .#define TOKEN_I
2fb0: 4e 44 45 4e 54 20 20 20 20 20 20 20 20 38 20 20  NDENT        8  
2fc0: 20 20 2f 2a 20 20 22 20 20 20 22 20 2a 2f 0a 23    /*  "   " */.#
2fd0: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 54 45 58  define TOKEN_TEX
2fe0: 54 20 20 20 20 20 20 20 20 20 20 39 20 20 20 20  T          9    
2ff0: 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 61  /* None of the a
3000: 62 6f 76 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  bove */../*.** S
3010: 74 61 74 65 20 66 6c 61 67 73 0a 2a 2f 0a 23 64  tate flags.*/.#d
3020: 65 66 69 6e 65 20 41 54 5f 4e 45 57 4c 49 4e 45  efine AT_NEWLINE
3030: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 31 20            0x001 
3040: 20 2f 2a 20 41 74 20 73 74 61 72 74 20 6f 66 20   /* At start of 
3050: 61 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e  a line */.#defin
3060: 65 20 41 54 5f 50 41 52 41 47 52 41 50 48 20 20  e AT_PARAGRAPH  
3070: 20 20 20 20 20 20 30 78 30 30 32 20 20 2f 2a 20        0x002  /* 
3080: 41 74 20 73 74 61 72 74 20 6f 66 20 61 20 70 61  At start of a pa
3090: 72 61 67 72 61 70 68 20 2a 2f 0a 23 64 65 66 69  ragraph */.#defi
30a0: 6e 65 20 41 4c 4c 4f 57 5f 57 49 4b 49 20 20 20  ne ALLOW_WIKI   
30b0: 20 20 20 20 20 20 20 30 78 30 30 34 20 20 2f 2a         0x004  /*
30c0: 20 41 6c 6c 6f 77 20 77 69 6b 69 20 6d 61 72 6b   Allow wiki mark
30d0: 75 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  up */.#define FO
30e0: 4e 54 5f 4d 41 52 4b 55 50 5f 4f 4e 4c 59 20 20  NT_MARKUP_ONLY  
30f0: 20 20 30 78 30 30 38 20 20 2f 2a 20 4f 6e 6c 79    0x008  /* Only
3100: 20 61 6c 6c 6f 77 20 4d 55 54 59 50 45 5f 46 4f   allow MUTYPE_FO
3110: 4e 54 20 6d 61 72 6b 75 70 20 2a 2f 0a 23 64 65  NT markup */.#de
3120: 66 69 6e 65 20 49 4e 4c 49 4e 45 5f 4d 41 52 4b  fine INLINE_MARK
3130: 55 50 5f 4f 4e 4c 59 20 20 30 78 30 31 30 20 20  UP_ONLY  0x010  
3140: 2f 2a 20 41 6c 6c 6f 77 20 6f 6e 6c 79 20 22 69  /* Allow only "i
3150: 6e 6c 69 6e 65 22 20 6d 61 72 6b 75 70 20 2a 2f  nline" markup */
3160: 0a 23 64 65 66 69 6e 65 20 49 4e 5f 4c 49 53 54  .#define IN_LIST
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
3180: 32 30 20 20 2f 2a 20 57 69 74 68 69 6e 20 77 69  20  /* Within wi
3190: 6b 69 20 3c 75 6c 3e 20 6f 72 20 3c 6f 6c 3e 20  ki <ul> or <ol> 
31a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  */../*.** Curren
31b0: 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 72  t state of the r
31c0: 65 6e 64 65 72 69 6e 67 20 65 6e 67 69 6e 65 0a  endering engine.
31d0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
31e0: 74 20 52 65 6e 64 65 72 65 72 20 52 65 6e 64 65  t Renderer Rende
31f0: 72 65 72 3b 0a 73 74 72 75 63 74 20 52 65 6e 64  rer;.struct Rend
3200: 65 72 65 72 20 7b 0a 20 20 42 6c 6f 62 20 2a 70  erer {.  Blob *p
3210: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
3220: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 61       /* Output a
3230: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73 20  ppended to this 
3240: 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 73 74  blob */.  int st
3250: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3260: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 68        /* Flag th
3270: 61 74 20 67 6f 76 65 72 6e 20 72 65 6e 64 65 72  at govern render
3280: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 77 69 6b  ing */.  int wik
3290: 69 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  iList;          
32a0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
32b0: 77 69 6b 69 20 6c 69 73 74 20 74 79 70 65 20 2a  wiki list type *
32c0: 2f 0a 20 20 69 6e 74 20 69 6e 56 65 72 62 61 74  /.  int inVerbat
32d0: 69 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  im;             
32e0: 2f 2a 20 54 72 75 65 20 69 6e 20 3c 76 65 72 62  /* True in <verb
32f0: 61 74 69 6d 3e 20 6d 6f 64 65 20 2a 2f 0a 20 20  atim> mode */.  
3300: 69 6e 74 20 70 72 65 56 65 72 62 53 74 61 74 65  int preVerbState
3310: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
3320: 61 6c 75 65 20 6f 66 20 73 74 61 74 65 20 70 72  alue of state pr
3330: 69 6f 72 20 74 6f 20 76 65 72 62 61 74 69 6d 20  ior to verbatim 
3340: 2a 2f 0a 20 20 69 6e 74 20 77 61 6e 74 41 75 74  */.  int wantAut
3350: 6f 50 61 72 61 67 72 61 70 68 3b 20 20 20 20 20  oParagraph;     
3360: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 3c 70   /* True if a <p
3370: 3e 20 69 73 20 64 65 73 69 72 65 64 20 2a 2f 0a  > is desired */.
3380: 20 20 69 6e 74 20 69 6e 41 75 74 6f 50 61 72 61    int inAutoPara
3390: 67 72 61 70 68 3b 20 20 20 20 20 20 20 20 2f 2a  graph;        /*
33a0: 20 54 72 75 65 20 69 66 20 77 69 74 68 69 6e 20   True if within 
33b0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 70 61 72  an automatic par
33c0: 61 67 72 61 70 68 20 2a 2f 0a 20 20 63 6f 6e 73  agraph */.  cons
33d0: 74 20 63 68 61 72 20 2a 7a 56 65 72 62 61 74 69  t char *zVerbati
33e0: 6d 49 64 3b 20 20 20 20 2f 2a 20 54 68 65 20 69  mId;    /* The i
33f0: 64 3d 20 61 74 74 72 69 62 75 74 65 20 6f 66 20  d= attribute of 
3400: 3c 76 65 72 62 61 74 69 6d 3e 20 2a 2f 0a 20 20  <verbatim> */.  
3410: 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20  int nStack;     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3430: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3440: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2a  s on the stack *
3450: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
3480: 65 64 20 66 6f 72 20 61 53 74 61 63 6b 20 2a 2f  ed for aStack */
3490: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
34a0: 20 2a 61 53 74 61 63 6b 3b 20 20 20 20 20 20 2f   *aStack;      /
34b0: 2a 20 4f 70 65 6e 20 6d 61 72 6b 75 70 20 73 74  * Open markup st
34c0: 61 63 6b 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  ack */.};.../*.*
34d0: 2a 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  * z points to a 
34e0: 22 3c 22 20 63 68 61 72 61 63 74 65 72 2e 20 20  "<" character.  
34f0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
3500: 74 68 69 73 20 69 73 20 74 68 65 20 73 74 61 72  this is the star
3510: 74 20 6f 66 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t of.** a valid 
3520: 6d 61 72 6b 75 70 2e 20 20 49 66 20 69 74 20 69  markup.  If it i
3530: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 74 6f  s, return the to
3540: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  tal number of ch
3550: 61 72 61 63 74 65 72 73 20 69 6e 0a 2a 2a 20 74  aracters in.** t
3560: 68 65 20 6d 61 72 6b 75 70 20 69 6e 63 6c 75 64  he markup includ
3570: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ing the initial 
3580: 22 3c 22 20 61 6e 64 20 74 68 65 20 74 65 72 6d  "<" and the term
3590: 69 6e 61 74 69 6e 67 20 22 3e 22 2e 20 20 49 66  inating ">".  If
35a0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 77 65  .** it is not we
35b0: 6c 6c 2d 66 6f 72 6d 65 64 20 6d 61 72 6b 75 70  ll-formed markup
35c0: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
35d0: 74 61 74 69 63 20 69 6e 74 20 6d 61 72 6b 75 70  tatic int markup
35e0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
35f0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
3600: 20 31 3b 0a 20 20 69 6e 74 20 69 6e 70 61 72 65   1;.  int inpare
3610: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 5b 6e  n = 0;.  if( z[n
3620: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2b 2b 3b 20 7d  ]=='/' ){ n++; }
3630: 0a 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28  .  if( !isalpha(
3640: 7a 5b 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30  z[n]) ) return 0
3650: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 61 6c 6e  ;.  while( isaln
3660: 75 6d 28 7a 5b 6e 5d 29 20 29 7b 20 6e 2b 2b 3b  um(z[n]) ){ n++;
3670: 20 7d 0a 20 20 69 66 28 20 7a 5b 6e 5d 21 3d 27   }.  if( z[n]!='
3680: 3e 27 20 26 26 20 21 69 73 73 70 61 63 65 28 7a  >' && !isspace(z
3690: 5b 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b  [n]) ) return 0;
36a0: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 20 26  .  while( z[n] &
36b0: 26 20 28 7a 5b 6e 5d 21 3d 27 3e 27 20 7c 7c 20  & (z[n]!='>' || 
36c0: 69 6e 70 61 72 65 6e 29 20 29 7b 0a 20 20 20 20  inparen) ){.    
36d0: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 22 27 20 29 7b  if( z[n]=='"' ){
36e0: 0a 20 20 20 20 20 20 69 6e 70 61 72 65 6e 20 3d  .      inparen =
36f0: 20 21 69 6e 70 61 72 65 6e 3b 0a 20 20 20 20 7d   !inparen;.    }
3700: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
3710: 69 66 28 20 7a 5b 6e 5d 21 3d 27 3e 27 20 29 20  if( z[n]!='>' ) 
3720: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
3730: 72 6e 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn n+1;.}../*.**
3740: 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 22   z points to a "
3750: 5c 6e 22 20 63 68 61 72 61 63 74 65 72 2e 20 20  \n" character.  
3760: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
3770: 74 68 69 73 20 6e 65 77 6c 69 6e 65 20 69 73 0a  this newline is.
3780: 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6f  ** followed by o
3790: 6e 65 20 6f 72 20 6d 6f 72 65 20 62 6c 61 6e 6b  ne or more blank
37a0: 20 6c 69 6e 65 73 2e 20 20 49 66 20 69 74 20 69   lines.  If it i
37b0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
37c0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 68 61 72 61  mber.** of chara
37d0: 63 74 65 72 73 20 74 68 72 6f 75 67 68 20 74 68  cters through th
37e0: 65 20 63 6c 6f 73 69 6e 67 20 22 5c 6e 22 2e 20  e closing "\n". 
37f0: 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
3800: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3810: 20 70 61 72 61 67 72 61 70 68 42 72 65 61 6b 4c   paragraphBreakL
3820: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
3830: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e   *z){.  int i, n
3840: 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 6c 69 6e 65  ;.  int nNewline
3850: 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 2c   = 1;.  for(i=1,
3860: 20 6e 3d 30 3b 20 69 73 73 70 61 63 65 28 7a 5b   n=0; isspace(z[
3870: 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i]); i++){.    i
3880: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b  f( z[i]=='\n' ){
3890: 0a 20 20 20 20 20 20 6e 4e 65 77 6c 69 6e 65 2b  .      nNewline+
38a0: 2b 3b 0a 20 20 20 20 20 20 6e 20 3d 20 69 3b 0a  +;.      n = i;.
38b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
38c0: 6e 4e 65 77 6c 69 6e 65 3e 3d 32 20 29 7b 0a 20  nNewline>=2 ){. 
38d0: 20 20 20 72 65 74 75 72 6e 20 6e 2b 31 3b 0a 20     return n+1;. 
38e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
38f0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
3900: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
3910: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
3920: 72 73 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  rs until the nex
3930: 74 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 0a  t "interesting".
3940: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ** characters..*
3950: 2a 0a 2a 2a 20 49 6e 74 65 72 65 73 74 69 6e 67  *.** Interesting
3960: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 3a   characters are:
3970: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 0a 2a 2a  .**.**      <.**
3980: 20 20 20 20 20 20 26 0a 2a 2a 20 20 20 20 20 20        &.**      
3990: 5c 6e 0a 2a 2a 20 20 20 20 20 20 5b 0a 2a 2a 0a  \n.**      [.**.
39a0: 2a 2a 20 54 68 65 20 22 5b 22 20 61 6e 64 20 22  ** The "[" and "
39b0: 5c 6e 22 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  \n" are only con
39c0: 73 69 64 65 72 65 64 20 69 6e 74 65 72 65 73 74  sidered interest
39d0: 69 6e 67 20 69 66 20 74 68 65 20 22 75 73 65 57  ing if the "useW
39e0: 69 6b 69 22 0a 2a 2a 20 66 6c 61 67 20 69 73 20  iki".** flag is 
39f0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
3a00: 6e 74 20 74 65 78 74 4c 65 6e 67 74 68 28 63 6f  nt textLength(co
3a10: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
3a20: 20 75 73 65 57 69 6b 69 29 7b 0a 20 20 69 6e 74   useWiki){.  int
3a30: 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b   n = 0;.  int c;
3a40: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
3a50: 5b 30 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 3c  [0])!=0 && c!='<
3a60: 27 20 26 26 20 63 21 3d 27 26 27 20 26 26 0a 20  ' && c!='&' &&. 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
3a80: 73 65 57 69 6b 69 3d 3d 30 20 7c 7c 20 28 63 21  seWiki==0 || (c!
3a90: 3d 27 5b 27 20 26 26 20 63 21 3d 27 5c 6e 27 29  ='[' && c!='\n')
3aa0: 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
3ab0: 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    z++;.  }.  ret
3ac0: 75 72 6e 20 6e 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn n; .}../*.**
3ad0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3ae0: 7a 5b 5d 20 62 65 67 69 6e 73 20 77 69 74 68 20  z[] begins with 
3af0: 61 6e 20 48 54 4d 4c 20 63 68 61 72 61 63 74 65  an HTML characte
3b00: 72 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  r element..*/.st
3b10: 61 74 69 63 20 69 6e 74 20 69 73 45 6c 65 6d 65  atic int isEleme
3b20: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  nt(const char *z
3b30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
3b40: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 26 27 20  sert( z[0]=='&' 
3b50: 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  );.  if( z[1]=='
3b60: 23 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  #' ){.    for(i=
3b70: 32 3b 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29  2; isdigit(z[i])
3b80: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 72 65 74  ; i++){}.    ret
3b90: 75 72 6e 20 69 3e 32 20 26 26 20 7a 5b 69 5d 3d  urn i>2 && z[i]=
3ba0: 3d 27 3b 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =';';.  }else{. 
3bb0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 61 6c     for(i=1; isal
3bc0: 70 68 61 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  pha(z[i]); i++){
3bd0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3e 31  }.    return i>1
3be0: 20 26 26 20 7a 5b 69 5d 3d 3d 27 3b 27 3b 0a 20   && z[i]==';';. 
3bf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
3c00: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
3c10: 7a 5b 5d 20 73 74 72 69 6e 67 20 69 73 20 74 68  z[] string is th
3c20: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
3c30: 20 77 69 6b 69 20 62 75 6c 6c 65 74 2e 0a 2a 2a   wiki bullet..**
3c40: 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72   If it is, retur
3c50: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
3c60: 74 68 65 20 62 75 6c 6c 65 74 20 74 65 78 74 2e  the bullet text.
3c70: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
3c80: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3c90: 69 6e 74 20 62 75 6c 6c 65 74 4c 65 6e 67 74 68  int bulletLength
3ca0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
3cb0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 6e  .  int i, n;.  n
3cc0: 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   = 0;.  i = 0;. 
3cd0: 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20   while( z[n]==' 
3ce0: 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20  ' || z[n]=='\t' 
3cf0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d  ){.    if( z[n]=
3d00: 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\t' ) i++;.   
3d10: 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20   i++;.    n++;. 
3d20: 20 7d 0a 20 20 69 66 28 20 69 3c 32 20 7c 7c 20   }.  if( i<2 || 
3d30: 7a 5b 6e 5d 21 3d 27 2a 27 20 29 20 72 65 74 75  z[n]!='*' ) retu
3d40: 72 6e 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 20 20 69  rn 0;.  n++;.  i
3d50: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a   = 0;.  while( z
3d60: 5b 6e 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d  [n]==' ' || z[n]
3d70: 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 69 66  =='\t' ){.    if
3d80: 28 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 20 69  ( z[n]=='\t' ) i
3d90: 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20  ++;.    i++;.   
3da0: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n++;.  }.  if( 
3db0: 69 3c 32 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  i<2 || isspace(z
3dc0: 5b 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b  [n]) ) return 0;
3dd0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
3de0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
3df0: 65 65 20 69 66 20 74 68 65 20 7a 5b 5d 20 73 74  ee if the z[] st
3e00: 72 69 6e 67 20 69 73 20 74 68 65 20 62 65 67 69  ring is the begi
3e10: 6e 6e 69 6e 67 20 6f 66 20 61 20 65 6e 75 6d 65  nning of a enume
3e20: 72 61 74 69 6f 6e 20 76 61 6c 75 65 2e 0a 2a 2a  ration value..**
3e30: 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72   If it is, retur
3e40: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
3e50: 74 68 65 20 62 75 6c 6c 65 74 20 74 65 78 74 2e  the bullet text.
3e60: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
3e70: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 74  rn 0..**.** Synt
3e80: 61 78 3a 0a 2a 2a 20 20 20 20 2a 20 20 61 20 74  ax:.**    *  a t
3e90: 61 62 20 6f 72 20 74 77 6f 20 6f 72 20 6d 6f 72  ab or two or mor
3ea0: 65 20 73 70 61 63 65 73 0a 2a 2a 20 20 20 20 2a  e spaces.**    *
3eb0: 20 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69    one or more di
3ec0: 67 69 74 73 0a 2a 2a 20 20 20 20 2a 20 20 6f 70  gits.**    *  op
3ed0: 74 69 6f 6e 61 6c 20 22 2e 22 0a 2a 2a 20 20 20  tional ".".**   
3ee0: 20 2a 20 20 61 6e 6f 74 68 65 72 20 74 61 62 20   *  another tab 
3ef0: 6f 72 20 74 77 6f 20 6f 72 65 20 6d 6f 72 65 20  or two ore more 
3f00: 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2f 0a 73 74  spaces..**.*/.st
3f10: 61 74 69 63 20 69 6e 74 20 65 6e 75 6d 4c 65 6e  atic int enumLen
3f20: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
3f30: 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  z){.  int i, n;.
3f40: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30    n = 0;.  i = 0
3f50: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d  ;.  while( z[n]=
3f60: 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c  =' ' || z[n]=='\
3f70: 74 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  t' ){.    if( z[
3f80: 6e 5d 3d 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a  n]=='\t' ) i++;.
3f90: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b      i++;.    n++
3fa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 32 20  ;.  }.  if( i<2 
3fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
3fc0: 72 28 69 3d 30 3b 20 69 73 64 69 67 69 74 28 7a  r(i=0; isdigit(z
3fd0: 5b 6e 5d 29 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b  [n]); i++, n++){
3fe0: 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 20 72  }.  if( i==0 ) r
3ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a  eturn 0;.  if( z
4000: 5b 6e 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [n]=='.' ){.    
4010: 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 30  n++;.  }.  i = 0
4020: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d  ;.  while( z[n]=
4030: 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c  =' ' || z[n]=='\
4040: 74 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  t' ){.    if( z[
4050: 6e 5d 3d 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a  n]=='\t' ) i++;.
4060: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b      i++;.    n++
4070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 32 20  ;.  }.  if( i<2 
4080: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 5d 29  || isspace(z[n])
4090: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
40a0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
40b0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
40c0: 66 20 74 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  f the z[] string
40d0: 20 69 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   is the beginnin
40e0: 67 20 6f 66 20 61 6e 20 69 6e 64 65 6e 74 65 64  g of an indented
40f0: 0a 2a 2a 20 70 61 72 61 67 72 61 70 68 2e 20 20  .** paragraph.  
4100: 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72 6e  If it is, return
4110: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
4120: 68 65 20 69 6e 64 65 6e 74 2e 20 20 4f 74 68 65  he indent.  Othe
4130: 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
4140: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
4150: 20 69 6e 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f   indentLength(co
4160: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
4170: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 6e 20 3d 20  int i, n;.  n = 
4180: 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68  0;.  i = 0;.  wh
4190: 69 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20 27 20 7c  ile( z[n]==' ' |
41a0: 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 7b 0a  | z[n]=='\t' ){.
41b0: 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c      if( z[n]=='\
41c0: 74 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 2b  t' ) i++;.    i+
41d0: 2b 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  +;.    n++;.  }.
41e0: 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 69 73 73    if( i<2 || iss
41f0: 70 61 63 65 28 7a 5b 6e 5d 29 20 29 20 72 65 74  pace(z[n]) ) ret
4200: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4210: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  n;.}../*.** Chec
4220: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
4230: 7a 5b 5d 20 73 74 72 69 6e 67 20 69 73 20 61 20  z[] string is a 
4240: 77 69 6b 69 20 68 79 70 65 72 6c 69 6e 6b 2e 20  wiki hyperlink. 
4250: 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 72 65   If it is,.** re
4260: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
4270: 6f 66 20 74 68 65 20 68 79 70 65 72 6c 69 6e 6b  of the hyperlink
4280: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
4290: 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
42a0: 20 69 6e 74 20 6c 69 6e 6b 4c 65 6e 67 74 68 28   int linkLength(
42b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
42c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
42d0: 74 28 20 7a 5b 30 5d 3d 3d 27 5b 27 20 29 3b 0a  t( z[0]=='[' );.
42e0: 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20    for(n=0; z[n] 
42f0: 26 26 20 7a 5b 6e 5d 21 3d 27 5d 27 3b 20 6e 2b  && z[n]!=']'; n+
4300: 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 5b 6e 5d 3d  +){}.  if( z[n]=
4310: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 72 65 74 75  =']' ){.    retu
4320: 72 6e 20 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  rn n+1;.  }else{
4330: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4340: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 7a 20 70   }.}.../*.** z p
4350: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
4360: 72 74 20 6f 66 20 61 20 74 6f 6b 65 6e 2e 20 20  rt of a token.  
4370: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4380: 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  r of.** characte
4390: 72 73 20 69 6e 20 74 68 61 74 20 74 6f 6b 65 6e  rs in that token
43a0: 2e 20 20 57 72 69 74 65 20 74 68 65 20 74 6f 6b  .  Write the tok
43b0: 65 6e 20 74 79 70 65 20 69 6e 74 6f 20 2a 70 54  en type into *pT
43c0: 6f 6b 65 6e 54 79 70 65 2e 0a 2a 2f 0a 73 74 61  okenType..*/.sta
43d0: 74 69 63 20 69 6e 74 20 6e 65 78 74 54 6f 6b 65  tic int nextToke
43e0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
43f0: 20 52 65 6e 64 65 72 65 72 20 2a 70 2c 20 69 6e   Renderer *p, in
4400: 74 20 2a 70 54 6f 6b 65 6e 54 79 70 65 29 7b 0a  t *pTokenType){.
4410: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 7a    int n;.  if( z
4420: 5b 30 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [0]=='<' ){.    
4430: 6e 20 3d 20 6d 61 72 6b 75 70 4c 65 6e 67 74 68  n = markupLength
4440: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30  (z);.    if( n>0
4450: 20 29 7b 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65   ){.      *pToke
4460: 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 4d 41  nType = TOKEN_MA
4470: 52 4b 55 50 3b 0a 20 20 20 20 20 20 72 65 74 75  RKUP;.      retu
4480: 72 6e 20 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn n;.    }else{
4490: 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79  .      *pTokenTy
44a0: 70 65 20 3d 20 54 4f 4b 45 4e 5f 43 48 41 52 41  pe = TOKEN_CHARA
44b0: 43 54 45 52 3b 0a 20 20 20 20 20 20 72 65 74 75  CTER;.      retu
44c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
44d0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 26 27 20    if( z[0]=='&' 
44e0: 26 26 20 28 70 2d 3e 69 6e 56 65 72 62 61 74 69  && (p->inVerbati
44f0: 6d 20 7c 7c 20 21 69 73 45 6c 65 6d 65 6e 74 28  m || !isElement(
4500: 7a 29 29 20 29 7b 0a 20 20 20 20 2a 70 54 6f 6b  z)) ){.    *pTok
4510: 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 43  enType = TOKEN_C
4520: 48 41 52 41 43 54 45 52 3b 0a 20 20 20 20 72 65  HARACTER;.    re
4530: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
4540: 28 20 28 70 2d 3e 73 74 61 74 65 20 26 20 41 4c  ( (p->state & AL
4550: 4c 4f 57 5f 57 49 4b 49 29 21 3d 30 20 29 7b 0a  LOW_WIKI)!=0 ){.
4560: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c      if( z[0]=='\
4570: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  n' ){.      n = 
4580: 70 61 72 61 67 72 61 70 68 42 72 65 61 6b 4c 65  paragraphBreakLe
4590: 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20 20 69  ngth(z);.      i
45a0: 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( n>0 ){.      
45b0: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20    *pTokenType = 
45c0: 54 4f 4b 45 4e 5f 50 41 52 41 47 52 41 50 48 3b  TOKEN_PARAGRAPH;
45d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
45e0: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  n;.      }else i
45f0: 66 28 20 69 73 73 70 61 63 65 28 7a 5b 31 5d 29  f( isspace(z[1])
4600: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f   ){.        *pTo
4610: 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f  kenType = TOKEN_
4620: 4e 45 57 4c 49 4e 45 3b 0a 20 20 20 20 20 20 20  NEWLINE;.       
4630: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4640: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4650: 20 28 70 2d 3e 73 74 61 74 65 20 26 20 41 54 5f   (p->state & AT_
4660: 4e 45 57 4c 49 4e 45 29 21 3d 30 20 26 26 20 69  NEWLINE)!=0 && i
4670: 73 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a  sspace(z[0]) ){.
4680: 20 20 20 20 20 20 6e 20 3d 20 62 75 6c 6c 65 74        n = bullet
4690: 4c 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20  Length(z);.     
46a0: 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
46b0: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20      *pTokenType 
46c0: 3d 20 54 4f 4b 45 4e 5f 42 55 4c 4c 45 54 3b 0a  = TOKEN_BULLET;.
46d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
46e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
46f0: 6e 20 3d 20 65 6e 75 6d 4c 65 6e 67 74 68 28 7a  n = enumLength(z
4700: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30  );.      if( n>0
4710: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f   ){.        *pTo
4720: 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f  kenType = TOKEN_
4730: 45 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  ENUM;.        re
4740: 74 75 72 6e 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  turn n;.      }.
4750: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
4760: 2d 3e 73 74 61 74 65 20 26 20 41 54 5f 50 41 52  ->state & AT_PAR
4770: 41 47 52 41 50 48 29 21 3d 30 20 26 26 20 69 73  AGRAPH)!=0 && is
4780: 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a 20  space(z[0]) ){. 
4790: 20 20 20 20 20 6e 20 3d 20 69 6e 64 65 6e 74 4c       n = indentL
47a0: 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20 20  ength(z);.      
47b0: 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20  if( n>0 ){.     
47c0: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
47d0: 20 54 4f 4b 45 4e 5f 49 4e 44 45 4e 54 3b 0a 20   TOKEN_INDENT;. 
47e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b         return n;
47f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4800: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5b 27     if( z[0]=='['
4810: 20 26 26 20 28 6e 20 3d 20 6c 69 6e 6b 4c 65 6e   && (n = linkLen
4820: 67 74 68 28 7a 29 29 3e 30 20 29 7b 0a 20 20 20  gth(z))>0 ){.   
4830: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
4840: 20 54 4f 4b 45 4e 5f 4c 49 4e 4b 3b 0a 20 20 20   TOKEN_LINK;.   
4850: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20     return n;.   
4860: 20 7d 0a 20 20 7d 0a 20 20 2a 70 54 6f 6b 65 6e   }.  }.  *pToken
4870: 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 54 45 58  Type = TOKEN_TEX
4880: 54 3b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  T;.  return 1 + 
4890: 74 65 78 74 4c 65 6e 67 74 68 28 7a 2b 31 2c 20  textLength(z+1, 
48a0: 70 2d 3e 73 74 61 74 65 20 26 20 41 4c 4c 4f 57  p->state & ALLOW
48b0: 5f 57 49 4b 49 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _WIKI);.}../*.**
48c0: 20 41 20 73 69 6e 67 6c 65 20 6d 61 72 6b 75 70   A single markup
48d0: 20 69 73 20 70 61 72 73 65 64 20 69 6e 74 6f 20   is parsed into 
48e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
48f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
4900: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
4910: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61 72  pedef struct Par
4920: 73 65 64 4d 61 72 6b 75 70 20 50 61 72 73 65 64  sedMarkup Parsed
4930: 4d 61 72 6b 75 70 3b 0a 73 74 72 75 63 74 20 50  Markup;.struct P
4940: 61 72 73 65 64 4d 61 72 6b 75 70 20 7b 0a 20 20  arsedMarkup {.  
4950: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 6e  unsigned char en
4960: 64 54 61 67 3b 20 20 20 2f 2a 20 54 72 75 65 20  dTag;   /* True 
4970: 69 66 20 3c 2f 2e 2e 2e 3e 20 69 6e 73 74 65 61  if </...> instea
4980: 64 20 6f 66 20 3c 2e 2e 2e 3e 20 2a 2f 0a 20 20  d of <...> */.  
4990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43  unsigned char iC
49a0: 6f 64 65 3b 20 20 20 20 2f 2a 20 4d 41 52 4b 55  ode;    /* MARKU
49b0: 50 5f 2a 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  P_* */.  unsigne
49c0: 64 20 63 68 61 72 20 6e 41 74 74 72 3b 20 20 20  d char nAttr;   
49d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 74   /* Number of at
49e0: 74 72 69 62 75 74 65 73 20 2a 2f 0a 20 20 75 6e  tributes */.  un
49f0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 54 79  signed short iTy
4a00: 70 65 3b 20 20 20 2f 2a 20 4d 55 54 59 50 45 5f  pe;   /* MUTYPE_
4a10: 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 7b 0a  * */.  struct {.
4a20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
4a30: 72 20 69 43 6f 64 65 3b 20 20 20 20 20 2f 2a 20  r iCode;     /* 
4a40: 41 54 54 52 5f 2a 20 2a 2f 0a 20 20 20 20 63 68  ATTR_* */.    ch
4a50: 61 72 20 2a 7a 56 61 6c 75 65 3b 20 20 20 20 20  ar *zValue;     
4a60: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
4a70: 6e 74 20 74 6f 20 74 68 69 73 20 61 74 74 72 69  nt to this attri
4a80: 62 75 74 65 2e 20 20 4d 69 67 68 74 20 62 65 20  bute.  Might be 
4a90: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 63 68 61 72  NULL */.    char
4aa0: 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   cTerm;         
4ab0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
4ac0: 20 61 72 67 75 6d 65 6e 74 20 74 65 72 6d 69 6e   argument termin
4ad0: 61 74 69 6f 6e 20 63 68 61 72 61 63 74 65 72 20  ation character 
4ae0: 2a 2f 0a 20 20 7d 20 61 41 74 74 72 5b 31 30 5d  */.  } aAttr[10]
4af0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 7a 5b 5d 20  ;.};../*.** z[] 
4b00: 69 73 20 61 6e 20 48 54 4d 4c 20 6d 61 72 6b 75  is an HTML marku
4b10: 70 20 65 6c 65 6d 65 6e 74 20 2d 20 73 6f 6d 65  p element - some
4b20: 74 68 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  thing that begin
4b30: 73 20 77 69 74 68 20 27 3c 27 2e 0a 2a 2a 20 50  s with '<'..** P
4b40: 61 72 73 65 20 74 68 69 73 20 65 6c 65 6d 65 6e  arse this elemen
4b50: 74 20 69 6e 74 6f 20 74 68 65 20 70 20 73 74 72  t into the p str
4b60: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
4b70: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 7a 5b 5d  e content of z[]
4b80: 20 6d 69 67 68 74 20 62 65 20 6d 6f 64 69 66 69   might be modifi
4b90: 65 64 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  ed by converting
4ba0: 20 63 68 61 72 61 63 74 65 72 73 20 0a 2a 2a 20   characters .** 
4bb0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 61 6e 64  to lowercase and
4bc0: 20 62 79 20 69 6e 73 65 72 74 69 6e 67 20 73 6f   by inserting so
4bd0: 6d 65 20 22 5c 30 30 30 22 20 63 68 61 72 61 63  me "\000" charac
4be0: 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
4bf0: 76 6f 69 64 20 70 61 72 73 65 4d 61 72 6b 75 70  void parseMarkup
4c00: 28 50 61 72 73 65 64 4d 61 72 6b 75 70 20 2a 70  (ParsedMarkup *p
4c10: 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  , char *z){.  in
4c20: 74 20 69 2c 20 63 3b 0a 20 20 69 6e 74 20 69 43  t i, c;.  int iC
4c30: 6f 64 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  ode;.  char *zTa
4c40: 67 2c 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 69 6e  g, *zValue;.  in
4c50: 74 20 73 65 65 6e 20 3d 20 30 3b 0a 0a 20 20 69  t seen = 0;..  i
4c60: 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[1]=='/' ){.
4c70: 20 20 20 20 70 2d 3e 65 6e 64 54 61 67 20 3d 20      p->endTag = 
4c80: 31 3b 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20  1;.    i = 2;.  
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 6e  }else{.    p->en
4ca0: 64 54 61 67 20 3d 20 30 3b 0a 20 20 20 20 69 20  dTag = 0;.    i 
4cb0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 7a 54 61 67 20  = 1;.  }.  zTag 
4cc0: 3d 20 26 7a 5b 69 5d 3b 0a 20 20 77 68 69 6c 65  = &z[i];.  while
4cd0: 28 20 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20  ( isalnum(z[i]) 
4ce0: 29 7b 20 0a 20 20 20 20 7a 5b 69 5d 20 3d 20 74  ){ .    z[i] = t
4cf0: 6f 6c 6f 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20  olower(z[i]);.  
4d00: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 63 20 3d    i++;.  }.  c =
4d10: 20 7a 5b 69 5d 3b 0a 20 20 7a 5b 69 5d 20 3d 20   z[i];.  z[i] = 
4d20: 30 3b 0a 20 20 70 2d 3e 69 43 6f 64 65 20 3d 20  0;.  p->iCode = 
4d30: 66 69 6e 64 54 61 67 28 7a 54 61 67 29 3b 0a 20  findTag(zTag);. 
4d40: 20 70 2d 3e 69 54 79 70 65 20 3d 20 61 4d 61 72   p->iType = aMar
4d50: 6b 75 70 5b 70 2d 3e 69 43 6f 64 65 5d 2e 69 54  kup[p->iCode].iT
4d60: 79 70 65 3b 0a 20 20 70 2d 3e 6e 41 74 74 72 20  ype;.  p->nAttr 
4d70: 3d 20 30 3b 0a 20 20 7a 5b 69 5d 20 3d 20 63 3b  = 0;.  z[i] = c;
4d80: 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63  .  while( isspac
4d90: 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  e(z[i]) ){ i++; 
4da0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e 41  }.  while( p->nA
4db0: 74 74 72 3c 38 20 26 26 20 69 73 61 6c 70 68 61  ttr<8 && isalpha
4dc0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 7a 54  (z[i]) ){.    zT
4dd0: 61 67 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 20 20  ag = &z[i];.    
4de0: 77 68 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a  while( isalnum(z
4df0: 5b 69 5d 29 20 29 7b 20 0a 20 20 20 20 20 20 7a  [i]) ){ .      z
4e00: 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 5b  [i] = tolower(z[
4e10: 69 5d 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  i]);.      i++;.
4e20: 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20 7a 5b      }.    c = z[
4e30: 69 5d 3b 0a 20 20 20 20 7a 5b 69 5d 20 3d 20 30  i];.    z[i] = 0
4e40: 3b 0a 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70  ;.    p->aAttr[p
4e50: 2d 3e 6e 41 74 74 72 5d 2e 69 43 6f 64 65 20 3d  ->nAttr].iCode =
4e60: 20 69 43 6f 64 65 20 3d 20 66 69 6e 64 41 74 74   iCode = findAtt
4e70: 72 28 7a 54 61 67 29 3b 0a 20 20 20 20 7a 5b 69  r(zTag);.    z[i
4e80: 5d 20 3d 20 63 3b 0a 20 20 20 20 77 68 69 6c 65  ] = c;.    while
4e90: 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  ( isspace(z[i]) 
4ea0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
4eb0: 28 20 7a 5b 69 5d 21 3d 27 3d 27 20 29 7b 0a 20  ( z[i]!='=' ){. 
4ec0: 20 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d       p->aAttr[p-
4ed0: 3e 6e 41 74 74 72 5d 2e 7a 56 61 6c 75 65 20 3d  >nAttr].zValue =
4ee0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 74   0;.      p->aAt
4ef0: 74 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 63 54 65  tr[p->nAttr].cTe
4f00: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20  rm = 0;.      c 
4f10: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
4f20: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
4f30: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
4f40: 7a 5b 69 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  z[i]) ){ z++; }.
4f50: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
4f60: 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '"' ){.        i
4f70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 56 61 6c  ++;.        zVal
4f80: 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 20 20  ue = &z[i];.    
4f90: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20      while( z[i] 
4fa0: 26 26 20 7a 5b 69 5d 21 3d 27 22 27 20 29 7b 20  && z[i]!='"' ){ 
4fb0: 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c  i++; }.      }el
4fc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 56 61 6c  se{.        zVal
4fd0: 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 20 20  ue = &z[i];.    
4fe0: 20 20 20 20 77 68 69 6c 65 28 20 21 69 73 73 70      while( !issp
4ff0: 61 63 65 28 7a 5b 69 5d 29 20 26 26 20 7a 5b 69  ace(z[i]) && z[i
5000: 5d 21 3d 27 3e 27 20 29 7b 20 7a 2b 2b 3b 20 7d  ]!='>' ){ z++; }
5010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5020: 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74 74 72  ->aAttr[p->nAttr
5030: 5d 2e 7a 56 61 6c 75 65 20 3d 20 7a 56 61 6c 75  ].zValue = zValu
5040: 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 74 74  e;.      p->aAtt
5050: 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 63 54 65 72  r[p->nAttr].cTer
5060: 6d 20 3d 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  m = c = z[i];.  
5070: 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20      z[i] = 0;.  
5080: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
5090: 20 20 20 69 66 28 20 69 43 6f 64 65 21 3d 30 20     if( iCode!=0 
50a0: 26 26 20 28 73 65 65 6e 20 26 20 61 41 74 74 72  && (seen & aAttr
50b0: 69 62 75 74 65 5b 69 43 6f 64 65 5d 2e 69 4d 61  ibute[iCode].iMa
50c0: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
50d0: 73 65 65 6e 20 7c 3d 20 61 41 74 74 72 69 62 75  seen |= aAttribu
50e0: 74 65 5b 69 43 6f 64 65 5d 2e 69 4d 61 73 6b 3b  te[iCode].iMask;
50f0: 0a 20 20 20 20 20 20 70 2d 3e 6e 41 74 74 72 2b  .      p->nAttr+
5100: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
5110: 20 63 3d 3d 27 3e 27 20 29 20 62 72 65 61 6b 3b   c=='>' ) break;
5120: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70  .    while( issp
5130: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b  ace(z[i]) ){ i++
5140: 3b 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ; }.  }.}../*.**
5150: 20 52 65 6e 64 65 72 20 6d 61 72 6b 75 70 20 6f   Render markup o
5160: 6e 20 74 68 65 20 67 69 76 65 6e 20 62 6c 6f 62  n the given blob
5170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5180: 20 72 65 6e 64 65 72 4d 61 72 6b 75 70 28 42 6c   renderMarkup(Bl
5190: 6f 62 20 2a 70 4f 75 74 2c 20 50 61 72 73 65 64  ob *pOut, Parsed
51a0: 4d 61 72 6b 75 70 20 2a 70 29 7b 0a 20 20 69 6e  Markup *p){.  in
51b0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 65 6e  t i;.  if( p->en
51c0: 64 54 61 67 20 29 7b 0a 20 20 20 20 62 6c 6f 62  dTag ){.    blob
51d0: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22  _appendf(pOut, "
51e0: 3c 2f 25 73 3e 22 2c 20 61 4d 61 72 6b 75 70 5b  </%s>", aMarkup[
51f0: 70 2d 3e 69 43 6f 64 65 5d 2e 7a 4e 61 6d 65 29  p->iCode].zName)
5200: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
5210: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74  lob_appendf(pOut
5220: 2c 20 22 3c 25 73 22 2c 20 61 4d 61 72 6b 75 70  , "<%s", aMarkup
5230: 5b 70 2d 3e 69 43 6f 64 65 5d 2e 7a 4e 61 6d 65  [p->iCode].zName
5240: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5250: 69 3c 70 2d 3e 6e 41 74 74 72 3b 20 69 2b 2b 29  i<p->nAttr; i++)
5260: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  {.      blob_app
5270: 65 6e 64 66 28 70 4f 75 74 2c 20 22 20 25 73 22  endf(pOut, " %s"
5280: 2c 20 61 41 74 74 72 69 62 75 74 65 5b 70 2d 3e  , aAttribute[p->
5290: 61 41 74 74 72 5b 69 5d 2e 69 43 6f 64 65 5d 2e  aAttr[i].iCode].
52a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
52b0: 28 20 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 7a 56  ( p->aAttr[i].zV
52c0: 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alue ){.        
52d0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75  blob_appendf(pOu
52e0: 74 2c 20 22 3d 5c 22 25 73 5c 22 22 2c 20 70 2d  t, "=\"%s\"", p-
52f0: 3e 61 41 74 74 72 5b 69 5d 2e 7a 56 61 6c 75 65  >aAttr[i].zValue
5300: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5310: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
5320: 28 70 4f 75 74 2c 20 22 3e 22 2c 20 31 29 3b 0a  (pOut, ">", 1);.
5330: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
5340: 6e 20 74 68 65 20 6d 61 72 6b 75 70 20 77 61 73  n the markup was
5350: 20 70 61 72 73 65 64 2c 20 73 6f 6d 65 20 22 5c   parsed, some "\
5360: 30 30 30 22 20 6d 61 79 20 68 61 76 65 20 62 65  000" may have be
5370: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 20  en inserted..** 
5380: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  This routine res
5390: 74 6f 72 65 73 20 74 6f 20 74 68 6f 73 65 20 22  tores to those "
53a0: 5c 30 30 30 22 20 76 61 6c 75 65 73 20 62 61 63  \000" values bac
53b0: 6b 20 74 6f 20 74 68 65 69 72 0a 2a 2a 20 6f 72  k to their.** or
53c0: 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 2e 0a  iginal content..
53d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
53e0: 6e 70 61 72 73 65 4d 61 72 6b 75 70 28 50 61 72  nparseMarkup(Par
53f0: 73 65 64 4d 61 72 6b 75 70 20 2a 70 29 7b 0a 20  sedMarkup *p){. 
5400: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72   int i, n;.  for
5410: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 74 74 72  (i=0; i<p->nAttr
5420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
5430: 20 2a 7a 20 3d 20 70 2d 3e 61 41 74 74 72 5b 69   *z = p->aAttr[i
5440: 5d 2e 7a 56 61 6c 75 65 3b 0a 20 20 20 20 69 66  ].zValue;.    if
5450: 28 20 7a 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( z==0 ) continu
5460: 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  e;.    n = strle
5470: 6e 28 7a 29 3b 0a 20 20 20 20 7a 5b 6e 5d 20 3d  n(z);.    z[n] =
5480: 20 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 63 54 65   p->aAttr[i].cTe
5490: 72 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rm;.  }.}../*.**
54a0: 20 50 6f 70 20 61 20 73 69 6e 67 6c 65 20 65 6c   Pop a single el
54b0: 65 6d 65 6e 74 20 6f 66 66 20 6f 66 20 74 68 65  ement off of the
54c0: 20 73 74 61 63 6b 2e 20 20 41 73 20 74 68 65 20   stack.  As the 
54d0: 65 6c 65 6d 65 6e 74 20 69 73 20 70 6f 70 70 65  element is poppe
54e0: 64 2c 0a 2a 2a 20 6f 75 74 70 75 74 20 69 74 73  d,.** output its
54f0: 20 65 6e 64 20 74 61 67 2e 0a 2a 2f 0a 73 74 61   end tag..*/.sta
5500: 74 69 63 20 76 6f 69 64 20 70 6f 70 53 74 61 63  tic void popStac
5510: 6b 28 52 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a  k(Renderer *p){.
5520: 20 20 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b 20    if( p->nStack 
5530: 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 74 61 63 6b  ){.    p->nStack
5540: 2d 2d 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  --;.    blob_app
5550: 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22 3c  endf(p->pOut, "<
5560: 2f 25 73 3e 22 2c 20 61 4d 61 72 6b 75 70 5b 70  /%s>", aMarkup[p
5570: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61  ->aStack[p->nSta
5580: 63 6b 5d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  ck]].zName);.  }
5590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61  .}../*.** Push a
55a0: 20 6e 65 77 20 6d 61 72 6b 75 70 20 76 61 6c 75   new markup valu
55b0: 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  e onto the stack
55c0: 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 73  .  Enlarge the s
55d0: 74 61 63 6b 0a 2a 2a 20 69 66 20 6e 65 63 65 73  tack.** if neces
55e0: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
55f0: 76 6f 69 64 20 70 75 73 68 53 74 61 63 6b 28 52  void pushStack(R
5600: 65 6e 64 65 72 65 72 20 2a 70 2c 20 69 6e 74 20  enderer *p, int 
5610: 65 6c 65 6d 29 7b 0a 20 20 69 66 28 20 70 2d 3e  elem){.  if( p->
5620: 6e 53 74 61 63 6b 3e 3d 70 2d 3e 6e 41 6c 6c 6f  nStack>=p->nAllo
5630: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
5640: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
5650: 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61   + 100;.    p->a
5660: 53 74 61 63 6b 20 3d 20 72 65 61 6c 6c 6f 63 28  Stack = realloc(
5670: 70 2d 3e 61 53 74 61 63 6b 2c 20 70 2d 3e 6e 41  p->aStack, p->nA
5680: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
5690: 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20  ->aStack==0 ){. 
56a0: 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69       fossil_pani
56b0: 63 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  c("out of memory
56c0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
56d0: 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74  p->aStack[p->nSt
56e0: 61 63 6b 2b 2b 5d 20 3d 20 65 6c 65 6d 3b 0a 7d  ack++] = elem;.}
56f0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20  ../*.** Pop the 
5700: 73 74 61 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  stack until the 
5710: 74 6f 70 2d 6d 6f 73 74 20 69 54 61 67 20 65 6c  top-most iTag el
5720: 65 6d 65 6e 74 20 69 73 20 72 65 6d 6f 76 65 64  ement is removed
5730: 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  ..** If there is
5740: 20 6e 6f 20 69 54 61 67 20 65 6c 65 6d 65 6e 74   no iTag element
5750: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2c 20 74   on the stack, t
5760: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
5770: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
5780: 61 74 69 63 20 76 6f 69 64 20 70 6f 70 53 74 61  atic void popSta
5790: 63 6b 54 6f 54 61 67 28 52 65 6e 64 65 72 65 72  ckToTag(Renderer
57a0: 20 2a 70 2c 20 69 6e 74 20 69 54 61 67 29 7b 0a   *p, int iTag){.
57b0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
57c0: 3d 70 2d 3e 6e 53 74 61 63 6b 2d 31 3b 20 69 3e  =p->nStack-1; i>
57d0: 3d 30 20 26 26 20 70 2d 3e 61 53 74 61 63 6b 5b  =0 && p->aStack[
57e0: 69 5d 21 3d 69 54 61 67 3b 20 69 2d 2d 29 7b 7d  i]!=iTag; i--){}
57f0: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
5800: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  urn;.  while( p-
5810: 3e 6e 53 74 61 63 6b 3e 69 20 29 7b 0a 20 20 20  >nStack>i ){.   
5820: 20 70 6f 70 53 74 61 63 6b 28 70 29 3b 0a 20 20   popStack(p);.  
5830: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74  }.}../*.** Pop t
5840: 68 65 20 73 74 61 63 6b 20 75 6e 74 69 6c 20 74  he stack until t
5850: 68 65 20 74 6f 70 2d 6d 6f 73 74 20 65 6c 65 6d  he top-most elem
5860: 65 6e 74 20 6f 66 20 74 68 65 20 73 74 61 63 6b  ent of the stack
5870: 0a 2a 2a 20 69 73 20 61 6e 20 65 6c 65 6d 65 6e  .** is an elemen
5880: 74 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  t that matches t
5890: 68 65 20 74 79 70 65 20 69 6e 20 69 4d 61 73 6b  he type in iMask
58a0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 63 6f 64  .  Return.** cod
58b0: 65 20 6f 66 20 74 68 65 20 6d 61 72 6b 75 70 20  e of the markup 
58c0: 65 6c 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  element that is 
58d0: 6f 6e 20 6c 65 66 74 20 6f 6e 20 74 6f 70 20 6f  on left on top o
58e0: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20  f the stack..** 
58f0: 49 66 20 74 68 65 20 73 74 61 63 6b 20 64 6f 65  If the stack doe
5900: 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 65 6c  s not have an el
5910: 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 6d 61  ement.** that ma
5920: 74 63 68 65 73 20 69 4d 61 73 6b 2c 20 74 68 65  tches iMask, the
5930: 6e 20 6c 65 61 76 65 20 74 68 65 20 73 74 61 63  n leave the stac
5940: 6b 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  k unchanged and.
5950: 2a 2a 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20  ** return false 
5960: 28 4d 41 52 4b 55 50 5f 49 4e 56 41 4c 49 44 29  (MARKUP_INVALID)
5970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5980: 62 61 63 6b 75 70 54 6f 54 79 70 65 28 52 65 6e  backupToType(Ren
5990: 64 65 72 65 72 20 2a 70 2c 20 69 6e 74 20 69 4d  derer *p, int iM
59a0: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
59b0: 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 74 61 63 6b   for(i=p->nStack
59c0: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28 61 4d 61  -1; i>=0 && (aMa
59d0: 72 6b 75 70 5b 70 2d 3e 61 53 74 61 63 6b 5b 69  rkup[p->aStack[i
59e0: 5d 5d 2e 69 54 79 70 65 26 69 4d 61 73 6b 29 3d  ]].iType&iMask)=
59f0: 3d 30 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  =0; i--){}.  if(
5a00: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b   i<0 ) return 0;
5a10: 0a 20 20 69 2b 2b 3b 0a 20 20 77 68 69 6c 65 28  .  i++;.  while(
5a20: 20 70 2d 3e 6e 53 74 61 63 6b 3e 69 20 29 7b 0a   p->nStack>i ){.
5a30: 20 20 20 20 70 6f 70 53 74 61 63 6b 28 70 29 3b      popStack(p);
5a40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
5a50: 3e 61 53 74 61 63 6b 5b 69 2d 31 5d 3b 0a 7d 0a  >aStack[i-1];.}.
5a60: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 6e  ./*.** Begin a n
5a70: 65 77 20 70 61 72 61 67 72 61 70 68 20 69 66 20  ew paragraph if 
5a80: 74 68 61 74 20 73 6f 6d 65 74 68 69 6e 67 20 74  that something t
5a90: 68 61 74 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a  hat is needed..*
5aa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
5ab0: 61 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  artAutoParagraph
5ac0: 28 52 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20  (Renderer *p){. 
5ad0: 20 69 66 28 20 70 2d 3e 77 61 6e 74 41 75 74 6f   if( p->wantAuto
5ae0: 50 61 72 61 67 72 61 70 68 3d 3d 30 20 29 20 72  Paragraph==0 ) r
5af0: 65 74 75 72 6e 3b 0a 20 20 62 6c 6f 62 5f 61 70  eturn;.  blob_ap
5b00: 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22  pendf(p->pOut, "
5b10: 3c 70 3e 22 2c 20 2d 31 29 3b 0a 20 20 70 75 73  <p>", -1);.  pus
5b20: 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50  hStack(p, MARKUP
5b30: 5f 50 29 3b 0a 20 20 70 2d 3e 77 61 6e 74 41 75  _P);.  p->wantAu
5b40: 74 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b  toParagraph = 0;
5b50: 0a 20 20 70 2d 3e 69 6e 41 75 74 6f 50 61 72 61  .  p->inAutoPara
5b60: 67 72 61 70 68 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  graph = 1;.}../*
5b70: 0a 2a 2a 20 45 6e 64 20 61 20 70 61 72 61 67 72  .** End a paragr
5b80: 61 70 68 20 69 66 20 77 65 20 61 72 65 20 69 6e  aph if we are in
5b90: 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   one..*/.static 
5ba0: 76 6f 69 64 20 65 6e 64 41 75 74 6f 50 61 72 61  void endAutoPara
5bb0: 67 72 61 70 68 28 52 65 6e 64 65 72 65 72 20 2a  graph(Renderer *
5bc0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 41  p){.  if( p->inA
5bd0: 75 74 6f 50 61 72 61 67 72 61 70 68 20 29 7b 0a  utoParagraph ){.
5be0: 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61      popStackToTa
5bf0: 67 28 70 2c 20 4d 41 52 4b 55 50 5f 50 29 3b 0a  g(p, MARKUP_P);.
5c00: 20 20 20 20 70 2d 3e 69 6e 41 75 74 6f 50 61 72      p->inAutoPar
5c10: 61 67 72 61 70 68 20 3d 20 30 3b 0a 20 20 7d 0a  agraph = 0;.  }.
5c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
5c30: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63 6f 72  input string cor
5c40: 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 65  responds to an e
5c50: 78 69 73 74 69 6e 67 20 62 61 73 65 6c 69 6e 65  xisting baseline
5c60: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65  ,.** return true
5c70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5c80: 69 73 5f 76 61 6c 69 64 5f 75 75 69 64 28 63 6f  is_valid_uuid(co
5c90: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
5ca0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
5cb0: 29 3b 0a 20 20 69 66 28 20 6e 3c 34 20 7c 7c 20  );.  if( n<4 || 
5cc0: 6e 3e 55 55 49 44 5f 53 49 5a 45 20 29 20 72 65  n>UUID_SIZE ) re
5cd0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 76  turn 0;.  if( !v
5ce0: 61 6c 69 64 61 74 65 31 36 28 7a 2c 20 6e 29 20  alidate16(z, n) 
5cf0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
5d00: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
5d10: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
5d20: 74 68 65 20 67 69 76 65 6e 20 68 79 70 65 72 6c  the given hyperl
5d30: 69 6e 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6d  ink should be im
5d40: 70 6c 65 6d 65 6e 74 65 64 20 66 6f 72 0a 2a 2a  plemented for.**
5d50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 67   the current log
5d60: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  in..*/.static in
5d70: 74 20 6f 6b 54 6f 48 79 70 65 72 6c 69 6e 6b 28  t okToHyperlink(
5d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
5d90: 67 65 74 29 7b 0a 20 20 69 66 28 20 67 2e 6f 6b  get){.  if( g.ok
5da0: 48 69 73 74 6f 72 79 20 29 20 72 65 74 75 72 6e  History ) return
5db0: 20 31 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d   1;.  if( strncm
5dc0: 70 28 7a 54 61 72 67 65 74 2c 20 22 68 74 74 70  p(zTarget, "http
5dd0: 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20 20 7c 7c  :", 5)==0 .   ||
5de0: 20 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65 74   strncmp(zTarget
5df0: 2c 20 22 68 74 74 70 73 3a 22 2c 20 36 29 3d 3d  , "https:", 6)==
5e00: 30 0a 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28  0.   || strncmp(
5e10: 7a 54 61 72 67 65 74 2c 20 22 66 74 70 3a 22 2c  zTarget, "ftp:",
5e20: 20 34 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 74   4)==0 .   || st
5e30: 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c 20 22  rncmp(zTarget, "
5e40: 6d 61 69 6c 74 6f 3a 22 2c 20 37 29 3d 3d 30 0a  mailto:", 7)==0.
5e50: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
5e60: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 61  1;.  }.  if( zTa
5e70: 72 67 65 74 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20  rget[0]=='/' || 
5e80: 69 73 5f 76 61 6c 69 64 5f 75 75 69 64 28 7a 54  is_valid_uuid(zT
5e90: 61 72 67 65 74 29 20 29 20 72 65 74 75 72 6e 20  arget) ) return 
5ea0: 30 3b 0a 20 20 69 66 28 20 77 69 6b 69 5f 6e 61  0;.  if( wiki_na
5eb0: 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d 65 64  me_is_wellformed
5ec0: 28 7a 54 61 72 67 65 74 29 20 29 20 72 65 74 75  (zTarget) ) retu
5ed0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
5ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
5ef0: 76 65 20 61 20 68 79 70 65 72 6c 69 6e 6b 2e 20  ve a hyperlink. 
5f00: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
5f10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
5f20: 74 68 65 20 5b 2e 2e 2e 5d 0a 2a 2a 20 69 6e 20  the [...].** in 
5f30: 74 68 65 20 77 69 6b 69 2e 20 20 41 70 70 65 6e  the wiki.  Appen
5f40: 64 20 74 68 65 20 55 52 4c 20 74 6f 20 74 68 65  d the URL to the
5f50: 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 52   output of the R
5f60: 65 6e 64 65 72 65 72 2e 0a 2a 2f 0a 73 74 61 74  enderer..*/.stat
5f70: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 48  ic void resolveH
5f80: 79 70 65 72 6c 69 6e 6b 28 63 6f 6e 73 74 20 63  yperlink(const c
5f90: 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 52 65  har *zTarget, Re
5fa0: 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20 20 69 66  nderer *p){.  if
5fb0: 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65  ( strncmp(zTarge
5fc0: 74 2c 20 22 68 74 74 70 3a 22 2c 20 35 29 3d 3d  t, "http:", 5)==
5fd0: 30 20 0a 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70  0 .   || strncmp
5fe0: 28 7a 54 61 72 67 65 74 2c 20 22 68 74 74 70 73  (zTarget, "https
5ff0: 3a 22 2c 20 36 29 3d 3d 30 0a 20 20 20 7c 7c 20  :", 6)==0.   || 
6000: 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c  strncmp(zTarget,
6010: 20 22 66 74 70 3a 22 2c 20 34 29 3d 3d 30 20 0a   "ftp:", 4)==0 .
6020: 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54     || strncmp(zT
6030: 61 72 67 65 74 2c 20 22 6d 61 69 6c 74 6f 3a 22  arget, "mailto:"
6040: 2c 20 37 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  , 7)==0.  ){.   
6050: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d   blob_appendf(p-
6060: 3e 70 4f 75 74 2c 20 7a 54 61 72 67 65 74 29 3b  >pOut, zTarget);
6070: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61  .  }else if( zTa
6080: 72 67 65 74 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  rget[0]=='/' ){.
6090: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
60a0: 28 70 2d 3e 70 4f 75 74 2c 20 22 25 73 25 68 22  (p->pOut, "%s%h"
60b0: 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54  , g.zBaseURL, zT
60c0: 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20  arget);.  }else 
60d0: 69 66 28 20 69 73 5f 76 61 6c 69 64 5f 75 75 69  if( is_valid_uui
60e0: 64 28 7a 54 61 72 67 65 74 29 20 29 7b 0a 20 20  d(zTarget) ){.  
60f0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
6100: 2d 3e 70 4f 75 74 2c 20 22 25 73 2f 69 6e 66 6f  ->pOut, "%s/info
6110: 2f 25 73 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c  /%s", g.zBaseURL
6120: 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , zTarget);.  }e
6130: 6c 73 65 20 69 66 28 20 77 69 6b 69 5f 6e 61 6d  lse if( wiki_nam
6140: 65 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d 65 64 28  e_is_wellformed(
6150: 7a 54 61 72 67 65 74 29 20 29 7b 0a 20 20 20 20  zTarget) ){.    
6160: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e  blob_appendf(p->
6170: 70 4f 75 74 2c 20 22 25 73 2f 77 69 6b 69 3f 6e  pOut, "%s/wiki?n
6180: 61 6d 65 3d 25 54 22 2c 20 67 2e 7a 42 61 73 65  ame=%T", g.zBase
6190: 55 52 4c 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  URL, zTarget);. 
61a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62   }else{.    blob
61b0: 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74  _appendf(p->pOut
61c0: 2c 20 22 65 72 72 6f 72 22 29 3b 0a 20 20 7d 0a  , "error");.  }.
61d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
61e0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
61f0: 65 6e 20 70 61 72 73 65 64 20 6d 61 72 6b 75 70  en parsed markup
6200: 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a   is the correct.
6210: 2a 2a 20 3c 2f 76 65 72 62 61 74 69 6d 3e 20 74  ** </verbatim> t
6220: 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
6230: 74 20 65 6e 64 56 65 72 62 61 74 69 6d 28 52 65  t endVerbatim(Re
6240: 6e 64 65 72 65 72 20 2a 70 2c 20 50 61 72 73 65  nderer *p, Parse
6250: 64 4d 61 72 6b 75 70 20 2a 70 4d 61 72 6b 75 70  dMarkup *pMarkup
6260: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
6270: 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 56 65 72  assert( p->inVer
6280: 62 61 74 69 6d 20 29 3b 0a 20 20 69 66 28 20 70  batim );.  if( p
6290: 4d 61 72 6b 75 70 2d 3e 69 43 6f 64 65 21 3d 4d  Markup->iCode!=M
62a0: 41 52 4b 55 50 5f 56 45 52 42 41 54 49 4d 20 29  ARKUP_VERBATIM )
62b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
62c0: 20 21 70 4d 61 72 6b 75 70 2d 3e 65 6e 64 54 61   !pMarkup->endTa
62d0: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
62e0: 69 66 28 20 70 2d 3e 7a 56 65 72 62 61 74 69 6d  if( p->zVerbatim
62f0: 49 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  Id==0 ) return 1
6300: 3b 0a 20 20 69 66 28 20 70 4d 61 72 6b 75 70 2d  ;.  if( pMarkup-
6310: 3e 6e 41 74 74 72 21 3d 31 20 29 20 72 65 74 75  >nAttr!=1 ) retu
6320: 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 70 4d 61 72  rn 0;.  z = pMar
6330: 6b 75 70 2d 3e 61 41 74 74 72 5b 30 5d 2e 7a 56  kup->aAttr[0].zV
6340: 61 6c 75 65 3b 0a 20 20 72 65 74 75 72 6e 20 73  alue;.  return s
6350: 74 72 63 6d 70 28 7a 2c 20 70 2d 3e 7a 56 65 72  trcmp(z, p->zVer
6360: 62 61 74 69 6d 49 64 29 3d 3d 30 3b 0a 7d 0a 0a  batimId)==0;.}..
6370: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6380: 20 4d 55 54 59 50 45 20 66 6f 72 20 74 68 65 20   MUTYPE for the 
6390: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
63a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
63b0: 73 74 61 63 6b 54 6f 70 54 79 70 65 28 52 65 6e  stackTopType(Ren
63c0: 64 65 72 65 72 20 2a 70 29 7b 0a 20 20 69 66 28  derer *p){.  if(
63d0: 20 70 2d 3e 6e 53 74 61 63 6b 3c 3d 30 20 29 20   p->nStack<=0 ) 
63e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
63f0: 72 6e 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 61 53  rn aMarkup[p->aS
6400: 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2d 31  tack[p->nStack-1
6410: 5d 5d 2e 69 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  ]].iType;.}../*.
6420: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 77  ** Convert the w
6430: 69 6b 69 20 69 6e 20 7a 5b 5d 20 69 6e 74 6f 20  iki in z[] into 
6440: 68 74 6d 6c 20 69 6e 20 74 68 65 20 72 65 6e 64  html in the rend
6450: 65 72 65 72 20 70 2e 20 20 54 68 65 0a 2a 2a 20  erer p.  The.** 
6460: 72 65 6e 64 65 72 65 72 20 68 61 73 20 61 6c 72  renderer has alr
6470: 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61  eady been initia
6480: 6c 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lized..**.** Thi
6490: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 70  s routine will p
64a0: 72 6f 62 61 62 6c 79 20 6d 6f 64 69 66 79 20 74  robably modify t
64b0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 7a 5b  he content of z[
64c0: 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ]..*/.static voi
64d0: 64 20 77 69 6b 69 5f 72 65 6e 64 65 72 28 52 65  d wiki_render(Re
64e0: 6e 64 65 72 65 72 20 2a 70 2c 20 63 68 61 72 20  nderer *p, char 
64f0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 74 6f 6b 65 6e  *z){.  int token
6500: 54 79 70 65 3b 0a 20 20 50 61 72 73 65 64 4d 61  Type;.  ParsedMa
6510: 72 6b 75 70 20 6d 61 72 6b 75 70 3b 0a 20 20 69  rkup markup;.  i
6520: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 6e 6c 69  nt n;.  int inli
6530: 6e 65 4f 6e 6c 79 20 3d 20 28 70 2d 3e 73 74 61  neOnly = (p->sta
6540: 74 65 20 26 20 49 4e 4c 49 4e 45 5f 4d 41 52 4b  te & INLINE_MARK
6550: 55 50 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20  UP_ONLY)!=0;..  
6560: 77 68 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20  while( z[0] ){. 
6570: 20 20 20 6e 20 3d 20 6e 65 78 74 54 6f 6b 65 6e     n = nextToken
6580: 28 7a 2c 20 70 2c 20 26 74 6f 6b 65 6e 54 79 70  (z, p, &tokenTyp
6590: 65 29 3b 0a 20 20 20 20 70 2d 3e 73 74 61 74 65  e);.    p->state
65a0: 20 26 3d 20 7e 28 41 54 5f 4e 45 57 4c 49 4e 45   &= ~(AT_NEWLINE
65b0: 7c 41 54 5f 50 41 52 41 47 52 41 50 48 29 3b 0a  |AT_PARAGRAPH);.
65c0: 20 20 20 20 73 77 69 74 63 68 28 20 74 6f 6b 65      switch( toke
65d0: 6e 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  nType ){.      c
65e0: 61 73 65 20 54 4f 4b 45 4e 5f 50 41 52 41 47 52  ase TOKEN_PARAGR
65f0: 41 50 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  APH: {.        i
6600: 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20 29 7b  f( inlineOnly ){
6610: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c  .          /* bl
6620: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
6630: 74 2c 20 22 20 26 70 61 72 61 3b 20 22 2c 20 2d  t, " &para; ", -
6640: 31 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  1); */.         
6650: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e   blob_append(p->
6660: 70 4f 75 74 2c 20 22 20 26 6e 62 73 70 3b 26 6e  pOut, " &nbsp;&n
6670: 62 73 70 3b 20 22 2c 20 2d 31 29 3b 0a 20 20 20  bsp; ", -1);.   
6680: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6690: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 77 69 6b        if( p->wik
66a0: 69 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  iList ){.       
66b0: 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54       popStackToT
66c0: 61 67 28 70 2c 20 70 2d 3e 77 69 6b 69 4c 69 73  ag(p, p->wikiLis
66d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
66e0: 70 2d 3e 77 69 6b 69 4c 69 73 74 20 3d 20 30 3b  p->wikiList = 0;
66f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6700: 20 20 20 20 20 20 20 65 6e 64 41 75 74 6f 50 61         endAutoPa
6710: 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20 20 20  ragraph(p);.    
6720: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
6730: 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22 5c 6e 5c  df(p->pOut, "\n\
6740: 6e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  n", 1);.        
6750: 20 20 70 2d 3e 77 61 6e 74 41 75 74 6f 50 61 72    p->wantAutoPar
6760: 61 67 72 61 70 68 20 3d 20 31 3b 0a 20 20 20 20  agraph = 1;.    
6770: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
6780: 3e 73 74 61 74 65 20 7c 3d 20 41 54 5f 50 41 52  >state |= AT_PAR
6790: 41 47 52 41 50 48 7c 41 54 5f 4e 45 57 4c 49 4e  AGRAPH|AT_NEWLIN
67a0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
67b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
67c0: 63 61 73 65 20 54 4f 4b 45 4e 5f 4e 45 57 4c 49  case TOKEN_NEWLI
67d0: 4e 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 6c  NE: {.        bl
67e0: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
67f0: 74 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 20  t, "\n", 1);.   
6800: 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 7c 3d       p->state |=
6810: 20 41 54 5f 4e 45 57 4c 49 4e 45 3b 0a 20 20 20   AT_NEWLINE;.   
6820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6830: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
6840: 4f 4b 45 4e 5f 42 55 4c 4c 45 54 3a 20 7b 0a 20  OKEN_BULLET: {. 
6850: 20 20 20 20 20 20 20 69 66 28 20 69 6e 6c 69 6e         if( inlin
6860: 65 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  eOnly ){.       
6870: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
6880: 2d 3e 70 4f 75 74 2c 20 22 20 26 23 31 34 39 3b  ->pOut, " &#149;
6890: 20 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20   ", -1);.       
68a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
68b0: 20 20 69 66 28 20 70 2d 3e 77 69 6b 69 4c 69 73    if( p->wikiLis
68c0: 74 21 3d 4d 41 52 4b 55 50 5f 55 4c 20 29 7b 0a  t!=MARKUP_UL ){.
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
68e0: 70 2d 3e 77 69 6b 69 4c 69 73 74 20 29 7b 0a 20  p->wikiList ){. 
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
6900: 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20 70 2d  StackToTag(p, p-
6910: 3e 77 69 6b 69 4c 69 73 74 29 3b 0a 20 20 20 20  >wikiList);.    
6920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6930: 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28        pushStack(
6940: 70 2c 20 4d 41 52 4b 55 50 5f 55 4c 29 3b 0a 20  p, MARKUP_UL);. 
6950: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f             blob_
6960: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
6970: 22 3c 75 6c 3e 22 2c 20 34 29 3b 0a 20 20 20 20  "<ul>", 4);.    
6980: 20 20 20 20 20 20 20 20 70 2d 3e 77 69 6b 69 4c          p->wikiL
6990: 69 73 74 20 3d 20 4d 41 52 4b 55 50 5f 55 4c 3b  ist = MARKUP_UL;
69a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
69b0: 20 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54         popStackT
69c0: 6f 54 61 67 28 70 2c 20 4d 41 52 4b 55 50 5f 4c  oTag(p, MARKUP_L
69d0: 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  I);.          st
69e0: 61 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  artAutoParagraph
69f0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  (p);.          p
6a00: 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b  ushStack(p, MARK
6a10: 55 50 5f 4c 49 29 3b 0a 20 20 20 20 20 20 20 20  UP_LI);.        
6a20: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d    blob_append(p-
6a30: 3e 70 4f 75 74 2c 20 22 3c 6c 69 3e 22 2c 20 34  >pOut, "<li>", 4
6a40: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a60: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
6a70: 4f 4b 45 4e 5f 45 4e 55 4d 3a 20 7b 0a 20 20 20  OKEN_ENUM: {.   
6a80: 20 20 20 20 20 69 66 28 20 69 6e 6c 69 6e 65 4f       if( inlineO
6a90: 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
6aa0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d   blob_appendf(p-
6ab0: 3e 70 4f 75 74 2c 20 22 20 28 25 64 29 20 22 2c  >pOut, " (%d) ",
6ac0: 20 61 74 6f 69 28 7a 29 29 3b 0a 20 20 20 20 20   atoi(z));.     
6ad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ae0: 20 20 20 20 69 66 28 20 70 2d 3e 77 69 6b 69 4c      if( p->wikiL
6af0: 69 73 74 21 3d 4d 41 52 4b 55 50 5f 4f 4c 20 29  ist!=MARKUP_OL )
6b00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
6b10: 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74 20 29 7b  ( p->wikiList ){
6b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
6b30: 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20  opStackToTag(p, 
6b40: 70 2d 3e 77 69 6b 69 4c 69 73 74 29 3b 0a 20 20  p->wikiList);.  
6b50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6b60: 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63          pushStac
6b70: 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4f 4c 29 3b  k(p, MARKUP_OL);
6b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f  .            blo
6b90: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
6ba0: 2c 20 22 3c 6f 6c 3e 22 2c 20 34 29 3b 0a 20 20  , "<ol>", 4);.  
6bb0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 69 6b            p->wik
6bc0: 69 4c 69 73 74 20 3d 20 4d 41 52 4b 55 50 5f 4f  iList = MARKUP_O
6bd0: 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  L;.          }. 
6be0: 20 20 20 20 20 20 20 20 20 70 6f 70 53 74 61 63           popStac
6bf0: 6b 54 6f 54 61 67 28 70 2c 20 4d 41 52 4b 55 50  kToTag(p, MARKUP
6c00: 5f 4c 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _LI);.          
6c10: 73 74 61 72 74 41 75 74 6f 50 61 72 61 67 72 61  startAutoParagra
6c20: 70 68 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ph(p);.         
6c30: 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41   pushStack(p, MA
6c40: 52 4b 55 50 5f 4c 49 29 3b 0a 20 20 20 20 20 20  RKUP_LI);.      
6c50: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
6c60: 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 6c 69 20 76  (p->pOut, "<li v
6c70: 61 6c 75 65 3d 5c 22 25 64 5c 22 3e 22 2c 20 61  alue=\"%d\">", a
6c80: 74 6f 69 28 7a 29 29 3b 0a 20 20 20 20 20 20 20  toi(z));.       
6c90: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
6ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6cb0: 63 61 73 65 20 54 4f 4b 45 4e 5f 49 4e 44 45 4e  case TOKEN_INDEN
6cc0: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T: {.        if(
6cd0: 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20 29 7b 0a 20   inlineOnly ){. 
6ce0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
6cf0: 20 70 2d 3e 77 69 6b 69 4c 69 73 74 3d 3d 30 20   p->wikiList==0 
6d00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 73  );.          pus
6d10: 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50  hStack(p, MARKUP
6d20: 5f 42 4c 4f 43 4b 51 55 4f 54 45 29 3b 0a 20 20  _BLOCKQUOTE);.  
6d30: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
6d40: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 62  end(p->pOut, "<b
6d50: 6c 6f 63 6b 71 75 6f 74 65 3e 22 2c 20 2d 31 29  lockquote>", -1)
6d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77  ;.          p->w
6d70: 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  antAutoParagraph
6d80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
6d90: 70 2d 3e 77 69 6b 69 4c 69 73 74 20 3d 20 4d 41  p->wikiList = MA
6da0: 52 4b 55 50 5f 42 4c 4f 43 4b 51 55 4f 54 45 3b  RKUP_BLOCKQUOTE;
6db0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6dc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6dd0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b  }.      case TOK
6de0: 45 4e 5f 43 48 41 52 41 43 54 45 52 3a 20 7b 0a  EN_CHARACTER: {.
6df0: 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75 74          startAut
6e00: 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20  oParagraph(p);. 
6e10: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d         if( z[0]=
6e20: 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='<' ){.        
6e30: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d    blob_append(p-
6e40: 3e 70 4f 75 74 2c 20 22 26 6c 74 3b 22 2c 20 34  >pOut, "&lt;", 4
6e50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
6e60: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 26 27 20 29   if( z[0]=='&' )
6e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  {.          blob
6e80: 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c  _append(p->pOut,
6e90: 20 22 26 61 6d 70 3b 22 2c 20 35 29 3b 0a 20 20   "&amp;", 5);.  
6ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6ec0: 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f       case TOKEN_
6ed0: 4c 49 4e 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20  LINK: {.        
6ee0: 63 68 61 72 20 2a 7a 54 61 72 67 65 74 3b 0a 20  char *zTarget;. 
6ef0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44 69         char *zDi
6f00: 73 70 6c 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  splay = 0;.     
6f10: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6f20: 20 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 74       int savedSt
6f30: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ate;.        int
6f40: 20 6f 6b 3b 0a 20 20 20 20 20 20 20 20 73 74 61   ok;.        sta
6f50: 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  rtAutoParagraph(
6f60: 70 29 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 72  p);.        zTar
6f70: 67 65 74 20 3d 20 26 7a 5b 31 5d 3b 0a 20 20 20  get = &z[1];.   
6f80: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 7a 5b       for(i=1; z[
6f90: 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5d 27 3b  i] && z[i]!=']';
6fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
6fb0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 7c 27 20 26   if( z[i]=='|' &
6fc0: 26 20 7a 44 69 73 70 6c 61 79 3d 3d 30 20 29 7b  & zDisplay==0 ){
6fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 69  .            zDi
6fe0: 73 70 6c 61 79 20 3d 20 26 7a 5b 69 2b 31 5d 3b  splay = &z[i+1];
6ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 69  .            z[i
7000: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
7010: 20 20 20 66 6f 72 28 6a 3d 69 2d 31 3b 20 6a 3e     for(j=i-1; j>
7020: 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 6a  0 && isspace(z[j
7030: 5d 29 3b 20 6a 2d 2d 29 7b 20 7a 5b 6a 5d 20 3d  ]); j--){ z[j] =
7040: 20 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20   0; }.          
7050: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7060: 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20      z[i] = 0;.  
7070: 20 20 20 20 20 20 69 66 28 20 7a 44 69 73 70 6c        if( zDispl
7080: 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ay==0 ){.       
7090: 20 20 20 7a 44 69 73 70 6c 61 79 20 3d 20 7a 54     zDisplay = zT
70a0: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  arget;.        }
70b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
70c0: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
70d0: 7a 44 69 73 70 6c 61 79 29 20 29 20 7a 44 69 73  zDisplay) ) zDis
70e0: 70 6c 61 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20  play++;.        
70f0: 7d 0a 20 20 20 20 20 20 20 20 6f 6b 20 3d 20 6f  }.        ok = o
7100: 6b 54 6f 48 79 70 65 72 6c 69 6e 6b 28 7a 54 61  kToHyperlink(zTa
7110: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
7120: 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20  f( ok ){.       
7130: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
7140: 2d 3e 70 4f 75 74 2c 20 22 3c 61 20 68 72 65 66  ->pOut, "<a href
7150: 3d 5c 22 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  =\"", -1);.     
7160: 20 20 20 20 20 72 65 73 6f 6c 76 65 48 79 70 65       resolveHype
7170: 72 6c 69 6e 6b 28 7a 54 61 72 67 65 74 2c 20 70  rlink(zTarget, p
7180: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  );.          blo
7190: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
71a0: 2c 20 22 5c 22 3e 22 2c 20 2d 31 29 3b 0a 20 20  , "\">", -1);.  
71b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71c0: 73 61 76 65 64 53 74 61 74 65 20 3d 20 70 2d 3e  savedState = p->
71d0: 73 74 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70  state;.        p
71e0: 2d 3e 73 74 61 74 65 20 26 3d 20 7e 41 4c 4c 4f  ->state &= ~ALLO
71f0: 57 5f 57 49 4b 49 3b 0a 20 20 20 20 20 20 20 20  W_WIKI;.        
7200: 70 2d 3e 73 74 61 74 65 20 7c 3d 20 46 4f 4e 54  p->state |= FONT
7210: 5f 4d 41 52 4b 55 50 5f 4f 4e 4c 59 3b 0a 20 20  _MARKUP_ONLY;.  
7220: 20 20 20 20 20 20 77 69 6b 69 5f 72 65 6e 64 65        wiki_rende
7230: 72 28 70 2c 20 7a 44 69 73 70 6c 61 79 29 3b 0a  r(p, zDisplay);.
7240: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
7250: 20 3d 20 73 61 76 65 64 53 74 61 74 65 3b 0a 20   = savedState;. 
7260: 20 20 20 20 20 20 20 69 66 28 20 6f 6b 20 29 20         if( ok ) 
7270: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
7280: 4f 75 74 2c 20 22 3c 2f 61 3e 22 2c 20 34 29 3b  Out, "</a>", 4);
7290: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
72a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
72b0: 73 65 20 54 4f 4b 45 4e 5f 54 45 58 54 3a 20 7b  se TOKEN_TEXT: {
72c0: 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75  .        startAu
72d0: 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a  toParagraph(p);.
72e0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
72f0: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 7a 2c 20  end(p->pOut, z, 
7300: 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  n);.        brea
7310: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
7320: 20 63 61 73 65 20 54 4f 4b 45 4e 5f 4d 41 52 4b   case TOKEN_MARK
7330: 55 50 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 61  UP: {.        pa
7340: 72 73 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b 75  rseMarkup(&marku
7350: 70 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  p, z);.        i
7360: 66 28 20 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d  f( p->inVerbatim
7370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
7380: 28 20 65 6e 64 56 65 72 62 61 74 69 6d 28 70 2c  ( endVerbatim(p,
7390: 20 26 6d 61 72 6b 75 70 29 20 29 7b 0a 20 20 20   &markup) ){.   
73a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65           p->inVe
73b0: 72 62 61 74 69 6d 20 3d 20 30 3b 0a 20 20 20 20  rbatim = 0;.    
73c0: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
73d0: 20 3d 20 70 2d 3e 70 72 65 56 65 72 62 53 74 61   = p->preVerbSta
73e0: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  te;.            
73f0: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
7400: 4f 75 74 2c 20 22 3c 2f 70 72 65 3e 22 2c 20 36  Out, "</pre>", 6
7410: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
7420: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7430: 75 6e 70 61 72 73 65 4d 61 72 6b 75 70 28 26 6d  unparseMarkup(&m
7440: 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  arkup);.        
7450: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
7460: 70 2d 3e 70 4f 75 74 2c 20 22 26 6c 74 3b 22 2c  p->pOut, "&lt;",
7470: 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   4);.           
7480: 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   n = 1;.        
7490: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
74a0: 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 43 6f  e if( markup.iCo
74b0: 64 65 3d 3d 4d 41 52 4b 55 50 5f 49 4e 56 41 4c  de==MARKUP_INVAL
74c0: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
74d0: 75 6e 70 61 72 73 65 4d 61 72 6b 75 70 28 26 6d  unparseMarkup(&m
74e0: 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  arkup);.        
74f0: 20 20 73 74 61 72 74 41 75 74 6f 50 61 72 61 67    startAutoParag
7500: 72 61 70 68 28 70 29 3b 0a 20 20 20 20 20 20 20  raph(p);.       
7510: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
7520: 2d 3e 70 4f 75 74 2c 20 22 26 6c 74 3b 22 2c 20  ->pOut, "&lt;", 
7530: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20  4);.          n 
7540: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
7550: 73 65 20 69 66 28 20 28 6d 61 72 6b 75 70 2e 69  se if( (markup.i
7560: 54 79 70 65 26 4d 55 54 59 50 45 5f 46 4f 4e 54  Type&MUTYPE_FONT
7570: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
7580: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e           && (p->
7590: 73 74 61 74 65 20 26 20 46 4f 4e 54 5f 4d 41 52  state & FONT_MAR
75a0: 4b 55 50 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  KUP_ONLY)!=0 ){.
75b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75c0: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
75d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 6e 6c     }else if( inl
75e0: 69 6e 65 4f 6e 6c 79 20 26 26 20 28 6d 61 72 6b  ineOnly && (mark
75f0: 75 70 2e 69 54 79 70 65 26 4d 55 54 59 50 45 5f  up.iType&MUTYPE_
7600: 49 4e 4c 49 4e 45 29 3d 3d 30 20 29 7b 0a 20 20  INLINE)==0 ){.  
7610: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7620: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  thing */.       
7630: 20 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b 75   }else if( marku
7640: 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f  p.iCode==MARKUP_
7650: 4e 4f 57 49 4b 49 20 29 7b 0a 20 20 20 20 20 20  NOWIKI ){.      
7660: 20 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 65      if( markup.e
7670: 6e 64 54 61 67 20 29 7b 0a 20 20 20 20 20 20 20  ndTag ){.       
7680: 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 7c 3d       p->state |=
7690: 20 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20 20 20   ALLOW_WIKI;.   
76a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
76b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61            p->sta
76c0: 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b  te &= ~ALLOW_WIK
76d0: 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  I;.          }. 
76e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
76f0: 20 6d 61 72 6b 75 70 2e 65 6e 64 54 61 67 20 29   markup.endTag )
7700: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 6f 70 53  {.          popS
7710: 74 61 63 6b 54 6f 54 61 67 28 70 2c 20 6d 61 72  tackToTag(p, mar
7720: 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20 20 20 20  kup.iCode);.    
7730: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 61      }else if( ma
7740: 72 6b 75 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b  rkup.iCode==MARK
7750: 55 50 5f 56 45 52 42 41 54 49 4d 20 29 7b 0a 20  UP_VERBATIM ){. 
7760: 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 72           if( mar
7770: 6b 75 70 2e 6e 41 74 74 72 3d 3d 31 20 29 7b 0a  kup.nAttr==1 ){.
7780: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
7790: 56 65 72 62 61 74 69 6d 49 64 20 3d 20 6d 61 72  VerbatimId = mar
77a0: 6b 75 70 2e 61 41 74 74 72 5b 30 5d 2e 7a 56 61  kup.aAttr[0].zVa
77b0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  lue;.          }
77c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
77d0: 20 20 70 2d 3e 7a 56 65 72 62 61 74 69 6d 49 64    p->zVerbatimId
77e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
77f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  }.          p->i
7800: 6e 56 65 72 62 61 74 69 6d 20 3d 20 31 3b 0a 20  nVerbatim = 1;. 
7810: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 72 65 56           p->preV
7820: 65 72 62 53 74 61 74 65 20 3d 20 70 2d 3e 73 74  erbState = p->st
7830: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ate;.          p
7840: 2d 3e 73 74 61 74 65 20 26 3d 20 7e 41 4c 4c 4f  ->state &= ~ALLO
7850: 57 5f 57 49 4b 49 3b 0a 20 20 20 20 20 20 20 20  W_WIKI;.        
7860: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d    blob_append(p-
7870: 3e 70 4f 75 74 2c 20 22 3c 70 72 65 3e 22 2c 20  >pOut, "<pre>", 
7880: 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  5);.          p-
7890: 3e 77 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61  >wantAutoParagra
78a0: 70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ph = 0;.        
78b0: 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70  }else if( markup
78c0: 2e 69 54 79 70 65 3d 3d 4d 55 54 59 50 45 5f 4c  .iType==MUTYPE_L
78d0: 49 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  I ){.          i
78e0: 66 28 20 62 61 63 6b 75 70 54 6f 54 79 70 65 28  f( backupToType(
78f0: 70 2c 20 4d 55 54 59 50 45 5f 4c 49 53 54 29 3d  p, MUTYPE_LIST)=
7900: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7910: 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d    pushStack(p, M
7920: 41 52 4b 55 50 5f 55 4c 29 3b 0a 20 20 20 20 20  ARKUP_UL);.     
7930: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
7940: 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 75 6c  nd(p->pOut, "<ul
7950: 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  >", 4);.        
7960: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
7970: 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55  shStack(p, MARKU
7980: 50 5f 4c 49 29 3b 0a 20 20 20 20 20 20 20 20 20  P_LI);.         
7990: 20 72 65 6e 64 65 72 4d 61 72 6b 75 70 28 70 2d   renderMarkup(p-
79a0: 3e 70 4f 75 74 2c 20 26 6d 61 72 6b 75 70 29 3b  >pOut, &markup);
79b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
79c0: 66 28 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d  f( markup.iType=
79d0: 3d 4d 55 54 59 50 45 5f 54 52 20 29 7b 0a 20 20  =MUTYPE_TR ){.  
79e0: 20 20 20 20 20 20 20 20 69 66 28 20 62 61 63 6b          if( back
79f0: 75 70 54 6f 54 79 70 65 28 70 2c 20 4d 55 54 59  upToType(p, MUTY
7a00: 50 45 5f 54 41 42 4c 45 29 20 29 7b 0a 20 20 20  PE_TABLE) ){.   
7a10: 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61           pushSta
7a20: 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 54 52 29  ck(p, MARKUP_TR)
7a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
7a40: 6e 64 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f  nderMarkup(p->pO
7a50: 75 74 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20  ut, &markup);.  
7a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7a70: 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b    }else if( mark
7a80: 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54 59 50 45  up.iType==MUTYPE
7a90: 5f 54 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _TD ){.         
7aa0: 20 69 66 28 20 62 61 63 6b 75 70 54 6f 54 79 70   if( backupToTyp
7ab0: 65 28 70 2c 20 4d 55 54 59 50 45 5f 54 41 42 4c  e(p, MUTYPE_TABL
7ac0: 45 7c 4d 55 54 59 50 45 5f 54 52 29 20 29 7b 0a  E|MUTYPE_TR) ){.
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7ae0: 73 74 61 63 6b 54 6f 70 54 79 70 65 28 70 29 3d  stackTopType(p)=
7af0: 3d 4d 55 54 59 50 45 5f 54 41 42 4c 45 20 29 7b  =MUTYPE_TABLE ){
7b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7b10: 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b  ushStack(p, MARK
7b20: 55 50 5f 54 52 29 3b 0a 20 20 20 20 20 20 20 20  UP_TR);.        
7b30: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
7b40: 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 74 72 3e  d(p->pOut, "<tr>
7b50: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 4);.         
7b60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7b70: 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 6d 61   pushStack(p, ma
7b80: 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20 20 20  rkup.iCode);.   
7b90: 20 20 20 20 20 20 20 20 20 72 65 6e 64 65 72 4d           renderM
7ba0: 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26  arkup(p->pOut, &
7bb0: 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20  markup);.       
7bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
7bd0: 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 54  se if( markup.iT
7be0: 79 70 65 3d 3d 4d 55 54 59 50 45 5f 48 59 50 45  ype==MUTYPE_HYPE
7bf0: 52 4c 49 4e 4b 20 29 7b 0a 20 20 20 20 20 20 20  RLINK ){.       
7c00: 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67     popStackToTag
7c10: 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65  (p, markup.iCode
7c20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  );.          sta
7c30: 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  rtAutoParagraph(
7c40: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
7c50: 6e 64 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f  nderMarkup(p->pO
7c60: 75 74 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20  ut, &markup);.  
7c70: 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63          pushStac
7c80: 6b 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64  k(p, markup.iCod
7c90: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
7ca0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
7cb0: 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d   markup.iType==M
7cc0: 55 54 59 50 45 5f 46 4f 4e 54 20 29 7b 0a 20 20  UTYPE_FONT ){.  
7cd0: 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 41            startA
7ce0: 75 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b  utoParagraph(p);
7cf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7d00: 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 54 79 70   if( markup.iTyp
7d10: 65 3d 3d 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 20  e==MUTYPE_BLOCK 
7d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
7d30: 2d 3e 77 61 6e 74 41 75 74 6f 50 61 72 61 67 72  ->wantAutoParagr
7d40: 61 70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  aph = 0;.       
7d50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
7d60: 66 28 20 28 6d 61 72 6b 75 70 2e 69 54 79 70 65  f( (markup.iType
7d70: 20 26 20 4d 55 54 59 50 45 5f 53 54 41 43 4b 20   & MUTYPE_STACK 
7d80: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
7d90: 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c      pushStack(p,
7da0: 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a   markup.iCode);.
7db0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7dc0: 20 20 20 20 20 20 72 65 6e 64 65 72 4d 61 72 6b        renderMark
7dd0: 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d 61 72  up(p->pOut, &mar
7de0: 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  kup);.        }.
7df0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7e10: 20 7a 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a   z += n;.  }.}..
7e20: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  ./*.** Transform
7e30: 20 74 68 65 20 74 65 78 74 20 69 6e 20 74 68 65   the text in the
7e40: 20 70 49 6e 20 62 6c 6f 62 2e 20 20 57 72 69 74   pIn blob.  Writ
7e50: 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
7e60: 20 69 6e 74 6f 20 74 68 65 20 70 4f 75 74 20 62   into the pOut b
7e70: 6c 6f 62 2e 20 20 54 68 65 20 70 4f 75 74 20 62  lob.  The pOut b
7e80: 6c 6f 62 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  lob should alrea
7e90: 64 79 20 62 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  dy be.** initial
7ea0: 69 7a 65 64 2e 20 20 54 68 65 20 6f 75 74 70 75  ized.  The outpu
7eb0: 74 20 69 73 20 6d 65 72 65 6c 79 20 61 70 70 65  t is merely appe
7ec0: 6e 64 65 64 20 74 6f 20 70 4f 75 74 2e 0a 2a 2a  nded to pOut..**
7ed0: 20 49 66 20 70 4f 75 74 20 69 73 20 4e 55 4c 4c   If pOut is NULL
7ee0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 70 75  , then the outpu
7ef0: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
7f00: 20 74 68 65 20 43 47 49 0a 2a 2a 20 72 65 70 6c   the CGI.** repl
7f10: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f  y..*/.void wiki_
7f20: 63 6f 6e 76 65 72 74 28 42 6c 6f 62 20 2a 70 49  convert(Blob *pI
7f30: 6e 2c 20 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 69  n, Blob *pOut, i
7f40: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 63 68 61  nt flags){.  cha
7f50: 72 20 2a 7a 3b 0a 20 20 52 65 6e 64 65 72 65 72  r *z;.  Renderer
7f60: 20 72 65 6e 64 65 72 65 72 3b 0a 20 20 0a 20 20   renderer;.  .  
7f70: 6d 65 6d 73 65 74 28 26 72 65 6e 64 65 72 65 72  memset(&renderer
7f80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72 65 6e 64  , 0, sizeof(rend
7f90: 65 72 65 72 29 29 3b 0a 20 20 72 65 6e 64 65 72  erer));.  render
7fa0: 65 72 2e 73 74 61 74 65 20 3d 20 41 4c 4c 4f 57  er.state = ALLOW
7fb0: 5f 57 49 4b 49 7c 41 54 5f 4e 45 57 4c 49 4e 45  _WIKI|AT_NEWLINE
7fc0: 7c 41 54 5f 50 41 52 41 47 52 41 50 48 3b 0a 20  |AT_PARAGRAPH;. 
7fd0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 49 4b   if( flags & WIK
7fe0: 49 5f 4e 4f 42 4c 4f 43 4b 20 29 7b 0a 20 20 20  I_NOBLOCK ){.   
7ff0: 20 72 65 6e 64 65 72 65 72 2e 73 74 61 74 65 20   renderer.state 
8000: 7c 3d 20 49 4e 4c 49 4e 45 5f 4d 41 52 4b 55 50  |= INLINE_MARKUP
8010: 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  _ONLY;.  }.  if(
8020: 20 66 6c 61 67 73 20 26 20 57 49 4b 49 5f 49 4e   flags & WIKI_IN
8030: 4c 49 4e 45 20 29 7b 0a 20 20 20 20 72 65 6e 64  LINE ){.    rend
8040: 65 72 65 72 2e 77 61 6e 74 41 75 74 6f 50 61 72  erer.wantAutoPar
8050: 61 67 72 61 70 68 20 3d 20 30 3b 0a 20 20 7d 65  agraph = 0;.  }e
8060: 6c 73 65 7b 0a 20 20 20 20 72 65 6e 64 65 72 65  lse{.    rendere
8070: 72 2e 77 61 6e 74 41 75 74 6f 50 61 72 61 67 72  r.wantAutoParagr
8080: 61 70 68 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  aph = 1;.  }.  i
8090: 66 28 20 70 4f 75 74 20 29 7b 0a 20 20 20 20 72  f( pOut ){.    r
80a0: 65 6e 64 65 72 65 72 2e 70 4f 75 74 20 3d 20 70  enderer.pOut = p
80b0: 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Out;.  }else{.  
80c0: 20 20 72 65 6e 64 65 72 65 72 2e 70 4f 75 74 20    renderer.pOut 
80d0: 3d 20 63 67 69 5f 6f 75 74 70 75 74 5f 62 6c 6f  = cgi_output_blo
80e0: 62 28 29 3b 0a 20 20 7d 0a 0a 20 20 7a 20 3d 20  b();.  }..  z = 
80f0: 62 6c 6f 62 5f 73 74 72 28 70 49 6e 29 3b 0a 20  blob_str(pIn);. 
8100: 20 77 69 6b 69 5f 72 65 6e 64 65 72 28 26 72 65   wiki_render(&re
8110: 6e 64 65 72 65 72 2c 20 7a 29 3b 0a 20 20 65 6e  nderer, z);.  en
8120: 64 41 75 74 6f 50 61 72 61 67 72 61 70 68 28 26  dAutoParagraph(&
8130: 72 65 6e 64 65 72 65 72 29 3b 0a 20 20 77 68 69  renderer);.  whi
8140: 6c 65 28 20 72 65 6e 64 65 72 65 72 2e 6e 53 74  le( renderer.nSt
8150: 61 63 6b 20 29 7b 0a 20 20 20 20 70 6f 70 53 74  ack ){.    popSt
8160: 61 63 6b 28 26 72 65 6e 64 65 72 65 72 29 3b 0a  ack(&renderer);.
8170: 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e    }.  blob_appen
8180: 64 28 72 65 6e 64 65 72 65 72 2e 70 4f 75 74 2c  d(renderer.pOut,
8190: 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 66 72 65   "\n", 1);.  fre
81a0: 65 28 72 65 6e 64 65 72 65 72 2e 61 53 74 61 63  e(renderer.aStac
81b0: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d  k);.}../*.** COM
81c0: 4d 41 4e 44 3a 20 74 65 73 74 2d 77 69 6b 69 2d  MAND: test-wiki-
81d0: 72 65 6e 64 65 72 0a 2a 2f 0a 76 6f 69 64 20 74  render.*/.void t
81e0: 65 73 74 5f 77 69 6b 69 5f 72 65 6e 64 65 72 28  est_wiki_render(
81f0: 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20 69 6e  void){.  Blob in
8200: 2c 20 6f 75 74 3b 0a 20 20 69 66 28 20 67 2e 61  , out;.  if( g.a
8210: 72 67 63 21 3d 33 20 29 20 75 73 61 67 65 28 22  rgc!=3 ) usage("
8220: 46 49 4c 45 22 29 3b 0a 20 20 62 6c 6f 62 5f 7a  FILE");.  blob_z
8230: 65 72 6f 28 26 6f 75 74 29 3b 0a 20 20 62 6c 6f  ero(&out);.  blo
8240: 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65  b_read_from_file
8250: 28 26 69 6e 2c 20 67 2e 61 72 67 76 5b 32 5d 29  (&in, g.argv[2])
8260: 3b 0a 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74  ;.  wiki_convert
8270: 28 26 69 6e 2c 20 26 6f 75 74 2c 20 30 29 3b 0a  (&in, &out, 0);.
8280: 20 20 62 6c 6f 62 5f 77 72 69 74 65 5f 74 6f 5f    blob_write_to_
8290: 66 69 6c 65 28 26 6f 75 74 2c 20 22 2d 22 29 3b  file(&out, "-");
82a0: 0a 7d 0a                                         .}.