@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 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 d(e) {
28
- let i = e.replace(/^[-_.\s~+]|[-_.\s~+]$/g, "");
29
- return /[-_.\s~+]/.test(i) ? i.toLowerCase().replace(/[-_.\s~+](\S)/g, (r, o) => o.toUpperCase()) : i.slice(0, 1).toLowerCase() + i.slice(1);
30
- }
31
- function p(e) {
32
- if (e) {
33
- if (e.startsWith("--") && e.length > 2) return d(e.slice(2));
34
- if (e.startsWith("-") && e.length === 2) return d(e.slice(1));
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 h(e) {
38
- let i = [], r = "", o = false, n = false;
39
- for (let s = 0; s < e.length; s++) {
40
- let t = e[s];
41
- if (/^\s/.test(t) && !o && !n) {
42
- r && i.push(r), r = "";
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
- t === "'" && e[s - 1] !== "\\" && (o = !o), t === '"' && e[s - 1] !== "\\" && (n = !n), r += t;
49
+ if (c === "'" && x[i - 1] !== "\\")
50
+ hasOpenSingleQuote = !hasOpenSingleQuote;
51
+ if (c === '"' && x[i - 1] !== "\\")
52
+ hasOpenDoubleQuote = !hasOpenDoubleQuote;
53
+ word += c;
46
54
  }
47
- return r && i.push(r), i;
48
- }
49
- function c() {
50
- return typeof process === void 0 ? [] : process.argv;
51
- }
52
- function A(e, i) {
53
- let r, o;
54
- e === void 0 ? r = c() : typeof e == "string" ? r = h(e) : Array.isArray(e) ? r = e.map((t) => String(t)) : e !== null && typeof e == "object" ? (r = c(), o = e) : r = [], r = r.map((t) => {
55
- let f = t.trim(), l = f.indexOf("=");
56
- return l === -1 ? f : [f.slice(0, l), f.slice(l + 1)];
57
- }).flat(), i && (o = i);
58
- let n = "", s = {};
59
- for (let t of r) {
60
- t = t.trim(), (t.startsWith('"') && t.endsWith('"') || t.startsWith("'") && t.endsWith("'")) && (t = t.slice(1, -1));
61
- let f = p(t);
62
- if (f !== void 0) {
63
- let g = o?.[f] ?? f;
64
- n && g !== n && s[n] === void 0 && (s[n] = true), n = g;
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 l;
68
- if (t) try {
69
- l = JSON.parse(t);
70
- } catch {
71
- l = t;
72
- }
73
- else l = true;
74
- let a = s[n], u;
75
- a === void 0 ? u = l : Array.isArray(a) ? u = [...a, l] : u = [a, l], s[n] = u;
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
- return n && s[n] === void 0 && (s[n] = true), s;
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
- ...A(args)
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="${root}${contentDir}/${id}">${title}</a>`;
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) s += `
345
- <li>${title2}</li>`;
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
- nav.push({
434
+ navItem = {
400
435
  id: "Overview",
401
436
  title: "Overview",
402
437
  items: []
403
- });
404
- else {
405
- let headings = dom.window.document.body.querySelectorAll("h2, h3, h4, h5, h6");
406
- for (let element of headings) {
407
- let tagName = element.tagName.toLowerCase();
408
- let isSectionTitle = tagName === "h2";
409
- let isSubsectionTitle = tagName === "h3";
410
- let sectionId = isSectionTitle ? getSlug(element.textContent) : navItem?.id ?? "";
411
- let elementId = element.id;
412
- if (!elementId)
413
- elementId = getSlug(element.textContent).toLowerCase().replace(/_/g, "-");
414
- if (elementId) {
415
- element.id = elementId;
416
- let link = `${root}${contentDir}/${sectionId}`;
417
- if (!isSectionTitle) link += `#${elementId}`;
418
- linkMap[`#${elementId}`] = link;
419
- }
420
- if (isSectionTitle) {
421
- if (navItem) nav.push(navItem);
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
- items: []
426
- };
427
- } else if (isSubsectionTitle) {
428
- if (navItem)
429
- navItem.items.push({
430
- id: getSlug(element.textContent),
431
- title: element.innerHTML.trim()
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.36",
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 -p build-css",
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.4",
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
- s += `\n<li data-id="${id}"><a href="${root}${contentDir}/${id}">${title}</a>`;
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) s += `\n <li>${title}</li>`;
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
- nav.push({
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
- for (let element of headings) {
35
- let tagName = element.tagName.toLowerCase();
31
+ let headings =
32
+ dom.window.document.body.querySelectorAll("h2, h3, h4, h5, h6");
36
33
 
37
- let isSectionTitle = tagName === "h2";
38
- let isSubsectionTitle = tagName === "h3";
34
+ for (let element of headings) {
35
+ let tagName = element.tagName.toLowerCase();
39
36
 
40
- let sectionId = isSectionTitle
41
- ? getSlug(element.textContent)
42
- : (navItem?.id ?? "");
43
- let elementId = element.id;
37
+ let isSectionTitle = tagName === "h2";
38
+ let isSubsectionTitle = tagName === "h3";
44
39
 
45
- if (!elementId)
46
- elementId = getSlug(element.textContent)
47
- .toLowerCase()
48
- .replace(/_/g, "-");
40
+ let sectionId = isSectionTitle
41
+ ? getSlug(element.textContent)
42
+ : (navItem?.id ?? "");
43
+ let elementId = element.id;
49
44
 
50
- if (elementId) {
51
- element.id = elementId;
45
+ if (!elementId)
46
+ elementId = getSlug(element.textContent)
47
+ .toLowerCase()
48
+ .replace(/_/g, "-");
52
49
 
53
- let link = `${root}${contentDir}/${sectionId}`;
50
+ if (elementId) {
51
+ element.id = elementId;
54
52
 
55
- if (!isSectionTitle) link += `#${elementId}`;
53
+ let link = `${root}${contentDir}/${sectionId}`;
56
54
 
57
- linkMap[`#${elementId}`] = link;
58
- }
55
+ if (!isSectionTitle) link += `#${elementId}`;
59
56
 
60
- if (isSectionTitle) {
61
- if (navItem) nav.push(navItem);
57
+ linkMap[`#${elementId}`] = link;
58
+ }
62
59
 
63
- navItem = {
60
+ if (singlePage && isSectionTitle) {
61
+ if (navItem)
62
+ navItem.items.push({
64
63
  id: getSlug(element.textContent),
65
64
  title: element.innerHTML.trim(),
66
- items: [],
67
- };
68
- } else if (isSubsectionTitle) {
69
- if (navItem)
70
- navItem.items.push({
71
- id: getSlug(element.textContent),
72
- title: element.innerHTML.trim(),
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,