Diff
Not logged in

Differences From:

File src/wiki.c part of check-in [61ce5e3685] - Get rid of the "locking" capability on wiki pages. Assume that anybody who can write or append to a wiki page can do so to any wiki page. Add the /wikiappend page for appending comments to the end of wiki. by drh on 2007-10-10 23:10:48. [view]

To:

File src/wiki.c part of check-in [677aa71bca] - The g.zExtra parameter is now always available as P("name"). This means the /wiki/xyz and /wiki?name=xyz are equivalent URLs. by drh on 2007-10-12 22:56:18. [view]

@@ -80,8 +80,9 @@
   char *zPageName = db_get("project-name",0);
   if( zPageName ){
     login_check_credentials();
     g.zExtra = zPageName;
+    cgi_set_parameter_nocopy("name", g.zExtra);
     g.okRdWiki = 1;
     g.okApndWiki = 0;
     g.okWrWiki = 0;
     g.okHistory = 0;
@@ -99,23 +100,22 @@
 }
 
 /*
 ** WEBPAGE: wiki
-** URL: /wiki/PAGENAME
+** URL: /wiki?name=PAGENAME
 */
 void wiki_page(void){
   char *zTag;
   int rid;
   Blob wiki;
   Manifest m;
-  char *zPageName;
+  const char *zPageName;
   char *zHtmlPageName;
   char *zBody = mprintf("%s","<i>Empty Page</i>");
 
   login_check_credentials();
   if( !g.okRdWiki ){ login_needed(); return; }
-  zPageName = mprintf("%s", g.zExtra);
-  dehttpize(zPageName);
+  zPageName = PD("name","");
   if( check_name(zPageName) ) return;
   zTag = mprintf("wiki-%s", zPageName);
   rid = db_int(0,
     "SELECT rid FROM tagxref"
@@ -134,17 +134,17 @@
     }
   }
   if( (rid && g.okWrWiki) || (!rid && g.okNewWiki) ){
     style_submenu_element("Edit", "Edit Wiki Page",
-       mprintf("%s/wikiedit/%s", g.zTop, g.zExtra));
+       mprintf("%s/wikiedit?name=%t", g.zTop, zPageName));
   }
   if( rid && g.okApndWiki ){
     style_submenu_element("Append", "Add A Comment",
-       mprintf("%s/wikiappend/%s", g.zTop, g.zExtra));
+       mprintf("%s/wikiappend?name=%t", g.zTop, zPageName));
   }
   if( g.okHistory ){
     style_submenu_element("History", "History",
-         mprintf("%s/whistory/%s", g.zTop, g.zExtra));
+         mprintf("%s/whistory?name=%t", g.zTop, zPageName));
   }
   zHtmlPageName = mprintf("%h", zPageName);
   style_header(zHtmlPageName);
   blob_init(&wiki, zBody, -1);
@@ -155,16 +155,16 @@
 }
 
 /*
 ** WEBPAGE: wikiedit
-** URL: /wikiedit/PAGENAME
+** URL: /wikiedit?page=PAGENAME
 */
 void wikiedit_page(void){
   char *zTag;
   int rid;
   Blob wiki;
   Manifest m;
-  char *zPageName;
+  const char *zPageName;
   char *zHtmlPageName;
   int n;
   const char *z;
   char *zBody = (char*)P("w");
@@ -172,10 +172,9 @@
   if( zBody ){
     zBody = mprintf("%s", zBody);
   }
   login_check_credentials();
-  zPageName = mprintf("%s", g.zExtra);
-  dehttpize(zPageName);
+  zPageName = PD("name","");
   if( check_name(zPageName) ) return;
   zTag = mprintf("wiki-%s", zPageName);
   rid = db_int(0,
     "SELECT rid FROM tagxref"
@@ -225,12 +224,12 @@
     manifest_crosslink(nrid, &wiki);
     blob_reset(&wiki);
     content_deltify(rid, nrid, 0);
     db_end_transaction(0);
-    cgi_redirect(mprintf("wiki/%s", g.zExtra));
+    cgi_redirectf("wiki?name=%t", zPageName);
   }
   if( P("cancel")!=0 ){
-    cgi_redirect(mprintf("wiki/%s", g.zExtra));
+    cgi_redirectf("wiki?name=%t", zPageName);
     return;
   }
   if( zBody==0 ){
     zBody = mprintf("<i>Empty Page</i>");
@@ -249,9 +248,10 @@
     if( z[0]=='\n' ) n++;
   }
   if( n<20 ) n = 20;
   if( n>200 ) n = 200;
-  @ <form method="POST" action="%s(g.zBaseURL)/wikiedit/%t(g.zExtra)">
+  @ <form method="POST" action="%s(g.zBaseURL)/wikiedit">
+  @ <input type="hidden" name="name" value="%t(zPageName)">
   @ <textarea name="w" class="wikiedit" cols="80"
   @  rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
   @ <br>
   @ <input type="submit" name="preview" value="Preview Your Changes">
@@ -282,20 +282,19 @@
 }
 
 /*
 ** WEBPAGE: wikiappend
-** URL: /wikiappend/PAGENAME
+** URL: /wikiappend?name=PAGENAME
 */
 void wikiappend_page(void){
   char *zTag;
   int rid;
-  char *zPageName;
+  const char *zPageName;
   char *zHtmlPageName;
   const char *zUser;
 
   login_check_credentials();
-  zPageName = mprintf("%s", g.zExtra);
-  dehttpize(zPageName);
+  zPageName = PD("name","");
   if( check_name(zPageName) ) return;
   zTag = mprintf("wiki-%s", zPageName);
   rid = db_int(0,
     "SELECT rid FROM tagxref"
@@ -352,12 +351,12 @@
     manifest_crosslink(nrid, &wiki);
     blob_reset(&wiki);
     content_deltify(rid, nrid, 0);
     db_end_transaction(0);
-    cgi_redirect(mprintf("wiki/%s", g.zExtra));
+    cgi_redirectf("wiki?name=%t", zPageName);
   }
   if( P("cancel")!=0 ){
-    cgi_redirect(mprintf("wiki/%s", g.zExtra));
+    cgi_redirectf("wiki?name=%t", zPageName);
     return;
   }
   zHtmlPageName = mprintf("Append Comment To: %h", zPageName);
   style_header(zHtmlPageName);
@@ -370,9 +369,10 @@
     @ <hr>
     blob_reset(&preview);
   }
   zUser = PD("u", g.zLogin);
