Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

MediaWiki

Глава 12 из книги "Архитектура приложений с открытым исходным кодом", том 2.
Оригинал: MediaWiki
Автор: Sumana Harihareswara, Guillaume Paumier
Перевод: А.Панин

12.7. Содержимое статей

Структура содержимого статей

Концепция пространств имен была использована в течение периода эксплуатации приложения UseModWiki сайтом Wikipedia, причем страницы обсуждений имели заголовок "<Название статьи>/Talk". Формально пространства имен были реализованы Magnus Manske в первом "сценарии PHP". Они были несколько раз повторно реализованы в течение длительного промежутка времени, но сохранили свое предназначение: разделение различных типов содержимого страниц. Они состоят из префикса, отделенного от имени страницы двоеточием (т.е., Talk: или File: и Template:); пространство имен позволяет не использовать префикс для доступа к основному содержимому страницы. Пользователи сайта Wikipedia быстро начали использовать эту возможность и создали сообщество с большим количеством возможностей для участия. Пространства имен доказали необходимость своего существования в качестве функции приложения MediaWiki, так как с помощью них создавались необходимые условия для организации пространства дискуссий сообщества wiki, процессов в рамках сообщества, порталов, профилей пользователей, и.т.д.

Стандартные настройки пространства имен основного содержимого страницы приложения MediaWiki предполагают плоскую организацию (без подстраниц), так как таким образом функционирует сайт Wikipedia, но включить поддержку подстраниц достаточно просто. Они включены в других пространствах имен (т.е., пространстве имен User:, где пользователи могут, например, работать с черновиками статей) и обозначаются специальным образом.

Пространства имен разделяют содержимое на основе типов; в рамках одного пространства имен страницы могут быть организованы на основе тем с использованием категорий, эксплуатируя псевдо-иерархическую схему организации, представленную в версии 1.3 приложения MediaWiki.

Обработка содержимого статей: язык разметки MediaWiki и механизм его разбора

Создаваемое пользователями содержимое страниц сохраняется приложением MediaWiki с использованием не формата разметки HTML, а специфического для MediaWiki языка разметки, иногда называемого "wikitext". Этот язык разметки позволяет пользователям изменять форматирование текста (т.е., делать текст жирным или наклонным с использованием кавычек), добавлять ссылки (с помощью квадратных скобок), подключать шаблоны, включать в состав текста зависимое от контекста содержимое (аналогичное дате или подписи), а также выполнять огромное количество других замечательных вещей. (Подробная документация доступна.)

Для вывода страницы ее содержимое должно быть разобрано и дополнено путем сборки всех внешних или динамических элементов, вызываемых данной страницей, после чего должна быть произведена конвертация в корректное представление документа HTML. Система разбора языка разметки является одной из наиболее важных частей приложения MediaWiki, которую сложно изменить или улучшить. Так как возможность вывода в формате HTML миллионов страниц по всему миру зависит от системы разбора языка разметки, эта система является чрезвычайно стабильной.

Язык разметки не был формально описан с самого начала; он был создан на основе языка разметки приложения UseModWiki, а после этого изменялся и развивался в соответствии с предъявляемыми к нему требованиями. В условиях отсутствия формальной спецификации, язык разметки приложения MediaWiki превратился в сложный и своеобразный язык, полностью совместимый исключительно с системой разбора языка разметки приложения MediaWiki; он не может быть представлен формальной грамматикой. О спецификация применяемой на данный момент системы разбора языка разметки в шутку упоминают, как об "описании всего того, что система разбора языка разметки извлекает из данных в формате wikitext с добавлением описания нескольких сотен вариантов тестирования".

Было предпринято множество попыток разработки альтернативных систем разбора языка разметки, но ни одна из них не увенчалась успехом. В 2004 году экспериментальная система разделения текста была разработана Jens Frank с целью разбора данных в формате wikitext и впоследствии применена на сайте Wikipedia; ее пришлось отключить после трех дней эксплуатации из-за низкой производительности системы резервирования участков памяти для массивов языка PHP. С того времени большая часть задач по разбору языка разметки производилась с использованием огромного количества регулярных выражений и множества вспомогательных функций. Разметка wiki, а также множество специальных случаев, которые система ее разбора должна учитывать, стали относительно более сложными, что еще в большей степени затруднило последующие попытки разработки системы разбора языка разметки.

Важным улучшением являлась выполненная Tim Starling переработка кода препроцессора, осуществленная в версии 1.12 приложения MediaWiki, причем основной мотивацией разработчика было желание увеличить производительность разбора данных страниц со сложными шаблонами. Препроцессор конвертирует данные в формате wikitext в представляющее части документа (включающее вызовы шаблонов, функции системы разбора языка разметки, функции тэгов, заголовки разделов и несколько других структур) дерево XML DOM с пропуском таких "неиспользуемых ветвей", как операторы #switch без последующих условий и неиспользуемые стандартные значения для аргументов шаблона при его разборе. После этого система разбора языка разметки обходит структуру DOM и преобразует ее данные в формат HTML.

Недавняя работа над визуальным редактором для приложения MediaWiki привела к необходимости усовершенствования процесса разбора языка разметки (и его ускорения), таким образом была вновь начата работа над системой разбора языка разметки и над промежуточными уровнями представлений в диапазоне между языком разметки MediaWiki и окончательным документом в формате HTML (обратитесь к разделу "Планы на будущее", расположенному ниже).

Специальные слова и шаблоны

