Hex Artifact Content
Not logged in

Artifact 45c7efaf6d4a91ec54f214f8961d60f92b0ecd4b:

File src/wiki.c part of check-in [9de6abab2a] - Miscellaneous cosmetic changes by eric on 2008-11-15 14:18:09.

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