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
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
"use strict";

/**<nowiki>
/**<nowiki>
* Gadget that loads a couple of snippets for easier access to commonly copy/pasted templates and sections
* Gadget that loads a couple of snippets for easier access to commonly copy/pasted templates and sections
Line 5: Line 7:
*/
*/


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

year: 'numeric',
var preloadMsgs = [
timeZone: 'UTC'
'NPC',
});
'equipment',
var pagename = mw.config.get('wgTitle');
'item',
var preloadMsgs = ['NPC', 'equipment', 'item', 'location', 'monster', 'scenery', 'shop'
'location',
'monster',
//'navbox',
//'navbox-oneline',
'scenery',
//'navbox-subgroup',
'shop',
].map(function (msg) {
//'navbox',
return 'newarticletext-' + msg;
//'navbox-oneline',
});
//'navbox-subgroup',
function snippet(label, parts) {
].map(function(msg) {return 'newarticletext-'+msg;});
if (typeof parts == 'string') parts = [parts]; // if string is given, only use pre

return {
function snippet(label, parts) {
label: label,
if (typeof(parts) == 'string') parts = [parts]; // if string is given, only use pre
action: {
return {
type: 'encapsulate',
label: label,
options: {
action: {
pre: parts[0] || '',
type: 'encapsulate',
peri: parts[1] || '',
options: {
pre: parts[0] || '',
post: parts[2] || ''
}
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
function getLicense(name, chars, param) {
var label = name;
label = name[1];
name = name[0];
if (name instanceof Array) { // if the label shouldn't be the same as the name
}
label = name[1];
return snippet(label, ['{{' + name + ' license|', pagename.slice(0, -chars), (param || '') + '}}']);
name = name[0];
}
}
function getPreloads(preloads) {
return snippet(label, [
var arr = [];
'{{'+name+' license|',
for (var i = 0; i < preloads.length; i++) {
pagename.slice(0, -chars),
var msg = mw.message(preloads[i], mw.config.get('wgTitle'), mw.config.get('wgTitle').split(' (')[0]).plain();
(param || '') + '}}'
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: {
function getPreloads(preloads) {
type: 'encapsulate',
var arr = [];
options: {
for (var i=0;i<preloads.length;i++) {
pre: msg
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),
arr.push(obj);
action: {
}
type: 'encapsulate',
return arr;
options: {
}
pre: msg,
$('#wpTextbox1').on('wikiEditor-toolbar-doneInitialSections', function () {
},
if (typeof $('#wpTextbox1').wikiEditor != 'function') return console.log($('#wpTextbox1'), $('#wpTextbox1').wikiEditor);
},
var preloads = {
};
label: 'Preloads',
arr.push(obj);
layout: 'characters',
}
characters: [] // will be filled after MW messages have loaded.
return arr;
};
}
var templates = {

'label': 'Template presets',
$( '#wpTextbox1' ).on('wikiEditor-toolbar-doneInitialSections', function() {
'layout': 'characters',
if (typeof($('#wpTextbox1').wikiEditor) != 'function') return console.log($('#wpTextbox1'), $('#wpTextbox1').wikiEditor);
'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 preloads = {
var sections = {
label: 'Preloads',
'label': 'Section presets',
layout: 'characters',
'layout': 'characters',
characters: [], // will be filled after MW messages have loaded.
'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'])]
}
};
var templates = {
var currentDate = new Date().toISOString().split('T')[0];
'label': 'Template presets',
var references = {
'layout': 'characters',
'label': 'References',
'characters': [
'layout': 'characters',
snippet('Single {{Map}}', [
'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=}}'])]
'{{Map|name='+pagename+'|x=3200|y=3200|plane=0|r=4|mapID=0|mtype=',
};
'square',
var transcript = {
'}}'
'label': 'Transcripts',
]),
'layout': 'characters',
snippet('Multi-pin {{Map}}', [
'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}}')]
'{{Map|name='+pagename+'|',
};
'3200,3200|3232,3200',
var licenses = {
'|plane=0|mapID=0|mtype=pin}}'
'label': 'File licenses',
]),
'layout': 'characters',
snippet('{{Synced switch}}', [
'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}}')]
'{{Synced switch\n|version1 = ',
};
'',
var feedback = {
'\n|version2 = \n|version3 = \n}}\n'
'label': 'Missing something?',
]),
'layout': 'table',
snippet('{{DropLogProject}}', [
'headings': [{
'{{DropLogProject|kills=',
text: 'Are you missing a code snippet that would be useful here?'
'0',
}],
'}}\n'
'rows': [{
]),
text: {
snippet('{{DropLogProject|type=}}', [
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>.' : '')
'{{DropLogProject|kills=0|type=',
}
'chests',
}]
'}}\n'
};
]),
var isRedirect = /^\#REDIRECT\s*\[\[[^\]]+\]\](\n|$)/i.test($('#wpTextbox1').val()) && $('#wikiPreview div').text().length == 0;
snippet('{{Relative location}}', [
var groups = {};
'{{Relative location\n|location = '+pagename+'\n|north = ',
if (isRedirect && $('body').is('.ns-0')) groups['section-preloads'] = preloads; // will be filled after messages have loaded.
'',
groups['section-templates'] = templates;
'\n|west = \n|south = \n|east = \n}}\n'
if ($('body').is('.ns-0')) groups['section-sections'] = sections; // listed sections are only relevant to mainspace
]),
groups['section-refs'] = references;
snippet('{{External}}', [
if ($('body').is('.ns-120')) groups['section-transcript'] = transcript; // only show on Transcript: namespace.
'{{External|rs',
if ($('body').is('.ns-6')) groups['section-licenses'] = licenses; // only show on File: namespace.
'|rsc',
groups['section-feedback'] = feedback;
'}}\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.
// Show additional snippets, except for MediaWiki:, Module:, Exchange:, talk mw.pages.
if (!$('body').is('.ns-8, .ns-114, .ns-828, .ns-talk')) {
// Other namespaces might not necessarily need very many of these snippets, but there might be snippets for those in the future.
$('#wpTextbox1').wikiEditor('addToToolbar', {
if (!$('body').is('.ns-8, .ns-114, .ns-828, .ns-talk')) {
'sections': {
$('#wpTextbox1').wikiEditor('addToToolbar', {
'sections': {
'snippets': {
'type': 'booklet',
'snippets': {
'label': 'Presets/snippets',
'type': 'booklet',
'pages': groups
'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);
if (isRedirect && $('body').is('.ns-0')) {
$.when(mw.loader.using(['mediawiki.api', 'mediawiki.jqueryMsg']), $.ready).then(function() {
}).then(function () {
$('#wpTextbox1').wikiEditor('addToToolbar', {
return new mw.Api().loadMessagesIfMissing(preloadMsgs);
section: 'snippets',
}).then(function() {
page: 'section-preloads',
$('#wpTextbox1').wikiEditor('addToToolbar', {
characters: getPreloads(preloadMsgs)
section: 'snippets',
});
page: 'section-preloads',
});
characters: getPreloads(preloadMsgs),
}
});
});
});
}
});
});
});
//</nowiki>
//</nowiki>

Latest revision as of 12:06, 20 October 2024

"use strict";

/**<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'])]
    };
    var 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>