123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- # 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 (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!(<input[^>]*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 '<p>' . 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 '</p>';
- }
|