Skip to content

Commit 6ce251f

Browse files
committed
initial docs commit
1 parent fe926e1 commit 6ce251f

14 files changed

+2663
-0
lines changed

build/doctool.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
Process a single doc file
3+
4+
argv[2] = template file
5+
argv[3] = input file
6+
argv[4] = output file
7+
*/
8+
9+
var fs = require("fs"),
10+
path = require("path"),
11+
markdown = require("./lib/markdown"),
12+
argv = process.argv,
13+
argc = argv.length,
14+
template = fs.readFileSync(argv[2], "utf8");
15+
16+
17+
function formatIdString( str ) {
18+
str = str
19+
.replace(/\([^)}]*\)/gmi, "")
20+
.replace(/[^A-Za-z0-9_.]+/gmi, "_");
21+
22+
return str.substr(0, 1).toLowerCase() + str.substr(1);
23+
}
24+
25+
26+
function generateToc(data) {
27+
var last_level = 0,
28+
first_level = 0,
29+
toc = [
30+
'<div id="toc">',
31+
'<h2>Table Of Contents</h2>'
32+
];
33+
34+
data.replace(/(^#+)\W+([^$\n]+)/gmi, function(src, level, text) {
35+
level = level.length;
36+
37+
if (first_level == 0) first_level = level;
38+
39+
if (level <= last_level) {
40+
toc.push("</li>");
41+
}
42+
43+
if (level > last_level) {
44+
toc.push("<ul>");
45+
} else if (level < last_level) {
46+
for(var c=last_level-level; 0 < c ; c-- ) {
47+
toc.push("</ul>");
48+
toc.push("</li>");
49+
}
50+
}
51+
52+
toc.push("<li>");
53+
toc.push('<a href="#'+formatIdString(text)+'">'+text+'</a>');
54+
55+
last_level = level;
56+
});
57+
58+
for(var c=last_level-first_level; 0 <= c ; c-- ) {
59+
toc.push("</li>");
60+
toc.push("</ul>");
61+
}
62+
63+
toc.push("<hr />")
64+
toc.push("</div>");
65+
66+
return toc.join("");
67+
}
68+
69+
70+
var includeExpr = /^@include\s+([A-Za-z0-9-_]+)(?:\.)?([a-zA-Z]*)$/gmi;
71+
// Allow including other pages in the data.
72+
function loadIncludes(data, current_file) {
73+
return data.replace(includeExpr, function(src, name, ext) {
74+
try {
75+
var include_path = path.join(current_file, "../", name+"."+(ext || "markdown"))
76+
return loadIncludes(fs.readFileSync(include_path, "utf8"), current_file);
77+
} catch(e) {
78+
return "";
79+
}
80+
});
81+
}
82+
83+
84+
function convertData(data) {
85+
// Convert it to HTML from Markdown
86+
var html = markdown.toHTML(markdown.parse(data), {xhtml:true})
87+
.replace(/<hr><\/hr>/g, "<hr />")
88+
.replace(/(\<h[2-6])\>([^<]+)(\<\/h[1-6]\>)/gmi, function(o, ts, c, te) {
89+
return ts+' id="'+formatIdString(c)+'">'+c+te;
90+
});
91+
92+
return html;
93+
}
94+
95+
96+
if (argc > 3) {
97+
var filename = argv[3],
98+
output = template,
99+
html;
100+
101+
fs.readFile(filename, "utf8", function(err, data) {
102+
if (err) throw err;
103+
104+
// go recursion.
105+
data = loadIncludes(data, filename);
106+
// go markdown.
107+
html = convertData(data);
108+
filename = path.basename(filename, '.markdown');
109+
110+
if (filename != "_toc" && filename != "index") {
111+
if (data) {
112+
html = generateToc(data) + "\n" + html;
113+
}
114+
115+
output = output.replace("{{section}}", filename+" - ")
116+
} else {
117+
output = output.replace("{{section}}", "");
118+
output = output.replace(/<body([^>]*)>/, '<body class="'+filename+'" $1>');
119+
}
120+
if (html.length == 0) {
121+
html = "Sorry, this section is currently undocumented, \
122+
but we'll be working on it.";
123+
}
124+
output = output.replace("{{content}}", html);
125+
126+
if (argc > 4) {
127+
fs.writeFile(argv[4], output);
128+
} else {
129+
process.stdout.write(output);
130+
}
131+
});
132+
}

0 commit comments

Comments
 (0)