-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
102 lines (82 loc) · 3.42 KB
/
index.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
//传入参数分别为:待读取的sass文件列表,输出JSON文件的目标地址(含JSON文件名)
//可读取以下两种格式的sass样式文件顶部注释并输出为JSON文件
/********** 格式1 START *********/
/**
* FileTitle 此文件的中文介绍
*
* --- Category1 ---
* #ToolName 此方法的中文介绍(可选)
* #ToolName 此方法的中文介绍(可选)
*
* --- Category2 ---
* #ToolName 此方法的中文介绍(可选)
* #ToolName 此方法的中文介绍(可选)
*
*/
/********** 格式1 END ***********/
/********** 格式2 START *********/
/**
* FileTitle 此文件的中文介绍
*
* #ToolName 此方法的中文介绍(可选)
* #ToolName 此方法的中文介绍(可选)
*
*/
/********** 格式2 END ***********/
function readQmuiStyleComments(rawFiles, outputPath) {
if (!rawFiles || !outputPath) {
return false;
}
var sassData = [];
var fs = require('fs');
for (var k = 0; k < rawFiles.length; k++) {
var currentFileData = {};
var targetFile = rawFiles[k];
currentFileData.title = targetFile.split('/').pop(); //文件名
var rawStr = fs.readFileSync(targetFile, 'utf8');
var commentsStr = rawStr.match(/\/\*+[\s\S]+?\*\//g);
commentsStr = commentsStr[0]; //抽取出开头/* */及其内部的内容
var descrRegExp = new RegExp(currentFileData.title + '.*', 'i');
var descrLine = commentsStr.match(descrRegExp)[0]; //抽取出类似"_effect.scss 辅助编写样式效果的工具方法"这一行的这一段信息
currentFileData.descr = trimString(descrLine.split(currentFileData.title)[1]); //抽取出类似"辅助编写样式效果的工具方法"这句中文介绍,去除首尾空格
currentFileData.items = [];
var introLine = commentsStr.match(/@intro.*/g)[0]; //抽取出类似"@intro 数值计算"这一行
currentFileData.intro = trimString(introLine.split('@intro')[1]); //抽取出类似"数值计算"这个文件的简短介绍
var commentsStrFiltered = commentsStr.replace(/(\*)|(\/)|(\n)/g, ''); //去除星号*、斜杠、换行符
var sections = commentsStrFiltered.match(/-{2,}[\s\S]*?-{2,}[^-]+/g); //将_compatible.scss里类似"--- layout ---"的这种父类分拆到数组里,并且去除星号*、斜杠\、换行符
//_compatible.scss里这种有"--- xxx ---"父级分类
if (sections) {
for (var i = 0; i < sections.length; i++) {
var section = sections[i];
var item = {};
item.title = trimString(section.match(/[^-]+/)[0]);
item.contents = section.match(/\#+[^\#]+/g);
for (var j = 0; j < item.contents.length; j++) {
item.contents[j] = trimString(item.contents[j].replace('#', ''));
}
currentFileData.items.push(item);
}
}
else {
var item = {};
item.title = "nil";
item.contents = commentsStrFiltered.match(/\#+[^\#]+/g);
for (var j = 0; j < item.contents.length; j++) {
item.contents[j] = trimString(item.contents[j].replace('#', ''));
}
currentFileData.items.push(item);
}
sassData.push(currentFileData);
}
//因为有可能目标目录不存在,因此在这里尝试创建目标目录
var path = require('path');
var outputDir = path.dirname(outputPath);
fs.mkdir(outputDir, function(errMsg){});
//写入文件
fs.writeFileSync(outputPath, 'var comments = ' + JSON.stringify(sassData), 'utf8');
}
//去除字符串首尾空格
function trimString(str) {
return str.replace(/(^\s*)|(\s*$)/g, '');
}
module.exports = readQmuiStyleComments;