Log Message

Split view into view and edit
Other misc xsl cleanups

Modified Files

AxKit-XSP-Wiki/lib/AxKit/XSP

AxKit-XSP-Wiki/webstuff

Added Files

AxKit-XSP-Wiki/webstuff




Index: Wiki.pm
===================================================================
RCS file: /home/cvs/AxKit-XSP-Wiki/lib/AxKit/XSP/Wiki.pm,v
retrieving revision 1.22
retrieving revision 1.23
diff -Llib/AxKit/XSP/Wiki.pm -Llib/AxKit/XSP/Wiki.pm -u -d -r1.22 -r1.23
--- lib/AxKit/XSP/Wiki.pm
+++ lib/AxKit/XSP/Wiki.pm
@@ -5,10 +5,11 @@
 #use Apache::AxKit::Language::XSP::TaglibHelper;
 use AxKit::XSP::Wiki::Indexer;
 use Net::SMTP;
+use Text::Diff;
 use POSIX qw(strftime);
 use vars qw($VERSION $NS @ISA @EXPORT_TAGLIB $EmailAlerts $EmailHost);
 
-$VERSION = '0.06';
+$VERSION = '0.07';
 
 # The namespace associated with this taglib.
 $NS = 'http://axkit.org/NS/xsp/wiki/1';
