-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.js
123 lines (98 loc) · 3.9 KB
/
build.js
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
#!/usr/bin/env node
;
(function() { // wrapper in case we're in module_context mode
/**
* build.js
* buildを行います。
* プロジェクトファイルに含まれるprj.jsonのバージョン情報を元に
* 各バージョンにあった処理を呼び出します。
* 【注意】
* このファイルの改行コードはLFにすること、CRLFだとLinuxで動作しません
*
*/
process.title = "build";
global.baseDir = __dirname;
// fsとpathはglobalに展開
global.fs = require('fs');
global.path = require('path');
var htmlparser = require("@nojaja/htmlparser");
var htmlcompiler = require("./lib/htmlcompiler");
var webComponentParser = new WebComponentParser({ builder: ReactComponentBuilder });
var builder = new HtmlBuilder({});
var cssbuilder = new CSSBuilder({});
var compiler = new Compiler([webComponentParser, cssbuilder, builder], {});
// package.json取得
var packageInfo = require('./package.json');
// コマンドラインのパラメータ設定
var program = require('commander');
program
.version(packageInfo.version)
.option('-w, --workspace [workspace path]', 'workspace path.')
.option('-o, --output [output path]', 'output path.')
.parse(process.argv);
// ワークスペースが指定されていればそれを利用する
// 設定されて無ければ、コマンドを実行した場所をワークスペースとする
// cd /workspace
var workspace = path.resolve(program.workspace || process.cwd());
var output = path.resolve(program.output || workspace);
if (!fs.existsSync(workspace) || !fs.statSync(workspace).isDirectory()) {
console.log(workspace + ' is not directory.'); // workspace is not directory.
process.exit(-1);
}
if (!fs.existsSync(output) || !fs.statSync(output).isDirectory()) {
console.log(output + ' is not directory.'); // output is not directory.
process.exit(-1);
}
main();
function fileLoad(targetPath,callback) {
fs.readdirSync(targetPath).forEach(function (filename) {
if( path.extname(filename) == ".html" ){
console.log("file:"+filename);
var contents = fs.readFileSync(path.join( targetPath, filename), 'utf-8');
callback(filename,contents);
};
});
}
function main() {
console.log("workspace:"+workspace);
console.log("output:"+output);
fileLoad(workspace,function(filename,rawHtml){
var parseHtml = function parseHtml(rawHtml) {
var handler = new htmlparser.HtmlBuilder(function (err, dom) {
if (err) {
console.error(err);
} else {}
}, {
enforceEmptyTags: true,
caseSensitiveTags: true,
caseSensitiveAttr: true,
ignoreWhitespace: true,
verbose: true,
includeLocation: true
});
var parser = new htmlparser.Parser(handler, {
includeLocation: true
});
parser.parseComplete(rawHtml);
if (handler.dom.length > 1) {
throw Error('Template must have exactly one root element. was: ' + rawHtml);
}
// parseしたオブジェクトを返却
return handler.dom[0];
};
var parseData = parseHtml(rawHtml); //htmlをparseしてjsonオブジェクトにします。
var compileData =compiler.compile(parseData);//jsonオブジェクトを各種コードに変換します
webComponentParser.build();//react化処理の実行
//変換されたコードはwindowに読み込まれ実行可能になります。
//生成したreactの
var source =webComponentParser.getResult();
console.log(source);
var outputFile1= path.join(output,path.basename(filename, path.extname(filename))+'.js');
var outputFile2= path.join(output,path.basename(filename, path.extname(filename))+'.json');
console.log("outputFile:"+outputFile1);
console.log("elementNames:"+webComponentParser.elementNames);
fs.writeFile(outputFile1, source);
fs.writeFile(outputFile2, JSON.stringify(webComponentParser.elementNames));
});
}
})()