Hex Artifact Content
Not logged in

Artifact 185275fa54ffb2f1f9a215c85d49881a91f45fc1:

File src/wiki.c part of check-in [d3e711fd2f] - Work toward getting bug-tracking working well. by drh on 2008-07-15 16:42:48.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 20 43 6f 70 79  ard Hipp.** Copy
0030: 72 69 67 68 74 20 28 63 29 20 32 30 30 38 20 53  right (c) 2008 S
0040: 74 65 70 68 61 6e 20 42 65 61 6c 0a 2a 2a 0a 2a  tephan Beal.**.*
0050: 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69  * This program i
0060: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 3b  s free software;
0070: 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72   you can redistr
0080: 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a  ibute it and/or.
0090: 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 64  ** modify it und
00a0: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
00b0: 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20  the GNU General 
00c0: 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73  Public.** Licens
00d0: 65 20 76 65 72 73 69 6f 6e 20 32 20 61 73 20 70  e version 2 as p
00e0: 75 62 6c 69 73 68 65 64 20 62 79 20 74 68 65 20  ublished by the 
00f0: 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f  Free Software Fo
0100: 75 6e 64 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  undation..**.** 
0110: 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20  This program is 
0120: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 74  distributed in t
0130: 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74 20  he hope that it 
0140: 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a  will be useful,.
0150: 2a 2a 20 62 75 74 20 57 49 54 48 4f 55 54 20 41  ** but WITHOUT A
0160: 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74  NY WARRANTY; wit
0170: 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d  hout even the im
0180: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f  plied warranty o
0190: 66 0a 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49  f.** MERCHANTABI
01a0: 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20  LITY or FITNESS 
01b0: 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52  FOR A PARTICULAR
01c0: 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74   PURPOSE.  See t
01d0: 68 65 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61  he GNU.** Genera
01e0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65  l Public License
01f0: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
0200: 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68  s..** .** You sh
0210: 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 69 76  ould have receiv
0220: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
0230: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
0240: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61  lic.** License a
0250: 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c  long with this l
0260: 69 62 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20  ibrary; if not, 
0270: 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20  write to the.** 
0280: 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f  Free Software Fo
0290: 75 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20  undation, Inc., 
02a0: 35 39 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20  59 Temple Place 
02b0: 2d 20 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20  - Suite 330,.** 
02c0: 42 6f 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31  Boston, MA  0211
02d0: 31 2d 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a  1-1307, USA..**.
02e0: 2a 2a 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63  ** Author contac
02f0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a  t information:.*
0300: 2a 20 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f  *   drh@hwaci.co
0310: 6d 0a 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77  m.**   http://ww
0320: 77 2e 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f  w.hwaci.com/drh/
0330: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0390: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
03a0: 65 20 74 6f 20 64 6f 20 66 6f 72 6d 61 74 74 69  e to do formatti
03b0: 6e 67 20 6f 66 20 77 69 6b 69 20 74 65 78 74 2e  ng of wiki text.
03c0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .*/.#include <as
03d0: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
03e0: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c   <ctype.h>.#incl
03f0: 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23  ude "config.h".#
0400: 69 6e 63 6c 75 64 65 20 22 77 69 6b 69 2e 68 22  include "wiki.h"
0410: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0420: 72 75 65 20 69 66 20 74 68 65 20 69 6e 70 75 74  rue if the input
0430: 20 73 74 72 69 6e 67 20 69 73 20 61 20 77 65 6c   string is a wel
0440: 6c 2d 66 6f 72 6d 65 64 20 77 69 6b 69 20 70 61  l-formed wiki pa
0450: 67 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 57  ge name..**.** W
0460: 65 6c 6c 2d 66 6f 72 6d 65 64 20 77 69 6b 69 20  ell-formed wiki 
0470: 70 61 67 65 20 6e 61 6d 65 73 20 64 6f 20 6e 6f  page names do no
0480: 74 20 62 65 67 69 6e 20 6f 72 20 65 6e 64 20 77  t begin or end w
0490: 69 74 68 20 77 68 69 74 65 73 70 61 63 65 2c 0a  ith whitespace,.
04a0: 2a 2a 20 61 6e 64 20 64 6f 20 6e 6f 74 20 63 6f  ** and do not co
04b0: 6e 74 61 69 6e 20 74 61 62 73 20 6f 72 20 6f 74  ntain tabs or ot
04c0: 68 65 72 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72  her control char
04d0: 61 63 74 65 72 73 20 61 6e 64 20 64 6f 20 6e 6f  acters and do no
04e0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  t.** contain mor
04f0: 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20  e than a single 
0500: 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20  space character 
0510: 69 6e 20 61 20 72 6f 77 2e 20 20 57 65 6c 6c 2d  in a row.  Well-
0520: 66 6f 72 6d 65 64 0a 2a 2a 20 6e 61 6d 65 73 20  formed.** names 
0530: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
0540: 33 20 61 6e 64 20 31 30 30 20 63 68 72 61 63 74  3 and 100 chract
0550: 65 72 73 20 69 6e 20 6c 65 6e 67 74 68 2c 20 69  ers in length, i
0560: 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 69 6e 74  nclusive..*/.int
0570: 20 77 69 6b 69 5f 6e 61 6d 65 5f 69 73 5f 77 65   wiki_name_is_we
0580: 6c 6c 66 6f 72 6d 65 64 28 63 6f 6e 73 74 20 63  llformed(const c
0590: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
05a0: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3c 3d 30 78  ;.  if( z[0]<=0x
05b0: 32 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  20 ){.    return
05c0: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
05d0: 31 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  1; z[i]; i++){. 
05e0: 20 20 20 69 66 28 20 7a 5b 69 5d 3c 30 78 32 30     if( z[i]<0x20
05f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
0600: 20 69 66 28 20 7a 5b 69 5d 3d 3d 30 78 32 30 20   if( z[i]==0x20 
0610: 26 26 20 7a 5b 69 2d 31 5d 3d 3d 30 78 32 30 20  && z[i-1]==0x20 
0620: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
0630: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 3d 3d 27 20    if( z[i-1]==' 
0640: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
0650: 69 66 28 20 69 3c 33 20 7c 7c 20 69 3e 31 30 30  if( i<3 || i>100
0660: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
0670: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
0680: 2a 20 43 68 65 63 6b 20 61 20 77 69 6b 69 20 6e  * Check a wiki n
0690: 61 6d 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ame.  If it is n
06a0: 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20  ot well-formed, 
06b0: 74 68 65 6e 20 69 73 73 75 65 20 61 6e 20 65 72  then issue an er
06c0: 72 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ror.** and retur
06d0: 6e 20 74 72 75 65 2e 20 20 49 66 20 69 74 20 69  n true.  If it i
06e0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20 72  s well-formed, r
06f0: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
0700: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
0710: 5f 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  _name(const char
0720: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 21 77 69 6b   *z){.  if( !wik
0730: 69 5f 6e 61 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f  i_name_is_wellfo
0740: 72 6d 65 64 28 7a 29 20 29 7b 0a 20 20 20 20 73  rmed(z) ){.    s
0750: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 57 69 6b  tyle_header("Wik
0760: 69 20 50 61 67 65 20 4e 61 6d 65 20 45 72 72 6f  i Page Name Erro
0770: 72 22 29 3b 0a 20 20 20 20 40 20 54 68 65 20 77  r");.    @ The w
0780: 69 6b 69 20 6e 61 6d 65 20 22 3c 62 3e 25 68 28  iki name "<b>%h(
0790: 7a 29 3c 2f 62 3e 22 20 69 73 20 6e 6f 74 20 77  z)</b>" is not w
07a0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 52 75 6c  ell-formed.  Rul
07b0: 65 73 20 66 6f 72 0a 20 20 20 20 40 20 77 69 6b  es for.    @ wik
07c0: 69 20 70 61 67 65 20 6e 61 6d 65 73 3a 0a 20 20  i page names:.  
07d0: 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 40 20 3c    @ <ul>.    @ <
07e0: 6c 69 3e 20 4d 75 73 74 20 6e 6f 74 20 62 65 67  li> Must not beg
07f0: 69 6e 20 6f 72 20 65 6e 64 20 77 69 74 68 20 61  in or end with a
0800: 20 73 70 61 63 65 2e 0a 20 20 20 20 40 20 3c 6c   space..    @ <l
0810: 69 3e 20 4d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  i> Must not cont
0820: 61 69 6e 20 61 6e 79 20 63 6f 6e 74 72 6f 6c 20  ain any control 
0830: 63 68 61 72 61 63 74 65 72 73 2c 20 69 6e 63 6c  characters, incl
0840: 75 64 69 6e 67 20 74 61 62 20 6f 72 0a 20 20 20  uding tab or.   
0850: 20 40 20 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e   @      newline.
0860: 0a 20 20 20 20 40 20 3c 6c 69 3e 20 4d 75 73 74  .    @ <li> Must
0870: 20 6e 6f 74 20 68 61 76 65 20 74 77 6f 20 6f 72   not have two or
0880: 20 6d 6f 72 65 20 73 70 61 63 65 73 20 69 6e 20   more spaces in 
0890: 61 20 72 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79  a row internally
08a0: 2e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 4d 75 73  ..    @ <li> Mus
08b0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 33 20 61  t be between 3 a
08c0: 6e 64 20 31 30 30 20 63 68 61 72 61 63 74 65 72  nd 100 character
08d0: 73 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 20 20 20  s in length..   
08e0: 20 40 20 3c 2f 75 6c 3e 0a 20 20 20 20 73 74 79   @ </ul>.    sty
08f0: 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20  le_footer();.   
0900: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
0910: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
0920: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 68 6f 6d  .** WEBPAGE: hom
0930: 65 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 69 6e  e.** WEBPAGE: in
0940: 64 65 78 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  dex.** WEBPAGE: 
0950: 6e 6f 74 5f 66 6f 75 6e 64 0a 2a 2f 0a 76 6f 69  not_found.*/.voi
0960: 64 20 68 6f 6d 65 5f 70 61 67 65 28 76 6f 69 64  d home_page(void
0970: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 61 67 65  ){.  char *zPage
0980: 4e 61 6d 65 20 3d 20 64 62 5f 67 65 74 28 22 70  Name = db_get("p
0990: 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 30 29 3b  roject-name",0);
09a0: 0a 20 20 69 66 28 20 7a 50 61 67 65 4e 61 6d 65  .  if( zPageName
09b0: 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 63 68   ){.    login_ch
09c0: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
09d0: 29 3b 0a 20 20 20 20 67 2e 7a 45 78 74 72 61 20  );.    g.zExtra 
09e0: 3d 20 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 20  = zPageName;.   
09f0: 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74   cgi_set_paramet
0a00: 65 72 5f 6e 6f 63 6f 70 79 28 22 6e 61 6d 65 22  er_nocopy("name"
0a10: 2c 20 67 2e 7a 45 78 74 72 61 29 3b 0a 20 20 20  , g.zExtra);.   
0a20: 20 67 2e 6f 6b 52 64 57 69 6b 69 20 3d 20 31 3b   g.okRdWiki = 1;
0a30: 0a 20 20 20 20 67 2e 6f 6b 41 70 6e 64 57 69 6b  .    g.okApndWik
0a40: 69 20 3d 20 30 3b 0a 20 20 20 20 67 2e 6f 6b 57  i = 0;.    g.okW
0a50: 72 57 69 6b 69 20 3d 20 30 3b 0a 20 20 20 20 67  rWiki = 0;.    g
0a60: 2e 6f 6b 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a  .okHistory = 0;.
0a70: 20 20 20 20 77 69 6b 69 5f 70 61 67 65 28 29 3b      wiki_page();
0a80: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
0a90: 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
0aa0: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
0ab0: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 48 6f  style_header("Ho
0ac0: 6d 65 22 29 3b 0a 20 20 40 20 3c 70 3e 54 68 69  me");.  @ <p>Thi
0ad0: 73 20 69 73 20 61 20 73 74 75 62 20 68 6f 6d 65  s is a stub home
0ae0: 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 70 72  -page for the pr
0af0: 6f 6a 65 63 74 2e 0a 20 20 40 20 54 6f 20 66 69  oject..  @ To fi
0b00: 6c 6c 20 69 6e 20 74 68 69 73 20 70 61 67 65 2c  ll in this page,
0b10: 20 66 69 72 73 74 20 67 6f 20 74 6f 0a 20 20 40   first go to.  @
0b20: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
0b30: 42 61 73 65 55 52 4c 29 2f 73 65 74 75 70 5f 63  BaseURL)/setup_c
0b40: 6f 6e 66 69 67 22 3e 73 65 74 75 70 2f 63 6f 6e  onfig">setup/con
0b50: 66 69 67 3c 2f 61 3e 0a 20 20 40 20 61 6e 64 20  fig</a>.  @ and 
0b60: 65 73 74 61 62 6c 69 73 68 20 61 20 22 50 72 6f  establish a "Pro
0b70: 6a 65 63 74 20 4e 61 6d 65 22 2e 20 20 54 68 65  ject Name".  The
0b80: 6e 20 63 72 65 61 74 65 20 61 0a 20 20 40 20 77  n create a.  @ w
0b90: 69 6b 69 20 70 61 67 65 20 77 69 74 68 20 74 68  iki page with th
0ba0: 61 74 20 6e 61 6d 65 2e 20 20 54 68 65 20 63 6f  at name.  The co
0bb0: 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 77 69  ntent of that wi
0bc0: 6b 69 20 70 61 67 65 0a 20 20 40 20 77 69 6c 6c  ki page.  @ will
0bd0: 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e   be displayed in
0be0: 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 20 6d   place of this m
0bf0: 65 73 73 61 67 65 2e 0a 20 20 73 74 79 6c 65 5f  essage..  style_
0c00: 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a  footer();.}../*.
0c10: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
0c20: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
0c30: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
0c40: 20 6f 66 20 74 68 65 20 73 61 6e 64 62 6f 78 0a   of the sandbox.
0c50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
0c60: 5f 73 61 6e 64 62 6f 78 28 63 6f 6e 73 74 20 63  _sandbox(const c
0c70: 68 61 72 20 2a 7a 50 61 67 65 6e 61 6d 65 29 7b  har *zPagename){
0c80: 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 61 73  .  return strcas
0c90: 65 63 6d 70 28 7a 50 61 67 65 6e 61 6d 65 2c 22  ecmp(zPagename,"
0ca0: 73 61 6e 64 62 6f 78 22 29 3d 3d 30 20 7c 7c 0a  sandbox")==0 ||.
0cb0: 20 20 20 20 20 20 20 20 20 73 74 72 63 61 73 65           strcase
0cc0: 63 6d 70 28 7a 50 61 67 65 6e 61 6d 65 2c 22 73  cmp(zPagename,"s
0cd0: 61 6e 64 20 62 6f 78 22 29 3d 3d 30 3b 0a 7d 0a  and box")==0;.}.
0ce0: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
0cf0: 77 69 6b 69 0a 2a 2a 20 55 52 4c 3a 20 2f 77 69  wiki.** URL: /wi
0d00: 6b 69 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d 45  ki?name=PAGENAME
0d10: 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 70 61  .*/.void wiki_pa
0d20: 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72  ge(void){.  char
0d30: 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74 20 72 69   *zTag;.  int ri
0d40: 64 3b 0a 20 20 69 6e 74 20 69 73 53 61 6e 64 62  d;.  int isSandb
0d50: 6f 78 3b 0a 20 20 42 6c 6f 62 20 77 69 6b 69 3b  ox;.  Blob wiki;
0d60: 0a 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20  .  Manifest m;. 
0d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
0d80: 67 65 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a  geName;.  char *
0d90: 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 3b 0a 20  zHtmlPageName;. 
0da0: 20 63 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20 6d   char *zBody = m
0db0: 70 72 69 6e 74 66 28 22 25 73 22 2c 22 3c 69 3e  printf("%s","<i>
0dc0: 45 6d 70 74 79 20 50 61 67 65 3c 2f 69 3e 22 29  Empty Page</i>")
0dd0: 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  ;..  login_check
0de0: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
0df0: 20 20 69 66 28 20 21 67 2e 6f 6b 52 64 57 69 6b    if( !g.okRdWik
0e00: 69 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  i ){ login_neede
0e10: 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  d(); return; }. 
0e20: 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20 50 28 22   zPageName = P("
0e30: 6e 61 6d 65 22 29 3b 0a 20 20 69 66 28 20 7a 50  name");.  if( zP
0e40: 61 67 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ageName==0 ){.  
0e50: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
0e60: 57 69 6b 69 22 29 3b 0a 20 20 20 20 40 20 3c 75  Wiki");.    @ <u
0e70: 6c 3e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 3c 61  l>.    @ <li> <a
0e80: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73   href="%s(g.zBas
0e90: 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 79  eURL)/timeline?y
0ea0: 3d 77 22 3e 52 65 63 65 6e 74 20 63 68 61 6e 67  =w">Recent chang
0eb0: 65 73 3c 2f 61 3e 20 74 6f 20 77 69 6b 69 0a 20  es</a> to wiki. 
0ec0: 20 20 20 40 20 20 20 20 20 20 70 61 67 65 73 2e     @      pages.
0ed0: 20 3c 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 6c 69   </li>.    @ <li
0ee0: 3e 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  > <a href="%s(g.
0ef0: 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b 69 5f 72  zBaseURL)/wiki_r
0f00: 75 6c 65 73 22 3e 46 6f 72 6d 61 74 74 69 6e 67  ules">Formatting
0f10: 20 72 75 6c 65 73 3c 2f 61 3e 20 66 6f 72 20 0a   rules</a> for .
0f20: 20 20 20 20 40 20 20 20 20 20 20 77 69 6b 69 2e      @      wiki.
0f30: 3c 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 6c 69 3e  </li>.    @ <li>
0f40: 20 55 73 65 20 74 68 65 20 3c 61 20 68 72 65 66   Use the <a href
0f50: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
0f60: 2f 77 69 6b 69 3f 6e 61 6d 65 3d 53 61 6e 64 62  /wiki?name=Sandb
0f70: 6f 78 22 3e 53 61 6e 64 62 6f 78 3c 2f 61 3e 0a  ox">Sandbox</a>.
0f80: 20 20 20 20 40 20 20 20 20 20 20 74 6f 20 65 78      @      to ex
0f90: 70 65 72 69 6d 65 6e 74 2e 3c 2f 6c 69 3e 0a 20  periment.</li>. 
0fa0: 20 20 20 40 20 3c 6c 69 3e 20 3c 61 20 68 72 65     @ <li> <a hre
0fb0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
0fc0: 29 2f 77 63 6f 6e 74 65 6e 74 22 3e 4c 69 73 74  )/wcontent">List
0fd0: 20 6f 66 20 41 6c 6c 20 57 69 6b 69 20 50 61 67   of All Wiki Pag
0fe0: 65 73 3c 2f 61 3e 0a 20 20 20 20 40 20 20 20 20  es</a>.    @    
0ff0: 20 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74    available on t
1000: 68 69 73 20 73 65 72 76 65 72 2e 3c 2f 6c 69 3e  his server.</li>
1010: 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 20  .    @ </ul>.   
1020: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
1030: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1040: 0a 20 20 69 66 28 20 63 68 65 63 6b 5f 6e 61 6d  .  if( check_nam
1050: 65 28 7a 50 61 67 65 4e 61 6d 65 29 20 29 20 72  e(zPageName) ) r
1060: 65 74 75 72 6e 3b 0a 20 20 69 73 53 61 6e 64 62  eturn;.  isSandb
1070: 6f 78 20 3d 20 69 73 5f 73 61 6e 64 62 6f 78 28  ox = is_sandbox(
1080: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66  zPageName);.  if
1090: 28 20 69 73 53 61 6e 64 62 6f 78 20 29 7b 0a 20  ( isSandbox ){. 
10a0: 20 20 20 7a 42 6f 64 79 20 3d 20 64 62 5f 67 65     zBody = db_ge
10b0: 74 28 22 73 61 6e 64 62 6f 78 22 2c 7a 42 6f 64  t("sandbox",zBod
10c0: 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
10d0: 20 7a 54 61 67 20 3d 20 6d 70 72 69 6e 74 66 28   zTag = mprintf(
10e0: 22 77 69 6b 69 2d 25 73 22 2c 20 7a 50 61 67 65  "wiki-%s", zPage
10f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 69 64 20 3d  Name);.    rid =
1100: 20 64 62 5f 69 6e 74 28 30 2c 20 0a 20 20 20 20   db_int(0, .    
1110: 20 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52    "SELECT rid FR
1120: 4f 4d 20 74 61 67 78 72 65 66 22 0a 20 20 20 20  OM tagxref".    
1130: 20 20 22 20 57 48 45 52 45 20 74 61 67 69 64 3d    " WHERE tagid=
1140: 28 53 45 4c 45 43 54 20 74 61 67 69 64 20 46 52  (SELECT tagid FR
1150: 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74 61 67  OM tag WHERE tag
1160: 6e 61 6d 65 3d 25 51 29 22 0a 20 20 20 20 20 20  name=%Q)".      
1170: 22 20 4f 52 44 45 52 20 42 59 20 6d 74 69 6d 65  " ORDER BY mtime
1180: 20 44 45 53 43 22 2c 20 7a 54 61 67 0a 20 20 20   DESC", zTag.   
1190: 20 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 61   );.    free(zTa
11a0: 67 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  g);.    memset(&
11b0: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
11c0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ;.    blob_zero(
11d0: 26 6d 2e 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  &m.content);.   
11e0: 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20   if( rid ){.    
11f0: 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a    Blob content;.
1200: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65        content_ge
1210: 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29  t(rid, &content)
1220: 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66 65 73 74  ;.      manifest
1230: 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e 74  _parse(&m, &cont
1240: 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
1250: 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 57  m.type==CFTYPE_W
1260: 49 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IKI ){.        z
1270: 42 6f 64 79 20 3d 20 6d 2e 7a 57 69 6b 69 3b 0a  Body = m.zWiki;.
1280: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1290: 7d 0a 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f  }.  if( isSandbo
12a0: 78 20 7c 7c 20 28 72 69 64 20 26 26 20 67 2e 6f  x || (rid && g.o
12b0: 6b 57 72 57 69 6b 69 29 20 7c 7c 20 28 21 72 69  kWrWiki) || (!ri
12c0: 64 20 26 26 20 67 2e 6f 6b 4e 65 77 57 69 6b 69  d && g.okNewWiki
12d0: 29 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73  ) ){.    style_s
12e0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
12f0: 45 64 69 74 22 2c 20 22 45 64 69 74 20 57 69 6b  Edit", "Edit Wik
1300: 69 20 50 61 67 65 22 2c 20 22 25 73 2f 77 69 6b  i Page", "%s/wik
1310: 69 65 64 69 74 3f 6e 61 6d 65 3d 25 54 22 2c 0a  iedit?name=%T",.
1320: 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c           g.zTop,
1330: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d   zPageName);.  }
1340: 0a 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f 78  .  if( isSandbox
1350: 20 7c 7c 20 28 72 69 64 20 26 26 20 67 2e 6f 6b   || (rid && g.ok
1360: 41 70 6e 64 57 69 6b 69 29 20 29 7b 0a 20 20 20  ApndWiki) ){.   
1370: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
1380: 6c 65 6d 65 6e 74 28 22 41 70 70 65 6e 64 22 2c  lement("Append",
1390: 20 22 41 64 64 20 41 20 43 6f 6d 6d 65 6e 74 22   "Add A Comment"
13a0: 2c 20 22 25 73 2f 77 69 6b 69 61 70 70 65 6e 64  , "%s/wikiappend
13b0: 3f 6e 61 6d 65 3d 25 54 22 2c 0a 20 20 20 20 20  ?name=%T",.     
13c0: 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 50 61 67      g.zTop, zPag
13d0: 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  eName);.  }.  if
13e0: 28 20 21 69 73 53 61 6e 64 62 6f 78 20 26 26 20  ( !isSandbox && 
13f0: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
1400: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
1410: 5f 65 6c 65 6d 65 6e 74 28 22 48 69 73 74 6f 72  _element("Histor
1420: 79 22 2c 20 22 48 69 73 74 6f 72 79 22 2c 20 22  y", "History", "
1430: 25 73 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d 65  %s/whistory?name
1440: 3d 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 67  =%T",.         g
1450: 2e 7a 54 6f 70 2c 20 7a 50 61 67 65 4e 61 6d 65  .zTop, zPageName
1460: 29 3b 0a 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61  );.  }.  zHtmlPa
1470: 67 65 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66  geName = mprintf
1480: 28 22 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65  ("%h", zPageName
1490: 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  );.  style_heade
14a0: 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 29  r(zHtmlPageName)
14b0: 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 77  ;.  blob_init(&w
14c0: 69 6b 69 2c 20 7a 42 6f 64 79 2c 20 2d 31 29 3b  iki, zBody, -1);
14d0: 0a 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28  .  wiki_convert(
14e0: 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20  &wiki, 0, 0);.  
14f0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69  blob_reset(&wiki
1500: 29 3b 0a 20 20 69 66 28 20 21 69 73 53 61 6e 64  );.  if( !isSand
1510: 62 6f 78 20 29 7b 0a 20 20 20 20 6d 61 6e 69 66  box ){.    manif
1520: 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20  est_clear(&m);. 
1530: 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65   }.  style_foote
1540: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  r();.}../*.** WE
1550: 42 50 41 47 45 3a 20 77 69 6b 69 65 64 69 74 0a  BPAGE: wikiedit.
1560: 2a 2a 20 55 52 4c 3a 20 2f 77 69 6b 69 65 64 69  ** URL: /wikiedi
1570: 74 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d 45 0a  t?name=PAGENAME.
1580: 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 65 64 69 74  */.void wikiedit
1590: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63  _page(void){.  c
15a0: 68 61 72 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74  har *zTag;.  int
15b0: 20 72 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20   rid = 0;.  int 
15c0: 69 73 53 61 6e 64 62 6f 78 3b 0a 20 20 42 6c 6f  isSandbox;.  Blo
15d0: 62 20 77 69 6b 69 3b 0a 20 20 4d 61 6e 69 66 65  b wiki;.  Manife
15e0: 73 74 20 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  st m;.  const ch
15f0: 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20  ar *zPageName;. 
1600: 20 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65   char *zHtmlPage
1610: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
1620: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1630: 20 20 63 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20    char *zBody = 
1640: 28 63 68 61 72 2a 29 50 28 22 77 22 29 3b 0a 0a  (char*)P("w");..
1650: 20 20 69 66 28 20 7a 42 6f 64 79 20 29 7b 0a 20    if( zBody ){. 
1660: 20 20 20 7a 42 6f 64 79 20 3d 20 6d 70 72 69 6e     zBody = mprin
1670: 74 66 28 22 25 73 22 2c 20 7a 42 6f 64 79 29 3b  tf("%s", zBody);
1680: 0a 20 20 7d 0a 20 20 6c 6f 67 69 6e 5f 63 68 65  .  }.  login_che
1690: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
16a0: 3b 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20  ;.  zPageName = 
16b0: 50 44 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a 20  PD("name","");. 
16c0: 20 69 66 28 20 63 68 65 63 6b 5f 6e 61 6d 65 28   if( check_name(
16d0: 7a 50 61 67 65 4e 61 6d 65 29 20 29 20 72 65 74  zPageName) ) ret
16e0: 75 72 6e 3b 0a 20 20 69 73 53 61 6e 64 62 6f 78  urn;.  isSandbox
16f0: 20 3d 20 69 73 5f 73 61 6e 64 62 6f 78 28 7a 50   = is_sandbox(zP
1700: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ageName);.  if( 
1710: 69 73 53 61 6e 64 62 6f 78 20 29 7b 0a 20 20 20  isSandbox ){.   
1720: 20 69 66 28 20 7a 42 6f 64 79 3d 3d 30 20 29 7b   if( zBody==0 ){
1730: 0a 20 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 64  .      zBody = d
1740: 62 5f 67 65 74 28 22 73 61 6e 64 62 6f 78 22 2c  b_get("sandbox",
1750: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
1760: 73 65 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d  se{.    zTag = m
1770: 70 72 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22  printf("wiki-%s"
1780: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  , zPageName);.  
1790: 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30    rid = db_int(0
17a0: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
17b0: 20 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65   rid FROM tagxre
17c0: 66 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  f".      " WHERE
17d0: 20 74 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74   tagid=(SELECT t
17e0: 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48  agid FROM tag WH
17f0: 45 52 45 20 74 61 67 6e 61 6d 65 3d 25 51 29 22  ERE tagname=%Q)"
1800: 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  .      " ORDER B
1810: 59 20 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a  Y mtime DESC", z
1820: 54 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66  Tag.    );.    f
1830: 72 65 65 28 7a 54 61 67 29 3b 0a 20 20 20 20 69  ree(zTag);.    i
1840: 66 28 20 28 72 69 64 20 26 26 20 21 67 2e 6f 6b  f( (rid && !g.ok
1850: 57 72 57 69 6b 69 29 20 7c 7c 20 28 21 72 69 64  WrWiki) || (!rid
1860: 20 26 26 20 21 67 2e 6f 6b 4e 65 77 57 69 6b 69   && !g.okNewWiki
1870: 29 20 29 7b 0a 20 20 20 20 20 20 6c 6f 67 69 6e  ) ){.      login
1880: 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 20 20 20  _needed();.     
1890: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
18a0: 20 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c     memset(&m, 0,
18b0: 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 20   sizeof(m));.   
18c0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 2e 63 6f   blob_zero(&m.co
18d0: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
18e0: 72 69 64 20 26 26 20 7a 42 6f 64 79 3d 3d 30 20  rid && zBody==0 
18f0: 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 63 6f  ){.      Blob co
1900: 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 63 6f 6e  ntent;.      con
1910: 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63  tent_get(rid, &c
1920: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d  ontent);.      m
1930: 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d  anifest_parse(&m
1940: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  , &content);.   
1950: 20 20 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43     if( m.type==C
1960: 46 54 59 50 45 5f 57 49 4b 49 20 29 7b 0a 20 20  FTYPE_WIKI ){.  
1970: 20 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d 2e        zBody = m.
1980: 7a 57 69 6b 69 3b 0a 20 20 20 20 20 20 7d 0a 20  zWiki;.      }. 
1990: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 50     }.  }.  if( P
19a0: 28 22 73 75 62 6d 69 74 22 29 21 3d 30 20 26 26  ("submit")!=0 &&
19b0: 20 7a 42 6f 64 79 21 3d 30 20 29 7b 0a 20 20 20   zBody!=0 ){.   
19c0: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20   char *zDate;.  
19d0: 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20    Blob cksum;.  
19e0: 20 20 69 6e 74 20 6e 72 69 64 3b 0a 20 20 20 20    int nrid;.    
19f0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b 69 29  blob_zero(&wiki)
1a00: 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74  ;.    db_begin_t
1a10: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
1a20: 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f 78 20    if( isSandbox 
1a30: 29 7b 0a 20 20 20 20 20 20 64 62 5f 73 65 74 28  ){.      db_set(
1a40: 22 73 61 6e 64 62 6f 78 22 2c 7a 42 6f 64 79 2c  "sandbox",zBody,
1a50: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1a60: 20 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62 5f       zDate = db_
1a70: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
1a80: 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 22  datetime('now')"
1a90: 29 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 5b 31  );.      zDate[1
1aa0: 30 5d 20 3d 20 27 54 27 3b 0a 20 20 20 20 20 20  0] = 'T';.      
1ab0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
1ac0: 6b 69 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44  ki, "D %s\n", zD
1ad0: 61 74 65 29 3b 0a 20 20 20 20 20 20 66 72 65 65  ate);.      free
1ae0: 28 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20 62  (zDate);.      b
1af0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b  lob_appendf(&wik
1b00: 69 2c 20 22 4c 20 25 46 5c 6e 22 2c 20 7a 50 61  i, "L %F\n", zPa
1b10: 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  geName);.      i
1b20: 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20 20 20  f( rid ){.      
1b30: 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20    char *zUuid = 
1b40: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
1b50: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
1b60: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
1b70: 20 72 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62   rid);.        b
1b80: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b  lob_appendf(&wik
1b90: 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a 55 75  i, "P %s\n", zUu
1ba0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  id);.        fre
1bb0: 65 28 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20  e(zUuid);.      
1bc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 67 2e 7a 4c  }.      if( g.zL
1bd0: 6f 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ogin ){.        
1be0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
1bf0: 6b 69 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e  ki, "U %F\n", g.
1c00: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20 20 7d  zLogin);.      }
1c10: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
1c20: 6e 64 66 28 26 77 69 6b 69 2c 20 22 57 20 25 64  ndf(&wiki, "W %d
1c30: 5c 6e 25 73 5c 6e 22 2c 20 73 74 72 6c 65 6e 28  \n%s\n", strlen(
1c40: 7a 42 6f 64 79 29 2c 20 7a 42 6f 64 79 29 3b 0a  zBody), zBody);.
1c50: 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c 6f        md5sum_blo
1c60: 62 28 26 77 69 6b 69 2c 20 26 63 6b 73 75 6d 29  b(&wiki, &cksum)
1c70: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
1c80: 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 5a 20 25  endf(&wiki, "Z %
1c90: 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  b\n", &cksum);. 
1ca0: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
1cb0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 6e  &cksum);.      n
1cc0: 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75  rid = content_pu
1cd0: 74 28 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a  t(&wiki, 0, 0);.
1ce0: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
1cf0: 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49  xec("INSERT OR I
1d00: 47 4e 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e  GNORE INTO unsen
1d10: 74 20 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e  t VALUES(%d)", n
1d20: 72 69 64 29 3b 0a 20 20 20 20 20 20 6d 61 6e 69  rid);.      mani
1d30: 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e  fest_crosslink(n
1d40: 72 69 64 2c 20 26 77 69 6b 69 29 3b 0a 20 20 20  rid, &wiki);.   
1d50: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77     blob_reset(&w
1d60: 69 6b 69 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  iki);.      cont
1d70: 65 6e 74 5f 64 65 6c 74 69 66 79 28 72 69 64 2c  ent_deltify(rid,
1d80: 20 6e 72 69 64 2c 20 30 29 3b 0a 20 20 20 20 7d   nrid, 0);.    }
1d90: 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e  .    db_end_tran
1da0: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20  saction(0);.    
1db0: 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 77  cgi_redirectf("w
1dc0: 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50  iki?name=%T", zP
1dd0: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ageName);.  }.  
1de0: 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 21  if( P("cancel")!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65  =0 ){.    cgi_re
1e00: 64 69 72 65 63 74 66 28 22 77 69 6b 69 3f 6e 61  directf("wiki?na
1e10: 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65 4e 61 6d  me=%T", zPageNam
1e20: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
1e30: 20 20 7d 0a 20 20 69 66 28 20 7a 42 6f 64 79 3d    }.  if( zBody=
1e40: 3d 30 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20  =0 ){.    zBody 
1e50: 3d 20 6d 70 72 69 6e 74 66 28 22 3c 69 3e 45 6d  = mprintf("<i>Em
1e60: 70 74 79 20 50 61 67 65 3c 2f 69 3e 22 29 3b 0a  pty Page</i>");.
1e70: 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61 67 65 4e    }.  zHtmlPageN
1e80: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 45  ame = mprintf("E
1e90: 64 69 74 3a 20 25 68 22 2c 20 7a 50 61 67 65 4e  dit: %h", zPageN
1ea0: 61 6d 65 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65  ame);.  style_he
1eb0: 61 64 65 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61  ader(zHtmlPageNa
1ec0: 6d 65 29 3b 0a 20 20 69 66 28 20 50 28 22 70 72  me);.  if( P("pr
1ed0: 65 76 69 65 77 22 29 21 3d 30 20 29 7b 0a 20 20  eview")!=0 ){.  
1ee0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b    blob_zero(&wik
1ef0: 69 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  i);.    blob_app
1f00: 65 6e 64 28 26 77 69 6b 69 2c 20 7a 42 6f 64 79  end(&wiki, zBody
1f10: 2c 20 2d 31 29 3b 0a 20 20 20 20 40 20 50 72 65  , -1);.    @ Pre
1f20: 76 69 65 77 3a 3c 68 72 3e 0a 20 20 20 20 77 69  view:<hr>.    wi
1f30: 6b 69 5f 63 6f 6e 76 65 72 74 28 26 77 69 6b 69  ki_convert(&wiki
1f40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c  , 0, 0);.    @ <
1f50: 68 72 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  hr>.    blob_res
1f60: 65 74 28 26 77 69 6b 69 29 3b 0a 20 20 7d 0a 20  et(&wiki);.  }. 
1f70: 20 66 6f 72 28 6e 3d 32 2c 20 7a 3d 7a 42 6f 64   for(n=2, z=zBod
1f80: 79 3b 20 7a 5b 30 5d 3b 20 7a 2b 2b 29 7b 0a 20  y; z[0]; z++){. 
1f90: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 6e     if( z[0]=='\n
1fa0: 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ' ) n++;.  }.  i
1fb0: 66 28 20 6e 3c 32 30 20 29 20 6e 20 3d 20 32 30  f( n<20 ) n = 20
1fc0: 3b 0a 20 20 69 66 28 20 6e 3e 32 30 30 20 29 20  ;.  if( n>200 ) 
1fd0: 6e 20 3d 20 32 30 30 3b 0a 20 20 40 20 3c 66 6f  n = 200;.  @ <fo
1fe0: 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22  rm method="POST"
1ff0: 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42   action="%s(g.zB
2000: 61 73 65 55 52 4c 29 2f 77 69 6b 69 65 64 69 74  aseURL)/wikiedit
2010: 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  ">.  @ <input ty
2020: 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65  pe="hidden" name
2030: 3d 22 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25  ="name" value="%
2040: 68 28 7a 50 61 67 65 4e 61 6d 65 29 22 3e 0a 20  h(zPageName)">. 
2050: 20 40 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d   @ <textarea nam
2060: 65 3d 22 77 22 20 63 6c 61 73 73 3d 22 77 69 6b  e="w" class="wik
2070: 69 65 64 69 74 22 20 63 6f 6c 73 3d 22 38 30 22  iedit" cols="80"
2080: 20 0a 20 20 40 20 20 72 6f 77 73 3d 22 25 64 28   .  @  rows="%d(
2090: 6e 29 22 20 77 72 61 70 3d 22 76 69 72 74 75 61  n)" wrap="virtua
20a0: 6c 22 3e 25 68 28 7a 42 6f 64 79 29 3c 2f 74 65  l">%h(zBody)</te
20b0: 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 62 72 3e  xtarea>.  @ <br>
20c0: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
20d0: 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22  ="submit" name="
20e0: 70 72 65 76 69 65 77 22 20 76 61 6c 75 65 3d 22  preview" value="
20f0: 50 72 65 76 69 65 77 20 59 6f 75 72 20 43 68 61  Preview Your Cha
2100: 6e 67 65 73 22 3e 0a 20 20 40 20 3c 69 6e 70 75  nges">.  @ <inpu
2110: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20  t type="submit" 
2120: 6e 61 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61  name="submit" va
2130: 6c 75 65 3d 22 41 70 70 6c 79 20 54 68 65 73 65  lue="Apply These
2140: 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c   Changes">.  @ <
2150: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
2160: 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c  it" name="cancel
2170: 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22  " value="Cancel"
2180: 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20  >.  @ </form>.  
2190: 69 66 28 20 21 69 73 53 61 6e 64 62 6f 78 20 29  if( !isSandbox )
21a0: 7b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63  {.    manifest_c
21b0: 6c 65 61 72 28 26 6d 29 3b 0a 20 20 7d 0a 20 20  lear(&m);.  }.  
21c0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
21d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
21e0: 74 68 65 20 77 69 6b 69 20 74 65 78 74 20 66 6f  the wiki text fo
21f0: 72 20 61 6e 20 72 65 6d 61 72 6b 20 74 6f 20 74  r an remark to t
2200: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69  he end of the gi
2210: 76 65 6e 20 42 4c 4f 42 2e 0a 2a 2f 0a 73 74 61  ven BLOB..*/.sta
2220: 74 69 63 20 76 6f 69 64 20 61 70 70 65 6e 64 52  tic void appendR
2230: 65 6d 61 72 6b 28 42 6c 6f 62 20 2a 70 29 7b 0a  emark(Blob *p){.
2240: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20    char *zDate;. 
2250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
2260: 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er;.  const char
2270: 20 2a 7a 52 65 6d 61 72 6b 3b 0a 0a 20 20 7a 44   *zRemark;..  zD
2280: 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ate = db_text(0,
2290: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
22a0: 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20 20 62 6c  e('now')");.  bl
22b0: 6f 62 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 5c  ob_appendf(p, "\
22c0: 6e 5c 6e 3c 68 72 3e 3c 69 3e 4f 6e 20 25 73 20  n\n<hr><i>On %s 
22d0: 55 54 43 20 25 68 22 2c 20 7a 44 61 74 65 2c 20  UTC %h", zDate, 
22e0: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 66 72 65  g.zLogin);.  fre
22f0: 65 28 7a 44 61 74 65 29 3b 0a 20 20 7a 55 73 65  e(zDate);.  zUse
2300: 72 20 3d 20 50 44 28 22 75 22 2c 67 2e 7a 4c 6f  r = PD("u",g.zLo
2310: 67 69 6e 29 3b 0a 20 20 69 66 28 20 7a 55 73 65  gin);.  if( zUse
2320: 72 5b 30 5d 20 26 26 20 73 74 72 63 6d 70 28 7a  r[0] && strcmp(z
2330: 55 73 65 72 2c 67 2e 7a 4c 6f 67 69 6e 29 20 29  User,g.zLogin) )
2340: 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  {.    blob_appen
2350: 64 66 28 70 2c 20 22 20 28 63 6c 61 69 6d 69 6e  df(p, " (claimin
2360: 67 20 74 6f 20 62 65 20 25 68 29 22 2c 20 7a 55  g to be %h)", zU
2370: 73 65 72 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 6d  ser);.  }.  zRem
2380: 61 72 6b 20 3d 20 50 44 28 22 72 22 2c 22 22 29  ark = PD("r","")
2390: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
23a0: 28 70 2c 20 22 20 61 64 64 65 64 3a 3c 2f 69 3e  (p, " added:</i>
23b0: 3c 62 72 20 2f 3e 5c 6e 25 73 22 2c 20 7a 52 65  <br />\n%s", zRe
23c0: 6d 61 72 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mark);.}../*.** 
23d0: 57 45 42 50 41 47 45 3a 20 77 69 6b 69 61 70 70  WEBPAGE: wikiapp
23e0: 65 6e 64 0a 2a 2a 20 55 52 4c 3a 20 2f 77 69 6b  end.** URL: /wik
23f0: 69 61 70 70 65 6e 64 3f 6e 61 6d 65 3d 50 41 47  iappend?name=PAG
2400: 45 4e 41 4d 45 0a 2a 2f 0a 76 6f 69 64 20 77 69  ENAME.*/.void wi
2410: 6b 69 61 70 70 65 6e 64 5f 70 61 67 65 28 76 6f  kiappend_page(vo
2420: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61  id){.  char *zTa
2430: 67 3b 0a 20 20 69 6e 74 20 72 69 64 20 3d 20 30  g;.  int rid = 0
2440: 3b 0a 20 20 69 6e 74 20 69 73 53 61 6e 64 62 6f  ;.  int isSandbo
2450: 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x;.  const char 
2460: 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 63 68  *zPageName;.  ch
2470: 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65 4e 61 6d  ar *zHtmlPageNam
2480: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
2490: 2a 7a 55 73 65 72 3b 0a 0a 20 20 6c 6f 67 69 6e  *zUser;..  login
24a0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
24b0: 6c 73 28 29 3b 0a 20 20 7a 50 61 67 65 4e 61 6d  ls();.  zPageNam
24c0: 65 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22 22  e = PD("name",""
24d0: 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 5f 6e  );.  if( check_n
24e0: 61 6d 65 28 7a 50 61 67 65 4e 61 6d 65 29 20 29  ame(zPageName) )
24f0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 73 53 61 6e   return;.  isSan
2500: 64 62 6f 78 20 3d 20 69 73 5f 73 61 6e 64 62 6f  dbox = is_sandbo
2510: 78 28 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  x(zPageName);.  
2520: 69 66 28 20 21 69 73 53 61 6e 64 62 6f 78 20 29  if( !isSandbox )
2530: 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d 70 72  {.    zTag = mpr
2540: 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22 2c 20  intf("wiki-%s", 
2550: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20  zPageName);.    
2560: 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20  rid = db_int(0, 
2570: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72  .      "SELECT r
2580: 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22  id FROM tagxref"
2590: 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74  .      " WHERE t
25a0: 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74 61 67  agid=(SELECT tag
25b0: 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52  id FROM tag WHER
25c0: 45 20 74 61 67 6e 61 6d 65 3d 25 51 29 22 0a 20  E tagname=%Q)". 
25d0: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
25e0: 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 54 61  mtime DESC", zTa
25f0: 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 72 65  g.    );.    fre
2600: 65 28 7a 54 61 67 29 3b 0a 20 20 20 20 69 66 28  e(zTag);.    if(
2610: 20 21 72 69 64 20 29 7b 0a 20 20 20 20 20 20 63   !rid ){.      c
2620: 67 69 5f 72 65 64 69 72 65 63 74 28 22 69 6e 64  gi_redirect("ind
2630: 65 78 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ex");.      retu
2640: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
2650: 69 66 28 20 21 67 2e 6f 6b 41 70 6e 64 57 69 6b  if( !g.okApndWik
2660: 69 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e  i ){.    login_n
2670: 65 65 64 65 64 28 29 3b 0a 20 20 20 20 72 65 74  eeded();.    ret
2680: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 50  urn;.  }.  if( P
2690: 28 22 73 75 62 6d 69 74 22 29 21 3d 30 20 26 26  ("submit")!=0 &&
26a0: 20 50 28 22 72 22 29 21 3d 30 20 26 26 20 50 28   P("r")!=0 && P(
26b0: 22 75 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  "u")!=0 ){.    c
26c0: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 20 20  har *zDate;.    
26d0: 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20 20 20  Blob cksum;.    
26e0: 69 6e 74 20 6e 72 69 64 3b 0a 20 20 20 20 42 6c  int nrid;.    Bl
26f0: 6f 62 20 62 6f 64 79 3b 0a 20 20 20 20 42 6c 6f  ob body;.    Blo
2700: 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 42  b content;.    B
2710: 6c 6f 62 20 77 69 6b 69 3b 0a 20 20 20 20 4d 61  lob wiki;.    Ma
2720: 6e 69 66 65 73 74 20 6d 3b 0a 0a 20 20 20 20 62  nifest m;..    b
2730: 6c 6f 62 5f 7a 65 72 6f 28 26 62 6f 64 79 29 3b  lob_zero(&body);
2740: 0a 20 20 20 20 69 66 28 20 69 73 53 61 6e 64 62  .    if( isSandb
2750: 6f 78 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  ox ){.      blob
2760: 5f 61 70 70 65 6e 64 66 28 26 62 6f 64 79 2c 20  _appendf(&body, 
2770: 64 62 5f 67 65 74 28 22 73 61 6e 64 62 6f 78 22  db_get("sandbox"
2780: 2c 22 22 29 29 3b 0a 20 20 20 20 20 20 61 70 70  ,""));.      app
2790: 65 6e 64 52 65 6d 61 72 6b 28 26 62 6f 64 79 29  endRemark(&body)
27a0: 3b 0a 20 20 20 20 20 20 64 62 5f 73 65 74 28 22  ;.      db_set("
27b0: 73 61 6e 64 62 6f 78 22 2c 20 62 6c 6f 62 5f 73  sandbox", blob_s
27c0: 74 72 28 26 62 6f 64 79 29 2c 20 30 29 3b 0a 20  tr(&body), 0);. 
27d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27e0: 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c  content_get(rid,
27f0: 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20   &content);.    
2800: 20 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65    manifest_parse
2810: 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a  (&m, &content);.
2820: 20 20 20 20 20 20 69 66 28 20 6d 2e 74 79 70 65        if( m.type
2830: 3d 3d 43 46 54 59 50 45 5f 57 49 4b 49 20 29 7b  ==CFTYPE_WIKI ){
2840: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
2850: 70 65 6e 64 66 28 26 62 6f 64 79 2c 20 6d 2e 7a  pendf(&body, m.z
2860: 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Wiki, -1);.     
2870: 20 7d 0a 20 20 20 20 20 20 6d 61 6e 69 66 65 73   }.      manifes
2880: 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20 20 20  t_clear(&m);.   
2890: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69     blob_zero(&wi
28a0: 6b 69 29 3b 0a 20 20 20 20 20 20 64 62 5f 62 65  ki);.      db_be
28b0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
28c0: 29 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 20 3d  );.      zDate =
28d0: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
28e0: 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f  ECT datetime('no
28f0: 77 27 29 22 29 3b 0a 20 20 20 20 20 20 7a 44 61  w')");.      zDa
2900: 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20 20  te[10] = 'T';.  
2910: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
2920: 28 26 77 69 6b 69 2c 20 22 44 20 25 73 5c 6e 22  (&wiki, "D %s\n"
2930: 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20  , zDate);.      
2940: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
2950: 6b 69 2c 20 22 4c 20 25 46 5c 6e 22 2c 20 7a 50  ki, "L %F\n", zP
2960: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ageName);.      
2970: 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20 20  if( rid ){.     
2980: 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d     char *zUuid =
2990: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
29a0: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c  ECT uuid FROM bl
29b0: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22  ob WHERE rid=%d"
29c0: 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20 20 20  , rid);.        
29d0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
29e0: 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a 55  ki, "P %s\n", zU
29f0: 75 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 72  uid);.        fr
2a00: 65 65 28 7a 55 75 69 64 29 3b 0a 20 20 20 20 20  ee(zUuid);.     
2a10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 2e 7a   }.      if( g.z
2a20: 4c 6f 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  Login ){.       
2a30: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
2a40: 69 6b 69 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67  iki, "U %F\n", g
2a50: 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20 20  .zLogin);.      
2a60: 7d 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  }.      blob_app
2a70: 65 6e 64 66 28 26 62 6f 64 79 2c 20 22 5c 6e 3c  endf(&body, "\n<
2a80: 68 72 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 61  hr>\n");.      a
2a90: 70 70 65 6e 64 52 65 6d 61 72 6b 28 26 62 6f 64  ppendRemark(&bod
2aa0: 79 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  y);.      blob_a
2ab0: 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 57  ppendf(&wiki, "W
2ac0: 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 62 6c 6f 62   %d\n%s\n", blob
2ad0: 5f 73 69 7a 65 28 26 62 6f 64 79 29 2c 20 62 6c  _size(&body), bl
2ae0: 6f 62 5f 73 74 72 28 26 62 6f 64 79 29 29 3b 0a  ob_str(&body));.
2af0: 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c 6f        md5sum_blo
2b00: 62 28 26 77 69 6b 69 2c 20 26 63 6b 73 75 6d 29  b(&wiki, &cksum)
2b10: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
2b20: 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 5a 20 25  endf(&wiki, "Z %
2b30: 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  b\n", &cksum);. 
2b40: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
2b50: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 6e  &cksum);.      n
2b60: 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75  rid = content_pu
2b70: 74 28 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a  t(&wiki, 0, 0);.
2b80: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
2b90: 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49  xec("INSERT OR I
2ba0: 47 4e 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e  GNORE INTO unsen
2bb0: 74 20 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e  t VALUES(%d)", n
2bc0: 72 69 64 29 3b 0a 20 20 20 20 20 20 6d 61 6e 69  rid);.      mani
2bd0: 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e  fest_crosslink(n
2be0: 72 69 64 2c 20 26 77 69 6b 69 29 3b 0a 20 20 20  rid, &wiki);.   
2bf0: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77     blob_reset(&w
2c00: 69 6b 69 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  iki);.      cont
2c10: 65 6e 74 5f 64 65 6c 74 69 66 79 28 72 69 64 2c  ent_deltify(rid,
2c20: 20 6e 72 69 64 2c 20 30 29 3b 0a 20 20 20 20 20   nrid, 0);.     
2c30: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
2c40: 69 6f 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ion(0);.    }.  
2c50: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28    cgi_redirectf(
2c60: 22 77 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20  "wiki?name=%T", 
2c70: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a  zPageName);.  }.
2c80: 20 20 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22    if( P("cancel"
2c90: 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 67 69 5f  )!=0 ){.    cgi_
2ca0: 72 65 64 69 72 65 63 74 66 28 22 77 69 6b 69 3f  redirectf("wiki?
2cb0: 6e 61 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65 4e  name=%T", zPageN
2cc0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2cd0: 3b 0a 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61 67  ;.  }.  zHtmlPag
2ce0: 65 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  eName = mprintf(
2cf0: 22 41 70 70 65 6e 64 20 43 6f 6d 6d 65 6e 74 20  "Append Comment 
2d00: 54 6f 3a 20 25 68 22 2c 20 7a 50 61 67 65 4e 61  To: %h", zPageNa
2d10: 6d 65 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61  me);.  style_hea
2d20: 64 65 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61 6d  der(zHtmlPageNam
2d30: 65 29 3b 0a 20 20 69 66 28 20 50 28 22 70 72 65  e);.  if( P("pre
2d40: 76 69 65 77 22 29 21 3d 30 20 29 7b 0a 20 20 20  view")!=0 ){.   
2d50: 20 42 6c 6f 62 20 70 72 65 76 69 65 77 3b 0a 20   Blob preview;. 
2d60: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 72     blob_zero(&pr
2d70: 65 76 69 65 77 29 3b 0a 20 20 20 20 61 70 70 65  eview);.    appe
2d80: 6e 64 52 65 6d 61 72 6b 28 26 70 72 65 76 69 65  ndRemark(&previe
2d90: 77 29 3b 0a 20 20 20 20 40 20 50 72 65 76 69 65  w);.    @ Previe
2da0: 77 3a 3c 68 72 3e 0a 20 20 20 20 77 69 6b 69 5f  w:<hr>.    wiki_
2db0: 63 6f 6e 76 65 72 74 28 26 70 72 65 76 69 65 77  convert(&preview
2dc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c  , 0, 0);.    @ <
2dd0: 68 72 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  hr>.    blob_res
2de0: 65 74 28 26 70 72 65 76 69 65 77 29 3b 0a 20 20  et(&preview);.  
2df0: 7d 0a 20 20 7a 55 73 65 72 20 3d 20 50 44 28 22  }.  zUser = PD("
2e00: 75 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20  u", g.zLogin);. 
2e10: 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d   @ <form method=
2e20: 22 50 4f 53 54 22 20 61 63 74 69 6f 6e 3d 22 25  "POST" action="%
2e30: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 69  s(g.zBaseURL)/wi
2e40: 6b 69 61 70 70 65 6e 64 22 3e 0a 20 20 40 20 3c  kiappend">.  @ <
2e50: 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64  input type="hidd
2e60: 65 6e 22 20 6e 61 6d 65 3d 22 6e 61 6d 65 22 20  en" name="name" 
2e70: 76 61 6c 75 65 3d 22 25 68 28 7a 50 61 67 65 4e  value="%h(zPageN
2e80: 61 6d 65 29 22 3e 0a 20 20 40 20 59 6f 75 72 20  ame)">.  @ Your 
2e90: 4e 61 6d 65 3a 0a 20 20 40 20 3c 69 6e 70 75 74  Name:.  @ <input
2ea0: 20 74 79 70 65 3d 22 74 65 78 74 22 20 6e 61 6d   type="text" nam
2eb0: 65 3d 22 75 22 20 73 69 7a 65 3d 22 32 30 22 20  e="u" size="20" 
2ec0: 76 61 6c 75 65 3d 22 25 68 28 7a 55 73 65 72 29  value="%h(zUser)
2ed0: 22 3e 3c 62 72 3e 0a 20 20 40 20 43 6f 6d 6d 65  "><br>.  @ Comme
2ee0: 6e 74 20 74 6f 20 61 70 70 65 6e 64 3a 3c 62 72  nt to append:<br
2ef0: 3e 0a 20 20 40 20 3c 74 65 78 74 61 72 65 61 20  >.  @ <textarea 
2f00: 6e 61 6d 65 3d 22 72 22 20 63 6c 61 73 73 3d 22  name="r" class="
2f10: 77 69 6b 69 65 64 69 74 22 20 63 6f 6c 73 3d 22  wikiedit" cols="
2f20: 38 30 22 20 0a 20 20 40 20 20 72 6f 77 73 3d 22  80" .  @  rows="
2f30: 31 30 22 20 77 72 61 70 3d 22 76 69 72 74 75 61  10" wrap="virtua
2f40: 6c 22 3e 25 68 28 50 44 28 22 72 22 2c 22 22 29  l">%h(PD("r","")
2f50: 29 3c 2f 74 65 78 74 61 72 65 61 3e 0a 20 20 40  )</textarea>.  @
2f60: 20 3c 62 72 3e 0a 20 20 40 20 3c 69 6e 70 75 74   <br>.  @ <input
2f70: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e   type="submit" n
2f80: 61 6d 65 3d 22 70 72 65 76 69 65 77 22 20 76 61  ame="preview" va
2f90: 6c 75 65 3d 22 50 72 65 76 69 65 77 20 59 6f 75  lue="Preview You
2fa0: 72 20 43 6f 6d 6d 65 6e 74 22 3e 0a 20 20 40 20  r Comment">.  @ 
2fb0: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62  <input type="sub
2fc0: 6d 69 74 22 20 6e 61 6d 65 3d 22 73 75 62 6d 69  mit" name="submi
2fd0: 74 22 20 76 61 6c 75 65 3d 22 41 70 70 65 6e 64  t" value="Append
2fe0: 20 59 6f 75 72 20 43 68 61 6e 67 65 73 22 3e 0a   Your Changes">.
2ff0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
3000: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 63  "submit" name="c
3010: 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d 22 43 61  ancel" value="Ca
3020: 6e 63 65 6c 22 3e 0a 20 20 40 20 3c 2f 66 6f 72  ncel">.  @ </for
3030: 6d 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65  m>.  style_foote
3040: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  r();.}../*.** WE
3050: 42 50 41 47 45 3a 20 77 68 69 73 74 6f 72 79 0a  BPAGE: whistory.
3060: 2a 2a 20 55 52 4c 3a 20 2f 77 68 69 73 74 6f 72  ** URL: /whistor
3070: 79 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d 45 0a  y?name=PAGENAME.
3080: 2a 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63  **.** Show the c
3090: 6f 6d 70 6c 65 74 65 20 63 68 61 6e 67 65 20 68  omplete change h
30a0: 69 73 74 6f 72 79 20 66 6f 72 20 61 20 73 69 6e  istory for a sin
30b0: 67 6c 65 20 77 69 6b 69 20 70 61 67 65 2e 0a 2a  gle wiki page..*
30c0: 2f 0a 76 6f 69 64 20 77 68 69 73 74 6f 72 79 5f  /.void whistory_
30d0: 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 53 74  page(void){.  St
30e0: 6d 74 20 71 3b 0a 20 20 63 68 61 72 20 2a 7a 54  mt q;.  char *zT
30f0: 69 74 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 53  itle;.  char *zS
3100: 51 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  QL;.  const char
3110: 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 6c   *zPageName;.  l
3120: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
3130: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
3140: 21 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 20  !g.okHistory ){ 
3150: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20  login_needed(); 
3160: 72 65 74 75 72 6e 3b 20 7d 0a 20 20 7a 50 61 67  return; }.  zPag
3170: 65 4e 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65  eName = PD("name
3180: 22 2c 22 22 29 3b 0a 20 20 7a 54 69 74 6c 65 20  ","");.  zTitle 
3190: 3d 20 6d 70 72 69 6e 74 66 28 22 48 69 73 74 6f  = mprintf("Histo
31a0: 72 79 20 4f 66 20 25 68 22 2c 20 7a 50 61 67 65  ry Of %h", zPage
31b0: 4e 61 6d 65 29 3b 0a 20 20 73 74 79 6c 65 5f 68  Name);.  style_h
31c0: 65 61 64 65 72 28 7a 54 69 74 6c 65 29 3b 0a 20  eader(zTitle);. 
31d0: 20 66 72 65 65 28 7a 54 69 74 6c 65 29 3b 0a 0a   free(zTitle);..
31e0: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66    zSQL = mprintf
31f0: 28 22 25 73 20 41 4e 44 20 65 76 65 6e 74 2e 6f  ("%s AND event.o
3200: 62 6a 69 64 20 49 4e 20 22 0a 20 20 20 20 20 20  bjid IN ".      
3210: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 28 53             "  (S
3220: 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 74  ELECT rid FROM t
3230: 61 67 78 72 65 66 20 57 48 45 52 45 20 74 61 67  agxref WHERE tag
3240: 69 64 3d 22 0a 20 20 20 20 20 20 20 20 20 20 20  id=".           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 22 28 53 45              "(SE
3260: 4c 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20  LECT tagid FROM 
3270: 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d  tag WHERE tagnam
3280: 65 3d 27 77 69 6b 69 2d 25 71 27 29 29 22 0a 20  e='wiki-%q'))". 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a0: 22 4f 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20  "ORDER BY mtime 
32b0: 44 45 53 43 22 2c 0a 20 20 20 20 20 20 20 20 20  DESC",.         
32c0: 20 20 20 20 20 20 20 20 74 69 6d 65 6c 69 6e 65          timeline
32d0: 5f 71 75 65 72 79 5f 66 6f 72 5f 77 77 77 28 29  _query_for_www()
32e0: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  , zPageName);.  
32f0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 7a  db_prepare(&q, z
3300: 53 51 4c 29 3b 0a 20 20 66 72 65 65 28 7a 53 51  SQL);.  free(zSQ
3310: 4c 29 3b 0a 20 20 77 77 77 5f 70 72 69 6e 74 5f  L);.  www_print_
3320: 74 69 6d 65 6c 69 6e 65 28 26 71 29 3b 0a 20 20  timeline(&q);.  
3330: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
3340: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
3350: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
3360: 41 47 45 3a 20 77 63 6f 6e 74 65 6e 74 0a 2a 2a  AGE: wcontent.**
3370: 0a 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 61 76 61  .** List all ava
3380: 69 6c 61 62 6c 65 20 77 69 6b 69 20 70 61 67 65  ilable wiki page
3390: 73 20 77 69 74 68 20 64 61 74 65 20 63 72 65 61  s with date crea
33a0: 74 65 64 20 61 6e 64 20 6c 61 73 74 20 6d 6f 64  ted and last mod
33b0: 69 66 69 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 77  ified..*/.void w
33c0: 63 6f 6e 74 65 6e 74 5f 70 61 67 65 28 76 6f 69  content_page(voi
33d0: 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20  d){.  Stmt q;.  
33e0: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
33f0: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28  entials();.  if(
3400: 20 21 67 2e 6f 6b 52 64 57 69 6b 69 20 29 7b 20   !g.okRdWiki ){ 
3410: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20  login_needed(); 
3420: 72 65 74 75 72 6e 3b 20 7d 0a 20 20 73 74 79 6c  return; }.  styl
3430: 65 5f 68 65 61 64 65 72 28 22 41 76 61 69 6c 61  e_header("Availa
3440: 62 6c 65 20 57 69 6b 69 20 50 61 67 65 73 22 29  ble Wiki Pages")
3450: 3b 0a 20 20 40 20 3c 75 6c 3e 0a 20 20 64 62 5f  ;.  @ <ul>.  db_
3460: 70 72 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20  prepare(&q, .   
3470: 20 22 53 45 4c 45 43 54 20 73 75 62 73 74 72 28   "SELECT substr(
3480: 74 61 67 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30  tagname, 6, 1000
3490: 29 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45  ) FROM tag WHERE
34a0: 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 77   tagname GLOB 'w
34b0: 69 6b 69 2d 2a 27 22 0a 20 20 20 20 22 20 4f 52  iki-*'".    " OR
34c0: 44 45 52 20 42 59 20 6c 6f 77 65 72 28 74 61 67  DER BY lower(tag
34d0: 6e 61 6d 65 29 22 0a 20 20 29 3b 0a 20 20 77 68  name)".  );.  wh
34e0: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
34f0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
3500: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3510: 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  zName = db_colum
3520: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20  n_text(&q, 0);. 
3530: 20 20 20 40 20 3c 6c 69 3e 3c 61 20 68 72 65 66     @ <li><a href
3540: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
3550: 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25 54 28 7a 4e  /wiki?name=%T(zN
3560: 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65 29 3c  ame)">%h(zName)<
3570: 2f 61 3e 3c 2f 6c 69 3e 0a 20 20 7d 0a 20 20 64  /a></li>.  }.  d
3580: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
3590: 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 73 74 79 6c    @ </ul>.  styl
35a0: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f  e_footer();.}../
35b0: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 69  *.** WEBPAGE: wi
35c0: 6b 69 5f 72 75 6c 65 73 0a 2a 2f 0a 76 6f 69 64  ki_rules.*/.void
35d0: 20 77 69 6b 69 72 75 6c 65 73 5f 70 61 67 65 28   wikirules_page(
35e0: 76 6f 69 64 29 7b 0a 20 20 73 74 79 6c 65 5f 68  void){.  style_h
35f0: 65 61 64 65 72 28 22 57 69 6b 69 20 46 6f 72 6d  eader("Wiki Form
3600: 61 74 74 69 6e 67 20 52 75 6c 65 73 22 29 3b 0a  atting Rules");.
3610: 20 20 40 20 3c 68 32 3e 46 6f 72 6d 61 74 74 69    @ <h2>Formatti
3620: 6e 67 20 52 75 6c 65 20 53 75 6d 6d 61 72 79 3c  ng Rule Summary<
3630: 2f 68 32 3e 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20  /h2>.  @ <ol>.  
3640: 40 20 3c 6c 69 3e 20 42 6c 61 6e 6b 20 6c 69 6e  @ <li> Blank lin
3650: 65 73 20 61 72 65 20 70 61 72 61 67 72 61 70 68  es are paragraph
3660: 20 62 72 65 61 6b 73 0a 20 20 40 20 3c 6c 69 3e   breaks.  @ <li>
3670: 20 42 75 6c 6c 65 74 73 20 61 72 65 20 22 2a 22   Bullets are "*"
3680: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20 74   surrounded by t
3690: 77 6f 20 73 70 61 63 65 73 20 61 74 20 74 68 65  wo spaces at the
36a0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
36b0: 65 20 6c 69 6e 65 2e 0a 20 20 40 20 3c 6c 69 3e  e line..  @ <li>
36c0: 20 45 6e 75 6d 65 72 61 74 69 6f 6e 20 69 74 65   Enumeration ite
36d0: 6d 73 20 61 72 65 20 61 20 6e 75 6d 62 65 72 20  ms are a number 
36e0: 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20 74 77  surrounded by tw
36f0: 6f 20 73 70 61 63 65 0a 20 20 40 20 61 74 20 74  o space.  @ at t
3700: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
3710: 61 20 6c 69 6e 65 2e 0a 20 20 40 20 3c 6c 69 3e  a line..  @ <li>
3720: 20 49 6e 64 65 6e 74 65 64 20 70 61 72 67 72 61   Indented pargra
3730: 70 68 73 20 62 65 67 69 6e 20 77 69 74 68 20 61  phs begin with a
3740: 20 74 61 62 20 6f 72 20 74 77 6f 20 73 70 61 63   tab or two spac
3750: 65 73 2e 0a 20 20 40 20 3c 6c 69 3e 20 48 79 70  es..  @ <li> Hyp
3760: 65 72 6c 69 6e 6b 73 20 61 72 65 20 63 6f 6e 74  erlinks are cont
3770: 61 69 6e 65 64 20 77 69 74 68 20 73 71 75 61 72  ained with squar
3780: 65 20 62 72 61 63 6b 65 74 73 3a 20 20 22 5b 74  e brackets:  "[t
3790: 61 72 67 65 74 5d 22 0a 20 20 40 20 3c 6c 69 3e  arget]".  @ <li>
37a0: 20 4d 6f 73 74 20 6f 72 64 69 6e 61 72 79 20 48   Most ordinary H
37b0: 54 4d 4c 20 77 6f 72 6b 73 2e 0a 20 20 40 20 3c  TML works..  @ <
37c0: 6c 69 3e 20 26 6c 74 3b 76 65 72 62 61 74 69 6d  li> &lt;verbatim
37d0: 26 67 74 3b 20 61 6e 64 20 26 6c 74 3b 6e 6f 77  &gt; and &lt;now
37e0: 69 6b 69 26 67 74 3b 2e 0a 20 20 40 20 3c 2f 6f  iki&gt;..  @ </o
37f0: 6c 3e 0a 20 20 40 20 3c 70 3e 57 65 20 63 61 6c  l>.  @ <p>We cal
3800: 6c 20 74 68 65 20 66 69 72 73 74 20 66 69 76 65  l the first five
3810: 20 72 75 6c 65 73 20 61 62 6f 76 65 20 22 77 69   rules above "wi
3820: 6b 69 22 20 66 6f 72 6d 61 74 74 69 6e 67 20 72  ki" formatting r
3830: 75 6c 65 73 2e 20 20 54 68 65 0a 20 20 40 20 6c  ules.  The.  @ l
3840: 61 73 74 20 74 77 6f 20 72 75 6c 65 73 20 61 72  ast two rules ar
3850: 65 20 74 68 65 20 48 54 4d 4c 20 66 6f 72 6d 61  e the HTML forma
3860: 74 74 69 6e 67 20 72 75 6c 65 2e 3c 2f 70 3e 0a  tting rule.</p>.
3870: 20 20 40 20 3c 68 32 3e 46 6f 72 6d 61 74 74 69    @ <h2>Formatti
3880: 6e 67 20 52 75 6c 65 20 44 65 74 61 69 6c 73 3c  ng Rule Details<
3890: 2f 68 32 3e 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20  /h2>.  @ <ol>.  
38a0: 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 50 61 72  @ <li> <p><b>Par
38b0: 61 67 72 61 70 68 73 3c 2f 62 3e 2e 20 20 41 6e  agraphs</b>.  An
38c0: 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e  y sequence of on
38d0: 65 20 6f 72 20 6d 6f 72 65 20 62 6c 61 6e 6b 20  e or more blank 
38e0: 6c 69 6e 65 73 20 66 6f 72 6d 73 0a 20 20 40 20  lines forms.  @ 
38f0: 61 20 70 61 72 61 67 72 61 70 68 20 62 72 65 61  a paragraph brea
3900: 6b 2e 20 20 43 65 6e 74 65 72 65 64 20 6f 72 20  k.  Centered or 
3910: 72 69 67 68 74 2d 6a 75 73 74 69 66 69 65 64 20  right-justified 
3920: 70 61 72 61 67 72 61 70 68 73 20 61 72 65 20 6e  paragraphs are n
3930: 6f 74 0a 20 20 40 20 73 75 70 70 6f 72 74 65 64  ot.  @ supported
3940: 20 62 79 20 77 69 6b 69 20 6d 61 72 6b 75 70 2c   by wiki markup,
3950: 20 62 75 74 20 79 6f 75 20 63 61 6e 20 64 6f 20   but you can do 
3960: 74 68 65 73 65 20 74 68 69 6e 67 73 20 69 66 20  these things if 
3970: 79 6f 75 20 6e 65 65 64 20 74 68 65 6d 0a 20 20  you need them.  
3980: 40 20 75 73 69 6e 67 20 48 54 4d 4c 2e 3c 2f 70  @ using HTML.</p
3990: 3e 0a 20 20 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62  >.  @ <li> <p><b
39a0: 3e 42 75 6c 6c 65 74 20 4c 69 73 74 73 3c 2f 62  >Bullet Lists</b
39b0: 3e 2e 0a 20 20 40 20 41 20 62 75 6c 6c 65 74 20  >..  @ A bullet 
39c0: 6c 69 73 74 20 69 74 65 6d 20 61 72 65 20 6c 69  list item are li
39d0: 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  nes that begin w
39e0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 22 2a 22  ith a single "*"
39f0: 20 63 68 61 72 61 63 74 65 72 0a 20 20 40 20 73   character.  @ s
3a00: 75 72 72 6f 75 6e 64 65 64 20 6f 6e 0a 20 20 40  urrounded on.  @
3a10: 20 62 6f 74 68 20 73 69 64 65 73 20 62 79 20 74   both sides by t
3a20: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63 65  wo or more space
3a30: 73 20 6f 72 20 62 79 20 61 20 74 61 62 2e 20 20  s or by a tab.  
3a40: 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6c 65  Only a single le
3a50: 76 65 6c 0a 20 20 40 20 6f 66 20 62 75 6c 6c 65  vel.  @ of bulle
3a60: 74 20 6c 69 73 74 20 69 73 20 73 75 70 70 6f 72  t list is suppor
3a70: 74 65 64 20 62 79 20 77 69 6b 69 2e 20 20 46 6f  ted by wiki.  Fo
3a80: 72 20 74 65 73 74 65 64 20 6c 69 73 74 73 2c 20  r tested lists, 
3a90: 75 73 65 20 48 54 4d 4c 2e 3c 2f 70 3e 0a 20 20  use HTML.</p>.  
3aa0: 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 45 6e 75  @ <li> <p><b>Enu
3ab0: 6d 65 72 61 74 69 6f 6e 20 4c 69 73 74 73 3c 2f  meration Lists</
3ac0: 62 3e 2e 0a 20 20 40 20 41 6e 20 65 6e 75 6d 65  b>..  @ An enume
3ad0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 69 74 65 6d  ration list item
3ae0: 73 20 61 72 65 20 6c 69 6e 65 73 20 74 68 61 74  s are lines that
3af0: 20 62 65 67 69 6e 0a 20 20 40 20 77 69 74 68 20   begin.  @ with 
3b00: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69  one or more digi
3b10: 74 73 20 6f 70 74 69 6f 6e 61 6c 6c 79 0a 20 20  ts optionally.  
3b20: 40 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  @ followed by a 
3b30: 22 2e 22 20 61 6e 64 20 73 75 72 72 6f 75 6e 64  "." and surround
3b40: 65 64 20 6f 6e 20 62 6f 74 68 20 73 69 64 65 73  ed on both sides
3b50: 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   by two or more 
3b60: 73 70 61 63 65 73 20 6f 72 0a 20 20 40 20 62 79  spaces or.  @ by
3b70: 20 61 20 74 61 62 2e 20 20 54 68 65 20 6e 75 6d   a tab.  The num
3b80: 62 65 72 20 69 73 20 73 69 67 6e 69 66 69 63 61  ber is significa
3b90: 6e 74 20 61 6e 64 20 62 65 63 6f 6d 65 73 20 74  nt and becomes t
3ba0: 68 65 20 6e 75 6d 62 65 72 20 73 68 6f 77 6e 0a  he number shown.
3bb0: 20 20 40 20 69 6e 20 74 68 65 20 72 65 6e 64 65    @ in the rende
3bc0: 72 65 64 20 65 6e 75 6d 65 72 61 74 69 6f 6e 20  red enumeration 
3bd0: 69 74 65 6d 2e 20 20 4f 6e 6c 79 20 61 20 73 69  item.  Only a si
3be0: 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 65 6e  ngle level of en
3bf0: 75 6d 65 72 61 74 69 6f 6e 0a 20 20 40 20 6c 69  umeration.  @ li
3c00: 73 74 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  st is supported 
3c10: 62 79 20 77 69 6b 69 2e 20 20 46 6f 72 20 6e 65  by wiki.  For ne
3c20: 73 74 65 64 20 65 6e 75 6d 65 72 61 74 69 6f 6e  sted enumeration
3c30: 73 20 6f 72 20 66 6f 72 0a 20 20 40 20 65 6e 75  s or for.  @ enu
3c40: 6d 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 63  merations that c
3c50: 6f 75 6e 74 20 75 73 69 6e 67 20 6c 65 74 74 65  ount using lette
3c60: 72 73 20 6f 72 20 72 6f 6d 61 6e 20 6e 75 6d 65  rs or roman nume
3c70: 72 69 61 6c 73 2c 20 75 73 65 20 48 54 4d 4c 2e  rials, use HTML.
3c80: 3c 2f 70 3e 0a 20 20 40 20 3c 6c 69 3e 20 3c 70  </p>.  @ <li> <p
3c90: 3e 3c 62 3e 49 6e 64 65 6e 74 65 64 20 50 61 72  ><b>Indented Par
3ca0: 61 67 72 61 70 68 73 3c 2f 62 3e 2e 0a 20 20 40  agraphs</b>..  @
3cb0: 20 41 6e 79 20 70 61 72 61 67 72 61 70 68 20 74   Any paragraph t
3cc0: 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 20  hat begins with 
3cd0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63  two or more spac
3ce0: 65 73 20 6f 72 20 61 20 74 61 62 20 61 6e 64 0a  es or a tab and.
3cf0: 20 20 40 20 77 68 69 63 68 20 69 73 20 6e 6f 74    @ which is not
3d00: 20 61 20 62 75 6c 6c 65 74 20 6f 72 20 65 6e 75   a bullet or enu
3d10: 6d 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 69 74  meration list it
3d20: 65 6d 20 69 73 20 72 65 6e 64 65 72 65 64 20 0a  em is rendered .
3d30: 20 20 40 20 69 6e 64 65 6e 74 65 64 2e 20 20 4f    @ indented.  O
3d40: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6c 65 76  nly a single lev
3d50: 65 6c 20 6f 66 20 69 6e 64 65 6e 74 61 74 69 6f  el of indentatio
3d60: 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 62  n is supported b
3d70: 79 3c 2f 70 3e 0a 20 20 40 20 3c 6c 69 3e 20 3c  y</p>.  @ <li> <
3d80: 70 3e 3c 62 3e 48 79 70 65 72 6c 69 6e 6b 73 3c  p><b>Hyperlinks<
3d90: 2f 62 3e 2e 0a 20 20 40 20 54 65 78 74 20 77 69  /b>..  @ Text wi
3da0: 74 68 69 6e 20 73 71 75 61 72 65 20 62 72 61 63  thin square brac
3db0: 6b 65 74 73 20 28 22 5b 2e 2e 2e 5d 22 29 20 62  kets ("[...]") b
3dc0: 65 63 6f 6d 65 73 20 61 20 68 79 70 65 72 6c 69  ecomes a hyperli
3dd0: 6e 6b 2e 20 20 54 68 65 0a 20 20 40 20 74 61 72  nk.  The.  @ tar
3de0: 67 65 74 20 63 61 6e 20 62 65 20 61 20 77 69 6b  get can be a wik
3df0: 69 20 70 61 67 65 20 6e 61 6d 65 2c 20 74 68 65  i page name, the
3e00: 20 55 55 49 44 20 6f 66 20 61 20 63 68 65 63 6b   UUID of a check
3e10: 2d 69 6e 20 6f 72 20 74 69 63 6b 65 74 2c 0a 20  -in or ticket,. 
3e20: 20 40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61   @ the name of a
3e30: 6e 20 69 6d 61 67 65 2c 20 6f 72 20 61 20 55 52  n image, or a UR
3e40: 4c 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  L.  By default, 
3e50: 74 68 65 20 74 61 72 67 65 74 20 69 73 20 64 69  the target is di
3e60: 73 70 6c 61 79 65 64 0a 20 20 40 20 61 73 20 74  splayed.  @ as t
3e70: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 68  he text of the h
3e80: 79 70 65 72 6c 69 6e 6b 2e 20 20 42 75 74 20 79  yperlink.  But y
3e90: 6f 75 20 63 61 6e 20 73 70 65 63 69 66 79 20 61  ou can specify a
3ea0: 6c 74 65 72 6e 61 74 69 76 65 20 74 65 78 74 0a  lternative text.
3eb0: 20 20 40 20 61 66 74 65 72 20 74 68 65 20 74 61    @ after the ta
3ec0: 72 67 65 74 20 6e 61 6d 65 20 73 65 70 61 72 61  rget name separa
3ed0: 74 65 64 20 62 79 20 61 20 22 7c 22 20 63 68 61  ted by a "|" cha
3ee0: 72 61 63 74 65 72 2e 3c 2f 70 3e 0a 20 20 40 20  racter.</p>.  @ 
3ef0: 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 48 54 4d 4c 3c  <li> <p><b>HTML<
3f00: 2f 62 3e 2e 0a 20 20 40 20 54 68 65 20 66 6f 6c  /b>..  @ The fol
3f10: 6c 6f 77 69 6e 67 20 73 74 61 6e 64 61 72 64 20  lowing standard 
3f20: 48 54 4d 4c 20 65 6c 65 6d 65 6e 74 73 20 6d 61  HTML elements ma
3f30: 79 20 62 65 20 75 73 65 64 3a 0a 20 20 40 20 26  y be used:.  @ &
3f40: 6c 74 3b 61 26 67 74 3b 0a 20 20 40 20 26 6c 74  lt;a&gt;.  @ &lt
3f50: 3b 61 64 64 72 65 73 73 26 67 74 3b 0a 20 20 40  ;address&gt;.  @
3f60: 20 26 6c 74 3b 62 26 67 74 3b 0a 20 20 40 20 26   &lt;b&gt;.  @ &
3f70: 6c 74 3b 62 69 67 26 67 74 3b 0a 20 20 40 20 26  lt;big&gt;.  @ &
3f80: 6c 74 3b 62 6c 6f 63 6b 71 75 6f 74 65 26 67 74  lt;blockquote&gt
3f90: 3b 0a 20 20 40 20 26 6c 74 3b 62 72 26 67 74 3b  ;.  @ &lt;br&gt;
3fa0: 0a 20 20 40 20 26 6c 74 3b 63 65 6e 74 65 72 26  .  @ &lt;center&
3fb0: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 63 69 74 65  gt;.  @ &lt;cite
3fc0: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 63 6f 64  &gt;.  @ &lt;cod
3fd0: 65 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64 64  e&gt;.  @ &lt;dd
3fe0: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64 66 6e  &gt;.  @ &lt;dfn
3ff0: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64 6c 26  &gt;.  @ &lt;dl&
4000: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 64 74 26 67  gt;.  @ &lt;dt&g
4010: 74 3b 0a 20 20 40 20 26 6c 74 3b 65 6d 26 67 74  t;.  @ &lt;em&gt
4020: 3b 0a 20 20 40 20 26 6c 74 3b 66 6f 6e 74 26 67  ;.  @ &lt;font&g
4030: 74 3b 0a 20 20 40 20 26 6c 74 3b 68 31 26 67 74  t;.  @ &lt;h1&gt
4040: 3b 0a 20 20 40 20 26 6c 74 3b 68 32 26 67 74 3b  ;.  @ &lt;h2&gt;
4050: 0a 20 20 40 20 26 6c 74 3b 68 33 26 67 74 3b 0a  .  @ &lt;h3&gt;.
4060: 20 20 40 20 26 6c 74 3b 68 34 26 67 74 3b 0a 20    @ &lt;h4&gt;. 
4070: 20 40 20 26 6c 74 3b 68 35 26 67 74 3b 0a 20 20   @ &lt;h5&gt;.  
4080: 40 20 26 6c 74 3b 68 36 26 67 74 3b 0a 20 20 40  @ &lt;h6&gt;.  @
4090: 20 26 6c 74 3b 68 72 26 67 74 3b 0a 20 20 40 20   &lt;hr&gt;.  @ 
40a0: 26 6c 74 3b 69 6d 67 26 67 74 3b 0a 20 20 40 20  &lt;img&gt;.  @ 
40b0: 26 6c 74 3b 69 26 67 74 3b 0a 20 20 40 20 26 6c  &lt;i&gt;.  @ &l
40c0: 74 3b 6b 62 64 26 67 74 3b 0a 20 20 40 20 26 6c  t;kbd&gt;.  @ &l
40d0: 74 3b 6c 69 26 67 74 3b 0a 20 20 40 20 26 6c 74  t;li&gt;.  @ &lt
40e0: 3b 6e 6f 62 72 26 67 74 3b 0a 20 20 40 20 26 6c  ;nobr&gt;.  @ &l
40f0: 74 3b 6f 6c 26 67 74 3b 0a 20 20 40 20 26 6c 74  t;ol&gt;.  @ &lt
4100: 3b 70 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 70  ;p&gt;.  @ &lt;p
4110: 72 65 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73  re&gt;.  @ &lt;s
4120: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73 61 6d  &gt;.  @ &lt;sam
4130: 70 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73 6d  p&gt;.  @ &lt;sm
4140: 61 6c 6c 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b  all&gt;.  @ &lt;
4150: 73 74 72 69 6b 65 26 67 74 3b 0a 20 20 40 20 26  strike&gt;.  @ &
4160: 6c 74 3b 73 74 72 6f 6e 67 26 67 74 3b 0a 20 20  lt;strong&gt;.  
4170: 40 20 26 6c 74 3b 73 75 62 26 67 74 3b 0a 20 20  @ &lt;sub&gt;.  
4180: 40 20 26 6c 74 3b 73 75 70 26 67 74 3b 0a 20 20  @ &lt;sup&gt;.  
4190: 40 20 26 6c 74 3b 74 61 62 6c 65 26 67 74 3b 0a  @ &lt;table&gt;.
41a0: 20 20 40 20 26 6c 74 3b 74 64 26 67 74 3b 0a 20    @ &lt;td&gt;. 
41b0: 20 40 20 26 6c 74 3b 74 68 26 67 74 3b 0a 20 20   @ &lt;th&gt;.  
41c0: 40 20 26 6c 74 3b 74 72 26 67 74 3b 0a 20 20 40  @ &lt;tr&gt;.  @
41d0: 20 26 6c 74 3b 74 74 26 67 74 3b 0a 20 20 40 20   &lt;tt&gt;.  @ 
41e0: 26 6c 74 3b 75 26 67 74 3b 0a 20 20 40 20 26 6c  &lt;u&gt;.  @ &l
41f0: 74 3b 75 6c 26 67 74 3b 0a 20 20 40 20 26 6c 74  t;ul&gt;.  @ &lt
4200: 3b 76 61 72 26 67 74 3b 2e 0a 20 20 40 20 49 6e  ;var&gt;..  @ In
4210: 20 61 64 64 69 74 69 6f 6e 2c 20 74 68 65 72 65   addition, there
4220: 20 61 72 65 20 74 77 6f 20 6e 6f 6e 2d 73 74 61   are two non-sta
4230: 6e 64 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 61  ndard elements a
4240: 76 61 69 6c 61 62 6c 65 3a 0a 20 20 40 20 26 6c  vailable:.  @ &l
4250: 74 3b 76 65 72 62 61 74 69 6d 26 67 74 3b 20 61  t;verbatim&gt; a
4260: 6e 64 20 26 6c 74 3b 6e 6f 77 69 6b 69 26 67 74  nd &lt;nowiki&gt
4270: 3b 2e 0a 20 20 40 20 4e 6f 20 6f 74 68 65 72 20  ;..  @ No other 
4280: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c  elements are all
4290: 6f 77 65 64 2e 20 20 41 6c 6c 20 61 74 74 72 69  owed.  All attri
42a0: 62 75 74 65 73 20 61 72 65 20 63 68 65 63 6b 65  butes are checke
42b0: 64 20 61 6e 64 0a 20 20 40 20 6f 6e 6c 79 20 61  d and.  @ only a
42c0: 20 66 65 77 20 62 65 6e 69 67 6e 20 61 74 74 72   few benign attr
42d0: 69 62 75 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  ibutes are allow
42e0: 65 64 20 6f 6e 20 65 61 63 68 20 65 6c 65 6d 65  ed on each eleme
42f0: 6e 74 2e 0a 20 20 40 20 49 6e 20 70 61 72 74 69  nt..  @ In parti
4300: 63 75 6c 61 72 2c 20 61 6e 79 20 61 74 74 72 69  cular, any attri
4310: 62 75 74 65 73 20 74 68 61 74 20 73 70 65 63 69  butes that speci
4320: 66 79 20 6a 61 76 61 73 63 72 69 70 74 20 6f 72  fy javascript or
4330: 20 43 53 53 0a 20 20 40 20 61 72 65 20 65 6c 69   CSS.  @ are eli
4340: 64 65 64 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20  ded.</p></li>.  
4350: 40 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 53 70 65 63  @ <li><p><b>Spec
4360: 69 61 6c 20 4d 61 72 6b 75 70 2e 3c 2f 62 3e 0a  ial Markup.</b>.
4370: 20 20 40 20 54 68 65 20 26 6c 74 3b 76 65 72 62    @ The &lt;verb
4380: 61 74 69 6d 26 67 74 3b 20 74 61 67 20 64 69 73  atim&gt; tag dis
4390: 61 62 6c 65 73 20 61 6c 6c 20 77 69 6b 69 20 61  ables all wiki a
43a0: 6e 64 20 48 54 4d 4c 20 6d 61 72 6b 75 70 0a 20  nd HTML markup. 
43b0: 20 40 20 75 70 20 74 68 72 6f 75 67 68 20 74 68   @ up through th
43c0: 65 20 6e 65 78 74 20 26 6c 74 3b 2f 76 65 72 62  e next &lt;/verb
43d0: 61 74 69 6d 26 67 74 3b 2e 20 20 54 68 65 20 26  atim&gt;.  The &
43e0: 6c 74 3b 6e 6f 77 69 6b 69 26 67 74 3b 20 74 61  lt;nowiki&gt; ta
43f0: 67 0a 20 20 40 20 64 69 73 61 62 6c 65 73 20 61  g.  @ disables a
4400: 6c 6c 20 77 69 6b 69 20 66 6f 72 6d 61 74 74 69  ll wiki formatti
4410: 6e 67 20 72 75 6c 65 73 20 74 68 72 6f 75 67 68  ng rules through
4420: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 20 20   the matching.  
4430: 40 20 26 6c 74 3b 2f 6e 6f 77 69 6b 69 26 67 74  @ &lt;/nowiki&gt
4440: 3b 20 65 6c 65 6d 65 6e 74 2e 0a 20 20 40 20 3c  ; element..  @ <
4450: 2f 6f 6c 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  /ol>.  style_foo
4460: 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
4470: 41 64 64 20 61 20 6e 65 77 20 77 69 6b 69 20 70  Add a new wiki p
4480: 61 67 65 20 74 6f 20 74 68 65 20 72 65 73 70 6f  age to the respo
4490: 73 69 74 6f 72 79 2e 20 20 54 68 65 20 70 61 67  sitory.  The pag
44a0: 65 20 6e 61 6d 65 20 69 73 0a 2a 2a 20 67 69 76  e name is.** giv
44b0: 65 6e 20 62 79 20 74 68 65 20 7a 50 61 67 65 4e  en by the zPageN
44c0: 61 6d 65 20 70 61 72 61 6d 65 74 65 72 2e 20 20  ame parameter.  
44d0: 69 73 4e 65 77 20 6d 75 73 74 20 62 65 20 74 72  isNew must be tr
44e0: 75 65 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  ue to create.** 
44f0: 61 20 6e 65 77 20 70 61 67 65 2e 20 20 49 66 20  a new page.  If 
4500: 6e 6f 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  no previous page
4510: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 7a   with the name z
4520: 50 61 67 65 4e 61 6d 65 20 65 78 69 73 74 73 0a  PageName exists.
4530: 2a 2a 20 61 6e 64 20 69 73 4e 65 77 20 69 73 20  ** and isNew is 
4540: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 69 73  false, then this
4550: 20 72 6f 75 74 69 6e 65 20 74 68 72 6f 77 73 20   routine throws 
4560: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
4570: 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
4580: 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 67  he new page is g
4590: 69 76 65 6e 20 62 79 20 74 68 65 20 62 6c 6f 62  iven by the blob
45a0: 20 70 43 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e   pContent..*/.in
45b0: 74 20 77 69 6b 69 5f 63 6d 64 5f 63 6f 6d 6d 69  t wiki_cmd_commi
45c0: 74 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a  t(char const * z
45d0: 50 61 67 65 4e 61 6d 65 2c 20 69 6e 74 20 69 73  PageName, int is
45e0: 4e 65 77 2c 20 42 6c 6f 62 20 2a 70 43 6f 6e 74  New, Blob *pCont
45f0: 65 6e 74 29 7b 0a 20 20 42 6c 6f 62 20 77 69 6b  ent){.  Blob wik
4600: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4610: 2f 2a 20 57 69 6b 69 20 70 61 67 65 20 63 6f 6e  /* Wiki page con
4620: 74 65 6e 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 63  tent */.  Blob c
4630: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
4640: 20 20 2f 2a 20 77 69 6b 69 20 63 68 65 63 6b 73    /* wiki checks
4650: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 69 64 3b  um */.  int rid;
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 2f 2a 20 61 72 74 69 66 61 63 74 20 49 44 20 6f  /* artifact ID o
4680: 66 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  f parent page */
4690: 0a 20 20 69 6e 74 20 6e 72 69 64 3b 20 20 20 20  .  int nrid;    
46a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 72             /* ar
46b0: 74 69 66 61 63 74 20 49 44 20 6f 66 20 6e 65 77  tifact ID of new
46c0: 20 77 69 6b 69 20 70 61 67 65 20 2a 2f 0a 20 20   wiki page */.  
46d0: 63 68 61 72 20 2a 7a 44 61 74 65 3b 20 20 20 20  char *zDate;    
46e0: 20 20 20 20 20 20 20 20 2f 2a 20 74 69 6d 65 73          /* times
46f0: 74 61 6d 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tamp */.  char *
4700: 7a 55 75 69 64 3b 20 20 20 20 20 20 20 20 20 20  zUuid;          
4710: 20 20 2f 2a 20 75 75 69 64 20 66 6f 72 20 72 69    /* uuid for ri
4720: 64 20 2a 2f 0a 0a 20 20 72 69 64 20 3d 20 64 62  d */..  rid = db
4730: 5f 69 6e 74 28 30 2c 0a 20 20 20 20 20 22 53 45  _int(0,.     "SE
4740: 4c 45 43 54 20 78 2e 72 69 64 20 46 52 4f 4d 20  LECT x.rid FROM 
4750: 74 61 67 20 74 2c 20 74 61 67 78 72 65 66 20 78  tag t, tagxref x
4760: 22 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 78  ".     " WHERE x
4770: 2e 74 61 67 69 64 3d 74 2e 74 61 67 69 64 20 41  .tagid=t.tagid A
4780: 4e 44 20 74 2e 74 61 67 6e 61 6d 65 3d 27 77 69  ND t.tagname='wi
4790: 6b 69 2d 25 71 27 22 0a 20 20 20 20 20 22 20 4f  ki-%q'".     " O
47a0: 52 44 45 52 20 42 59 20 78 2e 6d 74 69 6d 65 20  RDER BY x.mtime 
47b0: 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20  DESC LIMIT 1",. 
47c0: 20 20 20 20 7a 50 61 67 65 4e 61 6d 65 0a 20 20      zPageName.  
47d0: 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20  );.  if( rid==0 
47e0: 26 26 20 21 69 73 4e 65 77 20 29 7b 0a 20 20 20  && !isNew ){.   
47f0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e   fossil_fatal("n
4800: 6f 20 73 75 63 68 20 77 69 6b 69 20 70 61 67 65  o such wiki page
4810: 3a 20 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d 65  : %s", zPageName
4820: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 69 64  );.  }.  if( rid
4830: 21 3d 30 20 26 26 20 69 73 4e 65 77 20 29 7b 0a  !=0 && isNew ){.
4840: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
4850: 28 22 77 69 6b 69 20 70 61 67 65 20 25 73 20 61  ("wiki page %s a
4860: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
4870: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a  zPageName);.  }.
4880: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69  .  blob_zero(&wi
4890: 6b 69 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20 64  ki);.  zDate = d
48a0: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
48b0: 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27  T datetime('now'
48c0: 29 22 29 3b 0a 20 20 7a 44 61 74 65 5b 31 30 5d  )");.  zDate[10]
48d0: 20 3d 20 27 54 27 3b 0a 20 20 62 6c 6f 62 5f 61   = 'T';.  blob_a
48e0: 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 44  ppendf(&wiki, "D
48f0: 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a   %s\n", zDate);.
4900: 20 20 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20    free(zDate);. 
4910: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
4920: 69 6b 69 2c 20 22 4c 20 25 46 5c 6e 22 2c 20 7a  iki, "L %F\n", z
4930: 50 61 67 65 4e 61 6d 65 20 29 3b 0a 20 20 69 66  PageName );.  if
4940: 28 20 72 69 64 20 29 7b 0a 20 20 20 20 7a 55 75  ( rid ){.    zUu
4950: 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  id = db_text(0, 
4960: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
4970: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
4980: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 20  =%d", rid);.    
4990: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
49a0: 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a 55  ki, "P %s\n", zU
49b0: 75 69 64 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  uid);.    free(z
49c0: 55 75 69 64 29 3b 0a 20 20 7d 0a 20 20 75 73 65  Uuid);.  }.  use
49d0: 72 5f 73 65 6c 65 63 74 28 29 3b 0a 20 20 69 66  r_select();.  if
49e0: 28 20 67 2e 7a 4c 6f 67 69 6e 20 29 7b 0a 20 20  ( g.zLogin ){.  
49f0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
4a00: 28 26 77 69 6b 69 2c 20 22 55 20 25 46 5c 6e 22  (&wiki, "U %F\n"
4a10: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 7d  , g.zLogin);.  }
4a20: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
4a30: 20 26 77 69 6b 69 2c 20 22 57 20 25 64 5c 6e 25   &wiki, "W %d\n%
4a40: 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  s\n", blob_size(
4a50: 70 43 6f 6e 74 65 6e 74 29 2c 0a 20 20 20 20 20  pContent),.     
4a60: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f             blob_
4a70: 73 74 72 28 70 43 6f 6e 74 65 6e 74 29 20 29 3b  str(pContent) );
4a80: 0a 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26  .  md5sum_blob(&
4a90: 77 69 6b 69 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  wiki, &cksum);. 
4aa0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
4ab0: 69 6b 69 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26  iki, "Z %b\n", &
4ac0: 63 6b 73 75 6d 29 3b 0a 20 20 62 6c 6f 62 5f 72  cksum);.  blob_r
4ad0: 65 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20 20  eset(&cksum);.  
4ae0: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
4af0: 74 69 6f 6e 28 29 3b 0a 20 20 6e 72 69 64 20 3d  tion();.  nrid =
4b00: 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 20 26 77   content_put( &w
4b10: 69 6b 69 2c 20 30 2c 20 30 20 29 3b 0a 20 20 64  iki, 0, 0 );.  d
4b20: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 49 4e  b_multi_exec("IN
4b30: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
4b40: 4e 54 4f 20 75 6e 73 65 6e 74 20 56 41 4c 55 45  NTO unsent VALUE
4b50: 53 28 25 64 29 22 2c 20 6e 72 69 64 29 3b 0a 20  S(%d)", nrid);. 
4b60: 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c   manifest_crossl
4b70: 69 6e 6b 28 6e 72 69 64 2c 26 77 69 6b 69 29 3b  ink(nrid,&wiki);
4b80: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77  .  blob_reset(&w
4b90: 69 6b 69 29 3b 0a 20 20 63 6f 6e 74 65 6e 74 5f  iki);.  content_
4ba0: 64 65 6c 74 69 66 79 28 72 69 64 2c 6e 72 69 64  deltify(rid,nrid
4bb0: 2c 30 29 3b 0a 20 20 64 62 5f 65 6e 64 5f 74 72  ,0);.  db_end_tr
4bc0: 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20  ansaction(0);.  
4bd0: 61 75 74 6f 73 79 6e 63 28 41 55 54 4f 53 59 4e  autosync(AUTOSYN
4be0: 43 5f 50 55 53 48 29 3b 20 20 0a 20 20 72 65 74  C_PUSH);  .  ret
4bf0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
4c00: 43 4f 4d 4d 41 4e 44 3a 20 77 69 6b 69 0a 2a 2a  COMMAND: wiki.**
4c10: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
4c20: 69 6c 20 77 69 6b 69 20 28 65 78 70 6f 72 74 7c  il wiki (export|
4c30: 63 72 65 61 74 65 7c 63 6f 6d 6d 69 74 7c 6c 69  create|commit|li
4c40: 73 74 29 20 57 69 6b 69 4e 61 6d 65 0a 2a 2a 0a  st) WikiName.**.
4c50: 2a 2a 20 52 75 6e 20 76 61 72 69 6f 75 73 20 73  ** Run various s
4c60: 75 62 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 66 65  ubcommands to fe
4c70: 74 63 68 20 77 69 6b 69 20 65 6e 74 72 69 65 73  tch wiki entries
4c80: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73  ..**.**     %fos
4c90: 73 69 6c 20 77 69 6b 69 20 65 78 70 6f 72 74 20  sil wiki export 
4ca0: 50 41 47 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 0a  PAGENAME ?FILE?.
4cb0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 53 65 6e  **.**        Sen
4cc0: 64 73 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  ds the latest ve
4cd0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 50 41 47  rsion of the PAG
4ce0: 45 4e 41 4d 45 20 77 69 6b 69 0a 2a 2a 20 20 20  ENAME wiki.**   
4cf0: 20 20 20 20 20 65 6e 74 72 79 20 74 6f 20 74 68       entry to th
4d00: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 6f 72 20  e given file or 
4d10: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e  standard output.
4d20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73  .**.**     %foss
4d30: 69 6c 20 77 69 6b 69 20 63 6f 6d 6d 69 74 20 50  il wiki commit P
4d40: 41 47 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 0a 2a  AGENAME ?FILE?.*
4d50: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 43 6f 6d 6d  *.**        Comm
4d60: 69 74 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  it changes to a 
4d70: 77 69 6b 69 20 70 61 67 65 20 66 72 6f 6d 20 46  wiki page from F
4d80: 49 4c 45 20 6f 72 20 66 72 6f 6d 20 73 74 61 6e  ILE or from stan
4d90: 64 61 72 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  dard..**.**     
4da0: 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 63 72 65  %fossil wiki cre
4db0: 61 74 65 20 50 41 47 45 4e 41 4d 45 20 3f 46 49  ate PAGENAME ?FI
4dc0: 4c 45 3f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  LE?.**.**       
4dd0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 77 69   Create a new wi
4de0: 6b 69 20 70 61 67 65 20 77 69 74 68 20 69 6e 69  ki page with ini
4df0: 74 69 61 6c 20 63 6f 6e 74 65 6e 74 20 74 61 6b  tial content tak
4e00: 65 6e 20 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20  en from.**      
4e10: 20 20 46 49 4c 45 20 6f 72 20 66 72 6f 6d 20 73    FILE or from s
4e20: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a  tandard input..*
4e30: 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73 69 6c  *.**     %fossil
4e40: 20 77 69 6b 69 20 6c 69 73 74 0a 2a 2a 0a 2a 2a   wiki list.**.**
4e50: 20 20 20 20 20 20 20 20 4c 69 73 74 73 20 61 6c          Lists al
4e60: 6c 20 77 69 6b 69 20 65 6e 74 72 69 65 73 2c 20  l wiki entries, 
4e70: 6f 6e 65 20 70 65 72 20 6c 69 6e 65 2c 20 6f 72  one per line, or
4e80: 64 65 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  dered.**        
4e90: 63 61 73 65 2d 69 6e 73 65 6e 74 69 76 65 6c 79  case-insentively
4ea0: 20 62 79 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20   by name..**.** 
4eb0: 54 4f 44 4f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  TODOs:.**.**    
4ec0: 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 65 78   %fossil wiki ex
4ed0: 70 6f 72 74 20 3f 2d 75 20 55 55 49 44 3f 20 57  port ?-u UUID? W
4ee0: 69 6b 69 4e 61 6d 65 20 3f 46 49 4c 45 3f 0a 2a  ikiName ?FILE?.*
4ef0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 4f 75 74 70  *.**        Outp
4f00: 75 74 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  uts the selected
4f10: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6b 69   version of Wiki
4f20: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Name..**.**     
4f30: 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 64 65 6c  %fossil wiki del
4f40: 65 74 65 20 3f 2d 6d 20 4d 45 53 53 41 47 45 3f  ete ?-m MESSAGE?
4f50: 20 57 69 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20   WikiName.**.** 
4f60: 20 20 20 20 20 20 20 54 68 65 20 73 61 6d 65 20         The same 
4f70: 61 73 20 64 65 6c 65 74 69 6e 67 20 61 20 66 69  as deleting a fi
4f80: 6c 65 20 65 6e 74 72 79 2c 20 62 75 74 20 69 20  le entry, but i 
4f90: 64 6f 6e 27 74 20 6b 6e 6f 77 20 69 66 20 66 6f  don't know if fo
4fa0: 73 73 69 6c 0a 2a 2a 20 20 20 20 20 20 20 20 73  ssil.**        s
4fb0: 75 70 70 6f 72 74 73 20 61 20 63 6f 6d 6d 69 74  upports a commit
4fc0: 20 6d 65 73 73 61 67 65 20 66 6f 72 20 57 69 6b   message for Wik
4fd0: 69 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  i entries..**.**
4fe0: 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77 69 6b       %fossil wik
4ff0: 69 20 3f 2d 75 3f 20 3f 2d 64 3f 20 3f 2d 73 3d  i ?-u? ?-d? ?-s=
5000: 5b 7c 5d 3f 20 6c 69 73 74 0a 2a 2a 0a 2a 2a 20  [|]? list.**.** 
5010: 20 20 20 20 20 20 20 4c 69 73 74 73 20 74 68 65         Lists the
5020: 20 55 55 49 44 20 61 6e 64 2f 6f 72 20 44 61 74   UUID and/or Dat
5030: 65 20 6f 66 20 6c 61 73 74 20 63 68 61 6e 67 65  e of last change
5040: 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
5050: 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20   entry.**       
5060: 20 6e 61 6d 65 2c 20 64 65 6c 69 6d 69 74 65 64   name, delimited
5070: 20 62 79 20 74 68 65 20 2d 73 20 63 68 61 72 2e   by the -s char.
5080: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73  .**.**     %foss
5090: 69 6c 20 77 69 6b 69 20 64 69 66 66 20 3f 55 55  il wiki diff ?UU
50a0: 49 44 3f 20 3f 2d 66 20 69 6e 66 69 6c 65 5b 3d  ID? ?-f infile[=
50b0: 73 74 64 69 6e 5d 3f 20 45 6e 74 72 79 4e 61 6d  stdin]? EntryNam
50c0: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 44  e.**.**        D
50d0: 69 66 66 73 20 74 68 65 20 6c 6f 63 61 6c 20 63  iffs the local c
50e0: 6f 70 79 20 6f 66 20 61 20 70 61 67 65 20 77 69  opy of a page wi
50f0: 74 68 20 61 20 67 69 76 65 6e 20 76 65 72 73 69  th a given versi
5100: 6f 6e 20 28 64 65 66 61 75 6c 74 69 6e 67 0a 2a  on (defaulting.*
5110: 2a 20 20 20 20 20 20 20 20 74 6f 20 74 68 65 20  *        to the 
5120: 68 65 61 64 20 76 65 72 73 69 6f 6e 29 2e 0a 2a  head version)..*
5130: 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 63 6d 64 28  /.void wiki_cmd(
5140: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  void){.  int n;.
5150: 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70    db_find_and_op
5160: 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 31 29  en_repository(1)
5170: 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3c 33  ;.  if( g.argc<3
5180: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6b   ){.    goto wik
5190: 69 5f 63 6d 64 5f 75 73 61 67 65 3b 0a 20 20 7d  i_cmd_usage;.  }
51a0: 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 67 2e  .  n = strlen(g.
51b0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  argv[2]);.  if( 
51c0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  n==0 ){.    goto
51d0: 20 77 69 6b 69 5f 63 6d 64 5f 75 73 61 67 65 3b   wiki_cmd_usage;
51e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 6e  .  }..  if( strn
51f0: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 65  cmp(g.argv[2],"e
5200: 78 70 6f 72 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  xport",n)==0 ){.
5210: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
5220: 7a 50 61 67 65 4e 61 6d 65 3b 20 20 20 20 20 20  zPageName;      
5230: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
5240: 20 77 69 6b 69 20 70 61 67 65 20 74 6f 20 65 78   wiki page to ex
5250: 70 6f 72 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  port */.    char
5260: 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 3b 20 20   const *zFile;  
5270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5280: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
5290: 66 69 6c 65 20 28 30 3d 73 74 64 6f 75 74 29 20  file (0=stdout) 
52a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 69 64 3b 20  */.    int rid; 
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52c0: 2a 20 41 72 74 69 66 61 63 74 20 49 44 20 6f 66  * Artifact ID of
52d0: 20 74 68 65 20 77 69 6b 69 20 70 61 67 65 20 2a   the wiki page *
52e0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5300: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
5310: 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 6f 64 79  .    char *zBody
5320: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
5330: 57 69 6b 69 20 70 61 67 65 20 63 6f 6e 74 65 6e  Wiki page conten
5340: 74 20 2a 2f 0a 20 20 20 20 4d 61 6e 69 66 65 73  t */.    Manifes
5350: 74 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  t m;            
5360: 20 2f 2a 20 50 61 72 73 65 64 20 77 69 6b 69 20   /* Parsed wiki 
5370: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  page content */.
5380: 20 20 20 20 69 66 28 20 28 67 2e 61 72 67 63 21      if( (g.argc!
5390: 3d 34 29 20 26 26 20 28 67 2e 61 72 67 63 21 3d  =4) && (g.argc!=
53a0: 35 29 20 29 7b 0a 20 20 20 20 20 20 75 73 61 67  5) ){.      usag
53b0: 65 28 22 65 78 70 6f 72 74 20 50 41 47 45 4e 41  e("export PAGENA
53c0: 4d 45 20 3f 46 49 4c 45 3f 22 29 3b 0a 20 20 20  ME ?FILE?");.   
53d0: 20 7d 0a 20 20 20 20 7a 50 61 67 65 4e 61 6d 65   }.    zPageName
53e0: 20 3d 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 20 20   = g.argv[3];.  
53f0: 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30    rid = db_int(0
5400: 2c 20 22 53 45 4c 45 43 54 20 78 2e 72 69 64 20  , "SELECT x.rid 
5410: 46 52 4f 4d 20 74 61 67 20 74 2c 20 74 61 67 78  FROM tag t, tagx
5420: 72 65 66 20 78 22 0a 20 20 20 20 20 20 22 20 57  ref x".      " W
5430: 48 45 52 45 20 78 2e 74 61 67 69 64 3d 74 2e 74  HERE x.tagid=t.t
5440: 61 67 69 64 20 41 4e 44 20 74 2e 74 61 67 6e 61  agid AND t.tagna
5450: 6d 65 3d 27 77 69 6b 69 2d 25 71 27 22 0a 20 20  me='wiki-%q'".  
5460: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 78      " ORDER BY x
5470: 2e 6d 74 69 6d 65 20 44 45 53 43 20 4c 49 4d 49  .mtime DESC LIMI
5480: 54 20 31 22 2c 0a 20 20 20 20 20 20 7a 50 61 67  T 1",.      zPag
5490: 65 4e 61 6d 65 20 0a 20 20 20 20 29 3b 0a 20 20  eName .    );.  
54a0: 20 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20    if( rid ){.   
54b0: 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b     Blob content;
54c0: 0a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67  .      content_g
54d0: 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74  et(rid, &content
54e0: 29 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66 65 73  );.      manifes
54f0: 74 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e  t_parse(&m, &con
5500: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
5510: 20 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f   m.type==CFTYPE_
5520: 57 49 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20  WIKI ){.        
5530: 7a 42 6f 64 79 20 3d 20 6d 2e 7a 57 69 6b 69 3b  zBody = m.zWiki;
5540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5550: 20 20 20 69 66 28 20 7a 42 6f 64 79 3d 3d 30 20     if( zBody==0 
5560: 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  ){.      fossil_
5570: 66 61 74 61 6c 28 22 77 69 6b 69 20 70 61 67 65  fatal("wiki page
5580: 20 5b 25 73 5d 20 6e 6f 74 20 66 6f 75 6e 64 22   [%s] not found"
5590: 2c 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20  ,zPageName);.   
55a0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72   }.    for(i=str
55b0: 6c 65 6e 28 7a 42 6f 64 79 29 3b 20 69 3e 30 20  len(zBody); i>0 
55c0: 26 26 20 69 73 73 70 61 63 65 28 7a 42 6f 64 79  && isspace(zBody
55d0: 5b 69 2d 31 5d 29 3b 20 69 2d 2d 29 7b 7d 0a 20  [i-1]); i--){}. 
55e0: 20 20 20 7a 46 69 6c 65 20 20 3d 20 28 67 2e 61     zFile  = (g.a
55f0: 72 67 63 3d 3d 34 29 20 3f 20 30 20 3a 20 67 2e  rgc==4) ? 0 : g.
5600: 61 72 67 76 5b 34 5d 3b 0a 20 20 20 20 69 66 28  argv[4];.    if(
5610: 20 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20   zFile ){.      
5620: 46 49 4c 45 20 2a 20 7a 46 3b 0a 20 20 20 20 20  FILE * zF;.     
5630: 20 73 68 6f 72 74 20 64 6f 43 6c 6f 73 65 20 3d   short doClose =
5640: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 31   0;.      if( (1
5650: 20 3d 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65   == strlen(zFile
5660: 29 29 20 26 26 20 28 27 2d 27 3d 3d 7a 46 69 6c  )) && ('-'==zFil
5670: 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  e[0]) ){.       
5680: 20 7a 46 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20   zF = stdout;.  
5690: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56a0: 20 20 20 7a 46 20 3d 20 66 6f 70 65 6e 28 20 7a     zF = fopen( z
56b0: 46 69 6c 65 2c 20 22 77 22 20 29 3b 0a 20 20 20  File, "w" );.   
56c0: 20 20 20 20 20 64 6f 43 6c 6f 73 65 20 3d 20 7a       doClose = z
56d0: 46 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20 20 20  F ? 1 : 0;.     
56e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 20 7a   }.      if( ! z
56f0: 46 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73  F ){.        fos
5700: 73 69 6c 5f 66 61 74 61 6c 28 22 77 69 6b 69 20  sil_fatal("wiki 
5710: 65 78 70 6f 72 74 20 63 6f 75 6c 64 20 6e 6f 74  export could not
5720: 20 6f 70 65 6e 20 6f 75 74 70 75 74 20 66 69 6c   open output fil
5730: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 22 29  e for writing.")
5740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5750: 66 70 72 69 6e 74 66 28 7a 46 2c 22 25 2e 2a 73  fprintf(zF,"%.*s
5760: 5c 6e 22 2c 20 69 2c 20 7a 42 6f 64 79 29 3b 0a  \n", i, zBody);.
5770: 20 20 20 20 20 20 69 66 28 20 64 6f 43 6c 6f 73        if( doClos
5780: 65 20 29 20 66 63 6c 6f 73 65 28 7a 46 29 3b 0a  e ) fclose(zF);.
5790: 20 20 20 20 7d 65 6c 73 65 7b 0a 09 70 72 69 6e      }else{..prin
57a0: 74 66 28 22 25 2e 2a 73 5c 6e 22 2c 20 69 2c 20  tf("%.*s\n", i, 
57b0: 7a 42 6f 64 79 29 3b 0a 20 20 20 20 7d 0a 20 20  zBody);.    }.  
57c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
57d0: 65 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28  e.  if( strncmp(
57e0: 67 2e 61 72 67 76 5b 32 5d 2c 22 63 6f 6d 6d 69  g.argv[2],"commi
57f0: 74 22 2c 6e 29 3d 3d 30 0a 20 20 20 20 20 20 7c  t",n)==0.      |
5800: 7c 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76  | strncmp(g.argv
5810: 5b 32 5d 2c 22 63 72 65 61 74 65 22 2c 6e 29 3d  [2],"create",n)=
5820: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
5830: 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 20 20 42  zPageName;.    B
5840: 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20  lob content;.   
5850: 20 69 66 28 20 67 2e 61 72 67 63 21 3d 34 20 26   if( g.argc!=4 &
5860: 26 20 67 2e 61 72 67 63 21 3d 35 20 29 7b 0a 20  & g.argc!=5 ){. 
5870: 20 20 20 20 20 75 73 61 67 65 28 22 63 6f 6d 6d       usage("comm
5880: 69 74 20 50 41 47 45 4e 41 4d 45 20 3f 46 49 4c  it PAGENAME ?FIL
5890: 45 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E?");.    }.    
58a0: 7a 50 61 67 65 4e 61 6d 65 20 3d 20 67 2e 61 72  zPageName = g.ar
58b0: 67 76 5b 33 5d 3b 0a 20 20 20 20 69 66 28 20 67  gv[3];.    if( g
58c0: 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20  .argc==4 ){.    
58d0: 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d    blob_read_from
58e0: 5f 63 68 61 6e 6e 65 6c 28 26 63 6f 6e 74 65 6e  _channel(&conten
58f0: 74 2c 20 73 74 64 69 6e 2c 20 2d 31 29 3b 0a 20  t, stdin, -1);. 
5900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5910: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66  blob_read_from_f
5920: 69 6c 65 28 26 63 6f 6e 74 65 6e 74 2c 20 67 2e  ile(&content, g.
5930: 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a  argv[4]);.    }.
5940: 20 20 20 20 69 66 28 20 67 2e 61 72 67 76 5b 32      if( g.argv[2
5950: 5d 5b 31 5d 3d 3d 27 72 27 20 29 7b 0a 20 20 20  ][1]=='r' ){.   
5960: 20 20 20 77 69 6b 69 5f 63 6d 64 5f 63 6f 6d 6d     wiki_cmd_comm
5970: 69 74 28 7a 50 61 67 65 4e 61 6d 65 2c 20 31 2c  it(zPageName, 1,
5980: 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20   &content);.    
5990: 20 20 70 72 69 6e 74 66 28 22 43 72 65 61 74 65    printf("Create
59a0: 64 20 6e 65 77 20 77 69 6b 69 20 70 61 67 65 20  d new wiki page 
59b0: 25 73 2e 5c 6e 22 2c 20 7a 50 61 67 65 4e 61 6d  %s.\n", zPageNam
59c0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
59d0: 20 20 20 20 20 77 69 6b 69 5f 63 6d 64 5f 63 6f       wiki_cmd_co
59e0: 6d 6d 69 74 28 7a 50 61 67 65 4e 61 6d 65 2c 20  mmit(zPageName, 
59f0: 30 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  0, &content);.  
5a00: 20 20 20 20 70 72 69 6e 74 66 28 22 55 70 64 61      printf("Upda
5a10: 74 65 64 20 77 69 6b 69 20 70 61 67 65 20 25 73  ted wiki page %s
5a20: 2e 5c 6e 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29  .\n", zPageName)
5a30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62  ;.    }.    blob
5a40: 5f 72 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29  _reset(&content)
5a50: 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
5a60: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32  strncmp(g.argv[2
5a70: 5d 2c 22 64 65 6c 65 74 65 22 2c 6e 29 3d 3d 30  ],"delete",n)==0
5a80: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 61 72   ){.    if( g.ar
5a90: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 75  gc!=5 ){.      u
5aa0: 73 61 67 65 28 22 64 65 6c 65 74 65 20 50 41 47  sage("delete PAG
5ab0: 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 7d 0a 20  ENAME");.    }. 
5ac0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
5ad0: 22 64 65 6c 65 74 65 20 6e 6f 74 20 79 65 74 20  "delete not yet 
5ae0: 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 22 29 3b 0a  implemented.");.
5af0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 73 74    }else.  if( st
5b00: 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c  rncmp(g.argv[2],
5b10: 22 6c 69 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  "list",n)==0 ){.
5b20: 20 20 20 20 53 74 6d 74 20 71 3b 0a 20 20 20 20      Stmt q;.    
5b30: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 0a  db_prepare(&q, .
5b40: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 75        "SELECT su
5b50: 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 20 36 29  bstr(tagname, 6)
5b60: 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20   FROM tag WHERE 
5b70: 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 77 69  tagname GLOB 'wi
5b80: 6b 69 2d 2a 27 22 0a 20 20 20 20 20 20 22 20 4f  ki-*'".      " O
5b90: 52 44 45 52 20 42 59 20 6c 6f 77 65 72 28 74 61  RDER BY lower(ta
5ba0: 67 6e 61 6d 65 29 22 0a 20 20 20 20 29 3b 0a 20  gname)".    );. 
5bb0: 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65     while( db_ste
5bc0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
5bd0: 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  W ){.      const
5be0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64   char *zName = d
5bf0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
5c00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  , 0);.      prin
5c10: 74 66 28 20 22 25 73 5c 6e 22 2c 7a 4e 61 6d 65  tf( "%s\n",zName
5c20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f  );.    }.    db_
5c30: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
5c40: 7d 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 67 6f  }else.  {.    go
5c50: 74 6f 20 77 69 6b 69 5f 63 6d 64 5f 75 73 61 67  to wiki_cmd_usag
5c60: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  e;.  }.  return;
5c70: 0a 0a 77 69 6b 69 5f 63 6d 64 5f 75 73 61 67 65  ..wiki_cmd_usage
5c80: 3a 0a 20 20 75 73 61 67 65 28 22 65 78 70 6f 72  :.  usage("expor
5c90: 74 7c 63 72 65 61 74 65 7c 63 6f 6d 6d 69 74 7c  t|create|commit|
5ca0: 6c 69 73 74 20 2e 2e 2e 22 29 3b 0a 7d 0a        list ...");.}.