MediaWiki:Gadget-wikipedia-backlinks.js

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
/**
 * A gadget to show the backlinks from Wikipedia to the current page.
 * 
 * @author [[pl:User:Msz2001]]
 */
$(function () {

    /**
     * Returns a promise resolving to all titles of the current page.
     * @returns {JQuery.Promise<string[]>} The array consisting of actual title and all redirects.
     */
    function getAllTitles() {
        var deferred = $.Deferred();

        var params = {
            format: 'json',
            formatversion: 2,
            action: 'query',
            prop: 'redirects',
            rdlimit: 'max',
            titles: mw.config.get('wgPageName')
        };

        var api = new mw.Api();
        api.get(params).done(function (data) {
            var pages = data.query.pages;
            var page = Object.values(pages)[0];
            var redirects = page.redirects || [];

            var redirectTitles = [mw.config.get('wgPageName')];
            redirects.forEach(function (redirect) {
                redirectTitles.push(redirect.title.replace(/ /g, '_'));
            });

            deferred.resolve(redirectTitles);
        }).fail(function () {
            deferred.reject();
        });

        return deferred.promise();
    }

    /**
     * Fetches the backlinks for the given page.
     * @param {string} targetPage The title of the page to fetch the backlinks for.
     * @returns {JQuery.Promise}
     */
    function getInterwikiBacklinks(targetPage) {
        var deferred = $.Deferred();

        var params = {
            format: 'json',
            formatversion: 2,
            action: 'query',
            list: 'iwbacklinks',
            iwbllimit: 'max',
            iwblprefix: 'n',
            iwbltitle: targetPage,
            iwblprop: ['iwtitle', 'iwprefix']
        };

        var api = new mw.ForeignApi('https://pl.wikipedia.org/w/api.php');
        api.get(params).done(function (data) {
            var backlinks = data.query.iwbacklinks;
            deferred.resolve(backlinks);
        }).fail(function () {
            deferred.reject();
        });

        return deferred.promise();
    }

    /**
     * Displays the backlinks under the page title.
     * @param {object[]} backlinks The array of backlinks (as obtained from the API)
     */
    function displayBacklinks(backlinks) {
        var numberOfBacklinks = backlinks.length;
        var infoWrapper = $('<div>').addClass('wikipedia-backlinks');

        if(numberOfBacklinks == 0) {
            infoWrapper.text('Brak linków z Wikipedii do tej strony.');
        } else {
            infoWrapper.text(numberOfBacklinks + plural(numberOfBacklinks, ' link', ' linki', ' linków') + ' z Wikipedii: ');

            for(var i = 0; i < numberOfBacklinks; i++) {
                var backlink = backlinks[i];
                var link = $('<a>');
                link.attr('href', 'https://pl.wikipedia.org/wiki/' + backlink.title);
                link.text(backlink.title);
                infoWrapper.append(link);
                infoWrapper.append(i + 1 < numberOfBacklinks ? ', ' : '.');
            }
        }

		if(!document.getElementById('contentSub'))
			$('<div id="contentSub"></div>').insertBefore('#mw-content-text');
        $('#contentSub').prepend(infoWrapper);
    }

    /**
     * Function that returns the correct form of a plural, depending on the number of items.
     * @param {number} number The number of items.
     * @param {string} one The singular form of the word.
     * @param {string} two The plural form of the word when the number ends with 2-4.
     * @param {string} five The plural form of the word.
     */
    function plural(number, one, two, five) {
        if(number == 1) return one;

        if(number % 10 <= 1 || number % 10 >= 5) return five;
        if(number % 100 >= 12 && number % 100 <= 14) return five;

        return two;
    }

    function init() {
        // Get the titles of the current page and then backlinks for all of them.
        getAllTitles().done(function (redirectTitles) {
            var promises = [];
            var allBacklinks = [];

            // Fetch all backlinks for all redirects
            redirectTitles.forEach(function (redirectTitle) {
                promises.push(getInterwikiBacklinks(redirectTitle).done(function (backlinks) {
                    allBacklinks = allBacklinks.concat(backlinks);
                }));
            });

            // Display the backlinks after all promises are resolved
            $.when.apply($, promises).done(function () {
                displayBacklinks(allBacklinks);
            });
        });
    }

    // Test if we are in the main namespace or category.
    if((mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgNamespaceNumber') == 14) && !mw.config.get('wgIsMainPage')) {
        init();
    }
});