252 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			252 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
Object.defineProperty(exports, "__esModule", { value: true });
 | 
						|
exports.Html5Exporter = void 0;
 | 
						|
const fs = require("fs-extra");
 | 
						|
const path = require("path");
 | 
						|
const KhaExporter_1 = require("./KhaExporter");
 | 
						|
const Converter_1 = require("../Converter");
 | 
						|
const ImageTool_1 = require("../ImageTool");
 | 
						|
const VrApi_1 = require("../VrApi");
 | 
						|
class Html5Exporter extends KhaExporter_1.KhaExporter {
 | 
						|
    constructor(options) {
 | 
						|
        super(options);
 | 
						|
    }
 | 
						|
    backend() {
 | 
						|
        return 'HTML5';
 | 
						|
    }
 | 
						|
    isADebugTarget() {
 | 
						|
        return this.isDebug;
 | 
						|
    }
 | 
						|
    isDebugHtml5() {
 | 
						|
        return this.sysdir() === 'debug-html5';
 | 
						|
    }
 | 
						|
    isNode() {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
    isHtml5Worker() {
 | 
						|
        return this.sysdir() === 'html5worker';
 | 
						|
    }
 | 
						|
    haxeOptions(name, targetOptions, defines) {
 | 
						|
        defines.push('sys_g1');
 | 
						|
        defines.push('sys_g2');
 | 
						|
        defines.push('sys_g3');
 | 
						|
        defines.push('sys_a1');
 | 
						|
        defines.push('sys_a2');
 | 
						|
        defines.push('kha_js');
 | 
						|
        defines.push('kha_g1');
 | 
						|
        defines.push('kha_g2');
 | 
						|
        defines.push('kha_g3');
 | 
						|
        defines.push('kha_a1');
 | 
						|
        defines.push('kha_a2');
 | 
						|
        if (targetOptions.html5.noKeyboard) {
 | 
						|
            defines.push('kha_no_keyboard');
 | 
						|
        }
 | 
						|
        if (targetOptions.html5.disableContextMenu) {
 | 
						|
            defines.push('kha_disable_context_menu');
 | 
						|
        }
 | 
						|
        if (this.options.vr === VrApi_1.VrApi.WebVR) {
 | 
						|
            defines.push('kha_webvr');
 | 
						|
        }
 | 
						|
        let canvasId = targetOptions.html5.canvasId == null ? 'khanvas' : targetOptions.html5.canvasId;
 | 
						|
        defines.push('canvas_id=' + canvasId);
 | 
						|
        let scriptName = this.isHtml5Worker() ? 'khaworker' : 'kha';
 | 
						|
        if (targetOptions.html5.scriptName != null && !(this.isNode() || this.isDebugHtml5())) {
 | 
						|
            scriptName = targetOptions.html5.scriptName;
 | 
						|
        }
 | 
						|
        defines.push('script_name=' + scriptName);
 | 
						|
        let webgl = targetOptions.html5.webgl == null ? true : targetOptions.html5.webgl;
 | 
						|
        if (webgl) {
 | 
						|
            defines.push('sys_g4');
 | 
						|
            defines.push('kha_g4');
 | 
						|
            defines.push('kha_webgl');
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            defines.push('kha_html5_canvas');
 | 
						|
        }
 | 
						|
        if (this.isNode()) {
 | 
						|
            defines.push('nodejs');
 | 
						|
            defines.push('sys_node');
 | 
						|
            defines.push('sys_server');
 | 
						|
            defines.push('kha_node');
 | 
						|
            defines.push('kha_server');
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            defines.push('sys_' + this.options.target);
 | 
						|
            defines.push('kha_' + this.options.target);
 | 
						|
            defines.push('kha_' + this.options.target + '_js');
 | 
						|
            defines.push('sys_html5');
 | 
						|
            defines.push('kha_html5');
 | 
						|
            defines.push('kha_html5_js');
 | 
						|
        }
 | 
						|
        if (this.isADebugTarget()) {
 | 
						|
            this.parameters.push('-debug');
 | 
						|
            defines.push('sys_debug_html5');
 | 
						|
            defines.push('kha_debug_html5');
 | 
						|
            defines.push('kha_html5');
 | 
						|
        }
 | 
						|
        if (this.isHtml5Worker()) {
 | 
						|
            defines.push('js-classic');
 | 
						|
        }
 | 
						|
        return {
 | 
						|
            from: this.options.from.toString(),
 | 
						|
            to: path.join(this.sysdir(), scriptName + '.js'),
 | 
						|
            sources: this.sources,
 | 
						|
            libraries: this.libraries,
 | 
						|
            defines: defines,
 | 
						|
            parameters: this.parameters,
 | 
						|
            haxeDirectory: this.options.haxe,
 | 
						|
            system: this.sysdir(),
 | 
						|
            language: 'js',
 | 
						|
            width: this.width,
 | 
						|
            height: this.height,
 | 
						|
            name: name,
 | 
						|
            main: this.options.main,
 | 
						|
        };
 | 
						|
    }
 | 
						|
    async export(name, _targetOptions, haxeOptions) {
 | 
						|
        let targetOptions = {
 | 
						|
            canvasId: 'khanvas',
 | 
						|
            scriptName: this.isHtml5Worker() ? 'khaworker' : 'kha',
 | 
						|
            unsafeEval: false,
 | 
						|
            expose: ''
 | 
						|
        };
 | 
						|
        if (_targetOptions != null && _targetOptions.html5 != null) {
 | 
						|
            let userOptions = _targetOptions.html5;
 | 
						|
            if (userOptions.canvasId != null)
 | 
						|
                targetOptions.canvasId = userOptions.canvasId;
 | 
						|
            if (userOptions.scriptName != null)
 | 
						|
                targetOptions.scriptName = userOptions.scriptName;
 | 
						|
            if (userOptions.unsafeEval != null)
 | 
						|
                targetOptions.unsafeEval = userOptions.unsafeEval;
 | 
						|
            if (userOptions.expose != null)
 | 
						|
                targetOptions.expose = userOptions.expose;
 | 
						|
        }
 | 
						|
        fs.ensureDirSync(path.join(this.options.to, this.sysdir()));
 | 
						|
        if (this.isADebugTarget()) { // support custom debug-html5 based targets
 | 
						|
            let electron = path.join(this.options.to, this.sysdir(), 'electron.js');
 | 
						|
            let protoelectron = fs.readFileSync(path.join(__dirname, '..', '..', 'Data', 'debug-html5', 'electron.js'), { encoding: 'utf8' });
 | 
						|
            protoelectron = protoelectron.replace(/{Width}/g, '' + this.width);
 | 
						|
            protoelectron = protoelectron.replace(/{Height}/g, '' + this.height);
 | 
						|
            protoelectron = protoelectron.replace(/{ext}/g, process.platform === 'win32' ? '\'.ico\'' : '\'.png\'');
 | 
						|
            fs.writeFileSync(electron.toString(), protoelectron);
 | 
						|
            let pack = path.join(this.options.to, this.sysdir(), 'package.json');
 | 
						|
            let protopackage = fs.readFileSync(path.join(__dirname, '..', '..', 'Data', 'debug-html5', 'package.json'), { encoding: 'utf8' });
 | 
						|
            protopackage = protopackage.replace(/{Name}/g, name);
 | 
						|
            fs.writeFileSync(pack.toString(), protopackage);
 | 
						|
            let index = path.join(this.options.to, this.sysdir(), 'index.html');
 | 
						|
            let protoindex = fs.readFileSync(path.join(__dirname, '..', '..', 'Data', 'debug-html5', 'index.html'), { encoding: 'utf8' });
 | 
						|
            protoindex = protoindex.replace(/{Name}/g, name);
 | 
						|
            protoindex = protoindex.replace(/{Width}/g, '' + this.width);
 | 
						|
            protoindex = protoindex.replace(/{Height}/g, '' + this.height);
 | 
						|
            protoindex = protoindex.replace(/{CanvasId}/g, '' + targetOptions.canvasId);
 | 
						|
            protoindex = protoindex.replace(/{ScriptName}/g, '' + targetOptions.scriptName);
 | 
						|
            protoindex = protoindex.replace(/{UnsafeEval}/g, targetOptions.unsafeEval ? '\'unsafe-eval\'' : '');
 | 
						|
            fs.writeFileSync(index.toString(), protoindex);
 | 
						|
            let preload = path.join(this.options.to, this.sysdir(), 'preload.js');
 | 
						|
            let protopreload = fs.readFileSync(path.join(__dirname, '..', '..', 'Data', 'debug-html5', 'preload.js'), { encoding: 'utf8' });
 | 
						|
            protopreload = protopreload.replace(/{Expose}/g, targetOptions.expose);
 | 
						|
            fs.writeFileSync(preload.toString(), protopreload);
 | 
						|
        }
 | 
						|
        else if (this.isNode()) {
 | 
						|
            let pack = path.join(this.options.to, this.sysdir(), 'package.json');
 | 
						|
            let protopackage = fs.readFileSync(path.join(__dirname, '..', '..', 'Data', 'node', 'package.json'), 'utf8');
 | 
						|
            protopackage = protopackage.replace(/{Name}/g, name);
 | 
						|
            fs.writeFileSync(pack, protopackage);
 | 
						|
            let protoserver = fs.readFileSync(path.join(__dirname, '..', '..', 'Data', 'node', 'server.js'), 'utf8');
 | 
						|
            fs.writeFileSync(path.join(this.options.to, this.sysdir(), 'server.js'), protoserver);
 | 
						|
        }
 | 
						|
        else if (!this.isHtml5Worker()) {
 | 
						|
            let index = path.join(this.options.to, this.sysdir(), 'index.html');
 | 
						|
            if (!fs.existsSync(index)) {
 | 
						|
                let protoindex = fs.readFileSync(path.join(__dirname, '..', '..', 'Data', 'html5', 'index.html'), { encoding: 'utf8' });
 | 
						|
                protoindex = protoindex.replace(/{Name}/g, name);
 | 
						|
                protoindex = protoindex.replace(/{Width}/g, '' + this.width);
 | 
						|
                protoindex = protoindex.replace(/{Height}/g, '' + this.height);
 | 
						|
                protoindex = protoindex.replace(/{CanvasId}/g, '' + targetOptions.canvasId);
 | 
						|
                protoindex = protoindex.replace(/{ScriptName}/g, '' + targetOptions.scriptName);
 | 
						|
                fs.writeFileSync(index.toString(), protoindex);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    /*copyMusic(platform, from, to, encoders, callback) {
 | 
						|
        Files.createDirectories(this.directory.resolve(this.sysdir()).resolve(to).parent());
 | 
						|
        Converter.convert(from, this.directory.resolve(this.sysdir()).resolve(to + '.ogg'), encoders.oggEncoder, (ogg) => {
 | 
						|
            Converter.convert(from, this.directory.resolve(this.sysdir()).resolve(to + '.mp4'), encoders.aacEncoder, (mp4) => {
 | 
						|
                var files = [];
 | 
						|
                if (ogg) files.push(to + '.ogg');
 | 
						|
                if (mp4) files.push(to + '.mp4');
 | 
						|
                callback(files);
 | 
						|
            });
 | 
						|
        });
 | 
						|
    }*/
 | 
						|
    async copySound(platform, from, to, options) {
 | 
						|
        fs.ensureDirSync(path.join(this.options.to, this.sysdir(), path.dirname(to)));
 | 
						|
        let ogg = await (0, Converter_1.convert)(from, path.join(this.options.to, this.sysdir(), to + '.ogg'), this.options.ogg);
 | 
						|
        let ogg_size = (await fs.stat(path.join(this.options.to, this.sysdir(), to + '.ogg'))).size;
 | 
						|
        let mp4 = false;
 | 
						|
        let mp4_size = 0;
 | 
						|
        let mp3 = false;
 | 
						|
        let mp3_size = 0;
 | 
						|
        if (!this.isDebugHtml5()) {
 | 
						|
            mp4 = await (0, Converter_1.convert)(from, path.join(this.options.to, this.sysdir(), to + '.mp4'), this.options.aac);
 | 
						|
            if (mp4) {
 | 
						|
                mp4_size = (await fs.stat(path.join(this.options.to, this.sysdir(), to + '.mp4'))).size;
 | 
						|
            }
 | 
						|
            if (!mp4) {
 | 
						|
                mp3 = await (0, Converter_1.convert)(from, path.join(this.options.to, this.sysdir(), to + '.mp3'), this.options.mp3);
 | 
						|
                mp3_size = (await fs.stat(path.join(this.options.to, this.sysdir(), to + '.mp3'))).size;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        let files = [];
 | 
						|
        let sizes = [];
 | 
						|
        if (ogg) {
 | 
						|
            files.push(to + '.ogg');
 | 
						|
            sizes.push(ogg_size);
 | 
						|
        }
 | 
						|
        if (mp4) {
 | 
						|
            files.push(to + '.mp4');
 | 
						|
            sizes.push(mp4_size);
 | 
						|
        }
 | 
						|
        if (mp3) {
 | 
						|
            files.push(to + '.mp3');
 | 
						|
            sizes.push(mp3_size);
 | 
						|
        }
 | 
						|
        return { files: files, sizes: sizes };
 | 
						|
    }
 | 
						|
    async copyImage(platform, from, to, options, cache) {
 | 
						|
        let format = await (0, ImageTool_1.exportImage)(this.options.kha, this.options.kraffiti, from, path.join(this.options.to, this.sysdir(), to), options, undefined, false, false, cache);
 | 
						|
        let stat = await fs.stat(path.join(this.options.to, this.sysdir(), to + '.' + format));
 | 
						|
        let size = stat.size;
 | 
						|
        return { files: [to + '.' + format], sizes: [size] };
 | 
						|
    }
 | 
						|
    async copyBlob(platform, from, to, options) {
 | 
						|
        fs.copySync(from.toString(), path.join(this.options.to, this.sysdir(), to), { overwrite: true, dereference: true });
 | 
						|
        let stat = await fs.stat(path.join(this.options.to, this.sysdir(), to));
 | 
						|
        let size = stat.size;
 | 
						|
        return { files: [to], sizes: [size] };
 | 
						|
    }
 | 
						|
    async copyVideo(platform, from, to, options) {
 | 
						|
        fs.ensureDirSync(path.join(this.options.to, this.sysdir(), path.dirname(to)));
 | 
						|
        let mp4 = false;
 | 
						|
        let mp4_size = 0;
 | 
						|
        if (!this.isDebugHtml5()) {
 | 
						|
            mp4 = await (0, Converter_1.convert)(from, path.join(this.options.to, this.sysdir(), to + '.mp4'), this.options.h264);
 | 
						|
            mp4_size = (await fs.stat(path.join(this.options.to, this.sysdir(), to + '.mp4'))).size;
 | 
						|
        }
 | 
						|
        let webm = await (0, Converter_1.convert)(from, path.join(this.options.to, this.sysdir(), to + '.webm'), this.options.webm);
 | 
						|
        let webm_size = (await fs.stat(path.join(this.options.to, this.sysdir(), to + '.webm'))).size;
 | 
						|
        let files = [];
 | 
						|
        let sizes = [];
 | 
						|
        if (mp4) {
 | 
						|
            files.push(to + '.mp4');
 | 
						|
            sizes.push(mp4_size);
 | 
						|
        }
 | 
						|
        if (webm) {
 | 
						|
            files.push(to + '.webm');
 | 
						|
            sizes.push(webm_size);
 | 
						|
        }
 | 
						|
        return { files: files, sizes: sizes };
 | 
						|
    }
 | 
						|
}
 | 
						|
exports.Html5Exporter = Html5Exporter;
 | 
						|
//# sourceMappingURL=Html5Exporter.js.map
 |