MediaWiki:Gadget-twinkleimage.js
Jump to navigation
Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
Documentation for this user script can be added at MediaWiki:Gadget-twinkleimage. |
// <nowiki>
(function($) {
/*
****************************************
*** twinkleimage.js: Image CSD module
****************************************
* Mode of invocation: Tab ("DI")
* Active on: Local nonredirect file pages (not on Commons)
*/
Twinkle.image = function twinkleimage() {
if (mw.config.get('wgNamespaceNumber') === 6 && mw.config.get('wgArticleId') && !Morebits.isPageRedirect()) {
Twinkle.addPortletLink(Twinkle.image.callback, 'DI', 'tw-di', 'Nominate file for delayed speedy deletion');
}
};
Twinkle.image.callback = function twinkleimageCallback() {
var Window = new Morebits.simpleWindow(600, 330);
Window.setTitle('File for dated speedy deletion');
Window.setScriptName('Twinkle');
Window.addFooterLink('Speedy deletion policy', 'COM:CSD#Files');
Window.addFooterLink('Image prefs', 'COM:TW/PREF#image');
Window.addFooterLink('Twinkle help', 'COM:TW');
Window.addFooterLink('Give feedback', 'Commons talk:TW');
var form = new Morebits.quickForm(Twinkle.image.callback.evaluate);
form.append({
type: 'checkbox',
list: [
{
label: 'Notify original uploader',
value: 'notify',
name: 'notify',
tooltip: "Uncheck this if you are planning to make multiple nominations from the same user, and don't want to overload their talk page with too many notifications.",
checked: Twinkle.getPref('notifyUserOnDeli')
}
]
}
);
var field = form.append({
type: 'field',
label: 'Type of action wanted'
});
field.append({
type: 'radio',
name: 'type',
event: Twinkle.image.callback.choice,
list: [
{
label: 'No source (CSD F5)',
value: 'no source',
checked: true,
tooltip: 'Image or media has no source information'
},
{
label: 'No license (CSD F5)',
value: 'no license',
tooltip: 'Image or media does not have information on its copyright status'
},
{
label: 'No evidence of permission (CSD F5)',
value: 'no permission',
tooltip: 'Image or media does not have proof that the author agreed to licence the file'
}
]
});
form.append({
type: 'div',
label: 'Work area',
name: 'work_area'
});
form.append({ type: 'submit' });
var result = form.render();
Window.setContent(result);
Window.display();
// We must init the parameters
var evt = document.createEvent('Event');
evt.initEvent('change', true, true);
result.type[0].dispatchEvent(evt);
};
Twinkle.image.callback.choice = function twinkleimageCallbackChoose(event) {
var value = event.target.values;
var root = event.target.form;
var work_area = new Morebits.quickForm.element({
type: 'div',
name: 'work_area'
});
switch (value) {
case 'no source':
work_area.append({
type: 'checkbox',
list: [
{
name: 'derivative',
label: 'Derivative work which lacks a source for incorporated works',
tooltip: 'File is a derivative of one or more other works whose source is not specified'
}
]
});
break;
case 'no license':
break;
case 'no permission':
break;
default:
break;
}
root.replaceChild(work_area.render(), $(root).find('div[name="work_area"]')[0]);
};
Twinkle.image.callback.evaluate = function twinkleimageCallbackEvaluate(event) {
var input = Morebits.quickForm.getInputData(event.target);
if (input.replacement) {
input.replacement = (new RegExp('^' + Morebits.namespaceRegex(6) + ':', 'i').test(input.replacement) ? '' : 'File:') + input.replacement;
}
var csdcrit;
switch (input.type) {
case 'no source':
case 'no license':
case 'no permission':
csdcrit = 'F5';
break;
default:
throw new Error('Twinkle.image.callback.evaluate: unknown criterion');
}
var lognomination = Twinkle.getPref('logSpeedyNominations') && Twinkle.getPref('noLogOnSpeedyNomination').indexOf(csdcrit.toLowerCase()) === -1;
var templatename = input.derivative ? 'dw ' + input.type : input.type;
var params = $.extend({
templatename: templatename,
derivative: input.derivative,
normalized: csdcrit,
lognomination: lognomination
}, input);
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(event.target);
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = 'Tagging complete';
// Tagging image
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Tagging file with deletion tag');
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.image.callbacks.taggingImage);
// Notifying uploader
if (input.notify) {
wikipedia_page.lookupCreation(Twinkle.image.callbacks.userNotification);
} else {
// add to CSD log if desired
if (lognomination) {
Twinkle.image.callbacks.addToLog(params, null);
}
// No auto-notification, display what was going to be added.
var noteData = document.createElement('pre');
noteData.appendChild(document.createTextNode('{{subst:di-' + templatename + '-notice|1=File:' + mw.config.get('wgTitle') + '}} ~~~~'));
Morebits.status.info('Notification', [ 'Following/similar data should be posted to the original uploader:', document.createElement('br'), noteData ]);
}
};
Twinkle.image.callbacks = {
taggingImage: function(pageobj) {
var text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
var tag = '';
switch (params.type) {
case 'no license':
tag = '{{subst:nld}}';
break;
case 'no source':
if (params.derivative) {
tag = '{{subst:dw-nsd}}';
} else {
tag = '{{subst:nsd}}';
}
break;
case 'no permission':
tag = '{{subst:npd}}';
break;
default:
break; // doesn't matter
}
// tag += '|help=off}}\n';
tag += '\n';
pageobj.setPageText(tag + text);
pageobj.setEditSummary('This file is up for deletion, per [[COM:CSD#' + params.normalized + '|CSD ' + params.normalized + ']] (' + params.type + ').');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setWatchlist(Twinkle.getPref('deliWatchPage'));
pageobj.setCreateOption('nocreate');
pageobj.save();
},
userNotification: function(pageobj) {
var params = pageobj.getCallbackParameters();
var initialContrib = pageobj.getCreator();
// disallow warning yourself
if (initialContrib === mw.config.get('wgUserName')) {
pageobj.getStatusElement().warn('You (' + initialContrib + ') created this page; skipping user notification');
} else {
var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, 'Notifying initial contributor (' + initialContrib + ')');
var notifytext = '\n{{subst:di-' + params.templatename + '-notice|1=File:' + mw.config.get('wgTitle');
notifytext += '}} ~~~~';
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary('Notification: tagging for deletion of [[:' + Morebits.pageNameNorm + ']].');
usertalkpage.setChangeTags(Twinkle.changeTags);
usertalkpage.setCreateOption('recreate');
usertalkpage.setWatchlist(Twinkle.getPref('deliWatchUser'));
usertalkpage.setFollowRedirect(true, false);
usertalkpage.append();
}
// add this nomination to the user's userspace log, if the user has enabled it
if (params.lognomination) {
Twinkle.image.callbacks.addToLog(params, initialContrib);
}
},
addToLog: function(params, initialContrib) {
var usl = new Morebits.userspaceLogger(Twinkle.getPref('speedyLogPageName'));
usl.initialText =
"This is a log of all [[WP:CSD|speedy deletion]] nominations made by this user using [[WP:TW|Twinkle]]'s CSD module.\n\n" +
'If you no longer wish to keep this log, you can turn it off using the [[Wikipedia:Twinkle/Preferences|preferences panel]], and ' +
'nominate this page for speedy deletion under [[WP:CSD#U1|CSD U1]].' +
(Morebits.userIsSysop ? '\n\nThis log does not track outright speedy deletions made using Twinkle.' : '');
var formatParamLog = function(normalize, csdparam, input) {
if (normalize === 'F5' && csdparam === 'replacement') {
input = '[[:' + input + ']]';
}
return ' {' + normalize + ' ' + csdparam + ': ' + input + '}';
};
var extraInfo = '';
// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
var fileLogLink = ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])';
var appendText = '# [[:' + Morebits.pageNameNorm + ']]' + fileLogLink + ': DI [[WP:CSD#' + params.normalized.toUpperCase() + '|CSD ' + params.normalized.toUpperCase() + ']] ({{tl|di-' + params.templatename + '}})';
['reason', 'replacement', 'source'].forEach(function(item) {
if (params[item]) {
extraInfo += formatParamLog(params.normalized.toUpperCase(), item, params[item]);
return false;
}
});
if (extraInfo) {
appendText += '; additional information:' + extraInfo;
}
if (initialContrib) {
appendText += '; notified {{user|1=' + initialContrib + '}}';
}
appendText += ' ~~~~~\n';
var editsummary = 'Logging speedy deletion nomination of [[:' + Morebits.pageNameNorm + ']].';
usl.changeTags = Twinkle.changeTags;
usl.log(appendText, editsummary);
}
};
Twinkle.addInitCallback(Twinkle.image, 'image');
})(jQuery);
// </nowiki>