Skip to content

Commit 464a3e1

Browse files
committed
Fully generate snippet docs
1 parent 1a8e746 commit 464a3e1

File tree

8 files changed

+3197
-366
lines changed

8 files changed

+3197
-366
lines changed

README.md

Lines changed: 3030 additions & 189 deletions
Large diffs are not rendered by default.

src/app.ts

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { parse } from "./deps.ts";
2-
import { VscSnippetDefinition } from "./models/app.ts";
3-
import { variants } from "./snippets/app.ts";
4-
import { logTables } from "./utils/markdown.ts";
2+
import {
3+
generateSnippetDocs,
4+
generateVariantSections,
5+
} from "./docs-gen/snippets.ts";
6+
// import { logMdTables } from "./docs-gen/table-md.ts";
7+
import { languages } from "./snippets/app.ts";
58
import {
69
convertToVscSnippet,
710
generateSnippetsFile,
@@ -16,23 +19,26 @@ const flags = parse(Deno.args, {
1619
if (!flags.table && !flags.snippets) {
1720
console.log("Please specify at least one flag: --table or --snippets");
1821
} else {
19-
variants.forEach((variant) => {
20-
const categorizedVscSnippets: VscSnippetDefinition[] = variant
21-
.snippetsWithMeta.map(
22-
(item) => ({
23-
...item,
24-
snippets: convertToVscSnippet(item.snippets),
25-
}),
26-
);
22+
if (flags.snippets) {
23+
// Snippets generation
24+
languages.forEach((language) => {
25+
const categorizedVscSnippets = language
26+
.snippetDefinitions.map(
27+
(item) => ({
28+
...item,
29+
snippets: convertToVscSnippet(item.snippets),
30+
}),
31+
);
2732

28-
if (flags.table) {
29-
logTables(variant.label, categorizedVscSnippets);
30-
}
31-
if (flags.snippets) {
3233
const variantVscSnippet = groupSnippets(
3334
categorizedVscSnippets.map((item) => item.snippets),
3435
);
35-
generateSnippetsFile(variant.extension, variantVscSnippet);
36-
}
37-
});
36+
generateSnippetsFile(language.fileExtension, variantVscSnippet);
37+
});
38+
}
39+
40+
if (flags.table) {
41+
const sections = generateVariantSections(languages);
42+
generateSnippetDocs(sections);
43+
}
3844
}

src/docs-gen/snippets.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { ensureDirSync } from "../deps.ts";
2+
import { XSnippetDefinition, XSnippetVariant } from "../models/app.ts";
3+
import {
4+
$col,
5+
$colCode,
6+
$colCodeBlock,
7+
$row,
8+
$table,
9+
joinByDoubleNewLine,
10+
joinByNewLine,
11+
} from "./table-html.ts";
12+
13+
type SnippetRow = {
14+
prefix: string;
15+
name: string;
16+
body: string | string[];
17+
};
18+
19+
const snippetRow = ({ prefix, name, body }: SnippetRow) => {
20+
const parsedBody = Array.isArray(body) ? body.join("\n") : body;
21+
const cols = joinByNewLine([
22+
$colCode(prefix),
23+
$col(name),
24+
$colCodeBlock(parsedBody),
25+
]);
26+
27+
return $row(cols);
28+
};
29+
30+
const generateSnippetTable = (items: SnippetRow[]) => {
31+
const headings = ["Prefix", "Name", "Body"];
32+
const rows = items.map(snippetRow);
33+
34+
return $table(headings, rows);
35+
};
36+
37+
const generateSnippetSection = (
38+
{ meta, snippets }: XSnippetDefinition,
39+
) => {
40+
const title = `### ${meta.title}`;
41+
const description = meta.description ?? "";
42+
const table = generateSnippetTable(
43+
Object.entries(snippets).map(([prefix, value]) => ({
44+
...value,
45+
prefix,
46+
})),
47+
);
48+
49+
return joinByNewLine([title, description, table, ""]);
50+
};
51+
52+
const generateVariantSection = (variant: XSnippetVariant) => {
53+
const title = `## ${variant.label}`;
54+
const description = variant.description ?? "";
55+
const sections = variant.snippetDefinitions.map(generateSnippetSection);
56+
57+
return joinByNewLine([title, description, "", ...sections]);
58+
};
59+
60+
export const generateVariantSections = (variants: XSnippetVariant[]) => {
61+
return joinByDoubleNewLine(variants.map(generateVariantSection));
62+
};
63+
64+
export const generateSnippetDocs = (table: string) => {
65+
const path = "./dist";
66+
ensureDirSync(path);
67+
const file = `${path}/docs.md`;
68+
69+
Deno.writeFileSync(
70+
file,
71+
new TextEncoder().encode(table),
72+
);
73+
};

src/docs-gen/table-html.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
export const joinInline = (s: string[]) => s.join("");
2+
export const joinByNewLine = (s: string[]) => s.join("\n");
3+
export const joinByDoubleNewLine = (s: string[]) => s.join("\n\n");
4+
export const indent = (s: string, size = 2) => `${" ".repeat(size)}${s}`;
5+
export const escapeBackticks = (s: string) => s.replace(/`/g, "\`");
6+
7+
export const code = (s: string) => {
8+
return escapeBackticks("`" + s + "`");
9+
};
10+
11+
export const codeBlock = (s: string, lang = "javascript") => {
12+
return joinByNewLine([
13+
`${indent(escapeBackticks("```" + lang))}`,
14+
s,
15+
`${indent(escapeBackticks("```"))}`,
16+
]);
17+
};
18+
19+
export const $row = (s: string) => {
20+
return joinByNewLine(["", "<tr>", s, "</tr>"]);
21+
};
22+
23+
export const $colDoubleNewLine = (
24+
s: string,
25+
cb?: (input: string) => string,
26+
) => {
27+
return joinByDoubleNewLine(["<td>", cb?.(s) ?? s, "</td>"]);
28+
};
29+
30+
export const $col = (s: string) => {
31+
return `<td>${s}</td>`;
32+
};
33+
export const $colCode = (s: string) => {
34+
return $colDoubleNewLine(s, code);
35+
};
36+
export const $colCodeBlock = (s: string) => {
37+
return $colDoubleNewLine(s, codeBlock);
38+
};
39+
40+
export const $headerRow = (headers: string[]) => {
41+
const cols = joinByNewLine(headers.map($col));
42+
return $row(cols);
43+
};
44+
45+
export const $table = (headings: string[], rows: string[]) => {
46+
return joinByNewLine([
47+
"<table>",
48+
$headerRow(headings),
49+
joinByNewLine(rows),
50+
"</table>",
51+
]);
52+
};

src/utils/markdown.ts renamed to src/docs-gen/table-md.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { VscSnippetDefinition, VscSnippetDict } from "../models/app.ts";
21
import { markdownTable } from "../deps.ts";
3-
import { replaceSymbol } from "./general.ts";
2+
import { VscSnippetDefinition, VscSnippetDict } from "../models/app.ts";
3+
import { replaceSymbol } from "../utils/general.ts";
44

55
export const code = (str: string) => `\`${str}\``;
66

@@ -14,6 +14,7 @@ export const serializeForMarkdown = (str: string) => {
1414
.replace(/\|/g, "\\|");
1515
}
1616
// TODO: dont remove | when it is in ``
17+
// but it's different for every .md implementation
1718
return str.replace(/\|/g, "\\|");
1819
};
1920

src/models/app.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,11 @@ export type GenericSnippetDictWithMeta<T> = {
1919
};
2020
export type XSnippetDefinition = GenericSnippetDictWithMeta<XSnippetDict>;
2121
export type VscSnippetDefinition = GenericSnippetDictWithMeta<VscSnippetDict>;
22+
23+
export type XSnippetVariant = {
24+
label: string;
25+
description?: string;
26+
language: string;
27+
fileExtension: string;
28+
snippetDefinitions: XSnippetDefinition[];
29+
};

src/snippets/app.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,19 @@
1-
import { XSnippetDefinition } from "../models/app.ts";
1+
import { XSnippetVariant } from "../models/app.ts";
22
import { javascript } from "./js/app.ts";
33
import { typescript } from "./ts/app.ts";
44

5-
type SnippetVariant = {
6-
label: string;
7-
language: string;
8-
extension: string;
9-
snippetsWithMeta: XSnippetDefinition[];
10-
};
11-
export const variants: SnippetVariant[] = [
5+
export const languages: XSnippetVariant[] = [
126
{
137
label: "Snippets",
148
language: "javascript",
15-
extension: "js",
16-
snippetsWithMeta: javascript,
9+
fileExtension: "js",
10+
snippetDefinitions: javascript,
1711
},
1812
{
1913
label: "TypeScript specific",
14+
description: "Only applied to .ts and .tsx files",
2015
language: "typescript",
21-
extension: "ts",
22-
snippetsWithMeta: typescript,
16+
fileExtension: "ts",
17+
snippetDefinitions: typescript,
2318
},
2419
];

src/utils/table.ts

Lines changed: 0 additions & 145 deletions
This file was deleted.

0 commit comments

Comments
 (0)