Fossil

Hex Artifact Content
Login

Artifact 8b5bc84a7f21ebf8e31a3a84f4f65444f8e771569a1ac5ff0bd531cc9c5022cd:


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 53 69 6d 70 6c 69 66 69 65 64 20 42  the Simplified B
00c0: 53 44 20 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f  SD License (also
00d0: 0a 2a 2a 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65  .** known as the
00e0: 20 22 32 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e   "2-Clause Licen
00f0: 73 65 22 20 6f 72 20 22 46 72 65 65 42 53 44 20  se" or "FreeBSD 
0100: 4c 69 63 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a  License".).**.**
0110: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0120: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
0130: 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74  the hope that it
0140: 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c   will be useful,
0150: 0a 2a 2a 20 62 75 74 20 77 69 74 68 6f 75 74 20  .** but without 
0160: 61 6e 79 20 77 61 72 72 61 6e 74 79 3b 20 77 69  any warranty; wi
0170: 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69  thout even the i
0180: 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20  mplied warranty 
0190: 6f 66 0a 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62  of.** merchantab
01a0: 69 6c 69 74 79 20 6f 72 20 66 69 74 6e 65 73 73  ility or fitness
01b0: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
01c0: 72 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  r purpose..**.**
01d0: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
01e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
01f0: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
0200: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
0210: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0220: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0270: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  *.**.** This fil
0280: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
0290: 74 6f 20 64 6f 20 66 6f 72 6d 61 74 74 69 6e 67  to do formatting
02a0: 20 6f 66 20 77 69 6b 69 20 74 65 78 74 2e 0a 2a   of wiki text..*
02b0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66  /.#include "conf
02c0: 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  ig.h".#include <
02d0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
02e0: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e  de <ctype.h>.#in
02f0: 63 6c 75 64 65 20 22 77 69 6b 69 2e 68 22 0a 0a  clude "wiki.h"..
0300: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
0310: 65 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 73  e if the input s
0320: 74 72 69 6e 67 20 69 73 20 61 20 77 65 6c 6c 2d  tring is a well-
0330: 66 6f 72 6d 65 64 20 77 69 6b 69 20 70 61 67 65  formed wiki page
0340: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 6c   name..**.** Wel
0350: 6c 2d 66 6f 72 6d 65 64 20 77 69 6b 69 20 70 61  l-formed wiki pa
0360: 67 65 20 6e 61 6d 65 73 20 64 6f 20 6e 6f 74 20  ge names do not 
0370: 62 65 67 69 6e 20 6f 72 20 65 6e 64 20 77 69 74  begin or end wit
0380: 68 20 77 68 69 74 65 73 70 61 63 65 2c 0a 2a 2a  h whitespace,.**
0390: 20 61 6e 64 20 64 6f 20 6e 6f 74 20 63 6f 6e 74   and do not cont
03a0: 61 69 6e 20 74 61 62 73 20 6f 72 20 6f 74 68 65  ain tabs or othe
03b0: 72 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72 61 63  r control charac
03c0: 74 65 72 73 20 61 6e 64 20 64 6f 20 6e 6f 74 0a  ters and do not.
03d0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20  ** contain more 
03e0: 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 73 70  than a single sp
03f0: 61 63 65 20 63 68 61 72 61 63 74 65 72 20 69 6e  ace character in
0400: 20 61 20 72 6f 77 2e 20 20 57 65 6c 6c 2d 66 6f   a row.  Well-fo
0410: 72 6d 65 64 0a 2a 2a 20 6e 61 6d 65 73 20 6d 75  rmed.** names mu
0420: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  st be between 1 
0430: 61 6e 64 20 31 30 30 20 63 68 61 72 61 63 74 65  and 100 characte
0440: 72 73 20 69 6e 20 6c 65 6e 67 74 68 2c 20 69 6e  rs in length, in
0450: 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20  clusive..*/.int 
0460: 77 69 6b 69 5f 6e 61 6d 65 5f 69 73 5f 77 65 6c  wiki_name_is_wel
0470: 6c 66 6f 72 6d 65 64 28 63 6f 6e 73 74 20 75 6e  lformed(const un
0480: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b  signed char *z){
0490: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
04a0: 7a 5b 30 5d 3c 3d 30 78 32 30 20 29 7b 0a 20 20  z[0]<=0x20 ){.  
04b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
04c0: 20 20 66 6f 72 28 69 3d 31 3b 20 7a 5b 69 5d 3b    for(i=1; z[i];
04d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
04e0: 5b 69 5d 3c 30 78 32 30 20 29 20 72 65 74 75 72  [i]<0x20 ) retur
04f0: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69  n 0;.    if( z[i
0500: 5d 3d 3d 30 78 32 30 20 26 26 20 7a 5b 69 2d 31  ]==0x20 && z[i-1
0510: 5d 3d 3d 30 78 32 30 20 29 20 72 65 74 75 72 6e  ]==0x20 ) return
0520: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 5b   0;.  }.  if( z[
0530: 69 2d 31 5d 3d 3d 27 20 27 20 29 20 72 65 74 75  i-1]==' ' ) retu
0540: 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 3c 31 20  rn 0;.  if( i<1 
0550: 7c 7c 20 69 3e 31 30 30 20 29 20 72 65 74 75 72  || i>100 ) retur
0560: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
0570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
0580: 20 72 75 6c 65 73 20 66 6f 72 20 77 65 6c 6c 2d   rules for well-
0590: 66 6f 72 6d 65 64 20 77 69 6b 69 20 70 61 67 65  formed wiki page
05a0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
05b0: 20 77 65 6c 6c 5f 66 6f 72 6d 65 64 5f 77 69 6b   well_formed_wik
05c0: 69 5f 6e 61 6d 65 5f 72 75 6c 65 73 28 76 6f 69  i_name_rules(voi
05d0: 64 29 7b 0a 20 20 40 20 3c 75 6c 3e 0a 20 20 40  d){.  @ <ul>.  @
05e0: 20 3c 6c 69 3e 20 4d 75 73 74 20 6e 6f 74 20 62   <li> Must not b
05f0: 65 67 69 6e 20 6f 72 20 65 6e 64 20 77 69 74 68  egin or end with
0600: 20 61 20 73 70 61 63 65 2e 3c 2f 6c 69 3e 0a 20   a space.</li>. 
0610: 20 40 20 3c 6c 69 3e 20 4d 75 73 74 20 6e 6f 74   @ <li> Must not
0620: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 63 6f 6e   contain any con
0630: 74 72 6f 6c 20 63 68 61 72 61 63 74 65 72 73 2c  trol characters,
0640: 20 69 6e 63 6c 75 64 69 6e 67 20 74 61 62 20 6f   including tab o
0650: 72 0a 20 20 40 20 20 20 20 20 20 6e 65 77 6c 69  r.  @      newli
0660: 6e 65 2e 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69  ne.</li>.  @ <li
0670: 3e 20 4d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  > Must not have 
0680: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63  two or more spac
0690: 65 73 20 69 6e 20 61 20 72 6f 77 20 69 6e 74 65  es in a row inte
06a0: 72 6e 61 6c 6c 79 2e 3c 2f 6c 69 3e 0a 20 20 40  rnally.</li>.  @
06b0: 20 3c 6c 69 3e 20 4d 75 73 74 20 62 65 20 62 65   <li> Must be be
06c0: 74 77 65 65 6e 20 31 20 61 6e 64 20 31 30 30 20  tween 1 and 100 
06d0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6c 65  characters in le
06e0: 6e 67 74 68 2e 3c 2f 6c 69 3e 0a 20 20 40 20 3c  ngth.</li>.  @ <
06f0: 2f 75 6c 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  /ul>.}../*.** Ch
0700: 65 63 6b 20 61 20 77 69 6b 69 20 6e 61 6d 65 2e  eck a wiki name.
0710: 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 77    If it is not w
0720: 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20 74 68 65 6e  ell-formed, then
0730: 20 69 73 73 75 65 20 61 6e 20 65 72 72 6f 72 0a   issue an error.
0740: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72  ** and return tr
0750: 75 65 2e 20 20 49 66 20 69 74 20 69 73 20 77 65  ue.  If it is we
0760: 6c 6c 2d 66 6f 72 6d 65 64 2c 20 72 65 74 75 72  ll-formed, retur
0770: 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74  n false..*/.stat
0780: 69 63 20 69 6e 74 20 63 68 65 63 6b 5f 6e 61 6d  ic int check_nam
0790: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  e(const char *z)
07a0: 7b 0a 20 20 69 66 28 20 21 77 69 6b 69 5f 6e 61  {.  if( !wiki_na
07b0: 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d 65 64  me_is_wellformed
07c0: 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ((const unsigned
07d0: 20 63 68 61 72 20 2a 29 7a 29 20 29 7b 0a 20 20   char *)z) ){.  
07e0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
07f0: 57 69 6b 69 20 50 61 67 65 20 4e 61 6d 65 20 45  Wiki Page Name E
0800: 72 72 6f 72 22 29 3b 0a 20 20 20 20 40 20 54 68  rror");.    @ Th
0810: 65 20 77 69 6b 69 20 6e 61 6d 65 20 22 3c 73 70  e wiki name "<sp
0820: 61 6e 20 63 6c 61 73 73 3d 22 77 69 6b 69 45 72  an class="wikiEr
0830: 72 6f 72 22 3e 25 68 28 7a 29 3c 2f 73 70 61 6e  ror">%h(z)</span
0840: 3e 22 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 66  >" is not well-f
0850: 6f 72 6d 65 64 2e 0a 20 20 20 20 40 20 52 75 6c  ormed..    @ Rul
0860: 65 73 20 66 6f 72 20 77 69 6b 69 20 70 61 67 65  es for wiki page
0870: 20 6e 61 6d 65 73 3a 0a 20 20 20 20 77 65 6c 6c   names:.    well
0880: 5f 66 6f 72 6d 65 64 5f 77 69 6b 69 5f 6e 61 6d  _formed_wiki_nam
0890: 65 5f 72 75 6c 65 73 28 29 3b 0a 20 20 20 20 73  e_rules();.    s
08a0: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20  tyle_footer();. 
08b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
08c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
08d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
08e0: 20 74 61 67 69 64 20 61 73 73 6f 63 69 61 74 65   tagid associate
08f0: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  d with a particu
0900: 6c 61 72 20 77 69 6b 69 20 70 61 67 65 2e 0a 2a  lar wiki page..*
0910: 2f 0a 69 6e 74 20 77 69 6b 69 5f 74 61 67 69 64  /.int wiki_tagid
0920: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
0930: 67 65 4e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  geName){.  retur
0940: 6e 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  n db_int(0, "SEL
0950: 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20 74  ECT tagid FROM t
0960: 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65  ag WHERE tagname
0970: 3d 27 77 69 6b 69 2d 25 71 27 22 2c 7a 50 61 67  ='wiki-%q'",zPag
0980: 65 4e 61 6d 65 29 3b 0a 7d 0a 69 6e 74 20 77 69  eName);.}.int wi
0990: 6b 69 5f 74 61 67 69 64 32 28 63 6f 6e 73 74 20  ki_tagid2(const 
09a0: 63 68 61 72 20 2a 7a 50 72 65 66 69 78 2c 20 63  char *zPrefix, c
09b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 67 65  onst char *zPage
09c0: 4e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Name){.  return 
09d0: 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43  db_int(0, "SELEC
09e0: 54 20 74 61 67 69 64 20 46 52 4f 4d 20 74 61 67  T tagid FROM tag
09f0: 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 3d 27   WHERE tagname='
0a00: 77 69 6b 69 2d 25 71 2f 25 71 27 22 2c 0a 20 20  wiki-%q/%q'",.  
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 50                zP
0a20: 72 65 66 69 78 2c 20 7a 50 61 67 65 4e 61 6d 65  refix, zPageName
0a30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
0a40: 72 6e 20 74 68 65 20 52 49 44 20 6f 66 20 74 68  rn the RID of th
0a50: 65 20 6e 65 78 74 20 6f 72 20 70 72 65 76 69 6f  e next or previo
0a60: 75 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 20  us version of a 
0a70: 77 69 6b 69 20 70 61 67 65 2e 20 20 0a 2a 2a 20  wiki page.  .** 
0a80: 52 65 74 75 72 6e 20 30 20 69 66 20 72 69 64 20  Return 0 if rid 
0a90: 69 73 20 74 68 65 20 6c 61 73 74 2f 66 69 72 73  is the last/firs
0aa0: 74 20 76 65 72 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  t version..*/.in
0ab0: 74 20 77 69 6b 69 5f 6e 65 78 74 28 69 6e 74 20  t wiki_next(int 
0ac0: 74 61 67 69 64 2c 20 64 6f 75 62 6c 65 20 6d 74  tagid, double mt
0ad0: 69 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  ime){.  return d
0ae0: 62 5f 69 6e 74 28 30 2c 0a 20 20 20 20 20 22 53  b_int(0,.     "S
0af0: 45 4c 45 43 54 20 73 72 63 69 64 20 46 52 4f 4d  ELECT srcid FROM
0b00: 20 74 61 67 78 72 65 66 22 0a 20 20 20 20 20 22   tagxref".     "
0b10: 20 57 48 45 52 45 20 74 61 67 69 64 3d 25 64 20   WHERE tagid=%d 
0b20: 41 4e 44 20 6d 74 69 6d 65 3e 25 2e 31 36 67 22  AND mtime>%.16g"
0b30: 0a 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59  .     " ORDER BY
0b40: 20 6d 74 69 6d 65 20 41 53 43 20 4c 49 4d 49 54   mtime ASC LIMIT
0b50: 20 31 22 2c 0a 20 20 20 20 20 74 61 67 69 64 2c   1",.     tagid,
0b60: 20 6d 74 69 6d 65 29 3b 0a 7d 0a 69 6e 74 20 77   mtime);.}.int w
0b70: 69 6b 69 5f 70 72 65 76 28 69 6e 74 20 74 61 67  iki_prev(int tag
0b80: 69 64 2c 20 64 6f 75 62 6c 65 20 6d 74 69 6d 65  id, double mtime
0b90: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 69  ){.  return db_i
0ba0: 6e 74 28 30 2c 0a 20 20 20 20 20 22 53 45 4c 45  nt(0,.     "SELE
0bb0: 43 54 20 73 72 63 69 64 20 46 52 4f 4d 20 74 61  CT srcid FROM ta
0bc0: 67 78 72 65 66 22 0a 20 20 20 20 20 22 20 57 48  gxref".     " WH
0bd0: 45 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e 44  ERE tagid=%d AND
0be0: 20 6d 74 69 6d 65 3c 25 2e 31 36 67 22 0a 20 20   mtime<%.16g".  
0bf0: 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6d 74     " ORDER BY mt
0c00: 69 6d 65 20 44 45 53 43 20 4c 49 4d 49 54 20 31  ime DESC LIMIT 1
0c10: 22 2c 0a 20 20 20 20 20 74 61 67 69 64 2c 20 6d  ",.     tagid, m
0c20: 74 69 6d 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  time);.}.../*.**
0c30: 20 57 45 42 50 41 47 45 3a 20 68 6f 6d 65 0a 2a   WEBPAGE: home.*
0c40: 2a 20 57 45 42 50 41 47 45 3a 20 69 6e 64 65 78  * WEBPAGE: index
0c50: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 6e 6f 74  .** WEBPAGE: not
0c60: 5f 66 6f 75 6e 64 0a 2a 2a 0a 2a 2a 20 54 68 65  _found.**.** The
0c70: 20 2f 68 6f 6d 65 2c 20 2f 69 6e 64 65 78 2c 20   /home, /index, 
0c80: 61 6e 64 20 2f 6e 6f 74 5f 66 6f 75 6e 64 20 70  and /not_found p
0c90: 61 67 65 73 20 61 6c 6c 20 72 65 64 69 72 65 63  ages all redirec
0ca0: 74 20 74 6f 20 74 68 65 20 68 6f 6d 65 70 61 67  t to the homepag
0cb0: 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  e.** configured 
0cc0: 62 79 20 74 68 65 20 61 64 6d 69 6e 69 73 74 72  by the administr
0cd0: 61 74 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 68 6f  ator..*/.void ho
0ce0: 6d 65 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  me_page(void){. 
0cf0: 20 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65   char *zPageName
0d00: 20 3d 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65   = db_get("proje
0d10: 63 74 2d 6e 61 6d 65 22 2c 30 29 3b 0a 20 20 63  ct-name",0);.  c
0d20: 68 61 72 20 2a 7a 49 6e 64 65 78 50 61 67 65 20  har *zIndexPage 
0d30: 3d 20 64 62 5f 67 65 74 28 22 69 6e 64 65 78 2d  = db_get("index-
0d40: 70 61 67 65 22 2c 30 29 3b 0a 20 20 6c 6f 67 69  page",0);.  logi
0d50: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
0d60: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 7a 49 6e  als();.  if( zIn
0d70: 64 65 78 50 61 67 65 20 29 7b 0a 20 20 20 20 63  dexPage ){.    c
0d80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
0d90: 49 6e 66 6f 20 3d 20 50 28 22 50 41 54 48 5f 49  Info = P("PATH_I
0da0: 4e 46 4f 22 29 3b 0a 20 20 20 20 77 68 69 6c 65  NFO");.    while
0db0: 28 20 7a 49 6e 64 65 78 50 61 67 65 5b 30 5d 3d  ( zIndexPage[0]=
0dc0: 3d 27 2f 27 20 29 20 7a 49 6e 64 65 78 50 61 67  ='/' ) zIndexPag
0dd0: 65 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  e++;.    while( 
0de0: 7a 50 61 74 68 49 6e 66 6f 5b 30 5d 3d 3d 27 2f  zPathInfo[0]=='/
0df0: 27 20 29 20 7a 50 61 74 68 49 6e 66 6f 2b 2b 3b  ' ) zPathInfo++;
0e00: 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  .    if( fossil_
0e10: 73 74 72 63 6d 70 28 7a 49 6e 64 65 78 50 61 67  strcmp(zIndexPag
0e20: 65 2c 20 7a 50 61 74 68 49 6e 66 6f 29 3d 3d 30  e, zPathInfo)==0
0e30: 20 29 20 7a 49 6e 64 65 78 50 61 67 65 20 3d 20   ) zIndexPage = 
0e40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 49 6e  0;.  }.  if( zIn
0e50: 64 65 78 50 61 67 65 20 29 7b 0a 20 20 20 20 63  dexPage ){.    c
0e60: 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 25 73  gi_redirectf("%s
0e70: 2f 25 73 22 2c 20 67 2e 7a 54 6f 70 2c 20 7a 49  /%s", g.zTop, zI
0e80: 6e 64 65 78 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ndexPage);.  }. 
0e90: 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 52 64 57   if( !g.perm.RdW
0ea0: 69 6b 69 20 29 7b 0a 20 20 20 20 63 67 69 5f 72  iki ){.    cgi_r
0eb0: 65 64 69 72 65 63 74 66 28 22 25 73 2f 6c 6f 67  edirectf("%s/log
0ec0: 69 6e 3f 67 3d 25 73 2f 68 6f 6d 65 22 2c 20 67  in?g=%s/home", g
0ed0: 2e 7a 54 6f 70 2c 20 67 2e 7a 54 6f 70 29 3b 0a  .zTop, g.zTop);.
0ee0: 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 67 65 4e    }.  if( zPageN
0ef0: 61 6d 65 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e  ame ){.    login
0f00: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
0f10: 6c 73 28 29 3b 0a 20 20 20 20 67 2e 7a 45 78 74  ls();.    g.zExt
0f20: 72 61 20 3d 20 7a 50 61 67 65 4e 61 6d 65 3b 0a  ra = zPageName;.
0f30: 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61      cgi_set_para
0f40: 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 22 6e 61  meter_nocopy("na
0f50: 6d 65 22 2c 20 67 2e 7a 45 78 74 72 61 2c 20 31  me", g.zExtra, 1
0f60: 29 3b 0a 20 20 20 20 67 2e 69 73 48 6f 6d 65 20  );.    g.isHome 
0f70: 3d 20 31 3b 0a 20 20 20 20 77 69 6b 69 5f 70 61  = 1;.    wiki_pa
0f80: 67 65 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ge();.    return
0f90: 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65  ;.  }.  style_he
0fa0: 61 64 65 72 28 22 48 6f 6d 65 22 29 3b 0a 20 20  ader("Home");.  
0fb0: 40 20 3c 70 3e 54 68 69 73 20 69 73 20 61 20 73  @ <p>This is a s
0fc0: 74 75 62 20 68 6f 6d 65 2d 70 61 67 65 20 66 6f  tub home-page fo
0fd0: 72 20 74 68 65 20 70 72 6f 6a 65 63 74 2e 0a 20  r the project.. 
0fe0: 20 40 20 54 6f 20 66 69 6c 6c 20 69 6e 20 74 68   @ To fill in th
0ff0: 69 73 20 70 61 67 65 2c 20 66 69 72 73 74 20 67  is page, first g
1000: 6f 20 74 6f 0a 20 20 40 20 25 7a 28 68 72 65 66  o to.  @ %z(href
1010: 28 22 25 52 2f 73 65 74 75 70 5f 63 6f 6e 66 69  ("%R/setup_confi
1020: 67 22 29 29 73 65 74 75 70 2f 63 6f 6e 66 69 67  g"))setup/config
1030: 3c 2f 61 3e 0a 20 20 40 20 61 6e 64 20 65 73 74  </a>.  @ and est
1040: 61 62 6c 69 73 68 20 61 20 22 50 72 6f 6a 65 63  ablish a "Projec
1050: 74 20 4e 61 6d 65 22 2e 20 20 54 68 65 6e 20 63  t Name".  Then c
1060: 72 65 61 74 65 20 61 0a 20 20 40 20 77 69 6b 69  reate a.  @ wiki
1070: 20 70 61 67 65 20 77 69 74 68 20 74 68 61 74 20   page with that 
1080: 6e 61 6d 65 2e 20 20 54 68 65 20 63 6f 6e 74 65  name.  The conte
1090: 6e 74 20 6f 66 20 74 68 61 74 20 77 69 6b 69 20  nt of that wiki 
10a0: 70 61 67 65 0a 20 20 40 20 77 69 6c 6c 20 62 65  page.  @ will be
10b0: 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 70 6c   displayed in pl
10c0: 61 63 65 20 6f 66 20 74 68 69 73 20 6d 65 73 73  ace of this mess
10d0: 61 67 65 2e 3c 2f 70 3e 0a 20 20 73 74 79 6c 65  age.</p>.  style
10e0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
10f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1100: 69 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  if the given pag
1110: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
1120: 65 20 6f 66 20 74 68 65 20 73 61 6e 64 62 6f 78  e of the sandbox
1130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1140: 73 5f 73 61 6e 64 62 6f 78 28 63 6f 6e 73 74 20  s_sandbox(const 
1150: 63 68 61 72 20 2a 7a 50 61 67 65 6e 61 6d 65 29  char *zPagename)
1160: 7b 0a 20 20 72 65 74 75 72 6e 20 66 6f 73 73 69  {.  return fossi
1170: 6c 5f 73 74 72 69 63 6d 70 28 7a 50 61 67 65 6e  l_stricmp(zPagen
1180: 61 6d 65 2c 22 73 61 6e 64 62 6f 78 22 29 3d 3d  ame,"sandbox")==
1190: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 66 6f  0 ||.         fo
11a0: 73 73 69 6c 5f 73 74 72 69 63 6d 70 28 7a 50 61  ssil_stricmp(zPa
11b0: 67 65 6e 61 6d 65 2c 22 73 61 6e 64 20 62 6f 78  gename,"sand box
11c0: 22 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ")==0;.}../*.** 
11d0: 46 6f 72 6d 61 6c 2c 20 63 6f 6d 6d 6f 6e 20 61  Formal, common a
11e0: 6e 64 20 73 68 6f 72 74 20 6e 61 6d 65 73 20 66  nd short names f
11f0: 6f 72 20 74 68 65 20 76 61 72 69 6f 75 73 20 77  or the various w
1200: 69 6b 69 20 73 74 79 6c 65 73 2e 0a 2a 2f 0a 73  iki styles..*/.s
1210: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1220: 20 2a 63 6f 6e 73 74 20 61 7a 53 74 79 6c 65 73   *const azStyles
1230: 5b 5d 20 3d 20 7b 0a 20 20 22 74 65 78 74 2f 78  [] = {.  "text/x
1240: 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 2c 20 22  -fossil-wiki", "
1250: 46 6f 73 73 69 6c 20 57 69 6b 69 22 2c 20 22 77  Fossil Wiki", "w
1260: 69 6b 69 22 2c 0a 20 20 22 74 65 78 74 2f 78 2d  iki",.  "text/x-
1270: 6d 61 72 6b 64 6f 77 6e 22 2c 20 20 20 20 22 4d  markdown",    "M
1280: 61 72 6b 64 6f 77 6e 22 2c 20 20 20 20 22 6d 61  arkdown",    "ma
1290: 72 6b 64 6f 77 6e 22 2c 0a 20 20 22 74 65 78 74  rkdown",.  "text
12a0: 2f 70 6c 61 69 6e 22 2c 20 20 20 20 20 20 20 20  /plain",        
12b0: 20 22 50 6c 61 69 6e 20 54 65 78 74 22 2c 20 20   "Plain Text",  
12c0: 22 70 6c 61 69 6e 22 0a 7d 3b 0a 0a 2f 2a 0a 2a  "plain".};../*.*
12d0: 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 63 65 72  * Only allow cer
12e0: 74 61 69 6e 20 6d 69 6d 65 74 79 70 65 73 20 74  tain mimetypes t
12f0: 68 72 6f 75 67 68 2e 0a 2a 2a 20 41 6c 6c 20 6f  hrough..** All o
1300: 74 68 65 72 73 20 62 65 63 6f 6d 65 20 22 74 65  thers become "te
1310: 78 74 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69  xt/x-fossil-wiki
1320: 22 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ".*/.const char 
1330: 2a 77 69 6b 69 5f 66 69 6c 74 65 72 5f 6d 69 6d  *wiki_filter_mim
1340: 65 74 79 70 65 73 28 63 6f 6e 73 74 20 63 68 61  etypes(const cha
1350: 72 20 2a 7a 4d 69 6d 65 74 79 70 65 29 7b 0a 20  r *zMimetype){. 
1360: 20 69 66 28 20 7a 4d 69 6d 65 74 79 70 65 21 3d   if( zMimetype!=
1370: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
1380: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
1390: 6f 75 6e 74 28 61 7a 53 74 79 6c 65 73 29 3b 20  ount(azStyles); 
13a0: 69 2b 3d 33 29 7b 0a 20 20 20 20 20 20 69 66 28  i+=3){.      if(
13b0: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a   fossil_strcmp(z
13c0: 4d 69 6d 65 74 79 70 65 2c 61 7a 53 74 79 6c 65  Mimetype,azStyle
13d0: 73 5b 69 2b 32 5d 29 3d 3d 30 20 29 7b 0a 20 20  s[i+2])==0 ){.  
13e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 7a 53        return azS
13f0: 74 79 6c 65 73 5b 69 5d 3b 0a 20 20 20 20 20 20  tyles[i];.      
1400: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1410: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a   fossil_strcmp(z
1420: 4d 69 6d 65 74 79 70 65 2c 20 22 74 65 78 74 2f  Mimetype, "text/
1430: 78 2d 6d 61 72 6b 64 6f 77 6e 22 29 3d 3d 30 0a  x-markdown")==0.
1440: 20 20 20 20 20 20 20 20 7c 7c 20 66 6f 73 73 69          || fossi
1450: 6c 5f 73 74 72 63 6d 70 28 7a 4d 69 6d 65 74 79  l_strcmp(zMimety
1460: 70 65 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22  pe, "text/plain"
1470: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1480: 74 75 72 6e 20 7a 4d 69 6d 65 74 79 70 65 3b 0a  turn zMimetype;.
1490: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14a0: 72 6e 20 22 74 65 78 74 2f 78 2d 66 6f 73 73 69  rn "text/x-fossi
14b0: 6c 2d 77 69 6b 69 22 3b 0a 7d 0a 0a 2f 2a 0a 2a  l-wiki";.}../*.*
14c0: 2a 20 52 65 6e 64 65 72 20 77 69 6b 69 20 74 65  * Render wiki te
14d0: 78 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  xt according to 
14e0: 69 74 73 20 6d 69 6d 65 74 79 70 65 2e 0a 2a 2a  its mimetype..**
14f0: 0a 2a 2a 20 20 20 74 65 78 74 2f 78 2d 66 6f 73  .**   text/x-fos
1500: 73 69 6c 2d 77 69 6b 69 20 20 20 20 20 20 46 6f  sil-wiki      Fo
1510: 73 73 69 6c 20 77 69 6b 69 0a 2a 2a 20 20 20 74  ssil wiki.**   t
1520: 65 78 74 2f 78 2d 6d 61 72 6b 64 6f 77 6e 20 20  ext/x-markdown  
1530: 20 20 20 20 20 20 20 4d 61 72 6b 64 6f 77 6e 0a         Markdown.
1540: 2a 2a 20 20 20 61 6e 79 74 68 69 6e 67 20 65 6c  **   anything el
1550: 73 65 2e 2e 2e 20 20 20 20 20 20 20 20 50 6c 61  se...        Pla
1560: 69 6e 20 74 65 78 74 0a 2a 2f 0a 76 6f 69 64 20  in text.*/.void 
1570: 77 69 6b 69 5f 72 65 6e 64 65 72 5f 62 79 5f 6d  wiki_render_by_m
1580: 69 6d 65 74 79 70 65 28 42 6c 6f 62 20 2a 70 57  imetype(Blob *pW
1590: 69 6b 69 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iki, const char 
15a0: 2a 7a 4d 69 6d 65 74 79 70 65 29 7b 0a 20 20 69  *zMimetype){.  i
15b0: 66 28 20 7a 4d 69 6d 65 74 79 70 65 3d 3d 30 20  f( zMimetype==0 
15c0: 7c 7c 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70  || fossil_strcmp
15d0: 28 7a 4d 69 6d 65 74 79 70 65 2c 20 22 74 65 78  (zMimetype, "tex
15e0: 74 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22  t/x-fossil-wiki"
15f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6b 69  )==0 ){.    wiki
1600: 5f 63 6f 6e 76 65 72 74 28 70 57 69 6b 69 2c 20  _convert(pWiki, 
1610: 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  0, 0);.  }else i
1620: 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70  f( fossil_strcmp
1630: 28 7a 4d 69 6d 65 74 79 70 65 2c 20 22 74 65 78  (zMimetype, "tex
1640: 74 2f 78 2d 6d 61 72 6b 64 6f 77 6e 22 29 3d 3d  t/x-markdown")==
1650: 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 74 61  0 ){.    Blob ta
1660: 69 6c 20 3d 20 42 4c 4f 42 5f 49 4e 49 54 49 41  il = BLOB_INITIA
1670: 4c 49 5a 45 52 3b 0a 20 20 20 20 6d 61 72 6b 64  LIZER;.    markd
1680: 6f 77 6e 5f 74 6f 5f 68 74 6d 6c 28 70 57 69 6b  own_to_html(pWik
1690: 69 2c 20 30 2c 20 26 74 61 69 6c 29 3b 0a 20 20  i, 0, &tail);.  
16a0: 20 20 40 20 25 73 28 62 6c 6f 62 5f 73 74 72 28    @ %s(blob_str(
16b0: 26 74 61 69 6c 29 29 0a 20 20 20 20 62 6c 6f 62  &tail)).    blob
16c0: 5f 72 65 73 65 74 28 26 74 61 69 6c 29 3b 0a 20  _reset(&tail);. 
16d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 70   }else{.    @ <p
16e0: 72 65 20 63 6c 61 73 73 3d 27 74 65 78 74 50 6c  re class='textPl
16f0: 61 69 6e 27 3e 0a 20 20 20 20 40 20 25 68 28 62  ain'>.    @ %h(b
1700: 6c 6f 62 5f 73 74 72 28 70 57 69 6b 69 29 29 0a  lob_str(pWiki)).
1710: 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a 20 20 7d      @ </pre>.  }
1720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
1730: 45 3a 20 6d 64 5f 72 75 6c 65 73 0a 2a 2a 0a 2a  E: md_rules.**.*
1740: 2a 20 53 68 6f 77 20 61 20 73 75 6d 6d 61 72 79  * Show a summary
1750: 20 6f 66 20 74 68 65 20 4d 61 72 6b 64 6f 77 6e   of the Markdown
1760: 20 77 69 6b 69 20 66 6f 72 6d 61 74 74 69 6e 67   wiki formatting
1770: 20 72 75 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   rules..*/.void 
1780: 6d 61 72 6b 64 6f 77 6e 5f 72 75 6c 65 73 5f 70  markdown_rules_p
1790: 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f  age(void){.  Blo
17a0: 62 20 78 3b 0a 20 20 69 6e 74 20 66 54 78 74 20  b x;.  int fTxt 
17b0: 3d 20 50 28 22 74 78 74 22 29 21 3d 30 3b 0a 20  = P("txt")!=0;. 
17c0: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 4d   style_header("M
17d0: 61 72 6b 64 6f 77 6e 20 46 6f 72 6d 61 74 74 69  arkdown Formatti
17e0: 6e 67 20 52 75 6c 65 73 22 29 3b 0a 20 20 69 66  ng Rules");.  if
17f0: 28 20 66 54 78 74 20 29 7b 0a 20 20 20 20 73 74  ( fTxt ){.    st
1800: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
1810: 65 6e 74 28 22 46 6f 72 6d 61 74 74 65 64 22 2c  ent("Formatted",
1820: 20 22 25 52 2f 6d 64 5f 72 75 6c 65 73 22 29 3b   "%R/md_rules");
1830: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
1840: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
1850: 65 6e 74 28 22 50 6c 61 69 6e 2d 54 65 78 74 22  ent("Plain-Text"
1860: 2c 20 22 25 52 2f 6d 64 5f 72 75 6c 65 73 3f 74  , "%R/md_rules?t
1870: 78 74 3d 31 22 29 3b 0a 20 20 7d 0a 20 20 62 6c  xt=1");.  }.  bl
1880: 6f 62 5f 69 6e 69 74 28 26 78 2c 20 62 75 69 6c  ob_init(&x, buil
1890: 74 69 6e 5f 74 65 78 74 28 22 6d 61 72 6b 64 6f  tin_text("markdo
18a0: 77 6e 2e 6d 64 22 29 2c 20 2d 31 29 3b 0a 20 20  wn.md"), -1);.  
18b0: 77 69 6b 69 5f 72 65 6e 64 65 72 5f 62 79 5f 6d  wiki_render_by_m
18c0: 69 6d 65 74 79 70 65 28 26 78 2c 20 66 54 78 74  imetype(&x, fTxt
18d0: 20 3f 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20   ? "text/plain" 
18e0: 3a 20 22 74 65 78 74 2f 78 2d 6d 61 72 6b 64 6f  : "text/x-markdo
18f0: 77 6e 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73  wn");.  blob_res
1900: 65 74 28 26 78 29 3b 0a 20 20 73 74 79 6c 65 5f  et(&x);.  style_
1910: 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a  footer();.}../*.
1920: 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 69 6b 69  ** WEBPAGE: wiki
1930: 5f 72 75 6c 65 73 0a 2a 2a 0a 2a 2a 20 53 68 6f  _rules.**.** Sho
1940: 77 20 61 20 73 75 6d 6d 61 72 79 20 6f 66 20 74  w a summary of t
1950: 68 65 20 77 69 6b 69 20 66 6f 72 6d 61 74 74 69  he wiki formatti
1960: 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  ng rules..*/.voi
1970: 64 20 77 69 6b 69 5f 72 75 6c 65 73 5f 70 61 67  d wiki_rules_pag
1980: 65 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20  e(void){.  Blob 
1990: 78 3b 0a 20 20 69 6e 74 20 66 54 78 74 20 3d 20  x;.  int fTxt = 
19a0: 50 28 22 74 78 74 22 29 21 3d 30 3b 0a 20 20 73  P("txt")!=0;.  s
19b0: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 57 69 6b  tyle_header("Wik
19c0: 69 20 46 6f 72 6d 61 74 74 69 6e 67 20 52 75 6c  i Formatting Rul
19d0: 65 73 22 29 3b 0a 20 20 69 66 28 20 66 54 78 74  es");.  if( fTxt
19e0: 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75   ){.    style_su
19f0: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 46  bmenu_element("F
1a00: 6f 72 6d 61 74 74 65 64 22 2c 20 22 25 52 2f 77  ormatted", "%R/w
1a10: 69 6b 69 5f 72 75 6c 65 73 22 29 3b 0a 20 20 7d  iki_rules");.  }
1a20: 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c 65 5f  else{.    style_
1a30: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
1a40: 22 50 6c 61 69 6e 2d 54 65 78 74 22 2c 20 22 25  "Plain-Text", "%
1a50: 52 2f 77 69 6b 69 5f 72 75 6c 65 73 3f 74 78 74  R/wiki_rules?txt
1a60: 3d 31 22 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62  =1");.  }.  blob
1a70: 5f 69 6e 69 74 28 26 78 2c 20 62 75 69 6c 74 69  _init(&x, builti
1a80: 6e 5f 74 65 78 74 28 22 77 69 6b 69 2e 77 69 6b  n_text("wiki.wik
1a90: 69 22 29 2c 20 2d 31 29 3b 0a 20 20 77 69 6b 69  i"), -1);.  wiki
1aa0: 5f 72 65 6e 64 65 72 5f 62 79 5f 6d 69 6d 65 74  _render_by_mimet
1ab0: 79 70 65 28 26 78 2c 20 66 54 78 74 20 3f 20 22  ype(&x, fTxt ? "
1ac0: 74 65 78 74 2f 70 6c 61 69 6e 22 20 3a 20 22 74  text/plain" : "t
1ad0: 65 78 74 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b  ext/x-fossil-wik
1ae0: 69 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65  i");.  blob_rese
1af0: 74 28 26 78 29 3b 0a 20 20 73 74 79 6c 65 5f 66  t(&x);.  style_f
1b00: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
1b10: 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
1b20: 72 6f 20 69 66 20 6d 6f 64 65 72 61 74 69 6f 6e  ro if moderation
1b30: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
1b40: 20 77 69 6b 69 20 63 68 61 6e 67 65 73 20 61 6e   wiki changes an
1b50: 64 20 77 69 6b 69 0a 2a 2a 20 61 74 74 61 63 68  d wiki.** attach
1b60: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 77 69  ments..*/.int wi
1b70: 6b 69 5f 6e 65 65 64 5f 6d 6f 64 65 72 61 74 69  ki_need_moderati
1b80: 6f 6e 28 0a 20 20 69 6e 74 20 6c 6f 63 61 6c 55  on(.  int localU
1b90: 73 65 72 20 2f 2a 20 41 72 65 20 77 65 20 62 65  ser /* Are we be
1ba0: 69 6e 67 20 63 61 6c 6c 65 64 20 66 6f 72 20 61  ing called for a
1bb0: 20 6c 6f 63 61 6c 20 69 6e 74 65 72 61 63 74 69   local interacti
1bc0: 76 65 20 75 73 65 72 3f 20 2a 2f 0a 29 7b 0a 20  ve user? */.){. 
1bd0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
1be0: 46 4f 53 53 49 4c 5f 46 4f 52 43 45 5f 57 49 4b  FOSSIL_FORCE_WIK
1bf0: 49 5f 4d 4f 44 45 52 41 54 49 4f 4e 20 76 61 72  I_MODERATION var
1c00: 69 61 62 6c 65 20 69 73 20 73 65 74 2c 20 2a 41  iable is set, *A
1c10: 4c 4c 2a 20 63 68 61 6e 67 65 73 20 66 6f 72 0a  LL* changes for.
1c20: 20 20 2a 2a 20 77 69 6b 69 20 70 61 67 65 73 20    ** wiki pages 
1c30: 77 69 6c 6c 20 62 65 20 72 65 71 75 69 72 65 64  will be required
1c40: 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 6d   to go through m
1c50: 6f 64 65 72 61 74 69 6f 6e 20 28 65 76 65 6e 20  oderation (even 
1c60: 74 68 6f 73 65 20 70 65 72 66 6f 72 6d 65 64 0a  those performed.
1c70: 20 20 2a 2a 20 62 79 20 74 68 65 20 6c 6f 63 61    ** by the loca
1c80: 6c 20 69 6e 74 65 72 61 63 74 69 76 65 20 75 73  l interactive us
1c90: 65 72 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  er via the comma
1ca0: 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20  nd line).  This 
1cb0: 63 61 6e 20 62 65 20 75 73 65 66 75 6c 0a 20 20  can be useful.  
1cc0: 2a 2a 20 66 6f 72 20 6c 6f 63 61 6c 20 28 6f 72  ** for local (or
1cd0: 20 72 65 6d 6f 74 65 29 20 74 65 73 74 69 6e 67   remote) testing
1ce0: 20 6f 66 20 74 68 65 20 6d 6f 64 65 72 61 74 69   of the moderati
1cf0: 6f 6e 20 73 75 62 73 79 73 74 65 6d 20 61 6e 64  on subsystem and
1d00: 20 69 74 73 20 69 6d 70 61 63 74 0a 20 20 2a 2a   its impact.  **
1d10: 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
1d20: 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 77   and status of w
1d30: 69 6b 69 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  iki pages..  */.
1d40: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 67 65 74    if( fossil_get
1d50: 65 6e 76 28 22 46 4f 53 53 49 4c 5f 46 4f 52 43  env("FOSSIL_FORC
1d60: 45 5f 57 49 4b 49 5f 4d 4f 44 45 52 41 54 49 4f  E_WIKI_MODERATIO
1d70: 4e 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  N")!=0 ){.    re
1d80: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1d90: 28 20 6c 6f 63 61 6c 55 73 65 72 20 29 7b 0a 20  ( localUser ){. 
1da0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1db0: 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 65 72 6d  .  return g.perm
1dc0: 2e 4d 6f 64 57 69 6b 69 3d 3d 30 20 26 26 20 64  .ModWiki==0 && d
1dd0: 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 6d  b_get_boolean("m
1de0: 6f 64 72 65 71 2d 77 69 6b 69 22 2c 30 29 3d 3d  odreq-wiki",0)==
1df0: 31 3b 0a 7d 0a 0a 2f 2a 20 53 74 61 6e 64 61 72  1;.}../* Standar
1e00: 64 20 73 75 62 6d 65 6e 75 20 69 74 65 6d 73 20  d submenu items 
1e10: 66 6f 72 20 77 69 6b 69 20 70 61 67 65 73 20 2a  for wiki pages *
1e20: 2f 0a 23 64 65 66 69 6e 65 20 57 5f 53 52 43 48  /.#define W_SRCH
1e30: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 31 0a          0x00001.
1e40: 23 64 65 66 69 6e 65 20 57 5f 4c 49 53 54 20 20  #define W_LIST  
1e50: 20 20 20 20 20 20 30 78 30 30 30 30 32 0a 23 64        0x00002.#d
1e60: 65 66 69 6e 65 20 57 5f 48 45 4c 50 20 20 20 20  efine W_HELP    
1e70: 20 20 20 20 30 78 30 30 30 30 34 0a 23 64 65 66      0x00004.#def
1e80: 69 6e 65 20 57 5f 4e 45 57 20 20 20 20 20 20 20  ine W_NEW       
1e90: 20 20 30 78 30 30 30 30 38 0a 23 64 65 66 69 6e    0x00008.#defin
1ea0: 65 20 57 5f 42 4c 4f 47 20 20 20 20 20 20 20 20  e W_BLOG        
1eb0: 30 78 30 30 30 31 30 0a 23 64 65 66 69 6e 65 20  0x00010.#define 
1ec0: 57 5f 53 41 4e 44 42 4f 58 20 20 20 20 20 30 78  W_SANDBOX     0x
1ed0: 30 30 30 32 30 0a 23 64 65 66 69 6e 65 20 57 5f  00020.#define W_
1ee0: 41 4c 4c 20 20 20 20 20 20 20 20 20 30 78 30 30  ALL         0x00
1ef0: 30 31 66 0a 23 64 65 66 69 6e 65 20 57 5f 41 4c  01f.#define W_AL
1f00: 4c 5f 42 55 54 28 78 29 20 20 28 57 5f 41 4c 4c  L_BUT(x)  (W_ALL
1f10: 26 7e 28 78 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  &~(x))../*.** Ad
1f20: 64 20 73 6f 6d 65 20 73 74 61 6e 64 61 72 64 20  d some standard 
1f30: 73 75 62 6d 65 6e 75 20 65 6c 65 6d 65 6e 74 73  submenu elements
1f40: 20 66 6f 72 20 77 69 6b 69 20 73 63 72 65 65 6e   for wiki screen
1f50: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1f60: 64 20 77 69 6b 69 5f 73 74 61 6e 64 61 72 64 5f  d wiki_standard_
1f70: 73 75 62 6d 65 6e 75 28 75 6e 73 69 67 6e 65 64  submenu(unsigned
1f80: 20 69 6e 74 20 6f 6b 29 7b 0a 20 20 69 66 28 20   int ok){.  if( 
1f90: 28 6f 6b 20 26 20 57 5f 53 52 43 48 29 21 3d 30  (ok & W_SRCH)!=0
1fa0: 20 26 26 20 73 65 61 72 63 68 5f 72 65 73 74 72   && search_restr
1fb0: 69 63 74 28 53 52 43 48 5f 57 49 4b 49 29 21 3d  ict(SRCH_WIKI)!=
1fc0: 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73  0 ){.    style_s
1fd0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
1fe0: 53 65 61 72 63 68 22 2c 20 22 25 52 2f 77 69 6b  Search", "%R/wik
1ff0: 69 73 72 63 68 22 29 3b 0a 20 20 7d 0a 20 20 69  isrch");.  }.  i
2000: 66 28 20 28 6f 6b 20 26 20 57 5f 4c 49 53 54 29  f( (ok & W_LIST)
2010: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65  !=0 ){.    style
2020: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
2030: 28 22 4c 69 73 74 22 2c 20 22 25 52 2f 77 63 6f  ("List", "%R/wco
2040: 6e 74 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 69  ntent");.  }.  i
2050: 66 28 20 28 6f 6b 20 26 20 57 5f 48 45 4c 50 29  f( (ok & W_HELP)
2060: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65  !=0 ){.    style
2070: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
2080: 28 22 48 65 6c 70 22 2c 20 22 25 52 2f 77 69 6b  ("Help", "%R/wik
2090: 69 68 65 6c 70 22 29 3b 0a 20 20 7d 0a 20 20 69  ihelp");.  }.  i
20a0: 66 28 20 28 6f 6b 20 26 20 57 5f 4e 45 57 29 21  f( (ok & W_NEW)!
20b0: 3d 30 20 26 26 20 67 2e 61 6e 6f 6e 2e 4e 65 77  =0 && g.anon.New
20c0: 57 69 6b 69 20 29 7b 0a 20 20 20 20 73 74 79 6c  Wiki ){.    styl
20d0: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
20e0: 74 28 22 4e 65 77 22 2c 20 22 25 52 2f 77 69 6b  t("New", "%R/wik
20f0: 69 6e 65 77 22 29 3b 0a 20 20 7d 0a 20 20 69 66  inew");.  }.  if
2100: 28 20 28 6f 6b 20 26 20 57 5f 53 41 4e 44 42 4f  ( (ok & W_SANDBO
2110: 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79  X)!=0 ){.    sty
2120: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
2130: 6e 74 28 22 53 61 6e 64 62 6f 78 22 2c 20 22 25  nt("Sandbox", "%
2140: 52 2f 77 69 6b 69 3f 6e 61 6d 65 3d 53 61 6e 64  R/wiki?name=Sand
2150: 62 6f 78 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  box");.  }.}../*
2160: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 69 6b  .** WEBPAGE: wik
2170: 69 68 65 6c 70 0a 2a 2a 20 41 20 67 65 6e 65 72  ihelp.** A gener
2180: 69 63 20 6c 61 6e 64 69 6e 67 20 70 61 67 65 20  ic landing page 
2190: 66 6f 72 20 77 69 6b 69 2e 0a 2a 2f 0a 76 6f 69  for wiki..*/.voi
21a0: 64 20 77 69 6b 69 5f 68 65 6c 70 70 61 67 65 28  d wiki_helppage(
21b0: 76 6f 69 64 29 7b 0a 20 20 6c 6f 67 69 6e 5f 63  void){.  login_c
21c0: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
21d0: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 65 72  ();.  if( !g.per
21e0: 6d 2e 52 64 57 69 6b 69 20 29 7b 20 6c 6f 67 69  m.RdWiki ){ logi
21f0: 6e 5f 6e 65 65 64 65 64 28 67 2e 61 6e 6f 6e 2e  n_needed(g.anon.
2200: 52 64 57 69 6b 69 29 3b 20 72 65 74 75 72 6e 3b  RdWiki); return;
2210: 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65   }.  style_heade
2220: 72 28 22 57 69 6b 69 20 48 65 6c 70 22 29 3b 0a  r("Wiki Help");.
2230: 20 20 77 69 6b 69 5f 73 74 61 6e 64 61 72 64 5f    wiki_standard_
2240: 73 75 62 6d 65 6e 75 28 57 5f 41 4c 4c 5f 42 55  submenu(W_ALL_BU
2250: 54 28 57 5f 48 45 4c 50 29 29 3b 0a 20 20 40 20  T(W_HELP));.  @ 
2260: 3c 68 32 3e 57 69 6b 69 20 4c 69 6e 6b 73 3c 2f  <h2>Wiki Links</
2270: 68 32 3e 0a 20 20 40 20 3c 75 6c 3e 0a 20 20 40  h2>.  @ <ul>.  @
2280: 20 3c 6c 69 3e 20 25 7a 28 68 72 65 66 28 22 25   <li> %z(href("%
2290: 52 2f 74 69 6d 65 6c 69 6e 65 3f 79 3d 77 22 29  R/timeline?y=w")
22a0: 29 52 65 63 65 6e 74 20 63 68 61 6e 67 65 73 3c  )Recent changes<
22b0: 2f 61 3e 20 74 6f 20 77 69 6b 69 20 70 61 67 65  /a> to wiki page
22c0: 73 2e 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 3e  s.</li>.  @ <li>
22d0: 20 46 6f 72 6d 61 74 74 69 6e 67 20 72 75 6c 65   Formatting rule
22e0: 73 20 66 6f 72 20 25 7a 28 68 72 65 66 28 22 25  s for %z(href("%
22f0: 52 2f 77 69 6b 69 5f 72 75 6c 65 73 22 29 29 46  R/wiki_rules"))F
2300: 6f 73 73 69 6c 20 57 69 6b 69 3c 2f 61 3e 20 61  ossil Wiki</a> a
2310: 6e 64 20 66 6f 72 0a 20 20 40 20 25 7a 28 68 72  nd for.  @ %z(hr
2320: 65 66 28 22 25 52 2f 6d 64 5f 72 75 6c 65 73 22  ef("%R/md_rules"
2330: 29 29 4d 61 72 6b 64 6f 77 6e 20 57 69 6b 69 3c  ))Markdown Wiki<
2340: 2f 61 3e 2e 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c  /a>.</li>.  @ <l
2350: 69 3e 20 55 73 65 20 74 68 65 20 25 7a 28 68 72  i> Use the %z(hr
2360: 65 66 28 22 25 52 2f 77 69 6b 69 3f 6e 61 6d 65  ef("%R/wiki?name
2370: 3d 53 61 6e 64 62 6f 78 22 29 29 53 61 6e 64 62  =Sandbox"))Sandb
2380: 6f 78 3c 2f 61 3e 0a 20 20 40 20 20 20 20 20 20  ox</a>.  @      
2390: 74 6f 20 65 78 70 65 72 69 6d 65 6e 74 2e 3c 2f  to experiment.</
23a0: 6c 69 3e 0a 20 20 69 66 28 20 67 2e 70 65 72 6d  li>.  if( g.perm
23b0: 2e 4e 65 77 57 69 6b 69 20 29 7b 0a 20 20 20 20  .NewWiki ){.    
23c0: 40 20 3c 6c 69 3e 20 20 43 72 65 61 74 65 20 61  @ <li>  Create a
23d0: 20 25 7a 28 68 72 65 66 28 22 25 52 2f 77 69 6b   %z(href("%R/wik
23e0: 69 6e 65 77 22 29 29 6e 65 77 20 77 69 6b 69 20  inew"))new wiki 
23f0: 70 61 67 65 3c 2f 61 3e 2e 3c 2f 6c 69 3e 0a 20  page</a>.</li>. 
2400: 20 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 57 72     if( g.perm.Wr
2410: 69 74 65 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  ite ){.      @ <
2420: 6c 69 3e 20 20 20 43 72 65 61 74 65 20 61 20 25  li>   Create a %
2430: 7a 28 68 72 65 66 28 22 25 52 2f 74 65 63 68 6e  z(href("%R/techn
2440: 6f 74 65 65 64 69 74 22 29 29 6e 65 77 20 74 65  oteedit"))new te
2450: 63 68 2d 6e 6f 74 65 3c 2f 61 3e 2e 3c 2f 6c 69  ch-note</a>.</li
2460: 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40 20  >.    }.  }.  @ 
2470: 3c 6c 69 3e 20 25 7a 28 68 72 65 66 28 22 25 52  <li> %z(href("%R
2480: 2f 77 63 6f 6e 74 65 6e 74 22 29 29 4c 69 73 74  /wcontent"))List
2490: 20 6f 66 20 41 6c 6c 20 57 69 6b 69 20 50 61 67   of All Wiki Pag
24a0: 65 73 3c 2f 61 3e 0a 20 20 40 20 20 20 20 20 20  es</a>.  @      
24b0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69  available on thi
24c0: 73 20 73 65 72 76 65 72 2e 3c 2f 6c 69 3e 0a 20  s server.</li>. 
24d0: 20 69 66 28 20 67 2e 70 65 72 6d 2e 4d 6f 64 57   if( g.perm.ModW
24e0: 69 6b 69 20 29 7b 0a 20 20 20 20 40 20 3c 6c 69  iki ){.    @ <li
24f0: 3e 20 25 7a 28 68 72 65 66 28 22 25 52 2f 6d 6f  > %z(href("%R/mo
2500: 64 72 65 71 22 29 29 54 65 6e 64 20 74 6f 20 70  dreq"))Tend to p
2510: 65 6e 64 69 6e 67 20 6d 6f 64 65 72 61 74 69 6f  ending moderatio
2520: 6e 20 72 65 71 75 65 73 74 73 3c 2f 61 3e 3c 2f  n requests</a></
2530: 6c 69 3e 0a 20 20 7d 0a 20 20 69 66 28 20 73 65  li>.  }.  if( se
2540: 61 72 63 68 5f 72 65 73 74 72 69 63 74 28 53 52  arch_restrict(SR
2550: 43 48 5f 57 49 4b 49 29 21 3d 30 20 29 7b 0a 20  CH_WIKI)!=0 ){. 
2560: 20 20 20 40 20 3c 6c 69 3e 20 25 7a 28 68 72 65     @ <li> %z(hre
2570: 66 28 22 25 52 2f 77 69 6b 69 73 72 63 68 22 29  f("%R/wikisrch")
2580: 29 53 65 61 72 63 68 3c 2f 61 3e 20 66 6f 72 20  )Search</a> for 
2590: 77 69 6b 69 20 70 61 67 65 73 20 63 6f 6e 74 61  wiki pages conta
25a0: 69 6e 69 6e 67 20 6b 65 79 0a 20 20 20 20 40 20  ining key.    @ 
25b0: 77 6f 72 64 73 3c 2f 6c 69 3e 0a 20 20 7d 0a 20  words</li>.  }. 
25c0: 20 40 20 3c 2f 75 6c 3e 0a 20 20 73 74 79 6c 65   @ </ul>.  style
25d0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 72 65 74  _footer();.  ret
25e0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  urn;.}../*.** WE
25f0: 42 50 41 47 45 3a 20 77 69 6b 69 73 72 63 68 0a  BPAGE: wikisrch.
2600: 2a 2a 20 55 73 61 67 65 3a 20 20 2f 77 69 6b 69  ** Usage:  /wiki
2610: 73 72 63 68 3f 73 3d 50 41 54 54 45 52 4e 0a 2a  srch?s=PATTERN.*
2620: 2a 0a 2a 2a 20 46 75 6c 6c 2d 74 65 78 74 20 73  *.** Full-text s
2630: 65 61 72 63 68 20 6f 66 20 61 6c 6c 20 63 75 72  earch of all cur
2640: 72 65 6e 74 20 77 69 6b 69 20 74 65 78 74 0a 2a  rent wiki text.*
2650: 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 73 72 63 68  /.void wiki_srch
2660: 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 6c 6f  page(void){.  lo
2670: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
2680: 74 69 61 6c 73 28 29 3b 0a 20 20 73 74 79 6c 65  tials();.  style
2690: 5f 68 65 61 64 65 72 28 22 57 69 6b 69 20 53 65  _header("Wiki Se
26a0: 61 72 63 68 22 29 3b 0a 20 20 77 69 6b 69 5f 73  arch");.  wiki_s
26b0: 74 61 6e 64 61 72 64 5f 73 75 62 6d 65 6e 75 28  tandard_submenu(
26c0: 57 5f 48 45 4c 50 7c 57 5f 4c 49 53 54 7c 57 5f  W_HELP|W_LIST|W_
26d0: 53 41 4e 44 42 4f 58 29 3b 0a 20 20 73 65 61 72  SANDBOX);.  sear
26e0: 63 68 5f 73 63 72 65 65 6e 28 53 52 43 48 5f 57  ch_screen(SRCH_W
26f0: 49 4b 49 2c 20 30 29 3b 0a 20 20 73 74 79 6c 65  IKI, 0);.  style
2700: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
2710: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 20 66   Return values f
2720: 72 6f 6d 20 77 69 6b 69 5f 70 61 67 65 5f 74 79  rom wiki_page_ty
2730: 70 65 28 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  pe() */.#define 
2740: 57 49 4b 49 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  WIKITYPE_UNKNOWN
2750: 20 20 20 20 28 2d 31 29 0a 23 64 65 66 69 6e 65      (-1).#define
2760: 20 57 49 4b 49 54 59 50 45 5f 4e 4f 52 4d 41 4c   WIKITYPE_NORMAL
2770: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 57       0.#define W
2780: 49 4b 49 54 59 50 45 5f 42 52 41 4e 43 48 20 20  IKITYPE_BRANCH  
2790: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4b     1.#define WIK
27a0: 49 54 59 50 45 5f 43 48 45 43 4b 49 4e 20 20 20  ITYPE_CHECKIN   
27b0: 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 54   2.#define WIKIT
27c0: 59 50 45 5f 54 41 47 20 20 20 20 20 20 20 20 33  YPE_TAG        3
27d0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 67 75 72 65 20 6f  ../*.** Figure o
27e0: 75 74 20 77 68 61 74 20 74 79 70 65 20 6f 66 20  ut what type of 
27f0: 77 69 6b 69 20 70 61 67 65 20 77 65 20 61 72 65  wiki page we are
2800: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 2e 0a 2a   dealing with..*
2810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6b  /.static int wik
2820: 69 5f 70 61 67 65 5f 74 79 70 65 28 63 6f 6e 73  i_page_type(cons
2830: 74 20 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d  t char *zPageNam
2840: 65 29 7b 0a 20 20 69 66 28 20 64 62 5f 67 65 74  e){.  if( db_get
2850: 5f 62 6f 6f 6c 65 61 6e 28 22 77 69 6b 69 2d 61  _boolean("wiki-a
2860: 62 6f 75 74 22 2c 31 29 3d 3d 30 20 29 7b 0a 20  bout",1)==0 ){. 
2870: 20 20 20 72 65 74 75 72 6e 20 57 49 4b 49 54 59     return WIKITY
2880: 50 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 65 6c  PE_NORMAL;.  }el
2890: 73 65 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  se.  if( sqlite3
28a0: 5f 73 74 72 67 6c 6f 62 28 22 63 68 65 63 6b 69  _strglob("checki
28b0: 6e 2f 2a 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29  n/*", zPageName)
28c0: 3d 3d 30 20 0a 20 20 20 26 26 20 64 62 5f 65 78  ==0 .   && db_ex
28d0: 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46  ists("SELECT 1 F
28e0: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75  ROM blob WHERE u
28f0: 75 69 64 3d 25 51 22 2c 7a 50 61 67 65 4e 61 6d  uid=%Q",zPageNam
2900: 65 2b 38 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  e+8).  ){.    re
2910: 74 75 72 6e 20 57 49 4b 49 54 59 50 45 5f 43 48  turn WIKITYPE_CH
2920: 45 43 4b 49 4e 3b 0a 20 20 7d 65 6c 73 65 0a 20  ECKIN;.  }else. 
2930: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2940: 67 6c 6f 62 28 22 62 72 61 6e 63 68 2f 2a 22 2c  glob("branch/*",
2950: 20 7a 50 61 67 65 4e 61 6d 65 29 3d 3d 30 20 29   zPageName)==0 )
2960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 49 4b  {.    return WIK
2970: 49 54 59 50 45 5f 42 52 41 4e 43 48 3b 0a 20 20  ITYPE_BRANCH;.  
2980: 7d 65 6c 73 65 0a 20 20 69 66 28 20 73 71 6c 69  }else.  if( sqli
2990: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 74 61 67  te3_strglob("tag
29a0: 2f 2a 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3d  /*", zPageName)=
29b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
29c0: 20 57 49 4b 49 54 59 50 45 5f 54 41 47 3b 0a 20   WIKITYPE_TAG;. 
29d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 49 4b 49   }.  return WIKI
29e0: 54 59 50 45 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a  TYPE_NORMAL;.}..
29f0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 70 70  /*.** Add an app
2a00: 72 6f 70 72 69 61 74 65 20 73 74 79 6c 65 5f 68  ropriate style_h
2a10: 65 61 64 65 72 28 29 20 66 6f 72 20 65 69 74 68  eader() for eith
2a20: 65 72 20 74 68 65 20 2f 77 69 6b 69 20 6f 72 20  er the /wiki or 
2a30: 2f 77 69 6b 69 65 64 69 74 20 70 61 67 65 0a 2a  /wikiedit page.*
2a40: 2a 20 66 6f 72 20 7a 50 61 67 65 4e 61 6d 65 2e  * for zPageName.
2a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2a60: 69 6b 69 5f 70 61 67 65 5f 68 65 61 64 65 72 28  iki_page_header(
2a70: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a90: 50 61 67 65 20 74 79 70 65 2e 20 20 2d 31 20 66  Page type.  -1 f
2aa0: 6f 72 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  or unknown */.  
2ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 67  const char *zPag
2ac0: 65 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  eName,    /* Nam
2ad0: 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  e of the page */
2ae0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2af0: 45 78 74 72 61 20 20 20 20 20 20 20 20 2f 2a 20  Extra        /* 
2b00: 45 78 74 72 61 20 70 72 65 66 69 78 20 74 65 78  Extra prefix tex
2b10: 74 20 6f 6e 20 74 68 65 20 70 61 67 65 20 68 65  t on the page he
2b20: 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ader */.){.  if(
2b30: 20 65 54 79 70 65 3c 30 20 29 20 65 54 79 70 65   eType<0 ) eType
2b40: 20 3d 20 77 69 6b 69 5f 70 61 67 65 5f 74 79 70   = wiki_page_typ
2b50: 65 28 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  e(zPageName);.  
2b60: 73 77 69 74 63 68 28 20 65 54 79 70 65 20 29 7b  switch( eType ){
2b70: 0a 20 20 20 20 63 61 73 65 20 57 49 4b 49 54 59  .    case WIKITY
2b80: 50 45 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20  PE_NORMAL: {.   
2b90: 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28     style_header(
2ba0: 22 25 73 25 73 22 2c 20 7a 45 78 74 72 61 2c 20  "%s%s", zExtra, 
2bb0: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20  zPageName);.    
2bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2bd0: 20 20 20 63 61 73 65 20 57 49 4b 49 54 59 50 45     case WIKITYPE
2be0: 5f 43 48 45 43 4b 49 4e 3a 20 7b 0a 20 20 20 20  _CHECKIN: {.    
2bf0: 20 20 7a 50 61 67 65 4e 61 6d 65 20 2b 3d 20 38    zPageName += 8
2c00: 3b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 68 65  ;.      style_he
2c10: 61 64 65 72 28 22 4e 6f 74 65 73 20 41 62 6f 75  ader("Notes Abou
2c20: 74 20 43 68 65 63 6b 69 6e 20 25 53 22 2c 20 7a  t Checkin %S", z
2c30: 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20  PageName);.     
2c40: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
2c50: 6c 65 6d 65 6e 74 28 22 43 68 65 63 6b 69 6e 20  lement("Checkin 
2c60: 54 69 6d 65 6c 69 6e 65 22 2c 22 25 52 2f 74 69  Timeline","%R/ti
2c70: 6d 65 6c 69 6e 65 3f 66 3d 25 73 22 2c 20 7a 50  meline?f=%s", zP
2c80: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ageName);.      
2c90: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
2ca0: 65 6d 65 6e 74 28 22 43 68 65 63 6b 69 6e 20 49  ement("Checkin I
2cb0: 6e 66 6f 22 2c 22 25 52 2f 69 6e 66 6f 2f 25 73  nfo","%R/info/%s
2cc0: 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20  ", zPageName);. 
2cd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ce0: 7d 0a 20 20 20 20 63 61 73 65 20 57 49 4b 49 54  }.    case WIKIT
2cf0: 59 50 45 5f 42 52 41 4e 43 48 3a 20 7b 0a 20 20  YPE_BRANCH: {.  
2d00: 20 20 20 20 7a 50 61 67 65 4e 61 6d 65 20 2b 3d      zPageName +=
2d10: 20 37 3b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f   7;.      style_
2d20: 68 65 61 64 65 72 28 22 4e 6f 74 65 73 20 41 62  header("Notes Ab
2d30: 6f 75 74 20 42 72 61 6e 63 68 20 25 68 22 2c 20  out Branch %h", 
2d40: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20  zPageName);.    
2d50: 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
2d60: 65 6c 65 6d 65 6e 74 28 22 42 72 61 6e 63 68 20  element("Branch 
2d70: 54 69 6d 65 6c 69 6e 65 22 2c 22 25 52 2f 74 69  Timeline","%R/ti
2d80: 6d 65 6c 69 6e 65 3f 72 3d 25 74 22 2c 20 7a 50  meline?r=%t", zP
2d90: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ageName);.      
2da0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2db0: 20 63 61 73 65 20 57 49 4b 49 54 59 50 45 5f 54   case WIKITYPE_T
2dc0: 41 47 3a 20 7b 0a 20 20 20 20 20 20 7a 50 61 67  AG: {.      zPag
2dd0: 65 4e 61 6d 65 20 2b 3d 20 34 3b 0a 20 20 20 20  eName += 4;.    
2de0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
2df0: 4e 6f 74 65 73 20 41 62 6f 75 74 20 54 61 67 20  Notes About Tag 
2e00: 25 68 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b  %h", zPageName);
2e10: 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  .      style_sub
2e20: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 54 61  menu_element("Ta
2e30: 67 20 54 69 6d 65 6c 69 6e 65 22 2c 22 25 52 2f  g Timeline","%R/
2e40: 74 69 6d 65 6c 69 6e 65 3f 74 3d 25 74 22 2c 7a  timeline?t=%t",z
2e50: 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20  PageName);.     
2e60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2e70: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
2e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6b 69 20  ;.}../*.** Wiki 
2e90: 70 61 67 65 73 20 77 69 74 68 20 73 70 65 63 69  pages with speci
2ea0: 61 6c 20 6e 61 6d 65 73 20 22 62 72 61 6e 63 68  al names "branch
2eb0: 2f 2e 2e 2e 22 2c 20 22 63 68 65 63 6b 69 6e 2f  /...", "checkin/
2ec0: 2e 2e 2e 22 2c 20 61 6e 64 20 22 74 61 67 2f 2e  ...", and "tag/.
2ed0: 2e 2e 22 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  ..".** requires 
2ee0: 70 65 72 6d 2e 57 72 69 74 65 20 70 72 69 76 69  perm.Write privi
2ef0: 6c 65 67 65 20 69 6e 20 61 64 64 69 74 69 6f 6e  lege in addition
2f00: 20 74 6f 20 70 65 72 6d 2e 57 72 57 69 6b 69 20   to perm.WrWiki 
2f10: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 77  in order.** to w
2f20: 72 69 74 65 2e 20 20 54 68 69 73 20 66 75 6e 63  rite.  This func
2f30: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
2f40: 77 68 65 74 68 65 72 20 74 68 65 20 65 78 74 72  whether the extr
2f50: 61 20 70 65 72 6d 2e 57 72 69 74 65 0a 2a 2a 20  a perm.Write.** 
2f60: 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20  is required and 
2f70: 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 74 75  available.  Retu
2f80: 72 6e 20 74 72 75 65 20 69 66 20 77 72 69 74 69  rn true if writi
2f90: 6e 67 20 74 6f 20 74 68 65 20 77 69 6b 69 20 70  ng to the wiki p
2fa0: 61 67 65 0a 2a 2a 20 6d 61 79 20 70 72 6f 63 65  age.** may proce
2fb0: 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 66  ed, and return f
2fc0: 61 6c 73 65 20 69 66 20 70 65 72 6d 69 73 73 69  alse if permissi
2fd0: 6f 6e 20 69 73 20 6c 61 63 6b 69 6e 67 2e 0a 2a  on is lacking..*
2fe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6b  /.static int wik
2ff0: 69 5f 73 70 65 63 69 61 6c 5f 70 65 72 6d 69 73  i_special_permis
3000: 73 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  sion(const char 
3010: 2a 7a 50 61 67 65 4e 61 6d 65 29 7b 0a 20 20 69  *zPageName){.  i
3020: 66 28 20 73 74 72 6e 63 6d 70 28 7a 50 61 67 65  f( strncmp(zPage
3030: 4e 61 6d 65 2c 22 62 72 61 6e 63 68 2f 22 2c 37  Name,"branch/",7
3040: 29 21 3d 30 0a 20 20 20 26 26 20 73 74 72 6e 63  )!=0.   && strnc
3050: 6d 70 28 7a 50 61 67 65 4e 61 6d 65 2c 22 63 68  mp(zPageName,"ch
3060: 65 63 6b 69 6e 2f 22 2c 38 29 21 3d 30 0a 20 20  eckin/",8)!=0.  
3070: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 50 61 67   && strncmp(zPag
3080: 65 4e 61 6d 65 2c 22 74 61 67 2f 22 2c 34 29 21  eName,"tag/",4)!
3090: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
30a0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
30b0: 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22  db_get_boolean("
30c0: 77 69 6b 69 2d 61 62 6f 75 74 22 2c 31 29 3d 3d  wiki-about",1)==
30d0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
30e0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
30f0: 67 2e 70 65 72 6d 2e 57 72 69 74 65 3b 0a 7d 0a  g.perm.Write;.}.
3100: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
3110: 77 69 6b 69 0a 2a 2a 20 55 52 4c 3a 20 2f 77 69  wiki.** URL: /wi
3120: 6b 69 3f 6e 61 6d 65 3d 50 41 47 45 4e 41 4d 45  ki?name=PAGENAME
3130: 0a 2a 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 70 61  .*/.void wiki_pa
3140: 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72  ge(void){.  char
3150: 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74 20 72 69   *zTag;.  int ri
3160: 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53  d = 0;.  int isS
3170: 61 6e 64 62 6f 78 3b 0a 20 20 75 6e 73 69 67 6e  andbox;.  unsign
3180: 65 64 20 73 75 62 6d 65 6e 75 46 6c 61 67 73 20  ed submenuFlags 
3190: 3d 20 57 5f 48 45 4c 50 3b 0a 20 20 42 6c 6f 62  = W_HELP;.  Blob
31a0: 20 77 69 6b 69 3b 0a 20 20 4d 61 6e 69 66 65 73   wiki;.  Manifes
31b0: 74 20 2a 70 57 69 6b 69 20 3d 20 30 3b 0a 20 20  t *pWiki = 0;.  
31c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 67  const char *zPag
31d0: 65 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  eName;.  const c
31e0: 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65 20 3d  har *zMimetype =
31f0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6f 64   0;.  char *zBod
3200: 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22  y = mprintf("%s"
3210: 2c 22 3c 69 3e 45 6d 70 74 79 20 50 61 67 65 3c  ,"<i>Empty Page<
3220: 2f 69 3e 22 29 3b 0a 0a 20 20 6c 6f 67 69 6e 5f  /i>");..  login_
3230: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
3240: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 65  s();.  if( !g.pe
3250: 72 6d 2e 52 64 57 69 6b 69 20 29 7b 20 6c 6f 67  rm.RdWiki ){ log
3260: 69 6e 5f 6e 65 65 64 65 64 28 67 2e 61 6e 6f 6e  in_needed(g.anon
3270: 2e 52 64 57 69 6b 69 29 3b 20 72 65 74 75 72 6e  .RdWiki); return
3280: 3b 20 7d 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20  ; }.  zPageName 
3290: 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20 20 69  = P("name");.  i
32a0: 66 28 20 7a 50 61 67 65 4e 61 6d 65 3d 3d 30 20  f( zPageName==0 
32b0: 29 7b 0a 20 20 20 20 69 66 28 20 73 65 61 72 63  ){.    if( searc
32c0: 68 5f 72 65 73 74 72 69 63 74 28 53 52 43 48 5f  h_restrict(SRCH_
32d0: 57 49 4b 49 29 21 3d 30 20 29 7b 0a 20 20 20 20  WIKI)!=0 ){.    
32e0: 20 20 77 69 6b 69 5f 73 72 63 68 70 61 67 65 28    wiki_srchpage(
32f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
3300: 20 20 20 20 77 69 6b 69 5f 68 65 6c 70 70 61 67      wiki_helppag
3310: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  e();.    }.    r
3320: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
3330: 20 63 68 65 63 6b 5f 6e 61 6d 65 28 7a 50 61 67   check_name(zPag
3340: 65 4e 61 6d 65 29 20 29 20 72 65 74 75 72 6e 3b  eName) ) return;
3350: 0a 20 20 69 73 53 61 6e 64 62 6f 78 20 3d 20 69  .  isSandbox = i
3360: 73 5f 73 61 6e 64 62 6f 78 28 7a 50 61 67 65 4e  s_sandbox(zPageN
3370: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 73 53 61  ame);.  if( isSa
3380: 6e 64 62 6f 78 20 29 7b 0a 20 20 20 20 73 75 62  ndbox ){.    sub
3390: 6d 65 6e 75 46 6c 61 67 73 20 26 3d 20 7e 57 5f  menuFlags &= ~W_
33a0: 53 41 4e 44 42 4f 58 3b 0a 20 20 20 20 7a 42 6f  SANDBOX;.    zBo
33b0: 64 79 20 3d 20 64 62 5f 67 65 74 28 22 73 61 6e  dy = db_get("san
33c0: 64 62 6f 78 22 2c 7a 42 6f 64 79 29 3b 0a 20 20  dbox",zBody);.  
33d0: 20 20 7a 4d 69 6d 65 74 79 70 65 20 3d 20 64 62    zMimetype = db
33e0: 5f 67 65 74 28 22 73 61 6e 64 62 6f 78 2d 6d 69  _get("sandbox-mi
33f0: 6d 65 74 79 70 65 22 2c 22 74 65 78 74 2f 78 2d  metype","text/x-
3400: 66 6f 73 73 69 6c 2d 77 69 6b 69 22 29 3b 0a 20  fossil-wiki");. 
3410: 20 20 20 72 69 64 20 3d 20 30 3b 0a 20 20 7d 65     rid = 0;.  }e
3420: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
3430: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 50 28 22  har *zUuid = P("
3440: 69 64 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 55  id");.    if( zU
3450: 75 69 64 3d 3d 30 20 7c 7c 20 28 72 69 64 20 3d  uid==0 || (rid =
3460: 20 73 79 6d 62 6f 6c 69 63 5f 6e 61 6d 65 5f 74   symbolic_name_t
3470: 6f 5f 72 69 64 28 7a 55 75 69 64 2c 22 77 22 29  o_rid(zUuid,"w")
3480: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 54  )==0 ){.      zT
3490: 61 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 77 69  ag = mprintf("wi
34a0: 6b 69 2d 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d  ki-%s", zPageNam
34b0: 65 29 3b 0a 20 20 20 20 20 20 72 69 64 20 3d 20  e);.      rid = 
34c0: 64 62 5f 69 6e 74 28 30 2c 0a 20 20 20 20 20 20  db_int(0,.      
34d0: 20 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52    "SELECT rid FR
34e0: 4f 4d 20 74 61 67 78 72 65 66 22 0a 20 20 20 20  OM tagxref".    
34f0: 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67 69      " WHERE tagi
3500: 64 3d 28 53 45 4c 45 43 54 20 74 61 67 69 64 20  d=(SELECT tagid 
3510: 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74  FROM tag WHERE t
3520: 61 67 6e 61 6d 65 3d 25 51 29 22 0a 20 20 20 20  agname=%Q)".    
3530: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6d      " ORDER BY m
3540: 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 54 61 67  time DESC", zTag
3550: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
3560: 66 72 65 65 28 7a 54 61 67 29 3b 0a 20 20 20 20  free(zTag);.    
3570: 7d 0a 20 20 20 20 70 57 69 6b 69 20 3d 20 6d 61  }.    pWiki = ma
3580: 6e 69 66 65 73 74 5f 67 65 74 28 72 69 64 2c 20  nifest_get(rid, 
3590: 43 46 54 59 50 45 5f 57 49 4b 49 2c 20 30 29 3b  CFTYPE_WIKI, 0);
35a0: 0a 20 20 20 20 69 66 28 20 70 57 69 6b 69 20 29  .    if( pWiki )
35b0: 7b 0a 20 20 20 20 20 20 7a 42 6f 64 79 20 3d 20  {.      zBody = 
35c0: 70 57 69 6b 69 2d 3e 7a 57 69 6b 69 3b 0a 20 20  pWiki->zWiki;.  
35d0: 20 20 20 20 7a 4d 69 6d 65 74 79 70 65 20 3d 20      zMimetype = 
35e0: 70 57 69 6b 69 2d 3e 7a 4d 69 6d 65 74 79 70 65  pWiki->zMimetype
35f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4d  ;.    }.  }.  zM
3600: 69 6d 65 74 79 70 65 20 3d 20 77 69 6b 69 5f 66  imetype = wiki_f
3610: 69 6c 74 65 72 5f 6d 69 6d 65 74 79 70 65 73 28  ilter_mimetypes(
3620: 7a 4d 69 6d 65 74 79 70 65 29 3b 0a 20 20 69 66  zMimetype);.  if
3630: 28 20 21 67 2e 69 73 48 6f 6d 65 20 29 7b 0a 20  ( !g.isHome ){. 
3640: 20 20 20 69 66 28 20 28 28 72 69 64 20 26 26 20     if( ((rid && 
3650: 67 2e 70 65 72 6d 2e 57 72 57 69 6b 69 29 20 7c  g.perm.WrWiki) |
3660: 7c 20 28 21 72 69 64 20 26 26 20 67 2e 70 65 72  | (!rid && g.per
3670: 6d 2e 4e 65 77 57 69 6b 69 29 29 0a 20 20 20 20  m.NewWiki)).    
3680: 20 26 26 20 77 69 6b 69 5f 73 70 65 63 69 61 6c   && wiki_special
3690: 5f 70 65 72 6d 69 73 73 69 6f 6e 28 7a 50 61 67  _permission(zPag
36a0: 65 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20  eName).    ){.  
36b0: 20 20 20 20 69 66 28 20 64 62 5f 67 65 74 5f 62      if( db_get_b
36c0: 6f 6f 6c 65 61 6e 28 22 77 79 73 69 77 79 67 2d  oolean("wysiwyg-
36d0: 77 69 6b 69 22 2c 20 30 29 20 29 7b 0a 20 20 20  wiki", 0) ){.   
36e0: 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65       style_subme
36f0: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 45 64 69 74  nu_element("Edit
3700: 22 2c 20 22 25 73 2f 77 69 6b 69 65 64 69 74 3f  ", "%s/wikiedit?
3710: 6e 61 6d 65 3d 25 54 26 77 79 73 69 77 79 67 3d  name=%T&wysiwyg=
3720: 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
3730: 20 67 2e 7a 54 6f 70 2c 20 7a 50 61 67 65 4e 61   g.zTop, zPageNa
3740: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
3750: 7b 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f  {.        style_
3760: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
3770: 22 45 64 69 74 22 2c 20 22 25 73 2f 77 69 6b 69  "Edit", "%s/wiki
3780: 65 64 69 74 3f 6e 61 6d 65 3d 25 54 22 2c 20 67  edit?name=%T", g
3790: 2e 7a 54 6f 70 2c 20 7a 50 61 67 65 4e 61 6d 65  .zTop, zPageName
37a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37b0: 0a 20 20 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  .    if( g.perm.
37c0: 48 79 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20  Hyperlink ){.   
37d0: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
37e0: 5f 65 6c 65 6d 65 6e 74 28 22 48 69 73 74 6f 72  _element("Histor
37f0: 79 22 2c 20 22 25 73 2f 77 68 69 73 74 6f 72 79  y", "%s/whistory
3800: 3f 6e 61 6d 65 3d 25 54 22 2c 0a 20 20 20 20 20  ?name=%T",.     
3810: 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 50        g.zTop, zP
3820: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ageName);.    }.
3830: 20 20 7d 0a 20 20 73 74 79 6c 65 5f 73 65 74 5f    }.  style_set_
3840: 63 75 72 72 65 6e 74 5f 70 61 67 65 28 22 25 54  current_page("%T
3850: 3f 6e 61 6d 65 3d 25 54 22 2c 20 67 2e 7a 50 61  ?name=%T", g.zPa
3860: 74 68 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a  th, zPageName);.
3870: 20 20 77 69 6b 69 5f 70 61 67 65 5f 68 65 61 64    wiki_page_head
3880: 65 72 28 57 49 4b 49 54 59 50 45 5f 55 4e 4b 4e  er(WIKITYPE_UNKN
3890: 4f 57 4e 2c 20 7a 50 61 67 65 4e 61 6d 65 2c 20  OWN, zPageName, 
38a0: 22 22 29 3b 0a 20 20 77 69 6b 69 5f 73 74 61 6e  "");.  wiki_stan
38b0: 64 61 72 64 5f 73 75 62 6d 65 6e 75 28 73 75 62  dard_submenu(sub
38c0: 6d 65 6e 75 46 6c 61 67 73 29 3b 0a 20 20 69 66  menuFlags);.  if
38d0: 28 20 7a 42 6f 64 79 5b 30 5d 3d 3d 30 20 29 7b  ( zBody[0]==0 ){
38e0: 0a 20 20 20 20 40 20 3c 69 3e 54 68 69 73 20 70  .    @ <i>This p
38f0: 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c  age has been del
3900: 65 74 65 64 3c 2f 69 3e 0a 20 20 7d 65 6c 73 65  eted</i>.  }else
3910: 7b 0a 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28  {.    blob_init(
3920: 26 77 69 6b 69 2c 20 7a 42 6f 64 79 2c 20 2d 31  &wiki, zBody, -1
3930: 29 3b 0a 20 20 20 20 77 69 6b 69 5f 72 65 6e 64  );.    wiki_rend
3940: 65 72 5f 62 79 5f 6d 69 6d 65 74 79 70 65 28 26  er_by_mimetype(&
3950: 77 69 6b 69 2c 20 7a 4d 69 6d 65 74 79 70 65 29  wiki, zMimetype)
3960: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74  ;.    blob_reset
3970: 28 26 77 69 6b 69 29 3b 0a 20 20 7d 0a 20 20 61  (&wiki);.  }.  a
3980: 74 74 61 63 68 6d 65 6e 74 5f 6c 69 73 74 28 7a  ttachment_list(z
3990: 50 61 67 65 4e 61 6d 65 2c 20 22 3c 68 72 20 2f  PageName, "<hr /
39a0: 3e 3c 68 32 3e 41 74 74 61 63 68 6d 65 6e 74 73  ><h2>Attachments
39b0: 3a 3c 2f 68 32 3e 3c 75 6c 3e 22 29 3b 0a 20 20  :</h2><ul>");.  
39c0: 6d 61 6e 69 66 65 73 74 5f 64 65 73 74 72 6f 79  manifest_destroy
39d0: 28 70 57 69 6b 69 29 3b 0a 20 20 73 74 79 6c 65  (pWiki);.  style
39e0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
39f0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 77 69 6b 69  .** Write a wiki
3a00: 20 61 72 74 69 66 61 63 74 20 69 6e 74 6f 20 74   artifact into t
3a10: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2f  he repository.*/
3a20: 0a 69 6e 74 20 77 69 6b 69 5f 70 75 74 28 42 6c  .int wiki_put(Bl
3a30: 6f 62 20 2a 70 57 69 6b 69 2c 20 69 6e 74 20 70  ob *pWiki, int p
3a40: 61 72 65 6e 74 2c 20 69 6e 74 20 6e 65 65 64 4d  arent, int needM
3a50: 6f 64 29 7b 0a 20 20 69 6e 74 20 6e 72 69 64 3b  od){.  int nrid;
3a60: 0a 20 20 69 66 28 20 21 6e 65 65 64 4d 6f 64 20  .  if( !needMod 
3a70: 29 7b 0a 20 20 20 20 6e 72 69 64 20 3d 20 63 6f  ){.    nrid = co
3a80: 6e 74 65 6e 74 5f 70 75 74 5f 65 78 28 70 57 69  ntent_put_ex(pWi
3a90: 6b 69 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ki, 0, 0, 0, 0);
3aa0: 0a 20 20 20 20 69 66 28 20 70 61 72 65 6e 74 29  .    if( parent)
3ab0: 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 79   content_deltify
3ac0: 28 70 61 72 65 6e 74 2c 20 26 6e 72 69 64 2c 20  (parent, &nrid, 
3ad0: 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1, 0);.  }else{.
3ae0: 20 20 20 20 6e 72 69 64 20 3d 20 63 6f 6e 74 65      nrid = conte
3af0: 6e 74 5f 70 75 74 5f 65 78 28 70 57 69 6b 69 2c  nt_put_ex(pWiki,
3b00: 20 30 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20   0, 0, 0, 1);.  
3b10: 20 20 6d 6f 64 65 72 61 74 69 6f 6e 5f 74 61 62    moderation_tab
3b20: 6c 65 5f 63 72 65 61 74 65 28 29 3b 0a 20 20 20  le_create();.   
3b30: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
3b40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 6f 64 72  INSERT INTO modr
3b50: 65 71 28 6f 62 6a 69 64 29 20 56 41 4c 55 45 53  eq(objid) VALUES
3b60: 28 25 64 29 22 2c 20 6e 72 69 64 29 3b 0a 20 20  (%d)", nrid);.  
3b70: 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  }.  db_multi_exe
3b80: 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e  c("INSERT OR IGN
3b90: 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e 74 20  ORE INTO unsent 
3ba0: 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e 72 69  VALUES(%d)", nri
3bb0: 64 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65  d);.  db_multi_e
3bc0: 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49  xec("INSERT OR I
3bd0: 47 4e 4f 52 45 20 49 4e 54 4f 20 75 6e 63 6c 75  GNORE INTO unclu
3be0: 73 74 65 72 65 64 20 56 41 4c 55 45 53 28 25 64  stered VALUES(%d
3bf0: 29 3b 22 2c 20 6e 72 69 64 29 3b 0a 20 20 6d 61  );", nrid);.  ma
3c00: 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b  nifest_crosslink
3c10: 28 6e 72 69 64 2c 20 70 57 69 6b 69 2c 20 4d 43  (nrid, pWiki, MC
3c20: 5f 4e 4f 4e 45 29 3b 0a 20 20 72 65 74 75 72 6e  _NONE);.  return
3c30: 20 6e 72 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nrid;.}../*.** 
3c40: 4f 75 74 70 75 74 20 61 20 73 65 6c 65 63 74 69  Output a selecti
3c50: 6f 6e 20 62 6f 78 20 66 72 6f 6d 20 77 68 69 63  on box from whic
3c60: 68 20 74 68 65 20 75 73 65 72 20 63 61 6e 20 73  h the user can s
3c70: 65 6c 65 63 74 20 74 68 65 0a 2a 2a 20 77 69 6b  elect the.** wik
3c80: 69 20 6d 69 6d 65 74 79 70 65 2e 0a 2a 2f 0a 76  i mimetype..*/.v
3c90: 6f 69 64 20 6d 69 6d 65 74 79 70 65 5f 6f 70 74  oid mimetype_opt
3ca0: 69 6f 6e 5f 6d 65 6e 75 28 63 6f 6e 73 74 20 63  ion_menu(const c
3cb0: 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65 29 7b  har *zMimetype){
3cc0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 3b 0a 20  .  unsigned i;. 
3cd0: 20 40 20 3c 73 65 6c 65 63 74 20 6e 61 6d 65 3d   @ <select name=
3ce0: 22 6d 69 6d 65 74 79 70 65 22 20 73 69 7a 65 3d  "mimetype" size=
3cf0: 22 31 22 3e 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "1">.  for(i=0; 
3d00: 69 3c 63 6f 75 6e 74 28 61 7a 53 74 79 6c 65 73  i<count(azStyles
3d10: 29 3b 20 69 2b 3d 33 29 7b 0a 20 20 20 20 69 66  ); i+=3){.    if
3d20: 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  ( fossil_strcmp(
3d30: 7a 4d 69 6d 65 74 79 70 65 2c 61 7a 53 74 79 6c  zMimetype,azStyl
3d40: 65 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  es[i])==0 ){.   
3d50: 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c     @ <option val
3d60: 75 65 3d 22 25 73 28 61 7a 53 74 79 6c 65 73 5b  ue="%s(azStyles[
3d70: 69 5d 29 22 20 73 65 6c 65 63 74 65 64 3e 25 73  i])" selected>%s
3d80: 28 61 7a 53 74 79 6c 65 73 5b 69 2b 31 5d 29 3c  (azStyles[i+1])<
3d90: 2f 6f 70 74 69 6f 6e 3e 0a 20 20 20 20 7d 65 6c  /option>.    }el
3da0: 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 6f 70 74  se{.      @ <opt
3db0: 69 6f 6e 20 76 61 6c 75 65 3d 22 25 73 28 61 7a  ion value="%s(az
3dc0: 53 74 79 6c 65 73 5b 69 5d 29 22 3e 25 73 28 61  Styles[i])">%s(a
3dd0: 7a 53 74 79 6c 65 73 5b 69 2b 31 5d 29 3c 2f 6f  zStyles[i+1])</o
3de0: 70 74 69 6f 6e 3e 0a 20 20 20 20 7d 0a 20 20 7d  ption>.    }.  }
3df0: 0a 20 20 40 20 3c 2f 73 65 6c 65 63 74 3e 0a 7d  .  @ </select>.}
3e00: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
3e10: 6d 69 6d 65 74 79 70 65 2c 20 72 65 74 75 72 6e  mimetype, return
3e20: 20 69 74 73 20 63 6f 6d 6d 6f 6e 20 6e 61 6d 65   its common name
3e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
3e40: 74 20 63 68 61 72 20 2a 6d 69 6d 65 74 79 70 65  t char *mimetype
3e50: 5f 63 6f 6d 6d 6f 6e 5f 6e 61 6d 65 28 63 6f 6e  _common_name(con
3e60: 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79  st char *zMimety
3e70: 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pe){.  int i;.  
3e80: 66 6f 72 28 69 3d 34 3b 20 69 3e 3d 32 3b 20 69  for(i=4; i>=2; i
3e90: 2d 3d 32 29 7b 0a 20 20 20 20 69 66 28 20 7a 4d  -=2){.    if( zM
3ea0: 69 6d 65 74 79 70 65 20 26 26 20 66 6f 73 73 69  imetype && fossi
3eb0: 6c 5f 73 74 72 63 6d 70 28 7a 4d 69 6d 65 74 79  l_strcmp(zMimety
3ec0: 70 65 2c 20 61 7a 53 74 79 6c 65 73 5b 69 5d 29  pe, azStyles[i])
3ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
3ee0: 75 72 6e 20 61 7a 53 74 79 6c 65 73 5b 69 2b 31  urn azStyles[i+1
3ef0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ];.    }.  }.  r
3f00: 65 74 75 72 6e 20 61 7a 53 74 79 6c 65 73 5b 31  eturn azStyles[1
3f10: 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  ];.}../*.** WEBP
3f20: 41 47 45 3a 20 77 69 6b 69 65 64 69 74 0a 2a 2a  AGE: wikiedit.**
3f30: 20 55 52 4c 3a 20 2f 77 69 6b 69 65 64 69 74 3f   URL: /wikiedit?
3f40: 6e 61 6d 65 3d 50 41 47 45 4e 41 4d 45 0a 2a 2a  name=PAGENAME.**
3f50: 0a 2a 2a 20 45 64 69 74 20 61 20 77 69 6b 69 20  .** Edit a wiki 
3f60: 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 69  page..*/.void wi
3f70: 6b 69 65 64 69 74 5f 70 61 67 65 28 76 6f 69 64  kiedit_page(void
3f80: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 67 3b  ){.  char *zTag;
3f90: 0a 20 20 69 6e 74 20 72 69 64 20 3d 20 30 3b 0a  .  int rid = 0;.
3fa0: 20 20 69 6e 74 20 69 73 53 61 6e 64 62 6f 78 3b    int isSandbox;
3fb0: 0a 20 20 42 6c 6f 62 20 77 69 6b 69 3b 0a 20 20  .  Blob wiki;.  
3fc0: 4d 61 6e 69 66 65 73 74 20 2a 70 57 69 6b 69 20  Manifest *pWiki 
3fd0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
3fe0: 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 0a 20 20  r *zPageName;.  
3ff0: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
4000: 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a  har *z;.  char *
4010: 7a 42 6f 64 79 20 3d 20 28 63 68 61 72 2a 29 50  zBody = (char*)P
4020: 28 22 77 22 29 3b 0a 20 20 63 6f 6e 73 74 20 63  ("w");.  const c
4030: 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65 20 3d  har *zMimetype =
4040: 20 77 69 6b 69 5f 66 69 6c 74 65 72 5f 6d 69 6d   wiki_filter_mim
4050: 65 74 79 70 65 73 28 50 28 22 6d 69 6d 65 74 79  etypes(P("mimety
4060: 70 65 22 29 29 3b 0a 20 20 69 6e 74 20 69 73 57  pe"));.  int isW
4070: 79 73 69 77 79 67 20 3d 20 50 28 22 77 79 73 69  ysiwyg = P("wysi
4080: 77 79 67 22 29 21 3d 30 3b 0a 20 20 69 6e 74 20  wyg")!=0;.  int 
4090: 67 6f 6f 64 43 61 70 74 63 68 61 20 3d 20 31 3b  goodCaptcha = 1;
40a0: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 57  .  int eType = W
40b0: 49 4b 49 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 3b  IKITYPE_UNKNOWN;
40c0: 0a 20 20 69 6e 74 20 68 61 76 65 50 72 65 76 69  .  int havePrevi
40d0: 65 77 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 50  ew = 0;..  if( P
40e0: 28 22 65 64 69 74 2d 77 79 73 69 77 79 67 22 29  ("edit-wysiwyg")
40f0: 21 3d 30 20 29 7b 20 69 73 57 79 73 69 77 79 67  !=0 ){ isWysiwyg
4100: 20 3d 20 31 3b 20 7a 42 6f 64 79 20 3d 20 30 3b   = 1; zBody = 0;
4110: 20 7d 0a 20 20 69 66 28 20 50 28 22 65 64 69 74   }.  if( P("edit
4120: 2d 6d 61 72 6b 75 70 22 29 21 3d 30 20 29 7b 20  -markup")!=0 ){ 
4130: 69 73 57 79 73 69 77 79 67 20 3d 20 30 3b 20 7a  isWysiwyg = 0; z
4140: 42 6f 64 79 20 3d 20 30 3b 20 7d 0a 20 20 69 66  Body = 0; }.  if
4150: 28 20 7a 42 6f 64 79 20 29 7b 0a 20 20 20 20 69  ( zBody ){.    i
4160: 66 28 20 69 73 57 79 73 69 77 79 67 20 29 7b 0a  f( isWysiwyg ){.
4170: 20 20 20 20 20 20 42 6c 6f 62 20 62 6f 64 79 3b        Blob body;
4180: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f  .      blob_zero
4190: 28 26 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 68  (&body);.      h
41a0: 74 6d 6c 54 69 64 79 28 7a 42 6f 64 79 2c 20 26  tmlTidy(zBody, &
41b0: 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 7a 42 6f  body);.      zBo
41c0: 64 79 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 62  dy = blob_str(&b
41d0: 6f 64 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ody);.    }else{
41e0: 0a 20 20 20 20 20 20 7a 42 6f 64 79 20 3d 20 6d  .      zBody = m
41f0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 42 6f  printf("%s", zBo
4200: 64 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  dy);.    }.  }. 
4210: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
4220: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 7a 50  dentials();.  zP
4230: 61 67 65 4e 61 6d 65 20 3d 20 50 44 28 22 6e 61  ageName = PD("na
4240: 6d 65 22 2c 22 22 29 3b 0a 20 20 69 66 28 20 63  me","");.  if( c
4250: 68 65 63 6b 5f 6e 61 6d 65 28 7a 50 61 67 65 4e  heck_name(zPageN
4260: 61 6d 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ame) ) return;. 
4270: 20 69 73 53 61 6e 64 62 6f 78 20 3d 20 69 73 5f   isSandbox = is_
4280: 73 61 6e 64 62 6f 78 28 7a 50 61 67 65 4e 61 6d  sandbox(zPageNam
4290: 65 29 3b 0a 20 20 69 66 28 20 69 73 53 61 6e 64  e);.  if( isSand
42a0: 62 6f 78 20 29 7b 0a 20 20 20 20 69 66 28 20 21  box ){.    if( !
42b0: 67 2e 70 65 72 6d 2e 57 72 57 69 6b 69 20 29 7b  g.perm.WrWiki ){
42c0: 0a 20 20 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65  .      login_nee
42d0: 64 65 64 28 67 2e 61 6e 6f 6e 2e 57 72 57 69 6b  ded(g.anon.WrWik
42e0: 69 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  i);.      return
42f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4300: 7a 42 6f 64 79 3d 3d 30 20 29 7b 0a 20 20 20 20  zBody==0 ){.    
4310: 20 20 7a 42 6f 64 79 20 3d 20 64 62 5f 67 65 74    zBody = db_get
4320: 28 22 73 61 6e 64 62 6f 78 22 2c 22 22 29 3b 0a  ("sandbox","");.
4330: 20 20 20 20 20 20 7a 4d 69 6d 65 74 79 70 65 20        zMimetype 
4340: 3d 20 64 62 5f 67 65 74 28 22 73 61 6e 64 62 6f  = db_get("sandbo
4350: 78 2d 6d 69 6d 65 74 79 70 65 22 2c 22 74 65 78  x-mimetype","tex
4360: 74 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22  t/x-fossil-wiki"
4370: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
4380: 7b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d 70 72  {.    zTag = mpr
4390: 69 6e 74 66 28 22 77 69 6b 69 2d 25 73 22 2c 20  intf("wiki-%s", 
43a0: 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20  zPageName);.    
43b0: 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 0a  rid = db_int(0,.
43c0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 69        "SELECT ri
43d0: 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a  d FROM tagxref".
43e0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74 61        " WHERE ta
43f0: 67 69 64 3d 28 53 45 4c 45 43 54 20 74 61 67 69  gid=(SELECT tagi
4400: 64 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45  d FROM tag WHERE
4410: 20 74 61 67 6e 61 6d 65 3d 25 51 29 22 0a 20 20   tagname=%Q)".  
4420: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6d      " ORDER BY m
4430: 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 54 61 67  time DESC", zTag
4440: 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 72 65 65  .    );.    free
4450: 28 7a 54 61 67 29 3b 0a 20 20 20 20 69 66 28 20  (zTag);.    if( 
4460: 21 77 69 6b 69 5f 73 70 65 63 69 61 6c 5f 70 65  !wiki_special_pe
4470: 72 6d 69 73 73 69 6f 6e 28 7a 50 61 67 65 4e 61  rmission(zPageNa
4480: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 6c 6f 67  me) ){.      log
4490: 69 6e 5f 6e 65 65 64 65 64 28 30 29 3b 0a 20 20  in_needed(0);.  
44a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
44b0: 7d 0a 20 20 20 20 69 66 28 20 28 72 69 64 20 26  }.    if( (rid &
44c0: 26 20 21 67 2e 70 65 72 6d 2e 57 72 57 69 6b 69  & !g.perm.WrWiki
44d0: 29 20 7c 7c 20 28 21 72 69 64 20 26 26 20 21 67  ) || (!rid && !g
44e0: 2e 70 65 72 6d 2e 4e 65 77 57 69 6b 69 29 20 29  .perm.NewWiki) )
44f0: 7b 0a 20 20 20 20 20 20 6c 6f 67 69 6e 5f 6e 65  {.      login_ne
4500: 65 64 65 64 28 72 69 64 20 3f 20 67 2e 61 6e 6f  eded(rid ? g.ano
4510: 6e 2e 57 72 57 69 6b 69 20 3a 20 67 2e 61 6e 6f  n.WrWiki : g.ano
4520: 6e 2e 4e 65 77 57 69 6b 69 29 3b 0a 20 20 20 20  n.NewWiki);.    
4530: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4540: 20 20 20 20 69 66 28 20 7a 42 6f 64 79 3d 3d 30      if( zBody==0
4550: 20 26 26 20 28 70 57 69 6b 69 20 3d 20 6d 61 6e   && (pWiki = man
4560: 69 66 65 73 74 5f 67 65 74 28 72 69 64 2c 20 43  ifest_get(rid, C
4570: 46 54 59 50 45 5f 57 49 4b 49 2c 20 30 29 29 21  FTYPE_WIKI, 0))!
4580: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 42 6f 64  =0 ){.      zBod
4590: 79 20 3d 20 70 57 69 6b 69 2d 3e 7a 57 69 6b 69  y = pWiki->zWiki
45a0: 3b 0a 20 20 20 20 20 20 7a 4d 69 6d 65 74 79 70  ;.      zMimetyp
45b0: 65 20 3d 20 70 57 69 6b 69 2d 3e 7a 4d 69 6d 65  e = pWiki->zMime
45c0: 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  type;.    }.  }.
45d0: 20 20 69 66 28 20 50 28 22 73 75 62 6d 69 74 22    if( P("submit"
45e0: 29 21 3d 30 20 26 26 20 7a 42 6f 64 79 21 3d 30  )!=0 && zBody!=0
45f0: 0a 20 20 20 26 26 20 28 67 6f 6f 64 43 61 70 74  .   && (goodCapt
4600: 63 68 61 20 3d 20 63 61 70 74 63 68 61 5f 69 73  cha = captcha_is
4610: 5f 63 6f 72 72 65 63 74 28 30 29 29 0a 20 20 29  _correct(0)).  )
4620: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74  {.    char *zDat
4630: 65 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6b 73 75  e;.    Blob cksu
4640: 6d 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f  m;.    blob_zero
4650: 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 64 62 5f  (&wiki);.    db_
4660: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
4670: 6e 28 29 3b 0a 20 20 20 20 69 66 28 20 69 73 53  n();.    if( isS
4680: 61 6e 64 62 6f 78 20 29 7b 0a 20 20 20 20 20 20  andbox ){.      
4690: 64 62 5f 73 65 74 28 22 73 61 6e 64 62 6f 78 22  db_set("sandbox"
46a0: 2c 7a 42 6f 64 79 2c 30 29 3b 0a 20 20 20 20 20  ,zBody,0);.     
46b0: 20 64 62 5f 73 65 74 28 22 73 61 6e 64 62 6f 78   db_set("sandbox
46c0: 2d 6d 69 6d 65 74 79 70 65 22 2c 7a 4d 69 6d 65  -mimetype",zMime
46d0: 74 79 70 65 2c 30 29 3b 0a 20 20 20 20 7d 65 6c  type,0);.    }el
46e0: 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 69 6e 5f  se{.      login_
46f0: 76 65 72 69 66 79 5f 63 73 72 66 5f 73 65 63 72  verify_csrf_secr
4700: 65 74 28 29 3b 0a 20 20 20 20 20 20 7a 44 61 74  et();.      zDat
4710: 65 20 3d 20 64 61 74 65 5f 69 6e 5f 73 74 61 6e  e = date_in_stan
4720: 64 61 72 64 5f 66 6f 72 6d 61 74 28 22 6e 6f 77  dard_format("now
4730: 22 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  ");.      blob_a
4740: 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 44  ppendf(&wiki, "D
4750: 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a   %s\n", zDate);.
4760: 20 20 20 20 20 20 66 72 65 65 28 7a 44 61 74 65        free(zDate
4770: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  );.      blob_ap
4780: 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 4c 20  pendf(&wiki, "L 
4790: 25 46 5c 6e 22 2c 20 7a 50 61 67 65 4e 61 6d 65  %F\n", zPageName
47a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6f 73  );.      if( fos
47b0: 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4d 69 6d 65  sil_strcmp(zMime
47c0: 74 79 70 65 2c 22 74 65 78 74 2f 78 2d 66 6f 73  type,"text/x-fos
47d0: 73 69 6c 2d 77 69 6b 69 22 29 21 3d 30 20 29 7b  sil-wiki")!=0 ){
47e0: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
47f0: 70 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 4e 20  pendf(&wiki, "N 
4800: 25 73 5c 6e 22 2c 20 7a 4d 69 6d 65 74 79 70 65  %s\n", zMimetype
4810: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4820: 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20   if( rid ){.    
4830: 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20      char *zUuid 
4840: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
4850: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
4860: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64  lob WHERE rid=%d
4870: 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20 20  ", rid);.       
4880: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
4890: 69 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20 7a  iki, "P %s\n", z
48a0: 55 75 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  Uuid);.        f
48b0: 72 65 65 28 7a 55 75 69 64 29 3b 0a 20 20 20 20  ree(zUuid);.    
48c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6c    }.      if( !l
48d0: 6f 67 69 6e 5f 69 73 5f 6e 6f 62 6f 64 79 28 29  ogin_is_nobody()
48e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62   ){.        blob
48f0: 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c 20  _appendf(&wiki, 
4900: 22 55 20 25 46 5c 6e 22 2c 20 6c 6f 67 69 6e 5f  "U %F\n", login_
4910: 6e 61 6d 65 28 29 29 3b 0a 20 20 20 20 20 20 7d  name());.      }
4920: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
4930: 6e 64 66 28 26 77 69 6b 69 2c 20 22 57 20 25 64  ndf(&wiki, "W %d
4940: 5c 6e 25 73 5c 6e 22 2c 20 73 74 72 6c 65 6e 28  \n%s\n", strlen(
4950: 7a 42 6f 64 79 29 2c 20 7a 42 6f 64 79 29 3b 0a  zBody), zBody);.
4960: 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c 6f        md5sum_blo
4970: 62 28 26 77 69 6b 69 2c 20 26 63 6b 73 75 6d 29  b(&wiki, &cksum)
4980: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
4990: 65 6e 64 66 28 26 77 69 6b 69 2c 20 22 5a 20 25  endf(&wiki, "Z %
49a0: 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  b\n", &cksum);. 
49b0: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
49c0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 77  &cksum);.      w
49d0: 69 6b 69 5f 70 75 74 28 26 77 69 6b 69 2c 20 30  iki_put(&wiki, 0
49e0: 2c 20 77 69 6b 69 5f 6e 65 65 64 5f 6d 6f 64 65  , wiki_need_mode
49f0: 72 61 74 69 6f 6e 28 30 29 29 3b 0a 20 20 20 20  ration(0));.    
4a00: 7d 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61  }.    db_end_tra
4a10: 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20  nsaction(0);.   
4a20: 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22   cgi_redirectf("
4a30: 77 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a  wiki?name=%T", z
4a40: 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  PageName);.  }. 
4a50: 20 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29   if( P("cancel")
4a60: 21 3d 30 20 29 7b 0a 20 20 20 20 63 67 69 5f 72  !=0 ){.    cgi_r
4a70: 65 64 69 72 65 63 74 66 28 22 77 69 6b 69 3f 6e  edirectf("wiki?n
4a80: 61 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65 4e 61  ame=%T", zPageNa
4a90: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
4aa0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 6f 64 79  .  }.  if( zBody
4ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79  ==0 ){.    zBody
4ac0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a   = mprintf("");.
4ad0: 20 20 7d 0a 20 20 73 74 79 6c 65 5f 73 65 74 5f    }.  style_set_
4ae0: 63 75 72 72 65 6e 74 5f 70 61 67 65 28 22 25 54  current_page("%T
4af0: 3f 6e 61 6d 65 3d 25 54 22 2c 20 67 2e 7a 50 61  ?name=%T", g.zPa
4b00: 74 68 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a  th, zPageName);.
4b10: 20 20 65 54 79 70 65 20 3d 20 77 69 6b 69 5f 70    eType = wiki_p
4b20: 61 67 65 5f 68 65 61 64 65 72 28 57 49 4b 49 54  age_header(WIKIT
4b30: 59 50 45 5f 55 4e 4b 4e 4f 57 4e 2c 20 7a 50 61  YPE_UNKNOWN, zPa
4b40: 67 65 4e 61 6d 65 2c 20 22 45 64 69 74 3a 20 22  geName, "Edit: "
4b50: 29 3b 0a 20 20 69 66 28 20 72 69 64 20 26 26 20  );.  if( rid && 
4b60: 21 69 73 53 61 6e 64 62 6f 78 20 26 26 20 67 2e  !isSandbox && g.
4b70: 70 65 72 6d 2e 41 70 6e 64 57 69 6b 69 20 29 7b  perm.ApndWiki ){
4b80: 0a 20 20 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  .    if( g.perm.
4b90: 41 74 74 61 63 68 20 29 7b 0a 20 20 20 20 20 20  Attach ){.      
4ba0: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
4bb0: 65 6d 65 6e 74 28 22 41 74 74 61 63 68 22 2c 0a  ement("Attach",.
4bc0: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 2f 61             "%s/a
4bd0: 74 74 61 63 68 61 64 64 3f 70 61 67 65 3d 25 54  ttachadd?page=%T
4be0: 26 66 72 6f 6d 3d 25 73 2f 77 69 6b 69 25 25 33  &from=%s/wiki%%3
4bf0: 66 6e 61 6d 65 3d 25 54 22 2c 0a 20 20 20 20 20  fname=%T",.     
4c00: 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 50        g.zTop, zP
4c10: 61 67 65 4e 61 6d 65 2c 20 67 2e 7a 54 6f 70 2c  ageName, g.zTop,
4c20: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20   zPageName);.   
4c30: 20 7d 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62   }.    style_sub
4c40: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 41 70  menu_element("Ap
4c50: 70 65 6e 64 22 2c 20 22 25 73 2f 77 69 6b 69 61  pend", "%s/wikia
4c60: 70 70 65 6e 64 3f 6e 61 6d 65 3d 25 54 26 6d 69  ppend?name=%T&mi
4c70: 6d 65 74 79 70 65 3d 25 73 22 2c 0a 20 20 20 20  metype=%s",.    
4c80: 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 50 61       g.zTop, zPa
4c90: 67 65 4e 61 6d 65 2c 20 7a 4d 69 6d 65 74 79 70  geName, zMimetyp
4ca0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 67  e);.  }.  if( !g
4cb0: 6f 6f 64 43 61 70 74 63 68 61 20 29 7b 0a 20 20  oodCaptcha ){.  
4cc0: 20 20 40 20 3c 70 20 63 6c 61 73 73 3d 22 67 65    @ <p class="ge
4cd0: 6e 65 72 61 6c 45 72 72 6f 72 22 3e 45 72 72 6f  neralError">Erro
4ce0: 72 3a 20 20 49 6e 63 6f 72 72 65 63 74 20 73 65  r:  Incorrect se
4cf0: 63 75 72 69 74 79 20 63 6f 64 65 2e 3c 2f 70 3e  curity code.</p>
4d00: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f  .  }.  blob_zero
4d10: 28 26 77 69 6b 69 29 3b 0a 20 20 77 68 69 6c 65  (&wiki);.  while
4d20: 28 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65  ( fossil_isspace
4d30: 28 7a 42 6f 64 79 5b 30 5d 29 20 29 20 7a 42 6f  (zBody[0]) ) zBo
4d40: 64 79 2b 2b 3b 0a 20 20 62 6c 6f 62 5f 61 70 70  dy++;.  blob_app
4d50: 65 6e 64 28 26 77 69 6b 69 2c 20 7a 42 6f 64 79  end(&wiki, zBody
4d60: 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 50 28 22  , -1);.  if( P("
4d70: 70 72 65 76 69 65 77 22 29 21 3d 30 20 29 7b 0a  preview")!=0 ){.
4d80: 20 20 20 20 68 61 76 65 50 72 65 76 69 65 77 20      havePreview 
4d90: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 42 6f  = 1;.    if( zBo
4da0: 64 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 40  dy[0] ){.      @
4db0: 20 50 72 65 76 69 65 77 3a 3c 68 72 20 2f 3e 0a   Preview:<hr />.
4dc0: 20 20 20 20 20 20 77 69 6b 69 5f 72 65 6e 64 65        wiki_rende
4dd0: 72 5f 62 79 5f 6d 69 6d 65 74 79 70 65 28 26 77  r_by_mimetype(&w
4de0: 69 6b 69 2c 20 7a 4d 69 6d 65 74 79 70 65 29 3b  iki, zMimetype);
4df0: 0a 20 20 20 20 20 20 40 20 3c 68 72 20 2f 3e 0a  .      @ <hr />.
4e00: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74        blob_reset
4e10: 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 7d 0a 20  (&wiki);.    }. 
4e20: 20 7d 0a 20 20 66 6f 72 28 6e 3d 32 2c 20 7a 3d   }.  for(n=2, z=
4e30: 7a 42 6f 64 79 3b 20 7a 5b 30 5d 3b 20 7a 2b 2b  zBody; z[0]; z++
4e40: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  ){.    if( z[0]=
4e50: 3d 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d  ='\n' ) n++;.  }
4e60: 0a 20 20 69 66 28 20 6e 3c 32 30 20 29 20 6e 20  .  if( n<20 ) n 
4e70: 3d 20 32 30 3b 0a 20 20 69 66 28 20 6e 3e 33 30  = 20;.  if( n>30
4e80: 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20 69 66 28   ) n = 30;.  if(
4e90: 20 21 69 73 57 79 73 69 77 79 67 20 29 7b 0a 20   !isWysiwyg ){. 
4ea0: 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61     /* Traditiona
4eb0: 6c 20 6d 61 72 6b 75 70 2d 6f 6e 6c 79 20 65 64  l markup-only ed
4ec0: 69 74 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61  iting */.    cha
4ed0: 72 20 2a 7a 50 6c 61 63 65 68 6f 6c 64 65 72 20  r *zPlaceholder 
4ee0: 3d 20 30 3b 0a 20 20 20 20 73 77 69 74 63 68 28  = 0;.    switch(
4ef0: 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   eType ){.      
4f00: 63 61 73 65 20 57 49 4b 49 54 59 50 45 5f 4e 4f  case WIKITYPE_NO
4f10: 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  RMAL: {.        
4f20: 7a 50 6c 61 63 65 68 6f 6c 64 65 72 20 3d 20 6d  zPlaceholder = m
4f30: 70 72 69 6e 74 66 28 22 45 6e 74 65 72 20 74 65  printf("Enter te
4f40: 78 74 20 66 6f 72 20 77 69 6b 69 20 70 61 67 65  xt for wiki page
4f50: 20 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29   %s", zPageName)
4f60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4f80: 61 73 65 20 57 49 4b 49 54 59 50 45 5f 42 52 41  ase WIKITYPE_BRA
4f90: 4e 43 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  NCH: {.        z
4fa0: 50 6c 61 63 65 68 6f 6c 64 65 72 20 3d 20 6d 70  Placeholder = mp
4fb0: 72 69 6e 74 66 28 22 45 6e 74 65 72 20 6e 6f 74  rintf("Enter not
4fc0: 65 73 20 61 62 6f 75 74 20 62 72 61 6e 63 68 20  es about branch 
4fd0: 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d 65 2b 37  %s", zPageName+7
4fe0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5000: 63 61 73 65 20 57 49 4b 49 54 59 50 45 5f 43 48  case WIKITYPE_CH
5010: 45 43 4b 49 4e 3a 20 7b 0a 20 20 20 20 20 20 20  ECKIN: {.       
5020: 20 7a 50 6c 61 63 65 68 6f 6c 64 65 72 20 3d 20   zPlaceholder = 
5030: 6d 70 72 69 6e 74 66 28 22 45 6e 74 65 72 20 6e  mprintf("Enter n
5040: 6f 74 65 73 20 61 62 6f 75 74 20 63 68 65 63 6b  otes about check
5050: 2d 69 6e 20 25 2e 32 30 73 22 2c 20 7a 50 61 67  -in %.20s", zPag
5060: 65 4e 61 6d 65 2b 38 29 3b 0a 20 20 20 20 20 20  eName+8);.      
5070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5080: 0a 20 20 20 20 20 20 63 61 73 65 20 57 49 4b 49  .      case WIKI
5090: 54 59 50 45 5f 54 41 47 3a 20 7b 0a 20 20 20 20  TYPE_TAG: {.    
50a0: 20 20 20 20 7a 50 6c 61 63 65 68 6f 6c 64 65 72      zPlaceholder
50b0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 45 6e 74 65   = mprintf("Ente
50c0: 72 20 6e 6f 74 65 73 20 61 62 6f 75 74 20 74 61  r notes about ta
50d0: 67 20 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d 65  g %s", zPageName
50e0: 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  +4);.        bre
50f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5100: 7d 0a 20 20 20 20 66 6f 72 6d 5f 62 65 67 69 6e  }.    form_begin
5110: 28 30 2c 20 22 25 52 2f 77 69 6b 69 65 64 69 74  (0, "%R/wikiedit
5120: 22 29 3b 0a 20 20 20 20 40 20 3c 64 69 76 3e 4d  ");.    @ <div>M
5130: 61 72 6b 75 70 20 73 74 79 6c 65 3a 0a 20 20 20  arkup style:.   
5140: 20 6d 69 6d 65 74 79 70 65 5f 6f 70 74 69 6f 6e   mimetype_option
5150: 5f 6d 65 6e 75 28 7a 4d 69 6d 65 74 79 70 65 29  _menu(zMimetype)
5160: 3b 0a 20 20 20 20 40 20 3c 62 72 20 2f 3e 3c 74  ;.    @ <br /><t
5170: 65 78 74 61 72 65 61 20 6e 61 6d 65 3d 22 77 22  extarea name="w"
5180: 20 63 6c 61 73 73 3d 22 77 69 6b 69 65 64 69 74   class="wikiedit
5190: 22 20 63 6f 6c 73 3d 22 38 30 22 20 5c 0a 20 20  " cols="80" \.  
51a0: 20 20 40 20 20 72 6f 77 73 3d 22 25 64 28 6e 29    @  rows="%d(n)
51b0: 22 20 77 72 61 70 3d 22 76 69 72 74 75 61 6c 22  " wrap="virtual"
51c0: 20 70 6c 61 63 65 68 6f 6c 64 65 72 3d 22 25 68   placeholder="%h
51d0: 28 7a 50 6c 61 63 65 68 6f 6c 64 65 72 29 22 3e  (zPlaceholder)">
51e0: 5c 0a 20 20 20 20 40 20 25 68 28 7a 42 6f 64 79  \.    @ %h(zBody
51f0: 29 3c 2f 74 65 78 74 61 72 65 61 3e 0a 20 20 20  )</textarea>.   
5200: 20 40 20 3c 62 72 20 2f 3e 0a 20 20 20 20 66 6f   @ <br />.    fo
5210: 73 73 69 6c 5f 66 72 65 65 28 7a 50 6c 61 63 65  ssil_free(zPlace
5220: 68 6f 6c 64 65 72 29 3b 0a 20 20 20 20 69 66 28  holder);.    if(
5230: 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28   db_get_boolean(
5240: 22 77 79 73 69 77 79 67 2d 77 69 6b 69 22 2c 20  "wysiwyg-wiki", 
5250: 30 29 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 69  0) ){.      @ <i
5260: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
5270: 74 22 20 6e 61 6d 65 3d 22 65 64 69 74 2d 77 79  t" name="edit-wy
5280: 73 69 77 79 67 22 20 76 61 6c 75 65 3d 22 57 79  siwyg" value="Wy
5290: 73 69 77 79 67 20 45 64 69 74 6f 72 22 0a 20 20  siwyg Editor".  
52a0: 20 20 20 20 40 20 20 6f 6e 63 6c 69 63 6b 3d 27      @  onclick='
52b0: 72 65 74 75 72 6e 20 63 6f 6e 66 69 72 6d 28 22  return confirm("
52c0: 53 77 69 74 63 68 69 6e 67 20 74 6f 20 57 59 53  Switching to WYS
52d0: 49 57 59 47 2d 6d 6f 64 65 5c 6e 77 69 6c 6c 20  IWYG-mode\nwill 
52e0: 65 72 61 73 65 20 79 6f 75 72 20 6d 61 72 6b 75  erase your marku
52f0: 70 5c 6e 65 64 69 74 73 2e 20 43 6f 6e 74 69 6e  p\nedits. Contin
5300: 75 65 3f 22 29 27 20 2f 3e 0a 20 20 20 20 7d 0a  ue?")' />.    }.
5310: 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70      @ <input typ
5320: 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d  e="submit" name=
5330: 22 70 72 65 76 69 65 77 22 20 76 61 6c 75 65 3d  "preview" value=
5340: 22 50 72 65 76 69 65 77 20 59 6f 75 72 20 43 68  "Preview Your Ch
5350: 61 6e 67 65 73 22 20 2f 3e 0a 20 20 7d 65 6c 73  anges" />.  }els
5360: 65 7b 0a 20 20 20 20 2f 2a 20 57 79 73 69 77 79  e{.    /* Wysiwy
5370: 67 20 65 64 69 74 69 6e 67 20 2a 2f 0a 20 20 20  g editing */.   
5380: 20 42 6c 6f 62 20 68 74 6d 6c 2c 20 74 65 6d 70   Blob html, temp
5390: 3b 0a 20 20 20 20 68 61 76 65 50 72 65 76 69 65  ;.    havePrevie
53a0: 77 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 6d 5f  w = 1;.    form_
53b0: 62 65 67 69 6e 28 22 22 2c 20 22 25 52 2f 77 69  begin("", "%R/wi
53c0: 6b 69 65 64 69 74 22 29 3b 0a 20 20 20 20 40 20  kiedit");.    @ 
53d0: 3c 64 69 76 3e 0a 20 20 20 20 40 20 3c 69 6e 70  <div>.    @ <inp
53e0: 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22  ut type="hidden"
53f0: 20 6e 61 6d 65 3d 22 77 79 73 69 77 79 67 22 20   name="wysiwyg" 
5400: 76 61 6c 75 65 3d 22 31 22 20 2f 3e 0a 20 20 20  value="1" />.   
5410: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 65 6d 70   blob_zero(&temp
5420: 29 3b 0a 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76  );.    wiki_conv
5430: 65 72 74 28 26 77 69 6b 69 2c 20 26 74 65 6d 70  ert(&wiki, &temp
5440: 2c 20 30 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a  , 0);.    blob_z
5450: 65 72 6f 28 26 68 74 6d 6c 29 3b 0a 20 20 20 20  ero(&html);.    
5460: 68 74 6d 6c 54 69 64 79 28 62 6c 6f 62 5f 73 74  htmlTidy(blob_st
5470: 72 28 26 74 65 6d 70 29 2c 20 26 68 74 6d 6c 29  r(&temp), &html)
5480: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74  ;.    blob_reset
5490: 28 26 74 65 6d 70 29 3b 0a 20 20 20 20 77 79 73  (&temp);.    wys
54a0: 69 77 79 67 45 64 69 74 6f 72 28 22 77 22 2c 20  iwygEditor("w", 
54b0: 62 6c 6f 62 5f 73 74 72 28 26 68 74 6d 6c 29 2c  blob_str(&html),
54c0: 20 36 30 2c 20 6e 29 3b 0a 20 20 20 20 62 6c 6f   60, n);.    blo
54d0: 62 5f 72 65 73 65 74 28 26 68 74 6d 6c 29 3b 0a  b_reset(&html);.
54e0: 20 20 20 20 40 20 3c 62 72 20 2f 3e 0a 20 20 20      @ <br />.   
54f0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
5500: 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 65 64  submit" name="ed
5510: 69 74 2d 6d 61 72 6b 75 70 22 20 76 61 6c 75 65  it-markup" value
5520: 3d 22 4d 61 72 6b 75 70 20 45 64 69 74 6f 72 22  ="Markup Editor"
5530: 0a 20 20 20 20 40 20 20 6f 6e 63 6c 69 63 6b 3d  .    @  onclick=
5540: 27 72 65 74 75 72 6e 20 63 6f 6e 66 69 72 6d 28  'return confirm(
5550: 22 53 77 69 74 63 68 69 6e 67 20 74 6f 20 6d 61  "Switching to ma
5560: 72 6b 75 70 2d 6d 6f 64 65 5c 6e 77 69 6c 6c 20  rkup-mode\nwill 
5570: 65 72 61 73 65 20 79 6f 75 72 20 57 59 53 49 57  erase your WYSIW
5580: 59 47 5c 6e 65 64 69 74 73 2e 20 43 6f 6e 74 69  YG\nedits. Conti
5590: 6e 75 65 3f 22 29 27 20 2f 3e 0a 20 20 7d 0a 20  nue?")' />.  }. 
55a0: 20 6c 6f 67 69 6e 5f 69 6e 73 65 72 74 5f 63 73   login_insert_cs
55b0: 72 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 69  rf_secret();.  i
55c0: 66 28 20 68 61 76 65 50 72 65 76 69 65 77 20 29  f( havePreview )
55d0: 7b 0a 20 20 20 20 69 66 28 20 7a 42 6f 64 79 5b  {.    if( zBody[
55e0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 69  0] ){.      @ <i
55f0: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
5600: 74 22 20 6e 61 6d 65 3d 22 73 75 62 6d 69 74 22  t" name="submit"
5610: 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20 54 68   value="Apply Th
5620: 65 73 65 20 43 68 61 6e 67 65 73 22 20 2f 3e 0a  ese Changes" />.
5630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5640: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
5650: 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 73 75  submit" name="su
5660: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 44 65 6c  bmit" value="Del
5670: 65 74 65 20 54 68 69 73 20 57 69 6b 69 20 50 61  ete This Wiki Pa
5680: 67 65 22 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 7d  ge" />.    }.  }
5690: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
56a0: 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22  ="hidden" name="
56b0: 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 68 28  name" value="%h(
56c0: 7a 50 61 67 65 4e 61 6d 65 29 22 20 2f 3e 0a 20  zPageName)" />. 
56d0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
56e0: 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 63 61  submit" name="ca
56f0: 6e 63 65 6c 22 20 76 61 6c 75 65 3d 22 43 61 6e  ncel" value="Can
5700: 63 65 6c 22 0a 20 20 40 20 20 6f 6e 63 6c 69 63  cel".  @  onclic
5710: 6b 3d 27 63 6f 6e 66 69 72 6d 28 22 41 62 61 6e  k='confirm("Aban
5720: 64 6f 6e 20 79 6f 75 72 20 63 68 61 6e 67 65 73  don your changes
5730: 3f 22 29 27 20 2f 3e 0a 20 20 40 20 3c 2f 64 69  ?")' />.  @ </di
5740: 76 3e 0a 20 20 63 61 70 74 63 68 61 5f 67 65 6e  v>.  captcha_gen
5750: 65 72 61 74 65 28 30 29 3b 0a 20 20 40 20 3c 2f  erate(0);.  @ </
5760: 66 6f 72 6d 3e 0a 20 20 6d 61 6e 69 66 65 73 74  form>.  manifest
5770: 5f 64 65 73 74 72 6f 79 28 70 57 69 6b 69 29 3b  _destroy(pWiki);
5780: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77  .  blob_reset(&w
5790: 69 6b 69 29 3b 0a 20 20 73 74 79 6c 65 5f 66 6f  iki);.  style_fo
57a0: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
57b0: 20 57 45 42 50 41 47 45 3a 20 77 69 6b 69 6e 65   WEBPAGE: wikine
57c0: 77 0a 2a 2a 20 55 52 4c 20 2f 77 69 6b 69 6e 65  w.** URL /wikine
57d0: 77 0a 2a 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 74  w.**.** Prompt t
57e0: 68 65 20 75 73 65 72 20 74 6f 20 65 6e 74 65 72  he user to enter
57f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6e   the name of a n
5800: 65 77 20 77 69 6b 69 20 70 61 67 65 2e 20 20 54  ew wiki page.  T
5810: 68 65 6e 20 72 65 64 69 72 65 63 74 0a 2a 2a 20  hen redirect.** 
5820: 74 6f 20 74 68 65 20 77 69 6b 69 65 64 69 74 20  to the wikiedit 
5830: 73 63 72 65 65 6e 20 66 6f 72 20 74 68 61 74 20  screen for that 
5840: 6e 65 77 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  new page..*/.voi
5850: 64 20 77 69 6b 69 6e 65 77 5f 70 61 67 65 28 76  d wikinew_page(v
5860: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  oid){.  const ch
5870: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e  ar *zName;.  con
5880: 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79  st char *zMimety
5890: 70 65 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63  pe;.  login_chec
58a0: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
58b0: 0a 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 4e  .  if( !g.perm.N
58c0: 65 77 57 69 6b 69 20 29 7b 0a 20 20 20 20 6c 6f  ewWiki ){.    lo
58d0: 67 69 6e 5f 6e 65 65 64 65 64 28 67 2e 61 6e 6f  gin_needed(g.ano
58e0: 6e 2e 4e 65 77 57 69 6b 69 29 3b 0a 20 20 20 20  n.NewWiki);.    
58f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 4e  return;.  }.  zN
5900: 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c  ame = PD("name",
5910: 22 22 29 3b 0a 20 20 7a 4d 69 6d 65 74 79 70 65  "");.  zMimetype
5920: 20 3d 20 77 69 6b 69 5f 66 69 6c 74 65 72 5f 6d   = wiki_filter_m
5930: 69 6d 65 74 79 70 65 73 28 50 28 22 6d 69 6d 65  imetypes(P("mime
5940: 74 79 70 65 22 29 29 3b 0a 20 20 69 66 28 20 7a  type"));.  if( z
5950: 4e 61 6d 65 5b 30 5d 20 26 26 20 77 69 6b 69 5f  Name[0] && wiki_
5960: 6e 61 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d  name_is_wellform
5970: 65 64 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ed((const unsign
5980: 65 64 20 63 68 61 72 20 2a 29 7a 4e 61 6d 65 29  ed char *)zName)
5990: 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 73 73   ){.    if( foss
59a0: 69 6c 5f 73 74 72 63 6d 70 28 7a 4d 69 6d 65 74  il_strcmp(zMimet
59b0: 79 70 65 2c 22 74 65 78 74 2f 78 2d 66 6f 73 73  ype,"text/x-foss
59c0: 69 6c 2d 77 69 6b 69 22 29 3d 3d 30 0a 20 20 20  il-wiki")==0.   
59d0: 20 20 26 26 20 64 62 5f 67 65 74 5f 62 6f 6f 6c    && db_get_bool
59e0: 65 61 6e 28 22 77 79 73 69 77 79 67 2d 77 69 6b  ean("wysiwyg-wik
59f0: 69 22 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20  i", 0).    ){.  
5a00: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
5a10: 66 28 22 77 69 6b 69 65 64 69 74 3f 6e 61 6d 65  f("wikiedit?name
5a20: 3d 25 54 26 77 79 73 69 77 79 67 3d 31 22 2c 20  =%T&wysiwyg=1", 
5a30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
5a40: 65 7b 0a 20 20 20 20 20 20 63 67 69 5f 72 65 64  e{.      cgi_red
5a50: 69 72 65 63 74 66 28 22 77 69 6b 69 65 64 69 74  irectf("wikiedit
5a60: 3f 6e 61 6d 65 3d 25 54 26 6d 69 6d 65 74 79 70  ?name=%T&mimetyp
5a70: 65 3d 25 73 22 2c 20 7a 4e 61 6d 65 2c 20 7a 4d  e=%s", zName, zM
5a80: 69 6d 65 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a  imetype);.    }.
5a90: 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64    }.  style_head
5aa0: 65 72 28 22 43 72 65 61 74 65 20 41 20 4e 65 77  er("Create A New
5ab0: 20 57 69 6b 69 20 50 61 67 65 22 29 3b 0a 20 20   Wiki Page");.  
5ac0: 77 69 6b 69 5f 73 74 61 6e 64 61 72 64 5f 73 75  wiki_standard_su
5ad0: 62 6d 65 6e 75 28 57 5f 41 4c 4c 5f 42 55 54 28  bmenu(W_ALL_BUT(
5ae0: 57 5f 4e 45 57 29 29 3b 0a 20 20 40 20 3c 70 3e  W_NEW));.  @ <p>
5af0: 52 75 6c 65 73 20 66 6f 72 20 77 69 6b 69 20 70  Rules for wiki p
5b00: 61 67 65 20 6e 61 6d 65 73 3a 3c 2f 70 3e 0a 20  age names:</p>. 
5b10: 20 77 65 6c 6c 5f 66 6f 72 6d 65 64 5f 77 69 6b   well_formed_wik
5b20: 69 5f 6e 61 6d 65 5f 72 75 6c 65 73 28 29 3b 0a  i_name_rules();.
5b30: 20 20 66 6f 72 6d 5f 62 65 67 69 6e 28 30 2c 20    form_begin(0, 
5b40: 22 25 52 2f 77 69 6b 69 6e 65 77 22 29 3b 0a 20  "%R/wikinew");. 
5b50: 20 40 20 3c 70 3e 4e 61 6d 65 20 6f 66 20 6e 65   @ <p>Name of ne
5b60: 77 20 77 69 6b 69 20 70 61 67 65 3a 0a 20 20 40  w wiki page:.  @
5b70: 20 3c 69 6e 70 75 74 20 73 74 79 6c 65 3d 22 77   <input style="w
5b80: 69 64 74 68 3a 20 33 35 3b 22 20 74 79 70 65 3d  idth: 35;" type=
5b90: 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 6e 61 6d  "text" name="nam
5ba0: 65 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4e 61  e" value="%h(zNa
5bb0: 6d 65 29 22 20 2f 3e 3c 62 72 20 2f 3e 0a 20 20  me)" /><br />.  
5bc0: 40 20 4d 61 72 6b 75 70 20 73 74 79 6c 65 3a 0a  @ Markup style:.
5bd0: 20 20 6d 69 6d 65 74 79 70 65 5f 6f 70 74 69 6f    mimetype_optio
5be0: 6e 5f 6d 65 6e 75 28 22 74 65 78 74 2f 78 2d 66  n_menu("text/x-f
5bf0: 6f 73 73 69 6c 2d 77 69 6b 69 22 29 3b 0a 20 20  ossil-wiki");.  
5c00: 40 20 3c 62 72 20 2f 3e 3c 69 6e 70 75 74 20 74  @ <br /><input t
5c10: 79 70 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c  ype="submit" val
5c20: 75 65 3d 22 43 72 65 61 74 65 22 20 2f 3e 0a 20  ue="Create" />. 
5c30: 20 40 20 3c 2f 70 3e 3c 2f 66 6f 72 6d 3e 0a 20   @ </p></form>. 
5c40: 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 20 29 7b   if( zName[0] ){
5c50: 0a 20 20 20 20 40 20 3c 70 3e 3c 73 70 61 6e 20  .    @ <p><span 
5c60: 63 6c 61 73 73 3d 22 77 69 6b 69 45 72 72 6f 72  class="wikiError
5c70: 22 3e 0a 20 20 20 20 40 20 22 25 68 28 7a 4e 61  ">.    @ "%h(zNa
5c80: 6d 65 29 22 20 69 73 20 6e 6f 74 20 61 20 76 61  me)" is not a va
5c90: 6c 69 64 20 77 69 6b 69 20 70 61 67 65 20 6e 61  lid wiki page na
5ca0: 6d 65 21 3c 2f 73 70 61 6e 3e 3c 2f 70 3e 0a 20  me!</span></p>. 
5cb0: 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65   }.  style_foote
5cc0: 72 28 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  r();.}.../*.** A
5cd0: 70 70 65 6e 64 20 74 68 65 20 77 69 6b 69 20 74  ppend the wiki t
5ce0: 65 78 74 20 66 6f 72 20 61 6e 20 72 65 6d 61 72  ext for an remar
5cf0: 6b 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  k to the end of 
5d00: 74 68 65 20 67 69 76 65 6e 20 42 4c 4f 42 2e 0a  the given BLOB..
5d10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
5d20: 70 70 65 6e 64 52 65 6d 61 72 6b 28 42 6c 6f 62  ppendRemark(Blob
5d30: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5d40: 2a 7a 4d 69 6d 65 74 79 70 65 29 7b 0a 20 20 63  *zMimetype){.  c
5d50: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 6f  har *zDate;.  co
5d60: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b  nst char *zUser;
5d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5d80: 52 65 6d 61 72 6b 3b 0a 20 20 63 68 61 72 20 2a  Remark;.  char *
5d90: 7a 49 64 3b 0a 0a 20 20 7a 44 61 74 65 20 3d 20  zId;..  zDate = 
5da0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
5db0: 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77  CT datetime('now
5dc0: 27 29 22 29 3b 0a 20 20 7a 52 65 6d 61 72 6b 20  ')");.  zRemark 
5dd0: 3d 20 50 44 28 22 72 22 2c 22 22 29 3b 0a 20 20  = PD("r","");.  
5de0: 7a 55 73 65 72 20 3d 20 50 44 28 22 75 22 2c 67  zUser = PD("u",g
5df0: 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 69 66 28 20  .zLogin);.  if( 
5e00: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4d  fossil_strcmp(zM
5e10: 69 6d 65 74 79 70 65 2c 20 22 74 65 78 74 2f 78  imetype, "text/x
5e20: 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 29 3d 3d  -fossil-wiki")==
5e30: 30 20 29 7b 0a 20 20 20 20 7a 49 64 20 3d 20 64  0 ){.    zId = d
5e40: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
5e50: 54 20 6c 6f 77 65 72 28 68 65 78 28 72 61 6e 64  T lower(hex(rand
5e60: 6f 6d 62 6c 6f 62 28 38 29 29 29 22 29 3b 0a 20  omblob(8)))");. 
5e70: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
5e80: 70 2c 20 22 5c 6e 5c 6e 3c 68 72 20 2f 3e 3c 64  p, "\n\n<hr /><d
5e90: 69 76 20 69 64 3d 5c 22 25 73 5c 22 3e 3c 69 3e  iv id=\"%s\"><i>
5ea0: 4f 6e 20 25 73 20 55 54 43 20 25 68 22 2c 0a 20  On %s UTC %h",. 
5eb0: 20 20 20 20 20 7a 49 64 2c 20 7a 44 61 74 65 2c       zId, zDate,
5ec0: 20 6c 6f 67 69 6e 5f 6e 61 6d 65 28 29 29 3b 0a   login_name());.
5ed0: 20 20 20 20 69 66 28 20 7a 55 73 65 72 5b 30 5d      if( zUser[0]
5ee0: 20 26 26 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d   && fossil_strcm
5ef0: 70 28 7a 55 73 65 72 2c 6c 6f 67 69 6e 5f 6e 61  p(zUser,login_na
5f00: 6d 65 28 29 29 20 29 7b 0a 20 20 20 20 20 20 62  me()) ){.      b
5f10: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  lob_appendf(p, "
5f20: 20 28 63 6c 61 69 6d 69 6e 67 20 74 6f 20 62 65   (claiming to be
5f30: 20 25 68 29 22 2c 20 7a 55 73 65 72 29 3b 0a 20   %h)", zUser);. 
5f40: 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70     }.    blob_ap
5f50: 70 65 6e 64 66 28 70 2c 20 22 20 61 64 64 65 64  pendf(p, " added
5f60: 3a 3c 2f 69 3e 3c 62 72 20 2f 3e 5c 6e 25 73 3c  :</i><br />\n%s<
5f70: 2f 64 69 76 20 69 64 3d 5c 22 25 73 5c 22 3e 22  /div id=\"%s\">"
5f80: 2c 20 7a 52 65 6d 61 72 6b 2c 20 7a 49 64 29 3b  , zRemark, zId);
5f90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6f 73  .  }else if( fos
5fa0: 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4d 69 6d 65  sil_strcmp(zMime
5fb0: 74 79 70 65 2c 20 22 74 65 78 74 2f 78 2d 6d 61  type, "text/x-ma
5fc0: 72 6b 64 6f 77 6e 22 29 3d 3d 30 20 29 7b 0a 20  rkdown")==0 ){. 
5fd0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
5fe0: 70 2c 20 22 5c 6e 5c 6e 2d 2d 2d 2d 2d 2d 5c 6e  p, "\n\n------\n
5ff0: 2a 4f 6e 20 25 73 20 55 54 43 20 25 68 22 2c 20  *On %s UTC %h", 
6000: 7a 44 61 74 65 2c 20 6c 6f 67 69 6e 5f 6e 61 6d  zDate, login_nam
6010: 65 28 29 29 3b 0a 20 20 20 20 69 66 28 20 7a 55  e());.    if( zU
6020: 73 65 72 5b 30 5d 20 26 26 20 66 6f 73 73 69 6c  ser[0] && fossil
6030: 5f 73 74 72 63 6d 70 28 7a 55 73 65 72 2c 6c 6f  _strcmp(zUser,lo
6040: 67 69 6e 5f 6e 61 6d 65 28 29 29 20 29 7b 0a 20  gin_name()) ){. 
6050: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
6060: 66 28 70 2c 20 22 20 28 63 6c 61 69 6d 69 6e 67  f(p, " (claiming
6070: 20 74 6f 20 62 65 20 25 68 29 22 2c 20 7a 55 73   to be %h)", zUs
6080: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  er);.    }.    b
6090: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  lob_appendf(p, "
60a0: 20 61 64 64 65 64 3a 2a 5c 6e 5c 6e 25 73 5c 6e   added:*\n\n%s\n
60b0: 22 2c 20 7a 52 65 6d 61 72 6b 29 3b 0a 20 20 7d  ", zRemark);.  }
60c0: 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  else{.    blob_a
60d0: 70 70 65 6e 64 66 28 70 2c 20 22 5c 6e 5c 6e 2d  ppendf(p, "\n\n-
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
6110: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
6120: 20 20 20 20 20 20 20 22 4f 6e 20 25 73 20 55 54         "On %s UT
6130: 43 20 25 73 22 2c 20 7a 44 61 74 65 2c 20 6c 6f  C %s", zDate, lo
6140: 67 69 6e 5f 6e 61 6d 65 28 29 29 3b 0a 20 20 20  gin_name());.   
6150: 20 69 66 28 20 7a 55 73 65 72 5b 30 5d 20 26 26   if( zUser[0] &&
6160: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a   fossil_strcmp(z
6170: 55 73 65 72 2c 6c 6f 67 69 6e 5f 6e 61 6d 65 28  User,login_name(
6180: 29 29 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  )) ){.      blob
6190: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 20 28 63  _appendf(p, " (c
61a0: 6c 61 69 6d 69 6e 67 20 74 6f 20 62 65 20 25 73  laiming to be %s
61b0: 29 22 2c 20 7a 55 73 65 72 29 3b 0a 20 20 20 20  )", zUser);.    
61c0: 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  }.    blob_appen
61d0: 64 66 28 70 2c 20 22 20 61 64 64 65 64 3a 5c 6e  df(p, " added:\n
61e0: 5c 6e 25 73 5c 6e 22 2c 20 7a 52 65 6d 61 72 6b  \n%s\n", zRemark
61f0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 73 73 69 6c 5f  );.  }.  fossil_
6200: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 7d 0a 0a  free(zDate);.}..
6210: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 77  /*.** WEBPAGE: w
6220: 69 6b 69 61 70 70 65 6e 64 0a 2a 2a 20 55 52 4c  ikiappend.** URL
6230: 3a 20 2f 77 69 6b 69 61 70 70 65 6e 64 3f 6e 61  : /wikiappend?na
6240: 6d 65 3d 50 41 47 45 4e 41 4d 45 26 6d 69 6d 65  me=PAGENAME&mime
6250: 74 79 70 65 3d 4d 49 4d 45 54 59 50 45 0a 2a 2a  type=MIMETYPE.**
6260: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
6270: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  to the end of a 
6280: 77 69 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  wiki page..*/.vo
6290: 69 64 20 77 69 6b 69 61 70 70 65 6e 64 5f 70 61  id wikiappend_pa
62a0: 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72  ge(void){.  char
62b0: 20 2a 7a 54 61 67 3b 0a 20 20 69 6e 74 20 72 69   *zTag;.  int ri
62c0: 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53  d = 0;.  int isS
62d0: 61 6e 64 62 6f 78 3b 0a 20 20 63 6f 6e 73 74 20  andbox;.  const 
62e0: 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b  char *zPageName;
62f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6300: 55 73 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  User;.  const ch
6310: 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65 3b 0a 20  ar *zMimetype;. 
6320: 20 69 6e 74 20 67 6f 6f 64 43 61 70 74 63 68 61   int goodCaptcha
6330: 20 3d 20 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 1;.  const ch
6340: 61 72 20 2a 7a 46 6f 72 6d 61 74 3b 0a 0a 20 20  ar *zFormat;..  
6350: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
6360: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 7a 50 61  entials();.  zPa
6370: 67 65 4e 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d  geName = PD("nam
6380: 65 22 2c 22 22 29 3b 0a 20 20 7a 4d 69 6d 65 74  e","");.  zMimet
6390: 79 70 65 20 3d 20 77 69 6b 69 5f 66 69 6c 74 65  ype = wiki_filte
63a0: 72 5f 6d 69 6d 65 74 79 70 65 73 28 50 28 22 6d  r_mimetypes(P("m
63b0: 69 6d 65 74 79 70 65 22 29 29 3b 0a 20 20 69 66  imetype"));.  if
63c0: 28 20 63 68 65 63 6b 5f 6e 61 6d 65 28 7a 50 61  ( check_name(zPa
63d0: 67 65 4e 61 6d 65 29 20 29 20 72 65 74 75 72 6e  geName) ) return
63e0: 3b 0a 20 20 69 73 53 61 6e 64 62 6f 78 20 3d 20  ;.  isSandbox = 
63f0: 69 73 5f 73 61 6e 64 62 6f 78 28 7a 50 61 67 65  is_sandbox(zPage
6400: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73  Name);.  if( !is
6410: 53 61 6e 64 62 6f 78 20 29 7b 0a 20 20 20 20 7a  Sandbox ){.    z
6420: 54 61 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 77  Tag = mprintf("w
6430: 69 6b 69 2d 25 73 22 2c 20 7a 50 61 67 65 4e 61  iki-%s", zPageNa
6440: 6d 65 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 64  me);.    rid = d
6450: 62 5f 69 6e 74 28 30 2c 0a 20 20 20 20 20 20 22  b_int(0,.      "
6460: 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20  SELECT rid FROM 
6470: 74 61 67 78 72 65 66 22 0a 20 20 20 20 20 20 22  tagxref".      "
6480: 20 57 48 45 52 45 20 74 61 67 69 64 3d 28 53 45   WHERE tagid=(SE
6490: 4c 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20  LECT tagid FROM 
64a0: 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d  tag WHERE tagnam
64b0: 65 3d 25 51 29 22 0a 20 20 20 20 20 20 22 20 4f  e=%Q)".      " O
64c0: 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20 44 45  RDER BY mtime DE
64d0: 53 43 22 2c 20 7a 54 61 67 0a 20 20 20 20 29 3b  SC", zTag.    );
64e0: 0a 20 20 20 20 66 72 65 65 28 7a 54 61 67 29 3b  .    free(zTag);
64f0: 0a 20 20 20 20 69 66 28 20 21 72 69 64 20 29 7b  .    if( !rid ){
6500: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 72 65  .      fossil_re
6510: 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20  direct_home();. 
6520: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6530: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 67 2e   }.  }.  if( !g.
6540: 70 65 72 6d 2e 41 70 6e 64 57 69 6b 69 20 29 7b  perm.ApndWiki ){
6550: 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  .    login_neede
6560: 64 28 67 2e 61 6e 6f 6e 2e 41 70 6e 64 57 69 6b  d(g.anon.ApndWik
6570: 69 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  i);.    return;.
6580: 20 20 7d 0a 20 20 69 66 28 20 50 28 22 73 75 62    }.  if( P("sub
6590: 6d 69 74 22 29 21 3d 30 20 26 26 20 50 28 22 72  mit")!=0 && P("r
65a0: 22 29 21 3d 30 20 26 26 20 50 28 22 75 22 29 21  ")!=0 && P("u")!
65b0: 3d 30 0a 20 20 20 26 26 20 28 67 6f 6f 64 43 61  =0.   && (goodCa
65c0: 70 74 63 68 61 20 3d 20 63 61 70 74 63 68 61 5f  ptcha = captcha_
65d0: 69 73 5f 63 6f 72 72 65 63 74 28 30 29 29 0a 20  is_correct(0)). 
65e0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
65f0: 61 74 65 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6b  ate;.    Blob ck
6600: 73 75 6d 3b 0a 20 20 20 20 42 6c 6f 62 20 62 6f  sum;.    Blob bo
6610: 64 79 3b 0a 20 20 20 20 42 6c 6f 62 20 77 69 6b  dy;.    Blob wik
6620: 69 3b 0a 20 20 20 20 4d 61 6e 69 66 65 73 74 20  i;.    Manifest 
6630: 2a 70 57 69 6b 69 20 3d 20 30 3b 0a 0a 20 20 20  *pWiki = 0;..   
6640: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 62 6f 64 79   blob_zero(&body
6650: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 53 61 6e  );.    if( isSan
6660: 64 62 6f 78 20 29 7b 0a 20 20 20 20 20 20 62 6c  dbox ){.      bl
6670: 6f 62 5f 61 70 70 65 6e 64 28 26 62 6f 64 79 2c  ob_append(&body,
6680: 20 64 62 5f 67 65 74 28 22 73 61 6e 64 62 6f 78   db_get("sandbox
6690: 22 2c 22 22 29 2c 20 2d 31 29 3b 0a 20 20 20 20  ",""), -1);.    
66a0: 20 20 61 70 70 65 6e 64 52 65 6d 61 72 6b 28 26    appendRemark(&
66b0: 62 6f 64 79 2c 20 7a 4d 69 6d 65 74 79 70 65 29  body, zMimetype)
66c0: 3b 0a 20 20 20 20 20 20 64 62 5f 73 65 74 28 22  ;.      db_set("
66d0: 73 61 6e 64 62 6f 78 22 2c 20 62 6c 6f 62 5f 73  sandbox", blob_s
66e0: 74 72 28 26 62 6f 64 79 29 2c 20 30 29 3b 0a 20  tr(&body), 0);. 
66f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6700: 6c 6f 67 69 6e 5f 76 65 72 69 66 79 5f 63 73 72  login_verify_csr
6710: 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 20 20  f_secret();.    
6720: 20 20 70 57 69 6b 69 20 3d 20 6d 61 6e 69 66 65    pWiki = manife
6730: 73 74 5f 67 65 74 28 72 69 64 2c 20 43 46 54 59  st_get(rid, CFTY
6740: 50 45 5f 57 49 4b 49 2c 20 30 29 3b 0a 20 20 20  PE_WIKI, 0);.   
6750: 20 20 20 69 66 28 20 70 57 69 6b 69 20 29 7b 0a     if( pWiki ){.
6760: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
6770: 65 6e 64 28 26 62 6f 64 79 2c 20 70 57 69 6b 69  end(&body, pWiki
6780: 2d 3e 7a 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20  ->zWiki, -1);.  
6790: 20 20 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 64        manifest_d
67a0: 65 73 74 72 6f 79 28 70 57 69 6b 69 29 3b 0a 20  estroy(pWiki);. 
67b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f       }.      blo
67c0: 62 5f 7a 65 72 6f 28 26 77 69 6b 69 29 3b 0a 20  b_zero(&wiki);. 
67d0: 20 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74 72       db_begin_tr
67e0: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
67f0: 20 20 20 7a 44 61 74 65 20 3d 20 64 61 74 65 5f     zDate = date_
6800: 69 6e 5f 73 74 61 6e 64 61 72 64 5f 66 6f 72 6d  in_standard_form
6810: 61 74 28 22 6e 6f 77 22 29 3b 0a 20 20 20 20 20  at("now");.     
6820: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
6830: 69 6b 69 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a  iki, "D %s\n", z
6840: 44 61 74 65 29 3b 0a 20 20 20 20 20 20 62 6c 6f  Date);.      blo
6850: 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69 2c  b_appendf(&wiki,
6860: 20 22 4c 20 25 46 5c 6e 22 2c 20 7a 50 61 67 65   "L %F\n", zPage
6870: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
6880: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a   fossil_strcmp(z
6890: 4d 69 6d 65 74 79 70 65 2c 20 22 74 65 78 74 2f  Mimetype, "text/
68a0: 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 29 21  x-fossil-wiki")!
68b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  =0 ){.        bl
68c0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b 69  ob_appendf(&wiki
68d0: 2c 20 22 4e 20 25 73 5c 6e 22 2c 20 7a 4d 69 6d  , "N %s\n", zMim
68e0: 65 74 79 70 65 29 3b 0a 20 20 20 20 20 20 7d 0a  etype);.      }.
68f0: 20 20 20 20 20 20 69 66 28 20 72 69 64 20 29 7b        if( rid ){
6900: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
6910: 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30  Uuid = db_text(0
6920: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
6930: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
6940: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
6950: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
6960: 64 66 28 26 77 69 6b 69 2c 20 22 50 20 25 73 5c  df(&wiki, "P %s\
6970: 6e 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  n", zUuid);.    
6980: 20 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b      free(zUuid);
6990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
69a0: 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f 6e 6f 62  f( !login_is_nob
69b0: 6f 64 79 28 29 20 29 7b 0a 20 20 20 20 20 20 20  ody() ){.       
69c0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
69d0: 69 6b 69 2c 20 22 55 20 25 46 5c 6e 22 2c 20 6c  iki, "U %F\n", l
69e0: 6f 67 69 6e 5f 6e 61 6d 65 28 29 29 3b 0a 20 20  ogin_name());.  
69f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
6a00: 6e 64 52 65 6d 61 72 6b 28 26 62 6f 64 79 2c 20  ndRemark(&body, 
6a10: 7a 4d 69 6d 65 74 79 70 65 29 3b 0a 20 20 20 20  zMimetype);.    
6a20: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
6a30: 77 69 6b 69 2c 20 22 57 20 25 64 5c 6e 25 73 5c  wiki, "W %d\n%s\
6a40: 6e 22 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 62  n", blob_size(&b
6a50: 6f 64 79 29 2c 20 62 6c 6f 62 5f 73 74 72 28 26  ody), blob_str(&
6a60: 62 6f 64 79 29 29 3b 0a 20 20 20 20 20 20 6d 64  body));.      md
6a70: 35 73 75 6d 5f 62 6c 6f 62 28 26 77 69 6b 69 2c  5sum_blob(&wiki,
6a80: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20   &cksum);.      
6a90: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
6aa0: 6b 69 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63  ki, "Z %b\n", &c
6ab0: 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 62 6c 6f  ksum);.      blo
6ac0: 62 5f 72 65 73 65 74 28 26 63 6b 73 75 6d 29 3b  b_reset(&cksum);
6ad0: 0a 20 20 20 20 20 20 77 69 6b 69 5f 70 75 74 28  .      wiki_put(
6ae0: 26 77 69 6b 69 2c 20 72 69 64 2c 20 77 69 6b 69  &wiki, rid, wiki
6af0: 5f 6e 65 65 64 5f 6d 6f 64 65 72 61 74 69 6f 6e  _need_moderation
6b00: 28 30 29 29 3b 0a 20 20 20 20 20 20 64 62 5f 65  (0));.      db_e
6b10: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30  nd_transaction(0
6b20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 67 69  );.    }.    cgi
6b30: 5f 72 65 64 69 72 65 63 74 66 28 22 77 69 6b 69  _redirectf("wiki
6b40: 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a 50 61 67 65  ?name=%T", zPage
6b50: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Name);.  }.  if(
6b60: 20 50 28 22 63 61 6e 63 65 6c 22 29 21 3d 30 20   P("cancel")!=0 
6b70: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  ){.    cgi_redir
6b80: 65 63 74 66 28 22 77 69 6b 69 3f 6e 61 6d 65 3d  ectf("wiki?name=
6b90: 25 54 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b  %T", zPageName);
6ba0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6bb0: 0a 20 20 73 74 79 6c 65 5f 73 65 74 5f 63 75 72  .  style_set_cur
6bc0: 72 65 6e 74 5f 70 61 67 65 28 22 25 54 3f 6e 61  rent_page("%T?na
6bd0: 6d 65 3d 25 54 22 2c 20 67 2e 7a 50 61 74 68 2c  me=%T", g.zPath,
6be0: 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 73   zPageName);.  s
6bf0: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 41 70 70  tyle_header("App
6c00: 65 6e 64 20 43 6f 6d 6d 65 6e 74 20 54 6f 3a 20  end Comment To: 
6c10: 25 73 22 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b  %s", zPageName);
6c20: 0a 20 20 69 66 28 20 21 67 6f 6f 64 43 61 70 74  .  if( !goodCapt
6c30: 63 68 61 20 29 7b 0a 20 20 20 20 40 20 3c 70 20  cha ){.    @ <p 
6c40: 63 6c 61 73 73 3d 22 67 65 6e 65 72 61 6c 45 72  class="generalEr
6c50: 72 6f 72 22 3e 45 72 72 6f 72 3a 20 49 6e 63 6f  ror">Error: Inco
6c60: 72 72 65 63 74 20 73 65 63 75 72 69 74 79 20 63  rrect security c
6c70: 6f 64 65 2e 3c 2f 70 3e 0a 20 20 7d 0a 20 20 69  ode.</p>.  }.  i
6c80: 66 28 20 50 28 22 70 72 65 76 69 65 77 22 29 21  f( P("preview")!
6c90: 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 70  =0 ){.    Blob p
6ca0: 72 65 76 69 65 77 3b 0a 20 20 20 20 62 6c 6f 62  review;.    blob
6cb0: 5f 7a 65 72 6f 28 26 70 72 65 76 69 65 77 29 3b  _zero(&preview);
6cc0: 0a 20 20 20 20 61 70 70 65 6e 64 52 65 6d 61 72  .    appendRemar
6cd0: 6b 28 26 70 72 65 76 69 65 77 2c 20 7a 4d 69 6d  k(&preview, zMim
6ce0: 65 74 79 70 65 29 3b 0a 20 20 20 20 40 20 50 72  etype);.    @ Pr
6cf0: 65 76 69 65 77 3a 3c 68 72 20 2f 3e 0a 20 20 20  eview:<hr />.   
6d00: 20 77 69 6b 69 5f 72 65 6e 64 65 72 5f 62 79 5f   wiki_render_by_
6d10: 6d 69 6d 65 74 79 70 65 28 26 70 72 65 76 69 65  mimetype(&previe
6d20: 77 2c 20 7a 4d 69 6d 65 74 79 70 65 29 3b 0a 20  w, zMimetype);. 
6d30: 20 20 20 40 20 3c 68 72 20 2f 3e 0a 20 20 20 20     @ <hr />.    
6d40: 62 6c 6f 62 5f 72 65 73 65 74 28 26 70 72 65 76  blob_reset(&prev
6d50: 69 65 77 29 3b 0a 20 20 7d 0a 20 20 7a 55 73 65  iew);.  }.  zUse
6d60: 72 20 3d 20 50 44 28 22 75 22 2c 20 67 2e 7a 4c  r = PD("u", g.zL
6d70: 6f 67 69 6e 29 3b 0a 20 20 66 6f 72 6d 5f 62 65  ogin);.  form_be
6d80: 67 69 6e 28 30 2c 20 22 25 52 2f 77 69 6b 69 61  gin(0, "%R/wikia
6d90: 70 70 65 6e 64 22 29 3b 0a 20 20 6c 6f 67 69 6e  ppend");.  login
6da0: 5f 69 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63  _insert_csrf_sec
6db0: 72 65 74 28 29 3b 0a 20 20 40 20 3c 69 6e 70 75  ret();.  @ <inpu
6dc0: 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20  t type="hidden" 
6dd0: 6e 61 6d 65 3d 22 6e 61 6d 65 22 20 76 61 6c 75  name="name" valu
6de0: 65 3d 22 25 68 28 7a 50 61 67 65 4e 61 6d 65 29  e="%h(zPageName)
6df0: 22 20 2f 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  " />.  @ <input 
6e00: 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61  type="hidden" na
6e10: 6d 65 3d 22 6d 69 6d 65 74 79 70 65 22 20 76 61  me="mimetype" va
6e20: 6c 75 65 3d 22 25 68 28 7a 4d 69 6d 65 74 79 70  lue="%h(zMimetyp
6e30: 65 29 22 20 2f 3e 0a 20 20 40 20 59 6f 75 72 20  e)" />.  @ Your 
6e40: 4e 61 6d 65 3a 0a 20 20 40 20 3c 69 6e 70 75 74  Name:.  @ <input
6e50: 20 74 79 70 65 3d 22 74 65 78 74 22 20 6e 61 6d   type="text" nam
6e60: 65 3d 22 75 22 20 73 69 7a 65 3d 22 32 30 22 20  e="u" size="20" 
6e70: 76 61 6c 75 65 3d 22 25 68 28 7a 55 73 65 72 29  value="%h(zUser)
6e80: 22 20 2f 3e 3c 62 72 20 2f 3e 0a 20 20 7a 46 6f  " /><br />.  zFo
6e90: 72 6d 61 74 20 3d 20 6d 69 6d 65 74 79 70 65 5f  rmat = mimetype_
6ea0: 63 6f 6d 6d 6f 6e 5f 6e 61 6d 65 28 7a 4d 69 6d  common_name(zMim
6eb0: 65 74 79 70 65 29 3b 0a 20 20 40 20 43 6f 6d 6d  etype);.  @ Comm
6ec0: 65 6e 74 20 74 6f 20 61 70 70 65 6e 64 20 28 66  ent to append (f
6ed0: 6f 72 6d 61 74 74 65 64 20 61 73 20 25 73 28 7a  ormatted as %s(z
6ee0: 46 6f 72 6d 61 74 29 29 3a 3c 62 72 20 2f 3e 0a  Format)):<br />.
6ef0: 20 20 40 20 3c 74 65 78 74 61 72 65 61 20 6e 61    @ <textarea na
6f00: 6d 65 3d 22 72 22 20 63 6c 61 73 73 3d 22 77 69  me="r" class="wi
6f10: 6b 69 65 64 69 74 22 20 63 6f 6c 73 3d 22 38 30  kiedit" cols="80
6f20: 22 0a 20 20 40 20 20 72 6f 77 73 3d 22 31 30 22  ".  @  rows="10"
6f30: 20 77 72 61 70 3d 22 76 69 72 74 75 61 6c 22 3e   wrap="virtual">
6f40: 25 68 28 50 44 28 22 72 22 2c 22 22 29 29 3c 2f  %h(PD("r",""))</
6f50: 74 65 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 62  textarea>.  @ <b
6f60: 72 20 2f 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  r />.  @ <input 
6f70: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61  type="submit" na
6f80: 6d 65 3d 22 70 72 65 76 69 65 77 22 20 76 61 6c  me="preview" val
6f90: 75 65 3d 22 50 72 65 76 69 65 77 20 59 6f 75 72  ue="Preview Your
6fa0: 20 43 6f 6d 6d 65 6e 74 22 20 2f 3e 0a 20 20 40   Comment" />.  @
6fb0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
6fc0: 62 6d 69 74 22 20 6e 61 6d 65 3d 22 73 75 62 6d  bmit" name="subm
6fd0: 69 74 22 20 76 61 6c 75 65 3d 22 41 70 70 65 6e  it" value="Appen
6fe0: 64 20 59 6f 75 72 20 43 68 61 6e 67 65 73 22 20  d Your Changes" 
6ff0: 2f 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  />.  @ <input ty
7000: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65  pe="submit" name
7010: 3d 22 63 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d  ="cancel" value=
7020: 22 43 61 6e 63 65 6c 22 20 2f 3e 0a 20 20 63 61  "Cancel" />.  ca
7030: 70 74 63 68 61 5f 67 65 6e 65 72 61 74 65 28 30  ptcha_generate(0
7040: 29 3b 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  );.  @ </form>. 
7050: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
7060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
7070: 45 3a 20 77 68 69 73 74 6f 72 79 0a 2a 2a 20 55  E: whistory.** U
7080: 52 4c 3a 20 2f 77 68 69 73 74 6f 72 79 3f 6e 61  RL: /whistory?na
7090: 6d 65 3d 50 41 47 45 4e 41 4d 45 0a 2a 2a 0a 2a  me=PAGENAME.**.*
70a0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 70 61 72  * Additional par
70b0: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
70c0: 20 20 20 73 68 6f 77 69 64 20 20 20 20 20 20 20     showid       
70d0: 20 20 20 53 68 6f 77 20 52 49 44 20 76 61 6c 75     Show RID valu
70e0: 65 73 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 74 68  es.**.** Show th
70f0: 65 20 63 6f 6d 70 6c 65 74 65 20 63 68 61 6e 67  e complete chang
7100: 65 20 68 69 73 74 6f 72 79 20 66 6f 72 20 61 20  e history for a 
7110: 73 69 6e 67 6c 65 20 77 69 6b 69 20 70 61 67 65  single wiki page
7120: 2e 0a 2a 2f 0a 76 6f 69 64 20 77 68 69 73 74 6f  ..*/.void whisto
7130: 72 79 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  ry_page(void){. 
7140: 20 53 74 6d 74 20 71 3b 0a 20 20 63 6f 6e 73 74   Stmt q;.  const
7150: 20 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d 65   char *zPageName
7160: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 4e 6f 77 3b  ;.  double rNow;
7170: 0a 20 20 69 6e 74 20 73 68 6f 77 52 69 64 3b 0a  .  int showRid;.
7180: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
7190: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
71a0: 66 28 20 21 67 2e 70 65 72 6d 2e 48 79 70 65 72  f( !g.perm.Hyper
71b0: 6c 69 6e 6b 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65  link ){ login_ne
71c0: 65 64 65 64 28 67 2e 61 6e 6f 6e 2e 48 79 70 65  eded(g.anon.Hype
71d0: 72 6c 69 6e 6b 29 3b 20 72 65 74 75 72 6e 3b 20  rlink); return; 
71e0: 7d 0a 20 20 7a 50 61 67 65 4e 61 6d 65 20 3d 20  }.  zPageName = 
71f0: 50 44 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a 20  PD("name","");. 
7200: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 48   style_header("H
7210: 69 73 74 6f 72 79 20 4f 66 20 25 73 22 2c 20 7a  istory Of %s", z
7220: 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20 73 68 6f  PageName);.  sho
7230: 77 52 69 64 20 3d 20 50 28 22 73 68 6f 77 69 64  wRid = P("showid
7240: 22 29 21 3d 30 3b 0a 20 20 64 62 5f 70 72 65 70  ")!=0;.  db_prep
7250: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c  are(&q,.    "SEL
7260: 45 43 54 22 0a 20 20 20 20 22 20 20 65 76 65 6e  ECT".    "  even
7270: 74 2e 6d 74 69 6d 65 2c 22 0a 20 20 20 20 22 20  t.mtime,".    " 
7280: 20 62 6c 6f 62 2e 75 75 69 64 2c 22 0a 20 20 20   blob.uuid,".   
7290: 20 22 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65   "  coalesce(eve
72a0: 6e 74 2e 65 75 73 65 72 2c 65 76 65 6e 74 2e 75  nt.euser,event.u
72b0: 73 65 72 29 2c 22 0a 20 20 20 20 22 20 20 65 76  ser),".    "  ev
72c0: 65 6e 74 2e 6f 62 6a 69 64 22 0a 20 20 20 20 22  ent.objid".    "
72d0: 20 46 52 4f 4d 20 65 76 65 6e 74 2c 20 62 6c 6f   FROM event, blo
72e0: 62 2c 20 74 61 67 2c 20 74 61 67 78 72 65 66 22  b, tag, tagxref"
72f0: 0a 20 20 20 20 22 20 57 48 45 52 45 20 65 76 65  .    " WHERE eve
7300: 6e 74 2e 74 79 70 65 3d 27 77 27 20 41 4e 44 20  nt.type='w' AND 
7310: 62 6c 6f 62 2e 72 69 64 3d 65 76 65 6e 74 2e 6f  blob.rid=event.o
7320: 62 6a 69 64 22 0a 20 20 20 20 22 20 20 20 41 4e  bjid".    "   AN
7330: 44 20 74 61 67 2e 74 61 67 6e 61 6d 65 3d 27 77  D tag.tagname='w
7340: 69 6b 69 2d 25 71 27 22 0a 20 20 20 20 22 20 20  iki-%q'".    "  
7350: 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67   AND tagxref.tag
7360: 69 64 3d 74 61 67 2e 74 61 67 69 64 20 41 4e 44  id=tag.tagid AND
7370: 20 74 61 67 78 72 65 66 2e 73 72 63 69 64 3d 65   tagxref.srcid=e
7380: 76 65 6e 74 2e 6f 62 6a 69 64 22 0a 20 20 20 20  vent.objid".    
7390: 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74  " ORDER BY event
73a0: 2e 6d 74 69 6d 65 20 44 45 53 43 22 2c 0a 20 20  .mtime DESC",.  
73b0: 20 20 7a 50 61 67 65 4e 61 6d 65 0a 20 20 29 3b    zPageName.  );
73c0: 0a 20 20 40 20 3c 68 32 3e 48 69 73 74 6f 72 79  .  @ <h2>History
73d0: 20 6f 66 20 3c 61 20 68 72 65 66 3d 22 25 52 2f   of <a href="%R/
73e0: 77 69 6b 69 3f 6e 61 6d 65 3d 25 54 28 7a 50 61  wiki?name=%T(zPa
73f0: 67 65 4e 61 6d 65 29 22 3e 25 68 28 7a 50 61 67  geName)">%h(zPag
7400: 65 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 68 32 3e 0a  eName)</a></h2>.
7410: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
7420: 62 72 6c 69 73 74 22 3e 0a 20 20 40 20 3c 74 61  brlist">.  @ <ta
7430: 62 6c 65 3e 0a 20 20 40 20 3c 74 68 65 61 64 3e  ble>.  @ <thead>
7440: 3c 74 72 3e 0a 20 20 40 20 3c 74 68 3e 41 67 65  <tr>.  @ <th>Age
7450: 3c 2f 74 68 3e 0a 20 20 40 20 3c 74 68 3e 48 61  </th>.  @ <th>Ha
7460: 73 68 3c 2f 74 68 3e 0a 20 20 40 20 3c 74 68 3e  sh</th>.  @ <th>
7470: 55 73 65 72 3c 2f 74 68 3e 0a 20 20 69 66 28 20  User</th>.  if( 
7480: 73 68 6f 77 52 69 64 20 29 7b 0a 20 20 20 20 40  showRid ){.    @
7490: 20 3c 74 68 3e 52 49 44 3c 2f 74 68 3e 0a 20 20   <th>RID</th>.  
74a0: 7d 0a 20 20 40 20 3c 74 68 3e 26 6e 62 73 70 3b  }.  @ <th>&nbsp;
74b0: 3c 2f 74 68 3e 0a 20 20 40 20 3c 2f 74 72 3e 3c  </th>.  @ </tr><
74c0: 2f 74 68 65 61 64 3e 3c 74 62 6f 64 79 3e 0a 20  /thead><tbody>. 
74d0: 20 72 4e 6f 77 20 3d 20 64 62 5f 64 6f 75 62 6c   rNow = db_doubl
74e0: 65 28 30 2e 30 2c 20 22 53 45 4c 45 43 54 20 6a  e(0.0, "SELECT j
74f0: 75 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27 29 22  ulianday('now')"
7500: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73  );.  while( db_s
7510: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
7520: 52 4f 57 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  ROW ){.    doubl
7530: 65 20 72 4d 74 69 6d 65 20 3d 20 64 62 5f 63 6f  e rMtime = db_co
7540: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 26 71 2c 20  lumn_double(&q, 
7550: 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0);.    const ch
7560: 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63  ar *zUuid = db_c
7570: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
7580: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
7590: 72 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f  r *zUser = db_co
75a0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
75b0: 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 64 20 3d  ;.    int wrid =
75c0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
75d0: 71 2c 20 33 29 3b 0a 20 20 20 20 2f 2a 20 73 71  q, 3);.    /* sq
75e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 74 69  lite3_int64 iMti
75f0: 6d 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  me = (sqlite3_in
7600: 74 36 34 29 28 72 4d 74 69 6d 65 2a 38 36 34 30  t64)(rMtime*8640
7610: 30 2e 30 29 3b 20 2a 2f 0a 20 20 20 20 63 68 61  0.0); */.    cha
7620: 72 20 2a 7a 41 67 65 20 3d 20 68 75 6d 61 6e 5f  r *zAge = human_
7630: 72 65 61 64 61 62 6c 65 5f 61 67 65 28 72 4e 6f  readable_age(rNo
7640: 77 20 2d 20 72 4d 74 69 6d 65 29 3b 0a 20 20 20  w - rMtime);.   
7650: 20 40 20 3c 74 72 3e 0a 20 20 20 20 2f 2a 20 40   @ <tr>.    /* @
7660: 20 3c 74 64 20 64 61 74 61 2d 73 6f 72 74 6b 65   <td data-sortke
7670: 79 3d 22 25 30 31 36 6c 6c 78 28 69 4d 74 69 6d  y="%016llx(iMtim
7680: 65 29 22 3e 25 73 28 7a 41 67 65 29 3c 2f 74 64  e)">%s(zAge)</td
7690: 3e 20 2a 2f 0a 20 20 20 20 40 20 3c 74 64 3e 25  > */.    @ <td>%
76a0: 73 28 7a 41 67 65 29 3c 2f 74 64 3e 0a 20 20 20  s(zAge)</td>.   
76b0: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 41 67   fossil_free(zAg
76c0: 65 29 3b 0a 20 20 20 20 40 20 3c 74 64 3e 25 7a  e);.    @ <td>%z
76d0: 28 68 72 65 66 28 22 25 52 2f 69 6e 66 6f 2f 25  (href("%R/info/%
76e0: 73 22 2c 7a 55 75 69 64 29 29 25 53 28 7a 55 75  s",zUuid))%S(zUu
76f0: 69 64 29 3c 2f 61 3e 3c 2f 74 64 3e 0a 20 20 20  id)</a></td>.   
7700: 20 40 20 3c 74 64 3e 25 68 28 7a 55 73 65 72 29   @ <td>%h(zUser)
7710: 3c 2f 74 64 3e 0a 20 20 20 20 69 66 28 20 73 68  </td>.    if( sh
7720: 6f 77 52 69 64 20 29 7b 0a 20 20 20 20 20 20 40  owRid ){.      @
7730: 20 3c 74 64 3e 25 7a 28 68 72 65 66 28 22 25 52   <td>%z(href("%R
7740: 2f 61 72 74 69 66 61 63 74 2f 25 53 22 2c 7a 55  /artifact/%S",zU
7750: 75 69 64 29 29 25 64 28 77 72 69 64 29 3c 2f 61  uid))%d(wrid)</a
7760: 3e 3c 2f 74 64 3e 0a 20 20 20 20 7d 0a 20 20 20  ></td>.    }.   
7770: 20 40 20 3c 74 64 3e 25 7a 28 68 72 65 66 28 22   @ <td>%z(href("
7780: 25 52 2f 77 64 69 66 66 3f 69 64 3d 25 53 22 2c  %R/wdiff?id=%S",
7790: 7a 55 75 69 64 29 29 64 69 66 66 3c 2f 61 3e 3c  zUuid))diff</a><
77a0: 2f 74 64 3e 0a 20 20 20 20 40 20 3c 2f 74 72 3e  /td>.    @ </tr>
77b0: 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 62 6f 64 79  .  }.  @ </tbody
77c0: 3e 3c 2f 74 61 62 6c 65 3e 3c 2f 64 69 76 3e 0a  ></table></div>.
77d0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
77e0: 29 3b 0a 20 20 2f 2a 20 73 74 79 6c 65 5f 74 61  );.  /* style_ta
77f0: 62 6c 65 5f 73 6f 72 74 65 72 28 29 3b 20 2a 2f  ble_sorter(); */
7800: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
7810: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
7820: 41 47 45 3a 20 77 64 69 66 66 0a 2a 2a 0a 2a 2a  AGE: wdiff.**.**
7830: 20 53 68 6f 77 20 74 68 65 20 63 68 61 6e 67 65   Show the change
7840: 73 20 74 6f 20 61 20 77 69 6b 69 20 70 61 67 65  s to a wiki page
7850: 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70 61  ..**.** Query pa
7860: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
7870: 20 20 20 20 20 69 64 3d 48 41 53 48 20 20 20 20       id=HASH    
7880: 20 20 20 20 20 20 20 48 61 73 68 20 70 72 65 66         Hash pref
7890: 69 78 20 66 6f 72 20 74 68 65 20 63 68 69 6c 64  ix for the child
78a0: 20 76 65 72 73 69 6f 6e 20 74 6f 20 62 65 20 64   version to be d
78b0: 69 66 66 65 64 2e 0a 2a 2a 20 20 20 20 20 20 72  iffed..**      r
78c0: 69 64 3d 49 4e 54 45 47 45 52 20 20 20 20 20 20  id=INTEGER      
78d0: 20 52 65 63 6f 72 64 49 44 20 66 6f 72 20 74 68   RecordID for th
78e0: 65 20 63 68 69 6c 64 20 76 65 72 73 69 6f 6e 0a  e child version.
78f0: 2a 2a 20 20 20 20 20 20 70 69 64 3d 48 41 53 48  **      pid=HASH
7900: 20 20 20 20 20 20 20 20 20 20 48 61 73 68 20 70            Hash p
7910: 72 65 66 69 78 20 66 6f 72 20 74 68 65 20 70 61  refix for the pa
7920: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rent..**.** The 
7930: 22 69 64 22 20 71 75 65 72 79 20 70 61 72 61 6d  "id" query param
7940: 65 74 65 72 20 69 73 20 72 65 71 75 69 72 65 64  eter is required
7950: 2e 20 20 22 70 69 64 22 20 69 73 20 6f 70 74 69  .  "pid" is opti
7960: 6f 6e 61 6c 2e 20 20 49 66 20 22 70 69 64 22 0a  onal.  If "pid".
7970: 2a 2a 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74  ** is omitted, t
7980: 68 65 6e 20 74 68 65 20 64 69 66 66 20 69 73 20  hen the diff is 
7990: 61 67 61 69 6e 73 74 20 74 68 65 20 66 69 72 73  against the firs
79a0: 74 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  t parent of the 
79b0: 63 68 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 77  child..*/.void w
79c0: 64 69 66 66 5f 70 61 67 65 28 76 6f 69 64 29 7b  diff_page(void){
79d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
79e0: 49 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Id;.  const char
79f0: 20 2a 7a 50 69 64 3b 0a 20 20 4d 61 6e 69 66 65   *zPid;.  Manife
7a00: 73 74 20 2a 70 57 31 2c 20 2a 70 57 32 20 3d 20  st *pW1, *pW2 = 
7a10: 30 3b 0a 20 20 69 6e 74 20 72 69 64 31 2c 20 72  0;.  int rid1, r
7a20: 69 64 32 2c 20 6e 65 78 74 52 69 64 3b 0a 20 20  id2, nextRid;.  
7a30: 42 6c 6f 62 20 77 31 2c 20 77 32 2c 20 64 3b 0a  Blob w1, w2, d;.
7a40: 20 20 75 36 34 20 64 69 66 66 46 6c 61 67 73 3b    u64 diffFlags;
7a50: 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  ..  login_check_
7a60: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
7a70: 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 52 64 57   if( !g.perm.RdW
7a80: 69 6b 69 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  iki ){ login_nee
7a90: 64 65 64 28 67 2e 61 6e 6f 6e 2e 52 64 57 69 6b  ded(g.anon.RdWik
7aa0: 69 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  i); return; }.  
7ab0: 7a 49 64 20 3d 20 50 28 22 69 64 22 29 3b 0a 20  zId = P("id");. 
7ac0: 20 69 66 28 20 7a 49 64 3d 3d 30 20 29 7b 0a 20   if( zId==0 ){. 
7ad0: 20 20 20 72 69 64 31 20 3d 20 61 74 6f 69 28 50     rid1 = atoi(P
7ae0: 44 28 22 72 69 64 22 2c 22 30 22 29 29 3b 0a 20  D("rid","0"));. 
7af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 69 64 31   }else{.    rid1
7b00: 20 3d 20 6e 61 6d 65 5f 74 6f 5f 74 79 70 65 64   = name_to_typed
7b10: 5f 72 69 64 28 7a 49 64 2c 20 22 77 22 29 3b 0a  _rid(zId, "w");.
7b20: 20 20 7d 0a 20 20 7a 49 64 20 3d 20 64 62 5f 74    }.  zId = db_t
7b30: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75  ext(0, "SELECT u
7b40: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
7b50: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64  ERE rid=%d", rid
7b60: 31 29 3b 0a 20 20 70 57 31 20 3d 20 6d 61 6e 69  1);.  pW1 = mani
7b70: 66 65 73 74 5f 67 65 74 28 72 69 64 31 2c 20 43  fest_get(rid1, C
7b80: 46 54 59 50 45 5f 57 49 4b 49 2c 20 30 29 3b 0a  FTYPE_WIKI, 0);.
7b90: 20 20 69 66 28 20 70 57 31 3d 3d 30 20 29 20 66    if( pW1==0 ) f
7ba0: 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68  ossil_redirect_h
7bb0: 6f 6d 65 28 29 3b 0a 20 20 62 6c 6f 62 5f 69 6e  ome();.  blob_in
7bc0: 69 74 28 26 77 31 2c 20 70 57 31 2d 3e 7a 57 69  it(&w1, pW1->zWi
7bd0: 6b 69 2c 20 2d 31 29 3b 0a 20 20 7a 50 69 64 20  ki, -1);.  zPid 
7be0: 3d 20 50 28 22 70 69 64 22 29 3b 0a 20 20 69 66  = P("pid");.  if
7bf0: 28 20 7a 50 69 64 3d 3d 30 20 26 26 20 70 57 31  ( zPid==0 && pW1
7c00: 2d 3e 6e 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->nParent ){.   
7c10: 20 7a 50 69 64 20 3d 20 70 57 31 2d 3e 61 7a 50   zPid = pW1->azP
7c20: 61 72 65 6e 74 5b 30 5d 3b 0a 20 20 7d 0a 20 20  arent[0];.  }.  
7c30: 69 66 28 20 7a 50 69 64 20 29 7b 0a 20 20 20 20  if( zPid ){.    
7c40: 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 20  char *zDate;.   
7c50: 20 72 69 64 32 20 3d 20 6e 61 6d 65 5f 74 6f 5f   rid2 = name_to_
7c60: 74 79 70 65 64 5f 72 69 64 28 7a 50 69 64 2c 20  typed_rid(zPid, 
7c70: 22 77 22 29 3b 0a 20 20 20 20 70 57 32 20 3d 20  "w");.    pW2 = 
7c80: 6d 61 6e 69 66 65 73 74 5f 67 65 74 28 72 69 64  manifest_get(rid
7c90: 32 2c 20 43 46 54 59 50 45 5f 57 49 4b 49 2c 20  2, CFTYPE_WIKI, 
7ca0: 30 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 69 6e 69  0);.    blob_ini
7cb0: 74 28 26 77 32 2c 20 70 57 32 2d 3e 7a 57 69 6b  t(&w2, pW2->zWik
7cc0: 69 2c 20 2d 31 29 3b 0a 20 20 20 20 40 20 3c 68  i, -1);.    @ <h
7cd0: 32 3e 43 68 61 6e 67 65 73 20 74 6f 20 5c 0a 20  2>Changes to \. 
7ce0: 20 20 20 40 20 22 25 7a 28 68 72 65 66 28 22 25     @ "%z(href("%
7cf0: 52 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d 65 3d  R/whistory?name=
7d00: 25 73 22 2c 70 57 31 2d 3e 7a 57 69 6b 69 54 69  %s",pW1->zWikiTi
7d10: 74 6c 65 29 29 25 68 28 70 57 31 2d 3e 7a 57 69  tle))%h(pW1->zWi
7d20: 6b 69 54 69 74 6c 65 29 3c 2f 61 3e 22 20 5c 0a  kiTitle)</a>" \.
7d30: 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74      zDate = db_t
7d40: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64  ext(0, "SELECT d
7d50: 61 74 65 74 69 6d 65 28 25 2e 31 36 67 29 22 2c  atetime(%.16g)",
7d60: 70 57 32 2d 3e 72 44 61 74 65 29 3b 0a 20 20 20  pW2->rDate);.   
7d70: 20 40 20 62 65 74 77 65 65 6e 20 25 7a 28 68 72   @ between %z(hr
7d80: 65 66 28 22 25 52 2f 69 6e 66 6f 2f 25 73 22 2c  ef("%R/info/%s",
7d90: 7a 50 69 64 29 29 25 7a 28 7a 44 61 74 65 29 3c  zPid))%z(zDate)<
7da0: 2f 61 3e 20 5c 0a 20 20 20 20 7a 44 61 74 65 20  /a> \.    zDate 
7db0: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
7dc0: 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 25 2e  LECT datetime(%.
7dd0: 31 36 67 29 22 2c 70 57 31 2d 3e 72 44 61 74 65  16g)",pW1->rDate
7de0: 29 3b 0a 20 20 20 20 40 20 61 6e 64 20 25 7a 28  );.    @ and %z(
7df0: 68 72 65 66 28 22 25 52 2f 69 6e 66 6f 2f 25 73  href("%R/info/%s
7e00: 22 2c 7a 49 64 29 29 25 7a 28 7a 44 61 74 65 29  ",zId))%z(zDate)
7e10: 3c 2f 61 3e 3c 2f 68 32 3e 0a 20 20 20 20 73 74  </a></h2>.    st
7e20: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
7e30: 65 6e 74 28 22 50 72 65 76 69 6f 75 73 22 2c 20  ent("Previous", 
7e40: 22 25 52 2f 77 64 69 66 66 3f 69 64 3d 25 53 22  "%R/wdiff?id=%S"
7e50: 2c 20 7a 50 69 64 29 3b 0a 20 20 7d 65 6c 73 65  , zPid);.  }else
7e60: 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  {.    blob_zero(
7e70: 26 77 32 29 3b 0a 20 20 20 20 40 20 3c 68 32 3e  &w2);.    @ <h2>
7e80: 49 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20  Initial version 
7e90: 6f 66 20 5c 0a 20 20 20 20 40 20 22 25 7a 28 68  of \.    @ "%z(h
7ea0: 72 65 66 28 22 25 52 2f 77 68 69 73 74 6f 72 79  ref("%R/whistory
7eb0: 3f 6e 61 6d 65 3d 25 73 22 2c 70 57 31 2d 3e 7a  ?name=%s",pW1->z
7ec0: 57 69 6b 69 54 69 74 6c 65 29 29 25 68 28 70 57  WikiTitle))%h(pW
7ed0: 31 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 29 3c 2f  1->zWikiTitle)</
7ee0: 61 3e 22 5c 0a 20 20 20 20 40 20 3c 2f 68 32 3e  a>"\.    @ </h2>
7ef0: 0a 20 20 7d 0a 20 20 6e 65 78 74 52 69 64 20 3d  .  }.  nextRid =
7f00: 20 77 69 6b 69 5f 6e 65 78 74 28 77 69 6b 69 5f   wiki_next(wiki_
7f10: 74 61 67 69 64 28 70 57 31 2d 3e 7a 57 69 6b 69  tagid(pW1->zWiki
7f20: 54 69 74 6c 65 29 2c 70 57 31 2d 3e 72 44 61 74  Title),pW1->rDat
7f30: 65 29 3b 0a 20 20 69 66 28 20 6e 65 78 74 52 69  e);.  if( nextRi
7f40: 64 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73  d ){.    style_s
7f50: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
7f60: 4e 65 78 74 22 2c 20 22 25 52 2f 77 64 69 66 66  Next", "%R/wdiff
7f70: 3f 72 69 64 3d 25 64 22 2c 20 6e 65 78 74 52 69  ?rid=%d", nextRi
7f80: 64 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f  d);.  }.  style_
7f90: 68 65 61 64 65 72 28 22 43 68 61 6e 67 65 73 20  header("Changes 
7fa0: 54 6f 20 25 73 22 2c 20 70 57 31 2d 3e 7a 57 69  To %s", pW1->zWi
7fb0: 6b 69 54 69 74 6c 65 29 3b 0a 20 20 62 6c 6f 62  kiTitle);.  blob
7fc0: 5f 7a 65 72 6f 28 26 64 29 3b 0a 20 20 64 69 66  _zero(&d);.  dif
7fd0: 66 46 6c 61 67 73 20 3d 20 63 6f 6e 73 74 72 75  fFlags = constru
7fe0: 63 74 5f 64 69 66 66 5f 66 6c 61 67 73 28 31 29  ct_diff_flags(1)
7ff0: 3b 0a 20 20 74 65 78 74 5f 64 69 66 66 28 26 77  ;.  text_diff(&w
8000: 32 2c 20 26 77 31 2c 20 26 64 2c 20 30 2c 20 64  2, &w1, &d, 0, d
8010: 69 66 66 46 6c 61 67 73 20 7c 20 44 49 46 46 5f  iffFlags | DIFF_
8020: 48 54 4d 4c 20 7c 20 44 49 46 46 5f 4c 49 4e 45  HTML | DIFF_LINE
8030: 4e 4f 29 3b 0a 20 20 40 20 3c 70 72 65 20 63 6c  NO);.  @ <pre cl
8040: 61 73 73 3d 22 75 64 69 66 66 22 3e 0a 20 20 40  ass="udiff">.  @
8050: 20 25 73 28 62 6c 6f 62 5f 73 74 72 28 26 64 29   %s(blob_str(&d)
8060: 29 0a 20 20 40 20 3c 70 72 65 3e 0a 20 20 6d 61  ).  @ <pre>.  ma
8070: 6e 69 66 65 73 74 5f 64 65 73 74 72 6f 79 28 70  nifest_destroy(p
8080: 57 31 29 3b 0a 20 20 6d 61 6e 69 66 65 73 74 5f  W1);.  manifest_
8090: 64 65 73 74 72 6f 79 28 70 57 32 29 3b 0a 20 20  destroy(pW2);.  
80a0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
80b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 71 75 65 72 79  }../*.** A query
80c0: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 69 6e   that returns in
80d0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
80e0: 61 6c 6c 20 77 69 6b 69 20 70 61 67 65 73 2e 0a  all wiki pages..
80f0: 2a 2a 0a 2a 2a 20 20 20 20 77 6e 61 6d 65 20 20  **.**    wname  
8100: 20 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74         Name of t
8110: 68 65 20 77 69 6b 69 20 70 61 67 65 0a 2a 2a 20  he wiki page.** 
8120: 20 20 20 77 73 6f 72 74 20 20 20 20 20 20 20 20     wsort        
8130: 20 53 6f 72 74 20 6e 61 6d 65 73 20 62 79 20 74   Sort names by t
8140: 68 69 73 20 6c 61 62 65 6c 0a 2a 2a 20 20 20 20  his label.**    
8150: 77 72 69 64 20 20 20 20 20 20 20 20 20 20 72 69  wrid          ri
8160: 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
8170: 63 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  cent version of 
8180: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 77  the page.**    w
8190: 6d 74 69 6d 65 20 20 20 20 20 20 20 20 74 69 6d  mtime        tim
81a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 76 65  e most recent ve
81b0: 72 73 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65  rsion was create
81c0: 64 0a 2a 2a 20 20 20 20 77 63 6e 74 20 20 20 20  d.**    wcnt    
81d0: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
81e0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
81f0: 20 77 69 6b 69 20 70 61 67 65 0a 2a 2a 0a 2a 2a   wiki page.**.**
8200: 20 54 68 65 20 77 72 69 64 20 76 61 6c 75 65 20   The wrid value 
8210: 69 73 20 7a 65 72 6f 20 66 6f 72 20 64 65 6c 65  is zero for dele
8220: 74 65 64 20 77 69 6b 69 20 70 61 67 65 73 2e 0a  ted wiki pages..
8230: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
8240: 63 68 61 72 20 6c 69 73 74 41 6c 6c 57 69 6b 69  char listAllWiki
8250: 50 61 67 65 73 5b 5d 20 3d 20 0a 40 20 53 45 4c  Pages[] = .@ SEL
8260: 45 43 54 0a 40 20 20 20 73 75 62 73 74 72 28 74  ECT.@   substr(t
8270: 61 67 2e 74 61 67 6e 61 6d 65 2c 20 36 29 20 41  ag.tagname, 6) A
8280: 53 20 77 6e 61 6d 65 2c 0a 40 20 20 20 6c 6f 77  S wname,.@   low
8290: 65 72 28 73 75 62 73 74 72 28 74 61 67 2e 74 61  er(substr(tag.ta
82a0: 67 6e 61 6d 65 2c 20 36 29 29 20 41 53 20 73 6f  gname, 6)) AS so
82b0: 72 74 6e 61 6d 65 2c 0a 40 20 20 20 74 61 67 78  rtname,.@   tagx
82c0: 72 65 66 2e 76 61 6c 75 65 2b 30 20 41 53 20 77  ref.value+0 AS w
82d0: 72 69 64 2c 0a 40 20 20 20 6d 61 78 28 74 61 67  rid,.@   max(tag
82e0: 78 72 65 66 2e 6d 74 69 6d 65 29 20 41 53 20 77  xref.mtime) AS w
82f0: 6d 74 69 6d 65 2c 0a 40 20 20 20 63 6f 75 6e 74  mtime,.@   count
8300: 28 2a 29 20 41 53 20 77 63 6e 74 0a 40 20 46 52  (*) AS wcnt.@ FR
8310: 4f 4d 0a 40 20 20 20 74 61 67 2c 0a 40 20 20 20  OM.@   tag,.@   
8320: 74 61 67 78 72 65 66 0a 40 20 57 48 45 52 45 0a  tagxref.@ WHERE.
8330: 40 20 20 20 74 61 67 2e 74 61 67 6e 61 6d 65 20  @   tag.tagname 
8340: 47 4c 4f 42 20 27 77 69 6b 69 2d 2a 27 0a 40 20  GLOB 'wiki-*'.@ 
8350: 20 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61    AND tagxref.ta
8360: 67 69 64 3d 74 61 67 2e 74 61 67 69 64 0a 40 20  gid=tag.tagid.@ 
8370: 47 52 4f 55 50 20 42 59 20 31 0a 40 20 4f 52 44  GROUP BY 1.@ ORD
8380: 45 52 20 42 59 20 32 3b 0a 3b 0a 0a 2f 2a 0a 2a  ER BY 2;.;../*.*
8390: 2a 20 57 45 42 50 41 47 45 3a 20 77 63 6f 6e 74  * WEBPAGE: wcont
83a0: 65 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 6c  ent.**.**     al
83b0: 6c 3d 31 20 20 20 20 20 20 20 20 20 53 68 6f 77  l=1         Show
83c0: 20 64 65 6c 65 74 65 64 20 70 61 67 65 73 0a 2a   deleted pages.*
83d0: 2a 20 20 20 20 20 73 68 6f 77 69 64 20 20 20 20  *     showid    
83e0: 20 20 20 20 53 68 6f 77 20 72 69 64 20 76 61 6c      Show rid val
83f0: 75 65 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ues for each pag
8400: 65 2e 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 61 6c  e..**.** List al
8410: 6c 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6b 69  l available wiki
8420: 20 70 61 67 65 73 20 77 69 74 68 20 64 61 74 65   pages with date
8430: 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c 61 73   created and las
8440: 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 76  t modified..*/.v
8450: 6f 69 64 20 77 63 6f 6e 74 65 6e 74 5f 70 61 67  oid wcontent_pag
8460: 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20  e(void){.  Stmt 
8470: 71 3b 0a 20 20 64 6f 75 62 6c 65 20 72 4e 6f 77  q;.  double rNow
8480: 3b 0a 20 20 69 6e 74 20 73 68 6f 77 41 6c 6c 20  ;.  int showAll 
8490: 3d 20 50 28 22 61 6c 6c 22 29 21 3d 30 3b 0a 20  = P("all")!=0;. 
84a0: 20 69 6e 74 20 73 68 6f 77 52 69 64 20 3d 20 50   int showRid = P
84b0: 28 22 73 68 6f 77 69 64 22 29 21 3d 30 3b 0a 0a  ("showid")!=0;..
84c0: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
84d0: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
84e0: 66 28 20 21 67 2e 70 65 72 6d 2e 52 64 57 69 6b  f( !g.perm.RdWik
84f0: 69 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  i ){ login_neede
8500: 64 28 67 2e 61 6e 6f 6e 2e 52 64 57 69 6b 69 29  d(g.anon.RdWiki)
8510: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 73 74  ; return; }.  st
8520: 79 6c 65 5f 68 65 61 64 65 72 28 22 41 76 61 69  yle_header("Avai
8530: 6c 61 62 6c 65 20 57 69 6b 69 20 50 61 67 65 73  lable Wiki Pages
8540: 22 29 3b 0a 20 20 69 66 28 20 73 68 6f 77 41 6c  ");.  if( showAl
8550: 6c 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 73  l ){.    style_s
8560: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
8570: 41 63 74 69 76 65 22 2c 20 22 25 73 2f 77 63 6f  Active", "%s/wco
8580: 6e 74 65 6e 74 22 2c 20 67 2e 7a 54 6f 70 29 3b  ntent", g.zTop);
8590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
85a0: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
85b0: 65 6e 74 28 22 41 6c 6c 22 2c 20 22 25 73 2f 77  ent("All", "%s/w
85c0: 63 6f 6e 74 65 6e 74 3f 61 6c 6c 3d 31 22 2c 20  content?all=1", 
85d0: 67 2e 7a 54 6f 70 29 3b 0a 20 20 7d 0a 20 20 77  g.zTop);.  }.  w
85e0: 69 6b 69 5f 73 74 61 6e 64 61 72 64 5f 73 75 62  iki_standard_sub
85f0: 6d 65 6e 75 28 57 5f 41 4c 4c 5f 42 55 54 28 57  menu(W_ALL_BUT(W
8600: 5f 4c 49 53 54 29 29 3b 0a 20 20 64 62 5f 70 72  _LIST));.  db_pr
8610: 65 70 61 72 65 28 26 71 2c 20 6c 69 73 74 41 6c  epare(&q, listAl
8620: 6c 57 69 6b 69 50 61 67 65 73 2f 2a 77 6f 72 6b  lWikiPages/*work
8630: 73 2d 6c 69 6b 65 3a 22 22 2a 2f 29 3b 0a 20 20  s-like:""*/);.  
8640: 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 62 72  @ <div class="br
8650: 6c 69 73 74 22 3e 0a 20 20 40 20 3c 74 61 62 6c  list">.  @ <tabl
8660: 65 20 63 6c 61 73 73 3d 27 73 6f 72 74 61 62 6c  e class='sortabl
8670: 65 27 20 64 61 74 61 2d 63 6f 6c 75 6d 6e 2d 74  e' data-column-t
8680: 79 70 65 73 3d 27 74 4b 4e 27 20 64 61 74 61 2d  ypes='tKN' data-
8690: 69 6e 69 74 2d 73 6f 72 74 3d 27 31 27 3e 0a 20  init-sort='1'>. 
86a0: 20 40 20 3c 74 68 65 61 64 3e 3c 74 72 3e 0a 20   @ <thead><tr>. 
86b0: 20 40 20 3c 74 68 3e 4e 61 6d 65 3c 2f 74 68 3e   @ <th>Name</th>
86c0: 0a 20 20 40 20 3c 74 68 3e 4c 61 73 74 20 43 68  .  @ <th>Last Ch
86d0: 61 6e 67 65 3c 2f 74 68 3e 0a 20 20 40 20 3c 74  ange</th>.  @ <t
86e0: 68 3e 56 65 72 73 69 6f 6e 73 3c 2f 74 68 3e 0a  h>Versions</th>.
86f0: 20 20 69 66 28 20 73 68 6f 77 52 69 64 20 29 7b    if( showRid ){
8700: 0a 20 20 20 20 40 20 3c 74 68 3e 52 49 44 3c 2f  .    @ <th>RID</
8710: 74 68 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 72  th>.  }.  @ </tr
8720: 3e 3c 2f 74 68 65 61 64 3e 3c 74 62 6f 64 79 3e  ></thead><tbody>
8730: 0a 20 20 72 4e 6f 77 20 3d 20 64 62 5f 64 6f 75  .  rNow = db_dou
8740: 62 6c 65 28 30 2e 30 2c 20 22 53 45 4c 45 43 54  ble(0.0, "SELECT
8750: 20 6a 75 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27   julianday('now'
8760: 29 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62  )");.  while( db
8770: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
8780: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
8790: 73 74 20 63 68 61 72 20 2a 7a 57 4e 61 6d 65 20  st char *zWName 
87a0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
87b0: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 0);.    con
87c0: 73 74 20 63 68 61 72 20 2a 7a 53 6f 72 74 20 3d  st char *zSort =
87d0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
87e0: 26 71 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  &q, 1);.    int 
87f0: 77 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  wrid = db_column
8800: 5f 69 6e 74 28 26 71 2c 20 32 29 3b 0a 20 20 20  _int(&q, 2);.   
8810: 20 64 6f 75 62 6c 65 20 72 57 6d 74 69 6d 65 20   double rWmtime 
8820: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  = db_column_doub
8830: 6c 65 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 73  le(&q, 3);.    s
8840: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 74  qlite3_int64 iMt
8850: 69 6d 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  ime = (sqlite3_i
8860: 6e 74 36 34 29 28 72 57 6d 74 69 6d 65 2a 38 36  nt64)(rWmtime*86
8870: 34 30 30 2e 30 29 3b 0a 20 20 20 20 63 68 61 72  400.0);.    char
8880: 20 2a 7a 41 67 65 3b 0a 20 20 20 20 69 6e 74 20   *zAge;.    int 
8890: 77 63 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  wcnt = db_column
88a0: 5f 69 6e 74 28 26 71 2c 20 34 29 3b 0a 20 20 20  _int(&q, 4);.   
88b0: 20 63 68 61 72 20 2a 7a 57 44 69 73 70 6c 61 79   char *zWDisplay
88c0: 4e 61 6d 65 3b 0a 0a 20 20 20 20 69 66 28 20 73  Name;..    if( s
88d0: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
88e0: 63 68 65 63 6b 69 6e 2f 2a 22 2c 20 7a 57 4e 61  checkin/*", zWNa
88f0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8900: 7a 57 44 69 73 70 6c 61 79 4e 61 6d 65 20 3d 20  zWDisplayName = 
8910: 6d 70 72 69 6e 74 66 28 22 25 2e 32 35 73 2e 2e  mprintf("%.25s..
8920: 2e 22 2c 20 7a 57 4e 61 6d 65 29 3b 0a 20 20 20  .", zWName);.   
8930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 57   }else{.      zW
8940: 44 69 73 70 6c 61 79 4e 61 6d 65 20 3d 20 6d 70  DisplayName = mp
8950: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 57 4e 61  rintf("%s", zWNa
8960: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  me);.    }.    i
8970: 66 28 20 77 72 69 64 3d 3d 30 20 29 7b 0a 20 20  f( wrid==0 ){.  
8980: 20 20 20 20 69 66 28 20 21 73 68 6f 77 41 6c 6c      if( !showAll
8990: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
89a0: 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 64 61 74     @ <tr><td dat
89b0: 61 2d 73 6f 72 74 6b 65 79 3d 22 25 68 28 7a 53  a-sortkey="%h(zS
89c0: 6f 72 74 29 22 3e 5c 0a 20 20 20 20 20 20 40 20  ort)">\.      @ 
89d0: 25 7a 28 68 72 65 66 28 22 25 52 2f 77 68 69 73  %z(href("%R/whis
89e0: 74 6f 72 79 3f 6e 61 6d 65 3d 25 54 22 2c 7a 57  tory?name=%T",zW
89f0: 4e 61 6d 65 29 29 3c 73 3e 25 68 28 7a 57 44 69  Name))<s>%h(zWDi
8a00: 73 70 6c 61 79 4e 61 6d 65 29 3c 2f 73 3e 3c 2f  splayName)</s></
8a10: 61 3e 3c 2f 74 64 3e 0a 20 20 20 20 7d 65 6c 73  a></td>.    }els
8a20: 65 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  e{.      @ <tr><
8a30: 74 64 20 64 61 74 61 3d 73 6f 72 74 6b 65 79 3d  td data=sortkey=
8a40: 27 25 68 28 7a 53 6f 72 74 29 22 3e 5c 0a 20 20  '%h(zSort)">\.  
8a50: 20 20 20 20 40 20 25 7a 28 68 72 65 66 28 22 25      @ %z(href("%
8a60: 52 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25 54 22 2c  R/wiki?name=%T",
8a70: 7a 57 4e 61 6d 65 29 29 25 68 28 7a 57 44 69 73  zWName))%h(zWDis
8a80: 70 6c 61 79 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 74  playName)</a></t
8a90: 64 3e 0a 20 20 20 20 7d 0a 20 20 20 20 7a 41 67  d>.    }.    zAg
8aa0: 65 20 3d 20 68 75 6d 61 6e 5f 72 65 61 64 61 62  e = human_readab
8ab0: 6c 65 5f 61 67 65 28 72 4e 6f 77 20 2d 20 72 57  le_age(rNow - rW
8ac0: 6d 74 69 6d 65 29 3b 0a 20 20 20 20 40 20 3c 74  mtime);.    @ <t
8ad0: 64 20 64 61 74 61 2d 73 6f 72 74 6b 65 79 3d 22  d data-sortkey="
8ae0: 25 30 31 36 6c 6c 78 28 69 4d 74 69 6d 65 29 22  %016llx(iMtime)"
8af0: 3e 25 73 28 7a 41 67 65 29 3c 2f 74 64 3e 0a 20  >%s(zAge)</td>. 
8b00: 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a     fossil_free(z
8b10: 41 67 65 29 3b 0a 20 20 20 20 40 20 3c 74 64 3e  Age);.    @ <td>
8b20: 25 7a 28 68 72 65 66 28 22 25 52 2f 77 68 69 73  %z(href("%R/whis
8b30: 74 6f 72 79 3f 6e 61 6d 65 3d 25 54 22 2c 7a 57  tory?name=%T",zW
8b40: 4e 61 6d 65 29 29 25 64 28 77 63 6e 74 29 3c 2f  Name))%d(wcnt)</
8b50: 61 3e 3c 2f 74 64 3e 0a 20 20 20 20 69 66 28 20  a></td>.    if( 
8b60: 73 68 6f 77 52 69 64 20 29 7b 0a 20 20 20 20 20  showRid ){.     
8b70: 20 40 20 3c 74 64 3e 25 64 28 77 72 69 64 29 3c   @ <td>%d(wrid)<
8b80: 2f 74 64 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40  /td>.    }.    @
8b90: 20 3c 2f 74 72 3e 0a 20 20 20 20 66 6f 73 73 69   </tr>.    fossi
8ba0: 6c 5f 66 72 65 65 28 7a 57 44 69 73 70 6c 61 79  l_free(zWDisplay
8bb0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 40 20 3c  Name);.  }.  @ <
8bc0: 2f 74 62 6f 64 79 3e 3c 2f 74 61 62 6c 65 3e 3c  /tbody></table><
8bd0: 2f 64 69 76 3e 0a 20 20 64 62 5f 66 69 6e 61 6c  /div>.  db_final
8be0: 69 7a 65 28 26 71 29 3b 0a 20 20 73 74 79 6c 65  ize(&q);.  style
8bf0: 5f 74 61 62 6c 65 5f 73 6f 72 74 65 72 28 29 3b  _table_sorter();
8c00: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
8c10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
8c20: 41 47 45 3a 20 77 66 69 6e 64 0a 2a 2a 0a 2a 2a  AGE: wfind.**.**
8c30: 20 55 52 4c 3a 20 2f 77 66 69 6e 64 3f 74 69 74   URL: /wfind?tit
8c40: 6c 65 3d 54 49 54 4c 45 0a 2a 2a 20 4c 69 73 74  le=TITLE.** List
8c50: 20 61 6c 6c 20 77 69 6b 69 20 70 61 67 65 73 20   all wiki pages 
8c60: 77 68 6f 73 65 20 74 69 74 6c 65 73 20 63 6f 6e  whose titles con
8c70: 74 61 69 6e 20 74 68 65 20 73 65 61 72 63 68 20  tain the search 
8c80: 74 65 78 74 0a 2a 2f 0a 76 6f 69 64 20 77 66 69  text.*/.void wfi
8c90: 6e 64 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  nd_page(void){. 
8ca0: 20 53 74 6d 74 20 71 3b 0a 20 20 63 6f 6e 73 74   Stmt q;.  const
8cb0: 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20   char *zTitle;. 
8cc0: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
8cd0: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
8ce0: 28 20 21 67 2e 70 65 72 6d 2e 52 64 57 69 6b 69  ( !g.perm.RdWiki
8cf0: 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64   ){ login_needed
8d00: 28 67 2e 61 6e 6f 6e 2e 52 64 57 69 6b 69 29 3b  (g.anon.RdWiki);
8d10: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 7a 54 69   return; }.  zTi
8d20: 74 6c 65 20 3d 20 50 44 28 22 74 69 74 6c 65 22  tle = PD("title"
8d30: 2c 22 2a 22 29 3b 0a 20 20 73 74 79 6c 65 5f 68  ,"*");.  style_h
8d40: 65 61 64 65 72 28 22 57 69 6b 69 20 50 61 67 65  eader("Wiki Page
8d50: 73 20 46 6f 75 6e 64 22 29 3b 0a 20 20 40 20 3c  s Found");.  @ <
8d60: 75 6c 3e 0a 20 20 64 62 5f 70 72 65 70 61 72 65  ul>.  db_prepare
8d70: 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54  (&q,.    "SELECT
8d80: 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c   substr(tagname,
8d90: 20 36 2c 20 31 30 30 30 29 20 46 52 4f 4d 20 74   6, 1000) FROM t
8da0: 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65  ag WHERE tagname
8db0: 20 6c 69 6b 65 20 27 77 69 6b 69 2d 25 25 25 71   like 'wiki-%%%q
8dc0: 25 25 27 22 0a 20 20 20 20 22 20 4f 52 44 45 52  %%'".    " ORDER
8dd0: 20 42 59 20 6c 6f 77 65 72 28 74 61 67 6e 61 6d   BY lower(tagnam
8de0: 65 29 20 2f 2a 73 6f 72 74 2a 2f 22 20 2c 0a 20  e) /*sort*/" ,. 
8df0: 20 20 20 7a 54 69 74 6c 65 29 3b 0a 20 20 77 68     zTitle);.  wh
8e00: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
8e10: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
8e20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8e30: 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  zName = db_colum
8e40: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20  n_text(&q, 0);. 
8e50: 20 20 20 40 20 3c 6c 69 3e 25 7a 28 68 72 65 66     @ <li>%z(href
8e60: 28 22 25 52 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25  ("%R/wiki?name=%
8e70: 54 22 2c 7a 4e 61 6d 65 29 29 25 68 28 7a 4e 61  T",zName))%h(zNa
8e80: 6d 65 29 3c 2f 61 3e 3c 2f 6c 69 3e 0a 20 20 7d  me)</a></li>.  }
8e90: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
8ea0: 71 29 3b 0a 20 20 40 20 3c 2f 75 6c 3e 0a 20 20  q);.  @ </ul>.  
8eb0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
8ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
8ed0: 65 77 20 77 69 6b 69 20 70 61 67 65 20 74 6f 20  ew wiki page to 
8ee0: 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 20  the repository. 
8ef0: 20 54 68 65 20 70 61 67 65 20 6e 61 6d 65 20 69   The page name i
8f00: 73 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20 74 68  s.** given by th
8f10: 65 20 7a 50 61 67 65 4e 61 6d 65 20 70 61 72 61  e zPageName para
8f20: 6d 65 74 65 72 2e 20 20 72 69 64 20 6d 75 73 74  meter.  rid must
8f30: 20 62 65 20 7a 65 72 6f 20 74 6f 20 63 72 65 61   be zero to crea
8f40: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  te.** a new page
8f50: 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20 70   otherwise the p
8f60: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
8f70: 79 20 72 69 64 20 69 73 20 75 70 64 61 74 65 64  y rid is updated
8f80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
8f90: 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 70  ent of the new p
8fa0: 61 67 65 20 69 73 20 67 69 76 65 6e 20 62 79 20  age is given by 
8fb0: 74 68 65 20 62 6c 6f 62 20 70 43 6f 6e 74 65 6e  the blob pConten
8fc0: 74 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 69 6d 65 54 79  t..**.** zMimeTy
8fd0: 70 65 20 73 70 65 63 69 66 69 65 73 20 74 68 65  pe specifies the
8fe0: 20 4e 2d 63 61 72 64 20 66 6f 72 20 74 68 65 20   N-card for the 
8ff0: 77 69 6b 69 20 70 61 67 65 2e 20 49 66 20 69 74  wiki page. If it
9000: 20 69 73 20 30 2c 0a 2a 2a 20 65 6d 70 74 79 2c   is 0,.** empty,
9010: 20 6f 72 20 22 74 65 78 74 2f 78 2d 66 6f 73 73   or "text/x-foss
9020: 69 6c 2d 77 69 6b 69 22 20 28 74 68 65 20 64 65  il-wiki" (the de
9030: 66 61 75 6c 74 20 66 6f 72 6d 61 74 29 20 74 68  fault format) th
9040: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 69 67 6e 6f  en it is.** igno
9050: 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6b 69  red..*/.int wiki
9060: 5f 63 6d 64 5f 63 6f 6d 6d 69 74 28 63 6f 6e 73  _cmd_commit(cons
9070: 74 20 63 68 61 72 20 2a 7a 50 61 67 65 4e 61 6d  t char *zPageNam
9080: 65 2c 20 69 6e 74 20 72 69 64 2c 20 42 6c 6f 62  e, int rid, Blob
9090: 20 2a 70 43 6f 6e 74 65 6e 74 2c 0a 20 20 20 20   *pContent,.    
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d  const char *zMim
90c0: 65 54 79 70 65 2c 20 69 6e 74 20 6c 6f 63 61 6c  eType, int local
90d0: 55 73 65 72 29 7b 0a 20 20 42 6c 6f 62 20 77 69  User){.  Blob wi
90e0: 6b 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ki;             
90f0: 20 2f 2a 20 57 69 6b 69 20 70 61 67 65 20 63 6f   /* Wiki page co
9100: 6e 74 65 6e 74 20 2a 2f 0a 20 20 42 6c 6f 62 20  ntent */.  Blob 
9110: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
9120: 20 20 20 2f 2a 20 77 69 6b 69 20 63 68 65 63 6b     /* wiki check
9130: 73 75 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  sum */.  char *z
9140: 44 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Date;           
9150: 20 2f 2a 20 74 69 6d 65 73 74 61 6d 70 20 2a 2f   /* timestamp */
9160: 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64 3b 20  .  char *zUuid; 
9170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 75             /* uu
9180: 69 64 20 66 6f 72 20 72 69 64 20 2a 2f 0a 0a 20  id for rid */.. 
9190: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69 6b 69   blob_zero(&wiki
91a0: 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20 64 61 74  );.  zDate = dat
91b0: 65 5f 69 6e 5f 73 74 61 6e 64 61 72 64 5f 66 6f  e_in_standard_fo
91c0: 72 6d 61 74 28 22 6e 6f 77 22 29 3b 0a 20 20 62  rmat("now");.  b
91d0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69 6b  lob_appendf(&wik
91e0: 69 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61  i, "D %s\n", zDa
91f0: 74 65 29 3b 0a 20 20 66 72 65 65 28 7a 44 61 74  te);.  free(zDat
9200: 65 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  e);.  blob_appen
9210: 64 66 28 26 77 69 6b 69 2c 20 22 4c 20 25 46 5c  df(&wiki, "L %F\
9220: 6e 22 2c 20 7a 50 61 67 65 4e 61 6d 65 20 29 3b  n", zPageName );
9230: 0a 20 20 69 66 28 20 7a 4d 69 6d 65 54 79 70 65  .  if( zMimeType
9240: 20 26 26 20 2a 7a 4d 69 6d 65 54 79 70 65 0a 20   && *zMimeType. 
9250: 20 20 20 20 20 26 26 20 30 21 3d 66 6f 73 73 69       && 0!=fossi
9260: 6c 5f 73 74 72 63 6d 70 28 7a 4d 69 6d 65 54 79  l_strcmp(zMimeTy
9270: 70 65 2c 22 74 65 78 74 2f 78 2d 66 6f 73 73 69  pe,"text/x-fossi
9280: 6c 2d 77 69 6b 69 22 29 20 29 7b 0a 20 20 20 20  l-wiki") ){.    
9290: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
92a0: 6b 69 2c 20 22 4e 20 25 46 5c 6e 22 2c 20 7a 4d  ki, "N %F\n", zM
92b0: 69 6d 65 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  imeType);.  }.  
92c0: 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20 7a  if( rid ){.    z
92d0: 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30  Uuid = db_text(0
92e0: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
92f0: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
9300: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
9310: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
9320: 77 69 6b 69 2c 20 22 50 20 25 73 5c 6e 22 2c 20  wiki, "P %s\n", 
9330: 7a 55 75 69 64 29 3b 0a 20 20 20 20 66 72 65 65  zUuid);.    free
9340: 28 7a 55 75 69 64 29 3b 0a 20 20 7d 0a 20 20 75  (zUuid);.  }.  u
9350: 73 65 72 5f 73 65 6c 65 63 74 28 29 3b 0a 20 20  ser_select();.  
9360: 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f 6e 6f  if( !login_is_no
9370: 62 6f 64 79 28 29 20 29 7b 0a 20 20 20 20 20 20  body() ){.      
9380: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77 69  blob_appendf(&wi
9390: 6b 69 2c 20 22 55 20 25 46 5c 6e 22 2c 20 6c 6f  ki, "U %F\n", lo
93a0: 67 69 6e 5f 6e 61 6d 65 28 29 29 3b 0a 20 20 7d  gin_name());.  }
93b0: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
93c0: 20 26 77 69 6b 69 2c 20 22 57 20 25 64 5c 6e 25   &wiki, "W %d\n%
93d0: 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  s\n", blob_size(
93e0: 70 43 6f 6e 74 65 6e 74 29 2c 0a 20 20 20 20 20  pContent),.     
93f0: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f             blob_
9400: 73 74 72 28 70 43 6f 6e 74 65 6e 74 29 20 29 3b  str(pContent) );
9410: 0a 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26  .  md5sum_blob(&
9420: 77 69 6b 69 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  wiki, &cksum);. 
9430: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 77   blob_appendf(&w
9440: 69 6b 69 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26  iki, "Z %b\n", &
9450: 63 6b 73 75 6d 29 3b 0a 20 20 62 6c 6f 62 5f 72  cksum);.  blob_r
9460: 65 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20 20  eset(&cksum);.  
9470: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
9480: 74 69 6f 6e 28 29 3b 0a 20 20 77 69 6b 69 5f 70  tion();.  wiki_p
9490: 75 74 28 26 77 69 6b 69 2c 20 30 2c 20 77 69 6b  ut(&wiki, 0, wik
94a0: 69 5f 6e 65 65 64 5f 6d 6f 64 65 72 61 74 69 6f  i_need_moderatio
94b0: 6e 28 6c 6f 63 61 6c 55 73 65 72 29 29 3b 0a 20  n(localUser));. 
94c0: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
94d0: 69 6f 6e 28 30 29 3b 0a 20 20 72 65 74 75 72 6e  ion(0);.  return
94e0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74   1;.}../*.** Det
94f0: 65 72 6d 69 6e 65 20 74 68 65 20 72 69 64 20 66  ermine the rid f
9500: 6f 72 20 61 20 74 65 63 68 20 6e 6f 74 65 20 67  or a tech note g
9510: 69 76 65 6e 20 65 69 74 68 65 72 20 69 74 73 20  iven either its 
9520: 69 64 20 6f 72 20 69 74 73 0a 2a 2a 20 74 69 6d  id or its.** tim
9530: 65 73 74 61 6d 70 2e 20 52 65 74 75 72 6e 73 20  estamp. Returns 
9540: 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  0 if there is no
9550: 20 73 75 63 68 20 69 74 65 6d 20 61 6e 64 20 2d   such item and -
9560: 31 20 69 66 20 74 68 65 20 64 65 74 61 69 6c 73  1 if the details
9570: 0a 2a 2a 20 61 72 65 20 61 6d 62 69 67 75 6f 75  .** are ambiguou
9580: 73 20 61 6e 64 20 63 6f 75 6c 64 20 72 65 66 65  s and could refe
9590: 72 20 74 6f 20 6d 75 6c 74 69 70 6c 65 20 69 74  r to multiple it
95a0: 65 6d 73 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6b 69  ems..*/.int wiki
95b0: 5f 74 65 63 68 6e 6f 74 65 5f 74 6f 5f 72 69 64  _technote_to_rid
95c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 54  (const char *zET
95d0: 69 6d 65 29 20 7b 0a 20 20 69 6e 74 20 72 69 64  ime) {.  int rid
95e0: 3d 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  =0;             
95f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 74 69 66 61         /* Artifa
9600: 63 74 20 49 44 20 6f 66 20 74 68 65 20 74 65 63  ct ID of the tec
9610: 68 20 6e 6f 74 65 20 2a 2f 0a 20 20 69 6e 74 20  h note */.  int 
9620: 6e 45 54 69 6d 65 20 3d 20 73 74 72 6c 65 6e 28  nETime = strlen(
9630: 7a 45 54 69 6d 65 29 3b 0a 20 20 53 74 6d 74 20  zETime);.  Stmt 
9640: 71 3b 0a 20 20 69 66 28 20 6e 45 54 69 6d 65 3e  q;.  if( nETime>
9650: 3d 34 20 26 26 20 6e 45 54 69 6d 65 3c 3d 48 4e  =4 && nETime<=HN
9660: 41 4d 45 5f 4d 41 58 20 26 26 20 76 61 6c 69 64  AME_MAX && valid
9670: 61 74 65 31 36 28 7a 45 54 69 6d 65 2c 20 6e 45  ate16(zETime, nE
9680: 54 69 6d 65 29 20 29 7b 0a 20 20 20 20 63 68 61  Time) ){.    cha
9690: 72 20 7a 55 75 69 64 5b 48 4e 41 4d 45 5f 4d 41  r zUuid[HNAME_MA
96a0: 58 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  X+1];.    memcpy
96b0: 28 7a 55 75 69 64 2c 20 7a 45 54 69 6d 65 2c 20  (zUuid, zETime, 
96c0: 6e 45 54 69 6d 65 2b 31 29 3b 0a 20 20 20 20 63  nETime+1);.    c
96d0: 61 6e 6f 6e 69 63 61 6c 31 36 28 7a 55 75 69 64  anonical16(zUuid
96e0: 2c 20 6e 45 54 69 6d 65 29 3b 0a 20 20 20 20 64  , nETime);.    d
96f0: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20  b_prepare(&q,.  
9700: 20 20 20 20 22 53 45 4c 45 43 54 20 65 2e 6f 62      "SELECT e.ob
9710: 6a 69 64 22 0a 20 20 20 20 20 20 22 20 20 46 52  jid".      "  FR
9720: 4f 4d 20 65 76 65 6e 74 20 65 2c 20 74 61 67 20  OM event e, tag 
9730: 74 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  t".      " WHERE
9740: 20 65 2e 74 79 70 65 3d 27 65 27 20 41 4e 44 20   e.type='e' AND 
9750: 65 2e 74 61 67 69 64 20 49 53 20 4e 4f 54 20 4e  e.tagid IS NOT N
9760: 55 4c 4c 20 41 4e 44 20 74 2e 74 61 67 69 64 3d  ULL AND t.tagid=
9770: 65 2e 74 61 67 69 64 22 0a 20 20 20 20 20 20 22  e.tagid".      "
9780: 20 20 20 41 4e 44 20 74 2e 74 61 67 6e 61 6d 65     AND t.tagname
9790: 20 47 4c 4f 42 20 27 65 76 65 6e 74 2d 25 71 2a   GLOB 'event-%q*
97a0: 27 22 2c 0a 20 20 20 20 20 20 7a 55 75 69 64 0a  '",.      zUuid.
97b0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 64      );.    if( d
97c0: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
97d0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
97e0: 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  rid = db_column_
97f0: 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  int(&q, 0);.    
9800: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
9810: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  )==SQLITE_ROW ) 
9820: 72 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  rid = -1;.    }.
9830: 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28      db_finalize(
9840: 26 71 29 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21  &q);.  }.  if (!
9850: 72 69 64 29 20 7b 0a 20 20 20 20 69 66 20 28 73  rid) {.    if (s
9860: 74 72 6c 65 6e 28 7a 45 54 69 6d 65 29 3e 34 29  trlen(zETime)>4)
9870: 20 7b 0a 20 20 20 20 20 20 72 69 64 20 3d 20 64   {.      rid = d
9880: 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54  b_int(0, "SELECT
9890: 20 6f 62 6a 69 64 22 0a 20 20 20 20 20 20 20 20   objid".        
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
98b0: 20 46 52 4f 4d 20 65 76 65 6e 74 22 0a 20 20 20   FROM event".   
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 22 20 57 48 45 52 45 20 64 61 74 65 74     " WHERE datet
98e0: 69 6d 65 28 6d 74 69 6d 65 29 3d 64 61 74 65 74  ime(mtime)=datet
98f0: 69 6d 65 28 27 25 71 27 29 22 0a 20 20 20 20 20  ime('%q')".     
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9910: 20 22 20 20 20 41 4e 44 20 74 79 70 65 3d 27 65   "   AND type='e
9920: 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '".             
9930: 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44           "   AND
9940: 20 74 61 67 69 64 20 49 53 20 4e 4f 54 20 4e 55   tagid IS NOT NU
9950: 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL".            
9960: 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
9970: 52 20 42 59 20 6f 62 6a 69 64 20 44 45 53 43 20  R BY objid DESC 
9980: 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20  LIMIT 1",.      
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 54               zET
99a0: 69 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ime);.    }.  }.
99b0: 20 20 72 65 74 75 72 6e 20 72 69 64 3b 0a 7d 0a    return rid;.}.
99c0: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
99d0: 77 69 6b 69 2a 0a 2a 2a 0a 2a 2a 20 55 73 61 67  wiki*.**.** Usag
99e0: 65 3a 20 25 66 6f 73 73 69 6c 20 77 69 6b 69 20  e: %fossil wiki 
99f0: 28 65 78 70 6f 72 74 7c 63 72 65 61 74 65 7c 63  (export|create|c
9a00: 6f 6d 6d 69 74 7c 6c 69 73 74 29 20 57 69 6b 69  ommit|list) Wiki
9a10: 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 76  Name.**.** Run v
9a20: 61 72 69 6f 75 73 20 73 75 62 63 6f 6d 6d 61 6e  arious subcomman
9a30: 64 73 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 20  ds to work with 
9a40: 77 69 6b 69 20 65 6e 74 72 69 65 73 20 6f 72 20  wiki entries or 
9a50: 74 65 63 68 20 6e 6f 74 65 73 2e 0a 2a 2a 0a 2a  tech notes..**.*
9a60: 2a 20 20 20 20 25 66 6f 73 73 69 6c 20 77 69 6b  *    %fossil wik
9a70: 69 20 65 78 70 6f 72 74 20 50 41 47 45 4e 41 4d  i export PAGENAM
9a80: 45 20 3f 46 49 4c 45 3f 0a 2a 2a 20 20 20 20 25  E ?FILE?.**    %
9a90: 66 6f 73 73 69 6c 20 77 69 6b 69 20 65 78 70 6f  fossil wiki expo
9aa0: 72 74 20 3f 46 49 4c 45 3f 20 2d 74 7c 2d 2d 74  rt ?FILE? -t|--t
9ab0: 65 63 68 6e 6f 74 65 20 44 41 54 45 54 49 4d 45  echnote DATETIME
9ac0: 7c 54 45 43 48 4e 4f 54 45 2d 49 44 0a 2a 2a 0a  |TECHNOTE-ID.**.
9ad0: 2a 2a 20 20 20 20 20 20 20 53 65 6e 64 73 20 74  **       Sends t
9ae0: 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
9af0: 6e 20 6f 66 20 65 69 74 68 65 72 20 61 20 77 69  n of either a wi
9b00: 6b 69 20 70 61 67 65 20 6f 72 20 6f 66 20 61 20  ki page or of a 
9b10: 74 65 63 68 20 6e 6f 74 65 0a 2a 2a 20 20 20 20  tech note.**    
9b20: 20 20 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20     to the given 
9b30: 66 69 6c 65 20 6f 72 20 73 74 61 6e 64 61 72 64  file or standard
9b40: 20 6f 75 74 70 75 74 2e 0a 2a 2a 20 20 20 20 20   output..**     
9b50: 20 20 49 66 20 50 41 47 45 4e 41 4d 45 20 69 73    If PAGENAME is
9b60: 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 20 77   provided, the w
9b70: 69 6b 69 20 70 61 67 65 20 77 69 6c 6c 20 62 65  iki page will be
9b80: 20 6f 75 74 70 75 74 2e 20 46 6f 72 0a 2a 2a 20   output. For.** 
9b90: 20 20 20 20 20 20 61 20 74 65 63 68 20 6e 6f 74        a tech not
9ba0: 65 20 65 69 74 68 65 72 20 44 41 54 45 54 49 4d  e either DATETIM
9bb0: 45 20 6f 72 20 54 45 43 48 4e 4f 54 45 2d 49 44  E or TECHNOTE-ID
9bc0: 20 6d 75 73 74 20 62 65 20 73 70 65 63 69 66 69   must be specifi
9bd0: 65 64 2e 20 49 66 0a 2a 2a 20 20 20 20 20 20 20  ed. If.**       
9be0: 44 41 54 45 54 49 4d 45 20 69 73 20 75 73 65 64  DATETIME is used
9bf0: 2c 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  , the most recen
9c00: 74 6c 79 20 6d 6f 64 69 66 69 65 64 20 74 65 63  tly modified tec
9c10: 68 20 6e 6f 74 65 20 77 69 74 68 20 74 68 61 74  h note with that
9c20: 0a 2a 2a 20 20 20 20 20 20 20 44 41 54 45 54 49  .**       DATETI
9c30: 4d 45 20 77 69 6c 6c 20 62 65 20 73 65 6e 74 2e  ME will be sent.
9c40: 0a 2a 2a 0a 2a 2a 20 20 20 20 25 66 6f 73 73 69  .**.**    %fossi
9c50: 6c 20 77 69 6b 69 20 28 63 72 65 61 74 65 7c 63  l wiki (create|c
9c60: 6f 6d 6d 69 74 29 20 50 41 47 45 4e 41 4d 45 20  ommit) PAGENAME 
9c70: 3f 46 49 4c 45 3f 20 3f 4f 50 54 49 4f 4e 53 3f  ?FILE? ?OPTIONS?
9c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 43 72 65  .**.**       Cre
9c90: 61 74 65 20 61 20 6e 65 77 20 6f 72 20 63 6f 6d  ate a new or com
9ca0: 6d 69 74 20 63 68 61 6e 67 65 73 20 74 6f 20 61  mit changes to a
9cb0: 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6b 69 20  n existing wiki 
9cc0: 70 61 67 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20  page or.**      
9cd0: 20 74 65 63 68 6e 6f 74 65 20 66 72 6f 6d 20 46   technote from F
9ce0: 49 4c 45 20 6f 72 20 66 72 6f 6d 20 73 74 61 6e  ILE or from stan
9cf0: 64 61 72 64 20 69 6e 70 75 74 2e 20 50 41 47 45  dard input. PAGE
9d00: 4e 41 4d 45 20 69 73 20 74 68 65 0a 2a 2a 20 20  NAME is the.**  
9d10: 20 20 20 20 20 6e 61 6d 65 20 6f 66 20 74 68 65       name of the
9d20: 20 77 69 6b 69 20 65 6e 74 72 79 20 6f 72 20 74   wiki entry or t
9d30: 68 65 20 74 69 6d 65 6c 69 6e 65 20 63 6f 6d 6d  he timeline comm
9d40: 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  ent of the.**   
9d50: 20 20 20 20 74 65 63 68 6e 6f 74 65 2e 0a 2a 2a      technote..**
9d60: 0a 2a 2a 20 20 20 20 20 20 20 4f 70 74 69 6f 6e  .**       Option
9d70: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2d 4d  s:.**         -M
9d80: 7c 2d 2d 6d 69 6d 65 74 79 70 65 20 54 45 58 54  |--mimetype TEXT
9d90: 2d 46 4f 52 4d 41 54 20 20 20 54 68 65 20 6d 69  -FORMAT   The mi
9da0: 6d 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 75  me type of the u
9db0: 70 64 61 74 65 2e 0a 2a 2a 20 20 20 20 20 20 20  pdate..**       
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 65                De
9de0: 66 61 75 6c 74 73 20 74 6f 20 74 68 65 20 74 79  faults to the ty
9df0: 70 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 20 20  pe used by.**   
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 76    the previous v
9e30: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ersion of the.**
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 20 70 61 67 65 2c 20 6f 72 20 74 65       page, or te
9e70: 78 74 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69  xt/x-fossil-wiki
9e80: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 20 20 20 20 20 20 56 61 6c 69 64 20 76           Valid v
9eb0: 61 6c 75 65 73 20 61 72 65 3a 20 74 65 78 74 2f  alues are: text/
9ec0: 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 2c 0a 2a  x-fossil-wiki,.*
9ed0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 20 20 74 65 78 74 2f 6d 61 72 6b 64        text/markd
9f00: 6f 77 6e 20 61 6e 64 20 74 65 78 74 2f 70 6c 61  own and text/pla
9f10: 69 6e 2e 20 66 6f 73 73 69 6c 2c 0a 2a 2a 20 20  in. fossil,.**  
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 6d 61 72 6b 64 6f 77 6e 20 6f 72 20 70     markdown or p
9f50: 6c 61 69 6e 20 63 61 6e 20 62 65 20 73 70 65 63  lain can be spec
9f60: 69 66 69 65 64 20 61 73 0a 2a 2a 20 20 20 20 20  ified as.**     
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 73 79 6e 6f 6e 79 6d 73 20 6f 66 20 74 68 65 73  synonyms of thes
9fa0: 65 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 20 20 20  e values..**    
9fb0: 20 20 20 20 20 2d 74 7c 2d 2d 74 65 63 68 6e 6f       -t|--techno
9fc0: 74 65 20 44 41 54 45 54 49 4d 45 20 20 20 20 20  te DATETIME     
9fd0: 20 53 70 65 63 69 66 69 65 73 20 74 68 65 20 74   Specifies the t
9fe0: 69 6d 65 73 74 61 6d 70 20 6f 66 0a 2a 2a 20 20  imestamp of.**  
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 20 74 68 65 20 74 65 63 68 6e 6f 74 65 20     the technote 
a020: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 6f 72  to be created or
a030: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 20 20 75 70 64 61 74 65 64 2e          updated.
a060: 20 57 68 65 6e 20 75 70 64 61 74 69 6e 67 20 61   When updating a
a070: 20 74 65 63 68 20 6e 6f 74 65 0a 2a 2a 20 20 20   tech note.**   
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e    the most recen
a0b0: 74 6c 79 20 6d 6f 64 69 66 69 65 64 20 74 65 63  tly modified tec
a0c0: 68 20 6e 6f 74 65 0a 2a 2a 20 20 20 20 20 20 20  h note.**       
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
a0f0: 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
a100: 20 74 69 6d 65 73 74 61 6d 70 20 77 69 6c 6c 20   timestamp will 
a110: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 20 75 70 64 61 74 65            update
a140: 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 2d 74  d..**         -t
a150: 7c 2d 2d 74 65 63 68 6e 6f 74 65 20 54 45 43 48  |--technote TECH
a160: 4e 4f 54 45 2d 49 44 20 20 20 53 70 65 63 69 66  NOTE-ID   Specif
a170: 69 65 73 20 74 68 65 20 74 65 63 68 6e 6f 74 65  ies the technote
a180: 20 74 6f 20 62 65 0a 2a 2a 20 20 20 20 20 20 20   to be.**       
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70                up
a1b0: 64 61 74 65 64 20 62 79 20 69 74 73 20 74 65 63  dated by its tec
a1c0: 68 6e 6f 74 65 20 69 64 2e 0a 2a 2a 20 20 20 20  hnote id..**    
a1d0: 20 20 20 20 20 2d 2d 74 65 63 68 6e 6f 74 65 2d       --technote-
a1e0: 74 61 67 73 20 54 41 47 53 20 20 20 20 20 20 20  tags TAGS       
a1f0: 20 54 68 65 20 73 65 74 20 6f 66 20 74 61 67 73   The set of tags
a200: 20 66 6f 72 20 61 20 74 65 63 68 6e 6f 74 65 2e   for a technote.
a210: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2d 2d 74 65  .**         --te
a220: 63 68 6e 6f 74 65 2d 62 67 63 6f 6c 6f 72 20 43  chnote-bgcolor C
a230: 4f 4c 4f 52 20 20 20 20 54 68 65 20 63 6f 6c 6f  OLOR    The colo
a240: 72 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 74  r used for the t
a250: 65 63 68 6e 6f 74 65 0a 2a 2a 20 20 20 20 20 20  echnote.**      
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
a280: 6e 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 2e 0a  n the timeline..
a290: 2a 2a 0a 2a 2a 20 20 20 20 25 66 6f 73 73 69 6c  **.**    %fossil
a2a0: 20 77 69 6b 69 20 6c 69 73 74 20 3f 4f 50 54 49   wiki list ?OPTI
a2b0: 4f 4e 53 3f 0a 2a 2a 20 20 20 20 25 66 6f 73 73  ONS?.**    %foss
a2c0: 69 6c 20 77 69 6b 69 20 6c 73 20 3f 4f 50 54 49  il wiki ls ?OPTI
a2d0: 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ONS?.**.**      
a2e0: 20 4c 69 73 74 73 20 61 6c 6c 20 77 69 6b 69 20   Lists all wiki 
a2f0: 65 6e 74 72 69 65 73 2c 20 6f 6e 65 20 70 65 72  entries, one per
a300: 20 6c 69 6e 65 2c 20 6f 72 64 65 72 65 64 0a 2a   line, ordered.*
a310: 2a 20 20 20 20 20 20 20 63 61 73 65 2d 69 6e 73  *       case-ins
a320: 65 6e 73 69 74 69 76 65 6c 79 20 62 79 20 6e 61  ensitively by na
a330: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  me..**.**       
a340: 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20 20 20 20  Options:.**     
a350: 20 20 20 20 2d 74 7c 2d 2d 74 65 63 68 6e 6f 74      -t|--technot
a360: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
a370: 54 65 63 68 6e 6f 74 65 73 20 77 69 6c 6c 20 62  Technotes will b
a380: 65 20 6c 69 73 74 65 64 20 69 6e 73 74 65 61 64  e listed instead
a390: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 73             pages
a3c0: 2e 20 54 68 65 20 74 65 63 68 6e 6f 74 65 73 20  . The technotes 
a3d0: 77 69 6c 6c 20 62 65 20 69 6e 20 6f 72 64 65 72  will be in order
a3e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 20 20 20 20 20 6f 66 20 74 69 6d 65 73          of times
a410: 74 61 6d 70 20 77 69 74 68 20 74 68 65 20 6d 6f  tamp with the mo
a420: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 20 20 20  st recent.**    
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 66 69 72 73 74 2e 0a 2a 2a 20 20 20 20 20 20   first..**      
a460: 20 20 20 2d 73 7c 2d 2d 73 68 6f 77 2d 74 65 63     -s|--show-tec
a470: 68 6e 6f 74 65 2d 69 64 73 20 20 20 20 20 20 54  hnote-ids      T
a480: 68 65 20 69 64 20 6f 66 20 74 68 65 20 74 65 63  he id of the tec
a490: 68 20 6e 6f 74 65 20 77 69 6c 6c 20 62 65 20 6c  h note will be l
a4a0: 69 73 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  isted.**        
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6f               alo
a4d0: 6e 67 20 73 69 64 65 20 74 68 65 20 74 69 6d 65  ng side the time
a4e0: 73 74 61 6d 70 2e 20 54 68 65 20 74 65 63 68 20  stamp. The tech 
a4f0: 6e 6f 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  note.**         
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 20 77              id w
a520: 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
a530: 20 77 6f 72 64 20 6f 6e 20 65 61 63 68 20 6c 69   word on each li
a540: 6e 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ne..**          
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20             This 
a570: 6f 70 74 69 6f 6e 20 6f 6e 6c 79 20 61 70 70 6c  option only appl
a580: 69 65 73 20 69 66 20 74 68 65 0a 2a 2a 20 20 20  ies if the.**   
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 2d 2d 74 65 63 68 6e 6f 74 65 20 6f 70 74    --technote opt
a5c0: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 73 70 65 63  ion is also spec
a5d0: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 41 54  ified..**.** DAT
a5e0: 45 54 49 4d 45 20 6d 61 79 20 62 65 20 22 6e 6f  ETIME may be "no
a5f0: 77 22 20 6f 72 20 22 59 59 59 59 2d 4d 4d 2d 44  w" or "YYYY-MM-D
a600: 44 54 48 48 3a 4d 4d 3a 53 53 2e 53 53 53 22 2e  DTHH:MM:SS.SSS".
a610: 20 49 66 20 69 6e 0a 2a 2a 20 79 65 61 72 2d 6d   If in.** year-m
a620: 6f 6e 74 68 2d 64 61 79 20 66 6f 72 6d 2c 20 69  onth-day form, i
a630: 74 20 6d 61 79 20 62 65 20 74 72 75 6e 63 61 74  t may be truncat
a640: 65 64 2c 20 74 68 65 20 22 54 22 20 6d 61 79 20  ed, the "T" may 
a650: 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 0a 2a  be replaced by.*
a660: 2a 20 61 20 73 70 61 63 65 2c 20 61 6e 64 20 69  * a space, and i
a670: 74 20 6d 61 79 20 61 6c 73 6f 20 6e 61 6d 65 20  t may also name 
a680: 61 20 74 69 6d 65 7a 6f 6e 65 20 6f 66 66 73 65  a timezone offse
a690: 74 20 66 72 6f 6d 20 55 54 43 20 61 73 20 22 2d  t from UTC as "-
a6a0: 48 48 3a 4d 4d 22 0a 2a 2a 20 28 77 65 73 74 77  HH:MM".** (westw
a6b0: 61 72 64 29 20 6f 72 20 22 2b 48 48 3a 4d 4d 22  ard) or "+HH:MM"
a6c0: 20 28 65 61 73 74 77 61 72 64 29 2e 20 45 69 74   (eastward). Eit
a6d0: 68 65 72 20 6e 6f 20 74 69 6d 65 7a 6f 6e 65 20  her no timezone 
a6e0: 73 75 66 66 69 78 20 6f 72 20 22 5a 22 0a 2a 2a  suffix or "Z".**
a6f0: 20 6d 65 61 6e 73 20 55 54 43 2e 0a 2a 2a 0a 2a   means UTC..**.*
a700: 2f 0a 76 6f 69 64 20 77 69 6b 69 5f 63 6d 64 28  /.void wiki_cmd(
a710: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  void){.  int n;.
a720: 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70    db_find_and_op
a730: 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 30 2c  en_repository(0,
a740: 20 30 29 3b 0a 20 20 69 66 28 20 67 2e 61 72 67   0);.  if( g.arg
a750: 63 3c 33 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  c<3 ){.    goto 
a760: 77 69 6b 69 5f 63 6d 64 5f 75 73 61 67 65 3b 0a  wiki_cmd_usage;.
a770: 20 20 7d 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e    }.  n = strlen
a780: 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69  (g.argv[2]);.  i
a790: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 67  f( n==0 ){.    g
a7a0: 6f 74 6f 20 77 69 6b 69 5f 63 6d 64 5f 75 73 61  oto wiki_cmd_usa
a7b0: 67 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  ge;.  }..  if( s
a7c0: 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d  trncmp(g.argv[2]
a7d0: 2c 22 65 78 70 6f 72 74 22 2c 6e 29 3d 3d 30 20  ,"export",n)==0 
a7e0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a7f0: 72 20 2a 7a 50 61 67 65 4e 61 6d 65 3b 20 20 20  r *zPageName;   
a800: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a810: 74 68 65 20 77 69 6b 69 20 70 61 67 65 20 74 6f  the wiki page to
a820: 20 65 78 70 6f 72 74 20 2a 2f 0a 20 20 20 20 63   export */.    c
a830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
a840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a850: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 75 74 70  Name of the outp
a860: 75 74 20 66 69 6c 65 20 28 30 3d 73 74 64 6f 75  ut file (0=stdou
a870: 74 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  t) */.    const 
a880: 63 68 61 72 20 2a 7a 45 54 69 6d 65 3b 20 20 20  char *zETime;   
a890: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
a8a0: 61 6d 65 20 6f 66 20 74 68 65 20 74 65 63 68 6e  ame of the techn
a8b0: 6f 74 65 20 74 6f 20 65 78 70 6f 72 74 20 2a 2f  ote to export */
a8c0: 0a 20 20 20 20 69 6e 74 20 72 69 64 3b 20 20 20  .    int rid;   
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 20 20 2f 2a 20 41 72 74 69 66 61 63 74 20 49     /* Artifact I
a8f0: 44 20 6f 66 20 74 68 65 20 77 69 6b 69 20 70 61  D of the wiki pa
a900: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ge */.    int i;
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a930: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 63  counter */.    c
a940: 68 61 72 20 2a 7a 42 6f 64 79 20 3d 20 30 3b 20  har *zBody = 0; 
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a960: 57 69 6b 69 20 70 61 67 65 20 63 6f 6e 74 65 6e  Wiki page conten
a970: 74 20 2a 2f 0a 20 20 20 20 42 6c 6f 62 20 62 6f  t */.    Blob bo
a980: 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
a990: 20 20 20 20 20 20 20 2f 2a 20 57 69 6b 69 20 70         /* Wiki p
a9a0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  age content */. 
a9b0: 20 20 20 4d 61 6e 69 66 65 73 74 20 2a 70 57 69     Manifest *pWi
a9c0: 6b 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ki = 0;         
a9d0: 20 2f 2a 20 50 61 72 73 65 64 20 77 69 6b 69 20   /* Parsed wiki 
a9e0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  page content */.
a9f0: 0a 20 20 20 20 7a 45 54 69 6d 65 20 3d 20 66 69  .    zETime = fi
aa00: 6e 64 5f 6f 70 74 69 6f 6e 28 22 74 65 63 68 6e  nd_option("techn
aa10: 6f 74 65 22 2c 22 74 22 2c 31 29 3b 0a 20 20 20  ote","t",1);.   
aa20: 20 69 66 28 20 21 7a 45 54 69 6d 65 20 29 7b 0a   if( !zETime ){.
aa30: 20 20 20 20 20 20 69 66 28 20 28 67 2e 61 72 67        if( (g.arg
aa40: 63 21 3d 34 29 20 26 26 20 28 67 2e 61 72 67 63  c!=4) && (g.argc
aa50: 21 3d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=5) ){.        
aa60: 75 73 61 67 65 28 22 65 78 70 6f 72 74 20 50 41  usage("export PA
aa70: 47 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 22 29 3b  GENAME ?FILE?");
aa80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
aa90: 50 61 67 65 4e 61 6d 65 20 3d 20 67 2e 61 72 67  PageName = g.arg
aaa0: 76 5b 33 5d 3b 0a 20 20 20 20 20 20 72 69 64 20  v[3];.      rid 
aab0: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  = db_int(0, "SEL
aac0: 45 43 54 20 78 2e 72 69 64 20 46 52 4f 4d 20 74  ECT x.rid FROM t
aad0: 61 67 20 74 2c 20 74 61 67 78 72 65 66 20 78 22  ag t, tagxref x"
aae0: 0a 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45  .        " WHERE
aaf0: 20 78 2e 74 61 67 69 64 3d 74 2e 74 61 67 69 64   x.tagid=t.tagid
ab00: 20 41 4e 44 20 74 2e 74 61 67 6e 61 6d 65 3d 27   AND t.tagname='
ab10: 77 69 6b 69 2d 25 71 27 22 0a 20 20 20 20 20 20  wiki-%q'".      
ab20: 20 20 22 20 4f 52 44 45 52 20 42 59 20 78 2e 6d    " ORDER BY x.m
ab30: 74 69 6d 65 20 44 45 53 43 20 4c 49 4d 49 54 20  time DESC LIMIT 
ab40: 31 22 2c 0a 20 20 20 20 20 20 20 20 7a 50 61 67  1",.        zPag
ab50: 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  eName.      );. 
ab60: 20 20 20 20 20 69 66 28 20 28 70 57 69 6b 69 20       if( (pWiki 
ab70: 3d 20 6d 61 6e 69 66 65 73 74 5f 67 65 74 28 72  = manifest_get(r
ab80: 69 64 2c 20 43 46 54 59 50 45 5f 57 49 4b 49 2c  id, CFTYPE_WIKI,
ab90: 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   0))!=0 ){.     
aba0: 20 20 20 7a 42 6f 64 79 20 3d 20 70 57 69 6b 69     zBody = pWiki
abb0: 2d 3e 7a 57 69 6b 69 3b 0a 20 20 20 20 20 20 7d  ->zWiki;.      }
abc0: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 6f 64 79  .      if( zBody
abd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
abe0: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 77 69 6b  ossil_fatal("wik
abf0: 69 20 70 61 67 65 20 5b 25 73 5d 20 6e 6f 74 20  i page [%s] not 
ac00: 66 6f 75 6e 64 22 2c 7a 50 61 67 65 4e 61 6d 65  found",zPageName
ac10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ac20: 20 7a 46 69 6c 65 20 3d 20 28 67 2e 61 72 67 63   zFile = (g.argc
ac30: 3d 3d 34 29 20 3f 20 22 2d 22 20 3a 20 67 2e 61  ==4) ? "-" : g.a
ac40: 72 67 76 5b 34 5d 3b 0a 20 20 20 20 7d 65 6c 73  rgv[4];.    }els
ac50: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 28 67 2e  e{.      if( (g.
ac60: 61 72 67 63 21 3d 33 29 20 26 26 20 28 67 2e 61  argc!=3) && (g.a
ac70: 72 67 63 21 3d 34 29 20 29 7b 0a 20 20 20 20 20  rgc!=4) ){.     
ac80: 20 20 20 75 73 61 67 65 28 22 65 78 70 6f 72 74     usage("export
ac90: 20 3f 46 49 4c 45 3f 20 2d 2d 74 65 63 68 6e 6f   ?FILE? --techno
aca0: 74 65 20 44 41 54 45 54 49 4d 45 7c 54 45 43 48  te DATETIME|TECH
acb0: 4e 4f 54 45 2d 49 44 22 29 3b 0a 20 20 20 20 20  NOTE-ID");.     
acc0: 20 7d 0a 20 20 20 20 20 20 72 69 64 20 3d 20 77   }.      rid = w
acd0: 69 6b 69 5f 74 65 63 68 6e 6f 74 65 5f 74 6f 5f  iki_technote_to_
ace0: 72 69 64 28 7a 45 54 69 6d 65 29 3b 0a 20 20 20  rid(zETime);.   
acf0: 20 20 20 69 66 20 28 20 72 69 64 3d 3d 2d 31 20     if ( rid==-1 
ad00: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69  ){.        fossi
ad10: 6c 5f 66 61 74 61 6c 28 22 61 6d 62 69 67 75 6f  l_fatal("ambiguo
ad20: 75 73 20 74 65 63 68 20 6e 6f 74 65 20 69 64 3a  us tech note id:
ad30: 20 25 73 22 2c 20 7a 45 54 69 6d 65 29 3b 0a 20   %s", zETime);. 
ad40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ad50: 20 28 70 57 69 6b 69 20 3d 20 6d 61 6e 69 66 65   (pWiki = manife
ad60: 73 74 5f 67 65 74 28 72 69 64 2c 20 43 46 54 59  st_get(rid, CFTY
ad70: 50 45 5f 45 56 45 4e 54 2c 20 30 29 29 21 3d 30  PE_EVENT, 0))!=0
ad80: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 6f 64   ){.        zBod
ad90: 79 20 3d 20 70 57 69 6b 69 2d 3e 7a 57 69 6b 69  y = pWiki->zWiki
ada0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
adb0: 69 66 28 20 7a 42 6f 64 79 3d 3d 30 20 29 7b 0a  if( zBody==0 ){.
adc0: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66          fossil_f
add0: 61 74 61 6c 28 22 74 65 63 68 6e 6f 74 65 20 5b  atal("technote [
ade0: 25 73 5d 20 6e 6f 74 20 66 6f 75 6e 64 22 2c 7a  %s] not found",z
adf0: 45 54 69 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ETime);.      }.
ae00: 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 28 67        zFile = (g
ae10: 2e 61 72 67 63 3d 3d 33 29 20 3f 20 22 2d 22 20  .argc==3) ? "-" 
ae20: 3a 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 20 20 20  : g.argv[3];.   
ae30: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72   }.    for(i=str
ae40: 6c 65 6e 28 7a 42 6f 64 79 29 3b 20 69 3e 30 20  len(zBody); i>0 
ae50: 26 26 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63  && fossil_isspac
ae60: 65 28 7a 42 6f 64 79 5b 69 2d 31 5d 29 3b 20 69  e(zBody[i-1]); i
ae70: 2d 2d 29 7b 7d 0a 20 20 20 20 7a 42 6f 64 79 5b  --){}.    zBody[
ae80: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 62 6c 6f 62  i] = 0;.    blob
ae90: 5f 69 6e 69 74 28 26 62 6f 64 79 2c 20 7a 42 6f  _init(&body, zBo
aea0: 64 79 2c 20 2d 31 29 3b 0a 20 20 20 20 62 6c 6f  dy, -1);.    blo
aeb0: 62 5f 61 70 70 65 6e 64 28 26 62 6f 64 79 2c 20  b_append(&body, 
aec0: 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 20 20 62 6c  "\n", 1);.    bl
aed0: 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c 65  ob_write_to_file
aee0: 28 26 62 6f 64 79 2c 20 7a 46 69 6c 65 29 3b 0a  (&body, zFile);.
aef0: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
af00: 62 6f 64 79 29 3b 0a 20 20 20 20 6d 61 6e 69 66  body);.    manif
af10: 65 73 74 5f 64 65 73 74 72 6f 79 28 70 57 69 6b  est_destroy(pWik
af20: 69 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  i);.    return;.
af30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
af40: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 63  cmp(g.argv[2],"c
af50: 6f 6d 6d 69 74 22 2c 6e 29 3d 3d 30 0a 20 20 20  ommit",n)==0.   
af60: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6e           || strn
af70: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 63  cmp(g.argv[2],"c
af80: 72 65 61 74 65 22 2c 6e 29 3d 3d 30 20 29 7b 0a  reate",n)==0 ){.
af90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
afa0: 7a 50 61 67 65 4e 61 6d 65 3b 20 20 20 20 20 20  zPageName;      
afb0: 20 20 2f 2a 20 70 61 67 65 20 6e 61 6d 65 20 2a    /* page name *
afc0: 2f 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65  /.    Blob conte
afd0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
afe0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e      /* Input con
aff0: 74 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tent */.    int 
b000: 72 69 64 20 3d 20 30 3b 0a 20 20 20 20 4d 61 6e  rid = 0;.    Man
b010: 69 66 65 73 74 20 2a 70 57 69 6b 69 20 3d 20 30  ifest *pWiki = 0
b020: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
b030: 72 73 65 64 20 77 69 6b 69 20 70 61 67 65 20 63  rsed wiki page c
b040: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 63 6f  ontent */.    co
b050: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 54  nst char *zMimeT
b060: 79 70 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  ype = find_optio
b070: 6e 28 22 6d 69 6d 65 74 79 70 65 22 2c 20 22 4d  n("mimetype", "M
b080: 22 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74  ", 1);.    const
b090: 20 63 68 61 72 20 2a 7a 45 54 69 6d 65 20 3d 20   char *zETime = 
b0a0: 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 74 65 63  find_option("tec
b0b0: 68 6e 6f 74 65 22 2c 20 22 74 22 2c 20 31 29 3b  hnote", "t", 1);
b0c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b0d0: 2a 7a 54 61 67 73 20 3d 20 66 69 6e 64 5f 6f 70  *zTags = find_op
b0e0: 74 69 6f 6e 28 22 74 65 63 68 6e 6f 74 65 2d 74  tion("technote-t
b0f0: 61 67 73 22 2c 20 4e 55 4c 4c 2c 20 31 29 3b 0a  ags", NULL, 1);.
b100: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b110: 7a 43 6c 72 20 3d 20 66 69 6e 64 5f 6f 70 74 69  zClr = find_opti
b120: 6f 6e 28 22 74 65 63 68 6e 6f 74 65 2d 62 67 63  on("technote-bgc
b130: 6f 6c 6f 72 22 2c 20 4e 55 4c 4c 2c 20 31 29 3b  olor", NULL, 1);
b140: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 21  .    if( g.argc!
b150: 3d 34 20 26 26 20 67 2e 61 72 67 63 21 3d 35 20  =4 && g.argc!=5 
b160: 29 7b 0a 20 20 20 20 20 20 75 73 61 67 65 28 22  ){.      usage("
b170: 63 6f 6d 6d 69 74 7c 63 72 65 61 74 65 20 50 41  commit|create PA
b180: 47 45 4e 41 4d 45 20 3f 46 49 4c 45 3f 20 5b 2d  GENAME ?FILE? [-
b190: 2d 6d 69 6d 65 74 79 70 65 20 54 45 58 54 2d 46  -mimetype TEXT-F
b1a0: 4f 52 4d 41 54 5d 22 0a 20 20 20 20 20 20 20 20  ORMAT]".        
b1b0: 20 20 20 20 22 20 5b 2d 2d 74 65 63 68 6e 6f 74      " [--technot
b1c0: 65 20 44 41 54 45 54 49 4d 45 5d 20 5b 2d 2d 74  e DATETIME] [--t
b1d0: 65 63 68 6e 6f 74 65 2d 74 61 67 73 20 54 41 47  echnote-tags TAG
b1e0: 53 5d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  S]".            
b1f0: 22 20 5b 2d 2d 74 65 63 68 6e 6f 74 65 2d 62 67  " [--technote-bg
b200: 63 6f 6c 6f 72 20 43 4f 4c 4f 52 5d 22 29 3b 0a  color COLOR]");.
b210: 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 67 65 4e      }.    zPageN
b220: 61 6d 65 20 3d 20 67 2e 61 72 67 76 5b 33 5d 3b  ame = g.argv[3];
b230: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 3d  .    if( g.argc=
b240: 3d 34 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  =4 ){.      blob
b250: 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 68 61 6e 6e  _read_from_chann
b260: 65 6c 28 26 63 6f 6e 74 65 6e 74 2c 20 73 74 64  el(&content, std
b270: 69 6e 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  in, -1);.    }el
b280: 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72  se{.      blob_r
b290: 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 63  ead_from_file(&c
b2a0: 6f 6e 74 65 6e 74 2c 20 67 2e 61 72 67 76 5b 34  ontent, g.argv[4
b2b0: 5d 2c 20 45 78 74 46 49 4c 45 29 3b 0a 20 20 20  ], ExtFILE);.   
b2c0: 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 4d 69 6d   }.    if( !zMim
b2d0: 65 54 79 70 65 20 7c 7c 20 21 2a 7a 4d 69 6d 65  eType || !*zMime
b2e0: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Type ){.      /*
b2f0: 20 54 72 79 20 74 6f 20 64 65 64 75 63 65 20 74   Try to deduce t
b300: 68 65 20 6d 69 6d 65 20 74 79 70 65 20 62 61 73  he mime type bas
b310: 65 64 20 6f 6e 20 74 68 65 20 70 72 69 6f 72 20  ed on the prior 
b320: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
b330: 20 20 69 66 20 28 20 21 7a 45 54 69 6d 65 20 29    if ( !zETime )
b340: 7b 0a 20 20 20 20 20 20 20 20 72 69 64 20 3d 20  {.        rid = 
b350: 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43  db_int(0, "SELEC
b360: 54 20 78 2e 72 69 64 20 46 52 4f 4d 20 74 61 67  T x.rid FROM tag
b370: 20 74 2c 20 74 61 67 78 72 65 66 20 78 22 0a 20   t, tagxref x". 
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 22 20 57 48 45 52 45 20 78 2e 74 61      " WHERE x.ta
b3a0: 67 69 64 3d 74 2e 74 61 67 69 64 20 41 4e 44 20  gid=t.tagid AND 
b3b0: 74 2e 74 61 67 6e 61 6d 65 3d 27 77 69 6b 69 2d  t.tagname='wiki-
b3c0: 25 71 27 22 0a 20 20 20 20 20 20 20 20 20 20 20  %q'".           
b3d0: 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
b3e0: 52 20 42 59 20 78 2e 6d 74 69 6d 65 20 44 45 53  R BY x.mtime DES
b3f0: 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20  C LIMIT 1",.    
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 7a 50 61 67 65 4e 61 6d 65 0a 20 20 20 20 20   zPageName.     
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b440: 69 64 3e 30 20 26 26 20 28 70 57 69 6b 69 20 3d  id>0 && (pWiki =
b450: 20 6d 61 6e 69 66 65 73 74 5f 67 65 74 28 72 69   manifest_get(ri
b460: 64 2c 20 43 46 54 59 50 45 5f 57 49 4b 49 2c 20  d, CFTYPE_WIKI, 
b470: 30 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  0))!=0.         
b480: 20 20 26 26 20 28 70 57 69 6b 69 2d 3e 7a 4d 69    && (pWiki->zMi
b490: 6d 65 74 79 70 65 20 26 26 20 2a 70 57 69 6b 69  metype && *pWiki
b4a0: 2d 3e 7a 4d 69 6d 65 74 79 70 65 29 20 29 7b 0a  ->zMimetype) ){.
b4b0: 20 20 20 20 20 20 20 20 20 20 7a 4d 69 6d 65 54            zMimeT
b4c0: 79 70 65 20 3d 20 70 57 69 6b 69 2d 3e 7a 4d 69  ype = pWiki->zMi
b4d0: 6d 65 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20  metype;.        
b4e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
b4f0: 20 20 20 20 20 20 20 72 69 64 20 3d 20 77 69 6b         rid = wik
b500: 69 5f 74 65 63 68 6e 6f 74 65 5f 74 6f 5f 72 69  i_technote_to_ri
b510: 64 28 7a 45 54 69 6d 65 29 3b 0a 20 20 20 20 20  d(zETime);.     
b520: 20 20 20 69 66 28 20 72 69 64 3e 30 20 26 26 20     if( rid>0 && 
b530: 28 70 57 69 6b 69 20 3d 20 6d 61 6e 69 66 65 73  (pWiki = manifes
b540: 74 5f 67 65 74 28 72 69 64 2c 20 43 46 54 59 50  t_get(rid, CFTYP
b550: 45 5f 45 56 45 4e 54 2c 20 30 29 29 21 3d 30 0a  E_EVENT, 0))!=0.
b560: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
b570: 57 69 6b 69 2d 3e 7a 4d 69 6d 65 74 79 70 65 20  Wiki->zMimetype 
b580: 26 26 20 2a 70 57 69 6b 69 2d 3e 7a 4d 69 6d 65  && *pWiki->zMime
b590: 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20  type) ){.       
b5a0: 20 20 20 7a 4d 69 6d 65 54 79 70 65 20 3d 20 70     zMimeType = p
b5b0: 57 69 6b 69 2d 3e 7a 4d 69 6d 65 74 79 70 65 3b  Wiki->zMimetype;
b5c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b5d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
b5e0: 20 20 20 20 7a 4d 69 6d 65 54 79 70 65 20 3d 20      zMimeType = 
b5f0: 77 69 6b 69 5f 66 69 6c 74 65 72 5f 6d 69 6d 65  wiki_filter_mime
b600: 74 79 70 65 73 28 7a 4d 69 6d 65 54 79 70 65 29  types(zMimeType)
b610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b620: 67 2e 61 72 67 76 5b 32 5d 5b 31 5d 3d 3d 27 72  g.argv[2][1]=='r
b630: 27 20 26 26 20 72 69 64 3e 30 20 29 7b 0a 20 20  ' && rid>0 ){.  
b640: 20 20 20 20 69 66 20 28 20 21 7a 45 54 69 6d 65      if ( !zETime
b650: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73   ){.        foss
b660: 69 6c 5f 66 61 74 61 6c 28 22 77 69 6b 69 20 70  il_fatal("wiki p
b670: 61 67 65 20 25 73 20 61 6c 72 65 61 64 79 20 65  age %s already e
b680: 78 69 73 74 73 22 2c 20 7a 50 61 67 65 4e 61 6d  xists", zPageNam
b690: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
b6a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61  .        /* Crea
b6b0: 74 69 6e 67 20 61 20 74 65 63 68 20 6e 6f 74 65  ting a tech note
b6c0: 20 77 69 74 68 20 73 61 6d 65 20 74 69 6d 65 73   with same times
b6d0: 74 61 6d 70 20 69 73 20 70 65 72 6d 69 74 74 65  tamp is permitte
b6e0: 64 0a 20 20 20 20 20 20 20 20 20 20 20 61 6e 64  d.           and
b6f0: 20 73 68 6f 75 6c 64 20 63 72 65 61 74 65 20 61   should create a
b700: 20 6e 65 77 20 74 65 63 68 20 6e 6f 74 65 20 2a   new tech note *
b710: 2f 0a 20 20 20 20 20 20 20 20 72 69 64 20 3d 20  /.        rid = 
b720: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
b730: 65 6c 73 65 20 69 66 28 20 67 2e 61 72 67 76 5b  else if( g.argv[
b740: 32 5d 5b 31 5d 3d 3d 27 6f 27 20 26 26 20 72 69  2][1]=='o' && ri
b750: 64 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  d == 0 ){.      
b760: 69 66 20 28 20 21 7a 45 54 69 6d 65 20 29 7b 0a  if ( !zETime ){.
b770: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66          fossil_f
b780: 61 74 61 6c 28 22 6e 6f 20 73 75 63 68 20 77 69  atal("no such wi
b790: 6b 69 20 70 61 67 65 3a 20 25 73 22 2c 20 7a 50  ki page: %s", zP
b7a0: 61 67 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ageName);.      
b7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
b7c0: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20  ossil_fatal("no 
b7d0: 73 75 63 68 20 74 65 63 68 20 6e 6f 74 65 3a 20  such tech note: 
b7e0: 25 73 22 2c 20 7a 45 54 69 6d 65 29 3b 0a 20 20  %s", zETime);.  
b7f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b800: 20 69 66 28 20 21 7a 45 54 69 6d 65 20 29 7b 0a   if( !zETime ){.
b810: 20 20 20 20 20 20 77 69 6b 69 5f 63 6d 64 5f 63        wiki_cmd_c
b820: 6f 6d 6d 69 74 28 7a 50 61 67 65 4e 61 6d 65 2c  ommit(zPageName,
b830: 20 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 2c 20   rid, &content, 
b840: 7a 4d 69 6d 65 54 79 70 65 2c 20 31 29 3b 0a 20  zMimeType, 1);. 
b850: 20 20 20 20 20 69 66 28 20 67 2e 61 72 67 76 5b       if( g.argv[
b860: 32 5d 5b 31 5d 3d 3d 27 72 27 20 29 7b 0a 20 20  2][1]=='r' ){.  
b870: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
b880: 6e 74 28 22 43 72 65 61 74 65 64 20 6e 65 77 20  nt("Created new 
b890: 77 69 6b 69 20 70 61 67 65 20 25 73 2e 5c 6e 22  wiki page %s.\n"
b8a0: 2c 20 7a 50 61 67 65 4e 61 6d 65 29 3b 0a 20 20  , zPageName);.  
b8b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b8c0: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
b8d0: 22 55 70 64 61 74 65 64 20 77 69 6b 69 20 70 61  "Updated wiki pa
b8e0: 67 65 20 25 73 2e 5c 6e 22 2c 20 7a 50 61 67 65  ge %s.\n", zPage
b8f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
b900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b910: 69 66 28 20 72 69 64 20 21 3d 20 2d 31 20 29 7b  if( rid != -1 ){
b920: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
b930: 4d 45 54 69 6d 65 3b 20 20 20 20 20 20 20 20 20  METime;         
b940: 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a 65 64 2c 20   /* Normalized, 
b950: 6d 75 74 61 62 6c 65 20 76 65 72 73 69 6f 6e 20  mutable version 
b960: 6f 66 20 7a 45 54 69 6d 65 20 2a 2f 0a 20 20 20  of zETime */.   
b970: 20 20 20 20 20 7a 4d 45 54 69 6d 65 20 3d 20 64       zMETime = d
b980: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
b990: 54 20 63 6f 61 6c 65 73 63 65 28 64 61 74 65 74  T coalesce(datet
b9a0: 69 6d 65 28 25 51 29 2c 64 61 74 65 74 69 6d 65  ime(%Q),datetime
b9b0: 28 27 6e 6f 77 27 29 29 22 2c 0a 20 20 20 20 20  ('now'))",.     
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 7a 45 54 69 6d 65 29 3b 0a 20 20       zETime);.  
b9e0: 20 20 20 20 20 20 65 76 65 6e 74 5f 63 6d 64 5f        event_cmd_
b9f0: 63 6f 6d 6d 69 74 28 7a 4d 45 54 69 6d 65 2c 20  commit(zMETime, 
ba00: 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 2c 20 7a  rid, &content, z
ba10: 4d 69 6d 65 54 79 70 65 2c 20 7a 50 61 67 65 4e  MimeType, zPageN
ba20: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
ba40: 61 67 73 2c 20 7a 43 6c 72 29 3b 0a 20 20 20 20  ags, zClr);.    
ba50: 20 20 20 20 69 66 28 20 67 2e 61 72 67 76 5b 32      if( g.argv[2
ba60: 5d 5b 31 5d 3d 3d 27 72 27 20 29 7b 0a 20 20 20  ][1]=='r' ){.   
ba70: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72         fossil_pr
ba80: 69 6e 74 28 22 43 72 65 61 74 65 64 20 6e 65 77  int("Created new
ba90: 20 74 65 63 68 20 6e 6f 74 65 20 25 73 2e 5c 6e   tech note %s.\n
baa0: 22 2c 20 7a 4d 45 54 69 6d 65 29 3b 0a 20 20 20  ", zMETime);.   
bab0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bac0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
bad0: 6e 74 28 22 55 70 64 61 74 65 64 20 74 65 63 68  nt("Updated tech
bae0: 20 6e 6f 74 65 20 25 73 2e 5c 6e 22 2c 20 7a 4d   note %s.\n", zM
baf0: 45 54 69 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ETime);.        
bb00: 7d 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  }.        free(z
bb10: 4d 45 54 69 6d 65 29 3b 0a 20 20 20 20 20 20 7d  METime);.      }
bb20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
bb30: 73 73 69 6c 5f 66 61 74 61 6c 28 22 61 6d 62 69  ssil_fatal("ambi
bb40: 67 75 6f 75 73 20 74 65 63 68 20 6e 6f 74 65 20  guous tech note 
bb50: 69 64 3a 20 25 73 22 2c 20 7a 45 54 69 6d 65 29  id: %s", zETime)
bb60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bb70: 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 64 65 73      manifest_des
bb80: 74 72 6f 79 28 70 57 69 6b 69 29 3b 0a 20 20 20  troy(pWiki);.   
bb90: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e   blob_reset(&con
bba0: 74 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  tent);.  }else i
bbb0: 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67  f( strncmp(g.arg
bbc0: 76 5b 32 5d 2c 22 64 65 6c 65 74 65 22 2c 6e 29  v[2],"delete",n)
bbd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
bbe0: 2e 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20  .argc!=5 ){.    
bbf0: 20 20 75 73 61 67 65 28 22 64 65 6c 65 74 65 20    usage("delete 
bc00: 50 41 47 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20  PAGENAME");.    
bc10: 7d 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  }.    fossil_fat
bc20: 61 6c 28 22 64 65 6c 65 74 65 20 6e 6f 74 20 79  al("delete not y
bc30: 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 22  et implemented."
bc40: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 28 20  );.  }else if(( 
bc50: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32  strncmp(g.argv[2
bc60: 5d 2c 22 6c 69 73 74 22 2c 6e 29 3d 3d 30 20 29  ],"list",n)==0 )
bc70: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 20  .          || ( 
bc80: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32  strncmp(g.argv[2
bc90: 5d 2c 22 6c 73 22 2c 6e 29 3d 3d 30 20 29 29 7b  ],"ls",n)==0 )){
bca0: 0a 20 20 20 20 53 74 6d 74 20 71 3b 0a 20 20 20  .    Stmt q;.   
bcb0: 20 69 6e 74 20 73 68 6f 77 49 64 73 20 3d 20 30   int showIds = 0
bcc0: 3b 0a 0a 20 20 20 20 69 66 20 28 20 21 66 69 6e  ;..    if ( !fin
bcd0: 64 5f 6f 70 74 69 6f 6e 28 22 74 65 63 68 6e 6f  d_option("techno
bce0: 74 65 22 2c 22 74 22 2c 30 29 20 29 7b 0a 20 20  te","t",0) ){.  
bcf0: 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26      db_prepare(&
bd00: 71 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  q,.        "SELE
bd10: 43 54 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d  CT substr(tagnam
bd20: 65 2c 20 36 29 20 46 52 4f 4d 20 74 61 67 20 57  e, 6) FROM tag W
bd30: 48 45 52 45 20 74 61 67 6e 61 6d 65 20 47 4c 4f  HERE tagname GLO
bd40: 42 20 27 77 69 6b 69 2d 2a 27 22 0a 20 20 20 20  B 'wiki-*'".    
bd50: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6c      " ORDER BY l
bd60: 6f 77 65 72 28 74 61 67 6e 61 6d 65 29 20 2f 2a  ower(tagname) /*
bd70: 73 6f 72 74 2a 2f 22 0a 20 20 20 20 20 20 29 3b  sort*/".      );
bd80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bd90: 20 20 73 68 6f 77 49 64 73 20 3d 20 66 69 6e 64    showIds = find
bda0: 5f 6f 70 74 69 6f 6e 28 22 73 68 6f 77 2d 74 65  _option("show-te
bdb0: 63 68 6e 6f 74 65 2d 69 64 73 22 2c 22 73 22 2c  chnote-ids","s",
bdc0: 30 29 21 3d 30 3b 0a 20 20 20 20 20 20 64 62 5f  0)!=0;.      db_
bdd0: 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20  prepare(&q,.    
bde0: 20 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 65      "SELECT date
bdf0: 74 69 6d 65 28 65 2e 6d 74 69 6d 65 29 2c 20 73  time(e.mtime), s
be00: 75 62 73 74 72 28 74 2e 74 61 67 6e 61 6d 65 2c  ubstr(t.tagname,
be10: 37 29 22 0a 20 20 20 20 20 20 20 20 20 22 20 46  7)".         " F
be20: 52 4f 4d 20 65 76 65 6e 74 20 65 2c 20 74 61 67  ROM event e, tag
be30: 20 74 22 0a 20 20 20 20 20 20 20 20 22 20 57 48   t".        " WH
be40: 45 52 45 20 65 2e 74 79 70 65 3d 27 65 27 22 0a  ERE e.type='e'".
be50: 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20            " AND 
be60: 65 2e 74 61 67 69 64 20 49 53 20 4e 4f 54 20 4e  e.tagid IS NOT N
be70: 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20 22  ULL".          "
be80: 20 41 4e 44 20 74 2e 74 61 67 69 64 3d 65 2e 74   AND t.tagid=e.t
be90: 61 67 69 64 22 0a 20 20 20 20 20 20 20 20 22 20  agid".        " 
bea0: 4f 52 44 45 52 20 42 59 20 65 2e 6d 74 69 6d 65  ORDER BY e.mtime
beb0: 20 44 45 53 43 20 2f 2a 73 6f 72 74 2a 2f 22 0a   DESC /*sort*/".
bec0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
bed0: 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74      while( db_st
bee0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
bef0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OW ){.      cons
bf00: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
bf10: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
bf20: 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  q, 0);.      if(
bf30: 20 73 68 6f 77 49 64 73 20 29 7b 0a 20 20 20 20   showIds ){.    
bf40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
bf50: 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d  zUuid = db_colum
bf60: 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20  n_text(&q, 1);. 
bf70: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72         fossil_pr
bf80: 69 6e 74 28 22 25 73 20 22 2c 7a 55 75 69 64 29  int("%s ",zUuid)
bf90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bfa0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 20 22 25  fossil_print( "%
bfb0: 73 5c 6e 22 2c 7a 4e 61 6d 65 29 3b 0a 20 20 20  s\n",zName);.   
bfc0: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
bfd0: 7a 65 28 26 71 29 3b 0a 20 20 7d 65 6c 73 65 7b  ze(&q);.  }else{
bfe0: 0a 20 20 20 20 67 6f 74 6f 20 77 69 6b 69 5f 63  .    goto wiki_c
bff0: 6d 64 5f 75 73 61 67 65 3b 0a 20 20 7d 0a 20 20  md_usage;.  }.  
c000: 72 65 74 75 72 6e 3b 0a 0a 77 69 6b 69 5f 63 6d  return;..wiki_cm
c010: 64 5f 75 73 61 67 65 3a 0a 20 20 75 73 61 67 65  d_usage:.  usage
c020: 28 22 65 78 70 6f 72 74 7c 63 72 65 61 74 65 7c  ("export|create|
c030: 63 6f 6d 6d 69 74 7c 6c 69 73 74 20 2e 2e 2e 22  commit|list ..."
c040: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  );.}../*.** COMM
c050: 41 4e 44 3a 20 74 65 73 74 2d 6d 61 72 6b 64 6f  AND: test-markdo
c060: 77 6e 2d 72 65 6e 64 65 72 0a 2a 2a 0a 2a 2a 20  wn-render.**.** 
c070: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74  Usage: %fossil t
c080: 65 73 74 2d 6d 61 72 6b 64 6f 77 6e 2d 72 65 6e  est-markdown-ren
c090: 64 65 72 20 46 49 4c 45 0a 2a 2a 0a 2a 2a 20 52  der FILE.**.** R
c0a0: 65 6e 64 65 72 20 6d 61 72 6b 64 6f 77 6e 20 77  ender markdown w
c0b0: 69 6b 69 20 66 72 6f 6d 20 46 49 4c 45 20 74 6f  iki from FILE to
c0c0: 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2f 0a 76   stdout..**.*/.v
c0d0: 6f 69 64 20 74 65 73 74 5f 6d 61 72 6b 64 6f 77  oid test_markdow
c0e0: 6e 5f 72 65 6e 64 65 72 28 76 6f 69 64 29 7b 0a  n_render(void){.
c0f0: 20 20 42 6c 6f 62 20 69 6e 2c 20 6f 75 74 3b 0a    Blob in, out;.
c100: 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74    verify_all_opt
c110: 69 6f 6e 73 28 29 3b 0a 20 20 69 66 28 20 67 2e  ions();.  if( g.
c120: 61 72 67 63 21 3d 33 20 29 20 75 73 61 67 65 28  argc!=3 ) usage(
c130: 22 46 49 4c 45 22 29 3b 0a 20 20 62 6c 6f 62 5f  "FILE");.  blob_
c140: 7a 65 72 6f 28 26 6f 75 74 29 3b 0a 20 20 62 6c  zero(&out);.  bl
c150: 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c  ob_read_from_fil
c160: 65 28 26 69 6e 2c 20 67 2e 61 72 67 76 5b 32 5d  e(&in, g.argv[2]
c170: 2c 20 45 78 74 46 49 4c 45 29 3b 0a 20 20 6d 61  , ExtFILE);.  ma
c180: 72 6b 64 6f 77 6e 5f 74 6f 5f 68 74 6d 6c 28 26  rkdown_to_html(&
c190: 69 6e 2c 20 30 2c 20 26 6f 75 74 29 3b 0a 20 20  in, 0, &out);.  
c1a0: 62 6c 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69  blob_write_to_fi
c1b0: 6c 65 28 26 6f 75 74 2c 20 22 2d 22 29 3b 0a 7d  le(&out, "-");.}
c1c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
c1d0: 66 6c 61 67 73 20 66 6f 72 20 77 69 6b 69 5f 72  flags for wiki_r
c1e0: 65 6e 64 65 72 5f 61 73 73 6f 63 69 61 74 65 64  ender_associated
c1f0: 0a 2a 2f 0a 23 69 66 20 49 4e 54 45 52 46 41 43  .*/.#if INTERFAC
c200: 45 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 41 53  E.#define WIKIAS
c210: 53 4f 43 5f 46 55 4c 4c 5f 54 49 54 4c 45 20 20  SOC_FULL_TITLE  
c220: 30 78 30 30 30 30 31 20 20 20 2f 2a 20 46 75 6c  0x00001   /* Ful
c230: 6c 20 74 69 74 6c 65 20 2a 2f 0a 23 64 65 66 69  l title */.#defi
c240: 6e 65 20 57 49 4b 49 41 53 53 4f 43 5f 4d 45 4e  ne WIKIASSOC_MEN
c250: 55 5f 52 45 41 44 20 20 20 30 78 30 30 30 30 32  U_READ   0x00002
c260: 20 20 20 2f 2a 20 41 64 64 20 73 75 62 6d 65 6e     /* Add submen
c270: 75 20 6c 69 6e 6b 20 74 6f 20 72 65 61 64 20 77  u link to read w
c280: 69 6b 69 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  iki */.#define W
c290: 49 4b 49 41 53 53 4f 43 5f 4d 45 4e 55 5f 57 52  IKIASSOC_MENU_WR
c2a0: 49 54 45 20 20 30 78 30 30 30 30 34 20 20 20 2f  ITE  0x00004   /
c2b0: 2a 20 41 64 64 20 73 75 62 6d 65 6e 75 20 6c 69  * Add submenu li
c2c0: 6e 6b 20 74 6f 20 61 64 64 20 77 69 6b 69 20 2a  nk to add wiki *
c2d0: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4b 49 41 53  /.#define WIKIAS
c2e0: 53 4f 43 5f 41 4c 4c 20 20 20 20 20 20 20 20 20  SOC_ALL         
c2f0: 30 78 30 30 30 30 37 20 20 20 2f 2a 20 41 6c 6c  0x00007   /* All
c300: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 2a 2f   of the above */
c310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
c320: 68 6f 77 20 74 68 65 20 64 65 66 61 75 6c 74 20  how the default 
c330: 53 65 63 74 69 6f 6e 20 6c 61 62 65 6c 20 66 6f  Section label fo
c340: 72 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  r an associated 
c350: 77 69 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  wiki page..*/.st
c360: 61 74 69 63 20 76 6f 69 64 20 77 69 6b 69 5f 73  atic void wiki_s
c370: 65 63 74 69 6f 6e 5f 6c 61 62 65 6c 28 0a 20 20  ection_label(.  
c380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65  const char *zPre
c390: 66 69 78 2c 20 20 20 2f 2a 20 22 62 72 61 6e 63  fix,   /* "branc
c3a0: 68 22 2c 20 22 74 61 67 22 2c 20 6f 72 20 22 63  h", "tag", or "c
c3b0: 68 65 63 6b 69 6e 22 20 2a 2f 0a 20 20 63 6f 6e  heckin" */.  con
c3c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
c3d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
c3e0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  he object */.  u
c3f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 46 6c 61  nsigned int mFla
c400: 67 73 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72  gs    /* Zero or
c410: 20 6d 6f 72 65 20 57 49 4b 49 41 53 53 4f 43 5f   more WIKIASSOC_
c420: 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
c430: 69 66 28 20 28 6d 46 6c 61 67 73 20 26 20 57 49  if( (mFlags & WI
c440: 4b 49 41 53 53 4f 43 5f 46 55 4c 4c 5f 54 49 54  KIASSOC_FULL_TIT
c450: 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 40 20  LE)==0 ){.    @ 
c460: 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65 63 74  <div class="sect
c470: 69 6f 6e 22 3e 41 62 6f 75 74 3c 2f 64 69 76 3e  ion">About</div>
c480: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 72  .  }else if( zPr
c490: 65 66 69 78 5b 30 5d 3d 3d 27 63 27 20 29 7b 20  efix[0]=='c' ){ 
c4a0: 20 2f 2a 20 63 68 65 63 6b 69 6e 2f 2e 2e 2e 20   /* checkin/... 
c4b0: 2a 2f 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c  */.    @ <div cl
c4c0: 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e 41 62  ass="section">Ab
c4d0: 6f 75 74 20 63 68 65 63 6b 69 6e 20 25 2e 32 30  out checkin %.20
c4e0: 68 28 7a 4e 61 6d 65 29 3c 2f 64 69 76 3e 0a 20  h(zName)</div>. 
c4f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 64   }else{.    @ <d
c500: 69 76 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f  iv class="sectio
c510: 6e 22 3e 41 62 6f 75 74 20 25 73 28 7a 50 72 65  n">About %s(zPre
c520: 66 69 78 29 20 25 68 28 7a 4e 61 6d 65 29 3c 2f  fix) %h(zName)</
c530: 64 69 76 3e 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  div>.  }.}../*.*
c540: 2a 20 41 64 64 20 61 6e 20 22 57 69 6b 69 22 20  * Add an "Wiki" 
c550: 62 75 74 74 6f 6e 20 69 6e 20 61 20 73 75 62 6d  button in a subm
c560: 65 6e 75 20 74 68 61 74 20 6c 69 6e 6b 73 20 74  enu that links t
c570: 6f 20 74 68 65 20 72 65 61 64 2d 77 69 6b 69 20  o the read-wiki 
c580: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
c590: 76 6f 69 64 20 77 69 6b 69 5f 73 75 62 6d 65 6e  void wiki_submen
c5a0: 75 5f 74 6f 5f 72 65 61 64 5f 77 69 6b 69 28 0a  u_to_read_wiki(.
c5b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
c5c0: 72 65 66 69 78 2c 20 20 20 2f 2a 20 22 62 72 61  refix,   /* "bra
c5d0: 6e 63 68 22 2c 20 22 74 61 67 22 2c 20 6f 72 20  nch", "tag", or 
c5e0: 22 63 68 65 63 6b 69 6e 22 20 2a 2f 0a 20 20 63  "checkin" */.  c
c5f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c600: 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
c610: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
c620: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 46   unsigned int mF
c630: 6c 61 67 73 20 20 20 20 2f 2a 20 5a 65 72 6f 20  lags    /* Zero 
c640: 6f 72 20 6d 6f 72 65 20 57 49 4b 49 41 53 53 4f  or more WIKIASSO
c650: 43 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  C_* flags */.){.
c660: 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 52 64 57    if( g.perm.RdW
c670: 69 6b 69 20 26 26 20 28 6d 46 6c 61 67 73 20 26  iki && (mFlags &
c680: 20 57 49 4b 49 41 53 53 4f 43 5f 4d 45 4e 55 5f   WIKIASSOC_MENU_
c690: 52 45 41 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  READ)!=0 ){.    
c6a0: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
c6b0: 65 6d 65 6e 74 28 22 57 69 6b 69 22 2c 20 22 25  ement("Wiki", "%
c6c0: 52 2f 77 69 6b 69 3f 6e 61 6d 65 3d 25 73 2f 25  R/wiki?name=%s/%
c6d0: 74 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4e 61  t", zPrefix, zNa
c6e0: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
c6f0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
c700: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
c710: 20 77 69 6b 69 20 70 61 67 65 20 77 69 74 68 20   wiki page with 
c720: 61 20 6e 61 6d 65 20 7a 50 72 65 66 69 78 2f 7a  a name zPrefix/z
c730: 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65 72  Name..** If ther
c740: 65 20 69 73 2c 20 74 68 65 6e 20 72 65 6e 64 65  e is, then rende
c750: 72 20 61 20 3c 64 69 76 20 63 6c 61 73 73 3d 27  r a <div class='
c760: 73 65 63 74 69 6f 6e 27 3e 2e 2e 3c 2f 64 69 76  section'>..</div
c770: 3e 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  > and.** return 
c780: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
c790: 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
c7a0: 77 69 6b 69 20 70 61 67 65 2c 20 72 65 74 75 72  wiki page, retur
c7b0: 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  n false..*/.int 
c7c0: 77 69 6b 69 5f 72 65 6e 64 65 72 5f 61 73 73 6f  wiki_render_asso
c7d0: 63 69 61 74 65 64 28 0a 20 20 63 6f 6e 73 74 20  ciated(.  const 
c7e0: 63 68 61 72 20 2a 7a 50 72 65 66 69 78 2c 20 20  char *zPrefix,  
c7f0: 20 2f 2a 20 22 62 72 61 6e 63 68 22 2c 20 22 74   /* "branch", "t
c800: 61 67 22 2c 20 6f 72 20 22 63 68 65 63 6b 69 6e  ag", or "checkin
c810: 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  " */.  const cha
c820: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
c830: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a   Name of the obj
c840: 65 63 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ect */.  unsigne
c850: 64 20 69 6e 74 20 6d 46 6c 61 67 73 20 20 20 20  d int mFlags    
c860: 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  /* Zero or more 
c870: 57 49 4b 49 41 53 53 4f 43 5f 2a 20 66 6c 61 67  WIKIASSOC_* flag
c880: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 69  s */.){.  int ri
c890: 64 3b 0a 20 20 4d 61 6e 69 66 65 73 74 20 2a 70  d;.  Manifest *p
c8a0: 57 69 6b 69 3b 0a 20 20 69 66 28 20 21 64 62 5f  Wiki;.  if( !db_
c8b0: 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 77 69 6b  get_boolean("wik
c8c0: 69 2d 61 62 6f 75 74 22 2c 31 29 20 29 20 72 65  i-about",1) ) re
c8d0: 74 75 72 6e 20 30 3b 0a 20 20 72 69 64 20 3d 20  turn 0;.  rid = 
c8e0: 64 62 5f 69 6e 74 28 30 2c 0a 20 20 20 20 22 53  db_int(0,.    "S
c8f0: 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 74  ELECT rid FROM t
c900: 61 67 78 72 65 66 22 0a 20 20 20 20 22 20 57 48  agxref".    " WH
c910: 45 52 45 20 74 61 67 69 64 3d 28 53 45 4c 45 43  ERE tagid=(SELEC
c920: 54 20 74 61 67 69 64 20 46 52 4f 4d 20 74 61 67  T tagid FROM tag
c930: 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 3d 27   WHERE tagname='
c940: 77 69 6b 69 2d 25 71 2f 25 71 27 29 22 0a 20 20  wiki-%q/%q')".  
c950: 20 20 22 20 4f 52 44 45 52 20 42 59 20 6d 74 69    " ORDER BY mti
c960: 6d 65 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22  me DESC LIMIT 1"
c970: 2c 0a 20 20 20 20 7a 50 72 65 66 69 78 2c 20 7a  ,.    zPrefix, z
c980: 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20  Name.  );.  if( 
c990: 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  rid==0 ){.    if
c9a0: 28 20 67 2e 70 65 72 6d 2e 57 72 57 69 6b 69 20  ( g.perm.WrWiki 
c9b0: 26 26 20 67 2e 70 65 72 6d 2e 57 72 69 74 65 20  && g.perm.Write 
c9c0: 26 26 20 28 6d 46 6c 61 67 73 20 26 20 57 49 4b  && (mFlags & WIK
c9d0: 49 41 53 53 4f 43 5f 4d 45 4e 55 5f 57 52 49 54  IASSOC_MENU_WRIT
c9e0: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)!=0 ){.      s
c9f0: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
ca00: 6d 65 6e 74 28 22 41 64 64 20 57 69 6b 69 22 2c  ment("Add Wiki",
ca10: 20 22 25 52 2f 77 69 6b 69 65 64 69 74 3f 6e 61   "%R/wikiedit?na
ca20: 6d 65 3d 25 73 2f 25 74 22 2c 0a 20 20 20 20 20  me=%s/%t",.     
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 20 20 20 7a 50 72 65 66 69 78 2c 20         zPrefix, 
ca50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
ca60: 7d 0a 20 20 70 57 69 6b 69 20 3d 20 6d 61 6e 69  }.  pWiki = mani
ca70: 66 65 73 74 5f 67 65 74 28 72 69 64 2c 20 43 46  fest_get(rid, CF
ca80: 54 59 50 45 5f 57 49 4b 49 2c 20 30 29 3b 0a 20  TYPE_WIKI, 0);. 
ca90: 20 69 66 28 20 70 57 69 6b 69 3d 3d 30 20 29 20   if( pWiki==0 ) 
caa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
cab0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 70 57  fossil_strcmp(pW
cac0: 69 6b 69 2d 3e 7a 4d 69 6d 65 74 79 70 65 2c 20  iki->zMimetype, 
cad0: 22 74 65 78 74 2f 78 2d 6d 61 72 6b 64 6f 77 6e  "text/x-markdown
cae0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f  ")==0 ){.    Blo
caf0: 62 20 74 61 69 6c 20 3d 20 42 4c 4f 42 5f 49 4e  b tail = BLOB_IN
cb00: 49 54 49 41 4c 49 5a 45 52 3b 0a 20 20 20 20 42  ITIALIZER;.    B
cb10: 6c 6f 62 20 74 69 74 6c 65 20 3d 20 42 4c 4f 42  lob title = BLOB
cb20: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 20 20  _INITIALIZER;.  
cb30: 20 20 42 6c 6f 62 20 6d 61 72 6b 64 6f 77 6e 3b    Blob markdown;
cb40: 0a 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26  .    blob_init(&
cb50: 6d 61 72 6b 64 6f 77 6e 2c 20 70 57 69 6b 69 2d  markdown, pWiki-
cb60: 3e 7a 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20 20  >zWiki, -1);.   
cb70: 20 6d 61 72 6b 64 6f 77 6e 5f 74 6f 5f 68 74 6d   markdown_to_htm
cb80: 6c 28 26 6d 61 72 6b 64 6f 77 6e 2c 20 26 74 69  l(&markdown, &ti
cb90: 74 6c 65 2c 20 26 74 61 69 6c 29 3b 0a 20 20 20  tle, &tail);.   
cba0: 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26   if( blob_size(&
cbb0: 74 69 74 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  title) ){.      
cbc0: 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65  @ <div class="se
cbd0: 63 74 69 6f 6e 22 3e 25 68 28 62 6c 6f 62 5f 73  ction">%h(blob_s
cbe0: 74 72 28 26 74 69 74 6c 65 29 29 3c 2f 64 69 76  tr(&title))</div
cbf0: 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  >.    }else{.   
cc00: 20 20 20 77 69 6b 69 5f 73 65 63 74 69 6f 6e 5f     wiki_section_
cc10: 6c 61 62 65 6c 28 7a 50 72 65 66 69 78 2c 20 7a  label(zPrefix, z
cc20: 4e 61 6d 65 2c 20 6d 46 6c 61 67 73 29 3b 0a 20  Name, mFlags);. 
cc30: 20 20 20 7d 0a 20 20 20 20 77 69 6b 69 5f 73 75     }.    wiki_su
cc40: 62 6d 65 6e 75 5f 74 6f 5f 72 65 61 64 5f 77 69  bmenu_to_read_wi
cc50: 6b 69 28 7a 50 72 65 66 69 78 2c 20 7a 4e 61 6d  ki(zPrefix, zNam
cc60: 65 2c 20 6d 46 6c 61 67 73 29 3b 0a 20 20 20 20  e, mFlags);.    
cc70: 63 6f 6e 76 65 72 74 5f 68 72 65 66 5f 61 6e 64  convert_href_and
cc80: 5f 6f 75 74 70 75 74 28 26 74 61 69 6c 29 3b 0a  _output(&tail);.
cc90: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
cca0: 74 61 69 6c 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  tail);.    blob_
ccb0: 72 65 73 65 74 28 26 74 69 74 6c 65 29 3b 0a 20  reset(&title);. 
ccc0: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6d     blob_reset(&m
ccd0: 61 72 6b 64 6f 77 6e 29 3b 0a 20 20 7d 65 6c 73  arkdown);.  }els
cce0: 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72  e if( fossil_str
ccf0: 63 6d 70 28 70 57 69 6b 69 2d 3e 7a 4d 69 6d 65  cmp(pWiki->zMime
cd00: 74 79 70 65 2c 20 22 74 65 78 74 2f 70 6c 61 69  type, "text/plai
cd10: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69  n")==0 ){.    wi
cd20: 6b 69 5f 73 65 63 74 69 6f 6e 5f 6c 61 62 65 6c  ki_section_label
cd30: 28 7a 50 72 65 66 69 78 2c 20 7a 4e 61 6d 65 2c  (zPrefix, zName,
cd40: 20 6d 46 6c 61 67 73 29 3b 0a 20 20 20 20 77 69   mFlags);.    wi
cd50: 6b 69 5f 73 75 62 6d 65 6e 75 5f 74 6f 5f 72 65  ki_submenu_to_re
cd60: 61 64 5f 77 69 6b 69 28 7a 50 72 65 66 69 78 2c  ad_wiki(zPrefix,
cd70: 20 7a 4e 61 6d 65 2c 20 6d 46 6c 61 67 73 29 3b   zName, mFlags);
cd80: 0a 20 20 20 20 40 20 3c 70 72 65 3e 0a 20 20 20  .    @ <pre>.   
cd90: 20 40 20 25 68 28 70 57 69 6b 69 2d 3e 7a 57 69   @ %h(pWiki->zWi
cda0: 6b 69 29 0a 20 20 20 20 40 20 3c 2f 70 72 65 3e  ki).    @ </pre>
cdb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42 6c  .  }else{.    Bl
cdc0: 6f 62 20 74 61 69 6c 20 3d 20 42 4c 4f 42 5f 49  ob tail = BLOB_I
cdd0: 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 20 20 20 20  NITIALIZER;.    
cde0: 42 6c 6f 62 20 74 69 74 6c 65 20 3d 20 42 4c 4f  Blob title = BLO
cdf0: 42 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 20  B_INITIALIZER;. 
ce00: 20 20 20 42 6c 6f 62 20 77 69 6b 69 3b 0a 20 20     Blob wiki;.  
ce10: 20 20 42 6c 6f 62 20 2a 70 42 6f 64 79 3b 0a 20    Blob *pBody;. 
ce20: 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 77 69     blob_init(&wi
ce30: 6b 69 2c 20 70 57 69 6b 69 2d 3e 7a 57 69 6b 69  ki, pWiki->zWiki
ce40: 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 77  , -1);.    if( w
ce50: 69 6b 69 5f 66 69 6e 64 5f 74 69 74 6c 65 28 26  iki_find_title(&
ce60: 77 69 6b 69 2c 20 26 74 69 74 6c 65 2c 20 26 74  wiki, &title, &t
ce70: 61 69 6c 29 20 29 7b 0a 20 20 20 20 20 20 40 20  ail) ){.      @ 
ce80: 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65 63 74  <div class="sect
ce90: 69 6f 6e 22 3e 25 68 28 62 6c 6f 62 5f 73 74 72  ion">%h(blob_str
cea0: 28 26 74 69 74 6c 65 29 29 3c 2f 64 69 76 3e 0a  (&title))</div>.
ceb0: 20 20 20 20 20 20 70 42 6f 64 79 20 3d 20 26 74        pBody = &t
cec0: 61 69 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ail;.    }else{.
ced0: 20 20 20 20 20 20 77 69 6b 69 5f 73 65 63 74 69        wiki_secti
cee0: 6f 6e 5f 6c 61 62 65 6c 28 7a 50 72 65 66 69 78  on_label(zPrefix
cef0: 2c 20 7a 4e 61 6d 65 2c 20 6d 46 6c 61 67 73 29  , zName, mFlags)
cf00: 3b 0a 20 20 20 20 20 20 70 42 6f 64 79 20 3d 20  ;.      pBody = 
cf10: 26 77 69 6b 69 3b 0a 20 20 20 20 7d 0a 20 20 20  &wiki;.    }.   
cf20: 20 77 69 6b 69 5f 73 75 62 6d 65 6e 75 5f 74 6f   wiki_submenu_to
cf30: 5f 72 65 61 64 5f 77 69 6b 69 28 7a 50 72 65 66  _read_wiki(zPref
cf40: 69 78 2c 20 7a 4e 61 6d 65 2c 20 6d 46 6c 61 67  ix, zName, mFlag
cf50: 73 29 3b 0a 20 20 20 20 40 20 3c 64 69 76 20 63  s);.    @ <div c
cf60: 6c 61 73 73 3d 22 77 69 6b 69 22 3e 0a 20 20 20  lass="wiki">.   
cf70: 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 70 42   wiki_convert(pB
cf80: 6f 64 79 2c 20 30 2c 20 57 49 4b 49 5f 42 55 54  ody, 0, WIKI_BUT
cf90: 54 4f 4e 53 29 3b 0a 20 20 20 20 40 20 3c 2f 64  TONS);.    @ </d
cfa0: 69 76 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  iv>.    blob_res
cfb0: 65 74 28 26 74 61 69 6c 29 3b 0a 20 20 20 20 62  et(&tail);.    b
cfc0: 6c 6f 62 5f 72 65 73 65 74 28 26 74 69 74 6c 65  lob_reset(&title
cfd0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
cfe0: 74 28 26 77 69 6b 69 29 3b 0a 20 20 7d 0a 20 20  t(&wiki);.  }.  
cff0: 6d 61 6e 69 66 65 73 74 5f 64 65 73 74 72 6f 79  manifest_destroy
d000: 28 70 57 69 6b 69 29 3b 0a 20 20 72 65 74 75 72  (pWiki);.  retur
d010: 6e 20 31 3b 0a 7d 0a                             n 1;.}.