@@ -337,10 +338,32 @@
 }
 
 sub save_page {
-    my ($dbpath, $dbname, $page, $contents, $texttype, $ip) = @_;
+    my ($dbpath, $dbname, $page, $contents, $texttype, $ip, $user) = @_;
     my $db = _mkdb($dbpath, $dbname);
-    _save_page($db, $page, $contents, $texttype, $ip);
+    _save_page($db, $page, $contents, $texttype, $ip, $user);
+}
+
+sub _save_page {
+    my ($db, $page, $contents, $texttype, $ip, $user) = @_;
+    # NB fix hard coded formatterid
+    my $last_modified = time;
+    my @history = $db->selectrow_array('SELECT content FROM History WHERE name 
= ? ORDER BY modified DESC', {}, $page);
+    local $db->{AutoCommit} = 0;
+    $db->do(<<'EOT', {}, $page, $texttype, $contents, $last_modified, $ip, 
$user);
+  INSERT OR REPLACE INTO Page ( name, formatterid, content, last_modified, 
ip_address, username )
+  VALUES ( ?, ?, ?, ?, ?, ? )
+EOT
+    $db->do(<<'EOT', {}, $page, $texttype, $contents, $last_modified, $ip, 
$user);
+  INSERT INTO History ( name, formatterid, content, modified, ip_address, 
username )
+  VALUES ( ?, ?, ?, ?, ?, ? )
+EOT
+    $db->commit;
+    _index_page($db, $page);
     if ($EmailAlerts) {
+        # create diff using Text::Diff
+        my $prev = @history ? $history[0] : '';
+        my $diff = diff(\$prev, \$contents, { STYLE => 'Unified' });
+        
         my $host = $EmailHost || 'localhost';
         my $smtp = Net::SMTP->new($host, Timeout => 10);
         $smtp->mail('axkitwiki') || die "Wiki email alerts: MAIL 
FROM:<axkitwiki> failed";
@@ -348,15 +371,16 @@
         $smtp->data() || die "Wiki email alerts: DATA failed";
         my $date = strftime('%a, %d %b %Y %H:%M:%S %Z', localtime);
         
+        my $changed_by = $user ? "$user @ $ip" : "someone at IP $ip";
         $smtp->datasend(<<"EOT");
 To: $EmailAlerts
 From: "AxKit Wiki" <axkitwiki>
 Subject: New Wiki Content at $page
 Date: $date
 
-Wiki content at $page:
+Wiki content at $page Changed by $changed_by :
 
-$contents
+$diff
 
 EOT
         $smtp->dataend();
@@ -364,23 +388,6 @@
     }
 }
 
-sub _save_page {
-    my ($db, $page, $contents, $texttype, $ip) = @_;
-    # NB fix hard coded formatterid
-    my $last_modified = time;
-    local $db->{AutoCommit} = 0;
-    $db->do(<<'EOT', {}, $page, $texttype, $contents, $last_modified, $ip);
-  INSERT OR REPLACE INTO Page ( name, formatterid, content, last_modified, 
ip_address )
-  VALUES ( ?, ?, ?, ?, ? )
-EOT
-    $db->do(<<'EOT', {}, $page, $texttype, $contents, $last_modified, $ip);
-  INSERT INTO History ( name, formatterid, content, modified, ip_address )
-  VALUES ( ?, ?, ?, ?, ? )
-EOT
-    $db->commit;
-    _index_page($db, $page);
-}
-
 sub _index_page {
     my ($db, $page) = @_;
     my $sth = $db->prepare(<<'EOT');
@@ -421,6 +428,7 @@
         $hist .= '<id>' . xml_escape($h{id}) . '</id>';
         $hist .= '<modified>' . xml_escape(scalar gmtime($h{modified})) . 
'</modified>';
         $hist .= '<ip-address>' . xml_escape($h{ip_address}) . '</ip-address>';
+        $hist .= '<username>' . xml_escape($h{username}) . '</username>';
         $hist .= '<bytes>' . xml_escape(length($h{content})) . '</bytes>';
         $hist .= '</entry>';
     }
@@ -477,7 +485,7 @@
 }
 
 sub restore_page {
-    my ($dbpath, $dbname, $page, $ip, $id) = @_;
+    my ($dbpath, $dbname, $page, $ip, $id, $user) = @_;
     
     my $db = _mkdb($dbpath, $dbname);
     my $sth = $db->prepare('SELECT * FROM History WHERE name = ? and id = ?');
@@ -486,7 +494,7 @@
     die "No such row" unless $row;
     $sth->finish;
     my ($texttype, $contents) = ($row->[2], $row->[3]);
-    _save_page($db, $page, $contents, $texttype, $ip);
+    _save_page($db, $page, $contents, $texttype, $ip, $user);
 }
 
 sub create_db {
@@ -499,7 +507,8 @@
                            formatterid NOT NULL,
                            content,
                            last_modified,
-                           ip_address
+                           ip_address,
+                           username
                            )
     });
     $db->do(q{
@@ -512,7 +521,8 @@
                               formatterid NOT NULL,
                               content,
                               modified,
-                              ip_address
+                              ip_address,
+                              username
                              )
     });
     $db->do(q{
Index: wikitags.xsl
===================================================================
RCS file: /home/cvs/AxKit-XSP-Wiki/webstuff/wikitags.xsl,v
retrieving revision 1.3
retrieving revision 1.4
diff -Lwebstuff/wikitags.xsl -Lwebstuff/wikitags.xsl -u -d -r1.3 -r1.4
--- webstuff/wikitags.xsl
+++ webstuff/wikitags.xsl
@@ -4,6 +4,8 @@
               xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
 >
 
+<xsl:param name="request.uri"/>
+
 <xsl:template match="/xspwiki/page"/>
 <xsl:template match="/xspwiki/db"/>
 
@@ -12,7 +14,7 @@
 </xsl:template>
 
 <xsl:template match="edit">
-<form action="./{/xspwiki/page}" method="POST" 
enctype="application/x-www-form-urlencoded">
+    <form action="{substring-before($request.uri, 
'/view/')}/edit/{substring-after($request.uri, '/view/')}" method="POST" 
enctype="application/x-www-form-urlencoded">
   <input type="hidden" name="action" value="save"/>
   <h1><xsl:value-of select="/xspwiki/page"/> : 
   <input type="submit" value=" Save "/> <input type="submit" name="preview" 
