@ferax564/noma-cli 0.11.0

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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +199 -0
  3. package/bin/noma.mjs +8 -0
  4. package/dist/ast.d.ts +111 -0
  5. package/dist/ast.js +23 -0
  6. package/dist/ast.js.map +1 -0
  7. package/dist/book.d.ts +56 -0
  8. package/dist/book.js +120 -0
  9. package/dist/book.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +573 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/diff.d.ts +29 -0
  14. package/dist/diff.js +77 -0
  15. package/dist/diff.js.map +1 -0
  16. package/dist/fmt.d.ts +1 -0
  17. package/dist/fmt.js +105 -0
  18. package/dist/fmt.js.map +1 -0
  19. package/dist/ids.d.ts +15 -0
  20. package/dist/ids.js +27 -0
  21. package/dist/ids.js.map +1 -0
  22. package/dist/index.d.ts +20 -0
  23. package/dist/index.js +12 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/inline.d.ts +14 -0
  26. package/dist/inline.js +83 -0
  27. package/dist/inline.js.map +1 -0
  28. package/dist/loader.d.ts +12 -0
  29. package/dist/loader.js +59 -0
  30. package/dist/loader.js.map +1 -0
  31. package/dist/parser.d.ts +7 -0
  32. package/dist/parser.js +434 -0
  33. package/dist/parser.js.map +1 -0
  34. package/dist/patch.d.ts +61 -0
  35. package/dist/patch.js +530 -0
  36. package/dist/patch.js.map +1 -0
  37. package/dist/renderer-html.d.ts +44 -0
  38. package/dist/renderer-html.js +929 -0
  39. package/dist/renderer-html.js.map +1 -0
  40. package/dist/renderer-json.d.ts +5 -0
  41. package/dist/renderer-json.js +4 -0
  42. package/dist/renderer-json.js.map +1 -0
  43. package/dist/renderer-llm.d.ts +29 -0
  44. package/dist/renderer-llm.js +275 -0
  45. package/dist/renderer-llm.js.map +1 -0
  46. package/dist/renderer-noma.d.ts +10 -0
  47. package/dist/renderer-noma.js +179 -0
  48. package/dist/renderer-noma.js.map +1 -0
  49. package/dist/renderer-site.d.ts +11 -0
  50. package/dist/renderer-site.js +175 -0
  51. package/dist/renderer-site.js.map +1 -0
  52. package/dist/validator.d.ts +24 -0
  53. package/dist/validator.js +699 -0
  54. package/dist/validator.js.map +1 -0
  55. package/dist/verify.d.ts +10 -0
  56. package/dist/verify.js +141 -0
  57. package/dist/verify.js.map +1 -0
  58. package/package.json +83 -0
  59. package/schemas/ast.schema.json +187 -0
  60. package/schemas/capability.schema.json +70 -0
  61. package/schemas/patch-op.schema.json +92 -0
  62. package/schemas/patch-transaction.schema.json +28 -0
  63. package/schemas/transcript.schema.json +95 -0
  64. package/src/ast.ts +152 -0
  65. package/src/book.ts +162 -0
  66. package/src/cli.ts +595 -0
  67. package/src/diff.ts +108 -0
  68. package/src/fmt.ts +126 -0
  69. package/src/ids.ts +42 -0
  70. package/src/index.ts +20 -0
  71. package/src/inline.ts +92 -0
  72. package/src/loader.ts +55 -0
  73. package/src/parser.ts +501 -0
  74. package/src/patch.ts +646 -0
  75. package/src/renderer-html.ts +1047 -0
  76. package/src/renderer-json.ts +9 -0
  77. package/src/renderer-llm.ts +320 -0
  78. package/src/renderer-noma.ts +220 -0
  79. package/src/renderer-site.ts +245 -0
  80. package/src/validator.ts +733 -0
  81. package/src/verify.ts +157 -0
  82. package/themes/dark.css +382 -0
  83. package/themes/default.css +537 -0