-  @ <form method="POST" action="%s(g.zBaseURL)/wikiappend/%t(g.zExtra)">
+  @ <form method="POST" action="%s(g.zBaseURL)/wikiappend">
+  @ <input type="hidden" name="name" value="%t(zPageName)">
   @ Your Name:
   @ <input type="text" name="u" size="20" value="%h(zUser)"><br>
   @ Comment to append:<br>
   @ <textarea name="r" class="wikiedit" cols="80"
@@ -386,27 +386,29 @@
 }
 
 /*
 ** WEBPAGE: whistory
+** URL: /whistory?name=PAGENAME
 **
-** Show the complete change history for a single wiki page.  The name
-** of the wiki is in g.zExtra
+** Show the complete change history for a single wiki page.
 */
 void whistory_page(void){
   Stmt q;
   char *zTitle;
   char *zSQL;
+  const char *zPageName;
   login_check_credentials();
   if( !g.okHistory ){ login_needed(); return; }
-  zTitle = mprintf("History Of %h", g.zExtra);
+  zPageName = PD("name","");
+  zTitle = mprintf("History Of %h", zPageName);
   style_header(zTitle);
   free(zTitle);
 
   zSQL = mprintf("%s AND event.objid IN "
                  "  (SELECT rid FROM tagxref WHERE tagid="
                        "(SELECT tagid FROM tag WHERE tagname='wiki-%q'))"
                  "ORDER BY mtime DESC",
-                 timeline_query_for_www(), g.zExtra);
+                 timeline_query_for_www(), zPageName);
   db_prepare(&q, zSQL);
   free(zSQL);
   www_print_timeline(&q, 0, 0, 0, 0);
   db_finalize(&q);
@@ -429,35 +431,9 @@
     " ORDER BY lower(tagname)"
   );
   while( db_step(&q)==SQLITE_ROW ){
     const char *zName = db_column_text(&q, 0);
-    @ <li><a href="%s(g.zBaseURL)/wiki/%t(zName)">%h(zName)</a></li>
+    @ <li><a href="%s(g.zBaseURL)/wiki?page=%t(zName)">%h(zName)</a></li>
   }
   db_finalize(&q);
-  style_footer();
-}
-
-/*
-** WEBPAGE: ambiguous
-**
-** This is the destination for UUID hyperlinks that are ambiguous.
-** Show all possible choices for the destination with links to each.
-**
-** The ambiguous UUID prefix is in g.zExtra
-*/
-void ambiguous_page(void){
-  Stmt q;
-  style_header("Ambiguous UUID");
-  @ <p>The link <a href="%s(g.zBaseURL)/ambiguous/%T(g.zExtra)">
-  @ [%h(g.zExtra)]</a> is ambiguous.  It might mean any of the following:</p>
-  @ <ul>
-  db_prepare(&q, "SELECT uuid, rid FROM blob WHERE uuid>=%Q AND uuid<'%qz'"
-                 " ORDER BY uuid", g.zExtra, g.zExtra);
-  while( db_step(&q)==SQLITE_ROW ){
-    const char *zUuid = db_column_text(&q, 0);
-    int rid = db_column_int(&q, 1);
-    @ <li> %s(zUuid) - %d(rid)
-  }
-  db_finalize(&q);
-  @ </ul>
   style_footer();
 }