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 48 6f 6d 65 ){. char *zHome
0980: 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 Page; /*
0990: 6e 61 6d 65 20 6f 66 20 68 6f 6d 65 20 70 61 67 name of home pag
09a0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 e */. char *zPr
09b0: 6f 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f ojName; /
09c0: 2a 20 6e 61 6d 65 20 6f 66 20 70 72 6f 6a 65 63 * name of projec
09d0: 74 20 2a 2f 0a 20 20 7a 50 72 6f 6a 4e 61 6d 65 t */. zProjName
09e0: 20 3d 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 = db_get("proje
09f0: 63 74 2d 6e 61 6d 65 22 2c 30 29 3b 0a 20 20 7a ct-name",0);. z
0a00: 48 6f 6d 65 50 61 67 65 20 3d 20 64 62 5f 67 65 HomePage = db_ge
0a10: 74 28 22 70 72 6f 6a 65 63 74 2d 68 6f 6d 65 22 t("project-home"
0a20: 2c 20 7a 50 72 6f 6a 4e 61 6d 65 20 29 3b 0a 20 , zProjName );.
0a30: 20 69 66 28 20 7a 50 72 6f 6a 4e 61 6d 65 20 26 if( zProjName &
0a40: 26 20 7a 50 72 6f 6a 4e 61 6d 65 5b 30 5d 20 29 & zProjName[0] )
0a50: 7b 0a 20 20 20 20 2f 2a 20 62 65 77 61 72 65 3a {. /* beware:
0a60: 20 74 68 69 73 20 63 6f 64 65 20 63 61 75 73 65 this code cause
0a70: 73 20 63 79 63 6c 69 63 20 72 65 64 69 72 65 63 s cyclic redirec
0a80: 74 73 20 6f 6e 20 61 20 34 30 34 20 62 65 63 61 ts on a 404 beca
0a90: 75 73 65 0a 20 20 20 20 20 20 20 6e 6f 74 5f 66 use. not_f
0aa0: 6f 75 6e 64 20 69 73 20 64 69 72 65 63 74 65 64 ound is directed
0ab0: 20 68 65 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 here.. */.
0ac0: 20 20 20 69 6e 74 20 6c 65 6e 50 3b 20 20 20 20 int lenP;
0ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74 72 6e /* strn
0ae0: 63 6d 70 28 29 20 62 6f 75 6e 64 65 72 20 2a 2f cmp() bounder */
0af0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 48 3b 20 20 . int lenH;
0b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 /* le
0b10: 6e 67 74 68 20 6f 66 20 7a 50 72 6f 6a 4e 61 6d ngth of zProjNam
0b20: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 20 7a 48 e */. if( zH
0b30: 6f 6d 65 50 61 67 65 20 26 26 20 21 20 7a 48 6f omePage && ! zHo
0b40: 6d 65 50 61 67 65 5b 30 5d 20 29 7b 0a 20 20 20 mePage[0] ){.
0b50: 20 20 20 20 20 7a 48 6f 6d 65 50 61 67 65 20 3d zHomePage =
0b60: 20 7a 50 72 6f 6a 4e 61 6d 65 3b 0a 20 20 20 20 zProjName;.
0b70: 7d 0a 20 20 20 20 6c 65 6e 50 20 3d 20 73 74 72 }. lenP = str
0b80: 6c 65 6e 28 7a 50 72 6f 6a 4e 61 6d 65 29 3b 0a len(zProjName);.
0b90: 20 20 20 20 6c 65 6e 48 20 3d 20 73 74 72 6c 65 lenH = strle
0ba0: 6e 28 7a 48 6f 6d 65 50 61 67 65 29 3b 0a 20 20 n(zHomePage);.
0bb0: 20 20 69 66 28 20 6c 65 6e 50 20 3c 20 6c 65 6e if( lenP < len
0bc0: 48 20 29 20 6c 65 6e 50 20 3d 20 6c 65 6e 48 3b H ) lenP = lenH;
0bd0: 0a 20 20 20 20 69 66 28 20 28 7a 50 72 6f 6a 4e . if( (zProjN
0be0: 61 6d 65 20 3d 3d 20 7a 48 6f 6d 65 50 61 67 65 ame == zHomePage
0bf0: 29 20 7c 7c 20 28 30 3d 3d 73 74 72 6e 63 6d 70 ) || (0==strncmp
0c00: 28 7a 50 72 6f 6a 4e 61 6d 65 2c 7a 48 6f 6d 65 (zProjName,zHome
0c10: 50 61 67 65 2c 6c 65 6e 50 29 29 20 7c 7c 0a 20 Page,lenP)) ||.
0c20: 20 20 20 20 20 28 30 3d 3d 73 74 72 6e 63 6d 70 (0==strncmp
0c30: 28 7a 48 6f 6d 65 50 61 67 65 2c 22 68 6f 6d 65 (zHomePage,"home
0c40: 22 2c 6c 65 6e 50 29 2f 2a 61 76 6f 69 64 20 65 ",lenP)/*avoid e
0c50: 6e 64 6c 65 73 73 20 6c 6f 6f 70 2a 2f 29 20 29 ndless loop*/) )
0c60: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 67 69 6e 5f {. login_
0c70: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c check_credential
0c80: 73 28 29 3b 0a 20 20 20 20 20 20 20 20 67 2e 7a s();. g.z
0c90: 45 78 74 72 61 20 3d 20 7a 48 6f 6d 65 50 61 67 Extra = zHomePag
0ca0: 65 3b 0a 20 20 20 20 20 20 20 20 63 67 69 5f 73 e;. cgi_s
0cb0: 65 74 5f 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 et_parameter_noc
0cc0: 6f 70 79 28 22 6e 61 6d 65 22 2c 20 67 2e 7a 45 opy("name", g.zE
0cd0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 67 xtra);. g
0ce0: 2e 6f 6b 52 64 57 69 6b 69 20 3d 20 31 3b 0a 20 .okRdWiki = 1;.
0cf0: 20 20 20 20 20 20 20 67 2e 6f 6b 41 70 6e 64 57 g.okApndW
0d00: 69 6b 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 iki = 0;.
0d10: 20 67 2e 6f 6b 57 72 57 69 6b 69 20 3d 20 30 3b g.okWrWiki = 0;
0d20: 0a 20 20 20 20 20 20 20 20 67 2e 6f 6b 48 69 73 . g.okHis
0d30: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 tory = 0;.
0d40: 20 20 77 69 6b 69 5f 70 61 67 65 28 29 3b 0a 20 wiki_page();.
0d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
0d60: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 20 cgi_redirect(
0d70: 7a 48 6f 6d 65 50 61 67 65 20 29 3b 0a 20 20 20 zHomePage );.
0d80: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 }. return;.
0d90: 20 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 }.. style_head
0da0: 65 72 28 22 48 6f 6d 65 22 29 3b 0a 20 20 40 20 er("Home");. @
0db0: 3c 70 3e 54 68 69 73 20 69 73 20 61 20 73 74 75 <p>This is a stu
0dc0: 62 20 68 6f 6d 65 2d 70 61 67 65 20 66 6f 72 20 b home-page for
0dd0: 74 68 65 20 70 72 6f 6a 65 63 74 2e 0a 20 20 40 the project.. @
0de0: 20 54 6f 20 66 69 6c 6c 20 69 6e 20 74 68 69 73 To fill in this
0df0: 20 70 61 67 65 2c 20 66 69 72 73 74 20 67 6f 20 page, first go
0e00: 74 6f 0a 20 20 40 20 3c 61 20 68 72 65 66 3d 22 to. @ <a href="
0e10: 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 73 %s(g.zBaseURL)/s
0e20: 65 74 75 70 5f 63 6f 6e 66 69 67 22 3e 73 65 74 etup_config">set
0e30: 75 70 2f 63 6f 6e 66 69 67 3c 2f 61 3e 0a 20 20 up/config</a>.
0e40: 40 20 61 6e 64 20 65 73 74 61 62 6c 69 73 68 20 @ and establish
0e50: 61 20 22 50 72 6f 6a 65 63 74 20 4e 61 6d 65 22 a "Project Name"
0e60: 2e 20 20 54 68 65 6e 20 63 72 65 61 74 65 20 61 . Then create a
0e70: 0a 20 20 40 20 77 69 6b 69 20 70 61 67 65 20 77 . @ wiki page w
0e80: 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 ith that name.
0e90: 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 The content of t
0ea0: 68 61 74 20 77 69 6b 69 20 70 61 67 65 0a 20 20 hat wiki page.
0eb0: 40 20 77 69 6c 6c 20 62 65 20 64 69 73 70 6c 61 @ will be displa
0ec0: 79 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 yed in place of
0ed0: 74 68 69 73 20 6d 65 73 73 61 67 65 2e 0a 20 20 this message..
0ee0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a style_footer();.
0ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
0f00: 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 true if the give
0f10: 6e 20 70 61 67 65 6e 61 6d 65 20 69 73 20 74 68 n pagename is th
0f20: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 61 e name of the sa
0f30: 6e 64 62 6f 78 0a 2a 2f 0a 73 74 61 74 69 63 20 ndbox.*/.static
0f40: 69 6e 74 20 69 73 5f 73 61 6e 64 62 6f 78 28 63 int is_sandbox(c
0f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 67 65 onst char *zPage
0f60: 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 name){. return
0f70: 73 74 72 63 61 73 65 63 6d 70 28 7a 50 61 67 65 strcasecmp(zPage
0f80: 6e 61 6d 65 2c 22 73 61 6e 64 62 6f 78 22 29 3d name,"sandbox")=
0f90: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 73 =0 ||. s
0fa0: 74 72 63 61 73 65 63 6d 70 28 7a 50 61 67 65 6e trcasecmp(zPagen
0fb0: 61 6d 65 2c 22 73 61 6e 64 20 62 6f 78 22 29 3d ame,"sand box")=
0fc0: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 =0;.}../*.** WEB
0fd0: 50 41 47 45 3a 20 77 69 6b 69 0a 2a 2a 20 55 52 PAGE: wiki.** UR
0fe0: 4c 3a 20 2f 77 69 6b 69 3f 6e 61 6d 65 3d 50 41 L: /wiki?name=PA
0ff0: 47 45 4e 41 4d 45 0a 2a 2f 0a 76 6f 69 64 20 77 GENAME.*/.void w
1000: 69 6b 69 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a iki_page(void){.
1010: 20 20 63 68 61 72 20 2a 7a 54 61 67 3b 0a 20 20 char *zTag;.
1020: 69 6e 74 20 72 69 64 3b 0a 20 20 69 6e 74 20 69 int rid;. int i
1030: 73 53 61 6e 64 62 6f 78 3b 0a 20 20 42 6c 6f 62 sSandbox;. Blob
1040: 20 77 69 6b 69 3b 0a 20 20 4d 61 6e 69 66 65 73 wiki;. Manifes
1050: 74 20 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 t m;. const cha
1060: 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20 r *zPageName;.
1070: 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65 4e char *zHtmlPageN
1080: 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6f ame;. char *zBo
1090: 64 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 dy = mprintf("%s
10a0: 22 2c 22 3c 69 3e 45 6d 70 74 79 20 50 61 67 65 ","<i>Empty Page
10b0: 3c 2f 69 3e 22 29 3b 0a 0a 20 20 6c 6f 67 69 6e </i>");.. login
10c0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 _check_credentia
10d0: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f ls();. if( !g.o
10e0: 6b 52 64 57 69 6b 69 20 29 7b 20 6c 6f 67 69 6e kRdWiki ){ login
10f0: 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 _needed(); retur
1100: 6e 3b 20 7d 0a 20 20 7a 50 61 67 65 4e 61 6d 65 n; }. zPageName
1110: 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20 20 = P("name");.
1120: 69 66 28 20 7a 50 61 67 65 4e 61 6d 65 3d 3d 30 if( zPageName==0
1130: 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 ){. style_he
1140: 61 64 65 72 28 22 57 69 6b 69 22 29 3b 0a 20 20 ader("Wiki");.
1150: 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 40 20 3c @ <ul>. @ <
1160: 6c 69 3e 20 3c 61 20 68 72 65 66 3d 22 25 73 28 li> <a href="%s(
1170: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 g.zBaseURL)/time
1180: 6c 69 6e 65 3f 79 3d 77 22 3e 52 65 63 65 6e 74 line?y=w">Recent
1190: 20 63 68 61 6e 67 65 73 3c 2f 61 3e 20 74 6f 20 changes</a> to
11a0: 77 69 6b 69 0a 20 20 20 20 40 20 20 20 20 20 20 wiki. @
11b0: 70 61 67 65 73 2e 20 3c 2f 6c 69 3e 0a 20 20 20 pages. </li>.
11c0: 20 40 20 3c 6c 69 3e 20 3c 61 20 68 72 65 66 3d @ <li> <a href=
11d0: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f "%s(g.zBaseURL)/
11e0: 77 69 6b 69 5f 72 75 6c 65 73 22 3e 46 6f 72 6d wiki_rules">Form
11f0: 61 74 74 69 6e 67 20 72 75 6c 65 73 3c 2f 61 3e atting rules</a>
1200: 20 66 6f 72 20 0a 20 20 20 20 40 20 20 20 20 20 for . @
1210: 20 77 69 6b 69 2e 3c 2f 6c 69 3e 0a 20 20 20 20 wiki.</li>.
1220: 40 20 3c 6c 69 3e 20 55 73 65 20 74 68 65 20 3c @ <li> Use the <
1230: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 a href="%s(g.zBa
1240: 73 65 55 52 4c 29 2f 77 69 6b 69 3f 6e 61 6d 65 seURL)/wiki?name
1250: 3d 53 61 6e 64 62 6f 78 22 3e 53 61 6e 64 62 6f =Sandbox">Sandbo
1260: 78 3c 2f 61 3e 0a 20 20 20 20 40 20 20 20 20 20 x</a>. @
1270: 20 74 6f 20 65 78 70 65 72 69 6d 65 6e 74 2e 3c to experiment.<
1280: 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 /li>. @ <li>
1290: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 <a href="%s(g.zB
12a0: 61 73 65 55 52 4c 29 2f 77 63 6f 6e 74 65 6e 74 aseURL)/wcontent
12b0: 22 3e 4c 69 73 74 20 6f 66 20 41 6c 6c 20 57 69 ">List of All Wi
12c0: 6b 69 20 50 61 67 65 73 3c 2f 61 3e 0a 20 20 20 ki Pages</a>.
12d0: 20 40 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c @ availabl
12e0: 65 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 e on this server
12f0: 2e 3c 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 2f 75 .</li>. @ </u
1300: 6c 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f l>. style_foo
1310: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 ter();. retur
1320: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 n;. }. if( che
1330: 63 6b 5f 6e 61 6d 65 28 7a 50 61 67 65 4e 61 6d ck_name(zPageNam
1340: 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 e) ) return;. i
1350: 73 53 61 6e 64 62 6f 78 20 3d 20 69 73 5f 73 61 sSandbox = is_sa
1360: 6e 64 62 6f 78 28 7a 50 61 67 65 4e 61 6d 65 29 ndbox(zPageName)
1370: 3b 0a 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f ;. if( isSandbo
1380: 78 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20 3d x ){. zBody =
1390: 20 64 62 5f 67 65 74 28 22 73 61 6e 64 62 6f 78 db_get("sandbox
13a0: 22 2c 7a 42 6f 64 79 29 3b 0a 20 20 7d 65 6c 73 ",zBody);. }els
13b0: 65 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d 70 e{. zTag = mp
13c0: 72 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22 2c rintf("wiki-%s",
13d0: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 zPageName);.
13e0: 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c rid = db_int(0,
13f0: 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 . "SELECT
1400: 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66 rid FROM tagxref
1410: 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 ". " WHERE
1420: 74 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74 61 tagid=(SELECT ta
1430: 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48 45 gid FROM tag WHE
1440: 52 45 20 74 61 67 6e 61 6d 65 3d 25 51 29 22 0a RE tagname=%Q)".
1450: 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 " ORDER BY
1460: 20 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 54 mtime DESC", zT
1470: 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 72 ag. );. fr
1480: 65 65 28 7a 54 61 67 29 3b 0a 20 20 20 20 6d 65 ee(zTag);. me
1490: 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 mset(&m, 0, size
14a0: 6f 66 28 6d 29 29 3b 0a 20 20 20 20 62 6c 6f 62 of(m));. blob
14b0: 5f 7a 65 72 6f 28 26 6d 2e 63 6f 6e 74 65 6e 74 _zero(&m.content
14c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 69 64 20 29 );. if( rid )
14d0: 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 63 6f 6e {. Blob con
14e0: 74 65 6e 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 tent;. cont
14f0: 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f ent_get(rid, &co
1500: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 61 ntent);. ma
1510: 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d 2c nifest_parse(&m,
1520: 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 &content);.
1530: 20 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 if( m.type==CF
1540: 54 59 50 45 5f 57 49 4b 49 20 29 7b 0a 20 20 20 TYPE_WIKI ){.
1550: 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d 2e 7a zBody = m.z
1560: 57 69 6b 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Wiki;. }.
1570: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 }. }. if( is
1580: 53 61 6e 64 62 6f 78 20 7c 7c 20 28 72 69 64 20 Sandbox || (rid
1590: 26 26 20 67 2e 6f 6b 57 72 57 69 6b 69 29 20 7c && g.okWrWiki) |
15a0: 7c 20 28 21 72 69 64 20 26 26 20 67 2e 6f 6b 4e | (!rid && g.okN
15b0: 65 77 57 69 6b 69 29 20 29 7b 0a 20 20 20 20 73 ewWiki) ){. s
15c0: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 tyle_submenu_ele
15d0: 6d 65 6e 74 28 22 45 64 69 74 22 2c 20 22 45 64 ment("Edit", "Ed
15e0: 69 74 20 57 69 6b 69 20 50 61 67 65 22 2c 20 22 it Wiki Page", "
15f0: 25 73 2f 77 69 6b 69 65 64 69 74 3f 6e 61 6d 65 %s/wikiedit?name
1600: 3d 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 67 =%T",. g
1610: 2e 7a 54 6f 70 2c 20 7a 50 61 67 65 4e 61 6d 65 .zTop, zPageName
1620: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 53 );. }. if( isS
1630: 61 6e 64 62 6f 78 20 7c 7c 20 28 72 69 64 20 26 andbox || (rid &
1640: 26 20 67 2e 6f 6b 41 70 6e 64 57 69 6b 69 29 20 & g.okApndWiki)
1650: 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 ){. style_sub
1660: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 41 70 menu_element("Ap
1670: 70 65 6e 64 22 2c 20 22 41 64 64 20 41 20 43 6f pend", "Add A Co
1680: 6d 6d 65 6e 74 22 2c 20 22 25 73 2f 77 69 6b 69 mment", "%s/wiki
1690: 61 70 70 65 6e 64 3f 6e 61 6d 65 3d 25 54 22 2c append?name=%T",
16a0: 0a 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 . g.zTop
16b0: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 , zPageName);.
16c0: 7d 0a 20 20 69 66 28 20 21 69 73 53 61 6e 64 62 }. if( !isSandb
16d0: 6f 78 20 26 26 20 67 2e 6f 6b 48 69 73 74 6f 72 ox && g.okHistor
16e0: 79 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73 y ){. style_s
16f0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 ubmenu_element("
1700: 48 69 73 74 6f 72 79 22 2c 20 22 48 69 73 74 6f History", "Histo
1710: 72 79 22 2c 20 22 25 73 2f 77 68 69 73 74 6f 72 ry", "%s/whistor
1720: 79 3f 6e 61 6d 65 3d 25 54 22 2c 0a 20 20 20 20 y?name=%T",.
1730: 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 50 61 g.zTop, zPa
1740: 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 7a geName);. }. z
1750: 48 74 6d 6c 50 61 67 65 4e 61 6d 65 20 3d 20 6d HtmlPageName = m
1760: 70 72 69 6e 74 66 28 22 25 68 22 2c 20 7a 50 61 printf("%h", zPa
1770: 67 65 4e 61 6d 65 29 3b 0a 20 20 73 74 79 6c 65 geName);. style
1780: 5f 68 65 61 64 65 72 28 7a 48 74 6d 6c 50 61 67 _header(zHtmlPag
1790: 65 4e 61 6d 65 29 3b 0a 20 20 62 6c 6f 62 5f 69 eName);. blob_i
17a0: 6e 69 74 28 26 77 69 6b 69 2c 20 7a 42 6f 64 79 nit(&wiki, zBody
17b0: 2c 20 2d 31 29 3b 0a 20 20 77 69 6b 69 5f 63 6f , -1);. wiki_co
17c0: 6e 76 65 72 74 28 26 77 69 6b 69 2c 20 30 2c 20 nvert(&wiki, 0,
17d0: 30 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 0);. blob_reset
17e0: 28 26 77 69 6b 69 29 3b 0a 20 20 69 66 28 20 21 (&wiki);. if( !
17f0: 69 73 53 61 6e 64 62 6f 78 20 29 7b 0a 20 20 20 isSandbox ){.
1800: 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 manifest_clear(
1810: 26 6d 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 &m);. }. style
1820: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a _footer();.}../*
1830: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 69 6b .** WEBPAGE: wik
1840: 69 65 64 69 74 0a 2a 2a 20 55 52 4c 3a 20 2f 77 iedit.** URL: /w
1850: 69 6b 69 65 64 69 74 3f 6e 61 6d 65 3d 50 41 47 ikiedit?name=PAG
1860: 45 4e 41 4d 45 0a 2a 2f 0a 76 6f 69 64 20 77 69 ENAME.*/.void wi
1870: 6b 69 65 64 69 74 5f 70 61 67 65 28 76 6f 69 64 kiedit_page(void
1880: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 67 3b ){. char *zTag;
1890: 0a 20 20 69 6e 74 20 72 69 64 20 3d 20 30 3b 0a . int rid = 0;.
18a0: 20 20 69 6e 74 20 69 73 53 61 6e 64 62 6f 78 3b int isSandbox;
18b0: 0a 20 20 42 6c 6f 62 20 77 69 6b 69 3b 0a 20 20 . Blob wiki;.
18c0: 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20 20 63 6f Manifest m;. co
18d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 67 65 4e nst char *zPageN
18e0: 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 48 74 ame;. char *zHt
18f0: 6d 6c 50 61 67 65 4e 61 6d 65 3b 0a 20 20 69 6e mlPageName;. in
1900: 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 t n;. const cha
1910: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 42 r *z;. char *zB
1920: 6f 64 79 20 3d 20 28 63 68 61 72 2a 29 50 28 22 ody = (char*)P("
1930: 77 22 29 3b 0a 0a 20 20 69 66 28 20 7a 42 6f 64 w");.. if( zBod
1940: 79 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20 3d y ){. zBody =
1950: 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a mprintf("%s", z
1960: 42 6f 64 79 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 Body);. }. log
1970: 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 in_check_credent
1980: 69 61 6c 73 28 29 3b 0a 20 20 7a 50 61 67 65 4e ials();. zPageN
1990: 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c ame = PD("name",
19a0: 22 22 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b "");. if( check
19b0: 5f 6e 61 6d 65 28 7a 50 61 67 65 4e 61 6d 65 29 _name(zPageName)
19c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 73 53 ) return;. isS
19d0: 61 6e 64 62 6f 78 20 3d 20 69 73 5f 73 61 6e 64 andbox = is_sand
19e0: 62 6f 78 28 7a 50 61 67 65 4e 61 6d 65 29 3b 0a box(zPageName);.
19f0: 20 20 69 66 28 20 69 73 53 61 6e 64 62 6f 78 20 if( isSandbox
1a00: 29 7b 0a 20 20 20 20 69 66 28 20 7a 42 6f 64 79 ){. if( zBody
1a10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 42 6f ==0 ){. zBo
1a20: 64 79 20 3d 20 64 62 5f 67 65 74 28 22 73 61 6e dy = db_get("san
1a30: 64 62 6f 78 22 2c 22 22 29 3b 0a 20 20 20 20 7d dbox","");. }
1a40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 . }else{. zT
1a50: 61 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 77 69 ag = mprintf("wi
1a60: 6b 69 2d 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d ki-%s", zPageNam
1a70: 65 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 64 62 e);. rid = db
1a80: 5f 69 6e 74 28 30 2c 20 0a 20 20 20 20 20 20 22 _int(0, . "
1a90: 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 SELECT rid FROM
1aa0: 74 61 67 78 72 65 66 22 0a 20 20 20 20 20 20 22 tagxref". "
1ab0: 20 57 48 45 52 45 20 74 61 67 69 64 3d 28 53 45 WHERE tagid=(SE
1ac0: 4c 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20 LECT tagid FROM
1ad0: 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d tag WHERE tagnam
1ae0: 65 3d 25 51 29 22 0a 20 20 20 20 20 20 22 20 4f e=%Q)". " O
1af0: 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20 44 45 RDER BY mtime DE
1b00: 53 43 22 2c 20 7a 54 61 67 0a 20 20 20 20 29 3b SC", zTag. );
1b10: 0a 20 20 20 20 66 72 65 65 28 7a 54 61 67 29 3b . free(zTag);
1b20: 0a 20 20 20 20 69 66 28 20 28 72 69 64 20 26 26 . if( (rid &&
1b30: 20 21 67 2e 6f 6b 57 72 57 69 6b 69 29 20 7c 7c !g.okWrWiki) ||
1b40: 20 28 21 72 69 64 20 26 26 20 21 67 2e 6f 6b 4e (!rid && !g.okN
1b50: 65 77 57 69 6b 69 29 20 29 7b 0a 20 20 20 20 20 ewWiki) ){.
1b60: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b login_needed();
1b70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 . return;.
1b80: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 }. memset(
1b90: 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 &m, 0, sizeof(m)
1ba0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f );. blob_zero
1bb0: 28 26 6d 2e 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 (&m.content);.
1bc0: 20 20 69 66 28 20 72 69 64 20 26 26 20 7a 42 6f if( rid && zBo
1bd0: 64 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 42 dy==0 ){. B
1be0: 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 lob content;.
1bf0: 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 content_get(r
1c00: 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 id, &content);.
1c10: 20 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 70 61 manifest_pa
1c20: 72 73 65 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 rse(&m, &content
1c30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 2e 74 );. if( m.t
1c40: 79 70 65 3d 3d 43 46 54 59 50 45 5f 57 49 4b 49 ype==CFTYPE_WIKI
1c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 6f 64 ){. zBod
1c60: 79 20 3d 20 6d 2e 7a 57 69 6b 69 3b 0a 20 20 20 y = m.zWiki;.
1c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 }. }. }.
1c80: 20 69 66 28 20 50 28 22 73 75 62 6d 69 74 22 29 if( P("submit")
1c90: 21 3d 30 20 26 26 20 7a 42 6f 64 79 21 3d 30 20 !=0 && zBody!=0
1ca0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 ){. char *zDa
1cb0: 74 65 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6b 73 te;. Blob cks
1cc0: 75 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 72 69 64 um;. int nrid
1cd0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 ;. blob_zero(
1ce0: 26 77 69 6b 69 29 3b 0a 20 20 20 20 64 62 5f 62 &wiki);. db_b
1cf0: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e egin_transaction
1d00: 28 29 3b 0a 20 20 20 20 69 66 28 20 69 73 53 61 ();. if( isSa
1d10: 6e 64 62 6f 78 20 29 7b 0a 20 20 20 20 20 20 64 ndbox ){. d
1d20: 62 5f 73 65 74 28 22 73 61 6e 64 62 6f 78 22 2c b_set("sandbox",
1d30: 7a 42 6f 64 79 2c 30 29 3b 0a 20 20 20 20 7d 65 zBody,0);. }e
1d40: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 44 61 74 65 lse{. zDate
1d50: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 = db_text(0, "S
1d60: 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 ELECT datetime('
1d70: 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20 20 20 7a now')");. z
1d80: 44 61 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a Date[10] = 'T';.
1d90: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
1da0: 64 66 28 26 77 69 6b 69 2c 20 22 44 20 25 73 5c df(&wiki, "D %s\
1db0: 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 n", zDate);.
1dc0: 20 20 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 free(zDate);.
1dd0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
1de0: 66 28 26 77 69 6b 69 2c 20 22 4c 20 25 46 5c 6e f(&wiki, "L %F\n
1df0: 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 ", zPageName);.
1e00: 20 20 20 20 20 69 66 28 20 72 69 64 20 29 7b 0a if( rid ){.
1e10: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 char *zU
1e20: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c uid = db_text(0,
1e30: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 "SELECT uuid FR
1e40: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 OM blob WHERE ri
1e50: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 d=%d", rid);.
1e60: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
1e70: 66 28 26 77 69 6b 69 2c 20 22 50 20 25 73 5c 6e f(&wiki, "P %s\n
1e80: 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 ", zUuid);.
1e90: 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b 0a free(zUuid);.
1ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 }. if
1eb0: 28 20 67 2e 7a 4c 6f 67 69 6e 20 29 7b 0a 20 20 ( g.zLogin ){.
1ec0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
1ed0: 64 66 28 26 77 69 6b 69 2c 20 22 55 20 25 46 5c df(&wiki, "U %F\
1ee0: 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 n", g.zLogin);.
1ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f }. blo
1f00: 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c b_appendf(&wiki,
1f10: 20 22 57 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 73 "W %d\n%s\n", s
1f20: 74 72 6c 65 6e 28 7a 42 6f 64 79 29 2c 20 7a 42 trlen(zBody), zB
1f30: 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 64 35 73 ody);. md5s
1f40: 75 6d 5f 62 6c 6f 62 28 26 77 69 6b 69 2c 20 26 um_blob(&wiki, &
1f50: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 62 6c cksum);. bl
1f60: 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 ob_appendf(&wiki
1f70: 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63 6b 73 , "Z %b\n", &cks
1f80: 75 6d 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f um);. blob_
1f90: 72 65 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20 reset(&cksum);.
1fa0: 20 20 20 20 20 6e 72 69 64 20 3d 20 63 6f 6e 74 nrid = cont
1fb0: 65 6e 74 5f 70 75 74 28 26 77 69 6b 69 2c 20 30 ent_put(&wiki, 0
1fc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d , 0);. db_m
1fd0: 75 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 ulti_exec("INSER
1fe0: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f T OR IGNORE INTO
1ff0: 20 75 6e 73 65 6e 74 20 56 41 4c 55 45 53 28 25 unsent VALUES(%
2000: 64 29 22 2c 20 6e 72 69 64 29 3b 0a 20 20 20 20 d)", nrid);.
2010: 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 manifest_cross
2020: 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 77 69 6b 69 link(nrid, &wiki
2030: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 );. blob_re
2040: 73 65 74 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 set(&wiki);.
2050: 20 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 content_deltif
2060: 79 28 72 69 64 2c 20 6e 72 69 64 2c 20 30 29 3b y(rid, nrid, 0);
2070: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 65 6e . }. db_en
2080: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 d_transaction(0)
2090: 3b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 ;. cgi_redire
20a0: 63 74 66 28 22 77 69 6b 69 3f 6e 61 6d 65 3d 25 ctf("wiki?name=%
20b0: 54 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a T", zPageName);.
20c0: 20 20 7d 0a 20 20 69 66 28 20 50 28 22 63 61 6e }. if( P("can
20d0: 63 65 6c 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 cel")!=0 ){.
20e0: 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 77 cgi_redirectf("w
20f0: 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50 iki?name=%T", zP
2100: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 ageName);. re
2110: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 turn;. }. if(
2120: 7a 42 6f 64 79 3d 3d 30 20 29 7b 0a 20 20 20 20 zBody==0 ){.
2130: 7a 42 6f 64 79 20 3d 20 6d 70 72 69 6e 74 66 28 zBody = mprintf(
2140: 22 3c 69 3e 45 6d 70 74 79 20 50 61 67 65 3c 2f "<i>Empty Page</
2150: 69 3e 22 29 3b 0a 20 20 7d 0a 20 20 7a 48 74 6d i>");. }. zHtm
2160: 6c 50 61 67 65 4e 61 6d 65 20 3d 20 6d 70 72 69 lPageName = mpri
2170: 6e 74 66 28 22 45 64 69 74 3a 20 25 68 22 2c 20 ntf("Edit: %h",
2180: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 73 74 zPageName);. st
2190: 79 6c 65 5f 68 65 61 64 65 72 28 7a 48 74 6d 6c yle_header(zHtml
21a0: 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 PageName);. if(
21b0: 20 50 28 22 70 72 65 76 69 65 77 22 29 21 3d 30 P("preview")!=0
21c0: 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 ){. blob_zer
21d0: 6f 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 62 6c o(&wiki);. bl
21e0: 6f 62 5f 61 70 70 65 6e 64 28 26 77 69 6b 69 2c ob_append(&wiki,
21f0: 20 7a 42 6f 64 79 2c 20 2d 31 29 3b 0a 20 20 20 zBody, -1);.
2200: 20 40 20 50 72 65 76 69 65 77 3a 3c 68 72 3e 0a @ Preview:<hr>.
2210: 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 wiki_convert
2220: 28 26 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 (&wiki, 0, 0);.
2230: 20 20 20 40 20 3c 68 72 3e 0a 20 20 20 20 62 6c @ <hr>. bl
2240: 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b ob_reset(&wiki);
2250: 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 32 2c 20 . }. for(n=2,
2260: 7a 3d 7a 42 6f 64 79 3b 20 7a 5b 30 5d 3b 20 7a z=zBody; z[0]; z
2270: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 30 ++){. if( z[0
2280: 5d 3d 3d 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 ]=='\n' ) n++;.
2290: 20 7d 0a 20 20 69 66 28 20 6e 3c 32 30 20 29 20 }. if( n<20 )
22a0: 6e 20 3d 20 32 30 3b 0a 20 20 69 66 28 20 6e 3e n = 20;. if( n>
22b0: 32 30 30 20 29 20 6e 20 3d 20 32 30 30 3b 0a 20 200 ) n = 200;.
22c0: 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d @ <form method=
22d0: 22 50 4f 53 54 22 20 61 63 74 69 6f 6e 3d 22 25 "POST" action="%
22e0: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 69 s(g.zBaseURL)/wi
22f0: 6b 69 65 64 69 74 22 3e 0a 20 20 40 20 3c 69 6e kiedit">. @ <in
2300: 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e put type="hidden
2310: 22 20 6e 61 6d 65 3d 22 6e 61 6d 65 22 20 76 61 " name="name" va
2320: 6c 75 65 3d 22 25 68 28 7a 50 61 67 65 4e 61 6d lue="%h(zPageNam
2330: 65 29 22 3e 0a 20 20 40 20 3c 74 65 78 74 61 72 e)">. @ <textar
2340: 65 61 20 6e 61 6d 65 3d 22 77 22 20 63 6c 61 73 ea name="w" clas
2350: 73 3d 22 77 69 6b 69 65 64 69 74 22 20 63 6f 6c s="wikiedit" col
2360: 73 3d 22 38 30 22 20 0a 20 20 40 20 20 72 6f 77 s="80" . @ row
2370: 73 3d 22 25 64 28 6e 29 22 20 77 72 61 70 3d 22 s="%d(n)" wrap="
2380: 76 69 72 74 75 61 6c 22 3e 25 68 28 7a 42 6f 64 virtual">%h(zBod
2390: 79 29 3c 2f 74 65 78 74 61 72 65 61 3e 0a 20 20 y)</textarea>.
23a0: 40 20 3c 62 72 3e 0a 20 20 40 20 3c 69 6e 70 75 @ <br>. @ <inpu
23b0: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 t type="submit"
23c0: 6e 61 6d 65 3d 22 70 72 65 76 69 65 77 22 20 76 name="preview" v
23d0: 61 6c 75 65 3d 22 50 72 65 76 69 65 77 20 59 6f alue="Preview Yo
23e0: 75 72 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 ur Changes">. @
23f0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 <input type="su
2400: 62 6d 69 74 22 20 6e 61 6d 65 3d 22 73 75 62 6d bmit" name="subm
2410: 69 74 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 it" value="Apply
2420: 20 54 68 65 73 65 20 43 68 61 6e 67 65 73 22 3e These Changes">
2430: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 . @ <input type
2440: 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 ="submit" name="
2450: 63 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d 22 43 cancel" value="C
2460: 61 6e 63 65 6c 22 3e 0a 20 20 40 20 3c 2f 66 6f ancel">. @ </fo
2470: 72 6d 3e 0a 20 20 69 66 28 20 21 69 73 53 61 6e rm>. if( !isSan
2480: 64 62 6f 78 20 29 7b 0a 20 20 20 20 6d 61 6e 69 dbox ){. mani
2490: 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a fest_clear(&m);.
24a0: 20 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 }. style_foot
24b0: 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 er();.}../*.** A
24c0: 70 70 65 6e 64 20 74 68 65 20 77 69 6b 69 20 74 ppend the wiki t
24d0: 65 78 74 20 66 6f 72 20 61 6e 20 72 65 6d 61 72 ext for an remar
24e0: 6b 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 k to the end of
24f0: 74 68 65 20 67 69 76 65 6e 20 42 4c 4f 42 2e 0a the given BLOB..
2500: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 */.static void a
2510: 70 70 65 6e 64 52 65 6d 61 72 6b 28 42 6c 6f 62 ppendRemark(Blob
2520: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 *p){. char *zD
2530: 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 ate;. const cha
2540: 72 20 2a 7a 55 73 65 72 3b 0a 20 20 63 6f 6e 73 r *zUser;. cons
2550: 74 20 63 68 61 72 20 2a 7a 52 65 6d 61 72 6b 3b t char *zRemark;
2560: 0a 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 .. zDate = db_t
2570: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 ext(0, "SELECT d
2580: 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 atetime('now')")
2590: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 ;. blob_appendf
25a0: 28 70 2c 20 22 5c 6e 5c 6e 3c 68 72 3e 3c 69 3e (p, "\n\n<hr><i>
25b0: 4f 6e 20 25 73 20 55 54 43 20 25 68 22 2c 20 7a On %s UTC %h", z
25c0: 44 61 74 65 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b Date, g.zLogin);
25d0: 0a 20 20 66 72 65 65 28 7a 44 61 74 65 29 3b 0a . free(zDate);.
25e0: 20 20 7a 55 73 65 72 20 3d 20 50 44 28 22 75 22 zUser = PD("u"
25f0: 2c 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 69 66 ,g.zLogin);. if
2600: 28 20 7a 55 73 65 72 5b 30 5d 20 26 26 20 73 74 ( zUser[0] && st
2610: 72 63 6d 70 28 7a 55 73 65 72 2c 67 2e 7a 4c 6f rcmp(zUser,g.zLo
2620: 67 69 6e 29 20 29 7b 0a 20 20 20 20 62 6c 6f 62 gin) ){. blob
2630: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 20 28 63 _appendf(p, " (c
2640: 6c 61 69 6d 69 6e 67 20 74 6f 20 62 65 20 25 68 laiming to be %h
2650: 29 22 2c 20 7a 55 73 65 72 29 3b 0a 20 20 7d 0a )", zUser);. }.
2660: 20 20 7a 52 65 6d 61 72 6b 20 3d 20 50 44 28 22 zRemark = PD("
2670: 72 22 2c 22 22 29 3b 0a 20 20 62 6c 6f 62 5f 61 r","");. blob_a
2680: 70 70 65 6e 64 66 28 70 2c 20 22 20 61 64 64 65 ppendf(p, " adde
2690: 64 3a 3c 2f 69 3e 3c 62 72 20 2f 3e 5c 6e 25 73 d:</i><br />\n%s
26a0: 22 2c 20 7a 52 65 6d 61 72 6b 29 3b 0a 7d 0a 0a ", zRemark);.}..
26b0: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 /*.** WEBPAGE: w
26c0: 69 6b 69 61 70 70 65 6e 64 0a 2a 2a 20 55 52 4c ikiappend.** URL
26d0: 3a 20 2f 77 69 6b 69 61 70 70 65 6e 64 3f 6e 61 : /wikiappend?na
26e0: 6d 65 3d 50 41 47 45 4e 41 4d 45 0a 2a 2f 0a 76 me=PAGENAME.*/.v
26f0: 6f 69 64 20 77 69 6b 69 61 70 70 65 6e 64 5f 70 oid wikiappend_p
2700: 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 age(void){. cha
2710: 72 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74 20 72 r *zTag;. int r
2720: 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 id = 0;. int is
2730: 53 61 6e 64 62 6f 78 3b 0a 20 20 63 6f 6e 73 74 Sandbox;. const
2740: 20 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 char *zPageName
2750: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 74 6d 6c 50 ;. char *zHtmlP
2760: 61 67 65 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 ageName;. const
2770: 20 63 68 61 72 20 2a 7a 55 73 65 72 3b 0a 0a 20 char *zUser;..
2780: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 login_check_cre
2790: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 7a 50 dentials();. zP
27a0: 61 67 65 4e 61 6d 65 20 3d 20 50 44 28 22 6e 61 ageName = PD("na
27b0: 6d 65 22 2c 22 22 29 3b 0a 20 20 69 66 28 20 63 me","");. if( c
27c0: 68 65 63 6b 5f 6e 61 6d 65 28 7a 50 61 67 65 4e heck_name(zPageN
27d0: 61 6d 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 ame) ) return;.
27e0: 20 69 73 53 61 6e 64 62 6f 78 20 3d 20 69 73 5f isSandbox = is_
27f0: 73 61 6e 64 62 6f 78 28 7a 50 61 67 65 4e 61 6d sandbox(zPageNam
2800: 65 29 3b 0a 20 20 69 66 28 20 21 69 73 53 61 6e e);. if( !isSan
2810: 64 62 6f 78 20 29 7b 0a 20 20 20 20 7a 54 61 67 dbox ){. zTag
2820: 20 3d 20 6d 70 72 69 6e 74 66 28 22 77 69 6b 69 = mprintf("wiki
2830: 2d 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 -%s", zPageName)
2840: 3b 0a 20 20 20 20 72 69 64 20 3d 20 64 62 5f 69 ;. rid = db_i
2850: 6e 74 28 30 2c 20 0a 20 20 20 20 20 20 22 53 45 nt(0, . "SE
2860: 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 74 61 LECT rid FROM ta
2870: 67 78 72 65 66 22 0a 20 20 20 20 20 20 22 20 57 gxref". " W
2880: 48 45 52 45 20 74 61 67 69 64 3d 28 53 45 4c 45 HERE tagid=(SELE
2890: 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20 74 61 CT tagid FROM ta
28a0: 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 3d g WHERE tagname=
28b0: 25 51 29 22 0a 20 20 20 20 20 20 22 20 4f 52 44 %Q)". " ORD
28c0: 45 52 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43 ER BY mtime DESC
28d0: 22 2c 20 7a 54 61 67 0a 20 20 20 20 29 3b 0a 20 ", zTag. );.
28e0: 20 20 20 66 72 65 65 28 7a 54 61 67 29 3b 0a 20 free(zTag);.
28f0: 20 20 20 69 66 28 20 21 72 69 64 20 29 7b 0a 20 if( !rid ){.
2900: 20 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 cgi_redirec
2910: 74 28 22 69 6e 64 65 78 22 29 3b 0a 20 20 20 20 t("index");.
2920: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a return;. }.
2930: 20 20 7d 0a 20 20 69 66 28 20 21 67 2e 6f 6b 41 }. if( !g.okA
2940: 70 6e 64 57 69 6b 69 20 29 7b 0a 20 20 20 20 6c pndWiki ){. l
2950: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 ogin_needed();.
2960: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 return;. }.
2970: 20 69 66 28 20 50 28 22 73 75 62 6d 69 74 22 29 if( P("submit")
2980: 21 3d 30 20 26 26 20 50 28 22 72 22 29 21 3d 30 !=0 && P("r")!=0
2990: 20 26 26 20 50 28 22 75 22 29 21 3d 30 20 29 7b && P("u")!=0 ){
29a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65 . char *zDate
29b0: 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6b 73 75 6d ;. Blob cksum
29c0: 3b 0a 20 20 20 20 69 6e 74 20 6e 72 69 64 3b 0a ;. int nrid;.
29d0: 20 20 20 20 42 6c 6f 62 20 62 6f 64 79 3b 0a 20 Blob body;.
29e0: 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b Blob content;
29f0: 0a 20 20 20 20 42 6c 6f 62 20 77 69 6b 69 3b 0a . Blob wiki;.
2a00: 20 20 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a Manifest m;.
2a10: 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 . blob_zero(&
2a20: 62 6f 64 79 29 3b 0a 20 20 20 20 69 66 28 20 69 body);. if( i
2a30: 73 53 61 6e 64 62 6f 78 20 29 7b 0a 20 20 20 20 sSandbox ){.
2a40: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(&
2a50: 62 6f 64 79 2c 20 64 62 5f 67 65 74 28 22 73 61 body, db_get("sa
2a60: 6e 64 62 6f 78 22 2c 22 22 29 29 3b 0a 20 20 20 ndbox",""));.
2a70: 20 20 20 61 70 70 65 6e 64 52 65 6d 61 72 6b 28 appendRemark(
2a80: 26 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 64 62 &body);. db
2a90: 5f 73 65 74 28 22 73 61 6e 64 62 6f 78 22 2c 20 _set("sandbox",
2aa0: 62 6c 6f 62 5f 73 74 72 28 26 62 6f 64 79 29 2c blob_str(&body),
2ab0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 0);. }else{.
2ac0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65 content_ge
2ad0: 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 t(rid, &content)
2ae0: 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66 65 73 74 ;. manifest
2af0: 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e 74 _parse(&m, &cont
2b00: 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 ent);. if(
2b10: 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 57 m.type==CFTYPE_W
2b20: 49 4b 49 20 29 7b 0a 20 20 20 20 20 20 20 20 62 IKI ){. b
2b30: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 62 6f 64 lob_appendf(&bod
2b40: 79 2c 20 6d 2e 7a 57 69 6b 69 2c 20 2d 31 29 3b y, m.zWiki, -1);
2b50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d . }. m
2b60: 61 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d anifest_clear(&m
2b70: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a 65 );. blob_ze
2b80: 72 6f 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 20 ro(&wiki);.
2b90: 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 db_begin_transa
2ba0: 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 7a ction();. z
2bb0: 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 30 Date = db_text(0
2bc0: 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 , "SELECT dateti
2bd0: 6d 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20 me('now')");.
2be0: 20 20 20 7a 44 61 74 65 5b 31 30 5d 20 3d 20 27 zDate[10] = '
2bf0: 54 27 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 T';. blob_a
2c00: 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 44 ppendf(&wiki, "D
2c10: 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a %s\n", zDate);.
2c20: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
2c30: 64 66 28 26 77 69 6b 69 2c 20 22 4c 20 25 46 5c df(&wiki, "L %F\
2c40: 6e 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a n", zPageName);.
2c50: 20 20 20 20 20 20 69 66 28 20 72 69 64 20 29 7b if( rid ){
2c60: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a . char *z
2c70: 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 Uuid = db_text(0
2c80: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 , "SELECT uuid F
2c90: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 ROM blob WHERE r
2ca0: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 id=%d", rid);.
2cb0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
2cc0: 64 66 28 26 77 69 6b 69 2c 20 22 50 20 25 73 5c df(&wiki, "P %s\
2cd0: 6e 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 n", zUuid);.
2ce0: 20 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b free(zUuid);
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
2d00: 66 28 20 67 2e 7a 4c 6f 67 69 6e 20 29 7b 0a 20 f( g.zLogin ){.
2d10: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 blob_appe
2d20: 6e 64 66 28 26 77 69 6b 69 2c 20 22 55 20 25 46 ndf(&wiki, "U %F
2d30: 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a \n", g.zLogin);.
2d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c }. bl
2d50: 6f 62 5f 61 70 70 65 6e 64 66 28 26 62 6f 64 79 ob_appendf(&body
2d60: 2c 20 22 5c 6e 3c 68 72 3e 5c 6e 22 29 3b 0a 20 , "\n<hr>\n");.
2d70: 20 20 20 20 20 61 70 70 65 6e 64 52 65 6d 61 72 appendRemar
2d80: 6b 28 26 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 k(&body);.
2d90: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 blob_appendf(&wi
2da0: 6b 69 2c 20 22 57 20 25 64 5c 6e 25 73 5c 6e 22 ki, "W %d\n%s\n"
2db0: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 62 6f 64 , blob_size(&bod
2dc0: 79 29 2c 20 62 6c 6f 62 5f 73 74 72 28 26 62 6f y), blob_str(&bo
2dd0: 64 79 29 29 3b 0a 20 20 20 20 20 20 6d 64 35 73 dy));. md5s
2de0: 75 6d 5f 62 6c 6f 62 28 26 77 69 6b 69 2c 20 26 um_blob(&wiki, &
2df0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 62 6c cksum);. bl
2e00: 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 ob_appendf(&wiki
2e10: 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63 6b 73 , "Z %b\n", &cks
2e20: 75 6d 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f um);. blob_
2e30: 72 65 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20 reset(&cksum);.
2e40: 20 20 20 20 20 6e 72 69 64 20 3d 20 63 6f 6e 74 nrid = cont
2e50: 65 6e 74 5f 70 75 74 28 26 77 69 6b 69 2c 20 30 ent_put(&wiki, 0
2e60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d , 0);. db_m
2e70: 75 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 ulti_exec("INSER
2e80: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f T OR IGNORE INTO
2e90: 20 75 6e 73 65 6e 74 20 56 41 4c 55 45 53 28 25 unsent VALUES(%
2ea0: 64 29 22 2c 20 6e 72 69 64 29 3b 0a 20 20 20 20 d)", nrid);.
2eb0: 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 manifest_cross
2ec0: 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 77 69 6b 69 link(nrid, &wiki
2ed0: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 );. blob_re
2ee0: 73 65 74 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 set(&wiki);.
2ef0: 20 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 content_deltif
2f00: 79 28 72 69 64 2c 20 6e 72 69 64 2c 20 30 29 3b y(rid, nrid, 0);
2f10: 0a 20 20 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 . db_end_tr
2f20: 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 ansaction(0);.
2f30: 20 20 7d 0a 20 20 20 20 63 67 69 5f 72 65 64 69 }. cgi_redi
2f40: 72 65 63 74 66 28 22 77 69 6b 69 3f 6e 61 6d 65 rectf("wiki?name
2f50: 3d 25 54 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 =%T", zPageName)
2f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 50 28 22 63 ;. }. if( P("c
2f70: 61 6e 63 65 6c 22 29 21 3d 30 20 29 7b 0a 20 20 ancel")!=0 ){.
2f80: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 cgi_redirectf(
2f90: 22 77 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 "wiki?name=%T",
2fa0: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 zPageName);.
2fb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 48 return;. }. zH
2fc0: 74 6d 6c 50 61 67 65 4e 61 6d 65 20 3d 20 6d 70 tmlPageName = mp
2fd0: 72 69 6e 74 66 28 22 41 70 70 65 6e 64 20 43 6f rintf("Append Co
2fe0: 6d 6d 65 6e 74 20 54 6f 3a 20 25 68 22 2c 20 7a mment To: %h", z
2ff0: 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 73 74 79 PageName);. sty
3000: 6c 65 5f 68 65 61 64 65 72 28 7a 48 74 6d 6c 50 le_header(zHtmlP
3010: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 ageName);. if(
3020: 50 28 22 70 72 65 76 69 65 77 22 29 21 3d 30 20 P("preview")!=0
3030: 29 7b 0a 20 20 20 20 42 6c 6f 62 20 70 72 65 76 ){. Blob prev
3040: 69 65 77 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 iew;. blob_ze
3050: 72 6f 28 26 70 72 65 76 69 65 77 29 3b 0a 20 20 ro(&preview);.
3060: 20 20 61 70 70 65 6e 64 52 65 6d 61 72 6b 28 26 appendRemark(&
3070: 70 72 65 76 69 65 77 29 3b 0a 20 20 20 20 40 20 preview);. @
3080: 50 72 65 76 69 65 77 3a 3c 68 72 3e 0a 20 20 20 Preview:<hr>.
3090: 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 70 wiki_convert(&p
30a0: 72 65 76 69 65 77 2c 20 30 2c 20 30 29 3b 0a 20 review, 0, 0);.
30b0: 20 20 20 40 20 3c 68 72 3e 0a 20 20 20 20 62 6c @ <hr>. bl
30c0: 6f 62 5f 72 65 73 65 74 28 26 70 72 65 76 69 65 ob_reset(&previe
30d0: 77 29 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 w);. }. zUser
30e0: 3d 20 50 44 28 22 75 22 2c 20 67 2e 7a 4c 6f 67 = PD("u", g.zLog
30f0: 69 6e 29 3b 0a 20 20 40 20 3c 66 6f 72 6d 20 6d in);. @ <form m
3100: 65 74 68 6f 64 3d 22 50 4f 53 54 22 20 61 63 74 ethod="POST" act
3110: 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 ion="%s(g.zBaseU
3120: 52 4c 29 2f 77 69 6b 69 61 70 70 65 6e 64 22 3e RL)/wikiappend">
3130: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 . @ <input type
3140: 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 ="hidden" name="
3150: 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 68 28 name" value="%h(
3160: 7a 50 61 67 65 4e 61 6d 65 29 22 3e 0a 20 20 40 zPageName)">. @
3170: 20 59 6f 75 72 20 4e 61 6d 65 3a 0a 20 20 40 20 Your Name:. @
3180: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 <input type="tex
3190: 74 22 20 6e 61 6d 65 3d 22 75 22 20 73 69 7a 65 t" name="u" size
31a0: 3d 22 32 30 22 20 76 61 6c 75 65 3d 22 25 68 28 ="20" value="%h(
31b0: 7a 55 73 65 72 29 22 3e 3c 62 72 3e 0a 20 20 40 zUser)"><br>. @
31c0: 20 43 6f 6d 6d 65 6e 74 20 74 6f 20 61 70 70 65 Comment to appe
31d0: 6e 64 3a 3c 62 72 3e 0a 20 20 40 20 3c 74 65 78 nd:<br>. @ <tex
31e0: 74 61 72 65 61 20 6e 61 6d 65 3d 22 72 22 20 63 tarea name="r" c
31f0: 6c 61 73 73 3d 22 77 69 6b 69 65 64 69 74 22 20 lass="wikiedit"
3200: 63 6f 6c 73 3d 22 38 30 22 20 0a 20 20 40 20 20 cols="80" . @
3210: 72 6f 77 73 3d 22 31 30 22 20 77 72 61 70 3d 22 rows="10" wrap="
3220: 76 69 72 74 75 61 6c 22 3e 25 68 28 50 44 28 22 virtual">%h(PD("
3230: 72 22 2c 22 22 29 29 3c 2f 74 65 78 74 61 72 65 r",""))</textare
3240: 61 3e 0a 20 20 40 20 3c 62 72 3e 0a 20 20 40 20 a>. @ <br>. @
3250: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 <input type="sub
3260: 6d 69 74 22 20 6e 61 6d 65 3d 22 70 72 65 76 69 mit" name="previ
3270: 65 77 22 20 76 61 6c 75 65 3d 22 50 72 65 76 69 ew" value="Previ
3280: 65 77 20 59 6f 75 72 20 43 6f 6d 6d 65 6e 74 22 ew Your Comment"
3290: 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 >. @ <input typ
32a0: 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d e="submit" name=
32b0: 22 73 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 "submit" value="
32c0: 41 70 70 65 6e 64 20 59 6f 75 72 20 43 68 61 6e Append Your Chan
32d0: 67 65 73 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 ges">. @ <input
32e0: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e type="submit" n
32f0: 61 6d 65 3d 22 63 61 6e 63 65 6c 22 20 76 61 6c ame="cancel" val
3300: 75 65 3d 22 43 61 6e 63 65 6c 22 3e 0a 20 20 40 ue="Cancel">. @
3310: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c 65 </form>. style
3320: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a _footer();.}../*
3330: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 68 69 .** WEBPAGE: whi
3340: 73 74 6f 72 79 0a 2a 2a 20 55 52 4c 3a 20 2f 77 story.** URL: /w
3350: 68 69 73 74 6f 72 79 3f 6e 61 6d 65 3d 50 41 47 history?name=PAG
3360: 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 ENAME.**.** Show
3370: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 68 the complete ch
3380: 61 6e 67 65 20 68 69 73 74 6f 72 79 20 66 6f 72 ange history for
3390: 20 61 20 73 69 6e 67 6c 65 20 77 69 6b 69 20 70 a single wiki p
33a0: 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 68 69 age..*/.void whi
33b0: 73 74 6f 72 79 5f 70 61 67 65 28 76 6f 69 64 29 story_page(void)
33c0: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63 68 {. Stmt q;. ch
33d0: 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20 20 63 68 ar *zTitle;. ch
33e0: 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 63 6f 6e 73 ar *zSQL;. cons
33f0: 74 20 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d t char *zPageNam
3400: 65 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b e;. login_check
3410: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a _credentials();.
3420: 20 20 69 66 28 20 21 67 2e 6f 6b 48 69 73 74 6f if( !g.okHisto
3430: 72 79 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 ry ){ login_need
3440: 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a ed(); return; }.
3450: 20 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20 50 44 zPageName = PD
3460: 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a 20 20 7a ("name","");. z
3470: 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28 Title = mprintf(
3480: 22 48 69 73 74 6f 72 79 20 4f 66 20 25 68 22 2c "History Of %h",
3490: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 73 zPageName);. s
34a0: 74 79 6c 65 5f 68 65 61 64 65 72 28 7a 54 69 74 tyle_header(zTit
34b0: 6c 65 29 3b 0a 20 20 66 72 65 65 28 7a 54 69 74 le);. free(zTit
34c0: 6c 65 29 3b 0a 0a 20 20 7a 53 51 4c 20 3d 20 6d le);.. zSQL = m
34d0: 70 72 69 6e 74 66 28 22 25 73 20 41 4e 44 20 65 printf("%s AND e
34e0: 76 65 6e 74 2e 6f 62 6a 69 64 20 49 4e 20 22 0a vent.objid IN ".
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3500: 20 22 20 20 28 53 45 4c 45 43 54 20 72 69 64 20 " (SELECT rid
3510: 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57 48 45 FROM tagxref WHE
3520: 52 45 20 74 61 67 69 64 3d 22 0a 20 20 20 20 20 RE tagid=".
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3540: 20 20 22 28 53 45 4c 45 43 54 20 74 61 67 69 64 "(SELECT tagid
3550: 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20 FROM tag WHERE
3560: 74 61 67 6e 61 6d 65 3d 27 77 69 6b 69 2d 25 71 tagname='wiki-%q
3570: 27 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 '))".
3580: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 "ORDER BY
3590: 6d 74 69 6d 65 20 44 45 53 43 22 2c 0a 20 20 20 mtime DESC",.
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 69 ti
35b0: 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 meline_query_for
35c0: 5f 77 77 77 28 29 2c 20 7a 50 61 67 65 4e 61 6d _www(), zPageNam
35d0: 65 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 e);. db_prepare
35e0: 28 26 71 2c 20 7a 53 51 4c 29 3b 0a 20 20 66 72 (&q, zSQL);. fr
35f0: 65 65 28 7a 53 51 4c 29 3b 0a 20 20 77 77 77 5f ee(zSQL);. www_
3600: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26 print_timeline(&
3610: 71 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a q);. db_finaliz
3620: 65 28 26 71 29 3b 0a 20 20 73 74 79 6c 65 5f 66 e(&q);. style_f
3630: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a ooter();.}../*.*
3640: 2a 20 57 45 42 50 41 47 45 3a 20 77 63 6f 6e 74 * WEBPAGE: wcont
3650: 65 6e 74 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 61 ent.**.** List a
3660: 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6b ll available wik
3670: 69 20 70 61 67 65 73 20 77 69 74 68 20 64 61 74 i pages with dat
3680: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c 61 e created and la
3690: 73 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a st modified..*/.
36a0: 76 6f 69 64 20 77 63 6f 6e 74 65 6e 74 5f 70 61 void wcontent_pa
36b0: 67 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 ge(void){. Stmt
36c0: 20 71 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 q;. login_chec
36d0: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b k_credentials();
36e0: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 64 57 69 . if( !g.okRdWi
36f0: 6b 69 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 ki ){ login_need
3700: 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a ed(); return; }.
3710: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 style_header("
3720: 41 76 61 69 6c 61 62 6c 65 20 57 69 6b 69 20 50 Available Wiki P
3730: 61 67 65 73 22 29 3b 0a 20 20 40 20 3c 75 6c 3e ages");. @ <ul>
3740: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 . db_prepare(&q
3750: 2c 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73 , . "SELECT s
3760: 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 20 36 ubstr(tagname, 6
3770: 2c 20 31 30 30 30 29 20 46 52 4f 4d 20 74 61 67 , 1000) FROM tag
3780: 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 47 WHERE tagname G
3790: 4c 4f 42 20 27 77 69 6b 69 2d 2a 27 22 0a 20 20 LOB 'wiki-*'".
37a0: 20 20 22 20 4f 52 44 45 52 20 42 59 20 6c 6f 77 " ORDER BY low
37b0: 65 72 28 74 61 67 6e 61 6d 65 29 22 0a 20 20 29 er(tagname)". )
37c0: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 ;. while( db_st
37d0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 ep(&q)==SQLITE_R
37e0: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 OW ){. const
37f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 char *zName = db
3800: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c _column_text(&q,
3810: 20 30 29 3b 0a 20 20 20 20 40 20 3c 6c 69 3e 3c 0);. @ <li><
3820: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 a href="%s(g.zBa
3830: 73 65 55 52 4c 29 2f 77 69 6b 69 3f 6e 61 6d 65 seURL)/wiki?name
3840: 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28 7a =%T(zName)">%h(z
3850: 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 6c 69 3e 0a 20 Name)</a></li>.
3860: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 }. db_finalize
3870: 28 26 71 29 3b 0a 20 20 40 20 3c 2f 75 6c 3e 0a (&q);. @ </ul>.
3880: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 style_footer()
3890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 ;.}../*.** WEBPA
38a0: 47 45 3a 20 77 69 6b 69 5f 72 75 6c 65 73 0a 2a GE: wiki_rules.*
38b0: 2f 0a 76 6f 69 64 20 77 69 6b 69 72 75 6c 65 73 /.void wikirules
38c0: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 73 _page(void){. s
38d0: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 57 69 6b tyle_header("Wik
38e0: 69 20 46 6f 72 6d 61 74 74 69 6e 67 20 52 75 6c i Formatting Rul
38f0: 65 73 22 29 3b 0a 20 20 40 20 3c 68 32 3e 46 6f es");. @ <h2>Fo
3900: 72 6d 61 74 74 69 6e 67 20 52 75 6c 65 20 53 75 rmatting Rule Su
3910: 6d 6d 61 72 79 3c 2f 68 32 3e 0a 20 20 40 20 3c mmary</h2>. @ <
3920: 6f 6c 3e 0a 20 20 40 20 3c 6c 69 3e 20 42 6c 61 ol>. @ <li> Bla
3930: 6e 6b 20 6c 69 6e 65 73 20 61 72 65 20 70 61 72 nk lines are par
3940: 61 67 72 61 70 68 20 62 72 65 61 6b 73 0a 20 20 agraph breaks.
3950: 40 20 3c 6c 69 3e 20 42 75 6c 6c 65 74 20 6c 69 @ <li> Bullet li
3960: 73 74 20 69 74 65 6d 73 20 61 72 65 20 61 20 22 st items are a "
3970: 2a 22 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e *" at the beginn
3980: 69 6e 67 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e ing of the line.
3990: 0a 20 20 40 20 3c 6c 69 3e 20 45 6e 75 6d 65 72 . @ <li> Enumer
39a0: 61 74 69 6f 6e 20 6c 69 73 74 20 69 74 65 6d 73 ation list items
39b0: 20 61 72 65 20 61 20 6e 75 6d 62 65 72 20 61 74 are a number at
39c0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f the beginning o
39d0: 66 20 61 20 6c 69 6e 65 2e 0a 20 20 40 20 3c 6c f a line.. @ <l
39e0: 69 3e 20 49 6e 64 65 6e 74 65 64 20 70 61 72 67 i> Indented parg
39f0: 72 61 70 68 73 20 62 65 67 69 6e 20 77 69 74 68 raphs begin with
3a00: 20 61 20 74 61 62 20 6f 72 20 74 77 6f 20 73 70 a tab or two sp
3a10: 61 63 65 73 2e 0a 20 20 40 20 3c 6c 69 3e 20 48 aces.. @ <li> H
3a20: 79 70 65 72 6c 69 6e 6b 73 20 61 72 65 20 63 6f yperlinks are co
3a30: 6e 74 61 69 6e 65 64 20 77 69 74 68 20 73 71 75 ntained with squ
3a40: 61 72 65 20 62 72 61 63 6b 65 74 73 3a 20 20 22 are brackets: "
3a50: 5b 74 61 72 67 65 74 5d 22 0a 20 20 40 20 3c 6c [target]". @ <l
3a60: 69 3e 20 4d 6f 73 74 20 6f 72 64 69 6e 61 72 79 i> Most ordinary
3a70: 20 48 54 4d 4c 20 77 6f 72 6b 73 2e 0a 20 20 40 HTML works.. @
3a80: 20 3c 6c 69 3e 20 26 6c 74 3b 76 65 72 62 61 74 <li> <verbat
3a90: 69 6d 26 67 74 3b 20 61 6e 64 20 26 6c 74 3b 6e im> and <n
3aa0: 6f 77 69 6b 69 26 67 74 3b 2e 0a 20 20 40 20 3c owiki>.. @ <
3ab0: 2f 6f 6c 3e 0a 20 20 40 20 3c 70 3e 57 65 20 63 /ol>. @ <p>We c
3ac0: 61 6c 6c 20 74 68 65 20 66 69 72 73 74 20 66 69 all the first fi
3ad0: 76 65 20 72 75 6c 65 73 20 61 62 6f 76 65 20 22 ve rules above "
3ae0: 77 69 6b 69 22 20 66 6f 72 6d 61 74 74 69 6e 67 wiki" formatting
3af0: 20 72 75 6c 65 73 2e 20 20 54 68 65 0a 20 20 40 rules. The. @
3b00: 20 6c 61 73 74 20 74 77 6f 20 72 75 6c 65 73 20 last two rules
3b10: 61 72 65 20 74 68 65 20 48 54 4d 4c 20 66 6f 72 are the HTML for
3b20: 6d 61 74 74 69 6e 67 20 72 75 6c 65 2e 3c 2f 70 matting rule.</p
3b30: 3e 0a 20 20 40 20 3c 68 32 3e 46 6f 72 6d 61 74 >. @ <h2>Format
3b40: 74 69 6e 67 20 52 75 6c 65 20 44 65 74 61 69 6c ting Rule Detail
3b50: 73 3c 2f 68 32 3e 0a 20 20 40 20 3c 6f 6c 3e 0a s</h2>. @ <ol>.
3b60: 20 20 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 50 @ <li> <p><b>P
3b70: 61 72 61 67 72 61 70 68 73 3c 2f 62 3e 2e 20 20 aragraphs</b>.
3b80: 41 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 Any sequence of
3b90: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 6c 61 6e one or more blan
3ba0: 6b 20 6c 69 6e 65 73 20 66 6f 72 6d 73 0a 20 20 k lines forms.
3bb0: 40 20 61 20 70 61 72 61 67 72 61 70 68 20 62 72 @ a paragraph br
3bc0: 65 61 6b 2e 20 20 43 65 6e 74 65 72 65 64 20 6f eak. Centered o
3bd0: 72 20 72 69 67 68 74 2d 6a 75 73 74 69 66 69 65 r right-justifie
3be0: 64 20 70 61 72 61 67 72 61 70 68 73 20 61 72 65 d paragraphs are
3bf0: 20 6e 6f 74 0a 20 20 40 20 73 75 70 70 6f 72 74 not. @ support
3c00: 65 64 20 62 79 20 77 69 6b 69 20 6d 61 72 6b 75 ed by wiki marku
3c10: 70 2c 20 62 75 74 20 79 6f 75 20 63 61 6e 20 64 p, but you can d
3c20: 6f 20 74 68 65 73 65 20 74 68 69 6e 67 73 20 69 o these things i
3c30: 66 20 79 6f 75 20 6e 65 65 64 20 74 68 65 6d 0a f you need them.
3c40: 20 20 40 20 75 73 69 6e 67 20 48 54 4d 4c 2e 3c @ using HTML.<
3c50: 2f 70 3e 0a 20 20 40 20 3c 6c 69 3e 20 3c 70 3e /p>. @ <li> <p>
3c60: 3c 62 3e 42 75 6c 6c 65 74 20 4c 69 73 74 73 3c <b>Bullet Lists<
3c70: 2f 62 3e 2e 0a 20 20 40 20 41 20 62 75 6c 6c 65 /b>.. @ A bulle
3c80: 74 20 6c 69 73 74 20 69 74 65 6d 20 62 65 67 69 t list item begi
3c90: 6e 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 ns with a single
3ca0: 20 22 2a 22 20 63 68 61 72 61 63 74 65 72 20 73 "*" character s
3cb0: 75 72 72 6f 75 6e 64 65 64 20 6f 6e 0a 20 20 40 urrounded on. @
3cc0: 20 62 6f 74 68 20 73 69 64 65 73 20 62 79 20 74 both sides by t
3cd0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 wo or more space
3ce0: 73 20 6f 72 20 62 79 20 61 20 74 61 62 2e 20 20 s or by a tab.
3cf0: 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6c 65 Only a single le
3d00: 76 65 6c 0a 20 20 40 20 6f 66 20 62 75 6c 6c 65 vel. @ of bulle
3d10: 74 20 6c 69 73 74 20 69 73 20 73 75 70 70 6f 72 t list is suppor
3d20: 74 65 64 20 62 79 20 77 69 6b 69 2e 20 20 46 6f ted by wiki. Fo
3d30: 72 20 74 65 73 74 65 64 20 6c 69 73 74 73 2c 20 r tested lists,
3d40: 75 73 65 20 48 54 4d 4c 2e 3c 2f 70 3e 0a 20 20 use HTML.</p>.
3d50: 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 45 6e 75 @ <li> <p><b>Enu
3d60: 6d 65 72 61 74 69 6f 6e 20 4c 69 73 74 73 3c 2f meration Lists</
3d70: 62 3e 2e 0a 20 20 40 20 41 6e 20 65 6e 75 6d 65 b>.. @ An enume
3d80: 72 61 74 69 6f 6e 20 6c 69 73 74 20 69 74 65 6d ration list item
3d90: 20 62 65 67 69 6e 73 20 77 69 74 68 20 6f 6e 65 begins with one
3da0: 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 or more digits
3db0: 6f 70 74 69 6f 6e 61 6c 6c 79 0a 20 20 40 20 66 optionally. @ f
3dc0: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 22 2e 22 ollowed by a "."
3dd0: 20 73 75 72 72 6f 75 6e 64 65 64 20 6f 6e 20 62 surrounded on b
3de0: 6f 74 68 20 73 69 64 65 73 20 62 79 20 74 77 6f oth sides by two
3df0: 20 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73 20 or more spaces
3e00: 6f 72 0a 20 20 40 20 62 79 20 61 20 74 61 62 2e or. @ by a tab.
3e10: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 69 73 20 The number is
3e20: 73 69 67 6e 69 66 69 63 61 6e 74 20 61 6e 64 20 significant and
3e30: 62 65 63 6f 6d 65 73 20 74 68 65 20 6e 75 6d 62 becomes the numb
3e40: 65 72 20 73 68 6f 77 6e 0a 20 20 40 20 69 6e 20 er shown. @ in
3e50: 74 68 65 20 72 65 6e 64 65 72 65 64 20 65 6e 75 the rendered enu
3e60: 6d 65 72 61 74 69 6f 6e 20 69 74 65 6d 2e 20 20 meration item.
3e70: 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6c 65 Only a single le
3e80: 76 65 6c 20 6f 66 20 65 6e 75 6d 65 72 61 74 69 vel of enumerati
3e90: 6f 6e 0a 20 20 40 20 6c 69 73 74 20 69 73 20 73 on. @ list is s
3ea0: 75 70 70 6f 72 74 65 64 20 62 79 20 77 69 6b 69 upported by wiki
3eb0: 2e 20 20 46 6f 72 20 6e 65 73 74 65 64 20 65 6e . For nested en
3ec0: 75 6d 65 72 61 74 69 6f 6e 73 20 6f 72 20 66 6f umerations or fo
3ed0: 72 0a 20 20 40 20 65 6e 75 6d 65 72 61 74 69 6f r. @ enumeratio
3ee0: 6e 73 20 74 68 61 74 20 63 6f 75 6e 74 20 75 73 ns that count us
3ef0: 69 6e 67 20 6c 65 74 74 65 72 73 20 6f 72 20 72 ing letters or r
3f00: 6f 6d 61 6e 20 6e 75 6d 65 72 69 61 6c 73 2c 20 oman numerials,
3f10: 75 73 65 20 48 54 4d 4c 2e 3c 2f 70 3e 0a 20 20 use HTML.</p>.
3f20: 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 49 6e 64 @ <li> <p><b>Ind
3f30: 65 6e 74 65 64 20 50 61 72 61 67 72 61 70 68 73 ented Paragraphs
3f40: 3c 2f 62 3e 2e 0a 20 20 40 20 41 6e 79 20 70 61 </b>.. @ Any pa
3f50: 72 61 67 72 61 70 68 20 74 68 61 74 20 62 65 67 ragraph that beg
3f60: 69 6e 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 ins with two or
3f70: 6d 6f 72 65 20 73 70 61 63 65 73 20 6f 72 20 61 more spaces or a
3f80: 20 74 61 62 20 61 6e 64 0a 20 20 40 20 77 68 69 tab and. @ whi
3f90: 63 68 20 69 73 20 6e 6f 74 20 61 20 62 75 6c 6c ch is not a bull
3fa0: 65 74 20 6f 72 20 65 6e 75 6d 65 72 61 74 69 6f et or enumeratio
3fb0: 6e 20 6c 69 73 74 20 69 74 65 6d 20 69 73 20 72 n list item is r
3fc0: 65 6e 64 65 72 65 64 20 0a 20 20 40 20 69 6e 64 endered . @ ind
3fd0: 65 6e 74 65 64 2e 20 20 4f 6e 6c 79 20 61 20 73 ented. Only a s
3fe0: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 69 ingle level of i
3ff0: 6e 64 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 75 ndentation is su
4000: 70 70 6f 72 74 65 64 20 62 79 3c 2f 70 3e 0a 20 pported by</p>.
4010: 20 40 20 3c 6c 69 3e 20 3c 70 3e 3c 62 3e 48 79 @ <li> <p><b>Hy
4020: 70 65 72 6c 69 6e 6b 73 3c 2f 62 3e 2e 0a 20 20 perlinks</b>..
4030: 40 20 54 65 78 74 20 77 69 74 68 69 6e 20 73 71 @ Text within sq
4040: 75 61 72 65 20 62 72 61 63 6b 65 74 73 20 28 22 uare brackets ("
4050: 5b 2e 2e 2e 5d 22 29 20 62 65 63 6f 6d 65 73 20 [...]") becomes
4060: 61 20 68 79 70 65 72 6c 69 6e 6b 2e 20 20 54 68 a hyperlink. Th
4070: 65 0a 20 20 40 20 74 61 72 67 65 74 20 63 61 6e e. @ target can
4080: 20 62 65 20 61 20 77 69 6b 69 20 70 61 67 65 20 be a wiki page
4090: 6e 61 6d 65 2c 20 74 68 65 20 55 55 49 44 20 6f name, the UUID o
40a0: 66 20 61 20 63 68 65 63 6b 2d 69 6e 20 6f 72 20 f a check-in or
40b0: 74 69 63 6b 65 74 2c 0a 20 20 40 20 74 68 65 20 ticket,. @ the
40c0: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6d 61 67 65 name of an image
40d0: 2c 20 6f 72 20 61 20 55 52 4c 2e 20 20 42 79 20 , or a URL. By
40e0: 64 65 66 61 75 6c 74 2c 20 74 68 65 20 74 61 72 default, the tar
40f0: 67 65 74 20 69 73 20 64 69 73 70 6c 61 79 65 64 get is displayed
4100: 0a 20 20 40 20 61 73 20 74 68 65 20 74 65 78 74 . @ as the text
4110: 20 6f 66 20 74 68 65 20 68 79 70 65 72 6c 69 6e of the hyperlin
4120: 6b 2e 20 20 42 75 74 20 79 6f 75 20 63 61 6e 20 k. But you can
4130: 73 70 65 63 69 66 79 20 61 6c 74 65 72 6e 61 74 specify alternat
4140: 69 76 65 20 74 65 78 74 0a 20 20 40 20 61 66 74 ive text. @ aft
4150: 65 72 20 74 68 65 20 74 61 72 67 65 74 20 6e 61 er the target na
4160: 6d 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 me separated by
4170: 61 20 22 7c 22 20 63 68 61 72 61 63 74 65 72 2e a "|" character.
4180: 3c 2f 70 3e 0a 20 20 40 20 3c 6c 69 3e 20 3c 70 </p>. @ <li> <p
4190: 3e 3c 62 3e 48 54 4d 4c 3c 2f 62 3e 2e 0a 20 20 ><b>HTML</b>..
41a0: 40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 @ The following
41b0: 73 74 61 6e 64 61 72 64 20 48 54 4d 4c 20 65 6c standard HTML el
41c0: 65 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 75 73 ements may be us
41d0: 65 64 3a 0a 20 20 40 20 26 6c 74 3b 61 26 67 74 ed:. @ <a>
41e0: 3b 0a 20 20 40 20 26 6c 74 3b 61 64 64 72 65 73 ;. @ <addres
41f0: 73 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 62 26 s>. @ <b&
4200: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 62 69 67 26 gt;. @ <big&
4210: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 62 6c 6f 63 gt;. @ <bloc
4220: 6b 71 75 6f 74 65 26 67 74 3b 0a 20 20 40 20 26 kquote>. @ &
4230: 6c 74 3b 62 72 26 67 74 3b 0a 20 20 40 20 26 6c lt;br>. @ &l
4240: 74 3b 63 65 6e 74 65 72 26 67 74 3b 0a 20 20 40 t;center>. @
4250: 20 26 6c 74 3b 63 69 74 65 26 67 74 3b 0a 20 20 <cite>.
4260: 40 20 26 6c 74 3b 63 6f 64 65 26 67 74 3b 0a 20 @ <code>.
4270: 20 40 20 26 6c 74 3b 64 64 26 67 74 3b 0a 20 20 @ <dd>.
4280: 40 20 26 6c 74 3b 64 66 6e 26 67 74 3b 0a 20 20 @ <dfn>.
4290: 40 20 26 6c 74 3b 64 6c 26 67 74 3b 0a 20 20 40 @ <dl>. @
42a0: 20 26 6c 74 3b 64 74 26 67 74 3b 0a 20 20 40 20 <dt>. @
42b0: 26 6c 74 3b 65 6d 26 67 74 3b 0a 20 20 40 20 26 <em>. @ &
42c0: 6c 74 3b 66 6f 6e 74 26 67 74 3b 0a 20 20 40 20 lt;font>. @
42d0: 26 6c 74 3b 68 31 26 67 74 3b 0a 20 20 40 20 26 <h1>. @ &
42e0: 6c 74 3b 68 32 26 67 74 3b 0a 20 20 40 20 26 6c lt;h2>. @ &l
42f0: 74 3b 68 33 26 67 74 3b 0a 20 20 40 20 26 6c 74 t;h3>. @ <
4300: 3b 68 34 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b ;h4>. @ <
4310: 68 35 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 68 h5>. @ <h
4320: 36 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 68 72 6>. @ <hr
4330: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 69 6d 67 >. @ <img
4340: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 69 26 67 >. @ <i&g
4350: 74 3b 0a 20 20 40 20 26 6c 74 3b 6b 62 64 26 67 t;. @ <kbd&g
4360: 74 3b 0a 20 20 40 20 26 6c 74 3b 6c 69 26 67 74 t;. @ <li>
4370: 3b 0a 20 20 40 20 26 6c 74 3b 6e 6f 62 72 26 67 ;. @ <nobr&g
4380: 74 3b 0a 20 20 40 20 26 6c 74 3b 6f 6c 26 67 74 t;. @ <ol>
4390: 3b 0a 20 20 40 20 26 6c 74 3b 70 26 67 74 3b 0a ;. @ <p>.
43a0: 20 20 40 20 26 6c 74 3b 70 72 65 26 67 74 3b 0a @ <pre>.
43b0: 20 20 40 20 26 6c 74 3b 73 26 67 74 3b 0a 20 20 @ <s>.
43c0: 40 20 26 6c 74 3b 73 61 6d 70 26 67 74 3b 0a 20 @ <samp>.
43d0: 20 40 20 26 6c 74 3b 73 6d 61 6c 6c 26 67 74 3b @ <small>
43e0: 0a 20 20 40 20 26 6c 74 3b 73 74 72 69 6b 65 26 . @ <strike&
43f0: 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73 74 72 6f gt;. @ <stro
4400: 6e 67 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73 ng>. @ <s
4410: 75 62 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 73 ub>. @ <s
4420: 75 70 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 74 up>. @ <t
4430: 61 62 6c 65 26 67 74 3b 0a 20 20 40 20 26 6c 74 able>. @ <
4440: 3b 74 64 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b ;td>. @ <
4450: 74 68 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 74 th>. @ <t
4460: 72 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 74 74 r>. @ <tt
4470: 26 67 74 3b 0a 20 20 40 20 26 6c 74 3b 75 26 67 >. @ <u&g
4480: 74 3b 0a 20 20 40 20 26 6c 74 3b 75 6c 26 67 74 t;. @ <ul>
4490: 3b 0a 20 20 40 20 26 6c 74 3b 76 61 72 26 67 74 ;. @ <var>
44a0: 3b 2e 0a 20 20 40 20 49 6e 20 61 64 64 69 74 69 ;.. @ In additi
44b0: 6f 6e 2c 20 74 68 65 72 65 20 61 72 65 20 74 77 on, there are tw
44c0: 6f 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 65 o non-standard e
44d0: 6c 65 6d 65 6e 74 73 20 61 76 61 69 6c 61 62 6c lements availabl
44e0: 65 3a 0a 20 20 40 20 26 6c 74 3b 76 65 72 62 61 e:. @ <verba
44f0: 74 69 6d 26 67 74 3b 20 61 6e 64 20 26 6c 74 3b tim> and <
4500: 6e 6f 77 69 6b 69 26 67 74 3b 2e 0a 20 20 40 20 nowiki>.. @
4510: 4e 6f 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 No other element
4520: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 20 20 s are allowed.
4530: 41 6c 6c 20 61 74 74 72 69 62 75 74 65 73 20 61 All attributes a
4540: 72 65 20 63 68 65 63 6b 65 64 20 61 6e 64 0a 20 re checked and.
4550: 20 40 20 6f 6e 6c 79 20 61 20 66 65 77 20 62 65 @ only a few be
4560: 6e 69 67 6e 20 61 74 74 72 69 62 75 74 65 73 20 nign attributes
4570: 61 72 65 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 65 are allowed on e
4580: 61 63 68 20 65 6c 65 6d 65 6e 74 2e 0a 20 20 40 ach element.. @
4590: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 In particular,
45a0: 61 6e 79 20 61 74 74 72 69 62 75 74 65 73 20 74 any attributes t
45b0: 68 61 74 20 73 70 65 63 69 66 79 20 6a 61 76 61 hat specify java
45c0: 73 63 72 69 70 74 20 6f 72 20 43 53 53 0a 20 20 script or CSS.
45d0: 40 20 61 72 65 20 65 6c 69 64 65 64 2e 3c 2f 70 @ are elided.</p
45e0: 3e 0a 20 20 40 20 3c 70 3e 54 68 65 20 26 6c 74 >. @ <p>The <
45f0: 3b 76 65 72 62 61 74 69 6d 26 67 74 3b 20 74 61 ;verbatim> ta
4600: 67 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 77 g disables all w
4610: 69 6b 69 20 61 6e 64 20 48 54 4d 4c 20 6d 61 72 iki and HTML mar
4620: 6b 75 70 0a 20 20 40 20 75 70 20 74 68 72 6f 75 kup. @ up throu
4630: 67 68 20 74 68 65 20 6e 65 78 74 20 26 6c 74 3b gh the next <
4640: 2f 76 65 72 62 61 74 69 6d 26 67 74 3b 2e 20 20 /verbatim>.
4650: 54 68 65 20 26 6c 74 3b 6e 6f 77 69 6b 69 26 67 The <nowiki&g
4660: 74 3b 20 74 61 67 0a 20 20 40 20 64 69 73 61 62 t; tag. @ disab
4670: 6c 65 73 20 61 6c 6c 20 77 69 6b 69 20 66 6f 72 les all wiki for
4680: 6d 61 74 74 69 6e 67 20 72 75 6c 65 73 20 74 68 matting rules th
4690: 72 6f 75 67 68 20 74 68 65 20 6d 61 74 63 68 69 rough the matchi
46a0: 6e 67 0a 20 20 40 20 26 6c 74 3b 2f 6e 6f 77 69 ng. @ </nowi
46b0: 6b 69 26 67 74 3b 20 65 6c 65 6d 65 6e 74 2e 0a ki> element..
46c0: 20 20 40 20 3c 2f 6f 6c 3e 0a 20 20 73 74 79 6c @ </ol>. styl
46d0: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f e_footer();.}../
46e0: 2a 0a 2a 2a 20 77 69 6b 69 5f 63 6d 64 5f 63 6f *.** wiki_cmd_co
46f0: 6d 6d 69 74 28 29 20 69 73 20 74 68 65 20 69 6d mmit() is the im
4700: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 plementation of
4710: 22 77 69 6b 69 20 63 6f 6d 6d 69 74 20 2e 2e 2e "wiki commit ...
4720: 22 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 61 72 67 75 "..**.** As argu
4730: 6d 65 6e 74 73 20 69 74 20 65 78 70 65 63 74 73 ments it expects
4740: 3a 0a 2a 2a 0a 2a 2a 20 7a 50 61 67 65 4e 61 6d :.**.** zPageNam
4750: 65 20 3d 20 74 68 65 20 77 69 6b 69 20 65 6e 74 e = the wiki ent
4760: 72 79 27 73 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a ry's name..**.**
4770: 20 69 6e 20 3d 20 69 6e 70 75 74 20 66 69 6c 65 in = input file
4780: 2e 20 54 68 65 20 66 69 6c 65 20 69 73 20 72 65 . The file is re
4790: 61 64 20 75 6e 74 69 6c 20 45 4f 46 20 62 75 74 ad until EOF but
47a0: 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 0a 2a is not closed.*
47b0: 2a 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 * by this functi
47c0: 6f 6e 20 28 69 74 20 6d 69 67 68 74 20 62 65 20 on (it might be
47d0: 73 74 64 69 6e 21 29 2e 0a 2a 2a 0a 2a 2a 20 52 stdin!)..**.** R
47e0: 65 74 75 72 6e 73 20 30 20 6f 6e 20 65 72 72 6f eturns 0 on erro
47f0: 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 r, non-zero on s
4800: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 4f uccess..**.** TO
4810: 44 4f 73 3a 0a 2a 2a 20 2d 20 74 61 6b 65 20 45 DOs:.** - take E
4820: 49 54 48 45 52 20 7a 50 61 67 65 4e 61 6d 65 20 ITHER zPageName
4830: 4f 52 20 72 69 64 2e 20 57 65 20 64 6f 6e 27 74 OR rid. We don't
4840: 20 6e 65 65 64 20 62 6f 74 68 2e 0a 2a 2a 20 2d need both..** -
4850: 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 make use of the
4860: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 return value. A
4870: 64 64 20 6d 6f 72 65 20 65 72 72 6f 72 20 63 68 dd more error ch
4880: 65 63 6b 69 6e 67 2e 0a 2a 2a 20 2d 20 67 69 76 ecking..** - giv
4890: 65 20 74 68 65 20 75 75 69 64 20 62 61 63 6b 20 e the uuid back
48a0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 73 6f to the caller so
48b0: 20 69 74 20 63 61 6e 20 62 65 20 73 68 6f 77 6e it can be shown
48c0: 0a 2a 2a 20 20 20 69 6e 20 74 68 65 20 73 74 61 .** in the sta
48d0: 74 75 73 20 6f 75 74 70 75 74 2e 20 28 22 63 6f tus output. ("co
48e0: 6d 6d 69 74 74 65 64 20 76 65 72 73 69 6f 6e 20 mmitted version
48f0: 58 58 58 58 58 20 6f 66 20 70 61 67 65 20 2e 2e XXXXX of page ..
4900: 2e 22 29 0a 2a 2a 20 2d 20 72 65 74 75 72 6e 20 .").** - return
4910: 73 6f 6d 65 20 73 74 61 74 75 73 20 74 65 6c 6c some status tell
4920: 69 6e 67 20 74 68 65 20 75 73 65 72 20 69 66 20 ing the user if
4930: 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 64 69 there were no di
4940: 66 66 73 0a 2a 2a 20 28 69 2e 65 2e 20 6e 6f 20 ffs.** (i.e. no
4950: 63 6f 6d 6d 69 74 29 2e 20 48 6f 77 20 63 61 6e commit). How can
4960: 20 77 65 20 66 69 6e 64 20 74 68 69 73 20 6f 75 we find this ou
4970: 74 3f 0a 2a 2f 0a 69 6e 74 20 77 69 6b 69 5f 63 t?.*/.int wiki_c
4980: 6d 64 5f 63 6f 6d 6d 69 74 28 20 63 68 61 72 20 md_commit( char
4990: 63 6f 6e 73 74 20 2a 20 7a 50 61 67 65 4e 61 6d const * zPageNam
49a0: 65 2c 20 46 49 4c 45 20 2a 20 69 6e 20 29 0a 7b e, FILE * in ).{
49b0: 0a 20 20 42 6c 6f 62 20 77 69 6b 69 3b 20 20 20 . Blob wiki;
49c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 /* Wi
49d0: 6b 69 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 ki page content
49e0: 2a 2f 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e */. Blob conten
49f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 t; /*
4a00: 72 65 61 64 2d 69 6e 20 63 6f 6e 74 65 6e 74 20 read-in content
4a10: 2a 2f 0a 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b */. Blob cksum;
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
4a30: 77 69 6b 69 20 63 68 65 63 6b 73 75 6d 20 2a 2f wiki checksum */
4a40: 0a 20 20 69 6e 74 20 72 69 64 3b 20 20 20 20 20 . int rid;
4a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 /* ri
4a60: 64 20 6f 66 20 65 78 69 73 74 69 6e 67 20 65 6e d of existing en
4a70: 74 72 79 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 try. */. int nr
4a80: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 id;
4a90: 20 20 2f 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 /* not really
4aa0: 73 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a sure */. char *
4ab0: 20 7a 44 61 74 65 3b 20 20 20 20 20 20 20 20 20 zDate;
4ac0: 20 20 2f 2a 20 74 69 6d 65 73 74 61 6d 70 20 2a /* timestamp *
4ad0: 2f 0a 20 20 63 68 61 72 20 2a 20 7a 55 75 69 64 /. char * zUuid
4ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 ; /* u
4af0: 75 69 64 20 66 6f 72 20 72 69 64 20 2a 2f 0a 0a uid for rid */..
4b00: 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 rid = db_int(0
4b10: 2c 20 22 53 45 4c 45 43 54 20 78 2e 72 69 64 20 , "SELECT x.rid
4b20: 46 52 4f 4d 20 74 61 67 20 74 2c 20 74 61 67 78 FROM tag t, tagx
4b30: 72 65 66 20 78 22 0a 20 20 20 20 20 20 20 20 20 ref x".
4b40: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 78 2e " WHERE x.
4b50: 74 61 67 69 64 3d 74 2e 74 61 67 69 64 20 41 4e tagid=t.tagid AN
4b60: 44 20 74 2e 74 61 67 6e 61 6d 65 3d 27 77 69 6b D t.tagname='wik
4b70: 69 2d 25 71 27 22 0a 09 20 20 20 20 20 20 20 22 i-%q'".. "
4b80: 20 4f 52 44 45 52 20 42 59 20 78 2e 6d 74 69 6d ORDER BY x.mtim
4b90: 65 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c e DESC LIMIT 1",
4ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4bb0: 7a 50 61 67 65 4e 61 6d 65 0a 20 20 20 20 20 20 zPageName.
4bc0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 69 66 );. if
4bd0: 28 20 21 20 72 69 64 20 29 7b 0a 20 20 20 20 66 ( ! rid ){. f
4be0: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 77 69 6b ossil_fatal("wik
4bf0: 69 20 63 6f 6d 6d 69 74 20 4e 65 77 45 6e 74 72 i commit NewEntr
4c00: 79 20 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d y not yet implem
4c10: 65 6e 74 65 64 2e 22 29 3b 0a 20 20 7d 0a 0a 0a ented.");. }...
4c20: 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d blob_read_from
4c30: 5f 63 68 61 6e 6e 65 6c 28 20 26 63 6f 6e 74 65 _channel( &conte
4c40: 6e 74 2c 20 69 6e 2c 20 2d 31 20 29 3b 0a 20 20 nt, in, -1 );.
4c50: 2f 2f 20 5e 5e 5e 20 52 65 6d 69 6e 64 65 72 3a // ^^^ Reminder:
4c60: 20 77 65 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 we should allow
4c70: 20 65 6d 70 74 79 20 28 7a 65 72 6f 2d 62 79 74 empty (zero-byt
4c80: 65 29 20 65 6e 74 72 69 65 73 2c 20 73 6f 20 64 e) entries, so d
4c90: 6f 6e 27 74 20 65 78 69 74 0a 20 20 2f 2f 20 69 on't exit. // i
4ca0: 66 20 72 65 61 64 20 72 65 74 75 72 6e 73 20 30 f read returns 0
4cb0: 2e 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 .. blob_zero(&w
4cc0: 69 6b 69 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20 iki);. zDate =
4cd0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 db_text(0, "SELE
4ce0: 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 CT datetime('now
4cf0: 27 29 22 29 3b 0a 20 20 7a 44 61 74 65 5b 31 30 ')");. zDate[10
4d00: 5d 20 3d 20 27 54 27 3b 0a 20 20 62 6c 6f 62 5f ] = 'T';. blob_
4d10: 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 appendf(&wiki, "
4d20: 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b D %s\n", zDate);
4d30: 0a 20 20 66 72 65 65 28 7a 44 61 74 65 29 3b 0a . free(zDate);.
4d40: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(&
4d50: 77 69 6b 69 2c 20 22 4c 20 25 46 5c 6e 22 2c 20 wiki, "L %F\n",
4d60: 7a 50 61 67 65 4e 61 6d 65 20 29 3b 0a 20 20 7a zPageName );. z
4d70: 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 Uuid = db_text(0
4d80: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 , "SELECT uuid F
4d90: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 ROM blob WHERE r
4da0: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 id=%d", rid);.
4db0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 blob_appendf(&wi
4dc0: 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a 55 ki, "P %s\n", zU
4dd0: 75 69 64 29 3b 0a 20 20 66 72 65 65 28 7a 55 75 uid);. free(zUu
4de0: 69 64 29 3b 0a 20 20 75 73 65 72 5f 73 65 6c 65 id);. user_sele
4df0: 63 74 28 29 3b 0a 20 20 69 66 28 20 67 2e 7a 4c ct();. if( g.zL
4e00: 6f 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 6c ogin ){. bl
4e10: 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 ob_appendf(&wiki
4e20: 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c , "U %F\n", g.zL
4e30: 6f 67 69 6e 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f ogin);. }. blo
4e40: 62 5f 61 70 70 65 6e 64 66 28 20 26 77 69 6b 69 b_appendf( &wiki
4e50: 2c 20 22 57 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 , "W %d\n%s\n",
4e60: 62 6c 6f 62 5f 73 69 7a 65 28 26 63 6f 6e 74 65 blob_size(&conte
4e70: 6e 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 nt),.
4e80: 20 20 20 20 20 62 6c 6f 62 5f 62 75 66 66 65 72 blob_buffer
4e90: 28 26 63 6f 6e 74 65 6e 74 29 20 29 3b 0a 20 20 (&content) );.
4ea0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e 74 blob_reset(&cont
4eb0: 65 6e 74 29 3b 0a 20 20 6d 64 35 73 75 6d 5f 62 ent);. md5sum_b
4ec0: 6c 6f 62 28 26 77 69 6b 69 2c 20 26 63 6b 73 75 lob(&wiki, &cksu
4ed0: 6d 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e m);. blob_appen
4ee0: 64 66 28 26 77 69 6b 69 2c 20 22 5a 20 25 62 5c df(&wiki, "Z %b\
4ef0: 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 62 n", &cksum);. b
4f00: 6c 6f 62 5f 72 65 73 65 74 28 26 63 6b 73 75 6d lob_reset(&cksum
4f10: 29 3b 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 );. db_begin_tr
4f20: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 6e ansaction();. n
4f30: 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 rid = content_pu
4f40: 74 28 20 26 77 69 6b 69 2c 20 30 2c 20 30 20 29 t( &wiki, 0, 0 )
4f50: 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 ;. db_multi_exe
4f60: 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e c("INSERT OR IGN
4f70: 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e 74 20 ORE INTO unsent
4f80: 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e 72 69 VALUES(%d)", nri
4f90: 64 29 3b 0a 20 20 6d 61 6e 69 66 65 73 74 5f 63 d);. manifest_c
4fa0: 72 6f 73 73 6c 69 6e 6b 28 6e 72 69 64 2c 26 77 rosslink(nrid,&w
4fb0: 69 6b 69 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 iki);. blob_res
4fc0: 65 74 28 26 77 69 6b 69 29 3b 0a 20 20 63 6f 6e et(&wiki);. con
4fd0: 74 65 6e 74 5f 64 65 6c 74 69 66 79 28 72 69 64 tent_deltify(rid
4fe0: 2c 6e 72 69 64 2c 30 29 3b 0a 20 20 64 62 5f 65 ,nrid,0);. db_e
4ff0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 nd_transaction(0
5000: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d );. return 1;.}
5010: 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a ../*.** COMMAND:
5020: 20 77 69 6b 69 0a 2a 2a 0a 2a 2a 20 55 73 61 67 wiki.**.** Usag
5030: 65 3a 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 e: %fossil wiki
5040: 28 65 78 70 6f 72 74 7c 63 6f 6d 6d 69 74 7c 6c (export|commit|l
5050: 69 73 74 29 20 57 69 6b 69 4e 61 6d 65 0a 2a 2a ist) WikiName.**
5060: 0a 2a 2a 20 52 75 6e 20 76 61 72 69 6f 75 73 20 .** Run various
5070: 73 75 62 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 66 subcommands to f
5080: 65 74 63 68 20 77 69 6b 69 20 65 6e 74 72 69 65 etch wiki entrie
5090: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f s..**.** %fo
50a0: 73 73 69 6c 20 77 69 6b 69 20 65 78 70 6f 72 74 ssil wiki export
50b0: 20 57 69 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 WikiName.**.**
50c0: 20 20 20 20 20 20 20 53 65 6e 64 73 20 74 68 65 Sends the
50d0: 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 latest version
50e0: 6f 66 20 74 68 65 20 57 69 6b 69 4e 61 6d 65 20 of the WikiName
50f0: 77 69 6b 69 0a 2a 2a 20 20 20 20 20 20 20 20 65 wiki.** e
5100: 6e 74 72 79 20 74 6f 20 73 74 64 6f 75 74 2e 0a ntry to stdout..
5110: 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73 69 **.** %fossi
5120: 6c 20 77 69 6b 69 20 63 6f 6d 6d 69 74 20 57 69 l wiki commit Wi
5130: 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 20 kiName.**.**
5140: 20 20 20 20 43 6f 6d 6d 69 74 20 63 68 61 6e 67 Commit chang
5150: 65 73 20 74 6f 20 61 20 77 69 6b 69 20 70 61 67 es to a wiki pag
5160: 65 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 e from standard
5170: 69 6e 70 75 74 2e 0a 2a 2a 20 20 20 20 20 20 20 input..**
5180: 20 49 74 20 63 61 6e 6e 6f 74 20 63 75 72 72 65 It cannot curre
5190: 6e 74 6c 79 20 63 72 65 61 74 65 20 61 20 6e 65 ntly create a ne
51a0: 77 20 65 6e 74 72 79 20 28 74 68 69 73 20 69 73 w entry (this is
51b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 on the.**
51c0: 20 20 74 6f 2d 66 69 78 20 6c 69 73 74 29 2e 0a to-fix list)..
51d0: 2a 2a 0a 2a 2a 20 20 20 20 20 25 66 6f 73 73 69 **.** %fossi
51e0: 6c 20 77 69 6b 69 20 6c 69 73 74 0a 2a 2a 0a 2a l wiki list.**.*
51f0: 2a 20 20 20 20 20 20 20 20 4c 69 73 74 73 20 61 * Lists a
5200: 6c 6c 20 77 69 6b 69 20 65 6e 74 72 69 65 73 2c ll wiki entries,
5210: 20 6f 6e 65 20 70 65 72 20 6c 69 6e 65 2c 20 6f one per line, o
5220: 72 64 65 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 rdered.**
5230: 20 63 61 73 65 2d 69 6e 73 65 6e 74 69 76 65 6c case-insentivel
5240: 79 20 62 79 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a y by name..**.**
5250: 20 54 4f 44 4f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 TODOs:.**.**
5260: 20 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 65 %fossil wiki e
5270: 78 70 6f 72 74 20 3f 55 55 49 44 3f 20 3f 2d 66 xport ?UUID? ?-f
5280: 20 6f 75 74 66 69 6c 65 5b 3d 73 74 64 6f 75 74 outfile[=stdout
5290: 5d 3f 20 57 69 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a ]? WikiName.**.*
52a0: 2a 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 73 * Outputs
52b0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 76 65 the selected ve
52c0: 72 73 69 6f 6e 20 6f 66 20 57 69 6b 69 4e 61 6d rsion of WikiNam
52d0: 65 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 e to the selecte
52e0: 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 d file..**.**
52f0: 20 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 64 %fossil wiki d
5300: 65 6c 65 74 65 20 3f 2d 6d 20 4d 45 53 53 41 47 elete ?-m MESSAG
5310: 45 3f 20 57 69 6b 69 4e 61 6d 65 0a 2a 2a 0a 2a E? WikiName.**.*
5320: 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 61 6d * The sam
5330: 65 20 61 73 20 64 65 6c 65 74 69 6e 67 20 61 20 e as deleting a
5340: 66 69 6c 65 20 65 6e 74 72 79 2c 20 62 75 74 20 file entry, but
5350: 69 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 69 66 20 i don't know if
5360: 66 6f 73 73 69 6c 0a 2a 2a 20 20 20 20 20 20 20 fossil.**
5370: 20 73 75 70 70 6f 72 74 73 20 61 20 63 6f 6d 6d supports a comm
5380: 69 74 20 6d 65 73 73 61 67 65 20 66 6f 72 20 57 it message for W
5390: 69 6b 69 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 0a iki entries..**.
53a0: 2a 2a 20 20 20 20 20 25 66 6f 73 73 69 6c 20 77 ** %fossil w
53b0: 69 6b 69 20 3f 2d 75 3f 20 3f 2d 64 3f 20 3f 2d iki ?-u? ?-d? ?-
53c0: 73 3d 5b 7c 5d 3f 20 6c 69 73 74 0a 2a 2a 0a 2a s=[|]? list.**.*
53d0: 2a 20 20 20 20 20 20 20 20 4c 69 73 74 73 20 74 * Lists t
53e0: 68 65 20 55 55 49 44 20 61 6e 64 2f 6f 72 20 44 he UUID and/or D
53f0: 61 74 65 20 6f 66 20 6c 61 73 74 20 63 68 61 6e ate of last chan
5400: 67 65 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 ge for each entr
5410: 79 2c 20 64 65 6c 69 6d 69 74 65 64 0a 2a 2a 20 y, delimited.**
5420: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 2d 73 by the -s
5430: 20 63 68 61 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 char..**.**
5440: 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20 63 6f %fossil wiki co
5450: 6d 6d 69 74 20 3f 2d 66 20 69 6e 66 69 6c 65 5b mmit ?-f infile[
5460: 3d 73 74 64 69 6e 5d 3f 20 57 69 6b 69 4e 61 6d =stdin]? WikiNam
5470: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 43 e.**.** C
5480: 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 74 6f ommit changes to
5490: 20 61 20 77 69 6b 69 20 70 61 67 65 20 66 72 6f a wiki page fro
54a0: 6d 20 61 20 66 69 6c 65 20 6f 72 20 73 74 61 6e m a file or stan
54b0: 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2a 20 20 dard input..**
54c0: 20 20 20 20 20 20 49 74 20 63 72 65 61 74 73 20 It creats
54d0: 61 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20 6e a new entry if n
54e0: 65 65 64 65 64 20 28 6f 72 20 69 73 20 74 68 61 eeded (or is tha
54f0: 74 20 70 68 69 6c 6f 73 6f 70 68 69 63 61 6c 6c t philosophicall
5500: 79 0a 2a 2a 20 20 20 20 20 20 20 20 77 72 6f 6e y.** wron
5510: 67 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 25 g?)..**.** %
5520: 66 6f 73 73 69 6c 20 77 69 6b 69 20 64 69 66 66 fossil wiki diff
5530: 20 3f 55 55 49 44 3f 20 3f 2d 66 20 69 6e 66 69 ?UUID? ?-f infi
5540: 6c 65 5b 3d 73 74 64 69 6e 5d 3f 20 45 6e 74 72 le[=stdin]? Entr
5550: 79 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 yName.**.**
5560: 20 20 20 44 69 66 66 73 20 74 68 65 20 6c 6f 63 Diffs the loc
5570: 61 6c 20 63 6f 70 79 20 6f 66 20 61 20 70 61 67 al copy of a pag
5580: 65 20 77 69 74 68 20 61 20 67 69 76 65 6e 20 76 e with a given v
5590: 65 72 73 69 6f 6e 20 28 64 65 66 61 75 6c 74 69 ersion (defaulti
55a0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 74 6f 20 ng.** to
55b0: 74 68 65 20 68 65 61 64 20 76 65 72 73 69 6f 6e the head version
55c0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f )..*/.void wiki_
55d0: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 cmd(void){. int
55e0: 20 6e 3b 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e n;. db_find_an
55f0: 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 d_open_repositor
5600: 79 28 31 29 3b 0a 20 20 69 66 28 20 67 2e 61 72 y(1);. if( g.ar
5610: 67 63 3c 33 20 29 7b 0a 20 20 20 20 67 6f 74 6f gc<3 ){. goto
5620: 20 77 69 6b 69 5f 63 6d 64 5f 75 73 61 67 65 3b wiki_cmd_usage;
5630: 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 74 72 6c 65 . }. n = strle
5640: 6e 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 n(g.argv[2]);.
5650: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 if( n==0 ){.
5660: 67 6f 74 6f 20 77 69 6b 69 5f 63 6d 64 5f 75 73 goto wiki_cmd_us
5670: 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 age;. }.. if(
5680: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 strncmp(g.argv[2
5690: 5d 2c 22 65 78 70 6f 72 74 22 2c 6e 29 3d 3d 30 ],"export",n)==0
56a0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e ){. char con
56b0: 73 74 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 20 20 st *zPageName;
56c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
56d0: 65 20 6f 66 20 74 68 65 20 77 69 6b 69 20 70 61 e of the wiki pa
56e0: 67 65 20 74 6f 20 65 78 70 6f 72 74 20 2a 2f 0a ge to export */.
56f0: 20 20 20 20 69 6e 74 20 72 69 64 3b 20 20 20 20 int rid;
5700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
5710: 72 74 69 66 61 63 74 20 49 44 20 6f 66 20 74 68 rtifact ID of th
5720: 65 20 77 69 6b 69 20 70 61 67 65 20 2a 2f 0a 20 e wiki page */.
5730: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 int i;
5740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f /* Lo
5750: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 op counter */.
5760: 20 20 63 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20 char *zBody =
5770: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6b 0; /* Wik
5780: 69 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a i page content *
5790: 2f 0a 20 20 20 20 4d 61 6e 69 66 65 73 74 20 6d /. Manifest m
57a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
57b0: 20 50 61 72 73 65 64 20 77 69 6b 69 20 70 61 67 Parsed wiki pag
57c0: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 e content */.
57d0: 20 69 66 28 20 67 2e 61 72 67 63 21 3d 34 20 29 if( g.argc!=4 )
57e0: 7b 0a 20 20 20 20 20 20 75 73 61 67 65 28 22 65 {. usage("e
57f0: 78 70 6f 72 74 20 50 41 47 45 4e 41 4d 45 22 29 xport PAGENAME")
5800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 67 ;. }. zPag
5810: 65 4e 61 6d 65 20 3d 20 67 2e 61 72 67 76 5b 33 eName = g.argv[3
5820: 5d 3b 0a 20 20 20 20 72 69 64 20 3d 20 64 62 5f ];. rid = db_
5830: 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 78 int(0, "SELECT x
5840: 2e 72 69 64 20 46 52 4f 4d 20 74 61 67 20 74 2c .rid FROM tag t,
5850: 20 74 61 67 78 72 65 66 20 78 22 0a 20 20 20 20 tagxref x".
5860: 20 20 22 20 57 48 45 52 45 20 78 2e 74 61 67 69 " WHERE x.tagi
5870: 64 3d 74 2e 74 61 67 69 64 20 41 4e 44 20 74 2e d=t.tagid AND t.
5880: 74 61 67 6e 61 6d 65 3d 27 77 69 6b 69 2d 25 71 tagname='wiki-%q
5890: 27 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 '". " ORDER
58a0: 20 42 59 20 78 2e 6d 74 69 6d 65 20 44 45 53 43 BY x.mtime DESC
58b0: 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 LIMIT 1",.
58c0: 20 7a 50 61 67 65 4e 61 6d 65 20 0a 20 20 20 20 zPageName .
58d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 69 64 20 29 );. if( rid )
58e0: 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 63 6f 6e {. Blob con
58f0: 74 65 6e 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 tent;. cont
5900: 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f ent_get(rid, &co
5910: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 61 ntent);. ma
5920: 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d 2c nifest_parse(&m,
5930: 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 &content);.
5940: 20 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 if( m.type==CF
5950: 54 59 50 45 5f 57 49 4b 49 20 29 7b 0a 20 20 20 TYPE_WIKI ){.
5960: 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d 2e 7a zBody = m.z
5970: 57 69 6b 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Wiki;. }.
5980: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42 6f 64 }. if( zBod
5990: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f y==0 ){. fo
59a0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 77 69 6b 69 ssil_fatal("wiki
59b0: 20 70 61 67 65 20 5b 25 73 5d 20 6e 6f 74 20 66 page [%s] not f
59c0: 6f 75 6e 64 22 2c 7a 50 61 67 65 4e 61 6d 65 29 ound",zPageName)
59d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 ;. }. for(
59e0: 69 3d 73 74 72 6c 65 6e 28 7a 42 6f 64 79 29 3b i=strlen(zBody);
59f0: 20 69 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 i>0 && isspace(
5a00: 7a 42 6f 64 79 5b 69 2d 31 5d 29 3b 20 69 2d 2d zBody[i-1]); i--
5a10: 29 7b 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 ){}. printf("
5a20: 25 2e 2a 73 5c 6e 22 2c 20 69 2c 20 7a 42 6f 64 %.*s\n", i, zBod
5a30: 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a y);. return;.
5a40: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 73 74 }else. if( st
5a50: 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c rncmp(g.argv[2],
5a60: 22 63 6f 6d 6d 69 74 22 2c 6e 29 3d 3d 30 20 29 "commit",n)==0 )
5a70: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 61 67 {. char *zPag
5a80: 65 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 67 eName;. if( g
5a90: 2e 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 .argc!=4 ){.
5aa0: 20 20 75 73 61 67 65 28 22 63 6f 6d 6d 69 74 20 usage("commit
5ab0: 50 41 47 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 PAGENAME");.
5ac0: 7d 0a 20 20 20 20 7a 50 61 67 65 4e 61 6d 65 20 }. zPageName
5ad0: 3d 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 20 20 20 = g.argv[3];.
5ae0: 20 77 69 6b 69 5f 63 6d 64 5f 63 6f 6d 6d 69 74 wiki_cmd_commit
5af0: 28 20 7a 50 61 67 65 4e 61 6d 65 2c 20 73 74 64 ( zPageName, std
5b00: 69 6e 20 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 in );. printf
5b10: 28 22 43 6f 6d 6d 69 74 74 65 64 20 77 69 6b 69 ("Committed wiki
5b20: 20 70 61 67 65 20 25 73 2e 5c 6e 22 2c 20 7a 50 page %s.\n", zP
5b30: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 ageName);. }els
5b40: 65 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 e. if( strncmp(
5b50: 67 2e 61 72 67 76 5b 32 5d 2c 22 64 65 6c 65 74 g.argv[2],"delet
5b60: 65 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 e",n)==0 ){.
5b70: 69 66 28 20 67 2e 61 72 67 63 21 3d 35 20 29 7b if( g.argc!=5 ){
5b80: 0a 20 20 20 20 20 20 75 73 61 67 65 28 22 64 65 . usage("de
5b90: 6c 65 74 65 20 50 41 47 45 4e 41 4d 45 22 29 3b lete PAGENAME");
5ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 73 73 69 . }. fossi
5bb0: 6c 5f 66 61 74 61 6c 28 22 64 65 6c 65 74 65 20 l_fatal("delete
5bc0: 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e not yet implemen
5bd0: 74 65 64 2e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a ted.");. }else.
5be0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e if( strncmp(g.
5bf0: 61 72 67 76 5b 32 5d 2c 22 6c 69 73 74 22 2c 6e argv[2],"list",n
5c00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74 6d 74 )==0 ){. Stmt
5c10: 20 71 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 q;. db_prepa
5c20: 72 65 28 26 71 2c 20 0a 20 20 20 20 20 20 22 53 re(&q, . "S
5c30: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61 67 ELECT substr(tag
5c40: 6e 61 6d 65 2c 20 36 29 20 46 52 4f 4d 20 74 61 name, 6) FROM ta
5c50: 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 g WHERE tagname
5c60: 47 4c 4f 42 20 27 77 69 6b 69 2d 2a 27 22 0a 20 GLOB 'wiki-*'".
5c70: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 " ORDER BY
5c80: 6c 6f 77 65 72 28 74 61 67 6e 61 6d 65 29 22 0a lower(tagname)".
5c90: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 );. while
5ca0: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 ( db_step(&q)==S
5cb0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 QLITE_ROW ){.
5cc0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a const char *z
5cd0: 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e Name = db_column
5ce0: 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 _text(&q, 0);.
5cf0: 20 20 20 20 70 72 69 6e 74 66 28 20 22 25 73 5c printf( "%s\
5d00: 6e 22 2c 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d n",zName);. }
5d10: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 . db_finalize
5d20: 28 26 71 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 (&q);. }else.
5d30: 7b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6b 69 5f {. goto wiki_
5d40: 63 6d 64 5f 75 73 61 67 65 3b 0a 20 20 7d 0a 20 cmd_usage;. }.
5d50: 20 72 65 74 75 72 6e 3b 0a 0a 77 69 6b 69 5f 63 return;..wiki_c
5d60: 6d 64 5f 75 73 61 67 65 3a 0a 20 20 75 73 61 67 md_usage:. usag
5d70: 65 28 22 65 78 70 6f 72 74 7c 63 6f 6d 6d 69 74 e("export|commit
5d80: 7c 6c 69 73 74 20 2e 2e 2e 22 29 3b 0a 7d 0a |list ...");.}.