Hex Artifact Content
Not logged in

Artifact c4f9be7f80da725f8e63b20eddff59543642415c:

File src/wiki.c part of check-in [3420e47b24] - Try again to get the redirection correct when redirecting from /home to /login. by drh on 2008-11-20 23:17:50.

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 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
09b0: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
09c0: 69 66 28 20 21 67 2e 6f 6b 52 64 57 69 6b 69 20  if( !g.okRdWiki 
09d0: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  ){.    cgi_redir
09e0: 65 63 74 66 28 22 25 73 2f 6c 6f 67 69 6e 3f 67  ectf("%s/login?g
09f0: 3d 2f 68 6f 6d 65 22 2c 20 67 2e 7a 42 61 73 65  =/home", g.zBase
0a00: 55 52 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  URL);.  }.  if( 
0a10: 7a 50 61 67 65 4e 61 6d 65 20 29 7b 0a 20 20 20  zPageName ){.   
0a20: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
0a30: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 20 20  dentials();.    
0a40: 67 2e 7a 45 78 74 72 61 20 3d 20 7a 50 61 67 65  g.zExtra = zPage
0a50: 4e 61 6d 65 3b 0a 20 20 20 20 63 67 69 5f 73 65  Name;.    cgi_se
0a60: 74 5f 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f  t_parameter_noco
0a70: 70 79 28 22 6e 61 6d 65 22 2c 20 67 2e 7a 45 78  py("name", g.zEx
0a80: 74 72 61 29 3b 0a 20 20 20 20 67 2e 61 72 67 76  tra);.    g.argv
0a90: 5b 31 5d 20 3d 20 22 68 6f 6d 65 22 3b 0a 20 20  [1] = "home";.  
0aa0: 20 20 77 69 6b 69 5f 70 61 67 65 28 29 3b 0a 20    wiki_page();. 
0ab0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
0ac0: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 48   style_header("H
0ad0: 6f 6d 65 22 29 3b 0a 20 20 40 20 3c 70 3e 54 68  ome");.  @ <p>Th
0ae0: 69 73 20 69 73 20 61 20 73 74 75 62 20 68 6f 6d  is is a stub hom
0af0: 65 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 70  e-page for the p
0b00: 72 6f 6a 65 63 74 2e 0a 20 20 40 20 54 6f 20 66  roject..  @ To f
0b10: 69 6c 6c 20 69 6e 20 74 68 69 73 20 70 61 67 65  ill in this page
0b20: 2c 20 66 69 72 73 74 20 67 6f 20 74 6f 0a 20 20  , first go to.  
0b30: 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  @ <a href="%s(g.
0b40: 7a 42 61 73 65 55 52 4c 29 2f 73 65 74 75 70 5f  zBaseURL)/setup_
0b50: 63 6f 6e 66 69 67 22 3e 73 65 74 75 70 2f 63 6f  config">setup/co
0b60: 6e 66 69 67 3c 2f 61 3e 0a 20 20 40 20 61 6e 64  nfig</a>.  @ and
0b70: 20 65 73 74 61 62 6c 69 73 68 20 61 20 22 50 72   establish a "Pr
0b80: 6f 6a 65 63 74 20 4e 61 6d 65 22 2e 20 20 54 68  oject Name".  Th
0b90: 65 6e 20 63 72 65 61 74 65 20 61 0a 20 20 40 20  en create a.  @ 
0ba0: 77 69 6b 69 20 70 61 67 65 20 77 69 74 68 20 74  wiki page with t
0bb0: 68 61 74 20 6e 61 6d 65 2e 20 20 54 68 65 20 63  hat name.  The c
0bc0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 77  ontent of that w
0bd0: 69 6b 69 20 70 61 67 65 0a 20 20 40 20 77 69 6c  iki page.  @ wil
0be0: 6c 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 69  l be displayed i
0bf0: 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 20  n place of this 
0c00: 6d 65 73 73 61 67 65 2e 0a 20 20 73 74 79 6c 65  message..  style
0c10: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
0c20: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
0c30: 69 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  if the given pag
0c40: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
0c50: 65 20 6f 66 20 74 68 65 20 73 61 6e 64 62 6f 78  e of the sandbox
0c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
0c70: 73 5f 73 61 6e 64 62 6f 78 28 63 6f 6e 73 74 20  s_sandbox(const 
0c80: 63 68 61 72 20 2a 7a 50 61 67 65 6e 61 6d 65 29  char *zPagename)
0c90: 7b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 61  {.  return strca
0ca0: 73 65 63 6d 70 28 7a 50 61 67 65 6e 61 6d 65 2c  secmp(zPagename,
0cb0: 22 73 61 6e 64 62 6f 78 22 29 3d 3d 30 20 7c 7c  "sandbox")==0 ||
0cc0: 0a 20 20 20 20 20 20 20 20 20 73 74 72 63 61 73  .         strcas
0cd0: 65 63 6d 70 28 7a 50 61 67 65 6e 61 6d 65 2c 22  ecmp(zPagename,"
0ce0: 73 61 6e 64 20 62 6f 78 22 29 3d 3d 30 3b 0a 7d  sand box")==0;.}
0cf0: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
0d00: 20 77 69 6b 69 0a 2a 2a 20 55 52 4c 3a 20 2f 77   wiki.** URL: /w
0d10: 69 6b 69 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d  iki?name=PAGENAM
0d20: 45 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 70  E.*/.void wiki_p
0d30: 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  age(void){.  cha
0d40: 72 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74 20 72  r *zTag;.  int r
0d50: 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  id = 0;.  int is
0d60: 53 61 6e 64 62 6f 78 3b 0a 20 20 42 6c 6f 62 20  Sandbox;.  Blob 
0d70: 77 69 6b 69 3b 0a 20 20 4d 61 6e 69 66 65 73 74  wiki;.  Manifest
0d80: 20 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   m;.  const char
0d90: 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 63   *zPageName;.  c
0da0: 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65 4e 61  har *zHtmlPageNa
0db0: 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6f 64  me;.  char *zBod
0dc0: 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22  y = mprintf("%s"
0dd0: 2c 22 3c 69 3e 45 6d 70 74 79 20 50 61 67 65 3c  ,"<i>Empty Page<
0de0: 2f 69 3e 22 29 3b 0a 20 20 69 6e 74 20 69 73 48  /i>");.  int isH
0df0: 6f 6d 65 20 3d 20 67 2e 61 72 67 76 5b 31 5d 5b  ome = g.argv[1][
0e00: 30 5d 3d 3d 27 68 27 3b 0a 0a 20 20 6c 6f 67 69  0]=='h';..  logi
0e10: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
0e20: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
0e30: 6f 6b 52 64 57 69 6b 69 20 29 7b 20 6c 6f 67 69  okRdWiki ){ logi
0e40: 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75  n_needed(); retu
0e50: 72 6e 3b 20 7d 0a 20 20 7a 50 61 67 65 4e 61 6d  rn; }.  zPageNam
0e60: 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20  e = P("name");. 
0e70: 20 69 66 28 20 7a 50 61 67 65 4e 61 6d 65 3d 3d   if( zPageName==
0e80: 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 68  0 ){.    style_h
0e90: 65 61 64 65 72 28 22 57 69 6b 69 22 29 3b 0a 20  eader("Wiki");. 
0ea0: 20 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 7b 20     @ <ul>.    { 
0eb0: 63 68 61 72 20 2a 7a 48 6f 6d 65 50 61 67 65 4e  char *zHomePageN
0ec0: 61 6d 65 20 3d 20 64 62 5f 67 65 74 28 22 70 72  ame = db_get("pr
0ed0: 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 30 29 3b 0a  oject-name",0);.
0ee0: 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 50        if( zHomeP
0ef0: 61 67 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ageName ){.     
0f00: 20 20 20 40 20 3c 6c 69 3e 20 3c 61 20 68 72 65     @ <li> <a hre
0f10: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
0f20: 29 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25 73 28 7a  )/wiki?name=%s(z
0f30: 48 6f 6d 65 50 61 67 65 4e 61 6d 65 29 22 3e 0a  HomePageName)">.
0f40: 20 20 20 20 20 20 20 20 40 20 20 20 20 20 20 25          @      %
0f50: 73 28 7a 48 6f 6d 65 50 61 67 65 4e 61 6d 65 29  s(zHomePageName)
0f60: 3c 2f 61 3e 20 77 69 6b 69 20 68 6f 6d 65 20 70  </a> wiki home p
0f70: 61 67 65 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20  age.</li>.      
0f80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 6c  }.    }.    @ <l
0f90: 69 3e 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67  i> <a href="%s(g
0fa0: 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c  .zBaseURL)/timel
0fb0: 69 6e 65 3f 79 3d 77 22 3e 52 65 63 65 6e 74 20  ine?y=w">Recent 
0fc0: 63 68 61 6e 67 65 73 3c 2f 61 3e 20 74 6f 20 77  changes</a> to w
0fd0: 69 6b 69 0a 20 20 20 20 40 20 20 20 20 20 20 70  iki.    @      p
0fe0: 61 67 65 73 2e 20 3c 2f 6c 69 3e 0a 20 20 20 20  ages. </li>.    
0ff0: 40 20 3c 6c 69 3e 20 3c 61 20 68 72 65 66 3d 22  @ <li> <a href="
1000: 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77  %s(g.zBaseURL)/w
1010: 69 6b 69 5f 72 75 6c 65 73 22 3e 46 6f 72 6d 61  iki_rules">Forma
1020: 74 74 69 6e 67 20 72 75 6c 65 73 3c 2f 61 3e 20  tting rules</a> 
1030: 66 6f 72 20 0a 20 20 20 20 40 20 20 20 20 20 20  for .    @      
1040: 77 69 6b 69 2e 3c 2f 6c 69 3e 0a 20 20 20 20 40  wiki.</li>.    @
1050: 20 3c 6c 69 3e 20 55 73 65 20 74 68 65 20 3c 61   <li> Use the <a
1060: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73   href="%s(g.zBas
1070: 65 55 52 4c 29 2f 77 69 6b 69 3f 6e 61 6d 65 3d  eURL)/wiki?name=
1080: 53 61 6e 64 62 6f 78 22 3e 53 61 6e 64 62 6f 78  Sandbox">Sandbox
1090: 3c 2f 61 3e 0a 20 20 20 20 40 20 20 20 20 20 20  </a>.    @      
10a0: 74 6f 20 65 78 70 65 72 69 6d 65 6e 74 2e 3c 2f  to experiment.</
10b0: 6c 69 3e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 3c  li>.    @ <li> <
10c0: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
10d0: 73 65 55 52 4c 29 2f 77 63 6f 6e 74 65 6e 74 22  seURL)/wcontent"
10e0: 3e 4c 69 73 74 20 6f 66 20 41 6c 6c 20 57 69 6b  >List of All Wik
10f0: 69 20 50 61 67 65 73 3c 2f 61 3e 0a 20 20 20 20  i Pages</a>.    
1100: 40 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65  @      available
1110: 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 2e   on this server.
1120: 3c 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 2f 75 6c  </li>.    @ </ul
1130: 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  >.    style_foot
1140: 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  er();.    return
1150: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  ;.  }.  if( chec
1160: 6b 5f 6e 61 6d 65 28 7a 50 61 67 65 4e 61 6d 65  k_name(zPageName
1170: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 73  ) ) return;.  is
1180: 53 61 6e 64 62 6f 78 20 3d 20 69 73 5f 73 61 6e  Sandbox = is_san
1190: 64 62 6f 78 28 7a 50 61 67 65 4e 61 6d 65 29 3b  dbox(zPageName);
11a0: 0a 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f 78  .  if( isSandbox
11b0: 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20 3d 20   ){.    zBody = 
11c0: 64 62 5f 67 65 74 28 22 73 61 6e 64 62 6f 78 22  db_get("sandbox"
11d0: 2c 7a 42 6f 64 79 29 3b 0a 20 20 7d 65 6c 73 65  ,zBody);.  }else
11e0: 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d 70 72  {.    zTag = mpr
11f0: 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22 2c 20  intf("wiki-%s", 
1200: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20  zPageName);.    
1210: 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20  rid = db_int(0, 
1220: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72  .      "SELECT r
1230: 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22  id FROM tagxref"
1240: 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74  .      " WHERE t
1250: 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74 61 67  agid=(SELECT tag
1260: 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52  id FROM tag WHER
1270: 45 20 74 61 67 6e 61 6d 65 3d 25 51 29 22 0a 20  E tagname=%Q)". 
1280: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
1290: 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 54 61  mtime DESC", zTa
12a0: 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 72 65  g.    );.    fre
12b0: 65 28 7a 54 61 67 29 3b 0a 20 20 20 20 6d 65 6d  e(zTag);.    mem
12c0: 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f  set(&m, 0, sizeo
12d0: 66 28 6d 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  f(m));.    blob_
12e0: 7a 65 72 6f 28 26 6d 2e 63 6f 6e 74 65 6e 74 29  zero(&m.content)
12f0: 3b 0a 20 20 20 20 69 66 28 20 72 69 64 20 29 7b  ;.    if( rid ){
1300: 0a 20 20 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74  .      Blob cont
1310: 65 6e 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 65  ent;.      conte
1320: 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e  nt_get(rid, &con
1330: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 61 6e  tent);.      man
1340: 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d 2c 20  ifest_parse(&m, 
1350: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  &content);.     
1360: 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 54   if( m.type==CFT
1370: 59 50 45 5f 57 49 4b 49 20 29 7b 0a 20 20 20 20  YPE_WIKI ){.    
1380: 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d 2e 7a 57      zBody = m.zW
1390: 69 6b 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  iki;.      }.   
13a0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73   }.  }.  if( !is
13b0: 48 6f 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Home ){.    if( 
13c0: 69 73 53 61 6e 64 62 6f 78 20 7c 7c 20 28 72 69  isSandbox || (ri
13d0: 64 20 26 26 20 67 2e 6f 6b 57 72 57 69 6b 69 29  d && g.okWrWiki)
13e0: 20 7c 7c 20 28 21 72 69 64 20 26 26 20 67 2e 6f   || (!rid && g.o
13f0: 6b 4e 65 77 57 69 6b 69 29 20 29 7b 0a 20 20 20  kNewWiki) ){.   
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 45 64 69 74 22 2c  _element("Edit",
1420: 20 22 45 64 69 74 20 57 69 6b 69 20 50 61 67 65   "Edit Wiki Page
1430: 22 2c 20 22 25 73 2f 77 69 6b 69 65 64 69 74 3f  ", "%s/wikiedit?
1440: 6e 61 6d 65 3d 25 54 22 2c 0a 20 20 20 20 20 20  name=%T",.      
1450: 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 50 61       g.zTop, zPa
1460: 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  geName);.    }. 
1470: 20 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f 78     if( isSandbox
1480: 20 7c 7c 20 28 72 69 64 20 26 26 20 67 2e 6f 6b   || (rid && g.ok
1490: 41 70 6e 64 57 69 6b 69 29 20 29 7b 0a 20 20 20  ApndWiki) ){.   
14a0: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
14b0: 5f 65 6c 65 6d 65 6e 74 28 22 41 70 70 65 6e 64  _element("Append
14c0: 22 2c 20 22 41 64 64 20 41 20 43 6f 6d 6d 65 6e  ", "Add A Commen
14d0: 74 22 2c 20 22 25 73 2f 77 69 6b 69 61 70 70 65  t", "%s/wikiappe
14e0: 6e 64 3f 6e 61 6d 65 3d 25 54 22 2c 0a 20 20 20  nd?name=%T",.   
14f0: 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20          g.zTop, 
1500: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20  zPageName);.    
1510: 7d 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 6e  }.    if( !isSan
1520: 64 62 6f 78 20 26 26 20 67 2e 6f 6b 48 69 73 74  dbox && g.okHist
1530: 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 74 79  ory ){.      sty
1540: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
1550: 6e 74 28 22 48 69 73 74 6f 72 79 22 2c 20 22 48  nt("History", "H
1560: 69 73 74 6f 72 79 22 2c 20 22 25 73 2f 77 68 69  istory", "%s/whi
1570: 73 74 6f 72 79 3f 6e 61 6d 65 3d 25 54 22 2c 0a  story?name=%T",.
1580: 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f             g.zTo
1590: 70 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  p, zPageName);. 
15a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 74 6d 6c     }.  }.  zHtml
15b0: 50 61 67 65 4e 61 6d 65 20 3d 20 6d 70 72 69 6e  PageName = mprin
15c0: 74 66 28 22 25 68 22 2c 20 7a 50 61 67 65 4e 61  tf("%h", zPageNa
15d0: 6d 65 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61  me);.  style_hea
15e0: 64 65 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61 6d  der(zHtmlPageNam
15f0: 65 29 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28  e);.  blob_init(
1600: 26 77 69 6b 69 2c 20 7a 42 6f 64 79 2c 20 2d 31  &wiki, zBody, -1
1610: 29 3b 0a 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72  );.  wiki_conver
1620: 74 28 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a  t(&wiki, 0, 0);.
1630: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77 69    blob_reset(&wi
1640: 6b 69 29 3b 0a 20 20 69 66 28 20 21 69 73 53 61  ki);.  if( !isSa
1650: 6e 64 62 6f 78 20 29 7b 0a 20 20 20 20 6d 61 6e  ndbox ){.    man
1660: 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b  ifest_clear(&m);
1670: 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  .  }.  style_foo
1680: 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
1690: 57 45 42 50 41 47 45 3a 20 77 69 6b 69 65 64 69  WEBPAGE: wikiedi
16a0: 74 0a 2a 2a 20 55 52 4c 3a 20 2f 77 69 6b 69 65  t.** URL: /wikie
16b0: 64 69 74 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d  dit?name=PAGENAM
16c0: 45 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 65 64  E.*/.void wikied
16d0: 69 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  it_page(void){. 
16e0: 20 63 68 61 72 20 2a 7a 54 61 67 3b 0a 20 20 69   char *zTag;.  i
16f0: 6e 74 20 72 69 64 20 3d 20 30 3b 0a 20 20 69 6e  nt rid = 0;.  in
1700: 74 20 69 73 53 61 6e 64 62 6f 78 3b 0a 20 20 42  t isSandbox;.  B
1710: 6c 6f 62 20 77 69 6b 69 3b 0a 20 20 4d 61 6e 69  lob wiki;.  Mani
1720: 66 65 73 74 20 6d 3b 0a 20 20 63 6f 6e 73 74 20  fest m;.  const 
1730: 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b  char *zPageName;
1740: 0a 20 20 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61  .  char *zHtmlPa
1750: 67 65 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  geName;.  int n;
1760: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1770: 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6f 64 79 20  ;.  char *zBody 
1780: 3d 20 28 63 68 61 72 2a 29 50 28 22 77 22 29 3b  = (char*)P("w");
1790: 0a 0a 20 20 69 66 28 20 7a 42 6f 64 79 20 29 7b  ..  if( zBody ){
17a0: 0a 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d 70 72  .    zBody = mpr
17b0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 42 6f 64 79  intf("%s", zBody
17c0: 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 69 6e 5f 63  );.  }.  login_c
17d0: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
17e0: 28 29 3b 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20  ();.  zPageName 
17f0: 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22 22 29 3b  = PD("name","");
1800: 0a 20 20 69 66 28 20 63 68 65 63 6b 5f 6e 61 6d  .  if( check_nam
1810: 65 28 7a 50 61 67 65 4e 61 6d 65 29 20 29 20 72  e(zPageName) ) r
1820: 65 74 75 72 6e 3b 0a 20 20 69 73 53 61 6e 64 62  eturn;.  isSandb
1830: 6f 78 20 3d 20 69 73 5f 73 61 6e 64 62 6f 78 28  ox = is_sandbox(
1840: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66  zPageName);.  if
1850: 28 20 69 73 53 61 6e 64 62 6f 78 20 29 7b 0a 20  ( isSandbox ){. 
1860: 20 20 20 69 66 28 20 7a 42 6f 64 79 3d 3d 30 20     if( zBody==0 
1870: 29 7b 0a 20 20 20 20 20 20 7a 42 6f 64 79 20 3d  ){.      zBody =
1880: 20 64 62 5f 67 65 74 28 22 73 61 6e 64 62 6f 78   db_get("sandbox
1890: 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
18a0: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 61 67 20 3d  else{.    zTag =
18b0: 20 6d 70 72 69 6e 74 66 28 22 77 69 6b 69 2d 25   mprintf("wiki-%
18c0: 73 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a  s", zPageName);.
18d0: 20 20 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74      rid = db_int
18e0: 28 30 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45  (0, .      "SELE
18f0: 43 54 20 72 69 64 20 46 52 4f 4d 20 74 61 67 78  CT rid FROM tagx
1900: 72 65 66 22 0a 20 20 20 20 20 20 22 20 57 48 45  ref".      " WHE
1910: 52 45 20 74 61 67 69 64 3d 28 53 45 4c 45 43 54  RE tagid=(SELECT
1920: 20 74 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20   tagid FROM tag 
1930: 57 48 45 52 45 20 74 61 67 6e 61 6d 65 3d 25 51  WHERE tagname=%Q
1940: 29 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52  )".      " ORDER
1950: 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43 22 2c   BY mtime DESC",
1960: 20 7a 54 61 67 0a 20 20 20 20 29 3b 0a 20 20 20   zTag.    );.   
1970: 20 66 72 65 65 28 7a 54 61 67 29 3b 0a 20 20 20   free(zTag);.   
1980: 20 69 66 28 20 28 72 69 64 20 26 26 20 21 67 2e   if( (rid && !g.
1990: 6f 6b 57 72 57 69 6b 69 29 20 7c 7c 20 28 21 72  okWrWiki) || (!r
19a0: 69 64 20 26 26 20 21 67 2e 6f 6b 4e 65 77 57 69  id && !g.okNewWi
19b0: 6b 69 29 20 29 7b 0a 20 20 20 20 20 20 6c 6f 67  ki) ){.      log
19c0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 20  in_needed();.   
19d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
19e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20  .    memset(&m, 
19f0: 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
1a00: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 2e     blob_zero(&m.
1a10: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  content);.    if
1a20: 28 20 72 69 64 20 26 26 20 7a 42 6f 64 79 3d 3d  ( rid && zBody==
1a30: 30 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20  0 ){.      Blob 
1a40: 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 63  content;.      c
1a50: 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20  ontent_get(rid, 
1a60: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  &content);.     
1a70: 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28   manifest_parse(
1a80: 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20  &m, &content);. 
1a90: 20 20 20 20 20 69 66 28 20 6d 2e 74 79 70 65 3d       if( m.type=
1aa0: 3d 43 46 54 59 50 45 5f 57 49 4b 49 20 29 7b 0a  =CFTYPE_WIKI ){.
1ab0: 20 20 20 20 20 20 20 20 7a 42 6f 64 79 20 3d 20          zBody = 
1ac0: 6d 2e 7a 57 69 6b 69 3b 0a 20 20 20 20 20 20 7d  m.zWiki;.      }
1ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1ae0: 20 50 28 22 73 75 62 6d 69 74 22 29 21 3d 30 20   P("submit")!=0 
1af0: 26 26 20 7a 42 6f 64 79 21 3d 30 20 29 7b 0a 20  && zBody!=0 ){. 
1b00: 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a     char *zDate;.
1b10: 20 20 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a      Blob cksum;.
1b20: 20 20 20 20 69 6e 74 20 6e 72 69 64 3b 0a 20 20      int nrid;.  
1b30: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b    blob_zero(&wik
1b40: 69 29 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e  i);.    db_begin
1b50: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  _transaction();.
1b60: 20 20 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f      if( isSandbo
1b70: 78 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 73 65  x ){.      db_se
1b80: 74 28 22 73 61 6e 64 62 6f 78 22 2c 7a 42 6f 64  t("sandbox",zBod
1b90: 79 2c 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  y,0);.    }else{
1ba0: 0a 20 20 20 20 20 20 6c 6f 67 69 6e 5f 76 65 72  .      login_ver
1bb0: 69 66 79 5f 63 73 72 66 5f 73 65 63 72 65 74 28  ify_csrf_secret(
1bc0: 29 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 20 3d  );.      zDate =
1bd0: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
1be0: 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f  ECT datetime('no
1bf0: 77 27 29 22 29 3b 0a 20 20 20 20 20 20 7a 44 61  w')");.      zDa
1c00: 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20 20  te[10] = 'T';.  
1c10: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
1c20: 28 26 77 69 6b 69 2c 20 22 44 20 25 73 5c 6e 22  (&wiki, "D %s\n"
1c30: 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20  , zDate);.      
1c40: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 20  free(zDate);.   
1c50: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
1c60: 26 77 69 6b 69 2c 20 22 4c 20 25 46 5c 6e 22 2c  &wiki, "L %F\n",
1c70: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20   zPageName);.   
1c80: 20 20 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20     if( rid ){.  
1c90: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69        char *zUui
1ca0: 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  d = db_text(0, "
1cb0: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
1cc0: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
1cd0: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 20  %d", rid);.     
1ce0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
1cf0: 26 77 69 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c  &wiki, "P %s\n",
1d00: 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20 20   zUuid);.       
1d10: 20 66 72 65 65 28 7a 55 75 69 64 29 3b 0a 20 20   free(zUuid);.  
1d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d30: 67 2e 7a 4c 6f 67 69 6e 20 29 7b 0a 20 20 20 20  g.zLogin ){.    
1d40: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
1d50: 28 26 77 69 6b 69 2c 20 22 55 20 25 46 5c 6e 22  (&wiki, "U %F\n"
1d60: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20  , g.zLogin);.   
1d70: 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 5f     }.      blob_
1d80: 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22  appendf(&wiki, "
1d90: 57 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 73 74 72  W %d\n%s\n", str
1da0: 6c 65 6e 28 7a 42 6f 64 79 29 2c 20 7a 42 6f 64  len(zBody), zBod
1db0: 79 29 3b 0a 20 20 20 20 20 20 6d 64 35 73 75 6d  y);.      md5sum
1dc0: 5f 62 6c 6f 62 28 26 77 69 6b 69 2c 20 26 63 6b  _blob(&wiki, &ck
1dd0: 73 75 6d 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  sum);.      blob
1de0: 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20  _appendf(&wiki, 
1df0: 22 5a 20 25 62 5c 6e 22 2c 20 26 63 6b 73 75 6d  "Z %b\n", &cksum
1e00: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65  );.      blob_re
1e10: 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20 20 20  set(&cksum);.   
1e20: 20 20 20 6e 72 69 64 20 3d 20 63 6f 6e 74 65 6e     nrid = conten
1e30: 74 5f 70 75 74 28 26 77 69 6b 69 2c 20 30 2c 20  t_put(&wiki, 0, 
1e40: 30 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c  0);.      db_mul
1e50: 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20  ti_exec("INSERT 
1e60: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 75  OR IGNORE INTO u
1e70: 6e 73 65 6e 74 20 56 41 4c 55 45 53 28 25 64 29  nsent VALUES(%d)
1e80: 22 2c 20 6e 72 69 64 29 3b 0a 20 20 20 20 20 20  ", nrid);.      
1e90: 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c 69  manifest_crossli
1ea0: 6e 6b 28 6e 72 69 64 2c 20 26 77 69 6b 69 29 3b  nk(nrid, &wiki);
1eb0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  .      blob_rese
1ec0: 74 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 20 20  t(&wiki);.      
1ed0: 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 79 28  content_deltify(
1ee0: 72 69 64 2c 20 6e 72 69 64 2c 20 30 29 3b 0a 20  rid, nrid, 0);. 
1ef0: 20 20 20 7d 0a 20 20 20 20 64 62 5f 65 6e 64 5f     }.    db_end_
1f00: 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a  transaction(0);.
1f10: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
1f20: 66 28 22 77 69 6b 69 3f 6e 61 6d 65 3d 25 54 22  f("wiki?name=%T"
1f30: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  , zPageName);.  
1f40: 7d 0a 20 20 69 66 28 20 50 28 22 63 61 6e 63 65  }.  if( P("cance
1f50: 6c 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 67  l")!=0 ){.    cg
1f60: 69 5f 72 65 64 69 72 65 63 74 66 28 22 77 69 6b  i_redirectf("wik
1f70: 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50 61 67  i?name=%T", zPag
1f80: 65 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  eName);.    retu
1f90: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42  rn;.  }.  if( zB
1fa0: 6f 64 79 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 42  ody==0 ){.    zB
1fb0: 6f 64 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c  ody = mprintf("<
1fc0: 69 3e 45 6d 70 74 79 20 50 61 67 65 3c 2f 69 3e  i>Empty Page</i>
1fd0: 22 29 3b 0a 20 20 7d 0a 20 20 7a 48 74 6d 6c 50  ");.  }.  zHtmlP
1fe0: 61 67 65 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74  ageName = mprint
1ff0: 66 28 22 45 64 69 74 3a 20 25 68 22 2c 20 7a 50  f("Edit: %h", zP
2000: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 73 74 79 6c  ageName);.  styl
2010: 65 5f 68 65 61 64 65 72 28 7a 48 74 6d 6c 50 61  e_header(zHtmlPa
2020: 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 50  geName);.  if( P
2030: 28 22 70 72 65 76 69 65 77 22 29 21 3d 30 20 29  ("preview")!=0 )
2040: 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  {.    blob_zero(
2050: 26 77 69 6b 69 29 3b 0a 20 20 20 20 62 6c 6f 62  &wiki);.    blob
2060: 5f 61 70 70 65 6e 64 28 26 77 69 6b 69 2c 20 7a  _append(&wiki, z
2070: 42 6f 64 79 2c 20 2d 31 29 3b 0a 20 20 20 20 40  Body, -1);.    @
2080: 20 50 72 65 76 69 65 77 3a 3c 68 72 3e 0a 20 20   Preview:<hr>.  
2090: 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26    wiki_convert(&
20a0: 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20  wiki, 0, 0);.   
20b0: 20 40 20 3c 68 72 3e 0a 20 20 20 20 62 6c 6f 62   @ <hr>.    blob
20c0: 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b 0a 20  _reset(&wiki);. 
20d0: 20 7d 0a 20 20 66 6f 72 28 6e 3d 32 2c 20 7a 3d   }.  for(n=2, z=
20e0: 7a 42 6f 64 79 3b 20 7a 5b 30 5d 3b 20 7a 2b 2b  zBody; z[0]; z++
20f0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  ){.    if( z[0]=
2100: 3d 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d  ='\n' ) n++;.  }
2110: 0a 20 20 69 66 28 20 6e 3c 32 30 20 29 20 6e 20  .  if( n<20 ) n 
2120: 3d 20 32 30 3b 0a 20 20 69 66 28 20 6e 3e 34 30  = 20;.  if( n>40
2130: 20 29 20 6e 20 3d 20 34 30 3b 0a 20 20 40 20 3c   ) n = 40;.  @ <
2140: 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53  form method="POS
2150: 54 22 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e  T" action="%s(g.
2160: 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b 69 65 64  zBaseURL)/wikied
2170: 69 74 22 3e 0a 20 20 6c 6f 67 69 6e 5f 69 6e 73  it">.  login_ins
2180: 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65 74 28  ert_csrf_secret(
2190: 29 3b 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  );.  @ <input ty
21a0: 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65  pe="hidden" name
21b0: 3d 22 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25  ="name" value="%
21c0: 68 28 7a 50 61 67 65 4e 61 6d 65 29 22 3e 0a 20  h(zPageName)">. 
21d0: 20 40 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d   @ <textarea nam
21e0: 65 3d 22 77 22 20 63 6c 61 73 73 3d 22 77 69 6b  e="w" class="wik
21f0: 69 65 64 69 74 22 20 63 6f 6c 73 3d 22 38 30 22  iedit" cols="80"
2200: 20 0a 20 20 40 20 20 72 6f 77 73 3d 22 25 64 28   .  @  rows="%d(
2210: 6e 29 22 20 77 72 61 70 3d 22 76 69 72 74 75 61  n)" wrap="virtua
2220: 6c 22 3e 25 68 28 7a 42 6f 64 79 29 3c 2f 74 65  l">%h(zBody)</te
2230: 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 62 72 3e  xtarea>.  @ <br>
2240: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
2250: 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22  ="submit" name="
2260: 70 72 65 76 69 65 77 22 20 76 61 6c 75 65 3d 22  preview" value="
2270: 50 72 65 76 69 65 77 20 59 6f 75 72 20 43 68 61  Preview Your Cha
2280: 6e 67 65 73 22 3e 0a 20 20 40 20 3c 69 6e 70 75  nges">.  @ <inpu
2290: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20  t type="submit" 
22a0: 6e 61 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61  name="submit" va
22b0: 6c 75 65 3d 22 41 70 70 6c 79 20 54 68 65 73 65  lue="Apply These
22c0: 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c   Changes">.  @ <
22d0: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
22e0: 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c  it" name="cancel
22f0: 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22  " value="Cancel"
2300: 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20  >.  @ </form>.  
2310: 69 66 28 20 21 69 73 53 61 6e 64 62 6f 78 20 29  if( !isSandbox )
2320: 7b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63  {.    manifest_c
2330: 6c 65 61 72 28 26 6d 29 3b 0a 20 20 7d 0a 20 20  lear(&m);.  }.  
2340: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
2350: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2360: 74 68 65 20 77 69 6b 69 20 74 65 78 74 20 66 6f  the wiki text fo
2370: 72 20 61 6e 20 72 65 6d 61 72 6b 20 74 6f 20 74  r an remark to t
2380: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69  he end of the gi
2390: 76 65 6e 20 42 4c 4f 42 2e 0a 2a 2f 0a 73 74 61  ven BLOB..*/.sta
23a0: 74 69 63 20 76 6f 69 64 20 61 70 70 65 6e 64 52  tic void appendR
23b0: 65 6d 61 72 6b 28 42 6c 6f 62 20 2a 70 29 7b 0a  emark(Blob *p){.
23c0: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20    char *zDate;. 
23d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
23e0: 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er;.  const char
23f0: 20 2a 7a 52 65 6d 61 72 6b 3b 0a 20 20 63 68 61   *zRemark;.  cha
2400: 72 20 2a 7a 49 64 3b 0a 0a 20 20 7a 44 61 74 65  r *zId;..  zDate
2410: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
2420: 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 27  ELECT datetime('
2430: 6e 6f 77 27 29 22 29 3b 0a 20 20 7a 49 64 20 3d  now')");.  zId =
2440: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
2450: 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28 72 61  ECT lower(hex(ra
2460: 6e 64 6f 6d 62 6c 6f 62 28 38 29 29 29 22 29 3b  ndomblob(8)))");
2470: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
2480: 70 2c 20 22 5c 6e 5c 6e 3c 68 72 3e 3c 64 69 76  p, "\n\n<hr><div
2490: 20 69 64 3d 5c 22 25 73 5c 22 3e 3c 69 3e 4f 6e   id=\"%s\"><i>On
24a0: 20 25 73 20 55 54 43 20 25 68 22 2c 20 0a 20 20   %s UTC %h", .  
24b0: 20 20 7a 49 64 2c 20 7a 44 61 74 65 2c 20 67 2e    zId, zDate, g.
24c0: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 66 72 65 65 28  zLogin);.  free(
24d0: 7a 44 61 74 65 29 3b 0a 20 20 7a 55 73 65 72 20  zDate);.  zUser 
24e0: 3d 20 50 44 28 22 75 22 2c 67 2e 7a 4c 6f 67 69  = PD("u",g.zLogi
24f0: 6e 29 3b 0a 20 20 69 66 28 20 7a 55 73 65 72 5b  n);.  if( zUser[
2500: 30 5d 20 26 26 20 73 74 72 63 6d 70 28 7a 55 73  0] && strcmp(zUs
2510: 65 72 2c 67 2e 7a 4c 6f 67 69 6e 29 20 29 7b 0a  er,g.zLogin) ){.
2520: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
2530: 28 70 2c 20 22 20 28 63 6c 61 69 6d 69 6e 67 20  (p, " (claiming 
2540: 74 6f 20 62 65 20 25 68 29 22 2c 20 7a 55 73 65  to be %h)", zUse
2550: 72 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 6d 61 72  r);.  }.  zRemar
2560: 6b 20 3d 20 50 44 28 22 72 22 2c 22 22 29 3b 0a  k = PD("r","");.
2570: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
2580: 2c 20 22 20 61 64 64 65 64 3a 3c 2f 69 3e 3c 62  , " added:</i><b
2590: 72 20 2f 3e 5c 6e 25 73 3c 2f 64 69 76 20 69 64  r />\n%s</div id
25a0: 3d 5c 22 25 73 5c 22 3e 22 2c 20 7a 52 65 6d 61  =\"%s\">", zRema
25b0: 72 6b 2c 20 7a 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a  rk, zId);.}../*.
25c0: 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 69 6b 69  ** WEBPAGE: wiki
25d0: 61 70 70 65 6e 64 0a 2a 2a 20 55 52 4c 3a 20 2f  append.** URL: /
25e0: 77 69 6b 69 61 70 70 65 6e 64 3f 6e 61 6d 65 3d  wikiappend?name=
25f0: 50 41 47 45 4e 41 4d 45 0a 2a 2f 0a 76 6f 69 64  PAGENAME.*/.void
2600: 20 77 69 6b 69 61 70 70 65 6e 64 5f 70 61 67 65   wikiappend_page
2610: 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  (void){.  char *
2620: 7a 54 61 67 3b 0a 20 20 69 6e 74 20 72 69 64 20  zTag;.  int rid 
2630: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53 61 6e  = 0;.  int isSan
2640: 64 62 6f 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68  dbox;.  const ch
2650: 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20  ar *zPageName;. 
2660: 20 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65   char *zHtmlPage
2670: 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Name;.  const ch
2680: 61 72 20 2a 7a 55 73 65 72 3b 0a 0a 20 20 6c 6f  ar *zUser;..  lo
2690: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
26a0: 74 69 61 6c 73 28 29 3b 0a 20 20 7a 50 61 67 65  tials();.  zPage
26b0: 4e 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65 22  Name = PD("name"
26c0: 2c 22 22 29 3b 0a 20 20 69 66 28 20 63 68 65 63  ,"");.  if( chec
26d0: 6b 5f 6e 61 6d 65 28 7a 50 61 67 65 4e 61 6d 65  k_name(zPageName
26e0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 73  ) ) return;.  is
26f0: 53 61 6e 64 62 6f 78 20 3d 20 69 73 5f 73 61 6e  Sandbox = is_san
2700: 64 62 6f 78 28 7a 50 61 67 65 4e 61 6d 65 29 3b  dbox(zPageName);
2710: 0a 20 20 69 66 28 20 21 69 73 53 61 6e 64 62 6f  .  if( !isSandbo
2720: 78 20 29 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20  x ){.    zTag = 
2730: 6d 70 72 69 6e 74 66 28 22 77 69 6b 69 2d 25 73  mprintf("wiki-%s
2740: 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  ", zPageName);. 
2750: 20 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28     rid = db_int(
2760: 30 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  0, .      "SELEC
2770: 54 20 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72  T rid FROM tagxr
2780: 65 66 22 0a 20 20 20 20 20 20 22 20 57 48 45 52  ef".      " WHER
2790: 45 20 74 61 67 69 64 3d 28 53 45 4c 45 43 54 20  E tagid=(SELECT 
27a0: 74 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57  tagid FROM tag W
27b0: 48 45 52 45 20 74 61 67 6e 61 6d 65 3d 25 51 29  HERE tagname=%Q)
27c0: 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20  ".      " ORDER 
27d0: 42 59 20 6d 74 69 6d 65 20 44 45 53 43 22 2c 20  BY mtime DESC", 
27e0: 7a 54 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  zTag.    );.    
27f0: 66 72 65 65 28 7a 54 61 67 29 3b 0a 20 20 20 20  free(zTag);.    
2800: 69 66 28 20 21 72 69 64 20 29 7b 0a 20 20 20 20  if( !rid ){.    
2810: 20 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63    fossil_redirec
2820: 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 20 20 20 20  t_home();.      
2830: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2840: 7d 0a 20 20 69 66 28 20 21 67 2e 6f 6b 41 70 6e  }.  if( !g.okApn
2850: 64 57 69 6b 69 20 29 7b 0a 20 20 20 20 6c 6f 67  dWiki ){.    log
2860: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 20  in_needed();.   
2870: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
2880: 66 28 20 50 28 22 73 75 62 6d 69 74 22 29 21 3d  f( P("submit")!=
2890: 30 20 26 26 20 50 28 22 72 22 29 21 3d 30 20 26  0 && P("r")!=0 &
28a0: 26 20 50 28 22 75 22 29 21 3d 30 20 29 7b 0a 20  & P("u")!=0 ){. 
28b0: 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a     char *zDate;.
28c0: 20 20 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a      Blob cksum;.
28d0: 20 20 20 20 69 6e 74 20 6e 72 69 64 3b 0a 20 20      int nrid;.  
28e0: 20 20 42 6c 6f 62 20 62 6f 64 79 3b 0a 20 20 20    Blob body;.   
28f0: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20   Blob content;. 
2900: 20 20 20 42 6c 6f 62 20 77 69 6b 69 3b 0a 20 20     Blob wiki;.  
2910: 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 0a 20    Manifest m;.. 
2920: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 62 6f     blob_zero(&bo
2930: 64 79 29 3b 0a 20 20 20 20 69 66 28 20 69 73 53  dy);.    if( isS
2940: 61 6e 64 62 6f 78 20 29 7b 0a 20 20 20 20 20 20  andbox ){.      
2950: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 62 6f  blob_appendf(&bo
2960: 64 79 2c 20 64 62 5f 67 65 74 28 22 73 61 6e 64  dy, db_get("sand
2970: 62 6f 78 22 2c 22 22 29 29 3b 0a 20 20 20 20 20  box",""));.     
2980: 20 61 70 70 65 6e 64 52 65 6d 61 72 6b 28 26 62   appendRemark(&b
2990: 6f 64 79 29 3b 0a 20 20 20 20 20 20 64 62 5f 73  ody);.      db_s
29a0: 65 74 28 22 73 61 6e 64 62 6f 78 22 2c 20 62 6c  et("sandbox", bl
29b0: 6f 62 5f 73 74 72 28 26 62 6f 64 79 29 2c 20 30  ob_str(&body), 0
29c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29d0: 20 20 20 20 6c 6f 67 69 6e 5f 76 65 72 69 66 79      login_verify
29e0: 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29 3b 0a  _csrf_secret();.
29f0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65        content_ge
2a00: 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29  t(rid, &content)
2a10: 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66 65 73 74  ;.      manifest
2a20: 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e 74  _parse(&m, &cont
2a30: 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
2a40: 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 57  m.type==CFTYPE_W
2a50: 49 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20 62  IKI ){.        b
2a60: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 62 6f 64 79  lob_append(&body
2a70: 2c 20 6d 2e 7a 57 69 6b 69 2c 20 2d 31 29 3b 0a  , m.zWiki, -1);.
2a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 61        }.      ma
2a90: 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29  nifest_clear(&m)
2aa0: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a 65 72  ;.      blob_zer
2ab0: 6f 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 20 20  o(&wiki);.      
2ac0: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
2ad0: 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 7a 44  tion();.      zD
2ae0: 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ate = db_text(0,
2af0: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
2b00: 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20  e('now')");.    
2b10: 20 20 7a 44 61 74 65 5b 31 30 5d 20 3d 20 27 54    zDate[10] = 'T
2b20: 27 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ';.      blob_ap
2b30: 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 44 20  pendf(&wiki, "D 
2b40: 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20  %s\n", zDate);. 
2b50: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
2b60: 66 28 26 77 69 6b 69 2c 20 22 4c 20 25 46 5c 6e  f(&wiki, "L %F\n
2b70: 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  ", zPageName);. 
2b80: 20 20 20 20 20 69 66 28 20 72 69 64 20 29 7b 0a       if( rid ){.
2b90: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55          char *zU
2ba0: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  uid = db_text(0,
2bb0: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
2bc0: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
2bd0: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20  d=%d", rid);.   
2be0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
2bf0: 66 28 26 77 69 6b 69 2c 20 22 50 20 25 73 5c 6e  f(&wiki, "P %s\n
2c00: 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20  ", zUuid);.     
2c10: 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b 0a     free(zUuid);.
2c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c30: 28 20 67 2e 7a 4c 6f 67 69 6e 20 29 7b 0a 20 20  ( g.zLogin ){.  
2c40: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
2c50: 64 66 28 26 77 69 6b 69 2c 20 22 55 20 25 46 5c  df(&wiki, "U %F\
2c60: 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20  n", g.zLogin);. 
2c70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70       }.      app
2c80: 65 6e 64 52 65 6d 61 72 6b 28 26 62 6f 64 79 29  endRemark(&body)
2c90: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
2ca0: 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 57 20 25  endf(&wiki, "W %
2cb0: 64 5c 6e 25 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73  d\n%s\n", blob_s
2cc0: 69 7a 65 28 26 62 6f 64 79 29 2c 20 62 6c 6f 62  ize(&body), blob
2cd0: 5f 73 74 72 28 26 62 6f 64 79 29 29 3b 0a 20 20  _str(&body));.  
2ce0: 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28      md5sum_blob(
2cf0: 26 77 69 6b 69 2c 20 26 63 6b 73 75 6d 29 3b 0a  &wiki, &cksum);.
2d00: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
2d10: 64 66 28 26 77 69 6b 69 2c 20 22 5a 20 25 62 5c  df(&wiki, "Z %b\
2d20: 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  n", &cksum);.   
2d30: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63     blob_reset(&c
2d40: 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 6e 72 69  ksum);.      nri
2d50: 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28  d = content_put(
2d60: 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20  &wiki, 0, 0);.  
2d70: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
2d80: 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e  c("INSERT OR IGN
2d90: 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e 74 20  ORE INTO unsent 
2da0: 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e 72 69  VALUES(%d)", nri
2db0: 64 29 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66 65  d);.      manife
2dc0: 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e 72 69  st_crosslink(nri
2dd0: 64 2c 20 26 77 69 6b 69 29 3b 0a 20 20 20 20 20  d, &wiki);.     
2de0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77 69 6b   blob_reset(&wik
2df0: 69 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 65 6e  i);.      conten
2e00: 74 5f 64 65 6c 74 69 66 79 28 72 69 64 2c 20 6e  t_deltify(rid, n
2e10: 72 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  rid, 0);.      d
2e20: 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  b_end_transactio
2e30: 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n(0);.    }.    
2e40: 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 77  cgi_redirectf("w
2e50: 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50  iki?name=%T", zP
2e60: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ageName);.  }.  
2e70: 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 21  if( P("cancel")!
2e80: 3d 30 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65  =0 ){.    cgi_re
2e90: 64 69 72 65 63 74 66 28 22 77 69 6b 69 3f 6e 61  directf("wiki?na
2ea0: 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65 4e 61 6d  me=%T", zPageNam
2eb0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
2ec0: 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61 67 65 4e    }.  zHtmlPageN
2ed0: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 41  ame = mprintf("A
2ee0: 70 70 65 6e 64 20 43 6f 6d 6d 65 6e 74 20 54 6f  ppend Comment To
2ef0: 3a 20 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65  : %h", zPageName
2f00: 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  );.  style_heade
2f10: 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 29  r(zHtmlPageName)
2f20: 3b 0a 20 20 69 66 28 20 50 28 22 70 72 65 76 69  ;.  if( P("previ
2f30: 65 77 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 42  ew")!=0 ){.    B
2f40: 6c 6f 62 20 70 72 65 76 69 65 77 3b 0a 20 20 20  lob preview;.   
2f50: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 72 65 76   blob_zero(&prev
2f60: 69 65 77 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  iew);.    append
2f70: 52 65 6d 61 72 6b 28 26 70 72 65 76 69 65 77 29  Remark(&preview)
2f80: 3b 0a 20 20 20 20 40 20 50 72 65 76 69 65 77 3a  ;.    @ Preview:
2f90: 3c 68 72 3e 0a 20 20 20 20 77 69 6b 69 5f 63 6f  <hr>.    wiki_co
2fa0: 6e 76 65 72 74 28 26 70 72 65 76 69 65 77 2c 20  nvert(&preview, 
2fb0: 30 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c 68 72  0, 0);.    @ <hr
2fc0: 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74  >.    blob_reset
2fd0: 28 26 70 72 65 76 69 65 77 29 3b 0a 20 20 7d 0a  (&preview);.  }.
2fe0: 20 20 7a 55 73 65 72 20 3d 20 50 44 28 22 75 22    zUser = PD("u"
2ff0: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 40  , g.zLogin);.  @
3000: 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 50   <form method="P
3010: 4f 53 54 22 20 61 63 74 69 6f 6e 3d 22 25 73 28  OST" action="%s(
3020: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b 69  g.zBaseURL)/wiki
3030: 61 70 70 65 6e 64 22 3e 0a 20 20 6c 6f 67 69 6e  append">.  login
3040: 5f 69 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63  _insert_csrf_sec
3050: 72 65 74 28 29 3b 0a 20 20 40 20 3c 69 6e 70 75  ret();.  @ <inpu
3060: 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20  t type="hidden" 
3070: 6e 61 6d 65 3d 22 6e 61 6d 65 22 20 76 61 6c 75  name="name" valu
3080: 65 3d 22 25 68 28 7a 50 61 67 65 4e 61 6d 65 29  e="%h(zPageName)
3090: 22 3e 0a 20 20 40 20 59 6f 75 72 20 4e 61 6d 65  ">.  @ Your Name
30a0: 3a 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  :.  @ <input typ
30b0: 65 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 75  e="text" name="u
30c0: 22 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75  " size="20" valu
30d0: 65 3d 22 25 68 28 7a 55 73 65 72 29 22 3e 3c 62  e="%h(zUser)"><b
30e0: 72 3e 0a 20 20 40 20 43 6f 6d 6d 65 6e 74 20 74  r>.  @ Comment t
30f0: 6f 20 61 70 70 65 6e 64 3a 3c 62 72 3e 0a 20 20  o append:<br>.  
3100: 40 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d 65  @ <textarea name
3110: 3d 22 72 22 20 63 6c 61 73 73 3d 22 77 69 6b 69  ="r" class="wiki
3120: 65 64 69 74 22 20 63 6f 6c 73 3d 22 38 30 22 20  edit" cols="80" 
3130: 0a 20 20 40 20 20 72 6f 77 73 3d 22 31 30 22 20  .  @  rows="10" 
3140: 77 72 61 70 3d 22 76 69 72 74 75 61 6c 22 3e 25  wrap="virtual">%
3150: 68 28 50 44 28 22 72 22 2c 22 22 29 29 3c 2f 74  h(PD("r",""))</t
3160: 65 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 62 72  extarea>.  @ <br
3170: 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  >.  @ <input typ
3180: 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d  e="submit" name=
3190: 22 70 72 65 76 69 65 77 22 20 76 61 6c 75 65 3d  "preview" value=
31a0: 22 50 72 65 76 69 65 77 20 59 6f 75 72 20 43 6f  "Preview Your Co
31b0: 6d 6d 65 6e 74 22 3e 0a 20 20 40 20 3c 69 6e 70  mment">.  @ <inp
31c0: 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22  ut type="submit"
31d0: 20 6e 61 6d 65 3d 22 73 75 62 6d 69 74 22 20 76   name="submit" v
31e0: 61 6c 75 65 3d 22 41 70 70 65 6e 64 20 59 6f 75  alue="Append You
31f0: 72 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20  r Changes">.  @ 
3200: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62  <input type="sub
3210: 6d 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65  mit" name="cance
3220: 6c 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c  l" value="Cancel
3230: 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  ">.  @ </form>. 
3240: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
3250: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
3260: 45 3a 20 77 68 69 73 74 6f 72 79 0a 2a 2a 20 55  E: whistory.** U
3270: 52 4c 3a 20 2f 77 68 69 73 74 6f 72 79 3f 6e 61  RL: /whistory?na
3280: 6d 65 3d 50 41 47 45 4e 41 4d 45 0a 2a 2a 0a 2a  me=PAGENAME.**.*
3290: 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c  * Show the compl
32a0: 65 74 65 20 63 68 61 6e 67 65 20 68 69 73 74 6f  ete change histo
32b0: 72 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ry for a single 
32c0: 77 69 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  wiki page..*/.vo
32d0: 69 64 20 77 68 69 73 74 6f 72 79 5f 70 61 67 65  id whistory_page
32e0: 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71  (void){.  Stmt q
32f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 69 74 6c 65  ;.  char *zTitle
3300: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b 0a  ;.  char *zSQL;.
3310: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
3320: 61 67 65 4e 61 6d 65 3b 0a 20 20 6c 6f 67 69 6e  ageName;.  login
3330: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
3340: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
3350: 6b 48 69 73 74 6f 72 79 20 29 7b 20 6c 6f 67 69  kHistory ){ logi
3360: 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75  n_needed(); retu
3370: 72 6e 3b 20 7d 0a 20 20 7a 50 61 67 65 4e 61 6d  rn; }.  zPageNam
3380: 65 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22 22  e = PD("name",""
3390: 29 3b 0a 20 20 7a 54 69 74 6c 65 20 3d 20 6d 70  );.  zTitle = mp
33a0: 72 69 6e 74 66 28 22 48 69 73 74 6f 72 79 20 4f  rintf("History O
33b0: 66 20 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65  f %h", zPageName
33c0: 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  );.  style_heade
33d0: 72 28 7a 54 69 74 6c 65 29 3b 0a 20 20 66 72 65  r(zTitle);.  fre
33e0: 65 28 7a 54 69 74 6c 65 29 3b 0a 0a 20 20 7a 53  e(zTitle);..  zS
33f0: 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73  QL = mprintf("%s
3400: 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64   AND event.objid
3410: 20 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20   IN ".          
3420: 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
3430: 54 20 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72  T rid FROM tagxr
3440: 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 22  ef WHERE tagid="
3450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3460: 20 20 20 20 20 20 20 20 22 28 53 45 4c 45 43 54          "(SELECT
3470: 20 74 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20   tagid FROM tag 
3480: 57 48 45 52 45 20 74 61 67 6e 61 6d 65 3d 27 77  WHERE tagname='w
3490: 69 6b 69 2d 25 71 27 29 29 22 0a 20 20 20 20 20  iki-%q'))".     
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44              "ORD
34b0: 45 52 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43  ER BY mtime DESC
34c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34d0: 20 20 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65      timeline_que
34e0: 72 79 5f 66 6f 72 5f 77 77 77 28 29 2c 20 7a 50  ry_for_www(), zP
34f0: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 64 62 5f 70  ageName);.  db_p
3500: 72 65 70 61 72 65 28 26 71 2c 20 7a 53 51 4c 29  repare(&q, zSQL)
3510: 3b 0a 20 20 66 72 65 65 28 7a 53 51 4c 29 3b 0a  ;.  free(zSQL);.
3520: 20 20 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65    www_print_time
3530: 6c 69 6e 65 28 26 71 29 3b 0a 20 20 64 62 5f 66  line(&q);.  db_f
3540: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 73  inalize(&q);.  s
3550: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
3560: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
3570: 20 77 63 6f 6e 74 65 6e 74 0a 2a 2a 0a 2a 2a 20   wcontent.**.** 
3580: 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62  List all availab
3590: 6c 65 20 77 69 6b 69 20 70 61 67 65 73 20 77 69  le wiki pages wi
35a0: 74 68 20 64 61 74 65 20 63 72 65 61 74 65 64 20  th date created 
35b0: 61 6e 64 20 6c 61 73 74 20 6d 6f 64 69 66 69 65  and last modifie
35c0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 77 63 6f 6e 74  d..*/.void wcont
35d0: 65 6e 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a  ent_page(void){.
35e0: 20 20 53 74 6d 74 20 71 3b 0a 20 20 6c 6f 67 69    Stmt q;.  logi
35f0: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
3600: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
3610: 6f 6b 52 64 57 69 6b 69 20 29 7b 20 6c 6f 67 69  okRdWiki ){ logi
3620: 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75  n_needed(); retu
3630: 72 6e 3b 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65  rn; }.  style_he
3640: 61 64 65 72 28 22 41 76 61 69 6c 61 62 6c 65 20  ader("Available 
3650: 57 69 6b 69 20 50 61 67 65 73 22 29 3b 0a 20 20  Wiki Pages");.  
3660: 40 20 3c 75 6c 3e 0a 20 20 64 62 5f 70 72 65 70  @ <ul>.  db_prep
3670: 61 72 65 28 26 71 2c 20 0a 20 20 20 20 22 53 45  are(&q, .    "SE
3680: 4c 45 43 54 20 73 75 62 73 74 72 28 74 61 67 6e  LECT substr(tagn
3690: 61 6d 65 2c 20 36 2c 20 31 30 30 30 29 20 46 52  ame, 6, 1000) FR
36a0: 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74 61 67  OM tag WHERE tag
36b0: 6e 61 6d 65 20 47 4c 4f 42 20 27 77 69 6b 69 2d  name GLOB 'wiki-
36c0: 2a 27 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  *'".    " ORDER 
36d0: 42 59 20 6c 6f 77 65 72 28 74 61 67 6e 61 6d 65  BY lower(tagname
36e0: 29 22 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  )".  );.  while(
36f0: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
3700: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
3710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3720: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
3730: 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 40  xt(&q, 0);.    @
3740: 20 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 22 25 73   <li><a href="%s
3750: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b  (g.zBaseURL)/wik
3760: 69 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29  i?name=%T(zName)
3770: 22 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 3c  ">%h(zName)</a><
3780: 2f 6c 69 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 69  /li>.  }.  db_fi
3790: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 40 20  nalize(&q);.  @ 
37a0: 3c 2f 75 6c 3e 0a 20 20 73 74 79 6c 65 5f 66 6f  </ul>.  style_fo
37b0: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
37c0: 20 57 45 42 50 41 47 45 3a 20 77 69 6b 69 5f 72   WEBPAGE: wiki_r
37d0: 75 6c 65 73 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b  ules.*/.void wik
37e0: 69 72 75 6c 65 73 5f 70 61 67 65 28 76 6f 69 64  irules_page(void
37f0: 29 7b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  ){.  style_heade
3800: 72 28 22 57 69 6b 69 20 46 6f 72 6d 61 74 74 69  r("Wiki Formatti
3810: 6e 67 20 52 75 6c 65 73 22 29 3b 0a 20 20 40 20  ng Rules");.  @ 
3820: 3c 68 32 3e 46 6f 72 6d 61 74 74 69 6e 67 20 52  <h2>Formatting R
3830: 75 6c 65 20 53 75 6d 6d 61 72 79 3c 2f 68 32 3e  ule Summary</h2>
3840: 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20 40 20 3c 6c  .  @ <ol>.  @ <l
3850: 69 3e 20 42 6c 61 6e 6b 20 6c 69 6e 65 73 20 61  i> Blank lines a
3860: 72 65 20 70 61 72 61 67 72 61 70 68 20 62 72 65  re paragraph bre
3870: 61 6b 73 0a 20 20 40 20 3c 6c 69 3e 20 42 75 6c  aks.  @ <li> Bul
3880: 6c 65 74 73 20 61 72 65 20 22 2a 22 20 73 75 72  lets are "*" sur
3890: 72 6f 75 6e 64 65 64 20 62 79 20 74 77 6f 20 73  rounded by two s
38a0: 70 61 63 65 73 20 61 74 20 74 68 65 20 62 65 67  paces at the beg
38b0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 69  inning of the li
38c0: 6e 65 2e 0a 20 20 40 20 3c 6c 69 3e 20 45 6e 75  ne..  @ <li> Enu
38d0: 6d 65 72 61 74 69 6f 6e 20 69 74 65 6d 73 20 61  meration items a
38e0: 72 65 20 61 20 6e 75 6d 62 65 72 20 73 75 72 72  re a number surr
38f0: 6f 75 6e 64 65 64 20 62 79 20 74 77 6f 20 73 70  ounded by two sp
3900: 61 63 65 0a 20 20 40 20 61 74 20 74 68 65 20 62  ace.  @ at the b
3910: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6c 69  eginning of a li
3920: 6e 65 2e 0a 20 20 40 20 3c 6c 69 3e 20 49 6e 64  ne..  @ <li> Ind
3930: 65 6e 74 65 64 20 70 61 72 67 72 61 70 68 73 20  ented pargraphs 
3940: 62 65 67 69 6e 20 77 69 74 68 20 61 20 74 61 62  begin with a tab
3950: 20 6f 72 20 74 77 6f 20 73 70 61 63 65 73 2e 0a   or two spaces..
3960: 20 20 40 20 3c 6c 69 3e 20 48 79 70 65 72 6c 69    @ <li> Hyperli
3970: 6e 6b 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  nks are containe
3980: 64 20 77 69 74 68 20 73 71 75 61 72 65 20 62 72  d with square br
3990: 61 63 6b 65 74 73 3a 20 20 22 5b 74 61 72 67 65  ackets:  "[targe
39a0: 74 5d 22 0a 20 20 40 20 3c 6c 69 3e 20 4d 6f 73  t]".  @ <li> Mos
39b0: 74 20 6f 72 64 69 6e 61 72 79 20 48 54 4d 4c 20  t ordinary HTML 
39c0: 77 6f 72 6b 73 2e 0a 20 20 40 20 3c 6c 69 3e 20  works..  @ <li> 
39d0: 26 6c 74 3b 76 65 72 62 61 74 69 6d 26 67 74 3b  &lt;verbatim&gt;
39e0: 20 61 6e 64 20 26 6c 74 3b 6e 6f 77 69 6b 69 26   and &lt;nowiki&
39f0: 67 74 3b 2e 0a 20 20 40 20 3c 2f 6f 6c 3e 0a 20  gt;..  @ </ol>. 
3a00: 20 40 20 3c 70 3e 57 65 20 63 61 6c 6c 20 74 68   @ <p>We call th
3a10: 65 20 66 69 72 73 74 20 66 69 76 65 20 72 75 6c  e first five rul
3a20: 65 73 20 61 62 6f 76 65 20 22 77 69 6b 69 22 20  es above "wiki" 
3a30: 66 6f 72 6d 61 74 74 69 6e 67 20 72 75 6c 65 73  formatting rules
3a40: 2e 20 20 54 68 65 0a 20 20 40 20 6c 61 73 74 20  .  The.  @ last 
3a50: 74 77 6f 20 72 75 6c 65 73 20 61 72 65 20 74 68  two rules are th
3a60: 65 20 48 54 4d 4c 20 66 6f 72 6d 61 74 74 69 6e  e HTML formattin
3a70: 67 20 72 75 6c 65 2e 3c 2f 70 3e 0a 20 20 40 20  g rule.</p>.  @ 
3a80: 3c 68 32 3e 46 6f 72 6d 61 74 74 69 6e 67 20 52  <h2>Formatting R
3a90: 75 6c 65 20 44 65 74 61 69 6c 73 3c 2f 68 32 3e  ule Details</h2>
3aa0: 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20 40 20 3c 6c  .  @ <ol>.  @ <l
3ab0: 69 3e 20 3c 70 3e 3c 62 3e 50 61 72 61 67 72 61  i> <p><b>Paragra
3ac0: 70 68 73 3c 2f 62 3e 2e 20 20 41 6e 79 20 73 65  phs</b>.  Any se
3ad0: 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72  quence of one or
3ae0: 20 6d 6f 72 65 20 62 6c 61 6e 6b 20 6c 69 6e 65   more blank line
3af0: 73 20 66 6f 72 6d 73 0a 20 20 40 20 61 20 70 61  s forms.  @ a pa
3b00: 72 61 67 72 61 70 68 20 62 72 65 61 6b 2e 20 20  ragraph break.  
3b10: 43 65 6e 74 65 72 65 64 20 6f 72 20 72 69 67 68  Centered or righ
3b20: 74 2d 6a 75 73 74 69 66 69 65 64 20 70 61 72 61  t-justified para
3b30: 67 72 61 70 68 73 20 61 72 65 20 6e 6f 74 0a 20  graphs are not. 
3b40: 20 40 20 73 75 70 70 6f 72 74 65 64 20 62 79 20   @ supported by 
3b50: 77 69 6b 69 20 6d 61 72 6b 75 70 2c 20 62 75 74  wiki markup, but
3b60: 20 79 6f 75 20 63 61 6e 20 64 6f 20 74 68 65 73   you can do thes
3b70: 65 20 74 68 69 6e 67 73 20 69 66 20 79 6f 75 20  e things if you 
3b80: 6e 65 65 64 20 74 68 65 6d 0a 20 20 40 20 75 73  need them.  @ us
3b90: 69 6e 67 20 48 54 4d 4c 2e 3c 2f 70 3e 0a 20 20  ing HTML.</p>.  
3ba0: 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 42 75 6c  @ <li> <p><b>Bul
3bb0: 6c 65 74 20 4c 69 73 74 73 3c 2f 62 3e 2e 0a 20  let Lists</b>.. 
3bc0: 20 40 20 41 20 62 75 6c 6c 65 74 20 6c 69 73 74   @ A bullet list
3bd0: 20 69 74 65 6d 20 69 73 20 61 20 6c 69 6e 65 20   item is a line 
3be0: 74 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68  that begins with
3bf0: 20 61 20 73 69 6e 67 6c 65 20 22 2a 22 20 63 68   a single "*" ch
3c00: 61 72 61 63 74 65 72 0a 20 20 40 20 73 75 72 72  aracter.  @ surr
3c10: 6f 75 6e 64 65 64 20 6f 6e 0a 20 20 40 20 62 6f  ounded on.  @ bo
3c20: 74 68 20 73 69 64 65 73 20 62 79 20 74 77 6f 20  th sides by two 
3c30: 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73 20 6f  or more spaces o
3c40: 72 20 62 79 20 61 20 74 61 62 2e 20 20 4f 6e 6c  r by a tab.  Onl
3c50: 79 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  y a single level
3c60: 0a 20 20 40 20 6f 66 20 62 75 6c 6c 65 74 20 6c  .  @ of bullet l
3c70: 69 73 74 20 69 73 20 73 75 70 70 6f 72 74 65 64  ist is supported
3c80: 20 62 79 20 77 69 6b 69 2e 20 20 46 6f 72 20 6e   by wiki.  For n
3c90: 65 73 74 65 64 20 6c 69 73 74 73 2c 20 75 73 65  ested lists, use
3ca0: 20 48 54 4d 4c 2e 3c 2f 70 3e 0a 20 20 40 20 3c   HTML.</p>.  @ <
3cb0: 6c 69 3e 20 3c 70 3e 3c 62 3e 45 6e 75 6d 65 72  li> <p><b>Enumer
3cc0: 61 74 69 6f 6e 20 4c 69 73 74 73 3c 2f 62 3e 2e  ation Lists</b>.
3cd0: 0a 20 20 40 20 41 6e 20 65 6e 75 6d 65 72 61 74  .  @ An enumerat
3ce0: 69 6f 6e 20 6c 69 73 74 20 69 74 65 6d 20 69 73  ion list item is
3cf0: 20 61 20 6c 69 6e 65 20 74 68 61 74 20 62 65 67   a line that beg
3d00: 69 6e 73 0a 20 20 40 20 77 69 74 68 20 6f 6e 65  ins.  @ with one
3d10: 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20   or more digits 
3d20: 6f 70 74 69 6f 6e 61 6c 6c 79 0a 20 20 40 20 66  optionally.  @ f
3d30: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22 2e 22  ollowed by a "."
3d40: 20 61 6e 64 20 69 73 20 73 75 72 72 6f 75 6e 64   and is surround
3d50: 65 64 20 6f 6e 20 62 6f 74 68 20 73 69 64 65 73  ed on both sides
3d60: 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   by two or more 
3d70: 73 70 61 63 65 73 20 6f 72 0a 20 20 40 20 62 79  spaces or.  @ by
3d80: 20 61 20 74 61 62 2e 20 20 54 68 65 20 6e 75 6d   a tab.  The num
3d90: 62 65 72 20 69 73 20 73 69 67 6e 69 66 69 63 61  ber is significa
3da0: 6e 74 20 61 6e 64 20 62 65 63 6f 6d 65 73 20 74  nt and becomes t
3db0: 68 65 20 6e 75 6d 62 65 72 20 73 68 6f 77 6e 0a  he number shown.
3dc0: 20 20 40 20 69 6e 20 74 68 65 20 72 65 6e 64 65    @ in the rende
3dd0: 72 65 64 20 65 6e 75 6d 65 72 61 74 69 6f 6e 20  red enumeration 
3de0: 69 74 65 6d 2e 20 20 4f 6e 6c 79 20 61 20 73 69  item.  Only a si
3df0: 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 65 6e  ngle level of en
3e00: 75 6d 65 72 61 74 69 6f 6e 0a 20 20 40 20 6c 69  umeration.  @ li
3e10: 73 74 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  st is supported 
3e20: 62 79 20 77 69 6b 69 2e 20 20 46 6f 72 20 6e 65  by wiki.  For ne
3e30: 73 74 65 64 20 65 6e 75 6d 65 72 61 74 69 6f 6e  sted enumeration
3e40: 73 20 6f 72 20 66 6f 72 0a 20 20 40 20 65 6e 75  s or for.  @ enu
3e50: 6d 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 63  merations that c
3e60: 6f 75 6e 74 20 75 73 69 6e 67 20 6c 65 74 74 65  ount using lette
3e70: 72 73 20 6f 72 20 72 6f 6d 61 6e 20 6e 75 6d 65  rs or roman nume
3e80: 72 69 61 6c 73 2c 20 75 73 65 20 48 54 4d 4c 2e  rials, use HTML.
3e90: 3c 2f 70 3e 0a 20 20 40 20 3c 6c 69 3e 20 3c 70  </p>.  @ <li> <p
3ea0: 3e 3c 62 3e 49 6e 64 65 6e 74 65 64 20 50 61 72  ><b>Indented Par
3eb0: 61 67 72 61 70 68 73 3c 2f 62 3e 2e 0a 20 20 40  agraphs</b>..  @
3ec0: 20 41 6e 79 20 70 61 72 61 67 72 61 70 68 20 74   Any paragraph t
3ed0: 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 20  hat begins with 
3ee0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63  two or more spac
3ef0: 65 73 20 6f 72 20 61 20 74 61 62 20 61 6e 64 0a  es or a tab and.
3f00: 20 20 40 20 77 68 69 63 68 20 69 73 20 6e 6f 74    @ which is not
3f10: 20 61 20 62 75 6c 6c 65 74 20 6f 72 20 65 6e 75   a bullet or enu
3f20: 6d 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 69 74  meration list it
3f30: 65 6d 20 69 73 20 72 65 6e 64 65 72 65 64 20 0a  em is rendered .
3f40: 20 20 40 20 69 6e 64 65 6e 74 65 64 2e 20 20 4f    @ indented.  O
3f50: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6c 65 76  nly a single lev
3f60: 65 6c 20 6f 66 20 69 6e 64 65 6e 74 61 74 69 6f  el of indentatio
3f70: 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 62  n is supported b
3f80: 79 20 77 69 6b 69 3b 20 75 73 65 0a 20 20 40 20  y wiki; use.  @ 
3f90: 48 54 4d 4c 20 66 6f 72 20 64 65 65 70 65 72 20  HTML for deeper 
3fa0: 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 3c 2f 70 3e  indentation.</p>
3fb0: 0a 20 20 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e  .  @ <li> <p><b>
3fc0: 48 79 70 65 72 6c 69 6e 6b 73 3c 2f 62 3e 2e 0a  Hyperlinks</b>..
3fd0: 20 20 40 20 54 65 78 74 20 77 69 74 68 69 6e 20    @ Text within 
3fe0: 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 20  square brackets 
3ff0: 28 22 5b 2e 2e 2e 5d 22 29 20 62 65 63 6f 6d 65  ("[...]") become
4000: 73 20 61 20 68 79 70 65 72 6c 69 6e 6b 2e 20 20  s a hyperlink.  
4010: 54 68 65 0a 20 20 40 20 74 61 72 67 65 74 20 63  The.  @ target c
4020: 61 6e 20 62 65 20 61 20 77 69 6b 69 20 70 61 67  an be a wiki pag
4030: 65 20 6e 61 6d 65 2c 20 74 68 65 20 61 72 74 69  e name, the arti
4040: 66 61 63 74 20 49 44 20 6f 66 20 61 20 63 68 65  fact ID of a che
4050: 63 6b 2d 69 6e 20 6f 72 20 74 69 63 6b 65 74 2c  ck-in or ticket,
4060: 0a 20 20 40 20 74 68 65 20 6e 61 6d 65 20 6f 66  .  @ the name of
4070: 20 61 6e 20 69 6d 61 67 65 2c 20 6f 72 20 61 20   an image, or a 
4080: 55 52 4c 2e 20 20 42 79 20 64 65 66 61 75 6c 74  URL.  By default
4090: 2c 20 74 68 65 20 74 61 72 67 65 74 20 69 73 20  , the target is 
40a0: 64 69 73 70 6c 61 79 65 64 0a 20 20 40 20 61 73  displayed.  @ as
40b0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
40c0: 20 68 79 70 65 72 6c 69 6e 6b 2e 20 20 42 75 74   hyperlink.  But
40d0: 20 79 6f 75 20 63 61 6e 20 73 70 65 63 69 66 79   you can specify
40e0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 74 65 78   alternative tex
40f0: 74 0a 20 20 40 20 61 66 74 65 72 20 74 68 65 20  t.  @ after the 
4100: 74 61 72 67 65 74 20 6e 61 6d 65 20 73 65 70 61  target name sepa
4110: 72 61 74 65 64 20 62 79 20 61 20 22 7c 22 20 63  rated by a "|" c
4120: 68 61 72 61 63 74 65 72 2e 3c 2f 70 3e 0a 20 20  haracter.</p>.  
4130: 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 48 54 4d  @ <li> <p><b>HTM
4140: 4c 3c 2f 62 3e 2e 0a 20 20 40 20 54 68 65 20 66  L</b>..  @ The f
4150: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 6e 64 61 72  ollowing standar
4160: 64 20 48 54 4d 4c 20 65 6c 65 6d 65 6e 74 73 20  d HTML elements 
4170: 6d 61 79 20 62 65 20 75 73 65 64 3a 0a 20 20 40  may be used:.  @
4180: 20 26 6c 74 3b 61 26 67 74 3b 0a 20 20 40 20 26   &lt;a&gt;.  @ &
4190: 6c 74 3b 61 64 64 72 65 73 73 26 67 74 3b 0a 20  lt;address&gt;. 
41a0: 20 40 20 26 6c 74 3b 62 26 67 74 3b 0a 20 20 40   @ &lt;b&gt;.  @
41b0: 20 26 6c 74 3b 62 69 67 26 67 74 3b 0a 20 20 40   &lt;big&gt;.  @
41c0: 20 26 6c 74 3b 62 6c 6f 63 6b 71 75 6f 74 65 26   &lt;blockquote&
41d0: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 62 72 26 67  gt;.  @ &lt;br&g
41e0: 74 3b 0a 20 20 40 20 26 6c 74 3b 63 65 6e 74 65  t;.  @ &lt;cente
41f0: 72 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 63 69  r&gt;.  @ &lt;ci
4200: 74 65 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 63  te&gt;.  @ &lt;c
4210: 6f 64 65 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  ode&gt;.  @ &lt;
4220: 64 64 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64  dd&gt;.  @ &lt;d
4230: 66 6e 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64  fn&gt;.  @ &lt;d
4240: 69 76 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64  iv&gt;.  @ &lt;d
4250: 6c 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64 74  l&gt;.  @ &lt;dt
4260: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 65 6d 26  &gt;.  @ &lt;em&
4270: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 66 6f 6e 74  gt;.  @ &lt;font
4280: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 68 31 26  &gt;.  @ &lt;h1&
4290: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 68 32 26 67  gt;.  @ &lt;h2&g
42a0: 74 3b 0a 20 20 40 20 26 6c 74 3b 68 33 26 67 74  t;.  @ &lt;h3&gt
42b0: 3b 0a 20 20 40 20 26 6c 74 3b 68 34 26 67 74 3b  ;.  @ &lt;h4&gt;
42c0: 0a 20 20 40 20 26 6c 74 3b 68 35 26 67 74 3b 0a  .  @ &lt;h5&gt;.
42d0: 20 20 40 20 26 6c 74 3b 68 36 26 67 74 3b 0a 20    @ &lt;h6&gt;. 
42e0: 20 40 20 26 6c 74 3b 68 72 26 67 74 3b 0a 20 20   @ &lt;hr&gt;.  
42f0: 40 20 26 6c 74 3b 69 6d 67 26 67 74 3b 0a 20 20  @ &lt;img&gt;.  
4300: 40 20 26 6c 74 3b 69 26 67 74 3b 0a 20 20 40 20  @ &lt;i&gt;.  @ 
4310: 26 6c 74 3b 6b 62 64 26 67 74 3b 0a 20 20 40 20  &lt;kbd&gt;.  @ 
4320: 26 6c 74 3b 6c 69 26 67 74 3b 0a 20 20 40 20 26  &lt;li&gt;.  @ &
4330: 6c 74 3b 6e 6f 62 72 26 67 74 3b 0a 20 20 40 20  lt;nobr&gt;.  @ 
4340: 26 6c 74 3b 6f 6c 26 67 74 3b 0a 20 20 40 20 26  &lt;ol&gt;.  @ &
4350: 6c 74 3b 70 26 67 74 3b 0a 20 20 40 20 26 6c 74  lt;p&gt;.  @ &lt
4360: 3b 70 72 65 26 67 74 3b 0a 20 20 40 20 26 6c 74  ;pre&gt;.  @ &lt
4370: 3b 73 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73  ;s&gt;.  @ &lt;s
4380: 61 6d 70 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  amp&gt;.  @ &lt;
4390: 73 6d 61 6c 6c 26 67 74 3b 0a 20 20 40 20 26 6c  small&gt;.  @ &l
43a0: 74 3b 73 74 72 69 6b 65 26 67 74 3b 0a 20 20 40  t;strike&gt;.  @
43b0: 20 26 6c 74 3b 73 74 72 6f 6e 67 26 67 74 3b 0a   &lt;strong&gt;.
43c0: 20 20 40 20 26 6c 74 3b 73 75 62 26 67 74 3b 0a    @ &lt;sub&gt;.
43d0: 20 20 40 20 26 6c 74 3b 73 75 70 26 67 74 3b 0a    @ &lt;sup&gt;.
43e0: 20 20 40 20 26 6c 74 3b 74 61 62 6c 65 26 67 74    @ &lt;table&gt
43f0: 3b 0a 20 20 40 20 26 6c 74 3b 74 64 26 67 74 3b  ;.  @ &lt;td&gt;
4400: 0a 20 20 40 20 26 6c 74 3b 74 68 26 67 74 3b 0a  .  @ &lt;th&gt;.
4410: 20 20 40 20 26 6c 74 3b 74 72 26 67 74 3b 0a 20    @ &lt;tr&gt;. 
4420: 20 40 20 26 6c 74 3b 74 74 26 67 74 3b 0a 20 20   @ &lt;tt&gt;.  
4430: 40 20 26 6c 74 3b 75 26 67 74 3b 0a 20 20 40 20  @ &lt;u&gt;.  @ 
4440: 26 6c 74 3b 75 6c 26 67 74 3b 0a 20 20 40 20 26  &lt;ul&gt;.  @ &
4450: 6c 74 3b 76 61 72 26 67 74 3b 2e 0a 20 20 40 20  lt;var&gt;..  @ 
4460: 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 74 68 65  In addition, the
4470: 72 65 20 61 72 65 20 74 77 6f 20 6e 6f 6e 2d 73  re are two non-s
4480: 74 61 6e 64 61 72 64 20 65 6c 65 6d 65 6e 74 73  tandard elements
4490: 20 61 76 61 69 6c 61 62 6c 65 3a 0a 20 20 40 20   available:.  @ 
44a0: 26 6c 74 3b 76 65 72 62 61 74 69 6d 26 67 74 3b  &lt;verbatim&gt;
44b0: 20 61 6e 64 20 26 6c 74 3b 6e 6f 77 69 6b 69 26   and &lt;nowiki&
44c0: 67 74 3b 2e 0a 20 20 40 20 4e 6f 20 6f 74 68 65  gt;..  @ No othe
44d0: 72 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 61  r elements are a
44e0: 6c 6c 6f 77 65 64 2e 20 20 41 6c 6c 20 61 74 74  llowed.  All att
44f0: 72 69 62 75 74 65 73 20 61 72 65 20 63 68 65 63  ributes are chec
4500: 6b 65 64 20 61 6e 64 0a 20 20 40 20 6f 6e 6c 79  ked and.  @ only
4510: 20 61 20 66 65 77 20 62 65 6e 69 67 6e 20 61 74   a few benign at
4520: 74 72 69 62 75 74 65 73 20 61 72 65 20 61 6c 6c  tributes are all
4530: 6f 77 65 64 20 6f 6e 20 65 61 63 68 20 65 6c 65  owed on each ele
4540: 6d 65 6e 74 2e 0a 20 20 40 20 49 6e 20 70 61 72  ment..  @ In par
4550: 74 69 63 75 6c 61 72 2c 20 61 6e 79 20 61 74 74  ticular, any att
4560: 72 69 62 75 74 65 73 20 74 68 61 74 20 73 70 65  ributes that spe
4570: 63 69 66 79 20 6a 61 76 61 73 63 72 69 70 74 20  cify javascript 
4580: 6f 72 20 43 53 53 0a 20 20 40 20 61 72 65 20 65  or CSS.  @ are e
4590: 6c 69 64 65 64 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a  lided.</p></li>.
45a0: 20 20 40 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 53 70    @ <li><p><b>Sp
45b0: 65 63 69 61 6c 20 4d 61 72 6b 75 70 2e 3c 2f 62  ecial Markup.</b
45c0: 3e 0a 20 20 40 20 54 68 65 20 26 6c 74 3b 6e 6f  >.  @ The &lt;no
45d0: 77 69 6b 69 26 67 74 3b 20 74 61 67 20 64 69 73  wiki&gt; tag dis
45e0: 61 62 6c 65 73 20 61 6c 6c 20 77 69 6b 69 20 66  ables all wiki f
45f0: 6f 72 6d 61 74 74 69 6e 67 20 72 75 6c 65 73 0a  ormatting rules.
4600: 20 20 40 20 74 68 72 6f 75 67 68 20 74 68 65 20    @ through the 
4610: 6d 61 74 63 68 69 6e 67 20 26 6c 74 3b 2f 6e 6f  matching &lt;/no
4620: 77 69 6b 69 26 67 74 3b 20 65 6c 65 6d 65 6e 74  wiki&gt; element
4630: 2e 0a 20 20 40 20 54 68 65 20 26 6c 74 3b 76 65  ..  @ The &lt;ve
4640: 72 62 61 74 69 6d 26 67 74 3b 20 74 61 67 20 77  rbatim&gt; tag w
4650: 6f 72 6b 73 20 6c 69 6b 65 20 26 6c 74 3b 70 72  orks like &lt;pr
4660: 65 26 67 74 3b 20 77 69 74 68 20 74 68 65 20 61  e&gt; with the a
4670: 64 64 69 74 69 6f 6e 0a 20 20 40 20 74 68 61 74  ddition.  @ that
4680: 20 69 74 20 61 6c 73 6f 20 64 69 73 61 62 6c 65   it also disable
4690: 73 20 61 6c 6c 20 77 69 6b 69 20 61 6e 64 20 48  s all wiki and H
46a0: 54 4d 4c 20 6d 61 72 6b 75 70 0a 20 20 40 20 74  TML markup.  @ t
46b0: 68 72 6f 75 67 68 20 74 68 65 20 6d 61 74 63 68  hrough the match
46c0: 69 6e 67 20 26 6c 74 3b 2f 76 65 72 62 61 74 69  ing &lt;/verbati
46d0: 6d 26 67 74 3b 2e 0a 20 20 40 20 3c 2f 6f 6c 3e  m&gt;..  @ </ol>
46e0: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
46f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
4700: 61 20 6e 65 77 20 77 69 6b 69 20 70 61 67 65 20  a new wiki page 
4710: 74 6f 20 74 68 65 20 72 65 73 70 6f 73 69 74 6f  to the resposito
4720: 72 79 2e 20 20 54 68 65 20 70 61 67 65 20 6e 61  ry.  The page na
4730: 6d 65 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 62  me is.** given b
4740: 79 20 74 68 65 20 7a 50 61 67 65 4e 61 6d 65 20  y the zPageName 
4750: 70 61 72 61 6d 65 74 65 72 2e 20 20 69 73 4e 65  parameter.  isNe
4760: 77 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 74  w must be true t
4770: 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  o create.** a ne
4780: 77 20 70 61 67 65 2e 20 20 49 66 20 6e 6f 20 70  w page.  If no p
4790: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 69 74  revious page wit
47a0: 68 20 74 68 65 20 6e 61 6d 65 20 7a 50 61 67 65  h the name zPage
47b0: 4e 61 6d 65 20 65 78 69 73 74 73 0a 2a 2a 20 61  Name exists.** a
47c0: 6e 64 20 69 73 4e 65 77 20 69 73 20 66 61 6c 73  nd isNew is fals
47d0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
47e0: 74 69 6e 65 20 74 68 72 6f 77 73 20 61 6e 20 65  tine throws an e
47f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rror..**.** The 
4800: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  content of the n
4810: 65 77 20 70 61 67 65 20 69 73 20 67 69 76 65 6e  ew page is given
4820: 20 62 79 20 74 68 65 20 62 6c 6f 62 20 70 43 6f   by the blob pCo
4830: 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 77 69  ntent..*/.int wi
4840: 6b 69 5f 63 6d 64 5f 63 6f 6d 6d 69 74 28 63 68  ki_cmd_commit(ch
4850: 61 72 20 63 6f 6e 73 74 20 2a 20 7a 50 61 67 65  ar const * zPage
4860: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 4e 65 77 2c  Name, int isNew,
4870: 20 42 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 29   Blob *pContent)
4880: 7b 0a 20 20 42 6c 6f 62 20 77 69 6b 69 3b 20 20  {.  Blob wiki;  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
48a0: 69 6b 69 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  iki page content
48b0: 20 2a 2f 0a 20 20 42 6c 6f 62 20 63 6b 73 75 6d   */.  Blob cksum
48c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
48d0: 20 77 69 6b 69 20 63 68 65 63 6b 73 75 6d 20 2a   wiki checksum *
48e0: 2f 0a 20 20 69 6e 74 20 72 69 64 3b 20 20 20 20  /.  int rid;    
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
4900: 72 74 69 66 61 63 74 20 49 44 20 6f 66 20 70 61  rtifact ID of pa
4910: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 69  rent page */.  i
4920: 6e 74 20 6e 72 69 64 3b 20 20 20 20 20 20 20 20  nt nrid;        
4930: 20 20 20 20 20 20 20 2f 2a 20 61 72 74 69 66 61         /* artifa
4940: 63 74 20 49 44 20 6f 66 20 6e 65 77 20 77 69 6b  ct ID of new wik
4950: 69 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72  i page */.  char
4960: 20 2a 7a 44 61 74 65 3b 20 20 20 20 20 20 20 20   *zDate;        
4970: 20 20 20 20 2f 2a 20 74 69 6d 65 73 74 61 6d 70      /* timestamp
4980: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 55 75 69   */.  char *zUui
4990: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
49a0: 20 75 75 69 64 20 66 6f 72 20 72 69 64 20 2a 2f   uuid for rid */
49b0: 0a 0a 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74  ..  rid = db_int
49c0: 28 30 2c 0a 20 20 20 20 20 22 53 45 4c 45 43 54  (0,.     "SELECT
49d0: 20 78 2e 72 69 64 20 46 52 4f 4d 20 74 61 67 20   x.rid FROM tag 
49e0: 74 2c 20 74 61 67 78 72 65 66 20 78 22 0a 20 20  t, tagxref x".  
49f0: 20 20 20 22 20 57 48 45 52 45 20 78 2e 74 61 67     " WHERE x.tag
4a00: 69 64 3d 74 2e 74 61 67 69 64 20 41 4e 44 20 74  id=t.tagid AND t
4a10: 2e 74 61 67 6e 61 6d 65 3d 27 77 69 6b 69 2d 25  .tagname='wiki-%
4a20: 71 27 22 0a 20 20 20 20 20 22 20 4f 52 44 45 52  q'".     " ORDER
4a30: 20 42 59 20 78 2e 6d 74 69 6d 65 20 44 45 53 43   BY x.mtime DESC
4a40: 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20   LIMIT 1",.     
4a50: 7a 50 61 67 65 4e 61 6d 65 0a 20 20 29 3b 0a 20  zPageName.  );. 
4a60: 20 69 66 28 20 72 69 64 3d 3d 30 20 26 26 20 21   if( rid==0 && !
4a70: 69 73 4e 65 77 20 29 7b 0a 20 20 20 20 66 6f 73  isNew ){.    fos
4a80: 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20 73 75  sil_fatal("no su
4a90: 63 68 20 77 69 6b 69 20 70 61 67 65 3a 20 25 73  ch wiki page: %s
4aa0: 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  ", zPageName);. 
4ab0: 20 7d 0a 20 20 69 66 28 20 72 69 64 21 3d 30 20   }.  if( rid!=0 
4ac0: 26 26 20 69 73 4e 65 77 20 29 7b 0a 20 20 20 20  && isNew ){.    
4ad0: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 77 69  fossil_fatal("wi
4ae0: 6b 69 20 70 61 67 65 20 25 73 20 61 6c 72 65 61  ki page %s alrea
4af0: 64 79 20 65 78 69 73 74 73 22 2c 20 7a 50 61 67  dy exists", zPag
4b00: 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 62  eName);.  }..  b
4b10: 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b 69 29 3b  lob_zero(&wiki);
4b20: 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65  .  zDate = db_te
4b30: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61  xt(0, "SELECT da
4b40: 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 3b  tetime('now')");
4b50: 0a 20 20 7a 44 61 74 65 5b 31 30 5d 20 3d 20 27  .  zDate[10] = '
4b60: 54 27 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  T';.  blob_appen
4b70: 64 66 28 26 77 69 6b 69 2c 20 22 44 20 25 73 5c  df(&wiki, "D %s\
4b80: 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 66 72  n", zDate);.  fr
4b90: 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 62 6c 6f  ee(zDate);.  blo
4ba0: 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c  b_appendf(&wiki,
4bb0: 20 22 4c 20 25 46 5c 6e 22 2c 20 7a 50 61 67 65   "L %F\n", zPage
4bc0: 4e 61 6d 65 20 29 3b 0a 20 20 69 66 28 20 72 69  Name );.  if( ri
4bd0: 64 20 29 7b 0a 20 20 20 20 7a 55 75 69 64 20 3d  d ){.    zUuid =
4be0: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
4bf0: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c  ECT uuid FROM bl
4c00: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22  ob WHERE rid=%d"
4c10: 2c 20 72 69 64 29 3b 0a 20 20 20 20 62 6c 6f 62  , rid);.    blob
4c20: 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20  _appendf(&wiki, 
4c30: 22 50 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 29  "P %s\n", zUuid)
4c40: 3b 0a 20 20 20 20 66 72 65 65 28 7a 55 75 69 64  ;.    free(zUuid
4c50: 29 3b 0a 20 20 7d 0a 20 20 75 73 65 72 5f 73 65  );.  }.  user_se
4c60: 6c 65 63 74 28 29 3b 0a 20 20 69 66 28 20 67 2e  lect();.  if( g.
4c70: 7a 4c 6f 67 69 6e 20 29 7b 0a 20 20 20 20 20 20  zLogin ){.      
4c80: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
4c90: 6b 69 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e  ki, "U %F\n", g.
4ca0: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 7d 0a 20 20 62  zLogin);.  }.  b
4cb0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 20 26 77 69  lob_appendf( &wi
4cc0: 6b 69 2c 20 22 57 20 25 64 5c 6e 25 73 5c 6e 22  ki, "W %d\n%s\n"
4cd0: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 70 43 6f 6e  , blob_size(pCon
4ce0: 74 65 6e 74 29 2c 0a 20 20 20 20 20 20 20 20 20  tent),.         
4cf0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 73 74 72 28         blob_str(
4d00: 70 43 6f 6e 74 65 6e 74 29 20 29 3b 0a 20 20 6d  pContent) );.  m
4d10: 64 35 73 75 6d 5f 62 6c 6f 62 28 26 77 69 6b 69  d5sum_blob(&wiki
4d20: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 62 6c 6f  , &cksum);.  blo
4d30: 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c  b_appendf(&wiki,
4d40: 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63 6b 73 75   "Z %b\n", &cksu
4d50: 6d 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74  m);.  blob_reset
4d60: 28 26 63 6b 73 75 6d 29 3b 0a 20 20 64 62 5f 62  (&cksum);.  db_b
4d70: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
4d80: 28 29 3b 0a 20 20 6e 72 69 64 20 3d 20 63 6f 6e  ();.  nrid = con
4d90: 74 65 6e 74 5f 70 75 74 28 20 26 77 69 6b 69 2c  tent_put( &wiki,
4da0: 20 30 2c 20 30 20 29 3b 0a 20 20 64 62 5f 6d 75   0, 0 );.  db_mu
4db0: 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54  lti_exec("INSERT
4dc0: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
4dd0: 75 6e 73 65 6e 74 20 56 41 4c 55 45 53 28 25 64  unsent VALUES(%d
4de0: 29 22 2c 20 6e 72 69 64 29 3b 0a 20 20 6d 61 6e  )", nrid);.  man
4df0: 69 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28  ifest_crosslink(
4e00: 6e 72 69 64 2c 26 77 69 6b 69 29 3b 0a 20 20 62  nrid,&wiki);.  b
4e10: 6c 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29  lob_reset(&wiki)
4e20: 3b 0a 20 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74  ;.  content_delt
4e30: 69 66 79 28 72 69 64 2c 6e 72 69 64 2c 30 29 3b  ify(rid,nrid,0);
4e40: 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61  .  db_end_transa
4e50: 63 74 69 6f 6e 28 30 29 3b 0a 20 20 61 75 74 6f  ction(0);.  auto
4e60: 73 79 6e 63 28 41 55 54 4f 53 59 4e 43 5f 50 55  sync(AUTOSYNC_PU
4e70: 53 48 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20  SH);  .  return 
4e80: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  1;.}../*.** COMM
4e90: 41 4e 44 3a 20 77 69 6b 69 0a 2a 2a 0a 2a 2a 20  AND: wiki.**.** 
4ea0: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 77  Usage: %fossil w
4eb0: 69 6b 69 20 28 65 78 70 6f 72 74 7c 63 72 65 61  iki (export|crea
4ec0: 74 65 7c 63 6f 6d 6d 69 74 7c 6c 69 73 74 29 20  te|commit|list) 
4ed0: 57 69 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 52  WikiName.**.** R
4ee0: 75 6e 20 76 61 72 69 6f 75 73 20 73 75 62 63 6f  un various subco
4ef0: 6d 6d 61 6e 64 73 20 74 6f 20 66 65 74 63 68 20  mmands to fetch 
4f00: 77 69 6b 69 20 65 6e 74 72 69 65 73 2e 0a 2a 2a  wiki entries..**
4f10: 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73 69 6c 20  .**     %fossil 
4f20: 77 69 6b 69 20 65 78 70 6f 72 74 20 50 41 47 45  wiki export PAGE
4f30: 4e 41 4d 45 20 3f 46 49 4c 45 3f 0a 2a 2a 0a 2a  NAME ?FILE?.**.*
4f40: 2a 20 20 20 20 20 20 20 20 53 65 6e 64 73 20 74  *        Sends t
4f50: 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
4f60: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 4e 41 4d  n of the PAGENAM
4f70: 45 20 77 69 6b 69 0a 2a 2a 20 20 20 20 20 20 20  E wiki.**       
4f80: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 67 69   entry to the gi
4f90: 76 65 6e 20 66 69 6c 65 20 6f 72 20 73 74 61 6e  ven file or stan
4fa0: 64 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a  dard output..**.
4fb0: 2a 2a 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77  **     %fossil w
4fc0: 69 6b 69 20 63 6f 6d 6d 69 74 20 50 41 47 45 4e  iki commit PAGEN
4fd0: 41 4d 45 20 3f 46 49 4c 45 3f 0a 2a 2a 0a 2a 2a  AME ?FILE?.**.**
4fe0: 20 20 20 20 20 20 20 20 43 6f 6d 6d 69 74 20 63          Commit c
4ff0: 68 61 6e 67 65 73 20 74 6f 20 61 20 77 69 6b 69  hanges to a wiki
5000: 20 70 61 67 65 20 66 72 6f 6d 20 46 49 4c 45 20   page from FILE 
5010: 6f 72 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64  or from standard
5020: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73  ..**.**     %fos
5030: 73 69 6c 20 77 69 6b 69 20 63 72 65 61 74 65 20  sil wiki create 
5040: 50 41 47 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 0a  PAGENAME ?FILE?.
5050: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 43 72 65  **.**        Cre
5060: 61 74 65 20 61 20 6e 65 77 20 77 69 6b 69 20 70  ate a new wiki p
5070: 61 67 65 20 77 69 74 68 20 69 6e 69 74 69 61 6c  age with initial
5080: 20 63 6f 6e 74 65 6e 74 20 74 61 6b 65 6e 20 66   content taken f
5090: 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20 20 46 49  rom.**        FI
50a0: 4c 45 20 6f 72 20 66 72 6f 6d 20 73 74 61 6e 64  LE or from stand
50b0: 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a  ard input..**.**
50c0: 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77 69 6b       %fossil wik
50d0: 69 20 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 20  i list.**.**    
50e0: 20 20 20 20 4c 69 73 74 73 20 61 6c 6c 20 77 69      Lists all wi
50f0: 6b 69 20 65 6e 74 72 69 65 73 2c 20 6f 6e 65 20  ki entries, one 
5100: 70 65 72 20 6c 69 6e 65 2c 20 6f 72 64 65 72 65  per line, ordere
5110: 64 0a 2a 2a 20 20 20 20 20 20 20 20 63 61 73 65  d.**        case
5120: 2d 69 6e 73 65 6e 74 69 76 65 6c 79 20 62 79 20  -insentively by 
5130: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  name..**.** TODO
5140: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f  s:.**.**     %fo
5150: 73 73 69 6c 20 77 69 6b 69 20 65 78 70 6f 72 74  ssil wiki export
5160: 20 3f 2d 75 20 41 52 54 49 46 41 43 54 3f 20 57   ?-u ARTIFACT? W
5170: 69 6b 69 4e 61 6d 65 20 3f 46 49 4c 45 3f 0a 2a  ikiName ?FILE?.*
5180: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 4f 75 74 70  *.**        Outp
5190: 75 74 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  uts the selected
51a0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6b 69   version of Wiki
51b0: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Name..**.**     
51c0: 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 64 65 6c  %fossil wiki del
51d0: 65 74 65 20 3f 2d 6d 20 4d 45 53 53 41 47 45 3f  ete ?-m MESSAGE?
51e0: 20 57 69 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20   WikiName.**.** 
51f0: 20 20 20 20 20 20 20 54 68 65 20 73 61 6d 65 20         The same 
5200: 61 73 20 64 65 6c 65 74 69 6e 67 20 61 20 66 69  as deleting a fi
5210: 6c 65 20 65 6e 74 72 79 2c 20 62 75 74 20 69 20  le entry, but i 
5220: 64 6f 6e 27 74 20 6b 6e 6f 77 20 69 66 20 66 6f  don't know if fo
5230: 73 73 69 6c 0a 2a 2a 20 20 20 20 20 20 20 20 73  ssil.**        s
5240: 75 70 70 6f 72 74 73 20 61 20 63 6f 6d 6d 69 74  upports a commit
5250: 20 6d 65 73 73 61 67 65 20 66 6f 72 20 57 69 6b   message for Wik
5260: 69 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  i entries..**.**
5270: 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77 69 6b       %fossil wik
5280: 69 20 3f 2d 75 3f 20 3f 2d 64 3f 20 3f 2d 73 3d  i ?-u? ?-d? ?-s=
5290: 5b 7c 5d 3f 20 6c 69 73 74 0a 2a 2a 0a 2a 2a 20  [|]? list.**.** 
52a0: 20 20 20 20 20 20 20 4c 69 73 74 73 20 74 68 65         Lists the
52b0: 20 61 72 74 69 66 61 63 74 20 49 44 20 61 6e 64   artifact ID and
52c0: 2f 6f 72 20 44 61 74 65 20 6f 66 20 6c 61 73 74  /or Date of last
52d0: 20 63 68 61 6e 67 65 20 61 6c 6f 6e 67 20 77 69   change along wi
52e0: 74 68 0a 2a 2a 20 20 20 20 20 20 20 20 65 61 63  th.**        eac
52f0: 68 20 65 6e 74 72 79 20 6e 61 6d 65 2c 20 64 65  h entry name, de
5300: 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 2d  limited by the -
5310: 73 20 63 68 61 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  s char..**.**   
5320: 20 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 64    %fossil wiki d
5330: 69 66 66 20 3f 41 52 54 49 46 41 43 54 3f 20 3f  iff ?ARTIFACT? ?
5340: 2d 66 20 69 6e 66 69 6c 65 5b 3d 73 74 64 69 6e  -f infile[=stdin
5350: 5d 3f 20 45 6e 74 72 79 4e 61 6d 65 0a 2a 2a 0a  ]? EntryName.**.
5360: 2a 2a 20 20 20 20 20 20 20 20 44 69 66 66 73 20  **        Diffs 
5370: 74 68 65 20 6c 6f 63 61 6c 20 63 6f 70 79 20 6f  the local copy o
5380: 66 20 61 20 70 61 67 65 20 77 69 74 68 20 61 20  f a page with a 
5390: 67 69 76 65 6e 20 76 65 72 73 69 6f 6e 20 28 64  given version (d
53a0: 65 66 61 75 6c 74 69 6e 67 0a 2a 2a 20 20 20 20  efaulting.**    
53b0: 20 20 20 20 74 6f 20 74 68 65 20 68 65 61 64 20      to the head 
53c0: 76 65 72 73 69 6f 6e 29 2e 0a 2a 2f 0a 76 6f 69  version)..*/.voi
53d0: 64 20 77 69 6b 69 5f 63 6d 64 28 76 6f 69 64 29  d wiki_cmd(void)
53e0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 64 62 5f  {.  int n;.  db_
53f0: 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65  find_and_open_re
5400: 70 6f 73 69 74 6f 72 79 28 31 29 3b 0a 20 20 69  pository(1);.  i
5410: 66 28 20 67 2e 61 72 67 63 3c 33 20 29 7b 0a 20  f( g.argc<3 ){. 
5420: 20 20 20 67 6f 74 6f 20 77 69 6b 69 5f 63 6d 64     goto wiki_cmd
5430: 5f 75 73 61 67 65 3b 0a 20 20 7d 0a 20 20 6e 20  _usage;.  }.  n 
5440: 3d 20 73 74 72 6c 65 6e 28 67 2e 61 72 67 76 5b  = strlen(g.argv[
5450: 32 5d 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20  2]);.  if( n==0 
5460: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6b 69  ){.    goto wiki
5470: 5f 63 6d 64 5f 75 73 61 67 65 3b 0a 20 20 7d 0a  _cmd_usage;.  }.
5480: 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67  .  if( strncmp(g
5490: 2e 61 72 67 76 5b 32 5d 2c 22 65 78 70 6f 72 74  .argv[2],"export
54a0: 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  ",n)==0 ){.    c
54b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 50 61 67 65  har const *zPage
54c0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Name;        /* 
54d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 77 69 6b 69  Name of the wiki
54e0: 20 70 61 67 65 20 74 6f 20 65 78 70 6f 72 74 20   page to export 
54f0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
5500: 74 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  t *zFile;       
5510: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5520: 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20  the output file 
5530: 28 30 3d 73 74 64 6f 75 74 29 20 2a 2f 0a 20 20  (0=stdout) */.  
5540: 20 20 69 6e 74 20 72 69 64 3b 20 20 20 20 20 20    int rid;      
5550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 74            /* Art
5560: 69 66 61 63 74 20 49 44 20 6f 66 20 74 68 65 20  ifact ID of the 
5570: 77 69 6b 69 20 70 61 67 65 20 2a 2f 0a 20 20 20  wiki page */.   
5580: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
55a0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
55b0: 63 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20 30 3b  char *zBody = 0;
55c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6b 69 20          /* Wiki 
55d0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  page content */.
55e0: 20 20 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 20      Manifest m; 
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5600: 61 72 73 65 64 20 77 69 6b 69 20 70 61 67 65 20  arsed wiki page 
5610: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 69  content */.    i
5620: 66 28 20 28 67 2e 61 72 67 63 21 3d 34 29 20 26  f( (g.argc!=4) &
5630: 26 20 28 67 2e 61 72 67 63 21 3d 35 29 20 29 7b  & (g.argc!=5) ){
5640: 0a 20 20 20 20 20 20 75 73 61 67 65 28 22 65 78  .      usage("ex
5650: 70 6f 72 74 20 50 41 47 45 4e 41 4d 45 20 3f 46  port PAGENAME ?F
5660: 49 4c 45 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ILE?");.    }.  
5670: 20 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20 67 2e    zPageName = g.
5680: 61 72 67 76 5b 33 5d 3b 0a 20 20 20 20 72 69 64  argv[3];.    rid
5690: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45   = db_int(0, "SE
56a0: 4c 45 43 54 20 78 2e 72 69 64 20 46 52 4f 4d 20  LECT x.rid FROM 
56b0: 74 61 67 20 74 2c 20 74 61 67 78 72 65 66 20 78  tag t, tagxref x
56c0: 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20  ".      " WHERE 
56d0: 78 2e 74 61 67 69 64 3d 74 2e 74 61 67 69 64 20  x.tagid=t.tagid 
56e0: 41 4e 44 20 74 2e 74 61 67 6e 61 6d 65 3d 27 77  AND t.tagname='w
56f0: 69 6b 69 2d 25 71 27 22 0a 20 20 20 20 20 20 22  iki-%q'".      "
5700: 20 4f 52 44 45 52 20 42 59 20 78 2e 6d 74 69 6d   ORDER BY x.mtim
5710: 65 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c  e DESC LIMIT 1",
5720: 0a 20 20 20 20 20 20 7a 50 61 67 65 4e 61 6d 65  .      zPageName
5730: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28   .    );.    if(
5740: 20 72 69 64 20 29 7b 0a 20 20 20 20 20 20 42 6c   rid ){.      Bl
5750: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20  ob content;.    
5760: 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69    content_get(ri
5770: 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  d, &content);.  
5780: 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 70 61 72      manifest_par
5790: 73 65 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29  se(&m, &content)
57a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 2e 74 79  ;.      if( m.ty
57b0: 70 65 3d 3d 43 46 54 59 50 45 5f 57 49 4b 49 20  pe==CFTYPE_WIKI 
57c0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 6f 64 79  ){.        zBody
57d0: 20 3d 20 6d 2e 7a 57 69 6b 69 3b 0a 20 20 20 20   = m.zWiki;.    
57e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
57f0: 28 20 7a 42 6f 64 79 3d 3d 30 20 29 7b 0a 20 20  ( zBody==0 ){.  
5800: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
5810: 28 22 77 69 6b 69 20 70 61 67 65 20 5b 25 73 5d  ("wiki page [%s]
5820: 20 6e 6f 74 20 66 6f 75 6e 64 22 2c 7a 50 61 67   not found",zPag
5830: 65 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eName);.    }.  
5840: 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
5850: 42 6f 64 79 29 3b 20 69 3e 30 20 26 26 20 69 73  Body); i>0 && is
5860: 73 70 61 63 65 28 7a 42 6f 64 79 5b 69 2d 31 5d  space(zBody[i-1]
5870: 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 46  ); i--){}.    zF
5880: 69 6c 65 20 20 3d 20 28 67 2e 61 72 67 63 3d 3d  ile  = (g.argc==
5890: 34 29 20 3f 20 30 20 3a 20 67 2e 61 72 67 76 5b  4) ? 0 : g.argv[
58a0: 34 5d 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c  4];.    if( zFil
58b0: 65 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  e ){.      FILE 
58c0: 2a 20 7a 46 3b 0a 20 20 20 20 20 20 73 68 6f 72  * zF;.      shor
58d0: 74 20 64 6f 43 6c 6f 73 65 20 3d 20 30 3b 0a 20  t doClose = 0;. 
58e0: 20 20 20 20 20 69 66 28 20 28 31 20 3d 3d 20 73       if( (1 == s
58f0: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 29 20 26 26  trlen(zFile)) &&
5900: 20 28 27 2d 27 3d 3d 7a 46 69 6c 65 5b 30 5d 29   ('-'==zFile[0])
5910: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 20 3d   ){.        zF =
5920: 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 7d   stdout;.      }
5930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46  else{.        zF
5940: 20 3d 20 66 6f 70 65 6e 28 20 7a 46 69 6c 65 2c   = fopen( zFile,
5950: 20 22 77 22 20 29 3b 0a 20 20 20 20 20 20 20 20   "w" );.        
5960: 64 6f 43 6c 6f 73 65 20 3d 20 7a 46 20 3f 20 31  doClose = zF ? 1
5970: 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   : 0;.      }.  
5980: 20 20 20 20 69 66 28 20 21 20 7a 46 20 29 7b 0a      if( ! zF ){.
5990: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66          fossil_f
59a0: 61 74 61 6c 28 22 77 69 6b 69 20 65 78 70 6f 72  atal("wiki expor
59b0: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e  t could not open
59c0: 20 6f 75 74 70 75 74 20 66 69 6c 65 20 66 6f 72   output file for
59d0: 20 77 72 69 74 69 6e 67 2e 22 29 3b 0a 20 20 20   writing.");.   
59e0: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
59f0: 74 66 28 7a 46 2c 22 25 2e 2a 73 5c 6e 22 2c 20  tf(zF,"%.*s\n", 
5a00: 69 2c 20 7a 42 6f 64 79 29 3b 0a 20 20 20 20 20  i, zBody);.     
5a10: 20 69 66 28 20 64 6f 43 6c 6f 73 65 20 29 20 66   if( doClose ) f
5a20: 63 6c 6f 73 65 28 7a 46 29 3b 0a 20 20 20 20 7d  close(zF);.    }
5a30: 65 6c 73 65 7b 0a 09 70 72 69 6e 74 66 28 22 25  else{..printf("%
5a40: 2e 2a 73 5c 6e 22 2c 20 69 2c 20 7a 42 6f 64 79  .*s\n", i, zBody
5a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
5a60: 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69  urn;.  }else.  i
5a70: 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67  f( strncmp(g.arg
5a80: 76 5b 32 5d 2c 22 63 6f 6d 6d 69 74 22 2c 6e 29  v[2],"commit",n)
5a90: 3d 3d 30 0a 20 20 20 20 20 20 7c 7c 20 73 74 72  ==0.      || str
5aa0: 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22  ncmp(g.argv[2],"
5ab0: 63 72 65 61 74 65 22 2c 6e 29 3d 3d 30 20 29 7b  create",n)==0 ){
5ac0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 61 67 65  .    char *zPage
5ad0: 4e 61 6d 65 3b 0a 20 20 20 20 42 6c 6f 62 20 63  Name;.    Blob c
5ae0: 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  ontent;.    if( 
5af0: 67 2e 61 72 67 63 21 3d 34 20 26 26 20 67 2e 61  g.argc!=4 && g.a
5b00: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 20 20  rgc!=5 ){.      
5b10: 75 73 61 67 65 28 22 63 6f 6d 6d 69 74 20 50 41  usage("commit PA
5b20: 47 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 22 29 3b  GENAME ?FILE?");
5b30: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 67 65  .    }.    zPage
5b40: 4e 61 6d 65 20 3d 20 67 2e 61 72 67 76 5b 33 5d  Name = g.argv[3]
5b50: 3b 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63  ;.    if( g.argc
5b60: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f  ==4 ){.      blo
5b70: 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 68 61 6e  b_read_from_chan
5b80: 6e 65 6c 28 26 63 6f 6e 74 65 6e 74 2c 20 73 74  nel(&content, st
5b90: 64 69 6e 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65  din, -1);.    }e
5ba0: 6c 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  lse{.      blob_
5bb0: 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26  read_from_file(&
5bc0: 63 6f 6e 74 65 6e 74 2c 20 67 2e 61 72 67 76 5b  content, g.argv[
5bd0: 34 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  4]);.    }.    i
5be0: 66 28 20 67 2e 61 72 67 76 5b 32 5d 5b 31 5d 3d  f( g.argv[2][1]=
5bf0: 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 77 69  ='r' ){.      wi
5c00: 6b 69 5f 63 6d 64 5f 63 6f 6d 6d 69 74 28 7a 50  ki_cmd_commit(zP
5c10: 61 67 65 4e 61 6d 65 2c 20 31 2c 20 26 63 6f 6e  ageName, 1, &con
5c20: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 70 72 69  tent);.      pri
5c30: 6e 74 66 28 22 43 72 65 61 74 65 64 20 6e 65 77  ntf("Created new
5c40: 20 77 69 6b 69 20 70 61 67 65 20 25 73 2e 5c 6e   wiki page %s.\n
5c50: 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  ", zPageName);. 
5c60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5c70: 77 69 6b 69 5f 63 6d 64 5f 63 6f 6d 6d 69 74 28  wiki_cmd_commit(
5c80: 7a 50 61 67 65 4e 61 6d 65 2c 20 30 2c 20 26 63  zPageName, 0, &c
5c90: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 70  ontent);.      p
5ca0: 72 69 6e 74 66 28 22 55 70 64 61 74 65 64 20 77  rintf("Updated w
5cb0: 69 6b 69 20 70 61 67 65 20 25 73 2e 5c 6e 22 2c  iki page %s.\n",
5cc0: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20   zPageName);.   
5cd0: 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65   }.    blob_rese
5ce0: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d  t(&content);.  }
5cf0: 65 6c 73 65 0a 20 20 69 66 28 20 73 74 72 6e 63  else.  if( strnc
5d00: 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 64 65  mp(g.argv[2],"de
5d10: 6c 65 74 65 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20  lete",n)==0 ){. 
5d20: 20 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 35     if( g.argc!=5
5d30: 20 29 7b 0a 20 20 20 20 20 20 75 73 61 67 65 28   ){.      usage(
5d40: 22 64 65 6c 65 74 65 20 50 41 47 45 4e 41 4d 45  "delete PAGENAME
5d50: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ");.    }.    fo
5d60: 73 73 69 6c 5f 66 61 74 61 6c 28 22 64 65 6c 65  ssil_fatal("dele
5d70: 74 65 20 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65  te not yet imple
5d80: 6d 65 6e 74 65 64 2e 22 29 3b 0a 20 20 7d 65 6c  mented.");.  }el
5d90: 73 65 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  se.  if( strncmp
5da0: 28 67 2e 61 72 67 76 5b 32 5d 2c 22 6c 69 73 74  (g.argv[2],"list
5db0: 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  ",n)==0 ){.    S
5dc0: 74 6d 74 20 71 3b 0a 20 20 20 20 64 62 5f 70 72  tmt q;.    db_pr
5dd0: 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20 20 20  epare(&q, .     
5de0: 20 22 53 45 4c 45 43 54 20 73 75 62 73 74 72 28   "SELECT substr(
5df0: 74 61 67 6e 61 6d 65 2c 20 36 29 20 46 52 4f 4d  tagname, 6) FROM
5e00: 20 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61   tag WHERE tagna
5e10: 6d 65 20 47 4c 4f 42 20 27 77 69 6b 69 2d 2a 27  me GLOB 'wiki-*'
5e20: 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20  ".      " ORDER 
5e30: 42 59 20 6c 6f 77 65 72 28 74 61 67 6e 61 6d 65  BY lower(tagname
5e40: 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  )".    );.    wh
5e50: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
5e60: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
5e70: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
5e80: 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c   *zName = db_col
5e90: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b  umn_text(&q, 0);
5ea0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 20 22  .      printf( "
5eb0: 25 73 5c 6e 22 2c 7a 4e 61 6d 65 29 3b 0a 20 20  %s\n",zName);.  
5ec0: 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c    }.    db_final
5ed0: 69 7a 65 28 26 71 29 3b 0a 20 20 7d 65 6c 73 65  ize(&q);.  }else
5ee0: 0a 20 20 7b 0a 20 20 20 20 67 6f 74 6f 20 77 69  .  {.    goto wi
5ef0: 6b 69 5f 63 6d 64 5f 75 73 61 67 65 3b 0a 20 20  ki_cmd_usage;.  
5f00: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 77 69 6b  }.  return;..wik
5f10: 69 5f 63 6d 64 5f 75 73 61 67 65 3a 0a 20 20 75  i_cmd_usage:.  u
5f20: 73 61 67 65 28 22 65 78 70 6f 72 74 7c 63 72 65  sage("export|cre
5f30: 61 74 65 7c 63 6f 6d 6d 69 74 7c 6c 69 73 74 20  ate|commit|list 
5f40: 2e 2e 2e 22 29 3b 0a 7d 0a                       ...");.}.