//<nowiki>
$(document).ready(function () {
function initMerge() {
$('#mw-content-text > p').remove();
$('#firstHeading').text('MergeHelper');
var page1Input = new OO.ui.TextInputWidget({ placeholder: 'Source page' }),
page2Input = new OO.ui.TextInputWidget({ placeholder: 'Destination page' }),
loadBtn = new OO.ui.ButtonWidget({ label: 'Load wikitext', flags: ['primary'] }),
page1Text = new OO.ui.MultilineTextInputWidget({ placeholder: 'Source page wikitext', autosize: true, rows: 20, disabled: true }),
page2Text = new OO.ui.MultilineTextInputWidget({ placeholder: 'Destination page wikitext', autosize: true, rows: 20, disabled: true }),
summary1Input = new OO.ui.TextInputWidget({ placeholder: 'Edit summary' }),
summary2Input = new OO.ui.TextInputWidget({ placeholder: 'Edit summary' }),
redirectCheck = new OO.ui.CheckboxInputWidget({ selected: false }).on('change', updateRedirect),
previewBtn = new OO.ui.ButtonWidget({ label: 'Preview Changes', flags: ['primary'], disabled: true }),
saveBtn = new OO.ui.ButtonWidget({ label: 'Save Changes', icon: 'check', flags: ['primary', 'progressive'], disabled: true }),
cancelBtn = new OO.ui.ButtonWidget({ label: 'Cancel', flags: ['primary', 'destructive'], href: 'https:' + mw.config.get('wgServer') }),
logDiv = $("<div>").hide(),
redirectDiv = $('<div>').css({ 'display': 'flex', 'align-items': 'center', 'gap': '10px' }).append(redirectCheck.$element, $('<p>').text('Redirect the source page to the destination page')).hide();
$('#mw-content-text').append(
$('<p>').text('Source page:').css('font-weight', 'bold'), page1Input.$element,
$('<p>').text('Destination page:').css('font-weight', 'bold'), page2Input.$element,
loadBtn.$element,
$('<div>').css({ 'display': 'flex', 'gap': '10px' }).append(
$('<div>').css({ 'flex': '1', 'border': '1px solid #ccc', 'padding': '10px', 'box-sizing': 'border-box', 'min-width': '45%', 'max-width': '45%', 'overflow': 'auto' }).append(
$('<p>').text('Source page wikitext:').css('font-weight', 'bold'), page1Text.$element
),
$('<div>').css({ 'flex': '1', 'border': '1px solid #ccc', 'padding': '10px', 'box-sizing': 'border-box', 'min-width': '45%', 'max-width': '45%', 'overflow': 'auto' }).append(
$('<p>').text('Destination page wikitext:').css('font-weight', 'bold'), page2Text.$element
)
),
$('<div>').css({ 'display': 'flex', 'gap': '10px' }).append(
$('<div>').css({ 'flex': '1', 'border': '1px solid #ccc', 'padding': '10px', 'box-sizing': 'border-box', 'min-width': '45%', 'max-width': '45%', 'overflow': 'auto' }).append(
$('<p>').text('Summary:').css('font-weight', 'bold'), summary1Input.$element
),
$('<div>').css({ 'flex': '1', 'border': '1px solid #ccc', 'padding': '10px', 'box-sizing': 'border-box', 'min-width': '45%', 'max-width': '45%', 'overflow': 'auto' }).append(
$('<p>').text('Summary:').css('font-weight', 'bold'), summary2Input.$element
)
),
redirectDiv,
'<br/>',
previewBtn.$element,
saveBtn.$element,
cancelBtn.$element,
'<br/>',
logDiv
);
function loadPage(name, callback) {
(new mw.Api()).get({
action: 'query',
prop: 'revisions',
titles: name,
rvprop: 'content',
formatversion: 2
}).done(function (data) {
var pages = data.query.pages;
if (pages && pages[0] && pages[0].revisions) {
callback(null, pages[0].revisions[0].content);
} else {
callback('Could not load page content');
}
}).fail(function () {
callback('Could not load page content');
});
}
function renderPreview(name, wikitext, container) {
(new mw.Api()).post({
action: 'parse',
text: wikitext,
title: name,
contentmodel: 'wikitext',
format: 'json'
}).done(function (data) {
container.html(data.parse.text['*']);
}).fail(function () {
container.html('<p>Error loading preview</p>');
});
}
function showAlert(msg) {
alert("Error: " + msg);
}
function loadWikitext() {
var page1Name = page1Input.getValue().trim(),
page2Name = page2Input.getValue().trim();
if (!page1Name || !page2Name) {
showAlert("Please fill in both page names");
return;
}
logDiv.empty().hide();
loadPage(page1Name, function (err1, content1) {
if (err1) {
showAlert(err1);
return;
}
loadPage(page2Name, function (err2, content2) {
if (err2) {
showAlert(err2);
return;
}
page1Text.setValue(content1).setDisabled(false);
page2Text.setValue(content2).setDisabled(false);
previewBtn.setDisabled(false);
saveBtn.setDisabled(false);
summary1Input.setValue("Merged to [[" + page2Name + "]]");
summary2Input.setValue("Merged from [[" + page1Name + "]]");
redirectDiv.show();
});
});
}
function updateRedirect(checked) {
var page2Name = page2Input.getValue().trim(),
content1 = page1Text.getValue();
if (checked) {
content1 = "#REDIRECT [[" + page2Name + "]]\n\n" + content1;
} else {
content1 = content1.replace(new RegExp("^#REDIRECT \\[\\[" + page2Name + "\\]\\]\\s*\n\n"), '');
}
page1Text.setValue(content1);
}
function previewMerge() {
var page1Name = page1Input.getValue().trim(),
page2Name = page2Input.getValue().trim(),
content1 = page1Text.getValue(),
content2 = page2Text.getValue();
var preview1 = $('<div>').css({ border: '1px solid #ccc', padding: '10px', margin: '10px', flex: '1', overflow: 'auto', height: '1000px', width: '412px' });
var preview2 = $('<div>').css({ border: '1px solid #ccc', padding: '10px', margin: '10px', flex: '1', overflow: 'auto', height: '1000px', width: '412px' });
logDiv.empty().append(
$('<div>').css({ 'display': 'flex', 'gap': '10px' }).append(
$('<div>').css('flex', '1').append($('<h2>').text('Preview of ' + page1Name), preview1),
$('<div>').css('flex', '1').append($('<h2>').text('Preview of ' + page2Name), preview2)
)
).show();
renderPreview(page1Name, content1, preview1);
renderPreview(page2Name, content2, preview2);
}
function saveMerge() {
var page1Name = page1Input.getValue().trim(),
page2Name = page2Input.getValue().trim(),
summary1 = summary1Input.getValue().trim() + " (using [[User:DreamRimmer/MergeHelper|MergeHelper.js]])",
summary2 = summary2Input.getValue().trim() + " (using [[User:DreamRimmer/MergeHelper|MergeHelper.js]])",
content1 = page1Text.getValue(),
content2 = page2Text.getValue();
function savePage(name, content, summary, callback) {
(new mw.Api()).postWithToken('csrf', {
action: 'edit',
title: name,
text: content,
summary: summary,
minor: true
}).done(function () {
callback(null);
}).fail(function () {
callback('Could not save page content');
});
}
savePage(page1Name, content1, summary1, function (err) {
if (err) {
showAlert(err);
return;
}
savePage(page2Name, content2, summary2, function (err) {
if (err) {
showAlert(err);
return;
}
alert('Merged successfully!');
location.reload();
});
});
}
loadBtn.on('click', loadWikitext);
previewBtn.on('click', previewMerge);
saveBtn.on('click', saveMerge);
}
$.when(mw.loader.using('mediawiki.util'), $.ready).then(function () {
mw.util.addPortletLink('p-tb', mw.util.getUrl('Special:BlankPage/MergeHelper'), 'MergeHelper');
});
if (mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && mw.config.get('wgTitle').split('/', 2)[1] === 'MergeHelper') {
$.when(mw.loader.using('oojs-ui-core'), $.ready).then(initMerge);
}
});
//<nowiki>