mirror of https://github.com/lukechilds/node.git
isaacs
13 years ago
3 changed files with 8 additions and 1602 deletions
@ -1,150 +0,0 @@ |
|||
/* |
|||
Process a single doc file |
|||
|
|||
argv[2] = template file |
|||
argv[3] = input file |
|||
argv[4] = output file |
|||
|
|||
*/ |
|||
var fs = require("fs"), |
|||
path = require("path"), |
|||
markdown = require("./markdown"), |
|||
argv = process.argv, |
|||
argc = argv.length; |
|||
|
|||
var template = fs.readFileSync(argv[2], "utf8"); |
|||
|
|||
|
|||
function formatIdString(str) { |
|||
str = str |
|||
.replace(/\([^)}]*\)/gmi, "") |
|||
.replace(/[^A-Za-z0-9_.]+/gmi, "_"); |
|||
|
|||
return str.substr(0,1).toLowerCase() + str.substr(1); |
|||
} |
|||
|
|||
|
|||
function generateToc(data) { |
|||
var last_level = 0 |
|||
, first_level = 0 |
|||
, toc = [ |
|||
'<div id="toc">', |
|||
'<h2>Table Of Contents</h2>' |
|||
]; |
|||
|
|||
data.replace(/(^#+)\W+([^$\n]+)/gmi, function(src, level, text) { |
|||
level = level.length; |
|||
|
|||
if (first_level == 0) first_level = level; |
|||
|
|||
if (level <= last_level) { |
|||
toc.push("</li>"); |
|||
} |
|||
|
|||
if (level > last_level) { |
|||
var c = last_level - level; |
|||
do { |
|||
toc.push("<ul>"); |
|||
c ++; |
|||
} while (c < -1); |
|||
} else if (level < last_level) { |
|||
for(var c=last_level-level; 0 < c ; c-- ) { |
|||
toc.push("</ul>"); |
|||
toc.push("</li>"); |
|||
} |
|||
} |
|||
|
|||
toc.push("<li>"); |
|||
toc.push('<a href="#'+formatIdString(text)+'">'+text+'</a>'); |
|||
|
|||
last_level = level; |
|||
}); |
|||
|
|||
for(var c=last_level-first_level; 0 <= c ; c-- ) { |
|||
toc.push("</li>"); |
|||
toc.push("</ul>"); |
|||
} |
|||
|
|||
toc.push("<hr>") |
|||
toc.push("</div>"); |
|||
|
|||
return toc.join(""); |
|||
} |
|||
|
|||
|
|||
var includeExpr = /^@include\s+([A-Za-z0-9-_]+)(?:\.)?([a-zA-Z]*)$/gmi; |
|||
// Allow including other pages in the data.
|
|||
function loadIncludes(data, current_file) { |
|||
return data.replace(includeExpr, function(src, name, ext) { |
|||
try { |
|||
var include_path = path.join(current_file, "../", name+"."+(ext || "markdown")) |
|||
return loadIncludes(fs.readFileSync(include_path, "utf8"), current_file); |
|||
} catch(e) { |
|||
return ""; |
|||
} |
|||
}); |
|||
} |
|||
|
|||
|
|||
function convertData(data) { |
|||
// Convert it to HTML from Markdown
|
|||
var html = markdown.toHTML(markdown.parse(data), {xhtml:true}) |
|||
.replace(/<hr><\/hr>/g, "<hr />") |
|||
.replace(/(\<h[2-6])\>([^<]+)(\<\/h[1-6]\>)/gmi, function(o, ts, c, te) { |
|||
return ts+' id="'+formatIdString(c)+'">'+c+te; |
|||
}) |
|||
.replace(/(\<h[2-4][^>]+\>)([^<]+)(\<\/h[2-4]\>)/gmi, |
|||
function(o, ts, c, te) { |
|||
var mark = ' <span>' + |
|||
'<a class="top" href="#">↑</a>' + |
|||
'<a class="mark" href="#' + |
|||
formatIdString(c) + '">#</a></span>'; |
|||
|
|||
return ts+c+mark+te; |
|||
}); |
|||
|
|||
return html; |
|||
} |
|||
|
|||
|
|||
if (argc > 3) { |
|||
var filename = argv[3], |
|||
output = template, |
|||
html; |
|||
|
|||
fs.readFile(filename, "utf8", function(err, data) { |
|||
if (err) throw err; |
|||
|
|||
// go recursion.
|
|||
data = loadIncludes(data, filename); |
|||
// go markdown.
|
|||
html = convertData(data); |
|||
filename = path.basename(filename, '.markdown'); |
|||
output = output.replace(/{{filename}}/g, filename); |
|||
|
|||
if (filename != "_toc" && filename != "index") { |
|||
if (data) { |
|||
html = generateToc(data) + "\n" + html; |
|||
} |
|||
|
|||
output = output.replace("{{section}}", filename+" - ") |
|||
} else { |
|||
if (filename === "index") { |
|||
html = '<div id="toc">' + html + '</div>'; |
|||
} |
|||
output = output.replace("{{section}}", ""); |
|||
output = output.replace(/<body([^>]*)>/, '<body class="'+filename+'" $1>'); |
|||
} |
|||
if (html.length == 0) { |
|||
html = "Sorry, this section is currently undocumented, \ |
|||
but we'll be working on it."; |
|||
} |
|||
output = output.replace("{{content}}", html); |
|||
|
|||
if (argc > 4) { |
|||
fs.writeFile(argv[4], output); |
|||
} else { |
|||
process.stdout.write(output); |
|||
} |
|||
}); |
|||
} |
File diff suppressed because it is too large
Loading…
Reference in new issue