value=" Preview "/></h1>
--- /dev/null
+++ webstuff/wiki.cgi
@@ -0,0 +1,92 @@
+#!/usr/bin/perl -w
+
+use strict;
+use CGI qw(:cgi);
+use XML::LibXSLT;
+use XML::LibXML;
+use AxKit::XSP::Wiki;
+
+my $output = '<?xml version="1.0"?>
+<xspwiki>';
+my $path_info = path_info();
+      
+# CHANGE THESE!
+my $dbroot = '/tmp/wikis';
+# my $xsltroot = "$ENV{DOCUMENT_ROOT}/stylesheets";
+my $xsltroot = "/tmp/wikis/stylesheets";
+my $default_db = 'Xiki';
+my $default_page = 'Main';
+
+my $uri = url(-absolute => 1);
+      
+my ($db, $page) = AxKit::XSP::Wiki::extract_page_info($path_info);
+
+if (!$db) {
+    print redirect("$uri/$default_db/$default_page");
+    exit;
+}
+if (!$page) {
+    print redirect("$uri/$db/$default_page");
+    exit;
+}
+
+my $action = param('action') || 'view';
+$action = 'preview' if param('preview');
+my $id = param('id');
+if ($id !~ /^\d*$/) {
+    die "Invalid id format";
+}
+
+if ($action eq 'save') {
+    my $ip = remote_host();
+    AxKit::XSP::Wiki::save_page(
+        $dbroot, $db, $page, param('text'), param('texttype'), $ip,
+    );
+    print redirect("$uri/$db/$page");
+    exit;
+}
+elsif ($action eq 'restore') {
+    my $ip = remote_host();
+    AxKit::XSP::Wiki::restore_page(
+        $dbroot, $db, $page, $ip, $id,
+    );
+    print redirect("$uri/$db/$page");
+    exit;
+}
+elsif ($action eq 'preview') {
+    $output .= '
+        <page>' . xml_escape($page) . '</page>
+        <db>' . xml_escape($db) . '</db>
+        ' . AxKit::XSP::Wiki::preview_page($dbroot, $db, $page, param('text'), 
param('texttype'));
+}
+elsif ($action eq 'search') {
+    $output .= '
+        <page>' . xml_escape($page) . '</page>
+        <db>' . xml_escape($db) . '</db>
+        ' . AxKit::XSP::Wiki::search($dbroot, $db, param('q'));
+}
+else {
+    $output .= '
+       <page>' . xml_escape($page) . '</page>
+        <db>' . xml_escape($db) . '</db>
+        ' . AxKit::XSP::Wiki::display_page($dbroot, $db, $page, $action, $id);
+}
+
+$output .= '
+</xspwiki>
+';
+
+warn("Parsing: $output\n");
+XML::LibXSLT->debug_callback(sub { warn(@_) });
+my $source = XML::LibXML->new->parse_string($output)  || die "Couldn't parse 
output";
+my $xslt = XML::LibXSLT->new->parse_stylesheet_file("$xsltroot/wiki.xsl") || 
die "Couldn't parse $xsltroot/wiki.xsl";
+
+my $results = $xslt->transform($source);
+
+print header, $xslt->output_string($results);
+
+exit;
+
+sub xml_escape {
+    return AxKit::XSP::Wiki::xml_escape(@_);
+}
Index: wiki.xsl
===================================================================
RCS file: /home/cvs/AxKit-XSP-Wiki/webstuff/wiki.xsl,v
retrieving revision 1.10
retrieving revision 1.11
diff -Lwebstuff/wiki.xsl -Lwebstuff/wiki.xsl -u -d -r1.10 -r1.11
--- webstuff/wiki.xsl
+++ webstuff/wiki.xsl
@@ -10,40 +10,44 @@
 <xsl:include href="docbook.xsl"/>
 <xsl:include href="sidemenu.xsl"/>
 
-<xsl:output method="html"/>
+<xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.01 
Transitional//EN"/>
 
 <xsl:param name="action" select="'view'"/>
+<xsl:param name="request.uri"/>
 
 <xsl:template match="/">
+  <xsl:variable name="side-menu-uri" select="concat('axkit:/wiki/view/', 
string(/xspwiki/db), '/SideMenu')"/>
     <html>
       <head>
-        <title>Wiki - <xsl:value-of select="/xspwiki/page"/></title>
-       <link rel="Stylesheet" href="/stylesheets/wiki.css"
+        <title>AxKit Wiki - <xsl:value-of select="/xspwiki/page"/></title>
+       <link rel="stylesheet" href="/wiki/wiki.css"
               type="text/css" media="screen" />
       </head>
        
       <body>
