MediaWiki:Gadget-code-snippets.js

From RuneRealm Wiki

This is an old revision of this page, as edited by Alex (talk | contribs) at 00:10, 17 October 2024. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Jump to navigation Jump to search

After saving, you may need to bypass your browser's cache to see the changes. For further information, see Wikipedia:Bypass your cache.

  • In most Windows and Linux browsers: Hold down Ctrl and press F5.
  • In Safari: Hold down ⇧ Shift and click the Reload button.
  • In Chrome and Firefox for Mac: Hold down both ⌘ Cmd+⇧ Shift and press R.
/**<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>