Jump to content

User:The Evil IP address/hdedit.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/**
* 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));
	    }
    );
}