handle_real_ctl.js 6.48 KB
/**
 * 处理线调文件
 */
var fs = require('fs')
    , cheerio = require('cheerio')
    , minifier = require('./minifier')
    , crypto = require("crypto")
    , CleanCSS = require('clean-css');
;

var platform = process.platform;
var iswin = platform=='win32';
var sp = platform=='win32'?'\\':'/';
//不参与的目录
var pName = 'bsth_control'
    , path = process.cwd()
    //根目录
    , root = path.substr(0, path.indexOf(sp + 'src'+sp+'main'))
    , workspace = root.substr(0, root.lastIndexOf(sp + pName))
    //临时目录
    , dest = (workspace + sp + pName + '@fatso_copy')//.replace(/\//g, '\\')
    , _static = sp + 'src'+sp+'main'+sp+'resources'+sp+'static';


var mainFile = dest + _static + sp + 'real_control_v2'+sp+'main.html';
var aloneMapWrapFile = dest + _static + sp + 'real_control_v2'+sp+'alone_page'+sp+'map'+sp+'alone_wrap.html';
var aloneHomeWrapFile = dest + _static + sp + 'real_control_v2'+sp+'alone_page'+sp+'home'+sp+'home_wrap.html';
var mapFile = dest + _static + sp + 'real_control_v2'+sp+'mapmonitor'+sp+'real.html';
var realCtl = {
    /**
     * 处理线调首页
     */
    handleMain: function (cb) {
        //处理main.html
        var data = fs.readFileSync(mainFile, 'utf-8'),
            $ = cheerio.load(data);
        handleCss($, function () {
            handleJs($, mainFile, cb);
        });


    },
    /**
     * 处理地图模块
     * @param cb
     */
    handleMap: function (cb) {
        //读取文件
        var data = fs.readFileSync(mapFile, 'utf-8')
            , $ = cheerio.load(data);

        handleCss($, function () {
            handleJs($, mapFile, cb);
        });
    },
    /**
     * 处理单屏地图页面
     * @param cb
     */
    handleAlonePage: function (cb) {
        var data = fs.readFileSync(aloneMapWrapFile, 'utf-8');
        var $ = cheerio.load(data);
        handleCss($, function () {
            handleJs($, aloneMapWrapFile, cb);
        });
    },
    /**
     * 处理单屏主页
     * @param cb
     */
    handleAloneHomePage: function (cb) {
        var data = fs.readFileSync(aloneHomeWrapFile, 'utf-8');
        var $ = cheerio.load(data);
        handleCss($, function () {
            handleJs($, aloneHomeWrapFile, cb);
        });
    }

};

/**
 * 处理css
 * @type {any}
 */
var handleCss = function ($, cb) {
    var cssArray = $('link[rel=stylesheet][merge]');
    //按 merge 值分组
    var cssMap = {}, mergeName;
    for (var i = 0, c; c = cssArray[i++];) {
        mergeName = $(c).attr('merge');
        if (!cssMap[mergeName])
            cssMap[mergeName] = [];
        cssMap[mergeName].push(dest + _static + $(c).attr('href'));
        //remove
        $(c).remove();
    }
    //按 merge 合并压缩css
    var ks = get_keys(cssMap), index = 0;
    (function () {
        if (index >= ks.length) {
            cb && cb();
            return;
        }
        var k = ks[index];
        index++;
        var f = arguments.callee;
        //合并css
        new CleanCSS().minify(cssMap[k], function (error, out) {
            var data = out.styles;
            var fName = (k + '_' + md5(data)) + '.css';
            //写入 assets css 目录下
            var descFile = dest + _static + sp + 'real_control_v2'+sp+'assets'+sp+'css' + sp + fName;
            fs.open(descFile, 'a', function (err, fd) {

                fs.write(fd, data, function () {
                    var tag = '<link rel="stylesheet" href="/real_control_v2/assets/css/' + fName + '"/>';
                    if ($('head').length > 0)
                        $('head').append(tag);
                    else {
                        if($('link').length > 0)
                            $('link').last().before(tag);
                        else
                            $('div').first().before(tag);
                    }
                    console.log(k + ' css', '结束,下一个');
                    f();
                });
            });
        });
    })();
};

/**
 * 处理js
 */
var handleJs = function ($, file, cb) {
    var scriptArray = $('script[merge]');
    //按 merge 值分组
    var jsMap = {}, mergeName;
    for (var i = 0, s; s = scriptArray[i++];) {
        mergeName = $(s).attr('merge');
        if (!jsMap[mergeName])
            jsMap[mergeName] = [];
        jsMap[mergeName].push(dest + _static + $(s).attr('src'));
        //remove
        $(s).remove();
    }

    //按 merge 合并压缩js
    var ks = get_keys(jsMap), index = 0;
    (function () {
        if (index >= ks.length) {
            write(file, $.html());
            console.log(file + ' 结束'); // 移除.green调用
            cb && cb();
            return;
        }
        var k = ks[index];
        index++;
        var f = arguments.callee;
        //合并压缩js
        try {
            // 先合并文件内容
            let code = '';
            for(let j = 0; j < jsMap[k].length; j++) {
                code += fs.readFileSync(jsMap[k][j], 'utf8') + '\n';
            }
            // 使用Terser压缩
            var data = minifier.mini(code);
            if (code !== '' && data === '') {
                console.error('压缩出错')
                process.exit();
            }
            var fName = (k + '_' + md5(data)) + '.js';
            //写入 assets js 目录下
            var descFile = dest + _static + sp + 'real_control_v2'+sp+'assets'+sp+'js' + sp + fName;
            fs.open(descFile, 'a', function (err, fd) {
                fs.write(fd, data, function () {
                    var tag = '<script src="/real_control_v2/assets/js/' + fName + '"></script>';
                    if ($('body').length > 0)
                        $('body').append(tag);
                    else {
                        //没有body 就写在尾部
                        $('*').last().after(tag);
                    }
                    console.log(k + ' js', '结束,下一个');
                    f();
                });
            });
        } catch (e) {
            console.error('合并压缩错误:', e);
            process.exit();
        }
    })();
};

var get_keys = function (json) {
    var array = [];
    for (var key in json) {
        array.push(key);
    }
    return array;
};

function md5(text) {
    return crypto.createHash("md5").update(text).digest("hex");
}

function write(file, text) {
    fs.writeFile(file, text, function (err) {
        if (err) {
            console.log(err.toString()); // 移除.red调用
            process.exit();
        }
        console.log(file); // 移除.green调用
    });
}

module.exports = realCtl;