Järjestelmäviesti:Gadget-SubstitutisSubstituendis.js

Huomautus: Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.

  • Firefox ja Safari: Napsauta Shift-näppäin pohjassa Päivitä, tai paina Ctrl-F5 tai Ctrl-R (⌘-R Macilla)
  • Google Chrome: Paina Ctrl-Shift-R (⌘-Shift-R Macilla)
  • Edge: Napsauta Ctrl-näppäin pohjassa Päivitä tai paina Ctrl-F5
mw.loader.using('mediawiki.api', function () {
    var api = new mw.Api({
        ajax: {
            headers: {
                'Api-User-Agent': 'SubstitutisSubstituendis/0.1'
            }
        }
    });
    

    window.Muokkaussubst = {};

    /**
     * Palauttaa promisen, jossa on annettu teksti substaukset substattuna.
     **/
    Muokkaussubst.tee_substaukset = function(title, text) {
        var deferred = new $.Deferred();
    	if ( text.indexOf("{{" + "subst" + ":") === -1 ) {
    	    deferred.resolve(text);
        } else {
            api.get({
                action: 'parse',
                format: 'json',
                prop:   'text',
                onlypst: 1,
                contentmodel: 'wikitext',
                text:   text,
                title:  title,
            }).done(function (data) {
                if ( data && data.parse && data.parse.text && data.parse.text['*'] ) {
        	    deferred.resolve(data.parse.text['*']);
                }
            }).catch(function (e) {
                deferred.reject(e);
            });
        }
        return deferred.promise();
    };

    if ( [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 ) {
        /**
         * Korvaa muokkauslaatikon sisällön samalla sisällöllä, josta substaukset on substattu.
         **/
        Muokkaussubst.kasittele_editoitava = function () {
            var $textbox = $('#wpTextbox1');
            var orig_text;
            var orig_selection = $textbox.textSelection( 'getSelection' );
            
            if ( !orig_selection ) {
            	var pos = $textbox.textSelection( 'getCaretPosition' );
            	
            	// Jos kursori on tarkalleen siinä, missä subst-teksti olisi, lisätään siihen subst.
            	var context = $textbox.val().substring(pos - 2, pos + 1);
            	if ( context.match(/\{\{[^{ \n]/) ) {
            	    $textbox.textSelection( 'encapsulateSelection', { pre: 'subst:', post: '' } );
            	}
            	
            	orig_text = $textbox.val();
            }
            
            Muokkaussubst.tee_substaukset(
                mw.config.get('wgPageName'),
                orig_text
            ).done(function (new_text) {
            	var selection = $textbox.textSelection( 'getSelection' );
            	// Katsotaan oliko tekstiä valittu vai muutetaanko koko teksti,
            	// ja varmistetaan, ettei teksti tai valinta ole muuttunut sillä
            	// välin kun tietoa haettiin.
            	if ( selection && selection === orig_selection ) {
            	    $textbox.textSelection( 'replaceSelection', (new_text || orig_selection) );
            	} else if ( $textbox.val() === orig_text ) {
                    $textbox.val(new_text || orig_text);
            	}
            }).catch(function (e) {
                alert("Substaus ei onnistunut: " + e + "\n\nVarmista, ettei tekstialue ole liian iso. Voit valita pienemmän alueen.");
            });
        };
    }


    function customizeToolbar() {
        var tools = {};
        
        tools[ 'wtSubstaus' ] = {
            label: 'Substaa substattavat',
            type: 'button',
            icon: '//upload.wikimedia.org/wikipedia/commons/3/35/Button_substitute.png',
            action: {
                type: 'callback',
                execute: Muokkaussubst.kasittele_editoitava
            }
        };
        $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
            section: 'main',
            group: 'insert',
            tools: tools
        } );
    }
    
    if ( [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 ) {
        mw.loader.using( 'user.options' ).then( function () {
            if ( mw.user.options.get( 'usebetatoolbar' ) == 1 ) {
                $.when(
                    mw.loader.using( 'ext.wikiEditor' ), $.ready
                ).then( customizeToolbar );
            }
        } );
    }
});