Hex Artifact Content
Not logged in

Artifact 30a93b77785d32ac75c3da0cdb0a24cb6c5fd99d:

File src/wikiformat.c part of check-in [d57de28756] - The "h" capability is now used to enable hyperlinks to non-wiki pages. When "h" is missing, many pages give a hyperlink to the login page and automatically fill in "anonymous" as the user name. The login page jumps back to the target page after a successful login. by drh on 2008-05-05 23:15:29.

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 4d 47 20 20 20 20 20 20 20 20  RKUP_IMG        
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 20 20 20 20 20 20 20   MARKUP_I       
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 6d 67 22 2c 20 20 20 20 20 20 20   { "img",       
2320: 20 20 20 20 4d 41 52 4b 55 50 5f 49 4d 47 2c 20      MARKUP_IMG, 
2330: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2340: 53 49 4e 47 4c 45 2c 20 20 20 20 20 20 20 20 0a  SINGLE,        .
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
2370: 54 54 52 5f 41 4c 54 7c 41 54 54 52 5f 42 4f 52  TTR_ALT|ATTR_BOR
2380: 44 45 52 7c 41 54 54 52 5f 48 45 49 47 48 54 7c  DER|ATTR_HEIGHT|
2390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a0: 20 20 20 20 20 41 54 54 52 5f 48 53 50 41 43 45       ATTR_HSPACE
23b0: 7c 41 54 54 52 5f 53 52 43 7c 41 54 54 52 5f 56  |ATTR_SRC|ATTR_V
23c0: 53 50 41 43 45 7c 41 54 54 52 5f 57 49 44 54 48  SPACE|ATTR_WIDTH
23d0: 20 20 7d 2c 0a 20 7b 20 22 69 22 2c 20 20 20 20    },. { "i",    
23e0: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
23f0: 49 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 55  I,            MU
2400: 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20  TYPE_FONT,      
2410: 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 6b 62      0  },. { "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 63 68 61 72 20 2a  t i, c;.  char *
4c30: 7a 54 61 67 2c 20 2a 7a 56 61 6c 75 65 3b 0a 20  zTag, *zValue;. 
4c40: 20 69 6e 74 20 73 65 65 6e 20 3d 20 30 3b 0a 0a   int seen = 0;..
4c50: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20    if( z[1]=='/' 
4c60: 29 7b 0a 20 20 20 20 70 2d 3e 65 6e 64 54 61 67  ){.    p->endTag
4c70: 20 3d 20 31 3b 0a 20 20 20 20 69 20 3d 20 32 3b   = 1;.    i = 2;
4c80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
4c90: 3e 65 6e 64 54 61 67 20 3d 20 30 3b 0a 20 20 20  >endTag = 0;.   
4ca0: 20 69 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 7a 54   i = 1;.  }.  zT
4cb0: 61 67 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 77 68  ag = &z[i];.  wh
4cc0: 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a 5b 69  ile( isalnum(z[i
4cd0: 5d 29 20 29 7b 20 0a 20 20 20 20 7a 5b 69 5d 20  ]) ){ .    z[i] 
4ce0: 3d 20 74 6f 6c 6f 77 65 72 28 7a 5b 69 5d 29 3b  = tolower(z[i]);
4cf0: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
4d00: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7a 5b 69 5d  c = z[i];.  z[i]
4d10: 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 43 6f 64 65   = 0;.  p->iCode
4d20: 20 3d 20 66 69 6e 64 54 61 67 28 7a 54 61 67 29   = findTag(zTag)
4d30: 3b 0a 20 20 70 2d 3e 69 54 79 70 65 20 3d 20 61  ;.  p->iType = a
4d40: 4d 61 72 6b 75 70 5b 70 2d 3e 69 43 6f 64 65 5d  Markup[p->iCode]
4d50: 2e 69 54 79 70 65 3b 0a 20 20 70 2d 3e 6e 41 74  .iType;.  p->nAt
4d60: 74 72 20 3d 20 30 3b 0a 20 20 7a 5b 69 5d 20 3d  tr = 0;.  z[i] =
4d70: 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73   c;.  while( iss
4d80: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b  pace(z[i]) ){ i+
4d90: 2b 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  +; }.  while( p-
4da0: 3e 6e 41 74 74 72 3c 38 20 26 26 20 69 73 61 6c  >nAttr<8 && isal
4db0: 70 68 61 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  pha(z[i]) ){.   
4dc0: 20 7a 54 61 67 20 3d 20 26 7a 5b 69 5d 3b 0a 20   zTag = &z[i];. 
4dd0: 20 20 20 77 68 69 6c 65 28 20 69 73 61 6c 6e 75     while( isalnu
4de0: 6d 28 7a 5b 69 5d 29 20 29 7b 20 0a 20 20 20 20  m(z[i]) ){ .    
4df0: 20 20 7a 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72    z[i] = tolower
4e00: 28 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 2b  (z[i]);.      i+
4e10: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d  +;.    }.    c =
4e20: 20 7a 5b 69 5d 3b 0a 20 20 20 20 7a 5b 69 5d 20   z[i];.    z[i] 
4e30: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 41 74 74  = 0;.    p->aAtt
4e40: 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 69 43 6f 64  r[p->nAttr].iCod
4e50: 65 20 3d 20 66 69 6e 64 41 74 74 72 28 7a 54 61  e = findAttr(zTa
4e60: 67 29 3b 0a 20 20 20 20 7a 5b 69 5d 20 3d 20 63  g);.    z[i] = c
4e70: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73  ;.    while( iss
4e80: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 7a 2b  pace(z[i]) ){ z+
4e90: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69  +; }.    if( z[i
4ea0: 5d 21 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='=' ){.      
4eb0: 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74 74  p->aAttr[p->nAtt
4ec0: 72 5d 2e 7a 56 61 6c 75 65 20 3d 20 30 3b 0a 20  r].zValue = 0;. 
4ed0: 20 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d       p->aAttr[p-
4ee0: 3e 6e 41 74 74 72 5d 2e 63 54 65 72 6d 20 3d 20  >nAttr].cTerm = 
4ef0: 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  0;.      c = 0;.
4f00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f10: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c   i++;.      whil
4f20: 65 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29  e( isspace(z[i])
4f30: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
4f40: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20 29   if( z[i]=='"' )
4f50: 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  {.        i++;. 
4f60: 20 20 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20         zValue = 
4f70: 26 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 77  &z[i];.        w
4f80: 68 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20 7a 5b  hile( z[i] && z[
4f90: 69 5d 21 3d 27 22 27 20 29 7b 20 69 2b 2b 3b 20  i]!='"' ){ i++; 
4fa0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
4fb0: 20 20 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20         zValue = 
4fc0: 26 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 77  &z[i];.        w
4fd0: 68 69 6c 65 28 20 21 69 73 73 70 61 63 65 28 7a  hile( !isspace(z
4fe0: 5b 69 5d 29 20 26 26 20 7a 5b 69 5d 21 3d 27 3e  [i]) && z[i]!='>
4ff0: 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ' ){ z++; }.    
5000: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 41 74    }.      p->aAt
5010: 74 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 7a 56 61  tr[p->nAttr].zVa
5020: 6c 75 65 20 3d 20 7a 56 61 6c 75 65 3b 0a 20 20  lue = zValue;.  
5030: 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e      p->aAttr[p->
5040: 6e 41 74 74 72 5d 2e 63 54 65 72 6d 20 3d 20 63  nAttr].cTerm = c
5050: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7a   = z[i];.      z
5060: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  [i] = 0;.      i
5070: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
5080: 28 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41  ( p->aAttr[p->nA
5090: 74 74 72 5d 2e 69 43 6f 64 65 21 3d 30 20 26 26  ttr].iCode!=0 &&
50a0: 20 28 73 65 65 6e 20 26 20 70 2d 3e 61 41 74 74   (seen & p->aAtt
50b0: 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 69 43 6f 64  r[p->nAttr].iCod
50c0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
50d0: 65 65 6e 20 7c 3d 20 70 2d 3e 61 41 74 74 72 5b  een |= p->aAttr[
50e0: 70 2d 3e 6e 41 74 74 72 5d 2e 69 43 6f 64 65 3b  p->nAttr].iCode;
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 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
5130: 6e 64 65 72 20 6d 61 72 6b 75 70 20 6f 6e 20 74  nder markup on t
5140: 68 65 20 67 69 76 65 6e 20 62 6c 6f 62 2e 0a 2a  he given blob..*
5150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
5160: 6e 64 65 72 4d 61 72 6b 75 70 28 42 6c 6f 62 20  nderMarkup(Blob 
5170: 2a 70 4f 75 74 2c 20 50 61 72 73 65 64 4d 61 72  *pOut, ParsedMar
5180: 6b 75 70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  kup *p){.  int i
5190: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 6e 64 54 61  ;.  if( p->endTa
51a0: 67 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  g ){.    blob_ap
51b0: 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 3c 2f 25  pendf(pOut, "</%
51c0: 73 3e 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e  s>", aMarkup[p->
51d0: 69 43 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iCode].zName);. 
51e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62   }else{.    blob
51f0: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22  _appendf(pOut, "
5200: 3c 25 73 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d  <%s", aMarkup[p-
5210: 3e 69 43 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iCode].zName);.
5220: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5230: 2d 3e 6e 41 74 74 72 3b 20 69 2b 2b 29 7b 0a 20  ->nAttr; i++){. 
5240: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
5250: 66 28 70 4f 75 74 2c 20 22 20 25 73 22 2c 20 61  f(pOut, " %s", a
5260: 41 74 74 72 69 62 75 74 65 5b 70 2d 3e 61 41 74  Attribute[p->aAt
5270: 74 72 5b 69 5d 2e 69 43 6f 64 65 5d 2e 7a 4e 61  tr[i].iCode].zNa
5280: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
5290: 2d 3e 61 41 74 74 72 5b 69 5d 2e 7a 56 61 6c 75  ->aAttr[i].zValu
52a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f  e ){.        blo
52b0: 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20  b_appendf(pOut, 
52c0: 22 3d 5c 22 25 73 5c 22 22 2c 20 70 2d 3e 61 41  "=\"%s\"", p->aA
52d0: 74 74 72 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b 0a  ttr[i].zValue);.
52e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
52f0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f    blob_append(pO
5300: 75 74 2c 20 22 3e 22 2c 20 31 29 3b 0a 20 20 7d  ut, ">", 1);.  }
5310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
5320: 68 65 20 6d 61 72 6b 75 70 20 77 61 73 20 70 61  he markup was pa
5330: 72 73 65 64 2c 20 73 6f 6d 65 20 22 5c 30 30 30  rsed, some "\000
5340: 22 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  " may have been 
5350: 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 20 54 68 69  inserted..** Thi
5360: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72  s routine restor
5370: 65 73 20 74 6f 20 74 68 6f 73 65 20 22 5c 30 30  es to those "\00
5380: 30 22 20 76 61 6c 75 65 73 20 62 61 63 6b 20 74  0" values back t
5390: 6f 20 74 68 65 69 72 0a 2a 2a 20 6f 72 69 67 69  o their.** origi
53a0: 6e 61 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  nal content..*/.
53b0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 70 61  static void unpa
53c0: 72 73 65 4d 61 72 6b 75 70 28 50 61 72 73 65 64  rseMarkup(Parsed
53d0: 4d 61 72 6b 75 70 20 2a 70 29 7b 0a 20 20 69 6e  Markup *p){.  in
53e0: 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d  t i, n;.  for(i=
53f0: 30 3b 20 69 3c 70 2d 3e 6e 41 74 74 72 3b 20 69  0; i<p->nAttr; i
5400: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
5410: 20 3d 20 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 7a   = p->aAttr[i].z
5420: 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 7a  Value;.    if( z
5430: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5440: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a      n = strlen(z
5450: 29 3b 0a 20 20 20 20 7a 5b 6e 5d 20 3d 20 70 2d  );.    z[n] = p-
5460: 3e 61 41 74 74 72 5b 69 5d 2e 63 54 65 72 6d 3b  >aAttr[i].cTerm;
5470: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
5480: 70 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  p a single eleme
5490: 6e 74 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74  nt off of the st
54a0: 61 63 6b 2e 20 20 41 73 20 74 68 65 20 65 6c 65  ack.  As the ele
54b0: 6d 65 6e 74 20 69 73 20 70 6f 70 70 65 64 2c 0a  ment is popped,.
54c0: 2a 2a 20 6f 75 74 70 75 74 20 69 74 73 20 65 6e  ** output its en
54d0: 64 20 74 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  d tag..*/.static
54e0: 20 76 6f 69 64 20 70 6f 70 53 74 61 63 6b 28 52   void popStack(R
54f0: 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20 20 69  enderer *p){.  i
5500: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 20 29 7b 0a  f( p->nStack ){.
5510: 20 20 20 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b      p->nStack--;
5520: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
5530: 66 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 2f 25 73  f(p->pOut, "</%s
5540: 3e 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 61  >", aMarkup[p->a
5550: 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d  Stack[p->nStack]
5560: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  ].zName);.  }.}.
5570: 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 6e 65  ./*.** Push a ne
5580: 77 20 6d 61 72 6b 75 70 20 76 61 6c 75 65 20 6f  w markup value o
5590: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
55a0: 45 6e 6c 61 72 67 65 20 74 68 65 20 73 74 61 63  Enlarge the stac
55b0: 6b 0a 2a 2a 20 69 66 20 6e 65 63 65 73 73 61 72  k.** if necessar
55c0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
55d0: 64 20 70 75 73 68 53 74 61 63 6b 28 52 65 6e 64  d pushStack(Rend
55e0: 65 72 65 72 20 2a 70 2c 20 69 6e 74 20 65 6c 65  erer *p, int ele
55f0: 6d 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 53 74  m){.  if( p->nSt
5600: 61 63 6b 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29  ack>=p->nAlloc )
5610: 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20  {.    p->nAlloc 
5620: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  = p->nAlloc*2 + 
5630: 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61  100;.    p->aSta
5640: 63 6b 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e  ck = realloc(p->
5650: 61 53 74 61 63 6b 2c 20 70 2d 3e 6e 41 6c 6c 6f  aStack, p->nAllo
5660: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  c);.    if( p->a
5670: 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  Stack==0 ){.    
5680: 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22    fossil_panic("
5690: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
56a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
56b0: 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b  aStack[p->nStack
56c0: 2b 2b 5d 20 3d 20 65 6c 65 6d 3b 0a 7d 0a 0a 2f  ++] = elem;.}../
56d0: 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 73 74 61  *.** Pop the sta
56e0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 74 6f 70  ck until the top
56f0: 2d 6d 6f 73 74 20 69 54 61 67 20 65 6c 65 6d 65  -most iTag eleme
5700: 6e 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  nt is removed..*
5710: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
5720: 20 69 54 61 67 20 65 6c 65 6d 65 6e 74 20 6f 6e   iTag element on
5730: 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68 69 73   the stack, this
5740: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61   routine.** is a
5750: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
5760: 63 20 76 6f 69 64 20 70 6f 70 53 74 61 63 6b 54  c void popStackT
5770: 6f 54 61 67 28 52 65 6e 64 65 72 65 72 20 2a 70  oTag(Renderer *p
5780: 2c 20 69 6e 74 20 69 54 61 67 29 7b 0a 20 20 69  , int iTag){.  i
5790: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  nt i;.  for(i=p-
57a0: 3e 6e 53 74 61 63 6b 2d 31 3b 20 69 3e 3d 30 20  >nStack-1; i>=0 
57b0: 26 26 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 21  && p->aStack[i]!
57c0: 3d 69 54 61 67 3b 20 69 2d 2d 29 7b 7d 0a 20 20  =iTag; i--){}.  
57d0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
57e0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e 53  ;.  while( p->nS
57f0: 74 61 63 6b 3e 69 20 29 7b 0a 20 20 20 20 70 6f  tack>i ){.    po
5800: 70 53 74 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 7d  pStack(p);.  }.}
5810: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20  ../*.** Pop the 
5820: 73 74 61 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  stack until the 
5830: 74 6f 70 2d 6d 6f 73 74 20 65 6c 65 6d 65 6e 74  top-most element
5840: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a   of the stack.**
5850: 20 69 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20 74   is an element t
5860: 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
5870: 74 79 70 65 20 69 6e 20 69 4d 61 73 6b 2e 20 20  type in iMask.  
5880: 52 65 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6f  Return.** code o
5890: 66 20 74 68 65 20 6d 61 72 6b 75 70 20 65 6c 65  f the markup ele
58a0: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 6f 6e 20  ment that is on 
58b0: 6c 65 66 74 20 6f 6e 20 74 6f 70 20 6f 66 20 74  left on top of t
58c0: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 49 66 20  he stack..** If 
58d0: 74 68 65 20 73 74 61 63 6b 20 64 6f 65 73 20 6e  the stack does n
58e0: 6f 74 20 68 61 76 65 20 61 6e 20 65 6c 65 6d 65  ot have an eleme
58f0: 6e 74 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68  nt.** that match
5900: 65 73 20 69 4d 61 73 6b 2c 20 74 68 65 6e 20 6c  es iMask, then l
5910: 65 61 76 65 20 74 68 65 20 73 74 61 63 6b 20 75  eave the stack u
5920: 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 2a 2a 20  nchanged and.** 
5930: 72 65 74 75 72 6e 20 66 61 6c 73 65 20 28 4d 41  return false (MA
5940: 52 4b 55 50 5f 49 4e 56 41 4c 49 44 29 2e 0a 2a  RKUP_INVALID)..*
5950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 63  /.static int bac
5960: 6b 75 70 54 6f 54 79 70 65 28 52 65 6e 64 65 72  kupToType(Render
5970: 65 72 20 2a 70 2c 20 69 6e 74 20 69 4d 61 73 6b  er *p, int iMask
5980: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5990: 72 28 69 3d 70 2d 3e 6e 53 74 61 63 6b 2d 31 3b  r(i=p->nStack-1;
59a0: 20 69 3e 3d 30 20 26 26 20 28 61 4d 61 72 6b 75   i>=0 && (aMarku
59b0: 70 5b 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 5d 2e  p[p->aStack[i]].
59c0: 69 54 79 70 65 26 69 4d 61 73 6b 29 3d 3d 30 3b  iType&iMask)==0;
59d0: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3c   i--){}.  if( i<
59e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
59f0: 69 2b 2b 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  i++;.  while( p-
5a00: 3e 6e 53 74 61 63 6b 3e 69 20 29 7b 0a 20 20 20  >nStack>i ){.   
5a10: 20 70 6f 70 53 74 61 63 6b 28 70 29 3b 0a 20 20   popStack(p);.  
5a20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 61 53  }.  return p->aS
5a30: 74 61 63 6b 5b 69 2d 31 5d 3b 0a 7d 0a 0a 2f 2a  tack[i-1];.}../*
5a40: 0a 2a 2a 20 42 65 67 69 6e 20 61 20 6e 65 77 20  .** Begin a new 
5a50: 70 61 72 61 67 72 61 70 68 20 69 66 20 74 68 61  paragraph if tha
5a60: 74 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  t something that
5a70: 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   is needed..*/.s
5a80: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 72 74  tatic void start
5a90: 41 75 74 6f 50 61 72 61 67 72 61 70 68 28 52 65  AutoParagraph(Re
5aa0: 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20 20 69 66  nderer *p){.  if
5ab0: 28 20 70 2d 3e 77 61 6e 74 41 75 74 6f 50 61 72  ( p->wantAutoPar
5ac0: 61 67 72 61 70 68 3d 3d 30 20 29 20 72 65 74 75  agraph==0 ) retu
5ad0: 72 6e 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  rn;.  blob_appen
5ae0: 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 70 3e  df(p->pOut, "<p>
5af0: 22 2c 20 2d 31 29 3b 0a 20 20 70 75 73 68 53 74  ", -1);.  pushSt
5b00: 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 50 29  ack(p, MARKUP_P)
5b10: 3b 0a 20 20 70 2d 3e 77 61 6e 74 41 75 74 6f 50  ;.  p->wantAutoP
5b20: 61 72 61 67 72 61 70 68 20 3d 20 30 3b 0a 20 20  aragraph = 0;.  
5b30: 70 2d 3e 69 6e 41 75 74 6f 50 61 72 61 67 72 61  p->inAutoParagra
5b40: 70 68 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ph = 1;.}../*.**
5b50: 20 45 6e 64 20 61 20 70 61 72 61 67 72 61 70 68   End a paragraph
5b60: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 6f 6e   if we are in on
5b70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5b80: 64 20 65 6e 64 41 75 74 6f 50 61 72 61 67 72 61  d endAutoParagra
5b90: 70 68 28 52 65 6e 64 65 72 65 72 20 2a 70 29 7b  ph(Renderer *p){
5ba0: 0a 20 20 69 66 28 20 70 2d 3e 69 6e 41 75 74 6f  .  if( p->inAuto
5bb0: 50 61 72 61 67 72 61 70 68 20 29 7b 0a 20 20 20  Paragraph ){.   
5bc0: 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70   popStackToTag(p
5bd0: 2c 20 4d 41 52 4b 55 50 5f 50 29 3b 0a 20 20 20  , MARKUP_P);.   
5be0: 20 70 2d 3e 69 6e 41 75 74 6f 50 61 72 61 67 72   p->inAutoParagr
5bf0: 61 70 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  aph = 0;.  }.}..
5c00: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
5c10: 75 74 20 73 74 72 69 6e 67 20 63 6f 72 72 65 73  ut string corres
5c20: 70 6f 6e 64 73 20 74 6f 20 61 6e 20 65 78 69 73  ponds to an exis
5c30: 74 69 6e 67 20 62 61 73 65 6c 69 6e 65 2c 0a 2a  ting baseline,.*
5c40: 2a 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 2a  * return true..*
5c50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 5f  /.static int is_
5c60: 76 61 6c 69 64 5f 75 75 69 64 28 63 6f 6e 73 74  valid_uuid(const
5c70: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
5c80: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
5c90: 20 20 69 66 28 20 6e 3c 34 20 7c 7c 20 6e 3e 55    if( n<4 || n>U
5ca0: 55 49 44 5f 53 49 5a 45 20 29 20 72 65 74 75 72  UID_SIZE ) retur
5cb0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 76 61 6c 69  n 0;.  if( !vali
5cc0: 64 61 74 65 31 36 28 7a 2c 20 6e 29 20 29 20 72  date16(z, n) ) r
5cd0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
5ce0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 1;.}../*.** Re
5cf0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
5d00: 20 67 69 76 65 6e 20 68 79 70 65 72 6c 69 6e 6b   given hyperlink
5d10: 20 73 68 6f 75 6c 64 20 62 65 20 69 6d 70 6c 65   should be imple
5d20: 6d 65 6e 74 65 64 20 66 6f 72 0a 2a 2a 20 74 68  mented for.** th
5d30: 65 20 63 75 72 72 65 6e 74 20 6c 6f 67 69 6e 2e  e current login.
5d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
5d50: 6b 54 6f 48 79 70 65 72 6c 69 6e 6b 28 63 6f 6e  kToHyperlink(con
5d60: 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
5d70: 29 7b 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73  ){.  if( g.okHis
5d80: 74 6f 72 79 20 29 20 72 65 74 75 72 6e 20 31 3b  tory ) return 1;
5d90: 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  .  if( strncmp(z
5da0: 54 61 72 67 65 74 2c 20 22 68 74 74 70 3a 22 2c  Target, "http:",
5db0: 20 35 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 74   5)==0 .   || st
5dc0: 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c 20 22  rncmp(zTarget, "
5dd0: 68 74 74 70 73 3a 22 2c 20 36 29 3d 3d 30 0a 20  https:", 6)==0. 
5de0: 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54 61    || strncmp(zTa
5df0: 72 67 65 74 2c 20 22 66 74 70 3a 22 2c 20 34 29  rget, "ftp:", 4)
5e00: 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 74 72 6e 63  ==0 .   || strnc
5e10: 6d 70 28 7a 54 61 72 67 65 74 2c 20 22 6d 61 69  mp(zTarget, "mai
5e20: 6c 74 6f 3a 22 2c 20 37 29 3d 3d 30 0a 20 20 29  lto:", 7)==0.  )
5e30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
5e40: 20 20 7d 0a 20 20 69 66 28 20 7a 54 61 72 67 65    }.  if( zTarge
5e50: 74 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 69 73 5f  t[0]=='/' || is_
5e60: 76 61 6c 69 64 5f 75 75 69 64 28 7a 54 61 72 67  valid_uuid(zTarg
5e70: 65 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  et) ) return 0;.
5e80: 20 20 69 66 28 20 77 69 6b 69 5f 6e 61 6d 65 5f    if( wiki_name_
5e90: 69 73 5f 77 65 6c 6c 66 6f 72 6d 65 64 28 7a 54  is_wellformed(zT
5ea0: 61 72 67 65 74 29 20 29 20 72 65 74 75 72 6e 20  arget) ) return 
5eb0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
5ed0: 61 20 68 79 70 65 72 6c 69 6e 6b 2e 20 20 54 68  a hyperlink.  Th
5ee0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
5ef0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
5f00: 20 5b 2e 2e 2e 5d 0a 2a 2a 20 69 6e 20 74 68 65   [...].** in the
5f10: 20 77 69 6b 69 2e 20 20 41 70 70 65 6e 64 20 74   wiki.  Append t
5f20: 68 65 20 55 52 4c 20 74 6f 20 74 68 65 20 6f 75  he URL to the ou
5f30: 74 70 75 74 20 6f 66 20 74 68 65 20 52 65 6e 64  tput of the Rend
5f40: 65 72 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erer..*/.static 
5f50: 76 6f 69 64 20 72 65 73 6f 6c 76 65 48 79 70 65  void resolveHype
5f60: 72 6c 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72  rlink(const char
5f70: 20 2a 7a 54 61 72 67 65 74 2c 20 52 65 6e 64 65   *zTarget, Rende
5f80: 72 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 73  rer *p){.  if( s
5f90: 74 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c 20  trncmp(zTarget, 
5fa0: 22 68 74 74 70 3a 22 2c 20 35 29 3d 3d 30 20 0a  "http:", 5)==0 .
5fb0: 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54     || strncmp(zT
5fc0: 61 72 67 65 74 2c 20 22 68 74 74 70 73 3a 22 2c  arget, "https:",
5fd0: 20 36 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72   6)==0.   || str
5fe0: 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c 20 22 66  ncmp(zTarget, "f
5ff0: 74 70 3a 22 2c 20 34 29 3d 3d 30 20 0a 20 20 20  tp:", 4)==0 .   
6000: 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54 61 72 67  || strncmp(zTarg
6010: 65 74 2c 20 22 6d 61 69 6c 74 6f 3a 22 2c 20 37  et, "mailto:", 7
6020: 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 62 6c  )==0.  ){.    bl
6030: 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f  ob_appendf(p->pO
6040: 75 74 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20  ut, zTarget);.  
6050: 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 72 67 65  }else if( zTarge
6060: 74 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  t[0]=='/' ){.   
6070: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d   blob_appendf(p-
6080: 3e 70 4f 75 74 2c 20 22 25 73 25 68 22 2c 20 67  >pOut, "%s%h", g
6090: 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54 61 72 67  .zBaseURL, zTarg
60a0: 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
60b0: 20 69 73 5f 76 61 6c 69 64 5f 75 75 69 64 28 7a   is_valid_uuid(z
60c0: 54 61 72 67 65 74 29 20 29 7b 0a 20 20 20 20 62  Target) ){.    b
60d0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70  lob_appendf(p->p
60e0: 4f 75 74 2c 20 22 25 73 2f 69 6e 66 6f 2f 25 73  Out, "%s/info/%s
60f0: 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a  ", g.zBaseURL, z
6100: 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
6110: 20 69 66 28 20 77 69 6b 69 5f 6e 61 6d 65 5f 69   if( wiki_name_i
6120: 73 5f 77 65 6c 6c 66 6f 72 6d 65 64 28 7a 54 61  s_wellformed(zTa
6130: 72 67 65 74 29 20 29 7b 0a 20 20 20 20 62 6c 6f  rget) ){.    blo
6140: 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75  b_appendf(p->pOu
6150: 74 2c 20 22 25 73 2f 77 69 6b 69 3f 6e 61 6d 65  t, "%s/wiki?name
6160: 3d 25 54 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c  =%T", g.zBaseURL
6170: 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , zTarget);.  }e
6180: 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  lse{.    blob_ap
6190: 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22  pendf(p->pOut, "
61a0: 65 72 72 6f 72 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  error");.  }.}..
61b0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
61c0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
61d0: 70 61 72 73 65 64 20 6d 61 72 6b 75 70 20 69 73  parsed markup is
61e0: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
61f0: 3c 2f 76 65 72 62 61 74 69 6d 3e 20 74 61 67 2e  </verbatim> tag.
6200: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
6210: 6e 64 56 65 72 62 61 74 69 6d 28 52 65 6e 64 65  ndVerbatim(Rende
6220: 72 65 72 20 2a 70 2c 20 50 61 72 73 65 64 4d 61  rer *p, ParsedMa
6230: 72 6b 75 70 20 2a 70 4d 61 72 6b 75 70 29 7b 0a  rkup *pMarkup){.
6240: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73    char *z;.  ass
6250: 65 72 74 28 20 70 2d 3e 69 6e 56 65 72 62 61 74  ert( p->inVerbat
6260: 69 6d 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 72  im );.  if( pMar
6270: 6b 75 70 2d 3e 69 43 6f 64 65 21 3d 4d 41 52 4b  kup->iCode!=MARK
6280: 55 50 5f 56 45 52 42 41 54 49 4d 20 29 20 72 65  UP_VERBATIM ) re
6290: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 70  turn 0;.  if( !p
62a0: 4d 61 72 6b 75 70 2d 3e 65 6e 64 54 61 67 20 29  Markup->endTag )
62b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
62c0: 20 70 2d 3e 7a 56 65 72 62 61 74 69 6d 49 64 3d   p->zVerbatimId=
62d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
62e0: 20 69 66 28 20 70 4d 61 72 6b 75 70 2d 3e 6e 41   if( pMarkup->nA
62f0: 74 74 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ttr!=1 ) return 
6300: 30 3b 0a 20 20 7a 20 3d 20 70 4d 61 72 6b 75 70  0;.  z = pMarkup
6310: 2d 3e 61 41 74 74 72 5b 30 5d 2e 7a 56 61 6c 75  ->aAttr[0].zValu
6320: 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63  e;.  return strc
6330: 6d 70 28 7a 2c 20 70 2d 3e 7a 56 65 72 62 61 74  mp(z, p->zVerbat
6340: 69 6d 49 64 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  imId)==0;.}../*.
6350: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4d 55  ** Return the MU
6360: 54 59 50 45 20 66 6f 72 20 74 68 65 20 74 6f 70  TYPE for the top
6370: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
6380: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 61  /.static int sta
6390: 63 6b 54 6f 70 54 79 70 65 28 52 65 6e 64 65 72  ckTopType(Render
63a0: 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  er *p){.  if( p-
63b0: 3e 6e 53 74 61 63 6b 3c 3d 30 20 29 20 72 65 74  >nStack<=0 ) ret
63c0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
63d0: 61 4d 61 72 6b 75 70 5b 70 2d 3e 61 53 74 61 63  aMarkup[p->aStac
63e0: 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2d 31 5d 5d 2e  k[p->nStack-1]].
63f0: 69 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iType;.}../*.** 
6400: 43 6f 6e 76 65 72 74 20 74 68 65 20 77 69 6b 69  Convert the wiki
6410: 20 69 6e 20 7a 5b 5d 20 69 6e 74 6f 20 68 74 6d   in z[] into htm
6420: 6c 20 69 6e 20 74 68 65 20 72 65 6e 64 65 72 65  l in the rendere
6430: 72 20 70 2e 20 20 54 68 65 0a 2a 2a 20 72 65 6e  r p.  The.** ren
6440: 64 65 72 65 72 20 68 61 73 20 61 6c 72 65 61 64  derer has alread
6450: 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
6460: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
6470: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 70 72 6f 62  outine will prob
6480: 61 62 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ably modify the 
6490: 63 6f 6e 74 65 6e 74 20 6f 66 20 7a 5b 5d 2e 0a  content of z[]..
64a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
64b0: 69 6b 69 5f 72 65 6e 64 65 72 28 52 65 6e 64 65  iki_render(Rende
64c0: 72 65 72 20 2a 70 2c 20 63 68 61 72 20 2a 7a 29  rer *p, char *z)
64d0: 7b 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 54 79 70  {.  int tokenTyp
64e0: 65 3b 0a 20 20 50 61 72 73 65 64 4d 61 72 6b 75  e;.  ParsedMarku
64f0: 70 20 6d 61 72 6b 75 70 3b 0a 20 20 69 6e 74 20  p markup;.  int 
6500: 6e 3b 0a 20 20 69 6e 74 20 69 6e 6c 69 6e 65 4f  n;.  int inlineO
6510: 6e 6c 79 20 3d 20 28 70 2d 3e 73 74 61 74 65 20  nly = (p->state 
6520: 26 20 49 4e 4c 49 4e 45 5f 4d 41 52 4b 55 50 5f  & INLINE_MARKUP_
6530: 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 77 68 69  ONLY)!=0;..  whi
6540: 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  le( z[0] ){.    
6550: 6e 20 3d 20 6e 65 78 74 54 6f 6b 65 6e 28 7a 2c  n = nextToken(z,
6560: 20 70 2c 20 26 74 6f 6b 65 6e 54 79 70 65 29 3b   p, &tokenType);
6570: 0a 20 20 20 20 70 2d 3e 73 74 61 74 65 20 26 3d  .    p->state &=
6580: 20 7e 28 41 54 5f 4e 45 57 4c 49 4e 45 7c 41 54   ~(AT_NEWLINE|AT
6590: 5f 50 41 52 41 47 52 41 50 48 29 3b 0a 20 20 20  _PARAGRAPH);.   
65a0: 20 73 77 69 74 63 68 28 20 74 6f 6b 65 6e 54 79   switch( tokenTy
65b0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
65c0: 20 54 4f 4b 45 4e 5f 50 41 52 41 47 52 41 50 48   TOKEN_PARAGRAPH
65d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
65e0: 69 6e 6c 69 6e 65 4f 6e 6c 79 20 29 7b 0a 20 20  inlineOnly ){.  
65f0: 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 62 5f          /* blob_
6600: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
6610: 22 20 26 70 61 72 61 3b 20 22 2c 20 2d 31 29 3b  " &para; ", -1);
6620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 6c   */.          bl
6630: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
6640: 74 2c 20 22 20 26 6e 62 73 70 3b 26 6e 62 73 70  t, " &nbsp;&nbsp
6650: 3b 20 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ; ", -1);.      
6660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6670: 20 20 20 69 66 28 20 70 2d 3e 77 69 6b 69 4c 69     if( p->wikiLi
6680: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
6690: 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28    popStackToTag(
66a0: 70 2c 20 70 2d 3e 77 69 6b 69 4c 69 73 74 29 3b  p, p->wikiList);
66b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
66c0: 77 69 6b 69 4c 69 73 74 20 3d 20 30 3b 0a 20 20  wikiList = 0;.  
66d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
66e0: 20 20 20 20 65 6e 64 41 75 74 6f 50 61 72 61 67      endAutoParag
66f0: 72 61 70 68 28 70 29 3b 0a 20 20 20 20 20 20 20  raph(p);.       
6700: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
6710: 70 2d 3e 70 4f 75 74 2c 20 22 5c 6e 5c 6e 22 2c  p->pOut, "\n\n",
6720: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   1);.          p
6730: 2d 3e 77 61 6e 74 41 75 74 6f 50 61 72 61 67 72  ->wantAutoParagr
6740: 61 70 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  aph = 1;.       
6750: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 74   }.        p->st
6760: 61 74 65 20 7c 3d 20 41 54 5f 50 41 52 41 47 52  ate |= AT_PARAGR
6770: 41 50 48 7c 41 54 5f 4e 45 57 4c 49 4e 45 3b 0a  APH|AT_NEWLINE;.
6780: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
67a0: 65 20 54 4f 4b 45 4e 5f 4e 45 57 4c 49 4e 45 3a  e TOKEN_NEWLINE:
67b0: 20 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f   {.        blob_
67c0: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
67d0: 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  "\n", 1);.      
67e0: 20 20 70 2d 3e 73 74 61 74 65 20 7c 3d 20 41 54    p->state |= AT
67f0: 5f 4e 45 57 4c 49 4e 45 3b 0a 20 20 20 20 20 20  _NEWLINE;.      
6800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6810: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45  .      case TOKE
6820: 4e 5f 42 55 4c 4c 45 54 3a 20 7b 0a 20 20 20 20  N_BULLET: {.    
6830: 20 20 20 20 69 66 28 20 69 6e 6c 69 6e 65 4f 6e      if( inlineOn
6840: 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
6850: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
6860: 4f 75 74 2c 20 22 20 26 23 31 34 39 3b 20 22 2c  Out, " &#149; ",
6870: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   -1);.        }e
6880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
6890: 66 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74 21 3d  f( p->wikiList!=
68a0: 4d 41 52 4b 55 50 5f 55 4c 20 29 7b 0a 20 20 20  MARKUP_UL ){.   
68b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
68c0: 77 69 6b 69 4c 69 73 74 20 29 7b 0a 20 20 20 20  wikiList ){.    
68d0: 20 20 20 20 20 20 20 20 20 20 70 6f 70 53 74 61            popSta
68e0: 63 6b 54 6f 54 61 67 28 70 2c 20 70 2d 3e 77 69  ckToTag(p, p->wi
68f0: 6b 69 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  kiList);.       
6900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6910: 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20     pushStack(p, 
6920: 4d 41 52 4b 55 50 5f 55 4c 29 3b 0a 20 20 20 20  MARKUP_UL);.    
6930: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
6940: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 75  end(p->pOut, "<u
6950: 6c 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  l>", 4);.       
6960: 20 20 20 20 20 70 2d 3e 77 69 6b 69 4c 69 73 74       p->wikiList
6970: 20 3d 20 4d 41 52 4b 55 50 5f 55 4c 3b 0a 20 20   = MARKUP_UL;.  
6980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6990: 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61      popStackToTa
69a0: 67 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b  g(p, MARKUP_LI);
69b0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
69c0: 41 75 74 6f 50 61 72 61 67 72 61 70 68 28 70 29  AutoParagraph(p)
69d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 73 68  ;.          push
69e0: 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f  Stack(p, MARKUP_
69f0: 4c 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  LI);.          b
6a00: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
6a10: 75 74 2c 20 22 3c 6c 69 3e 22 2c 20 34 29 3b 0a  ut, "<li>", 4);.
6a20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6a30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6a40: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45  .      case TOKE
6a50: 4e 5f 45 4e 55 4d 3a 20 7b 0a 20 20 20 20 20 20  N_ENUM: {.      
6a60: 20 20 69 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79    if( inlineOnly
6a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c   ){.          bl
6a80: 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f  ob_appendf(p->pO
6a90: 75 74 2c 20 22 20 28 25 64 29 20 22 2c 20 61 74  ut, " (%d) ", at
6aa0: 6f 69 28 7a 29 29 3b 0a 20 20 20 20 20 20 20 20  oi(z));.        
6ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6ac0: 20 69 66 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74   if( p->wikiList
6ad0: 21 3d 4d 41 52 4b 55 50 5f 4f 4c 20 29 7b 0a 20  !=MARKUP_OL ){. 
6ae0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
6af0: 2d 3e 77 69 6b 69 4c 69 73 74 20 29 7b 0a 20 20  ->wikiList ){.  
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 53              popS
6b10: 74 61 63 6b 54 6f 54 61 67 28 70 2c 20 70 2d 3e  tackToTag(p, p->
6b20: 77 69 6b 69 4c 69 73 74 29 3b 0a 20 20 20 20 20  wikiList);.     
6b30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6b40: 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70       pushStack(p
6b50: 2c 20 4d 41 52 4b 55 50 5f 4f 4c 29 3b 0a 20 20  , MARKUP_OL);.  
6b60: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
6b70: 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22  ppend(p->pOut, "
6b80: 3c 6f 6c 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20  <ol>", 4);.     
6b90: 20 20 20 20 20 20 20 70 2d 3e 77 69 6b 69 4c 69         p->wikiLi
6ba0: 73 74 20 3d 20 4d 41 52 4b 55 50 5f 4f 4c 3b 0a  st = MARKUP_OL;.
6bb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6bc0: 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f        popStackTo
6bd0: 54 61 67 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49  Tag(p, MARKUP_LI
6be0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  );.          sta
6bf0: 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  rtAutoParagraph(
6c00: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  p);.          pu
6c10: 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55  shStack(p, MARKU
6c20: 50 5f 4c 49 29 3b 0a 20 20 20 20 20 20 20 20 20  P_LI);.         
6c30: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d   blob_appendf(p-
6c40: 3e 70 4f 75 74 2c 20 22 3c 6c 69 20 76 61 6c 75  >pOut, "<li valu
6c50: 65 3d 5c 22 25 64 5c 22 3e 22 2c 20 61 74 6f 69  e=\"%d\">", atoi
6c60: 28 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (z));.        }.
6c70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6c80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
6c90: 65 20 54 4f 4b 45 4e 5f 49 4e 44 45 4e 54 3a 20  e TOKEN_INDENT: 
6ca0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  {.        if( in
6cb0: 6c 69 6e 65 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  lineOnly ){.    
6cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6cd0: 3e 77 69 6b 69 4c 69 73 74 3d 3d 30 20 29 3b 0a  >wikiList==0 );.
6ce0: 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74            pushSt
6cf0: 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 42 4c  ack(p, MARKUP_BL
6d00: 4f 43 4b 51 55 4f 54 45 29 3b 0a 20 20 20 20 20  OCKQUOTE);.     
6d10: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
6d20: 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 62 6c 6f 63  (p->pOut, "<bloc
6d30: 6b 71 75 6f 74 65 3e 22 2c 20 2d 31 29 3b 0a 20  kquote>", -1);. 
6d40: 20 20 20 20 20 20 20 20 20 70 2d 3e 77 61 6e 74           p->want
6d50: 41 75 74 6f 50 61 72 61 67 72 61 70 68 20 3d 20  AutoParagraph = 
6d60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
6d70: 77 69 6b 69 4c 69 73 74 20 3d 20 4d 41 52 4b 55  wikiList = MARKU
6d80: 50 5f 42 4c 4f 43 4b 51 55 4f 54 45 3b 0a 20 20  P_BLOCKQUOTE;.  
6d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6da0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6db0: 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f       case TOKEN_
6dc0: 43 48 41 52 41 43 54 45 52 3a 20 7b 0a 20 20 20  CHARACTER: {.   
6dd0: 20 20 20 20 20 73 74 61 72 74 41 75 74 6f 50 61       startAutoPa
6de0: 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20 20 20  ragraph(p);.    
6df0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3c      if( z[0]=='<
6e00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  ' ){.          b
6e10: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
6e20: 75 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a  ut, "&lt;", 4);.
6e30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6e40: 28 20 7a 5b 30 5d 3d 3d 27 26 27 20 29 7b 0a 20  ( z[0]=='&' ){. 
6e50: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70           blob_ap
6e60: 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 26  pend(p->pOut, "&
6e70: 61 6d 70 3b 22 2c 20 35 29 3b 0a 20 20 20 20 20  amp;", 5);.     
6e80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
6e90: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6ea0: 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 4c 49 4e    case TOKEN_LIN
6eb0: 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61  K: {.        cha
6ec0: 72 20 2a 7a 54 61 72 67 65 74 3b 0a 20 20 20 20  r *zTarget;.    
6ed0: 20 20 20 20 63 68 61 72 20 2a 7a 44 69 73 70 6c      char *zDispl
6ee0: 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ay = 0;.        
6ef0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
6f00: 20 20 69 6e 74 20 73 61 76 65 64 53 74 61 74 65    int savedState
6f10: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6b  ;.        int ok
6f20: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 41  ;.        startA
6f30: 75 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b  utoParagraph(p);
6f40: 0a 20 20 20 20 20 20 20 20 7a 54 61 72 67 65 74  .        zTarget
6f50: 20 3d 20 26 7a 5b 31 5d 3b 0a 20 20 20 20 20 20   = &z[1];.      
6f60: 20 20 66 6f 72 28 69 3d 31 3b 20 7a 5b 69 5d 20    for(i=1; z[i] 
6f70: 26 26 20 7a 5b 69 5d 21 3d 27 5d 27 3b 20 69 2b  && z[i]!=']'; i+
6f80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
6f90: 28 20 7a 5b 69 5d 3d 3d 27 7c 27 20 26 26 20 7a  ( z[i]=='|' && z
6fa0: 44 69 73 70 6c 61 79 3d 3d 30 20 29 7b 0a 20 20  Display==0 ){.  
6fb0: 20 20 20 20 20 20 20 20 20 20 7a 44 69 73 70 6c            zDispl
6fc0: 61 79 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20  ay = &z[i+1];.  
6fd0: 20 20 20 20 20 20 20 20 20 20 7a 5b 69 5d 20 3d            z[i] =
6fe0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
6ff0: 66 6f 72 28 6a 3d 69 2d 31 3b 20 6a 3e 30 20 26  for(j=i-1; j>0 &
7000: 26 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b  & isspace(z[j]);
7010: 20 6a 2d 2d 29 7b 20 7a 5b 6a 5d 20 3d 20 30 3b   j--){ z[j] = 0;
7020: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
7030: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7040: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[i] = 0;.     
7050: 20 20 20 69 66 28 20 7a 44 69 73 70 6c 61 79 3d     if( zDisplay=
7060: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7070: 7a 44 69 73 70 6c 61 79 20 3d 20 7a 54 61 72 67  zDisplay = zTarg
7080: 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  et;.        }els
7090: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
70a0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 44 69  le( isspace(*zDi
70b0: 73 70 6c 61 79 29 20 29 20 7a 44 69 73 70 6c 61  splay) ) zDispla
70c0: 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  y++;.        }. 
70d0: 20 20 20 20 20 20 20 6f 6b 20 3d 20 6f 6b 54 6f         ok = okTo
70e0: 48 79 70 65 72 6c 69 6e 6b 28 7a 54 61 72 67 65  Hyperlink(zTarge
70f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
7100: 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ok ){.          
7110: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
7120: 4f 75 74 2c 20 22 3c 61 20 68 72 65 66 3d 5c 22  Out, "<a href=\"
7130: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
7140: 20 20 72 65 73 6f 6c 76 65 48 79 70 65 72 6c 69    resolveHyperli
7150: 6e 6b 28 7a 54 61 72 67 65 74 2c 20 70 29 3b 0a  nk(zTarget, p);.
7160: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
7170: 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22  ppend(p->pOut, "
7180: 5c 22 3e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  \">", -1);.     
7190: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 61 76     }.        sav
71a0: 65 64 53 74 61 74 65 20 3d 20 70 2d 3e 73 74 61  edState = p->sta
71b0: 74 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  te;.        p->s
71c0: 74 61 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57  tate &= ~ALLOW_W
71d0: 49 4b 49 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  IKI;.        p->
71e0: 73 74 61 74 65 20 7c 3d 20 46 4f 4e 54 5f 4d 41  state |= FONT_MA
71f0: 52 4b 55 50 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  RKUP_ONLY;.     
7200: 20 20 20 77 69 6b 69 5f 72 65 6e 64 65 72 28 70     wiki_render(p
7210: 2c 20 7a 44 69 73 70 6c 61 79 29 3b 0a 20 20 20  , zDisplay);.   
7220: 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 3d 20       p->state = 
7230: 73 61 76 65 64 53 74 61 74 65 3b 0a 20 20 20 20  savedState;.    
7240: 20 20 20 20 69 66 28 20 6f 6b 20 29 20 62 6c 6f      if( ok ) blo
7250: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
7260: 2c 20 22 3c 2f 61 3e 22 2c 20 34 29 3b 0a 20 20  , "</a>", 4);.  
7270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7280: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
7290: 54 4f 4b 45 4e 5f 54 45 58 54 3a 20 7b 0a 20 20  TOKEN_TEXT: {.  
72a0: 20 20 20 20 20 20 73 74 61 72 74 41 75 74 6f 50        startAutoP
72b0: 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20 20  aragraph(p);.   
72c0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
72d0: 28 70 2d 3e 70 4f 75 74 2c 20 7a 2c 20 6e 29 3b  (p->pOut, z, n);
72e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
72f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
7300: 73 65 20 54 4f 4b 45 4e 5f 4d 41 52 4b 55 50 3a  se TOKEN_MARKUP:
7310: 20 7b 0a 20 20 20 20 20 20 20 20 70 61 72 73 65   {.        parse
7320: 4d 61 72 6b 75 70 28 26 6d 61 72 6b 75 70 2c 20  Markup(&markup, 
7330: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
7340: 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d 20 29 7b  p->inVerbatim ){
7350: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
7360: 6e 64 56 65 72 62 61 74 69 6d 28 70 2c 20 26 6d  ndVerbatim(p, &m
7370: 61 72 6b 75 70 29 20 29 7b 0a 20 20 20 20 20 20  arkup) ){.      
7380: 20 20 20 20 20 20 70 2d 3e 69 6e 56 65 72 62 61        p->inVerba
7390: 74 69 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tim = 0;.       
73a0: 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 3d 20       p->state = 
73b0: 70 2d 3e 70 72 65 56 65 72 62 53 74 61 74 65 3b  p->preVerbState;
73c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f  .            blo
73d0: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
73e0: 2c 20 22 3c 2f 70 72 65 3e 22 2c 20 36 29 3b 0a  , "</pre>", 6);.
73f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
7400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 70  .            unp
7410: 61 72 73 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b  arseMarkup(&mark
7420: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  up);.           
7430: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e   blob_append(p->
7440: 70 4f 75 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29  pOut, "&lt;", 4)
7450: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  ;.            n 
7460: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
7470: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
7480: 66 28 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 3d  f( markup.iCode=
7490: 3d 4d 41 52 4b 55 50 5f 49 4e 56 41 4c 49 44 20  =MARKUP_INVALID 
74a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 70  ){.          unp
74b0: 61 72 73 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b  arseMarkup(&mark
74c0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  up);.          s
74d0: 74 61 72 74 41 75 74 6f 50 61 72 61 67 72 61 70  tartAutoParagrap
74e0: 68 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  h(p);.          
74f0: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
7500: 4f 75 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b  Out, "&lt;", 4);
7510: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31  .          n = 1
7520: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
7530: 69 66 28 20 28 6d 61 72 6b 75 70 2e 69 54 79 70  if( (markup.iTyp
7540: 65 26 4d 55 54 59 50 45 5f 46 4f 4e 54 29 3d 3d  e&MUTYPE_FONT)==
7550: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
7560: 20 20 20 20 20 20 26 26 20 28 70 2d 3e 73 74 61        && (p->sta
7570: 74 65 20 26 20 46 4f 4e 54 5f 4d 41 52 4b 55 50  te & FONT_MARKUP
7580: 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
7590: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
75a0: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  hing */.        
75b0: 7d 65 6c 73 65 20 69 66 28 20 69 6e 6c 69 6e 65  }else if( inline
75c0: 4f 6e 6c 79 20 26 26 20 28 6d 61 72 6b 75 70 2e  Only && (markup.
75d0: 69 54 79 70 65 26 4d 55 54 59 50 45 5f 49 4e 4c  iType&MUTYPE_INL
75e0: 49 4e 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  INE)==0 ){.     
75f0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
7600: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  ng */.        }e
7610: 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69  lse if( markup.i
7620: 43 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f 4e 4f 57  Code==MARKUP_NOW
7630: 49 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IKI ){.         
7640: 20 69 66 28 20 6d 61 72 6b 75 70 2e 65 6e 64 54   if( markup.endT
7650: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
7660: 20 20 70 2d 3e 73 74 61 74 65 20 7c 3d 20 41 4c    p->state |= AL
7670: 4c 4f 57 5f 57 49 4b 49 3b 0a 20 20 20 20 20 20  LOW_WIKI;.      
7680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7690: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
76a0: 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a  &= ~ALLOW_WIKI;.
76b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
76c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 61      }else if( ma
76d0: 72 6b 75 70 2e 65 6e 64 54 61 67 20 29 7b 0a 20  rkup.endTag ){. 
76e0: 20 20 20 20 20 20 20 20 20 70 6f 70 53 74 61 63           popStac
76f0: 6b 54 6f 54 61 67 28 70 2c 20 6d 61 72 6b 75 70  kToTag(p, markup
7700: 2e 69 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  .iCode);.       
7710: 20 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b 75   }else if( marku
7720: 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f  p.iCode==MARKUP_
7730: 56 45 52 42 41 54 49 4d 20 29 7b 0a 20 20 20 20  VERBATIM ){.    
7740: 20 20 20 20 20 20 69 66 28 20 6d 61 72 6b 75 70        if( markup
7750: 2e 6e 41 74 74 72 3d 3d 31 20 29 7b 0a 20 20 20  .nAttr==1 ){.   
7760: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 56 65 72           p->zVer
7770: 62 61 74 69 6d 49 64 20 3d 20 6d 61 72 6b 75 70  batimId = markup
7780: 2e 61 41 74 74 72 5b 30 5d 2e 7a 56 61 6c 75 65  .aAttr[0].zValue
7790: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
77a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
77b0: 2d 3e 7a 56 65 72 62 61 74 69 6d 49 64 20 3d 20  ->zVerbatimId = 
77c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
77d0: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65           p->inVe
77e0: 72 62 61 74 69 6d 20 3d 20 31 3b 0a 20 20 20 20  rbatim = 1;.    
77f0: 20 20 20 20 20 20 70 2d 3e 70 72 65 56 65 72 62        p->preVerb
7800: 53 74 61 74 65 20 3d 20 70 2d 3e 73 74 61 74 65  State = p->state
7810: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73  ;.          p->s
7820: 74 61 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57  tate &= ~ALLOW_W
7830: 49 4b 49 3b 0a 20 20 20 20 20 20 20 20 20 20 62  IKI;.          b
7840: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
7850: 75 74 2c 20 22 3c 70 72 65 3e 22 2c 20 35 29 3b  ut, "<pre>", 5);
7860: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 61  .          p->wa
7870: 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 20  ntAutoParagraph 
7880: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
7890: 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 54  se if( markup.iT
78a0: 79 70 65 3d 3d 4d 55 54 59 50 45 5f 4c 49 20 29  ype==MUTYPE_LI )
78b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
78c0: 62 61 63 6b 75 70 54 6f 54 79 70 65 28 70 2c 20  backupToType(p, 
78d0: 4d 55 54 59 50 45 5f 4c 49 53 54 29 3d 3d 30 20  MUTYPE_LIST)==0 
78e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
78f0: 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b  ushStack(p, MARK
7900: 55 50 5f 55 4c 29 3b 0a 20 20 20 20 20 20 20 20  UP_UL);.        
7910: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
7920: 70 2d 3e 70 4f 75 74 2c 20 22 3c 75 6c 3e 22 2c  p->pOut, "<ul>",
7930: 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
7940: 0a 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53  .          pushS
7950: 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4c  tack(p, MARKUP_L
7960: 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  I);.          re
7970: 6e 64 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f  nderMarkup(p->pO
7980: 75 74 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20  ut, &markup);.  
7990: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
79a0: 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d 55  markup.iType==MU
79b0: 54 59 50 45 5f 54 52 20 29 7b 0a 20 20 20 20 20  TYPE_TR ){.     
79c0: 20 20 20 20 20 69 66 28 20 62 61 63 6b 75 70 54       if( backupT
79d0: 6f 54 79 70 65 28 70 2c 20 4d 55 54 59 50 45 5f  oType(p, MUTYPE_
79e0: 54 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20  TABLE) ){.      
79f0: 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28        pushStack(
7a00: 70 2c 20 4d 41 52 4b 55 50 5f 54 52 29 3b 0a 20  p, MARKUP_TR);. 
7a10: 20 20 20 20 20 20 20 20 20 20 20 72 65 6e 64 65             rende
7a20: 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c  rMarkup(p->pOut,
7a30: 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20   &markup);.     
7a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7a50: 65 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e  else if( markup.
7a60: 69 54 79 70 65 3d 3d 4d 55 54 59 50 45 5f 54 44  iType==MUTYPE_TD
7a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
7a80: 28 20 62 61 63 6b 75 70 54 6f 54 79 70 65 28 70  ( backupToType(p
7a90: 2c 20 4d 55 54 59 50 45 5f 54 41 42 4c 45 7c 4d  , MUTYPE_TABLE|M
7aa0: 55 54 59 50 45 5f 54 52 29 20 29 7b 0a 20 20 20  UTYPE_TR) ){.   
7ab0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 61           if( sta
7ac0: 63 6b 54 6f 70 54 79 70 65 28 70 29 3d 3d 4d 55  ckTopType(p)==MU
7ad0: 54 59 50 45 5f 54 41 42 4c 45 20 29 7b 0a 20 20  TYPE_TABLE ){.  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 73 68              push
7af0: 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f  Stack(p, MARKUP_
7b00: 54 52 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  TR);.           
7b10: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
7b20: 2d 3e 70 4f 75 74 2c 20 22 3c 74 72 3e 22 2c 20  ->pOut, "<tr>", 
7b30: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
7b40: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
7b50: 73 68 53 74 61 63 6b 28 70 2c 20 6d 61 72 6b 75  shStack(p, marku
7b60: 70 2e 69 43 6f 64 65 29 3b 0a 20 20 20 20 20 20  p.iCode);.      
7b70: 20 20 20 20 20 20 72 65 6e 64 65 72 4d 61 72 6b        renderMark
7b80: 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d 61 72  up(p->pOut, &mar
7b90: 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  kup);.          
7ba0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
7bb0: 69 66 28 20 6d 61 72 6b 75 70 2e 69 54 79 70 65  if( markup.iType
7bc0: 3d 3d 4d 55 54 59 50 45 5f 48 59 50 45 52 4c 49  ==MUTYPE_HYPERLI
7bd0: 4e 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NK ){.          
7be0: 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70 2c  popStackToTag(p,
7bf0: 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a   markup.iCode);.
7c00: 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 41            startA
7c10: 75 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b  utoParagraph(p);
7c20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 6e 64 65  .          rende
7c30: 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c  rMarkup(p->pOut,
7c40: 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20   &markup);.     
7c50: 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70       pushStack(p
7c60: 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b  , markup.iCode);
7c70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7c80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 61            if( ma
7c90: 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54 59  rkup.iType==MUTY
7ca0: 50 45 5f 46 4f 4e 54 20 29 7b 0a 20 20 20 20 20  PE_FONT ){.     
7cb0: 20 20 20 20 20 20 20 73 74 61 72 74 41 75 74 6f         startAuto
7cc0: 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20  Paragraph(p);.  
7cd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7ce0: 28 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d  ( markup.iType==
7cf0: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 20 29 7b 0a  MUTYPE_BLOCK ){.
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77              p->w
7d10: 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  antAutoParagraph
7d20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7d30: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7d40: 28 6d 61 72 6b 75 70 2e 69 54 79 70 65 20 26 20  (markup.iType & 
7d50: 4d 55 54 59 50 45 5f 53 54 41 43 4b 20 29 21 3d  MUTYPE_STACK )!=
7d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7d70: 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 6d 61   pushStack(p, ma
7d80: 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20 20 20  rkup.iCode);.   
7d90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7da0: 20 20 20 72 65 6e 64 65 72 4d 61 72 6b 75 70 28     renderMarkup(
7db0: 70 2d 3e 70 4f 75 74 2c 20 26 6d 61 72 6b 75 70  p->pOut, &markup
7dc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7de0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20    }.    }.    z 
7df0: 2b 3d 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  += n;.  }.}.../*
7e00: 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68  .** Transform th
7e10: 65 20 74 65 78 74 20 69 6e 20 74 68 65 20 70 49  e text in the pI
7e20: 6e 20 62 6c 6f 62 2e 20 20 57 72 69 74 65 20 74  n blob.  Write t
7e30: 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
7e40: 74 6f 20 74 68 65 20 70 4f 75 74 20 62 6c 6f 62  to the pOut blob
7e50: 2e 20 20 54 68 65 20 70 4f 75 74 20 62 6c 6f 62  .  The pOut blob
7e60: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
7e70: 62 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  be.** initialize
7e80: 64 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 69  d.  The output i
7e90: 73 20 6d 65 72 65 6c 79 20 61 70 70 65 6e 64 65  s merely appende
7ea0: 64 20 74 6f 20 70 4f 75 74 2e 0a 2a 2a 20 49 66  d to pOut..** If
7eb0: 20 70 4f 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74   pOut is NULL, t
7ec0: 68 65 6e 20 74 68 65 20 6f 75 74 70 75 74 20 69  hen the output i
7ed0: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
7ee0: 65 20 43 47 49 0a 2a 2a 20 72 65 70 6c 79 2e 0a  e CGI.** reply..
7ef0: 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 63 6f 6e  */.void wiki_con
7f00: 76 65 72 74 28 42 6c 6f 62 20 2a 70 49 6e 2c 20  vert(Blob *pIn, 
7f10: 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 69 6e 74 20  Blob *pOut, int 
7f20: 66 6c 61 67 73 29 7b 0a 20 20 63 68 61 72 20 2a  flags){.  char *
7f30: 7a 3b 0a 20 20 52 65 6e 64 65 72 65 72 20 72 65  z;.  Renderer re
7f40: 6e 64 65 72 65 72 3b 0a 20 20 0a 20 20 6d 65 6d  nderer;.  .  mem
7f50: 73 65 74 28 26 72 65 6e 64 65 72 65 72 2c 20 30  set(&renderer, 0
7f60: 2c 20 73 69 7a 65 6f 66 28 72 65 6e 64 65 72 65  , sizeof(rendere
7f70: 72 29 29 3b 0a 20 20 72 65 6e 64 65 72 65 72 2e  r));.  renderer.
7f80: 73 74 61 74 65 20 3d 20 41 4c 4c 4f 57 5f 57 49  state = ALLOW_WI
7f90: 4b 49 7c 41 54 5f 4e 45 57 4c 49 4e 45 7c 41 54  KI|AT_NEWLINE|AT
7fa0: 5f 50 41 52 41 47 52 41 50 48 3b 0a 20 20 69 66  _PARAGRAPH;.  if
7fb0: 28 20 66 6c 61 67 73 20 26 20 57 49 4b 49 5f 4e  ( flags & WIKI_N
7fc0: 4f 42 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  OBLOCK ){.    re
7fd0: 6e 64 65 72 65 72 2e 73 74 61 74 65 20 7c 3d 20  nderer.state |= 
7fe0: 49 4e 4c 49 4e 45 5f 4d 41 52 4b 55 50 5f 4f 4e  INLINE_MARKUP_ON
7ff0: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  LY;.  }.  if( fl
8000: 61 67 73 20 26 20 57 49 4b 49 5f 49 4e 4c 49 4e  ags & WIKI_INLIN
8010: 45 20 29 7b 0a 20 20 20 20 72 65 6e 64 65 72 65  E ){.    rendere
8020: 72 2e 77 61 6e 74 41 75 74 6f 50 61 72 61 67 72  r.wantAutoParagr
8030: 61 70 68 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  aph = 0;.  }else
8040: 7b 0a 20 20 20 20 72 65 6e 64 65 72 65 72 2e 77  {.    renderer.w
8050: 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  antAutoParagraph
8060: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
8070: 70 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 6e 64  pOut ){.    rend
8080: 65 72 65 72 2e 70 4f 75 74 20 3d 20 70 4f 75 74  erer.pOut = pOut
8090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
80a0: 65 6e 64 65 72 65 72 2e 70 4f 75 74 20 3d 20 63  enderer.pOut = c
80b0: 67 69 5f 6f 75 74 70 75 74 5f 62 6c 6f 62 28 29  gi_output_blob()
80c0: 3b 0a 20 20 7d 0a 0a 20 20 7a 20 3d 20 62 6c 6f  ;.  }..  z = blo
80d0: 62 5f 73 74 72 28 70 49 6e 29 3b 0a 20 20 77 69  b_str(pIn);.  wi
80e0: 6b 69 5f 72 65 6e 64 65 72 28 26 72 65 6e 64 65  ki_render(&rende
80f0: 72 65 72 2c 20 7a 29 3b 0a 20 20 65 6e 64 41 75  rer, z);.  endAu
8100: 74 6f 50 61 72 61 67 72 61 70 68 28 26 72 65 6e  toParagraph(&ren
8110: 64 65 72 65 72 29 3b 0a 20 20 77 68 69 6c 65 28  derer);.  while(
8120: 20 72 65 6e 64 65 72 65 72 2e 6e 53 74 61 63 6b   renderer.nStack
8130: 20 29 7b 0a 20 20 20 20 70 6f 70 53 74 61 63 6b   ){.    popStack
8140: 28 26 72 65 6e 64 65 72 65 72 29 3b 0a 20 20 7d  (&renderer);.  }
8150: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 72  .  blob_append(r
8160: 65 6e 64 65 72 65 72 2e 70 4f 75 74 2c 20 22 5c  enderer.pOut, "\
8170: 6e 22 2c 20 31 29 3b 0a 20 20 66 72 65 65 28 72  n", 1);.  free(r
8180: 65 6e 64 65 72 65 72 2e 61 53 74 61 63 6b 29 3b  enderer.aStack);
8190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e  .}../*.** COMMAN
81a0: 44 3a 20 74 65 73 74 2d 77 69 6b 69 2d 72 65 6e  D: test-wiki-ren
81b0: 64 65 72 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74  der.*/.void test
81c0: 5f 77 69 6b 69 5f 72 65 6e 64 65 72 28 76 6f 69  _wiki_render(voi
81d0: 64 29 7b 0a 20 20 42 6c 6f 62 20 69 6e 2c 20 6f  d){.  Blob in, o
81e0: 75 74 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63  ut;.  if( g.argc
81f0: 21 3d 33 20 29 20 75 73 61 67 65 28 22 46 49 4c  !=3 ) usage("FIL
8200: 45 22 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f  E");.  blob_zero
8210: 28 26 6f 75 74 29 3b 0a 20 20 62 6c 6f 62 5f 72  (&out);.  blob_r
8220: 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 69  ead_from_file(&i
8230: 6e 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20  n, g.argv[2]);. 
8240: 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 69   wiki_convert(&i
8250: 6e 2c 20 26 6f 75 74 2c 20 30 29 3b 0a 20 20 62  n, &out, 0);.  b
8260: 6c 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c  lob_write_to_fil
8270: 65 28 26 6f 75 74 2c 20 22 2d 22 29 3b 0a 7d 0a  e(&out, "-");.}.