File Annotation
Not logged in
dbda8d6ce9 2007-07-21       drh: /*
dbda8d6ce9 2007-07-21       drh: ** Copyright (c) 2007 D. Richard Hipp
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** This program is free software; you can redistribute it and/or
dbda8d6ce9 2007-07-21       drh: ** modify it under the terms of the GNU General Public
dbda8d6ce9 2007-07-21       drh: ** License version 2 as published by the Free Software Foundation.
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** This program is distributed in the hope that it will be useful,
dbda8d6ce9 2007-07-21       drh: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
dbda8d6ce9 2007-07-21       drh: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dbda8d6ce9 2007-07-21       drh: ** General Public License for more details.
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** You should have received a copy of the GNU General Public
dbda8d6ce9 2007-07-21       drh: ** License along with this library; if not, write to the
dbda8d6ce9 2007-07-21       drh: ** Free Software Foundation, Inc., 59 Temple Place - Suite 330,
dbda8d6ce9 2007-07-21       drh: ** Boston, MA  02111-1307, USA.
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** Author contact information:
dbda8d6ce9 2007-07-21       drh: **   drh@hwaci.com
dbda8d6ce9 2007-07-21       drh: **   http://www.hwaci.com/drh/
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: *******************************************************************************
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** This file contains code to do formatting of wiki text.
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: #include <assert.h>
dbda8d6ce9 2007-07-21       drh: #include "config.h"
dbda8d6ce9 2007-07-21       drh: #include "wiki.h"
dbda8d6ce9 2007-07-21       drh: 
b2e55c0d4d 2007-09-01       drh: 
dbda8d6ce9 2007-07-21       drh: /*
dbda8d6ce9 2007-07-21       drh: ** WEBPAGE: wiki
bf428e6854 2007-10-06       drh: ** URL: /wiki/PAGENAME
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: void wiki_page(void){
bf428e6854 2007-10-06       drh:   char *zTag;
bf428e6854 2007-10-06       drh:   int rid;
bf428e6854 2007-10-06       drh:   Blob wiki;
bf428e6854 2007-10-06       drh:   Manifest m;
bf428e6854 2007-10-06       drh:   char *zPageName;
bf428e6854 2007-10-06       drh:   char *zHtmlPageName;
bf428e6854 2007-10-06       drh:   char *zBody = mprintf("%s","<i>Empty Page</i>");
b2e55c0d4d 2007-09-01       drh: 
bf428e6854 2007-10-06       drh:   login_check_credentials();
bf428e6854 2007-10-06       drh:   if( !g.okRdWiki ){ login_needed(); return; }
bf428e6854 2007-10-06       drh:   zPageName = mprintf("%s", g.zExtra);
bf428e6854 2007-10-06       drh:   dehttpize(zPageName);
bf428e6854 2007-10-06       drh:   zTag = mprintf("wiki-%s", zPageName);
bf428e6854 2007-10-06       drh:   rid = db_int(0,
bf428e6854 2007-10-06       drh:     "SELECT rid FROM tagxref"
bf428e6854 2007-10-06       drh:     " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
bf428e6854 2007-10-06       drh:     " ORDER BY mtime DESC", zTag
b2e55c0d4d 2007-09-01       drh:   );
bf428e6854 2007-10-06       drh:   free(zTag);
bf428e6854 2007-10-06       drh:   memset(&m, 0, sizeof(m));
bf428e6854 2007-10-06       drh:   blob_zero(&m.content);
bf428e6854 2007-10-06       drh:   if( rid ){
bf428e6854 2007-10-06       drh:     Blob content;
bf428e6854 2007-10-06       drh:     content_get(rid, &content);
bf428e6854 2007-10-06       drh:     manifest_parse(&m, &content);
bf428e6854 2007-10-06       drh:     if( m.type==CFTYPE_WIKI ){
bf428e6854 2007-10-06       drh:       zBody = m.zWiki;
b2e55c0d4d 2007-09-01       drh:     }
b2e55c0d4d 2007-09-01       drh:   }
bf428e6854 2007-10-06       drh:   zHtmlPageName = mprintf("%h", zPageName);
bf428e6854 2007-10-06       drh:   style_header(zHtmlPageName);
bf428e6854 2007-10-06       drh:   blob_init(&wiki, zBody, -1);
bf428e6854 2007-10-06       drh:   wiki_convert(&wiki, 0);
bf428e6854 2007-10-06       drh:   blob_reset(&wiki);
bf428e6854 2007-10-06       drh:   manifest_clear(&m);
6d58613757 2007-10-06       drh:   if( zPageName[0] && ((rid && g.okWrWiki) || (!rid && g.okNewWiki)) ){
6d58613757 2007-10-06       drh:     @ <hr>
bf428e6854 2007-10-06       drh:     @ [<a href="%s(g.zBaseURL)/wikiedit/%s(g.zExtra)">Edit</a>]
b2e55c0d4d 2007-09-01       drh:   }
b2e55c0d4d 2007-09-01       drh:   style_footer();
b2e55c0d4d 2007-09-01       drh: }
b2e55c0d4d 2007-09-01       drh: 
b2e55c0d4d 2007-09-01       drh: /*
bf428e6854 2007-10-06       drh: ** WEBPAGE: wikiedit
bf428e6854 2007-10-06       drh: ** URL: /wikiedit/PAGENAME
b2e55c0d4d 2007-09-01       drh: */
bf428e6854 2007-10-06       drh: void wikiedit_page(void){
bf428e6854 2007-10-06       drh:   char *zTag;
bf428e6854 2007-10-06       drh:   int rid;
bf428e6854 2007-10-06       drh:   Blob wiki;
bf428e6854 2007-10-06       drh:   Manifest m;
bf428e6854 2007-10-06       drh:   char *zPageName;
bf428e6854 2007-10-06       drh:   char *zHtmlPageName;
bf428e6854 2007-10-06       drh:   int n;
bf428e6854 2007-10-06       drh:   const char *z;
bf428e6854 2007-10-06       drh:   char *zBody = (char*)P("w");
b2e55c0d4d 2007-09-01       drh: 
bf428e6854 2007-10-06       drh:   if( zBody ){
bf428e6854 2007-10-06       drh:     zBody = mprintf("%s", zBody);
bf428e6854 2007-10-06       drh:   }
b2e55c0d4d 2007-09-01       drh:   login_check_credentials();
bf428e6854 2007-10-06       drh:   zPageName = mprintf("%s", g.zExtra);
bf428e6854 2007-10-06       drh:   dehttpize(zPageName);
bf428e6854 2007-10-06       drh:   zTag = mprintf("wiki-%s", zPageName);
bf428e6854 2007-10-06       drh:   rid = db_int(0,
bf428e6854 2007-10-06       drh:     "SELECT rid FROM tagxref"
bf428e6854 2007-10-06       drh:     " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
bf428e6854 2007-10-06       drh:     " ORDER BY mtime DESC", zTag
bf428e6854 2007-10-06       drh:   );
bf428e6854 2007-10-06       drh:   free(zTag);
bf428e6854 2007-10-06       drh:   if( (rid && !g.okWrWiki) || (!rid && !g.okNewWiki) ){
bf428e6854 2007-10-06       drh:     login_needed();
bf428e6854 2007-10-06       drh:     return;
bf428e6854 2007-10-06       drh:   }
bf428e6854 2007-10-06       drh:   memset(&m, 0, sizeof(m));
bf428e6854 2007-10-06       drh:   blob_zero(&m.content);
bf428e6854 2007-10-06       drh:   if( rid && zBody==0 ){
bf428e6854 2007-10-06       drh:     Blob content;
bf428e6854 2007-10-06       drh:     content_get(rid, &content);
bf428e6854 2007-10-06       drh:     manifest_parse(&m, &content);
bf428e6854 2007-10-06       drh:     if( m.type==CFTYPE_WIKI ){
bf428e6854 2007-10-06       drh:       zBody = m.zWiki;
bf428e6854 2007-10-06       drh:     }
bf428e6854 2007-10-06       drh:   }
bf428e6854 2007-10-06       drh:   if( P("submit")!=0 && zBody!=0 ){
bf428e6854 2007-10-06       drh:     char *zDate;
bf428e6854 2007-10-06       drh:     Blob cksum;
bf428e6854 2007-10-06       drh:     int nrid;
bf428e6854 2007-10-06       drh:     blob_zero(&wiki);
bf428e6854 2007-10-06       drh:     db_begin_transaction();
bf428e6854 2007-10-06       drh:     zDate = db_text(0, "SELECT datetime('now')");
bf428e6854 2007-10-06       drh:     zDate[10] = 'T';
bf428e6854 2007-10-06       drh:     blob_appendf(&wiki, "D %s\n", zDate);
bf428e6854 2007-10-06       drh:     free(zDate);
bf428e6854 2007-10-06       drh:     blob_appendf(&wiki, "L %F\n", zPageName);
bf428e6854 2007-10-06       drh:     if( rid ){
bf428e6854 2007-10-06       drh:       char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
bf428e6854 2007-10-06       drh:       blob_appendf(&wiki, "P %s\n", zUuid);
bf428e6854 2007-10-06       drh:       free(zUuid);
bf428e6854 2007-10-06       drh:     }
bf428e6854 2007-10-06       drh:     if( g.zLogin ){
bf428e6854 2007-10-06       drh:       blob_appendf(&wiki, "U %F\n", g.zLogin);
bf428e6854 2007-10-06       drh:     }
bf428e6854 2007-10-06       drh:     blob_appendf(&wiki, "W %d\n%s\n", strlen(zBody), zBody);
bf428e6854 2007-10-06       drh:     md5sum_blob(&wiki, &cksum);
bf428e6854 2007-10-06       drh:     blob_appendf(&wiki, "Z %b\n", &cksum);
bf428e6854 2007-10-06       drh:     blob_reset(&cksum);
bf428e6854 2007-10-06       drh:     nrid = content_put(&wiki, 0, 0);
bf428e6854 2007-10-06       drh:     db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
bf428e6854 2007-10-06       drh:     manifest_crosslink(nrid, &wiki);
bf428e6854 2007-10-06       drh:     blob_reset(&wiki);
bf428e6854 2007-10-06       drh:     content_deltify(rid, nrid, 0);
bf428e6854 2007-10-06       drh:     db_end_transaction(0);
bf428e6854 2007-10-06       drh:     cgi_redirect(mprintf("wiki/%s", g.zExtra));
bf428e6854 2007-10-06       drh:   }
6d58613757 2007-10-06       drh:   if( P("cancel")!=0 || zPageName[0]==0 ){
bf428e6854 2007-10-06       drh:     cgi_redirect(mprintf("wiki/%s", g.zExtra));
bf428e6854 2007-10-06       drh:     return;
bf428e6854 2007-10-06       drh:   }
bf428e6854 2007-10-06       drh:   if( zBody==0 ){
bf428e6854 2007-10-06       drh:     zBody = mprintf("<i>Empty Page</i>");
bf428e6854 2007-10-06       drh:   }
bf428e6854 2007-10-06       drh:   zHtmlPageName = mprintf("Edit: %h", zPageName);
bf428e6854 2007-10-06       drh:   style_header(zHtmlPageName);
bf428e6854 2007-10-06       drh:   if( P("preview")!=0 ){
bf428e6854 2007-10-06       drh:     blob_zero(&wiki);
bf428e6854 2007-10-06       drh:     blob_append(&wiki, zBody, -1);
bf428e6854 2007-10-06       drh:     @ Preview:<hr>
bf428e6854 2007-10-06       drh:     wiki_convert(&wiki, 0);
bf428e6854 2007-10-06       drh:     @ <hr>
bf428e6854 2007-10-06       drh:     blob_reset(&wiki);
bf428e6854 2007-10-06       drh:   }
bf428e6854 2007-10-06       drh:   for(n=2, z=zBody; z[0]; z++){
bf428e6854 2007-10-06       drh:     if( z[0]=='\n' ) n++;
b2e55c0d4d 2007-09-01       drh:   }
bf428e6854 2007-10-06       drh:   if( n<20 ) n = 20;
bf428e6854 2007-10-06       drh:   if( n>200 ) n = 200;
bf428e6854 2007-10-06       drh:   @ <form method="POST" action="%s(g.zBaseURL)/wikiedit/%s(g.zExtra)">
bf428e6854 2007-10-06       drh:   @ <textarea name="w" class="wikiedit" cols="80"
bf428e6854 2007-10-06       drh:   @  rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
bf428e6854 2007-10-06       drh:   @ <br>
bf428e6854 2007-10-06       drh:   @ <input type="submit" name="preview" value="Preview Your Changes">
bf428e6854 2007-10-06       drh:   @ <input type="submit" name="submit" value="Apply These Changes">
bf428e6854 2007-10-06       drh:   @ <input type="submit" name="cancel" value="Cancel">
bf428e6854 2007-10-06       drh:   @ </form>
bf428e6854 2007-10-06       drh:   manifest_clear(&m);
22c1ac41d4 2007-08-23       drh:   style_footer();
bf428e6854 2007-10-06       drh: 
22c1ac41d4 2007-08-23       drh: }
22c1ac41d4 2007-08-23       drh: 
22c1ac41d4 2007-08-23       drh: /*
22c1ac41d4 2007-08-23       drh: ** WEBPAGE: ambiguous
22c1ac41d4 2007-08-23       drh: **
22c1ac41d4 2007-08-23       drh: ** This is the destination for UUID hyperlinks that are ambiguous.
22c1ac41d4 2007-08-23       drh: ** Show all possible choices for the destination with links to each.
22c1ac41d4 2007-08-23       drh: **
22c1ac41d4 2007-08-23       drh: ** The ambiguous UUID prefix is in g.zExtra
22c1ac41d4 2007-08-23       drh: */
22c1ac41d4 2007-08-23       drh: void ambiguous_page(void){
22c1ac41d4 2007-08-23       drh:   Stmt q;
22c1ac41d4 2007-08-23       drh:   style_header("Ambiguous UUID");
22c1ac41d4 2007-08-23       drh:   @ <p>The link <a href="%s(g.zBaseURL)/ambiguous/%T(g.zExtra)">
22c1ac41d4 2007-08-23       drh:   @ [%h(g.zExtra)]</a> is ambiguous.  It might mean any of the following:</p>
22c1ac41d4 2007-08-23       drh:   @ <ul>
22c1ac41d4 2007-08-23       drh:   db_prepare(&q, "SELECT uuid, rid FROM blob WHERE uuid>=%Q AND uuid<'%qz'"
22c1ac41d4 2007-08-23       drh:                  " ORDER BY uuid", g.zExtra, g.zExtra);
22c1ac41d4 2007-08-23       drh:   while( db_step(&q)==SQLITE_ROW ){
22c1ac41d4 2007-08-23       drh:     const char *zUuid = db_column_text(&q, 0);
22c1ac41d4 2007-08-23       drh:     int rid = db_column_int(&q, 1);
22c1ac41d4 2007-08-23       drh:     @ <li> %s(zUuid) - %d(rid)
22c1ac41d4 2007-08-23       drh:   }
22c1ac41d4 2007-08-23       drh:   db_finalize(&q);
22c1ac41d4 2007-08-23       drh:   @ </ul>
dbda8d6ce9 2007-07-21       drh:   style_footer();
dbda8d6ce9 2007-07-21       drh: }