Где я могу найти код, который преобразует внутренние ссылки MediaWiki в URL-адреса статей?

Мне нужно точно воспроизвести поведение Википедии в отношении преобразования [[ссылок]] в теле страницы в URL-адреса, которые открывают статьи, на которые они ссылаются.

Синтаксис ссылки и ее поведение (преобразование) описаны здесь. Хотя в этой статье упоминаются только несколько очень простых применяемых модификаций, я думаю, что это не вся история.

Я попытался выполнить поиск в справочнике API MediaWiki, но не нашел нужного фрагмента кода. Кто-нибудь достаточно знаком с кодом, чтобы знать, о какой функции PHP (предположительно, связанной с редактированием/отправкой) я мог бы говорить?


person Adrian    schedule 15.02.2015    source источник
comment
Было бы полезно узнать больше о вашем прецеденте.   -  person Nemo    schedule 17.10.2015


Ответы (1)


В этом есть две части:

  1. Разбор синтаксиса ссылки.
  2. Генерация URL из заголовка страницы.

Анализ ссылки выполняется классом Parser, который выполняет всю обработку викитекста. Ссылки могут быть более сложными, чем просто [[Foo]], например. [[Foo#bar|что-то]], где Foo — это целевая страница, #bar — это раздел, а «что-то» — это «поверхностный текст» результирующей ссылки. Для создания URL вам нужна целевая страница и раздел. Чтобы сгенерировать ссылку (в HTML), вам также нужен поверхностный текст (если он не указан, он такой же, как и целевая страница + раздел). В настоящее время нет простого способа просто разобрать ссылку без полной обработки викитекста.

Если у вас уже есть заголовок целевой страницы (и, возможно, идентификатор раздела), у вас есть два варианта получения URL-адреса для нее: старый школьный (монолитный) способ или новый стиль (на основе сервиса).

Метод нового стиля:

  • Используйте MediaWikiTitleCodec::parseTitle для создания объекта TitleValue из имеющихся у вас строк.
  • Используйте MediaWikiPageLinkRenderer::getPageURL, чтобы получить URL-адрес страницы для данного объекта TitleValue.

Метод старой школы:

  • Используйте Title::newFromText() для создания объекта Title из имеющихся у вас строк.
  • Используйте Title::getFullURL(), чтобы получить URL-адрес страницы.

Старый стиль проще, потому что он не требует создания служебных объектов. Он зависит от глобального состояния и имеет жестко запрограммированные зависимости. В новом стиле используется простая инъекция зависимостей, которая позволяет заменять все части по отдельности и тестировать независимо друг от друга, но для этого требуется немного больше кода.

person brightbyte    schedule 15.02.2015
comment
Спасибо, Brightbyte, это именно то, что я искал. Я уже просматриваю соответствующие разделы кода. Мне нужно воспроизвести то же поведение на другом языке, таким образом, мой интерес. - person Adrian; 15.02.2015
comment
Существует несколько платформ ботов/клиентов для MediaWiki, таких как pywikibot или JWBF, см. de.wikipedia.org/wiki/Wikipedia:Bots#MediaWiki-Bot-Frameworks . У них обязательно должны быть функции для преобразования заголовков страниц в полные URL-адреса. Может там посмотришь. - person brightbyte; 16.02.2015