MediaWiki:Gadget-PreloadTemplates.js: Difference between revisions

From Tardis Wiki, the free Doctor Who reference
(i18n)
No edit summary
 
(41 intermediate revisions by 11 users not shown)
Line 3: Line 3:
//  ================================
//  ================================
/*  @author Grunny  
/*  @author Grunny  
     From http://harrypotter.wikia.com/wiki/MediaWiki:Wikia.js
     From https://harrypotter.wikia.com/wiki/MediaWiki:Wikia.js
     edited by leviathan_89
     edited by leviathan_89


Line 12: Line 12:
*/
*/


$(function() {
(function() {
    'use strict';
    var mwc = mw.config.get([
        'wgAction',
        'wgFormattedNamespaces',
        'wgNamespaceNumber'
    ]),
    $module = $('div#wpSummaryLabel'), // UCP source editors
    $moduleOld = $('div.module_content:first'); // Old Non-UCP Source Editor


     // Run conditions
     // Run conditions
     if (   wgAction != 'edit' ||
     if (mwc.wgNamespaceNumber === 8) {
            (!$('div.module_content').length && skin == 'oasis') ||
        console.log('[PreloadTemplates]: page is not supported.');
            (!$('div.editButtons').length && skin == 'monobook') ||
            mw.config.get('wgNamespaceNumber') == 8 // MediaWiki:
        ) {
         return;
         return;
     }
     }
      
     console.log('[PreloadTemplates]: version 1.06 - 07/2021.');
 
     // =================
     // =================
     //  Configuration
     //  Configuration
     // =================
     // =================
     var config = {
     var config = {
            list: null,
        list: window.preloadTemplates_list || 'MediaWiki:Custom-PreloadTemplates',
            subpage: null
        subpage: window.preloadTemplates_subpage || 'preload'
        };
     }, i18n, $main, $help;
 
    // 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: 'Preload-Vorlage:',
                choose: '(Auswählen)',
                help: 'Wähle eine Vorlage, die an der aktuellen Position eingefügt werden soll',
                devWiki: 'Lies die Dokumenation im Dev-Wiki',
                error: 'Keine gültige Syntax unter $1 gefunden oder keine Seite vorhanden.'
            },
            // 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: 'Prechargez un modèle:',
                choose: '(choisissez)',
                help: 'Sélectionnez un modèle pour insérer sa syntaxe prechargée dans la position actuelle',
                devWiki: 'Contrôlez la documentation sur la Dev Wiki',
                error: 'Aucune syntaxe valable trouvée sur $1 ou la page y manque.'
            },
            // 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  
     //  Functions  
     // =============
     // =============
   
    // 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
     // Get plain message from i18n
     if (skin === 'oasis') {
     function msg(message) {
         $('div.module_content:first').append('<div id="preload-templates" style="display:block; padding:0 10px;"><h3 style="font-size:14px;">' + i18n.preload + '</h4></div>');
         return i18n.msg(message).plain();
    } else {
        $('div.editButtons').append('<div id="preload-templates" style="display:block; float:right; padding:10px;">' + i18n.preload + '&nbsp;</div>');
     }
     }


     // Create template list
     // Parse MediaWiki code to allow the use of includeonly and noninclude tags in the preload page
     // Get list
     function parseMW(source){
    $.get(wgScript, {
        return source.replace(/<includeonly>(\n)?|(\n)?<\/includeonly>|\s*<noinclude>[^]*?<\/noinclude>/g, '');
            title: mw.util.wikiUrlencode(config.list), // Encode string for eventual special characters
    }
            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
    // Error alert
            if ( listDataParsed === '' ) {
    function notFound(page){
                $('div#preload-templates').append( i18n.error.replace('$1' , '"<a href="/wiki/' + mw.util.wikiUrlencode(config.list) + '">' + config.list + '</a>"') ).append(preloadHelp);
        alert(i18n.msg('error', '"' + page + '"').plain());
                return;
    }
            }
           
            // Building the list HTML
            for (var i in lines) {
                var title;
                var string;


                // Ignore empty lines
    // Inserts text at the cursor's current position - originally from Wookieepedia
                if (lines[i].trim() === '') {
    function insertAtCursor(myField, myValue) {
                    continue;
        if (document.selection) {
                }
             // IE support
                // Text in a list is the template name
             myField.focus();
                if (lines[i].indexOf('*') === 0) {
            window.sel = document.selection.createRange();
                    title = lines[i].substring(1).trim();
             window.sel.text = myValue;
                    $preloadOptionsHtml += '<option value="' + title + '">' + title + '</option>';
        } else if ( myField.selectionStart || myField.selectionStart === 0 ) {
                } else {
            // MOZILLA/NETSCAPE support
                    // Rest are normal strings
            var startPos = myField.selectionStart,
                    string = lines[i];
                 endPos = myField.selectionEnd;
                    $preloadOptionsHtml += '<option disabled>' + string + '</option>';
             myField.value = myField.value.substring(0, startPos) +
                }
                myValue +
            }
                myField.value.substring(endPos, myField.value.length);
               
        } else {
             // Build list HTML
            myField.value += myValue;
             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
     // Get preload text and add it to the text area
     function getPreloadPage(title) {
     function getPreloadPage(title) {
         var page = namespace + ':' + title + '/' + config.subpage;
         // check if subpage is standard or is case by case
       
        var namespace = (function() {
         $.get(wgScript, {
        if (typeof window.preloadTemplates_namespace == 'undefined') return mwc.wgFormattedNamespaces['10'];
                 title: mw.util.wikiUrlencode(page), // Encode string for eventual special characters
        if (typeof mwc.wgFormattedNamespaces[window.preloadTemplates_namespace] != 'undefined') return mwc.wgFormattedNamespaces[window.preloadTemplates_namespace];
        for (var key in mwc.wgFormattedNamespaces) {
        if (mwc.wgFormattedNamespaces[key] == window.preloadTemplates_namespace) return mwc.wgFormattedNamespaces[key];
        }
        return mwc.wgFormattedNamespaces['10'];
        })();
        var namespacePagename = (function() {
        if (namespace) return namespace + ':';
        return '';
        })();
        var page = config.subpage === 'case-by-case' ?
            namespacePagename + title :
            namespacePagename + title + '/' + config.subpage;
 
         $.get(mw.util.wikiScript(), {
                 title: page,
                 action: 'raw',
                 action: 'raw',
                 ctype: 'text/plain'
                 ctype: 'text/plain'
Line 320: Line 101:
             // Parse some MediaWiki tags
             // Parse some MediaWiki tags
             var preloadDataParsed = parseMW(preloadData);
             var preloadDataParsed = parseMW(preloadData);
           
             // Display error if no useful data is present
             // Display error if no useful data is present
             if ( preloadDataParsed === '' ) {
             if (preloadDataParsed === '') {
                 notFound(page);
                 notFound(page);
                 return;
                 return;
Line 328: Line 108:


             // Insert syntax
             // Insert syntax
             if (document.getElementById('wpTextbox1')) {
             var cke = document.getElementsByClassName('cke_source'),
                 insertAtCursor(document.getElementById('wpTextbox1'), preloadDataParsed);
                textbox = document.getElementById('wpTextbox1'),
                cm = $(".CodeMirror").get(0);
            if (window.ve && ve.init && ve.init.target && ve.init.target.active) {
                // UCP Visual Editor (Source mode)
                ve.init.target
                    .getSurface()
                    .getModel().
                    getFragment()
                    .insertContent(preloadDataParsed);
            } else if (cke.length) {
                // Visual editor
                 insertAtCursor(cke[0], preloadDataParsed);
            } else if (cm){
                // text editor with syntex heighting
                var cmEditor = cm.CodeMirror;
                var cmdDoc = cmEditor.getDoc();
                cmdDoc.replaceRange(preloadDataParsed, cmdDoc.getCursor());
            }
            else if(textbox) {
                insertAtCursor(textbox, preloadDataParsed);
             } else {
             } else {
                 // Visual editor
                 console.warn('[PreloadTemplates] Could not find textbox to bind to');
                insertAtCursor(document.getElementsByClassName('cke_source')[0], preloadDataParsed);
             }
             }
         }).fail( function(){
         }).fail(function() {
             notFound(page);
             notFound(page);
         });
         });
     }
     }


    // Inserts text at the cursor's current position - originally from Wookieepedia
     function appendModule() {
     function insertAtCursor(myField, myValue) {
        var $moduleNew = $('.ve-ui-summaryPanel-summaryInputField');
    //IE support
        // Appending HTML to editor
         if (document.selection) {
         if ( $module.length ) {  
             myField.focus();
             $module.after($main);         // UCP source editors
             sel = document.selection.createRange();
        } else if ( $moduleOld.length ) {
             sel.text = myValue;
             $moduleOld.append($main);       // Old Non-UCP Source Editor
        } else if ( $moduleNew.length ) {
             $moduleNew.append($main);
         }
         }
         //MOZILLA/NETSCAPE support
    }
         else if (myField.selectionStart || myField.selectionStart == '0') {
 
             var startPos = myField.selectionStart;
// Add selector to editor
            var endPos = myField.selectionEnd;
    function preInit(i18nData) {
            myField.value = myField.value.substring(0, startPos) +
        i18n = i18nData;
                 myValue +
        $main = $('<div>', { id: 'preload-templates' });
                 myField.value.substring(endPos, myField.value.length);
         $main.append($('<span>', {
         } else {
            text: msg('preload')
             myField.value += myValue;
        }));
        $help = $('<div>', {
            id: 'pt-help'
        }).append($('<a>', {
            target: '_blank',
            href: 'https://dev.fandom.com/wiki/PreloadTemplates',
            title: msg('devWiki'),
            text: '?'
        }));
        appendModule();
    }
 
    function listHTML(parsed) {
         return mw.html.element('option', {
            selected: true,
            disabled: true
        }, msg('choose')) + parsed.split('\n').map(function(line) {
            // Ignore empty lines
            if (line.trim() === '') {
                return '';
            }
            // Text in a list is the template name
             if (line.indexOf('*') === 0) {
                var title = line.substring(1).trim();
 
                // Text after pipe is display name
                if (title.indexOf('|') !== -1) {
                    var parts = title.split('|');
                    return mw.html.element('option', {
                        value: parts[0].trim()
                    }, parts[1].trim());
                } else {
                    return mw.html.element('option', {
                        value: title
                    }, title);
                }
            } else {
                 // Rest are normal strings
                 return mw.html.element('option', {
                    disabled: true
                }, line.trim());
            }
        }).join();
    }
 
    // =================
    //  Initialization 
    // =================
 
    // If the initialization failed
    function initFail() {
         $main.append(
            i18n.msg(
                'error',
                mw.html.element('a', {
                    href: mw.util.getUrl(config.list)
                }, config.list)
             ).plain(),
            $help
        );
    }
 
    function init(listData) {
        var parsed = parseMW(listData); // Parse data for MediaWiki tags
 
        // Display error if no valid data is present
        if (parsed === '') {
            initFail();
            return;
         }
         }
        // Append template list and messages
        $main.append(
            $('<select>', {
                id: 'pt-list',
                title: msg('help'),
                html: listHTML(parsed)
            }).change(function() {
                var $this = $(this),
                    val = $this.val();
                // Restore default option
                $this.find('option:first-child').prop('selected', true);
                // Preload the template on click
                getPreloadPage(val);
            }),
            $help
        );
     }
     }
      
 
     // Parse MediaWiki code to allow the use of incudeoonly and noninclude tags in the preload page
     // ===========
     function parseMW(source){
     //   Imports 
         var parsed = source.replace(/<includeonly>(\n)?|(\n)?<\/includeonly>|\s*<noinclude>[^]*<\/noinclude>/g, '');
    // ===========
          
     /*if (!window.dev || !window.dev.i18n) {
        return parsed;
         importArticle({
            type: 'script',
            article: 'u:dev:MediaWiki:I18n-js/code.js'
         });
     }
     }
      
     importArticle({
     // Error alert
        type: 'style',
     function notFound(page){
        article: 'u:dev:MediaWiki:PreloadTemplates.css'
         var message = i18n.error.replace('$1' , '"' + page + '"');
     });*/
       
 
         alert(message);
     mw.hook('dev.i18n').add(function(i18no) {
     }
         $.when(
});
            i18no.loadMessages('PreloadTemplates'),
            mw.loader.using('mediawiki.util')
        ).then(function(i18nData) {
            preInit(i18nData);
            mw.hook('ve.activationComplete').add(appendModule);
            $.get(mw.util.wikiScript(), {
                title: config.list,
                action: 'raw',
                ctype: 'text/plain'
            }).done(init).fail(initFail);
         });
     });
 
})();

Latest revision as of 18:44, 4 April 2024

//  ================================
//      Custom preload templates
//  ================================
/*  @author Grunny 
    From https://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() {
    'use strict';
    var mwc = mw.config.get([
        'wgAction',
        'wgFormattedNamespaces',
        'wgNamespaceNumber'
    ]),
    $module = $('div#wpSummaryLabel'), // UCP source editors
    $moduleOld = $('div.module_content:first'); // Old Non-UCP Source Editor

    // Run conditions
    if (mwc.wgNamespaceNumber === 8) {
        console.log('[PreloadTemplates]: page is not supported.');
        return;
    }
    console.log('[PreloadTemplates]: version 1.06 - 07/2021.');

    // =================
    //   Configuration
    // =================
    var config = {
        list: window.preloadTemplates_list || 'MediaWiki:Custom-PreloadTemplates',
        subpage: window.preloadTemplates_subpage || 'preload'
    }, i18n, $main, $help;

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

    // Get plain message from i18n
    function msg(message) {
        return i18n.msg(message).plain();
    }

    // Parse MediaWiki code to allow the use of includeonly and noninclude tags in the preload page
    function parseMW(source){
        return source.replace(/<includeonly>(\n)?|(\n)?<\/includeonly>|\s*<noinclude>[^]*?<\/noinclude>/g, '');
    }

    // Error alert
    function notFound(page){
        alert(i18n.msg('error', '"' + page + '"').plain());
    }

    // Inserts text at the cursor's current position - originally from Wookieepedia
    function insertAtCursor(myField, myValue) {
        if (document.selection) {
            // IE support
            myField.focus();
            window.sel = document.selection.createRange();
            window.sel.text = myValue;
        } else if ( myField.selectionStart || myField.selectionStart === 0 ) {
            // MOZILLA/NETSCAPE support
            var startPos = myField.selectionStart,
                endPos = myField.selectionEnd;
            myField.value = myField.value.substring(0, startPos) +
                myValue +
                myField.value.substring(endPos, myField.value.length);
        } else {
            myField.value += myValue;
        }
    }

    // Get preload text and add it to the text area
    function getPreloadPage(title) {
        // check if subpage is standard or is case by case
        var namespace = (function() {
        	if (typeof window.preloadTemplates_namespace == 'undefined') return mwc.wgFormattedNamespaces['10'];
        	if (typeof mwc.wgFormattedNamespaces[window.preloadTemplates_namespace] != 'undefined') return mwc.wgFormattedNamespaces[window.preloadTemplates_namespace];
        	for (var key in mwc.wgFormattedNamespaces) {
        		if (mwc.wgFormattedNamespaces[key] == window.preloadTemplates_namespace) return mwc.wgFormattedNamespaces[key];
        	}
        	return mwc.wgFormattedNamespaces['10'];
        })();
        var namespacePagename = (function() {
        	if (namespace) return namespace + ':';
        	return '';
        })();
        var page = config.subpage === 'case-by-case' ?
            namespacePagename + title :
            namespacePagename + title + '/' + config.subpage;

        $.get(mw.util.wikiScript(), {
                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
            var cke = document.getElementsByClassName('cke_source'),
                textbox = document.getElementById('wpTextbox1'),
                cm = $(".CodeMirror").get(0);
            if (window.ve && ve.init && ve.init.target && ve.init.target.active) {
                // UCP Visual Editor (Source mode)
                ve.init.target
                    .getSurface()
                    .getModel().
                    getFragment()
                    .insertContent(preloadDataParsed);
            } else if (cke.length) {
                // Visual editor
                insertAtCursor(cke[0], preloadDataParsed);
            } else if (cm){
                // text editor with syntex heighting
                var cmEditor = cm.CodeMirror;
                var cmdDoc = cmEditor.getDoc();
                cmdDoc.replaceRange(preloadDataParsed, cmdDoc.getCursor());
            }
            else if(textbox) {
                insertAtCursor(textbox, preloadDataParsed);
            } else {
                console.warn('[PreloadTemplates] Could not find textbox to bind to');
            }
        }).fail(function() {
            notFound(page);
        });
    }

    function appendModule() {
        var $moduleNew = $('.ve-ui-summaryPanel-summaryInputField');
        // Appending HTML to editor
        if ( $module.length ) { 
            $module.after($main);          // UCP source editors
        } else if ( $moduleOld.length ) { 
            $moduleOld.append($main);       // Old Non-UCP Source Editor
        } else if ( $moduleNew.length ) {
            $moduleNew.append($main);
        }
    }

	// Add selector to editor
    function preInit(i18nData) {
        i18n = i18nData;
        $main = $('<div>', { id: 'preload-templates' });
        $main.append($('<span>', {
            text: msg('preload')
        }));
        $help = $('<div>', {
            id: 'pt-help'
        }).append($('<a>', {
            target: '_blank',
            href: 'https://dev.fandom.com/wiki/PreloadTemplates',
            title: msg('devWiki'),
            text: '?'
        }));
        appendModule();
    }

    function listHTML(parsed) {
        return mw.html.element('option', {
            selected: true,
            disabled: true
        }, msg('choose')) + parsed.split('\n').map(function(line) {
            // Ignore empty lines
            if (line.trim() === '') {
                return '';
            }
            // Text in a list is the template name
            if (line.indexOf('*') === 0) {
                var title = line.substring(1).trim();

                // Text after pipe is display name
                if (title.indexOf('|') !== -1) {
                    var parts = title.split('|');
                    return mw.html.element('option', {
                        value: parts[0].trim()
                    }, parts[1].trim());
                } else {
                    return mw.html.element('option', {
                        value: title
                    }, title);
                }
            } else {
                // Rest are normal strings
                return mw.html.element('option', {
                    disabled: true
                }, line.trim());
            }
        }).join();
    }

    // =================
    //   Initialization  
    // =================

    // If the initialization failed
    function initFail() {
        $main.append(
            i18n.msg(
                'error',
                mw.html.element('a', {
                    href: mw.util.getUrl(config.list)
                }, config.list)
            ).plain(),
            $help
        );
    }

    function init(listData) {
        var parsed = parseMW(listData); // Parse data for MediaWiki tags

        // Display error if no valid data is present
        if (parsed === '') {
            initFail();
            return;
        }

        // Append template list and messages
        $main.append(
            $('<select>', {
                id: 'pt-list',
                title: msg('help'),
                html: listHTML(parsed)
            }).change(function() {
                var $this = $(this),
                    val = $this.val();

                // Restore default option
                $this.find('option:first-child').prop('selected', true);

                // Preload the template on click
                getPreloadPage(val);
            }),
            $help
        );
    }

    // ===========
    //   Imports  
    // ===========
    /*if (!window.dev || !window.dev.i18n) {
        importArticle({
            type: 'script',
            article: 'u:dev:MediaWiki:I18n-js/code.js'
        });
    }
    importArticle({
        type: 'style',
        article: 'u:dev:MediaWiki:PreloadTemplates.css'
    });*/

    mw.hook('dev.i18n').add(function(i18no) {
        $.when(
            i18no.loadMessages('PreloadTemplates'),
            mw.loader.using('mediawiki.util')
        ).then(function(i18nData) {
            preInit(i18nData);
            mw.hook('ve.activationComplete').add(appendModule);
            $.get(mw.util.wikiScript(), {
                title: config.list,
                action: 'raw',
                ctype: 'text/plain'
            }).done(init).fail(initFail);
        });
    });

})();