# Copyright (C) 2006, 2012 Alex Schroeder # # 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 . 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 (IsFile("$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 (IsFile($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!(]*name="Cancel"[^>]*>)!$1 $draft_button!; return $html; } # cleanup push(@MyMaintenance, \&DraftCleanup); sub DraftFiles { return map { substr($_, length($DraftDir) + 1); } Glob("$DraftDir/*"), Glob("$DraftDir/.*"); } sub DraftCleanup { print '

' . T('Draft Cleanup'); foreach my $draft (DraftFiles()) { next if $draft eq '.' or $draft eq '..'; my $ts = Modified("$DraftDir/$draft"); 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 '

'; }