Jump to content

User:The Evil IP address/hdedit.js: Difference between revisions

From Wikipedia, the free encyclopedia
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));
	    }
    );
}