MediaWiki:Gadget-wdpl.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.
(function(mw, $){
if (location.search.match(/[?&]printable=yes/)){
return;
}
if (!mw.config.get("wgIsArticle")){
return;
}
if (!mw.config.get("wgArticleId")){
return;
}
var classNoEntity = "wd-missing";
var classNoLabel = "wd-no-label";
var classNoDescription = "wd-no-description";
var nsFilter = "0";
var langFilter = "pl";
var siteFilter = "plwiki";
var api = new mw.Api();
var wdApi = new mw.ForeignApi('https://www.wikidata.org/w/api.php');
var applyClassToLinks = function(newClass, links){
if (links.length) {
for(var i=0; i < links.length; i++){
var title = mw.html.escape(links[i]);
var linkSelector = 'a[title="'+title+'"]:not([class])';
var selector='.mw-parser-output '+linkSelector;
$(selector).addClass(newClass);
}
}
};
var loadLinks_Start = function(){
var links = [];
var loadLinks_Continue = function(next){
api.post({
action: 'query',
titles: mw.config.get("wgPageName"),
prop: 'links',
pllimit: 500,
plnamespace: nsFilter,
plcontinue: next,
format: 'json',
}).done(loadLinks_Read);
};
var loadLinks_Read = function(data){
var retrievedLinks = data.query.pages[mw.config.get("wgArticleId")].links;
if (retrievedLinks) {
links = [].concat(links, retrievedLinks);
}
if (data['continue']) {
loadLinks_Continue(data['continue'].plcontinue);
} else {
loadLinks_Completed(links);
}
};
api.post({
action: 'query',
titles: mw.config.get("wgPageName"),
prop: 'links',
pllimit: 500,
plnamespace: nsFilter,
format: 'json',
}).done(loadLinks_Read);
};
var loadLinks_Completed = function(links){
var nowd = [];
var props = [];
var loadWikibaseProps = function(items){
var result = api.post({
action: 'query',
titles: items.join('|'),
prop: 'pageprops',
ppprop: 'wikibase_item',
format: 'json',
});
result.done(function(data){
if (data['continue']){
mw.log("WDMORE query wd prop retrieved - incomplete!");
}
var retrievedProps = data.query.pages;
if (retrievedProps) {
for (var key in retrievedProps) {
if (retrievedProps.hasOwnProperty(key)) {
var obj = retrievedProps[key];
if (!obj.pageid){
// red link
}else if(!obj.pageprops){
nowd.push(obj.title);
}else{
props.push(obj);
}
}
}
}
});
return result;
};
var maxChunkSize = 50;
var chunks = Math.floor((links.length + maxChunkSize - 1) / maxChunkSize);
var requests = [];
for (var i = 0; i < chunks; i++) {
var startIndex = i * maxChunkSize;
var stopIndex = (startIndex + maxChunkSize) < links.length ? startIndex + maxChunkSize : links.length;
var titles = [];
for(var j = startIndex; j < stopIndex; j++){
titles.push(links[j].title);
}
requests.push(loadWikibaseProps(titles));
}
$.when.apply($, requests).done(function(){
applyClassToLinks(classNoEntity, nowd);
loadLabelsAndDescriptions(props);
});
};
var loadLabelsAndDescriptions = function(props){
var nolabel = [];
var nodesc = [];
var loadEntities = function(items){
var result = wdApi.post({
action: 'wbgetentities',
ids: items.join('|'),
props: 'labels|descriptions|sitelinks',
languages: langFilter,
sitefilter: siteFilter,
format: 'json',
});
result.done(function(data){
if (!data.success){
mw.log("WDMORE query wd entities retrieved - failed!");
}
for(var i=0; i < items.length; i++){
var key = items[i];
var obj = data.entities[key];
var o = {
title: obj.sitelinks[siteFilter].title,
};
if (obj.labels && obj.labels[langFilter]){
o.label = obj.labels[langFilter].value;
}
if (obj.descriptions && obj.descriptions[langFilter]){
o.desc = obj.descriptions[langFilter].value;
}
if (!o.label){
nolabel.push(o.title);
}
if (!o.desc){
nodesc.push(o.title);
}
}
});
return result;
};
var maxChunkSize = 50;
var chunks = Math.floor((props.length + maxChunkSize - 1) / maxChunkSize);
var requests = [];
for (var i = 0; i < chunks; i++) {
var startIndex = i * maxChunkSize;
var stopIndex = (startIndex + maxChunkSize) < props.length ? startIndex + maxChunkSize : props.length;
var wbItems = [];
for(var j = startIndex; j < stopIndex; j++){
wbItems.push(props[j].pageprops.wikibase_item);
}
requests.push(loadEntities(wbItems));
}
$.when.apply($, requests).done(function(){
applyClassToLinks(classNoLabel, nolabel);
applyClassToLinks(classNoDescription, nodesc);
});
};
loadLinks_Start();
})(mediaWiki, jQuery);