@@ -0,0 +1,11 @@
1
+ import type { Node } from "./ast.js";
2
+ import type { LoadedChapter } from "./book.js";
3
+ export interface SiteRenderOptions {
4
+ themeCss?: string;
5
+ title?: string;
6
+ allowEscapeHatches?: boolean;
7
+ math?: "katex" | "none";
8
+ externalAssets?: boolean;
9
+ }
10
+ export declare function renderSite(manifest: Record<string, unknown>, chapters: LoadedChapter[], outDir: string, options?: SiteRenderOptions): void;
11
+ export type { LoadedChapter, Node };
@@ -0,0 +1,175 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { walk } from "./ast.js";
4
+ import { escapeAttr, escapeHtml, inlineToHtml } from "./inline.js";
5
+ import { renderHtml } from "./renderer-html.js";
6
+ export function renderSite(manifest, chapters, outDir, options = {}) {
7
+ const absOut = resolve(outDir);
8
+ mkdirSync(absOut, { recursive: true });
9
+ const themeCss = options.themeCss ?? "";
10
+ const hasTheme = themeCss.length > 0;
11
+ if (hasTheme) {
12
+ const assetsDir = join(absOut, "_assets");
13
+ mkdirSync(assetsDir, { recursive: true });
14
+ writeFileSync(join(assetsDir, "theme.css"), themeCss, "utf8");
15
+ }
16
+ const idMap = buildIdMap(chapters);
17
+ const bookTitle = options.title ||
18
+ (typeof manifest.title === "string" ? manifest.title : undefined) ||
19
+ "Noma Book";
20
+ for (const ch of chapters) {
21
+ const prefix = pagePrefix(ch.slug);
22
+ const html = renderHtml(ch.doc, {
23
+ standalone: true,
24
+ ...(hasTheme ? { stylesheetHref: `${prefix}${THEME_HREF}` } : { themeCss: "" }),
25
+ title: chapterTitle(ch) || bookTitle,
26
+ allowEscapeHatches: options.allowEscapeHatches !== false,
27
+ externalAssets: options.externalAssets !== false,
28
+ ...(options.math ? { math: options.math } : {}),
29
+ });
30
+ const rewritten = rewriteWikilinks(html, ch.slug, idMap, prefix);
31
+ const withNav = injectNav(rewritten, chapters, ch.slug, bookTitle, prefix);
32
+ const target = join(absOut, `${ch.slug}.html`);
33
+ mkdirSync(dirname(target), { recursive: true });
34
+ writeFileSync(target, withNav, "utf8");
35
+ }
36
+ const indexHtml = renderIndex(bookTitle, manifest, chapters, hasTheme, idMap);
37
+ writeFileSync(join(absOut, "index.html"), indexHtml, "utf8");
38
+ }
39
+ function pagePrefix(slug) {
40
+ if (!slug)
41
+ return "";
42
+ const depth = (slug.match(/\//g) ?? []).length;
43
+ return "../".repeat(depth);
44
+ }
45
+ function chapterTitle(ch) {
46
+ const root = ch.doc.children.find((n) => n.type === "section" && n.level === 1);
47
+ return root?.title;
48
+ }
49
+ function buildIdMap(chapters) {
50
+ const map = new Map();
51
+ for (const ch of chapters) {
52
+ for (const node of walk(ch.doc)) {
53
+ if (node.id) {
54
+ map.set(node.id, { chapterSlug: ch.slug, anchor: node.id });
55
+ }
56
+ if (node.aliases) {
57
+ for (const a of node.aliases) {
58
+ if (!map.has(a))
59
+ map.set(a, { chapterSlug: ch.slug, anchor: a });
60
+ }
61
+ }
62
+ }
63
+ }
64
+ return map;
65
+ }
66
+ const THEME_HREF = "_assets/theme.css";
67
+ const WIKILINK_HREF_RE = /<a\s+class="noma-ref"\s+href="#([^"]+)">([^<]+)<\/a>/g;
68
+ function rewriteWikilinks(html, currentSlug, idMap, prefix) {
69
+ return html.replace(WIKILINK_HREF_RE, (match, id, label) => {
70
+ const loc = idMap.get(id);
71
+ if (!loc || loc.chapterSlug === currentSlug)
72
+ return match;
73
+ return `<a class="noma-ref noma-xchapter" href="${escapeAttr(prefix + loc.chapterSlug)}.html#${escapeAttr(loc.anchor)}">${label}</a>`;
74
+ });
75
+ }
76
+ function injectNav(html, chapters, currentSlug, bookTitle, prefix) {
77
+ const nav = buildNav(chapters, currentSlug, bookTitle, prefix);
78
+ return html.replace(/<main class="noma-doc">/, `${nav}\n<main class="noma-doc">`);
79
+ }
80
+ function buildNav(chapters, currentSlug, bookTitle, prefix) {
81
+ const items = chapters
82
+ .map((c) => {
83
+ const isCurrent = c.slug === currentSlug;
84
+ const label = chapterTitle(c) ?? c.slug;
85
+ return isCurrent
86
+ ? `<li class="noma-nav-current"><span>${escapeHtml(label)}</span></li>`
87
+ : `<li><a href="${escapeAttr(prefix + c.slug)}.html">${escapeHtml(label)}</a></li>`;
88
+ })
89
+ .join("");
90
+ const homeMarkup = currentSlug === null
91
+ ? `<span class="noma-site-home noma-nav-current">${escapeHtml(bookTitle)}</span>`
92
+ : `<a class="noma-site-home" href="${escapeAttr(prefix)}index.html">${escapeHtml(bookTitle)}</a>`;
93
+ return `<nav class="noma-site-nav" aria-label="Chapters">
94
+ ${homeMarkup}
95
+ <ol>${items}</ol>
96
+ </nav>`;
97
+ }
98
+ function renderIndex(bookTitle, manifest, chapters, hasTheme, idMap) {
99
+ const author = typeof manifest.author === "string" ? manifest.author : undefined;
100
+ const nav = buildNav(chapters, null, bookTitle, "");
101
+ const items = chapters
102
+ .map((c) => {
103
+ const label = chapterTitle(c) ?? c.slug;
104
+ const raw = chapterSummaryRaw(c.doc);
105
+ const descHtml = raw ? renderCardDescription(raw, idMap) : "";
106
+ return `<li>
107
+ <a class="noma-site-chapter" href="${escapeAttr(c.slug)}.html">
108
+ <span class="noma-site-chapter-title">${escapeHtml(label)}</span>
109
+ ${descHtml ? `<span class="noma-site-chapter-summary">${descHtml}</span>` : ""}
110
+ </a>
111
+ </li>`;
112
+ })
113
+ .join("\n");
114
+ const themeLink = hasTheme
115
+ ? `<link rel="stylesheet" href="${THEME_HREF}" />`
116
+ : "";
117
+ return `<!doctype html>
118
+ <html lang="en">
119
+ <head>
120
+ <meta charset="utf-8" />
121
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
122
+ <meta name="generator" content="noma" />
123
+ <title>${escapeHtml(bookTitle)}</title>
124
+ ${themeLink}
125
+ </head>
126
+ <body>
127
+ ${nav}
128
+ <main class="noma-doc noma-site-index">
129
+ <header class="noma-site-header">
130
+ <h1>${escapeHtml(bookTitle)}</h1>
131
+ ${author ? `<p class="noma-site-author">${escapeHtml(author)}</p>` : ""}
132
+ </header>
133
+ <ol class="noma-site-toc">
134
+ ${items}
135
+ </ol>
136
+ </main>
137
+ </body>
138
+ </html>`;
139
+ }
140
+ function chapterSummaryRaw(doc) {
141
+ for (const node of walk(doc)) {
142
+ if (node.type === "directive" && (node.name === "summary" || node.name === "abstract")) {
143
+ const body = (node.body ?? "").trim();
144
+ if (body)
145
+ return body;
146
+ }
147
+ if (node.type === "paragraph") {
148
+ const body = node.content.trim();
149
+ if (body)
150
+ return body;
151
+ }
152
+ }
153
+ return undefined;
154
+ }
155
+ const SENTENCE_END_RE = /([.!?])(?=\s|$)/;
156
+ function firstSentence(s) {
157
+ const collapsed = s.replace(/\s+/g, " ").trim();
158
+ const m = collapsed.match(SENTENCE_END_RE);
159
+ if (m && m.index !== undefined) {
160
+ return collapsed.slice(0, m.index + 1);
161
+ }
162
+ return collapsed.length > 200 ? collapsed.slice(0, 197) + "…" : collapsed;
163
+ }
164
+ const CARD_REF_RE = /<a class="noma-ref" href="#([^"]+)">([^<]+)<\/a>/g;
165
+ function renderCardDescription(raw, idMap) {
166
+ const sentence = firstSentence(raw);
167
+ const html = inlineToHtml(sentence);
168
+ return html.replace(CARD_REF_RE, (_m, id, label) => {
169
+ const loc = idMap.get(id);
170
+ if (!loc)
171
+ return label;
172
+ return `<a class="noma-ref noma-xchapter" href="${escapeAttr(loc.chapterSlug)}.html#${escapeAttr(loc.anchor)}">${label}</a>`;
173
+ });
174
+ }
175
+ //# sourceMappingURL=renderer-site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-site.js","sourceRoot":"","sources":["../src/renderer-site.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Diagnostic, DocumentNode } from "./ast.js";
2
+ export interface ValidateOptions {
3
+ /**
4
+ * Disable claim-without-evidence warnings entirely (default: enabled).
5
+ * Per-block opt-out: add the `noverify` flag attribute to the claim.
6
+ */
7
+ requireEvidenceForClaims?: boolean;
8
+ /**
9
+ * Reference time for `stale-citation` checks. Defaults to `new Date()`.
10
+ * Tests pass a fixed clock for determinism.
11
+ */
12
+ now?: Date;
13
+ /** Citations older than this many days are flagged stale. Default: 365. */
14
+ staleCitationDays?: number;
15
+ /**
16
+ * Rule codes to drop from the result. Diagnostics whose `code` matches an
17
+ * entry are filtered out and do not affect exit status. Mirrors the per-block
18
+ * `noverify` flag at file level. Used by `noma check --ignore-rule X`.
19
+ */
20
+ ignoreRules?: string[];
21
+ }
22
+ export declare const KNOWN_PROFILES: string[];
23
+ export declare function validate(doc: DocumentNode, options?: ValidateOptions): Diagnostic[];
24
+ export declare function formatDiagnostics(diagnostics: Diagnostic[], filename?: string): string;