-       <div class="topbanner">
-         Wiki
-         <div class="searchbanner">
-            <form action="./{/xspwiki/page}" method="GET">
-              <input type="hidden" name="action" value="search"/>
-              <input type="text" name="q" maxlength="255" size="20"/>
-              <input type="submit" value=" Search "/>
-            </form>
-         </div>
+       <div class="header">
+        <table width="100%" cellpadding="0" cellspacing="0" border="0"><tr>
+         <td width="50%"><img src="/img/axon-logo.png" alt="logo"/></td>
+         <td width="50%" align="right">
+          <div class="searchbanner">
+           <form action="./{/xspwiki/page}" method="GET">
+            <input type="hidden" name="action" value="search"/>
+            <input type="text" name="q" maxlength="255" size="20"/>
+            <input type="submit" value=" Search "/>
+           </form>
+          </div>
+         </td> 
+        </tr></table>
        </div>
-       <div class="base">
+        
+       <div class="main-content">
         <table><tr><td valign="top" width="160">
         <div class="sidemenu">
-        <!-- Uncomment this when you have a sidemenu worth using -->
-        <!--
-         <xsl:apply-templates select="document('/sidemenu.xml')" 
mode="sidemenu"/>
-         -->
+         <xsl:apply-templates select="document('/wiki/sidemenu.xml')" 
mode="sidemenu"/>
         </div></td><td valign="top" width="80%">
         <div class="maincontent">
          <div class="breadcrumbs">
-             <a href="DefaultPage"><xsl:value-of select="/xspwiki/db"/></a> :: 
<xsl:value-of select="/xspwiki/page"/>
+          <a href="/"><xsl:value-of select="/xspwiki/db"/></a> :: <a 
href="DefaultPage">Wiki</a> :: <xsl:value-of select="/xspwiki/page"/>
          </div>
          <hr/>
          <div class="content">
@@ -56,27 +60,28 @@
            </xsl:when>
           </xsl:choose>
        
-         <xsl:apply-templates/>
+         <xsl:apply-templates select="/xspwiki/main-content"/>
         
        <xsl:choose>
          <xsl:when test="$action='view'">
-              <hr/>
-           <a href="./{/xspwiki/page}?action=edit">Edit This Page</a> / <a 
href="./{/xspwiki/page}?action=history">Show Page History</a>
+           <hr/>
+           <a href="./{/xspwiki/page}?action=edit">Edit This Page</a>
+            / <a href="./{/xspwiki/page}?action=history">Show Page History</a>
          </xsl:when>
          <xsl:when test="$action='edit'">
-              <hr/>
+           <hr/>
            <p><a href="EditTips">EditTips</a></p>
          </xsl:when>
           <xsl:when test="$action='historypage'">
-              <hr/>
-          <form action="./{/xspwiki/page}" method="POST">
+           <hr/>
+            <form action="{substring-before($request.uri, 
'/view/')}/edit/{substring-after($request.uri, '/view/')}" method="POST" 
enctype="application/x-www-form-urlencoded">
            <input type="hidden" name="action" value="restore"/>
            <input type="hidden" name="id" value="{$id}"/>
            <input type="submit" name="Submit" value="Restore This Version"/>
           </form>
           </xsl:when>
           <xsl:when test="$action='history'">
-              <hr/>
+           <hr/>
           </xsl:when>
           <xsl:when test="$action='search'">
               <hr/>
@@ -92,7 +97,8 @@
          Other Mode?
          </xsl:otherwise>
        </xsl:choose>
-
+          <hr/>
+          
          </div> <!-- content -->       
         </div> <!-- maincontent -->
         </td></tr></table>
Index: view
===================================================================
RCS file: /home/cvs/AxKit-XSP-Wiki/webstuff/view,v
retrieving revision 1.5
retrieving revision 1.6
diff -Lwebstuff/view -Lwebstuff/view -u -d -r1.5 -r1.6
--- webstuff/view
+++ webstuff/view
@@ -1,6 +1,8 @@
 <?xml version="1.0"?>
 <xspwiki xmlns:wiki="http://axkit.org/NS/xsp/wiki/1";
       xmlns:xsp="http://apache.org/xsp/core/v1";
+      xmlns:comment="http://axkit.org/NS/xsp/comments/1";
+      xmlns:cookie="http://axkit.org/NS/xsp/cookie/v1";
 >
     <xsp:logic>
       my $path_info = $r->path_info;
