MediaWiki:Gadget-code-snippets.js: Difference between revisions

From RuneRealm Wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
No edit summary
Line 1: Line 1:
/**<nowiki> * Gadget that loads a couple of snippets for easier access to commonly copy/pasted templates and sections * Authors: ** Joeytje50*/$(function() { var today = new Date().toLocaleString('en-GB', {day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC'}); var pagename = mw.config.get('wgTitle'); var preloadMsgs = [ 'NPC', 'equipment', 'item', 'location', 'monster', 'scenery', 'shop', //'navbox', //'navbox-oneline', //'navbox-subgroup', ].map(function(msg) {return 'newarticletext-'+msg;}); function snippet(label, parts) { if (typeof(parts) == 'string') parts = [parts]; // if string is given, only use pre return { label: label, action: { type: 'encapsulate', options: { pre: parts[0] || '', peri: parts[1] || '', post: parts[2] || '', } } }; } function getLicense(name, chars, param) { var label = name; if (name instanceof Array) { // if the label shouldn't be the same as the name label = name[1]; name = name[0]; } return snippet(label, [ '{{'+name+' license|', pagename.slice(0, -chars), (param || '') + '}}' ]); } function getPreloads(preloads) { var arr = []; for (var i=0;i<preloads.length;i++) { var msg = mw.message(preloads[i], mw.config.get('wgTitle'), mw.config.get('wgTitle').split(' (')[0]).plain(); msg = msg.replace(/<\/?includeonly>/g, '').replace(/<noinclude>[\s\S]*<\/noinclude>/g, ''); // remove include-tags var obj = { label: preloads[i].charAt(15).toUpperCase() + preloads[i].substr(16), action: { type: 'encapsulate', options: { pre: msg, }, }, }; arr.push(obj); } return arr; } $( '#wpTextbox1' ).on('wikiEditor-toolbar-doneInitialSections', function() { if (typeof($('#wpTextbox1').wikiEditor) != 'function') return console.log($('#wpTextbox1'), $('#wpTextbox1').wikiEditor); var preloads = { label: 'Preloads', layout: 'characters', characters: [], // will be filled after MW messages have loaded. } var templates = { 'label': 'Template presets', 'layout': 'characters', 'characters': [ snippet('Single {{Map}}', [ '{{Map|name='+pagename+'|x=3200|y=3200|plane=0|r=4|mapID=0|mtype=', 'square', '}}' ]), snippet('Multi-pin {{Map}}', [ '{{Map|name='+pagename+'|', '3200,3200|3232,3200', '|plane=0|mapID=0|mtype=pin}}' ]), snippet('{{Synced switch}}', [ '{{Synced switch\n|version1 = ', '', '\n|version2 = \n|version3 = \n}}\n' ]), snippet('{{DropLogProject}}', [ '{{DropLogProject|kills=', '0', '}}\n' ]), snippet('{{DropLogProject|type=}}', [ '{{DropLogProject|kills=0|type=', 'chests', '}}\n' ]), snippet('{{Relative location}}', [ '{{Relative location\n|location = '+pagename+'\n|north = ', '', '\n|west = \n|south = \n|east = \n}}\n' ]), snippet('{{External}}', [ '{{External|rs', '|rsc', '}}\n' ]), snippet('{{Listen}}', [ '{{Listen\n|title = \n|desc = \n|filename = ', '', '}}\n' ]), snippet('{{Otheruses}}', [ '{{Otheruses|', '', '}}\n' ]), snippet('{{Redirect}}', [ '{{Redirect|', '', '}}\n' ]), ] }; var sections = { 'label': 'Section presets', 'layout': 'characters', 'characters': [ snippet('==References==', [ '==References==\n{{Reflist', '', '}}\n' ]), snippet('==NPC Locations==', [ '==Locations==\n{{LocTableHead}}\n{{LocLine\n|name = '+pagename+'\n|location = ', '', '\n|levels = \n|members = \n|mapID = \n|plane = 0\n|x:3200,y:3200,icon:redPin\n|x:3232,y:3232,icon:redPin\n|mtype = pin\n|group = \n}}\n{{LocTableBottom}}\n' ]), snippet('==Object Locations==', [ '==Locations==\n{{ObjectTableHead}}\n{{ObjectLocLine\n|name = '+pagename+'\n|location = ', '', '\n|members = \n|mapID = \n|plane = 0\n|x:3200,y:3200,icon:redPin\n|x:3232,y:3232,icon:redPin\n|mtype = pin\n|group = \n}}\n{{ObjectTableBottom}}\n' ]), snippet('==Monster Drops==', [ '==Drops==\n\n===100%===\n{{DropsTableHead}}\n{{DropsLine|name=', '', '|quantity=1|rarity=Always}}\n{{DropsTableBottom}}\n' ]), snippet('==Item Creation==', [ '== Creation ==\n{{Recipe\n|skill1 = ', '', '\n|skill1lvl = \n|skill1boostable = \n|skill1exp = \n|ticks = \n|members = \n|mat1 = \n|mat2 = \n|output1 = '+pagename+'\n|output1quantity = 1}}\n' ]), snippet('==Item Products==', [ '==Products==\n{{Uses material list|', pagename, '}}\n' ]), snippet('==Item sources==', [ '==Item sources==\n{{Drop sources|', pagename, '}}\n' ]), snippet('===Shop locations===', [ '===Shop locations===\n{{Store locations list|', pagename, '}}\n' ]), snippet('===Spawns===', [ '===Spawns===\n{{ItemSpawnTableHead}}\n{{ItemSpawnLine|name='+pagename+'|location=', '', '|members=|3200,3200}}\n{{ItemSpawnTableBottom}}\n' ]), snippet('==Changes==', [ '==Changes==\n{{Subject changes header}}\n{{Subject changes\n|date = ', today, '\n|update = \n|poll = \n|change = \n}}\n{{Subject changes footer}}\n' ]), snippet('==Combat styles==', [ '==Combat styles==\n{{CombatStyles|', '', '}}\n' ]), snippet('==Dialogue==', [ '==Dialogue==\n{{Hastranscript|', 'npc', '}}\n' ]), ] }; let currentDate = new Date().toISOString().split('T')[0]; var references = { 'label': 'References', 'layout': 'characters', 'characters': [ snippet('Ref section', [ '==References==\n{{Reflist', '', '}}\n' ]), snippet('Ref list', [ '{{Reflist|group=', '', '}}\n' ]), snippet('CiteTwitter', [ '{{CiteTwitter|author=|url=|date=|archiveurl=|archivedate=', currentDate, '|quote=|notes=|name=|group=}}' ]), snippet('CiteReddit', [ '{{CiteReddit|author=|url=|title=|quote=|date=|archiveurl=|archivedate=', currentDate, '|notes=|name=}}' ]), snippet('CiteNews', [ '{{CiteNews|author=|url=', '', '|title=|newsdate=|notes=|name=}}' ]), snippet('CiteVideo', [ '{{CiteVideo|author=|title=|url=', '', '|timestamp=|date=|site=|notes=|name=}}' ]), snippet('CiteNPC', [ '{{CiteNPC|npc=', '', '|quote=|loc=|notes=|name=}}' ]), snippet('CiteGeneral', [ '{{CiteGeneral|url=|title=|author=|date=|accessdate=', currentDate, '|publisher=|archiveurl=|archivedate=|quote=}}' ]), snippet('NamedRef', [ '{{CiteNPC|name=', '', '|group=}}' ]), ] }; var transcript = { 'label': 'Transcripts', 'layout': 'characters', 'characters': [ snippet('==Dialogue==', [ '==Dialogue==\n{{Hastranscript|', 'npc', '}}\n' ]), snippet('{{Transcript}}', [ '{{Transcript|', 'npc', '}}\n\n==Standard dialogue==\n* ' ]), snippet('{{overhead}}', [ '{{overhead|', 'Cor blimey mate, what are ye doing in me pockets?', '}}' ]), snippet('{{mes}}', [ '{{mes|', 'Nothing interesting happens.', '}}' ]), snippet('End of dialogue', '{{tact|end}}'), snippet('Members-only notice', '{{tact|members}}'), snippet('Interface opens', [ '{{tact|opens=', 'Interface', '}}' ]), snippet('Unlinked interface opens', [ '{{tact|opens2=', 'Interface', '}}' ]), snippet('Receives item', [ '{{tact|receives=', 'an [[item]]', '}}' ]), snippet('Shows previous', '{{tact|previous}}'), snippet('Shows prev-to-prev', '{{tact|previous2}}'), snippet('Shows initial', '{{tact|initial}}'), snippet('Shows other options', '{{tact|other}}'), snippet('Same as above', '{{tact|above}}'), snippet('Same as below', '{{tact|below}}'), snippet('Continues below', '{{tact|continue}}'), ] }; var licenses = { 'label': 'File licenses', 'layout': 'characters', 'characters': [ getLicense('Inventory', 4), getLicense(['DII', 'Detailed item'], 11), getLicense('Worn equipment', 13), getLicense('NPC', 4), getLicense(['Chathead', 'NPC chathead'], 13, '|sub=npc'), getLicense(['Chathead', 'Pet chathead'], 13, '|sub=pet'), getLicense(['Chathead', 'player chathead'], 13, '|sub=player'), getLicense('Monster', 4), getLicense('Scenery', 4), getLicense(['POH', 'POH furniture'], 4), getLicense('Location', 4), getLicense('Map', 13), getLicense('Interface', 1e10), getLicense('Emote', 4), getLicense(['Prayer', 'Prayer icon'], 4), getLicense(['Spell', 'Spell icon'], 4), getLicense(['Quest', 'Quest scroll'], 18, '|sub=scroll'), getLicense(['Quest', 'Quest infobox'], 4, '|sub=infobox'), getLicense('Animation', 1e10), snippet('Audio', '{{Non-free audio}}'), getLicense('Miscellaneous', 4), snippet('Fair use', '{{Fair use}}'), snippet('CC-BY-SA', '{{CC-BY-SA}}'), ] }; var feedback = { 'label': 'Missing something?', 'layout': 'table', 'headings': [ { text: 'Are you missing a code snippet that would be useful here?' } ], 'rows': [ { text: { html: 'You can <a href="https://oldschool.runescape.wiki/w/RuneScape:User_help?action=edit&section=new&preloadtitle=Requesting%20new%20code%20snippet%20in%20editor" target="_blank">'+ 'request a snippet</a> to be added.'+ (mw.config.get('wgUserGroups').includes('sysop') ? '<br/>Admins may edit the <a href="/w/MediaWiki:Gadget-code-snippets.js" title="MediaWiki:Gadget-code-snippets.js">code snippets script</a>.' : ''), }, } ], }; var isRedirect = /^\#REDIRECT\s*\[\[[^\]]+\]\](\n|$)/i.test($('#wpTextbox1').val()) && $('#wikiPreview div').text().length == 0; var groups = {}; if (isRedirect && $('body').is('.ns-0')) groups['section-preloads'] = preloads; // will be filled after messages have loaded. groups['section-templates'] = templates; if ($('body').is('.ns-0')) groups['section-sections'] = sections; // listed sections are only relevant to mainspace groups['section-refs'] = references; if ($('body').is('.ns-120')) groups['section-transcript'] = transcript; // only show on Transcript: namespace. if ($('body').is('.ns-6')) groups['section-licenses'] = licenses; // only show on File: namespace. groups['section-feedback'] = feedback; // Show additional snippets, except for MediaWiki:, Module:, Exchange:, talk pages. // Other namespaces might not necessarily need very many of these snippets, but there might be snippets for those in the future. if (!$('body').is('.ns-8, .ns-114, .ns-828, .ns-talk')) { $('#wpTextbox1').wikiEditor('addToToolbar', { 'sections': { 'snippets': { 'type': 'booklet', 'label': 'Presets/snippets', 'pages': groups, } } }); } if (isRedirect && $('body').is('.ns-0')) { $.when(mw.loader.using(['mediawiki.api', 'mediawiki.jqueryMsg']), $.ready).then(function() { return new mw.Api().loadMessagesIfMissing(preloadMsgs); }).then(function() { $('#wpTextbox1').wikiEditor('addToToolbar', { section: 'snippets', page: 'section-preloads', characters: getPreloads(preloadMsgs), }); }); } });});//</nowiki>
/**<nowiki>
* Gadget that loads a couple of snippets for easier access to commonly copy/pasted templates and sections
* Authors:
** Joeytje50
*/

$(function() {
var today = new Date().toLocaleString('en-GB', {day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC'});
var pagename = mw.config.get('wgTitle');

var preloadMsgs = [
'NPC',
'equipment',
'item',
'location',
'monster',
'scenery',
'shop',
//'navbox',
//'navbox-oneline',
//'navbox-subgroup',
].map(function(msg) {return 'newarticletext-'+msg;});

function snippet(label, parts) {
if (typeof(parts) == 'string') parts = [parts]; // if string is given, only use pre
return {
label: label,
action: {
type: 'encapsulate',
options: {
pre: parts[0] || '',
peri: parts[1] || '',
post: parts[2] || '',
}
}
};
}
function getLicense(name, chars, param) {
var label = name;
if (name instanceof Array) { // if the label shouldn't be the same as the name
label = name[1];
name = name[0];
}
return snippet(label, [
'{{'+name+' license|',
pagename.slice(0, -chars),
(param || '') + '}}'
]);
}
function getPreloads(preloads) {
var arr = [];
for (var i=0;i<preloads.length;i++) {
var msg = mw.message(preloads[i], mw.config.get('wgTitle'), mw.config.get('wgTitle').split(' (')[0]).plain();
msg = msg.replace(/<\/?includeonly>/g, '').replace(/<noinclude>[\s\S]*<\/noinclude>/g, ''); // remove include-tags
var obj = {
label: preloads[i].charAt(15).toUpperCase() + preloads[i].substr(16),
action: {
type: 'encapsulate',
options: {
pre: msg,
},
},
};
arr.push(obj);
}
return arr;
}

$( '#wpTextbox1' ).on('wikiEditor-toolbar-doneInitialSections', function() {
if (typeof($('#wpTextbox1').wikiEditor) != 'function') return console.log($('#wpTextbox1'), $('#wpTextbox1').wikiEditor);
var preloads = {
label: 'Preloads',
layout: 'characters',
characters: [], // will be filled after MW messages have loaded.
}
var templates = {
'label': 'Template presets',
'layout': 'characters',
'characters': [
snippet('Single {{Map}}', [
'{{Map|name='+pagename+'|x=3200|y=3200|plane=0|r=4|mapID=0|mtype=',
'square',
'}}'
]),
snippet('Multi-pin {{Map}}', [
'{{Map|name='+pagename+'|',
'3200,3200|3232,3200',
'|plane=0|mapID=0|mtype=pin}}'
]),
snippet('{{Synced switch}}', [
'{{Synced switch\n|version1 = ',
'',
'\n|version2 = \n|version3 = \n}}\n'
]),
snippet('{{DropLogProject}}', [
'{{DropLogProject|kills=',
'0',
'}}\n'
]),
snippet('{{DropLogProject|type=}}', [
'{{DropLogProject|kills=0|type=',
'chests',
'}}\n'
]),
snippet('{{Relative location}}', [
'{{Relative location\n|location = '+pagename+'\n|north = ',
'',
'\n|west = \n|south = \n|east = \n}}\n'
]),
snippet('{{External}}', [
'{{External|rs',
'|rsc',
'}}\n'
]),
snippet('{{Listen}}', [
'{{Listen\n|title = \n|desc = \n|filename = ',
'',
'}}\n'
]),
snippet('{{Otheruses}}', [
'{{Otheruses|',
'',
'}}\n'
]),
snippet('{{Redirect}}', [
'{{Redirect|',
'',
'}}\n'
]),
]
};
var sections = {
'label': 'Section presets',
'layout': 'characters',
'characters': [
snippet('==References==', [
'==References==\n{{Reflist',
'',
'}}\n'
]),
snippet('==NPC Locations==', [
'==Locations==\n{{LocTableHead}}\n{{LocLine\n|name = '+pagename+'\n|location = ',
'',
'\n|levels = \n|members = \n|mapID = \n|plane = 0\n|x:3200,y:3200,icon:redPin\n|x:3232,y:3232,icon:redPin\n|mtype = pin\n|group = \n}}\n{{LocTableBottom}}\n'
]),
snippet('==Object Locations==', [
'==Locations==\n{{ObjectTableHead}}\n{{ObjectLocLine\n|name = '+pagename+'\n|location = ',
'',
'\n|members = \n|mapID = \n|plane = 0\n|x:3200,y:3200,icon:redPin\n|x:3232,y:3232,icon:redPin\n|mtype = pin\n|group = \n}}\n{{ObjectTableBottom}}\n'
]),
snippet('==Monster Drops==', [
'==Drops==\n\n===100%===\n{{DropsTableHead}}\n{{DropsLine|name=',
'',
'|quantity=1|rarity=Always}}\n{{DropsTableBottom}}\n'
]),
snippet('==Item Creation==', [
'== Creation ==\n{{Recipe\n|skill1 = ',
'',
'\n|skill1lvl = \n|skill1boostable = \n|skill1exp = \n|ticks = \n|members = \n|mat1 = \n|mat2 = \n|output1 = '+pagename+'\n|output1quantity = 1}}\n'
]),
snippet('==Item Products==', [
'==Products==\n{{Uses material list|',
pagename,
'}}\n'
]),
snippet('==Item sources==', [
'==Item sources==\n{{Drop sources|',
pagename,
'}}\n'
]),
snippet('===Shop locations===', [
'===Shop locations===\n{{Store locations list|',
pagename,
'}}\n'
]),
snippet('===Spawns===', [
'===Spawns===\n{{ItemSpawnTableHead}}\n{{ItemSpawnLine|name='+pagename+'|location=',
'',
'|members=|3200,3200}}\n{{ItemSpawnTableBottom}}\n'
]),
snippet('==Changes==', [
'==Changes==\n{{Subject changes header}}\n{{Subject changes\n|date = ',
today,
'\n|update = \n|poll = \n|change = \n}}\n{{Subject changes footer}}\n'
]),
snippet('==Combat styles==', [
'==Combat styles==\n{{CombatStyles|',
'',
'}}\n'
]),
snippet('==Dialogue==', [
'==Dialogue==\n{{Hastranscript|',
'npc',
'}}\n'
]),
]
};
let currentDate = new Date().toISOString().split('T')[0];
var references = {
'label': 'References',
'layout': 'characters',
'characters': [
snippet('Ref section', [
'==References==\n{{Reflist',
'',
'}}\n'
]),
snippet('Ref list', [
'{{Reflist|group=',
'',
'}}\n'
]),
snippet('CiteTwitter', [
'{{CiteTwitter|author=|url=|date=|archiveurl=|archivedate=',
currentDate,
'|quote=|notes=|name=|group=}}'
]),
snippet('CiteReddit', [
'{{CiteReddit|author=|url=|title=|quote=|date=|archiveurl=|archivedate=',
currentDate,
'|notes=|name=}}'
]),
snippet('CiteNews', [
'{{CiteNews|author=|url=',
'',
'|title=|newsdate=|notes=|name=}}'
]),
snippet('CiteVideo', [
'{{CiteVideo|author=|title=|url=',
'',
'|timestamp=|date=|site=|notes=|name=}}'
]),
snippet('CiteNPC', [
'{{CiteNPC|npc=',
'',
'|quote=|loc=|notes=|name=}}'
]),
snippet('CiteGeneral', [
'{{CiteGeneral|url=|title=|author=|date=|accessdate=',
currentDate,
'|publisher=|archiveurl=|archivedate=|quote=}}'
]),
snippet('NamedRef', [
'{{CiteNPC|name=',
'',
'|group=}}'
]),
]
};
var transcript = {
'label': 'Transcripts',
'layout': 'characters',
'characters': [
snippet('==Dialogue==', [
'==Dialogue==\n{{Hastranscript|',
'npc',
'}}\n'
]),
snippet('{{Transcript}}', [
'{{Transcript|',
'npc',
'}}\n\n==Standard dialogue==\n* '
]),
snippet('{{overhead}}', [
'{{overhead|',
'Cor blimey mate, what are ye doing in me pockets?',
'}}'
]),
snippet('{{mes}}', [
'{{mes|',
'Nothing interesting happens.',
'}}'
]),
snippet('End of dialogue', '{{tact|end}}'),
snippet('Members-only notice', '{{tact|members}}'),
snippet('Interface opens', [
'{{tact|opens=',
'Interface',
'}}'
]),
snippet('Unlinked interface opens', [
'{{tact|opens2=',
'Interface',
'}}'
]),
snippet('Receives item', [
'{{tact|receives=',
'an [[item]]',
'}}'
]),
snippet('Shows previous', '{{tact|previous}}'),
snippet('Shows prev-to-prev', '{{tact|previous2}}'),
snippet('Shows initial', '{{tact|initial}}'),
snippet('Shows other options', '{{tact|other}}'),
snippet('Same as above', '{{tact|above}}'),
snippet('Same as below', '{{tact|below}}'),
snippet('Continues below', '{{tact|continue}}'),
]
};
var licenses = {
'label': 'File licenses',
'layout': 'characters',
'characters': [
getLicense('Inventory', 4),
getLicense(['DII', 'Detailed item'], 11),
getLicense('Worn equipment', 13),
getLicense('NPC', 4),
getLicense(['Chathead', 'NPC chathead'], 13, '|sub=npc'),
getLicense(['Chathead', 'Pet chathead'], 13, '|sub=pet'),
getLicense(['Chathead', 'player chathead'], 13, '|sub=player'),
getLicense('Monster', 4),
getLicense('Scenery', 4),
getLicense(['POH', 'POH furniture'], 4),
getLicense('Location', 4),
getLicense('Map', 13),
getLicense('Interface', 1e10),
getLicense('Emote', 4),
getLicense(['Prayer', 'Prayer icon'], 4),
getLicense(['Spell', 'Spell icon'], 4),
getLicense(['Quest', 'Quest scroll'], 18, '|sub=scroll'),
getLicense(['Quest', 'Quest infobox'], 4, '|sub=infobox'),
getLicense('Animation', 1e10),
snippet('Audio', '{{Non-free audio}}'),
getLicense('Miscellaneous', 4),
snippet('Fair use', '{{Fair use}}'),
snippet('CC-BY-SA', '{{CC-BY-SA}}'),
]
};
var feedback = {
'label': 'Missing something?',
'layout': 'table',
'headings': [
{ text: 'Are you missing a code snippet that would be useful here?' }
],
'rows': [
{
text: { html:
'You can <a href="https://oldschool.runescape.wiki/w/RuneScape:User_help?action=edit&section=new&preloadtitle=Requesting%20new%20code%20snippet%20in%20editor" target="_blank">'+
'request a snippet</a> to be added.'+
(mw.config.get('wgUserGroups').includes('sysop') ? '<br/>Admins may edit the <a href="/w/MediaWiki:Gadget-code-snippets.js" title="MediaWiki:Gadget-code-snippets.js">code snippets script</a>.' : ''),
},
}
],
};
var isRedirect = /^\#REDIRECT\s*\[\[[^\]]+\]\](\n|$)/i.test($('#wpTextbox1').val()) && $('#wikiPreview div').text().length == 0;
var groups = {};
if (isRedirect && $('body').is('.ns-0')) groups['section-preloads'] = preloads; // will be filled after messages have loaded.
groups['section-templates'] = templates;
if ($('body').is('.ns-0')) groups['section-sections'] = sections; // listed sections are only relevant to mainspace
groups['section-refs'] = references;
if ($('body').is('.ns-120')) groups['section-transcript'] = transcript; // only show on Transcript: namespace.
if ($('body').is('.ns-6')) groups['section-licenses'] = licenses; // only show on File: namespace.
groups['section-feedback'] = feedback;

// Show additional snippets, except for MediaWiki:, Module:, Exchange:, talk mw.pages.
// Other namespaces might not necessarily need very many of these snippets, but there might be snippets for those in the future.
if (!$('body').is('.ns-8, .ns-114, .ns-828, .ns-talk')) {
$('#wpTextbox1').wikiEditor('addToToolbar', {
'sections': {
'snippets': {
'type': 'booklet',
'label': 'Presets/snippets',
'mw.pages': groups,
}
}
});
}
if (isRedirect && $('body').is('.ns-0')) {
$.when(mw.loader.using(['mediawiki.api', 'mediawiki.jqueryMsg']), $.ready).then(function() {
return new mw.Api().loadMessagesIfMissing(preloadMsgs);
}).then(function() {
$('#wpTextbox1').wikiEditor('addToToolbar', {
section: 'snippets',
page: 'section-preloads',
characters: getPreloads(preloadMsgs),
});
});
}
});
});
//</nowiki>

Revision as of 17:12, 17 October 2024

/**<nowiki> * Gadget that loads a couple of snippets for easier access to commonly copy/pasted templates and sections * Authors: ** Joeytje50*/$(function() {	var today = new Date().toLocaleString('en-GB', {day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC'});	var pagename = mw.config.get('wgTitle');	var preloadMsgs = [		'NPC',		'equipment',		'item',		'location',		'monster',		'scenery',		'shop',		//'navbox',		//'navbox-oneline',		//'navbox-subgroup',	].map(function(msg) {return 'newarticletext-'+msg;});	function snippet(label, parts) {		if (typeof(parts) == 'string') parts = [parts]; // if string is given, only use pre		return {			label: label,			action: {				type: 'encapsulate',				options: {					pre: parts[0] || '',					peri: parts[1] || '',					post: parts[2] || '',				}			}		};	}		function getLicense(name, chars, param) {		var label = name;		if (name instanceof Array) { // if the label shouldn't be the same as the name			label = name[1];			name = name[0];		}		return snippet(label, [			'{{'+name+' license|',			pagename.slice(0, -chars),			(param || '') + '}}'		]);	}		function getPreloads(preloads) {		var arr = [];		for (var i=0;i<preloads.length;i++) {			var msg = mw.message(preloads[i], mw.config.get('wgTitle'), mw.config.get('wgTitle').split(' (')[0]).plain();			msg = msg.replace(/<\/?includeonly>/g, '').replace(/<noinclude>[\s\S]*<\/noinclude>/g, ''); // remove include-tags			var obj = {				label: preloads[i].charAt(15).toUpperCase() + preloads[i].substr(16),				action: {					type: 'encapsulate',					options: {						pre: msg,					},				},			};			arr.push(obj);		}		return arr;	}	$( '#wpTextbox1' ).on('wikiEditor-toolbar-doneInitialSections', function() {		if (typeof($('#wpTextbox1').wikiEditor) != 'function') return console.log($('#wpTextbox1'), $('#wpTextbox1').wikiEditor);				var preloads = {			label: 'Preloads',			layout: 'characters',			characters: [], // will be filled after MW messages have loaded.		}		var templates = {			'label': 'Template presets',			'layout': 'characters',			'characters': [				snippet('Single {{Map}}', [					'{{Map|name='+pagename+'|x=3200|y=3200|plane=0|r=4|mapID=0|mtype=', 					'square', 					'}}'				]),				snippet('Multi-pin {{Map}}', [					'{{Map|name='+pagename+'|', 					'3200,3200|3232,3200', 					'|plane=0|mapID=0|mtype=pin}}'				]),				snippet('{{Synced switch}}', [					'{{Synced switch\n|version1 = ', 					'', 					'\n|version2 = \n|version3 = \n}}\n'				]),				snippet('{{DropLogProject}}', [					'{{DropLogProject|kills=', 					'0',					'}}\n'				]),				snippet('{{DropLogProject|type=}}', [					'{{DropLogProject|kills=0|type=', 					'chests',					'}}\n'				]),				snippet('{{Relative location}}', [					'{{Relative location\n|location = '+pagename+'\n|north = ', 					'', 					'\n|west = \n|south = \n|east = \n}}\n'				]),				snippet('{{External}}', [					'{{External|rs', 					'|rsc', 					'}}\n'				]),				snippet('{{Listen}}', [					'{{Listen\n|title = \n|desc = \n|filename = ', 					'', 					'}}\n'				]),				snippet('{{Otheruses}}', [					'{{Otheruses|', 					'', 					'}}\n'				]),				snippet('{{Redirect}}', [					'{{Redirect|', 					'', 					'}}\n'				]),			]		};		var sections = {			'label': 'Section presets',			'layout': 'characters',			'characters': [				snippet('==References==', [					'==References==\n{{Reflist', 					'', 					'}}\n'				]),				snippet('==NPC Locations==', [					'==Locations==\n{{LocTableHead}}\n{{LocLine\n|name = '+pagename+'\n|location = ', 					'', 					'\n|levels = \n|members = \n|mapID = \n|plane = 0\n|x:3200,y:3200,icon:redPin\n|x:3232,y:3232,icon:redPin\n|mtype = pin\n|group = \n}}\n{{LocTableBottom}}\n'				]),				snippet('==Object Locations==', [					'==Locations==\n{{ObjectTableHead}}\n{{ObjectLocLine\n|name = '+pagename+'\n|location = ', 					'', 					'\n|members = \n|mapID = \n|plane = 0\n|x:3200,y:3200,icon:redPin\n|x:3232,y:3232,icon:redPin\n|mtype = pin\n|group = \n}}\n{{ObjectTableBottom}}\n'				]),				snippet('==Monster Drops==', [					'==Drops==\n\n===100%===\n{{DropsTableHead}}\n{{DropsLine|name=', 					'', 					'|quantity=1|rarity=Always}}\n{{DropsTableBottom}}\n'				]),				snippet('==Item Creation==', [					'== Creation ==\n{{Recipe\n|skill1 = ', 					'', 					'\n|skill1lvl = \n|skill1boostable = \n|skill1exp = \n|ticks = \n|members = \n|mat1 = \n|mat2 = \n|output1 = '+pagename+'\n|output1quantity = 1}}\n'				]),				snippet('==Item Products==', [					'==Products==\n{{Uses material list|',					pagename,					'}}\n'				]),				snippet('==Item sources==', [					'==Item sources==\n{{Drop sources|',					pagename,					'}}\n'				]),				snippet('===Shop locations===', [					'===Shop locations===\n{{Store locations list|',					pagename,					'}}\n'				]),				snippet('===Spawns===', [					'===Spawns===\n{{ItemSpawnTableHead}}\n{{ItemSpawnLine|name='+pagename+'|location=', 					'', 					'|members=|3200,3200}}\n{{ItemSpawnTableBottom}}\n'				]),				snippet('==Changes==', [					'==Changes==\n{{Subject changes header}}\n{{Subject changes\n|date = ',					today,					'\n|update = \n|poll = \n|change = \n}}\n{{Subject changes footer}}\n'				]),				snippet('==Combat styles==', [					'==Combat styles==\n{{CombatStyles|', 					'', 					'}}\n'				]),				snippet('==Dialogue==', [					'==Dialogue==\n{{Hastranscript|', 					'npc', 					'}}\n'				]),			]		};		let currentDate = new Date().toISOString().split('T')[0];		var references = {			'label': 'References',			'layout': 'characters',			'characters': [				snippet('Ref section', [					'==References==\n{{Reflist', 					'', 					'}}\n'				]),				snippet('Ref list', [					'{{Reflist|group=', 					'', 					'}}\n'				]),				snippet('CiteTwitter', [					'{{CiteTwitter|author=|url=|date=|archiveurl=|archivedate=', 					currentDate,					'|quote=|notes=|name=|group=}}'				]),				snippet('CiteReddit', [					'{{CiteReddit|author=|url=|title=|quote=|date=|archiveurl=|archivedate=', 					currentDate, 					'|notes=|name=}}'				]),				snippet('CiteNews', [					'{{CiteNews|author=|url=', 					'', 					'|title=|newsdate=|notes=|name=}}'				]),				snippet('CiteVideo', [					'{{CiteVideo|author=|title=|url=',					'',					'|timestamp=|date=|site=|notes=|name=}}'				]),				snippet('CiteNPC', [					'{{CiteNPC|npc=', 					'', 					'|quote=|loc=|notes=|name=}}'				]),				snippet('CiteGeneral', [					'{{CiteGeneral|url=|title=|author=|date=|accessdate=',					currentDate,					'|publisher=|archiveurl=|archivedate=|quote=}}'				]),				snippet('NamedRef', [					'{{CiteNPC|name=', 					'', 					'|group=}}'				]),			]		};		var transcript = {			'label': 'Transcripts',			'layout': 'characters',			'characters': [				snippet('==Dialogue==', [					'==Dialogue==\n{{Hastranscript|', 					'npc', 					'}}\n'				]),				snippet('{{Transcript}}', [					'{{Transcript|', 					'npc', 					'}}\n\n==Standard dialogue==\n* '				]),				snippet('{{overhead}}', [					'{{overhead|',					'Cor blimey mate, what are ye doing in me pockets?',					'}}'				]),				snippet('{{mes}}', [					'{{mes|',					'Nothing interesting happens.',					'}}'				]),				snippet('End of dialogue', '{{tact|end}}'),				snippet('Members-only notice', '{{tact|members}}'),				snippet('Interface opens', [					'{{tact|opens=', 					'Interface', 					'}}'				]),				snippet('Unlinked interface opens', [					'{{tact|opens2=', 					'Interface', 					'}}'				]),				snippet('Receives item', [					'{{tact|receives=', 					'an [[item]]', 					'}}'				]),				snippet('Shows previous', '{{tact|previous}}'),				snippet('Shows prev-to-prev', '{{tact|previous2}}'),				snippet('Shows initial', '{{tact|initial}}'),				snippet('Shows other options', '{{tact|other}}'),				snippet('Same as above', '{{tact|above}}'),				snippet('Same as below', '{{tact|below}}'),				snippet('Continues below', '{{tact|continue}}'),			]		};		var licenses = {			'label': 'File licenses',			'layout': 'characters',			'characters': [				getLicense('Inventory', 4),				getLicense(['DII', 'Detailed item'], 11),				getLicense('Worn equipment', 13),				getLicense('NPC', 4),				getLicense(['Chathead', 'NPC chathead'], 13, '|sub=npc'),				getLicense(['Chathead', 'Pet chathead'], 13, '|sub=pet'),				getLicense(['Chathead', 'player chathead'], 13, '|sub=player'),				getLicense('Monster', 4),				getLicense('Scenery', 4),				getLicense(['POH', 'POH furniture'], 4),				getLicense('Location', 4),				getLicense('Map', 13),				getLicense('Interface', 1e10),				getLicense('Emote', 4),				getLicense(['Prayer', 'Prayer icon'], 4),				getLicense(['Spell', 'Spell icon'], 4),				getLicense(['Quest', 'Quest scroll'], 18, '|sub=scroll'),				getLicense(['Quest', 'Quest infobox'], 4, '|sub=infobox'),				getLicense('Animation', 1e10),				snippet('Audio', '{{Non-free audio}}'),				getLicense('Miscellaneous', 4),				snippet('Fair use', '{{Fair use}}'),				snippet('CC-BY-SA', '{{CC-BY-SA}}'),			]		};		var feedback = {			'label': 'Missing something?',			'layout': 'table',			'headings': [				{ text: 'Are you missing a code snippet that would be useful here?' }			],			'rows': [				{					text: { html: 						'You can <a href="https://oldschool.runescape.wiki/w/RuneScape:User_help?action=edit&section=new&preloadtitle=Requesting%20new%20code%20snippet%20in%20editor" target="_blank">'+						'request a snippet</a> to be added.'+						(mw.config.get('wgUserGroups').includes('sysop') ? '<br/>Admins may edit the <a href="/w/MediaWiki:Gadget-code-snippets.js" title="MediaWiki:Gadget-code-snippets.js">code snippets script</a>.' : ''),					},				}			],		};						var isRedirect = /^\#REDIRECT\s*\[\[[^\]]+\]\](\n|$)/i.test($('#wpTextbox1').val()) && $('#wikiPreview div').text().length == 0;				var groups = {};		if (isRedirect && $('body').is('.ns-0')) groups['section-preloads'] = preloads; // will be filled after messages have loaded.		groups['section-templates'] = templates;		if ($('body').is('.ns-0')) groups['section-sections'] = sections; // listed sections are only relevant to mainspace		groups['section-refs'] = references;		if ($('body').is('.ns-120')) groups['section-transcript'] = transcript; // only show on Transcript: namespace.		if ($('body').is('.ns-6')) groups['section-licenses'] = licenses; // only show on File: namespace.		groups['section-feedback'] = feedback;				// Show additional snippets, except for MediaWiki:, Module:, Exchange:, talk pages.		// Other namespaces might not necessarily need very many of these snippets, but there might be snippets for those in the future.		if (!$('body').is('.ns-8, .ns-114, .ns-828, .ns-talk')) {			$('#wpTextbox1').wikiEditor('addToToolbar', {				'sections': {					'snippets': {						'type': 'booklet',						'label': 'Presets/snippets',						'pages': groups,					}				}			});		}				if (isRedirect && $('body').is('.ns-0')) {			$.when(mw.loader.using(['mediawiki.api', 'mediawiki.jqueryMsg']), $.ready).then(function() {		        return new mw.Api().loadMessagesIfMissing(preloadMsgs);		    }).then(function() {				$('#wpTextbox1').wikiEditor('addToToolbar', {					section: 'snippets',					page: 'section-preloads',					characters: getPreloads(preloadMsgs),				});			});		}	});});//</nowiki>