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();
}
});