Hex Artifact Content
Not logged in

Artifact 8bd2fe1f5820aa6043d5841e5434e6bceeb03bac:

File src/wikiformat.c part of check-in [ebb2765954] - Add the timeline display preferences page with the ability to turn on and off block markup in timeline comments and to limit the length of timeline comments. by drh on 2007-12-04 02:47:49. Also file src/wikiformat.c part of check-in [d0305b305a] - Merged mainline into my branch to get the newest application. by aku on 2007-12-05 08:07:46.

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