Користувач:Bunyk/PavloChemBotFixer.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
// <nowiki>
if (typeof module !== 'object') { // browser:
(function ($, mw) {
    'use strict';
    var api = new mw.Api();
    
    var missing_pages =[];
    try {
        missing_pages = JSON.parse(localStorage.missing_pages);
    } catch (e) {}

    if(!onErrorsPage()) {
        $('a.extiw').each(function() {
            var title = $(this).attr('title');
            if(missing_pages.indexOf(title) != -1) {
                $(this).append(
                    '<span>!!!</span>'
                ).css('color', '#ba0000');
            }
        });
    }

    $('span[title="Шаблон «не перекладено» не замінено"]').each(function() {
        var link = $(this).prev();
        var title = link.html();
        var href = decodeURIComponent(link.attr('href').slice('/wiki/'.length));
        var page = (new mw.Title(href)).getPrefixedText();

        var button = $('<button>->[[]]</button>');
        button.click(function() {
            button.prop('disabled', true);
            api.edit(
                mw.config.get('wgPageName'),
                function ( revision ) {
                    var new_text = remove_template(revision.content, page);
                    return {
                        text: new_text,
                        summary: '-[[Шаблон:нп]] для [[' + page + ']]',
                        minor: true
                    };
                }
            ).then( function (res) {
                if(res.nochange) {
                    button.html('Не змінено');
                } else {
                    button.html('Збережено');
                }
            } );
        });
        $(this).append(button);
    });


    if (!onErrorsPage()) {
        return;
    }
    $(function() {
    	console.log("Завантажено сторінку з помилками")
        var missing_pages = [];
        $("td:contains('Не знайдено сторінки') a").each(function() {
            var contents = $(this).html();
            if(missing_pages.indexOf(contents) == -1) {
                missing_pages.push(contents);
            }
        });
        localStorage.missing_pages = JSON.stringify(missing_pages);
        
        var to_hide = {};
		try {
			to_hide = JSON.parse(localStorage.error_pages_to_hide);
		} catch (e) {
			console.log(e);
		}
		$('tr td:nth-child(3)').each(function() {
			var jthis = $(this);
			var firstCell = jthis.parent().children().first();
			var title = firstCell.find('a').attr('title');

			var hide = function(anim) {
				var rows = 1;
				if (firstCell.attr('rowspan')) {
					rows = +firstCell.attr('rowspan');
				}
				var to_hide = jthis.parent();
				while (rows > 0) {
					if (anim) {
						to_hide.fadeOut();
					} else {
						to_hide.hide();
					}
					to_hide = to_hide.next();
					rows--;
				}
			};
			if (to_hide[title]) {
				var unhideButton = $('<button title="Таки треба">Показати ' + title + '</button>');
				unhideButton.click(function() {
					delete to_hide[title];
					localStorage.error_pages_to_hide = JSON.stringify(to_hide);
					jthis.parent().fadeIn();
					unhideButton.fadeOut();
				});
				$('.mw-parser-output').append(unhideButton);
				hide(false);
				return;
			}
            var button = $('<button title="Тося зробит">x</button>');
			button.click(function() {
				to_hide[title] = true;
				localStorage.error_pages_to_hide = JSON.stringify(to_hide);
				hide(true);
			});
			jthis.append(button);
		});

        $("td:contains('хоча хотіли')").each(function() {
            var contents = $(this).html();
            var links = $('<p>' + contents + '</p>').find('a');
            if(links.length != 3 && links.length != 4) {
                return;
            }
            var last = links.length - 1;
            var required = links[last].text;
            if(!$(links[last]).hasClass('new')) {
                // Link is not red
                return;
            }
            var exists = links[last - 1].text;
            var button = $('<button><- Перенаправити</button>');
            button.click(function() {
                button.prop('disabled', true);
                if(confirm('Перенаправити "' + required + '" -> "' + exists + '" ?')) {
                    api.create(required, {}, '#ПЕРЕНАПРАВЛЕННЯ [[' + exists + ']]').then(function() {
                        button.html('Створено');
                    }, function() {
                        button.html('Невдача');
                    });
                }
            });
            $(this).append('<br />');
            $(this).append(button);
            
            var button2 = $('<button><- Перенапралення з помилкою</button>');
            button2.click(function() {
                button2.prop('disabled', true);
                if(confirm('Перенаправити "' + required + '" -> "' + exists + '" і позначити як помилку?')) {
                    api.create(required, {}, '#ПЕРЕНАПРАВЛЕННЯ [[' + exists + ']]\n\n{{Перенаправлення з помилки}}').then(function() {
                        button2.html('Створено');
                    }, function() {
                        button2.html('Невдача');
                    });
                }
            });
            $(this).append(button2);
            
            var button3 = $('<button>-> Перейменувати</button>');
            button3.click(function() {
                button3.prop('disabled', true);
                if(confirm('Перейменувати "' + exists + '" на "' + required + '" ?')) {
                    api.postWithEditToken({
                    	action: 'move',
                    	from: exists,
                    	to: required,
                    	movetalk: '1',
                    	reason: prompt(
                    		'Причина',
                    		'[[Користувач:BunykBot/Сторінки з неправильно використаним шаблоном "Не перекладено"|посилання на цю назву]]'
                    	),
                    }).then(function() {
                        button3.html('Перейменовано');
                    }, function() {
                        button3.html('Невдача');
                    });
                }
            });
            $(this).append(button3);
 
        });
        
        
        $("td:contains('з різними елементами вікіданих')").each(function() {
            var contents = $(this).html();
            var links = $('<p>' + contents + '</p>').find('a');
            if(links.length != 2) {
                return;
            }
            var button = $('<button>wikidata-redirect</button>');
            button.click(function() {
                button.prop('disabled', true);
                if(confirm('Приєднати "' + links[0].text + '" до "' + links[1].text + '" ?')) {
                    api.edit(
                    	links[1].text, 
			            function ( revision ) {
			                var text = revision.content;
			                text = text.replace(/#(redirect|перенаправлення)/gi, '$1')
			                text += '\n{{wikidata-redirect}}'
			                return {
			                    text: text,
			                    summary: 'wikidata-redirect',
			                    minor: true
			                };
			            }
			        ).then(function (res) {
			        	alert('ok');
			        });
	            }
	        });
            $(this).append(button);
        });
    });



    function onErrorsPage() {
        return mw.config.get('wgPageName').endsWith('/Сторінки_з_неправильно_використаним_шаблоном_"Не_перекладено"');
    }
}(jQuery, mediaWiki));
} else { // Node:
    var testCases = [{
        text: 'Під час {{Не перекладено|Наступ на Південний Ємен (2015)|південного наступу хуситів||Southern Yemen offensive (2015)}} Саудівська Аравія',
        result: 'Під час [[Наступ на Південний Ємен (2015)|південного наступу хуситів]] Саудівська Аравія',
        page: 'Наступ на Південний Ємен (2015)'
    }, {
        text: '* {{нп|Коледж Брін Мор||ru|Брин-Мор-колледж}}',
        result: '* [[Коледж Брін Мор]]',
        page: 'Коледж Брін Мор'
    }, {
        text: '* {{нп|Technicolor}}',
        result: '* [[Technicolor]]',
        page: 'Technicolor'
    }, {
        text: '* {{не перекладено|треба=Історія|текст=Історія|мова=en|є=History}}',
        result: '* [[Історія]]',
        page: 'Історія',
    }, {
        text: '| {{не перекладено|треба=Грут (Marvel Comics)|текст=Грут|мова=ru|є=Грут}}',
        result: '| [[Грут (Marvel Comics)|Грут]]',
        page: 'Грут (Marvel Comics)',
    }, {
        text: '{{Нп|треба=Покажчик цитування журналів|мова=en|є=Journal Citation Reports}}',
        result: '[[Покажчик цитування журналів]]',
        page: 'Покажчик цитування журналів',
    }, {
        text: '{{iw|розщеплення води|3=en|4=Water splitting}}',
        result: '[[розщеплення води]]',
        page: 'розщеплення води',
	}];
    for(var i=0; i<testCases.length; i++) {
        var tc = testCases[i];
        var res = remove_template(tc.text, tc.page);
        console.assert(res == tc.result, tc.result + '\n is not equal to\n' + res);
    }
}
function quote(str) {
	var s = str.replace(/(?=[\/\\^$*+?.()|{}[\]])/g, "\\")
		.replace(/ /g, '[_ ]');
	s = '[' + s[0].toUpperCase() + s[0].toLowerCase() + ']' + s.slice(1);
	return '(' + s + ')';
}

function remove_template(text, page_name) {
	var templatePrefix = '{{\\s*([Нн]п5?|[Нн]е перекладено|iw2?)\\s*\\|\\s*';
	var templatePrefixWithName = templatePrefix + quote(page_name) + '\\s*';
	return text.replace(
		rg(templatePrefixWithName + '\\|[34]\\s*=\\s*\\w+\\|[34]\\s*=.*?}}'),
		'[[$2]]'
	).replace(
		rg(templatePrefixWithName + '(\\|[^|]*?)(\\|.*?)?}}'),
		'[[' + page_name + '$3]]'
	).replace(
		rg(templatePrefixWithName + '}}'),
		'[[' + page_name + ']]'
	).replace(
		rg(templatePrefix + 'треба\\s*=\\s*' + quote(page_name) + '\\s*\\|\\s*текст\\s*=\\s*([^|]+).*?}}'),
		'[[' + page_name + '|$3]]'
	).replace(
		rg(templatePrefix + 'треба\\s*=\\s*' + quote(page_name) + '\\s*\\|.*?}}'),
		'[[' + page_name + ']]'
	).replace(
		/\|\]\]/g,
		']]'
	).replace(
		/\[\[([^|\]]+)\|\1\]\]/g,
		'[[$1]]'
	);
}

// Build a global regexp
function rg(pattern) {
	//console.log(pattern);
	return new RegExp(pattern, 'g');
}
// </nowiki>