##############################################################################
# The Faq-O-Matic is Copyright 1997 by Jon Howell, all rights reserved. #
# #
# 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 2 #
# 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, write to the Free Software #
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.#
# #
# Jon Howell can be contacted at: #
# 6211 Sudikoff Lab, Dartmouth College #
# Hanover, NH 03755-3510 #
# jonh@cs.dartmouth.edu #
# #
# An electronic copy of the GPL is available at: #
# http://www.gnu.org/copyleft/gpl.html #
# #
##############################################################################
use strict;
package FAQ::OMatic::editPart;
use CGI;
use FAQ::OMatic::Item;
use FAQ::OMatic;
use FAQ::OMatic::Auth;
use FAQ::OMatic::I18N;
use FAQ::OMatic::HelpMod;
sub main {
my $cgi = FAQ::OMatic::dispatch::cgi();
my $rt='';
my $params = FAQ::OMatic::getParams($cgi);
FAQ::OMatic::mirrorsCantEdit($cgi, $params);
$rt .= FAQ::OMatic::pageHeader($params, ['help', 'faq']);
my $item = new FAQ::OMatic::Item($params->{'file'});
if ($item->isBroken()) {
FAQ::OMatic::gripe('error', "The file (".$params->{'file'}
.") doesn't exist.");
}
# check sequence number to prevent later confusion -- the user's
# insert or change request came from an out-of-date page.
$item->checkSequence($params);
my $insertpart = $params->{'_insertpart'};
my $partnum = $params->{'partnum'};
if ($partnum =~ m/afterLast/) {
# it's possible to come from a mirror, who might be enough
# out of date that naming a specific part number would cause
# the [Append to This Answer] link to sometimes cause people to
# unintentionally insert text before existing text.
# The pattern match lets us send something like '9999afterLast',
# which will cause older versions (which a newer mirror may
# point to) to generate a nice error message, instead of
# letting the user edit the wrong part.
$partnum = scalar(@{$item->{'Parts'}}) - 1;
}
my $part = undef;
$partnum = FAQ::OMatic::stripInt($partnum);
if ($partnum >= 0) {
$part = $item->getPart($partnum);
if (not $part) {
FAQ::OMatic::gripe('error', "Part number $partnum in "
.$params->{'file'}." doesn't exist.");
}
} else {
$partnum = -1;
}
if (($partnum < 0) and (not $insertpart)) {
FAQ::OMatic::gripe('error', "Part number \"$partnum\" in \""
.$params->{'file'}."\" doesn't exist.");
}
# for inserts, create the part in our in-memory copy of the item
# just like it would be created in submitItem, so that the
# form-generator below can't tell the difference.
# duplicates are exactly the same as inserts, but you copy an existing
# part, rather than start with an empty one.
if ($insertpart) {
my $newpart;
if ($cgi->param('_duplicate')) {
# duplicate part -- the one above the insert, I guess.
$newpart = $item->getPart($partnum)->clone();
} else {
# new part
$newpart = new FAQ::OMatic::Part();
}
# squeeze the new part into the item's part list.
splice @{$item->{'Parts'}}, $partnum+1, 0, $newpart;
# inheret properties from parent part
if ($part) {
if ($part->{'Type'} ne 'directory') {
$newpart->{'Type'} = $part->{'Type'};
}
$newpart->{'HideAttributions'} = $part->{'HideAttributions'};
}
$part = $newpart;
}
if ($part->{'Text'} =~ m/^\s*$/s) {
# if the part starts out empty, we're as good as adding, not
# editing existing content.
# We let the item author add any new parts he wants.
FAQ::OMatic::Auth::ensurePerm('-item'=>$item,
'-operation'=>'PermAddPart',
'-restart'=>FAQ::OMatic::commandName(),
'-cgi'=>$cgi,
'-failexit'=>1);
} else {
FAQ::OMatic::Auth::ensurePerm('-item'=>$item,
'-operation'=>'PermEditPart',
'-restart'=>FAQ::OMatic::commandName(),
'-cgi'=>$cgi,
'-failexit'=>1);
if ($part->{'Type'} eq 'html') {
# discourage unauthorized users from editing HTML parts which
# they won't later be able to submit.
FAQ::OMatic::Auth::ensurePerm('-item'=>$item,
'-operation'=>'PermUseHTML',
'-restart'=>FAQ::OMatic::commandName(),
'-cgi'=>$cgi,
'-xreason'=>'useHTML',
'-failexit'=>1);
}
}
if ($params->{'_insertpart'}) {
my $insertHint = $params->{'_insert'} || '';
if ($insertHint eq 'answer') {
$rt .= gettexta("Enter the answer to %0", $item->getTitle())."\n";
} elsif ($insertHint eq 'category') {
$rt .= gettexta("Enter a description for %0", $item->getTitle())."\n";
} elsif ($params->{'_duplicate'}) {
$rt .= gettexta("Edit duplicated text for %0", $item->getTitle())."\n";
} else {
$rt .= gettexta("Enter new text for %0", $item->getTitle())."\n";
}
} else {
# little white lie -- user sees 1-based indices, but parts
# are stored 0-based. Is this bad?
$rt .= gettexta("Editing the %0 text part in %1.",
FAQ::OMatic::cardinal($partnum+1), $item->getTitle())
."\n";
}
$rt .= $part->displayPartEditor($item, $partnum, $params);
$rt .= FAQ::OMatic::HelpMod::helpFor($params, 'editPart', "
\n");
$rt .= FAQ::OMatic::HelpMod::helpFor($params, 'makingLinks', "
\n");
$rt .= FAQ::OMatic::HelpMod::helpFor($params, 'seeAlso', "
\n");
# TODO: this will probably be unnecessary once there is a help system.
if (FAQ::OMatic::getParam($params, 'editCmds') eq 'hide') {
$rt .=
"
" . gettexta("If you later need to edit or delete this text, use the [Appearance] page to turn on the expert editing commands.") . "\n"; } $rt .= FAQ::OMatic::pageFooter($params, ['help','faq']); print $rt; } 1;