Hex Artifact Content
Not logged in

Artifact 33d82dd4cff9da2903d936a1f2d7a5920c660ba4:

File src/wikiformat.c part of check-in [bb542b80c7] - renamed fossil-verbatim to verbatim for consistency with other CSS elements. Added a reasonable default .verbatim entry. by stephan on 2008-05-16 15:54:00. Also file src/wikiformat.c part of check-in [81eb00def7] - Merge in stephan's fork. by drh on 2008-05-16 16:01:06.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 64 6f 20 66 6f 72 6d 61 74 74 69 6e 67 20  o do formatting 
0390: 6f 66 20 77 69 6b 69 20 74 65 78 74 2e 0a 2a 2f  of wiki text..*/
03a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
03b0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63  t.h>.#include "c
03c0: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64  onfig.h".#includ
03d0: 65 20 22 77 69 6b 69 66 6f 72 6d 61 74 2e 68 22  e "wikiformat.h"
03e0: 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a  ..#if INTERFACE.
03f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 77 69  /*.** Allowed wi
0400: 6b 69 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ki transformatio
0410: 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2f 0a  n operations.*/.
0420: 23 64 65 66 69 6e 65 20 57 49 4b 49 5f 4e 4f 46  #define WIKI_NOF
0430: 4f 4c 4c 4f 57 20 20 20 20 20 20 20 30 78 30 30  OLLOW       0x00
0440: 31 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 5f 48  1.#define WIKI_H
0450: 54 4d 4c 20 20 20 20 20 20 20 20 20 20 20 30 78  TML           0x
0460: 30 30 32 0a 23 64 65 66 69 6e 65 20 57 49 4b 49  002.#define WIKI
0470: 5f 49 4e 4c 49 4e 45 20 20 20 20 20 20 20 20 20  _INLINE         
0480: 30 78 30 30 34 20 20 2f 2a 20 44 6f 20 6e 6f 74  0x004  /* Do not
0490: 20 73 75 72 72 6f 75 6e 64 20 77 69 74 68 20 3c   surround with <
04a0: 70 3e 2e 2e 3c 2f 70 3e 20 2a 2f 0a 23 64 65 66  p>..</p> */.#def
04b0: 69 6e 65 20 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b  ine WIKI_NOBLOCK
04c0: 20 20 20 20 20 20 20 20 30 78 30 30 38 20 20 2f          0x008  /
04d0: 2a 20 4e 6f 20 62 6c 6f 63 6b 20 6d 61 72 6b 75  * No block marku
04e0: 70 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f  p of any kind */
04f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
0500: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 6f 6e  These are the on
0510: 6c 79 20 6d 61 72 6b 75 70 20 61 74 74 72 69 62  ly markup attrib
0520: 75 74 65 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f  utes allowed..*/
0530: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 41 4c  .#define ATTR_AL
0540: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
0550: 20 30 78 30 30 30 30 30 30 31 0a 23 64 65 66 69   0x0000001.#defi
0560: 6e 65 20 41 54 54 52 5f 41 4c 54 20 20 20 20 20  ne ATTR_ALT     
0570: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
0580: 30 30 30 32 0a 23 64 65 66 69 6e 65 20 41 54 54  0002.#define ATT
0590: 52 5f 42 47 43 4f 4c 4f 52 20 20 20 20 20 20 20  R_BGCOLOR       
05a0: 20 20 20 20 20 30 78 30 30 30 30 30 30 34 0a 23       0x0000004.#
05b0: 64 65 66 69 6e 65 20 41 54 54 52 5f 42 4f 52 44  define ATTR_BORD
05c0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
05d0: 78 30 30 30 30 30 30 38 0a 23 64 65 66 69 6e 65  x0000008.#define
05e0: 20 41 54 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e   ATTR_CELLPADDIN
05f0: 47 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30  G        0x00000
0600: 31 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  10.#define ATTR_
0610: 43 45 4c 4c 53 50 41 43 49 4e 47 20 20 20 20 20  CELLSPACING     
0620: 20 20 20 30 78 30 30 30 30 30 32 30 0a 23 64 65     0x0000020.#de
0630: 66 69 6e 65 20 41 54 54 52 5f 43 4c 45 41 52 20  fine ATTR_CLEAR 
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0650: 30 30 30 30 34 30 0a 23 64 65 66 69 6e 65 20 41  000040.#define A
0660: 54 54 52 5f 43 4f 4c 4f 52 20 20 20 20 20 20 20  TTR_COLOR       
0670: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 38 30         0x0000080
0680: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 43 4f  .#define ATTR_CO
0690: 4c 53 50 41 4e 20 20 20 20 20 20 20 20 20 20 20  LSPAN           
06a0: 20 30 78 30 30 30 30 31 30 30 0a 23 64 65 66 69   0x0000100.#defi
06b0: 6e 65 20 41 54 54 52 5f 43 4f 4d 50 41 43 54 20  ne ATTR_COMPACT 
06c0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
06d0: 30 32 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54  0200.#define ATT
06e0: 52 5f 46 41 43 45 20 20 20 20 20 20 20 20 20 20  R_FACE          
06f0: 20 20 20 20 20 30 78 30 30 30 30 34 30 30 0a 23       0x0000400.#
0700: 64 65 66 69 6e 65 20 41 54 54 52 5f 48 45 49 47  define ATTR_HEIG
0710: 48 54 20 20 20 20 20 20 20 20 20 20 20 20 20 30  HT             0
0720: 78 30 30 30 30 38 30 30 0a 23 64 65 66 69 6e 65  x0000800.#define
0730: 20 41 54 54 52 5f 48 52 45 46 20 20 20 20 20 20   ATTR_HREF      
0740: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 31 30           0x00010
0750: 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  00.#define ATTR_
0760: 48 53 50 41 43 45 20 20 20 20 20 20 20 20 20 20  HSPACE          
0770: 20 20 20 30 78 30 30 30 32 30 30 30 0a 23 64 65     0x0002000.#de
0780: 66 69 6e 65 20 41 54 54 52 5f 49 44 20 20 20 20  fine ATTR_ID    
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
07a0: 30 30 34 30 30 30 0a 23 64 65 66 69 6e 65 20 41  004000.#define A
07b0: 54 54 52 5f 4e 41 4d 45 20 20 20 20 20 20 20 20  TTR_NAME        
07c0: 20 20 20 20 20 20 20 30 78 30 30 30 38 30 30 30         0x0008000
07d0: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 52 4f  .#define ATTR_RO
07e0: 57 53 50 41 4e 20 20 20 20 20 20 20 20 20 20 20  WSPAN           
07f0: 20 30 78 30 30 31 30 30 30 30 0a 23 64 65 66 69   0x0010000.#defi
0800: 6e 65 20 41 54 54 52 5f 53 49 5a 45 20 20 20 20  ne ATTR_SIZE    
0810: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 32             0x002
0820: 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54  0000.#define ATT
0830: 52 5f 53 52 43 20 20 20 20 20 20 20 20 20 20 20  R_SRC           
0840: 20 20 20 20 20 30 78 30 30 34 30 30 30 30 0a 23       0x0040000.#
0850: 64 65 66 69 6e 65 20 41 54 54 52 5f 53 54 41 52  define ATTR_STAR
0860: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  T              0
0870: 78 30 30 38 30 30 30 30 0a 23 64 65 66 69 6e 65  x0080000.#define
0880: 20 41 54 54 52 5f 54 59 50 45 20 20 20 20 20 20   ATTR_TYPE      
0890: 20 20 20 20 20 20 20 20 20 30 78 30 31 30 30 30           0x01000
08a0: 30 30 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f  00.#define ATTR_
08b0: 56 41 4c 49 47 4e 20 20 20 20 20 20 20 20 20 20  VALIGN          
08c0: 20 20 20 30 78 30 32 30 30 30 30 30 0a 23 64 65     0x0200000.#de
08d0: 66 69 6e 65 20 41 54 54 52 5f 56 41 4c 55 45 20  fine ATTR_VALUE 
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
08f0: 34 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 41  400000.#define A
0900: 54 54 52 5f 56 53 50 41 43 45 20 20 20 20 20 20  TTR_VSPACE      
0910: 20 20 20 20 20 20 20 30 78 30 38 30 30 30 30 30         0x0800000
0920: 0a 23 64 65 66 69 6e 65 20 41 54 54 52 5f 57 49  .#define ATTR_WI
0930: 44 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  DTH             
0940: 20 30 78 31 30 30 30 30 30 30 0a 0a 73 74 61 74   0x1000000..stat
0950: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0960: 41 6c 6c 6f 77 65 64 41 74 74 72 69 62 75 74 65  AllowedAttribute
0970: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
0980: 2a 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67 6e  *zName;.  unsign
0990: 65 64 20 69 6e 74 20 69 4d 61 73 6b 3b 0a 7d 20  ed int iMask;.} 
09a0: 61 41 74 74 72 69 62 75 74 65 5b 5d 20 3d 20 7b  aAttribute[] = {
09b0: 0a 20 20 7b 20 30 2c 20 30 20 7d 2c 0a 20 20 7b  .  { 0, 0 },.  {
09c0: 20 22 61 6c 69 67 6e 22 2c 20 20 20 20 20 20 20   "align",       
09d0: 20 20 41 54 54 52 5f 41 4c 49 47 4e 2c 20 20 20    ATTR_ALIGN,   
09e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61         },.  { "a
09f0: 6c 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 41  lt",           A
0a00: 54 54 52 5f 41 4c 54 2c 20 20 20 20 20 20 20 20  TTR_ALT,        
0a10: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 62 67 63 6f      },.  { "bgco
0a20: 6c 6f 72 22 2c 20 20 20 20 20 20 20 41 54 54 52  lor",       ATTR
0a30: 5f 42 47 43 4f 4c 4f 52 2c 20 20 20 20 20 20 20  _BGCOLOR,       
0a40: 20 7d 2c 0a 20 20 7b 20 22 62 6f 72 64 65 72 22   },.  { "border"
0a50: 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f 42 4f  ,        ATTR_BO
0a60: 52 44 45 52 2c 20 20 20 20 20 20 20 20 20 7d 2c  RDER,         },
0a70: 0a 20 20 7b 20 22 63 65 6c 6c 70 61 64 64 69 6e  .  { "cellpaddin
0a80: 67 22 2c 20 20 20 41 54 54 52 5f 43 45 4c 4c 50  g",   ATTR_CELLP
0a90: 41 44 44 49 4e 47 2c 20 20 20 20 7d 2c 0a 20 20  ADDING,    },.  
0aa0: 7b 20 22 63 65 6c 6c 73 70 61 63 69 6e 67 22 2c  { "cellspacing",
0ab0: 20 20 20 41 54 54 52 5f 43 45 4c 4c 53 50 41 43     ATTR_CELLSPAC
0ac0: 49 4e 47 2c 20 20 20 20 7d 2c 0a 20 20 7b 20 22  ING,    },.  { "
0ad0: 63 6c 65 61 72 22 2c 20 20 20 20 20 20 20 20 20  clear",         
0ae0: 41 54 54 52 5f 43 4c 45 41 52 2c 20 20 20 20 20  ATTR_CLEAR,     
0af0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6c       },.  { "col
0b00: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 41 54 54  or",         ATT
0b10: 52 5f 43 4f 4c 4f 52 2c 20 20 20 20 20 20 20 20  R_COLOR,        
0b20: 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6c 73 70 61    },.  { "colspa
0b30: 6e 22 2c 20 20 20 20 20 20 20 41 54 54 52 5f 43  n",       ATTR_C
0b40: 4f 4c 53 50 41 4e 2c 20 20 20 20 20 20 20 20 7d  OLSPAN,        }
0b50: 2c 0a 20 20 7b 20 22 63 6f 6d 70 61 63 74 22 2c  ,.  { "compact",
0b60: 20 20 20 20 20 20 20 41 54 54 52 5f 43 4f 4d 50         ATTR_COMP
0b70: 41 43 54 2c 20 20 20 20 20 20 20 20 7d 2c 0a 20  ACT,        },. 
0b80: 20 7b 20 22 66 61 63 65 22 2c 20 20 20 20 20 20   { "face",      
0b90: 20 20 20 20 41 54 54 52 5f 46 41 43 45 2c 20 20      ATTR_FACE,  
0ba0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0bb0: 22 68 65 69 67 68 74 22 2c 20 20 20 20 20 20 20  "height",       
0bc0: 20 41 54 54 52 5f 48 45 49 47 48 54 2c 20 20 20   ATTR_HEIGHT,   
0bd0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 68 72        },.  { "hr
0be0: 65 66 22 2c 20 20 20 20 20 20 20 20 20 20 41 54  ef",          AT
0bf0: 54 52 5f 48 52 45 46 2c 20 20 20 20 20 20 20 20  TR_HREF,        
0c00: 20 20 20 7d 2c 0a 20 20 7b 20 22 68 73 70 61 63     },.  { "hspac
0c10: 65 22 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f  e",        ATTR_
0c20: 48 53 50 41 43 45 2c 20 20 20 20 20 20 20 20 20  HSPACE,         
0c30: 7d 2c 0a 20 20 7b 20 22 69 64 22 2c 20 20 20 20  },.  { "id",    
0c40: 20 20 20 20 20 20 20 20 41 54 54 52 5f 49 44 2c          ATTR_ID,
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
0c60: 20 20 7b 20 22 6e 61 6d 65 22 2c 20 20 20 20 20    { "name",     
0c70: 20 20 20 20 20 41 54 54 52 5f 4e 41 4d 45 2c 20       ATTR_NAME, 
0c80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
0c90: 20 22 72 6f 77 73 70 61 6e 22 2c 20 20 20 20 20   "rowspan",     
0ca0: 20 20 41 54 54 52 5f 52 4f 57 53 50 41 4e 2c 20    ATTR_ROWSPAN, 
0cb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73         },.  { "s
0cc0: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 41  ize",          A
0cd0: 54 54 52 5f 53 49 5a 45 2c 20 20 20 20 20 20 20  TTR_SIZE,       
0ce0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 72 63 22      },.  { "src"
0cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 41 54 54 52  ,           ATTR
0d00: 5f 53 52 43 2c 20 20 20 20 20 20 20 20 20 20 20  _SRC,           
0d10: 20 7d 2c 0a 20 20 7b 20 22 73 74 61 72 74 22 2c   },.  { "start",
0d20: 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 53 54           ATTR_ST
0d30: 41 52 54 2c 20 20 20 20 20 20 20 20 20 20 7d 2c  ART,          },
0d40: 0a 20 20 7b 20 22 74 79 70 65 22 2c 20 20 20 20  .  { "type",    
0d50: 20 20 20 20 20 20 41 54 54 52 5f 54 59 50 45 2c        ATTR_TYPE,
0d60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0d70: 7b 20 22 76 61 6c 69 67 6e 22 2c 20 20 20 20 20  { "valign",     
0d80: 20 20 20 41 54 54 52 5f 56 41 4c 49 47 4e 2c 20     ATTR_VALIGN, 
0d90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
0da0: 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20  value",         
0db0: 41 54 54 52 5f 56 41 4c 55 45 2c 20 20 20 20 20  ATTR_VALUE,     
0dc0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 76 73 70       },.  { "vsp
0dd0: 61 63 65 22 2c 20 20 20 20 20 20 20 20 41 54 54  ace",        ATT
0de0: 52 5f 56 53 50 41 43 45 2c 20 20 20 20 20 20 20  R_VSPACE,       
0df0: 20 20 7d 2c 0a 20 20 7b 20 22 77 69 64 74 68 22    },.  { "width"
0e00: 2c 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 57  ,         ATTR_W
0e10: 49 44 54 48 2c 20 20 20 20 20 20 20 20 20 20 7d  IDTH,          }
0e20: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20  ,.};../*.** Use 
0e30: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
0e40: 20 6c 6f 63 61 74 65 20 61 20 74 61 67 20 69 6e   locate a tag in
0e50: 20 74 68 65 20 61 41 74 74 72 69 62 75 74 65 5b   the aAttribute[
0e60: 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ] table..*/.stat
0e70: 69 63 20 69 6e 74 20 66 69 6e 64 41 74 74 72 28  ic int findAttr(
0e80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0e90: 20 20 69 6e 74 20 69 2c 20 63 2c 20 66 69 72 73    int i, c, firs
0ea0: 74 2c 20 6c 61 73 74 3b 0a 20 20 66 69 72 73 74  t, last;.  first
0eb0: 20 3d 20 31 3b 0a 20 20 6c 61 73 74 20 3d 20 73   = 1;.  last = s
0ec0: 69 7a 65 6f 66 28 61 41 74 74 72 69 62 75 74 65  izeof(aAttribute
0ed0: 29 2f 73 69 7a 65 6f 66 28 61 41 74 74 72 69 62  )/sizeof(aAttrib
0ee0: 75 74 65 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 77  ute[0]) - 1;.  w
0ef0: 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c 61 73  hile( first<=las
0f00: 74 20 29 7b 0a 20 20 20 20 69 20 3d 20 28 66 69  t ){.    i = (fi
0f10: 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20  rst+last)/2;.   
0f20: 20 63 20 3d 20 73 74 72 63 6d 70 28 61 41 74 74   c = strcmp(aAtt
0f30: 72 69 62 75 74 65 5b 69 5d 2e 7a 4e 61 6d 65 2c  ribute[i].zName,
0f40: 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d   z);.    if( c==
0f50: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
0f60: 6e 20 69 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n i;.    }else i
0f70: 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
0f80: 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20  first = i+1;.   
0f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
0fa0: 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20 7d 0a  st = i-1;.    }.
0fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
0fc0: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  }..../*.** Allow
0fd0: 65 64 20 6d 61 72 6b 75 70 2e 0a 2a 2a 0a 2a 2a  ed markup..**.**
0fe0: 20 45 78 63 65 70 74 20 66 6f 72 20 4d 41 52 4b   Except for MARK
0ff0: 55 50 5f 49 4e 56 41 4c 49 44 2c 20 74 68 69 73  UP_INVALID, this
1000: 20 6d 75 73 74 20 61 6c 6c 20 62 65 20 69 6e 20   must all be in 
1010: 61 6c 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64  alphabetical ord
1020: 65 72 0a 2a 2a 20 61 6e 64 20 69 6e 20 6e 75 6d  er.** and in num
1030: 65 72 69 63 61 6c 20 73 65 71 75 65 6e 63 65 2e  erical sequence.
1040: 20 20 54 68 65 20 66 69 72 73 74 20 6d 61 72 6b    The first mark
1050: 75 70 20 74 79 70 65 20 6d 75 73 74 20 62 65 20  up type must be 
1060: 7a 65 72 6f 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  zero..** The val
1070: 75 65 20 66 6f 72 20 4d 41 52 4b 55 50 5f 58 59  ue for MARKUP_XY
1080: 5a 20 6d 75 73 74 20 63 6f 72 72 65 73 70 6f 6e  Z must correspon
1090: 64 20 74 6f 20 74 68 65 20 3c 78 79 7a 3e 20 65  d to the <xyz> e
10a0: 6e 74 72 79 20 0a 2a 2a 20 69 6e 20 61 41 6c 6c  ntry .** in aAll
10b0: 6f 77 65 64 4d 61 72 6b 75 70 5b 5d 2e 0a 2a 2f  owedMarkup[]..*/
10c0: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
10d0: 49 4e 56 41 4c 49 44 20 20 20 20 20 20 20 20 20  INVALID         
10e0: 20 20 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b    0.#define MARK
10f0: 55 50 5f 41 20 20 20 20 20 20 20 20 20 20 20 20  UP_A            
1100: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4d       1.#define M
1110: 41 52 4b 55 50 5f 41 44 44 52 45 53 53 20 20 20  ARKUP_ADDRESS   
1120: 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e          2.#defin
1130: 65 20 4d 41 52 4b 55 50 5f 42 20 20 20 20 20 20  e MARKUP_B      
1140: 20 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65             3.#de
1150: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42 49 47 20  fine MARKUP_BIG 
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 0a                4.
1170: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 42  #define MARKUP_B
1180: 4c 4f 43 4b 51 55 4f 54 45 20 20 20 20 20 20 20  LOCKQUOTE       
1190: 20 35 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55   5.#define MARKU
11a0: 50 5f 42 52 20 20 20 20 20 20 20 20 20 20 20 20  P_BR            
11b0: 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4d 41      6.#define MA
11c0: 52 4b 55 50 5f 43 45 4e 54 45 52 20 20 20 20 20  RKUP_CENTER     
11d0: 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65         7.#define
11e0: 20 4d 41 52 4b 55 50 5f 43 49 54 45 20 20 20 20   MARKUP_CITE    
11f0: 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66            8.#def
1200: 69 6e 65 20 4d 41 52 4b 55 50 5f 43 4f 44 45 20  ine MARKUP_CODE 
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23               9.#
1220: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 44 44  define MARKUP_DD
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1240: 30 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  0.#define MARKUP
1250: 5f 44 46 4e 20 20 20 20 20 20 20 20 20 20 20 20  _DFN            
1260: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4d 41 52    11.#define MAR
1270: 4b 55 50 5f 44 4c 20 20 20 20 20 20 20 20 20 20  KUP_DL          
1280: 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65 20       12.#define 
1290: 4d 41 52 4b 55 50 5f 44 54 20 20 20 20 20 20 20  MARKUP_DT       
12a0: 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66 69          13.#defi
12b0: 6e 65 20 4d 41 52 4b 55 50 5f 45 4d 20 20 20 20  ne MARKUP_EM    
12c0: 20 20 20 20 20 20 20 20 20 20 20 31 34 0a 23 64             14.#d
12d0: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 46 4f 4e  efine MARKUP_FON
12e0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35  T             15
12f0: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1300: 48 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H1              
1310: 20 31 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   16.#define MARK
1320: 55 50 5f 48 32 20 20 20 20 20 20 20 20 20 20 20  UP_H2           
1330: 20 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 4d      17.#define M
1340: 41 52 4b 55 50 5f 48 33 20 20 20 20 20 20 20 20  ARKUP_H3        
1350: 20 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e         18.#defin
1360: 65 20 4d 41 52 4b 55 50 5f 48 34 20 20 20 20 20  e MARKUP_H4     
1370: 20 20 20 20 20 20 20 20 20 20 31 39 0a 23 64 65            19.#de
1380: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48 35 20 20  fine MARKUP_H5  
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 0a               20.
13a0: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 48  #define MARKUP_H
13b0: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13c0: 32 31 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  21.#define MARKU
13d0: 50 5f 48 52 20 20 20 20 20 20 20 20 20 20 20 20  P_HR            
13e0: 20 20 20 32 32 0a 23 64 65 66 69 6e 65 20 4d 41     22.#define MA
13f0: 52 4b 55 50 5f 49 20 20 20 20 20 20 20 20 20 20  RKUP_I          
1400: 20 20 20 20 20 20 32 33 0a 23 64 65 66 69 6e 65        23.#define
1410: 20 4d 41 52 4b 55 50 5f 49 4d 47 20 20 20 20 20   MARKUP_IMG     
1420: 20 20 20 20 20 20 20 20 20 32 34 0a 23 64 65 66           24.#def
1430: 69 6e 65 20 4d 41 52 4b 55 50 5f 4b 42 44 20 20  ine MARKUP_KBD  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 32 35 0a 23              25.#
1450: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 4c 49  define MARKUP_LI
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
1470: 36 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  6.#define MARKUP
1480: 5f 4e 4f 42 52 20 20 20 20 20 20 20 20 20 20 20  _NOBR           
1490: 20 20 32 37 0a 23 64 65 66 69 6e 65 20 4d 41 52    27.#define MAR
14a0: 4b 55 50 5f 4e 4f 57 49 4b 49 20 20 20 20 20 20  KUP_NOWIKI      
14b0: 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e 65 20       28.#define 
14c0: 4d 41 52 4b 55 50 5f 4f 4c 20 20 20 20 20 20 20  MARKUP_OL       
14d0: 20 20 20 20 20 20 20 20 32 39 0a 23 64 65 66 69          29.#defi
14e0: 6e 65 20 4d 41 52 4b 55 50 5f 50 20 20 20 20 20  ne MARKUP_P     
14f0: 20 20 20 20 20 20 20 20 20 20 20 33 30 0a 23 64             30.#d
1500: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 50 52 45  efine MARKUP_PRE
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 31                31
1520: 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f  .#define MARKUP_
1530: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
1540: 20 33 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b   32.#define MARK
1550: 55 50 5f 53 41 4d 50 20 20 20 20 20 20 20 20 20  UP_SAMP         
1560: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 4d      33.#define M
1570: 41 52 4b 55 50 5f 53 4d 41 4c 4c 20 20 20 20 20  ARKUP_SMALL     
1580: 20 20 20 20 20 20 20 33 34 0a 23 64 65 66 69 6e         34.#defin
1590: 65 20 4d 41 52 4b 55 50 5f 53 54 52 49 4b 45 20  e MARKUP_STRIKE 
15a0: 20 20 20 20 20 20 20 20 20 20 33 35 0a 23 64 65            35.#de
15b0: 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53 54 52 4f  fine MARKUP_STRO
15c0: 4e 47 20 20 20 20 20 20 20 20 20 20 20 33 36 0a  NG           36.
15d0: 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 53  #define MARKUP_S
15e0: 55 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  UB              
15f0: 33 37 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55  37.#define MARKU
1600: 50 5f 53 55 50 20 20 20 20 20 20 20 20 20 20 20  P_SUP           
1610: 20 20 20 33 38 0a 23 64 65 66 69 6e 65 20 4d 41     38.#define MA
1620: 52 4b 55 50 5f 54 41 42 4c 45 20 20 20 20 20 20  RKUP_TABLE      
1630: 20 20 20 20 20 20 33 39 0a 23 64 65 66 69 6e 65        39.#define
1640: 20 4d 41 52 4b 55 50 5f 54 44 20 20 20 20 20 20   MARKUP_TD      
1650: 20 20 20 20 20 20 20 20 20 34 30 0a 23 64 65 66           40.#def
1660: 69 6e 65 20 4d 41 52 4b 55 50 5f 54 48 20 20 20  ine MARKUP_TH   
1670: 20 20 20 20 20 20 20 20 20 20 20 20 34 31 0a 23              41.#
1680: 64 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 54 52  define MARKUP_TR
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
16a0: 32 0a 23 64 65 66 69 6e 65 20 4d 41 52 4b 55 50  2.#define MARKUP
16b0: 5f 54 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _TT             
16c0: 20 20 34 33 0a 23 64 65 66 69 6e 65 20 4d 41 52    43.#define MAR
16d0: 4b 55 50 5f 55 20 20 20 20 20 20 20 20 20 20 20  KUP_U           
16e0: 20 20 20 20 20 34 34 0a 23 64 65 66 69 6e 65 20       44.#define 
16f0: 4d 41 52 4b 55 50 5f 55 4c 20 20 20 20 20 20 20  MARKUP_UL       
1700: 20 20 20 20 20 20 20 20 34 35 0a 23 64 65 66 69          45.#defi
1710: 6e 65 20 4d 41 52 4b 55 50 5f 56 41 52 20 20 20  ne MARKUP_VAR   
1720: 20 20 20 20 20 20 20 20 20 20 20 34 36 0a 23 64             46.#d
1730: 65 66 69 6e 65 20 4d 41 52 4b 55 50 5f 56 45 52  efine MARKUP_VER
1740: 42 41 54 49 4d 20 20 20 20 20 20 20 20 20 34 37  BATIM         47
1750: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69  ../*.** The vari
1760: 6f 75 73 20 6d 61 72 6b 75 70 20 69 73 20 64 69  ous markup is di
1770: 76 69 64 65 64 20 69 6e 74 6f 20 74 68 65 20 66  vided into the f
1780: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 73 3a 0a  ollowing types:.
1790: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50  */.#define MUTYP
17a0: 45 5f 53 49 4e 47 4c 45 20 20 20 20 20 20 30 78  E_SINGLE      0x
17b0: 30 30 30 31 20 20 20 2f 2a 20 3c 69 6d 67 3e 2c  0001   /* <img>,
17c0: 20 3c 62 72 3e 2c 20 6f 72 20 3c 68 72 3e 20 2a   <br>, or <hr> *
17d0: 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45  /.#define MUTYPE
17e0: 5f 42 4c 4f 43 4b 20 20 20 20 20 20 20 30 78 30  _BLOCK       0x0
17f0: 30 30 32 20 20 20 2f 2a 20 46 6f 72 6d 73 20 61  002   /* Forms a
1800: 20 6e 65 77 20 70 61 72 61 67 72 61 70 68 2e 20   new paragraph. 
1810: 65 78 3a 20 3c 70 3e 2c 20 3c 68 32 3e 20 2a 2f  ex: <p>, <h2> */
1820: 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f  .#define MUTYPE_
1830: 46 4f 4e 54 20 20 20 20 20 20 20 20 30 78 30 30  FONT        0x00
1840: 30 34 20 20 20 2f 2a 20 46 6f 6e 74 20 63 68 61  04   /* Font cha
1850: 6e 67 65 73 2e 20 65 78 3a 20 3c 62 3e 2c 20 3c  nges. ex: <b>, <
1860: 66 6f 6e 74 3e 2c 20 3c 73 75 62 3e 20 2a 2f 0a  font>, <sub> */.
1870: 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 4c  #define MUTYPE_L
1880: 49 53 54 20 20 20 20 20 20 20 20 30 78 30 30 31  IST        0x001
1890: 30 20 20 20 2f 2a 20 4c 69 73 74 73 2e 20 20 3c  0   /* Lists.  <
18a0: 6f 6c 3e 2c 20 3c 75 6c 3e 2c 20 6f 72 20 3c 64  ol>, <ul>, or <d
18b0: 6c 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55  l> */.#define MU
18c0: 54 59 50 45 5f 4c 49 20 20 20 20 20 20 20 20 20  TYPE_LI         
18d0: 20 30 78 30 30 32 30 20 20 20 2f 2a 20 4c 69 73   0x0020   /* Lis
18e0: 74 20 69 74 65 6d 73 2e 20 20 3c 6c 69 3e 2c 20  t items.  <li>, 
18f0: 3c 64 64 3e 2c 20 3c 64 74 3e 20 2a 2f 0a 23 64  <dd>, <dt> */.#d
1900: 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 54 41 42  efine MUTYPE_TAB
1910: 4c 45 20 20 20 20 20 20 20 30 78 30 30 34 30 20  LE       0x0040 
1920: 20 20 2f 2a 20 3c 74 61 62 6c 65 3e 20 2a 2f 0a    /* <table> */.
1930: 23 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 54  #define MUTYPE_T
1940: 52 20 20 20 20 20 20 20 20 20 20 30 78 30 30 38  R          0x008
1950: 30 20 20 20 2f 2a 20 3c 74 72 3e 20 2a 2f 0a 23  0   /* <tr> */.#
1960: 64 65 66 69 6e 65 20 4d 55 54 59 50 45 5f 54 44  define MUTYPE_TD
1970: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 30 30            0x0100
1980: 20 20 20 2f 2a 20 3c 74 64 3e 20 6f 72 20 3c 74     /* <td> or <t
1990: 68 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55  h> */.#define MU
19a0: 54 59 50 45 5f 53 50 45 43 49 41 4c 20 20 20 20  TYPE_SPECIAL    
19b0: 20 30 78 30 32 30 30 20 20 20 2f 2a 20 3c 6e 6f   0x0200   /* <no
19c0: 77 69 6b 69 3e 20 6f 72 20 3c 76 65 72 62 61 74  wiki> or <verbat
19d0: 69 6d 3e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  im> */.#define M
19e0: 55 54 59 50 45 5f 48 59 50 45 52 4c 49 4e 4b 20  UTYPE_HYPERLINK 
19f0: 20 20 30 78 30 34 30 30 20 20 20 2f 2a 20 3c 61    0x0400   /* <a
1a00: 3e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  > */../*.** Thes
1a10: 65 20 6d 61 72 6b 75 70 20 74 79 70 65 73 20 6d  e markup types m
1a20: 75 73 74 20 68 61 76 65 20 61 6e 20 65 6e 64 20  ust have an end 
1a30: 74 61 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tag..*/.#define 
1a40: 4d 55 54 59 50 45 5f 53 54 41 43 4b 20 20 28 4d  MUTYPE_STACK  (M
1a50: 55 54 59 50 45 5f 42 4c 4f 43 4b 20 7c 20 4d 55  UTYPE_BLOCK | MU
1a60: 54 59 50 45 5f 46 4f 4e 54 20 7c 20 4d 55 54 59  TYPE_FONT | MUTY
1a70: 50 45 5f 4c 49 53 54 20 7c 20 4d 55 54 59 50 45  PE_LIST | MUTYPE
1a80: 5f 54 41 42 4c 45 29 0a 0a 2f 2a 0a 2a 2a 20 54  _TABLE)../*.** T
1a90: 68 69 73 20 6d 61 72 6b 75 70 20 74 79 70 65 73  his markup types
1aa0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 66 6f 72   are allowed for
1ab0: 20 22 69 6e 6c 69 6e 65 22 20 74 65 78 74 2e 0a   "inline" text..
1ac0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 55 54 59 50  */.#define MUTYP
1ad0: 45 5f 49 4e 4c 49 4e 45 20 28 4d 55 54 59 50 45  E_INLINE (MUTYPE
1ae0: 5f 46 4f 4e 54 20 7c 20 4d 55 54 59 50 45 5f 48  _FONT | MUTYPE_H
1af0: 59 50 45 52 4c 49 4e 4b 29 0a 0a 73 74 61 74 69  YPERLINK)..stati
1b00: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 41  c const struct A
1b10: 6c 6c 6f 77 65 64 4d 61 72 6b 75 70 20 7b 0a 20  llowedMarkup {. 
1b20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1b30: 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  me;       /* Nam
1b40: 65 20 6f 66 20 74 68 65 20 6d 61 72 6b 75 70 20  e of the markup 
1b50: 2a 2f 0a 20 20 63 68 61 72 20 69 43 6f 64 65 3b  */.  char iCode;
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b70: 20 54 68 65 20 4d 41 52 4b 55 50 5f 2a 20 63 6f   The MARKUP_* co
1b80: 64 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  de */.  short in
1b90: 74 20 69 54 79 70 65 3b 20 20 20 20 20 20 20 20  t iType;        
1ba0: 20 2f 2a 20 54 68 65 20 4d 55 54 59 50 45 5f 2a   /* The MUTYPE_*
1bb0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 61   code */.  int a
1bc0: 6c 6c 6f 77 65 64 41 74 74 72 3b 20 20 20 20 20  llowedAttr;     
1bd0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 61      /* Allowed a
1be0: 74 74 72 69 62 75 74 65 73 20 6f 6e 20 74 68 69  ttributes on thi
1bf0: 73 20 6d 61 72 6b 75 70 20 2a 2f 0a 7d 20 61 4d  s markup */.} aM
1c00: 61 72 6b 75 70 5b 5d 20 3d 20 7b 0a 20 7b 20 30  arkup[] = {. { 0
1c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c20: 4d 41 52 4b 55 50 5f 49 4e 56 41 4c 49 44 2c 20  MARKUP_INVALID, 
1c30: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
1c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c             0  },
1c50: 0a 20 7b 20 22 61 22 2c 20 20 20 20 20 20 20 20  . { "a",        
1c60: 20 20 20 20 20 4d 41 52 4b 55 50 5f 41 2c 20 20       MARKUP_A,  
1c70: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1c80: 5f 48 59 50 45 52 4c 49 4e 4b 2c 0a 20 20 20 20  _HYPERLINK,.    
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 41 54 54 52 5f 48 52 45 46 7c 41 54 54 52 5f 4e  ATTR_HREF|ATTR_N
1cb0: 41 4d 45 20 7d 2c 0a 20 7b 20 22 61 64 64 72 65  AME },. { "addre
1cc0: 73 73 22 2c 20 20 20 20 20 20 20 4d 41 52 4b 55  ss",       MARKU
1cd0: 50 5f 41 44 44 52 45 53 53 2c 20 20 20 20 20 20  P_ADDRESS,      
1ce0: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
1cf0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
1d00: 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b",             
1d10: 4d 41 52 4b 55 50 5f 42 2c 20 20 20 20 20 20 20  MARKUP_B,       
1d20: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
1d30: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
1d40: 0a 20 7b 20 22 62 69 67 22 2c 20 20 20 20 20 20  . { "big",      
1d50: 20 20 20 20 20 4d 41 52 4b 55 50 5f 42 49 47 2c       MARKUP_BIG,
1d60: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1d70: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
1d80: 30 20 20 7d 2c 0a 20 7b 20 22 62 6c 6f 63 6b 71  0  },. { "blockq
1d90: 75 6f 74 65 22 2c 20 20 20 20 4d 41 52 4b 55 50  uote",    MARKUP
1da0: 5f 42 4c 4f 43 4b 51 55 4f 54 45 2c 20 20 20 4d  _BLOCKQUOTE,   M
1db0: 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20  UTYPE_BLOCK,    
1dc0: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 62       0  },. { "b
1dd0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  r",            M
1de0: 41 52 4b 55 50 5f 42 52 2c 20 20 20 20 20 20 20  ARKUP_BR,       
1df0: 20 20 20 20 4d 55 54 59 50 45 5f 53 49 4e 47 4c      MUTYPE_SINGL
1e00: 45 2c 20 20 20 20 20 20 20 20 41 54 54 52 5f 43  E,        ATTR_C
1e10: 4c 45 41 52 20 20 7d 2c 0a 20 7b 20 22 63 65 6e  LEAR  },. { "cen
1e20: 74 65 72 22 2c 20 20 20 20 20 20 20 20 4d 41 52  ter",        MAR
1e30: 4b 55 50 5f 43 45 4e 54 45 52 2c 20 20 20 20 20  KUP_CENTER,     
1e40: 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20    MUTYPE_BLOCK, 
1e50: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b          0  },. {
1e60: 20 22 63 69 74 65 22 2c 20 20 20 20 20 20 20 20   "cite",        
1e70: 20 20 4d 41 52 4b 55 50 5f 43 49 54 45 2c 20 20    MARKUP_CITE,  
1e80: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f         MUTYPE_FO
1e90: 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  NT,          0  
1ea0: 7d 2c 0a 20 7b 20 22 63 6f 64 65 22 2c 20 20 20  },. { "code",   
1eb0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 43 4f         MARKUP_CO
1ec0: 44 45 2c 20 20 20 20 20 20 20 20 20 4d 55 54 59  DE,         MUTY
1ed0: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
1ee0: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 64 64 22 2c    0  },. { "dd",
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b              MARK
1f00: 55 50 5f 44 44 2c 20 20 20 20 20 20 20 20 20 20  UP_DD,          
1f10: 20 4d 55 54 59 50 45 5f 4c 49 2c 20 20 20 20 20   MUTYPE_LI,     
1f20: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20         0  },. { 
1f30: 22 64 66 6e 22 2c 20 20 20 20 20 20 20 20 20 20  "dfn",          
1f40: 20 4d 41 52 4b 55 50 5f 44 46 4e 2c 20 20 20 20   MARKUP_DFN,    
1f50: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
1f60: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
1f70: 2c 0a 20 7b 20 22 64 6c 22 2c 20 20 20 20 20 20  ,. { "dl",      
1f80: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 4c 2c        MARKUP_DL,
1f90: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
1fa0: 45 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20  E_LIST,         
1fb0: 20 41 54 54 52 5f 43 4f 4d 50 41 43 54 20 7d 2c   ATTR_COMPACT },
1fc0: 0a 20 7b 20 22 64 74 22 2c 20 20 20 20 20 20 20  . { "dt",       
1fd0: 20 20 20 20 20 4d 41 52 4b 55 50 5f 44 54 2c 20       MARKUP_DT, 
1fe0: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
1ff0: 5f 4c 49 2c 20 20 20 20 20 20 20 20 20 20 20 20  _LI,            
2000: 30 20 20 7d 2c 0a 20 7b 20 22 65 6d 22 2c 20 20  0  },. { "em",  
2010: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2020: 5f 45 4d 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _EM,           M
2030: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2040: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 66       0  },. { "f
2050: 6f 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 4d  ont",          M
2060: 41 52 4b 55 50 5f 46 4f 4e 54 2c 20 20 20 20 20  ARKUP_FONT,     
2070: 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c      MUTYPE_FONT,
2080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2090: 20 20 20 20 20 41 54 54 52 5f 43 4f 4c 4f 52 7c       ATTR_COLOR|
20a0: 41 54 54 52 5f 46 41 43 45 7c 41 54 54 52 5f 53  ATTR_FACE|ATTR_S
20b0: 49 5a 45 20 20 20 7d 2c 0a 20 7b 20 22 68 31 22  IZE   },. { "h1"
20c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 52  ,            MAR
20d0: 4b 55 50 5f 48 31 2c 20 20 20 20 20 20 20 20 20  KUP_H1,         
20e0: 20 20 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20    MUTYPE_BLOCK, 
20f0: 20 20 20 20 20 20 20 20 41 54 54 52 5f 41 4c 49          ATTR_ALI
2100: 47 4e 20 20 7d 2c 0a 20 7b 20 22 68 32 22 2c 20  GN  },. { "h2", 
2110: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2120: 50 5f 48 32 2c 20 20 20 20 20 20 20 20 20 20 20  P_H2,           
2130: 4d 55 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20  MUTYPE_BLOCK,   
2140: 20 20 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e        ATTR_ALIGN
2150: 20 20 7d 2c 0a 20 7b 20 22 68 33 22 2c 20 20 20    },. { "h3",   
2160: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2170: 48 33 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55  H3,           MU
2180: 54 59 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20  TYPE_BLOCK,     
2190: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 20 20      ATTR_ALIGN  
21a0: 7d 2c 0a 20 7b 20 22 68 34 22 2c 20 20 20 20 20  },. { "h4",     
21b0: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 34         MARKUP_H4
21c0: 2c 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59  ,           MUTY
21d0: 50 45 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20  PE_BLOCK,       
21e0: 20 20 41 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c    ATTR_ALIGN  },
21f0: 0a 20 7b 20 22 68 35 22 2c 20 20 20 20 20 20 20  . { "h5",       
2200: 20 20 20 20 20 4d 41 52 4b 55 50 5f 48 35 2c 20       MARKUP_H5, 
2210: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2220: 5f 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  _BLOCK,         
2230: 41 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20  ATTR_ALIGN  },. 
2240: 7b 20 22 68 36 22 2c 20 20 20 20 20 20 20 20 20  { "h6",         
2250: 20 20 20 4d 41 52 4b 55 50 5f 48 36 2c 20 20 20     MARKUP_H6,   
2260: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42          MUTYPE_B
2270: 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41 54  LOCK,         AT
2280: 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20  TR_ALIGN  },. { 
2290: 22 68 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  "hr",           
22a0: 20 4d 41 52 4b 55 50 5f 48 52 2c 20 20 20 20 20   MARKUP_HR,     
22b0: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 53 49 4e        MUTYPE_SIN
22c0: 47 4c 45 2c 20 20 20 20 20 20 20 20 0a 20 20 20  GLE,        .   
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41 54 54 52   ATTR_ALIGN|ATTR
22f0: 5f 43 4f 4c 4f 52 7c 41 54 54 52 5f 53 49 5a 45  _COLOR|ATTR_SIZE
2300: 7c 41 54 54 52 5f 57 49 44 54 48 20 20 7d 2c 0a  |ATTR_WIDTH  },.
2310: 20 7b 20 22 69 22 2c 20 20 20 20 20 20 20 20 20   { "i",         
2320: 20 20 20 20 4d 41 52 4b 55 50 5f 49 2c 20 20 20      MARKUP_I,   
2330: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2340: 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20 30  FONT,          0
2350: 20 20 7d 2c 0a 20 7b 20 22 69 6d 67 22 2c 20 20    },. { "img",  
2360: 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f           MARKUP_
2370: 49 4d 47 2c 20 20 20 20 20 20 20 20 20 20 4d 55  IMG,          MU
2380: 54 59 50 45 5f 53 49 4e 47 4c 45 2c 20 20 20 20  TYPE_SINGLE,    
2390: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
23a0: 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 41 4c           ATTR_AL
23b0: 49 47 4e 7c 41 54 54 52 5f 41 4c 54 7c 41 54 54  IGN|ATTR_ALT|ATT
23c0: 52 5f 42 4f 52 44 45 52 7c 41 54 54 52 5f 48 45  R_BORDER|ATTR_HE
23d0: 49 47 48 54 7c 0a 20 20 20 20 20 20 20 20 20 20  IGHT|.          
23e0: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 48            ATTR_H
23f0: 53 50 41 43 45 7c 41 54 54 52 5f 53 52 43 7c 41  SPACE|ATTR_SRC|A
2400: 54 54 52 5f 56 53 50 41 43 45 7c 41 54 54 52 5f  TTR_VSPACE|ATTR_
2410: 57 49 44 54 48 20 20 7d 2c 0a 20 7b 20 22 6b 62  WIDTH  },. { "kb
2420: 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 4d 41  d",           MA
2430: 52 4b 55 50 5f 4b 42 44 2c 20 20 20 20 20 20 20  RKUP_KBD,       
2440: 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20     MUTYPE_FONT, 
2450: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20           0  },. 
2460: 7b 20 22 6c 69 22 2c 20 20 20 20 20 20 20 20 20  { "li",         
2470: 20 20 20 4d 41 52 4b 55 50 5f 4c 49 2c 20 20 20     MARKUP_LI,   
2480: 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 4c          MUTYPE_L
2490: 49 2c 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  I,            . 
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 41 54 54 52 5f 54 59 50 45 7c 41 54 54     ATTR_TYPE|ATT
24c0: 52 5f 56 41 4c 55 45 20 20 7d 2c 0a 20 7b 20 22  R_VALUE  },. { "
24d0: 6e 6f 62 72 22 2c 20 20 20 20 20 20 20 20 20 20  nobr",          
24e0: 4d 41 52 4b 55 50 5f 4e 4f 42 52 2c 20 20 20 20  MARKUP_NOBR,    
24f0: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
2500: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2510: 0a 20 7b 20 22 6e 6f 77 69 6b 69 22 2c 20 20 20  . { "nowiki",   
2520: 20 20 20 20 20 4d 41 52 4b 55 50 5f 4e 4f 57 49       MARKUP_NOWI
2530: 4b 49 2c 20 20 20 20 20 20 20 4d 55 54 59 50 45  KI,       MUTYPE
2540: 5f 53 50 45 43 49 41 4c 2c 20 20 20 20 20 20 20  _SPECIAL,       
2550: 30 20 20 7d 2c 0a 20 7b 20 22 6f 6c 22 2c 20 20  0  },. { "ol",  
2560: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2570: 5f 4f 4c 2c 20 20 20 20 20 20 20 20 20 20 20 4d  _OL,           M
2580: 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20 20  UTYPE_LIST,     
2590: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
25a0: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 53            ATTR_S
25b0: 54 41 52 54 7c 41 54 54 52 5f 54 59 50 45 7c 41  TART|ATTR_TYPE|A
25c0: 54 54 52 5f 43 4f 4d 50 41 43 54 20 20 7d 2c 0a  TTR_COMPACT  },.
25d0: 20 7b 20 22 70 22 2c 20 20 20 20 20 20 20 20 20   { "p",         
25e0: 20 20 20 20 4d 41 52 4b 55 50 5f 50 2c 20 20 20      MARKUP_P,   
25f0: 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f           MUTYPE_
2600: 42 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 41  BLOCK,         A
2610: 54 54 52 5f 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b  TTR_ALIGN  },. {
2620: 20 22 70 72 65 22 2c 20 20 20 20 20 20 20 20 20   "pre",         
2630: 20 20 4d 41 52 4b 55 50 5f 50 52 45 2c 20 20 20    MARKUP_PRE,   
2640: 20 20 20 20 20 20 20 4d 55 54 59 50 45 5f 42 4c         MUTYPE_BL
2650: 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 30 20 20  OCK,         0  
2660: 7d 2c 0a 20 7b 20 22 73 22 2c 20 20 20 20 20 20  },. { "s",      
2670: 20 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 2c         MARKUP_S,
2680: 20 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59              MUTY
2690: 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20  PE_FONT,        
26a0: 20 20 30 20 20 7d 2c 0a 20 7b 20 22 73 61 6d 70    0  },. { "samp
26b0: 22 2c 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b  ",          MARK
26c0: 55 50 5f 53 41 4d 50 2c 20 20 20 20 20 20 20 20  UP_SAMP,        
26d0: 20 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20   MUTYPE_FONT,   
26e0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20         0  },. { 
26f0: 22 73 6d 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  "small",        
2700: 20 4d 41 52 4b 55 50 5f 53 4d 41 4c 4c 2c 20 20   MARKUP_SMALL,  
2710: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
2720: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
2730: 2c 0a 20 7b 20 22 73 74 72 69 6b 65 22 2c 20 20  ,. { "strike",  
2740: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 54 52        MARKUP_STR
2750: 49 4b 45 2c 20 20 20 20 20 20 20 4d 55 54 59 50  IKE,       MUTYP
2760: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
2770: 20 30 20 20 7d 2c 0a 20 7b 20 22 73 74 72 6f 6e   0  },. { "stron
2780: 67 22 2c 20 20 20 20 20 20 20 20 4d 41 52 4b 55  g",        MARKU
2790: 50 5f 53 54 52 4f 4e 47 2c 20 20 20 20 20 20 20  P_STRONG,       
27a0: 4d 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20  MUTYPE_FONT,    
27b0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22        0  },. { "
27c0: 73 75 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  sub",           
27d0: 4d 41 52 4b 55 50 5f 53 55 42 2c 20 20 20 20 20  MARKUP_SUB,     
27e0: 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e 54       MUTYPE_FONT
27f0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2800: 0a 20 7b 20 22 73 75 70 22 2c 20 20 20 20 20 20  . { "sup",      
2810: 20 20 20 20 20 4d 41 52 4b 55 50 5f 53 55 50 2c       MARKUP_SUP,
2820: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2830: 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20 20  _FONT,          
2840: 30 20 20 7d 2c 0a 20 7b 20 22 74 61 62 6c 65 22  0  },. { "table"
2850: 2c 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50  ,         MARKUP
2860: 5f 54 41 42 4c 45 2c 20 20 20 20 20 20 20 20 4d  _TABLE,        M
2870: 55 54 59 50 45 5f 54 41 42 4c 45 2c 20 20 20 20  UTYPE_TABLE,    
2880: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
2890: 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f 41            ATTR_A
28a0: 4c 49 47 4e 7c 41 54 54 52 5f 42 47 43 4f 4c 4f  LIGN|ATTR_BGCOLO
28b0: 52 7c 41 54 54 52 5f 42 4f 52 44 45 52 7c 41 54  R|ATTR_BORDER|AT
28c0: 54 52 5f 43 45 4c 4c 50 41 44 44 49 4e 47 7c 0a  TR_CELLPADDING|.
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 41 54 54 52 5f 43 45 4c 4c 53 50 41      ATTR_CELLSPA
28f0: 43 49 4e 47 7c 41 54 54 52 5f 48 53 50 41 43 45  CING|ATTR_HSPACE
2900: 7c 41 54 54 52 5f 56 53 50 41 43 45 20 20 7d 2c  |ATTR_VSPACE  },
2910: 0a 20 7b 20 22 74 64 22 2c 20 20 20 20 20 20 20  . { "td",       
2920: 20 20 20 20 20 4d 41 52 4b 55 50 5f 54 44 2c 20       MARKUP_TD, 
2930: 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50 45            MUTYPE
2940: 5f 54 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  _TD,            
2950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2960: 20 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c       ATTR_ALIGN|
2970: 41 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 41 54 54  ATTR_BGCOLOR|ATT
2980: 52 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20  R_COLSPAN|.     
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
29a0: 54 54 52 5f 52 4f 57 53 50 41 4e 7c 41 54 54 52  TTR_ROWSPAN|ATTR
29b0: 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22  _VALIGN  },. { "
29c0: 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
29d0: 4d 41 52 4b 55 50 5f 54 48 2c 20 20 20 20 20 20  MARKUP_TH,      
29e0: 20 20 20 20 20 4d 55 54 59 50 45 5f 54 44 2c 0a       MUTYPE_TD,.
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
2a10: 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 41 54 54 52  TTR_BGCOLOR|ATTR
2a20: 5f 43 4f 4c 53 50 41 4e 7c 0a 20 20 20 20 20 20  _COLSPAN|.      
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 54                AT
2a40: 54 52 5f 52 4f 57 53 50 41 4e 7c 41 54 54 52 5f  TR_ROWSPAN|ATTR_
2a50: 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20 22 74  VALIGN  },. { "t
2a60: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 4d  r",            M
2a70: 41 52 4b 55 50 5f 54 52 2c 20 20 20 20 20 20 20  ARKUP_TR,       
2a80: 20 20 20 20 4d 55 54 59 50 45 5f 54 52 2c 20 0a      MUTYPE_TR, .
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 41 54 54 52 5f 41 4c 49 47 4e 7c 41      ATTR_ALIGN|A
2ab0: 54 54 52 5f 42 47 43 4f 4c 4f 52 7c 7c 41 54 54  TTR_BGCOLOR||ATT
2ac0: 52 5f 56 41 4c 49 47 4e 20 20 7d 2c 0a 20 7b 20  R_VALIGN  },. { 
2ad0: 22 74 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  "tt",           
2ae0: 20 4d 41 52 4b 55 50 5f 54 54 2c 20 20 20 20 20   MARKUP_TT,     
2af0: 20 20 20 20 20 20 4d 55 54 59 50 45 5f 46 4f 4e        MUTYPE_FON
2b00: 54 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  T,          0  }
2b10: 2c 0a 20 7b 20 22 75 22 2c 20 20 20 20 20 20 20  ,. { "u",       
2b20: 20 20 20 20 20 20 4d 41 52 4b 55 50 5f 55 2c 20        MARKUP_U, 
2b30: 20 20 20 20 20 20 20 20 20 20 20 4d 55 54 59 50             MUTYP
2b40: 45 5f 46 4f 4e 54 2c 20 20 20 20 20 20 20 20 20  E_FONT,         
2b50: 20 30 20 20 7d 2c 0a 20 7b 20 22 75 6c 22 2c 20   0  },. { "ul", 
2b60: 20 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55             MARKU
2b70: 50 5f 55 4c 2c 20 20 20 20 20 20 20 20 20 20 20  P_UL,           
2b80: 4d 55 54 59 50 45 5f 4c 49 53 54 2c 20 20 20 20  MUTYPE_LIST,    
2b90: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
2ba0: 20 20 20 20 20 20 20 20 20 20 20 41 54 54 52 5f             ATTR_
2bb0: 54 59 50 45 7c 41 54 54 52 5f 43 4f 4d 50 41 43  TYPE|ATTR_COMPAC
2bc0: 54 20 20 7d 2c 0a 20 7b 20 22 76 61 72 22 2c 20  T  },. { "var", 
2bd0: 20 20 20 20 20 20 20 20 20 20 4d 41 52 4b 55 50            MARKUP
2be0: 5f 56 41 52 2c 20 20 20 20 20 20 20 20 20 20 4d  _VAR,          M
2bf0: 55 54 59 50 45 5f 46 4f 4e 54 2c 20 20 20 20 20  UTYPE_FONT,     
2c00: 20 20 20 20 20 30 20 20 7d 2c 0a 20 7b 20 22 76       0  },. { "v
2c10: 65 72 62 61 74 69 6d 22 2c 20 20 20 20 20 20 4d  erbatim",      M
2c20: 41 52 4b 55 50 5f 56 45 52 42 41 54 49 4d 2c 20  ARKUP_VERBATIM, 
2c30: 20 20 20 20 4d 55 54 59 50 45 5f 53 50 45 43 49      MUTYPE_SPECI
2c40: 41 4c 2c 20 20 20 20 20 20 20 41 54 54 52 5f 49  AL,       ATTR_I
2c50: 44 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55  D },.};../*.** U
2c60: 73 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  se binary search
2c70: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 74 61 67   to locate a tag
2c80: 20 69 6e 20 74 68 65 20 61 4d 61 72 6b 75 70 5b   in the aMarkup[
2c90: 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ] table..*/.stat
2ca0: 69 63 20 69 6e 74 20 66 69 6e 64 54 61 67 28 63  ic int findTag(c
2cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
2cc0: 20 69 6e 74 20 69 2c 20 63 2c 20 66 69 72 73 74   int i, c, first
2cd0: 2c 20 6c 61 73 74 3b 0a 20 20 66 69 72 73 74 20  , last;.  first 
2ce0: 3d 20 31 3b 0a 20 20 6c 61 73 74 20 3d 20 73 69  = 1;.  last = si
2cf0: 7a 65 6f 66 28 61 4d 61 72 6b 75 70 29 2f 73 69  zeof(aMarkup)/si
2d00: 7a 65 6f 66 28 61 4d 61 72 6b 75 70 5b 30 5d 29  zeof(aMarkup[0])
2d10: 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 66   - 1;.  while( f
2d20: 69 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20  irst<=last ){.  
2d30: 20 20 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73    i = (first+las
2d40: 74 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 74  t)/2;.    c = st
2d50: 72 63 6d 70 28 61 4d 61 72 6b 75 70 5b 69 5d 2e  rcmp(aMarkup[i].
2d60: 7a 4e 61 6d 65 2c 20 7a 29 3b 0a 20 20 20 20 69  zName, z);.    i
2d70: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
2d80: 20 61 73 73 65 72 74 28 20 61 4d 61 72 6b 75 70   assert( aMarkup
2d90: 5b 69 5d 2e 69 43 6f 64 65 3d 3d 69 20 29 3b 0a  [i].iCode==i );.
2da0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
2db0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c      }else if( c<
2dc0: 30 20 29 7b 0a 20 20 20 20 20 20 66 69 72 73 74  0 ){.      first
2dd0: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 65 6c 73   = i+1;.    }els
2de0: 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  e{.      last = 
2df0: 69 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i-1;.    }.  }. 
2e00: 20 72 65 74 75 72 6e 20 4d 41 52 4b 55 50 5f 49   return MARKUP_I
2e10: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
2e20: 20 54 6f 6b 65 6e 20 74 79 70 65 73 0a 2a 2f 0a   Token types.*/.
2e30: 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 4d 41  #define TOKEN_MA
2e40: 52 4b 55 50 20 20 20 20 20 20 20 20 31 20 20 20  RKUP        1   
2e50: 20 2f 2a 20 3c 2e 2e 2e 3e 20 2a 2f 0a 23 64 65   /* <...> */.#de
2e60: 66 69 6e 65 20 54 4f 4b 45 4e 5f 43 48 41 52 41  fine TOKEN_CHARA
2e70: 43 54 45 52 20 20 20 20 20 32 20 20 20 20 2f 2a  CTER     2    /*
2e80: 20 22 26 22 20 6f 72 20 22 3c 22 20 6e 6f 74 20   "&" or "<" not 
2e90: 70 61 72 74 20 6f 66 20 6d 61 72 6b 75 70 20 2a  part of markup *
2ea0: 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f  /.#define TOKEN_
2eb0: 4c 49 4e 4b 20 20 20 20 20 20 20 20 20 20 33 20  LINK          3 
2ec0: 20 20 20 2f 2a 20 5b 2e 2e 2e 5d 20 2a 2f 0a 23     /* [...] */.#
2ed0: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 50 41 52  define TOKEN_PAR
2ee0: 41 47 52 41 50 48 20 20 20 20 20 34 20 20 20 20  AGRAPH     4    
2ef0: 2f 2a 20 62 6c 61 6e 6b 20 6c 69 6e 65 73 20 2a  /* blank lines *
2f00: 2f 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f  /.#define TOKEN_
2f10: 4e 45 57 4c 49 4e 45 20 20 20 20 20 20 20 35 20  NEWLINE       5 
2f20: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 22     /* A single "
2f30: 5c 6e 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  \n" */.#define T
2f40: 4f 4b 45 4e 5f 42 55 4c 4c 45 54 20 20 20 20 20  OKEN_BULLET     
2f50: 20 20 20 36 20 20 20 20 2f 2a 20 20 22 20 20 2a     6    /*  "  *
2f60: 20 20 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54    " */.#define T
2f70: 4f 4b 45 4e 5f 45 4e 55 4d 20 20 20 20 20 20 20  OKEN_ENUM       
2f80: 20 20 20 37 20 20 20 20 2f 2a 20 20 22 20 20 5c     7    /*  "  \
2f90: 28 3f 5c 64 2b 5b 2e 29 5d 3f 20 20 22 20 2a 2f  (?\d+[.)]?  " */
2fa0: 0a 23 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 49  .#define TOKEN_I
2fb0: 4e 44 45 4e 54 20 20 20 20 20 20 20 20 38 20 20  NDENT        8  
2fc0: 20 20 2f 2a 20 20 22 20 20 20 22 20 2a 2f 0a 23    /*  "   " */.#
2fd0: 64 65 66 69 6e 65 20 54 4f 4b 45 4e 5f 54 45 58  define TOKEN_TEX
2fe0: 54 20 20 20 20 20 20 20 20 20 20 39 20 20 20 20  T          9    
2ff0: 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 61  /* None of the a
3000: 62 6f 76 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  bove */../*.** S
3010: 74 61 74 65 20 66 6c 61 67 73 0a 2a 2f 0a 23 64  tate flags.*/.#d
3020: 65 66 69 6e 65 20 41 54 5f 4e 45 57 4c 49 4e 45  efine AT_NEWLINE
3030: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 31 20            0x001 
3040: 20 2f 2a 20 41 74 20 73 74 61 72 74 20 6f 66 20   /* At start of 
3050: 61 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e  a line */.#defin
3060: 65 20 41 54 5f 50 41 52 41 47 52 41 50 48 20 20  e AT_PARAGRAPH  
3070: 20 20 20 20 20 20 30 78 30 30 32 20 20 2f 2a 20        0x002  /* 
3080: 41 74 20 73 74 61 72 74 20 6f 66 20 61 20 70 61  At start of a pa
3090: 72 61 67 72 61 70 68 20 2a 2f 0a 23 64 65 66 69  ragraph */.#defi
30a0: 6e 65 20 41 4c 4c 4f 57 5f 57 49 4b 49 20 20 20  ne ALLOW_WIKI   
30b0: 20 20 20 20 20 20 20 30 78 30 30 34 20 20 2f 2a         0x004  /*
30c0: 20 41 6c 6c 6f 77 20 77 69 6b 69 20 6d 61 72 6b   Allow wiki mark
30d0: 75 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  up */.#define FO
30e0: 4e 54 5f 4d 41 52 4b 55 50 5f 4f 4e 4c 59 20 20  NT_MARKUP_ONLY  
30f0: 20 20 30 78 30 30 38 20 20 2f 2a 20 4f 6e 6c 79    0x008  /* Only
3100: 20 61 6c 6c 6f 77 20 4d 55 54 59 50 45 5f 46 4f   allow MUTYPE_FO
3110: 4e 54 20 6d 61 72 6b 75 70 20 2a 2f 0a 23 64 65  NT markup */.#de
3120: 66 69 6e 65 20 49 4e 4c 49 4e 45 5f 4d 41 52 4b  fine INLINE_MARK
3130: 55 50 5f 4f 4e 4c 59 20 20 30 78 30 31 30 20 20  UP_ONLY  0x010  
3140: 2f 2a 20 41 6c 6c 6f 77 20 6f 6e 6c 79 20 22 69  /* Allow only "i
3150: 6e 6c 69 6e 65 22 20 6d 61 72 6b 75 70 20 2a 2f  nline" markup */
3160: 0a 23 64 65 66 69 6e 65 20 49 4e 5f 4c 49 53 54  .#define IN_LIST
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
3180: 32 30 20 20 2f 2a 20 57 69 74 68 69 6e 20 77 69  20  /* Within wi
3190: 6b 69 20 3c 75 6c 3e 20 6f 72 20 3c 6f 6c 3e 20  ki <ul> or <ol> 
31a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  */../*.** Curren
31b0: 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 72  t state of the r
31c0: 65 6e 64 65 72 69 6e 67 20 65 6e 67 69 6e 65 0a  endering engine.
31d0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
31e0: 74 20 52 65 6e 64 65 72 65 72 20 52 65 6e 64 65  t Renderer Rende
31f0: 72 65 72 3b 0a 73 74 72 75 63 74 20 52 65 6e 64  rer;.struct Rend
3200: 65 72 65 72 20 7b 0a 20 20 42 6c 6f 62 20 2a 70  erer {.  Blob *p
3210: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
3220: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 61       /* Output a
3230: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73 20  ppended to this 
3240: 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 73 74  blob */.  int st
3250: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3260: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 68        /* Flag th
3270: 61 74 20 67 6f 76 65 72 6e 20 72 65 6e 64 65 72  at govern render
3280: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 77 69 6b  ing */.  int wik
3290: 69 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  iList;          
32a0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
32b0: 77 69 6b 69 20 6c 69 73 74 20 74 79 70 65 20 2a  wiki list type *
32c0: 2f 0a 20 20 69 6e 74 20 69 6e 56 65 72 62 61 74  /.  int inVerbat
32d0: 69 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  im;             
32e0: 2f 2a 20 54 72 75 65 20 69 6e 20 3c 76 65 72 62  /* True in <verb
32f0: 61 74 69 6d 3e 20 6d 6f 64 65 20 2a 2f 0a 20 20  atim> mode */.  
3300: 69 6e 74 20 70 72 65 56 65 72 62 53 74 61 74 65  int preVerbState
3310: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
3320: 61 6c 75 65 20 6f 66 20 73 74 61 74 65 20 70 72  alue of state pr
3330: 69 6f 72 20 74 6f 20 76 65 72 62 61 74 69 6d 20  ior to verbatim 
3340: 2a 2f 0a 20 20 69 6e 74 20 77 61 6e 74 41 75 74  */.  int wantAut
3350: 6f 50 61 72 61 67 72 61 70 68 3b 20 20 20 20 20  oParagraph;     
3360: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 3c 70   /* True if a <p
3370: 3e 20 69 73 20 64 65 73 69 72 65 64 20 2a 2f 0a  > is desired */.
3380: 20 20 69 6e 74 20 69 6e 41 75 74 6f 50 61 72 61    int inAutoPara
3390: 67 72 61 70 68 3b 20 20 20 20 20 20 20 20 2f 2a  graph;        /*
33a0: 20 54 72 75 65 20 69 66 20 77 69 74 68 69 6e 20   True if within 
33b0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 70 61 72  an automatic par
33c0: 61 67 72 61 70 68 20 2a 2f 0a 20 20 63 6f 6e 73  agraph */.  cons
33d0: 74 20 63 68 61 72 20 2a 7a 56 65 72 62 61 74 69  t char *zVerbati
33e0: 6d 49 64 3b 20 20 20 20 2f 2a 20 54 68 65 20 69  mId;    /* The i
33f0: 64 3d 20 61 74 74 72 69 62 75 74 65 20 6f 66 20  d= attribute of 
3400: 3c 76 65 72 62 61 74 69 6d 3e 20 2a 2f 0a 20 20  <verbatim> */.  
3410: 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20  int nStack;     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3430: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3440: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2a  s on the stack *
3450: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
3480: 65 64 20 66 6f 72 20 61 53 74 61 63 6b 20 2a 2f  ed for aStack */
3490: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
34a0: 20 2a 61 53 74 61 63 6b 3b 20 20 20 20 20 20 2f   *aStack;      /
34b0: 2a 20 4f 70 65 6e 20 6d 61 72 6b 75 70 20 73 74  * Open markup st
34c0: 61 63 6b 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  ack */.};.../*.*
34d0: 2a 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  * z points to a 
34e0: 22 3c 22 20 63 68 61 72 61 63 74 65 72 2e 20 20  "<" character.  
34f0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
3500: 74 68 69 73 20 69 73 20 74 68 65 20 73 74 61 72  this is the star
3510: 74 20 6f 66 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t of.** a valid 
3520: 6d 61 72 6b 75 70 2e 20 20 49 66 20 69 74 20 69  markup.  If it i
3530: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 74 6f  s, return the to
3540: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  tal number of ch
3550: 61 72 61 63 74 65 72 73 20 69 6e 0a 2a 2a 20 74  aracters in.** t
3560: 68 65 20 6d 61 72 6b 75 70 20 69 6e 63 6c 75 64  he markup includ
3570: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ing the initial 
3580: 22 3c 22 20 61 6e 64 20 74 68 65 20 74 65 72 6d  "<" and the term
3590: 69 6e 61 74 69 6e 67 20 22 3e 22 2e 20 20 49 66  inating ">".  If
35a0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 77 65  .** it is not we
35b0: 6c 6c 2d 66 6f 72 6d 65 64 20 6d 61 72 6b 75 70  ll-formed markup
35c0: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
35d0: 74 61 74 69 63 20 69 6e 74 20 6d 61 72 6b 75 70  tatic int markup
35e0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
35f0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
3600: 20 31 3b 0a 20 20 69 6e 74 20 69 6e 70 61 72 65   1;.  int inpare
3610: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 5b 6e  n = 0;.  if( z[n
3620: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2b 2b 3b 20 7d  ]=='/' ){ n++; }
3630: 0a 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28  .  if( !isalpha(
3640: 7a 5b 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30  z[n]) ) return 0
3650: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 61 6c 6e  ;.  while( isaln
3660: 75 6d 28 7a 5b 6e 5d 29 20 29 7b 20 6e 2b 2b 3b  um(z[n]) ){ n++;
3670: 20 7d 0a 20 20 69 66 28 20 7a 5b 6e 5d 21 3d 27   }.  if( z[n]!='
3680: 3e 27 20 26 26 20 21 69 73 73 70 61 63 65 28 7a  >' && !isspace(z
3690: 5b 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b  [n]) ) return 0;
36a0: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 20 26  .  while( z[n] &
36b0: 26 20 28 7a 5b 6e 5d 21 3d 27 3e 27 20 7c 7c 20  & (z[n]!='>' || 
36c0: 69 6e 70 61 72 65 6e 29 20 29 7b 0a 20 20 20 20  inparen) ){.    
36d0: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 22 27 20 29 7b  if( z[n]=='"' ){
36e0: 0a 20 20 20 20 20 20 69 6e 70 61 72 65 6e 20 3d  .      inparen =
36f0: 20 21 69 6e 70 61 72 65 6e 3b 0a 20 20 20 20 7d   !inparen;.    }
3700: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
3710: 69 66 28 20 7a 5b 6e 5d 21 3d 27 3e 27 20 29 20  if( z[n]!='>' ) 
3720: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
3730: 72 6e 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn n+1;.}../*.**
3740: 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 22   z points to a "
3750: 5c 6e 22 20 63 68 61 72 61 63 74 65 72 2e 20 20  \n" character.  
3760: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
3770: 74 68 69 73 20 6e 65 77 6c 69 6e 65 20 69 73 0a  this newline is.
3780: 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6f  ** followed by o
3790: 6e 65 20 6f 72 20 6d 6f 72 65 20 62 6c 61 6e 6b  ne or more blank
37a0: 20 6c 69 6e 65 73 2e 20 20 49 66 20 69 74 20 69   lines.  If it i
37b0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
37c0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 68 61 72 61  mber.** of chara
37d0: 63 74 65 72 73 20 74 68 72 6f 75 67 68 20 74 68  cters through th
37e0: 65 20 63 6c 6f 73 69 6e 67 20 22 5c 6e 22 2e 20  e closing "\n". 
37f0: 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
3800: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3810: 20 70 61 72 61 67 72 61 70 68 42 72 65 61 6b 4c   paragraphBreakL
3820: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
3830: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e   *z){.  int i, n
3840: 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 6c 69 6e 65  ;.  int nNewline
3850: 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 2c   = 1;.  for(i=1,
3860: 20 6e 3d 30 3b 20 69 73 73 70 61 63 65 28 7a 5b   n=0; isspace(z[
3870: 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i]); i++){.    i
3880: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b  f( z[i]=='\n' ){
3890: 0a 20 20 20 20 20 20 6e 4e 65 77 6c 69 6e 65 2b  .      nNewline+
38a0: 2b 3b 0a 20 20 20 20 20 20 6e 20 3d 20 69 3b 0a  +;.      n = i;.
38b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
38c0: 6e 4e 65 77 6c 69 6e 65 3e 3d 32 20 29 7b 0a 20  nNewline>=2 ){. 
38d0: 20 20 20 72 65 74 75 72 6e 20 6e 2b 31 3b 0a 20     return n+1;. 
38e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
38f0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
3900: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
3910: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
3920: 72 73 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  rs until the nex
3930: 74 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 0a  t "interesting".
3940: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ** characters..*
3950: 2a 0a 2a 2a 20 49 6e 74 65 72 65 73 74 69 6e 67  *.** Interesting
3960: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 3a   characters are:
3970: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 0a 2a 2a  .**.**      <.**
3980: 20 20 20 20 20 20 26 0a 2a 2a 20 20 20 20 20 20        &.**      
3990: 5c 6e 0a 2a 2a 20 20 20 20 20 20 5b 0a 2a 2a 0a  \n.**      [.**.
39a0: 2a 2a 20 54 68 65 20 22 5b 22 20 61 6e 64 20 22  ** The "[" and "
39b0: 5c 6e 22 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  \n" are only con
39c0: 73 69 64 65 72 65 64 20 69 6e 74 65 72 65 73 74  sidered interest
39d0: 69 6e 67 20 69 66 20 74 68 65 20 22 75 73 65 57  ing if the "useW
39e0: 69 6b 69 22 0a 2a 2a 20 66 6c 61 67 20 69 73 20  iki".** flag is 
39f0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
3a00: 6e 74 20 74 65 78 74 4c 65 6e 67 74 68 28 63 6f  nt textLength(co
3a10: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
3a20: 20 75 73 65 57 69 6b 69 29 7b 0a 20 20 69 6e 74   useWiki){.  int
3a30: 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b   n = 0;.  int c;
3a40: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
3a50: 5b 30 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 3c  [0])!=0 && c!='<
3a60: 27 20 26 26 20 63 21 3d 27 26 27 20 26 26 0a 20  ' && c!='&' &&. 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
3a80: 73 65 57 69 6b 69 3d 3d 30 20 7c 7c 20 28 63 21  seWiki==0 || (c!
3a90: 3d 27 5b 27 20 26 26 20 63 21 3d 27 5c 6e 27 29  ='[' && c!='\n')
3aa0: 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
3ab0: 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    z++;.  }.  ret
3ac0: 75 72 6e 20 6e 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn n; .}../*.**
3ad0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3ae0: 7a 5b 5d 20 62 65 67 69 6e 73 20 77 69 74 68 20  z[] begins with 
3af0: 61 6e 20 48 54 4d 4c 20 63 68 61 72 61 63 74 65  an HTML characte
3b00: 72 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  r element..*/.st
3b10: 61 74 69 63 20 69 6e 74 20 69 73 45 6c 65 6d 65  atic int isEleme
3b20: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  nt(const char *z
3b30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
3b40: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 26 27 20  sert( z[0]=='&' 
3b50: 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  );.  if( z[1]=='
3b60: 23 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  #' ){.    for(i=
3b70: 32 3b 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29  2; isdigit(z[i])
3b80: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 72 65 74  ; i++){}.    ret
3b90: 75 72 6e 20 69 3e 32 20 26 26 20 7a 5b 69 5d 3d  urn i>2 && z[i]=
3ba0: 3d 27 3b 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =';';.  }else{. 
3bb0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 61 6c     for(i=1; isal
3bc0: 70 68 61 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  pha(z[i]); i++){
3bd0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3e 31  }.    return i>1
3be0: 20 26 26 20 7a 5b 69 5d 3d 3d 27 3b 27 3b 0a 20   && z[i]==';';. 
3bf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
3c00: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
3c10: 7a 5b 5d 20 73 74 72 69 6e 67 20 69 73 20 74 68  z[] string is th
3c20: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
3c30: 20 77 69 6b 69 20 62 75 6c 6c 65 74 2e 0a 2a 2a   wiki bullet..**
3c40: 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72   If it is, retur
3c50: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
3c60: 74 68 65 20 62 75 6c 6c 65 74 20 74 65 78 74 2e  the bullet text.
3c70: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
3c80: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3c90: 69 6e 74 20 62 75 6c 6c 65 74 4c 65 6e 67 74 68  int bulletLength
3ca0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
3cb0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 6e  .  int i, n;.  n
3cc0: 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   = 0;.  i = 0;. 
3cd0: 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20   while( z[n]==' 
3ce0: 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20  ' || z[n]=='\t' 
3cf0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d  ){.    if( z[n]=
3d00: 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\t' ) i++;.   
3d10: 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20   i++;.    n++;. 
3d20: 20 7d 0a 20 20 69 66 28 20 69 3c 32 20 7c 7c 20   }.  if( i<2 || 
3d30: 7a 5b 6e 5d 21 3d 27 2a 27 20 29 20 72 65 74 75  z[n]!='*' ) retu
3d40: 72 6e 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 20 20 69  rn 0;.  n++;.  i
3d50: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a   = 0;.  while( z
3d60: 5b 6e 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d  [n]==' ' || z[n]
3d70: 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 69 66  =='\t' ){.    if
3d80: 28 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 20 69  ( z[n]=='\t' ) i
3d90: 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20  ++;.    i++;.   
3da0: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n++;.  }.  if( 
3db0: 69 3c 32 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  i<2 || isspace(z
3dc0: 5b 6e 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b  [n]) ) return 0;
3dd0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
3de0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
3df0: 65 65 20 69 66 20 74 68 65 20 7a 5b 5d 20 73 74  ee if the z[] st
3e00: 72 69 6e 67 20 69 73 20 74 68 65 20 62 65 67 69  ring is the begi
3e10: 6e 6e 69 6e 67 20 6f 66 20 61 20 65 6e 75 6d 65  nning of a enume
3e20: 72 61 74 69 6f 6e 20 76 61 6c 75 65 2e 0a 2a 2a  ration value..**
3e30: 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72   If it is, retur
3e40: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
3e50: 74 68 65 20 62 75 6c 6c 65 74 20 74 65 78 74 2e  the bullet text.
3e60: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
3e70: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 74  rn 0..**.** Synt
3e80: 61 78 3a 0a 2a 2a 20 20 20 20 2a 20 20 61 20 74  ax:.**    *  a t
3e90: 61 62 20 6f 72 20 74 77 6f 20 6f 72 20 6d 6f 72  ab or two or mor
3ea0: 65 20 73 70 61 63 65 73 0a 2a 2a 20 20 20 20 2a  e spaces.**    *
3eb0: 20 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69    one or more di
3ec0: 67 69 74 73 0a 2a 2a 20 20 20 20 2a 20 20 6f 70  gits.**    *  op
3ed0: 74 69 6f 6e 61 6c 20 22 2e 22 0a 2a 2a 20 20 20  tional ".".**   
3ee0: 20 2a 20 20 61 6e 6f 74 68 65 72 20 74 61 62 20   *  another tab 
3ef0: 6f 72 20 74 77 6f 20 6f 72 65 20 6d 6f 72 65 20  or two ore more 
3f00: 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2f 0a 73 74  spaces..**.*/.st
3f10: 61 74 69 63 20 69 6e 74 20 65 6e 75 6d 4c 65 6e  atic int enumLen
3f20: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
3f30: 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  z){.  int i, n;.
3f40: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30    n = 0;.  i = 0
3f50: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d  ;.  while( z[n]=
3f60: 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c  =' ' || z[n]=='\
3f70: 74 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  t' ){.    if( z[
3f80: 6e 5d 3d 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a  n]=='\t' ) i++;.
3f90: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b      i++;.    n++
3fa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 32 20  ;.  }.  if( i<2 
3fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
3fc0: 72 28 69 3d 30 3b 20 69 73 64 69 67 69 74 28 7a  r(i=0; isdigit(z
3fd0: 5b 6e 5d 29 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b  [n]); i++, n++){
3fe0: 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 20 72  }.  if( i==0 ) r
3ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a  eturn 0;.  if( z
4000: 5b 6e 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [n]=='.' ){.    
4010: 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 30  n++;.  }.  i = 0
4020: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 3d  ;.  while( z[n]=
4030: 3d 27 20 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 5c  =' ' || z[n]=='\
4040: 74 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  t' ){.    if( z[
4050: 6e 5d 3d 3d 27 5c 74 27 20 29 20 69 2b 2b 3b 0a  n]=='\t' ) i++;.
4060: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 6e 2b 2b      i++;.    n++
4070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 32 20  ;.  }.  if( i<2 
4080: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 5d 29  || isspace(z[n])
4090: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
40a0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
40b0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
40c0: 66 20 74 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  f the z[] string
40d0: 20 69 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   is the beginnin
40e0: 67 20 6f 66 20 61 6e 20 69 6e 64 65 6e 74 65 64  g of an indented
40f0: 0a 2a 2a 20 70 61 72 61 67 72 61 70 68 2e 20 20  .** paragraph.  
4100: 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72 6e  If it is, return
4110: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
4120: 68 65 20 69 6e 64 65 6e 74 2e 20 20 4f 74 68 65  he indent.  Othe
4130: 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
4140: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
4150: 20 69 6e 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f   indentLength(co
4160: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
4170: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 6e 20 3d 20  int i, n;.  n = 
4180: 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68  0;.  i = 0;.  wh
4190: 69 6c 65 28 20 7a 5b 6e 5d 3d 3d 27 20 27 20 7c  ile( z[n]==' ' |
41a0: 7c 20 7a 5b 6e 5d 3d 3d 27 5c 74 27 20 29 7b 0a  | z[n]=='\t' ){.
41b0: 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c      if( z[n]=='\
41c0: 74 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 2b  t' ) i++;.    i+
41d0: 2b 3b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  +;.    n++;.  }.
41e0: 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 69 73 73    if( i<2 || iss
41f0: 70 61 63 65 28 7a 5b 6e 5d 29 20 29 20 72 65 74  pace(z[n]) ) ret
4200: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4210: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  n;.}../*.** Chec
4220: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
4230: 7a 5b 5d 20 73 74 72 69 6e 67 20 69 73 20 61 20  z[] string is a 
4240: 77 69 6b 69 20 68 79 70 65 72 6c 69 6e 6b 2e 20  wiki hyperlink. 
4250: 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 72 65   If it is,.** re
4260: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
4270: 6f 66 20 74 68 65 20 68 79 70 65 72 6c 69 6e 6b  of the hyperlink
4280: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
4290: 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
42a0: 20 69 6e 74 20 6c 69 6e 6b 4c 65 6e 67 74 68 28   int linkLength(
42b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
42c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
42d0: 74 28 20 7a 5b 30 5d 3d 3d 27 5b 27 20 29 3b 0a  t( z[0]=='[' );.
42e0: 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20    for(n=0; z[n] 
42f0: 26 26 20 7a 5b 6e 5d 21 3d 27 5d 27 3b 20 6e 2b  && z[n]!=']'; n+
4300: 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 5b 6e 5d 3d  +){}.  if( z[n]=
4310: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 72 65 74 75  =']' ){.    retu
4320: 72 6e 20 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  rn n+1;.  }else{
4330: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4340: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 7a 20 70   }.}.../*.** z p
4350: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
4360: 72 74 20 6f 66 20 61 20 74 6f 6b 65 6e 2e 20 20  rt of a token.  
4370: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4380: 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  r of.** characte
4390: 72 73 20 69 6e 20 74 68 61 74 20 74 6f 6b 65 6e  rs in that token
43a0: 2e 20 20 57 72 69 74 65 20 74 68 65 20 74 6f 6b  .  Write the tok
43b0: 65 6e 20 74 79 70 65 20 69 6e 74 6f 20 2a 70 54  en type into *pT
43c0: 6f 6b 65 6e 54 79 70 65 2e 0a 2a 2f 0a 73 74 61  okenType..*/.sta
43d0: 74 69 63 20 69 6e 74 20 6e 65 78 74 54 6f 6b 65  tic int nextToke
43e0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
43f0: 20 52 65 6e 64 65 72 65 72 20 2a 70 2c 20 69 6e   Renderer *p, in
4400: 74 20 2a 70 54 6f 6b 65 6e 54 79 70 65 29 7b 0a  t *pTokenType){.
4410: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 7a    int n;.  if( z
4420: 5b 30 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [0]=='<' ){.    
4430: 6e 20 3d 20 6d 61 72 6b 75 70 4c 65 6e 67 74 68  n = markupLength
4440: 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30  (z);.    if( n>0
4450: 20 29 7b 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65   ){.      *pToke
4460: 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 4d 41  nType = TOKEN_MA
4470: 52 4b 55 50 3b 0a 20 20 20 20 20 20 72 65 74 75  RKUP;.      retu
4480: 72 6e 20 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn n;.    }else{
4490: 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79  .      *pTokenTy
44a0: 70 65 20 3d 20 54 4f 4b 45 4e 5f 43 48 41 52 41  pe = TOKEN_CHARA
44b0: 43 54 45 52 3b 0a 20 20 20 20 20 20 72 65 74 75  CTER;.      retu
44c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
44d0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 26 27 20    if( z[0]=='&' 
44e0: 26 26 20 28 70 2d 3e 69 6e 56 65 72 62 61 74 69  && (p->inVerbati
44f0: 6d 20 7c 7c 20 21 69 73 45 6c 65 6d 65 6e 74 28  m || !isElement(
4500: 7a 29 29 20 29 7b 0a 20 20 20 20 2a 70 54 6f 6b  z)) ){.    *pTok
4510: 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 43  enType = TOKEN_C
4520: 48 41 52 41 43 54 45 52 3b 0a 20 20 20 20 72 65  HARACTER;.    re
4530: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
4540: 28 20 28 70 2d 3e 73 74 61 74 65 20 26 20 41 4c  ( (p->state & AL
4550: 4c 4f 57 5f 57 49 4b 49 29 21 3d 30 20 29 7b 0a  LOW_WIKI)!=0 ){.
4560: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c      if( z[0]=='\
4570: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  n' ){.      n = 
4580: 70 61 72 61 67 72 61 70 68 42 72 65 61 6b 4c 65  paragraphBreakLe
4590: 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20 20 69  ngth(z);.      i
45a0: 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( n>0 ){.      
45b0: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20    *pTokenType = 
45c0: 54 4f 4b 45 4e 5f 50 41 52 41 47 52 41 50 48 3b  TOKEN_PARAGRAPH;
45d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
45e0: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  n;.      }else i
45f0: 66 28 20 69 73 73 70 61 63 65 28 7a 5b 31 5d 29  f( isspace(z[1])
4600: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f   ){.        *pTo
4610: 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f  kenType = TOKEN_
4620: 4e 45 57 4c 49 4e 45 3b 0a 20 20 20 20 20 20 20  NEWLINE;.       
4630: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4640: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4650: 20 28 70 2d 3e 73 74 61 74 65 20 26 20 41 54 5f   (p->state & AT_
4660: 4e 45 57 4c 49 4e 45 29 21 3d 30 20 26 26 20 69  NEWLINE)!=0 && i
4670: 73 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a  sspace(z[0]) ){.
4680: 20 20 20 20 20 20 6e 20 3d 20 62 75 6c 6c 65 74        n = bullet
4690: 4c 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20  Length(z);.     
46a0: 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
46b0: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20      *pTokenType 
46c0: 3d 20 54 4f 4b 45 4e 5f 42 55 4c 4c 45 54 3b 0a  = TOKEN_BULLET;.
46d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
46e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
46f0: 6e 20 3d 20 65 6e 75 6d 4c 65 6e 67 74 68 28 7a  n = enumLength(z
4700: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30  );.      if( n>0
4710: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 6f   ){.        *pTo
4720: 6b 65 6e 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f  kenType = TOKEN_
4730: 45 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  ENUM;.        re
4740: 74 75 72 6e 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  turn n;.      }.
4750: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
4760: 2d 3e 73 74 61 74 65 20 26 20 41 54 5f 50 41 52  ->state & AT_PAR
4770: 41 47 52 41 50 48 29 21 3d 30 20 26 26 20 69 73  AGRAPH)!=0 && is
4780: 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 7b 0a 20  space(z[0]) ){. 
4790: 20 20 20 20 20 6e 20 3d 20 69 6e 64 65 6e 74 4c       n = indentL
47a0: 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20 20 20  ength(z);.      
47b0: 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20  if( n>0 ){.     
47c0: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
47d0: 20 54 4f 4b 45 4e 5f 49 4e 44 45 4e 54 3b 0a 20   TOKEN_INDENT;. 
47e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b         return n;
47f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4800: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5b 27     if( z[0]=='['
4810: 20 26 26 20 28 6e 20 3d 20 6c 69 6e 6b 4c 65 6e   && (n = linkLen
4820: 67 74 68 28 7a 29 29 3e 30 20 29 7b 0a 20 20 20  gth(z))>0 ){.   
4830: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
4840: 20 54 4f 4b 45 4e 5f 4c 49 4e 4b 3b 0a 20 20 20   TOKEN_LINK;.   
4850: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20     return n;.   
4860: 20 7d 0a 20 20 7d 0a 20 20 2a 70 54 6f 6b 65 6e   }.  }.  *pToken
4870: 54 79 70 65 20 3d 20 54 4f 4b 45 4e 5f 54 45 58  Type = TOKEN_TEX
4880: 54 3b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  T;.  return 1 + 
4890: 74 65 78 74 4c 65 6e 67 74 68 28 7a 2b 31 2c 20  textLength(z+1, 
48a0: 70 2d 3e 73 74 61 74 65 20 26 20 41 4c 4c 4f 57  p->state & ALLOW
48b0: 5f 57 49 4b 49 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _WIKI);.}../*.**
48c0: 20 41 20 73 69 6e 67 6c 65 20 6d 61 72 6b 75 70   A single markup
48d0: 20 69 73 20 70 61 72 73 65 64 20 69 6e 74 6f 20   is parsed into 
48e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
48f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
4900: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
4910: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61 72  pedef struct Par
4920: 73 65 64 4d 61 72 6b 75 70 20 50 61 72 73 65 64  sedMarkup Parsed
4930: 4d 61 72 6b 75 70 3b 0a 73 74 72 75 63 74 20 50  Markup;.struct P
4940: 61 72 73 65 64 4d 61 72 6b 75 70 20 7b 0a 20 20  arsedMarkup {.  
4950: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 6e  unsigned char en
4960: 64 54 61 67 3b 20 20 20 2f 2a 20 54 72 75 65 20  dTag;   /* True 
4970: 69 66 20 3c 2f 2e 2e 2e 3e 20 69 6e 73 74 65 61  if </...> instea
4980: 64 20 6f 66 20 3c 2e 2e 2e 3e 20 2a 2f 0a 20 20  d of <...> */.  
4990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43  unsigned char iC
49a0: 6f 64 65 3b 20 20 20 20 2f 2a 20 4d 41 52 4b 55  ode;    /* MARKU
49b0: 50 5f 2a 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  P_* */.  unsigne
49c0: 64 20 63 68 61 72 20 6e 41 74 74 72 3b 20 20 20  d char nAttr;   
49d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 74   /* Number of at
49e0: 74 72 69 62 75 74 65 73 20 2a 2f 0a 20 20 75 6e  tributes */.  un
49f0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 54 79  signed short iTy
4a00: 70 65 3b 20 20 20 2f 2a 20 4d 55 54 59 50 45 5f  pe;   /* MUTYPE_
4a10: 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 7b 0a  * */.  struct {.
4a20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
4a30: 72 20 69 43 6f 64 65 3b 20 20 20 20 20 2f 2a 20  r iCode;     /* 
4a40: 41 54 54 52 5f 2a 20 2a 2f 0a 20 20 20 20 63 68  ATTR_* */.    ch
4a50: 61 72 20 2a 7a 56 61 6c 75 65 3b 20 20 20 20 20  ar *zValue;     
4a60: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
4a70: 6e 74 20 74 6f 20 74 68 69 73 20 61 74 74 72 69  nt to this attri
4a80: 62 75 74 65 2e 20 20 4d 69 67 68 74 20 62 65 20  bute.  Might be 
4a90: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 63 68 61 72  NULL */.    char
4aa0: 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   cTerm;         
4ab0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
4ac0: 20 61 72 67 75 6d 65 6e 74 20 74 65 72 6d 69 6e   argument termin
4ad0: 61 74 69 6f 6e 20 63 68 61 72 61 63 74 65 72 20  ation character 
4ae0: 2a 2f 0a 20 20 7d 20 61 41 74 74 72 5b 31 30 5d  */.  } aAttr[10]
4af0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 7a 5b 5d 20  ;.};../*.** z[] 
4b00: 69 73 20 61 6e 20 48 54 4d 4c 20 6d 61 72 6b 75  is an HTML marku
4b10: 70 20 65 6c 65 6d 65 6e 74 20 2d 20 73 6f 6d 65  p element - some
4b20: 74 68 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  thing that begin
4b30: 73 20 77 69 74 68 20 27 3c 27 2e 0a 2a 2a 20 50  s with '<'..** P
4b40: 61 72 73 65 20 74 68 69 73 20 65 6c 65 6d 65 6e  arse this elemen
4b50: 74 20 69 6e 74 6f 20 74 68 65 20 70 20 73 74 72  t into the p str
4b60: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
4b70: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 7a 5b 5d  e content of z[]
4b80: 20 6d 69 67 68 74 20 62 65 20 6d 6f 64 69 66 69   might be modifi
4b90: 65 64 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  ed by converting
4ba0: 20 63 68 61 72 61 63 74 65 72 73 20 0a 2a 2a 20   characters .** 
4bb0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 61 6e 64  to lowercase and
4bc0: 20 62 79 20 69 6e 73 65 72 74 69 6e 67 20 73 6f   by inserting so
4bd0: 6d 65 20 22 5c 30 30 30 22 20 63 68 61 72 61 63  me "\000" charac
4be0: 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
4bf0: 76 6f 69 64 20 70 61 72 73 65 4d 61 72 6b 75 70  void parseMarkup
4c00: 28 50 61 72 73 65 64 4d 61 72 6b 75 70 20 2a 70  (ParsedMarkup *p
4c10: 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  , char *z){.  in
4c20: 74 20 69 2c 20 6a 2c 20 63 3b 0a 20 20 69 6e 74  t i, j, c;.  int
4c30: 20 69 43 6f 64 65 3b 0a 20 20 63 68 61 72 20 2a   iCode;.  char *
4c40: 7a 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20 73 65  zValue;.  int se
4c50: 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  en = 0;.  char z
4c60: 54 61 67 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Tag[100];..  if(
4c70: 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[1]=='/' ){.  
4c80: 20 20 70 2d 3e 65 6e 64 54 61 67 20 3d 20 31 3b    p->endTag = 1;
4c90: 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 65  .    i = 2;.  }e
4ca0: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 6e 64 54  lse{.    p->endT
4cb0: 61 67 20 3d 20 30 3b 0a 20 20 20 20 69 20 3d 20  ag = 0;.    i = 
4cc0: 31 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a  1;.  }.  j = 0;.
4cd0: 20 20 77 68 69 6c 65 28 20 69 73 61 6c 6e 75 6d    while( isalnum
4ce0: 28 7a 5b 69 5d 29 20 29 7b 20 0a 20 20 20 20 69  (z[i]) ){ .    i
4cf0: 66 28 20 6a 3c 73 69 7a 65 6f 66 28 7a 54 61 67  f( j<sizeof(zTag
4d00: 29 2d 31 20 29 20 7a 54 61 67 5b 6a 2b 2b 5d 20  )-1 ) zTag[j++] 
4d10: 3d 20 74 6f 6c 6f 77 65 72 28 7a 5b 69 5d 29 3b  = tolower(z[i]);
4d20: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
4d30: 7a 54 61 67 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70  zTag[j] = 0;.  p
4d40: 2d 3e 69 43 6f 64 65 20 3d 20 66 69 6e 64 54 61  ->iCode = findTa
4d50: 67 28 7a 54 61 67 29 3b 0a 20 20 70 2d 3e 69 54  g(zTag);.  p->iT
4d60: 79 70 65 20 3d 20 61 4d 61 72 6b 75 70 5b 70 2d  ype = aMarkup[p-
4d70: 3e 69 43 6f 64 65 5d 2e 69 54 79 70 65 3b 0a 20  >iCode].iType;. 
4d80: 20 70 2d 3e 6e 41 74 74 72 20 3d 20 30 3b 0a 20   p->nAttr = 0;. 
4d90: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
4da0: 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  z[i]) ){ i++; }.
4db0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e 41 74 74    while( p->nAtt
4dc0: 72 3c 38 20 26 26 20 69 73 61 6c 70 68 61 28 7a  r<8 && isalpha(z
4dd0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 6a 20 3d 20  [i]) ){.    j = 
4de0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  0;.    while( is
4df0: 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 29 7b 20 0a  alnum(z[i]) ){ .
4e00: 20 20 20 20 20 20 69 66 28 20 6a 3c 73 69 7a 65        if( j<size
4e10: 6f 66 28 7a 54 61 67 29 2d 31 20 29 20 7a 54 61  of(zTag)-1 ) zTa
4e20: 67 5b 6a 2b 2b 5d 20 3d 20 74 6f 6c 6f 77 65 72  g[j++] = tolower
4e30: 28 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 2b  (z[i]);.      i+
4e40: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61  +;.    }.    zTa
4e50: 67 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d  g[j] = 0;.    p-
4e60: 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74 74 72 5d  >aAttr[p->nAttr]
4e70: 2e 69 43 6f 64 65 20 3d 20 69 43 6f 64 65 20 3d  .iCode = iCode =
4e80: 20 66 69 6e 64 41 74 74 72 28 7a 54 61 67 29 3b   findAttr(zTag);
4e90: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70  .    while( issp
4ea0: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 7a 2b 2b  ace(z[i]) ){ z++
4eb0: 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ; }.    if( z[i]
4ec0: 21 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 70  !='=' ){.      p
4ed0: 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e 41 74 74 72  ->aAttr[p->nAttr
4ee0: 5d 2e 7a 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  ].zValue = 0;.  
4ef0: 20 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e      p->aAttr[p->
4f00: 6e 41 74 74 72 5d 2e 63 54 65 72 6d 20 3d 20 30  nAttr].cTerm = 0
4f10: 3b 0a 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20  ;.      c = 0;. 
4f20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4f30: 69 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  i++;.      while
4f40: 28 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  ( isspace(z[i]) 
4f50: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ z++; }.      
4f60: 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20 29 7b  if( z[i]=='"' ){
4f70: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
4f80: 20 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 26        zValue = &
4f90: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  z[i];.        wh
4fa0: 69 6c 65 28 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  ile( z[i] && z[i
4fb0: 5d 21 3d 27 22 27 20 29 7b 20 69 2b 2b 3b 20 7d  ]!='"' ){ i++; }
4fc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4fd0: 20 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 26        zValue = &
4fe0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  z[i];.        wh
4ff0: 69 6c 65 28 20 21 69 73 73 70 61 63 65 28 7a 5b  ile( !isspace(z[
5000: 69 5d 29 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27  i]) && z[i]!='>'
5010: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
5020: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 41 74 74   }.      p->aAtt
5030: 72 5b 70 2d 3e 6e 41 74 74 72 5d 2e 7a 56 61 6c  r[p->nAttr].zVal
5040: 75 65 20 3d 20 7a 56 61 6c 75 65 3b 0a 20 20 20  ue = zValue;.   
5050: 20 20 20 70 2d 3e 61 41 74 74 72 5b 70 2d 3e 6e     p->aAttr[p->n
5060: 41 74 74 72 5d 2e 63 54 65 72 6d 20 3d 20 63 20  Attr].cTerm = c 
5070: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 5b  = z[i];.      z[
5080: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 2b  i] = 0;.      i+
5090: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
50a0: 20 69 43 6f 64 65 21 3d 30 20 26 26 20 28 73 65   iCode!=0 && (se
50b0: 65 6e 20 26 20 61 41 74 74 72 69 62 75 74 65 5b  en & aAttribute[
50c0: 69 43 6f 64 65 5d 2e 69 4d 61 73 6b 29 3d 3d 30  iCode].iMask)==0
50d0: 20 29 7b 0a 20 20 20 20 20 20 73 65 65 6e 20 7c   ){.      seen |
50e0: 3d 20 61 41 74 74 72 69 62 75 74 65 5b 69 43 6f  = aAttribute[iCo
50f0: 64 65 5d 2e 69 4d 61 73 6b 3b 0a 20 20 20 20 20  de].iMask;.     
5100: 20 70 2d 3e 6e 41 74 74 72 2b 2b 3b 0a 20 20 20   p->nAttr++;.   
5110: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73   }.    while( is
5120: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
5130: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b  ++; }.    if( z[
5140: 69 5d 3d 3d 27 3e 27 20 7c 7c 20 28 7a 5b 69 5d  i]=='>' || (z[i]
5150: 3d 3d 27 2f 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='/' && z[i+1]=
5160: 3d 27 3e 27 29 20 29 20 62 72 65 61 6b 3b 0a 20  ='>') ) break;. 
5170: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64   }.}../*.** Rend
5180: 65 72 20 6d 61 72 6b 75 70 20 6f 6e 20 74 68 65  er markup on the
5190: 20 67 69 76 65 6e 20 62 6c 6f 62 2e 0a 2a 2f 0a   given blob..*/.
51a0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6e 64  static void rend
51b0: 65 72 4d 61 72 6b 75 70 28 42 6c 6f 62 20 2a 70  erMarkup(Blob *p
51c0: 4f 75 74 2c 20 50 61 72 73 65 64 4d 61 72 6b 75  Out, ParsedMarku
51d0: 70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  p *p){.  int i;.
51e0: 20 20 69 66 28 20 70 2d 3e 65 6e 64 54 61 67 20    if( p->endTag 
51f0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
5200: 6e 64 66 28 70 4f 75 74 2c 20 22 3c 2f 25 73 3e  ndf(pOut, "</%s>
5210: 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 69 43  ", aMarkup[p->iC
5220: 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  ode].zName);.  }
5230: 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  else{.    blob_a
5240: 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 3c 25  ppendf(pOut, "<%
5250: 73 22 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 69  s", aMarkup[p->i
5260: 43 6f 64 65 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  Code].zName);.  
5270: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5280: 6e 41 74 74 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nAttr; i++){.   
5290: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
52a0: 70 4f 75 74 2c 20 22 20 25 73 22 2c 20 61 41 74  pOut, " %s", aAt
52b0: 74 72 69 62 75 74 65 5b 70 2d 3e 61 41 74 74 72  tribute[p->aAttr
52c0: 5b 69 5d 2e 69 43 6f 64 65 5d 2e 7a 4e 61 6d 65  [i].iCode].zName
52d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
52e0: 61 41 74 74 72 5b 69 5d 2e 7a 56 61 6c 75 65 20  aAttr[i].zValue 
52f0: 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  ){.        blob_
5300: 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 3d  appendf(pOut, "=
5310: 5c 22 25 73 5c 22 22 2c 20 70 2d 3e 61 41 74 74  \"%s\"", p->aAtt
5320: 72 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b 0a 20 20  r[i].zValue);.  
5330: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5340: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 74  blob_append(pOut
5350: 2c 20 22 3e 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , ">", 1);.  }.}
5360: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ../*.** When the
5370: 20 6d 61 72 6b 75 70 20 77 61 73 20 70 61 72 73   markup was pars
5380: 65 64 2c 20 73 6f 6d 65 20 22 5c 30 30 30 22 20  ed, some "\000" 
5390: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 69 6e  may have been in
53a0: 73 65 72 74 65 64 2e 0a 2a 2a 20 54 68 69 73 20  serted..** This 
53b0: 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73  routine restores
53c0: 20 74 6f 20 74 68 6f 73 65 20 22 5c 30 30 30 22   to those "\000"
53d0: 20 76 61 6c 75 65 73 20 62 61 63 6b 20 74 6f 20   values back to 
53e0: 74 68 65 69 72 0a 2a 2a 20 6f 72 69 67 69 6e 61  their.** origina
53f0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74  l content..*/.st
5400: 61 74 69 63 20 76 6f 69 64 20 75 6e 70 61 72 73  atic void unpars
5410: 65 4d 61 72 6b 75 70 28 50 61 72 73 65 64 4d 61  eMarkup(ParsedMa
5420: 72 6b 75 70 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rkup *p){.  int 
5430: 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, n;.  for(i=0;
5440: 20 69 3c 70 2d 3e 6e 41 74 74 72 3b 20 69 2b 2b   i<p->nAttr; i++
5450: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
5460: 20 70 2d 3e 61 41 74 74 72 5b 69 5d 2e 7a 56 61   p->aAttr[i].zVa
5470: 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  lue;.    if( z==
5480: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5490: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b    n = strlen(z);
54a0: 0a 20 20 20 20 7a 5b 6e 5d 20 3d 20 70 2d 3e 61  .    z[n] = p->a
54b0: 41 74 74 72 5b 69 5d 2e 63 54 65 72 6d 3b 0a 20  Attr[i].cTerm;. 
54c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20   }.}../*.** Pop 
54d0: 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74  a single element
54e0: 20 6f 66 66 20 6f 66 20 74 68 65 20 73 74 61 63   off of the stac
54f0: 6b 2e 20 20 41 73 20 74 68 65 20 65 6c 65 6d 65  k.  As the eleme
5500: 6e 74 20 69 73 20 70 6f 70 70 65 64 2c 0a 2a 2a  nt is popped,.**
5510: 20 6f 75 74 70 75 74 20 69 74 73 20 65 6e 64 20   output its end 
5520: 74 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tag..*/.static v
5530: 6f 69 64 20 70 6f 70 53 74 61 63 6b 28 52 65 6e  oid popStack(Ren
5540: 64 65 72 65 72 20 2a 70 29 7b 0a 20 20 69 66 28  derer *p){.  if(
5550: 20 70 2d 3e 6e 53 74 61 63 6b 20 29 7b 0a 20 20   p->nStack ){.  
5560: 20 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a 20    p->nStack--;. 
5570: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
5580: 70 2d 3e 70 4f 75 74 2c 20 22 3c 2f 25 73 3e 22  p->pOut, "</%s>"
5590: 2c 20 61 4d 61 72 6b 75 70 5b 70 2d 3e 61 53 74  , aMarkup[p->aSt
55a0: 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d 5d 2e  ack[p->nStack]].
55b0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
55c0: 2a 0a 2a 2a 20 50 75 73 68 20 61 20 6e 65 77 20  *.** Push a new 
55d0: 6d 61 72 6b 75 70 20 76 61 6c 75 65 20 6f 6e 74  markup value ont
55e0: 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 45 6e  o the stack.  En
55f0: 6c 61 72 67 65 20 74 68 65 20 73 74 61 63 6b 0a  large the stack.
5600: 2a 2a 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ** if necessary.
5610: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5620: 70 75 73 68 53 74 61 63 6b 28 52 65 6e 64 65 72  pushStack(Render
5630: 65 72 20 2a 70 2c 20 69 6e 74 20 65 6c 65 6d 29  er *p, int elem)
5640: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 53 74 61 63  {.  if( p->nStac
5650: 6b 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  k>=p->nAlloc ){.
5660: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
5670: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30  p->nAlloc*2 + 10
5680: 30 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b  0;.    p->aStack
5690: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 53   = realloc(p->aS
56a0: 74 61 63 6b 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  tack, p->nAlloc)
56b0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 53 74  ;.    if( p->aSt
56c0: 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
56d0: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6f 75  fossil_panic("ou
56e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
56f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 53     }.  }.  p->aS
5700: 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2b 2b  tack[p->nStack++
5710: 5d 20 3d 20 65 6c 65 6d 3b 0a 7d 0a 0a 2f 2a 0a  ] = elem;.}../*.
5720: 2a 2a 20 50 6f 70 20 74 68 65 20 73 74 61 63 6b  ** Pop the stack
5730: 20 75 6e 74 69 6c 20 74 68 65 20 74 6f 70 2d 6d   until the top-m
5740: 6f 73 74 20 69 54 61 67 20 65 6c 65 6d 65 6e 74  ost iTag element
5750: 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 20   is removed..** 
5760: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  If there is no i
5770: 54 61 67 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  Tag element on t
5780: 68 65 20 73 74 61 63 6b 2c 20 74 68 69 73 20 72  he stack, this r
5790: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e  outine.** is a n
57a0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
57b0: 76 6f 69 64 20 70 6f 70 53 74 61 63 6b 54 6f 54  void popStackToT
57c0: 61 67 28 52 65 6e 64 65 72 65 72 20 2a 70 2c 20  ag(Renderer *p, 
57d0: 69 6e 74 20 69 54 61 67 29 7b 0a 20 20 69 6e 74  int iTag){.  int
57e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e   i;.  for(i=p->n
57f0: 53 74 61 63 6b 2d 31 3b 20 69 3e 3d 30 20 26 26  Stack-1; i>=0 &&
5800: 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 21 3d 69   p->aStack[i]!=i
5810: 54 61 67 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  Tag; i--){}.  if
5820: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
5830: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e 53 74 61    while( p->nSta
5840: 63 6b 3e 69 20 29 7b 0a 20 20 20 20 70 6f 70 53  ck>i ){.    popS
5850: 74 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  tack(p);.  }.}..
5860: 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68 65 20 73 74  /*.** Pop the st
5870: 61 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 74 6f  ack until the to
5880: 70 2d 6d 6f 73 74 20 65 6c 65 6d 65 6e 74 20 6f  p-most element o
5890: 66 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20 69  f the stack.** i
58a0: 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20 74 68 61  s an element tha
58b0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 74 79  t matches the ty
58c0: 70 65 20 69 6e 20 69 4d 61 73 6b 2e 20 20 52 65  pe in iMask.  Re
58d0: 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6f 66 20  turn.** code of 
58e0: 74 68 65 20 6d 61 72 6b 75 70 20 65 6c 65 6d 65  the markup eleme
58f0: 6e 74 20 74 68 61 74 20 69 73 20 6f 6e 20 6c 65  nt that is on le
5900: 66 74 20 6f 6e 20 74 6f 70 20 6f 66 20 74 68 65  ft on top of the
5910: 20 73 74 61 63 6b 2e 0a 2a 2a 20 49 66 20 74 68   stack..** If th
5920: 65 20 73 74 61 63 6b 20 64 6f 65 73 20 6e 6f 74  e stack does not
5930: 20 68 61 76 65 20 61 6e 20 65 6c 65 6d 65 6e 74   have an element
5940: 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 65 73  .** that matches
5950: 20 69 4d 61 73 6b 2c 20 74 68 65 6e 20 6c 65 61   iMask, then lea
5960: 76 65 20 74 68 65 20 73 74 61 63 6b 20 75 6e 63  ve the stack unc
5970: 68 61 6e 67 65 64 20 61 6e 64 0a 2a 2a 20 72 65  hanged and.** re
5980: 74 75 72 6e 20 66 61 6c 73 65 20 28 4d 41 52 4b  turn false (MARK
5990: 55 50 5f 49 4e 56 41 4c 49 44 29 2e 0a 2a 2f 0a  UP_INVALID)..*/.
59a0: 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b 75  static int backu
59b0: 70 54 6f 54 79 70 65 28 52 65 6e 64 65 72 65 72  pToType(Renderer
59c0: 20 2a 70 2c 20 69 6e 74 20 69 4d 61 73 6b 29 7b   *p, int iMask){
59d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
59e0: 69 3d 70 2d 3e 6e 53 74 61 63 6b 2d 31 3b 20 69  i=p->nStack-1; i
59f0: 3e 3d 30 20 26 26 20 28 61 4d 61 72 6b 75 70 5b  >=0 && (aMarkup[
5a00: 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 5d 2e 69 54  p->aStack[i]].iT
5a10: 79 70 65 26 69 4d 61 73 6b 29 3d 3d 30 3b 20 69  ype&iMask)==0; i
5a20: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3c 30 20  --){}.  if( i<0 
5a30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 2b  ) return 0;.  i+
5a40: 2b 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6e  +;.  while( p->n
5a50: 53 74 61 63 6b 3e 69 20 29 7b 0a 20 20 20 20 70  Stack>i ){.    p
5a60: 6f 70 53 74 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  opStack(p);.  }.
5a70: 20 20 72 65 74 75 72 6e 20 70 2d 3e 61 53 74 61    return p->aSta
5a80: 63 6b 5b 69 2d 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  ck[i-1];.}../*.*
5a90: 2a 20 42 65 67 69 6e 20 61 20 6e 65 77 20 70 61  * Begin a new pa
5aa0: 72 61 67 72 61 70 68 20 69 66 20 74 68 61 74 20  ragraph if that 
5ab0: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 69  something that i
5ac0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
5ad0: 74 69 63 20 76 6f 69 64 20 73 74 61 72 74 41 75  tic void startAu
5ae0: 74 6f 50 61 72 61 67 72 61 70 68 28 52 65 6e 64  toParagraph(Rend
5af0: 65 72 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  erer *p){.  if( 
5b00: 70 2d 3e 77 61 6e 74 41 75 74 6f 50 61 72 61 67  p->wantAutoParag
5b10: 72 61 70 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  raph==0 ) return
5b20: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
5b30: 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 70 3e 22 2c  (p->pOut, "<p>",
5b40: 20 2d 31 29 3b 0a 20 20 70 75 73 68 53 74 61 63   -1);.  pushStac
5b50: 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 50 29 3b 0a  k(p, MARKUP_P);.
5b60: 20 20 70 2d 3e 77 61 6e 74 41 75 74 6f 50 61 72    p->wantAutoPar
5b70: 61 67 72 61 70 68 20 3d 20 30 3b 0a 20 20 70 2d  agraph = 0;.  p-
5b80: 3e 69 6e 41 75 74 6f 50 61 72 61 67 72 61 70 68  >inAutoParagraph
5b90: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45   = 1;.}../*.** E
5ba0: 6e 64 20 61 20 70 61 72 61 67 72 61 70 68 20 69  nd a paragraph i
5bb0: 66 20 77 65 20 61 72 65 20 69 6e 20 6f 6e 65 2e  f we are in one.
5bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5bd0: 65 6e 64 41 75 74 6f 50 61 72 61 67 72 61 70 68  endAutoParagraph
5be0: 28 52 65 6e 64 65 72 65 72 20 2a 70 29 7b 0a 20  (Renderer *p){. 
5bf0: 20 69 66 28 20 70 2d 3e 69 6e 41 75 74 6f 50 61   if( p->inAutoPa
5c00: 72 61 67 72 61 70 68 20 29 7b 0a 20 20 20 20 70  ragraph ){.    p
5c10: 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20  opStackToTag(p, 
5c20: 4d 41 52 4b 55 50 5f 50 29 3b 0a 20 20 20 20 70  MARKUP_P);.    p
5c30: 2d 3e 69 6e 41 75 74 6f 50 61 72 61 67 72 61 70  ->inAutoParagrap
5c40: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
5c50: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
5c60: 20 73 74 72 69 6e 67 20 63 6f 72 72 65 73 70 6f   string correspo
5c70: 6e 64 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69  nds to an existi
5c80: 6e 67 20 62 61 73 65 6c 69 6e 65 2c 0a 2a 2a 20  ng baseline,.** 
5c90: 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 2a 2f 0a  return true..*/.
5ca0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 5f 76 61  static int is_va
5cb0: 6c 69 64 5f 75 75 69 64 28 63 6f 6e 73 74 20 63  lid_uuid(const c
5cc0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
5cd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
5ce0: 69 66 28 20 6e 3c 34 20 7c 7c 20 6e 3e 55 55 49  if( n<4 || n>UUI
5cf0: 44 5f 53 49 5a 45 20 29 20 72 65 74 75 72 6e 20  D_SIZE ) return 
5d00: 30 3b 0a 20 20 69 66 28 20 21 76 61 6c 69 64 61  0;.  if( !valida
5d10: 74 65 31 36 28 7a 2c 20 6e 29 20 29 20 72 65 74  te16(z, n) ) ret
5d20: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
5d30: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
5d40: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
5d50: 69 76 65 6e 20 68 79 70 65 72 6c 69 6e 6b 20 73  iven hyperlink s
5d60: 68 6f 75 6c 64 20 62 65 20 69 6d 70 6c 65 6d 65  hould be impleme
5d70: 6e 74 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20  nted for.** the 
5d80: 63 75 72 72 65 6e 74 20 6c 6f 67 69 6e 2e 0a 2a  current login..*
5d90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 6b 54  /.static int okT
5da0: 6f 48 79 70 65 72 6c 69 6e 6b 28 63 6f 6e 73 74  oHyperlink(const
5db0: 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 29 7b   char *zTarget){
5dc0: 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f  .  if( g.okHisto
5dd0: 72 79 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ry ) return 1;. 
5de0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61   if( strncmp(zTa
5df0: 72 67 65 74 2c 20 22 68 74 74 70 3a 22 2c 20 35  rget, "http:", 5
5e00: 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 74 72 6e  )==0 .   || strn
5e10: 63 6d 70 28 7a 54 61 72 67 65 74 2c 20 22 68 74  cmp(zTarget, "ht
5e20: 74 70 73 3a 22 2c 20 36 29 3d 3d 30 0a 20 20 20  tps:", 6)==0.   
5e30: 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54 61 72 67  || strncmp(zTarg
5e40: 65 74 2c 20 22 66 74 70 3a 22 2c 20 34 29 3d 3d  et, "ftp:", 4)==
5e50: 30 20 0a 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70  0 .   || strncmp
5e60: 28 7a 54 61 72 67 65 74 2c 20 22 6d 61 69 6c 74  (zTarget, "mailt
5e70: 6f 3a 22 2c 20 37 29 3d 3d 30 0a 20 20 29 7b 0a  o:", 7)==0.  ){.
5e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5e90: 7d 0a 20 20 69 66 28 20 7a 54 61 72 67 65 74 5b  }.  if( zTarget[
5ea0: 30 5d 3d 3d 27 2f 27 20 7c 7c 20 69 73 5f 76 61  0]=='/' || is_va
5eb0: 6c 69 64 5f 75 75 69 64 28 7a 54 61 72 67 65 74  lid_uuid(zTarget
5ec0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
5ed0: 69 66 28 20 77 69 6b 69 5f 6e 61 6d 65 5f 69 73  if( wiki_name_is
5ee0: 5f 77 65 6c 6c 66 6f 72 6d 65 64 28 7a 54 61 72  _wellformed(zTar
5ef0: 67 65 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  get) ) return 1;
5f00: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5f10: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 20  /*.** Resolve a 
5f20: 68 79 70 65 72 6c 69 6e 6b 2e 20 20 54 68 65 20  hyperlink.  The 
5f30: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
5f40: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 5b  content of the [
5f50: 2e 2e 2e 5d 0a 2a 2a 20 69 6e 20 74 68 65 20 77  ...].** in the w
5f60: 69 6b 69 2e 20 20 41 70 70 65 6e 64 20 74 68 65  iki.  Append the
5f70: 20 55 52 4c 20 74 6f 20 74 68 65 20 6f 75 74 70   URL to the outp
5f80: 75 74 20 6f 66 20 74 68 65 20 52 65 6e 64 65 72  ut of the Render
5f90: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
5fa0: 69 64 20 72 65 73 6f 6c 76 65 48 79 70 65 72 6c  id resolveHyperl
5fb0: 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ink(const char *
5fc0: 7a 54 61 72 67 65 74 2c 20 52 65 6e 64 65 72 65  zTarget, Rendere
5fd0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 73 74 72  r *p){.  if( str
5fe0: 6e 63 6d 70 28 7a 54 61 72 67 65 74 2c 20 22 68  ncmp(zTarget, "h
5ff0: 74 74 70 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20  ttp:", 5)==0 .  
6000: 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54 61 72   || strncmp(zTar
6010: 67 65 74 2c 20 22 68 74 74 70 73 3a 22 2c 20 36  get, "https:", 6
6020: 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 6e 63  )==0.   || strnc
6030: 6d 70 28 7a 54 61 72 67 65 74 2c 20 22 66 74 70  mp(zTarget, "ftp
6040: 3a 22 2c 20 34 29 3d 3d 30 20 0a 20 20 20 7c 7c  :", 4)==0 .   ||
6050: 20 73 74 72 6e 63 6d 70 28 7a 54 61 72 67 65 74   strncmp(zTarget
6060: 2c 20 22 6d 61 69 6c 74 6f 3a 22 2c 20 37 29 3d  , "mailto:", 7)=
6070: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 62 6c 6f 62  =0.  ){.    blob
6080: 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74  _appendf(p->pOut
6090: 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , zTarget);.  }e
60a0: 6c 73 65 20 69 66 28 20 7a 54 61 72 67 65 74 5b  lse if( zTarget[
60b0: 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 62  0]=='/' ){.    b
60c0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70  lob_appendf(p->p
60d0: 4f 75 74 2c 20 22 25 73 25 68 22 2c 20 67 2e 7a  Out, "%s%h", g.z
60e0: 42 61 73 65 55 52 4c 2c 20 7a 54 61 72 67 65 74  BaseURL, zTarget
60f0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
6100: 73 5f 76 61 6c 69 64 5f 75 75 69 64 28 7a 54 61  s_valid_uuid(zTa
6110: 72 67 65 74 29 20 29 7b 0a 20 20 20 20 62 6c 6f  rget) ){.    blo
6120: 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75  b_appendf(p->pOu
6130: 74 2c 20 22 25 73 2f 69 6e 66 6f 2f 25 73 22 2c  t, "%s/info/%s",
6140: 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54 61   g.zBaseURL, zTa
6150: 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
6160: 66 28 20 77 69 6b 69 5f 6e 61 6d 65 5f 69 73 5f  f( wiki_name_is_
6170: 77 65 6c 6c 66 6f 72 6d 65 64 28 7a 54 61 72 67  wellformed(zTarg
6180: 65 74 29 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  et) ){.    blob_
6190: 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74 2c  appendf(p->pOut,
61a0: 20 22 25 73 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25   "%s/wiki?name=%
61b0: 54 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20  T", g.zBaseURL, 
61c0: 7a 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73  zTarget);.  }els
61d0: 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  e{.    blob_appe
61e0: 6e 64 66 28 70 2d 3e 70 4f 75 74 2c 20 22 65 72  ndf(p->pOut, "er
61f0: 72 6f 72 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ror");.  }.}../*
6200: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
6210: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   if the given pa
6220: 72 73 65 64 20 6d 61 72 6b 75 70 20 69 73 20 74  rsed markup is t
6230: 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 3c 2f  he correct.** </
6240: 76 65 72 62 61 74 69 6d 3e 20 74 61 67 2e 0a 2a  verbatim> tag..*
6250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e 64  /.static int end
6260: 56 65 72 62 61 74 69 6d 28 52 65 6e 64 65 72 65  Verbatim(Rendere
6270: 72 20 2a 70 2c 20 50 61 72 73 65 64 4d 61 72 6b  r *p, ParsedMark
6280: 75 70 20 2a 70 4d 61 72 6b 75 70 29 7b 0a 20 20  up *pMarkup){.  
6290: 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73 65 72  char *z;.  asser
62a0: 74 28 20 70 2d 3e 69 6e 56 65 72 62 61 74 69 6d  t( p->inVerbatim
62b0: 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 72 6b 75   );.  if( pMarku
62c0: 70 2d 3e 69 43 6f 64 65 21 3d 4d 41 52 4b 55 50  p->iCode!=MARKUP
62d0: 5f 56 45 52 42 41 54 49 4d 20 29 20 72 65 74 75  _VERBATIM ) retu
62e0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 4d 61  rn 0;.  if( !pMa
62f0: 72 6b 75 70 2d 3e 65 6e 64 54 61 67 20 29 20 72  rkup->endTag ) r
6300: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
6310: 2d 3e 7a 56 65 72 62 61 74 69 6d 49 64 3d 3d 30  ->zVerbatimId==0
6320: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6330: 66 28 20 70 4d 61 72 6b 75 70 2d 3e 6e 41 74 74  f( pMarkup->nAtt
6340: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
6350: 0a 20 20 7a 20 3d 20 70 4d 61 72 6b 75 70 2d 3e  .  z = pMarkup->
6360: 61 41 74 74 72 5b 30 5d 2e 7a 56 61 6c 75 65 3b  aAttr[0].zValue;
6370: 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70  .  return strcmp
6380: 28 7a 2c 20 70 2d 3e 7a 56 65 72 62 61 74 69 6d  (z, p->zVerbatim
6390: 49 64 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Id)==0;.}../*.**
63a0: 20 52 65 74 75 72 6e 20 74 68 65 20 4d 55 54 59   Return the MUTY
63b0: 50 45 20 66 6f 72 20 74 68 65 20 74 6f 70 20 6f  PE for the top o
63c0: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  f the stack..*/.
63d0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 63 6b  static int stack
63e0: 54 6f 70 54 79 70 65 28 52 65 6e 64 65 72 65 72  TopType(Renderer
63f0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e   *p){.  if( p->n
6400: 53 74 61 63 6b 3c 3d 30 20 29 20 72 65 74 75 72  Stack<=0 ) retur
6410: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4d  n 0;.  return aM
6420: 61 72 6b 75 70 5b 70 2d 3e 61 53 74 61 63 6b 5b  arkup[p->aStack[
6430: 70 2d 3e 6e 53 74 61 63 6b 2d 31 5d 5d 2e 69 54  p->nStack-1]].iT
6440: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ype;.}../*.** Co
6450: 6e 76 65 72 74 20 74 68 65 20 77 69 6b 69 20 69  nvert the wiki i
6460: 6e 20 7a 5b 5d 20 69 6e 74 6f 20 68 74 6d 6c 20  n z[] into html 
6470: 69 6e 20 74 68 65 20 72 65 6e 64 65 72 65 72 20  in the renderer 
6480: 70 2e 20 20 54 68 65 0a 2a 2a 20 72 65 6e 64 65  p.  The.** rende
6490: 72 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  rer has already 
64a0: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
64b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
64c0: 74 69 6e 65 20 77 69 6c 6c 20 70 72 6f 62 61 62  tine will probab
64d0: 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f  ly modify the co
64e0: 6e 74 65 6e 74 20 6f 66 20 7a 5b 5d 2e 0a 2a 2f  ntent of z[]..*/
64f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6b  .static void wik
6500: 69 5f 72 65 6e 64 65 72 28 52 65 6e 64 65 72 65  i_render(Rendere
6510: 72 20 2a 70 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  r *p, char *z){.
6520: 20 20 69 6e 74 20 74 6f 6b 65 6e 54 79 70 65 3b    int tokenType;
6530: 0a 20 20 50 61 72 73 65 64 4d 61 72 6b 75 70 20  .  ParsedMarkup 
6540: 6d 61 72 6b 75 70 3b 0a 20 20 69 6e 74 20 6e 3b  markup;.  int n;
6550: 0a 20 20 69 6e 74 20 69 6e 6c 69 6e 65 4f 6e 6c  .  int inlineOnl
6560: 79 20 3d 20 28 70 2d 3e 73 74 61 74 65 20 26 20  y = (p->state & 
6570: 49 4e 4c 49 4e 45 5f 4d 41 52 4b 55 50 5f 4f 4e  INLINE_MARKUP_ON
6580: 4c 59 29 21 3d 30 3b 0a 0a 20 20 77 68 69 6c 65  LY)!=0;..  while
6590: 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 20  ( z[0] ){.    n 
65a0: 3d 20 6e 65 78 74 54 6f 6b 65 6e 28 7a 2c 20 70  = nextToken(z, p
65b0: 2c 20 26 74 6f 6b 65 6e 54 79 70 65 29 3b 0a 20  , &tokenType);. 
65c0: 20 20 20 70 2d 3e 73 74 61 74 65 20 26 3d 20 7e     p->state &= ~
65d0: 28 41 54 5f 4e 45 57 4c 49 4e 45 7c 41 54 5f 50  (AT_NEWLINE|AT_P
65e0: 41 52 41 47 52 41 50 48 29 3b 0a 20 20 20 20 73  ARAGRAPH);.    s
65f0: 77 69 74 63 68 28 20 74 6f 6b 65 6e 54 79 70 65  witch( tokenType
6600: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
6610: 4f 4b 45 4e 5f 50 41 52 41 47 52 41 50 48 3a 20  OKEN_PARAGRAPH: 
6620: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  {.        if( in
6630: 6c 69 6e 65 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  lineOnly ){.    
6640: 20 20 20 20 20 20 2f 2a 20 62 6c 6f 62 5f 61 70        /* blob_ap
6650: 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 20  pend(p->pOut, " 
6660: 26 70 61 72 61 3b 20 22 2c 20 2d 31 29 3b 20 2a  &para; ", -1); *
6670: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  /.          blob
6680: 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c  _append(p->pOut,
6690: 20 22 20 26 6e 62 73 70 3b 26 6e 62 73 70 3b 20   " &nbsp;&nbsp; 
66a0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
66b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
66c0: 20 69 66 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74   if( p->wikiList
66d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
66e0: 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70 2c  popStackToTag(p,
66f0: 20 70 2d 3e 77 69 6b 69 4c 69 73 74 29 3b 0a 20   p->wikiList);. 
6700: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 69             p->wi
6710: 6b 69 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  kiList = 0;.    
6720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6730: 20 20 65 6e 64 41 75 74 6f 50 61 72 61 67 72 61    endAutoParagra
6740: 70 68 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ph(p);.         
6750: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d   blob_appendf(p-
6760: 3e 70 4f 75 74 2c 20 22 5c 6e 5c 6e 22 2c 20 31  >pOut, "\n\n", 1
6770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
6780: 77 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70  wantAutoParagrap
6790: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  h = 1;.        }
67a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61 74  .        p->stat
67b0: 65 20 7c 3d 20 41 54 5f 50 41 52 41 47 52 41 50  e |= AT_PARAGRAP
67c0: 48 7c 41 54 5f 4e 45 57 4c 49 4e 45 3b 0a 20 20  H|AT_NEWLINE;.  
67d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
67e0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
67f0: 54 4f 4b 45 4e 5f 4e 45 57 4c 49 4e 45 3a 20 7b  TOKEN_NEWLINE: {
6800: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
6810: 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 5c  pend(p->pOut, "\
6820: 6e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  n", 1);.        
6830: 70 2d 3e 73 74 61 74 65 20 7c 3d 20 41 54 5f 4e  p->state |= AT_N
6840: 45 57 4c 49 4e 45 3b 0a 20 20 20 20 20 20 20 20  EWLINE;.        
6850: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6860: 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f       case TOKEN_
6870: 42 55 4c 4c 45 54 3a 20 7b 0a 20 20 20 20 20 20  BULLET: {.      
6880: 20 20 69 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79    if( inlineOnly
6890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c   ){.          bl
68a0: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
68b0: 74 2c 20 22 20 26 23 31 34 39 3b 20 22 2c 20 2d  t, " &#149; ", -
68c0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
68d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
68e0: 20 70 2d 3e 77 69 6b 69 4c 69 73 74 21 3d 4d 41   p->wikiList!=MA
68f0: 52 4b 55 50 5f 55 4c 20 29 7b 0a 20 20 20 20 20  RKUP_UL ){.     
6900: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 77 69         if( p->wi
6910: 6b 69 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  kiList ){.      
6920: 20 20 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b          popStack
6930: 54 6f 54 61 67 28 70 2c 20 70 2d 3e 77 69 6b 69  ToTag(p, p->wiki
6940: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  List);.         
6950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6960: 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20 4d 41   pushStack(p, MA
6970: 52 4b 55 50 5f 55 4c 29 3b 0a 20 20 20 20 20 20  RKUP_UL);.      
6980: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
6990: 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 75 6c 3e  d(p->pOut, "<ul>
69a0: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 4);.         
69b0: 20 20 20 70 2d 3e 77 69 6b 69 4c 69 73 74 20 3d     p->wikiList =
69c0: 20 4d 41 52 4b 55 50 5f 55 4c 3b 0a 20 20 20 20   MARKUP_UL;.    
69d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
69e0: 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61 67 28    popStackToTag(
69f0: 70 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b 0a 20  p, MARKUP_LI);. 
6a00: 20 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75           startAu
6a10: 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a  toParagraph(p);.
6a20: 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74            pushSt
6a30: 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49  ack(p, MARKUP_LI
6a40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  );.          blo
6a50: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
6a60: 2c 20 22 3c 6c 69 3e 22 2c 20 34 29 3b 0a 20 20  , "<li>", 4);.  
6a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6a90: 20 20 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f       case TOKEN_
6aa0: 45 4e 55 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20  ENUM: {.        
6ab0: 69 66 28 20 69 6e 6c 69 6e 65 4f 6e 6c 79 20 29  if( inlineOnly )
6ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  {.          blob
6ad0: 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70 4f 75 74  _appendf(p->pOut
6ae0: 2c 20 22 20 28 25 64 29 20 22 2c 20 61 74 6f 69  , " (%d) ", atoi
6af0: 28 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (z));.        }e
6b00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
6b10: 66 28 20 70 2d 3e 77 69 6b 69 4c 69 73 74 21 3d  f( p->wikiList!=
6b20: 4d 41 52 4b 55 50 5f 4f 4c 20 29 7b 0a 20 20 20  MARKUP_OL ){.   
6b30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
6b40: 77 69 6b 69 4c 69 73 74 20 29 7b 0a 20 20 20 20  wikiList ){.    
6b50: 20 20 20 20 20 20 20 20 20 20 70 6f 70 53 74 61            popSta
6b60: 63 6b 54 6f 54 61 67 28 70 2c 20 70 2d 3e 77 69  ckToTag(p, p->wi
6b70: 6b 69 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  kiList);.       
6b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6b90: 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c 20     pushStack(p, 
6ba0: 4d 41 52 4b 55 50 5f 4f 4c 29 3b 0a 20 20 20 20  MARKUP_OL);.    
6bb0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
6bc0: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 3c 6f  end(p->pOut, "<o
6bd0: 6c 3e 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  l>", 4);.       
6be0: 20 20 20 20 20 70 2d 3e 77 69 6b 69 4c 69 73 74       p->wikiList
6bf0: 20 3d 20 4d 41 52 4b 55 50 5f 4f 4c 3b 0a 20 20   = MARKUP_OL;.  
6c00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6c10: 20 20 20 20 70 6f 70 53 74 61 63 6b 54 6f 54 61      popStackToTa
6c20: 67 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49 29 3b  g(p, MARKUP_LI);
6c30: 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
6c40: 41 75 74 6f 50 61 72 61 67 72 61 70 68 28 70 29  AutoParagraph(p)
6c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 73 68  ;.          push
6c60: 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f  Stack(p, MARKUP_
6c70: 4c 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  LI);.          b
6c80: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2d 3e 70  lob_appendf(p->p
6c90: 4f 75 74 2c 20 22 3c 6c 69 20 76 61 6c 75 65 3d  Out, "<li value=
6ca0: 5c 22 25 64 5c 22 3e 22 2c 20 61 74 6f 69 28 7a  \"%d\">", atoi(z
6cb0: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
6cc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6cd0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
6ce0: 54 4f 4b 45 4e 5f 49 4e 44 45 4e 54 3a 20 7b 0a  TOKEN_INDENT: {.
6cf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 6c 69          if( inli
6d00: 6e 65 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  neOnly ){.      
6d10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77      assert( p->w
6d20: 69 6b 69 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ikiList==0 );.  
6d30: 20 20 20 20 20 20 20 20 70 75 73 68 53 74 61 63          pushStac
6d40: 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 42 4c 4f 43  k(p, MARKUP_BLOC
6d50: 4b 51 55 4f 54 45 29 3b 0a 20 20 20 20 20 20 20  KQUOTE);.       
6d60: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
6d70: 2d 3e 70 4f 75 74 2c 20 22 3c 62 6c 6f 63 6b 71  ->pOut, "<blockq
6d80: 75 6f 74 65 3e 22 2c 20 2d 31 29 3b 0a 20 20 20  uote>", -1);.   
6d90: 20 20 20 20 20 20 20 70 2d 3e 77 61 6e 74 41 75         p->wantAu
6da0: 74 6f 50 61 72 61 67 72 61 70 68 20 3d 20 30 3b  toParagraph = 0;
6db0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 69  .          p->wi
6dc0: 6b 69 4c 69 73 74 20 3d 20 4d 41 52 4b 55 50 5f  kiList = MARKUP_
6dd0: 42 4c 4f 43 4b 51 55 4f 54 45 3b 0a 20 20 20 20  BLOCKQUOTE;.    
6de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
6df0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6e00: 20 20 20 63 61 73 65 20 54 4f 4b 45 4e 5f 43 48     case TOKEN_CH
6e10: 41 52 41 43 54 45 52 3a 20 7b 0a 20 20 20 20 20  ARACTER: {.     
6e20: 20 20 20 73 74 61 72 74 41 75 74 6f 50 61 72 61     startAutoPara
6e30: 67 72 61 70 68 28 70 29 3b 0a 20 20 20 20 20 20  graph(p);.      
6e40: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3c 27 20    if( z[0]=='<' 
6e50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  ){.          blo
6e60: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
6e70: 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a 20 20  , "&lt;", 4);.  
6e80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6e90: 7a 5b 30 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[0]=='&' ){.   
6ea0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
6eb0: 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 26 61 6d  nd(p->pOut, "&am
6ec0: 70 3b 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 20  p;", 5);.       
6ed0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
6ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6ef0: 63 61 73 65 20 54 4f 4b 45 4e 5f 4c 49 4e 4b 3a  case TOKEN_LINK:
6f00: 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20   {.        char 
6f10: 2a 7a 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20  *zTarget;.      
6f20: 20 20 63 68 61 72 20 2a 7a 44 69 73 70 6c 61 79    char *zDisplay
6f30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
6f40: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 20 20  t i, j;.        
6f50: 69 6e 74 20 73 61 76 65 64 53 74 61 74 65 3b 0a  int savedState;.
6f60: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6b 3b 0a          int ok;.
6f70: 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75 74          startAut
6f80: 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20  oParagraph(p);. 
6f90: 20 20 20 20 20 20 20 7a 54 61 72 67 65 74 20 3d         zTarget =
6fa0: 20 26 7a 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20   &z[1];.        
6fb0: 66 6f 72 28 69 3d 31 3b 20 7a 5b 69 5d 20 26 26  for(i=1; z[i] &&
6fc0: 20 7a 5b 69 5d 21 3d 27 5d 27 3b 20 69 2b 2b 29   z[i]!=']'; i++)
6fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6fe0: 7a 5b 69 5d 3d 3d 27 7c 27 20 26 26 20 7a 44 69  z[i]=='|' && zDi
6ff0: 73 70 6c 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20  splay==0 ){.    
7000: 20 20 20 20 20 20 20 20 7a 44 69 73 70 6c 61 79          zDisplay
7010: 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20   = &z[i+1];.    
7020: 20 20 20 20 20 20 20 20 7a 5b 69 5d 20 3d 20 30          z[i] = 0
7030: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
7040: 72 28 6a 3d 69 2d 31 3b 20 6a 3e 30 20 26 26 20  r(j=i-1; j>0 && 
7050: 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a  isspace(z[j]); j
7060: 2d 2d 29 7b 20 7a 5b 6a 5d 20 3d 20 30 3b 20 7d  --){ z[j] = 0; }
7070: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7090: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [i] = 0;.       
70a0: 20 69 66 28 20 7a 44 69 73 70 6c 61 79 3d 3d 30   if( zDisplay==0
70b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 44   ){.          zD
70c0: 69 73 70 6c 61 79 20 3d 20 7a 54 61 72 67 65 74  isplay = zTarget
70d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
70e0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
70f0: 28 20 69 73 73 70 61 63 65 28 2a 7a 44 69 73 70  ( isspace(*zDisp
7100: 6c 61 79 29 20 29 20 7a 44 69 73 70 6c 61 79 2b  lay) ) zDisplay+
7110: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
7120: 20 20 20 20 20 6f 6b 20 3d 20 6f 6b 54 6f 48 79       ok = okToHy
7130: 70 65 72 6c 69 6e 6b 28 7a 54 61 72 67 65 74 29  perlink(zTarget)
7140: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 6b  ;.        if( ok
7150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c   ){.          bl
7160: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
7170: 74 2c 20 22 3c 61 20 68 72 65 66 3d 5c 22 22 2c  t, "<a href=\"",
7180: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
7190: 72 65 73 6f 6c 76 65 48 79 70 65 72 6c 69 6e 6b  resolveHyperlink
71a0: 28 7a 54 61 72 67 65 74 2c 20 70 29 3b 0a 20 20  (zTarget, p);.  
71b0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
71c0: 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20 22 5c 22  end(p->pOut, "\"
71d0: 3e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  >", -1);.       
71e0: 20 7d 0a 20 20 20 20 20 20 20 20 73 61 76 65 64   }.        saved
71f0: 53 74 61 74 65 20 3d 20 70 2d 3e 73 74 61 74 65  State = p->state
7200: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61  ;.        p->sta
7210: 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b  te &= ~ALLOW_WIK
7220: 49 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 74  I;.        p->st
7230: 61 74 65 20 7c 3d 20 46 4f 4e 54 5f 4d 41 52 4b  ate |= FONT_MARK
7240: 55 50 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  UP_ONLY;.       
7250: 20 77 69 6b 69 5f 72 65 6e 64 65 72 28 70 2c 20   wiki_render(p, 
7260: 7a 44 69 73 70 6c 61 79 29 3b 0a 20 20 20 20 20  zDisplay);.     
7270: 20 20 20 70 2d 3e 73 74 61 74 65 20 3d 20 73 61     p->state = sa
7280: 76 65 64 53 74 61 74 65 3b 0a 20 20 20 20 20 20  vedState;.      
7290: 20 20 69 66 28 20 6f 6b 20 29 20 62 6c 6f 62 5f    if( ok ) blob_
72a0: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
72b0: 22 3c 2f 61 3e 22 2c 20 34 29 3b 0a 20 20 20 20  "</a>", 4);.    
72c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
72d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4f   }.      case TO
72e0: 4b 45 4e 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20  KEN_TEXT: {.    
72f0: 20 20 20 20 73 74 61 72 74 41 75 74 6f 50 61 72      startAutoPar
7300: 61 67 72 61 70 68 28 70 29 3b 0a 20 20 20 20 20  agraph(p);.     
7310: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
7320: 2d 3e 70 4f 75 74 2c 20 7a 2c 20 6e 29 3b 0a 20  ->pOut, z, n);. 
7330: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7340: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
7350: 20 54 4f 4b 45 4e 5f 4d 41 52 4b 55 50 3a 20 7b   TOKEN_MARKUP: {
7360: 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 4d 61  .        parseMa
7370: 72 6b 75 70 28 26 6d 61 72 6b 75 70 2c 20 7a 29  rkup(&markup, z)
7380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
7390: 3e 69 6e 56 65 72 62 61 74 69 6d 20 29 7b 0a 20  >inVerbatim ){. 
73a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6e 64           if( end
73b0: 56 65 72 62 61 74 69 6d 28 70 2c 20 26 6d 61 72  Verbatim(p, &mar
73c0: 6b 75 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  kup) ){.        
73d0: 20 20 20 20 70 2d 3e 69 6e 56 65 72 62 61 74 69      p->inVerbati
73e0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  m = 0;.         
73f0: 20 20 20 70 2d 3e 73 74 61 74 65 20 3d 20 70 2d     p->state = p-
7400: 3e 70 72 65 56 65 72 62 53 74 61 74 65 3b 0a 20  >preVerbState;. 
7410: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f             blob_
7420: 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74 2c 20  append(p->pOut, 
7430: 22 3c 2f 70 72 65 3e 22 2c 20 36 29 3b 0a 20 20  "</pre>", 6);.  
7440: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7450: 20 20 20 20 20 20 20 20 20 20 20 75 6e 70 61 72             unpar
7460: 73 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b 75 70  seMarkup(&markup
7470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
7480: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f  lob_append(p->pO
7490: 75 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a  ut, "&lt;", 4);.
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
74b0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
74c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
74d0: 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 3d 3d 4d   markup.iCode==M
74e0: 41 52 4b 55 50 5f 49 4e 56 41 4c 49 44 20 29 7b  ARKUP_INVALID ){
74f0: 0a 20 20 20 20 20 20 20 20 20 20 75 6e 70 61 72  .          unpar
7500: 73 65 4d 61 72 6b 75 70 28 26 6d 61 72 6b 75 70  seMarkup(&markup
7510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  );.          sta
7520: 72 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 28  rtAutoParagraph(
7530: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c  p);.          bl
7540: 6f 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75  ob_append(p->pOu
7550: 74 2c 20 22 26 6c 74 3b 22 2c 20 34 29 3b 0a 20  t, "&lt;", 4);. 
7560: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a           n = 1;.
7570: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7580: 28 20 28 6d 61 72 6b 75 70 2e 69 54 79 70 65 26  ( (markup.iType&
7590: 4d 55 54 59 50 45 5f 46 4f 4e 54 29 3d 3d 30 0a  MUTYPE_FONT)==0.
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 26 26 20 28 70 2d 3e 73 74 61 74 65      && (p->state
75c0: 20 26 20 46 4f 4e 54 5f 4d 41 52 4b 55 50 5f 4f   & FONT_MARKUP_O
75d0: 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
75e0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
75f0: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  ng */.        }e
7600: 6c 73 65 20 69 66 28 20 69 6e 6c 69 6e 65 4f 6e  lse if( inlineOn
7610: 6c 79 20 26 26 20 28 6d 61 72 6b 75 70 2e 69 54  ly && (markup.iT
7620: 79 70 65 26 4d 55 54 59 50 45 5f 49 4e 4c 49 4e  ype&MUTYPE_INLIN
7630: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
7640: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
7650: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
7660: 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 43 6f  e if( markup.iCo
7670: 64 65 3d 3d 4d 41 52 4b 55 50 5f 4e 4f 57 49 4b  de==MARKUP_NOWIK
7680: 49 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  I ){.          i
7690: 66 28 20 6d 61 72 6b 75 70 2e 65 6e 64 54 61 67  f( markup.endTag
76a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
76b0: 70 2d 3e 73 74 61 74 65 20 7c 3d 20 41 4c 4c 4f  p->state |= ALLO
76c0: 57 5f 57 49 4b 49 3b 0a 20 20 20 20 20 20 20 20  W_WIKI;.        
76d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
76e0: 20 20 20 20 20 70 2d 3e 73 74 61 74 65 20 26 3d       p->state &=
76f0: 20 7e 41 4c 4c 4f 57 5f 57 49 4b 49 3b 0a 20 20   ~ALLOW_WIKI;.  
7700: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7710: 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 61 72 6b    }else if( mark
7720: 75 70 2e 65 6e 64 54 61 67 20 29 7b 0a 20 20 20  up.endTag ){.   
7730: 20 20 20 20 20 20 20 70 6f 70 53 74 61 63 6b 54         popStackT
7740: 6f 54 61 67 28 70 2c 20 6d 61 72 6b 75 70 2e 69  oTag(p, markup.i
7750: 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Code);.        }
7760: 65 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e  else if( markup.
7770: 69 43 6f 64 65 3d 3d 4d 41 52 4b 55 50 5f 56 45  iCode==MARKUP_VE
7780: 52 42 41 54 49 4d 20 29 7b 0a 20 20 20 20 20 20  RBATIM ){.      
7790: 20 20 20 20 69 66 28 20 6d 61 72 6b 75 70 2e 6e      if( markup.n
77a0: 41 74 74 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Attr==1 ){.     
77b0: 20 20 20 20 20 20 20 70 2d 3e 7a 56 65 72 62 61         p->zVerba
77c0: 74 69 6d 49 64 20 3d 20 6d 61 72 6b 75 70 2e 61  timId = markup.a
77d0: 41 74 74 72 5b 30 5d 2e 7a 56 61 6c 75 65 3b 0a  Attr[0].zValue;.
77e0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
77f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
7800: 7a 56 65 72 62 61 74 69 6d 49 64 20 3d 20 30 3b  zVerbatimId = 0;
7810: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7820: 20 20 20 20 20 20 20 70 2d 3e 69 6e 56 65 72 62         p->inVerb
7830: 61 74 69 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  atim = 1;.      
7840: 20 20 20 20 70 2d 3e 70 72 65 56 65 72 62 53 74      p->preVerbSt
7850: 61 74 65 20 3d 20 70 2d 3e 73 74 61 74 65 3b 0a  ate = p->state;.
7860: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 74 61            p->sta
7870: 74 65 20 26 3d 20 7e 41 4c 4c 4f 57 5f 57 49 4b  te &= ~ALLOW_WIK
7880: 49 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  I;.          blo
7890: 62 5f 61 70 70 65 6e 64 28 70 2d 3e 70 4f 75 74  b_append(p->pOut
78a0: 2c 20 22 3c 70 72 65 20 63 6c 61 73 73 3d 27 76  , "<pre class='v
78b0: 65 72 62 61 74 69 6d 27 3e 22 2c 2d 31 29 3b 0a  erbatim'>",-1);.
78c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 61 6e            p->wan
78d0: 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 20 3d  tAutoParagraph =
78e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
78f0: 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69 54 79  e if( markup.iTy
7900: 70 65 3d 3d 4d 55 54 59 50 45 5f 4c 49 20 29 7b  pe==MUTYPE_LI ){
7910: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
7920: 61 63 6b 75 70 54 6f 54 79 70 65 28 70 2c 20 4d  ackupToType(p, M
7930: 55 54 59 50 45 5f 4c 49 53 54 29 3d 3d 30 20 29  UTYPE_LIST)==0 )
7940: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
7950: 73 68 53 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55  shStack(p, MARKU
7960: 50 5f 55 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  P_UL);.         
7970: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
7980: 2d 3e 70 4f 75 74 2c 20 22 3c 75 6c 3e 22 2c 20  ->pOut, "<ul>", 
7990: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
79a0: 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53 74            pushSt
79b0: 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 4c 49  ack(p, MARKUP_LI
79c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6e  );.          ren
79d0: 64 65 72 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75  derMarkup(p->pOu
79e0: 74 2c 20 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20  t, &markup);.   
79f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
7a00: 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54  arkup.iType==MUT
7a10: 59 50 45 5f 54 52 20 29 7b 0a 20 20 20 20 20 20  YPE_TR ){.      
7a20: 20 20 20 20 69 66 28 20 62 61 63 6b 75 70 54 6f      if( backupTo
7a30: 54 79 70 65 28 70 2c 20 4d 55 54 59 50 45 5f 54  Type(p, MUTYPE_T
7a40: 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ABLE) ){.       
7a50: 20 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70       pushStack(p
7a60: 2c 20 4d 41 52 4b 55 50 5f 54 52 29 3b 0a 20 20  , MARKUP_TR);.  
7a70: 20 20 20 20 20 20 20 20 20 20 72 65 6e 64 65 72            render
7a80: 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20  Markup(p->pOut, 
7a90: 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20  &markup);.      
7aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
7ab0: 6c 73 65 20 69 66 28 20 6d 61 72 6b 75 70 2e 69  lse if( markup.i
7ac0: 54 79 70 65 3d 3d 4d 55 54 59 50 45 5f 54 44 20  Type==MUTYPE_TD 
7ad0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
7ae0: 20 62 61 63 6b 75 70 54 6f 54 79 70 65 28 70 2c   backupToType(p,
7af0: 20 4d 55 54 59 50 45 5f 54 41 42 4c 45 7c 4d 55   MUTYPE_TABLE|MU
7b00: 54 59 50 45 5f 54 52 29 20 29 7b 0a 20 20 20 20  TYPE_TR) ){.    
7b10: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 61 63          if( stac
7b20: 6b 54 6f 70 54 79 70 65 28 70 29 3d 3d 4d 55 54  kTopType(p)==MUT
7b30: 59 50 45 5f 54 41 42 4c 45 20 29 7b 0a 20 20 20  YPE_TABLE ){.   
7b40: 20 20 20 20 20 20 20 20 20 20 20 70 75 73 68 53             pushS
7b50: 74 61 63 6b 28 70 2c 20 4d 41 52 4b 55 50 5f 54  tack(p, MARKUP_T
7b60: 52 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  R);.            
7b70: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 2d    blob_append(p-
7b80: 3e 70 4f 75 74 2c 20 22 3c 74 72 3e 22 2c 20 34  >pOut, "<tr>", 4
7b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 73  .            pus
7bb0: 68 53 74 61 63 6b 28 70 2c 20 6d 61 72 6b 75 70  hStack(p, markup
7bc0: 2e 69 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  .iCode);.       
7bd0: 20 20 20 20 20 72 65 6e 64 65 72 4d 61 72 6b 75       renderMarku
7be0: 70 28 70 2d 3e 70 4f 75 74 2c 20 26 6d 61 72 6b  p(p->pOut, &mark
7bf0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  up);.          }
7c00: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
7c10: 66 28 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d  f( markup.iType=
7c20: 3d 4d 55 54 59 50 45 5f 48 59 50 45 52 4c 49 4e  =MUTYPE_HYPERLIN
7c30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
7c40: 6f 70 53 74 61 63 6b 54 6f 54 61 67 28 70 2c 20  opStackToTag(p, 
7c50: 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20  markup.iCode);. 
7c60: 20 20 20 20 20 20 20 20 20 73 74 61 72 74 41 75           startAu
7c70: 74 6f 50 61 72 61 67 72 61 70 68 28 70 29 3b 0a  toParagraph(p);.
7c80: 20 20 20 20 20 20 20 20 20 20 72 65 6e 64 65 72            render
7c90: 4d 61 72 6b 75 70 28 70 2d 3e 70 4f 75 74 2c 20  Markup(p->pOut, 
7ca0: 26 6d 61 72 6b 75 70 29 3b 0a 20 20 20 20 20 20  &markup);.      
7cb0: 20 20 20 20 70 75 73 68 53 74 61 63 6b 28 70 2c      pushStack(p,
7cc0: 20 6d 61 72 6b 75 70 2e 69 43 6f 64 65 29 3b 0a   markup.iCode);.
7cd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7ce0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 72           if( mar
7cf0: 6b 75 70 2e 69 54 79 70 65 3d 3d 4d 55 54 59 50  kup.iType==MUTYP
7d00: 45 5f 46 4f 4e 54 20 29 7b 0a 20 20 20 20 20 20  E_FONT ){.      
7d10: 20 20 20 20 20 20 73 74 61 72 74 41 75 74 6f 50        startAutoP
7d20: 61 72 61 67 72 61 70 68 28 70 29 3b 0a 20 20 20  aragraph(p);.   
7d30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7d40: 20 6d 61 72 6b 75 70 2e 69 54 79 70 65 3d 3d 4d   markup.iType==M
7d50: 55 54 59 50 45 5f 42 4c 4f 43 4b 20 29 7b 0a 20  UTYPE_BLOCK ){. 
7d60: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 77 61             p->wa
7d70: 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 20  ntAutoParagraph 
7d80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
7d90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
7da0: 6d 61 72 6b 75 70 2e 69 54 79 70 65 20 26 20 4d  markup.iType & M
7db0: 55 54 59 50 45 5f 53 54 41 43 4b 20 29 21 3d 30  UTYPE_STACK )!=0
7dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7dd0: 70 75 73 68 53 74 61 63 6b 28 70 2c 20 6d 61 72  pushStack(p, mar
7de0: 6b 75 70 2e 69 43 6f 64 65 29 3b 0a 20 20 20 20  kup.iCode);.    
7df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7e00: 20 20 72 65 6e 64 65 72 4d 61 72 6b 75 70 28 70    renderMarkup(p
7e10: 2d 3e 70 4f 75 74 2c 20 26 6d 61 72 6b 75 70 29  ->pOut, &markup)
7e20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7e40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b   }.    }.    z +
7e50: 3d 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = n;.  }.}.../*.
7e60: 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68 65  ** Transform the
7e70: 20 74 65 78 74 20 69 6e 20 74 68 65 20 70 49 6e   text in the pIn
7e80: 20 62 6c 6f 62 2e 20 20 57 72 69 74 65 20 74 68   blob.  Write th
7e90: 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
7ea0: 6f 20 74 68 65 20 70 4f 75 74 20 62 6c 6f 62 2e  o the pOut blob.
7eb0: 20 20 54 68 65 20 70 4f 75 74 20 62 6c 6f 62 20    The pOut blob 
7ec0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
7ed0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64  e.** initialized
7ee0: 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 69 73  .  The output is
7ef0: 20 6d 65 72 65 6c 79 20 61 70 70 65 6e 64 65 64   merely appended
7f00: 20 74 6f 20 70 4f 75 74 2e 0a 2a 2a 20 49 66 20   to pOut..** If 
7f10: 70 4f 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  pOut is NULL, th
7f20: 65 6e 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  en the output is
7f30: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
7f40: 20 43 47 49 0a 2a 2a 20 72 65 70 6c 79 2e 0a 2a   CGI.** reply..*
7f50: 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 63 6f 6e 76  /.void wiki_conv
7f60: 65 72 74 28 42 6c 6f 62 20 2a 70 49 6e 2c 20 42  ert(Blob *pIn, B
7f70: 6c 6f 62 20 2a 70 4f 75 74 2c 20 69 6e 74 20 66  lob *pOut, int f
7f80: 6c 61 67 73 29 7b 0a 20 20 63 68 61 72 20 2a 7a  lags){.  char *z
7f90: 3b 0a 20 20 52 65 6e 64 65 72 65 72 20 72 65 6e  ;.  Renderer ren
7fa0: 64 65 72 65 72 3b 0a 20 20 0a 20 20 6d 65 6d 73  derer;.  .  mems
7fb0: 65 74 28 26 72 65 6e 64 65 72 65 72 2c 20 30 2c  et(&renderer, 0,
7fc0: 20 73 69 7a 65 6f 66 28 72 65 6e 64 65 72 65 72   sizeof(renderer
7fd0: 29 29 3b 0a 20 20 72 65 6e 64 65 72 65 72 2e 73  ));.  renderer.s
7fe0: 74 61 74 65 20 3d 20 41 4c 4c 4f 57 5f 57 49 4b  tate = ALLOW_WIK
7ff0: 49 7c 41 54 5f 4e 45 57 4c 49 4e 45 7c 41 54 5f  I|AT_NEWLINE|AT_
8000: 50 41 52 41 47 52 41 50 48 3b 0a 20 20 69 66 28  PARAGRAPH;.  if(
8010: 20 66 6c 61 67 73 20 26 20 57 49 4b 49 5f 4e 4f   flags & WIKI_NO
8020: 42 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 6e  BLOCK ){.    ren
8030: 64 65 72 65 72 2e 73 74 61 74 65 20 7c 3d 20 49  derer.state |= I
8040: 4e 4c 49 4e 45 5f 4d 41 52 4b 55 50 5f 4f 4e 4c  NLINE_MARKUP_ONL
8050: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  Y;.  }.  if( fla
8060: 67 73 20 26 20 57 49 4b 49 5f 49 4e 4c 49 4e 45  gs & WIKI_INLINE
8070: 20 29 7b 0a 20 20 20 20 72 65 6e 64 65 72 65 72   ){.    renderer
8080: 2e 77 61 6e 74 41 75 74 6f 50 61 72 61 67 72 61  .wantAutoParagra
8090: 70 68 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ph = 0;.  }else{
80a0: 0a 20 20 20 20 72 65 6e 64 65 72 65 72 2e 77 61  .    renderer.wa
80b0: 6e 74 41 75 74 6f 50 61 72 61 67 72 61 70 68 20  ntAutoParagraph 
80c0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
80d0: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 6e 64 65  Out ){.    rende
80e0: 72 65 72 2e 70 4f 75 74 20 3d 20 70 4f 75 74 3b  rer.pOut = pOut;
80f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
8100: 6e 64 65 72 65 72 2e 70 4f 75 74 20 3d 20 63 67  nderer.pOut = cg
8110: 69 5f 6f 75 74 70 75 74 5f 62 6c 6f 62 28 29 3b  i_output_blob();
8120: 0a 20 20 7d 0a 0a 20 20 7a 20 3d 20 62 6c 6f 62  .  }..  z = blob
8130: 5f 73 74 72 28 70 49 6e 29 3b 0a 20 20 77 69 6b  _str(pIn);.  wik
8140: 69 5f 72 65 6e 64 65 72 28 26 72 65 6e 64 65 72  i_render(&render
8150: 65 72 2c 20 7a 29 3b 0a 20 20 65 6e 64 41 75 74  er, z);.  endAut
8160: 6f 50 61 72 61 67 72 61 70 68 28 26 72 65 6e 64  oParagraph(&rend
8170: 65 72 65 72 29 3b 0a 20 20 77 68 69 6c 65 28 20  erer);.  while( 
8180: 72 65 6e 64 65 72 65 72 2e 6e 53 74 61 63 6b 20  renderer.nStack 
8190: 29 7b 0a 20 20 20 20 70 6f 70 53 74 61 63 6b 28  ){.    popStack(
81a0: 26 72 65 6e 64 65 72 65 72 29 3b 0a 20 20 7d 0a  &renderer);.  }.
81b0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 72 65    blob_append(re
81c0: 6e 64 65 72 65 72 2e 70 4f 75 74 2c 20 22 5c 6e  nderer.pOut, "\n
81d0: 22 2c 20 31 29 3b 0a 20 20 66 72 65 65 28 72 65  ", 1);.  free(re
81e0: 6e 64 65 72 65 72 2e 61 53 74 61 63 6b 29 3b 0a  nderer.aStack);.
81f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
8200: 3a 20 74 65 73 74 2d 77 69 6b 69 2d 72 65 6e 64  : test-wiki-rend
8210: 65 72 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f  er.*/.void test_
8220: 77 69 6b 69 5f 72 65 6e 64 65 72 28 76 6f 69 64  wiki_render(void
8230: 29 7b 0a 20 20 42 6c 6f 62 20 69 6e 2c 20 6f 75  ){.  Blob in, ou
8240: 74 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21  t;.  if( g.argc!
8250: 3d 33 20 29 20 75 73 61 67 65 28 22 46 49 4c 45  =3 ) usage("FILE
8260: 22 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ");.  blob_zero(
8270: 26 6f 75 74 29 3b 0a 20 20 62 6c 6f 62 5f 72 65  &out);.  blob_re
8280: 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 69 6e  ad_from_file(&in
8290: 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20  , g.argv[2]);.  
82a0: 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 69 6e  wiki_convert(&in
82b0: 2c 20 26 6f 75 74 2c 20 30 29 3b 0a 20 20 62 6c  , &out, 0);.  bl
82c0: 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c 65  ob_write_to_file
82d0: 28 26 6f 75 74 2c 20 22 2d 22 29 3b 0a 7d 0a     (&out, "-");.}.