§ Ссылки на страницы

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>&nbsp;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";