Benutzer:Schnark/js/localFile.js
< Benutzer:Schnark | js
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>