@t8/docsgen 0.1.36 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +118 -79
- package/package.json +3 -3
- package/src/bin/getNav.ts +5 -2
- package/src/bin/getParsedContent.ts +42 -37
package/dist/bin.js
CHANGED
|
@@ -24,57 +24,90 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
));
|
|
25
25
|
|
|
26
26
|
// node_modules/args-json/dist/index.js
|
|
27
|
-
function
|
|
28
|
-
let
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
27
|
+
function toCamelCase(x) {
|
|
28
|
+
let s = x.replace(/^[-_.\s~+]|[-_.\s~+]$/g, "");
|
|
29
|
+
if (!/[-_.\s~+]/.test(s)) return s.slice(0, 1).toLowerCase() + s.slice(1);
|
|
30
|
+
return s.toLowerCase().replace(/[-_.\s~+](\S)/g, (_, match) => match.toUpperCase());
|
|
31
|
+
}
|
|
32
|
+
function toKey(x) {
|
|
33
|
+
if (x) {
|
|
34
|
+
if (x.startsWith("--") && x.length > 2) return toCamelCase(x.slice(2));
|
|
35
|
+
if (x.startsWith("-") && x.length === 2) return toCamelCase(x.slice(1));
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
-
let
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
function split(x) {
|
|
39
|
+
let words = [], word = "";
|
|
40
|
+
let hasOpenSingleQuote = false;
|
|
41
|
+
let hasOpenDoubleQuote = false;
|
|
42
|
+
for (let i = 0; i < x.length; i++) {
|
|
43
|
+
let c = x[i];
|
|
44
|
+
if (/^\s/.test(c) && !hasOpenSingleQuote && !hasOpenDoubleQuote) {
|
|
45
|
+
if (word) words.push(word);
|
|
46
|
+
word = "";
|
|
43
47
|
continue;
|
|
44
48
|
}
|
|
45
|
-
|
|
49
|
+
if (c === "'" && x[i - 1] !== "\\")
|
|
50
|
+
hasOpenSingleQuote = !hasOpenSingleQuote;
|
|
51
|
+
if (c === '"' && x[i - 1] !== "\\")
|
|
52
|
+
hasOpenDoubleQuote = !hasOpenDoubleQuote;
|
|
53
|
+
word += c;
|
|
46
54
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
if (word) words.push(word);
|
|
56
|
+
return words;
|
|
57
|
+
}
|
|
58
|
+
function getDefaultInput() {
|
|
59
|
+
return typeof process === "undefined" ? [] : process.argv;
|
|
60
|
+
}
|
|
61
|
+
function parseArgs(input, map) {
|
|
62
|
+
let normalizedInput;
|
|
63
|
+
let normalizedMap;
|
|
64
|
+
if (input === void 0) normalizedInput = getDefaultInput();
|
|
65
|
+
else if (typeof input === "string") normalizedInput = split(input);
|
|
66
|
+
else if (Array.isArray(input)) normalizedInput = input.map((x) => String(x));
|
|
67
|
+
else if (input !== null && typeof input === "object") {
|
|
68
|
+
normalizedInput = getDefaultInput();
|
|
69
|
+
normalizedMap = input;
|
|
70
|
+
} else normalizedInput = [];
|
|
71
|
+
normalizedInput = normalizedInput.flatMap((item) => {
|
|
72
|
+
let normalizedItem = item.trim();
|
|
73
|
+
let k = normalizedItem.indexOf("=");
|
|
74
|
+
if (k === -1) return normalizedItem;
|
|
75
|
+
return [normalizedItem.slice(0, k), normalizedItem.slice(k + 1)];
|
|
76
|
+
});
|
|
77
|
+
if (map) normalizedMap = map;
|
|
78
|
+
let key = "";
|
|
79
|
+
let parsedArgs = {};
|
|
80
|
+
for (let rawValue of normalizedInput) {
|
|
81
|
+
rawValue = rawValue.trim();
|
|
82
|
+
if (rawValue.startsWith('"') && rawValue.endsWith('"'))
|
|
83
|
+
rawValue = rawValue.slice(1, -1);
|
|
84
|
+
else if (rawValue.startsWith("'") && rawValue.endsWith("'"))
|
|
85
|
+
rawValue = rawValue.slice(1, -1);
|
|
86
|
+
let parsedKey = toKey(rawValue);
|
|
87
|
+
if (parsedKey !== void 0) {
|
|
88
|
+
let nextKey = normalizedMap?.[parsedKey] ?? parsedKey;
|
|
89
|
+
if (key && nextKey !== key && parsedArgs[key] === void 0)
|
|
90
|
+
parsedArgs[key] = true;
|
|
91
|
+
key = nextKey;
|
|
65
92
|
continue;
|
|
66
93
|
}
|
|
67
|
-
let
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
94
|
+
let parsedValue;
|
|
95
|
+
if (rawValue) {
|
|
96
|
+
try {
|
|
97
|
+
parsedValue = JSON.parse(rawValue);
|
|
98
|
+
} catch {
|
|
99
|
+
parsedValue = rawValue;
|
|
100
|
+
}
|
|
101
|
+
} else parsedValue = true;
|
|
102
|
+
let prevValue = parsedArgs[key];
|
|
103
|
+
let value;
|
|
104
|
+
if (prevValue === void 0) value = parsedValue;
|
|
105
|
+
else if (Array.isArray(prevValue)) value = [...prevValue, parsedValue];
|
|
106
|
+
else value = [prevValue, parsedValue];
|
|
107
|
+
parsedArgs[key] = value;
|
|
76
108
|
}
|
|
77
|
-
|
|
109
|
+
if (key && parsedArgs[key] === void 0) parsedArgs[key] = true;
|
|
110
|
+
return parsedArgs;
|
|
78
111
|
}
|
|
79
112
|
|
|
80
113
|
// src/bin/fetchText.ts
|
|
@@ -188,7 +221,7 @@ async function getConfig() {
|
|
|
188
221
|
root: "/",
|
|
189
222
|
contentDir: "x",
|
|
190
223
|
...localConfig,
|
|
191
|
-
...
|
|
224
|
+
...parseArgs(args)
|
|
192
225
|
};
|
|
193
226
|
if (config.entries)
|
|
194
227
|
config.entries = await Promise.all(config.entries.map(reviseConfig));
|
|
@@ -337,12 +370,14 @@ async function getNav(ctx, navItems) {
|
|
|
337
370
|
}
|
|
338
371
|
if (navItems.length > 1) {
|
|
339
372
|
for (let { id, title, items } of navItems) {
|
|
373
|
+
let itemLink = `${root}${contentDir}/${encodeURIComponent(id)}`;
|
|
340
374
|
s += `
|
|
341
|
-
<li data-id="${id}"><a href="${
|
|
375
|
+
<li data-id="${id}"><a href="${itemLink}">${title}</a>`;
|
|
342
376
|
if (items.length !== 0) {
|
|
343
377
|
s += "\n <ul>";
|
|
344
|
-
for (let { title: title2 } of items)
|
|
345
|
-
|
|
378
|
+
for (let { id: id2, title: title2 } of items)
|
|
379
|
+
s += `
|
|
380
|
+
<li><a href="${itemLink}#${encodeURIComponent(id2)}">${title2}</a></li>`;
|
|
346
381
|
s += "\n </ul>\n";
|
|
347
382
|
}
|
|
348
383
|
s += "</li>";
|
|
@@ -396,44 +431,48 @@ function buildNav(ctx, dom) {
|
|
|
396
431
|
let navItem = null;
|
|
397
432
|
let nav = [];
|
|
398
433
|
if (singlePage)
|
|
399
|
-
|
|
434
|
+
navItem = {
|
|
400
435
|
id: "Overview",
|
|
401
436
|
title: "Overview",
|
|
402
437
|
items: []
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
if (
|
|
421
|
-
|
|
422
|
-
navItem = {
|
|
438
|
+
};
|
|
439
|
+
let headings = dom.window.document.body.querySelectorAll("h2, h3, h4, h5, h6");
|
|
440
|
+
for (let element of headings) {
|
|
441
|
+
let tagName = element.tagName.toLowerCase();
|
|
442
|
+
let isSectionTitle = tagName === "h2";
|
|
443
|
+
let isSubsectionTitle = tagName === "h3";
|
|
444
|
+
let sectionId = isSectionTitle ? getSlug(element.textContent) : navItem?.id ?? "";
|
|
445
|
+
let elementId = element.id;
|
|
446
|
+
if (!elementId)
|
|
447
|
+
elementId = getSlug(element.textContent).toLowerCase().replace(/_/g, "-");
|
|
448
|
+
if (elementId) {
|
|
449
|
+
element.id = elementId;
|
|
450
|
+
let link = `${root}${contentDir}/${sectionId}`;
|
|
451
|
+
if (!isSectionTitle) link += `#${elementId}`;
|
|
452
|
+
linkMap[`#${elementId}`] = link;
|
|
453
|
+
}
|
|
454
|
+
if (singlePage && isSectionTitle) {
|
|
455
|
+
if (navItem)
|
|
456
|
+
navItem.items.push({
|
|
423
457
|
id: getSlug(element.textContent),
|
|
424
|
-
title: element.innerHTML.trim()
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
458
|
+
title: element.innerHTML.trim()
|
|
459
|
+
});
|
|
460
|
+
} else if (isSectionTitle) {
|
|
461
|
+
if (navItem) nav.push(navItem);
|
|
462
|
+
navItem = {
|
|
463
|
+
id: getSlug(element.textContent),
|
|
464
|
+
title: element.innerHTML.trim(),
|
|
465
|
+
items: []
|
|
466
|
+
};
|
|
467
|
+
} else if (isSubsectionTitle) {
|
|
468
|
+
if (navItem)
|
|
469
|
+
navItem.items.push({
|
|
470
|
+
id: getSlug(element.textContent),
|
|
471
|
+
title: element.innerHTML.trim()
|
|
472
|
+
});
|
|
434
473
|
}
|
|
435
|
-
if (navItem) nav.push(navItem);
|
|
436
474
|
}
|
|
475
|
+
if (navItem) nav.push(navItem);
|
|
437
476
|
return {
|
|
438
477
|
nav,
|
|
439
478
|
linkMap
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t8/docsgen",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.38",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/bin.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"docsgen": "dist/bin.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "npx npm-run-all clean build-bin
|
|
10
|
+
"build": "npx npm-run-all clean build-bin build-css",
|
|
11
11
|
"build-bin": "npx esbuild ./src/bin/run.ts --bundle --outfile=dist/bin.js --platform=node --external:jsdom --external:markdown-it",
|
|
12
12
|
"build-css": "node -e \"require('node:fs').cpSync('src/css', 'dist/css', { force: true, recursive: true });\"",
|
|
13
13
|
"build-schema": "npx ts-json-schema-generator -p src/types/Config.ts -t Config -o schema.json --minify",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"typescript": "^5.9.3"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"args-json": "^1.2.
|
|
33
|
+
"args-json": "^1.2.5",
|
|
34
34
|
"jsdom": "^27.0.0",
|
|
35
35
|
"markdown-it": "^14.1.0"
|
|
36
36
|
}
|
package/src/bin/getNav.ts
CHANGED
|
@@ -32,12 +32,15 @@ export async function getNav(ctx: Context, navItems: NavItem[]) {
|
|
|
32
32
|
|
|
33
33
|
if (navItems.length > 1) {
|
|
34
34
|
for (let { id, title, items } of navItems) {
|
|
35
|
-
|
|
35
|
+
let itemLink = `${root}${contentDir}/${encodeURIComponent(id)}`;
|
|
36
|
+
|
|
37
|
+
s += `\n<li data-id="${id}"><a href="${itemLink}">${title}</a>`;
|
|
36
38
|
|
|
37
39
|
if (items.length !== 0) {
|
|
38
40
|
s += "\n <ul>";
|
|
39
41
|
|
|
40
|
-
for (let { title } of items)
|
|
42
|
+
for (let { id, title } of items)
|
|
43
|
+
s += `\n <li><a href="${itemLink}#${encodeURIComponent(id)}">${title}</a></li>`;
|
|
41
44
|
|
|
42
45
|
s += "\n </ul>\n";
|
|
43
46
|
}
|
|
@@ -22,61 +22,66 @@ function buildNav(ctx: Context, dom: JSDOM) {
|
|
|
22
22
|
let nav: NavItem[] = [];
|
|
23
23
|
|
|
24
24
|
if (singlePage)
|
|
25
|
-
|
|
25
|
+
navItem = {
|
|
26
26
|
id: "Overview",
|
|
27
27
|
title: "Overview",
|
|
28
28
|
items: [],
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
let headings =
|
|
32
|
-
dom.window.document.body.querySelectorAll("h2, h3, h4, h5, h6");
|
|
29
|
+
};
|
|
33
30
|
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
let headings =
|
|
32
|
+
dom.window.document.body.querySelectorAll("h2, h3, h4, h5, h6");
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
for (let element of headings) {
|
|
35
|
+
let tagName = element.tagName.toLowerCase();
|
|
39
36
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
: (navItem?.id ?? "");
|
|
43
|
-
let elementId = element.id;
|
|
37
|
+
let isSectionTitle = tagName === "h2";
|
|
38
|
+
let isSubsectionTitle = tagName === "h3";
|
|
44
39
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
let sectionId = isSectionTitle
|
|
41
|
+
? getSlug(element.textContent)
|
|
42
|
+
: (navItem?.id ?? "");
|
|
43
|
+
let elementId = element.id;
|
|
49
44
|
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
if (!elementId)
|
|
46
|
+
elementId = getSlug(element.textContent)
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.replace(/_/g, "-");
|
|
52
49
|
|
|
53
|
-
|
|
50
|
+
if (elementId) {
|
|
51
|
+
element.id = elementId;
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
let link = `${root}${contentDir}/${sectionId}`;
|
|
56
54
|
|
|
57
|
-
|
|
58
|
-
}
|
|
55
|
+
if (!isSectionTitle) link += `#${elementId}`;
|
|
59
56
|
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
linkMap[`#${elementId}`] = link;
|
|
58
|
+
}
|
|
62
59
|
|
|
63
|
-
|
|
60
|
+
if (singlePage && isSectionTitle) {
|
|
61
|
+
if (navItem)
|
|
62
|
+
navItem.items.push({
|
|
64
63
|
id: getSlug(element.textContent),
|
|
65
64
|
title: element.innerHTML.trim(),
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
65
|
+
});
|
|
66
|
+
} else if (isSectionTitle) {
|
|
67
|
+
if (navItem) nav.push(navItem);
|
|
68
|
+
|
|
69
|
+
navItem = {
|
|
70
|
+
id: getSlug(element.textContent),
|
|
71
|
+
title: element.innerHTML.trim(),
|
|
72
|
+
items: [],
|
|
73
|
+
};
|
|
74
|
+
} else if (isSubsectionTitle) {
|
|
75
|
+
if (navItem)
|
|
76
|
+
navItem.items.push({
|
|
77
|
+
id: getSlug(element.textContent),
|
|
78
|
+
title: element.innerHTML.trim(),
|
|
79
|
+
});
|
|
75
80
|
}
|
|
76
|
-
|
|
77
|
-
if (navItem) nav.push(navItem);
|
|
78
81
|
}
|
|
79
82
|
|
|
83
|
+
if (navItem) nav.push(navItem);
|
|
84
|
+
|
|
80
85
|
return {
|
|
81
86
|
nav,
|
|
82
87
|
linkMap,
|