forked from github/kensanata.oddmuse
sub ParseData is fully backwards compatible. If some module runs it in list context, then it will get listified hash like previously. New code should always run it in scalar context though (everything in our code base was changed according to that). sub GetTextRevision is not backwards compatible (don't let “wantarray” usage to confuse you). Most modules do not touch that subroutine, so we are probably fine (modules from our git repo that do use were changed accordingly). “EncodePage(%$page)” looks wrong. It seems like we should change it to accept hash ref.
103 lines
3.3 KiB
Perl
103 lines
3.3 KiB
Perl
# Copyright (C) 2006, 2012 Alex Schroeder <alex@gnu.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 3 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
use strict;
|
|
use v5.10;
|
|
|
|
use File::Glob ':glob';
|
|
our ($DraftDir);
|
|
|
|
AddModuleDescription('drafts.pl', 'Draft Extension');
|
|
|
|
our ($q, $Message, $Now, %Action, $DataDir, @MyInitVariables, @MyMaintenance, $FooterNote);
|
|
|
|
$DraftDir = $DataDir."/draft"; # directory for drafts
|
|
|
|
push(@MyInitVariables, \&DraftInit);
|
|
|
|
sub DraftInit {
|
|
if (GetParam('Draft', '')) {
|
|
SetParam('action', 'draft') ; # Draft button used
|
|
} elsif (-f "$DraftDir/" . GetParam('username', $q->remote_addr()) # draft exists
|
|
and $FooterNote !~ /action=draft/) { # take care of mod_perl persistence
|
|
$FooterNote = $q->p(ScriptLink('action=draft', T('Recover Draft'))) . $FooterNote;
|
|
}
|
|
}
|
|
|
|
$Action{draft} = \&DoDraft;
|
|
|
|
sub DoDraft {
|
|
my $id = shift;
|
|
my $draft = $DraftDir . '/' . GetParam('username', $q->remote_addr());
|
|
if ($id) {
|
|
my $text = GetParam('text', '');
|
|
ReportError(T('No text to save'), '400 BAD REQUEST') unless $text;
|
|
CreateDir($DraftDir);
|
|
WriteStringToFile($draft, EncodePage(text=>$text, id=>$id));
|
|
SetParam('msg', T('Draft saved')); # invalidate cache
|
|
print GetHttpHeader('', T('Draft saved'), '204 NO CONTENT');
|
|
} elsif (-f $draft) {
|
|
my $data = ParseData(ReadFileOrDie($draft));
|
|
unlink ($draft);
|
|
$Message .= $q->p(T('Draft recovered'));
|
|
DoEdit($data->{id}, $data->{text}, 1);
|
|
} else {
|
|
ReportError(T('No draft available to recover'), '404 NOT FOUND');
|
|
}
|
|
}
|
|
|
|
# add preview button to edit page (but not to GetCommentForm!)
|
|
|
|
*DraftOldGetEditForm = \&GetEditForm;
|
|
*GetEditForm = \&DraftNewGetEditForm;
|
|
|
|
sub DraftNewGetEditForm {
|
|
my $html = DraftOldGetEditForm(@_);
|
|
# assume that the preview button html is the same for two calls
|
|
my $draft_button = $q->submit(-name=>'Draft', -value=>T('Save Draft'));
|
|
$html =~ s!(<input[^>]*name="Cancel"[^>]*>)!$1 $draft_button!;
|
|
return $html;
|
|
}
|
|
|
|
# cleanup
|
|
|
|
push(@MyMaintenance, \&DraftCleanup);
|
|
|
|
sub DraftFiles {
|
|
return map {
|
|
my $x = $_;
|
|
$x = substr($x, length($DraftDir) + 1);
|
|
utf8::decode($x);
|
|
$x;
|
|
} bsd_glob("$DraftDir/*"), bsd_glob("$DraftDir/.*");
|
|
}
|
|
|
|
sub DraftCleanup {
|
|
print '<p>' . T('Draft Cleanup');
|
|
foreach my $draft (DraftFiles()) {
|
|
next if $draft eq '.' or $draft eq '..';
|
|
my $ts = (stat("$DraftDir/$draft"))[9];
|
|
if ($Now - $ts < 1209600) { # 14*24*60*60
|
|
print $q->br(), Tss("%1 was last modified %2 and was kept",
|
|
$draft, CalcTimeSince($Now - $ts));
|
|
} elsif (unlink("$DraftDir/$draft")) {
|
|
print $q->br(), Tss("%1 was last modified %2 and was deleted",
|
|
$draft, CalcTimeSince($Now - $ts));
|
|
} else {
|
|
print $q->br(), Ts('Unable to delete draft %s', $draft);
|
|
}
|
|
}
|
|
print '</p>';
|
|
}
|