Користувач:Bunyk/wikifixer.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
// Додає до редактора кнопку що автоматично покращує розміту. (Краще за вікіфікатор :)
// Корисно для тестування регулярних виразів: 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\]\] \[\[\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');
}
}
}
}
});
});