User:Enterprisey/set-js-prefs.js

if( mw.config.get("wgNamespaceNumber") === 2 &&       mw.config.get( "wgTitle" ).endsWith( "/common.js" ) &&        document.getElementById( "ca-edit" ).textContent.startsWith( "Edit" ) ) { mw.loader.using( [ "mediawiki.util", "mediawiki.api" ] ).then( function {        var api = new mw.Api;        api.get( { prop: 'revisions', rvprop: 'content', rvlimit: 1, titles: mw.config.get( "wgPageName" ) } ).done( function ( data ) { if ( !data.query || !data.query.pages ) return; var pageid = Object.getOwnPropertyNames( data.query.pages )[0], text = data.query.pages[pageid].revisions[0]["*"];

var highlightEls = document.getElementsByClassName( "mw-highlight" ); if( !highlightEls.length ) return; var codeContainer = highlightEls[0].parentNode; var newContainer = document.createElement( "div" ); newContainer.style.border = "thin gray solid"; newContainer.style.padding = "0.5em"; newContainer.style.display = "inline-block"; codeContainer.parentNode.insertBefore( newContainer, codeContainer );

var wktxtLookup = {}; // id to wikitext line fragments

function addPref( id, label, value ) { newContainer.innerHTML += " " + label + "  "; wktxtLookup[id] = label + value; }

// Find preferences in common.js, then make them into form elements var PREF_REGEX = /(.+?\s*=\s*)(.+?);/g; var prefMatch; var idCounter = 0; do { prefMatch = PREF_REGEX.exec( text ); if( prefMatch && prefMatch[1] && prefMatch[1].length < 50 &&                   prefMatch[2].length < 50) { addPref( idCounter++, prefMatch[1], prefMatch[2] ); }           } while( prefMatch );

if( newContainer.children.length > 0 ) { var saveButton = document.createElement( "button" ); saveButton.className = "mw-ui-button mw-ui-progressive"; saveButton.appendChild( document.createTextNode( "Save changes" ) ); newContainer.appendChild( saveButton ); saveButton.addEventListener( "click", function {                    var newWikitext = text;                    for( var i = 0; i < newContainer.children.length - 1; i++ ) {                        newWikitext = newWikitext.replace( wktxtLookup[i], newContainer.children[i].children[0].textContent + newContainer.children[i].children[1].value );                   }

// Now, save it                   api.postWithToken( "csrf", {                        action: "edit",                        title: mw.config.get( "wgPageName" ),                        summary: "Setting preferences (set-js-prefs)",                        text: newWikitext                    } ).done ( function ( data ) {                        if ( data && data.edit && data.edit.result && data.edit.result == 'Success' ) {                            mw.notify( "Changed preferences!" );                           document.location.reload( true );                        }                    } ); } );           }        } );    } ); }