/** Description: AUTOMATIC SIGNING: if not sure, warn.
/** Description: AUTOMATIC SIGNING: if not sure, warn.
*** aut. signing / (automatische Unterschrift) ***
* @documentation: see [[w:de:user:Perhelion/signing]]
* @revision: 16:11, 6 December 2017 (UTC)
* @authors:
* created 23.04.2006 [[w:de:user:Olliminatore]] version 1.56 13.03.2007
* updated 23.04.2006 [[w:en:user:Ilmari Karonen]]
* updated 19.09.2011 – 29.12.2011 [[user:Perhelion]], FIX for non Gecko
* updated 31.12.2011 [[w:de:user:PerfektesChaos]], some code improvements
* updated 19.06.2014 Perhelion, fixes (code tidy up, jshint) gimmicks added
* updated 09.09.2014 [[w:de:user:Schnark]] (code cosmetic)
* –2016 Perhelion
* tested only on modern browsers <nowiki>
* @license released dual-licensed under the terms of the GFDL v1.2 or the GPL v2.
* required modules: 'jquery.textSelection','mediawiki.language','mediawiki.util', 'mediawiki.action.edit.preview'
* ToDo: exlcude LivePreview with session save, use hook content
**/
(function($, mw) {
'use strict';
if (!mw.libs || mw.libs.threadSign) throw new Error('Initializing of threadSign stopped because it was already executed');
var name = 'واژووی خۆکارانە',
ns = mw.config.get('wgNamespaceNumber'),
$textarea, $editform, minoredit, txtOld = '',
CmtE = '',
txtLen, lrLen, txtEndLen, txtOldEnd, reUser = '',
signTxt = [],
txtOldL;
var c = $.extend({
usersignature: window.usersignature || '~~\~~',
sigAccessKey: '>',
sigText: null
}, mw.config.get(['wgDBname', 'wgAction', 'wgContentLanguage', 'wgRelevantUserName', 'wgFormattedNamespaces', 'wgUserName', 'wgPageName', 'wgIsArticle']));
var ts = {
version: 'v1.93d',
$sigBox: $(),
$label: $(),
onoff: $.noop,
init: function() {
if (ts.config instanceof Object)
c = $.extend(c, ts.config);
if (mw.config.get('wgIsArticle')) return;
var newSection = /section=new/.test(location.search);
if (!c.sigText)
c.sigText = c.usersignature;
c.sigText = ' ' + $.trim(c.sigText) + '\n';
var regpages = null,
whitelist = [],
blacklist = [],
p, len;
$textarea = $('#wpTextbox1');
if (!$textarea.length) return;
minoredit = document.forms.editform.wpMinoredit;
txtOld = $.trim($textarea.val());
txtOldL = txtOld.length;
if (!minoredit || newSection || !txtOldL)
c.dSum = '';
if (ns === 4) {
if (c.regpages) {
regpages = c.regpages;
if (!$.isArray(regpages) || typeof regpages[0] !== 'string')
return alert('Config error: "' + regpages + '" must be of type string array.');
}
blacklist = [/\/[Ii]ntro$/, /\/[Hh]eader$/, /\/[Aa]rchive?[ _/]/, /\/\d{4}\/\d\d\/\d\d$/];
switch (c.wgDBname) {
case 'ckbwiki':
whitelist = [':Requests for undeletion', ':Requests for adminship/', ':Requests for arbitration/', ':Requests for permissions', ' for deletion', ' for discussion', ':Dispute resolution noticeboard', ':Adminship survey', ':Deletion review', ':Cleanup', ':SVG help', ':Arbitration/', ':Village pump', ':Articles for deletion', '.*noticeboard.*', ':page protection', 'mediation)', ':Bot requests', ':Help desk', ':Editor review', ':Media copyright questions'];
break;
case 'dewiki':
whitelist = [':Löschkandidaten/', 'erkstatt', 'wünsche', ':Auskunft', ':Café', ':Fragen von Neulingen', ':Fragen zur Wikipedia', ':Verbesserungsvorschläge', ':Urheberrechtsfragen', ':Kandidat', ':Löschprüfung', ':Sperrprüfung', 'Meinung', ':Qualitätssicherung/', ' Bilder', ':Review', ':Vandalismusmeldung', '/Anfragen', 'Notizen', ':Tellerrand', ':WikiProjekt Vorlagen', ':Projektdiskussion', ':WikiProjekt Wappen', ':Redaktion '];
break;
case 'commonswiki':
whitelist = ['illage pump', ':Forum', ':Help desk', ':Bots/', ' requests/', ' candidates/', ':Administrators\' ', ':Translators\' noticeboard', ' for discussion/', ':Graphic Lab'];
break;
}
for (p = 0, len = blacklist.length; p < len; p++) {
if (blacklist[p].test(c.wgPageName)) {
whitelist = '';
break;
}
}
regpages = (regpages && whitelist) ? whitelist.concat(regpages) : whitelist;
if (newSection)
regpages = '';
if (whitelist) {
if ($.isArray(regpages))
for (p = 0, len = regpages.length; p < len; p++) {
if (c.wgPageName.indexOf(regpages[p].replace(/ /g, '_')) !== -1) {
regpages = '';
break;
}
}
if (c.wgDBname === 'ckbwiki') {
$('.hiddencats li').children('a').each(function() {
if (this.text && /Non-talk pages that are automatically signed$/.test(this.text))
regpages = '';
});
}
if (regpages) {
$.when(mw.loader.load('mediawiki.util'), $.ready).then(function() {
$.getJSON(mw.util.wikiScript('api'), {
action: 'query',
prop: 'pageprops',
indexpageids: true,
titles: c.wgPageName,
cache: true,
format: 'json',
timeout: 3000
}).done(function(json) {
if (!json || !json.query || !json.query.pages)
return console.log('could not get page info!');
json = json.query.pages[json.query.pageids];
if (json && json.pageprops && typeof json.pageprops.newsectionlink !== 'undefined') {
if ('Perhelion' === c.wgUserName) alert('واژووی خۆکارانە: Page was still not registered!');
c.regpages = '';
}
}).always(function() {
ts.exec();
});
});
} else {
c.regpages = '';
return ts.exec();
}
}
} else {
if (ns % 2 === 1)
regpages = '';
c.regpages = regpages;
if (regpages === '' || ns === 2)
return ts.exec();
}
},
_cntOcc: function(txt) {
var sig = /~{3}/g,
falseRe = /(\{\{subst\:unsig.*?\}\})|(<(nowiki|pre)>[\s\S]*?<\/(nowiki|pre)>)|(<!--[\s\S]*?-->)/ig,
count = 0,
cnt2 = 0,
cnt = 0;
while (sig.test(txt))
cnt++;
count = txt.match(falseRe) || [];
for (var i = 0; i < count.length; i++) {
while (sig.test(count[i]))
cnt2++;
}
mw.log(cnt, cnt2);
return [cnt, cnt2];
},
setIndentation: function(e) {
var $textarea = $(e.target);
var txt = $textarea.val();
var pos = $textarea.textSelection('getCaretPosition');
if (!pos)
return;
var txtE = txt.slice(pos);
txt = txt.slice(0, pos);
var lrI = txt.lastIndexOf('\n');
var line = txt.slice(lrI + 1, pos);
this.indent = "";
if (line) {
var lrM = line.match(/^[:*#]+ ?/);
if (lrM) {
var lrLen = lrM[0].length;
if (lrLen) {
$textarea.val(txt + '\n' + lrM[0] + txtE);
this.indent = [pos, lrLen];
lrLen++;
$textarea.textSelection('setSelection', {
start: pos + lrLen
});
e.preventDefault();
}
}
}
return;
},
rmvIndentation: function(e) {
var $textarea = $(e.target);
var txt = $textarea.val();
var pos = this.indent[0];
if (pos) {
pos++;
var txtE = txt.slice(pos + this.indent[1]);
txt = txt.slice(0, pos);
this.indent = "";
$textarea.val(txt + txtE);
$textarea.textSelection('setSelection', {
start: pos
});
return e.preventDefault();
}
},
stripeCmt: function(txt) {
var cmtRe = /(<!--[\s\S]*?-->)(?!\n*<!--)/g;
var cmtRight = '';
CmtE = '';
while (cmtRe.test(txt)) {
CmtE = '\n' + RegExp.lastMatch;
}
if (CmtE) {
var cmtEndI = cmtRe.lastIndex;
if (cmtEndI < txt.length && cmtEndI > txtLen) {
cmtRight = txt.slice(cmtEndI);
}
txt = $.trim(txt.slice(0, cmtEndI - CmtE.length));
CmtE += cmtRight;
}
return txt;
},
rmvIndent: function(txt, cmtE, pos) {
var lrLi = 0;
if (lrLen) {
if (cmtE) {
txt = ts.stripeCmt(txt);
cmtE = CmtE;
}
lrLi = txt.lastIndexOf('\n');
txt = txt.slice(0, lrLi) + txt.slice(lrLi).replace(new RegExp('\\n[:*# ]+ *' + $.trim(reUser) + ' *$'), '') + cmtE;
reUser = '';
lrLen = '';
}
$textarea.val(txt);
if (pos)
$textarea.textSelection('setSelection', {
start: pos
}).textSelection('scrollToCaretPosition').focus();
return txt;
},
getUser: function() {
var txt = txtOld;
var strRe = new RegExp('\\[\\[(?:' + c.wgFormattedNamespaces[2] + '(?:in)?|' + c.wgFormattedNamespaces[3] + '|User(?:[ _]talk)?): ?([^\\]\\|[]+)(?:\\|([^\\]\[]+))?\\]\\]', 'ig');
var topicPosters = txt.match(strRe) || [];
var posterList = [];
topicPosters = $.grep(topicPosters.reverse(), function(p, i) {
return $.inArray(p, topicPosters) === i;
});
var u = topicPosters.length,
reUser, userDict = {};
while (u--)
while (strRe.test(topicPosters[u])) {
reUser = RegExp.$1;
if (!mw.util.isIPAddress(reUser, false))
posterList.push([RegExp.lastMatch, reUser, RegExp.$2]);
}
posterList = $.grep(posterList, function(p, i) {
return $.inArray(p, posterList) === i;
});
u = posterList.length;
var d = 0;
while (u--) {
reUser = posterList[u];
var userMatch = reUser.shift();
if (reUser[1]) {
if (new RegExp(c.wgFormattedNamespaces[3] + '|User[ _]talk', 'i').test(userMatch))
reUser.pop();
else {
reUser[1] = $.trim(reUser[1]);
if (reUser[1].indexOf(' ') > 3)
reUser.pop();
}
}
var user = reUser[0] || '';
user = $.trim(user.replace(strRe, '$1'));
if (user) {
if (user.indexOf('/') !== -1)
user = user.split('/')[0];
else if (user.indexOf('#') !== -1) {
user = user.split('#')[0];
}
if (reUser[0] !== user) {
reUser = [user];
} else if (reUser[1] && reUser[1] === user)
reUser.pop();
if (user === c.wgUserName || userDict[user] && (!reUser[1] || userDict[user][1])) {
posterList.splice(u, 1);
d++;
} else if (userDict[user]) {
posterList.splice(userDict[user][0] - d, 1);
d++;
posterList[userDict[user][0] - d] = reUser;
} else {
userDict[user] = [u, reUser[0]];
posterList[u] = reUser;
}
}
}
return posterList.reverse();
},
createDropDown: function(e) {
e.stopPropagation();
e.preventDefault();
var tar = e.target,
userName, userNick;
var selOkTxt = '--- OK ---';
var posterList = this.getUser();
posterList = $.grep(posterList, function(p) {
return (p && p[0] !== c.wgRelevantUserName);
});
var u = posterList.length;
var posterLen = u;
while (u--) {
var reUser = posterList[u];
userName = reUser[0];
userNick = (reUser[1]) ? reUser[1] : '';
userNick = (userNick || userName).replace(/\w\-+\w/g, ' ').replace(/(\w)[\d-\.]+|[\d-\.]+(\w)/g, '$1$2');
posterList[u] = $('<option>', {
value: userName,
text: userNick
});
}
var getSelectedOptions = function getSelectedOptions(tar, event) {
var sel = this || document.getElementById('mention-select'),
opts = sel.options,
oLen = opts.length - 1,
bOk;
ts.userNames = '';
userName = [];
if (oLen > 0) {
var ind = opts[opts.selectedIndex];
if (ind && ind.value !== selOkTxt) {
if (tar.title === 'Ping' && event.ctrlKey) {
bOk = opts[oLen].selected;
for (var i = 0; i < oLen; i++) {
var opt = opts[i];
if (opt.selected)
userName.push(opt.value);
}
} else {
var $sel = $(sel).hide();
userName = [ind.value, ind.text];
if (tar.title === 'Ping') {
userName.pop();
ind.value = opts[oLen].value;
ind.selected = false;
}
window.setTimeout(function() {
$sel.show();
}, 200);
}
if (!event.ctrlKey || bOk)
return tar.onclick(userName);
ts.userNames = userName;
} else return tar.onclick('');
}
};
if (posterLen < 2) {
userName = [userName];
if (tar.title !== 'Ping')
userName.push(userNick);
return tar.onclick(userName);
}
var $sel = $('<select>', {
id: 'mention-select',
multiple: 1
}).on('click', function(e) {
getSelectedOptions(tar, e);
}).append(posterList).on("blur", function(e) {
if (!e.ctrlKey)
$(this).parent().remove();
});
if (tar.title === 'Ping')
$sel.append($('<option>', {
style: 'text-align:center',
text: selOkTxt
}));
$sel.attr("size", Math.min(6, posterLen));
$sel = $('<div>').css({
position: "absolute",
top: tar.offsetTop - 22,
left: tar.offsetLeft + 24,
zIndex: 77
}).append($sel);
$(tar).parent().append($sel);
$sel.children().first().focus().find("option:first").prop("selected", 1);
},
setPing: function(e) {
if (e.target && !($textarea.textSelection('getSelection') || ts.userNames))
return this.createDropDown(e);
else if (ts.userNames && e.target) {
e = ts.userNames;
ts.userNames = '';
}
e = (e && e[0]) ? e.join('|') : '';
return $textarea.textSelection('encapsulateSelection', {
pre: '{{وب|',
peri: e,
post: '}}'
});
},
mentionUser: function(e) {
var isSel = $textarea.textSelection('getSelection');
if (e.target && !(isSel || e.ctrlKey))
return this.createDropDown(e);
return $textarea.textSelection('encapsulateSelection', {
pre: '[[' + c.wgFormattedNamespaces[2] + ':',
peri: (e[0] || '') + '|' + (e[1] || ''),
post: isSel ? '|]]' : ']]'
});
},
enable: function() {
if (this.enabled)
return;
this.toggleSigBox();
this.enabled = true;
this.onoff(1);
},
disable: function() {
if (!this.enabled)
return;
this.toggleSigBox();
this.enabled = 0;
this.onoff(0);
},
exec: function() {
$editform = $('#editform');
var r = '\n',
sum = document.forms.editform.wpSummary,
n = /\n/,
bSig = !(c.regpages !== '' || ns === 2);
if (window.wikEd)
return alert(name, 'is not compatible with wikEd');
if (bSig)
ts.useLivePreview();
$textarea.on('keypress', function(e) {
if (e.which === 13)
return ts.setIndentation(e);
if (e.which === 8 && ts.indent)
return ts.rmvIndentation(e);
ts.indent = "";
});
if (mw.language && $.inArray('de', mw.language.getFallbackLanguageChain()) !== -1)
signTxt = {
boxTitle: 'Signiere automatisch. ',
boxText: 'Signieren',
btnAlt: 'Manuelle Signatur',
confirm: 'Es wurde keine Signierung gefunden. Trotzdem fortfahren?'
};
else
signTxt = {
boxTitle: 'Sign this edit automatic. ',
boxText: 'واژووی خۆکارانە',
btnAlt: 'Manual signing',
confirm: 'واژووەکەت نەدۆزرایەوە. دەتەوێت بەردەوام بیت؟'
};
signTxt.hi = ($.inArray(c.wgContentLanguage, ['de', 'nn', 'da']) !== -1) ? 'Hallo ' : 'دەم باش ';
if (!$editform.length)
return;
ts.setOutdent = function() {
var txt = $textarea.val();
var outdent = (c.wgDBname === 'ckbwiki') ? '\n{{سھ}}' : '\n:┌{{padleft:┘|22|─}}\n';
var pos = $textarea.textSelection('getCaretPosition');
if (pos < 0)
pos = txt.length;
if (n.test(txt[pos]) && !n.test(txt[pos - 1]))
pos++;
if (txt[pos + 1] && n.test(txt[pos + 1]))
pos++;
ts.rmvIndent($.trim(txt.slice(0, pos)) + outdent + txt.slice(pos), CmtE);
};
this.doSig = function(e, pos) {
var txt = $textarea.val();
var sigText = c.sigText;
if (!pos) {
pos = $textarea.textSelection('getCaretPosition');
} else {
if (pos < 0)
pos = txt.length;
var tmpRe = /\}\}\s*$/;
if (tmpRe.test(txt.slice(pos - 4, pos))) {
var lrIndex = txt.slice(0, pos).replace(/\s+$/, '').lastIndexOf(r);
var tmpTxt = txt.slice(lrIndex, pos);
if (/\|1\s*=[^\n]*(\}\})\s*$/.test(tmpTxt)) {
tmpRe = tmpTxt.search(tmpRe);
pos = lrIndex + tmpRe;
sigText = sigText.replace(/\n+$/, '');
}
}
}
if (txt[pos] && n.test(txt[pos]) && !n.test(txt[pos - 1]))
pos++;
if (txt[pos + 1] && n.test(txt[pos + 1]))
pos++;
this.rmvIndent(txt.slice(0, pos).replace(/\s+$/, '') + sigText + txt.slice(pos), CmtE, pos);
if (c.dSum) {
if (!/^(?:(\/\*.+?\*\/ *))([^ ])|^([^/]+?)(?!\/\*.+?\*\/ *)/.test(sum.value)) {
sum.value += c.dSum;
}
c.dSum = '';
}
return e;
};
var oBox = {
'type': 'checkbox',
'name': 'wpواژووی خۆکارانە',
'id': 'wpواژووی خۆکارانە',
'checked': bSig,
'accessKey': c.sigAccessKey,
selected: bSig
};
var oLabel = {
'for': 'wpواژووی خۆکارانە',
title: signTxt.boxTitle + ts.version,
align: 'inline',
label: signTxt.boxText
};
var cURL = 'https://upload.wikimedia.org/wikipedia/commons/thumb/';
var $sBtn = $('<img>', {
src: cURL + '5/52/Tango_style_insert-signature_icon.svg/22px-Tango_style_insert-signature_icon.svg.png',
'title': 'واژووی خۆکارانە',
'rel': 'واژووی خۆکارانە',
'alt': signTxt.btnAlt,
'width': '22',
'onclick': 'mw.libs.threadSign.doSig(event)',
'height': '22',
'style': 'cursor:pointer',
'class': 'tool'
});
var $pBtn = $sBtn.clone().attr({
src: cURL + 'f/fa/Tango_style_ping_icon.svg/22px-Tango_style_ping_icon.svg.png',
title: 'Ping',
alt: '',
rel: 'Ping',
onclick: 'mw.libs.threadSign.setPing(event)'
});
var $mBtn = $sBtn.clone().attr({
src: cURL + '6/6b/Flow-mention.svg/22px-Flow-mention.svg.png',
title: 'Mention',
alt: '',
rel: 'Mention',
onclick: 'mw.libs.threadSign.mentionUser(event)'
}).css({
opacity: '.6'
});
var $oBtn = $sBtn.clone().attr({
src: cURL + 'b/bb/Tango_style_outdent_icon.svg/22px-Tango_style_outdent_icon.svg.png',
title: 'Outdent',
alt: '',
rel: 'Outdent',
onclick: 'mw.libs.threadSign.setOutdent()'
});
var threadSignBtns = [$sBtn, $oBtn, $pBtn, $mBtn];
var txt = txtOld;
if (!txt) {
if (ns === 3 && !minoredit && c.wgRelevantUserName !== c.wgUserName) {
txt = signTxt.hi + c.wgRelevantUserName + ',\n';
$textarea.val(txt).textSelection('setSelection', {
start: txt.length - 1
}).focus();
}
} else if (/-->$/.test(txt))
txt = ts.stripeCmt(txt);
txtLen = txt.length;
var lrI = txt.lastIndexOf(r) + 1,
lrR = txt.slice(lrI),
lrM = lrR.match(/^[:*#]+/);
lrLen = (lrM) ? lrM[0].length : 0;
txtEndLen = (Math.min(18, lrR.length) + lrLen) * -1;
txtOldEnd = txtOld.slice(txtEndLen);
if (c.wgAction === 'edit') {
if (lrLen && lrI + lrLen + 1 < txtLen) {
lrI = ':';
lrLen++;
if (lrLen === 2 && lrM[0] !== ':') {
lrI = '';
lrLen = 1;
}
$textarea.val(txt + r + lrM[0] + lrI + ' ' + CmtE);
txtLen += lrLen + 2;
} else if (!lrLen && c.autoSalut && txtOldEnd && /\d{4} \((?:CES?T|UTC)\)[^\d]*?$/.test(lrR)) {
lrLen++;
reUser = this.getUser().pop() || "";
lrI = '';
if (reUser) {
lrI = ': ';
reUser = (reUser[1] && /\w+/.test(reUser[1])) ? reUser[1] : reUser[0];
if (reUser)
reUser = signTxt.hi + reUser.replace(/\d+$/g, '') + '، ';
lrLen += reUser.length;
}
txtLen += lrLen + lrI.length;
$textarea.val(txt + r + lrI + reUser + CmtE);
} else {
lrLen = 0;
if (txt) {
txtLen++;
$textarea.val(txt + r + CmtE);
}
}
}
if (bSig && txt)
$(window).on('load', function() {
$textarea.textSelection('setSelection', {
start: txtLen
}).textSelection('scrollToCaretPosition').focus();
});
if (minoredit) {
this.offSigBox(minoredit);
$(minoredit).on('change', this.offSigBox);
}
$('#wpSave, #wpPreview, #wpDiff, #wpMinoredit').on("click", {
name: name
}, ts.doSign);
var makeCheckbox = function($label) {
return $label.css({
'padding': '2px 6px',
'border-color': (!bSig ? '#C00;color:#A00' : '')
}).addClass((bSig ? 'usermessage' : '')).after(threadSignBtns);
};
var makeCheckboxOOUI = function() {
mw.loader.using('oojs-ui-core').done(function() {
var checkbox = new OO.ui.CheckboxInputWidget(oBox);
var field = new OO.ui.FieldLayout(checkbox, oLabel);
ts.onoff = function(on) {
checkbox.setSelected(on);
};
ts.$sigBox = checkbox.$element.find('input').updateTooltipAccessKeys();
ts.$label = makeCheckbox(field.$element.find('label'));
ts.$sigBox.on('change', ts.toggleSigBox);
checkbox.on('change', function() {
if (checkbox.isSelected())
ts.enable();
else
ts.disable();
});
$('.editCheckboxes > .oo-ui-layout').append(field.$element);
});
};
var makeCheckboxCommon = function() {
oLabel.text = oLabel.label;
var $label = $('<label>', oLabel),
$checkbox = $('<span>').addClass('oo-ui-fieldLayout-body');
ts.$sigBox = $('<input>', oBox).on('change', ts.toggleSigBox).updateTooltipAccessKeys();
ts.$sigBox.on('change', ts.toggleSigBox);
$checkbox.append(ts.$sigBox, $label);
ts.$label = makeCheckbox($label);
$('.editCheckboxes').append($checkbox);
};
if (!ts.$sigBox.length) {
if ($('#wpSummaryLabel').hasClass('oo-ui-layout'))
makeCheckboxOOUI();
else
makeCheckboxCommon();
}
},
useLivePreview: function() {
if (((minoredit && !minoredit.checked) || ts.$sigBox.prop('checked')) && mw.user.options.get('uselivepreview') != 1) {
mw.user.options.set('uselivepreview', 1);
mw.loader.load('mediawiki.action.edit.preview');
}
},
toggleSigBox: function() {
ts.useLivePreview();
ts.$label.toggleClass('usermessage');
},
offSigBox: function(e) {
if (e.type && e.type === 'change')
e = e.target;
if (!ts.$sigBox.prop('checked'))
return;
ts.$sigBox.prop('disabled', e.checked);
},
doSign: function(e) {
function _chkEdit(c, pos) {
pos = txt.indexOf(c, pos--);
if (pos > 1) {
var txtEnd = txt.substr(pos, 24).replace(/(^\s+)/, '');
var txtNewEnd = txt.slice(pos - 16, pos);
var oldp = (c === '\n') ? txtOld.lastIndexOf(txtEnd) : 0;
if (!oldp && /-->$/.test(txtEnd)) {
c = txt.lastIndexOf('<!--');
if (c < pos)
pos = c--;
}
if (oldp !== -1 && oldp < pos - 3 && txtOld.indexOf(txtNewEnd + RegExp.$1 + txtEnd) === -1) {
return pos;
}
}
}
var tolerance = 4;
var txt = $.trim($textarea.val());
if ((minoredit && minoredit.checked) || !ts.$sigBox.prop('checked'))
return ts.rmvIndent(txt, CmtE);
if (!txt)
return;
var cOld = ts._cntOcc(txtOld),
cNew = ts._cntOcc(txt),
oldp, txtEnd, pos;
if (cNew[0] - cNew[1])
return ts.rmvIndent(txt, CmtE);
if (cNew[0] <= cOld[1]) {
if (!CmtE) {
mw.log("lrLen,txtEndLen", lrLen, txtEndLen);
txtEnd = [txt.substr(txtEndLen - (lrLen ? lrLen + 1 : 0), -txtEndLen), txt.slice(txtEndLen)];
oldp = txtOldL + txtEndLen;
mw.log('Is last line identical?\n"%s"\n"%s"', txtOldEnd, txtEnd, txtEnd[1]);
if (!txtOld || $.inArray(txtOldEnd, txtEnd) < 0) {
return ts.doSig(e, -1);
}
}
pos = $textarea.textSelection('getCaretPosition');
pos = _chkEdit('\n', pos);
if (pos) {
return ts.doSig(e, pos);
}
txt = ts.rmvIndent(txt, CmtE);
if (txt.length > (txtOldL + tolerance)) {
var lines = txt.match(/.+/gm) || [],
linesOld = txtOld.match(/.+/gm) || [];
if (lines.length > linesOld.length) {
lines = lines.filter(function(x) {
return linesOld.indexOf(x) < 0;
}).pop() || [];
if (lines.length) {
pos = txt.lastIndexOf(lines);
return ts.doSig(e, pos + lines.length);
}
}
}
if (CmtE) {
pos = _chkEdit('<!--', txtLen);
if (pos)
return ts.doSig(e, pos);
}
}
if (e.target.name === 'wpSave') {
$editform.submit(function(e) {
if (!confirm(signTxt.confirm)) {
e.preventDefault();
e.stopPropagation();
mw.log.warn(name, txtOld, txt);
return false;
}
});
}
return e;
}
};
mw.libs.threadSign = ts;
if (mw.config.get('wgPageContentModel') === 'wikitext') {
$(document).trigger('loadWikiScript', ['Perhelion/signing.js', ts]);
$.when(mw.loader.using(['jquery.textSelection', 'mediawiki.language', 'user.options', 'mediawiki.util']), $.ready).then(function() {
$(ts.init);
});
}
}
(jQuery, mediaWiki));
// EOF </nowiki>