Hex Artifact Content
Not logged in

Artifact 26fbd5a93fe121fe86a68fb5a4d99f67c7aad45a:

File src/wiki.c part of check-in [e01aa8cb4b] - Enhance the wiki rendering to support <div> markup. The closing </div> tag with and id= attribute can close off <verbatim> and <nowiki>. The wiki append page uses this to prevent unclosed tags from messing up the rendering of subsequent comments. by drh on 2008-07-17 15:49:24.

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 20 43 6f 70 79  ard Hipp.** Copy
0030: 72 69 67 68 74 20 28 63 29 20 32 30 30 38 20 53  right (c) 2008 S
0040: 74 65 70 68 61 6e 20 42 65 61 6c 0a 2a 2a 0a 2a  tephan Beal.**.*
0050: 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69  * This program i
0060: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 3b  s free software;
0070: 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72   you can redistr
0080: 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a  ibute it and/or.
0090: 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 64  ** modify it und
00a0: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
00b0: 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20  the GNU General 
00c0: 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73  Public.** Licens
00d0: 65 20 76 65 72 73 69 6f 6e 20 32 20 61 73 20 70  e version 2 as p
00e0: 75 62 6c 69 73 68 65 64 20 62 79 20 74 68 65 20  ublished by the 
00f0: 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f  Free Software Fo
0100: 75 6e 64 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  undation..**.** 
0110: 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20  This program is 
0120: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 74  distributed in t
0130: 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74 20  he hope that it 
0140: 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a  will be useful,.
0150: 2a 2a 20 62 75 74 20 57 49 54 48 4f 55 54 20 41  ** but WITHOUT A
0160: 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74  NY WARRANTY; wit
0170: 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d  hout even the im
0180: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f  plied warranty o
0190: 66 0a 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49  f.** MERCHANTABI
01a0: 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20  LITY or FITNESS 
01b0: 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52  FOR A PARTICULAR
01c0: 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74   PURPOSE.  See t
01d0: 68 65 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61  he GNU.** Genera
01e0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65  l Public License
01f0: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
0200: 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68  s..** .** You sh
0210: 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 69 76  ould have receiv
0220: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
0230: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
0240: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61  lic.** License a
0250: 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c  long with this l
0260: 69 62 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20  ibrary; if not, 
0270: 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20  write to the.** 
0280: 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f  Free Software Fo
0290: 75 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20  undation, Inc., 
02a0: 35 39 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20  59 Temple Place 
02b0: 2d 20 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20  - Suite 330,.** 
02c0: 42 6f 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31  Boston, MA  0211
02d0: 31 2d 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a  1-1307, USA..**.
02e0: 2a 2a 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63  ** Author contac
02f0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a  t information:.*
0300: 2a 20 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f  *   drh@hwaci.co
0310: 6d 0a 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77  m.**   http://ww
0320: 77 2e 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f  w.hwaci.com/drh/
0330: 0a 2a 2a 0a 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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0390: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
03a0: 65 20 74 6f 20 64 6f 20 66 6f 72 6d 61 74 74 69  e to do formatti
03b0: 6e 67 20 6f 66 20 77 69 6b 69 20 74 65 78 74 2e  ng of wiki text.
03c0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .*/.#include <as
03d0: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
03e0: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c   <ctype.h>.#incl
03f0: 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23  ude "config.h".#
0400: 69 6e 63 6c 75 64 65 20 22 77 69 6b 69 2e 68 22  include "wiki.h"
0410: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0420: 72 75 65 20 69 66 20 74 68 65 20 69 6e 70 75 74  rue if the input
0430: 20 73 74 72 69 6e 67 20 69 73 20 61 20 77 65 6c   string is a wel
0440: 6c 2d 66 6f 72 6d 65 64 20 77 69 6b 69 20 70 61  l-formed wiki pa
0450: 67 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 57  ge name..**.** W
0460: 65 6c 6c 2d 66 6f 72 6d 65 64 20 77 69 6b 69 20  ell-formed wiki 
0470: 70 61 67 65 20 6e 61 6d 65 73 20 64 6f 20 6e 6f  page names do no
0480: 74 20 62 65 67 69 6e 20 6f 72 20 65 6e 64 20 77  t begin or end w
0490: 69 74 68 20 77 68 69 74 65 73 70 61 63 65 2c 0a  ith whitespace,.
04a0: 2a 2a 20 61 6e 64 20 64 6f 20 6e 6f 74 20 63 6f  ** and do not co
04b0: 6e 74 61 69 6e 20 74 61 62 73 20 6f 72 20 6f 74  ntain tabs or ot
04c0: 68 65 72 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72  her control char
04d0: 61 63 74 65 72 73 20 61 6e 64 20 64 6f 20 6e 6f  acters and do no
04e0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  t.** contain mor
04f0: 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20  e than a single 
0500: 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20  space character 
0510: 69 6e 20 61 20 72 6f 77 2e 20 20 57 65 6c 6c 2d  in a row.  Well-
0520: 66 6f 72 6d 65 64 0a 2a 2a 20 6e 61 6d 65 73 20  formed.** names 
0530: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
0540: 33 20 61 6e 64 20 31 30 30 20 63 68 72 61 63 74  3 and 100 chract
0550: 65 72 73 20 69 6e 20 6c 65 6e 67 74 68 2c 20 69  ers in length, i
0560: 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 69 6e 74  nclusive..*/.int
0570: 20 77 69 6b 69 5f 6e 61 6d 65 5f 69 73 5f 77 65   wiki_name_is_we
0580: 6c 6c 66 6f 72 6d 65 64 28 63 6f 6e 73 74 20 63  llformed(const c
0590: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
05a0: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3c 3d 30 78  ;.  if( z[0]<=0x
05b0: 32 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  20 ){.    return
05c0: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
05d0: 31 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  1; z[i]; i++){. 
05e0: 20 20 20 69 66 28 20 7a 5b 69 5d 3c 30 78 32 30     if( z[i]<0x20
05f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
0600: 20 69 66 28 20 7a 5b 69 5d 3d 3d 30 78 32 30 20   if( z[i]==0x20 
0610: 26 26 20 7a 5b 69 2d 31 5d 3d 3d 30 78 32 30 20  && z[i-1]==0x20 
0620: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0630: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 3d 3d 27 20    if( z[i-1]==' 
0640: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
0650: 69 66 28 20 69 3c 33 20 7c 7c 20 69 3e 31 30 30  if( i<3 || i>100
0660: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
0670: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
0680: 2a 20 43 68 65 63 6b 20 61 20 77 69 6b 69 20 6e  * Check a wiki n
0690: 61 6d 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ame.  If it is n
06a0: 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20  ot well-formed, 
06b0: 74 68 65 6e 20 69 73 73 75 65 20 61 6e 20 65 72  then issue an er
06c0: 72 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ror.** and retur
06d0: 6e 20 74 72 75 65 2e 20 20 49 66 20 69 74 20 69  n true.  If it i
06e0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20 72  s well-formed, r
06f0: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
0700: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
0710: 5f 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  _name(const char
0720: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 21 77 69 6b   *z){.  if( !wik
0730: 69 5f 6e 61 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f  i_name_is_wellfo
0740: 72 6d 65 64 28 7a 29 20 29 7b 0a 20 20 20 20 73  rmed(z) ){.    s
0750: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 57 69 6b  tyle_header("Wik
0760: 69 20 50 61 67 65 20 4e 61 6d 65 20 45 72 72 6f  i Page Name Erro
0770: 72 22 29 3b 0a 20 20 20 20 40 20 54 68 65 20 77  r");.    @ The w
0780: 69 6b 69 20 6e 61 6d 65 20 22 3c 62 3e 25 68 28  iki name "<b>%h(
0790: 7a 29 3c 2f 62 3e 22 20 69 73 20 6e 6f 74 20 77  z)</b>" is not w
07a0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 52 75 6c  ell-formed.  Rul
07b0: 65 73 20 66 6f 72 0a 20 20 20 20 40 20 77 69 6b  es for.    @ wik
07c0: 69 20 70 61 67 65 20 6e 61 6d 65 73 3a 0a 20 20  i page names:.  
07d0: 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 40 20 3c    @ <ul>.    @ <
07e0: 6c 69 3e 20 4d 75 73 74 20 6e 6f 74 20 62 65 67  li> Must not beg
07f0: 69 6e 20 6f 72 20 65 6e 64 20 77 69 74 68 20 61  in or end with a
0800: 20 73 70 61 63 65 2e 0a 20 20 20 20 40 20 3c 6c   space..    @ <l
0810: 69 3e 20 4d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  i> Must not cont
0820: 61 69 6e 20 61 6e 79 20 63 6f 6e 74 72 6f 6c 20  ain any control 
0830: 63 68 61 72 61 63 74 65 72 73 2c 20 69 6e 63 6c  characters, incl
0840: 75 64 69 6e 67 20 74 61 62 20 6f 72 0a 20 20 20  uding tab or.   
0850: 20 40 20 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e   @      newline.
0860: 0a 20 20 20 20 40 20 3c 6c 69 3e 20 4d 75 73 74  .    @ <li> Must
0870: 20 6e 6f 74 20 68 61 76 65 20 74 77 6f 20 6f 72   not have two or
0880: 20 6d 6f 72 65 20 73 70 61 63 65 73 20 69 6e 20   more spaces in 
0890: 61 20 72 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79  a row internally
08a0: 2e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 4d 75 73  ..    @ <li> Mus
08b0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 33 20 61  t be between 3 a
08c0: 6e 64 20 31 30 30 20 63 68 61 72 61 63 74 65 72  nd 100 character
08d0: 73 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 20 20 20  s in length..   
08e0: 20 40 20 3c 2f 75 6c 3e 0a 20 20 20 20 73 74 79   @ </ul>.    sty
08f0: 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20  le_footer();.   
0900: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
0910: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
0920: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 68 6f 6d  .** WEBPAGE: hom
0930: 65 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 69 6e  e.** WEBPAGE: in
0940: 64 65 78 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  dex.** WEBPAGE: 
0950: 6e 6f 74 5f 66 6f 75 6e 64 0a 2a 2f 0a 76 6f 69  not_found.*/.voi
0960: 64 20 68 6f 6d 65 5f 70 61 67 65 28 76 6f 69 64  d home_page(void
0970: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 61 67 65  ){.  char *zPage
0980: 4e 61 6d 65 20 3d 20 64 62 5f 67 65 74 28 22 70  Name = db_get("p
0990: 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 30 29 3b  roject-name",0);
09a0: 0a 20 20 69 66 28 20 7a 50 61 67 65 4e 61 6d 65  .  if( zPageName
09b0: 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 63 68   ){.    login_ch
09c0: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
09d0: 29 3b 0a 20 20 20 20 67 2e 7a 45 78 74 72 61 20  );.    g.zExtra 
09e0: 3d 20 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 20  = zPageName;.   
09f0: 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74   cgi_set_paramet
0a00: 65 72 5f 6e 6f 63 6f 70 79 28 22 6e 61 6d 65 22  er_nocopy("name"
0a10: 2c 20 67 2e 7a 45 78 74 72 61 29 3b 0a 20 20 20  , g.zExtra);.   
0a20: 20 67 2e 6f 6b 52 64 57 69 6b 69 20 3d 20 31 3b   g.okRdWiki = 1;
0a30: 0a 20 20 20 20 67 2e 6f 6b 41 70 6e 64 57 69 6b  .    g.okApndWik
0a40: 69 20 3d 20 30 3b 0a 20 20 20 20 67 2e 6f 6b 57  i = 0;.    g.okW
0a50: 72 57 69 6b 69 20 3d 20 30 3b 0a 20 20 20 20 67  rWiki = 0;.    g
0a60: 2e 6f 6b 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a  .okHistory = 0;.
0a70: 20 20 20 20 77 69 6b 69 5f 70 61 67 65 28 29 3b      wiki_page();
0a80: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
0a90: 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
0aa0: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
0ab0: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 48 6f  style_header("Ho
0ac0: 6d 65 22 29 3b 0a 20 20 40 20 3c 70 3e 54 68 69  me");.  @ <p>Thi
0ad0: 73 20 69 73 20 61 20 73 74 75 62 20 68 6f 6d 65  s is a stub home
0ae0: 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 70 72  -page for the pr
0af0: 6f 6a 65 63 74 2e 0a 20 20 40 20 54 6f 20 66 69  oject..  @ To fi
0b00: 6c 6c 20 69 6e 20 74 68 69 73 20 70 61 67 65 2c  ll in this page,
0b10: 20 66 69 72 73 74 20 67 6f 20 74 6f 0a 20 20 40   first go to.  @
0b20: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
0b30: 42 61 73 65 55 52 4c 29 2f 73 65 74 75 70 5f 63  BaseURL)/setup_c
0b40: 6f 6e 66 69 67 22 3e 73 65 74 75 70 2f 63 6f 6e  onfig">setup/con
0b50: 66 69 67 3c 2f 61 3e 0a 20 20 40 20 61 6e 64 20  fig</a>.  @ and 
0b60: 65 73 74 61 62 6c 69 73 68 20 61 20 22 50 72 6f  establish a "Pro
0b70: 6a 65 63 74 20 4e 61 6d 65 22 2e 20 20 54 68 65  ject Name".  The
0b80: 6e 20 63 72 65 61 74 65 20 61 0a 20 20 40 20 77  n create a.  @ w
0b90: 69 6b 69 20 70 61 67 65 20 77 69 74 68 20 74 68  iki page with th
0ba0: 61 74 20 6e 61 6d 65 2e 20 20 54 68 65 20 63 6f  at name.  The co
0bb0: 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 77 69  ntent of that wi
0bc0: 6b 69 20 70 61 67 65 0a 20 20 40 20 77 69 6c 6c  ki page.  @ will
0bd0: 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e   be displayed in
0be0: 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 20 6d   place of this m
0bf0: 65 73 73 61 67 65 2e 0a 20 20 73 74 79 6c 65 5f  essage..  style_
0c00: 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a  footer();.}../*.
0c10: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
0c20: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
0c30: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
0c40: 20 6f 66 20 74 68 65 20 73 61 6e 64 62 6f 78 0a   of the sandbox.
0c50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
0c60: 5f 73 61 6e 64 62 6f 78 28 63 6f 6e 73 74 20 63  _sandbox(const c
0c70: 68 61 72 20 2a 7a 50 61 67 65 6e 61 6d 65 29 7b  har *zPagename){
0c80: 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 61 73  .  return strcas
0c90: 65 63 6d 70 28 7a 50 61 67 65 6e 61 6d 65 2c 22  ecmp(zPagename,"
0ca0: 73 61 6e 64 62 6f 78 22 29 3d 3d 30 20 7c 7c 0a  sandbox")==0 ||.
0cb0: 20 20 20 20 20 20 20 20 20 73 74 72 63 61 73 65           strcase
0cc0: 63 6d 70 28 7a 50 61 67 65 6e 61 6d 65 2c 22 73  cmp(zPagename,"s
0cd0: 61 6e 64 20 62 6f 78 22 29 3d 3d 30 3b 0a 7d 0a  and box")==0;.}.
0ce0: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
0cf0: 77 69 6b 69 0a 2a 2a 20 55 52 4c 3a 20 2f 77 69  wiki.** URL: /wi
0d00: 6b 69 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d 45  ki?name=PAGENAME
0d10: 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 70 61  .*/.void wiki_pa
0d20: 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72  ge(void){.  char
0d30: 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74 20 72 69   *zTag;.  int ri
0d40: 64 3b 0a 20 20 69 6e 74 20 69 73 53 61 6e 64 62  d;.  int isSandb
0d50: 6f 78 3b 0a 20 20 42 6c 6f 62 20 77 69 6b 69 3b  ox;.  Blob wiki;
0d60: 0a 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20  .  Manifest m;. 
0d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
0d80: 67 65 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a  geName;.  char *
0d90: 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 3b 0a 20  zHtmlPageName;. 
0da0: 20 63 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20 6d   char *zBody = m
0db0: 70 72 69 6e 74 66 28 22 25 73 22 2c 22 3c 69 3e  printf("%s","<i>
0dc0: 45 6d 70 74 79 20 50 61 67 65 3c 2f 69 3e 22 29  Empty Page</i>")
0dd0: 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  ;..  login_check
0de0: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
0df0: 20 20 69 66 28 20 21 67 2e 6f 6b 52 64 57 69 6b    if( !g.okRdWik
0e00: 69 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  i ){ login_neede
0e10: 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  d(); return; }. 
0e20: 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20 50 28 22   zPageName = P("
0e30: 6e 61 6d 65 22 29 3b 0a 20 20 69 66 28 20 7a 50  name");.  if( zP
0e40: 61 67 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ageName==0 ){.  
0e50: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
0e60: 57 69 6b 69 22 29 3b 0a 20 20 20 20 40 20 3c 75  Wiki");.    @ <u
0e70: 6c 3e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 3c 61  l>.    @ <li> <a
0e80: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73   href="%s(g.zBas
0e90: 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 79  eURL)/timeline?y
0ea0: 3d 77 22 3e 52 65 63 65 6e 74 20 63 68 61 6e 67  =w">Recent chang
0eb0: 65 73 3c 2f 61 3e 20 74 6f 20 77 69 6b 69 0a 20  es</a> to wiki. 
0ec0: 20 20 20 40 20 20 20 20 20 20 70 61 67 65 73 2e     @      pages.
0ed0: 20 3c 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 6c 69   </li>.    @ <li
0ee0: 3e 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  > <a href="%s(g.
0ef0: 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b 69 5f 72  zBaseURL)/wiki_r
0f00: 75 6c 65 73 22 3e 46 6f 72 6d 61 74 74 69 6e 67  ules">Formatting
0f10: 20 72 75 6c 65 73 3c 2f 61 3e 20 66 6f 72 20 0a   rules</a> for .
0f20: 20 20 20 20 40 20 20 20 20 20 20 77 69 6b 69 2e      @      wiki.
0f30: 3c 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 6c 69 3e  </li>.    @ <li>
0f40: 20 55 73 65 20 74 68 65 20 3c 61 20 68 72 65 66   Use the <a href
0f50: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
0f60: 2f 77 69 6b 69 3f 6e 61 6d 65 3d 53 61 6e 64 62  /wiki?name=Sandb
0f70: 6f 78 22 3e 53 61 6e 64 62 6f 78 3c 2f 61 3e 0a  ox">Sandbox</a>.
0f80: 20 20 20 20 40 20 20 20 20 20 20 74 6f 20 65 78      @      to ex
0f90: 70 65 72 69 6d 65 6e 74 2e 3c 2f 6c 69 3e 0a 20  periment.</li>. 
0fa0: 20 20 20 40 20 3c 6c 69 3e 20 3c 61 20 68 72 65     @ <li> <a hre
0fb0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
0fc0: 29 2f 77 63 6f 6e 74 65 6e 74 22 3e 4c 69 73 74  )/wcontent">List
0fd0: 20 6f 66 20 41 6c 6c 20 57 69 6b 69 20 50 61 67   of All Wiki Pag
0fe0: 65 73 3c 2f 61 3e 0a 20 20 20 20 40 20 20 20 20  es</a>.    @    
0ff0: 20 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74    available on t
1000: 68 69 73 20 73 65 72 76 65 72 2e 3c 2f 6c 69 3e  his server.</li>
1010: 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 20  .    @ </ul>.   
1020: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
1030: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1040: 0a 20 20 69 66 28 20 63 68 65 63 6b 5f 6e 61 6d  .  if( check_nam
1050: 65 28 7a 50 61 67 65 4e 61 6d 65 29 20 29 20 72  e(zPageName) ) r
1060: 65 74 75 72 6e 3b 0a 20 20 69 73 53 61 6e 64 62  eturn;.  isSandb
1070: 6f 78 20 3d 20 69 73 5f 73 61 6e 64 62 6f 78 28  ox = is_sandbox(
1080: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66  zPageName);.  if
1090: 28 20 69 73 53 61 6e 64 62 6f 78 20 29 7b 0a 20  ( isSandbox ){. 
10a0: 20 20 20 7a 42 6f 64 79 20 3d 20 64 62 5f 67 65     zBody = db_ge
10b0: 74 28 22 73 61 6e 64 62 6f 78 22 2c 7a 42 6f 64  t("sandbox",zBod
10c0: 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
10d0: 20 7a 54 61 67 20 3d 20 6d 70 72 69 6e 74 66 28   zTag = mprintf(
10e0: 22 77 69 6b 69 2d 25 73 22 2c 20 7a 50 61 67 65  "wiki-%s", zPage
10f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 69 64 20 3d  Name);.    rid =
1100: 20 64 62 5f 69 6e 74 28 30 2c 20 0a 20 20 20 20   db_int(0, .    
1110: 20 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52    "SELECT rid FR
1120: 4f 4d 20 74 61 67 78 72 65 66 22 0a 20 20 20 20  OM tagxref".    
1130: 20 20 22 20 57 48 45 52 45 20 74 61 67 69 64 3d    " WHERE tagid=
1140: 28 53 45 4c 45 43 54 20 74 61 67 69 64 20 46 52  (SELECT tagid FR
1150: 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74 61 67  OM tag WHERE tag
1160: 6e 61 6d 65 3d 25 51 29 22 0a 20 20 20 20 20 20  name=%Q)".      
1170: 22 20 4f 52 44 45 52 20 42 59 20 6d 74 69 6d 65  " ORDER BY mtime
1180: 20 44 45 53 43 22 2c 20 7a 54 61 67 0a 20 20 20   DESC", zTag.   
1190: 20 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 61   );.    free(zTa
11a0: 67 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  g);.    memset(&
11b0: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
11c0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ;.    blob_zero(
11d0: 26 6d 2e 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  &m.content);.   
11e0: 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20   if( rid ){.    
11f0: 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a    Blob content;.
1200: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65        content_ge
1210: 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29  t(rid, &content)
1220: 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66 65 73 74  ;.      manifest
1230: 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e 74  _parse(&m, &cont
1240: 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
1250: 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 57  m.type==CFTYPE_W
1260: 49 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IKI ){.        z
1270: 42 6f 64 79 20 3d 20 6d 2e 7a 57 69 6b 69 3b 0a  Body = m.zWiki;.
1280: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1290: 7d 0a 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f  }.  if( isSandbo
12a0: 78 20 7c 7c 20 28 72 69 64 20 26 26 20 67 2e 6f  x || (rid && g.o
12b0: 6b 57 72 57 69 6b 69 29 20 7c 7c 20 28 21 72 69  kWrWiki) || (!ri
12c0: 64 20 26 26 20 67 2e 6f 6b 4e 65 77 57 69 6b 69  d && g.okNewWiki
12d0: 29 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73  ) ){.    style_s
12e0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
12f0: 45 64 69 74 22 2c 20 22 45 64 69 74 20 57 69 6b  Edit", "Edit Wik
1300: 69 20 50 61 67 65 22 2c 20 22 25 73 2f 77 69 6b  i Page", "%s/wik
1310: 69 65 64 69 74 3f 6e 61 6d 65 3d 25 54 22 2c 0a  iedit?name=%T",.
1320: 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c           g.zTop,
1330: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d   zPageName);.  }
1340: 0a 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f 78  .  if( isSandbox
1350: 20 7c 7c 20 28 72 69 64 20 26 26 20 67 2e 6f 6b   || (rid && g.ok
1360: 41 70 6e 64 57 69 6b 69 29 20 29 7b 0a 20 20 20  ApndWiki) ){.   
1370: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
1380: 6c 65 6d 65 6e 74 28 22 41 70 70 65 6e 64 22 2c  lement("Append",
1390: 20 22 41 64 64 20 41 20 43 6f 6d 6d 65 6e 74 22   "Add A Comment"
13a0: 2c 20 22 25 73 2f 77 69 6b 69 61 70 70 65 6e 64  , "%s/wikiappend
13b0: 3f 6e 61 6d 65 3d 25 54 22 2c 0a 20 20 20 20 20  ?name=%T",.     
13c0: 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 50 61 67      g.zTop, zPag
13d0: 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  eName);.  }.  if
13e0: 28 20 21 69 73 53 61 6e 64 62 6f 78 20 26 26 20  ( !isSandbox && 
13f0: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
1400: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
1410: 5f 65 6c 65 6d 65 6e 74 28 22 48 69 73 74 6f 72  _element("Histor
1420: 79 22 2c 20 22 48 69 73 74 6f 72 79 22 2c 20 22  y", "History", "
1430: 25 73 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d 65  %s/whistory?name
1440: 3d 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 67  =%T",.         g
1450: 2e 7a 54 6f 70 2c 20 7a 50 61 67 65 4e 61 6d 65  .zTop, zPageName
1460: 29 3b 0a 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61  );.  }.  zHtmlPa
1470: 67 65 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66  geName = mprintf
1480: 28 22 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65  ("%h", zPageName
1490: 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  );.  style_heade
14a0: 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 29  r(zHtmlPageName)
14b0: 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 77  ;.  blob_init(&w
14c0: 69 6b 69 2c 20 7a 42 6f 64 79 2c 20 2d 31 29 3b  iki, zBody, -1);
14d0: 0a 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28  .  wiki_convert(
14e0: 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20  &wiki, 0, 0);.  
14f0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69  blob_reset(&wiki
1500: 29 3b 0a 20 20 69 66 28 20 21 69 73 53 61 6e 64  );.  if( !isSand
1510: 62 6f 78 20 29 7b 0a 20 20 20 20 6d 61 6e 69 66  box ){.    manif
1520: 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20  est_clear(&m);. 
1530: 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65   }.  style_foote
1540: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  r();.}../*.** WE
1550: 42 50 41 47 45 3a 20 77 69 6b 69 65 64 69 74 0a  BPAGE: wikiedit.
1560: 2a 2a 20 55 52 4c 3a 20 2f 77 69 6b 69 65 64 69  ** URL: /wikiedi
1570: 74 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d 45 0a  t?name=PAGENAME.
1580: 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 65 64 69 74  */.void wikiedit
1590: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63  _page(void){.  c
15a0: 68 61 72 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74  har *zTag;.  int
15b0: 20 72 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20   rid = 0;.  int 
15c0: 69 73 53 61 6e 64 62 6f 78 3b 0a 20 20 42 6c 6f  isSandbox;.  Blo
15d0: 62 20 77 69 6b 69 3b 0a 20 20 4d 61 6e 69 66 65  b wiki;.  Manife
15e0: 73 74 20 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  st m;.  const ch
15f0: 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20  ar *zPageName;. 
1600: 20 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65   char *zHtmlPage
1610: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
1620: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1630: 20 20 63 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20    char *zBody = 
1640: 28 63 68 61 72 2a 29 50 28 22 77 22 29 3b 0a 0a  (char*)P("w");..
1650: 20 20 69 66 28 20 7a 42 6f 64 79 20 29 7b 0a 20    if( zBody ){. 
1660: 20 20 20 7a 42 6f 64 79 20 3d 20 6d 70 72 69 6e     zBody = mprin
1670: 74 66 28 22 25 73 22 2c 20 7a 42 6f 64 79 29 3b  tf("%s", zBody);
1680: 0a 20 20 7d 0a 20 20 6c 6f 67 69 6e 5f 63 68 65  .  }.  login_che
1690: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
16a0: 3b 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20  ;.  zPageName = 
16b0: 50 44 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a 20  PD("name","");. 
16c0: 20 69 66 28 20 63 68 65 63 6b 5f 6e 61 6d 65 28   if( check_name(
16d0: 7a 50 61 67 65 4e 61 6d 65 29 20 29 20 72 65 74  zPageName) ) ret
16e0: 75 72 6e 3b 0a 20 20 69 73 53 61 6e 64 62 6f 78  urn;.  isSandbox
16f0: 20 3d 20 69 73 5f 73 61 6e 64 62 6f 78 28 7a 50   = is_sandbox(zP
1700: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ageName);.  if( 
1710: 69 73 53 61 6e 64 62 6f 78 20 29 7b 0a 20 20 20  isSandbox ){.   
1720: 20 69 66 28 20 7a 42 6f 64 79 3d 3d 30 20 29 7b   if( zBody==0 ){
1730: 0a 20 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 64  .      zBody = d
1740: 62 5f 67 65 74 28 22 73 61 6e 64 62 6f 78 22 2c  b_get("sandbox",
1750: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
1760: 73 65 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d  se{.    zTag = m
1770: 70 72 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22  printf("wiki-%s"
1780: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  , zPageName);.  
1790: 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30    rid = db_int(0
17a0: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
17b0: 20 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65   rid FROM tagxre
17c0: 66 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  f".      " WHERE
17d0: 20 74 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74   tagid=(SELECT t
17e0: 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48  agid FROM tag WH
17f0: 45 52 45 20 74 61 67 6e 61 6d 65 3d 25 51 29 22  ERE tagname=%Q)"
1800: 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  .      " ORDER B
1810: 59 20 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a  Y mtime DESC", z
1820: 54 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66  Tag.    );.    f
1830: 72 65 65 28 7a 54 61 67 29 3b 0a 20 20 20 20 69  ree(zTag);.    i
1840: 66 28 20 28 72 69 64 20 26 26 20 21 67 2e 6f 6b  f( (rid && !g.ok
1850: 57 72 57 69 6b 69 29 20 7c 7c 20 28 21 72 69 64  WrWiki) || (!rid
1860: 20 26 26 20 21 67 2e 6f 6b 4e 65 77 57 69 6b 69   && !g.okNewWiki
1870: 29 20 29 7b 0a 20 20 20 20 20 20 6c 6f 67 69 6e  ) ){.      login
1880: 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 20 20 20  _needed();.     
1890: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
18a0: 20 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c     memset(&m, 0,
18b0: 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 20   sizeof(m));.   
18c0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 2e 63 6f   blob_zero(&m.co
18d0: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
18e0: 72 69 64 20 26 26 20 7a 42 6f 64 79 3d 3d 30 20  rid && zBody==0 
18f0: 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 63 6f  ){.      Blob co
1900: 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 63 6f 6e  ntent;.      con
1910: 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63  tent_get(rid, &c
1920: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d  ontent);.      m
1930: 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d  anifest_parse(&m
1940: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  , &content);.   
1950: 20 20 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43     if( m.type==C
1960: 46 54 59 50 45 5f 57 49 4b 49 20 29 7b 0a 20 20  FTYPE_WIKI ){.  
1970: 20 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d 2e        zBody = m.
1980: 7a 57 69 6b 69 3b 0a 20 20 20 20 20 20 7d 0a 20  zWiki;.      }. 
1990: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 50     }.  }.  if( P
19a0: 28 22 73 75 62 6d 69 74 22 29 21 3d 30 20 26 26  ("submit")!=0 &&
19b0: 20 7a 42 6f 64 79 21 3d 30 20 29 7b 0a 20 20 20   zBody!=0 ){.   
19c0: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20   char *zDate;.  
19d0: 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20    Blob cksum;.  
19e0: 20 20 69 6e 74 20 6e 72 69 64 3b 0a 20 20 20 20    int nrid;.    
19f0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b 69 29  blob_zero(&wiki)
1a00: 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74  ;.    db_begin_t
1a10: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
1a20: 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f 78 20    if( isSandbox 
1a30: 29 7b 0a 20 20 20 20 20 20 64 62 5f 73 65 74 28  ){.      db_set(
1a40: 22 73 61 6e 64 62 6f 78 22 2c 7a 42 6f 64 79 2c  "sandbox",zBody,
1a50: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1a60: 20 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62 5f       zDate = db_
1a70: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
1a80: 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 22  datetime('now')"
1a90: 29 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 5b 31  );.      zDate[1
1aa0: 30 5d 20 3d 20 27 54 27 3b 0a 20 20 20 20 20 20  0] = 'T';.      
1ab0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
1ac0: 6b 69 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44  ki, "D %s\n", zD
1ad0: 61 74 65 29 3b 0a 20 20 20 20 20 20 66 72 65 65  ate);.      free
1ae0: 28 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20 62  (zDate);.      b
1af0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b  lob_appendf(&wik
1b00: 69 2c 20 22 4c 20 25 46 5c 6e 22 2c 20 7a 50 61  i, "L %F\n", zPa
1b10: 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  geName);.      i
1b20: 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20 20 20  f( rid ){.      
1b30: 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20    char *zUuid = 
1b40: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
1b50: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
1b60: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
1b70: 20 72 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62   rid);.        b
1b80: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b  lob_appendf(&wik
1b90: 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a 55 75  i, "P %s\n", zUu
1ba0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  id);.        fre
1bb0: 65 28 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20  e(zUuid);.      
1bc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 67 2e 7a 4c  }.      if( g.zL
1bd0: 6f 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ogin ){.        
1be0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
1bf0: 6b 69 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e  ki, "U %F\n", g.
1c00: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20 20 7d  zLogin);.      }
1c10: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
1c20: 6e 64 66 28 26 77 69 6b 69 2c 20 22 57 20 25 64  ndf(&wiki, "W %d
1c30: 5c 6e 25 73 5c 6e 22 2c 20 73 74 72 6c 65 6e 28  \n%s\n", strlen(
1c40: 7a 42 6f 64 79 29 2c 20 7a 42 6f 64 79 29 3b 0a  zBody), zBody);.
1c50: 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c 6f        md5sum_blo
1c60: 62 28 26 77 69 6b 69 2c 20 26 63 6b 73 75 6d 29  b(&wiki, &cksum)
1c70: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
1c80: 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 5a 20 25  endf(&wiki, "Z %
1c90: 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  b\n", &cksum);. 
1ca0: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
1cb0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 6e  &cksum);.      n
1cc0: 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75  rid = content_pu
1cd0: 74 28 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a  t(&wiki, 0, 0);.
1ce0: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
1cf0: 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49  xec("INSERT OR I
1d00: 47 4e 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e  GNORE INTO unsen
1d10: 74 20 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e  t VALUES(%d)", n
1d20: 72 69 64 29 3b 0a 20 20 20 20 20 20 6d 61 6e 69  rid);.      mani
1d30: 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e  fest_crosslink(n
1d40: 72 69 64 2c 20 26 77 69 6b 69 29 3b 0a 20 20 20  rid, &wiki);.   
1d50: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77     blob_reset(&w
1d60: 69 6b 69 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  iki);.      cont
1d70: 65 6e 74 5f 64 65 6c 74 69 66 79 28 72 69 64 2c  ent_deltify(rid,
1d80: 20 6e 72 69 64 2c 20 30 29 3b 0a 20 20 20 20 7d   nrid, 0);.    }
1d90: 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e  .    db_end_tran
1da0: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20  saction(0);.    
1db0: 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 77  cgi_redirectf("w
1dc0: 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50  iki?name=%T", zP
1dd0: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ageName);.  }.  
1de0: 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 21  if( P("cancel")!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65  =0 ){.    cgi_re
1e00: 64 69 72 65 63 74 66 28 22 77 69 6b 69 3f 6e 61  directf("wiki?na
1e10: 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65 4e 61 6d  me=%T", zPageNam
1e20: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
1e30: 20 20 7d 0a 20 20 69 66 28 20 7a 42 6f 64 79 3d    }.  if( zBody=
1e40: 3d 30 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20  =0 ){.    zBody 
1e50: 3d 20 6d 70 72 69 6e 74 66 28 22 3c 69 3e 45 6d  = mprintf("<i>Em
1e60: 70 74 79 20 50 61 67 65 3c 2f 69 3e 22 29 3b 0a  pty Page</i>");.
1e70: 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61 67 65 4e    }.  zHtmlPageN
1e80: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 45  ame = mprintf("E
1e90: 64 69 74 3a 20 25 68 22 2c 20 7a 50 61 67 65 4e  dit: %h", zPageN
1ea0: 61 6d 65 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65  ame);.  style_he
1eb0: 61 64 65 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61  ader(zHtmlPageNa
1ec0: 6d 65 29 3b 0a 20 20 69 66 28 20 50 28 22 70 72  me);.  if( P("pr
1ed0: 65 76 69 65 77 22 29 21 3d 30 20 29 7b 0a 20 20  eview")!=0 ){.  
1ee0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b    blob_zero(&wik
1ef0: 69 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  i);.    blob_app
1f00: 65 6e 64 28 26 77 69 6b 69 2c 20 7a 42 6f 64 79  end(&wiki, zBody
1f10: 2c 20 2d 31 29 3b 0a 20 20 20 20 40 20 50 72 65  , -1);.    @ Pre
1f20: 76 69 65 77 3a 3c 68 72 3e 0a 20 20 20 20 77 69  view:<hr>.    wi
1f30: 6b 69 5f 63 6f 6e 76 65 72 74 28 26 77 69 6b 69  ki_convert(&wiki
1f40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c  , 0, 0);.    @ <
1f50: 68 72 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  hr>.    blob_res
1f60: 65 74 28 26 77 69 6b 69 29 3b 0a 20 20 7d 0a 20  et(&wiki);.  }. 
1f70: 20 66 6f 72 28 6e 3d 32 2c 20 7a 3d 7a 42 6f 64   for(n=2, z=zBod
1f80: 79 3b 20 7a 5b 30 5d 3b 20 7a 2b 2b 29 7b 0a 20  y; z[0]; z++){. 
1f90: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 6e     if( z[0]=='\n
1fa0: 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ' ) n++;.  }.  i
1fb0: 66 28 20 6e 3c 32 30 20 29 20 6e 20 3d 20 32 30  f( n<20 ) n = 20
1fc0: 3b 0a 20 20 69 66 28 20 6e 3e 34 30 20 29 20 6e  ;.  if( n>40 ) n
1fd0: 20 3d 20 34 30 3b 0a 20 20 40 20 3c 66 6f 72 6d   = 40;.  @ <form
1fe0: 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 20 61   method="POST" a
1ff0: 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73  ction="%s(g.zBas
2000: 65 55 52 4c 29 2f 77 69 6b 69 65 64 69 74 22 3e  eURL)/wikiedit">
2010: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
2020: 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22  ="hidden" name="
2030: 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 68 28  name" value="%h(
2040: 7a 50 61 67 65 4e 61 6d 65 29 22 3e 0a 20 20 40  zPageName)">.  @
2050: 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d 65 3d   <textarea name=
2060: 22 77 22 20 63 6c 61 73 73 3d 22 77 69 6b 69 65  "w" class="wikie
2070: 64 69 74 22 20 63 6f 6c 73 3d 22 38 30 22 20 0a  dit" cols="80" .
2080: 20 20 40 20 20 72 6f 77 73 3d 22 25 64 28 6e 29    @  rows="%d(n)
2090: 22 20 77 72 61 70 3d 22 76 69 72 74 75 61 6c 22  " wrap="virtual"
20a0: 3e 25 68 28 7a 42 6f 64 79 29 3c 2f 74 65 78 74  >%h(zBody)</text
20b0: 61 72 65 61 3e 0a 20 20 40 20 3c 62 72 3e 0a 20  area>.  @ <br>. 
20c0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
20d0: 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 70 72  submit" name="pr
20e0: 65 76 69 65 77 22 20 76 61 6c 75 65 3d 22 50 72  eview" value="Pr
20f0: 65 76 69 65 77 20 59 6f 75 72 20 43 68 61 6e 67  eview Your Chang
2100: 65 73 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  es">.  @ <input 
2110: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61  type="submit" na
2120: 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c 75  me="submit" valu
2130: 65 3d 22 41 70 70 6c 79 20 54 68 65 73 65 20 43  e="Apply These C
2140: 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c 69 6e  hanges">.  @ <in
2150: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
2160: 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c 22 20  " name="cancel" 
2170: 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22 3e 0a  value="Cancel">.
2180: 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 69 66    @ </form>.  if
2190: 28 20 21 69 73 53 61 6e 64 62 6f 78 20 29 7b 0a  ( !isSandbox ){.
21a0: 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65      manifest_cle
21b0: 61 72 28 26 6d 29 3b 0a 20 20 7d 0a 20 20 73 74  ar(&m);.  }.  st
21c0: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a  yle_footer();.}.
21d0: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  ./*.** Append th
21e0: 65 20 77 69 6b 69 20 74 65 78 74 20 66 6f 72 20  e wiki text for 
21f0: 61 6e 20 72 65 6d 61 72 6b 20 74 6f 20 74 68 65  an remark to the
2200: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
2210: 6e 20 42 4c 4f 42 2e 0a 2a 2f 0a 73 74 61 74 69  n BLOB..*/.stati
2220: 63 20 76 6f 69 64 20 61 70 70 65 6e 64 52 65 6d  c void appendRem
2230: 61 72 6b 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20  ark(Blob *p){.  
2240: 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63  char *zDate;.  c
2250: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
2260: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2270: 7a 52 65 6d 61 72 6b 3b 0a 20 20 63 68 61 72 20  zRemark;.  char 
2280: 2a 7a 49 64 3b 0a 0a 20 20 7a 44 61 74 65 20 3d  *zId;..  zDate =
2290: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
22a0: 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f  ECT datetime('no
22b0: 77 27 29 22 29 3b 0a 20 20 7a 49 64 20 3d 20 64  w')");.  zId = d
22c0: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
22d0: 54 20 6c 6f 77 65 72 28 68 65 78 28 72 61 6e 64  T lower(hex(rand
22e0: 6f 6d 62 6c 6f 62 28 38 29 29 29 22 29 3b 0a 20  omblob(8)))");. 
22f0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2c   blob_appendf(p,
2300: 20 22 5c 6e 5c 6e 3c 68 72 3e 3c 64 69 76 20 69   "\n\n<hr><div i
2310: 64 3d 5c 22 25 73 5c 22 3e 3c 69 3e 4f 6e 20 25  d=\"%s\"><i>On %
2320: 73 20 55 54 43 20 25 68 22 2c 20 0a 20 20 20 20  s UTC %h", .    
2330: 7a 49 64 2c 20 7a 44 61 74 65 2c 20 67 2e 7a 4c  zId, zDate, g.zL
2340: 6f 67 69 6e 29 3b 0a 20 20 66 72 65 65 28 7a 44  ogin);.  free(zD
2350: 61 74 65 29 3b 0a 20 20 7a 55 73 65 72 20 3d 20  ate);.  zUser = 
2360: 50 44 28 22 75 22 2c 67 2e 7a 4c 6f 67 69 6e 29  PD("u",g.zLogin)
2370: 3b 0a 20 20 69 66 28 20 7a 55 73 65 72 5b 30 5d  ;.  if( zUser[0]
2380: 20 26 26 20 73 74 72 63 6d 70 28 7a 55 73 65 72   && strcmp(zUser
2390: 2c 67 2e 7a 4c 6f 67 69 6e 29 20 29 7b 0a 20 20  ,g.zLogin) ){.  
23a0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
23b0: 2c 20 22 20 28 63 6c 61 69 6d 69 6e 67 20 74 6f  , " (claiming to
23c0: 20 62 65 20 25 68 29 22 2c 20 7a 55 73 65 72 29   be %h)", zUser)
23d0: 3b 0a 20 20 7d 0a 20 20 7a 52 65 6d 61 72 6b 20  ;.  }.  zRemark 
23e0: 3d 20 50 44 28 22 72 22 2c 22 22 29 3b 0a 20 20  = PD("r","");.  
23f0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2c 20  blob_appendf(p, 
2400: 22 20 61 64 64 65 64 3a 3c 2f 69 3e 3c 62 72 20  " added:</i><br 
2410: 2f 3e 5c 6e 25 73 3c 2f 64 69 76 20 69 64 3d 5c  />\n%s</div id=\
2420: 22 25 73 5c 22 3e 22 2c 20 7a 52 65 6d 61 72 6b  "%s\">", zRemark
2430: 2c 20 7a 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , zId);.}../*.**
2440: 20 57 45 42 50 41 47 45 3a 20 77 69 6b 69 61 70   WEBPAGE: wikiap
2450: 70 65 6e 64 0a 2a 2a 20 55 52 4c 3a 20 2f 77 69  pend.** URL: /wi
2460: 6b 69 61 70 70 65 6e 64 3f 6e 61 6d 65 3d 50 41  kiappend?name=PA
2470: 47 45 4e 41 4d 45 0a 2a 2f 0a 76 6f 69 64 20 77  GENAME.*/.void w
2480: 69 6b 69 61 70 70 65 6e 64 5f 70 61 67 65 28 76  ikiappend_page(v
2490: 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54  oid){.  char *zT
24a0: 61 67 3b 0a 20 20 69 6e 74 20 72 69 64 20 3d 20  ag;.  int rid = 
24b0: 30 3b 0a 20 20 69 6e 74 20 69 73 53 61 6e 64 62  0;.  int isSandb
24c0: 6f 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ox;.  const char
24d0: 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 63   *zPageName;.  c
24e0: 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65 4e 61  har *zHtmlPageNa
24f0: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
2500: 20 2a 7a 55 73 65 72 3b 0a 0a 20 20 6c 6f 67 69   *zUser;..  logi
2510: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
2520: 61 6c 73 28 29 3b 0a 20 20 7a 50 61 67 65 4e 61  als();.  zPageNa
2530: 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22  me = PD("name","
2540: 22 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 5f  ");.  if( check_
2550: 6e 61 6d 65 28 7a 50 61 67 65 4e 61 6d 65 29 20  name(zPageName) 
2560: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 73 53 61  ) return;.  isSa
2570: 6e 64 62 6f 78 20 3d 20 69 73 5f 73 61 6e 64 62  ndbox = is_sandb
2580: 6f 78 28 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  ox(zPageName);. 
2590: 20 69 66 28 20 21 69 73 53 61 6e 64 62 6f 78 20   if( !isSandbox 
25a0: 29 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d 70  ){.    zTag = mp
25b0: 72 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22 2c  rintf("wiki-%s",
25c0: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20   zPageName);.   
25d0: 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c   rid = db_int(0,
25e0: 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
25f0: 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66  rid FROM tagxref
2600: 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20  ".      " WHERE 
2610: 74 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74 61  tagid=(SELECT ta
2620: 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48 45  gid FROM tag WHE
2630: 52 45 20 74 61 67 6e 61 6d 65 3d 25 51 29 22 0a  RE tagname=%Q)".
2640: 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
2650: 20 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 54   mtime DESC", zT
2660: 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 72  ag.    );.    fr
2670: 65 65 28 7a 54 61 67 29 3b 0a 20 20 20 20 69 66  ee(zTag);.    if
2680: 28 20 21 72 69 64 20 29 7b 0a 20 20 20 20 20 20  ( !rid ){.      
2690: 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f  fossil_redirect_
26a0: 68 6f 6d 65 28 29 3b 0a 20 20 20 20 20 20 72 65  home();.      re
26b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
26c0: 20 20 69 66 28 20 21 67 2e 6f 6b 41 70 6e 64 57    if( !g.okApndW
26d0: 69 6b 69 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e  iki ){.    login
26e0: 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 20 20 72  _needed();.    r
26f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
2700: 20 50 28 22 73 75 62 6d 69 74 22 29 21 3d 30 20   P("submit")!=0 
2710: 26 26 20 50 28 22 72 22 29 21 3d 30 20 26 26 20  && P("r")!=0 && 
2720: 50 28 22 75 22 29 21 3d 30 20 29 7b 0a 20 20 20  P("u")!=0 ){.   
2730: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20   char *zDate;.  
2740: 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20    Blob cksum;.  
2750: 20 20 69 6e 74 20 6e 72 69 64 3b 0a 20 20 20 20    int nrid;.    
2760: 42 6c 6f 62 20 62 6f 64 79 3b 0a 20 20 20 20 42  Blob body;.    B
2770: 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20  lob content;.   
2780: 20 42 6c 6f 62 20 77 69 6b 69 3b 0a 20 20 20 20   Blob wiki;.    
2790: 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 0a 20 20 20  Manifest m;..   
27a0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 62 6f 64 79   blob_zero(&body
27b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 53 61 6e  );.    if( isSan
27c0: 64 62 6f 78 20 29 7b 0a 20 20 20 20 20 20 62 6c  dbox ){.      bl
27d0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 62 6f 64 79  ob_appendf(&body
27e0: 2c 20 64 62 5f 67 65 74 28 22 73 61 6e 64 62 6f  , db_get("sandbo
27f0: 78 22 2c 22 22 29 29 3b 0a 20 20 20 20 20 20 61  x",""));.      a
2800: 70 70 65 6e 64 52 65 6d 61 72 6b 28 26 62 6f 64  ppendRemark(&bod
2810: 79 29 3b 0a 20 20 20 20 20 20 64 62 5f 73 65 74  y);.      db_set
2820: 28 22 73 61 6e 64 62 6f 78 22 2c 20 62 6c 6f 62  ("sandbox", blob
2830: 5f 73 74 72 28 26 62 6f 64 79 29 2c 20 30 29 3b  _str(&body), 0);
2840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2850: 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69    content_get(ri
2860: 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  d, &content);.  
2870: 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 70 61 72      manifest_par
2880: 73 65 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29  se(&m, &content)
2890: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 2e 74 79  ;.      if( m.ty
28a0: 70 65 3d 3d 43 46 54 59 50 45 5f 57 49 4b 49 20  pe==CFTYPE_WIKI 
28b0: 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  ){.        blob_
28c0: 61 70 70 65 6e 64 28 26 62 6f 64 79 2c 20 6d 2e  append(&body, m.
28d0: 7a 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20 20 20  zWiki, -1);.    
28e0: 20 20 7d 0a 20 20 20 20 20 20 6d 61 6e 69 66 65    }.      manife
28f0: 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20 20  st_clear(&m);.  
2900: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77      blob_zero(&w
2910: 69 6b 69 29 3b 0a 20 20 20 20 20 20 64 62 5f 62  iki);.      db_b
2920: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
2930: 28 29 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 20  ();.      zDate 
2940: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
2950: 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e  LECT datetime('n
2960: 6f 77 27 29 22 29 3b 0a 20 20 20 20 20 20 7a 44  ow')");.      zD
2970: 61 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20  ate[10] = 'T';. 
2980: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
2990: 66 28 26 77 69 6b 69 2c 20 22 44 20 25 73 5c 6e  f(&wiki, "D %s\n
29a0: 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20  ", zDate);.     
29b0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
29c0: 69 6b 69 2c 20 22 4c 20 25 46 5c 6e 22 2c 20 7a  iki, "L %F\n", z
29d0: 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20  PageName);.     
29e0: 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20   if( rid ){.    
29f0: 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20      char *zUuid 
2a00: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
2a10: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
2a20: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64  lob WHERE rid=%d
2a30: 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20 20  ", rid);.       
2a40: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
2a50: 69 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a  iki, "P %s\n", z
2a60: 55 75 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  Uuid);.        f
2a70: 72 65 65 28 7a 55 75 69 64 29 3b 0a 20 20 20 20  ree(zUuid);.    
2a80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 2e    }.      if( g.
2a90: 7a 4c 6f 67 69 6e 20 29 7b 0a 20 20 20 20 20 20  zLogin ){.      
2aa0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
2ab0: 77 69 6b 69 2c 20 22 55 20 25 46 5c 6e 22 2c 20  wiki, "U %F\n", 
2ac0: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20  g.zLogin);.     
2ad0: 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 52   }.      appendR
2ae0: 65 6d 61 72 6b 28 26 62 6f 64 79 29 3b 0a 20 20  emark(&body);.  
2af0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
2b00: 28 26 77 69 6b 69 2c 20 22 57 20 25 64 5c 6e 25  (&wiki, "W %d\n%
2b10: 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  s\n", blob_size(
2b20: 26 62 6f 64 79 29 2c 20 62 6c 6f 62 5f 73 74 72  &body), blob_str
2b30: 28 26 62 6f 64 79 29 29 3b 0a 20 20 20 20 20 20  (&body));.      
2b40: 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 77 69 6b  md5sum_blob(&wik
2b50: 69 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  i, &cksum);.    
2b60: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
2b70: 77 69 6b 69 2c 20 22 5a 20 25 62 5c 6e 22 2c 20  wiki, "Z %b\n", 
2b80: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 62  &cksum);.      b
2b90: 6c 6f 62 5f 72 65 73 65 74 28 26 63 6b 73 75 6d  lob_reset(&cksum
2ba0: 29 3b 0a 20 20 20 20 20 20 6e 72 69 64 20 3d 20  );.      nrid = 
2bb0: 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 77 69 6b  content_put(&wik
2bc0: 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  i, 0, 0);.      
2bd0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 49  db_multi_exec("I
2be0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
2bf0: 49 4e 54 4f 20 75 6e 73 65 6e 74 20 56 41 4c 55  INTO unsent VALU
2c00: 45 53 28 25 64 29 22 2c 20 6e 72 69 64 29 3b 0a  ES(%d)", nrid);.
2c10: 20 20 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63        manifest_c
2c20: 72 6f 73 73 6c 69 6e 6b 28 6e 72 69 64 2c 20 26  rosslink(nrid, &
2c30: 77 69 6b 69 29 3b 0a 20 20 20 20 20 20 62 6c 6f  wiki);.      blo
2c40: 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b 0a  b_reset(&wiki);.
2c50: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 5f 64 65        content_de
2c60: 6c 74 69 66 79 28 72 69 64 2c 20 6e 72 69 64 2c  ltify(rid, nrid,
2c70: 20 30 29 3b 0a 20 20 20 20 20 20 64 62 5f 65 6e   0);.      db_en
2c80: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29  d_transaction(0)
2c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 67 69 5f  ;.    }.    cgi_
2ca0: 72 65 64 69 72 65 63 74 66 28 22 77 69 6b 69 3f  redirectf("wiki?
2cb0: 6e 61 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65 4e  name=%T", zPageN
2cc0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
2cd0: 50 28 22 63 61 6e 63 65 6c 22 29 21 3d 30 20 29  P("cancel")!=0 )
2ce0: 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 65  {.    cgi_redire
2cf0: 63 74 66 28 22 77 69 6b 69 3f 6e 61 6d 65 3d 25  ctf("wiki?name=%
2d00: 54 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a  T", zPageName);.
2d10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2d20: 20 20 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 20    zHtmlPageName 
2d30: 3d 20 6d 70 72 69 6e 74 66 28 22 41 70 70 65 6e  = mprintf("Appen
2d40: 64 20 43 6f 6d 6d 65 6e 74 20 54 6f 3a 20 25 68  d Comment To: %h
2d50: 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  ", zPageName);. 
2d60: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 7a 48   style_header(zH
2d70: 74 6d 6c 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  tmlPageName);.  
2d80: 69 66 28 20 50 28 22 70 72 65 76 69 65 77 22 29  if( P("preview")
2d90: 21 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20  !=0 ){.    Blob 
2da0: 70 72 65 76 69 65 77 3b 0a 20 20 20 20 62 6c 6f  preview;.    blo
2db0: 62 5f 7a 65 72 6f 28 26 70 72 65 76 69 65 77 29  b_zero(&preview)
2dc0: 3b 0a 20 20 20 20 61 70 70 65 6e 64 52 65 6d 61  ;.    appendRema
2dd0: 72 6b 28 26 70 72 65 76 69 65 77 29 3b 0a 20 20  rk(&preview);.  
2de0: 20 20 40 20 50 72 65 76 69 65 77 3a 3c 68 72 3e    @ Preview:<hr>
2df0: 0a 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72  .    wiki_conver
2e00: 74 28 26 70 72 65 76 69 65 77 2c 20 30 2c 20 30  t(&preview, 0, 0
2e10: 29 3b 0a 20 20 20 20 40 20 3c 68 72 3e 0a 20 20  );.    @ <hr>.  
2e20: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 70 72    blob_reset(&pr
2e30: 65 76 69 65 77 29 3b 0a 20 20 7d 0a 20 20 7a 55  eview);.  }.  zU
2e40: 73 65 72 20 3d 20 50 44 28 22 75 22 2c 20 67 2e  ser = PD("u", g.
2e50: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 40 20 3c 66 6f  zLogin);.  @ <fo
2e60: 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22  rm method="POST"
2e70: 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42   action="%s(g.zB
2e80: 61 73 65 55 52 4c 29 2f 77 69 6b 69 61 70 70 65  aseURL)/wikiappe
2e90: 6e 64 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  nd">.  @ <input 
2ea0: 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61  type="hidden" na
2eb0: 6d 65 3d 22 6e 61 6d 65 22 20 76 61 6c 75 65 3d  me="name" value=
2ec0: 22 25 68 28 7a 50 61 67 65 4e 61 6d 65 29 22 3e  "%h(zPageName)">
2ed0: 0a 20 20 40 20 59 6f 75 72 20 4e 61 6d 65 3a 0a  .  @ Your Name:.
2ee0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
2ef0: 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 75 22 20  "text" name="u" 
2f00: 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75 65 3d  size="20" value=
2f10: 22 25 68 28 7a 55 73 65 72 29 22 3e 3c 62 72 3e  "%h(zUser)"><br>
2f20: 0a 20 20 40 20 43 6f 6d 6d 65 6e 74 20 74 6f 20  .  @ Comment to 
2f30: 61 70 70 65 6e 64 3a 3c 62 72 3e 0a 20 20 40 20  append:<br>.  @ 
2f40: 3c 74 65 78 74 61 72 65 61 20 6e 61 6d 65 3d 22  <textarea name="
2f50: 72 22 20 63 6c 61 73 73 3d 22 77 69 6b 69 65 64  r" class="wikied
2f60: 69 74 22 20 63 6f 6c 73 3d 22 38 30 22 20 0a 20  it" cols="80" . 
2f70: 20 40 20 20 72 6f 77 73 3d 22 31 30 22 20 77 72   @  rows="10" wr
2f80: 61 70 3d 22 76 69 72 74 75 61 6c 22 3e 25 68 28  ap="virtual">%h(
2f90: 50 44 28 22 72 22 2c 22 22 29 29 3c 2f 74 65 78  PD("r",""))</tex
2fa0: 74 61 72 65 61 3e 0a 20 20 40 20 3c 62 72 3e 0a  tarea>.  @ <br>.
2fb0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
2fc0: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 70  "submit" name="p
2fd0: 72 65 76 69 65 77 22 20 76 61 6c 75 65 3d 22 50  review" value="P
2fe0: 72 65 76 69 65 77 20 59 6f 75 72 20 43 6f 6d 6d  review Your Comm
2ff0: 65 6e 74 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74  ent">.  @ <input
3000: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e   type="submit" n
3010: 61 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c  ame="submit" val
3020: 75 65 3d 22 41 70 70 65 6e 64 20 59 6f 75 72 20  ue="Append Your 
3030: 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c 69  Changes">.  @ <i
3040: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
3050: 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c 22  t" name="cancel"
3060: 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22 3e   value="Cancel">
3070: 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73  .  @ </form>.  s
3080: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
3090: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
30a0: 20 77 68 69 73 74 6f 72 79 0a 2a 2a 20 55 52 4c   whistory.** URL
30b0: 3a 20 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d 65  : /whistory?name
30c0: 3d 50 41 47 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  =PAGENAME.**.** 
30d0: 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74  Show the complet
30e0: 65 20 63 68 61 6e 67 65 20 68 69 73 74 6f 72 79  e change history
30f0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 77 69   for a single wi
3100: 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ki page..*/.void
3110: 20 77 68 69 73 74 6f 72 79 5f 70 61 67 65 28 76   whistory_page(v
3120: 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a  oid){.  Stmt q;.
3130: 20 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a    char *zTitle;.
3140: 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b 0a 20 20    char *zSQL;.  
3150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 67  const char *zPag
3160: 65 4e 61 6d 65 3b 0a 20 20 6c 6f 67 69 6e 5f 63  eName;.  login_c
3170: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
3180: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 48  ();.  if( !g.okH
3190: 69 73 74 6f 72 79 20 29 7b 20 6c 6f 67 69 6e 5f  istory ){ login_
31a0: 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e  needed(); return
31b0: 3b 20 7d 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20  ; }.  zPageName 
31c0: 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22 22 29 3b  = PD("name","");
31d0: 0a 20 20 7a 54 69 74 6c 65 20 3d 20 6d 70 72 69  .  zTitle = mpri
31e0: 6e 74 66 28 22 48 69 73 74 6f 72 79 20 4f 66 20  ntf("History Of 
31f0: 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b  %h", zPageName);
3200: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
3210: 7a 54 69 74 6c 65 29 3b 0a 20 20 66 72 65 65 28  zTitle);.  free(
3220: 7a 54 69 74 6c 65 29 3b 0a 0a 20 20 7a 53 51 4c  zTitle);..  zSQL
3230: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 20 41   = mprintf("%s A
3240: 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20 49  ND event.objid I
3250: 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  N ".            
3260: 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20       "  (SELECT 
3270: 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66  rid FROM tagxref
3280: 20 57 48 45 52 45 20 74 61 67 69 64 3d 22 0a 20   WHERE tagid=". 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a0: 20 20 20 20 20 20 22 28 53 45 4c 45 43 54 20 74        "(SELECT t
32b0: 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48  agid FROM tag WH
32c0: 45 52 45 20 74 61 67 6e 61 6d 65 3d 27 77 69 6b  ERE tagname='wik
32d0: 69 2d 25 71 27 29 29 22 0a 20 20 20 20 20 20 20  i-%q'))".       
32e0: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
32f0: 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43 22 2c   BY mtime DESC",
3300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3310: 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79    timeline_query
3320: 5f 66 6f 72 5f 77 77 77 28 29 2c 20 7a 50 61 67  _for_www(), zPag
3330: 65 4e 61 6d 65 29 3b 0a 20 20 64 62 5f 70 72 65  eName);.  db_pre
3340: 70 61 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b 0a  pare(&q, zSQL);.
3350: 20 20 66 72 65 65 28 7a 53 51 4c 29 3b 0a 20 20    free(zSQL);.  
3360: 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69  www_print_timeli
3370: 6e 65 28 26 71 29 3b 0a 20 20 64 62 5f 66 69 6e  ne(&q);.  db_fin
3380: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 73 74 79  alize(&q);.  sty
3390: 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a  le_footer();.}..
33a0: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 77  /*.** WEBPAGE: w
33b0: 63 6f 6e 74 65 6e 74 0a 2a 2a 0a 2a 2a 20 4c 69  content.**.** Li
33c0: 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  st all available
33d0: 20 77 69 6b 69 20 70 61 67 65 73 20 77 69 74 68   wiki pages with
33e0: 20 64 61 74 65 20 63 72 65 61 74 65 64 20 61 6e   date created an
33f0: 64 20 6c 61 73 74 20 6d 6f 64 69 66 69 65 64 2e  d last modified.
3400: 0a 2a 2f 0a 76 6f 69 64 20 77 63 6f 6e 74 65 6e  .*/.void wconten
3410: 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  t_page(void){.  
3420: 53 74 6d 74 20 71 3b 0a 20 20 6c 6f 67 69 6e 5f  Stmt q;.  login_
3430: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
3440: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
3450: 52 64 57 69 6b 69 20 29 7b 20 6c 6f 67 69 6e 5f  RdWiki ){ login_
3460: 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e  needed(); return
3470: 3b 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64  ; }.  style_head
3480: 65 72 28 22 41 76 61 69 6c 61 62 6c 65 20 57 69  er("Available Wi
3490: 6b 69 20 50 61 67 65 73 22 29 3b 0a 20 20 40 20  ki Pages");.  @ 
34a0: 3c 75 6c 3e 0a 20 20 64 62 5f 70 72 65 70 61 72  <ul>.  db_prepar
34b0: 65 28 26 71 2c 20 0a 20 20 20 20 22 53 45 4c 45  e(&q, .    "SELE
34c0: 43 54 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d  CT substr(tagnam
34d0: 65 2c 20 36 2c 20 31 30 30 30 29 20 46 52 4f 4d  e, 6, 1000) FROM
34e0: 20 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61   tag WHERE tagna
34f0: 6d 65 20 47 4c 4f 42 20 27 77 69 6b 69 2d 2a 27  me GLOB 'wiki-*'
3500: 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59  ".    " ORDER BY
3510: 20 6c 6f 77 65 72 28 74 61 67 6e 61 6d 65 29 22   lower(tagname)"
3520: 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64  .  );.  while( d
3530: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
3540: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
3550: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
3560: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
3570: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c  (&q, 0);.    @ <
3580: 6c 69 3e 3c 61 20 68 72 65 66 3d 22 25 73 28 67  li><a href="%s(g
3590: 2e 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b 69 3f  .zBaseURL)/wiki?
35a0: 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e  name=%T(zName)">
35b0: 25 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 6c  %h(zName)</a></l
35c0: 69 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  i>.  }.  db_fina
35d0: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 40 20 3c 2f  lize(&q);.  @ </
35e0: 75 6c 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74  ul>.  style_foot
35f0: 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  er();.}../*.** W
3600: 45 42 50 41 47 45 3a 20 77 69 6b 69 5f 72 75 6c  EBPAGE: wiki_rul
3610: 65 73 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 72  es.*/.void wikir
3620: 75 6c 65 73 5f 70 61 67 65 28 76 6f 69 64 29 7b  ules_page(void){
3630: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
3640: 22 57 69 6b 69 20 46 6f 72 6d 61 74 74 69 6e 67  "Wiki Formatting
3650: 20 52 75 6c 65 73 22 29 3b 0a 20 20 40 20 3c 68   Rules");.  @ <h
3660: 32 3e 46 6f 72 6d 61 74 74 69 6e 67 20 52 75 6c  2>Formatting Rul
3670: 65 20 53 75 6d 6d 61 72 79 3c 2f 68 32 3e 0a 20  e Summary</h2>. 
3680: 20 40 20 3c 6f 6c 3e 0a 20 20 40 20 3c 6c 69 3e   @ <ol>.  @ <li>
3690: 20 42 6c 61 6e 6b 20 6c 69 6e 65 73 20 61 72 65   Blank lines are
36a0: 20 70 61 72 61 67 72 61 70 68 20 62 72 65 61 6b   paragraph break
36b0: 73 0a 20 20 40 20 3c 6c 69 3e 20 42 75 6c 6c 65  s.  @ <li> Bulle
36c0: 74 73 20 61 72 65 20 22 2a 22 20 73 75 72 72 6f  ts are "*" surro
36d0: 75 6e 64 65 64 20 62 79 20 74 77 6f 20 73 70 61  unded by two spa
36e0: 63 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ces at the begin
36f0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 69 6e 65  ning of the line
3700: 2e 0a 20 20 40 20 3c 6c 69 3e 20 45 6e 75 6d 65  ..  @ <li> Enume
3710: 72 61 74 69 6f 6e 20 69 74 65 6d 73 20 61 72 65  ration items are
3720: 20 61 20 6e 75 6d 62 65 72 20 73 75 72 72 6f 75   a number surrou
3730: 6e 64 65 64 20 62 79 20 74 77 6f 20 73 70 61 63  nded by two spac
3740: 65 0a 20 20 40 20 61 74 20 74 68 65 20 62 65 67  e.  @ at the beg
3750: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6c 69 6e 65  inning of a line
3760: 2e 0a 20 20 40 20 3c 6c 69 3e 20 49 6e 64 65 6e  ..  @ <li> Inden
3770: 74 65 64 20 70 61 72 67 72 61 70 68 73 20 62 65  ted pargraphs be
3780: 67 69 6e 20 77 69 74 68 20 61 20 74 61 62 20 6f  gin with a tab o
3790: 72 20 74 77 6f 20 73 70 61 63 65 73 2e 0a 20 20  r two spaces..  
37a0: 40 20 3c 6c 69 3e 20 48 79 70 65 72 6c 69 6e 6b  @ <li> Hyperlink
37b0: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
37c0: 77 69 74 68 20 73 71 75 61 72 65 20 62 72 61 63  with square brac
37d0: 6b 65 74 73 3a 20 20 22 5b 74 61 72 67 65 74 5d  kets:  "[target]
37e0: 22 0a 20 20 40 20 3c 6c 69 3e 20 4d 6f 73 74 20  ".  @ <li> Most 
37f0: 6f 72 64 69 6e 61 72 79 20 48 54 4d 4c 20 77 6f  ordinary HTML wo
3800: 72 6b 73 2e 0a 20 20 40 20 3c 6c 69 3e 20 26 6c  rks..  @ <li> &l
3810: 74 3b 76 65 72 62 61 74 69 6d 26 67 74 3b 20 61  t;verbatim&gt; a
3820: 6e 64 20 26 6c 74 3b 6e 6f 77 69 6b 69 26 67 74  nd &lt;nowiki&gt
3830: 3b 2e 0a 20 20 40 20 3c 2f 6f 6c 3e 0a 20 20 40  ;..  @ </ol>.  @
3840: 20 3c 70 3e 57 65 20 63 61 6c 6c 20 74 68 65 20   <p>We call the 
3850: 66 69 72 73 74 20 66 69 76 65 20 72 75 6c 65 73  first five rules
3860: 20 61 62 6f 76 65 20 22 77 69 6b 69 22 20 66 6f   above "wiki" fo
3870: 72 6d 61 74 74 69 6e 67 20 72 75 6c 65 73 2e 20  rmatting rules. 
3880: 20 54 68 65 0a 20 20 40 20 6c 61 73 74 20 74 77   The.  @ last tw
3890: 6f 20 72 75 6c 65 73 20 61 72 65 20 74 68 65 20  o rules are the 
38a0: 48 54 4d 4c 20 66 6f 72 6d 61 74 74 69 6e 67 20  HTML formatting 
38b0: 72 75 6c 65 2e 3c 2f 70 3e 0a 20 20 40 20 3c 68  rule.</p>.  @ <h
38c0: 32 3e 46 6f 72 6d 61 74 74 69 6e 67 20 52 75 6c  2>Formatting Rul
38d0: 65 20 44 65 74 61 69 6c 73 3c 2f 68 32 3e 0a 20  e Details</h2>. 
38e0: 20 40 20 3c 6f 6c 3e 0a 20 20 40 20 3c 6c 69 3e   @ <ol>.  @ <li>
38f0: 20 3c 70 3e 3c 62 3e 50 61 72 61 67 72 61 70 68   <p><b>Paragraph
3900: 73 3c 2f 62 3e 2e 20 20 41 6e 79 20 73 65 71 75  s</b>.  Any sequ
3910: 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ence of one or m
3920: 6f 72 65 20 62 6c 61 6e 6b 20 6c 69 6e 65 73 20  ore blank lines 
3930: 66 6f 72 6d 73 0a 20 20 40 20 61 20 70 61 72 61  forms.  @ a para
3940: 67 72 61 70 68 20 62 72 65 61 6b 2e 20 20 43 65  graph break.  Ce
3950: 6e 74 65 72 65 64 20 6f 72 20 72 69 67 68 74 2d  ntered or right-
3960: 6a 75 73 74 69 66 69 65 64 20 70 61 72 61 67 72  justified paragr
3970: 61 70 68 73 20 61 72 65 20 6e 6f 74 0a 20 20 40  aphs are not.  @
3980: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 77 69   supported by wi
3990: 6b 69 20 6d 61 72 6b 75 70 2c 20 62 75 74 20 79  ki markup, but y
39a0: 6f 75 20 63 61 6e 20 64 6f 20 74 68 65 73 65 20  ou can do these 
39b0: 74 68 69 6e 67 73 20 69 66 20 79 6f 75 20 6e 65  things if you ne
39c0: 65 64 20 74 68 65 6d 0a 20 20 40 20 75 73 69 6e  ed them.  @ usin
39d0: 67 20 48 54 4d 4c 2e 3c 2f 70 3e 0a 20 20 40 20  g HTML.</p>.  @ 
39e0: 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 42 75 6c 6c 65  <li> <p><b>Bulle
39f0: 74 20 4c 69 73 74 73 3c 2f 62 3e 2e 0a 20 20 40  t Lists</b>..  @
3a00: 20 41 20 62 75 6c 6c 65 74 20 6c 69 73 74 20 69   A bullet list i
3a10: 74 65 6d 20 61 72 65 20 6c 69 6e 65 73 20 74 68  tem are lines th
3a20: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  at begin with a 
3a30: 73 69 6e 67 6c 65 20 22 2a 22 20 63 68 61 72 61  single "*" chara
3a40: 63 74 65 72 0a 20 20 40 20 73 75 72 72 6f 75 6e  cter.  @ surroun
3a50: 64 65 64 20 6f 6e 0a 20 20 40 20 62 6f 74 68 20  ded on.  @ both 
3a60: 73 69 64 65 73 20 62 79 20 74 77 6f 20 6f 72 20  sides by two or 
3a70: 6d 6f 72 65 20 73 70 61 63 65 73 20 6f 72 20 62  more spaces or b
3a80: 79 20 61 20 74 61 62 2e 20 20 4f 6e 6c 79 20 61  y a tab.  Only a
3a90: 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 0a 20 20   single level.  
3aa0: 40 20 6f 66 20 62 75 6c 6c 65 74 20 6c 69 73 74  @ of bullet list
3ab0: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 62 79   is supported by
3ac0: 20 77 69 6b 69 2e 20 20 46 6f 72 20 74 65 73 74   wiki.  For test
3ad0: 65 64 20 6c 69 73 74 73 2c 20 75 73 65 20 48 54  ed lists, use HT
3ae0: 4d 4c 2e 3c 2f 70 3e 0a 20 20 40 20 3c 6c 69 3e  ML.</p>.  @ <li>
3af0: 20 3c 70 3e 3c 62 3e 45 6e 75 6d 65 72 61 74 69   <p><b>Enumerati
3b00: 6f 6e 20 4c 69 73 74 73 3c 2f 62 3e 2e 0a 20 20  on Lists</b>..  
3b10: 40 20 41 6e 20 65 6e 75 6d 65 72 61 74 69 6f 6e  @ An enumeration
3b20: 20 6c 69 73 74 20 69 74 65 6d 73 20 61 72 65 20   list items are 
3b30: 6c 69 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e  lines that begin
3b40: 0a 20 20 40 20 77 69 74 68 20 6f 6e 65 20 6f 72  .  @ with one or
3b50: 20 6d 6f 72 65 20 64 69 67 69 74 73 20 6f 70 74   more digits opt
3b60: 69 6f 6e 61 6c 6c 79 0a 20 20 40 20 66 6f 6c 6c  ionally.  @ foll
3b70: 6f 77 65 64 20 62 79 20 61 20 22 2e 22 20 61 6e  owed by a "." an
3b80: 64 20 73 75 72 72 6f 75 6e 64 65 64 20 6f 6e 20  d surrounded on 
3b90: 62 6f 74 68 20 73 69 64 65 73 20 62 79 20 74 77  both sides by tw
3ba0: 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73  o or more spaces
3bb0: 20 6f 72 0a 20 20 40 20 62 79 20 61 20 74 61 62   or.  @ by a tab
3bc0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 69 73  .  The number is
3bd0: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 61 6e 64   significant and
3be0: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6e 75 6d   becomes the num
3bf0: 62 65 72 20 73 68 6f 77 6e 0a 20 20 40 20 69 6e  ber shown.  @ in
3c00: 20 74 68 65 20 72 65 6e 64 65 72 65 64 20 65 6e   the rendered en
3c10: 75 6d 65 72 61 74 69 6f 6e 20 69 74 65 6d 2e 20  umeration item. 
3c20: 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6c   Only a single l
3c30: 65 76 65 6c 20 6f 66 20 65 6e 75 6d 65 72 61 74  evel of enumerat
3c40: 69 6f 6e 0a 20 20 40 20 6c 69 73 74 20 69 73 20  ion.  @ list is 
3c50: 73 75 70 70 6f 72 74 65 64 20 62 79 20 77 69 6b  supported by wik
3c60: 69 2e 20 20 46 6f 72 20 6e 65 73 74 65 64 20 65  i.  For nested e
3c70: 6e 75 6d 65 72 61 74 69 6f 6e 73 20 6f 72 20 66  numerations or f
3c80: 6f 72 0a 20 20 40 20 65 6e 75 6d 65 72 61 74 69  or.  @ enumerati
3c90: 6f 6e 73 20 74 68 61 74 20 63 6f 75 6e 74 20 75  ons that count u
3ca0: 73 69 6e 67 20 6c 65 74 74 65 72 73 20 6f 72 20  sing letters or 
3cb0: 72 6f 6d 61 6e 20 6e 75 6d 65 72 69 61 6c 73 2c  roman numerials,
3cc0: 20 75 73 65 20 48 54 4d 4c 2e 3c 2f 70 3e 0a 20   use HTML.</p>. 
3cd0: 20 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 49 6e   @ <li> <p><b>In
3ce0: 64 65 6e 74 65 64 20 50 61 72 61 67 72 61 70 68  dented Paragraph
3cf0: 73 3c 2f 62 3e 2e 0a 20 20 40 20 41 6e 79 20 70  s</b>..  @ Any p
3d00: 61 72 61 67 72 61 70 68 20 74 68 61 74 20 62 65  aragraph that be
3d10: 67 69 6e 73 20 77 69 74 68 20 74 77 6f 20 6f 72  gins with two or
3d20: 20 6d 6f 72 65 20 73 70 61 63 65 73 20 6f 72 20   more spaces or 
3d30: 61 20 74 61 62 20 61 6e 64 0a 20 20 40 20 77 68  a tab and.  @ wh
3d40: 69 63 68 20 69 73 20 6e 6f 74 20 61 20 62 75 6c  ich is not a bul
3d50: 6c 65 74 20 6f 72 20 65 6e 75 6d 65 72 61 74 69  let or enumerati
3d60: 6f 6e 20 6c 69 73 74 20 69 74 65 6d 20 69 73 20  on list item is 
3d70: 72 65 6e 64 65 72 65 64 20 0a 20 20 40 20 69 6e  rendered .  @ in
3d80: 64 65 6e 74 65 64 2e 20 20 4f 6e 6c 79 20 61 20  dented.  Only a 
3d90: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
3da0: 69 6e 64 65 6e 74 61 74 69 6f 6e 20 69 73 20 73  indentation is s
3db0: 75 70 70 6f 72 74 65 64 20 62 79 3c 2f 70 3e 0a  upported by</p>.
3dc0: 20 20 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 48    @ <li> <p><b>H
3dd0: 79 70 65 72 6c 69 6e 6b 73 3c 2f 62 3e 2e 0a 20  yperlinks</b>.. 
3de0: 20 40 20 54 65 78 74 20 77 69 74 68 69 6e 20 73   @ Text within s
3df0: 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 20 28  quare brackets (
3e00: 22 5b 2e 2e 2e 5d 22 29 20 62 65 63 6f 6d 65 73  "[...]") becomes
3e10: 20 61 20 68 79 70 65 72 6c 69 6e 6b 2e 20 20 54   a hyperlink.  T
3e20: 68 65 0a 20 20 40 20 74 61 72 67 65 74 20 63 61  he.  @ target ca
3e30: 6e 20 62 65 20 61 20 77 69 6b 69 20 70 61 67 65  n be a wiki page
3e40: 20 6e 61 6d 65 2c 20 74 68 65 20 55 55 49 44 20   name, the UUID 
3e50: 6f 66 20 61 20 63 68 65 63 6b 2d 69 6e 20 6f 72  of a check-in or
3e60: 20 74 69 63 6b 65 74 2c 0a 20 20 40 20 74 68 65   ticket,.  @ the
3e70: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6d 61 67   name of an imag
3e80: 65 2c 20 6f 72 20 61 20 55 52 4c 2e 20 20 42 79  e, or a URL.  By
3e90: 20 64 65 66 61 75 6c 74 2c 20 74 68 65 20 74 61   default, the ta
3ea0: 72 67 65 74 20 69 73 20 64 69 73 70 6c 61 79 65  rget is displaye
3eb0: 64 0a 20 20 40 20 61 73 20 74 68 65 20 74 65 78  d.  @ as the tex
3ec0: 74 20 6f 66 20 74 68 65 20 68 79 70 65 72 6c 69  t of the hyperli
3ed0: 6e 6b 2e 20 20 42 75 74 20 79 6f 75 20 63 61 6e  nk.  But you can
3ee0: 20 73 70 65 63 69 66 79 20 61 6c 74 65 72 6e 61   specify alterna
3ef0: 74 69 76 65 20 74 65 78 74 0a 20 20 40 20 61 66  tive text.  @ af
3f00: 74 65 72 20 74 68 65 20 74 61 72 67 65 74 20 6e  ter the target n
3f10: 61 6d 65 20 73 65 70 61 72 61 74 65 64 20 62 79  ame separated by
3f20: 20 61 20 22 7c 22 20 63 68 61 72 61 63 74 65 72   a "|" character
3f30: 2e 3c 2f 70 3e 0a 20 20 40 20 3c 6c 69 3e 20 3c  .</p>.  @ <li> <
3f40: 70 3e 3c 62 3e 48 54 4d 4c 3c 2f 62 3e 2e 0a 20  p><b>HTML</b>.. 
3f50: 20 40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67   @ The following
3f60: 20 73 74 61 6e 64 61 72 64 20 48 54 4d 4c 20 65   standard HTML e
3f70: 6c 65 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 75  lements may be u
3f80: 73 65 64 3a 0a 20 20 40 20 26 6c 74 3b 61 26 67  sed:.  @ &lt;a&g
3f90: 74 3b 0a 20 20 40 20 26 6c 74 3b 61 64 64 72 65  t;.  @ &lt;addre
3fa0: 73 73 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 62  ss&gt;.  @ &lt;b
3fb0: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 62 69 67  &gt;.  @ &lt;big
3fc0: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 62 6c 6f  &gt;.  @ &lt;blo
3fd0: 63 6b 71 75 6f 74 65 26 67 74 3b 0a 20 20 40 20  ckquote&gt;.  @ 
3fe0: 26 6c 74 3b 62 72 26 67 74 3b 0a 20 20 40 20 26  &lt;br&gt;.  @ &
3ff0: 6c 74 3b 63 65 6e 74 65 72 26 67 74 3b 0a 20 20  lt;center&gt;.  
4000: 40 20 26 6c 74 3b 63 69 74 65 26 67 74 3b 0a 20  @ &lt;cite&gt;. 
4010: 20 40 20 26 6c 74 3b 63 6f 64 65 26 67 74 3b 0a   @ &lt;code&gt;.
4020: 20 20 40 20 26 6c 74 3b 64 64 26 67 74 3b 0a 20    @ &lt;dd&gt;. 
4030: 20 40 20 26 6c 74 3b 64 66 6e 26 67 74 3b 0a 20   @ &lt;dfn&gt;. 
4040: 20 40 20 26 6c 74 3b 64 69 76 26 67 74 3b 0a 20   @ &lt;div&gt;. 
4050: 20 40 20 26 6c 74 3b 64 6c 26 67 74 3b 0a 20 20   @ &lt;dl&gt;.  
4060: 40 20 26 6c 74 3b 64 74 26 67 74 3b 0a 20 20 40  @ &lt;dt&gt;.  @
4070: 20 26 6c 74 3b 65 6d 26 67 74 3b 0a 20 20 40 20   &lt;em&gt;.  @ 
4080: 26 6c 74 3b 66 6f 6e 74 26 67 74 3b 0a 20 20 40  &lt;font&gt;.  @
4090: 20 26 6c 74 3b 68 31 26 67 74 3b 0a 20 20 40 20   &lt;h1&gt;.  @ 
40a0: 26 6c 74 3b 68 32 26 67 74 3b 0a 20 20 40 20 26  &lt;h2&gt;.  @ &
40b0: 6c 74 3b 68 33 26 67 74 3b 0a 20 20 40 20 26 6c  lt;h3&gt;.  @ &l
40c0: 74 3b 68 34 26 67 74 3b 0a 20 20 40 20 26 6c 74  t;h4&gt;.  @ &lt
40d0: 3b 68 35 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  ;h5&gt;.  @ &lt;
40e0: 68 36 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 68  h6&gt;.  @ &lt;h
40f0: 72 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 69 6d  r&gt;.  @ &lt;im
4100: 67 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 69 26  g&gt;.  @ &lt;i&
4110: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 6b 62 64 26  gt;.  @ &lt;kbd&
4120: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 6c 69 26 67  gt;.  @ &lt;li&g
4130: 74 3b 0a 20 20 40 20 26 6c 74 3b 6e 6f 62 72 26  t;.  @ &lt;nobr&
4140: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 6f 6c 26 67  gt;.  @ &lt;ol&g
4150: 74 3b 0a 20 20 40 20 26 6c 74 3b 70 26 67 74 3b  t;.  @ &lt;p&gt;
4160: 0a 20 20 40 20 26 6c 74 3b 70 72 65 26 67 74 3b  .  @ &lt;pre&gt;
4170: 0a 20 20 40 20 26 6c 74 3b 73 26 67 74 3b 0a 20  .  @ &lt;s&gt;. 
4180: 20 40 20 26 6c 74 3b 73 61 6d 70 26 67 74 3b 0a   @ &lt;samp&gt;.
4190: 20 20 40 20 26 6c 74 3b 73 6d 61 6c 6c 26 67 74    @ &lt;small&gt
41a0: 3b 0a 20 20 40 20 26 6c 74 3b 73 74 72 69 6b 65  ;.  @ &lt;strike
41b0: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73 74 72  &gt;.  @ &lt;str
41c0: 6f 6e 67 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  ong&gt;.  @ &lt;
41d0: 73 75 62 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  sub&gt;.  @ &lt;
41e0: 73 75 70 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  sup&gt;.  @ &lt;
41f0: 74 61 62 6c 65 26 67 74 3b 0a 20 20 40 20 26 6c  table&gt;.  @ &l
4200: 74 3b 74 64 26 67 74 3b 0a 20 20 40 20 26 6c 74  t;td&gt;.  @ &lt
4210: 3b 74 68 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  ;th&gt;.  @ &lt;
4220: 74 72 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 74  tr&gt;.  @ &lt;t
4230: 74 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 75 26  t&gt;.  @ &lt;u&
4240: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 75 6c 26 67  gt;.  @ &lt;ul&g
4250: 74 3b 0a 20 20 40 20 26 6c 74 3b 76 61 72 26 67  t;.  @ &lt;var&g
4260: 74 3b 2e 0a 20 20 40 20 49 6e 20 61 64 64 69 74  t;..  @ In addit
4270: 69 6f 6e 2c 20 74 68 65 72 65 20 61 72 65 20 74  ion, there are t
4280: 77 6f 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20  wo non-standard 
4290: 65 6c 65 6d 65 6e 74 73 20 61 76 61 69 6c 61 62  elements availab
42a0: 6c 65 3a 0a 20 20 40 20 26 6c 74 3b 76 65 72 62  le:.  @ &lt;verb
42b0: 61 74 69 6d 26 67 74 3b 20 61 6e 64 20 26 6c 74  atim&gt; and &lt
42c0: 3b 6e 6f 77 69 6b 69 26 67 74 3b 2e 0a 20 20 40  ;nowiki&gt;..  @
42d0: 20 4e 6f 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e   No other elemen
42e0: 74 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 20  ts are allowed. 
42f0: 20 41 6c 6c 20 61 74 74 72 69 62 75 74 65 73 20   All attributes 
4300: 61 72 65 20 63 68 65 63 6b 65 64 20 61 6e 64 0a  are checked and.
4310: 20 20 40 20 6f 6e 6c 79 20 61 20 66 65 77 20 62    @ only a few b
4320: 65 6e 69 67 6e 20 61 74 74 72 69 62 75 74 65 73  enign attributes
4330: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   are allowed on 
4340: 65 61 63 68 20 65 6c 65 6d 65 6e 74 2e 0a 20 20  each element..  
4350: 40 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c  @ In particular,
4360: 20 61 6e 79 20 61 74 74 72 69 62 75 74 65 73 20   any attributes 
4370: 74 68 61 74 20 73 70 65 63 69 66 79 20 6a 61 76  that specify jav
4380: 61 73 63 72 69 70 74 20 6f 72 20 43 53 53 0a 20  ascript or CSS. 
4390: 20 40 20 61 72 65 20 65 6c 69 64 65 64 2e 3c 2f   @ are elided.</
43a0: 70 3e 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 3e  p></li>.  @ <li>
43b0: 3c 70 3e 3c 62 3e 53 70 65 63 69 61 6c 20 4d 61  <p><b>Special Ma
43c0: 72 6b 75 70 2e 3c 2f 62 3e 0a 20 20 40 20 54 68  rkup.</b>.  @ Th
43d0: 65 20 26 6c 74 3b 76 65 72 62 61 74 69 6d 26 67  e &lt;verbatim&g
43e0: 74 3b 20 74 61 67 20 64 69 73 61 62 6c 65 73 20  t; tag disables 
43f0: 61 6c 6c 20 77 69 6b 69 20 61 6e 64 20 48 54 4d  all wiki and HTM
4400: 4c 20 6d 61 72 6b 75 70 0a 20 20 40 20 75 70 20  L markup.  @ up 
4410: 74 68 72 6f 75 67 68 20 74 68 65 20 6e 65 78 74  through the next
4420: 20 26 6c 74 3b 2f 76 65 72 62 61 74 69 6d 26 67   &lt;/verbatim&g
4430: 74 3b 2e 20 20 54 68 65 20 26 6c 74 3b 6e 6f 77  t;.  The &lt;now
4440: 69 6b 69 26 67 74 3b 20 74 61 67 0a 20 20 40 20  iki&gt; tag.  @ 
4450: 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 77 69 6b  disables all wik
4460: 69 20 66 6f 72 6d 61 74 74 69 6e 67 20 72 75 6c  i formatting rul
4470: 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  es through the m
4480: 61 74 63 68 69 6e 67 0a 20 20 40 20 26 6c 74 3b  atching.  @ &lt;
4490: 2f 6e 6f 77 69 6b 69 26 67 74 3b 20 65 6c 65 6d  /nowiki&gt; elem
44a0: 65 6e 74 2e 0a 20 20 40 20 3c 2f 6f 6c 3e 0a 20  ent..  @ </ol>. 
44b0: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
44c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
44d0: 6e 65 77 20 77 69 6b 69 20 70 61 67 65 20 74 6f  new wiki page to
44e0: 20 74 68 65 20 72 65 73 70 6f 73 69 74 6f 72 79   the respository
44f0: 2e 20 20 54 68 65 20 70 61 67 65 20 6e 61 6d 65  .  The page name
4500: 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20   is.** given by 
4510: 74 68 65 20 7a 50 61 67 65 4e 61 6d 65 20 70 61  the zPageName pa
4520: 72 61 6d 65 74 65 72 2e 20 20 69 73 4e 65 77 20  rameter.  isNew 
4530: 6d 75 73 74 20 62 65 20 74 72 75 65 20 74 6f 20  must be true to 
4540: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
4550: 70 61 67 65 2e 20 20 49 66 20 6e 6f 20 70 72 65  page.  If no pre
4560: 76 69 6f 75 73 20 70 61 67 65 20 77 69 74 68 20  vious page with 
4570: 74 68 65 20 6e 61 6d 65 20 7a 50 61 67 65 4e 61  the name zPageNa
4580: 6d 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 64  me exists.** and
4590: 20 69 73 4e 65 77 20 69 73 20 66 61 6c 73 65 2c   isNew is false,
45a0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
45b0: 6e 65 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72  ne throws an err
45c0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  or..**.** The co
45d0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
45e0: 20 70 61 67 65 20 69 73 20 67 69 76 65 6e 20 62   page is given b
45f0: 79 20 74 68 65 20 62 6c 6f 62 20 70 43 6f 6e 74  y the blob pCont
4600: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6b 69  ent..*/.int wiki
4610: 5f 63 6d 64 5f 63 6f 6d 6d 69 74 28 63 68 61 72  _cmd_commit(char
4620: 20 63 6f 6e 73 74 20 2a 20 7a 50 61 67 65 4e 61   const * zPageNa
4630: 6d 65 2c 20 69 6e 74 20 69 73 4e 65 77 2c 20 42  me, int isNew, B
4640: 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 29 7b 0a  lob *pContent){.
4650: 20 20 42 6c 6f 62 20 77 69 6b 69 3b 20 20 20 20    Blob wiki;    
4660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6b            /* Wik
4670: 69 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  i page content *
4680: 2f 0a 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 20  /.  Blob cksum; 
4690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
46a0: 69 6b 69 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  iki checksum */.
46b0: 20 20 69 6e 74 20 72 69 64 3b 20 20 20 20 20 20    int rid;      
46c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 72 74            /* art
46d0: 69 66 61 63 74 20 49 44 20 6f 66 20 70 61 72 65  ifact ID of pare
46e0: 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  nt page */.  int
46f0: 20 6e 72 69 64 3b 20 20 20 20 20 20 20 20 20 20   nrid;          
4700: 20 20 20 20 20 2f 2a 20 61 72 74 69 66 61 63 74       /* artifact
4710: 20 49 44 20 6f 66 20 6e 65 77 20 77 69 6b 69 20   ID of new wiki 
4720: 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  page */.  char *
4730: 7a 44 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  zDate;          
4740: 20 20 2f 2a 20 74 69 6d 65 73 74 61 6d 70 20 2a    /* timestamp *
4750: 2f 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64 3b  /.  char *zUuid;
4760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75              /* u
4770: 75 69 64 20 66 6f 72 20 72 69 64 20 2a 2f 0a 0a  uid for rid */..
4780: 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30    rid = db_int(0
4790: 2c 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 78  ,.     "SELECT x
47a0: 2e 72 69 64 20 46 52 4f 4d 20 74 61 67 20 74 2c  .rid FROM tag t,
47b0: 20 74 61 67 78 72 65 66 20 78 22 0a 20 20 20 20   tagxref x".    
47c0: 20 22 20 57 48 45 52 45 20 78 2e 74 61 67 69 64   " WHERE x.tagid
47d0: 3d 74 2e 74 61 67 69 64 20 41 4e 44 20 74 2e 74  =t.tagid AND t.t
47e0: 61 67 6e 61 6d 65 3d 27 77 69 6b 69 2d 25 71 27  agname='wiki-%q'
47f0: 22 0a 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  ".     " ORDER B
4800: 59 20 78 2e 6d 74 69 6d 65 20 44 45 53 43 20 4c  Y x.mtime DESC L
4810: 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 7a 50  IMIT 1",.     zP
4820: 61 67 65 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69  ageName.  );.  i
4830: 66 28 20 72 69 64 3d 3d 30 20 26 26 20 21 69 73  f( rid==0 && !is
4840: 4e 65 77 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  New ){.    fossi
4850: 6c 5f 66 61 74 61 6c 28 22 6e 6f 20 73 75 63 68  l_fatal("no such
4860: 20 77 69 6b 69 20 70 61 67 65 3a 20 25 73 22 2c   wiki page: %s",
4870: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d   zPageName);.  }
4880: 0a 20 20 69 66 28 20 72 69 64 21 3d 30 20 26 26  .  if( rid!=0 &&
4890: 20 69 73 4e 65 77 20 29 7b 0a 20 20 20 20 66 6f   isNew ){.    fo
48a0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 77 69 6b 69  ssil_fatal("wiki
48b0: 20 70 61 67 65 20 25 73 20 61 6c 72 65 61 64 79   page %s already
48c0: 20 65 78 69 73 74 73 22 2c 20 7a 50 61 67 65 4e   exists", zPageN
48d0: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 62 6c 6f  ame);.  }..  blo
48e0: 62 5f 7a 65 72 6f 28 26 77 69 6b 69 29 3b 0a 20  b_zero(&wiki);. 
48f0: 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74   zDate = db_text
4900: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65  (0, "SELECT date
4910: 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20  time('now')");. 
4920: 20 7a 44 61 74 65 5b 31 30 5d 20 3d 20 27 54 27   zDate[10] = 'T'
4930: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
4940: 28 26 77 69 6b 69 2c 20 22 44 20 25 73 5c 6e 22  (&wiki, "D %s\n"
4950: 2c 20 7a 44 61 74 65 29 3b 0a 20 20 66 72 65 65  , zDate);.  free
4960: 28 7a 44 61 74 65 29 3b 0a 20 20 62 6c 6f 62 5f  (zDate);.  blob_
4970: 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22  appendf(&wiki, "
4980: 4c 20 25 46 5c 6e 22 2c 20 7a 50 61 67 65 4e 61  L %F\n", zPageNa
4990: 6d 65 20 29 3b 0a 20 20 69 66 28 20 72 69 64 20  me );.  if( rid 
49a0: 29 7b 0a 20 20 20 20 7a 55 75 69 64 20 3d 20 64  ){.    zUuid = d
49b0: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
49c0: 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62  T uuid FROM blob
49d0: 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20   WHERE rid=%d", 
49e0: 72 69 64 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  rid);.    blob_a
49f0: 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 50  ppendf(&wiki, "P
4a00: 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 29 3b 0a   %s\n", zUuid);.
4a10: 20 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b      free(zUuid);
4a20: 0a 20 20 7d 0a 20 20 75 73 65 72 5f 73 65 6c 65  .  }.  user_sele
4a30: 63 74 28 29 3b 0a 20 20 69 66 28 20 67 2e 7a 4c  ct();.  if( g.zL
4a40: 6f 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 6c  ogin ){.      bl
4a50: 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69  ob_appendf(&wiki
4a60: 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c  , "U %F\n", g.zL
4a70: 6f 67 69 6e 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f  ogin);.  }.  blo
4a80: 62 5f 61 70 70 65 6e 64 66 28 20 26 77 69 6b 69  b_appendf( &wiki
4a90: 2c 20 22 57 20 25 64 5c 6e 25 73 5c 6e 22 2c 20  , "W %d\n%s\n", 
4aa0: 62 6c 6f 62 5f 73 69 7a 65 28 70 43 6f 6e 74 65  blob_size(pConte
4ab0: 6e 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nt),.           
4ac0: 20 20 20 20 20 62 6c 6f 62 5f 73 74 72 28 70 43       blob_str(pC
4ad0: 6f 6e 74 65 6e 74 29 20 29 3b 0a 20 20 6d 64 35  ontent) );.  md5
4ae0: 73 75 6d 5f 62 6c 6f 62 28 26 77 69 6b 69 2c 20  sum_blob(&wiki, 
4af0: 26 63 6b 73 75 6d 29 3b 0a 20 20 62 6c 6f 62 5f  &cksum);.  blob_
4b00: 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22  appendf(&wiki, "
4b10: 5a 20 25 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29  Z %b\n", &cksum)
4b20: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
4b30: 63 6b 73 75 6d 29 3b 0a 20 20 64 62 5f 62 65 67  cksum);.  db_beg
4b40: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  in_transaction()
4b50: 3b 0a 20 20 6e 72 69 64 20 3d 20 63 6f 6e 74 65  ;.  nrid = conte
4b60: 6e 74 5f 70 75 74 28 20 26 77 69 6b 69 2c 20 30  nt_put( &wiki, 0
4b70: 2c 20 30 20 29 3b 0a 20 20 64 62 5f 6d 75 6c 74  , 0 );.  db_mult
4b80: 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f  i_exec("INSERT O
4b90: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 75 6e  R IGNORE INTO un
4ba0: 73 65 6e 74 20 56 41 4c 55 45 53 28 25 64 29 22  sent VALUES(%d)"
4bb0: 2c 20 6e 72 69 64 29 3b 0a 20 20 6d 61 6e 69 66  , nrid);.  manif
4bc0: 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e 72  est_crosslink(nr
4bd0: 69 64 2c 26 77 69 6b 69 29 3b 0a 20 20 62 6c 6f  id,&wiki);.  blo
4be0: 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b 0a  b_reset(&wiki);.
4bf0: 20 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66    content_deltif
4c00: 79 28 72 69 64 2c 6e 72 69 64 2c 30 29 3b 0a 20  y(rid,nrid,0);. 
4c10: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
4c20: 69 6f 6e 28 30 29 3b 0a 20 20 61 75 74 6f 73 79  ion(0);.  autosy
4c30: 6e 63 28 41 55 54 4f 53 59 4e 43 5f 50 55 53 48  nc(AUTOSYNC_PUSH
4c40: 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b  );  .  return 1;
4c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e  .}../*.** COMMAN
4c60: 44 3a 20 77 69 6b 69 0a 2a 2a 0a 2a 2a 20 55 73  D: wiki.**.** Us
4c70: 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 77 69 6b  age: %fossil wik
4c80: 69 20 28 65 78 70 6f 72 74 7c 63 72 65 61 74 65  i (export|create
4c90: 7c 63 6f 6d 6d 69 74 7c 6c 69 73 74 29 20 57 69  |commit|list) Wi
4ca0: 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 52 75 6e  kiName.**.** Run
4cb0: 20 76 61 72 69 6f 75 73 20 73 75 62 63 6f 6d 6d   various subcomm
4cc0: 61 6e 64 73 20 74 6f 20 66 65 74 63 68 20 77 69  ands to fetch wi
4cd0: 6b 69 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 0a 2a  ki entries..**.*
4ce0: 2a 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77 69  *     %fossil wi
4cf0: 6b 69 20 65 78 70 6f 72 74 20 50 41 47 45 4e 41  ki export PAGENA
4d00: 4d 45 20 3f 46 49 4c 45 3f 0a 2a 2a 0a 2a 2a 20  ME ?FILE?.**.** 
4d10: 20 20 20 20 20 20 20 53 65 6e 64 73 20 74 68 65         Sends the
4d20: 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
4d30: 6f 66 20 74 68 65 20 50 41 47 45 4e 41 4d 45 20  of the PAGENAME 
4d40: 77 69 6b 69 0a 2a 2a 20 20 20 20 20 20 20 20 65  wiki.**        e
4d50: 6e 74 72 79 20 74 6f 20 74 68 65 20 67 69 76 65  ntry to the give
4d60: 6e 20 66 69 6c 65 20 6f 72 20 73 74 61 6e 64 61  n file or standa
4d70: 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a  rd output..**.**
4d80: 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77 69 6b       %fossil wik
4d90: 69 20 63 6f 6d 6d 69 74 20 50 41 47 45 4e 41 4d  i commit PAGENAM
4da0: 45 20 3f 46 49 4c 45 3f 0a 2a 2a 0a 2a 2a 20 20  E ?FILE?.**.**  
4db0: 20 20 20 20 20 20 43 6f 6d 6d 69 74 20 63 68 61        Commit cha
4dc0: 6e 67 65 73 20 74 6f 20 61 20 77 69 6b 69 20 70  nges to a wiki p
4dd0: 61 67 65 20 66 72 6f 6d 20 46 49 4c 45 20 6f 72  age from FILE or
4de0: 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 2e 0a   from standard..
4df0: 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73 69  **.**     %fossi
4e00: 6c 20 77 69 6b 69 20 63 72 65 61 74 65 20 50 41  l wiki create PA
4e10: 47 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 0a 2a 2a  GENAME ?FILE?.**
4e20: 0a 2a 2a 20 20 20 20 20 20 20 20 43 72 65 61 74  .**        Creat
4e30: 65 20 61 20 6e 65 77 20 77 69 6b 69 20 70 61 67  e a new wiki pag
4e40: 65 20 77 69 74 68 20 69 6e 69 74 69 61 6c 20 63  e with initial c
4e50: 6f 6e 74 65 6e 74 20 74 61 6b 65 6e 20 66 72 6f  ontent taken fro
4e60: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 46 49 4c 45  m.**        FILE
4e70: 20 6f 72 20 66 72 6f 6d 20 73 74 61 6e 64 61 72   or from standar
4e80: 64 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 20  d input..**.**  
4e90: 20 20 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20     %fossil wiki 
4ea0: 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  list.**.**      
4eb0: 20 20 4c 69 73 74 73 20 61 6c 6c 20 77 69 6b 69    Lists all wiki
4ec0: 20 65 6e 74 72 69 65 73 2c 20 6f 6e 65 20 70 65   entries, one pe
4ed0: 72 20 6c 69 6e 65 2c 20 6f 72 64 65 72 65 64 0a  r line, ordered.
4ee0: 2a 2a 20 20 20 20 20 20 20 20 63 61 73 65 2d 69  **        case-i
4ef0: 6e 73 65 6e 74 69 76 65 6c 79 20 62 79 20 6e 61  nsentively by na
4f00: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 73 3a  me..**.** TODOs:
4f10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73  .**.**     %foss
4f20: 69 6c 20 77 69 6b 69 20 65 78 70 6f 72 74 20 3f  il wiki export ?
4f30: 2d 75 20 55 55 49 44 3f 20 57 69 6b 69 4e 61 6d  -u UUID? WikiNam
4f40: 65 20 3f 46 49 4c 45 3f 0a 2a 2a 0a 2a 2a 20 20  e ?FILE?.**.**  
4f50: 20 20 20 20 20 20 4f 75 74 70 75 74 73 20 74 68        Outputs th
4f60: 65 20 73 65 6c 65 63 74 65 64 20 76 65 72 73 69  e selected versi
4f70: 6f 6e 20 6f 66 20 57 69 6b 69 4e 61 6d 65 2e 0a  on of WikiName..
4f80: 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73 69  **.**     %fossi
4f90: 6c 20 77 69 6b 69 20 64 65 6c 65 74 65 20 3f 2d  l wiki delete ?-
4fa0: 6d 20 4d 45 53 53 41 47 45 3f 20 57 69 6b 69 4e  m MESSAGE? WikiN
4fb0: 61 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ame.**.**       
4fc0: 20 54 68 65 20 73 61 6d 65 20 61 73 20 64 65 6c   The same as del
4fd0: 65 74 69 6e 67 20 61 20 66 69 6c 65 20 65 6e 74  eting a file ent
4fe0: 72 79 2c 20 62 75 74 20 69 20 64 6f 6e 27 74 20  ry, but i don't 
4ff0: 6b 6e 6f 77 20 69 66 20 66 6f 73 73 69 6c 0a 2a  know if fossil.*
5000: 2a 20 20 20 20 20 20 20 20 73 75 70 70 6f 72 74  *        support
5010: 73 20 61 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61  s a commit messa
5020: 67 65 20 66 6f 72 20 57 69 6b 69 20 65 6e 74 72  ge for Wiki entr
5030: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25  ies..**.**     %
5040: 66 6f 73 73 69 6c 20 77 69 6b 69 20 3f 2d 75 3f  fossil wiki ?-u?
5050: 20 3f 2d 64 3f 20 3f 2d 73 3d 5b 7c 5d 3f 20 6c   ?-d? ?-s=[|]? l
5060: 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ist.**.**       
5070: 20 4c 69 73 74 73 20 74 68 65 20 55 55 49 44 20   Lists the UUID 
5080: 61 6e 64 2f 6f 72 20 44 61 74 65 20 6f 66 20 6c  and/or Date of l
5090: 61 73 74 20 63 68 61 6e 67 65 20 61 6c 6f 6e 67  ast change along
50a0: 20 77 69 74 68 20 65 61 63 68 20 65 6e 74 72 79   with each entry
50b0: 0a 2a 2a 20 20 20 20 20 20 20 20 6e 61 6d 65 2c  .**        name,
50c0: 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 74 68   delimited by th
50d0: 65 20 2d 73 20 63 68 61 72 2e 0a 2a 2a 0a 2a 2a  e -s char..**.**
50e0: 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77 69 6b       %fossil wik
50f0: 69 20 64 69 66 66 20 3f 55 55 49 44 3f 20 3f 2d  i diff ?UUID? ?-
5100: 66 20 69 6e 66 69 6c 65 5b 3d 73 74 64 69 6e 5d  f infile[=stdin]
5110: 3f 20 45 6e 74 72 79 4e 61 6d 65 0a 2a 2a 0a 2a  ? EntryName.**.*
5120: 2a 20 20 20 20 20 20 20 20 44 69 66 66 73 20 74  *        Diffs t
5130: 68 65 20 6c 6f 63 61 6c 20 63 6f 70 79 20 6f 66  he local copy of
5140: 20 61 20 70 61 67 65 20 77 69 74 68 20 61 20 67   a page with a g
5150: 69 76 65 6e 20 76 65 72 73 69 6f 6e 20 28 64 65  iven version (de
5160: 66 61 75 6c 74 69 6e 67 0a 2a 2a 20 20 20 20 20  faulting.**     
5170: 20 20 20 74 6f 20 74 68 65 20 68 65 61 64 20 76     to the head v
5180: 65 72 73 69 6f 6e 29 2e 0a 2a 2f 0a 76 6f 69 64  ersion)..*/.void
5190: 20 77 69 6b 69 5f 63 6d 64 28 76 6f 69 64 29 7b   wiki_cmd(void){
51a0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 64 62 5f 66  .  int n;.  db_f
51b0: 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70  ind_and_open_rep
51c0: 6f 73 69 74 6f 72 79 28 31 29 3b 0a 20 20 69 66  ository(1);.  if
51d0: 28 20 67 2e 61 72 67 63 3c 33 20 29 7b 0a 20 20  ( g.argc<3 ){.  
51e0: 20 20 67 6f 74 6f 20 77 69 6b 69 5f 63 6d 64 5f    goto wiki_cmd_
51f0: 75 73 61 67 65 3b 0a 20 20 7d 0a 20 20 6e 20 3d  usage;.  }.  n =
5200: 20 73 74 72 6c 65 6e 28 67 2e 61 72 67 76 5b 32   strlen(g.argv[2
5210: 5d 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  ]);.  if( n==0 )
5220: 7b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6b 69 5f  {.    goto wiki_
5230: 63 6d 64 5f 75 73 61 67 65 3b 0a 20 20 7d 0a 0a  cmd_usage;.  }..
5240: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e    if( strncmp(g.
5250: 61 72 67 76 5b 32 5d 2c 22 65 78 70 6f 72 74 22  argv[2],"export"
5260: 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ,n)==0 ){.    ch
5270: 61 72 20 63 6f 6e 73 74 20 2a 7a 50 61 67 65 4e  ar const *zPageN
5280: 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame;        /* N
5290: 61 6d 65 20 6f 66 20 74 68 65 20 77 69 6b 69 20  ame of the wiki 
52a0: 70 61 67 65 20 74 6f 20 65 78 70 6f 72 74 20 2a  page to export *
52b0: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
52c0: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
52d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
52e0: 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 28  he output file (
52f0: 30 3d 73 74 64 6f 75 74 29 20 2a 2f 0a 20 20 20  0=stdout) */.   
5300: 20 69 6e 74 20 72 69 64 3b 20 20 20 20 20 20 20   int rid;       
5310: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 74 69           /* Arti
5320: 66 61 63 74 20 49 44 20 6f 66 20 74 68 65 20 77  fact ID of the w
5330: 69 6b 69 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  iki page */.    
5340: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5350: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5360: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 63  counter */.    c
5370: 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20 30 3b 20  har *zBody = 0; 
5380: 20 20 20 20 20 20 20 2f 2a 20 57 69 6b 69 20 70         /* Wiki p
5390: 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  age content */. 
53a0: 20 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 20 20     Manifest m;  
53b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
53c0: 72 73 65 64 20 77 69 6b 69 20 70 61 67 65 20 63  rsed wiki page c
53d0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  ontent */.    if
53e0: 28 20 28 67 2e 61 72 67 63 21 3d 34 29 20 26 26  ( (g.argc!=4) &&
53f0: 20 28 67 2e 61 72 67 63 21 3d 35 29 20 29 7b 0a   (g.argc!=5) ){.
5400: 20 20 20 20 20 20 75 73 61 67 65 28 22 65 78 70        usage("exp
5410: 6f 72 74 20 50 41 47 45 4e 41 4d 45 20 3f 46 49  ort PAGENAME ?FI
5420: 4c 45 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LE?");.    }.   
5430: 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20 67 2e 61   zPageName = g.a
5440: 72 67 76 5b 33 5d 3b 0a 20 20 20 20 72 69 64 20  rgv[3];.    rid 
5450: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  = db_int(0, "SEL
5460: 45 43 54 20 78 2e 72 69 64 20 46 52 4f 4d 20 74  ECT x.rid FROM t
5470: 61 67 20 74 2c 20 74 61 67 78 72 65 66 20 78 22  ag t, tagxref x"
5480: 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 78  .      " WHERE x
5490: 2e 74 61 67 69 64 3d 74 2e 74 61 67 69 64 20 41  .tagid=t.tagid A
54a0: 4e 44 20 74 2e 74 61 67 6e 61 6d 65 3d 27 77 69  ND t.tagname='wi
54b0: 6b 69 2d 25 71 27 22 0a 20 20 20 20 20 20 22 20  ki-%q'".      " 
54c0: 4f 52 44 45 52 20 42 59 20 78 2e 6d 74 69 6d 65  ORDER BY x.mtime
54d0: 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a   DESC LIMIT 1",.
54e0: 20 20 20 20 20 20 7a 50 61 67 65 4e 61 6d 65 20        zPageName 
54f0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
5500: 72 69 64 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f  rid ){.      Blo
5510: 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  b content;.     
5520: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64   content_get(rid
5530: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  , &content);.   
5540: 20 20 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73     manifest_pars
5550: 65 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29 3b  e(&m, &content);
5560: 0a 20 20 20 20 20 20 69 66 28 20 6d 2e 74 79 70  .      if( m.typ
5570: 65 3d 3d 43 46 54 59 50 45 5f 57 49 4b 49 20 29  e==CFTYPE_WIKI )
5580: 7b 0a 20 20 20 20 20 20 20 20 7a 42 6f 64 79 20  {.        zBody 
5590: 3d 20 6d 2e 7a 57 69 6b 69 3b 0a 20 20 20 20 20  = m.zWiki;.     
55a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
55b0: 20 7a 42 6f 64 79 3d 3d 30 20 29 7b 0a 20 20 20   zBody==0 ){.   
55c0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
55d0: 22 77 69 6b 69 20 70 61 67 65 20 5b 25 73 5d 20  "wiki page [%s] 
55e0: 6e 6f 74 20 66 6f 75 6e 64 22 2c 7a 50 61 67 65  not found",zPage
55f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
5600: 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 42   for(i=strlen(zB
5610: 6f 64 79 29 3b 20 69 3e 30 20 26 26 20 69 73 73  ody); i>0 && iss
5620: 70 61 63 65 28 7a 42 6f 64 79 5b 69 2d 31 5d 29  pace(zBody[i-1])
5630: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 46 69  ; i--){}.    zFi
5640: 6c 65 20 20 3d 20 28 67 2e 61 72 67 63 3d 3d 34  le  = (g.argc==4
5650: 29 20 3f 20 30 20 3a 20 67 2e 61 72 67 76 5b 34  ) ? 0 : g.argv[4
5660: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  ];.    if( zFile
5670: 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a   ){.      FILE *
5680: 20 7a 46 3b 0a 20 20 20 20 20 20 73 68 6f 72 74   zF;.      short
5690: 20 64 6f 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20   doClose = 0;.  
56a0: 20 20 20 20 69 66 28 20 28 31 20 3d 3d 20 73 74      if( (1 == st
56b0: 72 6c 65 6e 28 7a 46 69 6c 65 29 29 20 26 26 20  rlen(zFile)) && 
56c0: 28 27 2d 27 3d 3d 7a 46 69 6c 65 5b 30 5d 29 20  ('-'==zFile[0]) 
56d0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 20 3d 20  ){.        zF = 
56e0: 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 7d 65  stdout;.      }e
56f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46 20  lse{.        zF 
5700: 3d 20 66 6f 70 65 6e 28 20 7a 46 69 6c 65 2c 20  = fopen( zFile, 
5710: 22 77 22 20 29 3b 0a 20 20 20 20 20 20 20 20 64  "w" );.        d
5720: 6f 43 6c 6f 73 65 20 3d 20 7a 46 20 3f 20 31 20  oClose = zF ? 1 
5730: 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  : 0;.      }.   
5740: 20 20 20 69 66 28 20 21 20 7a 46 20 29 7b 0a 20     if( ! zF ){. 
5750: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61         fossil_fa
5760: 74 61 6c 28 22 77 69 6b 69 20 65 78 70 6f 72 74  tal("wiki export
5770: 20 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20   could not open 
5780: 6f 75 74 70 75 74 20 66 69 6c 65 20 66 6f 72 20  output file for 
5790: 77 72 69 74 69 6e 67 2e 22 29 3b 0a 20 20 20 20  writing.");.    
57a0: 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
57b0: 66 28 7a 46 2c 22 25 2e 2a 73 5c 6e 22 2c 20 69  f(zF,"%.*s\n", i
57c0: 2c 20 7a 42 6f 64 79 29 3b 0a 20 20 20 20 20 20  , zBody);.      
57d0: 69 66 28 20 64 6f 43 6c 6f 73 65 20 29 20 66 63  if( doClose ) fc
57e0: 6c 6f 73 65 28 7a 46 29 3b 0a 20 20 20 20 7d 65  lose(zF);.    }e
57f0: 6c 73 65 7b 0a 09 70 72 69 6e 74 66 28 22 25 2e  lse{..printf("%.
5800: 2a 73 5c 6e 22 2c 20 69 2c 20 7a 42 6f 64 79 29  *s\n", i, zBody)
5810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
5820: 72 6e 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66  rn;.  }else.  if
5830: 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76  ( strncmp(g.argv
5840: 5b 32 5d 2c 22 63 6f 6d 6d 69 74 22 2c 6e 29 3d  [2],"commit",n)=
5850: 3d 30 0a 20 20 20 20 20 20 7c 7c 20 73 74 72 6e  =0.      || strn
5860: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 63  cmp(g.argv[2],"c
5870: 72 65 61 74 65 22 2c 6e 29 3d 3d 30 20 29 7b 0a  reate",n)==0 ){.
5880: 20 20 20 20 63 68 61 72 20 2a 7a 50 61 67 65 4e      char *zPageN
5890: 61 6d 65 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6f  ame;.    Blob co
58a0: 6e 74 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 67  ntent;.    if( g
58b0: 2e 61 72 67 63 21 3d 34 20 26 26 20 67 2e 61 72  .argc!=4 && g.ar
58c0: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 75  gc!=5 ){.      u
58d0: 73 61 67 65 28 22 63 6f 6d 6d 69 74 20 50 41 47  sage("commit PAG
58e0: 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 22 29 3b 0a  ENAME ?FILE?");.
58f0: 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 67 65 4e      }.    zPageN
5900: 61 6d 65 20 3d 20 67 2e 61 72 67 76 5b 33 5d 3b  ame = g.argv[3];
5910: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 3d  .    if( g.argc=
5920: 3d 34 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  =4 ){.      blob
5930: 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 68 61 6e 6e  _read_from_chann
5940: 65 6c 28 26 63 6f 6e 74 65 6e 74 2c 20 73 74 64  el(&content, std
5950: 69 6e 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  in, -1);.    }el
5960: 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72  se{.      blob_r
5970: 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 63  ead_from_file(&c
5980: 6f 6e 74 65 6e 74 2c 20 67 2e 61 72 67 76 5b 34  ontent, g.argv[4
5990: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
59a0: 28 20 67 2e 61 72 67 76 5b 32 5d 5b 31 5d 3d 3d  ( g.argv[2][1]==
59b0: 27 72 27 20 29 7b 0a 20 20 20 20 20 20 77 69 6b  'r' ){.      wik
59c0: 69 5f 63 6d 64 5f 63 6f 6d 6d 69 74 28 7a 50 61  i_cmd_commit(zPa
59d0: 67 65 4e 61 6d 65 2c 20 31 2c 20 26 63 6f 6e 74  geName, 1, &cont
59e0: 65 6e 74 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  ent);.      prin
59f0: 74 66 28 22 43 72 65 61 74 65 64 20 6e 65 77 20  tf("Created new 
5a00: 77 69 6b 69 20 70 61 67 65 20 25 73 2e 5c 6e 22  wiki page %s.\n"
5a10: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  , zPageName);.  
5a20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
5a30: 69 6b 69 5f 63 6d 64 5f 63 6f 6d 6d 69 74 28 7a  iki_cmd_commit(z
5a40: 50 61 67 65 4e 61 6d 65 2c 20 30 2c 20 26 63 6f  PageName, 0, &co
5a50: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 70 72  ntent);.      pr
5a60: 69 6e 74 66 28 22 55 70 64 61 74 65 64 20 77 69  intf("Updated wi
5a70: 6b 69 20 70 61 67 65 20 25 73 2e 5c 6e 22 2c 20  ki page %s.\n", 
5a80: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20  zPageName);.    
5a90: 7d 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74  }.    blob_reset
5aa0: 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 65  (&content);.  }e
5ab0: 6c 73 65 0a 20 20 69 66 28 20 73 74 72 6e 63 6d  lse.  if( strncm
5ac0: 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 64 65 6c  p(g.argv[2],"del
5ad0: 65 74 65 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  ete",n)==0 ){.  
5ae0: 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 35 20    if( g.argc!=5 
5af0: 29 7b 0a 20 20 20 20 20 20 75 73 61 67 65 28 22  ){.      usage("
5b00: 64 65 6c 65 74 65 20 50 41 47 45 4e 41 4d 45 22  delete PAGENAME"
5b10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 73  );.    }.    fos
5b20: 73 69 6c 5f 66 61 74 61 6c 28 22 64 65 6c 65 74  sil_fatal("delet
5b30: 65 20 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d  e not yet implem
5b40: 65 6e 74 65 64 2e 22 29 3b 0a 20 20 7d 65 6c 73  ented.");.  }els
5b50: 65 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28  e.  if( strncmp(
5b60: 67 2e 61 72 67 76 5b 32 5d 2c 22 6c 69 73 74 22  g.argv[2],"list"
5b70: 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74  ,n)==0 ){.    St
5b80: 6d 74 20 71 3b 0a 20 20 20 20 64 62 5f 70 72 65  mt q;.    db_pre
5b90: 70 61 72 65 28 26 71 2c 20 0a 20 20 20 20 20 20  pare(&q, .      
5ba0: 22 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  "SELECT substr(t
5bb0: 61 67 6e 61 6d 65 2c 20 36 29 20 46 52 4f 4d 20  agname, 6) FROM 
5bc0: 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d  tag WHERE tagnam
5bd0: 65 20 47 4c 4f 42 20 27 77 69 6b 69 2d 2a 27 22  e GLOB 'wiki-*'"
5be0: 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  .      " ORDER B
5bf0: 59 20 6c 6f 77 65 72 28 74 61 67 6e 61 6d 65 29  Y lower(tagname)
5c00: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69  ".    );.    whi
5c10: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
5c20: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5c30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5c40: 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  *zName = db_colu
5c50: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a  mn_text(&q, 0);.
5c60: 20 20 20 20 20 20 70 72 69 6e 74 66 28 20 22 25        printf( "%
5c70: 73 5c 6e 22 2c 7a 4e 61 6d 65 29 3b 0a 20 20 20  s\n",zName);.   
5c80: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
5c90: 7a 65 28 26 71 29 3b 0a 20 20 7d 65 6c 73 65 0a  ze(&q);.  }else.
5ca0: 20 20 7b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6b    {.    goto wik
5cb0: 69 5f 63 6d 64 5f 75 73 61 67 65 3b 0a 20 20 7d  i_cmd_usage;.  }
5cc0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 77 69 6b 69  .  return;..wiki
5cd0: 5f 63 6d 64 5f 75 73 61 67 65 3a 0a 20 20 75 73  _cmd_usage:.  us
5ce0: 61 67 65 28 22 65 78 70 6f 72 74 7c 63 72 65 61  age("export|crea
5cf0: 74 65 7c 63 6f 6d 6d 69 74 7c 6c 69 73 74 20 2e  te|commit|list .
5d00: 2e 2e 22 29 3b 0a 7d 0a                          ..");.}.