Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
// Додає до редактора кнопку швидкого створення заготовки статті про кінозірку
// 

jQuery(function ($) {
	if(mw.config.get('wgAction') != 'edit') return;

	var start = function() {
		insert_button();
	};
	
    var sparql = function(query, cb) {
		$.get(
			'https://query.wikidata.org/bigdata/namespace/wdq/sparql',
			{
				query: query,
				format: 'json'
			},
			function(res) {
				cb(res.results.bindings);
			}
		);
	};
	var wd = document.getElementById('t-wikibase').getElementsByTagName('a')[0].href.split('/')[5];
	var filmographyQuery = `
		SELECT ?typeLabel (YEAR(MIN(?dates)) AS ?date) ?ukLabel ?enLabel ?ukArticle ?enArticle ?role
	    WHERE
	    {
	        ?item wdt:P161 wd:${wd}.
	        ?item wdt:P577 ?dates .
	        ?item wdt:P31 ?type.
	        OPTIONAL { 
	          	?item rdfs:label ?ukLabel filter(lang(?ukLabel) = "uk")
	        }
	        ?enArticle schema:about ?item.
	        ?enArticle schema:inLanguage "en" .
	        ?enArticle schema:isPartOf <https://en.wikipedia.org/>.
	      
	        OPTIONAL {
	            ?ukArticle schema:about ?item.
	            ?ukArticle schema:inLanguage "uk" .
	            ?ukArticle schema:isPartOf <https://uk.wikipedia.org/>.
	        }
	
	        ?item rdfs:label ?enLabel filter(lang(?enLabel) = "en")
	        SERVICE wikibase:label { bd:serviceParam wikibase:language "uk,en" }
	    }  GROUP BY ?ukLabel ?enLabel ?typeLabel ?item ?ukArticle ?enArticle ?role ORDER BY ?date
	`;
	console.log(filmographyQuery);
	
	var insert_snippet = function() {
		sparql(filmographyQuery, function onLoad(res) {
			console.log('Sparql response:', res);
			var article = formatFilmography(res);
			// залишити старий вміст
			article = document.editform.wpTextbox1.value + '\n' + article;
			// і додати все разом в редактор
			document.editform.wpTextbox1.value = article;
		});
	};
	
	var insert_button = function () {
		$('#wpTextbox1').wikiEditor('addToToolbar', {
			section: 'main',
			group: 'insert',
			tools: {
				"moviestar": {
					label: 'Заготовка статті про кінозірку',
					type: 'button',
					icon: '//upload.wikimedia.org/wikipedia/commons/thumb/3/31/Walk_of_Fame_Category_Motion_Pictures.jpg/22px-Walk_of_Fame_Category_Motion_Pictures.jpg',
					action: {
		           		type: 'callback',
		                execute: insert_snippet,
					}
				}
			}
		});
	};

	var import_script = function(name, callback) {
		$.getScript(
			'https://uk.wikipedia.org/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87:Bunyk/'
			 + name + '&action=raw&ctype=text/javascript',
			callback
		);
	};
	
	import_script('utils.js', start());

	var type2template = {
	    'кінофільм': 'УФільмі',
	    'міні-серіал': 'УСеріалі',
	    'телесеріал': 'УСеріалі',
	    'Телефільм': 'УтФільмі',
	    'Короткометражне кіно': 'УкФільмі',
	    'короткометражне німе кіно': 'УкФільмі',
	    'німе кіно': 'УФільмі',
	    'мультфільм': 'УмФільмі',
	    'повнометражний фільм': 'УФільмі'
	};

	
	function articleName(url) {
	    return decodeURI(url.split('/wiki/')[1]).replace(/_/g, ' ');
	}
	
	function ukLinkOrNP(item) {
	    var ukArticle, enArticle, ukLabel, enLabel;
	
	    if(item.enArticle) {
	        enArticle = articleName(item.enArticle.value);
	    }
	    if(item.ukArticle) {
	        ukArticle = articleName(item.ukArticle.value);
	    }
	    if(item.enLabel) {
	        enLabel = item.enLabel.value;
	    }
	    if(item.ukLabel) {
	        ukLabel = item.ukLabel.value;
	    }
	    console.log(item);
	    if(ukArticle) {
	        if(ukLabel) {
	            return '[[' + ukArticle + '|' + ukLabel + ']]';
	        } else {
	            return '[[' + ukArticle + ']]';
	        }
	    } else {
	        if(enArticle) {
	            return '{{нп|' + (enLabel || enArticle) + '||en|' + enArticle + '}}';
	        }
	    }
	}
	
	function formatFilmography(filmography) {
	    var text = '== Фільмографія ==\n';
	    text += '{{УФільміВерх}}\n';
	    for(var i=0; i<filmography.length; i++) {
	        var item = filmography[i];
	        console.log(item);
	        var template = type2template[item.typeLabel.value] || 'УФільмі';
	        text += ('{{'
	            + template + '|' + (template == 'УСеріалі' ? '|':'')
	            + item.date.value + '|'
	            + ukLinkOrNP(item) + '|' 
	            + item.enLabel.value + '|'
	            + '}}\n'
	        );
	    }
	    text += '{{УФільміНиз}}';
	    return text;
	}

});