MediaWiki:Gadget-PreloadTemplates.js
From Tardis Wiki, the free Doctor Who reference
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 + ' </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);
}
});