User:Radar33/twinkle/speedylogaddon.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:Radar33/twinkle/speedylogaddon. |
/// Code taken from [[User:Timotheus Canens/twinklespeedy.js]], modified from [[User:AzaToth/twinklespeedy.js]]
// If TwinkleConfig aint exist.
if( typeof( TwinkleConfig ) == 'undefined' ) {
TwinkleConfig = {};
}
/**
TwinkleConfig.noLogOnSpeedyNomination (array)
What types of actions that should not be logged in the CSD log.
Default is U1 (user request).
*/
if( typeof( TwinkleConfig.noLogOnSpeedyNomination ) == 'undefined' ) {
TwinkleConfig.noLogOnSpeedyNomination = ['u1'];
}
/**
TwinkleConfig.neverLogSpeedyNomination (boolean)
Whether speedy nomination should be logged at all, default false.
*/
if( typeof( TwinkleConfig.neverLogSpeedyNomination ) == 'undefined' ) {
TwinkleConfig.neverLogSpeedyNomination = false;
}
/**
TwinkleConfig.speedyLogPageName (string)
The name of the userspace subpage in which speedy nominations should be logged.
Default "CSDlog".
*/
if( typeof( TwinkleConfig. speedyLogPageName ) == 'undefined' ) {
TwinkleConfig.speedyLogPageName = "CSDlog";
}
//if [[User:AzaToth/twinklespeedy.js]] is updated, double check the following function, and add
/*
lognomination: (TwinkleConfig.noLogOnSpeedyNomination.indexOf( normalized ) == -1) && (!TwinkleConfig.neverLogSpeedyNomination)
*/
//into the "var params" array
twinklespeedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
wgPageName = wgPageName.replace( /_/g, ' ' ); // for queen/king/whatever and country!
var value = e.target.value;
if (value == 'multiple')
{
e.target.form.style.display = "none"; // give the user a cue that the dialog is being changed
twinklespeedy.targetdialogcontent = e.target.form.parentNode; // make this accessible in scopeless setTimeout
setTimeout("twinklespeedy.initDialog(twinklespeedy.callback.doMultiple, false, twinklespeedy.targetdialogcontent)", 150);
return;
}
if (value == 'multiple-finish')
value = 'multiple';
else
{
// clear these out, whatever the case, to avoid errors
twinklespeedy.dbmultipleCriteria = [];
twinklespeedy.dbmultipleParameters = [];
}
var normalized = twinklespeedy.normalizeHash[ value ];
// analyse each db-multiple criterion to determine whether to watch the page/notify the creator
var watchPage = false;
if (value == 'multiple')
{
for (var i in twinklespeedy.dbmultipleCriteria)
{
if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string' &&
TwinkleConfig.watchSpeedyPages.indexOf(twinklespeedy.dbmultipleCriteria[i]) != -1)
{
watchPage = true;
break;
}
}
}
else watchPage = TwinkleConfig.watchSpeedyPages.indexOf(normalized) != -1;
var notifyuser = false;
if (value == 'multiple')
{
for (var i in twinklespeedy.dbmultipleCriteria)
{
if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string' &&
TwinkleConfig.notifyUserOnSpeedyDeletionNomination.indexOf(twinklespeedy.dbmultipleCriteria[i]) != -1)
{
notifyuser = true;
break;
}
}
}
else notifyuser = (TwinkleConfig.notifyUserOnSpeedyDeletionNomination.indexOf(normalized) != -1) && e.target.form.notify.checked;
var params = {
value: value,
normalized: normalized,
watch: watchPage,
usertalk: notifyuser,
rcid: QueryString.exists( 'rcid' ) ? QueryString.get( 'rcid' ) : '',
wgCanonicalNamespace : wgCanonicalNamespace,
// begin add-on (with addition of comma above
lognomination: (TwinkleConfig.noLogOnSpeedyNomination.indexOf( normalized ) == -1) && (!TwinkleConfig.neverLogSpeedyNomination)
// end add-on
};
Status.init( e.target.form );
Wikipedia.actionCompleted.redirect = wgPageName;
Wikipedia.actionCompleted.notice = "Tagging complete";
var query = {
'action': 'query',
'titles': wgPageName
}
var wikipedia_api = new Wikipedia.api( 'Checking if page exists', query, twinklespeedy.callbacks.user.main );
wikipedia_api.params = params;
wikipedia_api.post();
}
// if [[User:AzaToth/twinklespeedy.js]] is updated, double check the following function, and add
/*
else if( self.params.lognomination ) {
var query = {
'title': 'User:' + wgUserName +'/' + TwinkleConfig.speedyLogPageName,
'action': 'submit'
};
var wikipedia_wiki = new Wikipedia.wiki( 'Logging CSD nomination', query, twinklespeedy.callbacks.user.userLog );
wikipedia_wiki.params = self.params;
wikipedia_wiki.get();
}
*/
// after the "if( self.params.usertalk ) {" block
twinklespeedy.callbacks.user.tagPage = function( self ) {
form = this.responseXML.getElementById( 'editform' );
var text = form.wpTextbox1.value;
self.statelem.status( 'Checking for tags on the page...' );
// check for existing deletion tags
var tag = /(\{\{\s*(?:db|delete|db-.*?)(?:\||\s*\}\}))/.exec( text );
if( tag ) {
self.statelem.error( [ htmlNode( 'strong', tag[0] ) , " is already placed on the page." ] )
return;
}
var xfd = /(\{\{(?:[rsaiftcm]fd|md1)[^{}]*?\}\})/i.exec( text );
if( xfd && !confirm( "The deletion related template " + xfd[0] + " is already present on the page, do you still want to apply CSD template?" ) ) {
return;
}
var code;
var parameters;
if (self.params.normalized == 'multiple')
{
code = "\{\{db-multiple";
for (var i in twinklespeedy.dbmultipleCriteria)
if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string')
code += "|" + twinklespeedy.dbmultipleCriteria[i].toUpperCase();
for (var i in twinklespeedy.dbmultipleParameters)
if (typeof twinklespeedy.dbmultipleParameters[i] == 'string')
code += "|" + i + "=" + twinklespeedy.dbmultipleParameters[i];
code += "\}\}";
self.params.utparams = [];
}
else
{
parameters = twinklespeedy.getParameters(self.params.value, self.params.normalized, self.statelem);
if (!parameters) return;
code = "\{\{db-" + self.params.value;
for (var i in parameters)
if (typeof parameters[i] == 'string')
code += "|" + i + "=" + parameters[i];
code += "\}\}";
self.params.utparams = twinklespeedy.getUserTalkParameters(self.params.normalized, parameters);
}
if( TwinkleConfig.markSpeedyPagesAsPatrolled && self.params.rcid != '' ) {
// extract patrol token from "Mark page as patrolled" link on page
var patrollinkmatch = /token=(.+)%2B%5C$/.exec($('.patrollink a').attr('href'));
if (patrollinkmatch) {
var patroltoken = patrollinkmatch[1] + "+\\";
var patrolstat = new Status("Marking page as patrolled", "Doing...");
(Wikipedia.numberOfActionsLeft)++;
var query = {
'title': wgPageName,
'action': 'markpatrolled',
'rcid': self.params.rcid,
'token': patroltoken
};
jQuery.ajax( {
context: patrolstat,
type: 'GET',
url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php',
data: QueryString.create(query),
dataType: 'xml',
success: function(xml, textStatus, jqXHR) {
this.info(textStatus);
Wikipedia.actionCompleted();
},
error: function(jqXHR, textStatus, errorThrown) {
if (textStatus == "parsererror") { // kludge for Firefox 4.0b12
this.info("Done");
Wikipedia.actionCompleted();
} else {
this.error(textStatus + ': ' + errorThrown + ' occurred while trying to mark as patrolled.');
}
}
} );
}
}
// Notification to first contributor
var query = {
'action': 'query',
'prop': 'revisions',
'titles': wgPageName,
'rvlimit': 1,
'rvprop': 'user',
'rvdir': 'newer'
}
var callback = function( self ) {
var xmlDoc = self.responseXML;
var user = xmlDoc.evaluate( '//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;
if( wgPageName != ( 'User talk:' + user ) ) {
var query = {
'title': 'User talk:' + user,
'action': 'submit'
};
var wikipedia_wiki = new Wikipedia.wiki( 'Notifying of initial contributor (' + user + ')', query, twinklespeedy.callbacks.user.userNotification );
wikipedia_wiki.params = self.params;
wikipedia_wiki.get();
} else {
Status.info( 'Info', 'Current page is initial contributor\'s talk page, aborting notification' );
}
}
if( self.params.usertalk ) {
var wikipedia_api = new Wikipedia.api( 'Grabbing data of initial contributor', query, callback );
wikipedia_api.params = self.params;
wikipedia_api.post();
}
// begin add-on
else if( self.params.lognomination ) {
var query = {
'title': 'User:' + wgUserName +'/' + TwinkleConfig.speedyLogPageName,
'action': 'submit'
};
var wikipedia_wiki = new Wikipedia.wiki( 'Logging CSD nomination', query, twinklespeedy.callbacks.user.userLog );
wikipedia_wiki.params = self.params;
wikipedia_wiki.get();
}
// end add-on
//wrap SD template in noinclude tags if we are in template space.
//won't work with userboxes in userspace, or any other transcluded page outside template space
if (self.params.wgCanonicalNamespace == "Template") code = "<noinclude>" + code + "</noinclude>";
//Remove tags that become superfluous with this action
text = text.replace(/{\{\s*(New unreviewed article|Userspace draft)\s*(\|(?:{{[^{}]*}}|[^{}])*)?}}\s*/ig, "");
// Generate edit summary for edit
var editsummary;
switch (self.params.normalized)
{
case 'db':
editsummary = 'Requesting [[WP:CSD|speedy deletion]] with rationale \"' + parameters["1"] + '\".';
break;
case 'multiple':
editsummary = 'Requesting speedy deletion (';
for (var i in twinklespeedy.dbmultipleCriteria)
if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string')
editsummary += '[[WP:CSD#' + twinklespeedy.dbmultipleCriteria[i].toUpperCase() + '|CSD ' + twinklespeedy.dbmultipleCriteria[i].toUpperCase() + ']], ';
editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
editsummary += ').';
break;
default:
editsummary = "Requesting speedy deletion ([[WP:CSD#" + self.params.normalized.toUpperCase() + "|CSD " + self.params.normalized.toUpperCase() + "]]).";
break;
}
var postData = {
'wpMinoredit': TwinkleConfig.markSpeedyPagesAsMinor ? '' : undefined,
'wpWatchthis': (self.params.watch || form.wpWatchthis.checked ) ? '' : undefined,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSection': '',
'wpSummary': editsummary + TwinkleConfig.summaryAd,
'wpTextbox1': code + ((self.params.normalized == 'g10' || twinklespeedy.dbmultipleCriteria.indexOf('g10') != -1) ?
'' : ("\n" + text) ) // cause attack pages to be blanked
};
self.post( postData );
}
twinklespeedy.callbacks.user.userLog = function( self ) {
var form = self.responseXML.getElementById( 'editform' );
var text = form.wpTextbox1.value;
var date = new Date();
var headerRe = new RegExp( "^==+\\s*(?:" + date.getUTCMonthName() + '|' + date.getUTCMonthNameAbbrev() + ")\\s+" + date.getUTCFullYear() + "\\s*==+", 'm' );
if( !headerRe.exec( text ) ) {
Status.info( 'Info', 'Will create a new level 2 heading for the date, as none was found for this month' );
var heading = date.getUTCMonthName() + " " + date.getUTCFullYear();
text += "<noinclude>\n== " + heading + " ==\n</noinclude>";
text += "<includeonly>\n; " + heading + " \n</includeonly>\n";
}
text += "* [[:" + wgPageName + "]]: [[WP:CSD#" + self.params.normalized.toUpperCase() + "|CSD " + self.params.normalized.toUpperCase() + "]] (\{\{tl|db-" + self.params.value + "\}\})";
if ( typeof (self.params.notifieduser) != 'undefined')
text += "; notified: \{\{user|" + self.params.notifieduser + "\}\}";
text += " \~\~\~\~\~";
var postData = {
'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
'wpWatchthis': form.wpWatchthis.checked ? '' : undefined,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSection': '',
'wpSummary': 'Logging speedy deletion nomination of \[\[:' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
'wpTextbox1': text
};
self.post( postData );
}