UNPKG

2.9 kBJavaScriptView Raw
1var path = require('path');
2var fs = require('fs');
3var mkdirp = require('mkdirp');
4var isUtf8 = require('is-utf8');
5var debug = require('debug')('template');
6var J = require("juicer");
7var iconv = require('iconv-lite');
8var config = require('./config.js');
9
10function init(){
11 var userHome = process.env.HOME || process.env.HOMEPATH;//兼容windows
12 var cacheDir = path.join(userHome, '.clamconfig/templates/default');
13 if(fs.existsSync(cacheDir)){
14 return;
15 }
16 mkdirp.sync(cacheDir);
17 var sourceRoot = path.join(__dirname,'../resource');
18 function copyFn(file){
19 debug('复制默认模板文件%s', path.basename(file));
20 var dir = path.dirname(file);
21 var relative = path.relative(sourceRoot, dir);
22 var destDir = path.join(cacheDir, relative);
23 mkdirp.sync(destDir);
24 var srcFile = fs.readFileSync(file);
25 var destFilePath = path.join(destDir, path.basename(file));
26 fs.writeFileSync(destFilePath, srcFile);
27 }
28 eachFile(sourceRoot, copyFn);
29}
30
31/**
32 * 转换源模板目录到目标目录
33 * 1.遍历所有源目录的文件,并用模板引擎处理
34 * 2.如果源目录有主文件名为"template"的,就改为destName
35 * 3.复制到目标目录
36 * @param src 源目录
37 * @param dest 目标目录
38 * @param param 模板所需参数
39 * @param destName 创建的目标文件名称
40 */
41function convert(src, dest, param, destName){
42 eachFile(src, function(file){
43 var tmplContent = fs.readFileSync(file);
44
45 //探测并转换文本内容编码
46 var utf8 = isUtf8(tmplContent);
47 if (utf8) {
48 tmplContent = tmplContent.toString();
49 }
50 else {
51 tmplContent = iconv.decode(tmplContent, 'gbk');
52 }
53
54 //模板处理引擎
55 var pageContent = J(tmplContent, param);
56
57 //复制到destDir并且处理编码问题
58 var dir = path.dirname(file);
59 var relative = path.relative(src, dir);
60 var destDir = path.join(dest, relative);
61 mkdirp.sync(destDir);
62 destName = path.basename(destName);
63 var destFilePath = path.basename(file).replace(/template(\..*)/, destName+'$1');
64 destFilePath = path.join(destDir, destFilePath);
65 var c = iconv.encode(pageContent,config.get('project').charset[0]);
66 fs.writeFileSync(destFilePath, c);
67 fs.chmodSync(destFilePath, "777");
68 });
69}
70
71/**
72 * 递归便利目录,调用回调函数
73 * @param dir 目录
74 * @param fn 回调函数
75 */
76function eachFile(dir, fn){
77 var files = fs.readdirSync(dir);
78 files.forEach(function(file){
79 var pathname = path.join(dir, file);
80 var stat = fs.lstatSync(pathname);
81
82 if (stat.isDirectory()){
83 eachFile(pathname, fn);
84 return;
85 }
86 fn(pathname);
87 });
88}
89
90exports.init = init;
91exports.convert = convert;
\No newline at end of file