Редактирование и сохранение страниц
Изменение страниц зависит от двух тесно связанных модулей: редактировать и сохранять. В редакции
текущее содержимое страницы передается в форму в клиенте. Когда эта форма представляется
пользователя, это вызывает действие POST через модуль сохранения для обновления страницы.
редактировать.cgi
#! /USR/бен/перл -w
# (c) 1999, Каннингем и Каннингем,
# используйте строгий;
$ | ++ ;
Инк.
print "Тип контента: text/html\n\n";
my $link = "[AZ][az]+([AZ][az]+ )+";
моя отметка $ = "\ 263" ;
моя $page = $ENV{QUERY_STRING} =~ / A $link$/
? $&
: "Добро пожаловать, посетители";
мой $текст =
если ( -e "страниц/$страница" ) {
open(F, "pages/$page") или die "$page: $!";
}
;
мой $nl = $/; неопределенный $/;
$_ = <F>;
закрыть (Ф);
с/&/&амп;/г;
с/</</г;
с/>/>/г;
$текст = $_;
;
$/ = $nl;
Пока код почти такой же, как и в модуле просмотра. Однако вместо
просто отображая полученное содержимое страницы, код устанавливает форму редактирования.
мой% пар;
$par{title} = "Редактировать $страницу";
$par{страница} = $страница;
$par{тело} = «
"ЭОФ";
<form method=post action="save.cgi?$page">
<textareaname=Text rows=16 cols=60 wrap=virtual>$text</textarea>
<p><input type="submit" value="Сохранить">
<input type="hidden" namfe="mode" value="$mode">
</форма>
EOF
РАЗБИРАЕМ QUICKIWIKI
219
Изменение значений для строк и столбцов здесь настраивает форму так, чтобы она удобно вписывалась в
предпочтительный размер окна клиента.
open(T, 'template.html') или die "template.html: $!";
неопределенный $/;
$_ = <Т>;
шкаф);
s/\$(\w+)/определено($par{$1}) ? $par{$l}: "/geo;
Распечатать;
$/ = $nl;
Этот код вставляет форму редактирования с ее содержимым на ту же страницу шаблона, что и
раньше и отправляет все в браузер пользователя. Затем процедура завершается.
wiki больше ничего не делает, пока не придет новый запрос от пользователя, либо от
по гиперссылке или с помощью кнопки Сохранить. В последнем случае следующий модуль
вызывается.
сохранить.cgi
#! /USR/бен/перл
#(c) 1999, Cunningham & Cunningham, Inc.
# в сотрудничестве с Дэйвом В. Смитом
# используйте строгий;
$|++;
print "Тип контента: text/html\n\n";
мой знак $ = "\ 263";
my $link > "[AZ][az]+([AZ][az]+)+";
моя $page = $ENV {QUERY_STRING} =~/^ ссылка? /
? $&
: die("BadSaveName\n");
Опять же, этот код почти такой же, как и раньше, только здесь мы должны проверить правильность
имя страницы и не применять значения по умолчанию, как при просмотре.
# читать(NS, $_, $ENV{CONTENT_LENGTH});
# для "Quicki-сервера"
читать (STDIN, $ _, $ ENV {CONTENT_LENGTH});
# для апача
Здесь небольшая зависимость от платформы: раскомментируйте и используйте оператор
соответствующий вашему выбору сервера. Команда читает отправку формы
содержимое, текст и скрытые поля.
220
ИЗУЧЕННЫЕ КОМПОНЕНТЫ ВИКИ
мой ($тело,%тело);
foreach $_ (split(/&/, $_)) f
с/\+//г;
s/\%(. . .) /pack( 1 C 1 , hex($1))/geo;
($_, $body) = разделить (/=/, $_, 2);
$тело{$_} = Тело;
}
Полученные данные разбиваются на соответствующие блоки, среди которых есть именованный
Блок Текст.
$_ = $тело{текст};
/\п/
|
? s/\r//g # предположим, что ПК просто удаляет cr
: с/\р/\п/г; # заменить cr на If
Здесь включен быстрый хак, чтобы обеспечить унифицированный формат конца строки. Если мы
обнаружить символ новой строки, представленный формат, вероятно, из UNIX или DOS/