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

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


var mainFile = dest + _static + '\\real_control_v2\\main.html';
var realCtl = {
    /**
     * 处理线调首页
     */
    handleMain: function(cb){
        //读取文件
        var data = fs.readFileSync(mainFile, 'utf-8')
            ,$ = cheerio.load(data);

        handleCss($, function () {
            handleJs($, 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 + '\\real_control_v2\\assets\\css\\' + fName;
            fs.open(descFile, 'a',  function(err, fd){

                fs.write(fd, data, function(){
                    $('head').append('<link rel="stylesheet" href="/real_control_v2/assets/css/'+fName+'"/>');
                    console.log(k + ' css', '结束,下一个');
                    f();
                });
            });
        });
    })();
};

/**
 * 处理js
 */
var handleJs = function ($, 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(mainFile, $.html());
            console.log('线调处理结束'.green);
            cb && cb();
            return;
        }
        var k = ks[index];
        index ++;
        var f = arguments.callee;
        //合并压缩js
        var result = UglifyJS.minify(jsMap[k]);
        var data = result.code;
        var fName = (k + '_' + md5(data)) + '.js';
        //写入 assets js 目录下
        var descFile = dest + _static + '\\real_control_v2\\assets\\js\\' + fName;
        fs.open(descFile, 'a',  function(err, fd){

            fs.write(fd, data, function(){
                $('body').append('<script src="/real_control_v2/assets/js/'+fName+'"></script>');
                console.log(k + ' js', '结束,下一个');
                f();
            });
        });
    })();
};

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;