MediaWiki:Gadget-wdpl.js

Z Wikipedii, wolnej encyklopedii

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