MediaWiki:Gadget-PreloadTemplates.js

From Tardis Wiki, the free Doctor Who reference
Revision as of 21:41, 17 October 2017 by w:c:Dev>Leviathan 89 (display name, case-by-case preload page)
Clear your cache often around here

After changes are made to this site's CSS or Javascript, you have to bypass your browser's cache to see the changes. You can always do this by going to your browser's preferences panel. But many browsers also offer keyboard shortcuts to save you that trouble. The following shortcuts work in the versions of the browsers that Tardis currently supports. They may not work in earlier versions.

  • Firefox: hold down Shift while performing a page reload.
  • Opera offers no default keyboard shortcut, but you can create a custom keyboard shortcut with the value Clear disk cache
  • Safari users should simultaneously hold down + Option + E. You may need to enable the Develop menu first
  • Chrome: press Ctrl + F5 or Shift + F5 while performing a page reload.
//  ================================
//      Custom preload templates
//  ================================
/*  @author Grunny 
    From http://harrypotter.wikia.com/wiki/MediaWiki:Wikia.js
    edited by leviathan_89

    ** Info: **
    Template list loaded by default from "MediaWiki:Custom-PreloadTemplates",
    each syntax is loaded by default from the "/preload" subpage of the
    template.
*/

$(function() {

    // Run conditions
    if (    wgAction != 'edit' || 
            (!$('div.module_content').length && skin == 'oasis') ||
            (!$('div.editButtons').length && skin == 'monobook') ||
             mw.config.get('wgNamespaceNumber') == 8 // MediaWiki:
        ) {
        console.log('[PreloadTemplates]: container not found or page is not supported.');
        return;
    }
    console.log('[PreloadTemplates]: version 1.02 - 17/10/2017.');
    
    // =================
    //   Configuration
    // =================
    var config = {
            list: null,
            subpage: null
        };

    // Checking user's custom settings
    config.list = ( typeof preloadTemplates_list == 'string' ) ? preloadTemplates_list : 'MediaWiki:Custom-PreloadTemplates';
    config.subpage = ( typeof preloadTemplates_subpage == 'string' ) ? preloadTemplates_subpage : 'preload';


    // ========
    //   i18n
    // ========
    var lang = mw.config.get('wgUserLanguage');
    var splitLang = lang.split('-')[0];
    var i18n = {
            // English
            en: {
                preload: 'Preload template:',
                choose: '(choose)',
                help: 'Select a template to insert its preloaded syntax at the current position ',
                devWiki: 'Check the documentation on Dev Wiki',
                error: 'No valid syntax found at $1 or page is missing.'
            },
            // Belarusian
            be: {
                preload: 'Гатовы шаблон:',
                choose: '(выберыце)',
                help: 'Выберыце падрыхтаваны шаблон, каб ўставіць код у дадзеным месцы',
                devWiki: 'Паглядзець дакументацыю на Dev Wiki',
                error: 'Не знойдзены правільны сінтаксіс у $1 ці старонка не існуе.'
            },
            // Catalan
            ca: {
                preload: 'Pre-carrega una plantilla:',
                choose: '(tria)',
                help: 'Selecciona una plantilla per inserir la seva sintaxi pre-carregada a la posició actual',
                devWiki: 'Controla la documentació al Dev Wiki',
                error: 'Cap sintaxi vàlida trobada a $1 o la pàgina hi falta.'
            },
            // German
            de: {
                preload: 'Vorlage einfügen:',
                choose: '(Auswählen)',
                help: 'Wähle die Vorlage, deren vorgefertigte Syntax an der aktuellen Position eingefügt werden soll',
                devWiki: 'Lies die Dokumentation im Dev-Wiki',
                error: 'Keine gültige Syntax unter $1 gefunden bzw. keine Seite.'
            },
            // Spanish
            es: {
                preload: 'Precarga una plantilla:',
                choose: '(elige)',
                help: 'Selecciona una plantilla para insertar su sintaxis precargada en la posición actual',
                devWiki: 'Controla la documentación en la Dev Wiki',
                error: 'Ninguna sintaxis válida encontrada en $1 o falta la página.'
            },
            // French
            fr: {
                preload: 'Précharger un modèle :',
                choose: '(choisir)',
                help: 'Sélectionnez un modèle pour insérer sa syntaxe préchargée dans la position actuelle',
                devWiki: 'Contrôlez la documentation sur le Dev Wiki',
                error: 'Aucune syntaxe valable trouvée sur $1 ou la page est absente.'
            },
            // Finnish
            fi: {
                preload: 'Esilataa malline:',
                choose: '(valitse)',
                help: 'Valitse malline lisätäksesi sen esiladatun syntaksin nykyiseen paikkaan',
                devWiki: 'Katso dokumentointi Dev Wikissä',
                error: 'Väärin syntaksi kohdassa $1 or tai sivu puuttuu.'
            },
            // Galician
            gl: {
                preload: 'Pre-carga un modelo:',
                choose: '(elixe)',
                help: 'Selecciona un modelo para inserir a súa sintaxe pre-cargada na posición actual',
                devWiki: 'Controla a documentación no Dev Wiki',
                error: 'Ningunha sintaxe válida atopada en $1 ou a páxina está a faltar.'
            },           
            // Bahasa Indonesia
            'id': {
                preload: 'Pramuat templat:',   
                choose: '(plihan)',             
                help: 'Pilihlah sebuah templat untuk dimasukkan ke pramuat sintaksis di posisi sekarang ini ',
                devWiki: 'Mengecek dokumentasi di devwiki',
                error: 'Tidak ditemukan sintaksis yang sah ditemukan $1 atau laman menghilang.'
            },
            // Italian
            it: {
                preload: 'Precarica un template:',
                choose: '(scegli)',
                help: 'Seleziona un template per inserire la sua sintassi precaricata nella posizione corrente',
                devWiki: 'Controlla la documentazione su Dev Wiki',
                error: 'Nessuna sintassi valida trovata su $1 o la pagina è mancante.'
            },
            // Japanese
            ja: {
                preload: 'プリロード・テンプレート:',
                choose: '(選択してください)',
                help: 'テンプレートを選ぶと、文字入力カーソルの位置に埋め込まれます。',
                devWiki: 'Dev Wikiの解説ページをご覧ください。',
                error: '$1は無効な構文か、ページが存在しません。'
            },
            // Occitan
            oc: {
                preload: 'Precarga un modèl:',
                choose: '(escuelh)',
                help: 'Selecciona un modèl per inserir la siá sintaxi precargada dins la posicion actuala',
                devWiki: 'Contròtla la documentacion sul Dev Wiki',
                error: 'Cap de sintaxi valida amassada sus $1 o la pagina i manca.'
            },
            // Polish
            pl: {
                preload: 'Gotowy szablon:',
                choose: '(wybierz)',
                help: 'Wybierz przygotowany szablon, aby wstawić kod w obecnym miejscu',
                devWiki: 'Zobacz dokumentację na Dev Wiki',
                error: 'Nie znaleziono odpowiedniej składni w $1 lub strona nie istnieje.'
            },
            // Portuguese
            pt: {
                preload: 'Pré-carrega uma predefinição:',
                choose: '(escolhe)',
                help: 'Seleciona uma predefinição para inserires a sua sintaxe pré-carregada na posição actual',
                devWiki: 'Controla a documentação no Dev Wiki',
                error: 'Nenhuma sintaxe válida encontrada em $1 ou a página está a faltar.'
            },
            // Brazilian Portuguese
            'pt-br': {
                preload: 'Pré-carrega uma predefinição:',
                choose: '(escolha)',
                help: 'Selecione uma predefinição para inserir a sintaxe dela pré-carregada na posição atual',
                devWiki: 'Controle a documentação na Dev Wiki',
                error: 'Nenhuma sintaxe válida encontrada em $1 ou a página está faltando.'
            },
            // Romanian
            ro: {
                preload: 'Preîncărcaţi un format:',
                choose: '(alegeţi)',
                help: 'Selecţionaţi un format pentru a insera sintaxa acesta preîncărcată în poziţia actuală',
                devWiki: 'Controlaţi documentaţia pe Dev Wiki',
                eroare: 'Nicio sintaxa validă găsită pe $1 sau pagina lipseşte.'
            },
            // Russian
            ru: {
                preload: 'Готовый шаблон:',
                choose: '(выберите)',
                help: 'Выберите подготовленный шаблон, чтобы вставить код в данном месте',
                devWiki: 'Посмотреть документацию на Dev Wiki',
                error: 'Не найден правильный синтаксис в $1 или страница не существует.'
            },
            // Ukrainian
            uk: {
                preload: 'Готовий шаблон:',
                choose: '(виберіть)',
                help: 'Виберіть підготовлений шаблон, щоб вставити код в даному місці',
                devWiki: 'Подивитися документацію на Dev Wiki',
                error: 'Не знайдений правильний синтаксис в $1 або сторінка не існує.'
            },
            // Valencian
            val: {
                preload: 'Precarrega una plantilla:',
                choose: '(tria)',
                help: 'Selecciona una plantilla per a insertar la sua sintaxis precarregada en la posició actual',
                devWiki: 'Controla la documentació en el Dev Wiki',
                error: 'No hi ha sintaxis vàlides trobades en $1 o falta la pàgina.'
            },
            // Chinese (simplified) (Also in zh) 
            zh: {
                preload: '预载模板:',
                choose: '(选择)',
                help: '选择一个模板以于目前位置插入其预载语法',
                devWiki: '于 Dev Wiki 查看相关文件',
                error: '$1 为无效语法或页面遗失。'
            },
            // Chinese (traditional)
            'zh-hant': {
                preload: '預載模板:',
                choose: '(選擇)',
                help: '選擇一個模板以於目前位置插入其預載語法',
                devWiki: '於 Dev Wiki 查看相關文件',
                error: '$1 為無效語法或頁面遺失。'
            }
            // thanks http://wlb.wikia.com !
    };

    // Select language
    // Check if user's language is present
    if (typeof i18n[lang] === 'object') {
        $.extend( i18n, i18n.en, i18n[lang] );
    } else {
        // Check to see if the parent language has a translation, example pt-br -> pt
        if (typeof i18n[splitLang] === 'object') {
            $.extend( i18n, i18n.en, i18n[splitLang] );
        } else {
        // Fallback to English
        $.extend( i18n, i18n.en );
        }
    }
    // END i18n

    // =============
    //   Execution  
    // =============
    
    // Variables
    var namespace = mw.config.get('wgFormattedNamespaces')['10'];
    var $preloadOptionsHtml;
    var $preloadOptionsList;
    var defaultOption = '<option selected disabled>' + i18n.choose + '</option>';
    var preloadHelp = '<span style="display:inline-block; vertical-align:middle; cursor:help; margin-left:5px;" class="sprite question"><a href="http://dev.wikia.com/wiki/PreloadTemplates" target="_blank" title="' + i18n.devWiki + '" style="display:inline-block; width:12px; height:12px;"></a></span>';

    // Append HTML container
    if (skin === 'oasis') {
        $('div.module_content:first').append('<div id="preload-templates" style="display:block; padding:0 10px;"><h3 style="font-size:14px;">' + i18n.preload + '</h4></div>');
    } else {
        $('div.editButtons').append('<div id="preload-templates" style="display:block; float:right; padding:10px;">' + i18n.preload + '&nbsp;</div>');
    }

    // Create template list
    // Get list
    $.get(wgScript, {
            title: config.list,
            action: 'raw',
            ctype: 'text/plain'
    }).done( function(listData) {
            var listDataParsed = parseMW(listData); // Parse data for MediaWiki tags
            var lines = listDataParsed.split('\n'); // Split data in lines

            // Display error if no valid data is present
            if ( listDataParsed === '' ) {
                $('div#preload-templates').append( i18n.error.replace('$1' , '"<a href="/wiki/' + mw.util.wikiUrlencode(config.list) + '">' + config.list + '</a>"') ).append(preloadHelp);
                return;
            }
            
            // Building the list HTML
            for (var i in lines) {
                var title;

                // Ignore empty lines
                if (lines[i].trim() === '') {
                    continue;
                }
                // Text in a list is the template name
                if (lines[i].indexOf('*') === 0) {
                    title = lines[i].substring(1).trim();
                    
                    // Text after pipe is display name
                    if (title.indexOf('|') !== -1) {
                        var parts = title.split('|');
                        
                        $preloadOptionsHtml += '<option value="' + parts[0].trim() + '">' + parts[1].trim() + '</option>';
                    } else {
                        // No display name
                        $preloadOptionsHtml += '<option value="' + title + '">' + title + '</option>';
                    }
                } else {
                    // Rest are normal strings
                    title = lines[i].trim();
                    $preloadOptionsHtml += '<option disabled>' + title + '</option>';
                }
            }
                
            // Build list HTML
            $preloadOptionsList = $('<select />').attr('id', 'pt-list').attr('title', i18n.help).css('max-width' , '220px').html(defaultOption + $preloadOptionsHtml).change(function() {
                    var templateTitle = $(this).val();
                    
                    // Restore default option
                    $('#pt-list option:first-child').prop('selected', true);

                    // Preload the template on click
                    getPreloadPage(templateTitle);
                });

            // Append template list and messageges
            $('div#preload-templates').append($preloadOptionsList).append(preloadHelp);

            // Import required CSS for monobook
            if (skin === 'monobook') {
                // Importing sprite for monobook
                $('.sprite.question').css({
                    'background-image': 'url(http://slot1.images.wikia.nocookie.net/__cb1475164013/common/skins/shared/images/sprite.png)',
                    'background-position': '-1144px -20px',
                    'background-color': 'transparent',
                    'background-repeat': 'no-repeat',
                    'height': '12px',
                    'width': '12px'
                });
            }
    }).fail( function(){
        // Add an error if failed to retrieve list
        $('div#preload-templates').append( i18n.error.replace('$1' , '"<a href="/wiki/' + mw.util.wikiUrlencode(config.list) + '">' + config.list + '</a>"') ).append(preloadHelp);
    });

    // =============
    //   Functions  
    // =============

    // Get preload text and add it to the text area
    function getPreloadPage(title) {
        // check if subpage is standard or is case by case
        var page = ( config.subpage === 'case-by-case' ) ? namespace + ':' + title : namespace + ':' + title + '/' + config.subpage;
        
        $.get(wgScript, {
                title: page,
                action: 'raw',
                ctype: 'text/plain'
        }).done(function(preloadData) {
            // Parse some MediaWiki tags
            var preloadDataParsed = parseMW(preloadData);
            
            // Display error if no useful data is present
            if ( preloadDataParsed === '' ) {
                notFound(page);
                return;
            }

            // Insert syntax
            if (document.getElementById('wpTextbox1')) {
                insertAtCursor(document.getElementById('wpTextbox1'), preloadDataParsed);
            } else {
                // Visual editor
                insertAtCursor(document.getElementsByClassName('cke_source')[0], preloadDataParsed);
            }
        }).fail( function(){
            notFound(page);
        });
    }

    // Inserts text at the cursor's current position - originally from Wookieepedia
    function insertAtCursor(myField, myValue) {
    //IE support
        if (document.selection) {
            myField.focus();
            sel = document.selection.createRange();
            sel.text = myValue;
        }
        //MOZILLA/NETSCAPE support
        else if (myField.selectionStart || myField.selectionStart == '0') {
            var startPos = myField.selectionStart;
            var endPos = myField.selectionEnd;
            myField.value = myField.value.substring(0, startPos) +
                myValue +
                myField.value.substring(endPos, myField.value.length);
        } else {
            myField.value += myValue;
        }
    }
    
    // Parse MediaWiki code to allow the use of incudeoonly and noninclude tags in the preload page
    function parseMW(source){
        var parsed = source.replace(/<includeonly>(\n)?|(\n)?<\/includeonly>|\s*<noinclude>[^]*?<\/noinclude>/g, '');
        
        return parsed;
    }
    
    // Error alert
    function notFound(page){
        var message = i18n.error.replace('$1' , '"' + page + '"');
        
        alert(message);
    }
});