handle_real_ctl.js
6.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/**
* 处理线调文件
*/
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;