define([ 'jquery', '/api/config', '/bower_components/chainpad-crypto/crypto.js', '/common/toolbar.js', '/bower_components/nthen/index.js', '/common/sframe-common.js', '/common/hyperscript.js', '/customize/messages.js', '/common/common-interface.js', '/common/common-util.js', '/bower_components/file-saver/FileSaver.min.js', 'css!/bower_components/bootstrap/dist/css/bootstrap.min.css', 'css!/bower_components/components-font-awesome/css/font-awesome.min.css', 'less!/convert/app-convert.less', ], function ( $, ApiConfig, Crypto, Toolbar, nThen, SFCommon, h, Messages, UI, Util ) { var APP = {}; var common; var sFrameChan; var debug = console.debug; var x2tReady = Util.mkEvent(true); var x2tInitialized = false; var x2tInit = function(x2t) { debug("x2t mount"); // x2t.FS.mount(x2t.MEMFS, {} , '/'); x2t.FS.mkdir('/working'); x2t.FS.mkdir('/working/media'); x2t.FS.mkdir('/working/fonts'); x2tInitialized = true; x2tReady.fire(); //fetchFonts(x2t); debug("x2t mount done"); }; var getX2t = function (cb) { require(['/common/onlyoffice/x2t/x2t.js'], function() { // FIXME why does this fail without an access-control-allow-origin header? var x2t = window.Module; x2t.run(); if (x2tInitialized) { debug("x2t runtime already initialized"); return void x2tReady.reg(function () { cb(x2t); }); } x2t.onRuntimeInitialized = function() { debug("x2t in runtime initialized"); // Init x2t js module x2tInit(x2t); x2tReady.reg(function () { cb(x2t); }); }; }); }; /* Converting Data This function converts a data in a specific format to the outputformat The filename extension needs to represent the input format Example: fileName=cryptpad.bin outputFormat=xlsx */ var getFormatId = function (ext) { // Sheets if (ext === 'xlsx') { return 257; } if (ext === 'xls') { return 258; } if (ext === 'ods') { return 259; } if (ext === 'csv') { return 260; } if (ext === 'pdf') { return 513; } // Docs if (ext === 'docx') { return 65; } if (ext === 'doc') { return 66; } if (ext === 'odt') { return 67; } if (ext === 'txt') { return 69; } if (ext === 'html') { return 70; } // Slides if (ext === 'pptx') { return 129; } if (ext === 'ppt') { return 130; } if (ext === 'odp') { return 131; } return; }; var getFromId = function (ext) { var id = getFormatId(ext); if (!id) { return ''; } return ''+id+''; }; var getToId = function (ext) { var id = getFormatId(ext); if (!id) { return ''; } return ''+id+''; }; var x2tConvertDataInternal = function(x2t, data, fileName, outputFormat) { debug("Converting Data for " + fileName + " to " + outputFormat); var inputFormat = fileName.split('.').pop(); x2t.FS.writeFile('/working/' + fileName, data); var params = "" + "" + "/working/" + fileName + "" + "/working/" + fileName + "." + outputFormat + "" + getFromId(inputFormat) + getToId(outputFormat) + "false" + ""; // writing params file to mounted working disk (in memory) x2t.FS.writeFile('/working/params.xml', params); // running conversion x2t.ccall("runX2T", ["number"], ["string"], ["/working/params.xml"]); // reading output file from working disk (in memory) var result; try { result = x2t.FS.readFile('/working/' + fileName + "." + outputFormat); } catch (e) { console.error(e, x2t.FS); debug("Failed reading converted file"); UI.warn(Messages.error); return ""; } return result; }; var x2tConverter = function (typeSrc, typeTarget) { return function (data, name, cb) { getX2t(function (x2t) { if (typeSrc === 'ods') { data = x2tConvertDataInternal(x2t, data, name, 'xlsx'); name += '.xlsx'; } if (typeSrc === 'odt') { data = x2tConvertDataInternal(x2t, data, name, 'docx'); name += '.docx'; } if (typeSrc === 'odp') { data = x2tConvertDataInternal(x2t, data, name, 'pptx'); name += '.pptx'; } cb(x2tConvertDataInternal(x2t, data, name, typeTarget)); }); }; }; var CONVERTERS = { xlsx: { //pdf: x2tConverter('xlsx', 'pdf'), ods: x2tConverter('xlsx', 'ods'), bin: x2tConverter('xlsx', 'bin'), }, ods: { //pdf: x2tConverter('ods', 'pdf'), xlsx: x2tConverter('ods', 'xlsx'), bin: x2tConverter('ods', 'bin'), }, odt: { docx: x2tConverter('odt', 'docx'), txt: x2tConverter('odt', 'txt'), bin: x2tConverter('odt', 'bin'), }, docx: { odt: x2tConverter('docx', 'odt'), txt: x2tConverter('docx', 'txt'), bin: x2tConverter('docx', 'bin'), }, txt: { odt: x2tConverter('txt', 'odt'), docx: x2tConverter('txt', 'docx'), bin: x2tConverter('txt', 'bin'), }, odp: { pptx: x2tConverter('odp', 'pptx'), bin: x2tConverter('odp', 'bin'), }, pptx: { odp: x2tConverter('pptx', 'odp'), bin: x2tConverter('pptx', 'bin'), }, }; Messages.convertPage = "Convert"; // XXX Messages.convert_hint = "Pick the file you want to convert. The list of output format will be visible afterward."; // XXX var createToolbar = function () { var displayed = ['useradmin', 'newpad', 'limit', 'pageTitle', 'notifications']; var configTb = { displayed: displayed, sfCommon: common, $container: APP.$toolbar, pageTitle: Messages.convertPage, metadataMgr: common.getMetadataMgr(), }; APP.toolbar = Toolbar.create(configTb); APP.toolbar.$rightside.hide(); }; nThen(function (waitFor) { $(waitFor(UI.addLoadingScreen)); SFCommon.create(waitFor(function (c) { APP.common = common = c; })); }).nThen(function (waitFor) { APP.$container = $('#cp-sidebarlayout-container'); APP.$toolbar = $('#cp-toolbar'); APP.$leftside = $('
', {id: 'cp-sidebarlayout-leftside'}).appendTo(APP.$container); APP.$rightside = $('
', {id: 'cp-sidebarlayout-rightside'}).appendTo(APP.$container); sFrameChan = common.getSframeChannel(); sFrameChan.onReady(waitFor()); }).nThen(function (/*waitFor*/) { createToolbar(); var hint = h('p.cp-convert-hint', Messages.convert_hint); var picker = h('input', { type: 'file' }); APP.$rightside.append([hint, picker]); $(picker).on('change', function () { var file = picker.files[0]; var name = file && file.name; var reader = new FileReader(); var parsed = file && file.name && /.+\.([^.]+)$/.exec(file.name); var ext = parsed && parsed[1]; reader.onload = function (e) { if (CONVERTERS[ext]) { Object.keys(CONVERTERS[ext]).forEach(function (to) { var button = h('button.btn', to); $(button).click(function () { CONVERTERS[ext][to](new Uint8Array(e.target.result), name, function (a) { var n = name.slice(0, -ext.length) + to; var blob = new Blob([a], {type: "application/bin;charset=utf-8"}); window.saveAs(blob, n); }); }).appendTo(APP.$rightside); }); } }; reader.readAsArrayBuffer(file, 'application/octet-stream'); }); UI.removeLoadingScreen(); }); });