md-tree
Version:
Markdown tree generator
116 lines (84 loc) • 2.79 kB
JavaScript
var fs = require('fs');
var crypto = require('crypto');
var md5 = function (str) {
var md5sum = crypto.createHash('md5');
md5sum.update(str);
return md5sum.digest('hex');
}
var generateTree = function(opts) {
if (opts['depth'] == undefined) {
opts['depth'] = 0;
}
if (opts['prefix'] == undefined) {
opts['prefix'] = '';
}
if (out == undefined) {
var out = '';
}
var dir = opts['dir'];
var depth = opts['depth'];
var prefix = opts['prefix'];
var scan = fs.readdirSync(dir);
var last = scan.pop();
for (var i=0;i<scan.length;i++) {
var f = scan[i];
var fulldir = dir + '/' + f;
var fulldirStats = fs.lstatSync(fulldir);
if (fulldirStats.isDirectory()) {
for(j=1;j<=depth;j++) {
out +="┃\t";
}
out += (last != f ? "┣ " : "┗ ") + f + '/' + "\n";
out += generateTree({dir:fulldir, depth: depth + 1, prefix: prefix+f+"/"});
} else {
var endname = dir + f + " => " + depth;
for(j=1;j<=depth;j++) {
out += "┃\t";
}
out += (last != f ? "┣ " : "┗ ") + f + "\n";
}
}
return out;
};
var buildReadmeTree = function(dir, title, wrap) {
dirkey = md5(dir);
markdownStart = "<!-- [START "+dirkey+"] -->\n";
markdownEnd = "\n<!-- [END "+dirkey+"] -->\n";
tree = generateTree({dir:dir});
tree = markdownStart+title+wrap+tree+wrap+markdownEnd;
dst = './README.md';
fileContent = fs.readFileSync(dst, "utf-8");
newBuffer = '';
forward = true;
find = false;
var hash1 = md5(fileContent);
var lines = fileContent.split("\n");
var lastLine = lines.pop();
for (var i=0;i<lines.length;i++) {
var buffer = lines[i];
if (buffer.trim() == markdownStart.trim()) { forward = false; find = true; }
if (forward) { newBuffer += buffer + "\n"; }
if (buffer.trim() == markdownEnd.trim()) { newBuffer += tree; forward = true; }
}
if (!find) {
newBuffer += tree;
}
hash2 = md5(newBuffer);
if (hash1 != hash2) {
fs.writeFileSync(dst, newBuffer);
}
}
module.exports = {
generateTree: function(opts) {
return generateTree(opts);
},
buildReadmeTree: function(dir, title, wrap) {
buildReadmeTree(dir, title, wrap);
},
buildTrees: function(treemap) {
for (var i=0;i<treemap.length;i++) {
treemapElem = treemap[i];
buildReadmeTree(treemapElem.dir, treemapElem.title, treemapElem.wrap);
}
}
};