Редактирование и сохранение страниц

Изменение страниц зависит от двух тесно связанных модулей: редактировать и сохранять. В редакции

текущее содержимое страницы передается в форму в клиенте. Когда эта форма представляется

пользователя, это вызывает действие 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>;

закрыть (Ф);

с/&/&амп;/г;

с/</&lt;/г;

с/>/>/г;

$текст = $_;

;

$/ = $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/