מדיה ויקי:Gadget-Checkty.js – הבדלי גרסאות
מראה
תוכן שנמחק תוכן שנוסף
מאין תקציר עריכה |
מאין תקציר עריכה |
||
שורה 10: | שורה 10: | ||
'checkty-no-replacements': 'הדף מכיל תבנית "ללא בוט" ולכן לא יבוצעו החלפות', |
'checkty-no-replacements': 'הדף מכיל תבנית "ללא בוט" ולכן לא יבוצעו החלפות', |
||
'checkty-disambig-suffix': ' (פירושונים)', |
'checkty-disambig-suffix': ' (פירושונים)', |
||
'checkty-disambig-no-links': ' |
'checkty-disambig-no-links': 'קישורים לפירושונים - לא נמצאו', |
||
'checkty-disambig-success': ' |
'checkty-disambig-success': 'קישורים לפירושונים - הבדיקה הסתיימה בהצלחה.', |
||
'checkty-disambig-links-title': 'הגרסה השמורה האחרונה של הדף מקשרת לדפי פירושונים. אנא תקנו את הקישורים לדפים הבאים: ', |
'checkty-disambig-links-title': 'הגרסה השמורה האחרונה של הדף מקשרת לדפי פירושונים. אנא תקנו את הקישורים לדפים הבאים: ', |
||
'checkty-page-doesnt-exist': ' (הדף אינו קיים)', |
'checkty-page-doesnt-exist': ' (הדף אינו קיים)', |
||
שורה 24: | שורה 24: | ||
'checkty-set-label': 'הזנת תווית עברית ל-$1', |
'checkty-set-label': 'הזנת תווית עברית ל-$1', |
||
'checkty-translate-saved': 'התרגום נשמר!', |
'checkty-translate-saved': 'התרגום נשמר!', |
||
'checkty-empty-parameters': 'דף זה מכיל תבניות עם פרמטרים ריקים. |
'checkty-empty-parameters': 'פרמטרים ריקים - דף זה מכיל תבניות עם פרמטרים ריקים. אם הם אינם רלוונטיים ניתן להסירם. ', |
||
'checkty-empty-parameters-summary': 'ניקוי קוד', |
'checkty-empty-parameters-summary': 'ניקוי קוד', |
||
'checkty-main-articles-merge-summary': 'מיזוג הפניות לערכים מורחבים' |
'checkty-main-articles-merge-summary': 'מיזוג הפניות לערכים מורחבים' |
||
שורה 186: | שורה 186: | ||
} |
} |
||
this.textbox.value = t; |
this.textbox.value = t; |
||
var msg = [' |
var msg = ['החלפות - בוצעו ' + actual_replaced.length + ' החלפות' + (actual_replaced.length==0? '.' : ': ' + actual_replaced.join(', '))]; |
||
if (skip_ar.length) msg.push('החלפות שלא התבצעו בגלל תבנית "ללא בוט": ' + skip_ar.join(', ')); |
if (skip_ar.length) msg.push('החלפות שלא התבצעו בגלל תבנית "ללא בוט": ' + skip_ar.join(', ')); |
||
if(actual_replaced.length) { |
if(actual_replaced.length) { |
||
msg.push('התבצעו ההחלפות הבאות: ' + actual_replaced.join(', ')); |
|||
msg.push(' אנא בצעו "הצגת שינויים" לפני שמירה, כדי לוודא שהסקריפט לא גרם נזק.'); |
msg.push(' אנא בצעו "הצגת שינויים" לפני שמירה, כדי לוודא שהסקריפט לא גרם נזק.'); |
||
} |
} |
||
שורה 254: | שורה 253: | ||
var txt = this.textbox.value; |
var txt = this.textbox.value; |
||
// Format autofix |
// Format autofix |
||
var specials=[], emptyParametersRgx = /\n\|[^|=]+?= *(?=\n(?:\||\}\}))/mg, match, emptyParametersMsg, emptyParametersBtn; |
var specials=[], emptyParametersRgx = /\n *\| *[^|=]+?= *(?=\n(?: *\||\}\}))/mg, match, emptyParametersMsg, emptyParametersBtn; |
||
$(this.formatReplacesConfigSafe).each(function (i, o) { |
$(this.formatReplacesConfigSafe).each(function (i, o) { |
||
txt = txt.replace(o.from, o.to); |
txt = txt.replace(o.from, o.to); |
גרסה מ־22:06, 26 באפריל 2017
// הוספת כפתור "בדיקה" שמבצע החלפות נפוצות של בוט ההחלפות וכן מתריע על בעיות סגנון ועיצוב שונות
// נכתב על ידי [[משתמש:ערן]] ו[[משתמש:קיפודנחש]]
// לעזרה ראו [[mediawiki:Gadget-Checkty.js/הוראות]]
mw.messages.set({
'checkty-large-element': 'בערך קיים אלמנט גדול, רצוי להקטין כדי שיתאים לרזולוציות נמוכות',
'checkty-long-list': 'רשימה ארוכה - נראה כי בערך רשימה של מעל 20 פריטים. כדאי לשקול לפצלה לשני טורים באמצעות תבנית:טורים',
'checkty-long-gallery': 'גלריה ארוכה - הערך מכיל גלריה ארוכה. מומלץ לשקול צמצום שלה או העברה לוויקישיתוף.',
'checkty-waiting-disambig-query': 'ממתין לרשימת פירושונים מהשרת...',
'checkty-warnings-title': 'הערות לבדיקה:',
'checkty-no-replacements': 'הדף מכיל תבנית "ללא בוט" ולכן לא יבוצעו החלפות',
'checkty-disambig-suffix': ' (פירושונים)',
'checkty-disambig-no-links': 'קישורים לפירושונים - לא נמצאו',
'checkty-disambig-success': 'קישורים לפירושונים - הבדיקה הסתיימה בהצלחה.',
'checkty-disambig-links-title': 'הגרסה השמורה האחרונה של הדף מקשרת לדפי פירושונים. אנא תקנו את הקישורים לדפים הבאים: ',
'checkty-page-doesnt-exist': ' (הדף אינו קיים)',
'checkty-dismabig-dialog-title': 'תיקון פירושונים',
'checkty-remove-link': 'הסרת קישור',
'checkty-disambig-meaning': 'מה הכוונה ב "$1" במשפט: ',
'checkty-dismabig-fix-summary': 'תיקון קישור לפירושונים',
'checkty-search': 'חיפוש',
'checkty-fix-numberRangeDash': 'תיקון קווים מפרידים',
'checkty-missing-commons-link': 'בערך זה חסר קישור לוויקישיתוף. ניתן להוסיף קישור באמצעות בחירת המקום הנכון להוספתו בערך ולחיצה על הקישור הבא. ',
'checkty-fairuse-img-replace-template': 'תמונה להחלפה',
'checkty-set-label': 'הזנת תווית עברית ל-$1',
'checkty-translate-saved': 'התרגום נשמר!',
'checkty-empty-parameters': 'פרמטרים ריקים - דף זה מכיל תבניות עם פרמטרים ריקים. אם הם אינם רלוונטיים ניתן להסירם. ',
'checkty-empty-parameters-summary': 'ניקוי קוד',
'checkty-main-articles-merge-summary': 'מיזוג הפניות לערכים מורחבים'
});
var chectTyTool = {
textbox: null,
formatReplacesConfigSafe: [
{
from: /\[\[(File|Image|תמונה):/ig,
to: '[[קובץ:'
}, {
from: /\|thumb(nail)?/ig,
to: '|ממוזער'
}, { //remove unseen character
from: new RegExp('\u200e|\u200f', 'g'),
to: ""
}],
formatReplacesConfig: [{
from: /\[\[(.*?)\|\1([א-ת]*?)\]\]/g,
to: '[[$1]]$2'
}, {
from: /\[\[(.+?)\|([במל])\1\]\]/g,
to: "$2[[$1]]"
}, {
from: /([א-ת]\]?\]?) ?([,\.]) ?(\[?\[?[א-ת]{3})/g,
to: "$1$2 $3"
}, {
from: /([א-ת])\( ?([א-ת])/g,
to: "$1 ($2"
}, {
from: /\t/g,
to: " "
}, {
from: /(\n\n)\n+/g,
to: "$1"
}, {
from: /== ? ?\n\n==/g,
to: "==\n=="
}, {
from: /^ ? ? \n/gm,
to: "\n"
}, {
from: /(?!.{2}\|)[ \t]{2,}/g,
to: ' '
}, {
from: /\n\n\*/g,
to: '\n*'
}],
regexes: [],
ignoreStrings: [],
run: function () {
if (this != chectTyTool) {
chectTyTool.run();
return;
}
var t = $('#wpTextbox1');
this.textbox = t.length ? t[0] : null;
if (!this.textbox || this.textbox.value.length === 0) return;
if (!($('#checktyResults').length)) $('.editButtons').after('<div id="checktyResults"><div class="checktyResultsTitle">'+mw.msg( 'checkty-warnings-title' )+'</div></div>');
//first call to remote functions than to local
this.build_regexes();
this.checkImages();
this.checkGallery();
this.disambigCheck();
this.languageCheck();
this.numberRangeDash(false);
this.mainArticlesMerge();
this.formatReplace();
this.refsConsistencyCheck();
this.ibidWarning();
this.mergeRefs();
this.titleOrderCheck();
this.overlinkify();
this.wikidataLabels();
},
writeMsg: function (msg, icon) {
var x;
if (msg instanceof Array) {
if (msg.length === 0) return;
msg = '<div>' + msg.join('<br/>') + '</div>';
}
x = $(msg).css('display', 'none').addClass('checktyMsg');
if ( icon ) {
var iconWidget = new OO.ui.IconWidget( {
icon: icon,
} );
x.prepend(iconWidget.$element);
}
$('#checktyResults').append(x);
x.show('slow');
return x;
},
build_regexes: function (data) {
if (/\{\{\s*ללא_בוט\s*\}\}/.test(this.textbox.value)) {
this.writeMsg('<div>'+mw.msg( 'checkty-no-replacements' )+'</div>', 'info');
return;
}
if (data) {
var lines = data.split(/\n/);
var clear_nowiki = /\|<nowiki>(.*)<\/nowiki>/;
var matches, regex;
while (lines.length) {
if (!(matches = lines.shift().match(/^\|(\d+)/))) continue;
var num = parseInt(matches[1], 10);
if (!(matches = lines.shift().match(clear_nowiki))) continue;
try {
regex = new RegExp(matches[1], 'g');
} catch (e) {
//ignore
continue;
}
if (!(matches = lines.shift().match(clear_nowiki))) continue;
this.regexes[num] = [regex, matches[1]];
var ignore = lines.shift().replace(/\||<\/?nowiki>/g, '');
ignore = $.trim(ignore);
if (ignore) this.ignoreStrings.push(mw.RegExp.escape(ignore));
}
this.process_page();
} else $.ajax({
url: mw.util.getUrl( (window.replaceListPage || 'ויקיפדיה:בוט/בוט החלפות/רשימת החלפות נוכחית'), { action: 'raw', ctype: 'text/x-wiki' } ),
dataType: 'html',
success: function (data, status) {
chectTyTool.build_regexes(data);
}
});
},
process_page: function () {
var t = this.textbox.value,
skip_dict = {},
skip_ar = [],
actual_replaced = [],
skipmatch = t.match(/{{ללא[_ ]בוט\|\s*(\d+)\s*}}/g), i, match;
if (skipmatch)
for (i = 0; i < skipmatch.length; i++) {
var matches = skipmatch[i].match(/{{ללא[_ ]בוט\|\s*(\d+)\s*}}/);
skip_dict[parseInt(matches[1], 10)] = true;
skip_ar.push(matches[1]);
}
var specials = [];
var ignoreRegex = new RegExp('(' + this.ignoreStrings.join('|') + ')');
while (true) { //extract inner links, inner templates and inner params - we don't want to sptit those.
match = t.match(/(\{\{[^\{\}]*\}\}|(\n|\[\[)(?:File|קובץ|תמונה|Image):.*?[\|\n]|[^\[\0]\[[^\{\}\[]*\])/);
if ((!match || !match.length) && this.ignoreStrings.length ) match = t.match(ignoreRegex);
if (!match || !match.length) break;
specials.push(match[0]);
t = t.replace(match[0], "\0" + specials.length + "\0");
}
for (i in this.regexes)
if (!skip_dict[i] && !isNaN(i))
if (this.regexes[i][0].test(t)) {
var before = t;
t = t.replace(this.regexes[i][0], this.regexes[i][1]);
if (t != before)
actual_replaced.push($.trim(this.regexes[i][1].replace(/\$\d*/g, '')));
}
while (true) {
match = t.match(/\0(\d+)\0/);
if (!match || !match.length) break;
t = t.replace(match[0], specials[parseInt(match[1], 10) - 1]);
}
this.textbox.value = t;
var msg = ['החלפות - בוצעו ' + actual_replaced.length + ' החלפות' + (actual_replaced.length==0? '.' : ': ' + actual_replaced.join(', '))];
if (skip_ar.length) msg.push('החלפות שלא התבצעו בגלל תבנית "ללא בוט": ' + skip_ar.join(', '));
if(actual_replaced.length) {
msg.push(' אנא בצעו "הצגת שינויים" לפני שמירה, כדי לוודא שהסקריפט לא גרם נזק.');
}
this.writeMsg(msg, 'info');
if (actual_replaced.length) chectTyTool.addSummary('סקריפט החלפות (' + actual_replaced.join(', ') + ')');
},
fetchDisambigLinks: function (next) {
var dfd = new jQuery.Deferred();
var api = new mw.Api();
var params = {
action: 'query',
generator: 'links',
titles: mw.config.get('wgPageName'),
prop: 'pageprops',
ppprop: 'disambiguation',
gpllimit: '500',
redirects: 1
};
if (next !== undefined) {
params.gplcontinue = next;
}
api.get(params).done(function (data) {
//extract disambig pages
if (!data.hasOwnProperty('query')) {
dfd.reject();
return;
}
var redirects = {};
if (data.query.redirects) {
$.each(data.query.redirects, function(i,r) { redirects[r.to] = r.from; });
}
var disambigs = [];
for (var pid in data.query.pages) {
var p = data.query.pages[pid];
//list only real disambig links
if (p.pageprops && p.title != mw.config.get('wgTitle') + mw.msg( 'checkty-disambig-suffix' )) {
disambigs.push(redirects[p.title] || p.title);
}
}
if (data['query-continue'] !== undefined) {
var nextReq = chectTyTool.fetchDisambigLinks(data['query-continue'].links.gplcontinue);
nextReq.done(function (more) {
dfd.resolve($.merge(disambigs, more));
});
} else {
dfd.resolve(disambigs);
}
});
return dfd.promise();
},
mainArticlesMerge: function() {
var origTxt = this.textbox.value, txt = this.textbox.value, m;
while (m = /(\{\{הפניה לערך מורחב\|[^=]+?\}\}\n){2,}/g.exec(txt)) {
var articles = [], expArticleRE=/\{\{הפניה לערך מורחב\|([^=]+?)\}\}/g;
while (ma = expArticleRE.exec(m[0])) articles.push(ma[1]);
txt = txt.replace(m[0], '{{הפניה לערך מורחב|ערכים=[['+articles.join(']], [[')+']]}}\n');
}
this.textbox.value = txt;
if (origTxt != txt) chectTyTool.addSummary( mw.msg( 'checkty-main-articles-merge-summary' ) );
},
formatReplace: function () {
var txt = this.textbox.value;
// Format autofix
var specials=[], emptyParametersRgx = /\n *\| *[^|=]+?= *(?=\n(?: *\||\}\}))/mg, match, emptyParametersMsg, emptyParametersBtn;
$(this.formatReplacesConfigSafe).each(function (i, o) {
txt = txt.replace(o.from, o.to);
});
//extract inner links, inner templates and inner params - we don't want to sptit those.
while (true) { //extract inner links, inner templates and inner params - we don't want to sptit those.
match = txt.match(/(\{\{[^\{\}]*\}\}|(\n|\[\[)(?:File|קובץ|תמונה|Image):.*?[\|\n]|[^\[\0]\[[^\{\}\[]*\])/);
if (!match || !match.length) break;
specials.push(match[0]);
txt = txt.replace(match[0], "\0" + specials.length + "\0");
}
$(this.formatReplacesConfig).each(function (i, o) {
txt = txt.replace(o.from, o.to);
});
while (true) {
match = txt.match(/\0(\d+)\0/);
if (!match || !match.length) break;
txt = txt.replace(match[0], specials[parseInt(match[1], 10) - 1]);
}
this.textbox.value = txt;
if (!emptyParametersRgx.test(txt)) return;
emptyParametersMsg = $('<div>', { text: mw.msg('checkty-empty-parameters') }).append($('<a>', {
href: '#',
text: 'ניקוי'
}).click(function(){ $('#wpTextbox1').val($('#wpTextbox1').val().replace(emptyParametersRgx, '')); chectTyTool.addSummary( mw.msg( 'checkty-empty-parameters-summary' ) ); return false; }));
this.writeMsg(emptyParametersMsg, 'info');
},
disambigCheck: function () {
var disambigMsg = this.writeMsg($('<div>', {
id: 'waitForDisambigs'
}).text( mw.msg( 'checkty-waiting-disambig-query' ) ), 'info'), self = this;
this.fetchDisambigLinks().fail(function () {
disambigMsg.remove();
self.writeMsg($('<div>', { text: mw.msg('checkty-disambig-no-links') }), 'check');
}).done(function (res) {
if (res.length === 0) {
disambigMsg.remove();
self.writeMsg($('<div>', { text: mw.msg('checkty-disambig-success') }), 'check');
return;
}
disambigMsg.remove();
var disambigs = $('<div id="disambigWarnning">'+mw.msg( 'checkty-disambig-links-title' )+'</div>').prepend('<img src="//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Disambig_RTL.svg/15px-Disambig_RTL.svg.png">').css('padding', '0 5px');
$.each(res, function (i, disTitle) {
if (i > 0) {
disambigs.append(', ');
}
disambigs.append($('<a href="' + mw.util.getUrl(disTitle) + '">' + disTitle + '</a>').click(function () {
var disambigName = $(this).text();
new mw.Api().get({
action: 'parse',
page: disambigName,
prop: 'text',
redirects: 1
}).done(function (data) {
if (data && data.parse && data.parse.text) {
chectTyTool.resolveDisambig(disambigName, data.parse.text['*']);
} else {
console.error(data);
}
});
return false;
}));
});
chectTyTool.writeMsg(disambigs);
});
},
resolveDisambig: function (name, data) {
var offset = 0,
textbox = this.textbox,
linkRgx = new RegExp('(?:\\.|^)([^\\.\n]*(\\[\\[' + mw.RegExp.escape(name) + '[\\|\\]]).*?)[\\.\\n]', 'm'),
orgPos = $(textbox).textSelection('getCaretPosition'),
cSentence = $('<div>');
var options = $('<div>').append($('li', data).map(function () {
var a = $(this).children('a').get(0);
if (a) {
var storeTitle = $(this).text();
var anchor = '',
h = a.href;
if (h.indexOf('#') + 1) anchor = decodeURI(h.substr(h.indexOf('#')).replace(/\./g, '%').replace(/_/g, ' '));
$(a).text( a.title.replace(mw.msg( 'checkty-page-doesnt-exist' ), "") + anchor);
a.title = storeTitle;
}
return a || null;
}).click(resolve))
.append($('<a href="#">'+mw.msg( 'checkty-remove-link' )+'</a>').click(removeLink));
var disambigDialog = $('<div>').append( mw.msg('checkty-disambig-meaning', name) + '<hr/>').append(cSentence).append(options.buttonset()).dialog({
title: mw.msg( 'checkty-dismabig-dialog-title' ),
close: function () {
$(textbox).textSelection('setSelection', {
start: orgPos
});
}
});
findSentence();
function findSentence() {
var text = textbox.value.substr(offset),
m = text.match(linkRgx);
if (!m) {
disambigDialog.dialog('close');
return;
}
offset += text.indexOf(m[1]) + m[1].indexOf(m[2]);
var linkIndex = m[1].indexOf(m[2]) + 2,
html = m[1].substr(0, linkIndex) + '<big>' + name + '</big>' + m[1].substr(linkIndex + name.length);
cSentence.html(html);
}
function resolve() {
var answer = $(this).text(),
text = textbox.value,
startLink = text.indexOf('[[' + name, offset);
if (text.charAt(startLink + 2 + name.length) != '|') answer += '|' + name;
offset += answer.length + 2;
text = text.substr(0, startLink + 2) + answer + text.substr(startLink + 2 + name.length);
textbox.value = text;
findSentence();
chectTyTool.addSummary( mw.msg( 'checkty-dismabig-fix-summary' ) );
return false;
}
function removeLink() {
var text = textbox.value,
startLink = text.indexOf('[[' + name, offset),
endLink = text.indexOf(']]', startLink),
pipeChar = startLink + 2 + name.length,
linkText = (text.charAt(pipeChar) != '|') ? name : text.substr(pipeChar + 1, endLink - pipeChar - 1);
offset += (endLink - startLink) + linkText.length;
text = text.substr(0, startLink) + linkText + text.substr(endLink + 2);
textbox.value = text;
findSentence();
return false;
}
},
addSummary: function (msg) {
var editSummary = $('#wpSummary').val();
if (editSummary.indexOf(msg) === -1) $('#wpSummary').val(editSummary + (editSummary.length === 0 ? '' : ', ') + msg);
// tag the edit
if ( $('#checktyTag').length === 0 ) {
$('#editform').append('<input type="hidden" name="wpChangeTags" id="checktyTag" value="צ\'קטי">');
}
},
checkGallery: function() {
var text = this.textbox.value,
longGalleryThreshold = 16,
galleryRgx = /<gallery.+?\n(\n|.)+?<\/gallery>/mg,
m, longGallery=false;
while ( m=galleryRgx.exec( text ) ) { var galLength = m[0].split('\n').length-2; longGallery |= (galLength > longGalleryThreshold); }
if (longGallery) {
this.writeMsg('<div>' + mw.msg('checkty-long-gallery') + '</div>', 'alert');
}
},
checkImages: function (data) {
var fairUsageTemplates = ['תבנית:שימוש הוגן', 'תבנית:תמונת חבר כנסת'];
if (!data) {
if (!(/\{\{(ויקישיתוף בשורה|מיזמים)/.test(this.textbox.value))) {
$.getJSON('//www.wikidata.org/w/api.php?callback=?', {
languages: 'he',
action: 'wbgetentities',
sites: 'hewiki',
titles: mw.config.get('wgTitle'),
format: 'json',
props: 'claims'
}).done(function (data) {
if (data.success === undefined || !data.success) return;
for (var entityId in data.entities) {
var claims = data.entities[entityId].claims;
if (claims && claims.hasOwnProperty('P373')) {
chectTyTool.writeMsg($('<div>', {
text: mw.msg('checkty-missing-commons-link')
}).prepend('<img src="//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/15px-Commons-logo.svg.png">').css('padding', '0 5px').append($('<a>', {
href: '#',
text: 'להוספה'
}).click(function () {
mw.toolbar.insertTags('{{ויקישיתוף בשורה}}')
chectTyTool.addSummary('ויקישיתוף בשורה');
})));
}
}
});
}
//in case there are no images in page
if (!mw.util.getParamValue('section') && !(/\[\[(תמונה|קובץ|File|Image):/i.test(this.textbox.value))) {
var articleName = mw.config.get('wgPageName');
var that = this; // we want to use "this" in the done method of the api call.
new mw.Api().post( {
action: 'parse',
title: articleName,
text: this.textbox.value
} ).done( function( data ) {
if ( data && data.parse && data.parse.text && $( data.parse.text['*'] ).find( 'a.image img' ).filter(function() { return $(this).width() >= 100; } ).length === 0 ) {
var fistURL = that.fistURL({
datatype: 'articles',
data: articleName
});
var msg = $('<div>', {
text: 'בדף זה אין תמונות. ניתן לחפש תמונות חופשיות ממקורות שונים. '
}).append($('<a>', {
href: decodeURI(fistURL),
text: 'חיפוש תמונות',
target: '_blank'
}));
that.writeMsg(msg, 'info');
}
});
return;
}
new mw.Api().get({
action: 'query',
generator: 'images',
titles: mw.config.get('wgPageName'),
prop: 'templates',
tltemplates: fairUsageTemplates.join('|')
}).done(function (data) {
if (data && data.query && data.query.pages) chectTyTool.checkImages(data.query.pages);
});
} else {
var fairUseImgs = $.map(data, function (o) {
if (!o.templates) return;
var isFairUsage;
$.each(o.templates, function (k, license) {
if ($.inArray(license.title, fairUsageTemplates) != -1) {
isFairUsage = true;
return false;
}
});
if (isFairUsage) return o.title;
});
if (fairUseImgs.length === 0) return;
//add message with fair usage images
var fistURL = this.fistURL({
data: fairUseImgs.join('\r\n'),
datatype: 'replaceimages'
});
var msg = $('<div>', {
text: 'הדף מכיל תמונות בשימוש הוגן, שמומלץ להחליפן בחלופות חופשיות במידת האפשר. '
}).append($('<a>', {
href: fistURL,
text: 'חיפוש חלופות חופשיות',
target: '_blank'
}));
if (!(new RegExp('\{\{'+mw.msg('checkty-fairuse-img-replace-template')+'\}\}').test($('#wpTextbox1').val())))
msg.append(' - ').append($('<a>', {
text: 'סימון להחלפה',
href: '#'
}).click(function () {
var t = $('#wpTextbox1');
$.each(fairUseImgs, function (i, fiImg) {
var imgName = mw.RegExp.escape(/.:(.+)$/.exec(fiImg)[1]),
imgDescRE = new RegExp(imgName.replace(' ', '[ _]') + '((?:[^\\[\\]]|\\[\\[[^\\[\\]]*?\\]\\])*?)\]\]', 'i'),
matches;
if (!(matches = imgDescRE.exec(t.val()))) {
return;
}
//this is thumb img
var imgDesc = matches[1].split('|'), isThumb = false, imgCaption = '';
for (var i in imgDesc) {
if (/thumb|ממוזער/i.test(imgDesc[i])) {
isThumb = true;
} else if (!(/^(ימין|שמאל|מרכז|right|left|center|[0-9]+px)?$/i.test(imgDesc[i]))) {
imgCaption = imgDesc[i]; //unknown parameter assumed to be description
}
}
if (isThumb) {
if (imgCaption) {
imgDesc = matches[1].replace(imgCaption, imgCaption + '{{'+mw.msg('checkty-fairuse-img-replace-template')+'}}');
} else {
imgDesc = matches[1] + '|{{'+mw.msg('checkty-fairuse-img-replace-template')+'}}';
}
t.val(t.val().replace(matches[1], imgDesc));
chectTyTool.addSummary('{{'+mw.msg('checkty-fairuse-img-replace-template')+'}}');
} else {
//is in infobox heuristic: = before image tag
var isInInfobox = new RegExp('=\s*\\[\\[(?:file|image|קובץ|תמונה):' + imgName.replace(' ', '[ _]') + '[^\\]]*?\]\]', 'i');
if (isInInfobox.test(t.val())) {
t.val(t.val().replace(matches[0], matches[0] + '{{'+mw.msg('checkty-fairuse-img-replace-template')+'}}'));
chectTyTool.addSummary('{{'+mw.msg('checkty-fairuse-img-replace-template')+'}}');
}
}
});
}));
this.writeMsg(msg, 'alert');
}
},
fistURL: function (p) {
return 'https://tools.wmflabs.org/fist/fist.php?doit=1&language=he&project=wikipedia¶ms[catdepth]=¶ms[random]=¶ms[startat]=¶ms[ll_max]=5¶ms[free_only]=1¶ms[commons_max]=5¶ms[flickr_max]=5¶ms[include_flickr_id]=1¶ms[flickr_new_name_from_article]=1¶ms[picasa_max]=5¶ms[wts_max]=5¶ms[gimp_max]=¶ms[esp_max]=5¶ms[geograph_max]=5¶ms[geograph_max_de]=5¶ms[geograph_max_channel-islands]=5¶ms[freemages_max]=5¶ms[forarticles]=all¶ms[lessthan_images]=¶ms[default_thumbnail_size]=250¶ms[jpeg]=1¶ms[png]=1¶ms[gif]=1¶ms[svg]=1¶ms[output_format]=out_html¶ms[min_width]=80¶ms[min_height]=80¶ms[ab_max]=5&sources[languagelinks]=1&sources[commons]=1&sources[flickr]=1&' + $.param(p);
},
languageCheck: function (checks) { //style and language check
var highlightStr = this.highlightString;
var findFunc = function () {
var toFind = eval(unescape($(this).attr('href').substr(1))).exec($('#wpTextbox1').val());
if (toFind) highlightStr(toFind[0]);
return false;
};
if (checks) {
var txt = this.textbox.value;
var checkWarnings = $('<div></div>');
for (var x in checks) {
if (checks[x]['test'].test(txt)) {
checkWarnings.append($('<a href="#' + escape(checks[x]['test']) + '">'+mw.msg( 'checkty-search' )+'</a>').click(findFunc));
checkWarnings.append(' - ' + checks[x]['remark'] + '<br/>');
}
}
// Design checks: Elements width
var largeElement = /[6789][0-9][0-9]px/;
if (largeElement.test(txt)) checkWarnings.append(mw.msg( 'checkty-large-element' ) + '<br/>');
var manyLi = RegExp('(?:\n\\*.*){20}');
if (manyLi.test(txt)) checkWarnings.append(mw.msg( 'checkty-long-list' ) );
if (checkWarnings.html().length) this.writeMsg(checkWarnings, 'alert');
} else {
var api = new mw.Api();
api.get({
action:'parse',
page: 'ויקיפדיה:בדיקה אוטומטית',
prop: 'wikitext'
}).done(function (data) {
if (!(data && data.parse && data.parse.wikitext)) return;
var DictionaryText = data.parse.wikitext['*'].split('-----')[1]
var genrealWarningWords = DictionaryText.split('\n*');
var checks = [];
for (var i=0;i<genrealWarningWords.length;i++)
{
var splittedWarn = genrealWarningWords[i].split("//");
if ( splittedWarn.length !== 2 ) continue;
checks.push({
'test': new RegExp( splittedWarn[0], 'i' ),
'remark': splittedWarn[1]
});
}
chectTyTool.languageCheck(checks);
});
var txt = $('#wpTextbox1').val(),
countRgx = /(?:[^ ]+ ){2}.?(?:ש[נת]י|שלוש[תה]?|ארבע[הת]?|חמשת?|חמישה|ששת?|שבע[הת]?|תשע[הת]?|עשר[הת]?) [א-ת]+/g,
gramCheck = [], m;
while (m = countRgx.exec(txt)) { gramCheck.push(m) }
if (gramCheck.length) $.post('//tools.wmflabs.org/eranbot/shtei_shekel/heb_check.py', { wikitext: gramCheck.join('\n') } ).done(function(d){
if (!d.errs || d.errs.length === 0) return;
var zaharNekevaWarns = $('<div></div>');
for ( var i = 0; i < d.errs.length; i++ ) {
var origRgx = new RegExp(d.errs[i].orig);
zaharNekevaWarns.append($('<a href="#' + escape(origRgx) + '">'+mw.msg( 'checkty-search' )+'</a>').click(findFunc));
zaharNekevaWarns.append(' - ייתכן שיש אי התאמה במין ב"' + d.errs[i].orig + '" (תיקון: '+d.errs[i].suggested+') <br/>');
}
chectTyTool.writeMsg(zaharNekevaWarns, 'alert');
});
}
},
refsConsistencyCheck: function () {
function safeRegexFix(fixRegex, fixReplace, check){
var txt = $('#wpTextbox1').val(),
m;
//remove templates within templates
var specials = [];
while (m = /\{\{(?!הערה\|)[^\{]*?\}\}/g.exec(txt)) {
txt = txt.replace(m[0], '\0' + specials.length + '\0')
specials.push(m[0])
}
if (check) {
var counterA = 0, counterB = 0;
while (fixRegex.exec(txt)) counterA++;
while (fixReplace.exec(txt)) counterB++;
return [counterA, counterB];
} else {
txt = txt.replace(/(\{\{הערה\|.*?\}\}|<ref>.*?<\/ref>)\s+(?=(\{\{הערה\||<ref>))/g, '$1'); // remove spaces between refs
txt = txt.replace(fixRegex, fixReplace);
while (m = specials.pop()) txt = txt.replace('\0' + specials.length + '\0', m);
$('#wpTextbox1').val(txt);
}
}
var refAfter = /([\.\,])\s*((\{\{הערה.*?\}\}|<ref>.*?<\/ref>)+)\.?/g,
refBefore = /\.?((\{\{הערה\|([^\{]|\{(?!\{הערה\|))*\}\}|<ref>([^<]|<(?!\/ref>))*<\/ref>)+)\s*([\.\,])/g
var refCounter = safeRegexFix(refAfter, refBefore, true);
if (refCounter[0] > 0 && refCounter[1] > 0) {
this.writeMsg($('<div>', {
text: 'חוסר תאימות בהערות שוליים: ' + refCounter[0] + ' הערות אחרי סימן פיסוק, ' + refCounter[1] + ' הערות לפני סימן פיסוק [תיקון: '
}).append($('<a>', {
text: 'אחרי',
href: '#'
}).click(function () {
safeRegexFix(refBefore, '$5$1', false);
chectTyTool.addSummary('אחידות במיקום הערות שוליים');
})).append(' | ').append($('<a>', {
text: 'לפני',
href: '#'
}).click(function () {
safeRegexFix(refAfter, '$2$1', false);
chectTyTool.addSummary('אחידות במיקום הערות שוליים');
})).append(']'), 'alert');
}
},
ibidWarning: function() {
var refRE = /\{\{הערה\|(?! *שם *=)(?:1=)?((?:[^\{\}]|\{\{.*?\}\})+)(?!\|=שם=)\}\}/g,
wikitext = this.textbox.value, self=this;
var m;
var checkWarnings = $('<div></div>');
while ( m = refRE.exec( wikitext ) ){
if(/^שם[ .,]|^שם$/.test(m[1]) || /\bibid(?![^a-z])/i.test(m[1])){
checkWarnings.append($('<a href="#' + escape(m[0]) + '">'+mw.msg( 'checkty-search' )+'</a>').click(function(){
self.highlightString(unescape($(this).attr('href').substr(1)));
return false;
}));
checkWarnings.append(' - נמצאה הערת שוליים המפנה להערה הקודמת בצורה של שם. יש להחליף לציון מקור מדויק. ראו עוד: <a href="'+mw.util.getUrl('ויקיפדיה:הערות שוליים')+'">ויקיפדיה:הערות שוליים</a><br/>');
}
}
if (checkWarnings.html().length) this.writeMsg(checkWarnings, 'alert');
},
mergeRefs: function() { // merge refs with same content
var references = {};// a dictionary where key is the ref content and the value is list of uses
var refRE = /\{\{הערה\|(?! *שם *=)(?:1=)?((?:[^\{\}]|\{\{.*?\}\})+)(?!\|=שם=)\}\}/g;
var wikitext = this.textbox.value;
var m;
while ( m = refRE.exec( wikitext ) ){
references[m[1]] = references[m[1]] || [];
references[m[1]].push(m[0]);
}
for (var refContet in references) {
var refUses = references[refContet];
if ( refUses.length === 1 ) continue;
if(/^שם[ .,]|^שם$/.test(refContet) || /\bibid(?![^a-z])/i.test(refContet)) continue; // skip ibid refs
var commonRefStructure = /(.+?) .+ (?:עמ|p).? ?([0-9]+)/.exec(refContet);
var defaultRefName = '';
if (commonRefStructure) {
defaultRefName = commonRefStructure[1]+commonRefStructure[2];
}
var refName = prompt('ישנה הערת שוליים החוזרת מספר פעמים. ניתן להפנות את כל המופעים אל הערה אחת באמצעות מתן שם קצר ובעל משמעות להערה.\nאנא הזינו שם להערה הבאה:\n'+refContet, defaultRefName);
if ( !refName ) continue;
wikitext = wikitext.replace( refUses[0], '{{הערה|שם='+refName+'|1='+refContet+'}}');
for (var refI = 1; refI<refUses.length; refI++){
wikitext = wikitext.replace( refUses[refI], '{{הערה|שם='+refName+'}}');
}
this.textbox.value = wikitext;
}
},
titleOrderCheck: function(){
// validates the titles order is consistent
var orderedTitles = ['ראו גם', 'לקריאה נוספת', 'קישורים חיצוניים', 'הערות שוליים'],
isSorted = 1,
titles = $('#wpTextbox1').val().match('==\\s*'+orderedTitles.join('|')+'\\s*==','g'), i, indexes;
if (!titles) return; // no such titles
indexes = $.map( titles, function(e){return orderedTitles.indexOf(e.replace(/\s*==\s*/g,''))});
for ( i=0; ( i < indexes.length-1 ) && isSorted; i++) { isSorted &= (indexes[i] < indexes[i+1]) };
if ( !isSorted ) {
this.writeMsg($('<div>מומלץ לתקן את סדר הכותרות ל: ' + orderedTitles.join(', ') + '</div>'), 'alert' );
}
},
overlinkify: function() {
function removeOverlink(context, link){
return context.replace(new RegExp(mw.RegExp.escape('[['+link+']]'), 'g'), link).replace(new RegExp(mw.RegExp.escape(link)),'[['+ link+']]')
}
var highlightStr = this.highlightString;
var wikitext = $('#wpTextbox1').val();
var overlinkingRgx = /\[\[([^\[\]\|]+?)\]\].+\[\[\1\]\]/g
var m;
while(m=overlinkingRgx.exec(wikitext))
{
var removeLink = $('<a href="#">'+mw.msg( 'checkty-remove-link' )+'</a>').data({'search': m[1]}).click(function(e){
var specificOverlinkingRgx = new RegExp('\\[\\[('+$(this).data('search')+')\\]\\].+\\[\\[\\1\\]\\]', 'g');
var wikitext = $('#wpTextbox1').val();
var m;
while( m = specificOverlinkingRgx.exec( wikitext ) )
{
wikitext = wikitext.replace(m[0], removeOverlink(m[0], m[1]));
}
$('#wpTextbox1').val(wikitext);
chectTyTool.addSummary('הסרת קישורים עודפים');
e.preventDefault();
});
var searchLink =$('<a href="#">'+mw.msg( 'checkty-search' )+'</a>').data({'search': m[1]}).click(function(e){
highlightStr('[['+$(this).data('search')+']]'); e.preventDefault();
});
this.writeMsg($('<div>').append(['נמצאו קישורים עודפים ל"'+m[1]+'" [',searchLink, ' - ', removeLink, ']']), 'alert');
wikitext = wikitext.replace(m[0], removeOverlink(m[0], m[1]));
}
},
wikidataLabels: function() {
var self = this, needTranslateQ = $( 'a.wb-entity-link[href*="Q"]' ).filter( function( i, e ) { return /[a-z]/i.test( e.text ) } ).map(function(){ var m=/(Q[0-9]+)/.exec(this.href); if (m) return m[0];}).toArray();
if (needTranslateQ.length === 0 ) return;
mw.loader.using( [ 'wikibase.api.RepoApi', 'wikibase.client.getMwApiForRepo' ] ).done(function() {
var needTranslateIndeedQ = [];
var wikidataApi = new wikibase.api.RepoApi(wikibase.client.getMwApiForRepo());
wikidataApi.getEntities(needTranslateQ.join('|'), 'labels', mw.config.get('wgContentLanguage')).done( function(d) {
if (!d.entities) return;
for(var q in d.entities) {
if (d.entities[q].labels && !d.entities[q].labels.hasOwnProperty(mw.config.get('wgContentLanguage'))) needTranslateIndeedQ.push(q);
}
if(needTranslateIndeedQ.length === 0) return;
var msg = $('<div>הישויות הבאות חסרות תווית בעברית בוויקינתונים: </div>').append($( 'a.wb-entity-link[href*="Q"]' ).filter( function( i, e ) { return $.inArray(/Q[0-9]+/.exec(e.href)[0], needTranslateIndeedQ)+1 } ).clone().css('margin', '0 3px'));
self.writeMsg(msg, 'alert');
$('a', msg).click(function(){
var entityId = /Q[0-9]+/.exec($(this).prop('href'))[0];
hebrewLabel = prompt(mw.msg('checkty-set-label', $(this).text()));
if (hebrewLabel) {
wikidataApi.setLabel(entityId, 0, hebrewLabel, mw.config.get('wgContentLanguage')).done(function(d) { if (d.success) mw.notify(mw.msg('checkty-translate-saved')); })
}
return false;
});
});
});
},
numberRangeDash: function(fix) {
// replace minus => dash foreach x-y s.t x<y
var numberRangeReNoMinus = /([א-ת]'?[-\| ]*)((?:\[\[|\()?[0-9]+(?:\]\])?)-((?:\[\[)?[0-9]+)((?:\]\]|\))?[.:,]?([ \|]|\n)(?!לפנה"ס))/g,
wikitext = this.textbox.value, replacements = [], m, i;
while(m = numberRangeReNoMinus.exec(wikitext))
{
if ( parseInt(m[2].replace(/[^0-9]/g, '')) < parseInt(m[3].replace(/[^0-9]/g, '')) ) {
replacements.push([m[1] + m[2] + '-' + m[3] + m[4], m[1] + m[2] + '–' + m[3] + m[4]]);
}
else if ( (parseInt(m[2].replace(/[^0-9]/g, '')) > parseInt(m[3].replace(/[^0-9]/g, ''))) && (/^[0-9]+$/.test(m[2])) && (/^[0-9]+$/.test(m[3])) ) {
replacements.push([m[1] + m[2] + '-' + m[3] + m[4], m[1] + m[3] + '–' + m[2] + m[4]]);
}
}
if (replacements.length === 0) return;
if (fix) {
for(i = 0; i < replacements.length; i++) {
wikitext = wikitext.replace(replacements[i][0], replacements[i][1]);
}
this.textbox.value = wikitext;
this.addSummary( 'קו מפריד בטווח מספרים' );
} else {
this.writeMsg($('<div><a href="#">'+mw.msg( 'checkty-fix-numberRangeDash' )+'</a></div>').click(function(e){ chectTyTool.numberRangeDash(true); e.preventDefault(); }));
}
},
//original version from http://code.google.com/p/proveit-js/source/browse/ProveIt_Wikipedia.js#384
//thanks to Georgia Tech Research Corporation. Atlanta, GA 30332-0415
highlightString: function (toFind) {
var txtArea = $('#wpTextbox1');
var nextPlace = txtArea.val().indexOf(toFind, txtArea.textSelection('getCaretPosition') + 1);
if (nextPlace === -1) nextPlace = txtArea.val().indexOf(toFind); //start from begining
if (nextPlace === -1) return; //not found... nothing to do
var origText = txtArea.val();
txtArea.val(origText.substring(0, nextPlace));
txtArea.focus();
txtArea.scrollTop(1000000); //Larger than any real textarea (hopefully)
var curScrollTop = txtArea.scrollTop();
txtArea.val(origText);
if (curScrollTop > 0) {
var HALF_EDIT_BOX_HEIGHT = 200;
txtArea.scrollTop(curScrollTop + HALF_EDIT_BOX_HEIGHT);
}
txtArea.focus().textSelection('setSelection', {
start: nextPlace,
end: nextPlace + toFind.length
});
}
};
if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) + 1) $(document).ready(function () {
$('#wpPreview').after($('<input type="button" id="btnCheckTool" title="צ\'קטי - כלי לבדיקת בעיות נפוצות ועוד" value="' + (window.checkToolName || 'בדיקה') + '" accessKey="'+(window.checkToolKey || 'e')+'" />').click(chectTyTool.run).updateTooltipAccessKeys());
});