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>
