Сезон навигации открыт |
|||||
---|---|---|---|---|---|
Гипертекстовые ссылки — неотъемлемый элемент любой web-страницы и основа основ
идеологии Всемирной Паутины. Множество ссылок, область действия которых лежит в
пределах одного сайта, составляет систему навигации последнего.
В состав вспомогательной навигации полезно включать ссылки, ведущие к предыдущему и к следующему подразделам, к странице со списком подразделов (оглавлению раздела) и на главную страницу сайта. Если иерархия логической структуры сайта насчитывает больше трех уровней, лучше всего реализовать вспомогательную навигацию в виде строк пройденного пути. Вот возможный пример такой строки: MySite.Ru > Проекты > Статьи > О навигации > Глава 5Четыре первые надписи выделены подчеркиванием в знак того, что они являются
ссылками на страницы с оглавлениями соответствующих разделов. Удобно, не так ли?
Помимо чисто справочной роли, URL такого вида вполне может использоваться для
передвижения по сайту. Посетитель, сократив этот адрес, скажем, до вида
«http://www.mysite.ru/projects/», сможет при помощи одного щелчка мыши попасть
на страницу оглавления раздела «Проекты», которая находится тремя уровнями выше!
Изменив «chapter05.html» на «chapter03.html», посетитель сможет перейти к одной
из предыдущих глав, не пользуясь для этого внутренней навигацией сайта.
На внутренних страницах содержимое заглавия должно отражать положение того или иного подраздела в иерархической структуре сайта. Для вышеприведенного URL содержимое элемента <title>…</title> может выглядеть следующим образом: Глава 5 – О навигации - Статьи - Проекты - MySite.RuСледует обратить внимание на то, что в заглавии внутренней страницы сайта
непременно должны присутствовать как название самой страницы, так и название
сайта в целом, причем название страницы лучше всего размещать на первом месте,
поскольку, скажем, в «Панели задач» Windows отображается кнопка, содержащая лишь
первые несколько символов заголовка окна, и, если открыто несколько страниц
одного и того же сайта, идентифицировать то или иное окно по кнопке в «Панели
задач» будет значительно легче. Небольшая правка, включающая в себя, в основном, операции замены и
вырезания/вставки, позволит избавиться от абсолютного пути к текущей папке
(следует оставить лишь относительные пути, обычные для гиперссылок) и
расположить имена файлов в соответствии с последовательностью, принятой на
сайте. Чем более «говорящими» являются названия файлов, тем быстрее удастся
рассортировать их. Чтобы показать иерархию подразделов, условимся использовать
пробельные символы в начале строк: имя файла без пробелов — высший уровень
иерархии (корень дерева, индексная страница), один пробел перед именем файла —
основные разделы сайта, два пробела — подразделы первого уровня и т. д. Нужно
обратить внимание, чтобы не было «скачков» через несколько уровней вложенности:
если под именем файла индексной страницы, приведенным без пробелов, находится
имя документа, соответствующего какому-нибудь подразделу, затерянному в дебрях,
с тремя пробелами перед именем — это явная ошибка логической структуры сайта,
которую нужно исправить. # в соответствии с существующей логической структурой # (C) А. Ломов, 2003 # Открываем файл source.txt для чтения как поток SOURCE. # В случае отсутствия такого файла выводим сообщение об ошибке. if (-e 'source.txt') { open(SOURCE, "source.txt"); } else { print "MkMap: Не удается обнаружить файл source.txt.\n"; exit(0); } # Путь к каталогу, в котором следует искать файлы для вычленения # названий и описаний документов, задается пользователем в # командной строке. В случае, если путь не задан, подразумевается # текущий каталог. $path = shift(@ARGV); # Добавляем в конец пути обратный «слэш», если путь не равен # пустой строке и в конце его еще нет «слэша». if (($path ne '') && (substr($path, -1) ne '\')) { $path = $path . '\'; } # Выходной файл – sitemap.html. Там по окончании работы скрипта будет # содержаться готовая карта сайта. open(SITEMAP, '>sitemap.html'); # Первая строчка выходного файла - открывающий тэг # маркированного списка. print SITEMAP "<ul>\n"; # Устанавливаем в 0 значение переменной, назначение # которой будет пояснено чуть ниже. $lastspaces = 0; # Цикл выполняется, покуда «есть порох в пороховницах» - # построчно читаем файл source.txt. while ($filename = <SOURCE>) { chomp ($filename); # Цель нижеслежующего цикла – выявить количество пробелов перед # очередным именем файла, а также запись в переменную $filename # «очищенного» от пробелов имени файла. for($spaces = 0; $spaces <= length($filename); $spaces++) { if (substr($filename, $spaces, 1) ne ' ') { $filename = substr($filename, $spaces); last; } } # Переменная $lastspaces отражает количество пробелов, найденных # в предыдущий раз. В переменной $spaces содержится количество # пробелов, найденных в начале строки с именем файла в этот раз. # Переменная $diff призвана хранить разность этих показаний. $diff = $lastspaces - $spaces; # Если в этот раз пробелов стало на один больше, добавляем еще # один уровень вложенности в список путем вывода дополнительного тэга #
# предупреждаем об ошибке логической структуры. Несмотря на ошибку, # часть карты сайта сформировано и доступно для анализа в файле # sitemap.html, что не является, в сущности, недостатком скрипта - # ведь не до конца сгенерированная карта поможет быстро установить # место ошибки. if($diff < 0) { if($diff < -1) { print "MkMap: Ошибка логической структуры - нет одного или нескольких уровней иерархии.\n"; exit(0); } print SITEMAP "<ul>\n"; } # В случае, если пробелов стало меньше, выводятся закрывающие тэги # # цикл можно каким-то образом объединить с предыдущим, и вообще # сделать все более оптимальным и элегантным, но мы пишем скрипт для # себя, и наша цель – сэкономить свое рабочее время, а не процессорное # время компьютера (которого и без того тратится очень немного). if($diff > 0) { for($j = 0; $j < $diff; $j++) { print SITEMAP "</ul>\n"; } } # Организуем новую переменную $file, где будем хранить # абсолютный путь к файлу HTML-страницы, который нужно # проанализировать. Как вы помните, в файле source.txt # находятся лишь относительные пути. $file = $filename; # Прибегаем к помощи регулярных выражений. Убираем возможные # символы «\» и «/» из начала строки. $file =~ s/^\//; $file =~ s/^\///; # Заменяем все прямые «слэши» на обратные – в результате скрипт # будет нечувствителен к привычкам пользователя. $file =~ s/\//\/g; # Присоединяем к началу строки абсолютный путь к каталогу, взятый, # напомним, из параметра командной строки. $file = $path . $file; # В случае обнаружения файла $file считываем из него всю # информацию в виде одной большой строки $info. if (-e $file) { @filestats = stat($file); $filesize = $filestats[7]; open(FILEINFO, $file); sysread (FILEINFO, $info, $filesize); close(FILEINFO); } # Убираем из строки $info все символы новой строки и # заводим новую переменную $descr. В строке $info впоследствии # будет храниться только содержимое контейнера <title>...</title>, # а переменная $descr будет представлять собой описание, взятое # из метатэга. $info =~ s/\n//g; $descr = $info; # Удаляем все, что было до <title>... $info =~ s/^.+<title>//; # ...и все, что будет после </title> $info =~ s/<\/title>.+$//; # Это регулярное выражение предназначено для иерархических # заголовков, рассмотренных в начале статьи. Отрезается все, # что следует за первым встретившимся сочетанием « -», включая # его само. $info =~ s/ -.+//; # Удаляем все, что было до «meta name="description" content="»... $descr =~ s/^.+<meta name=\"description\" content=\"//; # ...и все, что будет после первой встретившейся кавычки $descr =~ s/\".+//; # Заменяем в $filename все обратные «слэши» на прямые, как принято # в гиперссылках. $filename =~ s/\/\//g; # Генерируем пункт списка – тэг <li> и ссылку на файл. print SITEMAP "<li><a href=\"$filename\">"; # Если $info не содержит угловых скобок и слэшей, а также не # является пустой строкой, есть основания полагать, что эта # строка содержит именно то, что нам требуется. Оформляем значение # переменной $info как ссылку. В противном случае оформляем как # ссылку словосочетание «Untitled document» - возможно, заголовка # окна в документе попросту нет. if (($info !~ /[<>\/\"]/) && ($info ne '')) { print SITEMAP "$info</a>\n"; # В случае, если строка $descr также не пустая и не содержит угловых # скобок и слэшей, под ссылкой помещаем описание документа, # набранное чуть меньшим кеглем (применяем тэг <small>). if (($descr !~ /[<>\/\"]/) && ($descr ne '')) { print SITEMAP "<br><small>$descr</small>\n"; } } else { print SITEMAP "(Untitled document)</a>\n"; } $lastspaces = $spaces; } # В конце работы добавляем нужное количество закрывающих тэгов </ul>. for($j = 0; $j < $lastspaces; $j++) { print SITEMAP "</ul>\n"; } print SITEMAP "</ul>"; # Финишная прямая. close(SITEMAP); close(SOURCE); print "MkMap: работа успешно завершена. См. файл sitemap.html\n"; exit(0); Этот сценарий можно было бы усовершенствовать, например, заставив его
модифицировать ссылки вспомогательной навигации на страницах сайта в
соответствии с заданной в файле source.txt структурой. Но статья и так
получилась большой, так что ограничимся здесь «базовой версией».
|