-
Notifications
You must be signed in to change notification settings - Fork 3
/
generator.ts
97 lines (88 loc) · 2.41 KB
/
generator.ts
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
import { getDenoData } from "./deno_api.ts";
import { assert, pathJoin, pooledMap } from "./deps.ts";
import { DocRenderer } from "./renderer.ts";
import { htmlEscape, moduleToFile } from "./utility.ts";
export interface IndexOptions {
builtin?: boolean;
index_filename?: string;
output_directory?: string;
private?: boolean;
recursive?: boolean;
}
// TODO Deno builtin documentation
/**
* Generate static interlinked documentation for modules (and their dependencies) and an index
*/
export async function generateStatic(
modules: string[],
options?: IndexOptions,
): Promise<void> {
const outdir = options?.output_directory ?? "";
if (outdir !== "") {
await Deno.mkdir(outdir, { recursive: true });
}
const full_modules: Set<string> = new Set();
for await (
const _ of pooledMap(32, modules, async (mod) => {
const { info } = await getDenoData(mod);
assert(info, `Deno failed to generate metadata for module ${mod}`);
if (options?.recursive) {
for (const mod of Object.keys(info.files)) {
full_modules.add(mod);
}
} else {
try {
new URL(mod);
} catch {
mod = new URL(info.local, "file:///").toString();
}
full_modules.add(mod);
}
})
);
const renderer = new DocRenderer({
private: options?.private,
static: true,
link_module: (mod) =>
full_modules.has(mod) ? `${moduleToFile(mod)}.html` : undefined,
});
for await (
const _ of pooledMap(32, full_modules.keys(), async (mod) => {
const doc_html = await renderer.render(mod);
await Deno.writeTextFile(
pathJoin(outdir, `${moduleToFile(mod)}.html`),
doc_html,
{
create: true,
},
);
})
);
await Deno.writeTextFile(
pathJoin(outdir, options?.index_filename ?? "index.html"),
renderIndex(Array.from(full_modules.keys())),
);
}
function renderIndex(modules: string[]): string {
const rend = new DocRenderer({ static: true });
return `<html>
<head>
${rend.renderHead("Docuraptor Index")}
</head>
<body>
${rend.renderHeader("Documentation Index")}
<main>
<ul>
${
modules.sort().map(
(mod) =>
`<li class=link><a href="./${moduleToFile(mod)}.html">${
htmlEscape(mod)
}</a></li>`,
).join("")
}
</ul>
</main>
</body>
</html>`;
}