User:Bosco/Unsigned helper.js: Difference between revisions

From Test Wiki
Content deleted Content added
test literal '{{}}'
doAddUnsignedTemplate: extract function from unsignedHelperAddUnsignedTemplate; unsignedHelperAddUnsignedTemplate: rename parameter to "event" for clarity
Line 33: Line 33:
editSummaryField.val(newText);
editSummaryField.val(newText);
}
}
function doAddUnsignedTemplate() {
var f = document.getElementById('editform');
var e = f.elements.wpTextbox1;
var pos = $(e).textSelection('getCaretPosition', { startAndEnd: true });
var txt;
if (pos[0] != pos[1]) {
txt = e.value.substring(pos[0], pos[1]);
pos = pos[1];
} else {
pos = pos[1];
if (pos <= 0)
pos = e.value.length;
txt = e.value.substr(0, pos);
txt = txt.replace(new RegExp('[\\s\\S]*\\d\\d:\\d\\d, \\d+ (' + months.join('|') + ') \\d\\d\\d\\d \\(UTC\\)'), '');
txt = txt.replace(/[\s\S]*\n=+.*=+\s*\n/, '');
}
txt = txt.replace(/^\s+|\s+$/g, '');


var rvct = 1;
window.unsignedHelperAddUnsignedTemplate = function(evt) {
var dialog = $('<div>Examining revision 1...</div>').dialog({
mw.loader.using(['mediawiki.util', 'jquery.ui'], function () {
buttons: {
var f = document.getElementById('editform');
Cancel: function () {
var e = f.elements.wpTextbox1;
dialog.dialog('close');
var pos = $(e).textSelection('getCaretPosition', { startAndEnd: true });
var txt;
} },
modal: true,
if (pos[0] != pos[1]) {
title: 'Adding {{unsigned}}'
txt = e.value.substring(pos[0], pos[1]);
});
pos = pos[1];
} else {
pos = pos[1];
if (pos <= 0)
pos = e.value.length;
txt = e.value.substr(0, pos);
txt = txt.replace(new RegExp('[\\s\\S]*\\d\\d:\\d\\d, \\d+ (' + months.join('|') + ') \\d\\d\\d\\d \\(UTC\\)'), '');
txt = txt.replace(/[\s\S]*\n=+.*=+\s*\n/, '');
}
txt = txt.replace(/^\s+|\s+$/g, '');


var rvct = 1;
var revid, user, ts, comment, template;
var q = {
var dialog = $('<div>Examining revision 1...</div>').dialog({
url: mw.util.wikiScript('api'),
buttons: {
dataType: 'json',
Cancel: function () {
type: 'POST',
dialog.dialog('close');
} },
data: {
modal: true,
format: 'json',
title: 'Adding {{unsigned}}'
action: 'query',
titles: mw.config.get('wgPageName'),
});
prop: 'revisions',
rvprop: 'ids|timestamp|user|parsedcomment|content',
rvlimit: 1,
rawcontinue: 1
},
success: function (r, sts, xhr) {
if (!dialog.dialog('isOpen'))
return;


if (!r.query || !r.query.pages) {
var revid, user, ts, comment, template;
dialog.html('<span style="color:red"><b>Error:</b> Bad response from API</span>');
var q = {
if (window.console && typeof (window.console.error) == 'function')
url: mw.util.wikiScript('api'),
window.console.error("Bad response", r);
dataType: 'json',
type: 'POST',
return;
data: {
}
format: 'json',
action: 'query',
titles: mw.config.get('wgPageName'),
prop: 'revisions',
rvprop: 'ids|timestamp|user|parsedcomment|content',
rvlimit: 1,
rawcontinue: 1
},
success: function (r, sts, xhr) {
if (!dialog.dialog('isOpen'))
return;


if (!r.query || !r.query.pages) {
for (var k in r.query.pages) {
var rr = r.query.pages[k].revisions[0];
dialog.html('<span style="color:red"><b>Error:</b> Bad response from API</span>');
var cont = function () {
if (window.console && typeof (window.console.error) == 'function')
if (r['query-continue'] && r['query-continue'].revisions) {
window.console.error("Bad response", r);
dialog.html('Evaluating revision ' + (++rvct) + '...');
return;
q.data.rvcontinue = r['query-continue'].revisions.rvcontinue;
}
$.ajax(q);
} else {
var t = makeUnsignedTemplate(user, ts, template);
var tt = e.value.substr(0, pos).replace(/\s*$/, ' ') + t;
e.value = tt + e.value.substr(pos);
$(e).textSelection('setSelection', {
start: tt.length });
appendToEditSummary(`mark unsigned [[Special:Diff/${revid}]]`);
dialog.dialog('close');
}
};


if (typeof (rr['*']) != 'undefined' && rr['*'].indexOf(txt) < 0) {
for (var k in r.query.pages) {
if (!user) {
var rr = r.query.pages[k].revisions[0];
dialog.html('<span style="color:red"><b>Error:</b> Text was not found in the starting revision! Did you edit it?</span>');
var cont = function () {
return;
if (r['query-continue'] && r['query-continue'].revisions) {
}
dialog.html('Evaluating revision ' + (++rvct) + '...');
var cb = function () {
q.data.rvcontinue = r['query-continue'].revisions.rvcontinue;
var t = makeUnsignedTemplate(user, ts, template);
$.ajax(q);
var tt = e.value.substr(0, pos).replace(/\s*$/, ' ') + t;
} else {
var t = makeUnsignedTemplate(user, ts, template);
e.value = tt + e.value.substr(pos);
$(e).textSelection('setSelection', {
var tt = e.value.substr(0, pos).replace(/\s*$/, ' ') + t;
e.value = tt + e.value.substr(pos);
start: tt.length });
appendToEditSummary(`unsigned [[Special:Diff/${revid}]]`);
$(e).textSelection('setSelection', {
start: tt.length });
dialog.dialog('close');
appendToEditSummary(`mark unsigned [[Special:Diff/${revid}]]`);
dialog.dialog('close');
}
};
};
if (/reverted|undid/i.test(comment)) {

var dialog2 = $('<div>')
if (typeof (rr['*']) != 'undefined' && rr['*'].indexOf(txt) < 0) {
if (!user) {
.append(
'The ',
dialog.html('<span style="color:red"><b>Error:</b> Text was not found in the starting revision! Did you edit it?</span>');
return;
$('<a>').prop({
href: '/w/index.php?diff=prev&oldid=' + revid, target: '_blank' }).text('found revision'),
}
var cb = function () {
' may be a revert: ',
comment
var t = makeUnsignedTemplate(user, ts, template);
)
var tt = e.value.substr(0, pos).replace(/\s*$/, ' ') + t;
e.value = tt + e.value.substr(pos);
.dialog({
title: "Possible revert!",
$(e).textSelection('setSelection', {
start: tt.length });
modal: true,
buttons: {
appendToEditSummary(`unsigned [[Special:Diff/${revid}]]`);
"Use that revision": function () {
dialog.dialog('close');
};
dialog2.dialog('close');
cb();
if (/reverted|undid/i.test(comment)) {
var dialog2 = $('<div>')
},
.append(
"Keep looking": function () {
'The ',
dialog2.dialog('close');
$('<a>').prop({
cont();
},
href: '/w/index.php?diff=prev&oldid=' + revid, target: '_blank' }).text('found revision'),
' may be a revert: ',
"Cancel": function () {
comment
dialog2.dialog('close');
)
dialog.dialog('close');
.dialog({
},
title: "Possible revert!",
}
modal: true,
});
buttons: {
"Use that revision": function () {
dialog2.dialog('close');
cb();
},
"Keep looking": function () {
dialog2.dialog('close');
cont();
},
"Cancel": function () {
dialog2.dialog('close');
dialog.dialog('close');
},
}
});
} else {
cb();
}
} else {
} else {
revid = rr.revid;
cb();
user = rr.user;
ts = rr.timestamp;
comment = rr.parsedcomment;
if (typeof (rr.anon) !== 'undefined') {
template = 'Unsigned IP';
} else if (typeof (rr.temp) !== 'undefined') {
// Seems unlikely "temporary" users will have a user page, so this seems the better template for them for now.
template = 'Unsigned IP';
} else {
template = 'Unsigned';
}
cont();
}
}
return;
} else {
revid = rr.revid;
user = rr.user;
ts = rr.timestamp;
comment = rr.parsedcomment;
if (typeof (rr.anon) !== 'undefined') {
template = 'Unsigned IP';
} else if (typeof (rr.temp) !== 'undefined') {
// Seems unlikely "temporary" users will have a user page, so this seems the better template for them for now.
template = 'Unsigned IP';
} else {
template = 'Unsigned';
}
cont();
}
}
return;
dialog.html('<span style="color:red"><b>Error:</b> No revisions found in the page!</span>');
},
error: function (xhr, textStatus, errorThrown) {
if (!dialog.dialog('isOpen'))
return;
dialog.html('<span style="color:red"><b>Error:</b> ' + textStatus + ' ' + errorThrown + '</span>');
}
}
dialog.html('<span style="color:red"><b>Error:</b> No revisions found in the page!</span>');
};
},
if (f.elements.baseRevId)
error: function (xhr, textStatus, errorThrown) {
q.data.rvstartid = f.elements.baseRevId.value;
if (!dialog.dialog('isOpen'))
$.ajax(q);
});
return;
dialog.html('<span style="color:red"><b>Error:</b> ' + textStatus + ' ' + errorThrown + '</span>');
evt.preventDefault();
}
evt.stopPropagation();
};
if (f.elements.baseRevId)
q.data.rvstartid = f.elements.baseRevId.value;
$.ajax(q);
}

window.unsignedHelperAddUnsignedTemplate = function(event) {
mw.loader.using(['mediawiki.util', 'jquery.ui'], doAddUnsignedTemplate);
event.preventDefault();
event.stopPropagation();
return false;
return false;
}
}