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

  • 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
// Додає до редактора кнопку що автоматично покращує розміту. (Краще за вікіфікатор :)

// Корисно для тестування регулярних виразів: https://regex101.com/
jQuery(function ($) {

if(mw.config.get('wgAction') != 'edit') return;

if(!$('#wpTextbox1').wikiEditor) return;

var improve = function() {
	fix_in_quality();
	apply_change(fix_booksources, 'оформлення ISBN');
	apply_change(fix_external_wikilinks, 'заміна зовнішніх вікіпосилань внутрішніми');
	apply_change(fix_np, 'заміна неперекладених посилань шаблоном');
	apply_change(fix_ref_names, 'атрибути в лапки');
	apply_change(fix_filmography, 'оформлення фільмографії');
	apply_change(remove_spam, 'прибирання спаму');
	apply_change(fix_name_tmpl, 'вікіфікація');
	apply_change(function(m) {return m.replace(/<nowiki\/>/g, '')}, 'прибирання зайвих тегів nowiki');
	apply_change(simplify_wikilink, 'оформлення');
	apply_change(fix_headings_formatting, 'оформлення');
	// apply_change(fix_refs, 'впорядкування іменованих зносок');
};
var fix_headings_formatting = function(wikimarkup) {
	return wikimarkup.replace(/^(=+)\s*'*(.*?)'*\s*=+$/gm, '$1 $2 $1');
};

var simplify_wikilink = function(wikimarkup) {
	return wikimarkup.replace(/\[\[([^|\]]+)\|\1\]\]/g, '[[$1]]');
};

var remove_spam = function(wikimarkup) {
	return wikimarkup.replace(/\n.*znaimo.com.ua.*\n/, '\n');
};

var fix_name_tmpl = function(wikimarkup) {
	return wikimarkup.replace(
		/{{[Nn]ame\|([^\|]+)\|\|([^\|}]+)}}/g,
		'[[:$2:$1|$1]]'
	).replace(
		/{{[Nn]ame/g, '{{нп'
	);
};

var fix_in_quality = function() {
	var old_value = document.editform.wpTextbox1.value;
	document.editform.wpTextbox1.value = old_value.replace(
		/[ \.\,\;\(\"\«\]][ву] +якості/,
		' як <!--G-->'
	);
	
	if(document.editform.wpTextbox1.value != old_value) { // if changed
		// add comment
		if(document.editform.wpSummary.value.trim()) {
			document.editform.wpSummary.value += ', ';
		}
		document.editform.wpSummary.value += 'в якості -> як';
	}
};

var fix_filmography = function(wikimarkup) {
	return wikimarkup.replace(
		/{{ВФильмеВерх}}/g, '{{УФільміВерх}}'
	).replace(
		/{{ВФильмеНиз}}/g, '{{УФільміНиз}}'
	).replace(
		/{{ВСериале/g, '{{УСеріалі'
	).replace(
		/{{ВФильме/g, '{{УФільмі'
	).replace(
		/{{ВтФильме/g, '{{УтФільмі'
	).replace(
		/{{ВкФильме/g, '{{УкФільмі'
	);
};

var fix_booksources = function(wikimarkup) {
    // [.../Special:BookSources/1740480503 ISBN 1..]- > ISBN 1..
    return wikimarkup.replace(
    	/Служебная:\s*Источники[_ ]книг/g, 
    	'Special:BookSources'
    ).replace(
    	/\[\[International Standard Book Number\|ISBN\]\]/g, '[[ISBN]]'
    ).replace(
        /\[\S+Special:\s*BookSources\/[\dX]+\s+(ISBN\s+[^\]]+)\]/g, '$1'
    ).replace(
        /\[\[\S*Special:\s*BookSources\/[\dX]+\|(ISBN\s+[^\]]+)\]\]/g, '$1'
    ).replace(
    	/\[\[ISBN\]\]&nbsp;\[\[\S+BookSources\/[\dX]+\|(\d+)\]\]/g, 'ISBN $1'
    );
};

var fix_external_wikilinks = function(wikimarkup) {
	// Замінити [//en.wikipedia.org/wiki/Knight_High_School Старшу лицарську школу]
    // на [[:en:Knight High School|Старшу лицарську школу]]
    
    var substitution = function(match, p1, p2, p3, p4) {
        return '[[:' + p2 + ':' + decodeURIComponent(p3).replace(/_/g, ' ') + '|' + p4 + ']]';
    };

	return wikimarkup.replace(
        /\[([Hh]ttps?:)?\/\/(\w{2}).wikipedia.org\/wiki\/(\S+)\s+([^\]]+)\]/g,
        substitution
	).replace(
		/\[([Hh]ttps?:)?\/\/(\w{2}).wikipedia.org\/w\/index\.php\?title=([^& ]+)[^ ]*\s+([^\]]+)\]/g,
		substitution
	).replace(
		/<ref>.*?([Hh]ttps?:)?\/\/(\w{2}).wikipedia.org\/w\/index\.php\?title=([^& ]+).*?\|title=([^|]+).*?<\/ref>/g,
		substitution
	);
};

var fix_np = function(wikimarkup) {
	// Замінити [[:en:Article|asfd]] на {{нп|Article|asfd|en|Article}}
	return wikimarkup.replace(
		/\[\[:?w:(\w{2}):/g,
		'[[:$1:'
	).replace(
		/\[\[([^\]\|]+)\|([^\]\|]+)\]\]\s*<sup>\s*\(?\s*\[\[:(\w+):([^\|]+)\|[^\]]+\]\]\)?\s*<\/sup>/g,
		'{{нп|$1|$2|$3|$4}}'
	).replace(
		/\[\[([^\]\|]+)\]\]\s*<sup>\s*\(?\s*\[\[:(\w+):([^\|]+)\|[^\]]+\]\]\)?\s*<\/sup>/g,
		'{{нп|$1||$2|$3}}'
	).replace(
		/\[\[\s*:\s*(\w{2})\s*:\s*([^\]\|]+)\|?([^\]]+)?\]\]/g,
		'{{нп|$2|$3|$1|$2}}'
	);
};

var fix_ref_names = function(wikimarkup) {
	// атрибути мають бути в лапках
	return wikimarkup.replace(
		/<ref\s+name\s*=\s*(\w*)\s*>/g,
		'<ref name="$1">'
	);
};

var fix_refs = function(wikimarkup) {
	// Виправляє помилку "назва визначена кілька разів з різним вмістом"
	
    var ref_reg = /<ref\s+name\s*=\s*"([^"]+?)"\s*>([^<]+?)<\/ref>/g;
    var ref_re  = /<ref\s+name\s*=\s*"([^"]+?)"\s*>([^<]+?)<\/ref>/;
    var matches = wikimarkup.match(ref_reg);
    if(!matches) return wikimarkup;
    var refs = {};
    var groups;
    var ln = '\n--------------------------\n';
    var duplications_count = 0;
    for(var i=0; i < matches.length; i++) {
        groups = ref_re.exec(matches[i]);
        if((refs[groups[1]] === undefined) || (refs[groups[1]] == groups[2]) || confirm(
        	'Замінити зноску ' + ln + refs[groups[1]] + ln
        	+ ' на ' + ln + groups[2] + ln + '?'
        )) {
        	if(refs[groups[1]] == groups[2]) duplications_count++;
        	refs[groups[1]] = groups[2]; // get last content found
        }
    }
    if(duplications_count > 0) {
    	alert('Знайдено повторюваних зносок: ' + duplications_count);
    } else {
    	return wikimarkup;
    }
    var reflist = [];
    for(var ref_name in refs) {
        reflist.push('<ref name="' + ref_name + '">' + refs[ref_name] + '</ref>');
    }
    return wikimarkup.replace(ref_reg, '<ref name="$1" />') +
        '\n<references>\n' + reflist.join('\n') + '\n</references>';
};

var apply_change = function(change, comment) {
	var old_value = document.editform.wpTextbox1.value;
	try {
		document.editform.wpTextbox1.value = change(
			document.editform.wpTextbox1.value
		);
	} catch(err) {
		alert('Помилка в зміні "' + comment + '":\n' + err.message);
	}
	
	if(document.editform.wpTextbox1.value != old_value) { // if changed
		// add comment
		if(document.editform.wpSummary.value.trim()) {
			document.editform.wpSummary.value += ', ';
		}
		document.editform.wpSummary.value += comment;
	}
};

$('#wpTextbox1').wikiEditor('addToToolbar', {
	section: 'advanced',
	group: 'format',
	tools: {
		"wikifixer": {
			label: 'Покращити розмітку статті',
			type: 'button',
			icon: '//upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Gnome-devel.svg/22px-Gnome-devel.svg.png',
			action: {
           		type: 'callback',
                execute: function(context) { 
                	improve();
                	$('#wpDiff').trigger('click');
                }
			}
		}
	}
});
});