-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
152 lines (135 loc) · 3.76 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
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
/*
将markdown的文本内容,转换格式化的数据
*/
var _moment = require('moment')
, _ = require('underscore')
, _path = require('path')
, _fs = require('fs')
, _mde = require('markdown-extra');
/*
@summary 扫描所有的markdown
@param {String} dir - 要扫描的文件夹
@param {Array | RegExp} filter - 过滤条件,Array: 根据扩展名过滤;RegExp:根据正则过滤
@param {Array | null} maps - 影射规则
@param {Function} callback - 回调函数,callback(json);
*/
exports.scan = function(dir, filter, maps, callback){
//扫描本地指定目录
scanDirectory(dir, filter, function(content, filename){
//使用purelog格式化markdown
var json = exports.convert(content, maps);
if(json) callback(json, filename);
});
}
/*
@summary 转换markdown格式的文本为article
@param {String} text - markdown格式的文本
@returns {Object} 返回转换后的JSON数据
*/
exports.convert = function(text, maps){
var metaText = _mde.metadata(text);
var result = extraMeta(metaText, maps);
//添加文章
result.content = _mde.content(text);
return result;
}
/*
@summary 从meta字符中分离出具体的meta
@param {String} meta - meta的数据
@returns {Object} 格式化的meta
*/
function extraMeta(meta, maps){
var metalist = _.map(meta.split(/\n/ig), function(row){
var index = row.indexOf(':');
var key = row.substring(0, index).trim();
var value = row.substring(index + 1, row.length).trim();
return {
key: key,
value: value
};
});
//没有指定map,则获取所有的key/value
if(maps){
//根据map重新映射meta
metalist = _.map(maps, function(map){
var value = findMetaValue(map, metalist);
if(value === undefined) return;
//根据类型格式化meta
switch(map.type){
case 'array':
value = toArray(value, map.separator)
break;
case 'date':
value = toDatetime(value, map.format);
break;
};
var result = {};
result[map.key] = value;
return result;
});
}
//重新组合meta
var list = {};
_.each(metalist, function(item){
_.extend(list, item);
});
return list;
}
/*
转换为数组,并处理多余的空格
*/
function toArray(text, separator){
//如果存在标签,则分割为数组
var list = text.split(separator || ',');
return _.map(list, function(tag){
return tag.trim();
});
}
//转换为时间
function toDatetime(text, format){
var moment = _moment(text, format);
if(moment.isValid()) return moment.toDate();
}
//查找map
function findMetaValue(map, metalist){
var value;
//字符型匹配
var matchString = typeof(map.match) == 'string';
var matchRegexp = !matchString && map.match instanceof RegExp;
_.every(metalist, function(meta){
var isMatch = false;
if(matchString){
isMatch = map.match == meta.key;
}else if(matchRegexp){
isMatch = map.match.test(meta.key);
}
if(isMatch) value = meta.value;
return !isMatch;
});
return value;
}
//扫描本地文件夹
function scanDirectory(parent, filter, callback){
var files = _fs.readdirSync(parent);
files.forEach(function(file){
//检查是否文件夹
var path = _path.join(parent, file);
var stat = _fs.statSync(path);
if(stat.isDirectory()){
scanDirectory(path, filter, callback);
return;
}
//支持用正则或者扩展名数组过滤
//用正则过滤
if(filter instanceof RegExp){
if(!filter.test(file)) return;
}else if(filter instanceof Array){
//根据数组过滤扩展名
var ext = _path.extname(file);
if(!_.indexOf(filter, ext)) return;
}
//读取文件
var content = _fs.readFileSync(path, 'utf-8');
callback(content, file);
});
}