MediaWiki:Common.js

Материал из Фан-вики Лик Души
Версия от 23:23, 3 октября 2026; Kadijoller (обсуждение | вклад) (Новая страница: «→Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице: →Счётчик тем на вкладке "Обсуждение": $( function () { var namespace = mw.config.get( 'wgNamespaceNumber' ); var pageName = mw.config.get( 'wgPageName' ); // Не работаем на специальных страницах if ( na...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
/* Счётчик тем на вкладке "Обсуждение" */
$( function () {
    var namespace = mw.config.get( 'wgNamespaceNumber' );
    var pageName = mw.config.get( 'wgPageName' );

    // Не работаем на специальных страницах
    if ( namespace < 0 ) {
        return;
    }

    // Находим вкладку "Обсуждение"
    var talkTab = document.querySelector( '#ca-talk a' );

    if ( !talkTab ) {
        return;
    }

    /*
     * В MediaWiki пространства имён идут парами:
     * 0  -> 1   Основное -> Обсуждение
     * 2  -> 3   Участник -> Обсуждение участника
     * 4  -> 5   Проект -> Обсуждение проекта
     * и т.д.
     *
     * Если мы уже на странице обсуждения,
     * используем её саму.
     */

    var talkPage;

    if ( namespace % 2 === 1 ) {
        // Уже на странице обсуждения
        talkPage = pageName;
    } else {
        // Берём ссылку самой вкладки "Обсуждение".
        // Так мы не зависим от языка пространства имён.
        var href = talkTab.getAttribute( 'href' );

        if ( !href ) {
            return;
        }

        try {
            var url = new URL( href, window.location.origin );

            talkPage =
                url.searchParams.get( 'title' ) ||
                decodeURIComponent(
                    url.pathname.substring(
                        url.pathname.lastIndexOf( '/' ) + 1
                    )
                );
        } catch ( e ) {
            return;
        }
    }

    if ( !talkPage ) {
        return;
    }

    var api = new mw.Api();

    api.get( {
        action: 'parse',
        page: talkPage,
        prop: 'sections',
        formatversion: 2
    } ).done( function ( data ) {

        if ( !data.parse || !data.parse.sections ) {
            return;
        }

        /*
         * Считаем заголовки второго уровня:
         *
         * == Тема обсуждения ==
         *
         * Подзаголовки === ... === в счётчик не попадут.
         */
        var count = data.parse.sections.filter( function ( section ) {
            return Number( section.level ) === 2;
        } ).length;

        if ( count === 0 ) {
            return;
        }

        var badge = document.createElement( 'span' );
        badge.className = 'talk-topic-count';
        badge.textContent = count;
        badge.title =
            count === 1
                ? '1 тема в обсуждении'
                : count + ' тем в обсуждении';

        talkTab.appendChild( badge );
    } );
} );