Hex Artifact Content
Not logged in

Artifact 5b8cc3e643b23755cc674368ef60d9b0afae2fdb:

File src/wikiformat.c part of check-in [47cc9dfec8] - Experimental - Pass < !-- --> comments through the wiki unchanged unless inside a < verbatim > block in which case it is htmlized. Also pass < span > tags, treating them as font markup. These changes make it easier to convert existing html pages and specifically allow the inclusion of license text in pages derived from copyright material. by robert on 2009-04-27 08:43:38.

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 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c 64  **.** You should
01f0: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61   have received a
0200: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55   copy of the GNU
0210: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 0a   General Public.
0220: 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e 67  ** License along
0230: 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 61   with this libra
0240: 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 74  ry; if not, writ
0250: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 65  e to the.** Free
0260: 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61   Software Founda
0270: 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54  tion, Inc., 59 T
0280: 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 75  emple Place - Su
0290: 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 74  ite 330,.** Bost
02a0: 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 33  on, MA  02111-13
02b0: 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 41  07, USA..**.** A
02c0: 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e  uthor contact in
02d0: 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20  formation:.**   
02e0: 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a  drh@hwaci.com.**
02f0: 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77     http://www.hw
0300: 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a  aci.com/drh/.**.
0310: 2a 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 0a  ***************.
0360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0370: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f  contains code to
0380: 20 64 6f 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f   do formatting o
0390: 66 20 77 69 6b 69 20 74 65 78 74 2e 0a 2a 2f 0a  f wiki text..*/.
03a0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  .h>.#include "co
03c0: 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65  nfig.h".#include
03d0: 20 22 77 69 6b 69 66 6f 72 6d 61 74 2e 68 22 0a   "wikiformat.h".
03e0: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 2f  .#if INTERFACE./
03f0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 77 69 6b  *.** Allowed wik
0400: 69 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  i transformation
0410: 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2f 0a 23   operations.*/.#
0420: 64 65 66 69 6e 65 20 57 49 4b 49 5f 4e 4f 46 4f  define WIKI_NOFO
0430: 4c 4c 4f 57 20 20 20 20 20 20 20 30 78 30 30 31  LLOW       0x001
0440: 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 5f 48 54  .#define WIKI_HT
0450: 4d 4c 20 20 20 20 20 20 20 20 20 20 20 30 78 30  ML           0x0
0460: 30 32 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 5f  02.#define WIKI_
0470: 49 4e 4c 49 4e 45 20 20 20 20 20 20 20 20 20 30  INLINE         0
0480: 78 30 30 34 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  x004  /* Do not 
0490: 73 75 72 72 6f 75 6e 64 20 77 69 74 68 20 3c 70  surround with <p
04a0: 3e 2e 2e 3c 2f 70 3e 20 2a 2f 0a 23 64 65 66 69  >..</p> */.#defi
04b0: 6e 65 20 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b 20  ne WIKI_NOBLOCK 
04c0: 20 20 20 20 20 20 20 30 78 30 30 38 20 20 2f 2a         0x008  /*
04d0: 20 4e 6f 20 62 6c 6f 63 6b 20 6d 61 72 6b 75 70   No block markup
04e0: 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f 0a   of any kind */.
04f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
0500: 68 65 73 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  hese are the onl
0510: 79 20 6d 61 72 6b 75 70 20 61 74 74 72 69 62 75  y markup attribu
0520: 74 65 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  tes allowed..*/.
0530: 23 64 65 66 69 6e 65 20 41 54 54 52 5f 41 4c 49  #define ATTR_ALI
0540: 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GN              
0550: 31 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 41  1.#define ATTR_A
0560: 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
0570: 20 20 32 0a 23 64 65 66 69 6e 65 20 41 54 54 52    2.#define ATTR
0580: 5f 42 47 43 4f 4c 4f 52 20 20 20 20 20 20 20 20  _BGCOLOR        
0590: 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41 54      3.#define AT
05a0: 54 52 5f 42 4f 52 44 45 52 20 20 20 20 20 20 20  TR_BORDER       
05b0: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
05c0: 41 54 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e 47  ATTR_CELLPADDING
05d0: 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
05e0: 65 20 41 54 54 52 5f 43 45 4c 4c 53 50 41 43 49  e ATTR_CELLSPACI
05f0: 4e 47 20 20 20 20 20 20 20 20 36 0a 23 64 65 66  NG        6.#def
0600: 69 6e 65 20 41 54 54 52 5f 43 4c 45 41 52 20 20  ine ATTR_CLEAR  
0610: 20 20 20 20 20 20 20 20 20 20 20 20 37 0a 23 64              7.#d
0620: 65 66 69 6e 65 20 41 54 54 52 5f 43 4f 4c 4f 52  efine ATTR_COLOR
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 0a                8.
0640: 23 64 65 66 69 6e 65 20 41 54 54 52 5f 43 4f 4c  #define ATTR_COL
0650: 53 50 41 4e 20 20 20 20 20 20 20 20 20 20 20 20  SPAN            
0660: 39 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 43  9.#define ATTR_C
0670: 4f 4d 50 41 43 54 20 20 20 20 20 20 20 20 20 20  OMPACT          
0680: 20 20 31 30 0a 23 64 65 66 69 6e 65 20 41 54 54    10.#define ATT
0690: 52 5f 46 41 43 45 20 20 20 20 20 20 20 20 20 20  R_FACE          
06a0: 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65 20       11.#define 
06b0: 41 54 54 52 5f 48 45 49 47 48 54 20 20 20 20 20  ATTR_HEIGHT     
06c0: 20 20 20 20 20 20 20 20 31 32 0a 23 64 65 66 69          12.#defi
06d0: 6e 65 20 41 54 54 52 5f 48 52 45 46 20 20 20 20  ne ATTR_HREF    
06e0: 20 20 20 20 20 20 20 20 20 20 20 31 33 0a 23 64             13.#d
06f0: 65 66 69 6e 65 20 41 54 54 52 5f 48 53 50 41 43  efine ATTR_HSPAC
0700: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 31 34  E             14
0710: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 49 44  .#define ATTR_ID
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 31 35 0a 23 64 65 66 69 6e 65 20 41 54 54 52   15.#define ATTR
0740: 5f 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20  _NAME           
0750: 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 41      16.#define A
0760: 54 54 52 5f 52 4f 57 53 50 41 4e 20 20 20 20 20  TTR_ROWSPAN     
0770: 20 20 20 20 20 20 20 31 37 0a 23 64 65 66 69 6e         17.#defin
0780: 65 20 41 54 54 52 5f 53 49 5a 45 20 20 20 20 20  e ATTR_SIZE     
0790: 20 20 20 20 20 20 20 20 20 20 31 38 0a 23 64 65            18.#de
07a0: 66 69 6e 65 20 41 54 54 52 5f 53 52 43 20 20 20  fine ATTR_SRC   
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 39 0a               19.
07c0: 23 64 65 66 69 6e 65 20 41 54 54 52 5f 53 54 41  #define ATTR_STA
07d0: 52 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  RT              
07e0: 32 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  20.#define ATTR_
07f0: 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20 20  TYPE            
0800: 20 20 20 32 31 0a 23 64 65 66 69 6e 65 20 41 54     21.#define AT
0810: 54 52 5f 56 41 4c 49 47 4e 20 20 20 20 20 20 20  TR_VALIGN       
0820: 20 20 20 20 20 20 32 32 0a 23 64 65 66 69 6e 65        22.#define
0830: 20 41 54 54 52 5f 56 41 4c 55 45 20 20 20 20 20   ATTR_VALUE     
0840: 20 20 20 20 20 20 20 20 20 32 33 0a 23 64 65 66           23.#def
0850: 69 6e 65 20 41 54 54 52 5f 56 53 50 41 43 45 20  ine ATTR_VSPACE 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 32 34 0a 23              24.#
0870: 64 65 66 69 6e 65 20 41 54 54 52 5f 57 49 44 54  define ATTR_WIDT
0880: 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  H              2
0890: 35 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 41  5.#define AMSK_A
08a0: 4c 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20  LIGN            
08b0: 20 20 30 78 30 30 30 30 30 30 31 0a 23 64 65 66    0x0000001.#def
08c0: 69 6e 65 20 41 4d 53 4b 5f 41 4c 54 20 20 20 20  ine AMSK_ALT    
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30              0x00
08e0: 30 30 30 30 32 0a 23 64 65 66 69 6e 65 20 41 4d  00002.#define AM
08f0: 53 4b 5f 42 47 43 4f 4c 4f 52 20 20 20 20 20 20  SK_BGCOLOR      
0900: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34 0a        0x0000004.
0910: 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 42 4f 52  #define AMSK_BOR
0920: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
0930: 30 78 30 30 30 30 30 30 38 0a 23 64 65 66 69 6e  0x0000008.#defin
0940: 65 20 41 4d 53 4b 5f 43 45 4c 4c 50 41 44 44 49  e AMSK_CELLPADDI
0950: 4e 47 20 20 20 20 20 20 20 20 30 78 30 30 30 30  NG        0x0000
0960: 30 31 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b  010.#define AMSK
0970: 5f 43 45 4c 4c 53 50 41 43 49 4e 47 20 20 20 20  _CELLSPACING    
0980: 20 20 20 20 30 78 30 30 30 30 30 32 30 0a 23 64      0x0000020.#d
0990: 65 66 69 6e 65 20 41 4d 53 4b 5f 43 4c 45 41 52  efine AMSK_CLEAR
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
09b0: 30 30 30 30 30 34 30 0a 23 64 65 66 69 6e 65 20  0000040.#define 
09c0: 41 4d 53 4b 5f 43 4f 4c 4f 52 20 20 20 20 20 20  AMSK_COLOR      
09d0: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 38          0x000008
09e0: 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 43  0.#define AMSK_C
09f0: 4f 4c 53 50 41 4e 20 20 20 20 20 20 20 20 20 20  OLSPAN          
0a00: 20 20 30 78 30 30 30 30 31 30 30 0a 23 64 65 66    0x0000100.#def
0a10: 69 6e 65 20 41 4d 53 4b 5f 43 4f 4d 50 41 43 54  ine AMSK_COMPACT
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30              0x00
0a30: 30 30 32 30 30 0a 23 64 65 66 69 6e 65 20 41 4d  00200.#define AM
0a40: 53 4b 5f 46 41 43 45 20 20 20 20 20 20 20 20 20  SK_FACE         
0a50: 20 20 20 20 20 20 30 78 30 30 30 30 34 30 30 0a        0x0000400.
0a60: 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 48 45 49  #define AMSK_HEI
0a70: 47 48 54 20 20 20 20 20 20 20 20 20 20 20 20 20  GHT             
0a80: 30 78 30 30 30 30 38 30 30 0a 23 64 65 66 69 6e  0x0000800.#defin
0a90: 65 20 41 4d 53 4b 5f 48 52 45 46 20 20 20 20 20  e AMSK_HREF     
0aa0: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 31            0x0001
0ab0: 30 30 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b  000.#define AMSK
0ac0: 5f 48 53 50 41 43 45 20 20 20 20 20 20 20 20 20  _HSPACE         
0ad0: 20 20 20 20 30 78 30 30 30 32 30 30 30 0a 23 64      0x0002000.#d
0ae0: 65 66 69 6e 65 20 41 4d 53 4b 5f 49 44 20 20 20  efine AMSK_ID   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0b00: 30 30 30 34 30 30 30 0a 23 64 65 66 69 6e 65 20  0004000.#define 
0b10: 41 4d 53 4b 5f 4e 41 4d 45 20 20 20 20 20 20 20  AMSK_NAME       
0b20: 20 20 20 20 20 20 20 20 30 78 30 30 30 38 30 30          0x000800
0b30: 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 52  0.#define AMSK_R
0b40: 4f 57 53 50 41 4e 20 20 20 20 20 20 20 20 20 20  OWSPAN          
0b50: 20 20 30 78 30 30 31 30 30 30 30 0a 23 64 65 66    0x0010000.#def
0b60: 69 6e 65 20 41 4d 53 4b 5f 53 49 5a 45 20 20 20  ine AMSK_SIZE   
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30              0x00
0b80: 32 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41 4d  20000.#define AM
0b90: 53 4b 5f 53 52 43 20 20 20 20 20 20 20 20 20 20  SK_SRC          
0ba0: 20 20 20 20 20 20 30 78 30 30 34 30 30 30 30 0a        0x0040000.
0bb0: 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 53 54 41  #define AMSK_STA
0bc0: 52 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  RT              
0bd0: 30 78 30 30 38 30 30 30 30 0a 23 64 65 66 69 6e  0x0080000.#defin
0be0: 65 20 41 4d 53 4b 5f 54 59 50 45 20 20 20 20 20  e AMSK_TYPE     
0bf0: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 30 30            0x0100
0c00: 30 30 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b  000.#define AMSK
0c10: 5f 56 41 4c 49 47 4e 20 20 20 20 20 20 20 20 20  _VALIGN         
0c20: 20 20 20 20 30 78 30 32 30 30 30 30 30 0a 23 64      0x0200000.#d
0c30: 65 66 69 6e 65 20 41 4d 53 4b 5f 56 41 4c 55 45  efine AMSK_VALUE
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c50: 30 34 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20  0400000.#define 
0c60: 41 4d 53 4b 5f 56 53 50 41 43 45 20 20 20 20 20  AMSK_VSPACE     
0c70: 20 20 20 20 20 20 20 20 30 78 30 38 30 30 30 30          0x080000
0c80: 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 57  0.#define AMSK_W
0c90: 49 44 54 48 20 20 20 20 20 20 20 20 20 20 20 20  IDTH            
0ca0: 20 20 30 78 31 30 30 30 30 30 30 0a 0a 73 74 61    0x1000000..sta
0cb0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
0cc0: 20 41 6c 6c 6f 77 65 64 41 74 74 72 69 62 75 74   AllowedAttribut
0cd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e {.  const char
0ce0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67   *zName;.  unsig
0cf0: 6e 65 64 20 69 6e 74 20 69 4d 61 73 6b 3b 0a 7d  ned int iMask;.}
0d00: 20 61 41 74 74 72 69 62 75 74 65 5b 5d 20 3d 20   aAttribute[] = 
0d10: 7b 0a 20 20 7b 20 30 2c 20 30 20 7d 2c 0a 20 20  {.  { 0, 0 },.  
0d20: 7b 20 22 61 6c 69 67 6e 22 2c 20 20 20 20 20 20  { "align",      
0d30: 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 2c 20 20     AMSK_ALIGN,  
0d40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
0d50: 61 6c 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  alt",           
0d60: 41 4d 53 4b 5f 41 4c 54 2c 20 20 20 20 20 20 20  AMSK_ALT,       
0d70: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 62 67 63       },.  { "bgc
0d80: 6f 6c 6f 72 22 2c 20 20 20 20 20 20 20 41 4d 53  olor",       AMS
0d90: 4b 5f 42 47 43 4f 4c 4f 52 2c 20 20 20 20 20 20  K_BGCOLOR,      
0da0: 20 20 7d 2c 0a 20 20 7b 20 22 62 6f 72 64 65 72    },.  { "border
0db0: 22 2c 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 42  ",        AMSK_B
0dc0: 4f 52 44 45 52 2c 20 20 20 20 20 20 20 20 20 7d  ORDER,         }
0dd0: 2c 0a 20 20 7b 20 22 63 65 6c 6c 70 61 64 64 69  ,.  { "cellpaddi
0de0: 6e 67 22 2c 20 20 20 41 4d 53 4b 5f 43 45 4c 4c  ng",   AMSK_CELL
0df0: 50 41 44 44 49 4e 47 2c 20 20 20 20 7d 2c 0a 20  PADDING,    },. 
0e00: 20 7b 20 22 63 65 6c 6c 73 70 61 63 69 6e 67 22   { "cellspacing"
0e10: 2c 20 20 20 41 4d 53 4b 5f 43 45 4c 4c 53 50 41  ,   AMSK_CELLSPA
0e20: 43 49 4e 47 2c 20 20 20 20 7d 2c 0a 20 20 7b 20  CING,    },.  { 
0e30: 22 63 6c 65 61 72 22 2c 20 20 20 20 20 20 20 20  "clear",        
0e40: 20 41 4d 53 4b 5f 43 4c 45 41 52 2c 20 20 20 20   AMSK_CLEAR,    
0e50: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f        },.  { "co
0e60: 6c 6f 72 22 2c 20 20 20 20 20 20 20 20 20 41 4d  lor",         AM
0e70: 53 4b 5f 43 4f 4c 4f 52 2c 20 20 20 20 20 20 20  SK_COLOR,       
0e80: 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6c 73 70     },.  { "colsp
0e90: 61 6e 22 2c 20 20 20 20 20 20 20 41 4d 53 4b 5f  an",       AMSK_
0ea0: 43 4f 4c 53 50 41 4e 2c 20 20 20 20 20 20 20 20  COLSPAN,        
0eb0: 7d 2c 0a 20 20 7b 20 22 63 6f 6d 70 61 63 74 22  },.  { "compact"
0ec0: 2c 20 20 20 20 20 20 20 41 4d 53 4b 5f 43 4f 4d  ,       AMSK_COM
0ed0: 50 41 43 54 2c 20 20 20 20 20 20 20 20 7d 2c 0a  PACT,        },.
0ee0: 20 20 7b 20 22 66 61 63 65 22 2c 20 20 20 20 20    { "face",     
0ef0: 20 20 20 20 20 41 4d 53 4b 5f 46 41 43 45 2c 20       AMSK_FACE, 
0f00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
0f10: 20 22 68 65 69 67 68 74 22 2c 20 20 20 20 20 20   "height",      
0f20: 20 20 41 4d 53 4b 5f 48 45 49 47 48 54 2c 20 20    AMSK_HEIGHT,  
0f30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 68         },.  { "h
0f40: 72 65 66 22 2c 20 20 20 20 20 20 20 20 20 20 41  ref",          A
0f50: 4d 53 4b 5f 48 52 45 46 2c 20 20 20 20 20 20 20  MSK_HREF,       
0f60: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 68 73 70 61      },.  { "hspa
0f70: 63 65 22 2c 20 20 20 20 20 20 20 20 41 4d 53 4b  ce",        AMSK
0f80: 5f 48 53 50 41 43 45 2c 20 20 20 20 20 20 20 20  _HSPACE,        
0f90: 20 7d 2c 0a 20 20 7b 20 22 69 64 22 2c 20 20 20   },.  { "id",   
0fa0: 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 49 44           AMSK_ID
0fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ,             },
0fc0: 0a 20 20 7b 20 22 6e 61 6d 65 22 2c 20 20 20 20  .  { "name",    
0fd0: 20 20 20 20 20 20 41 4d 53 4b 5f 4e 41 4d 45 2c        AMSK_NAME,
0fe0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0ff0: 7b 20 22 72 6f 77 73 70 61 6e 22 2c 20 20 20 20  { "rowspan",    
1000: 20 20 20 41 4d 53 4b 5f 52 4f 57 53 50 41 4e 2c     AMSK_ROWSPAN,
1010: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1020: 73 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  size",          
1030: 41 4d 53 4b 5f 53 49 5a 45 2c 20 20 20 20 20 20  AMSK_SIZE,      
1040: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 72 63       },.  { "src
1050: 22 2c 20 20 20 20 20 20 20 20 20 20 20 41 4d 53  ",           AMS
1060: 4b 5f 53 52 43 2c 20 20 20 20 20 20 20 20 20 20  K_SRC,          
1070: 20 20 7d 2c 0a 20 20 7b 20 22 73 74 61 72 74 22    },.  { "start"
1080: 2c 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 53  ,         AMSK_S
1090: 54 41 52 54 2c 20 20 20 20 20 20 20 20 20 20 7d  TART,          }
10a0: 2c 0a 20 20 7b 20 22 74 79 70 65 22 2c 20 20 20  ,.  { "type",   
10b0: 20 20 20 20 20 20 20 41 4d 53 4b 5f 54 59 50 45         AMSK_TYPE
10c0: 2c 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ,           },. 
10d0: 20 7b 20 22 76 61 6c 69 67 6e 22 2c 20 20 20 20   { "valign",    
10e0: 20 20 20 20 41 4d 53 4b 5f 56 41 4c 49 47 4e 2c      AMSK_VALIGN,
10f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
1100: 22 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20  "value",        
1110: 20 41 4d 53 4b 5f 56 41 4c 55 45 2c 20 20 20 20   AMSK_VALUE,    
1120: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 76 73        },.  { "vs
1130: 70 61 63 65 22 2c 20 20 20 20 20 20 20 20 41 4d  pace",        AM
1140: 53 4b 5f 56 53 50 41 43 45 2c 20 20 20 20 20 20  SK_VSPACE,      
1150: 20 20 20 7d 2c 0a 20 20 7b 20 22 77 69 64 74 68     },.  { "width
1160: 22 2c 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f  ",         AMSK_
1170: 57 49 44 54 48 2c 20 20 20 20 20 20 20 20 20 20  WIDTH,          
1180: 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  },.};../*.** Use
1190: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74   binary search t
11a0: 6f 20 6c 6f 63 61 74 65 20 61 20 74 61 67 20 69  o locate a tag i
11b0: 6e 20 74 68 65 20 61 41 74 74 72 69 62 75 74 65  n the aAttribute
11c0: 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  [] table..*/.sta
11d0: 74 69 63 20 69 6e 74 20 66 69 6e 64 41 74 74 72  tic int findAttr
11e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11f0: 0a 20 20 69 6e 74 20 69 2c 20 63 2c 20 66 69 72  .  int i, c, fir
1200: 73 74 2c 20 6c 61 73 74 3b 0a 20 20 66 69 72 73  st, last;.  firs
1210: 74 20 3d 20 31 3b 0a 20 20 6c 61 73 74 20 3d 20  t = 1;.  last = 
1220: 73 69 7a 65 6f 66 28 61 41 74 74 72 69 62 75 74  sizeof(aAttribut
1230: 65 29 2f 73 69 7a 65 6f 66 28 61 41 74 74 72 69  e)/sizeof(aAttri
1240: 62 75 74 65 5b 30 5d 29 20 2d 20 31 3b 0a 20 20  bute[0]) - 1;.  
1250: 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c 61  while( first<=la
1260: 73 74 20 29 7b 0a 20 20 20 20 69 20 3d 20 28 66  st ){.    i = (f
1270: 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20  irst+last)/2;.  
1280: 20 20 63 20 3d 20 73 74 72 63 6d 70 28 61 41 74    c = strcmp(aAt
1290: 74 72 69 62 75 74 65 5b 69 5d 2e 7a 4e 61 6d 65  tribute[i].zName
12a0: 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  , z);.    if( c=
12b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
12c0: 72 6e 20 69 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn i;.    }else 
12d0: 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
12e0: 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20   first = i+1;.  
12f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
1300: 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20 7d  ast = i-1;.    }
1310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1320: 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  .}..../*.** Allo
1330: 77 65 64 20 6d 61 72 6b 75 70 2e 0a 2a 2a 0a 2a  wed markup..**.*
1340: 2a 20 45 78 63 65 70 74 20 66 6f 72 20 4d 41 52  * Except for MAR
1350: 4b 55 50 5f 49 4e 56 41 4c 49 44 2c 20 74 68 69  KUP_INVALID, thi
1360: 73 20 6d 75 73 74 20 61 6c 6c 20 62 65 20 69 6e  s must all be in
1370: 20 61 6c 70 68 61 62 65 74 69 63 61 6c 20 6f 72   alphabetical or
1380: 64 65 72 0a 2a 2a 20 61 6e 64 20 69 6e 20 6e 75  der.** and in nu
1390: 6d 65 72 69 63 61 6c 20 73 65 71 75 65 6e 63 65  merical sequence
13a0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 6d 61 72  .  The first mar
13b0: 6b 75 70 20 74 79 70 65 20 6d 75 73 74 20 62 65  kup type must be
13c0: 20 7a 65 72 6f 2e 0a 2a 2a 20 54 68 65 20 76 61   zero..** The va
13d0: 6c 75 65 20 66 6f 72 20 4d 41 52 4b 55 50 5f 58  lue for MARKUP_X
13e0: 59 5a 20 6d 75 73 74 20 63 6f 72 72 65 73 70 6f  YZ must correspo
13f0: 6e 64 20 74 6f 20 74 68 65 20 3c 78 79 7a 3e 20  nd to the <xyz> 
1400: 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 61 41 6c 6c  entry.** in aAll
1410: 6f 77 65 64 4d 61 72 6b 75 70 5b 5d 2e 0a 2a 2f  owedMarkup[]..*/
1420: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1430: 49 4e 56 41 4c 49 44 20 20 20 20 20 20 20 20 20  INVALID         
1440: 20 20 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b    0.#define MARK
1450: 55 50 5f 41 20 20 20 20 20 20 20 20 20 20 20 20  UP_A            
1460: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4d       1.#define M
1470: 41 52 4b 55 50 5f 41 44 44 52 45 53 53 20 20 20  ARKUP_ADDRESS   
1480: 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e          2.#defin
1490: 65 20 4d 41 52 4b 55 50 5f 42 20 20 20 20 20 20  e MARKUP_B      
14a0: 20 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65             3.#de
14b0: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42 49 47 20  fine MARKUP_BIG 
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 0a                4.
14d0: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42  #define MARKUP_B
14e0: 4c 4f 43 4b 51 55 4f 54 45 20 20 20 20 20 20 20  LOCKQUOTE       
14f0: 20 35 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55   5.#define MARKU
1500: 50 5f 42 52 20 20 20 20 20 20 20 20 20 20 20 20  P_BR            
1510: 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4d 41      6.#define MA
1520: 52 4b 55 50 5f 43 45 4e 54 45 52 20 20 20 20 20  RKUP_CENTER     
1530: 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65         7.#define
1540: 20 4d 41 52 4b 55 50 5f 43 49 54 45 20 20 20 20   MARKUP_CITE    
1550: 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66            8.#def
1560: 69 6e 65 20 4d 41 52 4b 55 50 5f 43 4f 44 45 20  ine MARKUP_CODE 
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23               9.#
1580: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 44 44  define MARKUP_DD
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
15a0: 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  0.#define MARKUP
15b0: 5f 44 46 4e 20 20 20 20 20 20 20 20 20 20 20 20  _DFN            
15c0: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4d 41 52    11.#define MAR
15d0: 4b 55 50 5f 44 49 56 20 20 20 20 20 20 20 20 20  KUP_DIV         
15e0: 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65 20       12.#define 
15f0: 4d 41 52 4b 55 50 5f 44 4c 20 20 20 20 20 20 20  MARKUP_DL       
1600: 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66 69          13.#defi
1610: 6e 65 20 4d 41 52 4b 55 50 5f 44 54 20 20 20 20  ne MARKUP_DT    
1620: 20 20 20 20 20 20 20 20 20 20 20 31 34 0a 23 64             14.#d
1630: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 45 4d 20  efine MARKUP_EM 
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35                15
1650: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1660: 46 4f 4e 54 20 20 20 20 20 20 20 20 20 20 20 20  FONT            
1670: 20 31 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   16.#define MARK
1680: 55 50 5f 48 31 20 20 20 20 20 20 20 20 20 20 20  UP_H1           
1690: 20 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 4d      17.#define M
16a0: 41 52 4b 55 50 5f 48 32 20 20 20 20 20 20 20 20  ARKUP_H2        
16b0: 20 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e         18.#defin
16c0: 65 20 4d 41 52 4b 55 50 5f 48 33 20 20 20 20 20  e MARKUP_H3     
16d0: 20 20 20 20 20 20 20 20 20 20 31 39 0a 23 64 65            19.#de
16e0: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48 34 20 20  fine MARKUP_H4  
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 0a               20.
1700: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48  #define MARKUP_H
1710: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
1720: 32 31 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  21.#define MARKU
1730: 50 5f 48 36 20 20 20 20 20 20 20 20 20 20 20 20  P_H6            
1740: 20 20 20 32 32 0a 23 64 65 66 69 6e 65 20 4d 41     22.#define MA
1750: 52 4b 55 50 5f 48 52 20 20 20 20 20 20 20 20 20  RKUP_HR         
1760: 20 20 20 20 20 20 32 33 0a 23 64 65 66 69 6e 65        23.#define
1770: 20 4d 41 52 4b 55 50 5f 49 20 20 20 20 20 20 20   MARKUP_I       
1780: 20 20 20 20 20 20 20 20 20 32 34 0a 23 64 65 66           24.#def
1790: 69 6e 65 20 4d 41 52 4b 55 50 5f 49 4d 47 20 20  ine MARKUP_IMG  
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 32 35 0a 23              25.#
17b0: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 4b 42  define MARKUP_KB
17c0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  D              2
17d0: 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  6.#define MARKUP
17e0: 5f 4c 49 20 20 20 20 20 20 20 20 20 20 20 20 20  _LI             
17f0: 20 20 32 37 0a 23 64 65 66 69 6e 65 20 4d 41 52    27.#define MAR
1800: 4b 55 50 5f 4e 4f 42 52 20 20 20 20 20 20 20 20  KUP_NOBR        
1810: 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e 65 20       28.#define 
1820: 4d 41 52 4b 55 50 5f 4e 4f 57 49 4b 49 20 20 20  MARKUP_NOWIKI   
1830: 20 20 20 20 20 20 20 20 32 39 0a 23 64 65 66 69          29.#defi
1840: 6e 65 20 4d 41 52 4b 55 50 5f 4f 4c 20 20 20 20  ne MARKUP_OL    
1850: 20 20 20 20 20 20 20 20 20 20 20 33 30 0a 23 64             30.#d
1860: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 50 20 20  efine MARKUP_P  
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 31                31
1880: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1890: 50 52 45 20 20 20 20 20 20 20 20 20 20 20 20 20  PRE             
18a0: 20 33 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   32.#define MARK
18b0: 55 50 5f 53 20 20 20 20 20 20 20 20 20 20 20 20  UP_S            
18c0: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 4d      33.#define M
18d0: 41 52 4b 55 50 5f 53 41 4d 50 20 20 20 20 20 20  ARKUP_SAMP      
18e0: 20 20 20 20 20 20 20 33 34 0a 23 64 65 66 69 6e         34.#defin
18f0: 65 20 4d 41 52 4b 55 50 5f 53 4d 41 4c 4c 20 20  e MARKUP_SMALL  
1900: 20 20 20 20 20 20 20 20 20 20 33 35 0a 23 64 65            35.#de
1910: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53 50 41 4e  fine MARKUP_SPAN
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 36 0a               36.
1930: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53  #define MARKUP_S
1940: 54 52 49 4b 45 20 20 20 20 20 20 20 20 20 20 20  TRIKE           
1950: 33 37 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  37.#define MARKU
1960: 50 5f 53 54 52 4f 4e 47 20 20 20 20 20 20 20 20  P_STRONG        
1970: 20 20 20 33 38 0a 23 64 65 66 69 6e 65 20 4d 41     38.#define MA
1980: 52 4b 55 50 5f 53 55 42 20 20 20 20 20 20 20 20  RKUP_SUB        
1990: 20 20 20 20 20 20 33 39 0a 23 64 65 66 69 6e 65        39.#define
19a0: 20 4d 41 52 4b 55 50 5f 53 55 50 20 20 20 20 20   MARKUP_SUP     
19b0: 20 20 20 20 20 20 20 20 20 34 30 0a 23 64 65 66           40.#def
19c0: 69 6e 65 20 4d 41 52 4b 55 50 5f 54 41 42 4c 45  ine MARKUP_TABLE
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 34 31 0a 23              41.#
19e0: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 54 44  define MARKUP_TD
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
1a00: 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  2.#define MARKUP
1a10: 5f 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  _TH             
1a20: 20 20 34 33 0a 23 64 65 66 69 6e 65 20 4d 41 52    43.#define MAR
1a30: 4b 55 50 5f 54 52 20 20 20 20 20 20 20 20 20 20  KUP_TR          
1a40: 20 20 20 20 20 34 34 0a 23 64 65 66 69 6e 65 20       44.#define 
1a50: 4d 41 52 4b 55 50 5f 54 54 20 20 20 20 20 20 20  MARKUP_TT       
1a60: 20 20 20 20 20 20 20 20 34 35 0a 23 64 65 66 69          45.#defi
1a70: 6e 65 20 4d 41 52 4b 55 50 5f 55 20 20 20 20 20  ne MARKUP_U     
1a80: 20 20 20 20 20 20 20 20 20 20 20 34 36 0a 23 64             46.#d
1a90: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 55 4c 20  efine MARKUP_UL 
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 37                47
1ab0: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1ac0: 56 41 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VAR             
1ad0: 20 34 38 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   48.#define MARK
1ae0: 55 50 5f 56 45 52 42 41 54 49 4d 20 20 20 20 20  UP_VERBATIM     
1af0: 20 20 20 20 34 39 0a 0a 2f 2a 0a 2a 2a 20 54 68      49../*.** Th
1b00: 65 20 76 61 72 69 6f 75 73 20 6d 61 72 6b 75 70  e various markup
1b10: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
1b20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
1b30: 79 70 65 73 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65  ypes:.*/.#define
1b40: 20 4d 55 54 59 50 45 5f 53 49 4e 47 4c 45 20 20   MUTYPE_SINGLE  
1b50: 20 20 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20      0x0001   /* 
1b60: 3c 69 6d 67 3e 2c 20 3c 62 72 3e 2c 20 6f 72 20  <img>, <br>, or 
1b70: 3c 68 72 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  <hr> */.#define 
1b80: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 20 20 20 20  MUTYPE_BLOCK    
1b90: 20 20 20 30 78 30 30 30 32 20 20 20 2f 2a 20 46     0x0002   /* F
1ba0: 6f 72 6d 73 20 61 20 6e 65 77 20 70 61 72 61 67  orms a new parag
1bb0: 72 61 70 68 2e 20 65 78 3a 20 3c 70 3e 2c 20 3c  raph. ex: <p>, <
1bc0: 68 32 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  h2> */.#define M
1bd0: 55 54 59 50 45 5f 46 4f 4e 54 20 20 20 20 20 20  UTYPE_FONT      
1be0: 20 20 30 78 30 30 30 34 20 20 20 2f 2a 20 46 6f    0x0004   /* Fo
1bf0: 6e 74 20 63 68 61 6e 67 65 73 2e 20 65 78 3a 20  nt changes. ex: 
1c00: 3c 62 3e 2c 20 3c 66 6f 6e 74 3e 2c 20 3c 73 75  <b>, <font>, <su
1c10: 62 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55  b> */.#define MU
1c20: 54 59 50 45 5f 4c 49 53 54 20 20 20 20 20 20 20  TYPE_LIST       
1c30: 20 30 78 30 30 31 30 20 20 20 2f 2a 20 4c 69 73   0x0010   /* Lis
1c40: 74 73 2e 20 20 3c 6f 6c 3e 2c 20 3c 75 6c 3e 2c  ts.  <ol>, <ul>,
1c50: 20 6f 72 20 3c 64 6c 3e 20 2a 2f 0a 23 64 65 66   or <dl> */.#def
1c60: 69 6e 65 20 4d 55 54 59 50 45 5f 4c 49 20 20 20  ine MUTYPE_LI   
1c70: 20 20 20 20 20 20 20 30 78 30 30 32 30 20 20 20         0x0020   
1c80: 2f 2a 20 4c 69 73 74 20 69 74 65 6d 73 2e 20 20  /* List items.  
1c90: 3c 6c 69 3e 2c 20 3c 64 64 3e 2c 20 3c 64 74 3e  <li>, <dd>, <dt>
1ca0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59   */.#define MUTY
1cb0: 50 45 5f 54 41 42 4c 45 20 20 20 20 20 20 20 30  PE_TABLE       0
1cc0: 78 30 30 34 30 20 20 20 2f 2a 20 3c 74 61 62 6c  x0040   /* <tabl
1cd0: 65 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55  e> */.#define MU
1ce0: 54 59 50 45 5f 54 52 20 20 20 20 20 20 20 20 20  TYPE_TR         
1cf0: 20 30 78 30 30 38 30 20 20 20 2f 2a 20 3c 74 72   0x0080   /* <tr
1d00: 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54  > */.#define MUT
1d10: 59 50 45 5f 54 44 20 20 20 20 20 20 20 20 20 20  YPE_TD          
1d20: 30 78 30 31 30 30 20 20 20 2f 2a 20 3c 74 64 3e  0x0100   /* <td>
1d30: 20 6f 72 20 3c 74 68 3e 20 2a 2f 0a 23 64 65 66   or <th> */.#def
1d40: 69 6e 65 20 4d 55 54 59 50 45 5f 53 50 45 43 49  ine MUTYPE_SPECI
1d50: 41 4c 20 20 20 20 20 30 78 30 32 30 30 20 20 20  AL     0x0200   
1d60: 2f 2a 20 3c 6e 6f 77 69 6b 69 3e 20 6f 72 20 3c  /* <nowiki> or <
1d70: 76 65 72 62 61 74 69 6d 3e 20 2a 2f 0a 23 64 65  verbatim> */.#de
1d80: 66 69 6e 65 20 4d 55 54 59 50 45 5f 48 59 50 45  fine MUTYPE_HYPE
1d90: 52 4c 49 4e 4b 20 20 20 30 78 30 34 30 30 20 20  RLINK   0x0400  
1da0: 20 2f 2a 20 3c 61 3e 20 2a 2f 0a 0a 2f 2a 0a 2a   /* <a> */../*.*
1db0: 2a 20 54 68 65 73 65 20 6d 61 72 6b 75 70 20 74  * These markup t
1dc0: 79 70 65 73 20 6d 75 73 74 20 68 61 76 65 20 61  ypes must have a
1dd0: 6e 20 65 6e 64 20 74 61 67 2e 0a 2a 2f 0a 23 64  n end tag..*/.#d
1de0: 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 53 54 41  efine MUTYPE_STA
1df0: 43 4b 20 20 28 4d 55 54 59 50 45 5f 42 4c 4f 43  CK  (MUTYPE_BLOC
1e00: 4b 20 7c 20 4d 55 54 59 50 45 5f 46 4f 4e 54 20  K | MUTYPE_FONT 
1e10: 7c 20 4d 55 54 59 50 45 5f 4c 49 53 54 20 7c 20  | MUTYPE_LIST | 
1e20: 4d 55 54 59 50 45 5f 54 41 42 4c 45 29 0a 0a 2f  MUTYPE_TABLE)../
1e30: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 72 6b 75 70  *.** This markup
1e40: 20 74 79 70 65 73 20 61 72 65 20 61 6c 6c 6f 77   types are allow
1e50: 65 64 20 66 6f 72 20 22 69 6e 6c 69 6e 65 22 20  ed for "inline" 
1e60: 74 65 78 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  text..*/.#define
1e70: 20 4d 55 54 59 50 45 5f 49 4e 4c 49 4e 45 20 28   MUTYPE_INLINE (
1e80: 4d 55 54 59 50 45 5f 46 4f 4e 54 20 7c 20 4d 55  MUTYPE_FONT | MU
1e90: 54 59 50 45 5f 48 59 50 45 52 4c 49 4e 4b 29 0a  TYPE_HYPERLINK).
1ea0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74  .static const st
1eb0: 72 75 63 74 20 41 6c 6c 6f 77 65 64 4d 61 72 6b  ruct AllowedMark
1ec0: 75 70 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  up {.  const cha
1ed0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
1ee0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
1ef0: 61 72 6b 75 70 20 2a 2f 0a 20 20 63 68 61 72 20  arkup */.  char 
1f00: 69 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  iCode;          
1f10: 20 20 20 20 2f 2a 20 54 68 65 20 4d 41 52 4b 55      /* The MARKU
1f20: 50 5f 2a 20 63 6f 64 65 20 2a 2f 0a 20 20 73 68  P_* code */.  sh
1f30: 6f 72 74 20 69 6e 74 20 69 54 79 70 65 3b 20 20  ort int iType;  
1f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 55         /* The MU
1f50: 54 59 50 45 5f 2a 20 63 6f 64 65 20 2a 2f 0a 20  TYPE_* code */. 
1f60: 20 69 6e 74 20 61 6c 6c 6f 77 65 64 41 74 74 72   int allowedAttr
1f70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
1f80: 6f 77 65 64 20 61 74 74 72 69 62 75 74 65 73 20  owed attributes 
1f90: 6f 6e 20 74 68 69 73 20 6d 61 72 6b 75 70 20 2a  on this markup *
1fa0: 2f 0a 7d 20 61 4d 61 72 6b 75 70 5b 5d 20 3d 20  /.} aMarkup[] = 
1fb0: 7b 0a 20 7b 20 30 2c 20 20 20 20 20 20 20 20 20  {. { 0,         
1fc0: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 49 4e 56        MARKUP_INV
1fd0: 41 4c 49 44 2c 20 20 20 20 20 20 30 2c 20 20 20  ALID,      0,   
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 30 20 20 7d 2c 0a 20 7b 20 22 61 22 2c 20 20   0  },. { "a",  
2000: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2010: 50 5f 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  P_A,            
2020: 4d 55 54 59 50 45 5f 48 59 50 45 52 4c 49 4e 4b  MUTYPE_HYPERLINK
2030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2040: 20 20 20 20 20 20 41 4d 53 4b 5f 48 52 45 46 7c        AMSK_HREF|
2050: 41 4d 53 4b 5f 4e 41 4d 45 20 7d 2c 0a 20 7b 20  AMSK_NAME },. { 
2060: 22 61 64 64 72 65 73 73 22 2c 20 20 20 20 20 20  "address",      
2070: 20 4d 41 52 4b 55 50 5f 41 44 44 52 45 53 53 2c   MARKUP_ADDRESS,
2080: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f        MUTYPE_BLO
2090: 43 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20 7d  CK,         0  }
20a0: 2c 0a 20 7b 20 22 62 22 2c 20 20 20 20 20 20 20  ,. { "b",       
20b0: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 42 2c 20        MARKUP_B, 
20c0: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
20d0: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
20e0: 20 30 20 20 7d 2c 0a 20 7b 20 22 62 69 67 22 2c   0  },. { "big",
20f0: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2100: 50 5f 42 49 47 2c 20 20 20 20 20 20 20 20 20 20  P_BIG,          
2110: 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20  MUTYPE_FONT,    
2120: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
2130: 62 6c 6f 63 6b 71 75 6f 74 65 22 2c 20 20 20 20  blockquote",    
2140: 4d 41 52 4b 55 50 5f 42 4c 4f 43 4b 51 55 4f 54  MARKUP_BLOCKQUOT
2150: 45 2c 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43  E,   MUTYPE_BLOC
2160: 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  K,         0  },
2170: 0a 20 7b 20 22 62 72 22 2c 20 20 20 20 20 20 20  . { "br",       
2180: 20 20 20 20 20 4d 41 52 4b 55 50 5f 42 52 2c 20       MARKUP_BR, 
2190: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
21a0: 5f 53 49 4e 47 4c 45 2c 20 20 20 20 20 20 20 20  _SINGLE,        
21b0: 41 4d 53 4b 5f 43 4c 45 41 52 20 20 7d 2c 0a 20  AMSK_CLEAR  },. 
21c0: 7b 20 22 63 65 6e 74 65 72 22 2c 20 20 20 20 20  { "center",     
21d0: 20 20 20 4d 41 52 4b 55 50 5f 43 45 4e 54 45 52     MARKUP_CENTER
21e0: 2c 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42  ,       MUTYPE_B
21f0: 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 30 20  LOCK,         0 
2200: 20 7d 2c 0a 20 7b 20 22 63 69 74 65 22 2c 20 20   },. { "cite",  
2210: 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 43          MARKUP_C
2220: 49 54 45 2c 20 20 20 20 20 20 20 20 20 4d 55 54  ITE,         MUT
2230: 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20  YPE_FONT,       
2240: 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 63 6f 64     0  },. { "cod
2250: 65 22 2c 20 20 20 20 20 20 20 20 20 20 4d 41 52  e",          MAR
2260: 4b 55 50 5f 43 4f 44 45 2c 20 20 20 20 20 20 20  KUP_CODE,       
2270: 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20    MUTYPE_FONT,  
2280: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b          0  },. {
2290: 20 22 64 64 22 2c 20 20 20 20 20 20 20 20 20 20   "dd",          
22a0: 20 20 4d 41 52 4b 55 50 5f 44 44 2c 20 20 20 20    MARKUP_DD,    
22b0: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 4c 49         MUTYPE_LI
22c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20  ,            0  
22d0: 7d 2c 0a 20 7b 20 22 64 66 6e 22 2c 20 20 20 20  },. { "dfn",    
22e0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 46         MARKUP_DF
22f0: 4e 2c 20 20 20 20 20 20 20 20 20 20 4d 55 54 59  N,          MUTY
2300: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
2310: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 64 69 76 22    0  },. { "div"
2320: 2c 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b  ,           MARK
2330: 55 50 5f 44 49 56 2c 20 20 20 20 20 20 20 20 20  UP_DIV,         
2340: 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20   MUTYPE_BLOCK,  
2350: 20 20 20 20 20 20 20 41 4d 53 4b 5f 49 44 20 20         AMSK_ID  
2360: 20 20 20 20 7d 2c 0a 20 7b 20 22 64 6c 22 2c 20      },. { "dl", 
2370: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2380: 50 5f 44 4c 2c 20 20 20 20 20 20 20 20 20 20 20  P_DL,           
2390: 4d 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20  MUTYPE_LIST,    
23a0: 20 20 20 20 20 20 41 4d 53 4b 5f 43 4f 4d 50 41        AMSK_COMPA
23b0: 43 54 20 7d 2c 0a 20 7b 20 22 64 74 22 2c 20 20  CT },. { "dt",  
23c0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
23d0: 5f 44 54 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _DT,           M
23e0: 55 54 59 50 45 5f 4c 49 2c 20 20 20 20 20 20 20  UTYPE_LI,       
23f0: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 65       0  },. { "e
2400: 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  m",            M
2410: 41 52 4b 55 50 5f 45 4d 2c 20 20 20 20 20 20 20  ARKUP_EM,       
2420: 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c      MUTYPE_FONT,
2430: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2440: 20 7b 20 22 66 6f 6e 74 22 2c 20 20 20 20 20 20   { "font",      
2450: 20 20 20 20 4d 41 52 4b 55 50 5f 46 4f 4e 54 2c      MARKUP_FONT,
2460: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2470: 46 4f 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20  FONT,.          
2480: 20 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 43            AMSK_C
2490: 4f 4c 4f 52 7c 41 4d 53 4b 5f 46 41 43 45 7c 41  OLOR|AMSK_FACE|A
24a0: 4d 53 4b 5f 53 49 5a 45 20 20 20 7d 2c 0a 20 7b  MSK_SIZE   },. {
24b0: 20 22 68 31 22 2c 20 20 20 20 20 20 20 20 20 20   "h1",          
24c0: 20 20 4d 41 52 4b 55 50 5f 48 31 2c 20 20 20 20    MARKUP_H1,    
24d0: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c         MUTYPE_BL
24e0: 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41 4d 53  OCK,         AMS
24f0: 4b 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22  K_ALIGN  },. { "
2500: 68 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  h2",            
2510: 4d 41 52 4b 55 50 5f 48 32 2c 20 20 20 20 20 20  MARKUP_H2,      
2520: 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43       MUTYPE_BLOC
2530: 4b 2c 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f  K,         AMSK_
2540: 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 68 33  ALIGN  },. { "h3
2550: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41  ",            MA
2560: 52 4b 55 50 5f 48 33 2c 20 20 20 20 20 20 20 20  RKUP_H3,        
2570: 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c     MUTYPE_BLOCK,
2580: 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 41 4c           AMSK_AL
2590: 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 68 34 22 2c  IGN  },. { "h4",
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b              MARK
25b0: 55 50 5f 48 34 2c 20 20 20 20 20 20 20 20 20 20  UP_H4,          
25c0: 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20   MUTYPE_BLOCK,  
25d0: 20 20 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47         AMSK_ALIG
25e0: 4e 20 20 7d 2c 0a 20 7b 20 22 68 35 22 2c 20 20  N  },. { "h5",  
25f0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2600: 5f 48 35 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _H5,           M
2610: 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20  UTYPE_BLOCK,    
2620: 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 20       AMSK_ALIGN 
2630: 20 7d 2c 0a 20 7b 20 22 68 36 22 2c 20 20 20 20   },. { "h6",    
2640: 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 48          MARKUP_H
2650: 36 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55 54  6,           MUT
2660: 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20  YPE_BLOCK,      
2670: 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 20 20 7d     AMSK_ALIGN  }
2680: 2c 0a 20 7b 20 22 68 72 22 2c 20 20 20 20 20 20  ,. { "hr",      
2690: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 52 2c        MARKUP_HR,
26a0: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
26b0: 45 5f 53 49 4e 47 4c 45 2c 0a 20 20 20 20 20 20  E_SINGLE,.      
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d                AM
26d0: 53 4b 5f 41 4c 49 47 4e 7c 41 4d 53 4b 5f 43 4f  SK_ALIGN|AMSK_CO
26e0: 4c 4f 52 7c 41 4d 53 4b 5f 53 49 5a 45 7c 41 4d  LOR|AMSK_SIZE|AM
26f0: 53 4b 5f 57 49 44 54 48 20 20 7d 2c 0a 20 7b 20  SK_WIDTH  },. { 
2700: 22 69 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  "i",            
2710: 20 4d 41 52 4b 55 50 5f 49 2c 20 20 20 20 20 20   MARKUP_I,      
2720: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
2730: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
2740: 2c 0a 20 7b 20 22 69 6d 67 22 2c 20 20 20 20 20  ,. { "img",     
2750: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 49 4d 47        MARKUP_IMG
2760: 2c 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50  ,          MUTYP
2770: 45 5f 53 49 4e 47 4c 45 2c 0a 20 20 20 20 20 20  E_SINGLE,.      
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d                AM
2790: 53 4b 5f 41 4c 49 47 4e 7c 41 4d 53 4b 5f 41 4c  SK_ALIGN|AMSK_AL
27a0: 54 7c 41 4d 53 4b 5f 42 4f 52 44 45 52 7c 41 4d  T|AMSK_BORDER|AM
27b0: 53 4b 5f 48 45 49 47 48 54 7c 0a 20 20 20 20 20  SK_HEIGHT|.     
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
27d0: 4d 53 4b 5f 48 53 50 41 43 45 7c 41 4d 53 4b 5f  MSK_HSPACE|AMSK_
27e0: 53 52 43 7c 41 4d 53 4b 5f 56 53 50 41 43 45 7c  SRC|AMSK_VSPACE|
27f0: 41 4d 53 4b 5f 57 49 44 54 48 20 20 7d 2c 0a 20  AMSK_WIDTH  },. 
2800: 7b 20 22 6b 62 64 22 2c 20 20 20 20 20 20 20 20  { "kbd",        
2810: 20 20 20 4d 41 52 4b 55 50 5f 4b 42 44 2c 20 20     MARKUP_KBD,  
2820: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46          MUTYPE_F
2830: 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30 20  ONT,          0 
2840: 20 7d 2c 0a 20 7b 20 22 6c 69 22 2c 20 20 20 20   },. { "li",    
2850: 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 4c          MARKUP_L
2860: 49 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55 54  I,           MUT
2870: 59 50 45 5f 4c 49 2c 0a 20 20 20 20 20 20 20 20  YPE_LI,.        
2880: 20 20 20 20 20 20 20 20 20 20 20 20 41 4d 53 4b              AMSK
2890: 5f 54 59 50 45 7c 41 4d 53 4b 5f 56 41 4c 55 45  _TYPE|AMSK_VALUE
28a0: 20 20 7d 2c 0a 20 7b 20 22 6e 6f 62 72 22 2c 20    },. { "nobr", 
28b0: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
28c0: 4e 4f 42 52 2c 20 20 20 20 20 20 20 20 20 4d 55  NOBR,         MU
28d0: 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20  TYPE_FONT,      
28e0: 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 6e 6f      0  },. { "no
28f0: 77 69 6b 69 22 2c 20 20 20 20 20 20 20 20 4d 41  wiki",        MA
2900: 52 4b 55 50 5f 4e 4f 57 49 4b 49 2c 20 20 20 20  RKUP_NOWIKI,    
2910: 20 20 20 4d 55 54 59 50 45 5f 53 50 45 43 49 41     MUTYPE_SPECIA
2920: 4c 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20  L,       0  },. 
2930: 7b 20 22 6f 6c 22 2c 20 20 20 20 20 20 20 20 20  { "ol",         
2940: 20 20 20 4d 41 52 4b 55 50 5f 4f 4c 2c 20 20 20     MARKUP_OL,   
2950: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 4c          MUTYPE_L
2960: 49 53 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IST,.           
2970: 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 53 54           AMSK_ST
2980: 41 52 54 7c 41 4d 53 4b 5f 54 59 50 45 7c 41 4d  ART|AMSK_TYPE|AM
2990: 53 4b 5f 43 4f 4d 50 41 43 54 20 20 7d 2c 0a 20  SK_COMPACT  },. 
29a0: 7b 20 22 70 22 2c 20 20 20 20 20 20 20 20 20 20  { "p",          
29b0: 20 20 20 4d 41 52 4b 55 50 5f 50 2c 20 20 20 20     MARKUP_P,    
29c0: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42          MUTYPE_B
29d0: 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41 4d  LOCK,         AM
29e0: 53 4b 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20  SK_ALIGN  },. { 
29f0: 22 70 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  "pre",          
2a00: 20 4d 41 52 4b 55 50 5f 50 52 45 2c 20 20 20 20   MARKUP_PRE,    
2a10: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f        MUTYPE_BLO
2a20: 43 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20 7d  CK,         0  }
2a30: 2c 0a 20 7b 20 22 73 22 2c 20 20 20 20 20 20 20  ,. { "s",       
2a40: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 2c 20        MARKUP_S, 
2a50: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
2a60: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
2a70: 20 30 20 20 7d 2c 0a 20 7b 20 22 73 61 6d 70 22   0  },. { "samp"
2a80: 2c 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55  ,          MARKU
2a90: 50 5f 53 41 4d 50 2c 20 20 20 20 20 20 20 20 20  P_SAMP,         
2aa0: 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20  MUTYPE_FONT,    
2ab0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
2ac0: 73 6d 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  small",         
2ad0: 4d 41 52 4b 55 50 5f 53 4d 41 4c 4c 2c 20 20 20  MARKUP_SMALL,   
2ae0: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
2af0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2b00: 0a 20 7b 20 22 73 70 61 6e 22 2c 20 20 20 20 20  . { "span",     
2b10: 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 50 41 4e       MARKUP_SPAN
2b20: 2c 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45  ,         MUTYPE
2b30: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
2b40: 30 20 20 7d 2c 0a 20 7b 20 22 73 74 72 69 6b 65  0  },. { "strike
2b50: 22 2c 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50  ",        MARKUP
2b60: 5f 53 54 52 49 4b 45 2c 20 20 20 20 20 20 20 4d  _STRIKE,       M
2b70: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2b80: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 73       0  },. { "s
2b90: 74 72 6f 6e 67 22 2c 20 20 20 20 20 20 20 20 4d  trong",        M
2ba0: 41 52 4b 55 50 5f 53 54 52 4f 4e 47 2c 20 20 20  ARKUP_STRONG,   
2bb0: 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c      MUTYPE_FONT,
2bc0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2bd0: 20 7b 20 22 73 75 62 22 2c 20 20 20 20 20 20 20   { "sub",       
2be0: 20 20 20 20 4d 41 52 4b 55 50 5f 53 55 42 2c 20      MARKUP_SUB, 
2bf0: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2c00: 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30  FONT,          0
2c10: 20 20 7d 2c 0a 20 7b 20 22 73 75 70 22 2c 20 20    },. { "sup",  
2c20: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2c30: 53 55 50 2c 20 20 20 20 20 20 20 20 20 20 4d 55  SUP,          MU
2c40: 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20  TYPE_FONT,      
2c50: 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 74 61      0  },. { "ta
2c60: 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 4d 41  ble",         MA
2c70: 52 4b 55 50 5f 54 41 42 4c 45 2c 20 20 20 20 20  RKUP_TABLE,     
2c80: 20 20 20 4d 55 54 59 50 45 5f 54 41 42 4c 45 2c     MUTYPE_TABLE,
2c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca0: 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 7c       AMSK_ALIGN|
2cb0: 41 4d 53 4b 5f 42 47 43 4f 4c 4f 52 7c 41 4d 53  AMSK_BGCOLOR|AMS
2cc0: 4b 5f 42 4f 52 44 45 52 7c 41 4d 53 4b 5f 43 45  K_BORDER|AMSK_CE
2cd0: 4c 4c 50 41 44 44 49 4e 47 7c 0a 20 20 20 20 20  LLPADDING|.     
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
2cf0: 4d 53 4b 5f 43 45 4c 4c 53 50 41 43 49 4e 47 7c  MSK_CELLSPACING|
2d00: 41 4d 53 4b 5f 48 53 50 41 43 45 7c 41 4d 53 4b  AMSK_HSPACE|AMSK
2d10: 5f 56 53 50 41 43 45 20 20 7d 2c 0a 20 7b 20 22  _VSPACE  },. { "
2d20: 74 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  td",            
2d30: 4d 41 52 4b 55 50 5f 54 44 2c 20 20 20 20 20 20  MARKUP_TD,      
2d40: 20 20 20 20 20 4d 55 54 59 50 45 5f 54 44 2c 0a       MUTYPE_TD,.
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 7c 41      AMSK_ALIGN|A
2d70: 4d 53 4b 5f 42 47 43 4f 4c 4f 52 7c 41 4d 53 4b  MSK_BGCOLOR|AMSK
2d80: 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20 20  _COLSPAN|.      
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d                AM
2da0: 53 4b 5f 52 4f 57 53 50 41 4e 7c 41 4d 53 4b 5f  SK_ROWSPAN|AMSK_
2db0: 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 74  VALIGN  },. { "t
2dc0: 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  h",            M
2dd0: 41 52 4b 55 50 5f 54 48 2c 20 20 20 20 20 20 20  ARKUP_TH,       
2de0: 20 20 20 20 4d 55 54 59 50 45 5f 54 44 2c 0a 20      MUTYPE_TD,. 
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 7c 41 4d     AMSK_ALIGN|AM
2e10: 53 4b 5f 42 47 43 4f 4c 4f 52 7c 41 4d 53 4b 5f  SK_BGCOLOR|AMSK_
2e20: 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20 20 20  COLSPAN|.       
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d 53               AMS
2e40: 4b 5f 52 4f 57 53 50 41 4e 7c 41 4d 53 4b 5f 56  K_ROWSPAN|AMSK_V
2e50: 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 74 72  ALIGN  },. { "tr
2e60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41  ",            MA
2e70: 52 4b 55 50 5f 54 52 2c 20 20 20 20 20 20 20 20  RKUP_TR,        
2e80: 20 20 20 4d 55 54 59 50 45 5f 54 52 2c 0a 20 20     MUTYPE_TR,.  
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 7c 41 4d 53    AMSK_ALIGN|AMS
2eb0: 4b 5f 42 47 43 4f 4c 4f 52 7c 7c 41 4d 53 4b 5f  K_BGCOLOR||AMSK_
2ec0: 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 74  VALIGN  },. { "t
2ed0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  t",            M
2ee0: 41 52 4b 55 50 5f 54 54 2c 20 20 20 20 20 20 20  ARKUP_TT,       
2ef0: 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c      MUTYPE_FONT,
2f00: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2f10: 20 7b 20 22 75 22 2c 20 20 20 20 20 20 20 20 20   { "u",         
2f20: 20 20 20 20 4d 41 52 4b 55 50 5f 55 2c 20 20 20      MARKUP_U,   
2f30: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2f40: 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30  FONT,          0
2f50: 20 20 7d 2c 0a 20 7b 20 22 75 6c 22 2c 20 20 20    },. { "ul",   
2f60: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2f70: 55 4c 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55  UL,           MU
2f80: 54 59 50 45 5f 4c 49 53 54 2c 0a 20 20 20 20 20  TYPE_LIST,.     
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
2fa0: 4d 53 4b 5f 54 59 50 45 7c 41 4d 53 4b 5f 43 4f  MSK_TYPE|AMSK_CO
2fb0: 4d 50 41 43 54 20 20 7d 2c 0a 20 7b 20 22 76 61  MPACT  },. { "va
2fc0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 4d 41  r",           MA
2fd0: 52 4b 55 50 5f 56 41 52 2c 20 20 20 20 20 20 20  RKUP_VAR,       
2fe0: 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20     MUTYPE_FONT, 
2ff0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20           0  },. 
3000: 7b 20 22 76 65 72 62 61 74 69 6d 22 2c 20 20 20  { "verbatim",   
3010: 20 20 20 4d 41 52 4b 55 50 5f 56 45 52 42 41 54     MARKUP_VERBAT
3020: 49 4d 2c 20 20 20 20 20 4d 55 54 59 50 45 5f 53  IM,     MUTYPE_S
3030: 50 45 43 49 41 4c 2c 20 20 20 20 20 20 20 41 4d  PECIAL,       AM
3040: 53 4b 5f 49 44 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a  SK_ID },.};../*.
3050: 2a 2a 20 55 73 65 20 62 69 6e 61 72 79 20 73 65  ** Use binary se
3060: 61 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20 61  arch to locate a
3070: 20 74 61 67 20 69 6e 20 74 68 65 20 61 4d 61 72   tag in the aMar
3080: 6b 75 70 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a  kup[] table..*/.
3090: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 54  static int findT
30a0: 61 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ag(const char *z
30b0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 2c 20 66  ){.  int i, c, f
30c0: 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 66 69  irst, last;.  fi
30d0: 72 73 74 20 3d 20 31 3b 0a 20 20 6c 61 73 74 20  rst = 1;.  last 
30e0: 3d 20 73 69 7a 65 6f 66 28 61 4d 61 72 6b 75 70  = sizeof(aMarkup
30f0: 29 2f 73 69 7a 65 6f 66 28 61 4d 61 72 6b 75 70  )/sizeof(aMarkup
3100: 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c  [0]) - 1;.  whil
3110: 65 28 20 66 69 72 73 74 3c 3d 6c 61 73 74 20 29  e( first<=last )
3120: 7b 0a 20 20 20 20 69 20 3d 20 28 66 69 72 73 74  {.    i = (first
3130: 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20 20 63 20  +last)/2;.    c 
3140: 3d 20 73 74 72 63 6d 70 28 61 4d 61 72 6b 75 70  = strcmp(aMarkup
3150: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 29 3b 0a 20  [i].zName, z);. 
3160: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
3170: 20 20 20 20 20 61 73 73 65 72 74 28 20 61 4d 61       assert( aMa
3180: 72 6b 75 70 5b 69 5d 2e 69 43 6f 64 65 3d 3d 69  rkup[i].iCode==i
3190: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
31a0: 20 69 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   i;.    }else if
31b0: 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 66  ( c<0 ){.      f
31c0: 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  irst = i+1;.    
31d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
31e0: 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20 7d 0a 20  t = i-1;.    }. 
31f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 4d 41 52 4b   }.  return MARK
3200: 55 50 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  UP_INVALID;.}../
3210: 2a 0a 2a 2a 20 54 6f 6b 65 6e 20 74 79 70 65 73  *.** Token types
3220: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45  .*/.#define TOKE
3230: 4e 5f 4d 41 52 4b 55 50 20 20 20 20 20 20 20 20  N_MARKUP        
3240: 31 20 20 20 20 2f 2a 20 3c 2e 2e 2e 3e 20 2a 2f  1    /* <...> */
3250: 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 43  .#define TOKEN_C
3260: 48 41 52 41 43 54 45 52 20 20 20 20 20 32 20 20  HARACTER     2  
3270: 20 20 2f 2a 20 22 26 22 20 6f 72 20 22 3c 22 20    /* "&" or "<" 
3280: 6e 6f 74 20 70 61 72 74 20 6f 66 20 6d 61 72 6b  not part of mark
3290: 75 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f  up */.#define TO
32a0: 4b 45 4e 5f 4c 49 4e 4b 20 20 20 20 20 20 20 20  KEN_LINK        
32b0: 20 20 33 20 20 20 20 2f 2a 20 5b 2e 2e 2e 5d 20    3    /* [...] 
32c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e  */.#define TOKEN
32d0: 5f 50 41 52 41 47 52 41 50 48 20 20 20 20 20 34  _PARAGRAPH     4
32e0: 20 20 20 20 2f 2a 20 62 6c 61 6e 6b 20 6c 69 6e      /* blank lin
32f0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f  es */.#define TO
3300: 4b 45 4e 5f 4e 45 57 4c 49 4e 45 20 20 20 20 20  KEN_NEWLINE     
3310: 20 20 35 20 20 20 20 2f 2a 20 41 20 73 69 6e 67    5    /* A sing
3320: 6c 65 20 22 5c 6e 22 20 2a 2f 0a 23 64 65 66 69  le "\n" */.#defi
3330: 6e 65 20 54 4f 4b 45 4e 5f 42 55 4c 4c 45 54 20  ne TOKEN_BULLET 
3340: 20 20 20 20 20 20 20 36 20 20 20 20 2f 2a 20 20         6    /*  
3350: 22 20 20 2a 20 20 22 20 2a 2f 0a 23 64 65 66 69  "  *  " */.#defi
3360: 6e 65 20 54 4f 4b 45 4e 5f 45 4e 55 4d 20 20 20  ne TOKEN_ENUM   
3370: 20 20 20 20 20 20 20 37 20 20 20 20 2f 2a 20 20         7    /*  
3380: 22 20 20 5c 28 3f 5c 64 2b 5b 2e 29 5d 3f 20 20  "  \(?\d+[.)]?  
3390: 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b  " */.#define TOK
33a0: 45 4e 5f 49 4e 44 45 4e 54 20 20 20 20 20 20 20  EN_INDENT       
33b0: 20 38 20 20 20 20 2f 2a 20 20 22 20 20 20 22 20   8    /*  "   " 
33c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e  */.#define TOKEN
33d0: 5f 43 4f 4d 4d 45 4e 54 20 20 20 20 20 20 20 39  _COMMENT       9
33e0: 20 20 20 20 2f 2a 20 3c 21 2d 2d 20 2d 2d 3e 20      /* <!-- --> 
33f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e  */.#define TOKEN
3400: 5f 54 45 58 54 20 20 20 20 20 20 20 20 20 31 30  _TEXT         10
3410: 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74      /* None of t
3420: 68 65 20 61 62 6f 76 65 20 2a 2f 0a 0a 2f 2a 0a  he above */../*.
3430: 2a 2a 20 53 74 61 74 65 20 66 6c 61 67 73 0a 2a  ** State flags.*
3440: 2f 0a 23 64 65 66 69 6e 65 20 41 54 5f 4e 45 57  /.#define AT_NEW
3450: 4c 49 4e 45 20 20 20 20 20 20 20 20 20 20 30 78  LINE          0x
3460: 30 30 31 20 20 2f 2a 20 41 74 20 73 74 61 72 74  001  /* At start
3470: 20 6f 66 20 61 20 6c 69 6e 65 20 2a 2f 0a 23 64   of a line */.#d
3480: 65 66 69 6e 65 20 41 54 5f 50 41 52 41 47 52 41  efine AT_PARAGRA
3490: 50 48 20 20 20 20 20 20 20 20 30 78 30 30 32 20  PH        0x002 
34a0: 20 2f 2a 20 41 74 20 73 74 61 72 74 20 6f 66 20   /* At start of 
34b0: 61 20 70 61 72 61 67 72 61 70 68 20 2a 2f 0a 23  a paragraph */.#
34c0: 64 65 66 69 6e 65 20 41 4c 4c 4f 57 5f 57 49 4b  define ALLOW_WIK
34d0: 49 20 20 20 20 20 20 20 20 20 20 30 78 30 30 34  I          0x004
34e0: 20 20 2f 2a 20 41 6c 6c 6f 77 20 77 69 6b 69 20    /* Allow wiki 
34f0: 6d 61 72 6b 75 70 20 2a 2f 0a 23 64 65 66 69 6e  markup */.#defin
3500: 65 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f 4f 4e  e FONT_MARKUP_ON
3510: 4c 59 20 20 20 20 30 78 30 30 38 20 20 2f 2a 20  LY    0x008  /* 
3520: 4f 6e 6c 79 20 61 6c 6c 6f 77 20 4d 55 54 59 50  Only allow MUTYP
3530: 45 5f 46 4f 4e 54 20 6d 61 72 6b 75 70 20 2a 2f  E_FONT markup */
3540: 0a 23 64 65 66 69 6e 65 20 49 4e 4c 49 4e 45 5f  .#define INLINE_
3550: 4d 41 52 4b 55 50 5f 4f 4e 4c 59 20 20 30 78 30  MARKUP_ONLY  0x0
3560: 31 30 20 20 2f 2a 20 41 6c 6c 6f 77 20 6f 6e 6c  10  /* Allow onl
3570: 79 20 22 69 6e 6c 69 6e 65 22 20 6d 61 72 6b 75  y "inline" marku
3580: 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 5f  p */.#define IN_
3590: 4c 49 53 54 20 20 20 20 20 20 20 20 20 20 20 20  LIST            
35a0: 20 30 78 30 32 30 20 20 2f 2a 20 57 69 74 68 69   0x020  /* Withi
35b0: 6e 20 77 69 6b 69 20 3c 75 6c 3e 20 6f 72 20 3c  n wiki <ul> or <
35c0: 6f 6c 3e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 75  ol> */../*.** Cu
35d0: 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
35e0: 68 65 20 72 65 6e 64 65 72 69 6e 67 20 65 6e 67  he rendering eng
35f0: 69 6e 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ine.*/.typedef s
3600: 74 72 75 63 74 20 52 65 6e 64 65 72 65 72 20 52  truct Renderer R
3610: 65 6e 64 65 72 65 72 3b 0a 73 74 72 75 63 74 20  enderer;.struct 
3620: 52 65 6e 64 65 72 65 72 20 7b 0a 20 20 42 6c 6f  Renderer {.  Blo
3630: 62 20 2a 70 4f 75 74 3b 20 20 20 20 20 20 20 20  b *pOut;        
3640: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
3650: 75 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ut appended to t
3660: 68 69 73 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e  his blob */.  in
3670: 74 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  t state;        
3680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
3690: 67 20 74 68 61 74 20 67 6f 76 65 72 6e 20 72 65  g that govern re
36a0: 6e 64 65 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ndering */.  int
36b0: 20 77 69 6b 69 4c 69 73 74 3b 20 20 20 20 20 20   wikiList;      
36c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
36d0: 65 6e 74 20 77 69 6b 69 20 6c 69 73 74 20 74 79  ent wiki list ty
36e0: 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 56 65  pe */.  int inVe
36f0: 72 62 61 74 69 6d 3b 20 20 20 20 20 20 20 20 20  rbatim;         
3700: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 3c      /* True in <
3710: 76 65 72 62 61 74 69 6d 3e 20 6d 6f 64 65 20 2a  verbatim> mode *
3720: 2f 0a 20 20 69 6e 74 20 70 72 65 56 65 72 62 53  /.  int preVerbS
3730: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
3740: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 73 74 61 74  /* Value of stat
3750: 65 20 70 72 69 6f 72 20 74 6f 20 76 65 72 62 61  e prior to verba
3760: 74 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 77 61 6e  tim */.  int wan
3770: 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 3b 20  tAutoParagraph; 
3780: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3790: 61 20 3c 70 3e 20 69 73 20 64 65 73 69 72 65 64  a <p> is desired
37a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 41 75 74 6f   */.  int inAuto
37b0: 50 61 72 61 67 72 61 70 68 3b 20 20 20 20 20 20  Paragraph;      
37c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 69 74    /* True if wit
37d0: 68 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  hin an automatic
37e0: 20 70 61 72 61 67 72 61 70 68 20 2a 2f 0a 20 20   paragraph */.  
37f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 65 72  const char *zVer
3800: 62 61 74 69 6d 49 64 3b 20 20 20 20 2f 2a 20 54  batimId;    /* T
3810: 68 65 20 69 64 3d 20 61 74 74 72 69 62 75 74 65  he id= attribute
3820: 20 6f 66 20 3c 76 65 72 62 61 74 69 6d 3e 20 2a   of <verbatim> *
3830: 2f 0a 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20  /.  int nStack; 
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
3860: 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 73 74 61  ments on the sta
3870: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  ck */.  int nAll
3880: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3890: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
38a0: 6f 63 61 74 65 64 20 66 6f 72 20 61 53 74 61 63  ocated for aStac
38b0: 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 53  k */.  struct sS
38c0: 74 61 63 6b 20 7b 0a 20 20 20 20 73 68 6f 72 74  tack {.    short
38d0: 20 69 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20   iCode;         
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 75          /* Marku
38f0: 70 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 68  p code */.    sh
3900: 6f 72 74 20 61 6c 6c 6f 77 57 69 6b 69 3b 20 20  ort allowWiki;  
3910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4c             /* AL
3920: 4c 4f 57 5f 57 49 4b 49 20 69 66 20 77 69 6b 69  LOW_WIKI if wiki
3930: 20 61 6c 6c 6f 77 65 64 20 62 65 66 6f 72 65 20   allowed before 
3940: 74 61 67 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  tag */.    const
3950: 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
3960: 20 20 20 20 20 20 20 20 2f 2a 20 49 44 20 61 74          /* ID at
3970: 74 72 69 62 75 74 65 20 6f 72 20 4e 55 4c 4c 20  tribute or NULL 
3980: 2a 2f 0a 20 20 7d 20 2a 61 53 74 61 63 6b 3b 0a  */.  } *aStack;.
3990: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 7a 20 70 6f 69  };.../*.** z poi
39a0: 6e 74 73 20 74 6f 20 61 20 22 3c 22 20 63 68 61  nts to a "<" cha
39b0: 72 61 63 74 65 72 2e 20 20 43 68 65 63 6b 20 74  racter.  Check t
39c0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
39d0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
39e0: 20 61 20 76 61 6c 69 64 20 6d 61 72 6b 75 70 2e   a valid markup.
39f0: 20 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75    If it is, retu
3a00: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
3a10: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
3a20: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 72 6b  s in.** the mark
3a30: 75 70 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  up including the
3a40: 20 69 6e 69 74 69 61 6c 20 22 3c 22 20 61 6e 64   initial "<" and
3a50: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67   the terminating
3a60: 20 22 3e 22 2e 20 20 49 66 0a 2a 2a 20 69 74 20   ">".  If.** it 
3a70: 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d  is not well-form
3a80: 65 64 20 6d 61 72 6b 75 70 2c 20 72 65 74 75 72  ed markup, retur
3a90: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
3aa0: 6e 74 20 6d 61 72 6b 75 70 4c 65 6e 67 74 68 28  nt markupLength(
3ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
3ac0: 20 20 69 6e 74 20 6e 20 3d 20 31 3b 0a 20 20 69    int n = 1;.  i
3ad0: 6e 74 20 69 6e 70 61 72 65 6e 20 3d 20 30 3b 0a  nt inparen = 0;.
3ae0: 0a 20 20 2f 2f 20 69 73 20 61 20 63 6f 6d 6d 65  .  // is a comme
3af0: 6e 74 20 2d 20 69 66 20 76 61 6c 69 64 20 72 65  nt - if valid re
3b00: 74 75 72 6e 20 6e 20 65 6c 73 65 20 72 65 74 75  turn n else retu
3b10: 72 6e 20 30 0a 20 20 69 66 28 20 7a 5b 6e 5d 3d  rn 0.  if( z[n]=
3b20: 3d 27 21 27 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ='!' ){.    n++;
3b30: 0a 20 20 20 20 69 66 20 28 7a 5b 6e 5d 21 3d 27  .    if (z[n]!='
3b40: 2d 27 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  -') return 0;.  
3b50: 20 20 6e 2b 2b 3b 0a 20 20 20 20 69 66 20 28 7a    n++;.    if (z
3b60: 5b 6e 5d 21 3d 27 2d 27 29 20 72 65 74 75 72 6e  [n]!='-') return
3b70: 20 30 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 20   0;.    n++;.   
3b80: 20 77 68 69 6c 65 20 28 7a 5b 6e 5d 29 7b 0a 20   while (z[n]){. 
3b90: 20 20 20 20 20 77 68 69 6c 65 20 28 7a 5b 6e 5d       while (z[n]
3ba0: 20 26 26 20 7a 5b 6e 5d 21 3d 27 3e 27 29 20 6e   && z[n]!='>') n
3bb0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 21 7a  ++;.      if (!z
3bc0: 5b 6e 5d 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  [n]) return 0;. 
3bd0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
3be0: 69 66 28 6e 3e 33 20 26 26 20 7a 5b 6e 2d 33 5d  if(n>3 && z[n-3]
3bf0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 6e 2d 32 5d 3d  =='-' && z[n-2]=
3c00: 3d 27 2d 27 29 0a 20 20 20 20 20 20 20 20 72 65  ='-').        re
3c10: 74 75 72 6e 20 28 6e 3e 37 29 20 3f 20 6e 20 3a  turn (n>7) ? n :
3c20: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
3c30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
3c40: 66 28 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29 7b 20  f( z[n]=='/' ){ 
3c50: 6e 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 21 69 73  n++; }.  if( !is
3c60: 61 6c 70 68 61 28 7a 5b 6e 5d 29 20 29 20 72 65  alpha(z[n]) ) re
3c70: 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
3c80: 20 69 73 61 6c 6e 75 6d 28 7a 5b 6e 5d 29 20 29   isalnum(z[n]) )
3c90: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 7a  { n++; }.  if( z
3ca0: 5b 6e 5d 21 3d 27 3e 27 20 26 26 20 21 69 73 73  [n]!='>' && !iss
3cb0: 70 61 63 65 28 7a 5b 6e 5d 29 20 29 20 72 65 74  pace(z[n]) ) ret
3cc0: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
3cd0: 7a 5b 6e 5d 20 26 26 20 28 7a 5b 6e 5d 21 3d 27  z[n] && (z[n]!='
3ce0: 3e 27 20 7c 7c 20 69 6e 70 61 72 65 6e 29 20 29  >' || inparen) )
3cf0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d  {.    if( z[n]==
3d00: 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 70  '"' ){.      inp
3d10: 61 72 65 6e 20 3d 20 21 69 6e 70 61 72 65 6e 3b  aren = !inparen;
3d20: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 2b 2b 3b 0a  .    }.    n++;.
3d30: 20 20 7d 0a 20 20 69 66 28 20 7a 5b 6e 5d 21 3d    }.  if( z[n]!=
3d40: 27 3e 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  '>' ) return 0;.
3d50: 20 20 72 65 74 75 72 6e 20 6e 2b 31 3b 0a 7d 0a    return n+1;.}.
3d60: 0a 2f 2a 0a 2a 2a 20 7a 20 70 6f 69 6e 74 73 20  ./*.** z points 
3d70: 74 6f 20 61 20 22 5c 6e 22 20 63 68 61 72 61 63  to a "\n" charac
3d80: 74 65 72 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ter.  Check to s
3d90: 65 65 20 69 66 20 74 68 69 73 20 6e 65 77 6c 69  ee if this newli
3da0: 6e 65 20 69 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 65  ne is.** followe
3db0: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
3dc0: 20 62 6c 61 6e 6b 20 6c 69 6e 65 73 2e 20 20 49   blank lines.  I
3dd0: 66 20 69 74 20 69 73 2c 20 72 65 74 75 72 6e 20  f it is, return 
3de0: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
3df0: 20 63 68 61 72 61 63 74 65 72 73 20 74 68 72 6f   characters thro
3e00: 75 67 68 20 74 68 65 20 63 6c 6f 73 69 6e 67 20  ugh the closing 
3e10: 22 5c 6e 22 2e 20 20 49 66 20 6e 6f 74 2c 20 72  "\n".  If not, r
3e20: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3e30: 69 63 20 69 6e 74 20 70 61 72 61 67 72 61 70 68  ic int paragraph
3e40: 42 72 65 61 6b 4c 65 6e 67 74 68 28 63 6f 6e 73  BreakLength(cons
3e50: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
3e60: 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 4e  t i, n;.  int nN
3e70: 65 77 6c 69 6e 65 20 3d 20 31 3b 0a 20 20 66 6f  ewline = 1;.  fo
3e80: 72 28 69 3d 31 2c 20 6e 3d 30 3b 20 69 73 73 70  r(i=1, n=0; issp
3e90: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
3ea0: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
3eb0: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 4e 65  \n' ){.      nNe
3ec0: 77 6c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 6e  wline++;.      n
3ed0: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
3ee0: 20 20 69 66 28 20 6e 4e 65 77 6c 69 6e 65 3e 3d    if( nNewline>=
3ef0: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
3f00: 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n+1;.  }else{.  
3f10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3f30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
3f40: 61 72 61 63 74 65 72 73 20 75 6e 74 69 6c 20 74  aracters until t
3f50: 68 65 20 6e 65 78 74 20 22 69 6e 74 65 72 65 73  he next "interes
3f60: 74 69 6e 67 22 0a 2a 2a 20 63 68 61 72 61 63 74  ting".** charact
3f70: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  ers..**.** Inter
3f80: 65 73 74 69 6e 67 20 63 68 61 72 61 63 74 65 72  esting character
3f90: 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
3fa0: 20 20 3c 0a 2a 2a 20 20 20 20 20 20 26 0a 2a 2a    <.**      &.**
3fb0: 20 20 20 20 20 20 5c 6e 0a 2a 2a 20 20 20 20 20        \n.**     
3fc0: 20 5b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 5b 22   [.**.** The "["
3fd0: 20 61 6e 64 20 22 5c 6e 22 20 61 72 65 20 6f 6e   and "\n" are on
3fe0: 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 6e  ly considered in
3ff0: 74 65 72 65 73 74 69 6e 67 20 69 66 20 74 68 65  teresting if the
4000: 20 22 75 73 65 57 69 6b 69 22 0a 2a 2a 20 66 6c   "useWiki".** fl
4010: 61 67 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ag is set..*/.st
4020: 61 74 69 63 20 69 6e 74 20 74 65 78 74 4c 65 6e  atic int textLen
4030: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
4040: 7a 2c 20 69 6e 74 20 75 73 65 57 69 6b 69 29 7b  z, int useWiki){
4050: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
4060: 69 6e 74 20 63 3b 0a 20 20 77 68 69 6c 65 28 20  int c;.  while( 
4070: 28 63 20 3d 20 7a 5b 30 5d 29 21 3d 30 20 26 26  (c = z[0])!=0 &&
4080: 20 63 21 3d 27 3c 27 20 26 26 20 63 21 3d 27 26   c!='<' && c!='&
4090: 27 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ' &&.           
40a0: 20 20 20 20 28 75 73 65 57 69 6b 69 3d 3d 30 20      (useWiki==0 
40b0: 7c 7c 20 28 63 21 3d 27 5b 27 20 26 26 20 63 21  || (c!='[' && c!
40c0: 3d 27 5c 6e 27 29 29 20 29 7b 0a 20 20 20 20 6e  ='\n')) ){.    n
40d0: 2b 2b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d  ++;.    z++;.  }
40e0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
40f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
4100: 65 20 69 66 20 7a 5b 5d 20 62 65 67 69 6e 73 20  e if z[] begins 
4110: 77 69 74 68 20 61 6e 20 48 54 4d 4c 20 63 68 61  with an HTML cha
4120: 72 61 63 74 65 72 20 65 6c 65 6d 65 6e 74 2e 0a  racter element..
4130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
4140: 45 6c 65 6d 65 6e 74 28 63 6f 6e 73 74 20 63 68  Element(const ch
4150: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
4160: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d  .  assert( z[0]=
4170: 3d 27 26 27 20 29 3b 0a 20 20 69 66 28 20 7a 5b  ='&' );.  if( z[
4180: 31 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 66  1]=='#' ){.    f
4190: 6f 72 28 69 3d 32 3b 20 69 73 64 69 67 69 74 28  or(i=2; isdigit(
41a0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
41b0: 20 20 72 65 74 75 72 6e 20 69 3e 32 20 26 26 20    return i>2 && 
41c0: 7a 5b 69 5d 3d 3d 27 3b 27 3b 0a 20 20 7d 65 6c  z[i]==';';.  }el
41d0: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  se{.    for(i=1;
41e0: 20 69 73 61 6c 70 68 61 28 7a 5b 69 5d 29 3b 20   isalpha(z[i]); 
41f0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 72 65 74 75 72  i++){}.    retur
4200: 6e 20 69 3e 31 20 26 26 20 7a 5b 69 5d 3d 3d 27  n i>1 && z[i]=='
4210: 3b 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ;';.  }.}../*.**
4220: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
4230: 20 74 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   the z[] string 
4240: 69 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  is the beginning
4250: 20 6f 66 20 61 20 77 69 6b 69 20 62 75 6c 6c 65   of a wiki bulle
4260: 74 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  t..** If it is, 
4270: 72 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  return the lengt
4280: 68 20 6f 66 20 74 68 65 20 62 75 6c 6c 65 74 20  h of the bullet 
4290: 74 65 78 74 2e 20 20 4f 74 68 65 72 77 69 73 65  text.  Otherwise
42a0: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
42b0: 61 74 69 63 20 69 6e 74 20 62 75 6c 6c 65 74 4c  atic int bulletL
42c0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
42d0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e   *z){.  int i, n
42e0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 20 3d  ;.  n = 0;.  i =
42f0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e   0;.  while( z[n
4300: 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d  ]==' ' || z[n]==
4310: 27 5c 74 27 20 29 7b 0a 20 20 20 20 69 66 28 20  '\t' ){.    if( 
4320: 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 20 69 2b 2b  z[n]=='\t' ) i++
4330: 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6e  ;.    i++;.    n
4340: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ++;.  }.  if( i<
4350: 32 20 7c 7c 20 7a 5b 6e 5d 21 3d 27 2a 27 20 29  2 || z[n]!='*' )
4360: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 2b 2b   return 0;.  n++
4370: 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  i = 0;.  whi
4380: 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20 27 20 7c 7c  le( z[n]==' ' ||
4390: 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 7b 0a 20   z[n]=='\t' ){. 
43a0: 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 74     if( z[n]=='\t
43b0: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 2b 2b  ' ) i++;.    i++
43c0: 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  ;.    n++;.  }. 
43d0: 20 69 66 28 20 69 3c 32 20 7c 7c 20 69 73 73 70   if( i<2 || issp
43e0: 61 63 65 28 7a 5b 6e 5d 29 20 29 20 72 65 74 75  ace(z[n]) ) retu
43f0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rn 0;.  return n
4400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
4410: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 7a   to see if the z
4420: 5b 5d 20 73 74 72 69 6e 67 20 69 73 20 74 68 65  [] string is the
4430: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
4440: 65 6e 75 6d 65 72 61 74 69 6f 6e 20 76 61 6c 75  enumeration valu
4450: 65 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  e..** If it is, 
4460: 72 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  return the lengt
4470: 68 20 6f 66 20 74 68 65 20 62 75 6c 6c 65 74 20  h of the bullet 
4480: 74 65 78 74 2e 20 20 4f 74 68 65 72 77 69 73 65  text.  Otherwise
4490: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
44a0: 20 53 79 6e 74 61 78 3a 0a 2a 2a 20 20 20 20 2a   Syntax:.**    *
44b0: 20 20 61 20 74 61 62 20 6f 72 20 74 77 6f 20 6f    a tab or two o
44c0: 72 20 6d 6f 72 65 20 73 70 61 63 65 73 0a 2a 2a  r more spaces.**
44d0: 20 20 20 20 2a 20 20 6f 6e 65 20 6f 72 20 6d 6f      *  one or mo
44e0: 72 65 20 64 69 67 69 74 73 0a 2a 2a 20 20 20 20  re digits.**    
44f0: 2a 20 20 6f 70 74 69 6f 6e 61 6c 20 22 2e 22 0a  *  optional ".".
4500: 2a 2a 20 20 20 20 2a 20 20 61 6e 6f 74 68 65 72  **    *  another
4510: 20 74 61 62 20 6f 72 20 74 77 6f 20 6f 72 65 20   tab or two ore 
4520: 6d 6f 72 65 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  more spaces..**.
4530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e  */.static int en
4540: 75 6d 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  umLength(const c
4550: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
4560: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  , n;.  n = 0;.  
4570: 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
4580: 7a 5b 6e 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6e  z[n]==' ' || z[n
4590: 5d 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 69  ]=='\t' ){.    i
45a0: 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 20  f( z[n]=='\t' ) 
45b0: 69 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  i++;.    i++;.  
45c0: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
45d0: 20 69 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b   i<2 ) return 0;
45e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 64 69  .  for(i=0; isdi
45f0: 67 69 74 28 7a 5b 6e 5d 29 3b 20 69 2b 2b 2c 20  git(z[n]); i++, 
4600: 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d  n++){}.  if( i==
4610: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4620: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 2e 27 20 29 7b  if( z[n]=='.' ){
4630: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
4640: 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
4650: 7a 5b 6e 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6e  z[n]==' ' || z[n
4660: 5d 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 69  ]=='\t' ){.    i
4670: 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 20  f( z[n]=='\t' ) 
4680: 69 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  i++;.    i++;.  
4690: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
46a0: 20 69 3c 32 20 7c 7c 20 69 73 73 70 61 63 65 28   i<2 || isspace(
46b0: 7a 5b 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30  z[n]) ) return 0
46c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
46d0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
46e0: 73 65 65 20 69 66 20 74 68 65 20 7a 5b 5d 20 73  see if the z[] s
46f0: 74 72 69 6e 67 20 69 73 20 74 68 65 20 62 65 67  tring is the beg
4700: 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 69 6e 64  inning of an ind
4710: 65 6e 74 65 64 0a 2a 2a 20 70 61 72 61 67 72 61  ented.** paragra
4720: 70 68 2e 20 20 49 66 20 69 74 20 69 73 2c 20 72  ph.  If it is, r
4730: 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
4740: 20 6f 66 20 74 68 65 20 69 6e 64 65 6e 74 2e 20   of the indent. 
4750: 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
4760: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
4770: 63 20 69 6e 74 20 69 6e 64 65 6e 74 4c 65 6e 67  c int indentLeng
4780: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
4790: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
47a0: 20 6e 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b   n = 0;.  i = 0;
47b0: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d 3d  .  while( z[n]==
47c0: 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74  ' ' || z[n]=='\t
47d0: 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 6e  ' ){.    if( z[n
47e0: 5d 3d 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a 20  ]=='\t' ) i++;. 
47f0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b 3b     i++;.    n++;
4800: 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 32 20 7c  .  }.  if( i<2 |
4810: 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 5d 29 20  | isspace(z[n]) 
4820: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
4830: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
4840: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
4850: 20 74 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   the z[] string 
4860: 69 73 20 61 20 77 69 6b 69 20 68 79 70 65 72 6c  is a wiki hyperl
4870: 69 6e 6b 2e 20 20 49 66 20 69 74 20 69 73 2c 0a  ink.  If it is,.
4880: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6c 65  ** return the le
4890: 6e 67 74 68 20 6f 66 20 74 68 65 20 68 79 70 65  ngth of the hype
48a0: 72 6c 69 6e 6b 2e 20 20 4f 74 68 65 72 77 69 73  rlink.  Otherwis
48b0: 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
48c0: 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 6b 4c 65  tatic int linkLe
48d0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
48e0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
48f0: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5b  assert( z[0]=='[
4900: 27 20 29 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  ' );.  for(n=0; 
4910: 7a 5b 6e 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 5d  z[n] && z[n]!=']
4920: 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; n++){}.  if( 
4930: 7a 5b 6e 5d 3d 3d 27 5d 27 20 29 7b 0a 20 20 20  z[n]==']' ){.   
4940: 20 72 65 74 75 72 6e 20 6e 2b 31 3b 0a 20 20 7d   return n+1;.  }
4950: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
4960: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a   0;.  }.}.../*.*
4970: 2a 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  * z points to th
4980: 65 20 73 74 61 72 74 20 6f 66 20 61 20 74 6f 6b  e start of a tok
4990: 65 6e 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  en.  Return the 
49a0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
49b0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 61 74 20  racters in that 
49c0: 74 6f 6b 65 6e 2e 20 20 57 72 69 74 65 20 74 68  token.  Write th
49d0: 65 20 74 6f 6b 65 6e 20 74 79 70 65 20 69 6e 74  e token type int
49e0: 6f 20 2a 70 54 6f 6b 65 6e 54 79 70 65 2e 0a 2a  o *pTokenType..*
49f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 78  /.static int nex
4a00: 74 54 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 68 61  tToken(const cha
4a10: 72 20 2a 7a 2c 20 52 65 6e 64 65 72 65 72 20 2a  r *z, Renderer *
4a20: 70 2c 20 69 6e 74 20 2a 70 54 6f 6b 65 6e 54 79  p, int *pTokenTy
4a30: 70 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  pe){.  int n;.  
4a40: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3c 27 20 29 7b  if( z[0]=='<' ){
4a50: 0a 20 20 20 20 6e 20 3d 20 6d 61 72 6b 75 70 4c  .    n = markupL
4a60: 65 6e 67 74 68 28 7a 29 3b 0a 0a 20 20 20 20 69  ength(z);..    i
4a70: 66 28 20 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20  f( n>1 ){.      
4a80: 69 66 20 28 7a 5b 31 5d 3d 3d 27 21 27 29 7b 0a  if (z[1]=='!'){.
4a90: 20 20 20 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54          *pTokenT
4aa0: 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 43 4f 4d 4d  ype = TOKEN_COMM
4ab0: 45 4e 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ENT;.        ret
4ac0: 75 72 6e 20 6e 3b 0a 20 20 20 20 20 20 7d 20 65  urn n;.      } e
4ad0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 70  lse {.        *p
4ae0: 54 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45  TokenType = TOKE
4af0: 4e 5f 4d 41 52 4b 55 50 3b 0a 20 20 20 20 20 20  N_MARKUP;.      
4b00: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20    return n;.    
4b10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
4b20: 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65       *pTokenType
4b30: 20 3d 20 54 4f 4b 45 4e 5f 43 48 41 52 41 43 54   = TOKEN_CHARACT
4b40: 45 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ER;.      return
4b50: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
4b60: 69 66 28 20 7a 5b 30 5d 3d 3d 27 26 27 20 26 26  if( z[0]=='&' &&
4b70: 20 28 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d 20   (p->inVerbatim 
4b80: 7c 7c 20 21 69 73 45 6c 65 6d 65 6e 74 28 7a 29  || !isElement(z)
4b90: 29 20 29 7b 0a 20 20 20 20 2a 70 54 6f 6b 65 6e  ) ){.    *pToken
4ba0: 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 43 48 41  Type = TOKEN_CHA
4bb0: 52 41 43 54 45 52 3b 0a 20 20 20 20 72 65 74 75  RACTER;.    retu
4bc0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
4bd0: 28 70 2d 3e 73 74 61 74 65 20 26 20 41 4c 4c 4f  (p->state & ALLO
4be0: 57 5f 57 49 4b 49 29 21 3d 30 20 29 7b 0a 20 20  W_WIKI)!=0 ){.  
4bf0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 6e 27    if( z[0]=='\n'
4c00: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 61   ){.      n = pa
4c10: 72 61 67 72 61 70 68 42 72 65 61 6b 4c 65 6e 67  ragraphBreakLeng
4c20: 74 68 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  th(z);.      if(
4c30: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   n>0 ){.        
4c40: 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4f  *pTokenType = TO
4c50: 4b 45 4e 5f 50 41 52 41 47 52 41 50 48 3b 0a 20  KEN_PARAGRAPH;. 
4c60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b         return n;
4c70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4c80: 20 69 73 73 70 61 63 65 28 7a 5b 31 5d 29 20 29   isspace(z[1]) )
4c90: 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f 6b 65  {.        *pToke
4ca0: 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 4e 45  nType = TOKEN_NE
4cb0: 57 4c 49 4e 45 3b 0a 20 20 20 20 20 20 20 20 72  WLINE;.        r
4cc0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
4cd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
4ce0: 70 2d 3e 73 74 61 74 65 20 26 20 41 54 5f 4e 45  p->state & AT_NE
4cf0: 57 4c 49 4e 45 29 21 3d 30 20 26 26 20 69 73 73  WLINE)!=0 && iss
4d00: 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a 20 20  pace(z[0]) ){.  
4d10: 20 20 20 20 6e 20 3d 20 62 75 6c 6c 65 74 4c 65      n = bulletLe
4d20: 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20 20 69  ngth(z);.      i
4d30: 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( n>0 ){.      
4d40: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20    *pTokenType = 
4d50: 54 4f 4b 45 4e 5f 42 55 4c 4c 45 54 3b 0a 20 20  TOKEN_BULLET;.  
4d60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a        return n;.
4d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20        }.      n 
4d80: 3d 20 65 6e 75 6d 4c 65 6e 67 74 68 28 7a 29 3b  = enumLength(z);
4d90: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 29  .      if( n>0 )
4da0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f 6b 65  {.        *pToke
4db0: 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 45 4e  nType = TOKEN_EN
4dc0: 55 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  UM;.        retu
4dd0: 72 6e 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn n;.      }.  
4de0: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e    }.    if( (p->
4df0: 73 74 61 74 65 20 26 20 41 54 5f 50 41 52 41 47  state & AT_PARAG
4e00: 52 41 50 48 29 21 3d 30 20 26 26 20 69 73 73 70  RAPH)!=0 && issp
4e10: 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a 20 20 20  ace(z[0]) ){.   
4e20: 20 20 20 6e 20 3d 20 69 6e 64 65 6e 74 4c 65 6e     n = indentLen
4e30: 67 74 68 28 7a 29 3b 0a 20 20 20 20 20 20 69 66  gth(z);.      if
4e40: 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( n>0 ){.       
4e50: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 54   *pTokenType = T
4e60: 4f 4b 45 4e 5f 49 4e 44 45 4e 54 3b 0a 20 20 20  OKEN_INDENT;.   
4e70: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20       return n;. 
4e80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4e90: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5b 27 20 26   if( z[0]=='[' &
4ea0: 26 20 28 6e 20 3d 20 6c 69 6e 6b 4c 65 6e 67 74  & (n = linkLengt
4eb0: 68 28 7a 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  h(z))>0 ){.     
4ec0: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 54   *pTokenType = T
4ed0: 4f 4b 45 4e 5f 4c 49 4e 4b 3b 0a 20 20 20 20 20  OKEN_LINK;.     
4ee0: 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d   return n;.    }
4ef0: 0a 20 20 7d 0a 20 20 2a 70 54 6f 6b 65 6e 54 79  .  }.  *pTokenTy
4f00: 70 65 20 3d 20 54 4f 4b 45 4e 5f 54 45 58 54 3b  pe = TOKEN_TEXT;
4f10: 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 74 65  .  return 1 + te
4f20: 78 74 4c 65 6e 67 74 68 28 7a 2b 31 2c 20 70 2d  xtLength(z+1, p-
4f30: 3e 73 74 61 74 65 20 26 20 41 4c 4c 4f 57 5f 57  >state & ALLOW_W
4f40: 49 4b 49 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  IKI);.}../*.** A
4f50: 20 73 69 6e 67 6c 65 20 6d 61 72 6b 75 70 20 69   single markup i
4f60: 73 20 70 61 72 73 65 64 20 69 6e 74 6f 20 61 6e  s parsed into an
4f70: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4f80: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
4f90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
4fa0: 64 65 66 20 73 74 72 75 63 74 20 50 61 72 73 65  def struct Parse
4fb0: 64 4d 61 72 6b 75 70 20 50 61 72 73 65 64 4d 61  dMarkup ParsedMa
4fc0: 72 6b 75 70 3b 0a 73 74 72 75 63 74 20 50 61 72  rkup;.struct Par
4fd0: 73 65 64 4d 61 72 6b 75 70 20 7b 0a 20 20 75 6e  sedMarkup {.  un
4fe0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 6e 64 54  signed char endT
4ff0: 61 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ag;   /* True if
5000: 20 3c 2f 2e 2e 2e 3e 20 69 6e 73 74 65 61 64 20   </...> instead 
5010: 6f 66 20 3c 2e 2e 2e 3e 20 2a 2f 0a 20 20 75 6e  of <...> */.  un
5020: 73 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f 64  signed char iCod
5030: 65 3b 20 20 20 20 2f 2a 20 4d 41 52 4b 55 50 5f  e;    /* MARKUP_
5040: 2a 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  * */.  unsigned 
5050: 63 68 61 72 20 6e 41 74 74 72 3b 20 20 20 20 2f  char nAttr;    /
5060: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 74 74 72  * Number of attr
5070: 69 62 75 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69  ibutes */.  unsi
5080: 67 6e 65 64 20 73 68 6f 72 74 20 69 54 79 70 65  gned short iType
5090: 3b 20 20 20 2f 2a 20 4d 55 54 59 50 45 5f 2a 20  ;   /* MUTYPE_* 
50a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 7b 0a 20 20  */.  struct {.  
50b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
50c0: 69 41 43 6f 64 65 3b 20 20 20 20 2f 2a 20 41 54  iACode;    /* AT
50d0: 54 52 5f 2a 20 2a 2f 0a 20 20 20 20 63 68 61 72  TR_* */.    char
50e0: 20 2a 7a 56 61 6c 75 65 3b 20 20 20 20 20 20 20   *zValue;       
50f0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
5100: 20 74 6f 20 74 68 69 73 20 61 74 74 72 69 62 75   to this attribu
5110: 74 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  te.  Might be NU
5120: 4c 4c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  LL */.    char c
5130: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
5140: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 61     /* Original a
5150: 72 67 75 6d 65 6e 74 20 74 65 72 6d 69 6e 61 74  rgument terminat
5160: 69 6f 6e 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ion character */
5170: 0a 20 20 7d 20 61 41 74 74 72 5b 31 30 5d 3b 0a  .  } aAttr[10];.
5180: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 7a 5b 5d 20 69 73  };../*.** z[] is
5190: 20 61 6e 20 48 54 4d 4c 20 6d 61 72 6b 75 70 20   an HTML markup 
51a0: 65 6c 65 6d 65 6e 74 20 2d 20 73 6f 6d 65 74 68  element - someth
51b0: 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73 20  ing that begins 
51c0: 77 69 74 68 20 27 3c 27 2e 0a 2a 2a 20 50 61 72  with '<'..** Par
51d0: 73 65 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20  se this element 
51e0: 69 6e 74 6f 20 74 68 65 20 70 20 73 74 72 75 63  into the p struc
51f0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
5200: 63 6f 6e 74 65 6e 74 20 6f 66 20 7a 5b 5d 20 6d  content of z[] m
5210: 69 67 68 74 20 62 65 20 6d 6f 64 69 66 69 65 64  ight be modified
5220: 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 20 63   by converting c
5230: 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 74 6f 20  haracters.** to 
5240: 6c 6f 77 65 72 63 61 73 65 20 61 6e 64 20 62 79  lowercase and by
5250: 20 69 6e 73 65 72 74 69 6e 67 20 73 6f 6d 65 20   inserting some 
5260: 22 5c 30 30 30 22 20 63 68 61 72 61 63 74 65 72  "\000" character
5270: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
5280: 64 20 70 61 72 73 65 4d 61 72 6b 75 70 28 50 61  d parseMarkup(Pa
5290: 72 73 65 64 4d 61 72 6b 75 70 20 2a 70 2c 20 63  rsedMarkup *p, c
52a0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
52b0: 2c 20 6a 2c 20 63 3b 0a 20 20 69 6e 74 20 69 41  , j, c;.  int iA
52c0: 43 6f 64 65 3b 0a 20 20 63 68 61 72 20 2a 7a 56  Code;.  char *zV
52d0: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 73 65 65 6e  alue;.  int seen
52e0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54 61   = 0;.  char zTa
52f0: 67 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 7a  g[100];..  if( z
5300: 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [1]=='/' ){.    
5310: 70 2d 3e 65 6e 64 54 61 67 20 3d 20 31 3b 0a 20  p->endTag = 1;. 
5320: 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 65 6c 73     i = 2;.  }els
5330: 65 7b 0a 20 20 20 20 70 2d 3e 65 6e 64 54 61 67  e{.    p->endTag
5340: 20 3d 20 30 3b 0a 20 20 20 20 69 20 3d 20 31 3b   = 0;.    i = 1;
5350: 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  .  }.  j = 0;.  
5360: 77 68 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a  while( isalnum(z
5370: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 69 66 28 20  [i]) ){.    if( 
5380: 6a 3c 73 69 7a 65 6f 66 28 7a 54 61 67 29 2d 31  j<sizeof(zTag)-1
5390: 20 29 20 7a 54 61 67 5b 6a 2b 2b 5d 20 3d 20 74   ) zTag[j++] = t
53a0: 6f 6c 6f 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20  olower(z[i]);.  
53b0: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 54 61    i++;.  }.  zTa
53c0: 67 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  g[j] = 0;.  p->i
53d0: 43 6f 64 65 20 3d 20 66 69 6e 64 54 61 67 28 7a  Code = findTag(z
53e0: 54 61 67 29 3b 0a 20 20 70 2d 3e 69 54 79 70 65  Tag);.  p->iType
53f0: 20 3d 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 69 43   = aMarkup[p->iC
5400: 6f 64 65 5d 2e 69 54 79 70 65 3b 0a 20 20 70 2d  ode].iType;.  p-
5410: 3e 6e 41 74 74 72 20 3d 20 30 3b 0a 20 20 77 68  >nAttr = 0;.  wh
5420: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 5b 69  ile( isspace(z[i
5430: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 77  ]) ){ i++; }.  w
5440: 68 69 6c 65 28 20 70 2d 3e 6e 41 74 74 72 3c 38  hile( p->nAttr<8
5450: 20 26 26 20 69 73 61 6c 70 68 61 28 7a 5b 69 5d   && isalpha(z[i]
5460: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 74 74  ) ){.    int att
5470: 72 4f 6b 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  rOk;    /* True 
5480: 74 6f 20 70 72 65 73 65 72 76 65 72 20 61 74 74  to preserver att
5490: 72 69 62 75 74 65 2e 20 20 46 61 6c 73 65 20 74  ribute.  False t
54a0: 6f 20 69 67 6e 6f 72 65 20 69 74 20 2a 2f 0a 20  o ignore it */. 
54b0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68     j = 0;.    wh
54c0: 69 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a 5b 69  ile( isalnum(z[i
54d0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ]) ){.      if( 
54e0: 6a 3c 73 69 7a 65 6f 66 28 7a 54 61 67 29 2d 31  j<sizeof(zTag)-1
54f0: 20 29 20 7a 54 61 67 5b 6a 2b 2b 5d 20 3d 20 74   ) zTag[j++] = t
5500: 6f 6c 6f 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20  olower(z[i]);.  
5510: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
5520: 20 20 20 7a 54 61 67 5b 6a 5d 20 3d 20 30 3b 0a     zTag[j] = 0;.
5530: 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e      p->aAttr[p->
5540: 6e 41 74 74 72 5d 2e 69 41 43 6f 64 65 20 3d 20  nAttr].iACode = 
5550: 69 41 43 6f 64 65 20 3d 20 66 69 6e 64 41 74 74  iACode = findAtt
5560: 72 28 7a 54 61 67 29 3b 0a 20 20 20 20 61 74 74  r(zTag);.    att
5570: 72 4f 6b 20 3d 20 69 41 43 6f 64 65 21 3d 30 20  rOk = iACode!=0 
5580: 26 26 20 28 73 65 65 6e 20 26 20 61 41 74 74 72  && (seen & aAttr
5590: 69 62 75 74 65 5b 69 41 43 6f 64 65 5d 2e 69 4d  ibute[iACode].iM
55a0: 61 73 6b 29 3d 3d 30 3b 0a 20 20 20 20 77 68 69  ask)==0;.    whi
55b0: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d  le( isspace(z[i]
55c0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
55d0: 69 66 28 20 7a 5b 69 5d 21 3d 27 3d 27 20 29 7b  if( z[i]!='=' ){
55e0: 0a 20 20 20 20 20 20 70 2d 3e 61 41 74 74 72 5b  .      p->aAttr[
55f0: 70 2d 3e 6e 41 74 74 72 5d 2e 7a 56 61 6c 75 65  p->nAttr].zValue
5600: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
5610: 41 74 74 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 63  Attr[p->nAttr].c
5620: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
5630: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
5640: 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
5650: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
5660: 65 28 7a 5b 69 5d 29 20 29 7b 20 7a 2b 2b 3b 20  e(z[i]) ){ z++; 
5670: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d  }.      if( z[i]
5680: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
5690: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 56   i++;.        zV
56a0: 61 6c 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20  alue = &z[i];.  
56b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69        while( z[i
56c0: 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 22 27 20 29  ] && z[i]!='"' )
56d0: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d  { i++; }.      }
56e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 56  else{.        zV
56f0: 61 6c 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20  alue = &z[i];.  
5700: 20 20 20 20 20 20 77 68 69 6c 65 28 20 21 69 73        while( !is
5710: 73 70 61 63 65 28 7a 5b 69 5d 29 20 26 26 20 7a  space(z[i]) && z
5720: 5b 69 5d 21 3d 27 3e 27 20 29 7b 20 7a 2b 2b 3b  [i]!='>' ){ z++;
5730: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5740: 20 69 66 28 20 61 74 74 72 4f 6b 20 29 7b 0a 20   if( attrOk ){. 
5750: 20 20 20 20 20 20 20 70 2d 3e 61 41 74 74 72 5b         p->aAttr[
5760: 70 2d 3e 6e 41 74 74 72 5d 2e 7a 56 61 6c 75 65  p->nAttr].zValue
5770: 20 3d 20 7a 56 61 6c 75 65 3b 0a 20 20 20 20 20   = zValue;.     
5780: 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e     p->aAttr[p->n
5790: 41 74 74 72 5d 2e 63 54 65 72 6d 20 3d 20 63 20  Attr].cTerm = c 
57a0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  = z[i];.        
57b0: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[i] = 0;.      
57c0: 7d 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  }.      i++;.   
57d0: 20 7d 0a 20 20 20 20 69 66 28 20 61 74 74 72 4f   }.    if( attrO
57e0: 6b 20 29 7b 0a 20 20 20 20 20 20 73 65 65 6e 20  k ){.      seen 
57f0: 7c 3d 20 61 41 74 74 72 69 62 75 74 65 5b 69 41  |= aAttribute[iA
5800: 43 6f 64 65 5d 2e 69 4d 61 73 6b 3b 0a 20 20 20  Code].iMask;.   
5810: 20 20 20 70 2d 3e 6e 41 74 74 72 2b 2b 3b 0a 20     p->nAttr++;. 
5820: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
5830: 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  isspace(z[i]) ){
5840: 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   i++; }.    if( 
5850: 7a 5b 69 5d 3d 3d 27 3e 27 20 7c 7c 20 28 7a 5b  z[i]=='>' || (z[
5860: 69 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b 69 2b 31  i]=='/' && z[i+1
5870: 5d 3d 3d 27 3e 27 29 20 29 20 62 72 65 61 6b 3b  ]=='>') ) break;
5880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
5890: 6e 64 65 72 20 6d 61 72 6b 75 70 20 6f 6e 20 74  nder markup on t
58a0: 68 65 20 67 69 76 65 6e 20 62 6c 6f 62 2e 0a 2a  he given blob..*
58b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
58c0: 6e 64 65 72 4d 61 72 6b 75 70 28 42 6c 6f 62 20  nderMarkup(Blob 
58d0: 2a 70 4f 75 74 2c 20 50 61 72 73 65 64 4d 61 72  *pOut, ParsedMar
58e0: 6b 75 70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  kup *p){.  int i
58f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 6e 64 54 61  ;.  if( p->endTa
5900: 67 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  g ){.    blob_ap
5910: 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 3c 2f 25  pendf(pOut, "</%
5920: 73 3e 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e  s>", aMarkup[p->
5930: 69 43 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iCode].zName);. 
5940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62   }else{.    blob
5950: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22  _appendf(pOut, "
5960: 3c 25 73 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d  <%s", aMarkup[p-
5970: 3e 69 43 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iCode].zName);.
5980: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5990: 2d 3e 6e 41 74 74 72 3b 20 69 2b 2b 29 7b 0a 20  ->nAttr; i++){. 
59a0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
59b0: 66 28 70 4f 75 74 2c 20 22 20 25 73 22 2c 20 61  f(pOut, " %s", a
59c0: 41 74 74 72 69 62 75 74 65 5b 70 2d 3e 61 41 74  Attribute[p->aAt
59d0: 74 72 5b 69 5d 2e 69 41 43 6f 64 65 5d 2e 7a 4e  tr[i].iACode].zN
59e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
59f0: 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 7a 56 61 6c  p->aAttr[i].zVal
5a00: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  ue ){.        bl
5a10: 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  ob_appendf(pOut,
5a20: 20 22 3d 5c 22 25 73 5c 22 22 2c 20 70 2d 3e 61   "=\"%s\"", p->a
5a30: 41 74 74 72 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b  Attr[i].zValue);
5a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5a50: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
5a60: 4f 75 74 2c 20 22 3e 22 2c 20 31 29 3b 0a 20 20  Out, ">", 1);.  
5a70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
5a80: 74 68 65 20 6d 61 72 6b 75 70 20 77 61 73 20 70  the markup was p
5a90: 61 72 73 65 64 2c 20 73 6f 6d 65 20 22 5c 30 30  arsed, some "\00
5aa0: 30 22 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  0" may have been
5ab0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 20 54 68   inserted..** Th
5ac0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
5ad0: 72 65 73 20 74 6f 20 74 68 6f 73 65 20 22 5c 30  res to those "\0
5ae0: 30 30 22 20 76 61 6c 75 65 73 20 62 61 63 6b 20  00" values back 
5af0: 74 6f 20 74 68 65 69 72 0a 2a 2a 20 6f 72 69 67  to their.** orig
5b00: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f  inal content..*/
5b10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 70  .static void unp
5b20: 61 72 73 65 4d 61 72 6b 75 70 28 50 61 72 73 65  arseMarkup(Parse
5b30: 64 4d 61 72 6b 75 70 20 2a 70 29 7b 0a 20 20 69  dMarkup *p){.  i
5b40: 6e 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69  nt i, n;.  for(i
5b50: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 74 74 72 3b 20  =0; i<p->nAttr; 
5b60: 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
5b70: 7a 20 3d 20 70 2d 3e 61 41 74 74 72 5b 69 5d 2e  z = p->aAttr[i].
5b80: 7a 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20  zValue;.    if( 
5b90: 7a 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  z==0 ) continue;
5ba0: 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  .    n = strlen(
5bb0: 7a 29 3b 0a 20 20 20 20 7a 5b 6e 5d 20 3d 20 70  z);.    z[n] = p
5bc0: 2d 3e 61 41 74 74 72 5b 69 5d 2e 63 54 65 72 6d  ->aAttr[i].cTerm
5bd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
5be0: 65 74 75 72 6e 20 74 68 65 20 49 44 20 61 74 74  eturn the ID att
5bf0: 72 69 62 75 74 65 20 66 6f 72 20 6d 61 72 6b 75  ribute for marku
5c00: 70 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  p.  Return NULL 
5c10: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a  if there is no.*
5c20: 2a 20 49 44 20 61 74 74 72 69 62 75 74 65 2e 0a  * ID attribute..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5c40: 63 68 61 72 20 2a 6d 61 72 6b 75 70 49 64 28 50  char *markupId(P
5c50: 61 72 73 65 64 4d 61 72 6b 75 70 20 2a 70 29 7b  arsedMarkup *p){
5c60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5c70: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 74 74 72 3b  i=0; i<p->nAttr;
5c80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
5c90: 2d 3e 61 41 74 74 72 5b 69 5d 2e 69 41 43 6f 64  ->aAttr[i].iACod
5ca0: 65 3d 3d 41 54 54 52 5f 49 44 20 29 7b 0a 20 20  e==ATTR_ID ){.  
5cb0: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 61 41      return p->aA
5cc0: 74 74 72 5b 69 5d 2e 7a 56 61 6c 75 65 3b 0a 20  ttr[i].zValue;. 
5cd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5ce0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  n 0;.}../*.** Po
5cf0: 70 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  p a single eleme
5d00: 6e 74 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74  nt off of the st
5d10: 61 63 6b 2e 20 20 41 73 20 74 68 65 20 65 6c 65  ack.  As the ele
5d20: 6d 65 6e 74 20 69 73 20 70 6f 70 70 65 64 2c 0a  ment is popped,.
5d30: 2a 2a 20 6f 75 74 70 75 74 20 69 74 73 20 65 6e  ** output its en
5d40: 64 20 74 61 67 20 69 66 20 69 74 20 69 73 20 6e  d tag if it is n
5d50: 6f 74 20 61 20 3c 2f 64 69 76 3e 20 74 61 67 2e  ot a </div> tag.
5d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5d70: 70 6f 70 53 74 61 63 6b 28 52 65 6e 64 65 72 65  popStack(Rendere
5d80: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
5d90: 6e 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e  nStack ){.    in
5da0: 74 20 69 43 6f 64 65 3b 0a 20 20 20 20 70 2d 3e  t iCode;.    p->
5db0: 6e 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 69 43  nStack--;.    iC
5dc0: 6f 64 65 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b  ode = p->aStack[
5dd0: 70 2d 3e 6e 53 74 61 63 6b 5d 2e 69 43 6f 64 65  p->nStack].iCode
5de0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 64 65 21  ;.    if( iCode!
5df0: 3d 4d 41 52 4b 55 50 5f 44 49 56 20 29 7b 0a 20  =MARKUP_DIV ){. 
5e00: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
5e10: 66 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 2f 25 73  f(p->pOut, "</%s
5e20: 3e 22 2c 20 61 4d 61 72 6b 75 70 5b 69 43 6f 64  >", aMarkup[iCod
5e30: 65 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e].zName);.    }
5e40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  .  }.}../*.** Pu
5e50: 73 68 20 61 20 6e 65 77 20 6d 61 72 6b 75 70 20  sh a new markup 
5e60: 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73  value onto the s
5e70: 74 61 63 6b 2e 20 20 45 6e 6c 61 72 67 65 20 74  tack.  Enlarge t
5e80: 68 65 20 73 74 61 63 6b 0a 2a 2a 20 69 66 20 6e  he stack.** if n
5e90: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
5ea0: 74 69 63 20 76 6f 69 64 20 70 75 73 68 53 74 61  tic void pushSta
5eb0: 63 6b 57 69 74 68 49 64 28 52 65 6e 64 65 72 65  ckWithId(Rendere
5ec0: 72 20 2a 70 2c 20 69 6e 74 20 65 6c 65 6d 2c 20  r *p, int elem, 
5ed0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 2c  const char *zId,
5ee0: 20 69 6e 74 20 77 29 7b 0a 20 20 69 66 28 20 70   int w){.  if( p
5ef0: 2d 3e 6e 53 74 61 63 6b 3e 3d 70 2d 3e 6e 41 6c  ->nStack>=p->nAl
5f00: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41  loc ){.    p->nA
5f10: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  lloc = p->nAlloc
5f20: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d  *2 + 100;.    p-
5f30: 3e 61 53 74 61 63 6b 20 3d 20 72 65 61 6c 6c 6f  >aStack = reallo
5f40: 63 28 70 2d 3e 61 53 74 61 63 6b 2c 20 70 2d 3e  c(p->aStack, p->
5f50: 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d  nAlloc*sizeof(p-
5f60: 3e 61 53 74 61 63 6b 5b 30 5d 29 29 3b 0a 20 20  >aStack[0]));.  
5f70: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d    if( p->aStack=
5f80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  =0 ){.      foss
5f90: 69 6c 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66  il_panic("out of
5fa0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 7d   memory");.    }
5fb0: 0a 20 20 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b  .  }.  p->aStack
5fc0: 5b 70 2d 3e 6e 53 74 61 63 6b 5d 2e 69 43 6f 64  [p->nStack].iCod
5fd0: 65 20 3d 20 65 6c 65 6d 3b 0a 20 20 70 2d 3e 61  e = elem;.  p->a
5fe0: 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d  Stack[p->nStack]
5ff0: 2e 7a 49 64 20 3d 20 7a 49 64 3b 0a 20 20 70 2d  .zId = zId;.  p-
6000: 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63  >aStack[p->nStac
6010: 6b 5d 2e 61 6c 6c 6f 77 57 69 6b 69 20 3d 20 77  k].allowWiki = w
6020: 3b 0a 20 20 70 2d 3e 6e 53 74 61 63 6b 2b 2b 3b  ;.  p->nStack++;
6030: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
6040: 75 73 68 53 74 61 63 6b 28 52 65 6e 64 65 72 65  ushStack(Rendere
6050: 72 20 2a 70 2c 20 69 6e 74 20 65 6c 65 6d 29 7b  r *p, int elem){
6060: 0a 20 20 70 75 73 68 53 74 61 63 6b 57 69 74 68  .  pushStackWith
6070: 49 64 28 70 2c 20 65 6c 65 6d 2c 20 30 2c 20 30  Id(p, elem, 0, 0
6080: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20  );.}../*.** Pop 
6090: 74 68 65 20 73 74 61 63 6b 20 75 6e 74 69 6c 20  the stack until 
60a0: 74 68 65 20 74 6f 70 2d 6d 6f 73 74 20 69 54 61  the top-most iTa
60b0: 67 20 65 6c 65 6d 65 6e 74 20 69 73 20 72 65 6d  g element is rem
60c0: 6f 76 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 72  oved..** If ther
60d0: 65 20 69 73 20 6e 6f 20 69 54 61 67 20 65 6c 65  e is no iTag ele
60e0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 74 61 63  ment on the stac
60f0: 6b 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  k, this routine.
6100: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ** is a no-op..*
6110: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f  /.static void po
6120: 70 53 74 61 63 6b 54 6f 54 61 67 28 52 65 6e 64  pStackToTag(Rend
6130: 65 72 65 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  erer *p, int iTa
6140: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  g){.  int i;.  f
6150: 6f 72 28 69 3d 70 2d 3e 6e 53 74 61 63 6b 2d 31  or(i=p->nStack-1
6160: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
6170: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b    if( p->aStack[
6180: 69 5d 2e 69 43 6f 64 65 21 3d 69 54 61 67 20 29  i].iCode!=iTag )
6190: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
61a0: 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e  f( p->aStack[i].
61b0: 7a 49 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  zId ) continue;.
61c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
61d0: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
61e0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e  n;.  while( p->n
61f0: 53 74 61 63 6b 3e 69 20 29 7b 0a 20 20 20 20 70  Stack>i ){.    p
6200: 6f 70 53 74 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  opStack(p);.  }.
6210: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
6220: 20 74 6f 20 66 69 6e 64 20 61 20 66 69 6e 64 20   to find a find 
6230: 61 20 74 61 67 20 6f 66 20 74 79 70 65 20 69 54  a tag of type iT
6240: 61 67 20 77 69 74 68 20 69 64 20 7a 49 64 2e 20  ag with id zId. 
6250: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
6260: 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   not found.  If 
6270: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 69 74  found, return it
6280: 73 20 73 74 61 63 6b 20 6c 65 76 65 6c 2e 0a 2a  s stack level..*
6290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
62a0: 64 54 61 67 57 69 74 68 49 64 28 52 65 6e 64 65  dTagWithId(Rende
62b0: 72 65 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 67  rer *p, int iTag
62c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
62d0: 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  d){.  int i;.  a
62e0: 73 73 65 72 74 28 20 7a 49 64 21 3d 30 20 29 3b  ssert( zId!=0 );
62f0: 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 74 61  .  for(i=p->nSta
6300: 63 6b 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ck-1; i>=0; i--)
6310: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 53 74  {.    if( p->aSt
6320: 61 63 6b 5b 69 5d 2e 69 43 6f 64 65 21 3d 69 54  ack[i].iCode!=iT
6330: 61 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ag ) continue;. 
6340: 20 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b     if( p->aStack
6350: 5b 69 5d 2e 7a 49 64 3d 3d 30 20 29 20 63 6f 6e  [i].zId==0 ) con
6360: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
6370: 74 72 63 6d 70 28 7a 49 64 2c 20 70 2d 3e 61 53  trcmp(zId, p->aS
6380: 74 61 63 6b 5b 69 5d 2e 7a 49 64 29 21 3d 30 20  tack[i].zId)!=0 
6390: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
63a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
63b0: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
63c0: 50 6f 70 20 74 68 65 20 73 74 61 63 6b 20 75 6e  Pop the stack un
63d0: 74 69 6c 20 74 68 65 20 74 6f 70 2d 6d 6f 73 74  til the top-most
63e0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
63f0: 73 74 61 63 6b 0a 2a 2a 20 69 73 20 61 6e 20 65  stack.** is an e
6400: 6c 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 74 63  lement that matc
6410: 68 65 73 20 74 68 65 20 74 79 70 65 20 69 6e 20  hes the type in 
6420: 69 4d 61 73 6b 2e 20 20 52 65 74 75 72 6e 0a 2a  iMask.  Return.*
6430: 2a 20 63 6f 64 65 20 6f 66 20 74 68 65 20 6d 61  * code of the ma
6440: 72 6b 75 70 20 65 6c 65 6d 65 6e 74 20 74 68 61  rkup element tha
6450: 74 20 69 73 20 6f 6e 20 6c 65 66 74 20 6f 6e 20  t is on left on 
6460: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
6470: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 61 63  ..** If the stac
6480: 6b 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  k does not have 
6490: 61 6e 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68  an element.** th
64a0: 61 74 20 6d 61 74 63 68 65 73 20 69 4d 61 73 6b  at matches iMask
64b0: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
64c0: 20 73 74 61 63 6b 20 75 6e 63 68 61 6e 67 65 64   stack unchanged
64d0: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 66   and.** return f
64e0: 61 6c 73 65 20 28 4d 41 52 4b 55 50 5f 49 4e 56  alse (MARKUP_INV
64f0: 41 4c 49 44 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ALID)..*/.static
6500: 20 69 6e 74 20 62 61 63 6b 75 70 54 6f 54 79 70   int backupToTyp
6510: 65 28 52 65 6e 64 65 72 65 72 20 2a 70 2c 20 69  e(Renderer *p, i
6520: 6e 74 20 69 4d 61 73 6b 29 7b 0a 20 20 69 6e 74  nt iMask){.  int
6530: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e   i;.  for(i=p->n
6540: 53 74 61 63 6b 2d 31 3b 20 69 3e 3d 30 3b 20 69  Stack-1; i>=0; i
6550: 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 4d 61  --){.    if( aMa
6560: 72 6b 75 70 5b 70 2d 3e 61 53 74 61 63 6b 5b 69  rkup[p->aStack[i
6570: 5d 2e 69 43 6f 64 65 5d 2e 69 54 79 70 65 20 26  ].iCode].iType &
6580: 20 69 4d 61 73 6b 20 29 20 62 72 65 61 6b 3b 0a   iMask ) break;.
6590: 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
65a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 2b 2b 3b  return 0;.  i++;
65b0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e 53 74  .  while( p->nSt
65c0: 61 63 6b 3e 69 20 29 7b 0a 20 20 20 20 70 6f 70  ack>i ){.    pop
65d0: 53 74 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20  Stack(p);.  }.  
65e0: 72 65 74 75 72 6e 20 70 2d 3e 61 53 74 61 63 6b  return p->aStack
65f0: 5b 69 2d 31 5d 2e 69 43 6f 64 65 3b 0a 7d 0a 0a  [i-1].iCode;.}..
6600: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 6e 65  /*.** Begin a ne
6610: 77 20 70 61 72 61 67 72 61 70 68 20 69 66 20 74  w paragraph if t
6620: 68 61 74 20 73 6f 6d 65 74 68 69 6e 67 20 74 68  hat something th
6630: 61 74 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  at is needed..*/
6640: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61  .static void sta
6650: 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  rtAutoParagraph(
6660: 52 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20 20  Renderer *p){.  
6670: 69 66 28 20 70 2d 3e 77 61 6e 74 41 75 74 6f 50  if( p->wantAutoP
6680: 61 72 61 67 72 61 70 68 3d 3d 30 20 29 20 72 65  aragraph==0 ) re
6690: 74 75 72 6e 3b 0a 20 20 62 6c 6f 62 5f 61 70 70  turn;.  blob_app
66a0: 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22 3c  endf(p->pOut, "<
66b0: 70 3e 22 2c 20 2d 31 29 3b 0a 20 20 70 75 73 68  p>", -1);.  push
66c0: 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f  Stack(p, MARKUP_
66d0: 50 29 3b 0a 20 20 70 2d 3e 77 61 6e 74 41 75 74  P);.  p->wantAut
66e0: 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b 0a  oParagraph = 0;.
66f0: 20 20 70 2d 3e 69 6e 41 75 74 6f 50 61 72 61 67    p->inAutoParag
6700: 72 61 70 68 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  raph = 1;.}../*.
6710: 2a 2a 20 45 6e 64 20 61 20 70 61 72 61 67 72 61  ** End a paragra
6720: 70 68 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ph if we are in 
6730: 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  one..*/.static v
6740: 6f 69 64 20 65 6e 64 41 75 74 6f 50 61 72 61 67  oid endAutoParag
6750: 72 61 70 68 28 52 65 6e 64 65 72 65 72 20 2a 70  raph(Renderer *p
6760: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 41 75  ){.  if( p->inAu
6770: 74 6f 50 61 72 61 67 72 61 70 68 20 29 7b 0a 20  toParagraph ){. 
6780: 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67     popStackToTag
6790: 28 70 2c 20 4d 41 52 4b 55 50 5f 50 29 3b 0a 20  (p, MARKUP_P);. 
67a0: 20 20 20 70 2d 3e 69 6e 41 75 74 6f 50 61 72 61     p->inAutoPara
67b0: 67 72 61 70 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d  graph = 0;.  }.}
67c0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
67d0: 6e 70 75 74 20 73 74 72 69 6e 67 20 63 6f 72 72  nput string corr
67e0: 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 65 78  esponds to an ex
67f0: 69 73 74 69 6e 67 20 62 61 73 65 6c 69 6e 65 2c  isting baseline,
6800: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65 2e  .** return true.
6810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
6820: 73 5f 76 61 6c 69 64 5f 75 75 69 64 28 63 6f 6e  s_valid_uuid(con
6830: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
6840: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  nt n = strlen(z)
6850: 3b 0a 20 20 69 66 28 20 6e 3c 34 20 7c 7c 20 6e  ;.  if( n<4 || n
6860: 3e 55 55 49 44 5f 53 49 5a 45 20 29 20 72 65 74  >UUID_SIZE ) ret
6870: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 76 61  urn 0;.  if( !va
6880: 6c 69 64 61 74 65 31 36 28 7a 2c 20 6e 29 20 29  lidate16(z, n) )
6890: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
68a0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
68b0: 7a 54 61 72 67 65 74 20 69 73 20 67 75 61 72 61  zTarget is guara
68c0: 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 55 55  nteed to be a UU
68d0: 49 44 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ID.  It might be
68e0: 20 74 68 65 20 55 55 49 44 20 6f 66 20 61 20 74   the UUID of a t
68f0: 69 63 6b 65 74 2e 0a 2a 2a 20 49 66 20 69 74 20  icket..** If it 
6900: 69 73 2c 20 73 74 6f 72 65 20 69 6e 20 2a 70 43  is, store in *pC
6910: 6c 6f 73 65 64 20 61 20 74 72 75 65 20 6f 72 20  losed a true or 
6920: 66 61 6c 73 65 20 64 65 70 65 6e 64 69 6e 67 20  false depending 
6930: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
6940: 74 0a 2a 2a 20 74 68 65 20 74 69 63 6b 65 74 20  t.** the ticket 
6950: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72 65  is closed and re
6960: 74 75 72 6e 20 74 72 75 65 2e 20 49 66 20 7a 54  turn true. If zT
6970: 61 72 67 65 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  arget.** is not 
6980: 74 68 65 20 55 55 49 44 20 6f 66 20 61 20 74 69  the UUID of a ti
6990: 63 6b 65 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  cket, return fal
69a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
69b0: 74 20 69 73 5f 74 69 63 6b 65 74 28 0a 20 20 63  t is_ticket(.  c
69c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
69d0: 65 74 2c 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  et,    /* Ticket
69e0: 20 55 55 49 44 20 2a 2f 0a 20 20 69 6e 74 20 2a   UUID */.  int *
69f0: 70 43 6c 6f 73 65 64 20 20 20 20 20 20 20 20 20  pClosed         
6a00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
6a10: 65 20 74 69 63 6b 65 74 20 69 73 20 63 6c 6f 73  e ticket is clos
6a20: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  ed */.){.  stati
6a30: 63 20 53 74 6d 74 20 71 3b 0a 20 20 73 74 61 74  c Stmt q;.  stat
6a40: 69 63 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b  ic int once = 1;
6a50: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
6a60: 72 63 3b 0a 20 20 63 68 61 72 20 7a 4c 6f 77 65  rc;.  char zLowe
6a70: 72 5b 55 55 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a  r[UUID_SIZE+1];.
6a80: 20 20 63 68 61 72 20 7a 55 70 70 65 72 5b 55 55    char zUpper[UU
6a90: 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20 6e 20  ID_SIZE+1];.  n 
6aa0: 3d 20 73 74 72 6c 65 6e 28 7a 54 61 72 67 65 74  = strlen(zTarget
6ab0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 4c 6f 77  );.  memcpy(zLow
6ac0: 65 72 2c 20 7a 54 61 72 67 65 74 2c 20 6e 2b 31  er, zTarget, n+1
6ad0: 29 3b 0a 20 20 63 61 6e 6f 6e 69 63 61 6c 31 36  );.  canonical16
6ae0: 28 7a 4c 6f 77 65 72 2c 20 6e 2b 31 29 3b 0a 20  (zLower, n+1);. 
6af0: 20 6d 65 6d 63 70 79 28 7a 55 70 70 65 72 2c 20   memcpy(zUpper, 
6b00: 7a 4c 6f 77 65 72 2c 20 6e 2b 31 29 3b 0a 20 20  zLower, n+1);.  
6b10: 7a 55 70 70 65 72 5b 6e 2d 31 5d 2b 2b 3b 0a 20  zUpper[n-1]++;. 
6b20: 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
6b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c   const char *zCl
6b40: 6f 73 65 64 45 78 70 72 20 3d 20 64 62 5f 67 65  osedExpr = db_ge
6b50: 74 28 22 74 69 63 6b 65 74 2d 63 6c 6f 73 65 64  t("ticket-closed
6b60: 2d 65 78 70 72 22 2c 20 22 73 74 61 74 75 73 3d  -expr", "status=
6b70: 27 43 6c 6f 73 65 64 27 22 29 3b 0a 20 20 20 20  'Closed'");.    
6b80: 64 62 5f 73 74 61 74 69 63 5f 70 72 65 70 61 72  db_static_prepar
6b90: 65 28 26 71 2c 0a 20 20 20 20 20 20 22 53 45 4c  e(&q,.      "SEL
6ba0: 45 43 54 20 25 73 20 46 52 4f 4d 20 74 69 63 6b  ECT %s FROM tick
6bb0: 65 74 20 22 0a 20 20 20 20 20 20 22 20 57 48 45  et ".      " WHE
6bc0: 52 45 20 74 6b 74 5f 75 75 69 64 3e 3d 3a 6c 77  RE tkt_uuid>=:lw
6bd0: 72 20 41 4e 44 20 74 6b 74 5f 75 75 69 64 3c 3a  r AND tkt_uuid<:
6be0: 75 70 72 22 2c 0a 20 20 20 20 20 20 7a 43 6c 6f  upr",.      zClo
6bf0: 73 65 64 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  sedExpr.    );. 
6c00: 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 7d     once = 0;.  }
6c10: 0a 20 20 64 62 5f 62 69 6e 64 5f 74 65 78 74 28  .  db_bind_text(
6c20: 26 71 2c 20 22 3a 6c 77 72 22 2c 20 7a 4c 6f 77  &q, ":lwr", zLow
6c30: 65 72 29 3b 0a 20 20 64 62 5f 62 69 6e 64 5f 74  er);.  db_bind_t
6c40: 65 78 74 28 26 71 2c 20 22 3a 75 70 72 22 2c 20  ext(&q, ":upr", 
6c50: 7a 55 70 70 65 72 29 3b 0a 20 20 69 66 28 20 64  zUpper);.  if( d
6c60: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
6c70: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 63  TE_ROW ){.    rc
6c80: 20 3d 20 31 3b 0a 20 20 20 20 2a 70 43 6c 6f 73   = 1;.    *pClos
6c90: 65 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  ed = db_column_i
6ca0: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 7d 65 6c  nt(&q, 0);.  }el
6cb0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a  se{.    rc = 0;.
6cc0: 20 20 7d 0a 20 20 64 62 5f 72 65 73 65 74 28 26    }.  db_reset(&
6cd0: 71 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  q);.  return rc;
6ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
6cf0: 65 20 61 20 68 79 70 65 72 6c 69 6e 6b 2e 20 20  e a hyperlink.  
6d00: 54 68 65 20 7a 54 61 72 67 65 74 20 61 72 67 75  The zTarget argu
6d10: 6d 65 6e 74 20 69 73 20 74 68 65 20 63 6f 6e 74  ment is the cont
6d20: 65 6e 74 20 6f 66 20 74 68 65 20 5b 2e 2e 2e 5d  ent of the [...]
6d30: 0a 2a 2a 20 69 6e 20 74 68 65 20 77 69 6b 69 2e  .** in the wiki.
6d40: 20 20 41 70 70 65 6e 64 20 74 6f 20 74 68 65 20    Append to the 
6d50: 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 77 68  output string wh
6d60: 61 74 65 76 65 72 20 74 65 78 74 20 69 73 20 61  atever text is a
6d70: 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 66 6f 72  pproprate.** for
6d80: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 68 79 70   opening the hyp
6d90: 65 72 6c 69 6e 6b 2e 20 20 57 72 69 74 65 20 69  erlink.  Write i
6da0: 6e 74 6f 20 7a 43 6c 6f 73 65 5b 30 2e 2e 2e 6e  nto zClose[0...n
6db0: 43 6c 6f 73 65 2d 31 5d 20 74 65 78 74 20 74 68  Close-1] text th
6dc0: 61 74 20 77 69 6c 6c 0a 2a 2a 20 63 6c 6f 73 65  at will.** close
6dd0: 20 74 68 65 20 6d 61 72 6b 75 70 2e 0a 2a 2a 0a   the markup..**.
6de0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
6df0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
6e00: 6f 72 20 6d 69 67 68 74 20 6e 6f 74 20 61 70 70  or might not app
6e10: 65 6e 64 20 74 68 65 20 68 79 70 65 72 6c 69 6e  end the hyperlin
6e20: 6b 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  k, depending.** 
6e30: 6f 6e 20 63 75 72 72 65 6e 74 20 72 65 6e 64 65  on current rende
6e40: 72 69 6e 67 20 72 75 6c 65 73 3a 20 73 70 65 63  ring rules: spec
6e50: 69 66 69 63 61 6c 6c 79 20 64 6f 65 73 20 74 68  ifically does th
6e60: 65 20 63 75 72 72 65 6e 74 20 75 73 65 72 20 68  e current user h
6e70: 61 76 65 0a 2a 2a 20 22 48 69 73 74 6f 72 79 22  ave.** "History"
6e80: 20 70 65 72 6d 69 73 73 69 6f 6e 2e 0a 2a 2f 0a   permission..*/.
6e90: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e  static void open
6ea0: 48 79 70 65 72 6c 69 6e 6b 28 0a 20 20 52 65 6e  Hyperlink(.  Ren
6eb0: 64 65 72 65 72 20 2a 70 2c 20 20 20 20 20 20 20  derer *p,       
6ec0: 20 20 20 20 20 2f 2a 20 52 65 6e 64 65 72 69 6e       /* Renderin
6ed0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  g context */.  c
6ee0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
6ef0: 65 74 2c 20 20 20 20 2f 2a 20 48 79 70 65 72 6c  et,    /* Hyperl
6f00: 69 6e 6b 20 74 72 61 67 65 74 3b 20 74 65 78 74  ink traget; text
6f10: 20 77 69 74 68 69 6e 20 5b 2e 2e 2e 5d 20 2a 2f   within [...] */
6f20: 0a 20 20 63 68 61 72 20 2a 7a 43 6c 6f 73 65 2c  .  char *zClose,
6f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6f40: 69 74 65 20 68 79 70 65 72 6c 69 6e 6b 20 63 6c  ite hyperlink cl
6f50: 6f 73 69 6e 67 20 74 65 78 74 20 68 65 72 65 20  osing text here 
6f60: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6c 6f 73 65 20  */.  int nClose 
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f80: 42 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20  Bytes available 
6f90: 69 6e 20 7a 43 6c 6f 73 65 5b 5d 20 2a 2f 0a 29  in zClose[] */.)
6fa0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
6fb0: 7a 54 65 72 6d 20 3d 20 22 3c 2f 61 3e 22 3b 0a  zTerm = "</a>";.
6fc0: 20 20 61 73 73 65 72 74 28 20 6e 43 6c 6f 73 65    assert( nClose
6fd0: 3e 31 30 20 29 3b 0a 0a 20 20 69 66 28 20 73 74  >10 );..  if( st
6fe0: 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c 20 22  rncmp(zTarget, "
6ff0: 68 74 74 70 3a 22 2c 20 35 29 3d 3d 30 0a 20 20  http:", 5)==0.  
7000: 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54 61 72   || strncmp(zTar
7010: 67 65 74 2c 20 22 68 74 74 70 73 3a 22 2c 20 36  get, "https:", 6
7020: 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 6e 63  )==0.   || strnc
7030: 6d 70 28 7a 54 61 72 67 65 74 2c 20 22 66 74 70  mp(zTarget, "ftp
7040: 3a 22 2c 20 34 29 3d 3d 30 0a 20 20 20 7c 7c 20  :", 4)==0.   || 
7050: 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c  strncmp(zTarget,
7060: 20 22 6d 61 69 6c 74 6f 3a 22 2c 20 37 29 3d 3d   "mailto:", 7)==
7070: 30 0a 20 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  0.  ){.    blob_
7080: 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c  appendf(p->pOut,
7090: 20 22 3c 61 20 68 72 65 66 3d 5c 22 25 73 5c 22   "<a href=\"%s\"
70a0: 3e 22 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20  >", zTarget);.  
70b0: 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 72 67 65  }else if( zTarge
70c0: 74 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  t[0]=='/' ){.   
70d0: 20 69 66 28 20 31 20 2f 2a 20 67 2e 6f 6b 48 69   if( 1 /* g.okHi
70e0: 73 74 6f 72 79 20 2a 2f 20 29 7b 0a 20 20 20 20  story */ ){.    
70f0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
7100: 2d 3e 70 4f 75 74 2c 20 22 3c 61 20 68 72 65 66  ->pOut, "<a href
7110: 3d 5c 22 25 73 25 68 5c 22 3e 22 2c 20 67 2e 7a  =\"%s%h\">", g.z
7120: 42 61 73 65 55 52 4c 2c 20 7a 54 61 72 67 65 74  BaseURL, zTarget
7130: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7140: 20 20 20 20 7a 54 65 72 6d 20 3d 20 22 22 3b 0a      zTerm = "";.
7150: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
7160: 28 20 7a 54 61 72 67 65 74 5b 30 5d 3d 3d 27 2e  ( zTarget[0]=='.
7170: 27 20 29 7b 0a 20 20 20 20 69 66 28 20 31 20 2f  ' ){.    if( 1 /
7180: 2a 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 2a 2f  * g.okHistory */
7190: 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61   ){.      blob_a
71a0: 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20  ppendf(p->pOut, 
71b0: 22 3c 61 20 68 72 65 66 3d 5c 22 25 68 5c 22 3e  "<a href=\"%h\">
71c0: 22 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20  ", zTarget);.   
71d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
71e0: 65 72 6d 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  erm = "";.    }.
71f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 5f 76    }else if( is_v
7200: 61 6c 69 64 5f 75 75 69 64 28 7a 54 61 72 67 65  alid_uuid(zTarge
7210: 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  t) ){.    int is
7220: 43 6c 6f 73 65 64 3b 0a 20 20 20 20 69 66 28 20  Closed;.    if( 
7230: 69 73 5f 74 69 63 6b 65 74 28 7a 54 61 72 67 65  is_ticket(zTarge
7240: 74 2c 20 26 69 73 43 6c 6f 73 65 64 29 20 29 7b  t, &isClosed) ){
7250: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 61  .      /* Specia
7260: 6c 20 64 69 73 70 6c 61 79 20 70 72 6f 63 65 73  l display proces
7270: 73 69 6e 67 20 66 6f 72 20 74 69 63 6b 65 74 73  sing for tickets
7280: 2e 20 20 44 69 73 70 6c 61 79 20 74 68 65 20 68  .  Display the h
7290: 79 70 65 72 6c 69 6e 6b 0a 20 20 20 20 20 20 2a  yperlink.      *
72a0: 2a 20 61 73 20 63 72 6f 73 73 65 64 20 6f 75 74  * as crossed out
72b0: 20 69 66 20 74 68 65 20 74 69 63 6b 65 74 20 69   if the ticket i
72c0: 73 20 63 6c 6f 73 65 64 2e 0a 20 20 20 20 20 20  s closed..      
72d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 43  */.      if( isC
72e0: 6c 6f 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  losed ){.       
72f0: 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79   if( g.okHistory
7300: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c   ){.          bl
7310: 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f  ob_appendf(p->pO
7320: 75 74 2c 22 3c 61 20 68 72 65 66 3d 5c 22 25 73  ut,"<a href=\"%s
7330: 2f 69 6e 66 6f 2f 25 73 5c 22 3e 3c 73 3e 22 2c  /info/%s\"><s>",
7340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
7350: 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54 61 72 67  .zBaseURL, zTarg
7360: 65 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  et.          );.
7370: 20 20 20 20 20 20 20 20 20 20 7a 54 65 72 6d 20            zTerm 
7380: 3d 20 22 3c 2f 73 3e 3c 2f 61 3e 22 3b 0a 20 20  = "</s></a>";.  
7390: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
73a0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
73b0: 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 22 3c 73 3e  ndf(p->pOut,"<s>
73c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  ");.          zT
73d0: 65 72 6d 20 3d 20 22 3c 2f 73 3e 22 3b 0a 20 20  erm = "</s>";.  
73e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
73f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
7400: 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a   g.okHistory ){.
7410: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
7420: 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 22  ppendf(p->pOut,"
7430: 3c 61 20 68 72 65 66 3d 5c 22 25 73 2f 69 6e 66  <a href=\"%s/inf
7440: 6f 2f 25 73 5c 22 3e 22 2c 0a 20 20 20 20 20 20  o/%s\">",.      
7450: 20 20 20 20 20 20 20 20 67 2e 7a 42 61 73 65 55          g.zBaseU
7460: 52 4c 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20  RL, zTarget.    
7470: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
7480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7490: 20 20 7a 54 65 72 6d 20 3d 20 22 22 3b 0a 20 20    zTerm = "";.  
74a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 2e      }else if( g.
74c0: 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20  okHistory ){.   
74d0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
74e0: 70 2d 3e 70 4f 75 74 2c 20 22 3c 61 20 68 72 65  p->pOut, "<a hre
74f0: 66 3d 5c 22 25 73 2f 69 6e 66 6f 2f 25 73 5c 22  f=\"%s/info/%s\"
7500: 3e 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20  >", g.zBaseURL, 
7510: 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a  zTarget);.    }.
7520: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 69 6b 69    }else if( wiki
7530: 5f 6e 61 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f 72  _name_is_wellfor
7540: 6d 65 64 28 7a 54 61 72 67 65 74 29 20 29 7b 0a  med(zTarget) ){.
7550: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
7560: 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 61 20 68 72  (p->pOut, "<a hr
7570: 65 66 3d 5c 22 25 73 2f 77 69 6b 69 3f 6e 61 6d  ef=\"%s/wiki?nam
7580: 65 3d 25 54 5c 22 3e 22 2c 20 67 2e 7a 42 61 73  e=%T\">", g.zBas
7590: 65 55 52 4c 2c 20 7a 54 61 72 67 65 74 29 3b 0a  eURL, zTarget);.
75a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f    }else{.    blo
75b0: 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75  b_appendf(p->pOu
75c0: 74 2c 20 22 5b 62 61 64 2d 6c 69 6e 6b 3a 20 25  t, "[bad-link: %
75d0: 68 5d 22 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  h]", zTarget);. 
75e0: 20 20 20 7a 54 65 72 6d 20 3d 20 22 22 3b 0a 20     zTerm = "";. 
75f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 74 72   }.  assert( str
7600: 6c 65 6e 28 7a 54 65 72 6d 29 3c 6e 43 6c 6f 73  len(zTerm)<nClos
7610: 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 43  e );.  strcpy(zC
7620: 6c 6f 73 65 2c 20 7a 54 65 72 6d 29 3b 0a 7d 0a  lose, zTerm);.}.
7630: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
7640: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
7650: 20 70 61 72 73 65 64 20 6d 61 72 6b 75 70 20 69   parsed markup i
7660: 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  s the correct.**
7670: 20 3c 2f 76 65 72 62 61 74 69 6d 3e 20 74 61 67   </verbatim> tag
7680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7690: 65 6e 64 56 65 72 62 61 74 69 6d 28 52 65 6e 64  endVerbatim(Rend
76a0: 65 72 65 72 20 2a 70 2c 20 50 61 72 73 65 64 4d  erer *p, ParsedM
76b0: 61 72 6b 75 70 20 2a 70 4d 61 72 6b 75 70 29 7b  arkup *pMarkup){
76c0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73  .  char *z;.  as
76d0: 73 65 72 74 28 20 70 2d 3e 69 6e 56 65 72 62 61  sert( p->inVerba
76e0: 74 69 6d 20 29 3b 0a 20 20 69 66 28 20 70 4d 61  tim );.  if( pMa
76f0: 72 6b 75 70 2d 3e 69 43 6f 64 65 21 3d 4d 41 52  rkup->iCode!=MAR
7700: 4b 55 50 5f 56 45 52 42 41 54 49 4d 20 29 20 72  KUP_VERBATIM ) r
7710: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
7720: 70 4d 61 72 6b 75 70 2d 3e 65 6e 64 54 61 67 20  pMarkup->endTag 
7730: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
7740: 28 20 70 2d 3e 7a 56 65 72 62 61 74 69 6d 49 64  ( p->zVerbatimId
7750: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
7760: 20 20 69 66 28 20 70 4d 61 72 6b 75 70 2d 3e 6e    if( pMarkup->n
7770: 41 74 74 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Attr!=1 ) return
7780: 20 30 3b 0a 20 20 7a 20 3d 20 70 4d 61 72 6b 75   0;.  z = pMarku
7790: 70 2d 3e 61 41 74 74 72 5b 30 5d 2e 7a 56 61 6c  p->aAttr[0].zVal
77a0: 75 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72  ue;.  return str
77b0: 63 6d 70 28 7a 2c 20 70 2d 3e 7a 56 65 72 62 61  cmp(z, p->zVerba
77c0: 74 69 6d 49 64 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  timId)==0;.}../*
77d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4d  .** Return the M
77e0: 55 54 59 50 45 20 66 6f 72 20 74 68 65 20 74 6f  UTYPE for the to
77f0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
7800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
7810: 61 63 6b 54 6f 70 54 79 70 65 28 52 65 6e 64 65  ackTopType(Rende
7820: 72 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rer *p){.  if( p
7830: 2d 3e 6e 53 74 61 63 6b 3c 3d 30 20 29 20 72 65  ->nStack<=0 ) re
7840: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
7850: 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 61 53 74 61   aMarkup[p->aSta
7860: 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2d 31 5d 2e  ck[p->nStack-1].
7870: 69 43 6f 64 65 5d 2e 69 54 79 70 65 3b 0a 7d 0a  iCode].iType;.}.
7880: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
7890: 68 65 20 77 69 6b 69 20 69 6e 20 7a 5b 5d 20 69  he wiki in z[] i
78a0: 6e 74 6f 20 68 74 6d 6c 20 69 6e 20 74 68 65 20  nto html in the 
78b0: 72 65 6e 64 65 72 65 72 20 70 2e 20 20 54 68 65  renderer p.  The
78c0: 0a 2a 2a 20 72 65 6e 64 65 72 65 72 20 68 61 73  .** renderer has
78d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
78e0: 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  itialized..**.**
78f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
7900: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6d 6f 64 69  ll probably modi
7910: 66 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  fy the content o
7920: 66 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63  f z[]..*/.static
7930: 20 76 6f 69 64 20 77 69 6b 69 5f 72 65 6e 64 65   void wiki_rende
7940: 72 28 52 65 6e 64 65 72 65 72 20 2a 70 2c 20 63  r(Renderer *p, c
7950: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 74  har *z){.  int t
7960: 6f 6b 65 6e 54 79 70 65 3b 0a 20 20 50 61 72 73  okenType;.  Pars
7970: 65 64 4d 61 72 6b 75 70 20 6d 61 72 6b 75 70 3b  edMarkup markup;
7980: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
7990: 69 6e 6c 69 6e 65 4f 6e 6c 79 20 3d 20 28 70 2d  inlineOnly = (p-
79a0: 3e 73 74 61 74 65 20 26 20 49 4e 4c 49 4e 45 5f  >state & INLINE_
79b0: 4d 41 52 4b 55 50 5f 4f 4e 4c 59 29 21 3d 30 3b  MARKUP_ONLY)!=0;
79c0: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20  ..  while( z[0] 
79d0: 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 65 78 74 54  ){.    n = nextT
79e0: 6f 6b 65 6e 28 7a 2c 20 70 2c 20 26 74 6f 6b 65  oken(z, p, &toke
79f0: 6e 54 79 70 65 29 3b 0a 20 20 20 20 70 2d 3e 73  nType);.    p->s
7a00: 74 61 74 65 20 26 3d 20 7e 28 41 54 5f 4e 45 57  tate &= ~(AT_NEW
7a10: 4c 49 4e 45 7c 41 54 5f 50 41 52 41 47 52 41 50  LINE|AT_PARAGRAP
7a20: 48 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  H);.    switch( 
7a30: 74 6f 6b 65 6e 54 79 70 65 20 29 7b 0a 0a 20 20  tokenType ){..  
7a40: 20 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 43      case TOKEN_C
7a50: 4f 4d 4d 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20  OMMENT: {.      
7a60: 20 20 69 66 20 28 70 2d 3e 69 6e 56 65 72 62 61    if (p->inVerba
7a70: 74 69 6d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tim){.          
7a80: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
7a90: 4f 75 74 2c 20 68 74 6d 6c 69 7a 65 28 7a 2c 20  Out, htmlize(z, 
7aa0: 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  n), -1);.       
7ab0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
7ac0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
7ad0: 70 2d 3e 70 4f 75 74 2c 20 7a 2c 20 6e 29 3b 0a  p->pOut, z, n);.
7ae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7af0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7b00: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45  .      case TOKE
7b10: 4e 5f 50 41 52 41 47 52 41 50 48 3a 20 7b 0a 20  N_PARAGRAPH: {. 
7b20: 20 20 20 20 20 20 20 69 66 28 20 69 6e 6c 69 6e         if( inlin
7b30: 65 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  eOnly ){.       
7b40: 20 20 20 2f 2a 20 62 6c 6f 62 5f 61 70 70 65 6e     /* blob_appen
7b50: 64 28 70 2d 3e 70 4f 75 74 2c 20 22 20 26 70 61  d(p->pOut, " &pa
7b60: 72 61 3b 20 22 2c 20 2d 31 29 3b 20 2a 2f 0a 20  ra; ", -1); */. 
7b70: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70           blob_ap
7b80: 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 20  pend(p->pOut, " 
7b90: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 20 22 2c 20  &nbsp;&nbsp; ", 
7ba0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  -1);.        }el
7bb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
7bc0: 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74 20 29 7b  ( p->wikiList ){
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70  .            pop
7be0: 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20 70 2d  StackToTag(p, p-
7bf0: 3e 77 69 6b 69 4c 69 73 74 29 3b 0a 20 20 20 20  >wikiList);.    
7c00: 20 20 20 20 20 20 20 20 70 2d 3e 77 69 6b 69 4c          p->wikiL
7c10: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
7c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
7c30: 6e 64 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  ndAutoParagraph(
7c40: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c  p);.          bl
7c50: 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f  ob_appendf(p->pO
7c60: 75 74 2c 20 22 5c 6e 5c 6e 22 2c 20 31 29 3b 0a  ut, "\n\n", 1);.
7c70: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 61 6e            p->wan
7c80: 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 20 3d  tAutoParagraph =
7c90: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7ca0: 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 7c        p->state |
7cb0: 3d 20 41 54 5f 50 41 52 41 47 52 41 50 48 7c 41  = AT_PARAGRAPH|A
7cc0: 54 5f 4e 45 57 4c 49 4e 45 3b 0a 20 20 20 20 20  T_NEWLINE;.     
7cd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7ce0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b  }.      case TOK
7cf0: 45 4e 5f 4e 45 57 4c 49 4e 45 3a 20 7b 0a 20 20  EN_NEWLINE: {.  
7d00: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
7d10: 64 28 70 2d 3e 70 4f 75 74 2c 20 22 5c 6e 22 2c  d(p->pOut, "\n",
7d20: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   1);.        p->
7d30: 73 74 61 74 65 20 7c 3d 20 41 54 5f 4e 45 57 4c  state |= AT_NEWL
7d40: 49 4e 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  INE;.        bre
7d50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7d60: 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 42 55 4c    case TOKEN_BUL
7d70: 4c 45 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  LET: {.        i
7d80: 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20 29 7b  f( inlineOnly ){
7d90: 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  .          blob_
7da0: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
7db0: 22 20 26 62 75 6c 6c 3b 20 22 2c 20 2d 31 29 3b  " &bull; ", -1);
7dc0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7dd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
7de0: 3e 77 69 6b 69 4c 69 73 74 21 3d 4d 41 52 4b 55  >wikiList!=MARKU
7df0: 50 5f 55 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  P_UL ){.        
7e00: 20 20 20 20 69 66 28 20 70 2d 3e 77 69 6b 69 4c      if( p->wikiL
7e10: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
7e20: 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54       popStackToT
7e30: 61 67 28 70 2c 20 70 2d 3e 77 69 6b 69 4c 69 73  ag(p, p->wikiLis
7e40: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
7e50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
7e60: 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55  shStack(p, MARKU
7e70: 50 5f 55 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  P_UL);.         
7e80: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
7e90: 2d 3e 70 4f 75 74 2c 20 22 3c 75 6c 3e 22 2c 20  ->pOut, "<ul>", 
7ea0: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
7eb0: 70 2d 3e 77 69 6b 69 4c 69 73 74 20 3d 20 4d 41  p->wikiList = MA
7ec0: 52 4b 55 50 5f 55 4c 3b 0a 20 20 20 20 20 20 20  RKUP_UL;.       
7ed0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
7ee0: 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20  opStackToTag(p, 
7ef0: 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a 20 20 20 20  MARKUP_LI);.    
7f00: 20 20 20 20 20 20 73 74 61 72 74 41 75 74 6f 50        startAutoP
7f10: 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20 20  aragraph(p);.   
7f20: 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b         pushStack
7f30: 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a  (p, MARKUP_LI);.
7f40: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
7f50: 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22  ppend(p->pOut, "
7f60: 3c 6c 69 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20  <li>", 4);.     
7f70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
7f80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7f90: 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 45 4e 55    case TOKEN_ENU
7fa0: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  M: {.        if(
7fb0: 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20 29 7b 0a 20   inlineOnly ){. 
7fc0: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70           blob_ap
7fd0: 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22  pendf(p->pOut, "
7fe0: 20 28 25 64 29 20 22 2c 20 61 74 6f 69 28 7a 29   (%d) ", atoi(z)
7ff0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
8000: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8010: 70 2d 3e 77 69 6b 69 4c 69 73 74 21 3d 4d 41 52  p->wikiList!=MAR
8020: 4b 55 50 5f 4f 4c 20 29 7b 0a 20 20 20 20 20 20  KUP_OL ){.      
8030: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 77 69 6b        if( p->wik
8040: 69 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  iList ){.       
8050: 20 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54         popStackT
8060: 6f 54 61 67 28 70 2c 20 70 2d 3e 77 69 6b 69 4c  oTag(p, p->wikiL
8070: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
8080: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8090: 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52  pushStack(p, MAR
80a0: 4b 55 50 5f 4f 4c 29 3b 0a 20 20 20 20 20 20 20  KUP_OL);.       
80b0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
80c0: 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 6f 6c 3e 22  (p->pOut, "<ol>"
80d0: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
80e0: 20 20 70 2d 3e 77 69 6b 69 4c 69 73 74 20 3d 20    p->wikiList = 
80f0: 4d 41 52 4b 55 50 5f 4f 4c 3b 0a 20 20 20 20 20  MARKUP_OL;.     
8100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8110: 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70   popStackToTag(p
8120: 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a 20 20  , MARKUP_LI);.  
8130: 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75 74          startAut
8140: 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20  oParagraph(p);. 
8150: 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61           pushSta
8160: 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49 29  ck(p, MARKUP_LI)
8170: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  ;.          blob
8180: 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74  _appendf(p->pOut
8190: 2c 20 22 3c 6c 69 20 76 61 6c 75 65 3d 5c 22 25  , "<li value=\"%
81a0: 64 5c 22 3e 22 2c 20 61 74 6f 69 28 7a 29 29 3b  d\">", atoi(z));
81b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
81c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
81d0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f 4b  }.      case TOK
81e0: 45 4e 5f 49 4e 44 45 4e 54 3a 20 7b 0a 20 20 20  EN_INDENT: {.   
81f0: 20 20 20 20 20 69 66 28 20 21 69 6e 6c 69 6e 65       if( !inline
8200: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
8210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 69 6b    assert( p->wik
8220: 69 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  iList==0 );.    
8230: 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28        pushStack(
8240: 70 2c 20 4d 41 52 4b 55 50 5f 42 4c 4f 43 4b 51  p, MARKUP_BLOCKQ
8250: 55 4f 54 45 29 3b 0a 20 20 20 20 20 20 20 20 20  UOTE);.         
8260: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e   blob_append(p->
8270: 70 4f 75 74 2c 20 22 3c 62 6c 6f 63 6b 71 75 6f  pOut, "<blockquo
8280: 74 65 3e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  te>", -1);.     
8290: 20 20 20 20 20 70 2d 3e 77 61 6e 74 41 75 74 6f       p->wantAuto
82a0: 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b 0a 20  Paragraph = 0;. 
82b0: 20 20 20 20 20 20 20 20 20 70 2d 3e 77 69 6b 69           p->wiki
82c0: 4c 69 73 74 20 3d 20 4d 41 52 4b 55 50 5f 42 4c  List = MARKUP_BL
82d0: 4f 43 4b 51 55 4f 54 45 3b 0a 20 20 20 20 20 20  OCKQUOTE;.      
82e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
82f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
8300: 20 63 61 73 65 20 54 4f 4b 45 4e 5f 43 48 41 52   case TOKEN_CHAR
8310: 41 43 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 20  ACTER: {.       
8320: 20 73 74 61 72 74 41 75 74 6f 50 61 72 61 67 72   startAutoParagr
8330: 61 70 68 28 70 29 3b 0a 20 20 20 20 20 20 20 20  aph(p);.        
8340: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3c 27 20 29 7b  if( z[0]=='<' ){
8350: 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  .          blob_
8360: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
8370: 22 26 6c 74 3b 22 2c 20 34 29 3b 0a 20 20 20 20  "&lt;", 4);.    
8380: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
8390: 30 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20  0]=='&' ){.     
83a0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
83b0: 28 70 2d 3e 70 4f 75 74 2c 20 22 26 61 6d 70 3b  (p->pOut, "&amp;
83c0: 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 5);.        }
83d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
83e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
83f0: 73 65 20 54 4f 4b 45 4e 5f 4c 49 4e 4b 3a 20 7b  se TOKEN_LINK: {
8400: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8410: 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20  Target;.        
8420: 63 68 61 72 20 2a 7a 44 69 73 70 6c 61 79 20 3d  char *zDisplay =
8430: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
8440: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 6e  i, j;.        in
8450: 74 20 73 61 76 65 64 53 74 61 74 65 3b 0a 20 20  t savedState;.  
8460: 20 20 20 20 20 20 63 68 61 72 20 7a 43 6c 6f 73        char zClos
8470: 65 5b 32 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20  e[20];..        
8480: 73 74 61 72 74 41 75 74 6f 50 61 72 61 67 72 61  startAutoParagra
8490: 70 68 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7a  ph(p);.        z
84a0: 54 61 72 67 65 74 20 3d 20 26 7a 5b 31 5d 3b 0a  Target = &z[1];.
84b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
84c0: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27   z[i] && z[i]!='
84d0: 5d 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]'; i++){.      
84e0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 7c      if( z[i]=='|
84f0: 27 20 26 26 20 7a 44 69 73 70 6c 61 79 3d 3d 30  ' && zDisplay==0
8500: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8510: 7a 44 69 73 70 6c 61 79 20 3d 20 26 7a 5b 69 2b  zDisplay = &z[i+
8520: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
8530: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[i] = 0;.      
8540: 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2d 31 3b        for(j=i-1;
8550: 20 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65 28   j>0 && isspace(
8560: 7a 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 20 7a 5b 6a  z[j]); j--){ z[j
8570: 5d 20 3d 20 30 3b 20 7d 0a 20 20 20 20 20 20 20  ] = 0; }.       
8580: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8590: 20 20 20 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b         z[i] = 0;
85a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 69  .        if( zDi
85b0: 73 70 6c 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20  splay==0 ){.    
85c0: 20 20 20 20 20 20 7a 44 69 73 70 6c 61 79 20 3d        zDisplay =
85d0: 20 7a 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20   zTarget;.      
85e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
85f0: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
8600: 65 28 2a 7a 44 69 73 70 6c 61 79 29 20 29 20 7a  e(*zDisplay) ) z
8610: 44 69 73 70 6c 61 79 2b 2b 3b 0a 20 20 20 20 20  Display++;.     
8620: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 65     }.        ope
8630: 6e 48 79 70 65 72 6c 69 6e 6b 28 70 2c 20 7a 54  nHyperlink(p, zT
8640: 61 72 67 65 74 2c 20 7a 43 6c 6f 73 65 2c 20 73  arget, zClose, s
8650: 69 7a 65 6f 66 28 7a 43 6c 6f 73 65 29 29 3b 0a  izeof(zClose));.
8660: 20 20 20 20 20 20 20 20 73 61 76 65 64 53 74 61          savedSta
8670: 74 65 20 3d 20 70 2d 3e 73 74 61 74 65 3b 0a 20  te = p->state;. 
8680: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
8690: 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a  &= ~ALLOW_WIKI;.
86a0: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
86b0: 20 7c 3d 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f   |= FONT_MARKUP_
86c0: 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 77 69  ONLY;.        wi
86d0: 6b 69 5f 72 65 6e 64 65 72 28 70 2c 20 7a 44 69  ki_render(p, zDi
86e0: 73 70 6c 61 79 29 3b 0a 20 20 20 20 20 20 20 20  splay);.        
86f0: 70 2d 3e 73 74 61 74 65 20 3d 20 73 61 76 65 64  p->state = saved
8700: 53 74 61 74 65 3b 0a 20 20 20 20 20 20 20 20 62  State;.        b
8710: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
8720: 75 74 2c 20 7a 43 6c 6f 73 65 2c 20 2d 31 29 3b  ut, zClose, -1);
8730: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
8750: 73 65 20 54 4f 4b 45 4e 5f 54 45 58 54 3a 20 7b  se TOKEN_TEXT: {
8760: 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75  .        startAu
8770: 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a  toParagraph(p);.
8780: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
8790: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 7a 2c 20  end(p->pOut, z, 
87a0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  n);.        brea
87b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
87c0: 20 63 61 73 65 20 54 4f 4b 45 4e 5f 4d 41 52 4b   case TOKEN_MARK
87d0: 55 50 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 6f  UP: {.        co
87e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
87f0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 69 76 3b         int iDiv;
8800: 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 4d 61  .        parseMa
8810: 72 6b 75 70 28 26 6d 61 72 6b 75 70 2c 20 7a 29  rkup(&markup, z)
8820: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ;..        /* Ma
8830: 72 6b 75 70 20 6f 66 20 74 68 65 20 66 6f 72 6d  rkup of the form
8840: 20 3c 2f 64 69 76 20 69 64 3d 49 44 3e 20 77 68   </div id=ID> wh
8850: 65 72 65 20 74 68 65 72 65 20 69 73 20 61 20 6d  ere there is a m
8860: 61 74 63 68 69 6e 67 0a 20 20 20 20 20 20 20 20  atching.        
8870: 2a 2a 20 49 44 20 73 6f 6d 65 77 68 65 72 65 20  ** ID somewhere 
8880: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 45  on the stack.  E
8890: 78 69 74 20 74 68 65 20 76 65 72 62 61 74 69 6d  xit the verbatim
88a0: 20 69 66 20 77 65 72 65 20 61 72 65 20 69 6e 0a   if were are in.
88b0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 2e 20 20          ** it.  
88c0: 50 6f 70 20 74 68 65 20 73 74 61 63 6b 20 75 70  Pop the stack up
88d0: 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67   to the matching
88e0: 20 3c 64 69 76 3e 2e 20 20 44 69 73 63 61 72 64   <div>.  Discard
88f0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
8900: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 2a  </div>.        *
8910: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61  /.        if( ma
8920: 72 6b 75 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b  rkup.iCode==MARK
8930: 55 50 5f 44 49 56 20 26 26 20 6d 61 72 6b 75 70  UP_DIV && markup
8940: 2e 65 6e 64 54 61 67 20 26 26 0a 20 20 20 20 20  .endTag &&.     
8950: 20 20 20 20 20 20 20 20 28 7a 49 64 20 3d 20 6d          (zId = m
8960: 61 72 6b 75 70 49 64 28 26 6d 61 72 6b 75 70 29  arkupId(&markup)
8970: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
8980: 20 20 20 20 20 28 69 44 69 76 20 3d 20 66 69 6e       (iDiv = fin
8990: 64 54 61 67 57 69 74 68 49 64 28 70 2c 20 4d 41  dTagWithId(p, MA
89a0: 52 4b 55 50 5f 44 49 56 2c 20 7a 49 64 29 29 3e  RKUP_DIV, zId))>
89b0: 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
89c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
89d0: 6e 56 65 72 62 61 74 69 6d 20 29 7b 0a 20 20 20  nVerbatim ){.   
89e0: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65           p->inVe
89f0: 72 62 61 74 69 6d 20 3d 20 30 3b 0a 20 20 20 20  rbatim = 0;.    
8a00: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
8a10: 20 3d 20 70 2d 3e 70 72 65 56 65 72 62 53 74 61   = p->preVerbSta
8a20: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  te;.            
8a30: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
8a40: 4f 75 74 2c 20 22 3c 2f 70 72 65 3e 22 2c 20 36  Out, "</pre>", 6
8a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8a60: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
8a70: 70 2d 3e 6e 53 74 61 63 6b 3e 69 44 69 76 2b 31  p->nStack>iDiv+1
8a80: 20 29 20 70 6f 70 53 74 61 63 6b 28 70 29 3b 0a   ) popStack(p);.
8a90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
8aa0: 3e 61 53 74 61 63 6b 5b 69 44 69 76 5d 2e 61 6c  >aStack[iDiv].al
8ab0: 6c 6f 77 57 69 6b 69 20 29 7b 0a 20 20 20 20 20  lowWiki ){.     
8ac0: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
8ad0: 7c 3d 20 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20  |= ALLOW_WIKI;. 
8ae0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73              p->s
8b00: 74 61 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57  tate &= ~ALLOW_W
8b10: 49 4b 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  IKI;.          }
8b20: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8b30: 74 28 20 70 2d 3e 6e 53 74 61 63 6b 3d 3d 69 44  t( p->nStack==iD
8b40: 69 76 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  iv+1 );.        
8b50: 20 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a 20    p->nStack--;. 
8b60: 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20         }else..  
8b70: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 69 74 68        /* If with
8b80: 69 6e 20 3c 76 65 72 62 61 74 69 6d 20 69 64 3d  in <verbatim id=
8b90: 49 44 3e 20 69 67 6e 6f 72 65 20 65 76 65 72 79  ID> ignore every
8ba0: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
8bb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 3c 2f 76 65  .        ** </ve
8bc0: 72 62 61 74 69 6d 20 69 64 3d 49 44 3e 20 61 6e  rbatim id=ID> an
8bd0: 64 20 74 68 65 20 3c 2f 64 65 76 20 69 64 3d 49  d the </dev id=I
8be0: 44 32 3e 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  D2> above..     
8bf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
8c00: 28 20 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d 20  ( p->inVerbatim 
8c10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8c20: 20 65 6e 64 56 65 72 62 61 74 69 6d 28 70 2c 20   endVerbatim(p, 
8c30: 26 6d 61 72 6b 75 70 29 20 29 7b 0a 20 20 20 20  &markup) ){.    
8c40: 20 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65 72          p->inVer
8c50: 62 61 74 69 6d 20 3d 20 30 3b 0a 20 20 20 20 20  batim = 0;.     
8c60: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
8c70: 3d 20 70 2d 3e 70 72 65 56 65 72 62 53 74 61 74  = p->preVerbStat
8c80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  e;.            b
8c90: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
8ca0: 75 74 2c 20 22 3c 2f 70 72 65 3e 22 2c 20 36 29  ut, "</pre>", 6)
8cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8cc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  e{.            u
8cd0: 6e 70 61 72 73 65 4d 61 72 6b 75 70 28 26 6d 61  nparseMarkup(&ma
8ce0: 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  rkup);.         
8cf0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
8d00: 2d 3e 70 4f 75 74 2c 20 22 26 6c 74 3b 22 2c 20  ->pOut, "&lt;", 
8d10: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
8d20: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
8d30: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
8d40: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6e  ..        /* Ren
8d50: 64 65 72 20 69 6e 76 61 6c 69 64 20 6d 61 72 6b  der invalid mark
8d60: 75 70 20 6c 69 74 65 72 61 6c 6c 79 2e 20 20 54  up literally.  T
8d70: 68 65 20 6d 61 72 6b 75 70 20 61 70 70 65 61 72  he markup appear
8d80: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
8d90: 20 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74   ** final output
8da0: 20 61 73 20 70 6c 61 69 6e 20 74 65 78 74 2e 0a   as plain text..
8db0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8dc0: 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 43     if( markup.iC
8dd0: 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f 49 4e 56 41  ode==MARKUP_INVA
8de0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LID ){.         
8df0: 20 75 6e 70 61 72 73 65 4d 61 72 6b 75 70 28 26   unparseMarkup(&
8e00: 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20  markup);.       
8e10: 20 20 20 73 74 61 72 74 41 75 74 6f 50 61 72 61     startAutoPara
8e20: 67 72 61 70 68 28 70 29 3b 0a 20 20 20 20 20 20  graph(p);.      
8e30: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
8e40: 70 2d 3e 70 4f 75 74 2c 20 22 26 6c 74 3b 22 2c  p->pOut, "&lt;",
8e50: 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e   4);.          n
8e60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8e70: 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse..        /* 
8e80: 49 66 20 74 68 65 20 6d 61 72 6b 75 70 20 69 73  If the markup is
8e90: 20 6e 6f 74 20 66 6f 6e 74 2d 63 68 61 6e 67 65   not font-change
8ea0: 20 6d 61 72 6b 75 70 20 69 67 6e 6f 72 65 20 69   markup ignore i
8eb0: 74 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 20  t if the.       
8ec0: 20 2a 2a 20 66 6f 6e 74 2d 63 68 61 6e 67 65 2d   ** font-change-
8ed0: 6f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  only flag is set
8ee0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8ef0: 20 20 20 20 20 69 66 28 20 28 6d 61 72 6b 75 70       if( (markup
8f00: 2e 69 54 79 70 65 26 4d 55 54 59 50 45 5f 46 4f  .iType&MUTYPE_FO
8f10: 4e 54 29 3d 3d 30 20 26 26 20 28 70 2d 3e 73 74  NT)==0 && (p->st
8f20: 61 74 65 20 26 20 46 4f 4e 54 5f 4d 41 52 4b 55  ate & FONT_MARKU
8f30: 50 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  P_ONLY)!=0 ){.  
8f40: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
8f50: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  thing */.       
8f60: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20 20 20   }else..        
8f70: 2f 2a 20 49 67 6e 6f 72 65 20 62 6c 6f 63 6b 20  /* Ignore block 
8f80: 6d 61 72 6b 75 70 20 66 6f 72 20 69 6e 2d 6c 69  markup for in-li
8f90: 6e 65 20 72 65 6e 64 65 72 69 6e 67 2e 0a 20 20  ne rendering..  
8fa0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8fb0: 20 69 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20   if( inlineOnly 
8fc0: 26 26 20 28 6d 61 72 6b 75 70 2e 69 54 79 70 65  && (markup.iType
8fd0: 26 4d 55 54 59 50 45 5f 49 4e 4c 49 4e 45 29 3d  &MUTYPE_INLINE)=
8fe0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8ff0: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
9000: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a  .        }else..
9010: 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 72 6b          if( mark
9020: 75 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b 55 50  up.iCode==MARKUP
9030: 5f 4e 4f 57 49 4b 49 20 29 7b 0a 20 20 20 20 20  _NOWIKI ){.     
9040: 20 20 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e       if( markup.
9050: 65 6e 64 54 61 67 20 29 7b 0a 20 20 20 20 20 20  endTag ){.      
9060: 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 7c        p->state |
9070: 3d 20 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20 20  = ALLOW_WIKI;.  
9080: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9090: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 74             p->st
90a0: 61 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49  ate &= ~ALLOW_WI
90b0: 4b 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  KI;.          }.
90c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20          }else.. 
90d0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
90e0: 74 65 20 65 6e 64 2d 74 61 67 73 20 2a 2f 0a 20  te end-tags */. 
90f0: 20 20 20 20 20 20 20 69 66 28 20 6d 61 72 6b 75         if( marku
9100: 70 2e 65 6e 64 54 61 67 20 29 7b 0a 20 20 20 20  p.endTag ){.    
9110: 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f        popStackTo
9120: 54 61 67 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43  Tag(p, markup.iC
9130: 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ode);.        }e
9140: 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse..        /* 
9150: 50 75 73 68 20 3c 64 69 76 3e 20 6d 61 72 6b 75  Push <div> marku
9160: 70 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  p onto the stack
9170: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
9180: 68 65 20 69 64 3d 49 44 20 61 74 74 72 69 62 75  he id=ID attribu
9190: 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  te..        */. 
91a0: 20 20 20 20 20 20 20 69 66 28 20 6d 61 72 6b 75         if( marku
91b0: 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f  p.iCode==MARKUP_
91c0: 44 49 56 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DIV ){.         
91d0: 20 70 75 73 68 53 74 61 63 6b 57 69 74 68 49 64   pushStackWithId
91e0: 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65  (p, markup.iCode
91f0: 2c 20 6d 61 72 6b 75 70 49 64 28 26 6d 61 72 6b  , markupId(&mark
9200: 75 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  up),.           
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9220: 70 2d 3e 73 74 61 74 65 20 26 20 41 4c 4c 4f 57  p->state & ALLOW
9230: 5f 57 49 4b 49 29 21 3d 30 29 3b 0a 20 20 20 20  _WIKI)!=0);.    
9240: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20      }else..     
9250: 20 20 20 2f 2a 20 45 6e 74 65 72 20 3c 76 65 72     /* Enter <ver
9260: 62 61 74 69 6d 3e 20 70 72 6f 63 65 73 73 69 6e  batim> processin
9270: 67 2e 20 20 57 69 74 68 20 76 65 72 62 61 74 69  g.  With verbati
9280: 6d 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20 6f  m enabled, all o
9290: 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
92a0: 6d 61 72 6b 75 70 20 6f 74 68 65 72 20 74 68 61  markup other tha
92b0: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
92c0: 69 6e 67 20 65 6e 64 2d 74 61 67 20 77 69 74 68  ing end-tag with
92d0: 20 74 68 65 20 73 61 6d 65 20 49 44 20 69 73 0a   the same ID is.
92e0: 20 20 20 20 20 20 20 20 2a 2a 20 69 67 6e 6f 72          ** ignor
92f0: 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
9300: 20 20 20 20 20 20 20 69 66 28 20 6d 61 72 6b 75         if( marku
9310: 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f  p.iCode==MARKUP_
9320: 56 45 52 42 41 54 49 4d 20 29 7b 0a 20 20 20 20  VERBATIM ){.    
9330: 20 20 20 20 20 20 69 66 28 20 6d 61 72 6b 75 70        if( markup
9340: 2e 6e 41 74 74 72 3d 3d 31 20 29 7b 0a 20 20 20  .nAttr==1 ){.   
9350: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 56 65 72           p->zVer
9360: 62 61 74 69 6d 49 64 20 3d 20 6d 61 72 6b 75 70  batimId = markup
9370: 2e 61 41 74 74 72 5b 30 5d 2e 7a 56 61 6c 75 65  .aAttr[0].zValue
9380: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9390: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
93a0: 2d 3e 7a 56 65 72 62 61 74 69 6d 49 64 20 3d 20  ->zVerbatimId = 
93b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
93c0: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65           p->inVe
93d0: 72 62 61 74 69 6d 20 3d 20 31 3b 0a 20 20 20 20  rbatim = 1;.    
93e0: 20 20 20 20 20 20 70 2d 3e 70 72 65 56 65 72 62        p->preVerb
93f0: 53 74 61 74 65 20 3d 20 70 2d 3e 73 74 61 74 65  State = p->state
9400: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73  ;.          p->s
9410: 74 61 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57  tate &= ~ALLOW_W
9420: 49 4b 49 3b 0a 20 20 20 20 20 20 20 20 20 20 62  IKI;.          b
9430: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
9440: 75 74 2c 20 22 3c 70 72 65 20 63 6c 61 73 73 3d  ut, "<pre class=
9450: 27 76 65 72 62 61 74 69 6d 27 3e 22 2c 2d 31 29  'verbatim'>",-1)
9460: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77  ;.          p->w
9470: 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  antAutoParagraph
9480: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
9490: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
94a0: 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d 55  markup.iType==MU
94b0: 54 59 50 45 5f 4c 49 20 29 7b 0a 20 20 20 20 20  TYPE_LI ){.     
94c0: 20 20 20 20 20 69 66 28 20 62 61 63 6b 75 70 54       if( backupT
94d0: 6f 54 79 70 65 28 70 2c 20 4d 55 54 59 50 45 5f  oType(p, MUTYPE_
94e0: 4c 49 53 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LIST)==0 ){.    
94f0: 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63          pushStac
9500: 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 55 4c 29 3b  k(p, MARKUP_UL);
9510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f  .            blo
9520: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
9530: 2c 20 22 3c 75 6c 3e 22 2c 20 34 29 3b 0a 20 20  , "<ul>", 4);.  
9540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9550: 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c      pushStack(p,
9560: 20 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a 20 20 20   MARKUP_LI);.   
9570: 20 20 20 20 20 20 20 72 65 6e 64 65 72 4d 61 72         renderMar
9580: 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d 61  kup(p->pOut, &ma
9590: 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  rkup);.        }
95a0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
95b0: 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d   markup.iType==M
95c0: 55 54 59 50 45 5f 54 52 20 29 7b 0a 20 20 20 20  UTYPE_TR ){.    
95d0: 20 20 20 20 20 20 69 66 28 20 62 61 63 6b 75 70        if( backup
95e0: 54 6f 54 79 70 65 28 70 2c 20 4d 55 54 59 50 45  ToType(p, MUTYPE
95f0: 5f 54 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20  _TABLE) ){.     
9600: 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b         pushStack
9610: 28 70 2c 20 4d 41 52 4b 55 50 5f 54 52 29 3b 0a  (p, MARKUP_TR);.
9620: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6e 64              rend
9630: 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74  erMarkup(p->pOut
9640: 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20  , &markup);.    
9650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9660: 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
9670: 28 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d  ( markup.iType==
9680: 4d 55 54 59 50 45 5f 54 44 20 29 7b 0a 20 20 20  MUTYPE_TD ){.   
9690: 20 20 20 20 20 20 20 69 66 28 20 62 61 63 6b 75         if( backu
96a0: 70 54 6f 54 79 70 65 28 70 2c 20 4d 55 54 59 50  pToType(p, MUTYP
96b0: 45 5f 54 41 42 4c 45 7c 4d 55 54 59 50 45 5f 54  E_TABLE|MUTYPE_T
96c0: 52 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  R) ){.          
96d0: 20 20 69 66 28 20 73 74 61 63 6b 54 6f 70 54 79    if( stackTopTy
96e0: 70 65 28 70 29 3d 3d 4d 55 54 59 50 45 5f 54 41  pe(p)==MUTYPE_TA
96f0: 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  BLE ){.         
9700: 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70       pushStack(p
9710: 2c 20 4d 41 52 4b 55 50 5f 54 52 29 3b 0a 20 20  , MARKUP_TR);.  
9720: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
9730: 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c  _append(p->pOut,
9740: 20 22 3c 74 72 3e 22 2c 20 34 29 3b 0a 20 20 20   "<tr>", 4);.   
9750: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9760: 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b         pushStack
9770: 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65  (p, markup.iCode
9780: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
9790: 65 6e 64 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70  enderMarkup(p->p
97a0: 4f 75 74 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20  Out, &markup);. 
97b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
97c0: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
97d0: 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 54 79 70   if( markup.iTyp
97e0: 65 3d 3d 4d 55 54 59 50 45 5f 48 59 50 45 52 4c  e==MUTYPE_HYPERL
97f0: 49 4e 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  INK ){.         
9800: 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70   popStackToTag(p
9810: 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b  , markup.iCode);
9820: 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
9830: 41 75 74 6f 50 61 72 61 67 72 61 70 68 28 70 29  AutoParagraph(p)
9840: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6e 64  ;.          rend
9850: 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74  erMarkup(p->pOut
9860: 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20  , &markup);.    
9870: 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28        pushStack(
9880: 70 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29  p, markup.iCode)
9890: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
98a0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
98b0: 20 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 69      if( markup.i
98c0: 54 79 70 65 3d 3d 4d 55 54 59 50 45 5f 46 4f 4e  Type==MUTYPE_FON
98d0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T ){.           
98e0: 20 73 74 61 72 74 41 75 74 6f 50 61 72 61 67 72   startAutoParagr
98f0: 61 70 68 28 70 29 3b 0a 20 20 20 20 20 20 20 20  aph(p);.        
9900: 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b    }else if( mark
9910: 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54 59 50 45  up.iType==MUTYPE
9920: 5f 42 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  _BLOCK ){.      
9930: 20 20 20 20 20 20 70 2d 3e 77 61 6e 74 41 75 74        p->wantAut
9940: 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b 0a  oParagraph = 0;.
9950: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9960: 20 20 20 20 20 20 69 66 28 20 28 6d 61 72 6b 75        if( (marku
9970: 70 2e 69 54 79 70 65 20 26 20 4d 55 54 59 50 45  p.iType & MUTYPE
9980: 5f 53 54 41 43 4b 20 29 21 3d 30 20 29 7b 0a 20  _STACK )!=0 ){. 
9990: 20 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53             pushS
99a0: 74 61 63 6b 28 70 2c 20 6d 61 72 6b 75 70 2e 69  tack(p, markup.i
99b0: 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Code);.         
99c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 6e   }.          ren
99d0: 64 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75  derMarkup(p->pOu
99e0: 74 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20  t, &markup);.   
99f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
9a00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9a10: 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 6e 3b 0a    }.    z += n;.
9a20: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72    }.}.../*.** Tr
9a30: 61 6e 73 66 6f 72 6d 20 74 68 65 20 74 65 78 74  ansform the text
9a40: 20 69 6e 20 74 68 65 20 70 49 6e 20 62 6c 6f 62   in the pIn blob
9a50: 2e 20 20 57 72 69 74 65 20 74 68 65 20 72 65 73  .  Write the res
9a60: 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
9a70: 20 70 4f 75 74 20 62 6c 6f 62 2e 20 20 54 68 65   pOut blob.  The
9a80: 20 70 4f 75 74 20 62 6c 6f 62 20 73 68 6f 75 6c   pOut blob shoul
9a90: 64 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20  d already be.** 
9aa0: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
9ab0: 65 20 6f 75 74 70 75 74 20 69 73 20 6d 65 72 65  e output is mere
9ac0: 6c 79 20 61 70 70 65 6e 64 65 64 20 74 6f 20 70  ly appended to p
9ad0: 4f 75 74 2e 0a 2a 2a 20 49 66 20 70 4f 75 74 20  Out..** If pOut 
9ae0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
9af0: 65 20 6f 75 74 70 75 74 20 69 73 20 61 70 70 65  e output is appe
9b00: 6e 64 65 64 20 74 6f 20 74 68 65 20 43 47 49 0a  nded to the CGI.
9b10: 2a 2a 20 72 65 70 6c 79 2e 0a 2a 2f 0a 76 6f 69  ** reply..*/.voi
9b20: 64 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 42  d wiki_convert(B
9b30: 6c 6f 62 20 2a 70 49 6e 2c 20 42 6c 6f 62 20 2a  lob *pIn, Blob *
9b40: 70 4f 75 74 2c 20 69 6e 74 20 66 6c 61 67 73 29  pOut, int flags)
9b50: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 52  {.  char *z;.  R
9b60: 65 6e 64 65 72 65 72 20 72 65 6e 64 65 72 65 72  enderer renderer
9b70: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 72 65 6e  ;..  memset(&ren
9b80: 64 65 72 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  derer, 0, sizeof
9b90: 28 72 65 6e 64 65 72 65 72 29 29 3b 0a 20 20 72  (renderer));.  r
9ba0: 65 6e 64 65 72 65 72 2e 73 74 61 74 65 20 3d 20  enderer.state = 
9bb0: 41 4c 4c 4f 57 5f 57 49 4b 49 7c 41 54 5f 4e 45  ALLOW_WIKI|AT_NE
9bc0: 57 4c 49 4e 45 7c 41 54 5f 50 41 52 41 47 52 41  WLINE|AT_PARAGRA
9bd0: 50 48 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  PH;.  if( flags 
9be0: 26 20 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b 20 29  & WIKI_NOBLOCK )
9bf0: 7b 0a 20 20 20 20 72 65 6e 64 65 72 65 72 2e 73  {.    renderer.s
9c00: 74 61 74 65 20 7c 3d 20 49 4e 4c 49 4e 45 5f 4d  tate |= INLINE_M
9c10: 41 52 4b 55 50 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  ARKUP_ONLY;.  }.
9c20: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 49    if( flags & WI
9c30: 4b 49 5f 49 4e 4c 49 4e 45 20 29 7b 0a 20 20 20  KI_INLINE ){.   
9c40: 20 72 65 6e 64 65 72 65 72 2e 77 61 6e 74 41 75   renderer.wantAu
9c50: 74 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b  toParagraph = 0;
9c60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
9c70: 6e 64 65 72 65 72 2e 77 61 6e 74 41 75 74 6f 50  nderer.wantAutoP
9c80: 61 72 61 67 72 61 70 68 20 3d 20 31 3b 0a 20 20  aragraph = 1;.  
9c90: 7d 0a 20 20 69 66 28 20 70 4f 75 74 20 29 7b 0a  }.  if( pOut ){.
9ca0: 20 20 20 20 72 65 6e 64 65 72 65 72 2e 70 4f 75      renderer.pOu
9cb0: 74 20 3d 20 70 4f 75 74 3b 0a 20 20 7d 65 6c 73  t = pOut;.  }els
9cc0: 65 7b 0a 20 20 20 20 72 65 6e 64 65 72 65 72 2e  e{.    renderer.
9cd0: 70 4f 75 74 20 3d 20 63 67 69 5f 6f 75 74 70 75  pOut = cgi_outpu
9ce0: 74 5f 62 6c 6f 62 28 29 3b 0a 20 20 7d 0a 0a 20  t_blob();.  }.. 
9cf0: 20 7a 20 3d 20 62 6c 6f 62 5f 73 74 72 28 70 49   z = blob_str(pI
9d00: 6e 29 3b 0a 20 20 77 69 6b 69 5f 72 65 6e 64 65  n);.  wiki_rende
9d10: 72 28 26 72 65 6e 64 65 72 65 72 2c 20 7a 29 3b  r(&renderer, z);
9d20: 0a 20 20 65 6e 64 41 75 74 6f 50 61 72 61 67 72  .  endAutoParagr
9d30: 61 70 68 28 26 72 65 6e 64 65 72 65 72 29 3b 0a  aph(&renderer);.
9d40: 20 20 77 68 69 6c 65 28 20 72 65 6e 64 65 72 65    while( rendere
9d50: 72 2e 6e 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  r.nStack ){.    
9d60: 70 6f 70 53 74 61 63 6b 28 26 72 65 6e 64 65 72  popStack(&render
9d70: 65 72 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  er);.  }.  blob_
9d80: 61 70 70 65 6e 64 28 72 65 6e 64 65 72 65 72 2e  append(renderer.
9d90: 70 4f 75 74 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a  pOut, "\n", 1);.
9da0: 20 20 66 72 65 65 28 72 65 6e 64 65 72 65 72 2e    free(renderer.
9db0: 61 53 74 61 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  aStack);.}../*.*
9dc0: 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d  * COMMAND: test-
9dd0: 77 69 6b 69 2d 72 65 6e 64 65 72 0a 2a 2f 0a 76  wiki-render.*/.v
9de0: 6f 69 64 20 74 65 73 74 5f 77 69 6b 69 5f 72 65  oid test_wiki_re
9df0: 6e 64 65 72 28 76 6f 69 64 29 7b 0a 20 20 42 6c  nder(void){.  Bl
9e00: 6f 62 20 69 6e 2c 20 6f 75 74 3b 0a 20 20 69 66  ob in, out;.  if
9e10: 28 20 67 2e 61 72 67 63 21 3d 33 20 29 20 75 73  ( g.argc!=3 ) us
9e20: 61 67 65 28 22 46 49 4c 45 22 29 3b 0a 20 20 62  age("FILE");.  b
9e30: 6c 6f 62 5f 7a 65 72 6f 28 26 6f 75 74 29 3b 0a  lob_zero(&out);.
9e40: 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d    blob_read_from
9e50: 5f 66 69 6c 65 28 26 69 6e 2c 20 67 2e 61 72 67  _file(&in, g.arg
9e60: 76 5b 32 5d 29 3b 0a 20 20 77 69 6b 69 5f 63 6f  v[2]);.  wiki_co
9e70: 6e 76 65 72 74 28 26 69 6e 2c 20 26 6f 75 74 2c  nvert(&in, &out,
9e80: 20 30 29 3b 0a 20 20 62 6c 6f 62 5f 77 72 69 74   0);.  blob_writ
9e90: 65 5f 74 6f 5f 66 69 6c 65 28 26 6f 75 74 2c 20  e_to_file(&out, 
9ea0: 22 2d 22 29 3b 0a 7d 0a                          "-");.}.