User:The Evil IP address/hdedit.js: Difference between revisions
Appearance
Content deleted Content added
compatibility update for MediaWiki's Heading HTML changes, supporting both versions as they're used |
refine selector for new markup to include #bodyContent, avoiding the script to be erroneously loaded on the firstHeading and potentially other h* elements outside the page body |
||
Line 137: | Line 137: | ||
var selector = ''; // find the appropriate selector of headings after breaking change https://www.mediawiki.org/wiki/Heading_HTML_changes |
var selector = ''; // find the appropriate selector of headings after breaking change https://www.mediawiki.org/wiki/Heading_HTML_changes |
||
var oldmarkup = $('h1 span.mw-headline, h2 span.mw-headline, h3 span.mw-headline, h4 span.mw-headline, h5 span.mw-headline, h6 span.mw-headline'); // still using previous layout |
var oldmarkup = $('h1 span.mw-headline, h2 span.mw-headline, h3 span.mw-headline, h4 span.mw-headline, h5 span.mw-headline, h6 span.mw-headline'); // still using previous layout |
||
var newmarkup = $('h1, h2, h3, h4, h5, h6'); // using new layout |
var newmarkup = $('#bodyContent h1, #bodyContent h2, #bodyContent h3, #bodyContent h4, #bodyContent h5, #bodyContent h6'); // using new layout, all h* elements of the page body |
||
if (oldmarkup.length) { // we have the old layout, then load only on those selectors |
if (oldmarkup.length) { // we have the old layout, then load only on those selectors |
||
selector = oldmarkup; |
selector = oldmarkup; |
Latest revision as of 16:12, 10 June 2024
/**
* Allows for one click modification of section headings when viewing a page
* add the following line to your .js file to use it:
importScript( 'User:The Evil IP address/hdedit.js' ); // Backlink: [[User:The Evil IP address/hdedit.js]]
* @author Janko Hoener (The Evil IP address)
* @version 1.1.1
*/
mw.loader.load('mediawiki.api');
window.hdedit = {
openeditform: function ($e) {
hdedit.anchor = $e.attr('id');
hdedit.pagename = mw.config.get('wgPageName');
hdedit.api = new mw.Api();
hdedit.api.get( {
action: 'parse',
page: this.pagename,
prop: 'sections',
format: 'json'
}).done( function (data) {
error = false;
error_msg = '';
$.each(data.parse.sections, function (i, v) {
if (v.anchor == hdedit.anchor) {
if (v.index !== '') {
hdedit.index = v.index;
}
else {
error = true;
error_msg = 'This section cannot be edited automatically ' +
'because it uses HTML formatting.';
}
if (v.fromtitle && (v.fromtitle != hdedit.pagename)) {
error = true;
error_msg += 'This section cannot be edited automatically ' +
'because it is transcluded from a template.';
}
return false;
}
});
if (error) {
hdedit.seterror(error_msg);
return;
}
if (hdedit.$e) {
hdedit.cancel();
}
hdedit.$e = $e;
hdedit.api.get({
action: 'parse',
page: hdedit.pagename,
section: hdedit.index,
prop: 'wikitext',
format: 'json'
}).done( function (obj) {
hdedit.wikitext = obj.parse.wikitext['*'];
hdedit.section_wikitext = hdedit.wikitext.replace(/^(=+)\s*(.+?)\s*\1[\s\S]*$/, '$2');
hdedit.inputsize = hdedit.section_wikitext.length*1.5;
var form = $('<form>').css('display', 'inline').submit(hdedit.save);
var input = $('<input>').attr('id', 'hdedit_input').attr('size', hdedit.inputsize).val(hdedit.section_wikitext);
var button1 = $('<button>').attr('id', 'hdedit_submit').attr('type', 'submit').text('Save');
var button2 = $('<button>').attr('type', 'button').attr('id', 'hdedit_cancel').text('Cancel').click(hdedit.cancel);
$(form).append(input).append(button1).append(button2);
hdedit.form = form;
$e.after(form);
$e.hide();
}
);
}
);
},
save: function () {
hdedit.newheading = $(this).parent().find('input').val();
if (hdedit.newheading == hdedit.section_wikitext) {
return false;
}
$('#hdedit_input, #hdedit_submit, #hdedit_cancel').attr('disabled', 'disabled');
hdedit.api.edit(hdedit.pagename, function () {
return {
action: 'edit',
format: 'json',
section: hdedit.index,
minor: true,
summary: 'Section heading change: ' + hdedit.section_wikitext + ' → ' + hdedit.newheading
+ ' using a [[User:The Evil IP address/hdedit|script]]',
text: hdedit.wikitext.replace(/^(=+)(\s*).+?(\s*)\1(\s*)$/m, '$1$2' + hdedit.newheading
+ '$3$1$4'),
};
}).then(
function (resp) {
if (resp.result == 'Success') {
window.location.reload();
}
else if (resp.result == 'Failure') {
hdedit.seterror('API returned error code ' + data.error.code + ': ' + data.error.info);
}
else {
hdedit.seterror('Unknown API error.');
}
});
return false;
},
cancel: function () {
hdedit.$e.show();
hdedit.form.remove();
},
seterror: function (msg) {
mw.notify(msg + '\nPlease edit the section heading manually.', {title: 'Error!', autoHide: false});
},
getpref: function (name) {
if (window.hdedit_prefs !== undefined && name in window.hdedit_prefs) {
return window.hdedit_prefs[name];
}
else {
return hdedit.defaultprefs[name];
}
},
defaultprefs: {
'eventToActivate': 'click'
},
};
if (mw.config.get('wgNamespaceNumber') >= 0 // disable on special pages
&& mw.config.get('wgAction') == 'view' // activate on view only
&& mw.config.get('wgIsProbablyEditable') // only if the page is probably editable
&& !mw.config.get('wgIsMainPage') // disable on Main Page
&& !('sysop' in mw.config.get('wgRestrictionEdit'))) { // disable on protected pages
// they should be edited manually per https://en.wikipedia.org/w/index.php?oldid=982545683
var eventname = hdedit.getpref('eventToActivate');
var selector = ''; // find the appropriate selector of headings after breaking change https://www.mediawiki.org/wiki/Heading_HTML_changes
var oldmarkup = $('h1 span.mw-headline, h2 span.mw-headline, h3 span.mw-headline, h4 span.mw-headline, h5 span.mw-headline, h6 span.mw-headline'); // still using previous layout
var newmarkup = $('#bodyContent h1, #bodyContent h2, #bodyContent h3, #bodyContent h4, #bodyContent h5, #bodyContent h6'); // using new layout, all h* elements of the page body
if (oldmarkup.length) { // we have the old layout, then load only on those selectors
selector = oldmarkup;
}
else if (newmarkup.length) { // we have the new layout, then load only on those selectors
selector = newmarkup;
}
$(selector).bind(eventname,
function () {
hdedit.openeditform($(this));
}
);
}