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>