MediaWiki:Gadget-Nav.js

Материал из Викитропов
Перейти к навигации Перейти к поиску
Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения
Как это сделать:
  • Firefox/Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить, либо нажмите Ctrl+F5 или Ctrl+R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Opera: Перейдите в Menu → Настройки (Opera → Настройки на Mac), а затем Безопасность → Очистить историю посещений → Кэшированные изображения и файлы
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить, либо нажмите Ctrl+F5, потом преодолейте свою лень и скачайте наконец из интернета браузер.
/**
 * Gadget-Nav.js (v2.0 Final)
 * Динамически загружает навигационные блоки на основе категорий.
 * Выделяет жирным название текущей страницы и убирает с него ссылку.
 *
 * Для использования в шаблоне: <div class="auto-nav" data-cat="Имя категории">Загрузка...</div>
 */
(function (mw, $) {
  function runAutoNav() {
    var navBlocks = document.querySelectorAll('div.auto-nav');
    if (!navBlocks.length) return;

    // Получаем название текущей страницы ОДИН РАЗ, чтобы не делать это в цикле.
    const currentPageTitle = mw.config.get('wgTitle');
    var api = new mw.Api();

    navBlocks.forEach(function (block) {
      var categoryName = block.dataset.cat;
      if (!categoryName || categoryName.trim() === '') {
        block.textContent = 'Ошибка: имя категории (data-cat) не указано.';
        block.classList.add('auto-nav-error');
        return;
      }

      api.get({
        action: 'query',
        list: 'categorymembers',
        cmtitle: 'Category:' + categoryName,
        cmlimit: 'max',
        cmprop: 'title',
        format: 'json'
      }).done(function (data) {
        var members = data.query && data.query.categorymembers;
        if (!members || members.length === 0) {
          block.textContent = 'Категория «' + categoryName + '» пуста или не найдена.';
          block.classList.add('auto-nav-empty');
          return;
        }

        var list = document.createElement('dl');
        list.className = 'auto-nav-list';
        
        members.forEach(function (page) {
          var listItem = document.createElement('dd');

          // --- ГЛАВНОЕ ИЗМЕНЕНИЕ ЗДЕСЬ ---
          if (page.title === currentPageTitle) {
            // Если название страницы из API совпадает с текущей, создаем <strong>
            var strongTag = document.createElement('strong');
            strongTag.className = 'selflink'; // Стандартный класс MediaWiki для таких случаев
            strongTag.textContent = page.title;
            listItem.appendChild(strongTag);
          } else {
            // В противном случае, как и раньше, создаем ссылку <a>
            var link = document.createElement('a');
            link.href = mw.util.getUrl(page.title);
            link.textContent = page.title;
            listItem.appendChild(link);
          }
          // --- КОНЕЦ ИЗМЕНЕНИЯ ---

          list.appendChild(listItem);
        });

        block.innerHTML = '';
        block.appendChild(list);
        block.classList.add('auto-nav-loaded');

      }).fail(function () {
        block.textContent = 'Ошибка API при загрузке навигации.';
        block.classList.add('auto-nav-error');
      });
    });
  }

  // Запускаем скрипт после полной загрузки DOM
  $(runAutoNav);

})(mediaWiki, jQuery);