Приложение MediaWiki позволяет использовать "специальные слова", с помощью которых изменяется стандартное отображение страницы или в ее состав включаются динамические элементы. Специальные слова делятся на категории: модификаторы поведения __NOTOC__ (для автоматического сокрытия оглавления) или __NOINDEX__ (для сообщения поисковым машинам о том, что страницы не должна индексироваться); переменные, такие, как {{CURRENTTIME}} или {{SITENAME}}; и функции системы разбора языка разметки, т.е., специальные слова, которые могут принимать параметры, такие, как {{lc:<string>}} (для вывода строки, передаваемой в качестве параметра <string>, в нижнем регистре). Такие конструкции, как {{GENDER:}}, {{PLURAL:}} и {{GRAMMAR:}} используются для локализации пользовательского интерфейса и являются функциями системы разбора языка разметки.

Наиболее часто применяемым способом включения содержимого других страниц в состав страницы приложения MediaWiki является использование шаблонов. На самом деле шаблоны были предназначены для включения одной и той же информации в состав различных страниц, т.е., навигационных панелей или баннеров с сообщениями о техническом обслуживании на страницах статей сайта Wikipedia; возможность создания частей страниц и повторного использования их в составе тысяч статей с централизацией управления ими позволила повысить популярность сайтов, подобных Wikipedia.

Однако, шаблоны также использовались (в том числе и чрезмерно) пользователями для достижения совершенно другой цели. В версии 1.3 приложения MediaWiki появилась возможность передачи параметров шаблонам для изменения их содержимого; возможность добавления стандартного значения параметра (введенная в версии 1.6 приложения MediaWiki) позволила реализовать функциональный язык программирования на основе PHP, который в итоге оказался одной из самых ресурсоемких функций приложения.

Впоследствии Tim Starling разработал дополнительные функции системы разбора языка разметки (расширение ParserFunctions) в качестве временной меры для борьбы с абсурдными конструкциями, создаваемыми пользователями сайта Wikipedia с помощью шаблонов. Этот набор функций включал такие логические структуры, как #if и #switch, а также другие функции, такие, как #expr (для вычисления значений математических выражений) и #time (для форматирования строки времени).

Спустя достаточно короткий промежуток времени, пользователи сайта Wikipedia начали создавать еще более сложные шаблоны с использованием новых функций, которые сравнительно сильно снизили производительность системы разбора языка разметки при работе со страницами, содержащими большое количество шаблонов. Новый препроцессор, включенный в состав версии 1.12 приложения MediaWiki (в качестве важного архитектурного изменения) был реализован для частичного решения этой проблемы. Не так давно разработчики приложения MediaWiki обсуждали возможность использования существующего языка сценариев, возможно Lua, для улучшения производительности.

Мультимедийные файлы

Пользователи загружают файлы с помощью страницы Special:Upload; администраторы могут задать разрешенные типы файлов с помощью списка разрешенных расширений файлов. После загрузки файлы хранятся в директории файловой системы, а миниатюры для предварительного просмотра - в отдельной директории с названием thumb.

Так как организация Wikimedia выполняет образовательную миссию, приложение MediaWiki поддерживает типы файлов, которые могут быть нестандартными для других веб-приложений и систем управления содержимым вебсайта, такие, как векторные изображения SVG и многостраничные документы PDF и DjVu. Они представляются с помощью изображений формата PNG и могут быть отображены и включены в состав страницы также, как и более известные типы изображений, такие, как GIF, JPG и PNG.

После загрузки файла ему ставится в соответствие страница File:, содержащая информацию, введенную загрузившим файл пользователем; это описание в свободной форме обычно включает информацию о правообладателе (имя автора, лицензия) и элементы, описывающие или классифицирующие содержимое файла (описание, расположение, дата, категории, и.т.д). В то время, как отдельные установленные системы wiki могут не предъявлять требований к этой информации, в медиа-библиотеках, таких, как Wikimedia Commons крайне важно предоставлять данные для организации коллекции и уверенности в том, что файлы могут легально распространяться. Было аргументировано утверждение о том, что большая часть этих метаданных фактически должна храниться в рамках такой структуры, поддерживающей выполнение запросов, как таблица базы данных. Это сравнительно упростит не только поиск, но и установление авторства, а также повторное использование материалов сторонними лицами - например, с помощью API.

Большинство сайтов организации Wikimedia позволяет совершать "локальные" загрузки файлов в каждый из разделов wiki, но сообщество пытается хранить распространяемые под свободными лицензиями мультимедийные файлы в свободной медиа-библиотеке организации Wikimedia, Wikimedia Commons. Любой вебсайт организации Wikimedia может отобразить файл, размещенный в Wikimedia Commons также, как в случае его локального размещения. Это правило позволяет преодолеть необходимость загрузки файла в каждый раздел wiki для того, чтобы использовать его там.

В результате приложение MediaWiki изначально поддерживает сторонние репозитории мультимедийных файлов, т.е., возможность доступа к мультимедийным файлам, размещенным в других разделах wiki при помощи API и системы ForeignAPIRepo. Начиная с версии 1.16, любой использующий MediaWiki вебсайт может без лишних сложностей использовать файлы из репозитория Wikimedia Commons с помощью функции InstantCommons. При использовании стороннего репозитория миниатюры для предварительного просмотра хранятся локально с целью экономии пропускной способности сети. Однако, (на данный момент) невозможно загружать файлы в сторонний репозиторий мультимедийных файлов с помощью не относящейся к нему системы wiki.


Далее: Модификации и расширение возможностей MediaWiki