User:LinguistAtLarge/twinkleprodlog.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:LinguistAtLarge/twinkleprodlog. |
// Available configuration variables
// To enable logging of all the pages you propose for deletion, set this variable to the name of a sub-page in your user space where you want the pages to be logged to
//TwinkleConfig.logProdPage = '';
// If you want to change the format for each line of the log, you can to it here (for example if you want to format it as a list, table etc.)
//TwinkleConfig.logProdLineTemplate = "\*\[\[%PAGENAME%\]\] — %REASON% (%PRODTYPE%) — \~\~\~\~\~";
// Set this to true to add new lines at the bottom of your log file, or false to add new lines to the top
//TwinkleConfig.logProdAddBottom = true;
if (twinkleprod){(function(){
// save a backup copy for the fun of it
twinkleprod.callbacks.tagPageOriginal = twinkleprod.callbacks.tagPage;
// replace the tagPage function; identical to the original except for the prodlog section
twinkleprod.callbacks.tagPage = function(self)
{
var form = self.responseXML.getElementById('editform');
var text = form.wpTextbox1.value;
var tag_re = /(\{\{(?:db-?|delete|[aitcmrs]fd|md1)[^{}]*?\|?[^{}]*?\}\})/i;
if( tag_re.test( text ) ) {
self.statelem.warn( 'Page already tagged with a deletion template, aborting procedure' );
return;
}
var prod_re = /\{\{dated prod.*?\}\}/i;
if( !prod_re.test( text ) ) {
// 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;
var query = {
'title': 'User talk:' + user,
'action': 'submit'
};
var wikipedia_wiki = new Wikipedia.wiki( 'Notifying of initial contributor (' + user + ')', query, twinkleprod.callbacks.userNotification );
wikipedia_wiki.params = self.params;
wikipedia_wiki.get();
}
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();
}
var summaryText = "Proposing article for deletion per [[WP:PROD]].";
text = "\{\{subst:prod|1=" + self.params.reason + "\}\}\n" + text;
} else {
var prod2_re = /\{\{prod-?2.*?\}\}/;
if( prod2_re.test( text ) ) {
self.statelem.warn( 'Page already tagged with \{\{prod\}\} and \{\{prod-2\}\} templates, aborting procedure' );
return;
}
self.statelem.info( "A \{\{dated prod\}\} tag was already found on this article" );
if( !confirm( "Would you like to add a \{\{prod-2\}\} tag with your reason?" ) ) {
self.statelem.info( 'Aborted per user request' );
return;
}
var summaryText = "Endorsing proposed deletion per [[WP:PROD]].";
text = text.replace( prod_re, text.match( prod_re ) + "\n\{\{subst:prod-2|1=" + self.params.reason + "\}\}\n" );
}
// ######################################################
// log this action to the user's prodlog
// ######################################################
if( typeof( TwinkleConfig.logProdPage ) == 'undefined' )
{
TwinkleConfig.logProdPage = '';
}
if( typeof( TwinkleConfig.logProdLineTemplate ) == 'undefined' )
{
TwinkleConfig.logProdLineTemplate = "\*\[\[%PAGENAME%\]\] — %REASON% (%PRODTYPE%) — \~\~\~\~\~";
}
if( typeof( TwinkleConfig.logProdAddBottom ) == 'undefined' )
{
TwinkleConfig.logProdAddBottom = true;
}
if (TwinkleConfig.logProdPage)
{
self.params.prod_type = 'Endorsement';
if (typeof(prod2_re) == 'undefined')
{
self.params.prod_type = 'Proposal'
}
var prodlogcallback = function(self)
{
var form = this.responseXML.getElementById( 'editform' );
var text = TwinkleConfig.logProdLineTemplate.replace(/%PAGENAME%/, wgPageName);
text = text.replace(/%REASON%/, self.params.reason);
text = text.replace(/%PRODTYPE%/, self.params.prod_type);
if (TwinkleConfig.logProdAddBottom)
{
text = form.wpTextbox1.value + text;
}
else
{
text += "\n" + form.wpTextbox1.value;
}
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 PROD nomination of \[\[' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
'wpTextbox1': text,
};
self.post(postData);
};
var prodlogquery = {
'title': 'User:' + wgUserName + '/' + TwinkleConfig.logProdPage,
'action': 'submit'
};
var prodlog_wiki = new Wikipedia.wiki('Logging page to PROD log.', prodlogquery, prodlogcallback);
prodlog_wiki.params = self.params;
prodlog_wiki.get();
}
// ######################################################
// done logging this action to the user's prodlog
// ######################################################
var postData = {
'wpMinoredit': undefined, // Per memo
'wpWatchthis': TwinkleConfig.watchProdPages ? '' : form.wpWatchthis.checked ? '' : undefined,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSection': '',
'wpSummary': summaryText + TwinkleConfig.summaryAd,
'wpTextbox1': text
};
self.post( postData );
};
// add fake prod tab (so I can test this in my sandbox)
//addOnloadHook(function(){addPortletLink( 'p-cactions', "javascript:twinkleprod.callback()", "fake prod", "tw-fake-prod", "Propose deletion via WP:PROD", "")});
})();}