Користувач:AS/taxon.js

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

  • 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
// У статті з автоматичним таксобоксом, поряд з повідомленням "Бракує шаблону таксономії (створити)" додає посилання "створити автоматично". 
// Тож повідомлення виглядатиме "Бракує шаблону таксономії (створити | створити автоматично)" і
// дозволяє автоматично скопіювати потрібні шаблони таксономії з АнглВікі. Ребдагування будуть виконані з допомогою вашого облікового запису.

window.copier = {
    copyTemplate: function(name){
        name = name.trim();
        if (!name.match(/([Tt]emplate|[Шш]аблон):[Tt]axonomy\/.+/)) {
            name = copier.template(name);
        }
        var enapi = new mw.ForeignApi('https://en.wikipedia.org/w/api.php');
        var api = new mw.Api();
        var wdapi = new mw.ForeignApi('//www.wikidata.org/w/api.php');
        api.get({
            action: 'query',
            titles: name
        }).done(function(data) {
            var ukrainianPageExists = !data.query.pages['-1'];
            if (ukrainianPageExists) return;

            enapi.get({
                action: 'query',
                titles: name,
                prop: 'revisions|pageprops',
                rvprop: 'content'
            }).done(function(data) {
                if (data.query.pages['-1']) { mw.notify('Не знайдено шаблону ' + name + ' в АнглВікі'); return }

                var page = data.query.pages[Object.keys(data.query.pages)[0]];
                var wikibaseItem = page.pageprops && page.pageprops.wikibase_item;

                if (!page.revisions) return;

                var text = page.revisions[0]['*'];
                var sameAs = copier.getSameAs(text);
                if (sameAs) {
                    copier.copyTemplate(sameAs);
                }

                text = copier.strip(text);
                var scientificName = copier.getScientificName(text);
                copier.addUkrainian(text, scientificName, api, function(text){
                	api.create(name, { summary: 'автоматична копія з АнглВікі' }, text).done(function(data){
                    mw.notify($("<span>Створено <a href='" + mw.util.getUrl(name) + "'>" + name + "</a></span>"));

                    if (wikibaseItem) {
                        wdapi.postWithEditToken({
                            action: 'wbsetsitelink',
                            id: wikibaseItem,
                            linktitle: data.title,
                            linksite: 'ukwiki'
                        });
                    } else {
                    	wdapi.postWithEditToken({
                            action: 'wblinktitles',
                            tosite: 'enwiki',
                            totitle: name,
                            fromsite: 'ukwiki',
                            fromtitle: data.title
                        });
                    }
                });

                var parent = copier.stripComments(copier.getParent(text));

                if (parent) {
                    copier.copyTemplate(parent);
                }
                });
            });
        });
    },
    getSameAs: function(x){
        var m = x.match(/same_as\s*=\s*(.+)/);
        if (m) return m[1];
    },
    stripComments: function(x){
        return (x || '').replace(/<!--.*-->/, '');
    },
    getParent: function(x){
        var m = x.match(/parent\s*=\s*(.+)\s*/);
        if (m) return m[1];
    },
    getScientificName: function(x){
    	var m = x.match(/link\s*=\s*(.+)\s*/);
        if (m) {
        	var link = m[1];
        	var linkName = link.match(/(.+)\|(.+)/) 
        	if (linkName) link = linkName[2]
        	return link;
        }
    },
    strip: function(x){
        return x.replace(/<noinclude\>.+<\/noinclude\>/, '');
    },
    addUkrainian: function(x, scientificName, api, onDone){
    	if (scientificName){
    		api.get({
	            action: 'query',
	            titles: scientificName,
	            redirects: true
	        }).done(function(data) {
              var ukrainianPageExists = !data.query.pages['-1'];
	          if (ukrainianPageExists)
	          {
	          	var page = data.query.pages[Object.keys(data.query.pages)[0]];
	          	var ukrainianName = page.title
	          	if (scientificName == ukrainianName)
	          	  onDone(x.replace(/\}\}$/, "|ukrainian=\n}}"));	
	          	else
	          	  onDone(x.replace(/\}\}$/, "|ukrainian=" + ukrainianName + "\n}}"));
	          } 
	          else
	        	onDone(x.replace(/\}\}$/, "|ukrainian=\n}}"));
	        })
    	}
    	else
        	onDone(x.replace(/\}\}$/, "|ukrainian=\n}}"));
    },
    template: function(x){
        return "Template:Taxonomy/" + x;
    },
    init: function(){
	    var taxonomyWarnings = $('span:contains("Бракує шаблону таксономії")').filter(function(){ return $(this).text() === "Бракує шаблону таксономії"; });
	    taxonomyWarnings.each(function(){
	        var parent = $(this).parent();
	        var match = parent.find('.plainlinks a:contains("створити")').attr('href').match(/title=(.+)&/);
	        if (match.length === 0) return;
	        var name = match[1];
	
	        $(this).parent().find('.plainlinks').append(' | ');
	        var button = $('<a data-name="' + name + '">створити автоматично</a>');
	        button.on('click', function(){
	            copier.copyTemplate(name);
	        });
	        parent.find('.plainlinks').append(button);
	    });
	}
};

$(function(){
    setTimeout(function(){
            mw.loader.using(['oojs-ui', 'mediawiki.api'], function(){
                copier.init();
            });
    }, 1000);
});