Hex Artifact Content
Not logged in

Artifact ef5196ba6ca0c3cda889dc815dab4e4b6b1f7116:

File src/wikiformat.c part of check-in [ac3f1f2ba7] - Improvements to how ticket changes are displayed in the UI. The hyperlink is show with strick-through if the ticket is closed. The title is shown after the ticket hyperlink. SQL to determine the closed condition and the title can be set in the ticket setup screens. by drh on 2008-10-18 02:27:13.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 64 6f 20 66 6f 72 6d 61 74 74 69 6e 67 20  o do formatting 
0390: 6f 66 20 77 69 6b 69 20 74 65 78 74 2e 0a 2a 2f  of wiki text..*/
03a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
03b0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63  t.h>.#include "c
03c0: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64  onfig.h".#includ
03d0: 65 20 22 77 69 6b 69 66 6f 72 6d 61 74 2e 68 22  e "wikiformat.h"
03e0: 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a  ..#if INTERFACE.
03f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 77 69  /*.** Allowed wi
0400: 6b 69 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ki transformatio
0410: 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2f 0a  n operations.*/.
0420: 23 64 65 66 69 6e 65 20 57 49 4b 49 5f 4e 4f 46  #define WIKI_NOF
0430: 4f 4c 4c 4f 57 20 20 20 20 20 20 20 30 78 30 30  OLLOW       0x00
0440: 31 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 5f 48  1.#define WIKI_H
0450: 54 4d 4c 20 20 20 20 20 20 20 20 20 20 20 30 78  TML           0x
0460: 30 30 32 0a 23 64 65 66 69 6e 65 20 57 49 4b 49  002.#define WIKI
0470: 5f 49 4e 4c 49 4e 45 20 20 20 20 20 20 20 20 20  _INLINE         
0480: 30 78 30 30 34 20 20 2f 2a 20 44 6f 20 6e 6f 74  0x004  /* Do not
0490: 20 73 75 72 72 6f 75 6e 64 20 77 69 74 68 20 3c   surround with <
04a0: 70 3e 2e 2e 3c 2f 70 3e 20 2a 2f 0a 23 64 65 66  p>..</p> */.#def
04b0: 69 6e 65 20 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b  ine WIKI_NOBLOCK
04c0: 20 20 20 20 20 20 20 20 30 78 30 30 38 20 20 2f          0x008  /
04d0: 2a 20 4e 6f 20 62 6c 6f 63 6b 20 6d 61 72 6b 75  * No block marku
04e0: 70 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f  p of any kind */
04f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
0500: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 6f 6e  These are the on
0510: 6c 79 20 6d 61 72 6b 75 70 20 61 74 74 72 69 62  ly markup attrib
0520: 75 74 65 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f  utes allowed..*/
0530: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 41 4c  .#define ATTR_AL
0540: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
0550: 20 31 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f   1.#define ATTR_
0560: 41 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  ALT             
0570: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 41 54 54     2.#define ATT
0580: 52 5f 42 47 43 4f 4c 4f 52 20 20 20 20 20 20 20  R_BGCOLOR       
0590: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41       3.#define A
05a0: 54 54 52 5f 42 4f 52 44 45 52 20 20 20 20 20 20  TTR_BORDER      
05b0: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
05c0: 20 41 54 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e   ATTR_CELLPADDIN
05d0: 47 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69  G        5.#defi
05e0: 6e 65 20 41 54 54 52 5f 43 45 4c 4c 53 50 41 43  ne ATTR_CELLSPAC
05f0: 49 4e 47 20 20 20 20 20 20 20 20 36 0a 23 64 65  ING        6.#de
0600: 66 69 6e 65 20 41 54 54 52 5f 43 4c 45 41 52 20  fine ATTR_CLEAR 
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 37 0a 23               7.#
0620: 64 65 66 69 6e 65 20 41 54 54 52 5f 43 4f 4c 4f  define ATTR_COLO
0630: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38  R              8
0640: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 43 4f  .#define ATTR_CO
0650: 4c 53 50 41 4e 20 20 20 20 20 20 20 20 20 20 20  LSPAN           
0660: 20 39 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f   9.#define ATTR_
0670: 43 4f 4d 50 41 43 54 20 20 20 20 20 20 20 20 20  COMPACT         
0680: 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 41 54     10.#define AT
0690: 54 52 5f 46 41 43 45 20 20 20 20 20 20 20 20 20  TR_FACE         
06a0: 20 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65        11.#define
06b0: 20 41 54 54 52 5f 48 45 49 47 48 54 20 20 20 20   ATTR_HEIGHT    
06c0: 20 20 20 20 20 20 20 20 20 31 32 0a 23 64 65 66           12.#def
06d0: 69 6e 65 20 41 54 54 52 5f 48 52 45 46 20 20 20  ine ATTR_HREF   
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 33 0a 23              13.#
06f0: 64 65 66 69 6e 65 20 41 54 54 52 5f 48 53 50 41  define ATTR_HSPA
0700: 43 45 20 20 20 20 20 20 20 20 20 20 20 20 20 31  CE             1
0710: 34 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 49  4.#define ATTR_I
0720: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
0730: 20 20 31 35 0a 23 64 65 66 69 6e 65 20 41 54 54    15.#define ATT
0740: 52 5f 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  R_NAME          
0750: 20 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20       16.#define 
0760: 41 54 54 52 5f 52 4f 57 53 50 41 4e 20 20 20 20  ATTR_ROWSPAN    
0770: 20 20 20 20 20 20 20 20 31 37 0a 23 64 65 66 69          17.#defi
0780: 6e 65 20 41 54 54 52 5f 53 49 5a 45 20 20 20 20  ne ATTR_SIZE    
0790: 20 20 20 20 20 20 20 20 20 20 20 31 38 0a 23 64             18.#d
07a0: 65 66 69 6e 65 20 41 54 54 52 5f 53 52 43 20 20  efine ATTR_SRC  
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 39                19
07c0: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 53 54  .#define ATTR_ST
07d0: 41 52 54 20 20 20 20 20 20 20 20 20 20 20 20 20  ART             
07e0: 20 32 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52   20.#define ATTR
07f0: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
0800: 20 20 20 20 32 31 0a 23 64 65 66 69 6e 65 20 41      21.#define A
0810: 54 54 52 5f 56 41 4c 49 47 4e 20 20 20 20 20 20  TTR_VALIGN      
0820: 20 20 20 20 20 20 20 32 32 0a 23 64 65 66 69 6e         22.#defin
0830: 65 20 41 54 54 52 5f 56 41 4c 55 45 20 20 20 20  e ATTR_VALUE    
0840: 20 20 20 20 20 20 20 20 20 20 32 33 0a 23 64 65            23.#de
0850: 66 69 6e 65 20 41 54 54 52 5f 56 53 50 41 43 45  fine ATTR_VSPACE
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 34 0a               24.
0870: 23 64 65 66 69 6e 65 20 41 54 54 52 5f 57 49 44  #define ATTR_WID
0880: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
0890: 32 35 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f  25.#define AMSK_
08a0: 41 4c 49 47 4e 20 20 20 20 20 20 20 20 20 20 20  ALIGN           
08b0: 20 20 20 30 78 30 30 30 30 30 30 31 0a 23 64 65     0x0000001.#de
08c0: 66 69 6e 65 20 41 4d 53 4b 5f 41 4c 54 20 20 20  fine AMSK_ALT   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
08e0: 30 30 30 30 30 32 0a 23 64 65 66 69 6e 65 20 41  000002.#define A
08f0: 4d 53 4b 5f 42 47 43 4f 4c 4f 52 20 20 20 20 20  MSK_BGCOLOR     
0900: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34         0x0000004
0910: 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 42 4f  .#define AMSK_BO
0920: 52 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  RDER            
0930: 20 30 78 30 30 30 30 30 30 38 0a 23 64 65 66 69   0x0000008.#defi
0940: 6e 65 20 41 4d 53 4b 5f 43 45 4c 4c 50 41 44 44  ne AMSK_CELLPADD
0950: 49 4e 47 20 20 20 20 20 20 20 20 30 78 30 30 30  ING        0x000
0960: 30 30 31 30 0a 23 64 65 66 69 6e 65 20 41 4d 53  0010.#define AMS
0970: 4b 5f 43 45 4c 4c 53 50 41 43 49 4e 47 20 20 20  K_CELLSPACING   
0980: 20 20 20 20 20 30 78 30 30 30 30 30 32 30 0a 23       0x0000020.#
0990: 64 65 66 69 6e 65 20 41 4d 53 4b 5f 43 4c 45 41  define AMSK_CLEA
09a0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  R              0
09b0: 78 30 30 30 30 30 34 30 0a 23 64 65 66 69 6e 65  x0000040.#define
09c0: 20 41 4d 53 4b 5f 43 4f 4c 4f 52 20 20 20 20 20   AMSK_COLOR     
09d0: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30           0x00000
09e0: 38 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f  80.#define AMSK_
09f0: 43 4f 4c 53 50 41 4e 20 20 20 20 20 20 20 20 20  COLSPAN         
0a00: 20 20 20 30 78 30 30 30 30 31 30 30 0a 23 64 65     0x0000100.#de
0a10: 66 69 6e 65 20 41 4d 53 4b 5f 43 4f 4d 50 41 43  fine AMSK_COMPAC
0a20: 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30  T            0x0
0a30: 30 30 30 32 30 30 0a 23 64 65 66 69 6e 65 20 41  000200.#define A
0a40: 4d 53 4b 5f 46 41 43 45 20 20 20 20 20 20 20 20  MSK_FACE        
0a50: 20 20 20 20 20 20 20 30 78 30 30 30 30 34 30 30         0x0000400
0a60: 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 48 45  .#define AMSK_HE
0a70: 49 47 48 54 20 20 20 20 20 20 20 20 20 20 20 20  IGHT            
0a80: 20 30 78 30 30 30 30 38 30 30 0a 23 64 65 66 69   0x0000800.#defi
0a90: 6e 65 20 41 4d 53 4b 5f 48 52 45 46 20 20 20 20  ne AMSK_HREF    
0aa0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
0ab0: 31 30 30 30 0a 23 64 65 66 69 6e 65 20 41 4d 53  1000.#define AMS
0ac0: 4b 5f 48 53 50 41 43 45 20 20 20 20 20 20 20 20  K_HSPACE        
0ad0: 20 20 20 20 20 30 78 30 30 30 32 30 30 30 0a 23       0x0002000.#
0ae0: 64 65 66 69 6e 65 20 41 4d 53 4b 5f 49 44 20 20  define AMSK_ID  
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b00: 78 30 30 30 34 30 30 30 0a 23 64 65 66 69 6e 65  x0004000.#define
0b10: 20 41 4d 53 4b 5f 4e 41 4d 45 20 20 20 20 20 20   AMSK_NAME      
0b20: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 38 30           0x00080
0b30: 30 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f  00.#define AMSK_
0b40: 52 4f 57 53 50 41 4e 20 20 20 20 20 20 20 20 20  ROWSPAN         
0b50: 20 20 20 30 78 30 30 31 30 30 30 30 0a 23 64 65     0x0010000.#de
0b60: 66 69 6e 65 20 41 4d 53 4b 5f 53 49 5a 45 20 20  fine AMSK_SIZE  
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0b80: 30 32 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41  020000.#define A
0b90: 4d 53 4b 5f 53 52 43 20 20 20 20 20 20 20 20 20  MSK_SRC         
0ba0: 20 20 20 20 20 20 20 30 78 30 30 34 30 30 30 30         0x0040000
0bb0: 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f 53 54  .#define AMSK_ST
0bc0: 41 52 54 20 20 20 20 20 20 20 20 20 20 20 20 20  ART             
0bd0: 20 30 78 30 30 38 30 30 30 30 0a 23 64 65 66 69   0x0080000.#defi
0be0: 6e 65 20 41 4d 53 4b 5f 54 59 50 45 20 20 20 20  ne AMSK_TYPE    
0bf0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 31 30             0x010
0c00: 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41 4d 53  0000.#define AMS
0c10: 4b 5f 56 41 4c 49 47 4e 20 20 20 20 20 20 20 20  K_VALIGN        
0c20: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 0a 23       0x0200000.#
0c30: 64 65 66 69 6e 65 20 41 4d 53 4b 5f 56 41 4c 55  define AMSK_VALU
0c40: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  E              0
0c50: 78 30 34 30 30 30 30 30 0a 23 64 65 66 69 6e 65  x0400000.#define
0c60: 20 41 4d 53 4b 5f 56 53 50 41 43 45 20 20 20 20   AMSK_VSPACE    
0c70: 20 20 20 20 20 20 20 20 20 30 78 30 38 30 30 30           0x08000
0c80: 30 30 0a 23 64 65 66 69 6e 65 20 41 4d 53 4b 5f  00.#define AMSK_
0c90: 57 49 44 54 48 20 20 20 20 20 20 20 20 20 20 20  WIDTH           
0ca0: 20 20 20 30 78 31 30 30 30 30 30 30 0a 0a 73 74     0x1000000..st
0cb0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
0cc0: 74 20 41 6c 6c 6f 77 65 64 41 74 74 72 69 62 75  t AllowedAttribu
0cd0: 74 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  te {.  const cha
0ce0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69  r *zName;.  unsi
0cf0: 67 6e 65 64 20 69 6e 74 20 69 4d 61 73 6b 3b 0a  gned int iMask;.
0d00: 7d 20 61 41 74 74 72 69 62 75 74 65 5b 5d 20 3d  } aAttribute[] =
0d10: 20 7b 0a 20 20 7b 20 30 2c 20 30 20 7d 2c 0a 20   {.  { 0, 0 },. 
0d20: 20 7b 20 22 61 6c 69 67 6e 22 2c 20 20 20 20 20   { "align",     
0d30: 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 2c 20      AMSK_ALIGN, 
0d40: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0d50: 22 61 6c 74 22 2c 20 20 20 20 20 20 20 20 20 20  "alt",          
0d60: 20 41 4d 53 4b 5f 41 4c 54 2c 20 20 20 20 20 20   AMSK_ALT,      
0d70: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 62 67        },.  { "bg
0d80: 63 6f 6c 6f 72 22 2c 20 20 20 20 20 20 20 41 4d  color",       AM
0d90: 53 4b 5f 42 47 43 4f 4c 4f 52 2c 20 20 20 20 20  SK_BGCOLOR,     
0da0: 20 20 20 7d 2c 0a 20 20 7b 20 22 62 6f 72 64 65     },.  { "borde
0db0: 72 22 2c 20 20 20 20 20 20 20 20 41 4d 53 4b 5f  r",        AMSK_
0dc0: 42 4f 52 44 45 52 2c 20 20 20 20 20 20 20 20 20  BORDER,         
0dd0: 7d 2c 0a 20 20 7b 20 22 63 65 6c 6c 70 61 64 64  },.  { "cellpadd
0de0: 69 6e 67 22 2c 20 20 20 41 4d 53 4b 5f 43 45 4c  ing",   AMSK_CEL
0df0: 4c 50 41 44 44 49 4e 47 2c 20 20 20 20 7d 2c 0a  LPADDING,    },.
0e00: 20 20 7b 20 22 63 65 6c 6c 73 70 61 63 69 6e 67    { "cellspacing
0e10: 22 2c 20 20 20 41 4d 53 4b 5f 43 45 4c 4c 53 50  ",   AMSK_CELLSP
0e20: 41 43 49 4e 47 2c 20 20 20 20 7d 2c 0a 20 20 7b  ACING,    },.  {
0e30: 20 22 63 6c 65 61 72 22 2c 20 20 20 20 20 20 20   "clear",       
0e40: 20 20 41 4d 53 4b 5f 43 4c 45 41 52 2c 20 20 20    AMSK_CLEAR,   
0e50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63         },.  { "c
0e60: 6f 6c 6f 72 22 2c 20 20 20 20 20 20 20 20 20 41  olor",         A
0e70: 4d 53 4b 5f 43 4f 4c 4f 52 2c 20 20 20 20 20 20  MSK_COLOR,      
0e80: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6c 73      },.  { "cols
0e90: 70 61 6e 22 2c 20 20 20 20 20 20 20 41 4d 53 4b  pan",       AMSK
0ea0: 5f 43 4f 4c 53 50 41 4e 2c 20 20 20 20 20 20 20  _COLSPAN,       
0eb0: 20 7d 2c 0a 20 20 7b 20 22 63 6f 6d 70 61 63 74   },.  { "compact
0ec0: 22 2c 20 20 20 20 20 20 20 41 4d 53 4b 5f 43 4f  ",       AMSK_CO
0ed0: 4d 50 41 43 54 2c 20 20 20 20 20 20 20 20 7d 2c  MPACT,        },
0ee0: 0a 20 20 7b 20 22 66 61 63 65 22 2c 20 20 20 20  .  { "face",    
0ef0: 20 20 20 20 20 20 41 4d 53 4b 5f 46 41 43 45 2c        AMSK_FACE,
0f00: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0f10: 7b 20 22 68 65 69 67 68 74 22 2c 20 20 20 20 20  { "height",     
0f20: 20 20 20 41 4d 53 4b 5f 48 45 49 47 48 54 2c 20     AMSK_HEIGHT, 
0f30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
0f40: 68 72 65 66 22 2c 20 20 20 20 20 20 20 20 20 20  href",          
0f50: 41 4d 53 4b 5f 48 52 45 46 2c 20 20 20 20 20 20  AMSK_HREF,      
0f60: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 68 73 70       },.  { "hsp
0f70: 61 63 65 22 2c 20 20 20 20 20 20 20 20 41 4d 53  ace",        AMS
0f80: 4b 5f 48 53 50 41 43 45 2c 20 20 20 20 20 20 20  K_HSPACE,       
0f90: 20 20 7d 2c 0a 20 20 7b 20 22 69 64 22 2c 20 20    },.  { "id",  
0fa0: 20 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 49            AMSK_I
0fb0: 44 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  D,             }
0fc0: 2c 0a 20 20 7b 20 22 6e 61 6d 65 22 2c 20 20 20  ,.  { "name",   
0fd0: 20 20 20 20 20 20 20 41 4d 53 4b 5f 4e 41 4d 45         AMSK_NAME
0fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ,           },. 
0ff0: 20 7b 20 22 72 6f 77 73 70 61 6e 22 2c 20 20 20   { "rowspan",   
1000: 20 20 20 20 41 4d 53 4b 5f 52 4f 57 53 50 41 4e      AMSK_ROWSPAN
1010: 2c 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20  ,        },.  { 
1020: 22 73 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  "size",         
1030: 20 41 4d 53 4b 5f 53 49 5a 45 2c 20 20 20 20 20   AMSK_SIZE,     
1040: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 72        },.  { "sr
1050: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 41 4d  c",           AM
1060: 53 4b 5f 53 52 43 2c 20 20 20 20 20 20 20 20 20  SK_SRC,         
1070: 20 20 20 7d 2c 0a 20 20 7b 20 22 73 74 61 72 74     },.  { "start
1080: 22 2c 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f  ",         AMSK_
1090: 53 54 41 52 54 2c 20 20 20 20 20 20 20 20 20 20  START,          
10a0: 7d 2c 0a 20 20 7b 20 22 74 79 70 65 22 2c 20 20  },.  { "type",  
10b0: 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 54 59 50          AMSK_TYP
10c0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  E,           },.
10d0: 20 20 7b 20 22 76 61 6c 69 67 6e 22 2c 20 20 20    { "valign",   
10e0: 20 20 20 20 20 41 4d 53 4b 5f 56 41 4c 49 47 4e       AMSK_VALIGN
10f0: 2c 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b  ,         },.  {
1100: 20 22 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20   "value",       
1110: 20 20 41 4d 53 4b 5f 56 41 4c 55 45 2c 20 20 20    AMSK_VALUE,   
1120: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 76         },.  { "v
1130: 73 70 61 63 65 22 2c 20 20 20 20 20 20 20 20 41  space",        A
1140: 4d 53 4b 5f 56 53 50 41 43 45 2c 20 20 20 20 20  MSK_VSPACE,     
1150: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 77 69 64 74      },.  { "widt
1160: 68 22 2c 20 20 20 20 20 20 20 20 20 41 4d 53 4b  h",         AMSK
1170: 5f 57 49 44 54 48 2c 20 20 20 20 20 20 20 20 20  _WIDTH,         
1180: 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73   },.};../*.** Us
1190: 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
11a0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 74 61 67 20  to locate a tag 
11b0: 69 6e 20 74 68 65 20 61 41 74 74 72 69 62 75 74  in the aAttribut
11c0: 65 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  e[] table..*/.st
11d0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 41 74 74  atic int findAtt
11e0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  r(const char *z)
11f0: 7b 0a 20 20 69 6e 74 20 69 2c 20 63 2c 20 66 69  {.  int i, c, fi
1200: 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 66 69 72  rst, last;.  fir
1210: 73 74 20 3d 20 31 3b 0a 20 20 6c 61 73 74 20 3d  st = 1;.  last =
1220: 20 73 69 7a 65 6f 66 28 61 41 74 74 72 69 62 75   sizeof(aAttribu
1230: 74 65 29 2f 73 69 7a 65 6f 66 28 61 41 74 74 72  te)/sizeof(aAttr
1240: 69 62 75 74 65 5b 30 5d 29 20 2d 20 31 3b 0a 20  ibute[0]) - 1;. 
1250: 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c   while( first<=l
1260: 61 73 74 20 29 7b 0a 20 20 20 20 69 20 3d 20 28  ast ){.    i = (
1270: 66 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20  first+last)/2;. 
1280: 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28 61 41     c = strcmp(aA
1290: 74 74 72 69 62 75 74 65 5b 69 5d 2e 7a 4e 61 6d  ttribute[i].zNam
12a0: 65 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 63  e, z);.    if( c
12b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
12c0: 75 72 6e 20 69 3b 0a 20 20 20 20 7d 65 6c 73 65  urn i;.    }else
12d0: 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
12e0: 20 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20    first = i+1;. 
12f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1300: 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20  last = i-1;.    
1310: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1320: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ;.}..../*.** All
1330: 6f 77 65 64 20 6d 61 72 6b 75 70 2e 0a 2a 2a 0a  owed markup..**.
1340: 2a 2a 20 45 78 63 65 70 74 20 66 6f 72 20 4d 41  ** Except for MA
1350: 52 4b 55 50 5f 49 4e 56 41 4c 49 44 2c 20 74 68  RKUP_INVALID, th
1360: 69 73 20 6d 75 73 74 20 61 6c 6c 20 62 65 20 69  is must all be i
1370: 6e 20 61 6c 70 68 61 62 65 74 69 63 61 6c 20 6f  n alphabetical o
1380: 72 64 65 72 0a 2a 2a 20 61 6e 64 20 69 6e 20 6e  rder.** and in n
1390: 75 6d 65 72 69 63 61 6c 20 73 65 71 75 65 6e 63  umerical sequenc
13a0: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 6d 61  e.  The first ma
13b0: 72 6b 75 70 20 74 79 70 65 20 6d 75 73 74 20 62  rkup type must b
13c0: 65 20 7a 65 72 6f 2e 0a 2a 2a 20 54 68 65 20 76  e zero..** The v
13d0: 61 6c 75 65 20 66 6f 72 20 4d 41 52 4b 55 50 5f  alue for MARKUP_
13e0: 58 59 5a 20 6d 75 73 74 20 63 6f 72 72 65 73 70  XYZ must corresp
13f0: 6f 6e 64 20 74 6f 20 74 68 65 20 3c 78 79 7a 3e  ond to the <xyz>
1400: 20 65 6e 74 72 79 20 0a 2a 2a 20 69 6e 20 61 41   entry .** in aA
1410: 6c 6c 6f 77 65 64 4d 61 72 6b 75 70 5b 5d 2e 0a  llowedMarkup[]..
1420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  */.#define MARKU
1430: 50 5f 49 4e 56 41 4c 49 44 20 20 20 20 20 20 20  P_INVALID       
1440: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4d 41      0.#define MA
1450: 52 4b 55 50 5f 41 20 20 20 20 20 20 20 20 20 20  RKUP_A          
1460: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
1470: 20 4d 41 52 4b 55 50 5f 41 44 44 52 45 53 53 20   MARKUP_ADDRESS 
1480: 20 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66            2.#def
1490: 69 6e 65 20 4d 41 52 4b 55 50 5f 42 20 20 20 20  ine MARKUP_B    
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 0a 23               3.#
14b0: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42 49  define MARKUP_BI
14c0: 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  G               
14d0: 34 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  4.#define MARKUP
14e0: 5f 42 4c 4f 43 4b 51 55 4f 54 45 20 20 20 20 20  _BLOCKQUOTE     
14f0: 20 20 20 35 0a 23 64 65 66 69 6e 65 20 4d 41 52     5.#define MAR
1500: 4b 55 50 5f 42 52 20 20 20 20 20 20 20 20 20 20  KUP_BR          
1510: 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20        6.#define 
1520: 4d 41 52 4b 55 50 5f 43 45 4e 54 45 52 20 20 20  MARKUP_CENTER   
1530: 20 20 20 20 20 20 20 20 20 37 0a 23 64 65 66 69           7.#defi
1540: 6e 65 20 4d 41 52 4b 55 50 5f 43 49 54 45 20 20  ne MARKUP_CITE  
1550: 20 20 20 20 20 20 20 20 20 20 20 20 38 0a 23 64              8.#d
1560: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 43 4f 44  efine MARKUP_COD
1570: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39  E              9
1580: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1590: 44 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  DD              
15a0: 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   10.#define MARK
15b0: 55 50 5f 44 46 4e 20 20 20 20 20 20 20 20 20 20  UP_DFN          
15c0: 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4d      11.#define M
15d0: 41 52 4b 55 50 5f 44 49 56 20 20 20 20 20 20 20  ARKUP_DIV       
15e0: 20 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e         12.#defin
15f0: 65 20 4d 41 52 4b 55 50 5f 44 4c 20 20 20 20 20  e MARKUP_DL     
1600: 20 20 20 20 20 20 20 20 20 20 31 33 0a 23 64 65            13.#de
1610: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 44 54 20 20  fine MARKUP_DT  
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 34 0a               14.
1630: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 45  #define MARKUP_E
1640: 4d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M               
1650: 31 35 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  15.#define MARKU
1660: 50 5f 46 4f 4e 54 20 20 20 20 20 20 20 20 20 20  P_FONT          
1670: 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 4d 41     16.#define MA
1680: 52 4b 55 50 5f 48 31 20 20 20 20 20 20 20 20 20  RKUP_H1         
1690: 20 20 20 20 20 20 31 37 0a 23 64 65 66 69 6e 65        17.#define
16a0: 20 4d 41 52 4b 55 50 5f 48 32 20 20 20 20 20 20   MARKUP_H2      
16b0: 20 20 20 20 20 20 20 20 20 31 38 0a 23 64 65 66           18.#def
16c0: 69 6e 65 20 4d 41 52 4b 55 50 5f 48 33 20 20 20  ine MARKUP_H3   
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 31 39 0a 23              19.#
16e0: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48 34  define MARKUP_H4
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
1700: 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  0.#define MARKUP
1710: 5f 48 35 20 20 20 20 20 20 20 20 20 20 20 20 20  _H5             
1720: 20 20 32 31 0a 23 64 65 66 69 6e 65 20 4d 41 52    21.#define MAR
1730: 4b 55 50 5f 48 36 20 20 20 20 20 20 20 20 20 20  KUP_H6          
1740: 20 20 20 20 20 32 32 0a 23 64 65 66 69 6e 65 20       22.#define 
1750: 4d 41 52 4b 55 50 5f 48 52 20 20 20 20 20 20 20  MARKUP_HR       
1760: 20 20 20 20 20 20 20 20 32 33 0a 23 64 65 66 69          23.#defi
1770: 6e 65 20 4d 41 52 4b 55 50 5f 49 20 20 20 20 20  ne MARKUP_I     
1780: 20 20 20 20 20 20 20 20 20 20 20 32 34 0a 23 64             24.#d
1790: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 49 4d 47  efine MARKUP_IMG
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 35                25
17b0: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
17c0: 4b 42 44 20 20 20 20 20 20 20 20 20 20 20 20 20  KBD             
17d0: 20 32 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   26.#define MARK
17e0: 55 50 5f 4c 49 20 20 20 20 20 20 20 20 20 20 20  UP_LI           
17f0: 20 20 20 20 32 37 0a 23 64 65 66 69 6e 65 20 4d      27.#define M
1800: 41 52 4b 55 50 5f 4e 4f 42 52 20 20 20 20 20 20  ARKUP_NOBR      
1810: 20 20 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e         28.#defin
1820: 65 20 4d 41 52 4b 55 50 5f 4e 4f 57 49 4b 49 20  e MARKUP_NOWIKI 
1830: 20 20 20 20 20 20 20 20 20 20 32 39 0a 23 64 65            29.#de
1840: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 4f 4c 20 20  fine MARKUP_OL  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 30 0a               30.
1860: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 50  #define MARKUP_P
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 33 31 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  31.#define MARKU
1890: 50 5f 50 52 45 20 20 20 20 20 20 20 20 20 20 20  P_PRE           
18a0: 20 20 20 33 32 0a 23 64 65 66 69 6e 65 20 4d 41     32.#define MA
18b0: 52 4b 55 50 5f 53 20 20 20 20 20 20 20 20 20 20  RKUP_S          
18c0: 20 20 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65        33.#define
18d0: 20 4d 41 52 4b 55 50 5f 53 41 4d 50 20 20 20 20   MARKUP_SAMP    
18e0: 20 20 20 20 20 20 20 20 20 33 34 0a 23 64 65 66           34.#def
18f0: 69 6e 65 20 4d 41 52 4b 55 50 5f 53 4d 41 4c 4c  ine MARKUP_SMALL
1900: 20 20 20 20 20 20 20 20 20 20 20 20 33 35 0a 23              35.#
1910: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53 54  define MARKUP_ST
1920: 52 49 4b 45 20 20 20 20 20 20 20 20 20 20 20 33  RIKE           3
1930: 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  6.#define MARKUP
1940: 5f 53 54 52 4f 4e 47 20 20 20 20 20 20 20 20 20  _STRONG         
1950: 20 20 33 37 0a 23 64 65 66 69 6e 65 20 4d 41 52    37.#define MAR
1960: 4b 55 50 5f 53 55 42 20 20 20 20 20 20 20 20 20  KUP_SUB         
1970: 20 20 20 20 20 33 38 0a 23 64 65 66 69 6e 65 20       38.#define 
1980: 4d 41 52 4b 55 50 5f 53 55 50 20 20 20 20 20 20  MARKUP_SUP      
1990: 20 20 20 20 20 20 20 20 33 39 0a 23 64 65 66 69          39.#defi
19a0: 6e 65 20 4d 41 52 4b 55 50 5f 54 41 42 4c 45 20  ne MARKUP_TABLE 
19b0: 20 20 20 20 20 20 20 20 20 20 20 34 30 0a 23 64             40.#d
19c0: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 54 44 20  efine MARKUP_TD 
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 31                41
19e0: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
19f0: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
1a00: 20 34 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   42.#define MARK
1a10: 55 50 5f 54 52 20 20 20 20 20 20 20 20 20 20 20  UP_TR           
1a20: 20 20 20 20 34 33 0a 23 64 65 66 69 6e 65 20 4d      43.#define M
1a30: 41 52 4b 55 50 5f 54 54 20 20 20 20 20 20 20 20  ARKUP_TT        
1a40: 20 20 20 20 20 20 20 34 34 0a 23 64 65 66 69 6e         44.#defin
1a50: 65 20 4d 41 52 4b 55 50 5f 55 20 20 20 20 20 20  e MARKUP_U      
1a60: 20 20 20 20 20 20 20 20 20 20 34 35 0a 23 64 65            45.#de
1a70: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 55 4c 20 20  fine MARKUP_UL  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 36 0a               46.
1a90: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 56  #define MARKUP_V
1aa0: 41 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AR              
1ab0: 34 37 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  47.#define MARKU
1ac0: 50 5f 56 45 52 42 41 54 49 4d 20 20 20 20 20 20  P_VERBATIM      
1ad0: 20 20 20 34 38 0a 0a 2f 2a 0a 2a 2a 20 54 68 65     48../*.** The
1ae0: 20 76 61 72 69 6f 75 73 20 6d 61 72 6b 75 70 20   various markup 
1af0: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
1b00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
1b10: 70 65 73 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  pes:.*/.#define 
1b20: 4d 55 54 59 50 45 5f 53 49 4e 47 4c 45 20 20 20  MUTYPE_SINGLE   
1b30: 20 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20 3c     0x0001   /* <
1b40: 69 6d 67 3e 2c 20 3c 62 72 3e 2c 20 6f 72 20 3c  img>, <br>, or <
1b50: 68 72 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  hr> */.#define M
1b60: 55 54 59 50 45 5f 42 4c 4f 43 4b 20 20 20 20 20  UTYPE_BLOCK     
1b70: 20 20 30 78 30 30 30 32 20 20 20 2f 2a 20 46 6f    0x0002   /* Fo
1b80: 72 6d 73 20 61 20 6e 65 77 20 70 61 72 61 67 72  rms a new paragr
1b90: 61 70 68 2e 20 65 78 3a 20 3c 70 3e 2c 20 3c 68  aph. ex: <p>, <h
1ba0: 32 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55  2> */.#define MU
1bb0: 54 59 50 45 5f 46 4f 4e 54 20 20 20 20 20 20 20  TYPE_FONT       
1bc0: 20 30 78 30 30 30 34 20 20 20 2f 2a 20 46 6f 6e   0x0004   /* Fon
1bd0: 74 20 63 68 61 6e 67 65 73 2e 20 65 78 3a 20 3c  t changes. ex: <
1be0: 62 3e 2c 20 3c 66 6f 6e 74 3e 2c 20 3c 73 75 62  b>, <font>, <sub
1bf0: 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54  > */.#define MUT
1c00: 59 50 45 5f 4c 49 53 54 20 20 20 20 20 20 20 20  YPE_LIST        
1c10: 30 78 30 30 31 30 20 20 20 2f 2a 20 4c 69 73 74  0x0010   /* List
1c20: 73 2e 20 20 3c 6f 6c 3e 2c 20 3c 75 6c 3e 2c 20  s.  <ol>, <ul>, 
1c30: 6f 72 20 3c 64 6c 3e 20 2a 2f 0a 23 64 65 66 69  or <dl> */.#defi
1c40: 6e 65 20 4d 55 54 59 50 45 5f 4c 49 20 20 20 20  ne MUTYPE_LI    
1c50: 20 20 20 20 20 20 30 78 30 30 32 30 20 20 20 2f        0x0020   /
1c60: 2a 20 4c 69 73 74 20 69 74 65 6d 73 2e 20 20 3c  * List items.  <
1c70: 6c 69 3e 2c 20 3c 64 64 3e 2c 20 3c 64 74 3e 20  li>, <dd>, <dt> 
1c80: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50  */.#define MUTYP
1c90: 45 5f 54 41 42 4c 45 20 20 20 20 20 20 20 30 78  E_TABLE       0x
1ca0: 30 30 34 30 20 20 20 2f 2a 20 3c 74 61 62 6c 65  0040   /* <table
1cb0: 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54  > */.#define MUT
1cc0: 59 50 45 5f 54 52 20 20 20 20 20 20 20 20 20 20  YPE_TR          
1cd0: 30 78 30 30 38 30 20 20 20 2f 2a 20 3c 74 72 3e  0x0080   /* <tr>
1ce0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59   */.#define MUTY
1cf0: 50 45 5f 54 44 20 20 20 20 20 20 20 20 20 20 30  PE_TD          0
1d00: 78 30 31 30 30 20 20 20 2f 2a 20 3c 74 64 3e 20  x0100   /* <td> 
1d10: 6f 72 20 3c 74 68 3e 20 2a 2f 0a 23 64 65 66 69  or <th> */.#defi
1d20: 6e 65 20 4d 55 54 59 50 45 5f 53 50 45 43 49 41  ne MUTYPE_SPECIA
1d30: 4c 20 20 20 20 20 30 78 30 32 30 30 20 20 20 2f  L     0x0200   /
1d40: 2a 20 3c 6e 6f 77 69 6b 69 3e 20 6f 72 20 3c 76  * <nowiki> or <v
1d50: 65 72 62 61 74 69 6d 3e 20 2a 2f 0a 23 64 65 66  erbatim> */.#def
1d60: 69 6e 65 20 4d 55 54 59 50 45 5f 48 59 50 45 52  ine MUTYPE_HYPER
1d70: 4c 49 4e 4b 20 20 20 30 78 30 34 30 30 20 20 20  LINK   0x0400   
1d80: 2f 2a 20 3c 61 3e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  /* <a> */../*.**
1d90: 20 54 68 65 73 65 20 6d 61 72 6b 75 70 20 74 79   These markup ty
1da0: 70 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 6e  pes must have an
1db0: 20 65 6e 64 20 74 61 67 2e 0a 2a 2f 0a 23 64 65   end tag..*/.#de
1dc0: 66 69 6e 65 20 4d 55 54 59 50 45 5f 53 54 41 43  fine MUTYPE_STAC
1dd0: 4b 20 20 28 4d 55 54 59 50 45 5f 42 4c 4f 43 4b  K  (MUTYPE_BLOCK
1de0: 20 7c 20 4d 55 54 59 50 45 5f 46 4f 4e 54 20 7c   | MUTYPE_FONT |
1df0: 20 4d 55 54 59 50 45 5f 4c 49 53 54 20 7c 20 4d   MUTYPE_LIST | M
1e00: 55 54 59 50 45 5f 54 41 42 4c 45 29 0a 0a 2f 2a  UTYPE_TABLE)../*
1e10: 0a 2a 2a 20 54 68 69 73 20 6d 61 72 6b 75 70 20  .** This markup 
1e20: 74 79 70 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  types are allowe
1e30: 64 20 66 6f 72 20 22 69 6e 6c 69 6e 65 22 20 74  d for "inline" t
1e40: 65 78 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ext..*/.#define 
1e50: 4d 55 54 59 50 45 5f 49 4e 4c 49 4e 45 20 28 4d  MUTYPE_INLINE (M
1e60: 55 54 59 50 45 5f 46 4f 4e 54 20 7c 20 4d 55 54  UTYPE_FONT | MUT
1e70: 59 50 45 5f 48 59 50 45 52 4c 49 4e 4b 29 0a 0a  YPE_HYPERLINK)..
1e80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1e90: 75 63 74 20 41 6c 6c 6f 77 65 64 4d 61 72 6b 75  uct AllowedMarku
1ea0: 70 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p {.  const char
1eb0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f   *zName;       /
1ec0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61  * Name of the ma
1ed0: 72 6b 75 70 20 2a 2f 0a 20 20 63 68 61 72 20 69  rkup */.  char i
1ee0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
1ef0: 20 20 20 2f 2a 20 54 68 65 20 4d 41 52 4b 55 50     /* The MARKUP
1f00: 5f 2a 20 63 6f 64 65 20 2a 2f 0a 20 20 73 68 6f  _* code */.  sho
1f10: 72 74 20 69 6e 74 20 69 54 79 70 65 3b 20 20 20  rt int iType;   
1f20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 55 54        /* The MUT
1f30: 59 50 45 5f 2a 20 63 6f 64 65 20 2a 2f 0a 20 20  YPE_* code */.  
1f40: 69 6e 74 20 61 6c 6c 6f 77 65 64 41 74 74 72 3b  int allowedAttr;
1f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1f60: 77 65 64 20 61 74 74 72 69 62 75 74 65 73 20 6f  wed attributes o
1f70: 6e 20 74 68 69 73 20 6d 61 72 6b 75 70 20 2a 2f  n this markup */
1f80: 0a 7d 20 61 4d 61 72 6b 75 70 5b 5d 20 3d 20 7b  .} aMarkup[] = {
1f90: 0a 20 7b 20 30 2c 20 20 20 20 20 20 20 20 20 20  . { 0,          
1fa0: 20 20 20 20 20 4d 41 52 4b 55 50 5f 49 4e 56 41       MARKUP_INVA
1fb0: 4c 49 44 2c 20 20 20 20 20 20 30 2c 20 20 20 20  LID,      0,    
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 30 20 20 7d 2c 0a 20 7b 20 22 61 22 2c 20 20 20  0  },. { "a",   
1fe0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
1ff0: 5f 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  _A,            M
2000: 55 54 59 50 45 5f 48 59 50 45 52 4c 49 4e 4b 2c  UTYPE_HYPERLINK,
2010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2020: 20 20 20 20 20 41 4d 53 4b 5f 48 52 45 46 7c 41       AMSK_HREF|A
2030: 4d 53 4b 5f 4e 41 4d 45 20 7d 2c 0a 20 7b 20 22  MSK_NAME },. { "
2040: 61 64 64 72 65 73 73 22 2c 20 20 20 20 20 20 20  address",       
2050: 4d 41 52 4b 55 50 5f 41 44 44 52 45 53 53 2c 20  MARKUP_ADDRESS, 
2060: 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43       MUTYPE_BLOC
2070: 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  K,         0  },
2080: 0a 20 7b 20 22 62 22 2c 20 20 20 20 20 20 20 20  . { "b",        
2090: 20 20 20 20 20 4d 41 52 4b 55 50 5f 42 2c 20 20       MARKUP_B,  
20a0: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
20b0: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
20c0: 30 20 20 7d 2c 0a 20 7b 20 22 62 69 67 22 2c 20  0  },. { "big", 
20d0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
20e0: 5f 42 49 47 2c 20 20 20 20 20 20 20 20 20 20 4d  _BIG,          M
20f0: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2100: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 62       0  },. { "b
2110: 6c 6f 63 6b 71 75 6f 74 65 22 2c 20 20 20 20 4d  lockquote",    M
2120: 41 52 4b 55 50 5f 42 4c 4f 43 4b 51 55 4f 54 45  ARKUP_BLOCKQUOTE
2130: 2c 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b  ,   MUTYPE_BLOCK
2140: 2c 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ,         0  },.
2150: 20 7b 20 22 62 72 22 2c 20 20 20 20 20 20 20 20   { "br",        
2160: 20 20 20 20 4d 41 52 4b 55 50 5f 42 52 2c 20 20      MARKUP_BR,  
2170: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2180: 53 49 4e 47 4c 45 2c 20 20 20 20 20 20 20 20 41  SINGLE,        A
2190: 4d 53 4b 5f 43 4c 45 41 52 20 20 7d 2c 0a 20 7b  MSK_CLEAR  },. {
21a0: 20 22 63 65 6e 74 65 72 22 2c 20 20 20 20 20 20   "center",      
21b0: 20 20 4d 41 52 4b 55 50 5f 43 45 4e 54 45 52 2c    MARKUP_CENTER,
21c0: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c         MUTYPE_BL
21d0: 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20  OCK,         0  
21e0: 7d 2c 0a 20 7b 20 22 63 69 74 65 22 2c 20 20 20  },. { "cite",   
21f0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 43 49         MARKUP_CI
2200: 54 45 2c 20 20 20 20 20 20 20 20 20 4d 55 54 59  TE,         MUTY
2210: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
2220: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 63 6f 64 65    0  },. { "code
2230: 22 2c 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b  ",          MARK
2240: 55 50 5f 43 4f 44 45 2c 20 20 20 20 20 20 20 20  UP_CODE,        
2250: 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20   MUTYPE_FONT,   
2260: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20         0  },. { 
2270: 22 64 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  "dd",           
2280: 20 4d 41 52 4b 55 50 5f 44 44 2c 20 20 20 20 20   MARKUP_DD,     
2290: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 4c 49 2c        MUTYPE_LI,
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
22b0: 2c 0a 20 7b 20 22 64 66 6e 22 2c 20 20 20 20 20  ,. { "dfn",     
22c0: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 46 4e        MARKUP_DFN
22d0: 2c 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50  ,          MUTYP
22e0: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
22f0: 20 30 20 20 7d 2c 0a 20 7b 20 22 64 69 76 22 2c   0  },. { "div",
2300: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2310: 50 5f 44 49 56 2c 20 20 20 20 20 20 20 20 20 20  P_DIV,          
2320: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
2330: 20 20 20 20 20 20 41 4d 53 4b 5f 49 44 20 20 20        AMSK_ID   
2340: 20 20 20 7d 2c 0a 20 7b 20 22 64 6c 22 2c 20 20     },. { "dl",  
2350: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2360: 5f 44 4c 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _DL,           M
2370: 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20 20  UTYPE_LIST,     
2380: 20 20 20 20 20 41 4d 53 4b 5f 43 4f 4d 50 41 43       AMSK_COMPAC
2390: 54 20 7d 2c 0a 20 7b 20 22 64 74 22 2c 20 20 20  T },. { "dt",   
23a0: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
23b0: 44 54 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55  DT,           MU
23c0: 54 59 50 45 5f 4c 49 2c 20 20 20 20 20 20 20 20  TYPE_LI,        
23d0: 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 65 6d      0  },. { "em
23e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41  ",            MA
23f0: 52 4b 55 50 5f 45 4d 2c 20 20 20 20 20 20 20 20  RKUP_EM,        
2400: 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20     MUTYPE_FONT, 
2410: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20           0  },. 
2420: 7b 20 22 66 6f 6e 74 22 2c 20 20 20 20 20 20 20  { "font",       
2430: 20 20 20 4d 41 52 4b 55 50 5f 46 4f 4e 54 2c 20     MARKUP_FONT, 
2440: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46          MUTYPE_F
2450: 4f 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ONT,.           
2460: 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 43 4f           AMSK_CO
2470: 4c 4f 52 7c 41 4d 53 4b 5f 46 41 43 45 7c 41 4d  LOR|AMSK_FACE|AM
2480: 53 4b 5f 53 49 5a 45 20 20 20 7d 2c 0a 20 7b 20  SK_SIZE   },. { 
2490: 22 68 31 22 2c 20 20 20 20 20 20 20 20 20 20 20  "h1",           
24a0: 20 4d 41 52 4b 55 50 5f 48 31 2c 20 20 20 20 20   MARKUP_H1,     
24b0: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f        MUTYPE_BLO
24c0: 43 4b 2c 20 20 20 20 20 20 20 20 20 41 4d 53 4b  CK,         AMSK
24d0: 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 68  _ALIGN  },. { "h
24e0: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  2",            M
24f0: 41 52 4b 55 50 5f 48 32 2c 20 20 20 20 20 20 20  ARKUP_H2,       
2500: 20 20 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b      MUTYPE_BLOCK
2510: 2c 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 41  ,         AMSK_A
2520: 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 68 33 22  LIGN  },. { "h3"
2530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52  ,            MAR
2540: 4b 55 50 5f 48 33 2c 20 20 20 20 20 20 20 20 20  KUP_H3,         
2550: 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20    MUTYPE_BLOCK, 
2560: 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49          AMSK_ALI
2570: 47 4e 20 20 7d 2c 0a 20 7b 20 22 68 34 22 2c 20  GN  },. { "h4", 
2580: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2590: 50 5f 48 34 2c 20 20 20 20 20 20 20 20 20 20 20  P_H4,           
25a0: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
25b0: 20 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e        AMSK_ALIGN
25c0: 20 20 7d 2c 0a 20 7b 20 22 68 35 22 2c 20 20 20    },. { "h5",   
25d0: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
25e0: 48 35 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55  H5,           MU
25f0: 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20  TYPE_BLOCK,     
2600: 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 20 20      AMSK_ALIGN  
2610: 7d 2c 0a 20 7b 20 22 68 36 22 2c 20 20 20 20 20  },. { "h6",     
2620: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 36         MARKUP_H6
2630: 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59  ,           MUTY
2640: 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20  PE_BLOCK,       
2650: 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 20 20 7d 2c    AMSK_ALIGN  },
2660: 0a 20 7b 20 22 68 72 22 2c 20 20 20 20 20 20 20  . { "hr",       
2670: 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 52 2c 20       MARKUP_HR, 
2680: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2690: 5f 53 49 4e 47 4c 45 2c 20 20 20 20 20 20 20 20  _SINGLE,        
26a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26b0: 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 7c       AMSK_ALIGN|
26c0: 41 4d 53 4b 5f 43 4f 4c 4f 52 7c 41 4d 53 4b 5f  AMSK_COLOR|AMSK_
26d0: 53 49 5a 45 7c 41 4d 53 4b 5f 57 49 44 54 48 20  SIZE|AMSK_WIDTH 
26e0: 20 7d 2c 0a 20 7b 20 22 69 22 2c 20 20 20 20 20   },. { "i",     
26f0: 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 49          MARKUP_I
2700: 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 55 54  ,            MUT
2710: 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20  YPE_FONT,       
2720: 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 69 6d 67     0  },. { "img
2730: 22 2c 20 20 20 20 20 20 20 20 20 20 20 4d 41 52  ",           MAR
2740: 4b 55 50 5f 49 4d 47 2c 20 20 20 20 20 20 20 20  KUP_IMG,        
2750: 20 20 4d 55 54 59 50 45 5f 53 49 4e 47 4c 45 2c    MUTYPE_SINGLE,
2760: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d 53               AMS
2780: 4b 5f 41 4c 49 47 4e 7c 41 4d 53 4b 5f 41 4c 54  K_ALIGN|AMSK_ALT
2790: 7c 41 4d 53 4b 5f 42 4f 52 44 45 52 7c 41 4d 53  |AMSK_BORDER|AMS
27a0: 4b 5f 48 45 49 47 48 54 7c 0a 20 20 20 20 20 20  K_HEIGHT|.      
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d                AM
27c0: 53 4b 5f 48 53 50 41 43 45 7c 41 4d 53 4b 5f 53  SK_HSPACE|AMSK_S
27d0: 52 43 7c 41 4d 53 4b 5f 56 53 50 41 43 45 7c 41  RC|AMSK_VSPACE|A
27e0: 4d 53 4b 5f 57 49 44 54 48 20 20 7d 2c 0a 20 7b  MSK_WIDTH  },. {
27f0: 20 22 6b 62 64 22 2c 20 20 20 20 20 20 20 20 20   "kbd",         
2800: 20 20 4d 41 52 4b 55 50 5f 4b 42 44 2c 20 20 20    MARKUP_KBD,   
2810: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f         MUTYPE_FO
2820: 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  NT,          0  
2830: 7d 2c 0a 20 7b 20 22 6c 69 22 2c 20 20 20 20 20  },. { "li",     
2840: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 4c 49         MARKUP_LI
2850: 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59  ,           MUTY
2860: 50 45 5f 4c 49 2c 20 20 20 20 20 20 20 20 20 20  PE_LI,          
2870: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
2880: 20 20 20 20 20 20 20 41 4d 53 4b 5f 54 59 50 45         AMSK_TYPE
2890: 7c 41 4d 53 4b 5f 56 41 4c 55 45 20 20 7d 2c 0a  |AMSK_VALUE  },.
28a0: 20 7b 20 22 6e 6f 62 72 22 2c 20 20 20 20 20 20   { "nobr",      
28b0: 20 20 20 20 4d 41 52 4b 55 50 5f 4e 4f 42 52 2c      MARKUP_NOBR,
28c0: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
28d0: 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30  FONT,          0
28e0: 20 20 7d 2c 0a 20 7b 20 22 6e 6f 77 69 6b 69 22    },. { "nowiki"
28f0: 2c 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f  ,        MARKUP_
2900: 4e 4f 57 49 4b 49 2c 20 20 20 20 20 20 20 4d 55  NOWIKI,       MU
2910: 54 59 50 45 5f 53 50 45 43 49 41 4c 2c 20 20 20  TYPE_SPECIAL,   
2920: 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 6f 6c      0  },. { "ol
2930: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41  ",            MA
2940: 52 4b 55 50 5f 4f 4c 2c 20 20 20 20 20 20 20 20  RKUP_OL,        
2950: 20 20 20 4d 55 54 59 50 45 5f 4c 49 53 54 2c 20     MUTYPE_LIST, 
2960: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d                AM
2980: 53 4b 5f 53 54 41 52 54 7c 41 4d 53 4b 5f 54 59  SK_START|AMSK_TY
2990: 50 45 7c 41 4d 53 4b 5f 43 4f 4d 50 41 43 54 20  PE|AMSK_COMPACT 
29a0: 20 7d 2c 0a 20 7b 20 22 70 22 2c 20 20 20 20 20   },. { "p",     
29b0: 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 50          MARKUP_P
29c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 55 54  ,            MUT
29d0: 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20  YPE_BLOCK,      
29e0: 20 20 20 41 4d 53 4b 5f 41 4c 49 47 4e 20 20 7d     AMSK_ALIGN  }
29f0: 2c 0a 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20  ,. { "pre",     
2a00: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 50 52 45        MARKUP_PRE
2a10: 2c 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50  ,          MUTYP
2a20: 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20  E_BLOCK,        
2a30: 20 30 20 20 7d 2c 0a 20 7b 20 22 73 22 2c 20 20   0  },. { "s",  
2a40: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2a50: 50 5f 53 2c 20 20 20 20 20 20 20 20 20 20 20 20  P_S,            
2a60: 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20  MUTYPE_FONT,    
2a70: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
2a80: 73 61 6d 70 22 2c 20 20 20 20 20 20 20 20 20 20  samp",          
2a90: 4d 41 52 4b 55 50 5f 53 41 4d 50 2c 20 20 20 20  MARKUP_SAMP,    
2aa0: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
2ab0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2ac0: 0a 20 7b 20 22 73 6d 61 6c 6c 22 2c 20 20 20 20  . { "small",    
2ad0: 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 4d 41 4c       MARKUP_SMAL
2ae0: 4c 2c 20 20 20 20 20 20 20 20 4d 55 54 59 50 45  L,        MUTYPE
2af0: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
2b00: 30 20 20 7d 2c 0a 20 7b 20 22 73 74 72 69 6b 65  0  },. { "strike
2b10: 22 2c 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50  ",        MARKUP
2b20: 5f 53 54 52 49 4b 45 2c 20 20 20 20 20 20 20 4d  _STRIKE,       M
2b30: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2b40: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 73       0  },. { "s
2b50: 74 72 6f 6e 67 22 2c 20 20 20 20 20 20 20 20 4d  trong",        M
2b60: 41 52 4b 55 50 5f 53 54 52 4f 4e 47 2c 20 20 20  ARKUP_STRONG,   
2b70: 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c      MUTYPE_FONT,
2b80: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2b90: 20 7b 20 22 73 75 62 22 2c 20 20 20 20 20 20 20   { "sub",       
2ba0: 20 20 20 20 4d 41 52 4b 55 50 5f 53 55 42 2c 20      MARKUP_SUB, 
2bb0: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2bc0: 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30  FONT,          0
2bd0: 20 20 7d 2c 0a 20 7b 20 22 73 75 70 22 2c 20 20    },. { "sup",  
2be0: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2bf0: 53 55 50 2c 20 20 20 20 20 20 20 20 20 20 4d 55  SUP,          MU
2c00: 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20  TYPE_FONT,      
2c10: 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 74 61      0  },. { "ta
2c20: 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 4d 41  ble",         MA
2c30: 52 4b 55 50 5f 54 41 42 4c 45 2c 20 20 20 20 20  RKUP_TABLE,     
2c40: 20 20 20 4d 55 54 59 50 45 5f 54 41 42 4c 45 2c     MUTYPE_TABLE,
2c50: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4d                AM
2c70: 53 4b 5f 41 4c 49 47 4e 7c 41 4d 53 4b 5f 42 47  SK_ALIGN|AMSK_BG
2c80: 43 4f 4c 4f 52 7c 41 4d 53 4b 5f 42 4f 52 44 45  COLOR|AMSK_BORDE
2c90: 52 7c 41 4d 53 4b 5f 43 45 4c 4c 50 41 44 44 49  R|AMSK_CELLPADDI
2ca0: 4e 47 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  NG|.            
2cb0: 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 43 45 4c          AMSK_CEL
2cc0: 4c 53 50 41 43 49 4e 47 7c 41 4d 53 4b 5f 48 53  LSPACING|AMSK_HS
2cd0: 50 41 43 45 7c 41 4d 53 4b 5f 56 53 50 41 43 45  PACE|AMSK_VSPACE
2ce0: 20 20 7d 2c 0a 20 7b 20 22 74 64 22 2c 20 20 20    },. { "td",   
2cf0: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2d00: 54 44 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55  TD,           MU
2d10: 54 59 50 45 5f 54 44 2c 20 20 20 20 20 20 20 20  TYPE_TD,        
2d20: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
2d30: 20 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 41 4c           AMSK_AL
2d40: 49 47 4e 7c 41 4d 53 4b 5f 42 47 43 4f 4c 4f 52  IGN|AMSK_BGCOLOR
2d50: 7c 41 4d 53 4b 5f 43 4f 4c 53 50 41 4e 7c 0a 20  |AMSK_COLSPAN|. 
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 41 4d 53 4b 5f 52 4f 57 53 50 41 4e 7c     AMSK_ROWSPAN|
2d80: 41 4d 53 4b 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a  AMSK_VALIGN  },.
2d90: 20 7b 20 22 74 68 22 2c 20 20 20 20 20 20 20 20   { "th",        
2da0: 20 20 20 20 4d 41 52 4b 55 50 5f 54 48 2c 20 20      MARKUP_TH,  
2db0: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2dc0: 54 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TD,.            
2dd0: 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49          AMSK_ALI
2de0: 47 4e 7c 41 4d 53 4b 5f 42 47 43 4f 4c 4f 52 7c  GN|AMSK_BGCOLOR|
2df0: 41 4d 53 4b 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20  AMSK_COLSPAN|.  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 41 4d 53 4b 5f 52 4f 57 53 50 41 4e 7c 41    AMSK_ROWSPAN|A
2e20: 4d 53 4b 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a 20  MSK_VALIGN  },. 
2e30: 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20 20  { "tr",         
2e40: 20 20 20 4d 41 52 4b 55 50 5f 54 52 2c 20 20 20     MARKUP_TR,   
2e50: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 54          MUTYPE_T
2e60: 52 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  R, .            
2e70: 20 20 20 20 20 20 20 20 41 4d 53 4b 5f 41 4c 49          AMSK_ALI
2e80: 47 4e 7c 41 4d 53 4b 5f 42 47 43 4f 4c 4f 52 7c  GN|AMSK_BGCOLOR|
2e90: 7c 41 4d 53 4b 5f 56 41 4c 49 47 4e 20 20 7d 2c  |AMSK_VALIGN  },
2ea0: 0a 20 7b 20 22 74 74 22 2c 20 20 20 20 20 20 20  . { "tt",       
2eb0: 20 20 20 20 20 4d 41 52 4b 55 50 5f 54 54 2c 20       MARKUP_TT, 
2ec0: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2ed0: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
2ee0: 30 20 20 7d 2c 0a 20 7b 20 22 75 22 2c 20 20 20  0  },. { "u",   
2ef0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2f00: 5f 55 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  _U,            M
2f10: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2f20: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 75       0  },. { "u
2f30: 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  l",            M
2f40: 41 52 4b 55 50 5f 55 4c 2c 20 20 20 20 20 20 20  ARKUP_UL,       
2f50: 20 20 20 20 4d 55 54 59 50 45 5f 4c 49 53 54 2c      MUTYPE_LIST,
2f60: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
2f80: 4d 53 4b 5f 54 59 50 45 7c 41 4d 53 4b 5f 43 4f  MSK_TYPE|AMSK_CO
2f90: 4d 50 41 43 54 20 20 7d 2c 0a 20 7b 20 22 76 61  MPACT  },. { "va
2fa0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 4d 41  r",           MA
2fb0: 52 4b 55 50 5f 56 41 52 2c 20 20 20 20 20 20 20  RKUP_VAR,       
2fc0: 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20     MUTYPE_FONT, 
2fd0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20           0  },. 
2fe0: 7b 20 22 76 65 72 62 61 74 69 6d 22 2c 20 20 20  { "verbatim",   
2ff0: 20 20 20 4d 41 52 4b 55 50 5f 56 45 52 42 41 54     MARKUP_VERBAT
3000: 49 4d 2c 20 20 20 20 20 4d 55 54 59 50 45 5f 53  IM,     MUTYPE_S
3010: 50 45 43 49 41 4c 2c 20 20 20 20 20 20 20 41 4d  PECIAL,       AM
3020: 53 4b 5f 49 44 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a  SK_ID },.};../*.
3030: 2a 2a 20 55 73 65 20 62 69 6e 61 72 79 20 73 65  ** Use binary se
3040: 61 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20 61  arch to locate a
3050: 20 74 61 67 20 69 6e 20 74 68 65 20 61 4d 61 72   tag in the aMar
3060: 6b 75 70 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a  kup[] table..*/.
3070: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 54  static int findT
3080: 61 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ag(const char *z
3090: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 2c 20 66  ){.  int i, c, f
30a0: 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 66 69  irst, last;.  fi
30b0: 72 73 74 20 3d 20 31 3b 0a 20 20 6c 61 73 74 20  rst = 1;.  last 
30c0: 3d 20 73 69 7a 65 6f 66 28 61 4d 61 72 6b 75 70  = sizeof(aMarkup
30d0: 29 2f 73 69 7a 65 6f 66 28 61 4d 61 72 6b 75 70  )/sizeof(aMarkup
30e0: 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c  [0]) - 1;.  whil
30f0: 65 28 20 66 69 72 73 74 3c 3d 6c 61 73 74 20 29  e( first<=last )
3100: 7b 0a 20 20 20 20 69 20 3d 20 28 66 69 72 73 74  {.    i = (first
3110: 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20 20 63 20  +last)/2;.    c 
3120: 3d 20 73 74 72 63 6d 70 28 61 4d 61 72 6b 75 70  = strcmp(aMarkup
3130: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 29 3b 0a 20  [i].zName, z);. 
3140: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
3150: 20 20 20 20 20 61 73 73 65 72 74 28 20 61 4d 61       assert( aMa
3160: 72 6b 75 70 5b 69 5d 2e 69 43 6f 64 65 3d 3d 69  rkup[i].iCode==i
3170: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
3180: 20 69 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   i;.    }else if
3190: 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 66  ( c<0 ){.      f
31a0: 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  irst = i+1;.    
31b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
31c0: 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20 7d 0a 20  t = i-1;.    }. 
31d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 4d 41 52 4b   }.  return MARK
31e0: 55 50 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  UP_INVALID;.}../
31f0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 20 74 79 70 65 73  *.** Token types
3200: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45  .*/.#define TOKE
3210: 4e 5f 4d 41 52 4b 55 50 20 20 20 20 20 20 20 20  N_MARKUP        
3220: 31 20 20 20 20 2f 2a 20 3c 2e 2e 2e 3e 20 2a 2f  1    /* <...> */
3230: 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 43  .#define TOKEN_C
3240: 48 41 52 41 43 54 45 52 20 20 20 20 20 32 20 20  HARACTER     2  
3250: 20 20 2f 2a 20 22 26 22 20 6f 72 20 22 3c 22 20    /* "&" or "<" 
3260: 6e 6f 74 20 70 61 72 74 20 6f 66 20 6d 61 72 6b  not part of mark
3270: 75 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f  up */.#define TO
3280: 4b 45 4e 5f 4c 49 4e 4b 20 20 20 20 20 20 20 20  KEN_LINK        
3290: 20 20 33 20 20 20 20 2f 2a 20 5b 2e 2e 2e 5d 20    3    /* [...] 
32a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e  */.#define TOKEN
32b0: 5f 50 41 52 41 47 52 41 50 48 20 20 20 20 20 34  _PARAGRAPH     4
32c0: 20 20 20 20 2f 2a 20 62 6c 61 6e 6b 20 6c 69 6e      /* blank lin
32d0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f  es */.#define TO
32e0: 4b 45 4e 5f 4e 45 57 4c 49 4e 45 20 20 20 20 20  KEN_NEWLINE     
32f0: 20 20 35 20 20 20 20 2f 2a 20 41 20 73 69 6e 67    5    /* A sing
3300: 6c 65 20 22 5c 6e 22 20 2a 2f 0a 23 64 65 66 69  le "\n" */.#defi
3310: 6e 65 20 54 4f 4b 45 4e 5f 42 55 4c 4c 45 54 20  ne TOKEN_BULLET 
3320: 20 20 20 20 20 20 20 36 20 20 20 20 2f 2a 20 20         6    /*  
3330: 22 20 20 2a 20 20 22 20 2a 2f 0a 23 64 65 66 69  "  *  " */.#defi
3340: 6e 65 20 54 4f 4b 45 4e 5f 45 4e 55 4d 20 20 20  ne TOKEN_ENUM   
3350: 20 20 20 20 20 20 20 37 20 20 20 20 2f 2a 20 20         7    /*  
3360: 22 20 20 5c 28 3f 5c 64 2b 5b 2e 29 5d 3f 20 20  "  \(?\d+[.)]?  
3370: 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b  " */.#define TOK
3380: 45 4e 5f 49 4e 44 45 4e 54 20 20 20 20 20 20 20  EN_INDENT       
3390: 20 38 20 20 20 20 2f 2a 20 20 22 20 20 20 22 20   8    /*  "   " 
33a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e  */.#define TOKEN
33b0: 5f 54 45 58 54 20 20 20 20 20 20 20 20 20 20 39  _TEXT          9
33c0: 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74      /* None of t
33d0: 68 65 20 61 62 6f 76 65 20 2a 2f 0a 0a 2f 2a 0a  he above */../*.
33e0: 2a 2a 20 53 74 61 74 65 20 66 6c 61 67 73 0a 2a  ** State flags.*
33f0: 2f 0a 23 64 65 66 69 6e 65 20 41 54 5f 4e 45 57  /.#define AT_NEW
3400: 4c 49 4e 45 20 20 20 20 20 20 20 20 20 20 30 78  LINE          0x
3410: 30 30 31 20 20 2f 2a 20 41 74 20 73 74 61 72 74  001  /* At start
3420: 20 6f 66 20 61 20 6c 69 6e 65 20 2a 2f 0a 23 64   of a line */.#d
3430: 65 66 69 6e 65 20 41 54 5f 50 41 52 41 47 52 41  efine AT_PARAGRA
3440: 50 48 20 20 20 20 20 20 20 20 30 78 30 30 32 20  PH        0x002 
3450: 20 2f 2a 20 41 74 20 73 74 61 72 74 20 6f 66 20   /* At start of 
3460: 61 20 70 61 72 61 67 72 61 70 68 20 2a 2f 0a 23  a paragraph */.#
3470: 64 65 66 69 6e 65 20 41 4c 4c 4f 57 5f 57 49 4b  define ALLOW_WIK
3480: 49 20 20 20 20 20 20 20 20 20 20 30 78 30 30 34  I          0x004
3490: 20 20 2f 2a 20 41 6c 6c 6f 77 20 77 69 6b 69 20    /* Allow wiki 
34a0: 6d 61 72 6b 75 70 20 2a 2f 0a 23 64 65 66 69 6e  markup */.#defin
34b0: 65 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f 4f 4e  e FONT_MARKUP_ON
34c0: 4c 59 20 20 20 20 30 78 30 30 38 20 20 2f 2a 20  LY    0x008  /* 
34d0: 4f 6e 6c 79 20 61 6c 6c 6f 77 20 4d 55 54 59 50  Only allow MUTYP
34e0: 45 5f 46 4f 4e 54 20 6d 61 72 6b 75 70 20 2a 2f  E_FONT markup */
34f0: 0a 23 64 65 66 69 6e 65 20 49 4e 4c 49 4e 45 5f  .#define INLINE_
3500: 4d 41 52 4b 55 50 5f 4f 4e 4c 59 20 20 30 78 30  MARKUP_ONLY  0x0
3510: 31 30 20 20 2f 2a 20 41 6c 6c 6f 77 20 6f 6e 6c  10  /* Allow onl
3520: 79 20 22 69 6e 6c 69 6e 65 22 20 6d 61 72 6b 75  y "inline" marku
3530: 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 5f  p */.#define IN_
3540: 4c 49 53 54 20 20 20 20 20 20 20 20 20 20 20 20  LIST            
3550: 20 30 78 30 32 30 20 20 2f 2a 20 57 69 74 68 69   0x020  /* Withi
3560: 6e 20 77 69 6b 69 20 3c 75 6c 3e 20 6f 72 20 3c  n wiki <ul> or <
3570: 6f 6c 3e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 75  ol> */../*.** Cu
3580: 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
3590: 68 65 20 72 65 6e 64 65 72 69 6e 67 20 65 6e 67  he rendering eng
35a0: 69 6e 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ine.*/.typedef s
35b0: 74 72 75 63 74 20 52 65 6e 64 65 72 65 72 20 52  truct Renderer R
35c0: 65 6e 64 65 72 65 72 3b 0a 73 74 72 75 63 74 20  enderer;.struct 
35d0: 52 65 6e 64 65 72 65 72 20 7b 0a 20 20 42 6c 6f  Renderer {.  Blo
35e0: 62 20 2a 70 4f 75 74 3b 20 20 20 20 20 20 20 20  b *pOut;        
35f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
3600: 75 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ut appended to t
3610: 68 69 73 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e  his blob */.  in
3620: 74 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  t state;        
3630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
3640: 67 20 74 68 61 74 20 67 6f 76 65 72 6e 20 72 65  g that govern re
3650: 6e 64 65 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ndering */.  int
3660: 20 77 69 6b 69 4c 69 73 74 3b 20 20 20 20 20 20   wikiList;      
3670: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
3680: 65 6e 74 20 77 69 6b 69 20 6c 69 73 74 20 74 79  ent wiki list ty
3690: 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 56 65  pe */.  int inVe
36a0: 72 62 61 74 69 6d 3b 20 20 20 20 20 20 20 20 20  rbatim;         
36b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 3c      /* True in <
36c0: 76 65 72 62 61 74 69 6d 3e 20 6d 6f 64 65 20 2a  verbatim> mode *
36d0: 2f 0a 20 20 69 6e 74 20 70 72 65 56 65 72 62 53  /.  int preVerbS
36e0: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
36f0: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 73 74 61 74  /* Value of stat
3700: 65 20 70 72 69 6f 72 20 74 6f 20 76 65 72 62 61  e prior to verba
3710: 74 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 77 61 6e  tim */.  int wan
3720: 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 3b 20  tAutoParagraph; 
3730: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3740: 61 20 3c 70 3e 20 69 73 20 64 65 73 69 72 65 64  a <p> is desired
3750: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 41 75 74 6f   */.  int inAuto
3760: 50 61 72 61 67 72 61 70 68 3b 20 20 20 20 20 20  Paragraph;      
3770: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 69 74    /* True if wit
3780: 68 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  hin an automatic
3790: 20 70 61 72 61 67 72 61 70 68 20 2a 2f 0a 20 20   paragraph */.  
37a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 65 72  const char *zVer
37b0: 62 61 74 69 6d 49 64 3b 20 20 20 20 2f 2a 20 54  batimId;    /* T
37c0: 68 65 20 69 64 3d 20 61 74 74 72 69 62 75 74 65  he id= attribute
37d0: 20 6f 66 20 3c 76 65 72 62 61 74 69 6d 3e 20 2a   of <verbatim> *
37e0: 2f 0a 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20  /.  int nStack; 
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
3810: 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 73 74 61  ments on the sta
3820: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  ck */.  int nAll
3830: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3840: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
3850: 6f 63 61 74 65 64 20 66 6f 72 20 61 53 74 61 63  ocated for aStac
3860: 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 53  k */.  struct sS
3870: 74 61 63 6b 20 7b 0a 20 20 20 20 73 68 6f 72 74  tack {.    short
3880: 20 69 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20   iCode;         
3890: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 75          /* Marku
38a0: 70 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 68  p code */.    sh
38b0: 6f 72 74 20 61 6c 6c 6f 77 57 69 6b 69 3b 20 20  ort allowWiki;  
38c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4c             /* AL
38d0: 4c 4f 57 5f 57 49 4b 49 20 69 66 20 77 69 6b 69  LOW_WIKI if wiki
38e0: 20 61 6c 6c 6f 77 65 64 20 62 65 66 6f 72 65 20   allowed before 
38f0: 74 61 67 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  tag */.    const
3900: 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
3910: 20 20 20 20 20 20 20 20 2f 2a 20 49 44 20 61 74          /* ID at
3920: 74 72 69 62 75 74 65 20 6f 72 20 4e 55 4c 4c 20  tribute or NULL 
3930: 2a 2f 0a 20 20 7d 20 2a 61 53 74 61 63 6b 3b 0a  */.  } *aStack;.
3940: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 7a 20 70 6f 69  };.../*.** z poi
3950: 6e 74 73 20 74 6f 20 61 20 22 3c 22 20 63 68 61  nts to a "<" cha
3960: 72 61 63 74 65 72 2e 20 20 43 68 65 63 6b 20 74  racter.  Check t
3970: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
3980: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
3990: 20 61 20 76 61 6c 69 64 20 6d 61 72 6b 75 70 2e   a valid markup.
39a0: 20 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75    If it is, retu
39b0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
39c0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
39d0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 72 6b  s in.** the mark
39e0: 75 70 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  up including the
39f0: 20 69 6e 69 74 69 61 6c 20 22 3c 22 20 61 6e 64   initial "<" and
3a00: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67   the terminating
3a10: 20 22 3e 22 2e 20 20 49 66 0a 2a 2a 20 69 74 20   ">".  If.** it 
3a20: 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d  is not well-form
3a30: 65 64 20 6d 61 72 6b 75 70 2c 20 72 65 74 75 72  ed markup, retur
3a40: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
3a50: 6e 74 20 6d 61 72 6b 75 70 4c 65 6e 67 74 68 28  nt markupLength(
3a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
3a70: 20 20 69 6e 74 20 6e 20 3d 20 31 3b 0a 20 20 69    int n = 1;.  i
3a80: 6e 74 20 69 6e 70 61 72 65 6e 20 3d 20 30 3b 0a  nt inparen = 0;.
3a90: 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 2f 27 20    if( z[n]=='/' 
3aa0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 69 66 28 20  ){ n++; }.  if( 
3ab0: 21 69 73 61 6c 70 68 61 28 7a 5b 6e 5d 29 20 29  !isalpha(z[n]) )
3ac0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
3ad0: 6c 65 28 20 69 73 61 6c 6e 75 6d 28 7a 5b 6e 5d  le( isalnum(z[n]
3ae0: 29 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 69 66  ) ){ n++; }.  if
3af0: 28 20 7a 5b 6e 5d 21 3d 27 3e 27 20 26 26 20 21  ( z[n]!='>' && !
3b00: 69 73 73 70 61 63 65 28 7a 5b 6e 5d 29 20 29 20  isspace(z[n]) ) 
3b10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
3b20: 65 28 20 7a 5b 6e 5d 20 26 26 20 28 7a 5b 6e 5d  e( z[n] && (z[n]
3b30: 21 3d 27 3e 27 20 7c 7c 20 69 6e 70 61 72 65 6e  !='>' || inparen
3b40: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 6e  ) ){.    if( z[n
3b50: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  ]=='"' ){.      
3b60: 69 6e 70 61 72 65 6e 20 3d 20 21 69 6e 70 61 72  inparen = !inpar
3b70: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 2b  en;.    }.    n+
3b80: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 5b 6e  +;.  }.  if( z[n
3b90: 5d 21 3d 27 3e 27 20 29 20 72 65 74 75 72 6e 20  ]!='>' ) return 
3ba0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6e 2b 31 3b  0;.  return n+1;
3bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 20 70 6f 69 6e  .}../*.** z poin
3bc0: 74 73 20 74 6f 20 61 20 22 5c 6e 22 20 63 68 61  ts to a "\n" cha
3bd0: 72 61 63 74 65 72 2e 20 20 43 68 65 63 6b 20 74  racter.  Check t
3be0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 6e 65  o see if this ne
3bf0: 77 6c 69 6e 65 20 69 73 0a 2a 2a 20 66 6f 6c 6c  wline is.** foll
3c00: 6f 77 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  owed by one or m
3c10: 6f 72 65 20 62 6c 61 6e 6b 20 6c 69 6e 65 73 2e  ore blank lines.
3c20: 20 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75    If it is, retu
3c30: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
3c40: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
3c50: 68 72 6f 75 67 68 20 74 68 65 20 63 6c 6f 73 69  hrough the closi
3c60: 6e 67 20 22 5c 6e 22 2e 20 20 49 66 20 6e 6f 74  ng "\n".  If not
3c70: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3c80: 74 61 74 69 63 20 69 6e 74 20 70 61 72 61 67 72  tatic int paragr
3c90: 61 70 68 42 72 65 61 6b 4c 65 6e 67 74 68 28 63  aphBreakLength(c
3ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
3cb0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74   int i, n;.  int
3cc0: 20 6e 4e 65 77 6c 69 6e 65 20 3d 20 31 3b 0a 20   nNewline = 1;. 
3cd0: 20 66 6f 72 28 69 3d 31 2c 20 6e 3d 30 3b 20 69   for(i=1, n=0; i
3ce0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
3cf0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
3d00: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
3d10: 6e 4e 65 77 6c 69 6e 65 2b 2b 3b 0a 20 20 20 20  nNewline++;.    
3d20: 20 20 6e 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    n = i;.    }. 
3d30: 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 6c 69 6e   }.  if( nNewlin
3d40: 65 3e 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  e>=2 ){.    retu
3d50: 72 6e 20 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  rn n+1;.  }else{
3d60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3d70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3d80: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
3d90: 20 63 68 61 72 61 63 74 65 72 73 20 75 6e 74 69   characters unti
3da0: 6c 20 74 68 65 20 6e 65 78 74 20 22 69 6e 74 65  l the next "inte
3db0: 72 65 73 74 69 6e 67 22 0a 2a 2a 20 63 68 61 72  resting".** char
3dc0: 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  acters..**.** In
3dd0: 74 65 72 65 73 74 69 6e 67 20 63 68 61 72 61 63  teresting charac
3de0: 74 65 72 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ters are:.**.** 
3df0: 20 20 20 20 20 3c 0a 2a 2a 20 20 20 20 20 20 26       <.**      &
3e00: 0a 2a 2a 20 20 20 20 20 20 5c 6e 0a 2a 2a 20 20  .**      \n.**  
3e10: 20 20 20 20 5b 0a 2a 2a 0a 2a 2a 20 54 68 65 20      [.**.** The 
3e20: 22 5b 22 20 61 6e 64 20 22 5c 6e 22 20 61 72 65  "[" and "\n" are
3e30: 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
3e40: 20 69 6e 74 65 72 65 73 74 69 6e 67 20 69 66 20   interesting if 
3e50: 74 68 65 20 22 75 73 65 57 69 6b 69 22 0a 2a 2a  the "useWiki".**
3e60: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2f   flag is set..*/
3e70: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 78 74  .static int text
3e80: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
3e90: 72 20 2a 7a 2c 20 69 6e 74 20 75 73 65 57 69 6b  r *z, int useWik
3ea0: 69 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  i){.  int n = 0;
3eb0: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 77 68 69 6c  .  int c;.  whil
3ec0: 65 28 20 28 63 20 3d 20 7a 5b 30 5d 29 21 3d 30  e( (c = z[0])!=0
3ed0: 20 26 26 20 63 21 3d 27 3c 27 20 26 26 20 63 21   && c!='<' && c!
3ee0: 3d 27 26 27 20 26 26 0a 20 20 20 20 20 20 20 20  ='&' &&.        
3ef0: 20 20 20 20 20 20 20 28 75 73 65 57 69 6b 69 3d         (useWiki=
3f00: 3d 30 20 7c 7c 20 28 63 21 3d 27 5b 27 20 26 26  =0 || (c!='[' &&
3f10: 20 63 21 3d 27 5c 6e 27 29 29 20 29 7b 0a 20 20   c!='\n')) ){.  
3f20: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7a 2b 2b 3b 0a    n++;.    z++;.
3f30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 20    }.  return n; 
3f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3f50: 20 74 72 75 65 20 69 66 20 7a 5b 5d 20 62 65 67   true if z[] beg
3f60: 69 6e 73 20 77 69 74 68 20 61 6e 20 48 54 4d 4c  ins with an HTML
3f70: 20 63 68 61 72 61 63 74 65 72 20 65 6c 65 6d 65   character eleme
3f80: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
3f90: 74 20 69 73 45 6c 65 6d 65 6e 74 28 63 6f 6e 73  t isElement(cons
3fa0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
3fb0: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
3fc0: 5b 30 5d 3d 3d 27 26 27 20 29 3b 0a 20 20 69 66  [0]=='&' );.  if
3fd0: 28 20 7a 5b 31 5d 3d 3d 27 23 27 20 29 7b 0a 20  ( z[1]=='#' ){. 
3fe0: 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 73 64 69     for(i=2; isdi
3ff0: 67 69 74 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  git(z[i]); i++){
4000: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3e 32  }.    return i>2
4010: 20 26 26 20 7a 5b 69 5d 3d 3d 27 3b 27 3b 0a 20   && z[i]==';';. 
4020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
4030: 69 3d 31 3b 20 69 73 61 6c 70 68 61 28 7a 5b 69  i=1; isalpha(z[i
4040: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 72  ]); i++){}.    r
4050: 65 74 75 72 6e 20 69 3e 31 20 26 26 20 7a 5b 69  eturn i>1 && z[i
4060: 5d 3d 3d 27 3b 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ]==';';.  }.}../
4070: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
4080: 65 20 69 66 20 74 68 65 20 7a 5b 5d 20 73 74 72  e if the z[] str
4090: 69 6e 67 20 69 73 20 74 68 65 20 62 65 67 69 6e  ing is the begin
40a0: 6e 69 6e 67 20 6f 66 20 61 20 77 69 6b 69 20 62  ning of a wiki b
40b0: 75 6c 6c 65 74 2e 0a 2a 2a 20 49 66 20 69 74 20  ullet..** If it 
40c0: 69 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6c  is, return the l
40d0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 62 75 6c  ength of the bul
40e0: 6c 65 74 20 74 65 78 74 2e 20 20 4f 74 68 65 72  let text.  Other
40f0: 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
4100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 75 6c  /.static int bul
4110: 6c 65 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  letLength(const 
4120: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
4130: 69 2c 20 6e 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  i, n;.  n = 0;. 
4140: 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
4150: 20 7a 5b 6e 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b   z[n]==' ' || z[
4160: 6e 5d 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20  n]=='\t' ){.    
4170: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29  if( z[n]=='\t' )
4180: 20 69 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   i++;.    i++;. 
4190: 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66     n++;.  }.  if
41a0: 28 20 69 3c 32 20 7c 7c 20 7a 5b 6e 5d 21 3d 27  ( i<2 || z[n]!='
41b0: 2a 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  *' ) return 0;. 
41c0: 20 6e 2b 2b 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   n++;.  i = 0;. 
41d0: 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20   while( z[n]==' 
41e0: 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20  ' || z[n]=='\t' 
41f0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d  ){.    if( z[n]=
4200: 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\t' ) i++;.   
4210: 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20   i++;.    n++;. 
4220: 20 7d 0a 20 20 69 66 28 20 69 3c 32 20 7c 7c 20   }.  if( i<2 || 
4230: 69 73 73 70 61 63 65 28 7a 5b 6e 5d 29 20 29 20  isspace(z[n]) ) 
4240: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
4250: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn n;.}../*.** C
4260: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
4270: 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 69 73  he z[] string is
4280: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
4290: 66 20 61 20 65 6e 75 6d 65 72 61 74 69 6f 6e 20  f a enumeration 
42a0: 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 69 74 20  value..** If it 
42b0: 69 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6c  is, return the l
42c0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 62 75 6c  ength of the bul
42d0: 6c 65 74 20 74 65 78 74 2e 20 20 4f 74 68 65 72  let text.  Other
42e0: 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
42f0: 2a 0a 2a 2a 20 53 79 6e 74 61 78 3a 0a 2a 2a 20  *.** Syntax:.** 
4300: 20 20 20 2a 20 20 61 20 74 61 62 20 6f 72 20 74     *  a tab or t
4310: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63 65  wo or more space
4320: 73 0a 2a 2a 20 20 20 20 2a 20 20 6f 6e 65 20 6f  s.**    *  one o
4330: 72 20 6d 6f 72 65 20 64 69 67 69 74 73 0a 2a 2a  r more digits.**
4340: 20 20 20 20 2a 20 20 6f 70 74 69 6f 6e 61 6c 20      *  optional 
4350: 22 2e 22 0a 2a 2a 20 20 20 20 2a 20 20 61 6e 6f  ".".**    *  ano
4360: 74 68 65 72 20 74 61 62 20 6f 72 20 74 77 6f 20  ther tab or two 
4370: 6f 72 65 20 6d 6f 72 65 20 73 70 61 63 65 73 2e  ore more spaces.
4380: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
4390: 74 20 65 6e 75 6d 4c 65 6e 67 74 68 28 63 6f 6e  t enumLength(con
43a0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
43b0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 6e 20 3d 20 30  nt i, n;.  n = 0
43c0: 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  i = 0;.  whi
43d0: 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20 27 20 7c 7c  le( z[n]==' ' ||
43e0: 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 7b 0a 20   z[n]=='\t' ){. 
43f0: 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 74     if( z[n]=='\t
4400: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 2b 2b  ' ) i++;.    i++
4410: 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  ;.    n++;.  }. 
4420: 20 69 66 28 20 69 3c 32 20 29 20 72 65 74 75 72   if( i<2 ) retur
4430: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
4440: 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 3b 20 69  isdigit(z[n]); i
4450: 2b 2b 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28  ++, n++){}.  if(
4460: 20 69 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   i==0 ) return 0
4470: 3b 0a 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 2e  ;.  if( z[n]=='.
4480: 27 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ' ){.    n++;.  
4490: 7d 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  }.  i = 0;.  whi
44a0: 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20 27 20 7c 7c  le( z[n]==' ' ||
44b0: 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 7b 0a 20   z[n]=='\t' ){. 
44c0: 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 74     if( z[n]=='\t
44d0: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 2b 2b  ' ) i++;.    i++
44e0: 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  ;.    n++;.  }. 
44f0: 20 69 66 28 20 69 3c 32 20 7c 7c 20 69 73 73 70   if( i<2 || issp
4500: 61 63 65 28 7a 5b 6e 5d 29 20 29 20 72 65 74 75  ace(z[n]) ) retu
4510: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rn 0;.  return n
4520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
4530: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 7a   to see if the z
4540: 5b 5d 20 73 74 72 69 6e 67 20 69 73 20 74 68 65  [] string is the
4550: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
4560: 20 69 6e 64 65 6e 74 65 64 0a 2a 2a 20 70 61 72   indented.** par
4570: 61 67 72 61 70 68 2e 20 20 49 66 20 69 74 20 69  agraph.  If it i
4580: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6c 65  s, return the le
4590: 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 64 65  ngth of the inde
45a0: 6e 74 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  nt.  Otherwise.*
45b0: 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  * return 0..*/.s
45c0: 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 6e 74  tatic int indent
45d0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
45e0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  r *z){.  int i, 
45f0: 6e 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 20  n;.  n = 0;.  i 
4600: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b  = 0;.  while( z[
4610: 6e 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d  n]==' ' || z[n]=
4620: 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 69 66 28  ='\t' ){.    if(
4630: 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 20 69 2b   z[n]=='\t' ) i+
4640: 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  +;.    i++;.    
4650: 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  n++;.  }.  if( i
4660: 3c 32 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  <2 || isspace(z[
4670: 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n]) ) return 0;.
4680: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
4690: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
46a0: 65 20 69 66 20 74 68 65 20 7a 5b 5d 20 73 74 72  e if the z[] str
46b0: 69 6e 67 20 69 73 20 61 20 77 69 6b 69 20 68 79  ing is a wiki hy
46c0: 70 65 72 6c 69 6e 6b 2e 20 20 49 66 20 69 74 20  perlink.  If it 
46d0: 69 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  is,.** return th
46e0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
46f0: 68 79 70 65 72 6c 69 6e 6b 2e 20 20 4f 74 68 65  hyperlink.  Othe
4700: 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
4710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
4720: 6e 6b 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  nkLength(const c
4730: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
4740: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
4750: 3d 3d 27 5b 27 20 29 3b 0a 20 20 66 6f 72 28 6e  =='[' );.  for(n
4760: 3d 30 3b 20 7a 5b 6e 5d 20 26 26 20 7a 5b 6e 5d  =0; z[n] && z[n]
4770: 21 3d 27 5d 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20  !=']'; n++){}.  
4780: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5d 27 20 29 7b  if( z[n]==']' ){
4790: 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 2b 31 3b  .    return n+1;
47a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
47b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a  turn 0;.  }.}...
47c0: 2f 2a 0a 2a 2a 20 7a 20 70 6f 69 6e 74 73 20 74  /*.** z points t
47d0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
47e0: 20 74 6f 6b 65 6e 2e 20 20 52 65 74 75 72 6e 20   token.  Return 
47f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
4800: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
4810: 68 61 74 20 74 6f 6b 65 6e 2e 20 20 57 72 69 74  hat token.  Writ
4820: 65 20 74 68 65 20 74 6f 6b 65 6e 20 74 79 70 65  e the token type
4830: 20 69 6e 74 6f 20 2a 70 54 6f 6b 65 6e 54 79 70   into *pTokenTyp
4840: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4850: 20 6e 65 78 74 54 6f 6b 65 6e 28 63 6f 6e 73 74   nextToken(const
4860: 20 63 68 61 72 20 2a 7a 2c 20 52 65 6e 64 65 72   char *z, Render
4870: 65 72 20 2a 70 2c 20 69 6e 74 20 2a 70 54 6f 6b  er *p, int *pTok
4880: 65 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e  enType){.  int n
4890: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3c  ;.  if( z[0]=='<
48a0: 27 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6d 61 72  ' ){.    n = mar
48b0: 6b 75 70 4c 65 6e 67 74 68 28 7a 29 3b 0a 20 20  kupLength(z);.  
48c0: 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
48d0: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
48e0: 20 54 4f 4b 45 4e 5f 4d 41 52 4b 55 50 3b 0a 20   TOKEN_MARKUP;. 
48f0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20       return n;. 
4900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4910: 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4f  *pTokenType = TO
4920: 4b 45 4e 5f 43 48 41 52 41 43 54 45 52 3b 0a 20  KEN_CHARACTER;. 
4930: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4940: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
4950: 5b 30 5d 3d 3d 27 26 27 20 26 26 20 28 70 2d 3e  [0]=='&' && (p->
4960: 69 6e 56 65 72 62 61 74 69 6d 20 7c 7c 20 21 69  inVerbatim || !i
4970: 73 45 6c 65 6d 65 6e 74 28 7a 29 29 20 29 7b 0a  sElement(z)) ){.
4980: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20      *pTokenType 
4990: 3d 20 54 4f 4b 45 4e 5f 43 48 41 52 41 43 54 45  = TOKEN_CHARACTE
49a0: 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  R;.    return 1;
49b0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
49c0: 74 61 74 65 20 26 20 41 4c 4c 4f 57 5f 57 49 4b  tate & ALLOW_WIK
49d0: 49 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  I)!=0 ){.    if(
49e0: 20 7a 5b 30 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20   z[0]=='\n' ){. 
49f0: 20 20 20 20 20 6e 20 3d 20 70 61 72 61 67 72 61       n = paragra
4a00: 70 68 42 72 65 61 6b 4c 65 6e 67 74 68 28 7a 29  phBreakLength(z)
4a10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
4a20: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f 6b  ){.        *pTok
4a30: 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 50  enType = TOKEN_P
4a40: 41 52 41 47 52 41 50 48 3b 0a 20 20 20 20 20 20  ARAGRAPH;.      
4a50: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20    return n;.    
4a60: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 73 70    }else if( issp
4a70: 61 63 65 28 7a 5b 31 5d 29 20 29 7b 0a 20 20 20  ace(z[1]) ){.   
4a80: 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65       *pTokenType
4a90: 20 3d 20 54 4f 4b 45 4e 5f 4e 45 57 4c 49 4e 45   = TOKEN_NEWLINE
4aa0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4ab0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
4ac0: 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 73 74  }.    if( (p->st
4ad0: 61 74 65 20 26 20 41 54 5f 4e 45 57 4c 49 4e 45  ate & AT_NEWLINE
4ae0: 29 21 3d 30 20 26 26 20 69 73 73 70 61 63 65 28  )!=0 && isspace(
4af0: 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6e  z[0]) ){.      n
4b00: 20 3d 20 62 75 6c 6c 65 74 4c 65 6e 67 74 68 28   = bulletLength(
4b10: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  z);.      if( n>
4b20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54  0 ){.        *pT
4b30: 6f 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e  okenType = TOKEN
4b40: 5f 42 55 4c 4c 45 54 3b 0a 20 20 20 20 20 20 20  _BULLET;.       
4b50: 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 20   return n;.     
4b60: 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 65 6e 75   }.      n = enu
4b70: 6d 4c 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20  mLength(z);.    
4b80: 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
4b90: 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65       *pTokenType
4ba0: 20 3d 20 54 4f 4b 45 4e 5f 45 4e 55 4d 3b 0a 20   = TOKEN_ENUM;. 
4bb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b         return n;
4bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4bd0: 20 20 20 69 66 28 20 28 70 2d 3e 73 74 61 74 65     if( (p->state
4be0: 20 26 20 41 54 5f 50 41 52 41 47 52 41 50 48 29   & AT_PARAGRAPH)
4bf0: 21 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  !=0 && isspace(z
4c00: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6e 20  [0]) ){.      n 
4c10: 3d 20 69 6e 64 65 6e 74 4c 65 6e 67 74 68 28 7a  = indentLength(z
4c20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30  );.      if( n>0
4c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f   ){.        *pTo
4c40: 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f  kenType = TOKEN_
4c50: 49 4e 44 45 4e 54 3b 0a 20 20 20 20 20 20 20 20  INDENT;.        
4c60: 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 20 20  return n;.      
4c70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4c80: 7a 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 28 6e 20  z[0]=='[' && (n 
4c90: 3d 20 6c 69 6e 6b 4c 65 6e 67 74 68 28 7a 29 29  = linkLength(z))
4ca0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 54 6f  >0 ){.      *pTo
4cb0: 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f  kenType = TOKEN_
4cc0: 4c 49 4e 4b 3b 0a 20 20 20 20 20 20 72 65 74 75  LINK;.      retu
4cd0: 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn n;.    }.  }.
4ce0: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20    *pTokenType = 
4cf0: 54 4f 4b 45 4e 5f 54 45 58 54 3b 0a 20 20 72 65  TOKEN_TEXT;.  re
4d00: 74 75 72 6e 20 31 20 2b 20 74 65 78 74 4c 65 6e  turn 1 + textLen
4d10: 67 74 68 28 7a 2b 31 2c 20 70 2d 3e 73 74 61 74  gth(z+1, p->stat
4d20: 65 20 26 20 41 4c 4c 4f 57 5f 57 49 4b 49 29 3b  e & ALLOW_WIKI);
4d30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67  .}../*.** A sing
4d40: 6c 65 20 6d 61 72 6b 75 70 20 69 73 20 70 61 72  le markup is par
4d50: 73 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  sed into an inst
4d60: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
4d70: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
4d80: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
4d90: 74 72 75 63 74 20 50 61 72 73 65 64 4d 61 72 6b  truct ParsedMark
4da0: 75 70 20 50 61 72 73 65 64 4d 61 72 6b 75 70 3b  up ParsedMarkup;
4db0: 0a 73 74 72 75 63 74 20 50 61 72 73 65 64 4d 61  .struct ParsedMa
4dc0: 72 6b 75 70 20 7b 0a 20 20 75 6e 73 69 67 6e 65  rkup {.  unsigne
4dd0: 64 20 63 68 61 72 20 65 6e 64 54 61 67 3b 20 20  d char endTag;  
4de0: 20 2f 2a 20 54 72 75 65 20 69 66 20 3c 2f 2e 2e   /* True if </..
4df0: 2e 3e 20 69 6e 73 74 65 61 64 20 6f 66 20 3c 2e  .> instead of <.
4e00: 2e 2e 3e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ..> */.  unsigne
4e10: 64 20 63 68 61 72 20 69 43 6f 64 65 3b 20 20 20  d char iCode;   
4e20: 20 2f 2a 20 4d 41 52 4b 55 50 5f 2a 20 2a 2f 0a   /* MARKUP_* */.
4e30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4e40: 6e 41 74 74 72 3b 20 20 20 20 2f 2a 20 4e 75 6d  nAttr;    /* Num
4e50: 62 65 72 20 6f 66 20 61 74 74 72 69 62 75 74 65  ber of attribute
4e60: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
4e70: 73 68 6f 72 74 20 69 54 79 70 65 3b 20 20 20 2f  short iType;   /
4e80: 2a 20 4d 55 54 59 50 45 5f 2a 20 2a 2f 0a 20 20  * MUTYPE_* */.  
4e90: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 6e 73  struct {.    uns
4ea0: 69 67 6e 65 64 20 63 68 61 72 20 69 41 43 6f 64  igned char iACod
4eb0: 65 3b 20 20 20 20 2f 2a 20 41 54 54 52 5f 2a 20  e;    /* ATTR_* 
4ec0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61  */.    char *zVa
4ed0: 6c 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  lue;            
4ee0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
4ef0: 68 69 73 20 61 74 74 72 69 62 75 74 65 2e 20 20  his attribute.  
4f00: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
4f10: 0a 20 20 20 20 63 68 61 72 20 63 54 65 72 6d 3b  .    char cTerm;
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4f30: 20 4f 72 69 67 69 6e 61 6c 20 61 72 67 75 6d 65   Original argume
4f40: 6e 74 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  nt termination c
4f50: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 7d 20  haracter */.  } 
4f60: 61 41 74 74 72 5b 31 30 5d 3b 0a 7d 3b 0a 0a 2f  aAttr[10];.};../
4f70: 2a 0a 2a 2a 20 7a 5b 5d 20 69 73 20 61 6e 20 48  *.** z[] is an H
4f80: 54 4d 4c 20 6d 61 72 6b 75 70 20 65 6c 65 6d 65  TML markup eleme
4f90: 6e 74 20 2d 20 73 6f 6d 65 74 68 69 6e 67 20 74  nt - something t
4fa0: 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 20  hat begins with 
4fb0: 27 3c 27 2e 0a 2a 2a 20 50 61 72 73 65 20 74 68  '<'..** Parse th
4fc0: 69 73 20 65 6c 65 6d 65 6e 74 20 69 6e 74 6f 20  is element into 
4fd0: 74 68 65 20 70 20 73 74 72 75 63 74 75 72 65 2e  the p structure.
4fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
4ff0: 6e 74 20 6f 66 20 7a 5b 5d 20 6d 69 67 68 74 20  nt of z[] might 
5000: 62 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20 63  be modified by c
5010: 6f 6e 76 65 72 74 69 6e 67 20 63 68 61 72 61 63  onverting charac
5020: 74 65 72 73 20 0a 2a 2a 20 74 6f 20 6c 6f 77 65  ters .** to lowe
5030: 72 63 61 73 65 20 61 6e 64 20 62 79 20 69 6e 73  rcase and by ins
5040: 65 72 74 69 6e 67 20 73 6f 6d 65 20 22 5c 30 30  erting some "\00
5050: 30 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  0" characters..*
5060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
5070: 72 73 65 4d 61 72 6b 75 70 28 50 61 72 73 65 64  rseMarkup(Parsed
5080: 4d 61 72 6b 75 70 20 2a 70 2c 20 63 68 61 72 20  Markup *p, char 
5090: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *z){.  int i, j,
50a0: 20 63 3b 0a 20 20 69 6e 74 20 69 41 43 6f 64 65   c;.  int iACode
50b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65  ;.  char *zValue
50c0: 3b 0a 20 20 69 6e 74 20 73 65 65 6e 20 3d 20 30  ;.  int seen = 0
50d0: 3b 0a 20 20 63 68 61 72 20 7a 54 61 67 5b 31 30  ;.  char zTag[10
50e0: 30 5d 3b 0a 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0];..  if( z[1]=
50f0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 70 2d 3e 65  ='/' ){.    p->e
5100: 6e 64 54 61 67 20 3d 20 31 3b 0a 20 20 20 20 69  ndTag = 1;.    i
5110: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
5120: 20 20 20 70 2d 3e 65 6e 64 54 61 67 20 3d 20 30     p->endTag = 0
5130: 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 7d  ;.    i = 1;.  }
5140: 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  j = 0;.  whil
5150: 65 28 20 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29  e( isalnum(z[i])
5160: 20 29 7b 20 0a 20 20 20 20 69 66 28 20 6a 3c 73   ){ .    if( j<s
5170: 69 7a 65 6f 66 28 7a 54 61 67 29 2d 31 20 29 20  izeof(zTag)-1 ) 
5180: 7a 54 61 67 5b 6a 2b 2b 5d 20 3d 20 74 6f 6c 6f  zTag[j++] = tolo
5190: 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20 20 20 69  wer(z[i]);.    i
51a0: 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 54 61 67 5b 6a  ++;.  }.  zTag[j
51b0: 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 43 6f 64  ] = 0;.  p->iCod
51c0: 65 20 3d 20 66 69 6e 64 54 61 67 28 7a 54 61 67  e = findTag(zTag
51d0: 29 3b 0a 20 20 70 2d 3e 69 54 79 70 65 20 3d 20  );.  p->iType = 
51e0: 61 4d 61 72 6b 75 70 5b 70 2d 3e 69 43 6f 64 65  aMarkup[p->iCode
51f0: 5d 2e 69 54 79 70 65 3b 0a 20 20 70 2d 3e 6e 41  ].iType;.  p->nA
5200: 74 74 72 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ttr = 0;.  while
5210: 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  ( isspace(z[i]) 
5220: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 77 68 69 6c  ){ i++; }.  whil
5230: 65 28 20 70 2d 3e 6e 41 74 74 72 3c 38 20 26 26  e( p->nAttr<8 &&
5240: 20 69 73 61 6c 70 68 61 28 7a 5b 69 5d 29 20 29   isalpha(z[i]) )
5250: 7b 0a 20 20 20 20 69 6e 74 20 61 74 74 72 4f 6b  {.    int attrOk
5260: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  ;    /* True to 
5270: 70 72 65 73 65 72 76 65 72 20 61 74 74 72 69 62  preserver attrib
5280: 75 74 65 2e 20 20 46 61 6c 73 65 20 74 6f 20 69  ute.  False to i
5290: 67 6e 6f 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  gnore it */.    
52a0: 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  j = 0;.    while
52b0: 28 20 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20  ( isalnum(z[i]) 
52c0: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 6a 3c  ){ .      if( j<
52d0: 73 69 7a 65 6f 66 28 7a 54 61 67 29 2d 31 20 29  sizeof(zTag)-1 )
52e0: 20 7a 54 61 67 5b 6a 2b 2b 5d 20 3d 20 74 6f 6c   zTag[j++] = tol
52f0: 6f 77 65 72 28 7a 5b 69 5d 29 3b 0a 20 20 20 20  ower(z[i]);.    
5300: 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    i++;.    }.   
5310: 20 7a 54 61 67 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zTag[j] = 0;.  
5320: 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41    p->aAttr[p->nA
5330: 74 74 72 5d 2e 69 41 43 6f 64 65 20 3d 20 69 41  ttr].iACode = iA
5340: 43 6f 64 65 20 3d 20 66 69 6e 64 41 74 74 72 28  Code = findAttr(
5350: 7a 54 61 67 29 3b 0a 20 20 20 20 61 74 74 72 4f  zTag);.    attrO
5360: 6b 20 3d 20 69 41 43 6f 64 65 21 3d 30 20 26 26  k = iACode!=0 &&
5370: 20 28 73 65 65 6e 20 26 20 61 41 74 74 72 69 62   (seen & aAttrib
5380: 75 74 65 5b 69 41 43 6f 64 65 5d 2e 69 4d 61 73  ute[iACode].iMas
5390: 6b 29 3d 3d 30 3b 0a 20 20 20 20 77 68 69 6c 65  k)==0;.    while
53a0: 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  ( isspace(z[i]) 
53b0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
53c0: 28 20 7a 5b 69 5d 21 3d 27 3d 27 20 29 7b 0a 20  ( z[i]!='=' ){. 
53d0: 20 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d       p->aAttr[p-
53e0: 3e 6e 41 74 74 72 5d 2e 7a 56 61 6c 75 65 20 3d  >nAttr].zValue =
53f0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 74   0;.      p->aAt
5400: 74 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 63 54 65  tr[p->nAttr].cTe
5410: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20  rm = 0;.      c 
5420: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
5430: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
5440: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
5450: 7a 5b 69 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  z[i]) ){ z++; }.
5460: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
5470: 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '"' ){.        i
5480: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 56 61 6c  ++;.        zVal
5490: 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 20 20  ue = &z[i];.    
54a0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20      while( z[i] 
54b0: 26 26 20 7a 5b 69 5d 21 3d 27 22 27 20 29 7b 20  && z[i]!='"' ){ 
54c0: 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7d 65 6c  i++; }.      }el
54d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 56 61 6c  se{.        zVal
54e0: 75 65 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 20 20  ue = &z[i];.    
54f0: 20 20 20 20 77 68 69 6c 65 28 20 21 69 73 73 70      while( !issp
5500: 61 63 65 28 7a 5b 69 5d 29 20 26 26 20 7a 5b 69  ace(z[i]) && z[i
5510: 5d 21 3d 27 3e 27 20 29 7b 20 7a 2b 2b 3b 20 7d  ]!='>' ){ z++; }
5520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5530: 66 28 20 61 74 74 72 4f 6b 20 29 7b 0a 20 20 20  f( attrOk ){.   
5540: 20 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d       p->aAttr[p-
5550: 3e 6e 41 74 74 72 5d 2e 7a 56 61 6c 75 65 20 3d  >nAttr].zValue =
5560: 20 7a 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20   zValue;.       
5570: 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74   p->aAttr[p->nAt
5580: 74 72 5d 2e 63 54 65 72 6d 20 3d 20 63 20 3d 20  tr].cTerm = c = 
5590: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 5b  z[i];.        z[
55a0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
55b0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
55c0: 0a 20 20 20 20 69 66 28 20 61 74 74 72 4f 6b 20  .    if( attrOk 
55d0: 29 7b 0a 20 20 20 20 20 20 73 65 65 6e 20 7c 3d  ){.      seen |=
55e0: 20 61 41 74 74 72 69 62 75 74 65 5b 69 41 43 6f   aAttribute[iACo
55f0: 64 65 5d 2e 69 4d 61 73 6b 3b 0a 20 20 20 20 20  de].iMask;.     
5600: 20 70 2d 3e 6e 41 74 74 72 2b 2b 3b 0a 20 20 20   p->nAttr++;.   
5610: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73   }.    while( is
5620: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
5630: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b  ++; }.    if( z[
5640: 69 5d 3d 3d 27 3e 27 20 7c 7c 20 28 7a 5b 69 5d  i]=='>' || (z[i]
5650: 3d 3d 27 2f 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='/' && z[i+1]=
5660: 3d 27 3e 27 29 20 29 20 62 72 65 61 6b 3b 0a 20  ='>') ) break;. 
5670: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64   }.}../*.** Rend
5680: 65 72 20 6d 61 72 6b 75 70 20 6f 6e 20 74 68 65  er markup on the
5690: 20 67 69 76 65 6e 20 62 6c 6f 62 2e 0a 2a 2f 0a   given blob..*/.
56a0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6e 64  static void rend
56b0: 65 72 4d 61 72 6b 75 70 28 42 6c 6f 62 20 2a 70  erMarkup(Blob *p
56c0: 4f 75 74 2c 20 50 61 72 73 65 64 4d 61 72 6b 75  Out, ParsedMarku
56d0: 70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  p *p){.  int i;.
56e0: 20 20 69 66 28 20 70 2d 3e 65 6e 64 54 61 67 20    if( p->endTag 
56f0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
5700: 6e 64 66 28 70 4f 75 74 2c 20 22 3c 2f 25 73 3e  ndf(pOut, "</%s>
5710: 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 69 43  ", aMarkup[p->iC
5720: 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  ode].zName);.  }
5730: 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  else{.    blob_a
5740: 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 3c 25  ppendf(pOut, "<%
5750: 73 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 69  s", aMarkup[p->i
5760: 43 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  Code].zName);.  
5770: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5780: 6e 41 74 74 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nAttr; i++){.   
5790: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
57a0: 70 4f 75 74 2c 20 22 20 25 73 22 2c 20 61 41 74  pOut, " %s", aAt
57b0: 74 72 69 62 75 74 65 5b 70 2d 3e 61 41 74 74 72  tribute[p->aAttr
57c0: 5b 69 5d 2e 69 41 43 6f 64 65 5d 2e 7a 4e 61 6d  [i].iACode].zNam
57d0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  e);.      if( p-
57e0: 3e 61 41 74 74 72 5b 69 5d 2e 7a 56 61 6c 75 65  >aAttr[i].zValue
57f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62   ){.        blob
5800: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22  _appendf(pOut, "
5810: 3d 5c 22 25 73 5c 22 22 2c 20 70 2d 3e 61 41 74  =\"%s\"", p->aAt
5820: 74 72 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b 0a 20  tr[i].zValue);. 
5830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5840: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75   blob_append(pOu
5850: 74 2c 20 22 3e 22 2c 20 31 29 3b 0a 20 20 7d 0a  t, ">", 1);.  }.
5860: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
5870: 65 20 6d 61 72 6b 75 70 20 77 61 73 20 70 61 72  e markup was par
5880: 73 65 64 2c 20 73 6f 6d 65 20 22 5c 30 30 30 22  sed, some "\000"
5890: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 69   may have been i
58a0: 6e 73 65 72 74 65 64 2e 0a 2a 2a 20 54 68 69 73  nserted..** This
58b0: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
58c0: 73 20 74 6f 20 74 68 6f 73 65 20 22 5c 30 30 30  s to those "\000
58d0: 22 20 76 61 6c 75 65 73 20 62 61 63 6b 20 74 6f  " values back to
58e0: 20 74 68 65 69 72 0a 2a 2a 20 6f 72 69 67 69 6e   their.** origin
58f0: 61 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73  al content..*/.s
5900: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 70 61 72  tatic void unpar
5910: 73 65 4d 61 72 6b 75 70 28 50 61 72 73 65 64 4d  seMarkup(ParsedM
5920: 61 72 6b 75 70 20 2a 70 29 7b 0a 20 20 69 6e 74  arkup *p){.  int
5930: 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 30   i, n;.  for(i=0
5940: 3b 20 69 3c 70 2d 3e 6e 41 74 74 72 3b 20 69 2b  ; i<p->nAttr; i+
5950: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  +){.    char *z 
5960: 3d 20 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 7a 56  = p->aAttr[i].zV
5970: 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 3d  alue;.    if( z=
5980: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
5990: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29     n = strlen(z)
59a0: 3b 0a 20 20 20 20 7a 5b 6e 5d 20 3d 20 70 2d 3e  ;.    z[n] = p->
59b0: 61 41 74 74 72 5b 69 5d 2e 63 54 65 72 6d 3b 0a  aAttr[i].cTerm;.
59c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
59d0: 75 72 6e 20 74 68 65 20 49 44 20 61 74 74 72 69  urn the ID attri
59e0: 62 75 74 65 20 66 6f 72 20 6d 61 72 6b 75 70 2e  bute for markup.
59f0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5a00: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
5a10: 49 44 20 61 74 74 72 69 62 75 74 65 2e 0a 2a 2f  ID attribute..*/
5a20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
5a30: 61 72 20 2a 6d 61 72 6b 75 70 49 64 28 50 61 72  ar *markupId(Par
5a40: 73 65 64 4d 61 72 6b 75 70 20 2a 70 29 7b 0a 20  sedMarkup *p){. 
5a50: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5a60: 30 3b 20 69 3c 70 2d 3e 6e 41 74 74 72 3b 20 69  0; i<p->nAttr; i
5a70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
5a80: 61 41 74 74 72 5b 69 5d 2e 69 41 43 6f 64 65 3d  aAttr[i].iACode=
5a90: 3d 41 54 54 52 5f 49 44 20 29 7b 0a 20 20 20 20  =ATTR_ID ){.    
5aa0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 61 41 74 74    return p->aAtt
5ab0: 72 5b 69 5d 2e 7a 56 61 6c 75 65 3b 0a 20 20 20  r[i].zValue;.   
5ac0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5ad0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20  0;.}../*.** Pop 
5ae0: 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74  a single element
5af0: 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61 63   off of the stac
5b00: 6b 2e 20 20 41 73 20 74 68 65 20 65 6c 65 6d 65  k.  As the eleme
5b10: 6e 74 20 69 73 20 70 6f 70 70 65 64 2c 0a 2a 2a  nt is popped,.**
5b20: 20 6f 75 74 70 75 74 20 69 74 73 20 65 6e 64 20   output its end 
5b30: 74 61 67 20 69 66 20 69 74 20 69 73 20 6e 6f 74  tag if it is not
5b40: 20 61 20 3c 2f 64 69 76 3e 20 74 61 67 2e 0a 2a   a </div> tag..*
5b50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f  /.static void po
5b60: 70 53 74 61 63 6b 28 52 65 6e 64 65 72 65 72 20  pStack(Renderer 
5b70: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 53  *p){.  if( p->nS
5b80: 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  tack ){.    int 
5b90: 69 43 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 6e 53  iCode;.    p->nS
5ba0: 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 69 43 6f 64  tack--;.    iCod
5bb0: 65 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d  e = p->aStack[p-
5bc0: 3e 6e 53 74 61 63 6b 5d 2e 69 43 6f 64 65 3b 0a  >nStack].iCode;.
5bd0: 20 20 20 20 69 66 28 20 69 43 6f 64 65 21 3d 4d      if( iCode!=M
5be0: 41 52 4b 55 50 5f 44 49 56 20 29 7b 0a 20 20 20  ARKUP_DIV ){.   
5bf0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
5c00: 70 2d 3e 70 4f 75 74 2c 20 22 3c 2f 25 73 3e 22  p->pOut, "</%s>"
5c10: 2c 20 61 4d 61 72 6b 75 70 5b 69 43 6f 64 65 5d  , aMarkup[iCode]
5c20: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
5c30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68   }.}../*.** Push
5c40: 20 61 20 6e 65 77 20 6d 61 72 6b 75 70 20 76 61   a new markup va
5c50: 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  lue onto the sta
5c60: 63 6b 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  ck.  Enlarge the
5c70: 20 73 74 61 63 6b 0a 2a 2a 20 69 66 20 6e 65 63   stack.** if nec
5c80: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
5c90: 63 20 76 6f 69 64 20 70 75 73 68 53 74 61 63 6b  c void pushStack
5ca0: 57 69 74 68 49 64 28 52 65 6e 64 65 72 65 72 20  WithId(Renderer 
5cb0: 2a 70 2c 20 69 6e 74 20 65 6c 65 6d 2c 20 63 6f  *p, int elem, co
5cc0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 2c 20 69  nst char *zId, i
5cd0: 6e 74 20 77 29 7b 0a 20 20 69 66 28 20 70 2d 3e  nt w){.  if( p->
5ce0: 6e 53 74 61 63 6b 3e 3d 70 2d 3e 6e 41 6c 6c 6f  nStack>=p->nAllo
5cf0: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
5d00: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
5d10: 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61   + 100;.    p->a
5d20: 53 74 61 63 6b 20 3d 20 72 65 61 6c 6c 6f 63 28  Stack = realloc(
5d30: 70 2d 3e 61 53 74 61 63 6b 2c 20 70 2d 3e 6e 41  p->aStack, p->nA
5d40: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  lloc*sizeof(p->a
5d50: 53 74 61 63 6b 5b 30 5d 29 29 3b 0a 20 20 20 20  Stack[0]));.    
5d60: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30  if( p->aStack==0
5d70: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
5d80: 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66 20 6d  _panic("out of m
5d90: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 7d 0a 20  emory");.    }. 
5da0: 20 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70   }.  p->aStack[p
5db0: 2d 3e 6e 53 74 61 63 6b 5d 2e 69 43 6f 64 65 20  ->nStack].iCode 
5dc0: 3d 20 65 6c 65 6d 3b 0a 20 20 70 2d 3e 61 53 74  = elem;.  p->aSt
5dd0: 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d 2e 7a  ack[p->nStack].z
5de0: 49 64 20 3d 20 7a 49 64 3b 0a 20 20 70 2d 3e 61  Id = zId;.  p->a
5df0: 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d  Stack[p->nStack]
5e00: 2e 61 6c 6c 6f 77 57 69 6b 69 20 3d 20 77 3b 0a  .allowWiki = w;.
5e10: 20 20 70 2d 3e 6e 53 74 61 63 6b 2b 2b 3b 0a 7d    p->nStack++;.}
5e20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
5e30: 68 53 74 61 63 6b 28 52 65 6e 64 65 72 65 72 20  hStack(Renderer 
5e40: 2a 70 2c 20 69 6e 74 20 65 6c 65 6d 29 7b 0a 20  *p, int elem){. 
5e50: 20 70 75 73 68 53 74 61 63 6b 57 69 74 68 49 64   pushStackWithId
5e60: 28 70 2c 20 65 6c 65 6d 2c 20 30 2c 20 30 29 3b  (p, elem, 0, 0);
5e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68  .}../*.** Pop th
5e80: 65 20 73 74 61 63 6b 20 75 6e 74 69 6c 20 74 68  e stack until th
5e90: 65 20 74 6f 70 2d 6d 6f 73 74 20 69 54 61 67 20  e top-most iTag 
5ea0: 65 6c 65 6d 65 6e 74 20 69 73 20 72 65 6d 6f 76  element is remov
5eb0: 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ed..** If there 
5ec0: 69 73 20 6e 6f 20 69 54 61 67 20 65 6c 65 6d 65  is no iTag eleme
5ed0: 6e 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2c  nt on the stack,
5ee0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
5ef0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
5f00: 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 53  static void popS
5f10: 74 61 63 6b 54 6f 54 61 67 28 52 65 6e 64 65 72  tackToTag(Render
5f20: 65 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 67 29  er *p, int iTag)
5f30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5f40: 28 69 3d 70 2d 3e 6e 53 74 61 63 6b 2d 31 3b 20  (i=p->nStack-1; 
5f50: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5f60: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d  if( p->aStack[i]
5f70: 2e 69 43 6f 64 65 21 3d 69 54 61 67 20 29 20 63  .iCode!=iTag ) c
5f80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
5f90: 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 7a 49   p->aStack[i].zI
5fa0: 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
5fb0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69    break;.  }.  i
5fc0: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
5fd0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e 53 74  .  while( p->nSt
5fe0: 61 63 6b 3e 69 20 29 7b 0a 20 20 20 20 70 6f 70  ack>i ){.    pop
5ff0: 53 74 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Stack(p);.  }.}.
6000: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
6010: 6f 20 66 69 6e 64 20 61 20 66 69 6e 64 20 61 20  o find a find a 
6020: 74 61 67 20 6f 66 20 74 79 70 65 20 69 54 61 67  tag of type iTag
6030: 20 77 69 74 68 20 69 64 20 7a 49 64 2e 20 20 52   with id zId.  R
6040: 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
6050: 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20 66 6f  ot found.  If fo
6060: 75 6e 64 2c 20 72 65 74 75 72 6e 20 69 74 73 20  und, return its 
6070: 73 74 61 63 6b 20 6c 65 76 65 6c 2e 20 20 0a 2a  stack level.  .*
6080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
6090: 64 54 61 67 57 69 74 68 49 64 28 52 65 6e 64 65  dTagWithId(Rende
60a0: 72 65 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 67  rer *p, int iTag
60b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
60c0: 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  d){.  int i;.  a
60d0: 73 73 65 72 74 28 20 7a 49 64 21 3d 30 20 29 3b  ssert( zId!=0 );
60e0: 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 74 61  .  for(i=p->nSta
60f0: 63 6b 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ck-1; i>=0; i--)
6100: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 53 74  {.    if( p->aSt
6110: 61 63 6b 5b 69 5d 2e 69 43 6f 64 65 21 3d 69 54  ack[i].iCode!=iT
6120: 61 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ag ) continue;. 
6130: 20 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b     if( p->aStack
6140: 5b 69 5d 2e 7a 49 64 3d 3d 30 20 29 20 63 6f 6e  [i].zId==0 ) con
6150: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
6160: 74 72 63 6d 70 28 7a 49 64 2c 20 70 2d 3e 61 53  trcmp(zId, p->aS
6170: 74 61 63 6b 5b 69 5d 2e 7a 49 64 29 21 3d 30 20  tack[i].zId)!=0 
6180: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6190: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
61a0: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
61b0: 50 6f 70 20 74 68 65 20 73 74 61 63 6b 20 75 6e  Pop the stack un
61c0: 74 69 6c 20 74 68 65 20 74 6f 70 2d 6d 6f 73 74  til the top-most
61d0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
61e0: 73 74 61 63 6b 0a 2a 2a 20 69 73 20 61 6e 20 65  stack.** is an e
61f0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 74 63  lement that matc
6200: 68 65 73 20 74 68 65 20 74 79 70 65 20 69 6e 20  hes the type in 
6210: 69 4d 61 73 6b 2e 20 20 52 65 74 75 72 6e 0a 2a  iMask.  Return.*
6220: 2a 20 63 6f 64 65 20 6f 66 20 74 68 65 20 6d 61  * code of the ma
6230: 72 6b 75 70 20 65 6c 65 6d 65 6e 74 20 74 68 61  rkup element tha
6240: 74 20 69 73 20 6f 6e 20 6c 65 66 74 20 6f 6e 20  t is on left on 
6250: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
6260: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 61 63  ..** If the stac
6270: 6b 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  k does not have 
6280: 61 6e 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68  an element.** th
6290: 61 74 20 6d 61 74 63 68 65 73 20 69 4d 61 73 6b  at matches iMask
62a0: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
62b0: 20 73 74 61 63 6b 20 75 6e 63 68 61 6e 67 65 64   stack unchanged
62c0: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 66   and.** return f
62d0: 61 6c 73 65 20 28 4d 41 52 4b 55 50 5f 49 4e 56  alse (MARKUP_INV
62e0: 41 4c 49 44 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ALID)..*/.static
62f0: 20 69 6e 74 20 62 61 63 6b 75 70 54 6f 54 79 70   int backupToTyp
6300: 65 28 52 65 6e 64 65 72 65 72 20 2a 70 2c 20 69  e(Renderer *p, i
6310: 6e 74 20 69 4d 61 73 6b 29 7b 0a 20 20 69 6e 74  nt iMask){.  int
6320: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e   i;.  for(i=p->n
6330: 53 74 61 63 6b 2d 31 3b 20 69 3e 3d 30 3b 20 69  Stack-1; i>=0; i
6340: 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 4d 61  --){.    if( aMa
6350: 72 6b 75 70 5b 70 2d 3e 61 53 74 61 63 6b 5b 69  rkup[p->aStack[i
6360: 5d 2e 69 43 6f 64 65 5d 2e 69 54 79 70 65 20 26  ].iCode].iType &
6370: 20 69 4d 61 73 6b 20 29 20 62 72 65 61 6b 3b 0a   iMask ) break;.
6380: 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
6390: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 2b 2b 3b  return 0;.  i++;
63a0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e 53 74  .  while( p->nSt
63b0: 61 63 6b 3e 69 20 29 7b 0a 20 20 20 20 70 6f 70  ack>i ){.    pop
63c0: 53 74 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20  Stack(p);.  }.  
63d0: 72 65 74 75 72 6e 20 70 2d 3e 61 53 74 61 63 6b  return p->aStack
63e0: 5b 69 2d 31 5d 2e 69 43 6f 64 65 3b 0a 7d 0a 0a  [i-1].iCode;.}..
63f0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 6e 65  /*.** Begin a ne
6400: 77 20 70 61 72 61 67 72 61 70 68 20 69 66 20 74  w paragraph if t
6410: 68 61 74 20 73 6f 6d 65 74 68 69 6e 67 20 74 68  hat something th
6420: 61 74 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  at is needed..*/
6430: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61  .static void sta
6440: 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  rtAutoParagraph(
6450: 52 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20 20  Renderer *p){.  
6460: 69 66 28 20 70 2d 3e 77 61 6e 74 41 75 74 6f 50  if( p->wantAutoP
6470: 61 72 61 67 72 61 70 68 3d 3d 30 20 29 20 72 65  aragraph==0 ) re
6480: 74 75 72 6e 3b 0a 20 20 62 6c 6f 62 5f 61 70 70  turn;.  blob_app
6490: 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22 3c  endf(p->pOut, "<
64a0: 70 3e 22 2c 20 2d 31 29 3b 0a 20 20 70 75 73 68  p>", -1);.  push
64b0: 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f  Stack(p, MARKUP_
64c0: 50 29 3b 0a 20 20 70 2d 3e 77 61 6e 74 41 75 74  P);.  p->wantAut
64d0: 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b 0a  oParagraph = 0;.
64e0: 20 20 70 2d 3e 69 6e 41 75 74 6f 50 61 72 61 67    p->inAutoParag
64f0: 72 61 70 68 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  raph = 1;.}../*.
6500: 2a 2a 20 45 6e 64 20 61 20 70 61 72 61 67 72 61  ** End a paragra
6510: 70 68 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ph if we are in 
6520: 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  one..*/.static v
6530: 6f 69 64 20 65 6e 64 41 75 74 6f 50 61 72 61 67  oid endAutoParag
6540: 72 61 70 68 28 52 65 6e 64 65 72 65 72 20 2a 70  raph(Renderer *p
6550: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 41 75  ){.  if( p->inAu
6560: 74 6f 50 61 72 61 67 72 61 70 68 20 29 7b 0a 20  toParagraph ){. 
6570: 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67     popStackToTag
6580: 28 70 2c 20 4d 41 52 4b 55 50 5f 50 29 3b 0a 20  (p, MARKUP_P);. 
6590: 20 20 20 70 2d 3e 69 6e 41 75 74 6f 50 61 72 61     p->inAutoPara
65a0: 67 72 61 70 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d  graph = 0;.  }.}
65b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
65c0: 6e 70 75 74 20 73 74 72 69 6e 67 20 63 6f 72 72  nput string corr
65d0: 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 65 78  esponds to an ex
65e0: 69 73 74 69 6e 67 20 62 61 73 65 6c 69 6e 65 2c  isting baseline,
65f0: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65 2e  .** return true.
6600: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
6610: 73 5f 76 61 6c 69 64 5f 75 75 69 64 28 63 6f 6e  s_valid_uuid(con
6620: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
6630: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  nt n = strlen(z)
6640: 3b 0a 20 20 69 66 28 20 6e 3c 34 20 7c 7c 20 6e  ;.  if( n<4 || n
6650: 3e 55 55 49 44 5f 53 49 5a 45 20 29 20 72 65 74  >UUID_SIZE ) ret
6660: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 76 61  urn 0;.  if( !va
6670: 6c 69 64 61 74 65 31 36 28 7a 2c 20 6e 29 20 29  lidate16(z, n) )
6680: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
6690: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
66a0: 7a 54 61 72 67 65 74 20 69 73 20 67 75 61 72 61  zTarget is guara
66b0: 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 55 55  nteed to be a UU
66c0: 49 44 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ID.  It might be
66d0: 20 74 68 65 20 55 55 49 44 20 6f 66 20 61 20 74   the UUID of a t
66e0: 69 63 6b 65 74 2e 0a 2a 2a 20 49 66 20 69 74 20  icket..** If it 
66f0: 69 73 2c 20 66 69 6c 6c 20 7a 44 69 73 70 6c 61  is, fill zDispla
6700: 79 5b 30 2e 2e 6e 44 69 73 70 6c 61 79 2d 31 5d  y[0..nDisplay-1]
6710: 20 77 69 74 68 20 74 68 65 20 74 69 74 6c 65 20   with the title 
6720: 6f 66 20 74 68 65 20 74 69 63 6b 65 74 0a 2a 2a  of the ticket.**
6730: 20 28 6f 72 20 61 20 70 72 65 66 69 78 20 69 66   (or a prefix if
6740: 20 74 68 65 20 74 69 74 6c 65 20 69 73 20 74 6f   the title is to
6750: 6f 20 6c 6f 6e 67 29 20 61 6e 64 20 72 65 74 75  o long) and retu
6760: 72 6e 20 74 72 75 65 2e 20 20 49 66 20 7a 54 61  rn true.  If zTa
6770: 72 67 65 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  rget.** is not t
6780: 68 65 20 55 55 49 44 20 6f 66 20 61 20 74 69 63  he UUID of a tic
6790: 6b 65 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ket, return fals
67a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
67b0: 20 69 73 5f 74 69 63 6b 65 74 28 0a 20 20 63 6f   is_ticket(.  co
67c0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65  nst char *zTarge
67d0: 74 2c 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  t,    /* Ticket 
67e0: 55 55 49 44 20 2a 2f 0a 20 20 63 68 61 72 20 2a  UUID */.  char *
67f0: 7a 44 69 73 70 6c 61 79 2c 20 20 20 20 20 20 20  zDisplay,       
6800: 20 20 2f 2a 20 53 70 61 63 65 20 69 6e 20 77 68    /* Space in wh
6810: 69 63 68 20 74 6f 20 77 72 69 74 65 20 74 69 63  ich to write tic
6820: 6b 65 74 20 74 69 74 6c 65 20 2a 2f 0a 20 20 69  ket title */.  i
6830: 6e 74 20 6e 44 69 73 70 6c 61 79 2c 20 20 20 20  nt nDisplay,    
6840: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
6850: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 44 69  available in zDi
6860: 73 70 6c 61 79 5b 5d 20 2a 2f 0a 20 20 69 6e 74  splay[] */.  int
6870: 20 2a 70 43 6c 6f 73 65 64 20 20 20 20 20 20 20   *pClosed       
6880: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6890: 74 68 65 20 74 69 63 6b 65 74 20 69 73 20 63 6c  the ticket is cl
68a0: 6f 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  osed */.){.  sta
68b0: 74 69 63 20 53 74 6d 74 20 71 3b 0a 20 20 73 74  tic Stmt q;.  st
68c0: 61 74 69 63 20 69 6e 74 20 6f 6e 63 65 20 3d 20  atic int once = 
68d0: 31 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  1;.  int n;.  in
68e0: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 4c 6f  t rc;.  char zLo
68f0: 77 65 72 5b 55 55 49 44 5f 53 49 5a 45 2b 31 5d  wer[UUID_SIZE+1]
6900: 3b 0a 20 20 63 68 61 72 20 7a 55 70 70 65 72 5b  ;.  char zUpper[
6910: 55 55 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20  UUID_SIZE+1];.  
6920: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 72 67  n = strlen(zTarg
6930: 65 74 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 4c  et);.  memcpy(zL
6940: 6f 77 65 72 2c 20 7a 54 61 72 67 65 74 2c 20 6e  ower, zTarget, n
6950: 2b 31 29 3b 0a 20 20 63 61 6e 6f 6e 69 63 61 6c  +1);.  canonical
6960: 31 36 28 7a 4c 6f 77 65 72 2c 20 6e 2b 31 29 3b  16(zLower, n+1);
6970: 0a 20 20 6d 65 6d 63 70 79 28 7a 55 70 70 65 72  .  memcpy(zUpper
6980: 2c 20 7a 4c 6f 77 65 72 2c 20 6e 2b 31 29 3b 0a  , zLower, n+1);.
6990: 20 20 7a 55 70 70 65 72 5b 6e 2d 31 5d 2b 2b 3b    zUpper[n-1]++;
69a0: 0a 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  .  if( once ){. 
69b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
69c0: 54 69 74 6c 65 45 78 70 72 20 3d 20 64 62 5f 67  TitleExpr = db_g
69d0: 65 74 28 22 74 69 63 6b 65 74 2d 74 69 74 6c 65  et("ticket-title
69e0: 2d 65 78 70 72 22 2c 20 22 74 69 74 6c 65 22 29  -expr", "title")
69f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
6a00: 20 2a 7a 43 6c 6f 73 65 64 45 78 70 72 20 3d 20   *zClosedExpr = 
6a10: 64 62 5f 67 65 74 28 22 74 69 63 6b 65 74 2d 63  db_get("ticket-c
6a20: 6c 6f 73 65 64 2d 65 78 70 72 22 2c 20 22 73 74  losed-expr", "st
6a30: 61 74 75 73 3d 27 43 6c 6f 73 65 64 27 22 29 3b  atus='Closed'");
6a40: 0a 20 20 20 20 64 62 5f 73 74 61 74 69 63 5f 70  .    db_static_p
6a50: 72 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20 20  repare(&q, .    
6a60: 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 25 73    "SELECT %s, %s
6a70: 20 46 52 4f 4d 20 74 69 63 6b 65 74 20 22 0a 20   FROM ticket ". 
6a80: 20 20 20 20 20 22 20 57 48 45 52 45 20 74 6b 74       " WHERE tkt
6a90: 5f 75 75 69 64 3e 3d 3a 6c 77 72 20 41 4e 44 20  _uuid>=:lwr AND 
6aa0: 74 6b 74 5f 75 75 69 64 3c 3a 75 70 72 22 2c 0a  tkt_uuid<:upr",.
6ab0: 20 20 20 20 20 20 7a 54 69 74 6c 65 45 78 70 72        zTitleExpr
6ac0: 2c 20 7a 43 6c 6f 73 65 64 45 78 70 72 0a 20 20  , zClosedExpr.  
6ad0: 20 20 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 62 69    );.  }.  db_bi
6ae0: 6e 64 5f 74 65 78 74 28 26 71 2c 20 22 3a 6c 77  nd_text(&q, ":lw
6af0: 72 22 2c 20 7a 4c 6f 77 65 72 29 3b 0a 20 20 64  r", zLower);.  d
6b00: 62 5f 62 69 6e 64 5f 74 65 78 74 28 26 71 2c 20  b_bind_text(&q, 
6b10: 22 3a 75 70 72 22 2c 20 7a 55 70 70 65 72 29 3b  ":upr", zUpper);
6b20: 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26  .  if( db_step(&
6b30: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
6b40: 7b 0a 20 20 20 20 6e 20 3d 20 64 62 5f 63 6f 6c  {.    n = db_col
6b50: 75 6d 6e 5f 62 79 74 65 73 28 26 71 2c 30 29 3b  umn_bytes(&q,0);
6b60: 0a 20 20 20 20 69 66 28 20 6e 3e 6e 44 69 73 70  .    if( n>nDisp
6b70: 6c 61 79 2d 31 20 29 20 6e 20 3d 20 6e 44 69 73  lay-1 ) n = nDis
6b80: 70 6c 61 79 20 2d 20 31 3b 0a 20 20 20 20 6d 65  play - 1;.    me
6b90: 6d 63 70 79 28 7a 44 69 73 70 6c 61 79 2c 20 64  mcpy(zDisplay, d
6ba0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
6bb0: 2c 20 30 29 2c 20 6e 29 3b 0a 20 20 20 20 7a 44  , 0), n);.    zD
6bc0: 69 73 70 6c 61 79 5b 6e 5d 20 3d 20 30 3b 0a 20  isplay[n] = 0;. 
6bd0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 2a     rc = 1;.    *
6be0: 70 43 6c 6f 73 65 64 20 3d 20 64 62 5f 63 6f 6c  pClosed = db_col
6bf0: 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31 29 3b 0a  umn_int(&q, 1);.
6c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
6c10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 64 62 5f 72 65  = 0;.  }.  db_re
6c20: 73 65 74 28 26 71 29 3b 0a 20 20 72 65 74 75 72  set(&q);.  retur
6c30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6c40: 65 73 6f 6c 76 65 20 61 20 68 79 70 65 72 6c 69  esolve a hyperli
6c50: 6e 6b 2e 20 20 54 68 65 20 7a 54 61 72 67 65 74  nk.  The zTarget
6c60: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
6c70: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
6c80: 5b 2e 2e 2e 5d 0a 2a 2a 20 69 6e 20 74 68 65 20  [...].** in the 
6c90: 77 69 6b 69 2e 20 20 41 70 70 65 6e 64 20 61 6e  wiki.  Append an
6ca0: 20 3c 61 3e 20 6d 61 72 6b 75 70 20 74 6f 20 74   <a> markup to t
6cb0: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
6cc0: 20 52 65 6e 64 65 72 65 72 2e 0a 2a 2a 0a 2a 2a   Renderer..**.**
6cd0: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
6ce0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6f 72  routine might or
6cf0: 20 6d 69 67 68 74 20 6e 6f 74 20 61 70 70 65 6e   might not appen
6d00: 64 20 74 68 65 20 68 79 70 65 72 6c 69 6e 6b 2c  d the hyperlink,
6d10: 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e   depending.** on
6d20: 20 63 75 72 72 65 6e 74 20 72 65 6e 64 65 72 69   current renderi
6d30: 6e 67 20 72 75 6c 65 73 3a 20 73 70 65 63 69 66  ng rules: specif
6d40: 69 63 61 6c 6c 79 20 64 6f 65 73 20 74 68 65 20  ically does the 
6d50: 63 75 72 72 65 6e 74 20 75 73 65 72 20 68 61 76  current user hav
6d60: 65 0a 2a 2a 20 22 48 69 73 74 6f 72 79 22 20 70  e.** "History" p
6d70: 65 72 6d 69 73 73 69 6f 6e 2e 20 20 49 66 20 74  ermission.  If t
6d80: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
6d90: 20 61 70 70 65 6e 64 20 74 68 65 20 3c 61 3e 20   append the <a> 
6da0: 61 6e 64 20 74 68 75 73 20 6e 65 65 64 73 0a 2a  and thus needs.*
6db0: 2a 20 61 20 3c 2f 61 3e 20 74 6f 20 66 6f 6c 6c  * a </a> to foll
6dc0: 6f 77 2c 20 69 74 20 72 65 74 75 72 6e 73 20 74  ow, it returns t
6dd0: 72 75 65 2e 20 20 49 66 20 74 68 65 20 3c 61 3e  rue.  If the <a>
6de0: 20 69 73 20 73 75 70 70 72 65 73 73 65 64 2c 20   is suppressed, 
6df0: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 66  then return.** f
6e00: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  alse..**.** If n
6e10: 44 69 73 70 6c 61 79 3e 30 20 74 68 65 6e 20 6f  Display>0 then o
6e20: 70 74 69 6f 6e 61 6c 6c 79 20 77 72 69 74 65 20  ptionally write 
6e30: 75 70 20 74 6f 20 6e 44 69 73 70 6c 61 79 20 62  up to nDisplay b
6e40: 79 74 65 73 20 6f 66 20 0a 2a 2a 20 61 6c 74 65  ytes of .** alte
6e50: 72 6e 61 74 69 76 65 20 64 69 73 70 6c 61 79 20  rnative display 
6e60: 74 65 78 74 20 69 6e 74 6f 20 7a 44 69 73 70 6c  text into zDispl
6e70: 61 79 2e 20 20 54 68 65 20 74 65 78 74 20 6d 75  ay.  The text mu
6e80: 73 74 20 62 65 20 7a 65 72 6f 0a 2a 2a 20 74 65  st be zero.** te
6e90: 72 6d 69 6e 61 74 65 64 2e 20 20 54 68 65 20 66  rminated.  The f
6ea0: 69 6e 61 6c 20 7a 65 72 6f 20 69 73 20 69 6e 63  inal zero is inc
6eb0: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 6e 44 69  luded in the nDi
6ec0: 73 70 6c 61 79 20 62 79 74 65 20 63 6f 75 6e 74  splay byte count
6ed0: 0a 2a 2a 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 73 74  .** limit..*/.st
6ee0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
6ef0: 48 79 70 65 72 6c 69 6e 6b 28 0a 20 20 52 65 6e  Hyperlink(.  Ren
6f00: 64 65 72 65 72 20 2a 70 2c 20 20 20 20 20 20 20  derer *p,       
6f10: 20 20 20 20 20 2f 2a 20 52 65 6e 64 65 72 69 6e       /* Renderin
6f20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  g context */.  c
6f30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
6f40: 65 74 2c 20 20 20 20 2f 2a 20 48 79 70 65 72 6c  et,    /* Hyperl
6f50: 69 6e 6b 20 74 72 61 67 65 74 3b 20 74 65 78 74  ink traget; text
6f60: 20 77 69 74 68 69 6e 20 5b 2e 2e 2e 5d 20 2a 2f   within [...] */
6f70: 0a 20 20 63 68 61 72 20 2a 7a 44 69 73 70 6c 61  .  char *zDispla
6f80: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  y,         /* Sp
6f90: 61 63 65 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ace in which to 
6fa0: 77 72 69 74 65 20 61 6c 74 65 72 6e 61 74 69 76  write alternativ
6fb0: 65 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69  e display */.  i
6fc0: 6e 74 20 6e 44 69 73 70 6c 61 79 20 20 20 20 20  nt nDisplay     
6fd0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
6fe0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 44 69  available in zDi
6ff0: 73 70 6c 61 79 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  splay[] */.){.  
7000: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  int rc = 0;.  if
7010: 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65  ( strncmp(zTarge
7020: 74 2c 20 22 68 74 74 70 3a 22 2c 20 35 29 3d 3d  t, "http:", 5)==
7030: 30 20 0a 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70  0 .   || strncmp
7040: 28 7a 54 61 72 67 65 74 2c 20 22 68 74 74 70 73  (zTarget, "https
7050: 3a 22 2c 20 36 29 3d 3d 30 0a 20 20 20 7c 7c 20  :", 6)==0.   || 
7060: 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c  strncmp(zTarget,
7070: 20 22 66 74 70 3a 22 2c 20 34 29 3d 3d 30 20 0a   "ftp:", 4)==0 .
7080: 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54     || strncmp(zT
7090: 61 72 67 65 74 2c 20 22 6d 61 69 6c 74 6f 3a 22  arget, "mailto:"
70a0: 2c 20 37 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  , 7)==0.  ){.   
70b0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d   blob_appendf(p-
70c0: 3e 70 4f 75 74 2c 20 22 3c 61 20 68 72 65 66 3d  >pOut, "<a href=
70d0: 5c 22 25 73 5c 22 3e 22 2c 20 7a 54 61 72 67 65  \"%s\">", zTarge
70e0: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  t);.    rc = 1;.
70f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 72    }else if( zTar
7100: 67 65 74 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20  get[0]=='/' ){. 
7110: 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f     if( g.okHisto
7120: 72 79 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  ry ){.      blob
7130: 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74  _appendf(p->pOut
7140: 2c 20 22 3c 61 20 68 72 65 66 3d 5c 22 25 73 25  , "<a href=\"%s%
7150: 68 5c 22 3e 22 2c 20 67 2e 7a 42 61 73 65 55 52  h\">", g.zBaseUR
7160: 4c 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20  L, zTarget);.   
7170: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
7180: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 5f  .  }else if( is_
7190: 76 61 6c 69 64 5f 75 75 69 64 28 7a 54 61 72 67  valid_uuid(zTarg
71a0: 65 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  et) ){.    int i
71b0: 73 43 6c 6f 73 65 64 3b 0a 20 20 20 20 69 66 28  sClosed;.    if(
71c0: 20 6e 44 69 73 70 6c 61 79 20 26 26 20 69 73 5f   nDisplay && is_
71d0: 74 69 63 6b 65 74 28 7a 54 61 72 67 65 74 2c 20  ticket(zTarget, 
71e0: 7a 44 69 73 70 6c 61 79 2c 20 6e 44 69 73 70 6c  zDisplay, nDispl
71f0: 61 79 2c 20 26 69 73 43 6c 6f 73 65 64 29 20 29  ay, &isClosed) )
7200: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
7210: 61 6c 20 64 69 73 70 6c 61 79 20 70 72 6f 63 65  al display proce
7220: 73 73 69 6e 67 20 66 6f 72 20 74 69 63 6b 65 74  ssing for ticket
7230: 73 2e 20 20 44 69 73 70 6c 61 79 20 74 68 65 20  s.  Display the 
7240: 68 79 70 65 72 6c 69 6e 6b 0a 20 20 20 20 20 20  hyperlink.      
7250: 2a 2a 20 61 73 20 63 72 6f 73 73 65 64 20 6f 75  ** as crossed ou
7260: 74 20 69 66 20 74 68 65 20 74 69 63 6b 65 74 20  t if the ticket 
7270: 69 73 20 63 6c 6f 73 65 64 2e 20 20 41 64 64 20  is closed.  Add 
7280: 74 68 65 20 74 69 74 6c 65 20 61 66 74 65 72 20  the title after 
7290: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 68 79 70  the.      ** hyp
72a0: 65 72 6c 69 6e 6b 2e 0a 20 20 20 20 20 20 2a 2f  erlink..      */
72b0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 43 6c 6f  .      if( isClo
72c0: 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69  sed ){.        i
72d0: 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29  f( g.okHistory )
72e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  {.          blob
72f0: 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74  _appendf(p->pOut
7300: 2c 22 3c 61 20 68 72 65 66 3d 5c 22 25 73 2f 69  ,"<a href=\"%s/i
7310: 6e 66 6f 2f 25 73 5c 22 3e 5b 3c 73 3e 25 73 3c  nfo/%s\">[<s>%s<
7320: 2f 73 3e 5d 3c 2f 61 3e 3a 20 25 73 22 2c 0a 20  /s>]</a>: %s",. 
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a               g.z
7340: 42 61 73 65 55 52 4c 2c 20 7a 54 61 72 67 65 74  BaseURL, zTarget
7350: 2c 20 7a 54 61 72 67 65 74 2c 20 7a 44 69 73 70  , zTarget, zDisp
7360: 6c 61 79 0a 20 20 20 20 20 20 20 20 20 20 29 3b  lay.          );
7370: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7380: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
7390: 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 22  ppendf(p->pOut,"
73a0: 5b 3c 73 3e 25 73 3c 2f 73 3e 5d 3a 20 25 73 22  [<s>%s</s>]: %s"
73b0: 2c 20 7a 54 61 72 67 65 74 2c 20 7a 44 69 73 70  , zTarget, zDisp
73c0: 6c 61 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lay);.        }.
73d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
73e0: 20 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73       if( g.okHis
73f0: 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tory ){.        
7400: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
7410: 2d 3e 70 4f 75 74 2c 22 3c 61 20 68 72 65 66 3d  ->pOut,"<a href=
7420: 5c 22 25 73 2f 69 6e 66 6f 2f 25 73 5c 22 3e 5b  \"%s/info/%s\">[
7430: 25 73 5d 3c 2f 61 3e 3a 20 25 73 22 2c 0a 20 20  %s]</a>: %s",.  
7440: 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 42              g.zB
7450: 61 73 65 55 52 4c 2c 20 7a 54 61 72 67 65 74 2c  aseURL, zTarget,
7460: 20 7a 54 61 72 67 65 74 2c 20 7a 44 69 73 70 6c   zTarget, zDispl
7470: 61 79 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  ay.          );.
7480: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7490: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70           blob_ap
74a0: 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 22 5b  pendf(p->pOut,"[
74b0: 25 73 5d 3a 20 25 73 22 2c 20 7a 54 61 72 67 65  %s]: %s", zTarge
74c0: 74 2c 20 7a 44 69 73 70 6c 61 79 29 3b 0a 20 20  t, zDisplay);.  
74d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74e0: 20 20 20 20 20 20 7a 44 69 73 70 6c 61 79 5b 30        zDisplay[0
74f0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7a  ] = ' ';.      z
7500: 44 69 73 70 6c 61 79 5b 31 5d 20 3d 20 30 3b 0a  Display[1] = 0;.
7510: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
7520: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 2e 6f 6b    }else if( g.ok
7530: 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20  History ){.     
7540: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d   blob_appendf(p-
7550: 3e 70 4f 75 74 2c 20 22 3c 61 20 68 72 65 66 3d  >pOut, "<a href=
7560: 5c 22 25 73 2f 69 6e 66 6f 2f 25 73 5c 22 3e 22  \"%s/info/%s\">"
7570: 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54  , g.zBaseURL, zT
7580: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 63  arget);.      rc
7590: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
75a0: 6c 73 65 20 69 66 28 20 77 69 6b 69 5f 6e 61 6d  lse if( wiki_nam
75b0: 65 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d 65 64 28  e_is_wellformed(
75c0: 7a 54 61 72 67 65 74 29 20 29 7b 0a 20 20 20 20  zTarget) ){.    
75d0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e  blob_appendf(p->
75e0: 70 4f 75 74 2c 20 22 3c 61 20 68 72 65 66 3d 5c  pOut, "<a href=\
75f0: 22 25 73 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25 54  "%s/wiki?name=%T
7600: 5c 22 3e 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c  \">", g.zBaseURL
7610: 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , zTarget);.    
7620: 72 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rc = 1;.  }else{
7630: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
7640: 66 28 70 2d 3e 70 4f 75 74 2c 20 22 5b 62 61 64  f(p->pOut, "[bad
7650: 2d 6c 69 6e 6b 3a 20 25 68 5d 22 2c 20 7a 54 61  -link: %h]", zTa
7660: 72 67 65 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  rget);.    rc = 
7670: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7680: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
7690: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
76a0: 20 67 69 76 65 6e 20 70 61 72 73 65 64 20 6d 61   given parsed ma
76b0: 72 6b 75 70 20 69 73 20 74 68 65 20 63 6f 72 72  rkup is the corr
76c0: 65 63 74 0a 2a 2a 20 3c 2f 76 65 72 62 61 74 69  ect.** </verbati
76d0: 6d 3e 20 74 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  m> tag..*/.stati
76e0: 63 20 69 6e 74 20 65 6e 64 56 65 72 62 61 74 69  c int endVerbati
76f0: 6d 28 52 65 6e 64 65 72 65 72 20 2a 70 2c 20 50  m(Renderer *p, P
7700: 61 72 73 65 64 4d 61 72 6b 75 70 20 2a 70 4d 61  arsedMarkup *pMa
7710: 72 6b 75 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  rkup){.  char *z
7720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
7730: 6e 56 65 72 62 61 74 69 6d 20 29 3b 0a 20 20 69  nVerbatim );.  i
7740: 66 28 20 70 4d 61 72 6b 75 70 2d 3e 69 43 6f 64  f( pMarkup->iCod
7750: 65 21 3d 4d 41 52 4b 55 50 5f 56 45 52 42 41 54  e!=MARKUP_VERBAT
7760: 49 4d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  IM ) return 0;. 
7770: 20 69 66 28 20 21 70 4d 61 72 6b 75 70 2d 3e 65   if( !pMarkup->e
7780: 6e 64 54 61 67 20 29 20 72 65 74 75 72 6e 20 30  ndTag ) return 0
7790: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 56 65 72 62  ;.  if( p->zVerb
77a0: 61 74 69 6d 49 64 3d 3d 30 20 29 20 72 65 74 75  atimId==0 ) retu
77b0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4d 61 72  rn 1;.  if( pMar
77c0: 6b 75 70 2d 3e 6e 41 74 74 72 21 3d 31 20 29 20  kup->nAttr!=1 ) 
77d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20  return 0;.  z = 
77e0: 70 4d 61 72 6b 75 70 2d 3e 61 41 74 74 72 5b 30  pMarkup->aAttr[0
77f0: 5d 2e 7a 56 61 6c 75 65 3b 0a 20 20 72 65 74 75  ].zValue;.  retu
7800: 72 6e 20 73 74 72 63 6d 70 28 7a 2c 20 70 2d 3e  rn strcmp(z, p->
7810: 7a 56 65 72 62 61 74 69 6d 49 64 29 3d 3d 30 3b  zVerbatimId)==0;
7820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7830: 20 74 68 65 20 4d 55 54 59 50 45 20 66 6f 72 20   the MUTYPE for 
7840: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
7850: 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tack..*/.static 
7860: 69 6e 74 20 73 74 61 63 6b 54 6f 70 54 79 70 65  int stackTopType
7870: 28 52 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20  (Renderer *p){. 
7880: 20 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3c 3d   if( p->nStack<=
7890: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
78a0: 72 65 74 75 72 6e 20 61 4d 61 72 6b 75 70 5b 70  return aMarkup[p
78b0: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61  ->aStack[p->nSta
78c0: 63 6b 2d 31 5d 2e 69 43 6f 64 65 5d 2e 69 54 79  ck-1].iCode].iTy
78d0: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  pe;.}../*.** Con
78e0: 76 65 72 74 20 74 68 65 20 77 69 6b 69 20 69 6e  vert the wiki in
78f0: 20 7a 5b 5d 20 69 6e 74 6f 20 68 74 6d 6c 20 69   z[] into html i
7900: 6e 20 74 68 65 20 72 65 6e 64 65 72 65 72 20 70  n the renderer p
7910: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 6e 64 65 72  .  The.** render
7920: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  er has already b
7930: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  een initialized.
7940: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7950: 69 6e 65 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ine will probabl
7960: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 6e  y modify the con
7970: 74 65 6e 74 20 6f 66 20 7a 5b 5d 2e 0a 2a 2f 0a  tent of z[]..*/.
7980: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6b 69  static void wiki
7990: 5f 72 65 6e 64 65 72 28 52 65 6e 64 65 72 65 72  _render(Renderer
79a0: 20 2a 70 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 20   *p, char *z){. 
79b0: 20 69 6e 74 20 74 6f 6b 65 6e 54 79 70 65 3b 0a   int tokenType;.
79c0: 20 20 50 61 72 73 65 64 4d 61 72 6b 75 70 20 6d    ParsedMarkup m
79d0: 61 72 6b 75 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  arkup;.  int n;.
79e0: 20 20 69 6e 74 20 69 6e 6c 69 6e 65 4f 6e 6c 79    int inlineOnly
79f0: 20 3d 20 28 70 2d 3e 73 74 61 74 65 20 26 20 49   = (p->state & I
7a00: 4e 4c 49 4e 45 5f 4d 41 52 4b 55 50 5f 4f 4e 4c  NLINE_MARKUP_ONL
7a10: 59 29 21 3d 30 3b 0a 0a 20 20 77 68 69 6c 65 28  Y)!=0;..  while(
7a20: 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 20 3d   z[0] ){.    n =
7a30: 20 6e 65 78 74 54 6f 6b 65 6e 28 7a 2c 20 70 2c   nextToken(z, p,
7a40: 20 26 74 6f 6b 65 6e 54 79 70 65 29 3b 0a 20 20   &tokenType);.  
7a50: 20 20 70 2d 3e 73 74 61 74 65 20 26 3d 20 7e 28    p->state &= ~(
7a60: 41 54 5f 4e 45 57 4c 49 4e 45 7c 41 54 5f 50 41  AT_NEWLINE|AT_PA
7a70: 52 41 47 52 41 50 48 29 3b 0a 20 20 20 20 73 77  RAGRAPH);.    sw
7a80: 69 74 63 68 28 20 74 6f 6b 65 6e 54 79 70 65 20  itch( tokenType 
7a90: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f  ){.      case TO
7aa0: 4b 45 4e 5f 50 41 52 41 47 52 41 50 48 3a 20 7b  KEN_PARAGRAPH: {
7ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 6c  .        if( inl
7ac0: 69 6e 65 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  ineOnly ){.     
7ad0: 20 20 20 20 20 2f 2a 20 62 6c 6f 62 5f 61 70 70       /* blob_app
7ae0: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 20 26  end(p->pOut, " &
7af0: 70 61 72 61 3b 20 22 2c 20 2d 31 29 3b 20 2a 2f  para; ", -1); */
7b00: 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  .          blob_
7b10: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
7b20: 22 20 26 6e 62 73 70 3b 26 6e 62 73 70 3b 20 22  " &nbsp;&nbsp; "
7b30: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
7b40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7b50: 69 66 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74 20  if( p->wikiList 
7b60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
7b70: 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20  opStackToTag(p, 
7b80: 70 2d 3e 77 69 6b 69 4c 69 73 74 29 3b 0a 20 20  p->wikiList);.  
7b90: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 69 6b            p->wik
7ba0: 69 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  iList = 0;.     
7bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7bc0: 20 65 6e 64 41 75 74 6f 50 61 72 61 67 72 61 70   endAutoParagrap
7bd0: 68 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  h(p);.          
7be0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e  blob_appendf(p->
7bf0: 70 4f 75 74 2c 20 22 5c 6e 5c 6e 22 2c 20 31 29  pOut, "\n\n", 1)
7c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77  ;.          p->w
7c10: 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  antAutoParagraph
7c20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
7c30: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
7c40: 20 7c 3d 20 41 54 5f 50 41 52 41 47 52 41 50 48   |= AT_PARAGRAPH
7c50: 7c 41 54 5f 4e 45 57 4c 49 4e 45 3b 0a 20 20 20  |AT_NEWLINE;.   
7c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c70: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
7c80: 4f 4b 45 4e 5f 4e 45 57 4c 49 4e 45 3a 20 7b 0a  OKEN_NEWLINE: {.
7c90: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
7ca0: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 5c 6e  end(p->pOut, "\n
7cb0: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 1);.        p
7cc0: 2d 3e 73 74 61 74 65 20 7c 3d 20 41 54 5f 4e 45  ->state |= AT_NE
7cd0: 57 4c 49 4e 45 3b 0a 20 20 20 20 20 20 20 20 62  WLINE;.        b
7ce0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7cf0: 20 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 42      case TOKEN_B
7d00: 55 4c 4c 45 54 3a 20 7b 0a 20 20 20 20 20 20 20  ULLET: {.       
7d10: 20 69 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20   if( inlineOnly 
7d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  ){.          blo
7d30: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
7d40: 2c 20 22 20 26 23 31 34 39 3b 20 22 2c 20 2d 31  , " &#149; ", -1
7d50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7d60: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7d70: 70 2d 3e 77 69 6b 69 4c 69 73 74 21 3d 4d 41 52  p->wikiList!=MAR
7d80: 4b 55 50 5f 55 4c 20 29 7b 0a 20 20 20 20 20 20  KUP_UL ){.      
7d90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 77 69 6b        if( p->wik
7da0: 69 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  iList ){.       
7db0: 20 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54         popStackT
7dc0: 6f 54 61 67 28 70 2c 20 70 2d 3e 77 69 6b 69 4c  oTag(p, p->wikiL
7dd0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
7de0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7df0: 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52  pushStack(p, MAR
7e00: 4b 55 50 5f 55 4c 29 3b 0a 20 20 20 20 20 20 20  KUP_UL);.       
7e10: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
7e20: 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 75 6c 3e 22  (p->pOut, "<ul>"
7e30: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
7e40: 20 20 70 2d 3e 77 69 6b 69 4c 69 73 74 20 3d 20    p->wikiList = 
7e50: 4d 41 52 4b 55 50 5f 55 4c 3b 0a 20 20 20 20 20  MARKUP_UL;.     
7e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7e70: 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70   popStackToTag(p
7e80: 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a 20 20  , MARKUP_LI);.  
7e90: 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75 74          startAut
7ea0: 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20  oParagraph(p);. 
7eb0: 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61           pushSta
7ec0: 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49 29  ck(p, MARKUP_LI)
7ed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  ;.          blob
7ee0: 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c  _append(p->pOut,
7ef0: 20 22 3c 6c 69 3e 22 2c 20 34 29 3b 0a 20 20 20   "<li>", 4);.   
7f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
7f10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7f20: 20 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 45      case TOKEN_E
7f30: 4e 55 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  NUM: {.        i
7f40: 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20 29 7b  f( inlineOnly ){
7f50: 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  .          blob_
7f60: 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c  appendf(p->pOut,
7f70: 20 22 20 28 25 64 29 20 22 2c 20 61 74 6f 69 28   " (%d) ", atoi(
7f80: 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  z));.        }el
7f90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
7fa0: 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74 21 3d 4d  ( p->wikiList!=M
7fb0: 41 52 4b 55 50 5f 4f 4c 20 29 7b 0a 20 20 20 20  ARKUP_OL ){.    
7fc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 77          if( p->w
7fd0: 69 6b 69 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ikiList ){.     
7fe0: 20 20 20 20 20 20 20 20 20 70 6f 70 53 74 61 63           popStac
7ff0: 6b 54 6f 54 61 67 28 70 2c 20 70 2d 3e 77 69 6b  kToTag(p, p->wik
8000: 69 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  iList);.        
8010: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8020: 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d    pushStack(p, M
8030: 41 52 4b 55 50 5f 4f 4c 29 3b 0a 20 20 20 20 20  ARKUP_OL);.     
8040: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
8050: 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 6f 6c  nd(p->pOut, "<ol
8060: 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  >", 4);.        
8070: 20 20 20 20 70 2d 3e 77 69 6b 69 4c 69 73 74 20      p->wikiList 
8080: 3d 20 4d 41 52 4b 55 50 5f 4f 4c 3b 0a 20 20 20  = MARKUP_OL;.   
8090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
80a0: 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67     popStackToTag
80b0: 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a  (p, MARKUP_LI);.
80c0: 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 41            startA
80d0: 75 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b  utoParagraph(p);
80e0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53  .          pushS
80f0: 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4c  tack(p, MARKUP_L
8100: 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c  I);.          bl
8110: 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f  ob_appendf(p->pO
8120: 75 74 2c 20 22 3c 6c 69 20 76 61 6c 75 65 3d 5c  ut, "<li value=\
8130: 22 25 64 5c 22 3e 22 2c 20 61 74 6f 69 28 7a 29  "%d\">", atoi(z)
8140: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8160: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
8170: 4f 4b 45 4e 5f 49 4e 44 45 4e 54 3a 20 7b 0a 20  OKEN_INDENT: {. 
8180: 20 20 20 20 20 20 20 69 66 28 20 21 69 6e 6c 69         if( !inli
8190: 6e 65 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  neOnly ){.      
81a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77      assert( p->w
81b0: 69 6b 69 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ikiList==0 );.  
81c0: 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63          pushStac
81d0: 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 42 4c 4f 43  k(p, MARKUP_BLOC
81e0: 4b 51 55 4f 54 45 29 3b 0a 20 20 20 20 20 20 20  KQUOTE);.       
81f0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
8200: 2d 3e 70 4f 75 74 2c 20 22 3c 62 6c 6f 63 6b 71  ->pOut, "<blockq
8210: 75 6f 74 65 3e 22 2c 20 2d 31 29 3b 0a 20 20 20  uote>", -1);.   
8220: 20 20 20 20 20 20 20 70 2d 3e 77 61 6e 74 41 75         p->wantAu
8230: 74 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b  toParagraph = 0;
8240: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 69  .          p->wi
8250: 6b 69 4c 69 73 74 20 3d 20 4d 41 52 4b 55 50 5f  kiList = MARKUP_
8260: 42 4c 4f 43 4b 51 55 4f 54 45 3b 0a 20 20 20 20  BLOCKQUOTE;.    
8270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
8280: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8290: 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 43 48     case TOKEN_CH
82a0: 41 52 41 43 54 45 52 3a 20 7b 0a 20 20 20 20 20  ARACTER: {.     
82b0: 20 20 20 73 74 61 72 74 41 75 74 6f 50 61 72 61     startAutoPara
82c0: 67 72 61 70 68 28 70 29 3b 0a 20 20 20 20 20 20  graph(p);.      
82d0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3c 27 20    if( z[0]=='<' 
82e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  ){.          blo
82f0: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
8300: 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a 20 20  , "&lt;", 4);.  
8310: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8320: 7a 5b 30 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[0]=='&' ){.   
8330: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
8340: 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 26 61 6d  nd(p->pOut, "&am
8350: 70 3b 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 20  p;", 5);.       
8360: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
8370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8380: 63 61 73 65 20 54 4f 4b 45 4e 5f 4c 49 4e 4b 3a  case TOKEN_LINK:
8390: 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20   {.        char 
83a0: 2a 7a 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20  *zTarget;.      
83b0: 20 20 63 68 61 72 20 2a 7a 44 69 73 70 6c 61 79    char *zDisplay
83c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
83d0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 20 20  t i, j;.        
83e0: 69 6e 74 20 73 61 76 65 64 53 74 61 74 65 3b 0a  int savedState;.
83f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 65 65 64          int need
8400: 43 6c 6f 73 65 41 3b 0a 20 20 20 20 20 20 20 20  CloseA;.        
8410: 69 6e 74 20 61 6c 74 53 69 7a 65 3b 0a 20 20 20  int altSize;.   
8420: 20 20 20 20 20 63 68 61 72 20 7a 41 6c 74 44 69       char zAltDi
8430: 73 70 6c 61 79 5b 31 30 30 5d 3b 0a 0a 20 20 20  splay[100];..   
8440: 20 20 20 20 20 73 74 61 72 74 41 75 74 6f 50 61       startAutoPa
8450: 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20 20 20  ragraph(p);.    
8460: 20 20 20 20 7a 54 61 72 67 65 74 20 3d 20 26 7a      zTarget = &z
8470: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  [1];.        for
8480: 28 69 3d 31 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b  (i=1; z[i] && z[
8490: 69 5d 21 3d 27 5d 27 3b 20 69 2b 2b 29 7b 0a 20  i]!=']'; i++){. 
84a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
84b0: 5d 3d 3d 27 7c 27 20 26 26 20 7a 44 69 73 70 6c  ]=='|' && zDispl
84c0: 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ay==0 ){.       
84d0: 20 20 20 20 20 7a 44 69 73 70 6c 61 79 20 3d 20       zDisplay = 
84e0: 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20  &z[i+1];.       
84f0: 20 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20       z[i] = 0;. 
8500: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
8510: 3d 69 2d 31 3b 20 6a 3e 30 20 26 26 20 69 73 73  =i-1; j>0 && iss
8520: 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2d 2d 29  pace(z[j]); j--)
8530: 7b 20 7a 5b 6a 5d 20 3d 20 30 3b 20 7d 0a 20 20  { z[j] = 0; }.  
8540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8550: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 69 5d    }.        z[i]
8560: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
8570: 28 20 7a 44 69 73 70 6c 61 79 3d 3d 30 20 29 7b  ( zDisplay==0 ){
8580: 0a 20 20 20 20 20 20 20 20 20 20 7a 44 69 73 70  .          zDisp
8590: 6c 61 79 20 3d 20 7a 54 61 72 67 65 74 3b 0a 20  lay = zTarget;. 
85a0: 20 20 20 20 20 20 20 20 20 61 6c 74 53 69 7a 65           altSize
85b0: 20 3d 20 73 69 7a 65 6f 66 28 7a 41 6c 74 44 69   = sizeof(zAltDi
85c0: 73 70 6c 61 79 29 3b 0a 20 20 20 20 20 20 20 20  splay);.        
85d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
85e0: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
85f0: 2a 7a 44 69 73 70 6c 61 79 29 20 29 20 7a 44 69  *zDisplay) ) zDi
8600: 73 70 6c 61 79 2b 2b 3b 0a 20 20 20 20 20 20 20  splay++;.       
8610: 20 20 20 61 6c 74 53 69 7a 65 20 3d 20 30 3b 0a     altSize = 0;.
8620: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8630: 20 20 7a 41 6c 74 44 69 73 70 6c 61 79 5b 30 5d    zAltDisplay[0]
8640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65   = 0;.        ne
8650: 65 64 43 6c 6f 73 65 41 20 3d 20 72 65 73 6f 6c  edCloseA = resol
8660: 76 65 48 79 70 65 72 6c 69 6e 6b 28 70 2c 20 7a  veHyperlink(p, z
8670: 54 61 72 67 65 74 2c 20 7a 41 6c 74 44 69 73 70  Target, zAltDisp
8680: 6c 61 79 2c 20 61 6c 74 53 69 7a 65 29 3b 0a 20  lay, altSize);. 
8690: 20 20 20 20 20 20 20 73 61 76 65 64 53 74 61 74         savedStat
86a0: 65 20 3d 20 70 2d 3e 73 74 61 74 65 3b 0a 20 20  e = p->state;.  
86b0: 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 26        p->state &
86c0: 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20  = ~ALLOW_WIKI;. 
86d0: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
86e0: 7c 3d 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f 4f  |= FONT_MARKUP_O
86f0: 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NLY;.        if(
8700: 20 7a 41 6c 74 44 69 73 70 6c 61 79 5b 30 5d 20   zAltDisplay[0] 
8710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6b  ){.          wik
8720: 69 5f 72 65 6e 64 65 72 28 70 2c 20 7a 41 6c 74  i_render(p, zAlt
8730: 44 69 73 70 6c 61 79 29 3b 0a 20 20 20 20 20 20  Display);.      
8740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8750: 20 20 20 77 69 6b 69 5f 72 65 6e 64 65 72 28 70     wiki_render(p
8760: 2c 20 7a 44 69 73 70 6c 61 79 29 3b 0a 20 20 20  , zDisplay);.   
8770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
8780: 2d 3e 73 74 61 74 65 20 3d 20 73 61 76 65 64 53  ->state = savedS
8790: 74 61 74 65 3b 0a 20 20 20 20 20 20 20 20 69 66  tate;.        if
87a0: 28 20 6e 65 65 64 43 6c 6f 73 65 41 20 29 20 62  ( needCloseA ) b
87b0: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
87c0: 75 74 2c 20 22 3c 2f 61 3e 22 2c 20 34 29 3b 0a  ut, "</a>", 4);.
87d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
87e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
87f0: 65 20 54 4f 4b 45 4e 5f 54 45 58 54 3a 20 7b 0a  e TOKEN_TEXT: {.
8800: 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75 74          startAut
8810: 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20  oParagraph(p);. 
8820: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
8830: 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 7a 2c 20 6e  nd(p->pOut, z, n
8840: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
8850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8860: 63 61 73 65 20 54 4f 4b 45 4e 5f 4d 41 52 4b 55  case TOKEN_MARKU
8870: 50 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  P: {.        con
8880: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20  st char *zId;.  
8890: 20 20 20 20 20 20 69 6e 74 20 69 44 69 76 3b 0a        int iDiv;.
88a0: 20 20 20 20 20 20 20 20 70 61 72 73 65 4d 61 72          parseMar
88b0: 6b 75 70 28 26 6d 61 72 6b 75 70 2c 20 7a 29 3b  kup(&markup, z);
88c0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72  ..        /* Mar
88d0: 6b 75 70 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  kup of the form 
88e0: 3c 2f 64 69 76 20 69 64 3d 49 44 3e 20 77 68 65  </div id=ID> whe
88f0: 72 65 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  re there is a ma
8900: 74 63 68 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  tching.        *
8910: 2a 20 49 44 20 73 6f 6d 65 77 68 65 72 65 20 6f  * ID somewhere o
8920: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 45 78  n the stack.  Ex
8930: 69 74 20 74 68 65 20 76 65 72 62 61 74 69 6d 20  it the verbatim 
8940: 69 66 20 77 65 72 65 20 61 72 65 20 69 6e 0a 20  if were are in. 
8950: 20 20 20 20 20 20 20 2a 2a 20 69 74 2e 20 20 50         ** it.  P
8960: 6f 70 20 74 68 65 20 73 74 61 63 6b 20 75 70 20  op the stack up 
8970: 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  to the matching 
8980: 3c 64 69 76 3e 2e 20 20 44 69 73 63 61 72 64 20  <div>.  Discard 
8990: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
89a0: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 2a  </div>.        *
89b0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61  /.        if( ma
89c0: 72 6b 75 70 2e 69 43 6f 64 65 3d 3d 4d 41 52 4b  rkup.iCode==MARK
89d0: 55 50 5f 44 49 56 20 26 26 20 6d 61 72 6b 75 70  UP_DIV && markup
89e0: 2e 65 6e 64 54 61 67 20 26 26 0a 20 20 20 20 20  .endTag &&.     
89f0: 20 20 20 20 20 20 20 20 28 7a 49 64 20 3d 20 6d          (zId = m
8a00: 61 72 6b 75 70 49 64 28 26 6d 61 72 6b 75 70 29  arkupId(&markup)
8a10: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
8a20: 20 20 20 20 20 28 69 44 69 76 20 3d 20 66 69 6e       (iDiv = fin
8a30: 64 54 61 67 57 69 74 68 49 64 28 70 2c 20 4d 41  dTagWithId(p, MA
8a40: 52 4b 55 50 5f 44 49 56 2c 20 7a 49 64 29 29 3e  RKUP_DIV, zId))>
8a50: 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
8a60: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
8a70: 6e 56 65 72 62 61 74 69 6d 20 29 7b 0a 20 20 20  nVerbatim ){.   
8a80: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65           p->inVe
8a90: 72 62 61 74 69 6d 20 3d 20 30 3b 0a 20 20 20 20  rbatim = 0;.    
8aa0: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
8ab0: 20 3d 20 70 2d 3e 70 72 65 56 65 72 62 53 74 61   = p->preVerbSta
8ac0: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  te;.            
8ad0: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70  blob_append(p->p
8ae0: 4f 75 74 2c 20 22 3c 2f 70 72 65 3e 22 2c 20 36  Out, "</pre>", 6
8af0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8b00: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
8b10: 70 2d 3e 6e 53 74 61 63 6b 3e 69 44 69 76 2b 31  p->nStack>iDiv+1
8b20: 20 29 20 70 6f 70 53 74 61 63 6b 28 70 29 3b 0a   ) popStack(p);.
8b30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
8b40: 3e 61 53 74 61 63 6b 5b 69 44 69 76 5d 2e 61 6c  >aStack[iDiv].al
8b50: 6c 6f 77 57 69 6b 69 20 29 7b 0a 20 20 20 20 20  lowWiki ){.     
8b60: 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20         p->state 
8b70: 7c 3d 20 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20  |= ALLOW_WIKI;. 
8b80: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73              p->s
8ba0: 74 61 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57  tate &= ~ALLOW_W
8bb0: 49 4b 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  IKI;.          }
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8bd0: 74 28 20 70 2d 3e 6e 53 74 61 63 6b 3d 3d 69 44  t( p->nStack==iD
8be0: 69 76 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  iv+1 );.        
8bf0: 20 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a 20    p->nStack--;. 
8c00: 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20         }else..  
8c10: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 69 74 68        /* If with
8c20: 69 6e 20 3c 76 65 72 62 61 74 69 6d 20 69 64 3d  in <verbatim id=
8c30: 49 44 3e 20 69 67 6e 6f 72 65 20 65 76 65 72 79  ID> ignore every
8c40: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
8c50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 3c 2f 76 65  .        ** </ve
8c60: 72 62 61 74 69 6d 20 69 64 3d 49 44 3e 20 61 6e  rbatim id=ID> an
8c70: 64 20 74 68 65 20 3c 2f 64 65 76 20 69 64 3d 49  d the </dev id=I
8c80: 44 32 3e 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  D2> above..     
8c90: 20 20 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20     */           
8ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
8cb0: 69 6e 56 65 72 62 61 74 69 6d 20 29 7b 0a 20 20  inVerbatim ){.  
8cc0: 20 20 20 20 20 20 20 20 69 66 28 20 65 6e 64 56          if( endV
8cd0: 65 72 62 61 74 69 6d 28 70 2c 20 26 6d 61 72 6b  erbatim(p, &mark
8ce0: 75 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  up) ){.         
8cf0: 20 20 20 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d     p->inVerbatim
8d00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
8d10: 20 20 70 2d 3e 73 74 61 74 65 20 3d 20 70 2d 3e    p->state = p->
8d20: 70 72 65 56 65 72 62 53 74 61 74 65 3b 0a 20 20  preVerbState;.  
8d30: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
8d40: 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22  ppend(p->pOut, "
8d50: 3c 2f 70 72 65 3e 22 2c 20 36 29 3b 0a 20 20 20  </pre>", 6);.   
8d60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8d70: 20 20 20 20 20 20 20 20 20 20 75 6e 70 61 72 73            unpars
8d80: 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b 75 70 29  eMarkup(&markup)
8d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  ;.            bl
8da0: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
8db0: 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a 20  t, "&lt;", 4);. 
8dc0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31             n = 1
8dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8de0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20        }else..   
8df0: 20 20 20 20 20 2f 2a 20 52 65 6e 64 65 72 20 69       /* Render i
8e00: 6e 76 61 6c 69 64 20 6d 61 72 6b 75 70 20 6c 69  nvalid markup li
8e10: 74 65 72 61 6c 6c 79 2e 20 20 54 68 65 20 6d 61  terally.  The ma
8e20: 72 6b 75 70 20 61 70 70 65 61 72 73 20 69 6e 20  rkup appears in 
8e30: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
8e40: 69 6e 61 6c 20 6f 75 74 70 75 74 20 61 73 20 70  inal output as p
8e50: 6c 61 69 6e 20 74 65 78 74 2e 0a 20 20 20 20 20  lain text..     
8e60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
8e70: 28 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 3d 3d  ( markup.iCode==
8e80: 4d 41 52 4b 55 50 5f 49 4e 56 41 4c 49 44 20 29  MARKUP_INVALID )
8e90: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 70 61  {.          unpa
8ea0: 72 73 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b 75  rseMarkup(&marku
8eb0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  p);.          st
8ec0: 61 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68  artAutoParagraph
8ed0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (p);.          b
8ee0: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
8ef0: 75 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a  ut, "&lt;", 4);.
8f00: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b            n = 1;
8f10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a  .        }else..
8f20: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8f30: 65 20 6d 61 72 6b 75 70 20 69 73 20 6e 6f 74 20  e markup is not 
8f40: 66 6f 6e 74 2d 63 68 61 6e 67 65 20 6d 61 72 6b  font-change mark
8f50: 75 70 20 69 67 6e 6f 72 65 20 69 74 20 69 66 20  up ignore it if 
8f60: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
8f70: 6f 6e 74 2d 63 68 61 6e 67 65 2d 6f 6e 6c 79 20  ont-change-only 
8f80: 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 20  flag is set..   
8f90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8fa0: 69 66 28 20 28 6d 61 72 6b 75 70 2e 69 54 79 70  if( (markup.iTyp
8fb0: 65 26 4d 55 54 59 50 45 5f 46 4f 4e 54 29 3d 3d  e&MUTYPE_FONT)==
8fc0: 30 20 26 26 20 28 70 2d 3e 73 74 61 74 65 20 26  0 && (p->state &
8fd0: 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f 4f 4e 4c   FONT_MARKUP_ONL
8fe0: 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
8ff0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
9000: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
9010: 65 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 67  e..        /* Ig
9020: 6e 6f 72 65 20 62 6c 6f 63 6b 20 6d 61 72 6b 75  nore block marku
9030: 70 20 66 6f 72 20 69 6e 2d 6c 69 6e 65 20 72 65  p for in-line re
9040: 6e 64 65 72 69 6e 67 2e 0a 20 20 20 20 20 20 20  ndering..       
9050: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
9060: 69 6e 6c 69 6e 65 4f 6e 6c 79 20 26 26 20 28 6d  inlineOnly && (m
9070: 61 72 6b 75 70 2e 69 54 79 70 65 26 4d 55 54 59  arkup.iType&MUTY
9080: 50 45 5f 49 4e 4c 49 4e 45 29 3d 3d 30 20 29 7b  PE_INLINE)==0 ){
9090: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
90a0: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
90b0: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20      }else..     
90c0: 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 43     if( markup.iC
90d0: 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f 4e 4f 57 49  ode==MARKUP_NOWI
90e0: 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  KI ){.          
90f0: 69 66 28 20 6d 61 72 6b 75 70 2e 65 6e 64 54 61  if( markup.endTa
9100: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
9110: 20 70 2d 3e 73 74 61 74 65 20 7c 3d 20 41 4c 4c   p->state |= ALL
9120: 4f 57 5f 57 49 4b 49 3b 0a 20 20 20 20 20 20 20  OW_WIKI;.       
9130: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9140: 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 26        p->state &
9150: 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20  = ~ALLOW_WIKI;. 
9160: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9170: 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20     }else..      
9180: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 65 6e    /* Generate en
9190: 64 2d 74 61 67 73 20 2a 2f 0a 20 20 20 20 20 20  d-tags */.      
91a0: 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 65 6e 64    if( markup.end
91b0: 54 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tag ){.         
91c0: 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70   popStackToTag(p
91d0: 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b  , markup.iCode);
91e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a  .        }else..
91f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 73 68 20          /* Push 
9200: 3c 64 69 76 3e 20 6d 61 72 6b 75 70 20 6f 6e 74  <div> markup ont
9210: 6f 20 74 68 65 20 73 74 61 63 6b 20 74 6f 67 65  o the stack toge
9220: 74 68 65 72 20 77 69 74 68 20 74 68 65 20 69 64  ther with the id
9230: 3d 49 44 20 61 74 74 72 69 62 75 74 65 2e 0a 20  =ID attribute.. 
9240: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9250: 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 43 6f    if( markup.iCo
9260: 64 65 3d 3d 4d 41 52 4b 55 50 5f 44 49 56 20 29  de==MARKUP_DIV )
9270: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 73 68  {.          push
9280: 53 74 61 63 6b 57 69 74 68 49 64 28 70 2c 20 6d  StackWithId(p, m
9290: 61 72 6b 75 70 2e 69 43 6f 64 65 2c 20 6d 61 72  arkup.iCode, mar
92a0: 6b 75 70 49 64 28 26 6d 61 72 6b 75 70 29 2c 0a  kupId(&markup),.
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 73 74            (p->st
92d0: 61 74 65 20 26 20 41 4c 4c 4f 57 5f 57 49 4b 49  ate & ALLOW_WIKI
92e0: 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  )!=0);.        }
92f0: 65 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 2f 2a  else..        /*
9300: 20 45 6e 74 65 72 20 3c 76 65 72 62 61 74 69 6d   Enter <verbatim
9310: 3e 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 57  > processing.  W
9320: 69 74 68 20 76 65 72 62 61 74 69 6d 20 65 6e 61  ith verbatim ena
9330: 62 6c 65 64 2c 20 61 6c 6c 20 6f 74 68 65 72 0a  bled, all other.
9340: 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 72 6b 75          ** marku
9350: 70 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  p other than the
9360: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65   corresponding e
9370: 6e 64 2d 74 61 67 20 77 69 74 68 20 74 68 65 20  nd-tag with the 
9380: 73 61 6d 65 20 49 44 20 69 73 0a 20 20 20 20 20  same ID is.     
9390: 20 20 20 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 0a     ** ignored. .
93a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
93b0: 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 43     if( markup.iC
93c0: 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f 56 45 52 42  ode==MARKUP_VERB
93d0: 41 54 49 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  ATIM ){.        
93e0: 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 6e 41 74    if( markup.nAt
93f0: 74 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  tr==1 ){.       
9400: 20 20 20 20 20 70 2d 3e 7a 56 65 72 62 61 74 69       p->zVerbati
9410: 6d 49 64 20 3d 20 6d 61 72 6b 75 70 2e 61 41 74  mId = markup.aAt
9420: 74 72 5b 30 5d 2e 7a 56 61 6c 75 65 3b 0a 20 20  tr[0].zValue;.  
9430: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9440: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 56             p->zV
9450: 65 72 62 61 74 69 6d 49 64 20 3d 20 30 3b 0a 20  erbatimId = 0;. 
9460: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9470: 20 20 20 20 20 70 2d 3e 69 6e 56 65 72 62 61 74       p->inVerbat
9480: 69 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  im = 1;.        
9490: 20 20 70 2d 3e 70 72 65 56 65 72 62 53 74 61 74    p->preVerbStat
94a0: 65 20 3d 20 70 2d 3e 73 74 61 74 65 3b 0a 20 20  e = p->state;.  
94b0: 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74 65          p->state
94c0: 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b 49 3b   &= ~ALLOW_WIKI;
94d0: 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  .          blob_
94e0: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
94f0: 22 3c 70 72 65 20 63 6c 61 73 73 3d 27 76 65 72  "<pre class='ver
9500: 62 61 74 69 6d 27 3e 22 2c 2d 31 29 3b 0a 20 20  batim'>",-1);.  
9510: 20 20 20 20 20 20 20 20 70 2d 3e 77 61 6e 74 41          p->wantA
9520: 75 74 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30  utoParagraph = 0
9530: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
9540: 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 72 6b          if( mark
9550: 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54 59 50 45  up.iType==MUTYPE
9560: 5f 4c 49 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LI ){.         
9570: 20 69 66 28 20 62 61 63 6b 75 70 54 6f 54 79 70   if( backupToTyp
9580: 65 28 70 2c 20 4d 55 54 59 50 45 5f 4c 49 53 54  e(p, MUTYPE_LIST
9590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
95a0: 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c      pushStack(p,
95b0: 20 4d 41 52 4b 55 50 5f 55 4c 29 3b 0a 20 20 20   MARKUP_UL);.   
95c0: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70           blob_ap
95d0: 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c  pend(p->pOut, "<
95e0: 75 6c 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  ul>", 4);.      
95f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9600: 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52  pushStack(p, MAR
9610: 4b 55 50 5f 4c 49 29 3b 0a 20 20 20 20 20 20 20  KUP_LI);.       
9620: 20 20 20 72 65 6e 64 65 72 4d 61 72 6b 75 70 28     renderMarkup(
9630: 70 2d 3e 70 4f 75 74 2c 20 26 6d 61 72 6b 75 70  p->pOut, &markup
9640: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 72  .        if( mar
9660: 6b 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54 59 50  kup.iType==MUTYP
9670: 45 5f 54 52 20 29 7b 0a 20 20 20 20 20 20 20 20  E_TR ){.        
9680: 20 20 69 66 28 20 62 61 63 6b 75 70 54 6f 54 79    if( backupToTy
9690: 70 65 28 70 2c 20 4d 55 54 59 50 45 5f 54 41 42  pe(p, MUTYPE_TAB
96a0: 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LE) ){.         
96b0: 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20     pushStack(p, 
96c0: 4d 41 52 4b 55 50 5f 54 52 29 3b 0a 20 20 20 20  MARKUP_TR);.    
96d0: 20 20 20 20 20 20 20 20 72 65 6e 64 65 72 4d 61          renderMa
96e0: 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d  rkup(p->pOut, &m
96f0: 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  arkup);.        
9700: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
9710: 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61  e.        if( ma
9720: 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54 59  rkup.iType==MUTY
9730: 50 45 5f 54 44 20 29 7b 0a 20 20 20 20 20 20 20  PE_TD ){.       
9740: 20 20 20 69 66 28 20 62 61 63 6b 75 70 54 6f 54     if( backupToT
9750: 79 70 65 28 70 2c 20 4d 55 54 59 50 45 5f 54 41  ype(p, MUTYPE_TA
9760: 42 4c 45 7c 4d 55 54 59 50 45 5f 54 52 29 20 29  BLE|MUTYPE_TR) )
9770: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
9780: 28 20 73 74 61 63 6b 54 6f 70 54 79 70 65 28 70  ( stackTopType(p
9790: 29 3d 3d 4d 55 54 59 50 45 5f 54 41 42 4c 45 20  )==MUTYPE_TABLE 
97a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
97b0: 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41   pushStack(p, MA
97c0: 52 4b 55 50 5f 54 52 29 3b 0a 20 20 20 20 20 20  RKUP_TR);.      
97d0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
97e0: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 74  end(p->pOut, "<t
97f0: 72 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  r>", 4);.       
9800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9810: 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20     pushStack(p, 
9820: 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20  markup.iCode);. 
9830: 20 20 20 20 20 20 20 20 20 20 20 72 65 6e 64 65             rende
9840: 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c  rMarkup(p->pOut,
9850: 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20   &markup);.     
9860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9870: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
9880: 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d   markup.iType==M
9890: 55 54 59 50 45 5f 48 59 50 45 52 4c 49 4e 4b 20  UTYPE_HYPERLINK 
98a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 6f 70  ){.          pop
98b0: 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20 6d 61  StackToTag(p, ma
98c0: 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20 20 20  rkup.iCode);.   
98d0: 20 20 20 20 20 20 20 73 74 61 72 74 41 75 74 6f         startAuto
98e0: 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20  Paragraph(p);.  
98f0: 20 20 20 20 20 20 20 20 72 65 6e 64 65 72 4d 61          renderMa
9900: 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d  rkup(p->pOut, &m
9910: 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  arkup);.        
9920: 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 6d    pushStack(p, m
9930: 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20 20  arkup.iCode);.  
9940: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
9950: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
9960: 69 66 28 20 6d 61 72 6b 75 70 2e 69 54 79 70 65  if( markup.iType
9970: 3d 3d 4d 55 54 59 50 45 5f 46 4f 4e 54 20 29 7b  ==MUTYPE_FONT ){
9980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61  .            sta
9990: 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  rtAutoParagraph(
99a0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  p);.          }e
99b0: 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69  lse if( markup.i
99c0: 54 79 70 65 3d 3d 4d 55 54 59 50 45 5f 42 4c 4f  Type==MUTYPE_BLO
99d0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
99e0: 20 20 70 2d 3e 77 61 6e 74 41 75 74 6f 50 61 72    p->wantAutoPar
99f0: 61 67 72 61 70 68 20 3d 20 30 3b 0a 20 20 20 20  agraph = 0;.    
9a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9a10: 20 20 69 66 28 20 28 6d 61 72 6b 75 70 2e 69 54    if( (markup.iT
9a20: 79 70 65 20 26 20 4d 55 54 59 50 45 5f 53 54 41  ype & MUTYPE_STA
9a30: 43 4b 20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  CK )!=0 ){.     
9a40: 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63 6b         pushStack
9a50: 28 70 2c 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65  (p, markup.iCode
9a60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
9a70: 20 20 20 20 20 20 20 20 20 72 65 6e 64 65 72 4d           renderM
9a80: 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20 26  arkup(p->pOut, &
9a90: 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20 20  markup);.       
9aa0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
9ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ac0: 20 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20 20 7d 0a      z += n;.  }.
9ad0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  }.../*.** Transf
9ae0: 6f 72 6d 20 74 68 65 20 74 65 78 74 20 69 6e 20  orm the text in 
9af0: 74 68 65 20 70 49 6e 20 62 6c 6f 62 2e 20 20 57  the pIn blob.  W
9b00: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
9b10: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 70 4f 75  .** into the pOu
9b20: 74 20 62 6c 6f 62 2e 20 20 54 68 65 20 70 4f 75  t blob.  The pOu
9b30: 74 20 62 6c 6f 62 20 73 68 6f 75 6c 64 20 61 6c  t blob should al
9b40: 72 65 61 64 79 20 62 65 0a 2a 2a 20 69 6e 69 74  ready be.** init
9b50: 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6f 75  ialized.  The ou
9b60: 74 70 75 74 20 69 73 20 6d 65 72 65 6c 79 20 61  tput is merely a
9b70: 70 70 65 6e 64 65 64 20 74 6f 20 70 4f 75 74 2e  ppended to pOut.
9b80: 0a 2a 2a 20 49 66 20 70 4f 75 74 20 69 73 20 4e  .** If pOut is N
9b90: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 6f 75  ULL, then the ou
9ba0: 74 70 75 74 20 69 73 20 61 70 70 65 6e 64 65 64  tput is appended
9bb0: 20 74 6f 20 74 68 65 20 43 47 49 0a 2a 2a 20 72   to the CGI.** r
9bc0: 65 70 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 77 69  eply..*/.void wi
9bd0: 6b 69 5f 63 6f 6e 76 65 72 74 28 42 6c 6f 62 20  ki_convert(Blob 
9be0: 2a 70 49 6e 2c 20 42 6c 6f 62 20 2a 70 4f 75 74  *pIn, Blob *pOut
9bf0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9c00: 63 68 61 72 20 2a 7a 3b 0a 20 20 52 65 6e 64 65  char *z;.  Rende
9c10: 72 65 72 20 72 65 6e 64 65 72 65 72 3b 0a 20 20  rer renderer;.  
9c20: 0a 20 20 6d 65 6d 73 65 74 28 26 72 65 6e 64 65  .  memset(&rende
9c30: 72 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72  rer, 0, sizeof(r
9c40: 65 6e 64 65 72 65 72 29 29 3b 0a 20 20 72 65 6e  enderer));.  ren
9c50: 64 65 72 65 72 2e 73 74 61 74 65 20 3d 20 41 4c  derer.state = AL
9c60: 4c 4f 57 5f 57 49 4b 49 7c 41 54 5f 4e 45 57 4c  LOW_WIKI|AT_NEWL
9c70: 49 4e 45 7c 41 54 5f 50 41 52 41 47 52 41 50 48  INE|AT_PARAGRAPH
9c80: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
9c90: 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b 20 29 7b 0a  WIKI_NOBLOCK ){.
9ca0: 20 20 20 20 72 65 6e 64 65 72 65 72 2e 73 74 61      renderer.sta
9cb0: 74 65 20 7c 3d 20 49 4e 4c 49 4e 45 5f 4d 41 52  te |= INLINE_MAR
9cc0: 4b 55 50 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  KUP_ONLY;.  }.  
9cd0: 69 66 28 20 66 6c 61 67 73 20 26 20 57 49 4b 49  if( flags & WIKI
9ce0: 5f 49 4e 4c 49 4e 45 20 29 7b 0a 20 20 20 20 72  _INLINE ){.    r
9cf0: 65 6e 64 65 72 65 72 2e 77 61 6e 74 41 75 74 6f  enderer.wantAuto
9d00: 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b 0a 20  Paragraph = 0;. 
9d10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6e 64   }else{.    rend
9d20: 65 72 65 72 2e 77 61 6e 74 41 75 74 6f 50 61 72  erer.wantAutoPar
9d30: 61 67 72 61 70 68 20 3d 20 31 3b 0a 20 20 7d 0a  agraph = 1;.  }.
9d40: 20 20 69 66 28 20 70 4f 75 74 20 29 7b 0a 20 20    if( pOut ){.  
9d50: 20 20 72 65 6e 64 65 72 65 72 2e 70 4f 75 74 20    renderer.pOut 
9d60: 3d 20 70 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b  = pOut;.  }else{
9d70: 0a 20 20 20 20 72 65 6e 64 65 72 65 72 2e 70 4f  .    renderer.pO
9d80: 75 74 20 3d 20 63 67 69 5f 6f 75 74 70 75 74 5f  ut = cgi_output_
9d90: 62 6c 6f 62 28 29 3b 0a 20 20 7d 0a 0a 20 20 7a  blob();.  }..  z
9da0: 20 3d 20 62 6c 6f 62 5f 73 74 72 28 70 49 6e 29   = blob_str(pIn)
9db0: 3b 0a 20 20 77 69 6b 69 5f 72 65 6e 64 65 72 28  ;.  wiki_render(
9dc0: 26 72 65 6e 64 65 72 65 72 2c 20 7a 29 3b 0a 20  &renderer, z);. 
9dd0: 20 65 6e 64 41 75 74 6f 50 61 72 61 67 72 61 70   endAutoParagrap
9de0: 68 28 26 72 65 6e 64 65 72 65 72 29 3b 0a 20 20  h(&renderer);.  
9df0: 77 68 69 6c 65 28 20 72 65 6e 64 65 72 65 72 2e  while( renderer.
9e00: 6e 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 70 6f  nStack ){.    po
9e10: 70 53 74 61 63 6b 28 26 72 65 6e 64 65 72 65 72  pStack(&renderer
9e20: 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70  );.  }.  blob_ap
9e30: 70 65 6e 64 28 72 65 6e 64 65 72 65 72 2e 70 4f  pend(renderer.pO
9e40: 75 74 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20  ut, "\n", 1);.  
9e50: 66 72 65 65 28 72 65 6e 64 65 72 65 72 2e 61 53  free(renderer.aS
9e60: 74 61 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tack);.}../*.** 
9e70: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 77 69  COMMAND: test-wi
9e80: 6b 69 2d 72 65 6e 64 65 72 0a 2a 2f 0a 76 6f 69  ki-render.*/.voi
9e90: 64 20 74 65 73 74 5f 77 69 6b 69 5f 72 65 6e 64  d test_wiki_rend
9ea0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62  er(void){.  Blob
9eb0: 20 69 6e 2c 20 6f 75 74 3b 0a 20 20 69 66 28 20   in, out;.  if( 
9ec0: 67 2e 61 72 67 63 21 3d 33 20 29 20 75 73 61 67  g.argc!=3 ) usag
9ed0: 65 28 22 46 49 4c 45 22 29 3b 0a 20 20 62 6c 6f  e("FILE");.  blo
9ee0: 62 5f 7a 65 72 6f 28 26 6f 75 74 29 3b 0a 20 20  b_zero(&out);.  
9ef0: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66  blob_read_from_f
9f00: 69 6c 65 28 26 69 6e 2c 20 67 2e 61 72 67 76 5b  ile(&in, g.argv[
9f10: 32 5d 29 3b 0a 20 20 77 69 6b 69 5f 63 6f 6e 76  2]);.  wiki_conv
9f20: 65 72 74 28 26 69 6e 2c 20 26 6f 75 74 2c 20 30  ert(&in, &out, 0
9f30: 29 3b 0a 20 20 62 6c 6f 62 5f 77 72 69 74 65 5f  );.  blob_write_
9f40: 74 6f 5f 66 69 6c 65 28 26 6f 75 74 2c 20 22 2d  to_file(&out, "-
9f50: 22 29 3b 0a 7d 0a                                ");.}.