User:SD0001/easy-merge.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. |
This user script seems to have a documentation page at User:SD0001/easy-merge. |
/* jshint maxerr: 999 */
/* <nowiki> */
$.when(
mw.loader.using(['mediawiki.Title', 'ext.gadget.morebits']),
$.ready
).then(function() {
// hide on special pages and talk pages
if (mw.config.get('wgNamespaceNumber') < 0 || mw.config.get('wgNamespaceNumber') % 2 === 1 || !mw.config.get('wgRevisionId')) {
return;
}
var advert = ' ([[User:SD0001/easy-merge|easy-merge]])';
var menu = mw.util.addPortletLink('p-cactions', '#', 'easy-merge', 'p-easy-merge', 'Redirect to another article and add merge templates to talk pages');
menu.addEventListener('click', callback);
function callback(e) {
if (e) e.preventDefault();
var Window = new Morebits.simpleWindow(600, 500);
Window.setScriptName('easy-merge');
Window.setTitle("Redirect and add merge templates to talk pages");
Window.addFooterLink('Merging articles', 'Wikipedia:Merging');
var form = new Morebits.quickForm(evaluate);
form.append({
type: 'input',
label: 'Target page: ',
name: 'target',
value: (mw.config.get('wgIsRedirect') && $('div.redirectMsg a').length) ? $('div.redirectMsg a').text() : ''
});
form.append({
type: 'input', // changed to 'date' after render
name: 'date',
label: 'Date of merger: ',
value: new Date().toISOString().slice(0, 10),
tooltip: 'This date is used in the {{merged-from}} and {{merged-to}} templates'
});
form.append({
type: 'checkbox',
name: 'actions',
list: [
{
label: 'Redirect this page to the target page',
name: 'redirect',
checked: !mw.config.get('wgIsRedirect'),
tooltip: 'Replace contents with redirect to target page. {{R from merge}} will be applied to the redirect. ' +
'{{R to section}} will also be applied if applicable',
subgroup: {
type: 'input',
label: 'Edit summary: ',
value: 'Merged content to [[###]], redirecting',
name: 'summary',
tooltip: '### will be automatically replaced by name of target page',
size: '60px'
}
},
{
label: 'Remove merge tag from target page (if it exists)',
name: 'removemerge',
checked: true
},
{
label: 'Add {{merged-from}} to talk page of target page',
name: 'addmergedfrom',
checked: true
},
{
label: 'Add {{merged-to}} to talk page of this page',
name: 'addmergedto',
checked: true
},
{
label: 'Adjust WikiProject banners and templates',
tooltip: 'For WikiProject banners, class is set to redirect and importance is removed. Any media needed templates are also removed',
name: 'adjusttalktemplates',
checked: true
},
{
label: 'Retain categories on redirect',
tooltip: 'Do not remove the categories on the page while redirecting',
name: 'retaincats',
checked: false
}
]
});
form.append({ type: 'submit', label: 'Submit' });
var result = form.render();
result.date.type = 'date';
result.date.required = true;
Window.setContent(result);
Window.display();
}
function evaluate(e) {
var form = e.target;
var params = {};
params.target = form.target.value;
if (!params.target.trim()) {
alert('Please enter the target page of merge');
return;
}
params.current = Morebits.pageNameNorm;
params.redirect = form.redirect.checked;
params.summary = form['redirect.summary'] && form['redirect.summary'].value.replace('###', params.target);
params.removemerge = form.removemerge.checked;
params.addmergedfrom = form.addmergedfrom.checked;
params.addmergedto = form.addmergedto.checked;
params.adjusttalktemplates = form.adjusttalktemplates.checked;
params.retaincats = form.retaincats.checked;
var dateobj = new Morebits.date(form.date.value);
if (isNaN(dateobj.getTime())) {
alert('Invalid date. Please enter in YYYY-MM-DD format'); // should arise only for browsers w/o datepicker
return;
}
params.date = dateobj.getUTCDate() + ' ' + dateobj.getUTCMonthName() + ' ' + dateobj.getUTCFullYear();
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
Morebits.wiki.api.setApiUserAgent('[[w:User:SD0001/easy-merge.js]]');
if (params.redirect) {
var page = new Morebits.wiki.page(params.current, 'Redirecting');
page.load(function(page) {
var pageText = '#REDIRECT [[' + params.target + ']]\n\n{{R from merge}}';
if (params.target.indexOf('#') !== -1) {
pageText += '\n{{R to section}}';
}
if (params.retaincats) {
var cats = page.getPageText().match(/\[\[[Cc]ategory:.*?\]\]/g);
if (cats) {
pageText += '\n\n' + cats.join('\n');
}
}
page.setPageText(pageText);
page.setEditSummary(params.summary + advert);
page.setCreateOption('nocreate');
page.save();
});
}
if (params.removemerge) {
var targetpage = new Morebits.wiki.page(params.target, 'Removing {{merge from}} from target page');
targetpage.load(function(e) {
var text = e.getPageText();
var rgx1 = new RegExp('\\{\\{[mM]erge[- ]?[fF]rom\\s*\\|' + Morebits.pageNameRegex(params.current) + '[^}]*\\}\\}\\n?');
var rgx2 = new RegExp('\\{\\{[bB]eing merged\\s*\\|' + Morebits.pageNameRegex(params.current) + '[^}]*\\}\\}\\n?');
var newtext = text.replace(rgx1, '').replace(rgx2, '');
if (text !== newtext) {
targetpage.setPageText(newtext);
targetpage.setEditSummary('Removing merge template after merging' + advert);
targetpage.setCreateOption('nocreate');
targetpage.save();
} else {
targetpage.getStatusElement().info('Not found');
}
});
}
if (params.addmergedfrom) {
var targettalkpage = new mw.Title(params.target).getTalkPage().toText();
var targettalk = new Morebits.wiki.page(targettalkpage, 'Adding {{merged-from}} to target talk page');
targettalk.setPrependText('{{merged-from|' + params.current + '|' + params.date + '}}\n');
targettalk.setEditSummary('Adding {{merged-from|' + params.current + '}}' + advert);
targettalk.prepend();
}
if (params.addmergedto || params.adjusttalktemplates) {
var curentalkpage = new mw.Title(params.current).getTalkPage().toText();
var sttext;
if (params.addmergedto) {
sttext = 'Adding {{merged-to}} to talk page';
} else {
sttext = 'Adjusting WikiProject banners';
}
var curentalk = new Morebits.wiki.page(curentalkpage, sttext);
curentalk.setPageSection(0);
curentalk.load(function(e) {
var text = e.getPageText();
if (params.addmergedto) {
var mergedto = '{{merged-to|' + params.target + '|' + params.date + '}}\n';
text = mergedto + text;
}
if (params.adjusttalktemplates) {
text = text
.replace(/\|\s*class\s*=[^}|]*/g, '|class=redirect') // set class to redirect
.replace(/\|[^|}]*?importance\s*=[^}|]*/g, '') // remove importance param
.replace(/\|(?:[^|}]*-needed|needs-[^|}]*)\s*=[^|}]*/g, '') // remove any media-needed or needs-media params
.replace(/\{\{[^|}]* (?:requested|needed)[^}]*\}\}\n?/g, ''); // remove any {{media requeseted}} templates
}
if (text === '' && e.getPageText() === '') {
return; // otherwise in this case, page is created as empty. Morebits bug.
}
curentalk.setPageText(text);
var summary;
if (params.addmergedto && params.adjusttalktemplates) {
summary = 'Adding {{merged-to|' + params.target + '}} and adjusting WikiProject banners';
} else if (params.addmergedto) {
summary = 'Adding {{merged-to|' + params.target + '}}';
} else if (params.adjusttalktemplates) {
summary = 'Adjusting WikiProject banners';
}
curentalk.setEditSummary(summary + advert);
curentalk.save();
});
}
}
});
/* </nowiki> */