Benutzer:Schnark/js/localFile.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
//Dokumentation unter [[Benutzer:Schnark/js/localFile]] <nowiki>
/* global OO, ve */
/* global URL, Blob */ // alte Version von jshint kennt URL und Blob noch nicht
(function () {
"use strict";

var l10n = {
	en: {
		'schnark-file-open': 'Open file',
		'schnark-file-save': 'Save as file'
	},
	de: {
		'schnark-file-open': 'Datei öffnen',
		'schnark-file-save': 'Lokal speichern'
	}
};

function initL10N (l10n) {
	var i, chain = mw.language.getFallbackLanguageChain();
	for (i = chain.length - 1; i >= 0; i--) {
		if (chain[i] in l10n) {
			mw.messages.set(l10n[chain[i]]);
		}
	}
}

function getFilename () {
	var name = mw.config.get('wgTitle'), modelToExt = {
		javascript: 'js',
		css: 'css',
		Scribunto: 'lua',
		wikitext: 'txt'
	}, ext = modelToExt[mw.config.get('wgPageContentModel')] || 'json';

	ext = '.' + ext;
	if (ext === '.txt' || name.slice(-ext.length) !== ext) {
		name += ext;
	}
	return name;
}

function addButton ($container, label, onClick) {
	mw.loader.using('oojs-ui-core').then(function () {
		var button = new OO.ui.ButtonWidget({
			label: label
		});
		button.on('click', onClick);
		$container.append(button.$element);
	});
}

function addFileOpen ($container, $editbox) {
	addButton($container, mw.msg('schnark-file-open'), function () {
		fileOpen(function (text) {
			$editbox.textSelection('setContents', text);
		});
	});
}

function addFileSave ($container, $editbox) {
	addButton($container, mw.msg('schnark-file-save'), function () {
		fileSaveAs($editbox.textSelection('getContents'), getFilename());
	});
}

function makeVETools () {
	initL10N(l10n);

	function OpenFileCommand () {
		OpenFileCommand.parent.call(this, 'openFile');
	}
	OO.inheritClass(OpenFileCommand, ve.ui.Command);

	OpenFileCommand.prototype.execute = function (surface) {
		var target = ve.init.target;

		fileOpen(function (wikitext) {
			var surfaceModel;
			if (target.getSurface().getMode() !== 'source') {
				target.reloadSurface('visual',
					mw.libs.ve.targetLoader.requestParsoidData(target.pageName, {
						oldId: target.revid,
						targetName: 'schnark-localFile',
						modified: true,
						wikitext: wikitext
					})
				);
			} else {
				surfaceModel = surface.getModel();
				surfaceModel.setLinearSelection(
					new ve.Range(0, surfaceModel.getDocument().data.getLength())
				);
				surfaceModel.getFragment().insertContent(wikitext).collapseToStart().select();
			}
		});

		return true;
	};

	ve.ui.commandRegistry.register(new OpenFileCommand());

	function SaveFileCommand () {
		SaveFileCommand.parent.call(this, 'saveFile');
	}
	OO.inheritClass(SaveFileCommand, ve.ui.Command);

	SaveFileCommand.prototype.execute = function () {
		var target = ve.init.target;
		target.serialize(target.getDocToSave(), function (wikitext) {
			fileSaveAs(wikitext, getFilename());
		});
		return true;
	};

	ve.ui.commandRegistry.register(new SaveFileCommand());

	function FileTool () {
		FileTool.parent.apply(this, arguments);
	}
	OO.inheritClass(FileTool, ve.ui.Tool);

	FileTool.static.group = 'utility';
	FileTool.static.autoAddToCatchall = false;
	FileTool.static.deactivateOnSelect = false;

	FileTool.prototype.onUpdateState = function () {
		FileTool.parent.prototype.onUpdateState.apply(this, arguments);
		this.setActive(false);
	};

	function OpenFileTool () {
		OpenFileTool.parent.apply(this, arguments);
	}
	OO.inheritClass(OpenFileTool, FileTool);

	OpenFileTool.static.name = 'openFile';
	OpenFileTool.static.title = mw.msg('schnark-file-open');
	OpenFileTool.static.icon = 'upload';
	OpenFileTool.static.commandName = 'openFile';

	OpenFileTool.prototype.onUpdateState = function (fragment) {
		OpenFileTool.parent.prototype.onUpdateState.apply(this, arguments);
		if (fragment && fragment.getSurface() && fragment.getSurface().isReadOnly()) {
			this.setDisabled(true);
		}
	};

	ve.ui.toolFactory.register(OpenFileTool);

	function SaveFileTool () {
		SaveFileTool.parent.apply(this, arguments);
	}
	OO.inheritClass(SaveFileTool, FileTool);

	SaveFileTool.static.name = 'saveFile';
	SaveFileTool.static.title = mw.msg('schnark-file-save');
	SaveFileTool.static.icon = 'download';
	SaveFileTool.static.commandName = 'saveFile';

	ve.ui.toolFactory.register(SaveFileTool);

	mw.hook('userjs.script-ready.localFile').fire();
}

function isCompatible () {
	return !!window.FileReader;
}

function init () {
	var $container = $('<div>').css({
			float: $('body').is('.rtl') ? 'left' : 'right',
			marginTop: '0.5em'
		}),
		$editbox = $('#wpTextbox1'), prot, $appendTo;
	initL10N(l10n);
	$appendTo = $('.editButtons').eq(0);
	if ($appendTo.length === 0) {
		prot = true;
		$appendTo = $('#mw-returnto');
	}
	$appendTo.append($container);
	if (!prot) {
		addFileOpen($container, $editbox);
	}
	addFileSave($container, $editbox);
}

function fileOpen (callback, charset) {
	var $input = $('<input>').attr('type', 'file').hide().appendTo($('body'));
	$input.on('change', function () {
		var file = $input[0].files[0], reader = new FileReader();
		if (file) {
			reader.onload = function (e) {
				callback(e.target.result);
			};
			reader.readAsText(file, charset || 'utf-8');
		}
		$input.remove();
	})[0].click();
}

function fileSaveAs (text, name, type) {
	type = type || 'text/x-wiki';
	var uri, blob, $a;
	if (window.Blob && window.URL) {
		blob = new Blob([text], {type: type});
		uri = URL.createObjectURL(blob);
	} else {
		uri = 'data:' + type + ';encoding=UTF-8,' + encodeURIComponent(text);
	}
	$a = $('<a>');
	if ('download' in $a[0]) {
		$a.attr('href', uri);
		$a.attr('download', name);
		$a.hide().appendTo($('body'));
		$a[0].click();
	} else {
		document.location.href = uri;
	}
	$a.remove();
}

if ($('html').hasClass('ve-activated') && isCompatible()) {
	mw.loader.using(['mediawiki.language', 'ext.visualEditor.core',
		'ext.visualEditor.desktopArticleTarget', 'oojs-ui.styles.icons-content']).then(makeVETools);
} else if (['edit', 'submit'].indexOf(mw.config.get('wgAction')) > -1 && isCompatible()) {
	$.when(mw.loader.using(['jquery.textSelection', 'mediawiki.language']), $.ready).then(init);
}

})();
//</nowiki>