Hex Artifact Content
Not logged in

Artifact fbea7b5b38993806f2a3ca12afdf7a4cd57456b0:

File src/wiki.c part of check-in [f40230a7e8] - The "wiki" URI without a page name argument now gives you a list of existing wiki pages. This works fine as long as there are a reasonable number (no more than a few hundred) wiki pages. We need to think of something better for large wikis. We also need to think of ways to give users better guidance for creating new wiki pages. by drh on 2007-10-28 21:26:07.

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 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 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: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 64 6f 20 66 6f 72 6d 61 74 74 69 6e 67 20  o do formatting 
0390: 6f 66 20 77 69 6b 69 20 74 65 78 74 2e 0a 2a 2f  of wiki text..*/
03a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
03b0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63  t.h>.#include "c
03c0: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64  onfig.h".#includ
03d0: 65 20 22 77 69 6b 69 2e 68 22 0a 0a 2f 2a 0a 2a  e "wiki.h"../*.*
03e0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
03f0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
0400: 67 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  g is a well-form
0410: 65 64 20 77 69 6b 69 20 70 61 67 65 20 6e 61 6d  ed wiki page nam
0420: 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 6c 6c 2d 66 6f  e..**.** Well-fo
0430: 72 6d 65 64 20 77 69 6b 69 20 70 61 67 65 20 6e  rmed wiki page n
0440: 61 6d 65 73 20 64 6f 20 6e 6f 74 20 62 65 67 69  ames do not begi
0450: 6e 20 6f 72 20 65 6e 64 20 77 69 74 68 20 77 68  n or end with wh
0460: 69 74 65 73 70 61 63 65 2c 0a 2a 2a 20 61 6e 64  itespace,.** and
0470: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
0480: 74 61 62 73 20 6f 72 20 6f 74 68 65 72 20 63 6f  tabs or other co
0490: 6e 74 72 6f 6c 20 63 68 61 72 61 63 74 65 72 73  ntrol characters
04a0: 20 61 6e 64 20 64 6f 20 6e 6f 74 0a 2a 2a 20 63   and do not.** c
04b0: 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68 61 6e  ontain more than
04c0: 20 61 20 73 69 6e 67 6c 65 20 73 70 61 63 65 20   a single space 
04d0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 61 20 72  character in a r
04e0: 6f 77 2e 20 20 57 65 6c 6c 2d 66 6f 72 6d 65 64  ow.  Well-formed
04f0: 0a 2a 2a 20 6e 61 6d 65 73 20 6d 75 73 74 20 62  .** names must b
0500: 65 20 62 65 74 77 65 65 6e 20 33 20 61 6e 64 20  e between 3 and 
0510: 31 30 30 20 63 68 72 61 63 74 65 72 73 20 69 6e  100 chracters in
0520: 20 6c 65 6e 67 74 68 2c 20 69 6e 63 6c 75 73 69   length, inclusi
0530: 76 65 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6b 69 5f  ve..*/.int wiki_
0540: 6e 61 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d  name_is_wellform
0550: 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ed(const char *z
0560: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
0570: 28 20 7a 5b 30 5d 3c 3d 30 78 32 30 20 29 7b 0a  ( z[0]<=0x20 ){.
0580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0590: 7d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 7a 5b 69  }.  for(i=1; z[i
05a0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
05b0: 20 7a 5b 69 5d 3c 30 78 32 30 20 29 20 72 65 74   z[i]<0x20 ) ret
05c0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  urn 0;.    if( z
05d0: 5b 69 5d 3d 3d 30 78 32 30 20 26 26 20 7a 5b 69  [i]==0x20 && z[i
05e0: 2d 31 5d 3d 3d 30 78 32 30 20 29 20 72 65 74 75  -1]==0x20 ) retu
05f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
0600: 7a 5b 69 2d 31 5d 3d 3d 27 20 27 20 29 20 72 65  z[i-1]==' ' ) re
0610: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 3c  turn 0;.  if( i<
0620: 33 20 7c 7c 20 69 3e 31 30 30 20 29 20 72 65 74  3 || i>100 ) ret
0630: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
0640: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  1;.}../*.** Chec
0650: 6b 20 61 20 77 69 6b 69 20 6e 61 6d 65 2e 20 20  k a wiki name.  
0660: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 77 65 6c  If it is not wel
0670: 6c 2d 66 6f 72 6d 65 64 2c 20 74 68 65 6e 20 69  l-formed, then i
0680: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  ssue an error.**
0690: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72 75 65   and return true
06a0: 2e 20 20 49 66 20 69 74 20 69 73 20 77 65 6c 6c  .  If it is well
06b0: 2d 66 6f 72 6d 65 64 2c 20 72 65 74 75 72 6e 20  -formed, return 
06c0: 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
06d0: 20 69 6e 74 20 63 68 65 63 6b 5f 6e 61 6d 65 28   int check_name(
06e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
06f0: 20 20 69 66 28 20 21 77 69 6b 69 5f 6e 61 6d 65    if( !wiki_name
0700: 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d 65 64 28 7a  _is_wellformed(z
0710: 29 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 68  ) ){.    style_h
0720: 65 61 64 65 72 28 22 57 69 6b 69 20 50 61 67 65  eader("Wiki Page
0730: 20 4e 61 6d 65 20 45 72 72 6f 72 22 29 3b 0a 20   Name Error");. 
0740: 20 20 20 40 20 54 68 65 20 77 69 6b 69 20 6e 61     @ The wiki na
0750: 6d 65 20 22 3c 62 3e 25 68 28 7a 29 3c 2f 62 3e  me "<b>%h(z)</b>
0760: 22 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 66 6f  " is not well-fo
0770: 72 6d 65 64 2e 20 20 52 75 6c 65 73 20 66 6f 72  rmed.  Rules for
0780: 0a 20 20 20 20 40 20 77 69 6b 69 20 70 61 67 65  .    @ wiki page
0790: 20 6e 61 6d 65 73 3a 0a 20 20 20 20 40 20 3c 75   names:.    @ <u
07a0: 6c 3e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 4d 75  l>.    @ <li> Mu
07b0: 73 74 20 6e 6f 74 20 62 65 67 69 6e 20 6f 72 20  st not begin or 
07c0: 65 6e 64 20 77 69 74 68 20 61 20 73 70 61 63 65  end with a space
07d0: 2e 0a 20 20 20 20 40 20 3c 6c 69 3e 20 4d 75 73  ..    @ <li> Mus
07e0: 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  t not contain an
07f0: 79 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72 61 63  y control charac
0800: 74 65 72 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ters, including 
0810: 74 61 62 20 6f 72 0a 20 20 20 20 40 20 20 20 20  tab or.    @    
0820: 20 20 6e 65 77 6c 69 6e 65 2e 0a 20 20 20 20 40    newline..    @
0830: 20 3c 6c 69 3e 20 4d 75 73 74 20 6e 6f 74 20 68   <li> Must not h
0840: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
0850: 73 70 61 63 65 73 20 69 6e 20 61 20 72 6f 77 20  spaces in a row 
0860: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20  internally..    
0870: 40 20 3c 6c 69 3e 20 4d 75 73 74 20 62 65 20 62  @ <li> Must be b
0880: 65 74 77 65 65 6e 20 33 20 61 6e 64 20 31 30 30  etween 3 and 100
0890: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6c   characters in l
08a0: 65 6e 67 74 68 2e 0a 20 20 20 20 40 20 3c 2f 75  ength..    @ </u
08b0: 6c 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  l>.    style_foo
08c0: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
08d0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
08e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  n 0;.}../*.** WE
08f0: 42 50 41 47 45 3a 20 68 6f 6d 65 0a 2a 2a 20 57  BPAGE: home.** W
0900: 45 42 50 41 47 45 3a 20 69 6e 64 65 78 0a 2a 2a  EBPAGE: index.**
0910: 20 57 45 42 50 41 47 45 3a 20 6e 6f 74 5f 66 6f   WEBPAGE: not_fo
0920: 75 6e 64 0a 2a 2f 0a 76 6f 69 64 20 68 6f 6d 65  und.*/.void home
0930: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63  _page(void){.  c
0940: 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 20 3d  har *zPageName =
0950: 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74   db_get("project
0960: 2d 6e 61 6d 65 22 2c 30 29 3b 0a 20 20 69 66 28  -name",0);.  if(
0970: 20 7a 50 61 67 65 4e 61 6d 65 20 29 7b 0a 20 20   zPageName ){.  
0980: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
0990: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 20  edentials();.   
09a0: 20 67 2e 7a 45 78 74 72 61 20 3d 20 7a 50 61 67   g.zExtra = zPag
09b0: 65 4e 61 6d 65 3b 0a 20 20 20 20 63 67 69 5f 73  eName;.    cgi_s
09c0: 65 74 5f 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63  et_parameter_noc
09d0: 6f 70 79 28 22 6e 61 6d 65 22 2c 20 67 2e 7a 45  opy("name", g.zE
09e0: 78 74 72 61 29 3b 0a 20 20 20 20 67 2e 6f 6b 52  xtra);.    g.okR
09f0: 64 57 69 6b 69 20 3d 20 31 3b 0a 20 20 20 20 67  dWiki = 1;.    g
0a00: 2e 6f 6b 41 70 6e 64 57 69 6b 69 20 3d 20 30 3b  .okApndWiki = 0;
0a10: 0a 20 20 20 20 67 2e 6f 6b 57 72 57 69 6b 69 20  .    g.okWrWiki 
0a20: 3d 20 30 3b 0a 20 20 20 20 67 2e 6f 6b 48 69 73  = 0;.    g.okHis
0a30: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 77 69  tory = 0;.    wi
0a40: 6b 69 5f 70 61 67 65 28 29 3b 0a 20 20 20 20 72  ki_page();.    r
0a50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 74 79  eturn;.  }.  sty
0a60: 6c 65 5f 68 65 61 64 65 72 28 22 48 6f 6d 65 22  le_header("Home"
0a70: 29 3b 0a 20 20 40 20 3c 70 3e 54 68 69 73 20 69  );.  @ <p>This i
0a80: 73 20 61 20 73 74 75 62 20 68 6f 6d 65 2d 70 61  s a stub home-pa
0a90: 67 65 20 66 6f 72 20 74 68 65 20 70 72 6f 6a 65  ge for the proje
0aa0: 63 74 2e 0a 20 20 40 20 54 6f 20 66 69 6c 6c 20  ct..  @ To fill 
0ab0: 69 6e 20 74 68 69 73 20 70 61 67 65 2c 20 66 69  in this page, fi
0ac0: 72 73 74 20 67 6f 20 74 6f 0a 20 20 40 20 3c 61  rst go to.  @ <a
0ad0: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73   href="%s(g.zBas
0ae0: 65 55 52 4c 29 2f 73 65 74 75 70 5f 63 6f 6e 66  eURL)/setup_conf
0af0: 69 67 22 3e 73 65 74 75 70 2f 63 6f 6e 66 69 67  ig">setup/config
0b00: 3c 2f 61 3e 0a 20 20 40 20 61 6e 64 20 65 73 74  </a>.  @ and est
0b10: 61 62 6c 69 73 68 20 61 20 22 50 72 6f 6a 65 63  ablish a "Projec
0b20: 74 20 4e 61 6d 65 22 2e 20 20 54 68 65 6e 20 63  t Name".  Then c
0b30: 72 65 61 74 65 20 61 0a 20 20 40 20 77 69 6b 69  reate a.  @ wiki
0b40: 20 70 61 67 65 20 77 69 74 68 20 74 68 61 74 20   page with that 
0b50: 6e 61 6d 65 2e 20 20 54 68 65 20 63 6f 6e 74 65  name.  The conte
0b60: 6e 74 20 6f 66 20 74 68 61 74 20 77 69 6b 69 20  nt of that wiki 
0b70: 70 61 67 65 0a 20 20 40 20 77 69 6c 6c 20 62 65  page.  @ will be
0b80: 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 70 6c   displayed in pl
0b90: 61 63 65 20 6f 66 20 74 68 69 73 20 6d 65 73 73  ace of this mess
0ba0: 61 67 65 2e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  age..  style_foo
0bb0: 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
0bc0: 57 45 42 50 41 47 45 3a 20 77 69 6b 69 0a 2a 2a  WEBPAGE: wiki.**
0bd0: 20 55 52 4c 3a 20 2f 77 69 6b 69 3f 6e 61 6d 65   URL: /wiki?name
0be0: 3d 50 41 47 45 4e 41 4d 45 0a 2a 2f 0a 76 6f 69  =PAGENAME.*/.voi
0bf0: 64 20 77 69 6b 69 5f 70 61 67 65 28 76 6f 69 64  d wiki_page(void
0c00: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 67 3b  ){.  char *zTag;
0c10: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c  .  int rid;.  Bl
0c20: 6f 62 20 77 69 6b 69 3b 0a 20 20 4d 61 6e 69 66  ob wiki;.  Manif
0c30: 65 73 74 20 6d 3b 0a 20 20 63 6f 6e 73 74 20 63  est m;.  const c
0c40: 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a  har *zPageName;.
0c50: 20 20 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67    char *zHtmlPag
0c60: 65 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a  eName;.  char *z
0c70: 42 6f 64 79 20 3d 20 6d 70 72 69 6e 74 66 28 22  Body = mprintf("
0c80: 25 73 22 2c 22 3c 69 3e 45 6d 70 74 79 20 50 61  %s","<i>Empty Pa
0c90: 67 65 3c 2f 69 3e 22 29 3b 0a 0a 20 20 6c 6f 67  ge</i>");..  log
0ca0: 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74  in_check_credent
0cb0: 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67  ials();.  if( !g
0cc0: 2e 6f 6b 52 64 57 69 6b 69 20 29 7b 20 6c 6f 67  .okRdWiki ){ log
0cd0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74  in_needed(); ret
0ce0: 75 72 6e 3b 20 7d 0a 20 20 7a 50 61 67 65 4e 61  urn; }.  zPageNa
0cf0: 6d 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a  me = P("name");.
0d00: 20 20 69 66 28 20 7a 50 61 67 65 4e 61 6d 65 3d    if( zPageName=
0d10: 3d 30 20 29 7b 0a 20 20 20 20 77 63 6f 6e 74 65  =0 ){.    wconte
0d20: 6e 74 5f 70 61 67 65 28 29 3b 0a 20 20 20 20 72  nt_page();.    r
0d30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
0d40: 20 63 68 65 63 6b 5f 6e 61 6d 65 28 7a 50 61 67   check_name(zPag
0d50: 65 4e 61 6d 65 29 20 29 20 72 65 74 75 72 6e 3b  eName) ) return;
0d60: 0a 20 20 7a 54 61 67 20 3d 20 6d 70 72 69 6e 74  .  zTag = mprint
0d70: 66 28 22 77 69 6b 69 2d 25 73 22 2c 20 7a 50 61  f("wiki-%s", zPa
0d80: 67 65 4e 61 6d 65 29 3b 0a 20 20 72 69 64 20 3d  geName);.  rid =
0d90: 20 64 62 5f 69 6e 74 28 30 2c 20 0a 20 20 20 20   db_int(0, .    
0da0: 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d  "SELECT rid FROM
0db0: 20 74 61 67 78 72 65 66 22 0a 20 20 20 20 22 20   tagxref".    " 
0dc0: 57 48 45 52 45 20 74 61 67 69 64 3d 28 53 45 4c  WHERE tagid=(SEL
0dd0: 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20 74  ECT tagid FROM t
0de0: 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65  ag WHERE tagname
0df0: 3d 25 51 29 22 0a 20 20 20 20 22 20 4f 52 44 45  =%Q)".    " ORDE
0e00: 52 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43 22  R BY mtime DESC"
0e10: 2c 20 7a 54 61 67 0a 20 20 29 3b 0a 20 20 66 72  , zTag.  );.  fr
0e20: 65 65 28 7a 54 61 67 29 3b 0a 20 20 6d 65 6d 73  ee(zTag);.  mems
0e30: 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
0e40: 28 6d 29 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72  (m));.  blob_zer
0e50: 6f 28 26 6d 2e 63 6f 6e 74 65 6e 74 29 3b 0a 20  o(&m.content);. 
0e60: 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20   if( rid ){.    
0e70: 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20  Blob content;.  
0e80: 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69    content_get(ri
0e90: 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  d, &content);.  
0ea0: 20 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65    manifest_parse
0eb0: 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a  (&m, &content);.
0ec0: 20 20 20 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d      if( m.type==
0ed0: 43 46 54 59 50 45 5f 57 49 4b 49 20 29 7b 0a 20  CFTYPE_WIKI ){. 
0ee0: 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d 2e 7a       zBody = m.z
0ef0: 57 69 6b 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Wiki;.    }.  }.
0f00: 20 20 69 66 28 20 28 72 69 64 20 26 26 20 67 2e    if( (rid && g.
0f10: 6f 6b 57 72 57 69 6b 69 29 20 7c 7c 20 28 21 72  okWrWiki) || (!r
0f20: 69 64 20 26 26 20 67 2e 6f 6b 4e 65 77 57 69 6b  id && g.okNewWik
0f30: 69 29 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f  i) ){.    style_
0f40: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
0f50: 22 45 64 69 74 22 2c 20 22 45 64 69 74 20 57 69  "Edit", "Edit Wi
0f60: 6b 69 20 50 61 67 65 22 2c 20 0a 20 20 20 20 20  ki Page", .     
0f70: 20 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 77 69    mprintf("%s/wi
0f80: 6b 69 65 64 69 74 3f 6e 61 6d 65 3d 25 54 22 2c  kiedit?name=%T",
0f90: 20 67 2e 7a 54 6f 70 2c 20 7a 50 61 67 65 4e 61   g.zTop, zPageNa
0fa0: 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  me));.  }.  if( 
0fb0: 72 69 64 20 26 26 20 67 2e 6f 6b 41 70 6e 64 57  rid && g.okApndW
0fc0: 69 6b 69 20 29 7b 0a 20 20 20 20 73 74 79 6c 65  iki ){.    style
0fd0: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
0fe0: 28 22 41 70 70 65 6e 64 22 2c 20 22 41 64 64 20  ("Append", "Add 
0ff0: 41 20 43 6f 6d 6d 65 6e 74 22 2c 20 0a 20 20 20  A Comment", .   
1000: 20 20 20 20 6d 70 72 69 6e 74 66 28 22 25 73 2f      mprintf("%s/
1010: 77 69 6b 69 61 70 70 65 6e 64 3f 6e 61 6d 65 3d  wikiappend?name=
1020: 25 54 22 2c 20 67 2e 7a 54 6f 70 2c 20 7a 50 61  %T", g.zTop, zPa
1030: 67 65 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20  geName));.  }.  
1040: 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20  if( g.okHistory 
1050: 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62  ){.    style_sub
1060: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48 69  menu_element("Hi
1070: 73 74 6f 72 79 22 2c 20 22 48 69 73 74 6f 72 79  story", "History
1080: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 6d 70 72  ", .         mpr
1090: 69 6e 74 66 28 22 25 73 2f 77 68 69 73 74 6f 72  intf("%s/whistor
10a0: 79 3f 6e 61 6d 65 3d 25 54 22 2c 20 67 2e 7a 54  y?name=%T", g.zT
10b0: 6f 70 2c 20 7a 50 61 67 65 4e 61 6d 65 29 29 3b  op, zPageName));
10c0: 0a 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61 67 65  .  }.  zHtmlPage
10d0: 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22  Name = mprintf("
10e0: 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b  %h", zPageName);
10f0: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
1100: 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 29 3b 0a  zHtmlPageName);.
1110: 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 77 69 6b    blob_init(&wik
1120: 69 2c 20 7a 42 6f 64 79 2c 20 2d 31 29 3b 0a 20  i, zBody, -1);. 
1130: 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 77   wiki_convert(&w
1140: 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20 62 6c  iki, 0, 0);.  bl
1150: 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b  ob_reset(&wiki);
1160: 0a 20 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61  .  manifest_clea
1170: 72 28 26 6d 29 3b 0a 20 20 73 74 79 6c 65 5f 66  r(&m);.  style_f
1180: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
1190: 2a 20 57 45 42 50 41 47 45 3a 20 77 69 6b 69 65  * WEBPAGE: wikie
11a0: 64 69 74 0a 2a 2a 20 55 52 4c 3a 20 2f 77 69 6b  dit.** URL: /wik
11b0: 69 65 64 69 74 3f 6e 61 6d 65 3d 50 41 47 45 4e  iedit?name=PAGEN
11c0: 41 4d 45 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69  AME.*/.void wiki
11d0: 65 64 69 74 5f 70 61 67 65 28 76 6f 69 64 29 7b  edit_page(void){
11e0: 0a 20 20 63 68 61 72 20 2a 7a 54 61 67 3b 0a 20  .  char *zTag;. 
11f0: 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62   int rid;.  Blob
1200: 20 77 69 6b 69 3b 0a 20 20 4d 61 6e 69 66 65 73   wiki;.  Manifes
1210: 74 20 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t m;.  const cha
1220: 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20  r *zPageName;.  
1230: 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61 67 65 4e  char *zHtmlPageN
1240: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
1250: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1260: 20 63 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20 28   char *zBody = (
1270: 63 68 61 72 2a 29 50 28 22 77 22 29 3b 0a 0a 20  char*)P("w");.. 
1280: 20 69 66 28 20 7a 42 6f 64 79 20 29 7b 0a 20 20   if( zBody ){.  
1290: 20 20 7a 42 6f 64 79 20 3d 20 6d 70 72 69 6e 74    zBody = mprint
12a0: 66 28 22 25 73 22 2c 20 7a 42 6f 64 79 29 3b 0a  f("%s", zBody);.
12b0: 20 20 7d 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63    }.  login_chec
12c0: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
12d0: 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20 50  .  zPageName = P
12e0: 44 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a 20 20  D("name","");.  
12f0: 69 66 28 20 63 68 65 63 6b 5f 6e 61 6d 65 28 7a  if( check_name(z
1300: 50 61 67 65 4e 61 6d 65 29 20 29 20 72 65 74 75  PageName) ) retu
1310: 72 6e 3b 0a 20 20 7a 54 61 67 20 3d 20 6d 70 72  rn;.  zTag = mpr
1320: 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22 2c 20  intf("wiki-%s", 
1330: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 72 69  zPageName);.  ri
1340: 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 0a 20  d = db_int(0, . 
1350: 20 20 20 22 53 45 4c 45 43 54 20 72 69 64 20 46     "SELECT rid F
1360: 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20 20 20  ROM tagxref".   
1370: 20 22 20 57 48 45 52 45 20 74 61 67 69 64 3d 28   " WHERE tagid=(
1380: 53 45 4c 45 43 54 20 74 61 67 69 64 20 46 52 4f  SELECT tagid FRO
1390: 4d 20 74 61 67 20 57 48 45 52 45 20 74 61 67 6e  M tag WHERE tagn
13a0: 61 6d 65 3d 25 51 29 22 0a 20 20 20 20 22 20 4f  ame=%Q)".    " O
13b0: 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20 44 45  RDER BY mtime DE
13c0: 53 43 22 2c 20 7a 54 61 67 0a 20 20 29 3b 0a 20  SC", zTag.  );. 
13d0: 20 66 72 65 65 28 7a 54 61 67 29 3b 0a 20 20 69   free(zTag);.  i
13e0: 66 28 20 28 72 69 64 20 26 26 20 21 67 2e 6f 6b  f( (rid && !g.ok
13f0: 57 72 57 69 6b 69 29 20 7c 7c 20 28 21 72 69 64  WrWiki) || (!rid
1400: 20 26 26 20 21 67 2e 6f 6b 4e 65 77 57 69 6b 69   && !g.okNewWiki
1410: 29 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e  ) ){.    login_n
1420: 65 65 64 65 64 28 29 3b 0a 20 20 20 20 72 65 74  eeded();.    ret
1430: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  urn;.  }.  memse
1440: 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
1450: 6d 29 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f  m));.  blob_zero
1460: 28 26 6d 2e 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  (&m.content);.  
1470: 69 66 28 20 72 69 64 20 26 26 20 7a 42 6f 64 79  if( rid && zBody
1480: 3d 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20  ==0 ){.    Blob 
1490: 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 63 6f 6e  content;.    con
14a0: 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63  tent_get(rid, &c
14b0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 6d 61 6e  ontent);.    man
14c0: 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d 2c 20  ifest_parse(&m, 
14d0: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  &content);.    i
14e0: 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50  f( m.type==CFTYP
14f0: 45 5f 57 49 4b 49 20 29 7b 0a 20 20 20 20 20 20  E_WIKI ){.      
1500: 7a 42 6f 64 79 20 3d 20 6d 2e 7a 57 69 6b 69 3b  zBody = m.zWiki;
1510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1520: 20 50 28 22 73 75 62 6d 69 74 22 29 21 3d 30 20   P("submit")!=0 
1530: 26 26 20 7a 42 6f 64 79 21 3d 30 20 29 7b 0a 20  && zBody!=0 ){. 
1540: 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a     char *zDate;.
1550: 20 20 20 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a      Blob cksum;.
1560: 20 20 20 20 69 6e 74 20 6e 72 69 64 3b 0a 20 20      int nrid;.  
1570: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b    blob_zero(&wik
1580: 69 29 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e  i);.    db_begin
1590: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  _transaction();.
15a0: 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74      zDate = db_t
15b0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64  ext(0, "SELECT d
15c0: 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 22 29  atetime('now')")
15d0: 3b 0a 20 20 20 20 7a 44 61 74 65 5b 31 30 5d 20  ;.    zDate[10] 
15e0: 3d 20 27 54 27 3b 0a 20 20 20 20 62 6c 6f 62 5f  = 'T';.    blob_
15f0: 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22  appendf(&wiki, "
1600: 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b  D %s\n", zDate);
1610: 0a 20 20 20 20 66 72 65 65 28 7a 44 61 74 65 29  .    free(zDate)
1620: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  ;.    blob_appen
1630: 64 66 28 26 77 69 6b 69 2c 20 22 4c 20 25 46 5c  df(&wiki, "L %F\
1640: 6e 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a  n", zPageName);.
1650: 20 20 20 20 69 66 28 20 72 69 64 20 29 7b 0a 20      if( rid ){. 
1660: 20 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64       char *zUuid
1670: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
1680: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20  ELECT uuid FROM 
1690: 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25  blob WHERE rid=%
16a0: 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20  d", rid);.      
16b0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
16c0: 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a 55  ki, "P %s\n", zU
16d0: 75 69 64 29 3b 0a 20 20 20 20 20 20 66 72 65 65  uid);.      free
16e0: 28 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20  (zUuid);.    }. 
16f0: 20 20 20 69 66 28 20 67 2e 7a 4c 6f 67 69 6e 20     if( g.zLogin 
1700: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
1710: 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 55 20  pendf(&wiki, "U 
1720: 25 46 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29  %F\n", g.zLogin)
1730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62  ;.    }.    blob
1740: 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20  _appendf(&wiki, 
1750: 22 57 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 73 74  "W %d\n%s\n", st
1760: 72 6c 65 6e 28 7a 42 6f 64 79 29 2c 20 7a 42 6f  rlen(zBody), zBo
1770: 64 79 29 3b 0a 20 20 20 20 6d 64 35 73 75 6d 5f  dy);.    md5sum_
1780: 62 6c 6f 62 28 26 77 69 6b 69 2c 20 26 63 6b 73  blob(&wiki, &cks
1790: 75 6d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  um);.    blob_ap
17a0: 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 5a 20  pendf(&wiki, "Z 
17b0: 25 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a  %b\n", &cksum);.
17c0: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
17d0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 6e 72 69 64  cksum);.    nrid
17e0: 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26   = content_put(&
17f0: 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20  wiki, 0, 0);.   
1800: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
1810: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
1820: 20 49 4e 54 4f 20 75 6e 73 65 6e 74 20 56 41 4c   INTO unsent VAL
1830: 55 45 53 28 25 64 29 22 2c 20 6e 72 69 64 29 3b  UES(%d)", nrid);
1840: 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 72  .    manifest_cr
1850: 6f 73 73 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 77  osslink(nrid, &w
1860: 69 6b 69 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72  iki);.    blob_r
1870: 65 73 65 74 28 26 77 69 6b 69 29 3b 0a 20 20 20  eset(&wiki);.   
1880: 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 79   content_deltify
1890: 28 72 69 64 2c 20 6e 72 69 64 2c 20 30 29 3b 0a  (rid, nrid, 0);.
18a0: 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73      db_end_trans
18b0: 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20 63  action(0);.    c
18c0: 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 77 69  gi_redirectf("wi
18d0: 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50 61  ki?name=%T", zPa
18e0: 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  geName);.  }.  i
18f0: 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 21 3d  f( P("cancel")!=
1900: 30 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64  0 ){.    cgi_red
1910: 69 72 65 63 74 66 28 22 77 69 6b 69 3f 6e 61 6d  irectf("wiki?nam
1920: 65 3d 25 54 22 2c 20 7a 50 61 67 65 4e 61 6d 65  e=%T", zPageName
1930: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1940: 20 7d 0a 20 20 69 66 28 20 7a 42 6f 64 79 3d 3d   }.  if( zBody==
1950: 30 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20 3d  0 ){.    zBody =
1960: 20 6d 70 72 69 6e 74 66 28 22 3c 69 3e 45 6d 70   mprintf("<i>Emp
1970: 74 79 20 50 61 67 65 3c 2f 69 3e 22 29 3b 0a 20  ty Page</i>");. 
1980: 20 7d 0a 20 20 7a 48 74 6d 6c 50 61 67 65 4e 61   }.  zHtmlPageNa
1990: 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 45 64  me = mprintf("Ed
19a0: 69 74 3a 20 25 68 22 2c 20 7a 50 61 67 65 4e 61  it: %h", zPageNa
19b0: 6d 65 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61  me);.  style_hea
19c0: 64 65 72 28 7a 48 74 6d 6c 50 61 67 65 4e 61 6d  der(zHtmlPageNam
19d0: 65 29 3b 0a 20 20 69 66 28 20 50 28 22 70 72 65  e);.  if( P("pre
19e0: 76 69 65 77 22 29 21 3d 30 20 29 7b 0a 20 20 20  view")!=0 ){.   
19f0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b 69   blob_zero(&wiki
1a00: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  );.    blob_appe
1a10: 6e 64 28 26 77 69 6b 69 2c 20 7a 42 6f 64 79 2c  nd(&wiki, zBody,
1a20: 20 2d 31 29 3b 0a 20 20 20 20 40 20 50 72 65 76   -1);.    @ Prev
1a30: 69 65 77 3a 3c 68 72 3e 0a 20 20 20 20 77 69 6b  iew:<hr>.    wik
1a40: 69 5f 63 6f 6e 76 65 72 74 28 26 77 69 6b 69 2c  i_convert(&wiki,
1a50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c 68   0, 0);.    @ <h
1a60: 72 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  r>.    blob_rese
1a70: 74 28 26 77 69 6b 69 29 3b 0a 20 20 7d 0a 20 20  t(&wiki);.  }.  
1a80: 66 6f 72 28 6e 3d 32 2c 20 7a 3d 7a 42 6f 64 79  for(n=2, z=zBody
1a90: 3b 20 7a 5b 30 5d 3b 20 7a 2b 2b 29 7b 0a 20 20  ; z[0]; z++){.  
1aa0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 6e 27    if( z[0]=='\n'
1ab0: 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66   ) n++;.  }.  if
1ac0: 28 20 6e 3c 32 30 20 29 20 6e 20 3d 20 32 30 3b  ( n<20 ) n = 20;
1ad0: 0a 20 20 69 66 28 20 6e 3e 32 30 30 20 29 20 6e  .  if( n>200 ) n
1ae0: 20 3d 20 32 30 30 3b 0a 20 20 40 20 3c 66 6f 72   = 200;.  @ <for
1af0: 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 20  m method="POST" 
1b00: 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61  action="%s(g.zBa
1b10: 73 65 55 52 4c 29 2f 77 69 6b 69 65 64 69 74 22  seURL)/wikiedit"
1b20: 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  >.  @ <input typ
1b30: 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d  e="hidden" name=
1b40: 22 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 68  "name" value="%h
1b50: 28 7a 50 61 67 65 4e 61 6d 65 29 22 3e 0a 20 20  (zPageName)">.  
1b60: 40 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d 65  @ <textarea name
1b70: 3d 22 77 22 20 63 6c 61 73 73 3d 22 77 69 6b 69  ="w" class="wiki
1b80: 65 64 69 74 22 20 63 6f 6c 73 3d 22 38 30 22 20  edit" cols="80" 
1b90: 0a 20 20 40 20 20 72 6f 77 73 3d 22 25 64 28 6e  .  @  rows="%d(n
1ba0: 29 22 20 77 72 61 70 3d 22 76 69 72 74 75 61 6c  )" wrap="virtual
1bb0: 22 3e 25 68 28 7a 42 6f 64 79 29 3c 2f 74 65 78  ">%h(zBody)</tex
1bc0: 74 61 72 65 61 3e 0a 20 20 40 20 3c 62 72 3e 0a  tarea>.  @ <br>.
1bd0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
1be0: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 70  "submit" name="p
1bf0: 72 65 76 69 65 77 22 20 76 61 6c 75 65 3d 22 50  review" value="P
1c00: 72 65 76 69 65 77 20 59 6f 75 72 20 43 68 61 6e  review Your Chan
1c10: 67 65 73 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74  ges">.  @ <input
1c20: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e   type="submit" n
1c30: 61 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c  ame="submit" val
1c40: 75 65 3d 22 41 70 70 6c 79 20 54 68 65 73 65 20  ue="Apply These 
1c50: 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c 69  Changes">.  @ <i
1c60: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
1c70: 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c 22  t" name="cancel"
1c80: 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22 3e   value="Cancel">
1c90: 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 6d  .  @ </form>.  m
1ca0: 61 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d  anifest_clear(&m
1cb0: 29 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65  );.  style_foote
1cc0: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  r();.}../*.** Ap
1cd0: 70 65 6e 64 20 74 68 65 20 77 69 6b 69 20 74 65  pend the wiki te
1ce0: 78 74 20 66 6f 72 20 61 6e 20 72 65 6d 61 72 6b  xt for an remark
1cf0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1d00: 68 65 20 67 69 76 65 6e 20 42 4c 4f 42 2e 0a 2a  he given BLOB..*
1d10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70  /.static void ap
1d20: 70 65 6e 64 52 65 6d 61 72 6b 28 42 6c 6f 62 20  pendRemark(Blob 
1d30: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61  *p){.  char *zDa
1d40: 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
1d50: 20 2a 7a 55 73 65 72 3b 0a 20 20 63 6f 6e 73 74   *zUser;.  const
1d60: 20 63 68 61 72 20 2a 7a 52 65 6d 61 72 6b 3b 0a   char *zRemark;.
1d70: 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65  .  zDate = db_te
1d80: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61  xt(0, "SELECT da
1d90: 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 3b  tetime('now')");
1da0: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
1db0: 70 2c 20 22 4f 6e 20 25 73 20 55 54 43 20 25 68  p, "On %s UTC %h
1dc0: 22 2c 20 7a 44 61 74 65 2c 20 67 2e 7a 4c 6f 67  ", zDate, g.zLog
1dd0: 69 6e 29 3b 0a 20 20 66 72 65 65 28 7a 44 61 74  in);.  free(zDat
1de0: 65 29 3b 0a 20 20 7a 55 73 65 72 20 3d 20 50 44  e);.  zUser = PD
1df0: 28 22 75 22 2c 67 2e 7a 4c 6f 67 69 6e 29 3b 0a  ("u",g.zLogin);.
1e00: 20 20 69 66 28 20 7a 55 73 65 72 5b 30 5d 20 26    if( zUser[0] &
1e10: 26 20 73 74 72 63 6d 70 28 7a 55 73 65 72 2c 67  & strcmp(zUser,g
1e20: 2e 7a 4c 6f 67 69 6e 29 20 29 7b 0a 20 20 20 20  .zLogin) ){.    
1e30: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2c 20  blob_appendf(p, 
1e40: 22 20 28 63 6c 61 69 6d 69 6e 67 20 74 6f 20 62  " (claiming to b
1e50: 65 20 25 68 29 22 2c 20 7a 55 73 65 72 29 3b 0a  e %h)", zUser);.
1e60: 20 20 7d 0a 20 20 7a 52 65 6d 61 72 6b 20 3d 20    }.  zRemark = 
1e70: 50 44 28 22 72 22 2c 22 22 29 3b 0a 20 20 62 6c  PD("r","");.  bl
1e80: 6f 62 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 20  ob_appendf(p, " 
1e90: 61 64 64 65 64 3a 5c 6e 5c 6e 25 73 22 2c 20 7a  added:\n\n%s", z
1ea0: 52 65 6d 61 72 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Remark);.}../*.*
1eb0: 2a 20 57 45 42 50 41 47 45 3a 20 77 69 6b 69 61  * WEBPAGE: wikia
1ec0: 70 70 65 6e 64 0a 2a 2a 20 55 52 4c 3a 20 2f 77  ppend.** URL: /w
1ed0: 69 6b 69 61 70 70 65 6e 64 3f 6e 61 6d 65 3d 50  ikiappend?name=P
1ee0: 41 47 45 4e 41 4d 45 0a 2a 2f 0a 76 6f 69 64 20  AGENAME.*/.void 
1ef0: 77 69 6b 69 61 70 70 65 6e 64 5f 70 61 67 65 28  wikiappend_page(
1f00: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  void){.  char *z
1f10: 54 61 67 3b 0a 20 20 69 6e 74 20 72 69 64 3b 0a  Tag;.  int rid;.
1f20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1f30: 61 67 65 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20  ageName;.  char 
1f40: 2a 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65 3b 0a  *zHtmlPageName;.
1f50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
1f60: 73 65 72 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68  ser;..  login_ch
1f70: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
1f80: 29 3b 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20 3d  );.  zPageName =
1f90: 20 50 44 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a   PD("name","");.
1fa0: 20 20 69 66 28 20 63 68 65 63 6b 5f 6e 61 6d 65    if( check_name
1fb0: 28 7a 50 61 67 65 4e 61 6d 65 29 20 29 20 72 65  (zPageName) ) re
1fc0: 74 75 72 6e 3b 0a 20 20 7a 54 61 67 20 3d 20 6d  turn;.  zTag = m
1fd0: 70 72 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22  printf("wiki-%s"
1fe0: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  , zPageName);.  
1ff0: 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20  rid = db_int(0, 
2000: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 72 69 64  .    "SELECT rid
2010: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20   FROM tagxref". 
2020: 20 20 20 22 20 57 48 45 52 45 20 74 61 67 69 64     " WHERE tagid
2030: 3d 28 53 45 4c 45 43 54 20 74 61 67 69 64 20 46  =(SELECT tagid F
2040: 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74 61  ROM tag WHERE ta
2050: 67 6e 61 6d 65 3d 25 51 29 22 0a 20 20 20 20 22  gname=%Q)".    "
2060: 20 4f 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20   ORDER BY mtime 
2070: 44 45 53 43 22 2c 20 7a 54 61 67 0a 20 20 29 3b  DESC", zTag.  );
2080: 0a 20 20 66 72 65 65 28 7a 54 61 67 29 3b 0a 20  .  free(zTag);. 
2090: 20 69 66 28 20 21 72 69 64 20 29 7b 0a 20 20 20   if( !rid ){.   
20a0: 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 22 69   cgi_redirect("i
20b0: 6e 64 65 78 22 29 3b 0a 20 20 20 20 72 65 74 75  ndex");.    retu
20c0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 67  rn;.  }.  if( !g
20d0: 2e 6f 6b 41 70 6e 64 57 69 6b 69 20 29 7b 0a 20  .okApndWiki ){. 
20e0: 20 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28     login_needed(
20f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2100: 20 7d 0a 20 20 69 66 28 20 50 28 22 73 75 62 6d   }.  if( P("subm
2110: 69 74 22 29 21 3d 30 20 26 26 20 50 28 22 72 22  it")!=0 && P("r"
2120: 29 21 3d 30 20 26 26 20 50 28 22 75 22 29 21 3d  )!=0 && P("u")!=
2130: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
2140: 44 61 74 65 3b 0a 20 20 20 20 42 6c 6f 62 20 63  Date;.    Blob c
2150: 6b 73 75 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 72  ksum;.    int nr
2160: 69 64 3b 0a 20 20 20 20 42 6c 6f 62 20 62 6f 64  id;.    Blob bod
2170: 79 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74  y;.    Blob cont
2180: 65 6e 74 3b 0a 20 20 20 20 42 6c 6f 62 20 77 69  ent;.    Blob wi
2190: 6b 69 3b 0a 20 20 20 20 4d 61 6e 69 66 65 73 74  ki;.    Manifest
21a0: 20 6d 3b 0a 0a 20 20 20 20 63 6f 6e 74 65 6e 74   m;..    content
21b0: 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65  _get(rid, &conte
21c0: 6e 74 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73  nt);.    manifes
21d0: 74 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e  t_parse(&m, &con
21e0: 74 65 6e 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  tent);.    blob_
21f0: 7a 65 72 6f 28 26 62 6f 64 79 29 3b 0a 20 20 20  zero(&body);.   
2200: 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 54   if( m.type==CFT
2210: 59 50 45 5f 57 49 4b 49 20 29 7b 0a 20 20 20 20  YPE_WIKI ){.    
2220: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
2230: 62 6f 64 79 2c 20 6d 2e 7a 57 69 6b 69 2c 20 2d  body, m.zWiki, -
2240: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61  1);.    }.    ma
2250: 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29  nifest_clear(&m)
2260: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ;.    blob_zero(
2270: 26 77 69 6b 69 29 3b 0a 20 20 20 20 64 62 5f 62  &wiki);.    db_b
2280: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
2290: 28 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20  ();.    zDate = 
22a0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
22b0: 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77  CT datetime('now
22c0: 27 29 22 29 3b 0a 20 20 20 20 7a 44 61 74 65 5b  ')");.    zDate[
22d0: 31 30 5d 20 3d 20 27 54 27 3b 0a 20 20 20 20 62  10] = 'T';.    b
22e0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b  lob_appendf(&wik
22f0: 69 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61  i, "D %s\n", zDa
2300: 74 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  te);.    blob_ap
2310: 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 4c 20  pendf(&wiki, "L 
2320: 25 46 5c 6e 22 2c 20 7a 50 61 67 65 4e 61 6d 65  %F\n", zPageName
2330: 29 3b 0a 20 20 20 20 69 66 28 20 72 69 64 20 29  );.    if( rid )
2340: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
2350: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  uid = db_text(0,
2360: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
2370: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
2380: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20  d=%d", rid);.   
2390: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
23a0: 26 77 69 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c  &wiki, "P %s\n",
23b0: 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20 66   zUuid);.      f
23c0: 72 65 65 28 7a 55 75 69 64 29 3b 0a 20 20 20 20  ree(zUuid);.    
23d0: 7d 0a 20 20 20 20 69 66 28 20 67 2e 7a 4c 6f 67  }.    if( g.zLog
23e0: 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  in ){.      blob
23f0: 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20  _appendf(&wiki, 
2400: 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c 6f 67  "U %F\n", g.zLog
2410: 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  in);.    }.    b
2420: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 62 6f 64  lob_appendf(&bod
2430: 79 2c 20 22 5c 6e 3c 68 72 3e 5c 6e 22 29 3b 0a  y, "\n<hr>\n");.
2440: 20 20 20 20 61 70 70 65 6e 64 52 65 6d 61 72 6b      appendRemark
2450: 28 26 62 6f 64 79 29 3b 0a 20 20 20 20 62 6c 6f  (&body);.    blo
2460: 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c  b_appendf(&wiki,
2470: 20 22 57 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 62   "W %d\n%s\n", b
2480: 6c 6f 62 5f 73 69 7a 65 28 26 62 6f 64 79 29 2c  lob_size(&body),
2490: 20 62 6c 6f 62 5f 73 74 72 28 26 62 6f 64 79 29   blob_str(&body)
24a0: 29 3b 0a 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c  );.    md5sum_bl
24b0: 6f 62 28 26 77 69 6b 69 2c 20 26 63 6b 73 75 6d  ob(&wiki, &cksum
24c0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  );.    blob_appe
24d0: 6e 64 66 28 26 77 69 6b 69 2c 20 22 5a 20 25 62  ndf(&wiki, "Z %b
24e0: 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  \n", &cksum);.  
24f0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6b    blob_reset(&ck
2500: 73 75 6d 29 3b 0a 20 20 20 20 6e 72 69 64 20 3d  sum);.    nrid =
2510: 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 77 69   content_put(&wi
2520: 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64  ki, 0, 0);.    d
2530: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 49 4e  b_multi_exec("IN
2540: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
2550: 4e 54 4f 20 75 6e 73 65 6e 74 20 56 41 4c 55 45  NTO unsent VALUE
2560: 53 28 25 64 29 22 2c 20 6e 72 69 64 29 3b 0a 20  S(%d)", nrid);. 
2570: 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73     manifest_cros
2580: 73 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 77 69 6b  slink(nrid, &wik
2590: 69 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  i);.    blob_res
25a0: 65 74 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 63  et(&wiki);.    c
25b0: 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 79 28 72  ontent_deltify(r
25c0: 69 64 2c 20 6e 72 69 64 2c 20 30 29 3b 0a 20 20  id, nrid, 0);.  
25d0: 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63    db_end_transac
25e0: 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20 63 67 69  tion(0);.    cgi
25f0: 5f 72 65 64 69 72 65 63 74 66 28 22 77 69 6b 69  _redirectf("wiki
2600: 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65  ?name=%T", zPage
2610: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Name);.  }.  if(
2620: 20 50 28 22 63 61 6e 63 65 6c 22 29 21 3d 30 20   P("cancel")!=0 
2630: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  ){.    cgi_redir
2640: 65 63 74 66 28 22 77 69 6b 69 3f 6e 61 6d 65 3d  ectf("wiki?name=
2650: 25 54 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b  %T", zPageName);
2660: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2670: 0a 20 20 7a 48 74 6d 6c 50 61 67 65 4e 61 6d 65  .  zHtmlPageName
2680: 20 3d 20 6d 70 72 69 6e 74 66 28 22 41 70 70 65   = mprintf("Appe
2690: 6e 64 20 43 6f 6d 6d 65 6e 74 20 54 6f 3a 20 25  nd Comment To: %
26a0: 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a  h", zPageName);.
26b0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 7a    style_header(z
26c0: 48 74 6d 6c 50 61 67 65 4e 61 6d 65 29 3b 0a 20  HtmlPageName);. 
26d0: 20 69 66 28 20 50 28 22 70 72 65 76 69 65 77 22   if( P("preview"
26e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62  )!=0 ){.    Blob
26f0: 20 70 72 65 76 69 65 77 3b 0a 20 20 20 20 62 6c   preview;.    bl
2700: 6f 62 5f 7a 65 72 6f 28 26 70 72 65 76 69 65 77  ob_zero(&preview
2710: 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 52 65 6d  );.    appendRem
2720: 61 72 6b 28 26 70 72 65 76 69 65 77 29 3b 0a 20  ark(&preview);. 
2730: 20 20 20 40 20 50 72 65 76 69 65 77 3a 3c 68 72     @ Preview:<hr
2740: 3e 0a 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76 65  >.    wiki_conve
2750: 72 74 28 26 70 72 65 76 69 65 77 2c 20 30 2c 20  rt(&preview, 0, 
2760: 30 29 3b 0a 20 20 20 20 40 20 3c 68 72 3e 0a 20  0);.    @ <hr>. 
2770: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 70     blob_reset(&p
2780: 72 65 76 69 65 77 29 3b 0a 20 20 7d 0a 20 20 7a  review);.  }.  z
2790: 55 73 65 72 20 3d 20 50 44 28 22 75 22 2c 20 67  User = PD("u", g
27a0: 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 40 20 3c 66  .zLogin);.  @ <f
27b0: 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54  orm method="POST
27c0: 22 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a  " action="%s(g.z
27d0: 42 61 73 65 55 52 4c 29 2f 77 69 6b 69 61 70 70  BaseURL)/wikiapp
27e0: 65 6e 64 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74  end">.  @ <input
27f0: 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e   type="hidden" n
2800: 61 6d 65 3d 22 6e 61 6d 65 22 20 76 61 6c 75 65  ame="name" value
2810: 3d 22 25 68 28 7a 50 61 67 65 4e 61 6d 65 29 22  ="%h(zPageName)"
2820: 3e 0a 20 20 40 20 59 6f 75 72 20 4e 61 6d 65 3a  >.  @ Your Name:
2830: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
2840: 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 75 22  ="text" name="u"
2850: 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75 65   size="20" value
2860: 3d 22 25 68 28 7a 55 73 65 72 29 22 3e 3c 62 72  ="%h(zUser)"><br
2870: 3e 0a 20 20 40 20 43 6f 6d 6d 65 6e 74 20 74 6f  >.  @ Comment to
2880: 20 61 70 70 65 6e 64 3a 3c 62 72 3e 0a 20 20 40   append:<br>.  @
2890: 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d 65 3d   <textarea name=
28a0: 22 72 22 20 63 6c 61 73 73 3d 22 77 69 6b 69 65  "r" class="wikie
28b0: 64 69 74 22 20 63 6f 6c 73 3d 22 38 30 22 20 0a  dit" cols="80" .
28c0: 20 20 40 20 20 72 6f 77 73 3d 22 31 30 22 20 77    @  rows="10" w
28d0: 72 61 70 3d 22 76 69 72 74 75 61 6c 22 3e 25 68  rap="virtual">%h
28e0: 28 50 44 28 22 72 22 2c 22 22 29 29 3c 2f 74 65  (PD("r",""))</te
28f0: 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 62 72 3e  xtarea>.  @ <br>
2900: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
2910: 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22  ="submit" name="
2920: 70 72 65 76 69 65 77 22 20 76 61 6c 75 65 3d 22  preview" value="
2930: 50 72 65 76 69 65 77 20 59 6f 75 72 20 43 6f 6d  Preview Your Com
2940: 6d 65 6e 74 22 3e 0a 20 20 40 20 3c 69 6e 70 75  ment">.  @ <inpu
2950: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20  t type="submit" 
2960: 6e 61 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61  name="submit" va
2970: 6c 75 65 3d 22 41 70 70 65 6e 64 20 59 6f 75 72  lue="Append Your
2980: 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c   Changes">.  @ <
2990: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
29a0: 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c  it" name="cancel
29b0: 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22  " value="Cancel"
29c0: 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20  >.  @ </form>.  
29d0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
29e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
29f0: 3a 20 77 68 69 73 74 6f 72 79 0a 2a 2a 20 55 52  : whistory.** UR
2a00: 4c 3a 20 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d  L: /whistory?nam
2a10: 65 3d 50 41 47 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a  e=PAGENAME.**.**
2a20: 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
2a30: 74 65 20 63 68 61 6e 67 65 20 68 69 73 74 6f 72  te change histor
2a40: 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 77  y for a single w
2a50: 69 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  iki page..*/.voi
2a60: 64 20 77 68 69 73 74 6f 72 79 5f 70 61 67 65 28  d whistory_page(
2a70: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b  void){.  Stmt q;
2a80: 0a 20 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b  .  char *zTitle;
2a90: 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b 0a 20  .  char *zSQL;. 
2aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2ab0: 67 65 4e 61 6d 65 3b 0a 20 20 6c 6f 67 69 6e 5f  geName;.  login_
2ac0: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
2ad0: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
2ae0: 48 69 73 74 6f 72 79 20 29 7b 20 6c 6f 67 69 6e  History ){ login
2af0: 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72  _needed(); retur
2b00: 6e 3b 20 7d 0a 20 20 7a 50 61 67 65 4e 61 6d 65  n; }.  zPageName
2b10: 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22 22 29   = PD("name","")
2b20: 3b 0a 20 20 7a 54 69 74 6c 65 20 3d 20 6d 70 72  ;.  zTitle = mpr
2b30: 69 6e 74 66 28 22 48 69 73 74 6f 72 79 20 4f 66  intf("History Of
2b40: 20 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29   %h", zPageName)
2b50: 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  ;.  style_header
2b60: 28 7a 54 69 74 6c 65 29 3b 0a 20 20 66 72 65 65  (zTitle);.  free
2b70: 28 7a 54 69 74 6c 65 29 3b 0a 0a 20 20 7a 53 51  (zTitle);..  zSQ
2b80: 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 20  L = mprintf("%s 
2b90: 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20  AND event.objid 
2ba0: 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
2bb0: 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54        "  (SELECT
2bc0: 20 72 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65   rid FROM tagxre
2bd0: 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 22 0a  f WHERE tagid=".
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 22 28 53 45 4c 45 43 54 20         "(SELECT 
2c00: 74 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57  tagid FROM tag W
2c10: 48 45 52 45 20 74 61 67 6e 61 6d 65 3d 27 77 69  HERE tagname='wi
2c20: 6b 69 2d 25 71 27 29 29 22 0a 20 20 20 20 20 20  ki-%q'))".      
2c30: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
2c40: 52 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43 22  R BY mtime DESC"
2c50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c60: 20 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72     timeline_quer
2c70: 79 5f 66 6f 72 5f 77 77 77 28 29 2c 20 7a 50 61  y_for_www(), zPa
2c80: 67 65 4e 61 6d 65 29 3b 0a 20 20 64 62 5f 70 72  geName);.  db_pr
2c90: 65 70 61 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b  epare(&q, zSQL);
2ca0: 0a 20 20 66 72 65 65 28 7a 53 51 4c 29 3b 0a 20  .  free(zSQL);. 
2cb0: 20 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c   www_print_timel
2cc0: 69 6e 65 28 26 71 2c 20 30 2c 20 30 2c 20 30 2c  ine(&q, 0, 0, 0,
2cd0: 20 30 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69   0);.  db_finali
2ce0: 7a 65 28 26 71 29 3b 0a 20 20 73 74 79 6c 65 5f  ze(&q);.  style_
2cf0: 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a  footer();.}../*.
2d00: 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 63 6f 6e  ** WEBPAGE: wcon
2d10: 74 65 6e 74 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20  tent.**.** List 
2d20: 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 77 69  all available wi
2d30: 6b 69 20 70 61 67 65 73 20 77 69 74 68 20 64 61  ki pages with da
2d40: 74 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c  te created and l
2d50: 61 73 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  ast modified..*/
2d60: 0a 76 6f 69 64 20 77 63 6f 6e 74 65 6e 74 5f 70  .void wcontent_p
2d70: 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d  age(void){.  Stm
2d80: 74 20 71 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65  t q;.  login_che
2d90: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
2da0: 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 64 57  ;.  if( !g.okRdW
2db0: 69 6b 69 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  iki ){ login_nee
2dc0: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
2dd0: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
2de0: 22 41 76 61 69 6c 61 62 6c 65 20 57 69 6b 69 20  "Available Wiki 
2df0: 50 61 67 65 73 22 29 3b 0a 20 20 40 20 3c 75 6c  Pages");.  @ <ul
2e00: 3e 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  >.  db_prepare(&
2e10: 71 2c 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20  q, .    "SELECT 
2e20: 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 20  substr(tagname, 
2e30: 36 2c 20 31 30 30 30 29 20 46 52 4f 4d 20 74 61  6, 1000) FROM ta
2e40: 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20  g WHERE tagname 
2e50: 47 4c 4f 42 20 27 77 69 6b 69 2d 2a 27 22 0a 20  GLOB 'wiki-*'". 
2e60: 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6c 6f     " ORDER BY lo
2e70: 77 65 72 28 74 61 67 6e 61 6d 65 29 22 0a 20 20  wer(tagname)".  
2e80: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73  );.  while( db_s
2e90: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
2ea0: 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
2eb0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64   char *zName = d
2ec0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
2ed0: 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c 6c 69 3e  , 0);.    @ <li>
2ee0: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
2ef0: 61 73 65 55 52 4c 29 2f 77 69 6b 69 3f 6e 61 6d  aseURL)/wiki?nam
2f00: 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28  e=%T(zName)">%h(
2f10: 7a 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 6c 69 3e 0a  zName)</a></li>.
2f20: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
2f30: 65 28 26 71 29 3b 0a 20 20 40 20 3c 2f 75 6c 3e  e(&q);.  @ </ul>
2f40: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
2f50: 29 3b 0a 7d 0a                                   );.}.