@@ -8,6 +10,7 @@
       my $dbroot = $r->dir_config('WikiDBRoot') || die "No DB root specified!";
       my $default_db = $r->dir_config( 'WikiDB' ) || 'AxKit';
       my $default_page = $r->dir_config( 'DefaultPage' ) || 'DefaultPage';
+      $AxKit::XSP::Wiki::EmailAlerts = $r->dir_config('WikiEmailTo');
       my $uri = $r->uri;
       
       my ($db, $page) = AxKit::XSP::Wiki::extract_page_info($path_info);
@@ -18,7 +21,7 @@
       }
       if (!$page) {
         $r->header_out(Location => "$uri/$db/$default_page");
-        return 302;
+       return 302;
       }
       
       my $action = $cgi->param('action') || 'view';
@@ -28,50 +31,24 @@
         die "Invalid id format";
       }
       
-      if ($action eq 'save') {
-        my $ip = $r->get_remote_host();
-        AxKit::XSP::Wiki::save_page(
-          $dbroot, $db, $page, $cgi->param('text'), $cgi->param('texttype'), 
$ip,
-        );
-        $r->header_out(Location => "$uri/$db/$page");
-        return 302;
-      }
-      elsif ($action eq 'restore') {
-        my $ip = $r->get_remote_host();
-        AxKit::XSP::Wiki::restore_page(
-          $dbroot, $db, $page, $ip, $id,
-        );
-        $r->header_out(Location => "$uri/$db/$page");
-        return 302;
-      }
-      elsif ($action eq 'preview') {
-       <xsp:content>
-        <page><xsp:expr>$page</xsp:expr></page>
-        <db><xsp:expr>$db</xsp:expr></db>
-        <wiki:preview-page>
-          <wiki:dbpath><xsp:expr>$dbroot</xsp:expr></wiki:dbpath>
-          <wiki:db><xsp:expr>$db</xsp:expr></wiki:db>
-          <wiki:page><xsp:expr>$page</xsp:expr></wiki:page>
-          <wiki:text><xsp:expr>$cgi->param('text')</xsp:expr></wiki:text>
-          
<wiki:texttype><xsp:expr>$cgi->param('texttype')</xsp:expr></wiki:texttype>
-        </wiki:preview-page>
-       </xsp:content>
-      }
-      elsif ($action eq 'search') {
+      if ($action eq 'search') {
        <xsp:content>
         <page><xsp:expr>$page</xsp:expr></page>
         <db><xsp:expr>$db</xsp:expr></db>
+        <main-content>
         <wiki:search>
           <wiki:dbpath><xsp:expr>$dbroot</xsp:expr></wiki:dbpath>
           <wiki:db><xsp:expr>$db</xsp:expr></wiki:db>
           <wiki:query><xsp:expr>$cgi->param('q')</xsp:expr></wiki:query>
         </wiki:search>
+        </main-content>
        </xsp:content>
       }
       else {
       <xsp:content>
        <page><xsp:expr>$page</xsp:expr></page>
         <db><xsp:expr>$db</xsp:expr></db>
+        <main-content>
         <wiki:display-page>
           <wiki:dbpath><xsp:expr>$dbroot</xsp:expr></wiki:dbpath>
           <wiki:db><xsp:expr>$db</xsp:expr></wiki:db>
@@ -79,8 +56,10 @@
           <wiki:action><xsp:expr>$action</xsp:expr></wiki:action>
           <wiki:id><xsp:expr>$id</xsp:expr></wiki:id>
         </wiki:display-page>
+        </main-content>
       </xsp:content>
       }
       
     </xsp:logic>
+
 </xspwiki>
Index: .htaccess
===================================================================
RCS file: /home/cvs/AxKit-XSP-Wiki/webstuff/.htaccess,v
retrieving revision 1.5
retrieving revision 1.6
diff -Lwebstuff/.htaccess -Lwebstuff/.htaccess -u -d -r1.5 -r1.6
--- webstuff/.htaccess
+++ webstuff/.htaccess
@@ -10,19 +10,29 @@
 
 AxAddStyleMap text/xsl Apache::AxKit::Language::LibXSLT
 
-AxDebugLevel 7
-AxLogDeclines On
+AxDebugLevel 0
+AxLogDeclines Off
 
 AxAddXSPTaglib AxKit::XSP::Wiki
 
 AxAddRootProcessor application/x-xsp NULL xspwiki
 AxAddRootProcessor text/xsl wiki.xsl xspwiki
 
-AxTraceIntermediate /tmp/axkit-trace
+# Use this option for heavy debugging
+#AxTraceIntermediate /tmp/axkit-trace
 
 # you must create this directory, and it must be
 # writable by the apache user
 PerlSetVar WikiDBRoot /tmp/wikidbs
+
+# The default "Wiki" to use if none is specified in the URL
+#PerlSetVar WikiDB     AxKit
+
+# The default root page of the wiki
+#PerlSetVar DefaultPage  DefaultPage
+
+# Who to send email diffs to
+#PerlSetVar WikiEmailTo  [EMAIL PROTECTED]
 
 <Files *.css>
 SetHandler default-handler
--- /dev/null
+++ webstuff/edit
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<xspwiki xmlns:wiki="http://axkit.org/NS/xsp/wiki/1";
+      xmlns:xsp="http://apache.org/xsp/core/v1";
+      xmlns:comment="http://axkit.org/NS/xsp/comments/1";
+      xmlns:cookie="http://axkit.org/NS/xsp/cookie/v1";
+>
+    <xsp:logic>
+      my $path_info = $r->path_info;
+      
+      my $dbroot = $r->dir_config('WikiDBRoot') || die "No DB root specified!";
+      my $default_db = $r->dir_config( 'WikiDB' ) || 'AxKit';
+      my $default_page = $r->dir_config( 'DefaultPage' ) || 'DefaultPage';
+      $AxKit::XSP::Wiki::EmailAlerts = $r->dir_config('WikiEmailTo');
+      my $uri = $r->uri;
+      $uri =~ s/\/edit/\/view/;
+      
+      my ($db, $page) = AxKit::XSP::Wiki::extract_page_info($path_info);
+
+      if (!$db) {
+        $r->header_out(Location => "$uri/$default_db/$default_page");
+       return 302;
+      }
+      if (!$page) {
+        $r->header_out(Location => "$uri/$db/$default_page");
+       return 302;
+      }
+      
+      my $action = $cgi->param('action') || 'view';
+      $action = 'preview' if $cgi->param('preview');
+      my $id = $cgi->param('id');
+      if ($id !~ /^\d*$/) {
+        die "Invalid id format";
+      }
+
+      my $ip = $r->get_remote_host();
+      my $user = $r->connection->user();
+      
+      if ($action eq 'save') {
+        AxKit::XSP::Wiki::save_page(
+          $dbroot, $db, $page, $cgi->param('text'), $cgi->param('texttype'), 
$ip, $user, 
+        );
+        $r->header_out(Location => "$uri/$db/$page");
+        return 302;
+      }
+      elsif ($action eq 'restore') {
+        AxKit::XSP::Wiki::restore_page(
+          $dbroot, $db, $page, $ip, $id, $user, 
+        );
+        $r->header_out(Location => "$uri/$db/$page");
+        return 302;
+      }
+      elsif ($action eq 'preview') {
+       <xsp:content>
+        <page><xsp:expr>$page</xsp:expr></page>
+        <db><xsp:expr>$db</xsp:expr></db>
+        <main-content>
+        <wiki:preview-page>
+          <wiki:dbpath><xsp:expr>$dbroot</xsp:expr></wiki:dbpath>
+          <wiki:db><xsp:expr>$db</xsp:expr></wiki:db>
+          <wiki:page><xsp:expr>$page</xsp:expr></wiki:page>
+          <wiki:text><xsp:expr>$cgi->param('text')</xsp:expr></wiki:text>
+          
<wiki:texttype><xsp:expr>$cgi->param('texttype')</xsp:expr></wiki:texttype>
+        </wiki:preview-page>
+        </main-content>
+       </xsp:content>
+      }
+      else {
+        $r->header_out(Location => "$uri/$db/$page");
+       return 302;
+      }
+      
+    </xsp:logic>
+
+</xspwiki>

Reply via email to