node-framework
Version:
node-framework
120 lines (100 loc) • 3 kB
JavaScript
/**
* @file index.js ~ 2014-08-11 14:56
* @author sekiyika (px.pengxing@gmail.com)
* @description
*
*/
var markdown = require('markdown').markdown;
var glob = require('glob');
var path = require('path');
var fs = require('fs');
var app = require('../')();
var list = [];
// 启动的时候扫描所有的md文件,建立索引
app.component('scan', function () {
function scan() {
var docs = path.join(__dirname, 'docs');
var files = glob.sync('**/*.md', {
cwd: docs,
root: docs
});
var newList = [];
files.forEach(function (file) {
var text = fs.readFileSync(path.join(docs, file));
var tree = markdown.parse(text.toString());
var data = {
file: file,
tree: tree
};
data.pageTitle = getPageTitle(tree);
data.tocTree = getTocTree(tree);
newList.push(data);
});
var seq = app.config.wiki.sequence;
if (seq && (seq instanceof Array) && seq.length != 0) {
var orderedList = [];
for (var i in seq) {
var title = seq[i];
for (var j in newList) {
if (newList[j].pageTitle === title) {
orderedList.push(newList[j]);
newList.splice(j, 1);
break;
}
}
}
if (newList.length > 0) {
for (var i in newList) {
orderedList.push(newList[i]);
}
}
list = orderedList;
} else {
list = newList;
}
// 十秒钟之后重新scan
setTimeout(scan, 10000);
}
scan();
return function () {
return list;
};
});
app.run();
function getPageTitle(tree) {
var pageTitle;
var token;
for(var i = 0, l = tree.length; i < l; i++) {
token = tree[i];
if (typeof token === 'object' && token !== null) {
if (token[0] === 'header') {
pageTitle = token[2];
break;
}
}
}
if (!pageTitle) {
pageTitle = 'No Title';
}
return pageTitle;
}
// @UPDATE by wangyisheng
// 这里增加返回level,从而允许左侧树只显示h2。
// 因为显示h1会导致第一个标题总是重复的;而显示了h3,左侧树又只支持两级,会跟h2显示成兄弟节点,很混乱。
function getTocTree(tree) {
var tocTree = [];
var token;
for (var i = 0, l = tree.length; i < l; i++) {
token = tree[i];
if (typeof token === 'object' && token !== null) {
if (token[0] === 'header') {
tocTree.push({
title: token[2],
url: '#' + token[2],
level: token[1].level
});
}
}
}
return tocTree;
}