MediaWiki:Gadget-VSCodeEditButton.js

/* jshint jquery: true, maxerr: 99999999, esversion: 5 */

"use strict"; $(function {	function getCodeLink {		function toUriArgs(args) {			return args.map(function (value) { return value.key + "=" + value.value; }).join('&');		}		var scheme = 'vscode';		var codespaceScheme = 'https://*.github.dev';		var head = scheme ? scheme + "://" : codespaceScheme + "/";		var extensionID = 'rowewilsonfrederiskholme.wikitext';		var actionPath = '/PullPage';		var isRemoteBot = 'true';		var protocol = window.location.protocol;		var server = window.mw.config.get('wgServer');		var scriptPath = window.mw.config.get('wgScriptPath');		var apiPath = scriptPath + "/api.php";		var title = window.mw.config.get('wgPageName');		var args = [			{ 'key': 'RemoteBot', 'value': isRemoteBot },			{ 'key': 'TransferProtocol', 'value': protocol },			{ 'key': 'SiteHost', 'value': server },			{ 'key': 'APIPath', 'value': apiPath },			{ 'key': 'Title', 'value': title },		];		return "" + head + extensionID + actionPath + "?" + toUriArgs(args); }	var text = "Open in VSCode"; var gadgetID = "wikitext-extension-gadget"; if (!window.mw) { console.error(gadgetID + ": window.mw is not accessible."); return undefined; }	var skinName = window.mw.config.get('skin'); if (!skinName) { console.warn(gadgetID + ": skin is undefined"); return undefined; }	var anyButton = [ $('#ca-edit'), $('#ca-viewsource'), $('#ca-view') ].filter(function (value) { return value.length > 0; }).shift; if (anyButton === undefined) { console.warn(gadgetID + ": No buttons for insertion."); return undefined; }	var link = $('', {		id: 'vscode-wikitext-button',		href: getCodeLink,		class: 'wds-button wds-is-text page-header__action-button has-label',		title: 'Open this page in VSCode',		text: text,	}); if (skinName !== 'minerva') { anyButton.after(link); }	else { var span = $(' '); span.addClass('page-actions-menu__list-item'); link.addClass('mw-ui-icon mw-ui-icon-element mw-ui-icon-wikimedia-edit-base20 mw-ui-icon-with-label-desktop'); button.css({ 'align-items': 'center', 'display': 'flex' }); link.css('vertical-align', 'middle'); span.append(link); button.append(span); anyButton.parent.after(button); } });