§ Ссылки на страницы
4
2
2
2
2
1
1
1
1
1
1
1
0
0
CodeChanges
Болеф
EditConvcntaonСводка
TcstPage
УордКанрангэм
Автообратная ссылка
Текущая версия
Дальнейшие изменения
Хороший стиль
Другая страница
SvstemАдминистратор
Кто есть кто
Заявления о позиции
Добро пожаловать, посетители
РИСУНОК 9-10.
Список литературы для
очень маленькая тестовая вики. Обратите внимание
две потерянные страницы с
счет нуля в
нижний.
Проблема для администратора найти такие страницы. Дан модуль QuickiWiki
вот простой хак, который подсчитывает ссылки на страницы по всей базе данных. Потому что
просматривает файлы базы данных, он включает все страницы, независимо от того, связаны они или нет. А
Пример результата для очень маленькой тестовой вики представлен на рис. 9-10.
В листинге показаны две страницы-сироты, на которых отсутствуют ссылки с какой-либо другой страницы.
WelcomeVisitors — это страница этой вики по умолчанию, так что это не проблема, и она есть в любом
случай обычно связан через ссылки шаблона.
Однако PositionStatements действительно является настоящей сиротой. Нажав на ссылку
здесь создан, вы можете проверить страницу и определить, где, если где-нибудь,
ссылка на него будет уместна. Вы также можете создать LostPages для сбора
таких сирот, и пусть более широкие круги читателей вики определят их дальнейшее
актуальность.
АДМИНИСТРИРОВАНИЕ БАЗЫ ДАННЫХ
295
Совет 9, 14: Низкое количество ссылок предупреждает о плохой сшивке
Длинный список страниц со счетчиком ссылок (refcount) равным 1 или 2 является предупреждением о том, что
вики в целом имеет низкий уровень перекрестных ссылок. Таким образом, многие из этих страниц рискуют
стать сиротой из-за одного необдуманного редактирования на другой странице. Фактически,
некоторые страницы с числом ссылок 1 уже могут быть сиротами, с единственной ссылкой из
статическая страница RecentChanges.
Код базового счетчика ссылок. модуль cgi, используемый в этом примере QuickiWiki
как следует:
#! /USR/бен/перл
#(c) 1999, Cunningham & Cunningham, Inc.
# в сотрудничестве с Дэйвом В. Смитом
# используйте строгий;
$ | ++;
print "Тип контента: text/html\n\n";
my $link = "[AZ][az]+([AZ][az]+)+";
opendir(DIR, 'pages') или die "pages: $!";
my ©files = grep //v$link$/, readdir (DIR) ;
закрытый(КАТАЛОГ);
мой %refs = () ;
мой $файл;
foreach $file (©files) {
open(F, "pages/$file") или die "$file: $!";
неопределенный $/;
мой $contents = <F>;
закрыть (Ф);
мои %цели = () ;
в то время как ($contents =~ /($link)/g) {
$targets{$l} =• $file, если ($1 eq $file); # запретить ссылки на самих себя
}
моя цель $;
foreach $ target ( ключи % target ) {
push @{$refs{$target}}, $file;
}
}
мой %refcnt = ();
foreach $file (©files) {
$refcnt{$file} = определено $refs{$file} ? скаляр @{$refs{$file}} : 0;
}
296
АДМИНИСТРИРОВАНИЕ ВИКИ И ИНСТРУМЕНТЫ
©files = sort { $refcnt{$b} <=> $refcnt{$a} || $a cmp $b } ©files;
my $body = "ctable border=0 CellPacing=0 CellPadding ^ ^ N";
foreach $file (©files) {
$тело .= "<tr>";
$body ,= "<td
$body .= "<td> fcnbsp;<a href=wiki.cgi?$file>$file</a></td>";
$тело .= "</tr>\n";
}
$body .= "</table>\n";
мой% пар;
$par{резюме} = "";
$par{title} = "Ссылки на страницы";
$par{страница} = "http:pagerefs.cgi";
$пар{тело} = $тело;
open(T, "template.html") или die "template.html: $!";
неопределенный $/;
$_ = <Т>;
шкаф);
s/\$(\w+)/defined($par{$1}) ?$par{$l} : ''/geo;
Распечатать;
$/ = "\n";