IncludeShifted — это расширение для MediaWiki (совместимо с версиями 1.39+ и современным парсером Parsoid), которое позволяет строить сложные иерархические документы по принципу SGML/DocBook.
Расширение автоматически вычисляет контекст и сдвигает уровни заголовков во включаемых статьях (трансклюзиях) так, чтобы они логически вкладывались в родительский раздел.
- Стандартный синтаксис: Используется штатный механизм трансклюзий
{{:Название_статьи}}. Никаких кастомных функций парсера, магических слов. - Целостность базы данных: MediaWiki корректно записывает связи в таблицу
templatelinks. Кнопка «Ссылки сюда» и отслеживание использования шаблонов работают безупречно. Совместимо с концепциями ссылок — то есть будет устойчиво к переименованиям включаемых статей, и можно отслеживать, кто включает и использует эту статью. - Поддержка VisualEditor: Стандартные трансклюзии корректно отображаются и редактируются в визуальном редакторе.
- DOM-ориентированность: Сдвиг заголовков (тегов
<hN>и классовmw-headingNдля новых скинов) происходит на этапе генерации финального HTML, что позволяет обходить ограничения нового конвейера парсинга и избегать поломок при обработке сложного вики-текста.
- Перенесите папку
IncludeShiftedв директориюextensions/вашей установки MediaWiki. - Добавьте следующую строку в конец вашего файла
LocalSettings.php:wfLoadExtension( 'IncludeShifted' );
Расширение поддерживает три уровня применения адаптивного сдвига заголовков.
Для включения адаптивного сдвига только для одной трансклюзии, добавьте параметр shift_headings=1:
== Основной раздел 2 уровня ==
Какой-то текст...
{{:Моя_подстатья|shift_headings=1}}Если в Моя_подстатья есть заголовки == (2 уровня), они автоматически превратятся в === (3 уровень) при отображении в родительской статье.
Если в статье много трансклюзий, и вы хотите сделать их все адаптивными, используйте глобальный триггер для всей страницы:
- Добавьте в любое место страницы «магическое слово»
__AUTOSHIFT__или определите переменную (требуется установленное расширениеVariables):{{#vardefine:auto_shift|1}} == Раздел А == {{:Подстатья_1}} === Подраздел А.1 === {{:Подстатья_2}}
В данном примере заголовки в Подстатья_1 сдвинутся относительно ==, а в Подстатья_2 вычислят контекст и сдвинутся относительно ===.
Если требуется, чтобы любая трансклюзия статьи в базе знаний всегда пыталась адаптировать свои заголовки к родительскому контенту, добавьте конфигурацию в LocalSettings.php:
$wgAutoHeadShift = true;
(При включении этой настройки использовать параметры shift_headings или триггеры auto_shift в статьях больше не нужно).
Если ранее на вашей вики использовался устаревший пользовательский тег <enableheadshift> от патчей проекта MediaWiki4IntraNet, в расширение встроен maintenance-скрипт для бесшовной миграции базы данных.
Скрипт
- автоматически найдет все статьи с тегом
<enableheadshift>, - аккуратно удалит его
- (опционально) проставит переменные
auto_shiftво все родительские статьи, которые ссылаются на данную.
- (опционально) проставит переменные
Миграция выполняется от имени системного бота с правами sysop, сохраняя полную историю правок.
Запуск проверки без записи в базу (Dry Run):
MW_INSTALL_PATH=/путь/к/mediawiki \
php /путь/к/mediawiki/maintenance/run.php extensions/IncludeShifted/maintenance/migrateHeadShift.php --dry-runБоевой запуск (Только очистка тегов):
(Рекомендуется, если вы включили глобальную настройку $wgAutoHeadShift = true)
MW_INSTALL_PATH=/путь/к/mediawiki \
php /путь/к/mediawiki/maintenance/run.php extensions/IncludeShifted/maintenance/migrateHeadShift.php
Боевой запуск (С инъекцией локальных триггеров):
(Рекомендуется, если глобальная настройка выключена. Скрипт добавит {{#vardefine:auto_shift|1}} во все включающие статьи)
MW_INSTALL_PATH=/путь/к/mediawiki \
php /путь/к/mediawiki/maintenance/run.php extensions/IncludeShifted/maintenance/migrateHeadShift.php --inject-triggers
Расширение покрыто интеграционными тестами PHPUnit для автоматической проверки логики математического сдвига и работы триггеров.
Для запуска тестов используйте стандартный механизм из директории MediaWiki:
php vendor/bin/phpunit extensions/IncludeShifted/tests/phpunit/IncludeShiftedTest.php
- Хук
ParserBeforeInternalParseобнаруживает триггеры и временно оборачивает конструкцию{{:Статья}}в уникальный HTML-блок (с сохранением\nдля корректного парсинга внутренних блоков). - Парсер MediaWiki штатно обрабатывает шаблон, подгружает контент, строит кэш и регистрирует связи.
- Хук
ParserAfterParseв итоговом HTML находит наши обертки, регулярными выражениями сканирует предыдущий заголовок родителя, вычисляет математическую дельту и обновляет теги<hN>и классыmw-headingNвнутри обертки. Затем обертка бесследно удаляется.