@dogsbay/format-rst 0.2.0-beta.101

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/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import type { FormatPlugin, ExportPage, NavItem } from "@dogsbay/types";
2
+ import { rstPathToSlug } from "./loaders/plain.js";
3
+ export interface RstImportResult {
4
+ pages: ExportPage[];
5
+ nav: NavItem[];
6
+ /** Which mode actually ran ("sphinx" | "plain"), for reporting. */
7
+ mode: "sphinx" | "plain";
8
+ }
9
+ export declare function importRst(source: string, opts: Record<string, unknown>): Promise<RstImportResult>;
10
+ export declare const plugin: FormatPlugin;
11
+ export { rstPathToSlug };
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAW,MAAM,gBAAgB,CAAC;AAKjF,OAAO,EAAyC,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAW1F,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,EAAE,OAAO,EAAE,CAAC;IACf,mEAAmE;IACnE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC1B;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CA+B1B;AAoHD,eAAO,MAAM,MAAM,EAAE,YAsBpB,CAAC;AAGF,OAAO,EAAE,aAAa,EAAE,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,188 @@
1
+ /**
2
+ * FormatPlugin for reStructuredText / Sphinx as a source format.
3
+ *
4
+ * Import strategy:
5
+ * - **Sphinx mode** when a `conf.py` is found: build the project to XML
6
+ * once (toctree, cross-refs, directives, autodoc all resolve), map each
7
+ * doc → ExportPage, nav from the toctree. If the Sphinx build fails
8
+ * (e.g. conf.py references extensions not installed in this env), fall
9
+ * back to plain mode with a warning — content still converts, minus the
10
+ * Sphinx-resolved bits (plans/format-rst.md decision #2).
11
+ * - **Plain mode** otherwise: docutils per-file, directory-inferred nav.
12
+ *
13
+ * Needs Python 3 + docutils (and Sphinx for Sphinx projects) — a migrate-
14
+ * time requirement, detected up front with an actionable error.
15
+ */
16
+ import { existsSync, readFileSync, rmSync } from "node:fs";
17
+ import { basename } from "node:path";
18
+ import { extractHeadings } from "@dogsbay/format-dogsbay-md";
19
+ import { parseRstFile, parseRstXml } from "./parse.js";
20
+ import { loadSphinx, findSphinxSrc } from "./loaders/sphinx.js";
21
+ import { walkRstFiles, inferNav, isRstDominant, rstPathToSlug } from "./loaders/plain.js";
22
+ import { sidecarAvailable, sphinxAvailable, missingPythonMessage, RstSidecarError } from "./sidecar.js";
23
+ function prettify(slug) {
24
+ return slug
25
+ .split(/[-_/]/)
26
+ .filter(Boolean)
27
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
28
+ .join(" ");
29
+ }
30
+ export async function importRst(source, opts) {
31
+ if (!existsSync(source))
32
+ throw new Error(`Source directory not found: ${source}`);
33
+ if (!sidecarAvailable())
34
+ throw new RstSidecarError(missingPythonMessage());
35
+ const hrefPrefix = typeof opts.hrefPrefix === "string" ? opts.hrefPrefix : "";
36
+ const forcePlain = opts.loader === "plain";
37
+ const sphinxSrc = forcePlain ? null : findSphinxSrc(source);
38
+ // Only attempt a Sphinx build when Sphinx is actually installed — else a
39
+ // docutils-only env pays a guaranteed failing subprocess + scary warning
40
+ // before falling back. When conf.py exists but Sphinx is missing, note it.
41
+ if (sphinxSrc && sphinxAvailable()) {
42
+ try {
43
+ return importSphinx(source, hrefPrefix);
44
+ }
45
+ catch (err) {
46
+ const msg = err instanceof Error ? err.message : String(err);
47
+ console.warn(`rst import: Sphinx build failed, falling back to plain docutils mode.\n ${msg.split("\n")[0]}`);
48
+ // Fall back walking the Sphinx SOURCE dir (where conf.py lives), not
49
+ // the repo root — otherwise slugs gain a spurious `docs/` prefix.
50
+ return importPlain(sphinxSrc, hrefPrefix);
51
+ }
52
+ }
53
+ if (sphinxSrc && !forcePlain) {
54
+ console.warn("rst import: a conf.py was found but Sphinx isn't installed — using plain mode " +
55
+ "(toctree nav + :doc:/:ref: cross-refs won't resolve). Install sphinx for full fidelity.");
56
+ }
57
+ return importPlain(sphinxSrc ?? source, hrefPrefix);
58
+ }
59
+ function importSphinx(source, hrefPrefix) {
60
+ const { docs, nav, outDir } = loadSphinx(source, hrefPrefix);
61
+ const pages = [];
62
+ const ledgers = new Map();
63
+ let failed = 0;
64
+ try {
65
+ for (const doc of docs) {
66
+ try {
67
+ const xml = readFileSync(doc.xmlPath, "utf-8");
68
+ const { tree, title, markdown, ledger } = parseRstXml(xml, doc.slug, hrefPrefix);
69
+ if (ledger.length)
70
+ ledgers.set(doc.slug, ledger);
71
+ pages.push(makePage(doc.slug, tree, title, markdown, ledger));
72
+ }
73
+ catch (err) {
74
+ failed += 1;
75
+ const m = err instanceof Error ? err.message : String(err);
76
+ console.warn(`rst import: failed on ${doc.slug}, skipping: ${m}`);
77
+ }
78
+ }
79
+ }
80
+ finally {
81
+ // Reclaim the temp XML build dir once every doc has been read — it can
82
+ // be tens of MB per project and would otherwise leak on every run.
83
+ rmSync(outDir, { recursive: true, force: true });
84
+ }
85
+ reportSkips(failed, docs.length, ledgers);
86
+ return { pages, nav, mode: "sphinx" };
87
+ }
88
+ function importPlain(source, hrefPrefix) {
89
+ const sources = walkRstFiles(source);
90
+ const pages = [];
91
+ const titles = new Map();
92
+ const ledgers = new Map();
93
+ let failed = 0;
94
+ for (const s of sources) {
95
+ try {
96
+ const { tree, title, markdown, ledger } = parseRstFile(s.filePath, hrefPrefix);
97
+ if (ledger.length)
98
+ ledgers.set(s.slug, ledger);
99
+ const page = makePage(s.slug, tree, title, markdown, ledger);
100
+ titles.set(s.slug, page.title);
101
+ pages.push(page);
102
+ }
103
+ catch (err) {
104
+ failed += 1;
105
+ const m = err instanceof Error ? err.message : String(err);
106
+ console.warn(`rst import: failed on ${s.filePath}, skipping: ${m}`);
107
+ }
108
+ }
109
+ reportSkips(failed, sources.length, ledgers);
110
+ const nav = inferNav(sources, titles, hrefPrefix);
111
+ return { pages, nav, mode: "plain" };
112
+ }
113
+ function makePage(slug, tree, title, markdown, ledger) {
114
+ const headings = extractHeadings(tree);
115
+ const resolvedTitle = (title && title.trim()) ||
116
+ headings.find((h) => h.depth === 1)?.text ||
117
+ prettify(basename(slug));
118
+ return {
119
+ slug,
120
+ title: resolvedTitle,
121
+ tree,
122
+ headings,
123
+ frontmatter: {},
124
+ // Surface the per-page ledger so downstream consumers (and anyone
125
+ // inspecting the page) can see which constructs were dropped/degraded.
126
+ meta: ledger.length ? { rstLedger: ledger } : {},
127
+ bodyMarkdown: markdown,
128
+ };
129
+ }
130
+ /**
131
+ * Report failures + a concrete per-page ledger summary. Previously the CLI
132
+ * claimed "see per-page ledger" without ever writing one; now it names the
133
+ * pages and construct kinds so the caveat is actionable.
134
+ */
135
+ function reportSkips(failed, total, ledgers) {
136
+ if (failed > 0)
137
+ console.warn(`rst import: ${failed} of ${total} doc(s) failed and were skipped`);
138
+ if (ledgers.size === 0)
139
+ return;
140
+ const kinds = new Map();
141
+ let entries = 0;
142
+ for (const list of ledgers.values()) {
143
+ entries += list.length;
144
+ for (const e of list) {
145
+ const kind = e.construct.replace(/[:0-9].*/, "").trim() || e.construct.slice(0, 24);
146
+ kinds.set(kind, (kinds.get(kind) ?? 0) + 1);
147
+ }
148
+ }
149
+ const topKinds = [...kinds.entries()]
150
+ .sort((a, b) => b[1] - a[1])
151
+ .slice(0, 5)
152
+ .map(([k, n]) => `${k}×${n}`)
153
+ .join(", ");
154
+ const topPages = [...ledgers.entries()]
155
+ .sort((a, b) => b[1].length - a[1].length)
156
+ .slice(0, 5)
157
+ .map(([slug, list]) => `${slug} (${list.length})`)
158
+ .join(", ");
159
+ console.warn(`rst import: ${entries} construct(s) across ${ledgers.size} page(s) mapped with caveats or dropped.\n` +
160
+ ` kinds: ${topKinds}\n` +
161
+ ` most-affected: ${topPages}\n` +
162
+ ` (full detail on each page's meta.rstLedger)`);
163
+ }
164
+ export const plugin = {
165
+ name: "rst",
166
+ canImport: true,
167
+ canExport: false,
168
+ // Detect only when there's a Sphinx conf.py, OR the tree is
169
+ // rST-DOMINANT (has .rst and no competing .md). A stray CHANGELOG.rst in
170
+ // a Dogsbay-MD / MkDocs corpus must NOT steal detection — rst is
171
+ // registered before dogsbay-md (the generic .md catch-all), so this
172
+ // guard keeps it from claiming markdown trees.
173
+ detectSource: (path) => findSphinxSrc(path) !== null || isRstDominant(path),
174
+ importOptions: [
175
+ {
176
+ flags: "--loader <name>",
177
+ description: "Force a loader: 'sphinx' (build via conf.py) or 'plain' (docutils per-file, no toctree/cross-refs). Auto-detected when omitted.",
178
+ },
179
+ ],
180
+ exportOptions: [],
181
+ async import(source, opts) {
182
+ const { pages, nav } = await importRst(source, opts);
183
+ return { pages, nav };
184
+ },
185
+ };
186
+ // Re-export for the migrate command.
187
+ export { rstPathToSlug };
188
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @dogsbay/format-rst — reStructuredText / Sphinx format plugin.
3
+ *
4
+ * Imports `.rst` corpora into TreeNode[] by parsing with docutils/Sphinx
5
+ * (a Python sidecar) to XML, transforming that AST to Dogsbay-MD, then
6
+ * parsing with the canonical dogsbay-md parser.
7
+ *
8
+ * See plans/format-rst.md.
9
+ */
10
+ export { rstFileToXml, sidecarAvailable, sphinxAvailable, sphinxBuildXml, findPython, missingPythonMessage, RstSidecarError, } from "./sidecar.js";
11
+ export { parseRstFile, parseRstXml, type ParseRstResult } from "./parse.js";
12
+ export { docutilsXmlToDogsbayMd, type TransformResult, type TransformOptions, type RstLedgerEntry, } from "./transform.js";
13
+ export { loadSphinx, findSphinxSrc, type SphinxLoadResult, type SphinxDoc, } from "./loaders/sphinx.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,SAAS,GACf,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @dogsbay/format-rst — reStructuredText / Sphinx format plugin.
3
+ *
4
+ * Imports `.rst` corpora into TreeNode[] by parsing with docutils/Sphinx
5
+ * (a Python sidecar) to XML, transforming that AST to Dogsbay-MD, then
6
+ * parsing with the canonical dogsbay-md parser.
7
+ *
8
+ * See plans/format-rst.md.
9
+ */
10
+ export { rstFileToXml, sidecarAvailable, sphinxAvailable, sphinxBuildXml, findPython, missingPythonMessage, RstSidecarError, } from "./sidecar.js";
11
+ export { parseRstFile, parseRstXml } from "./parse.js";
12
+ export { docutilsXmlToDogsbayMd, } from "./transform.js";
13
+ export { loadSphinx, findSphinxSrc, } from "./loaders/sphinx.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAuB,MAAM,YAAY,CAAC;AAC5E,OAAO,EACL,sBAAsB,GAIvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,aAAa,GAGd,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { NavItem } from "@dogsbay/types";
2
+ export interface RstPageSource {
3
+ filePath: string;
4
+ /** Root-relative slug (README/index → index). */
5
+ slug: string;
6
+ }
7
+ /** Slug for a source path relative to the docs root (README → index). */
8
+ export declare function rstPathToSlug(rel: string): string;
9
+ /** Walk `dir` for every `.rst` file (skipping dotdirs + _build/_static). */
10
+ export declare function walkRstFiles(dir: string): RstPageSource[];
11
+ /**
12
+ * Infer a nav tree from page slugs (no toctree available in plain mode).
13
+ * Directory segments become groups; `<dir>/index` is the group's landing
14
+ * page. Best-effort — the author can curate the emitted nav.yml.
15
+ */
16
+ export declare function inferNav(pages: RstPageSource[], titles: Map<string, string>, hrefPrefix?: string): NavItem[];
17
+ /**
18
+ * Detect: is this directory rST-DOMINANT — has `.rst` files and no competing
19
+ * `.md` files? A stray `CHANGELOG.rst` / `README.rst` in a Markdown corpus
20
+ * must not make the whole tree read as reStructuredText (format-rst is
21
+ * registered before the generic dogsbay-md detector). Requires both a
22
+ * present `.rst` and the absence of `.md`.
23
+ */
24
+ export declare function isRstDominant(dir: string): boolean;
25
+ //# sourceMappingURL=plain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plain.d.ts","sourceRoot":"","sources":["../../src/loaders/plain.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CA2BzD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,SAAK,GAAG,OAAO,EAAE,CAgCxG;AAUD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAuClD"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Plain (non-Sphinx) rST corpus loader — a flat `.rst` walk.
3
+ *
4
+ * Used when there's no `conf.py`, or as the fallback when a Sphinx build
5
+ * fails (e.g. the project's conf.py references extensions not installed in
6
+ * this env — see plans/format-rst.md decision #2). Plain docutils can't
7
+ * resolve `toctree`/cross-refs, so nav is inferred from the directory
8
+ * structure; the transform ledgers the Sphinx-only constructs.
9
+ */
10
+ import { existsSync, readdirSync, statSync } from "node:fs";
11
+ import { join, relative } from "node:path";
12
+ /** Slug for a source path relative to the docs root (README → index). */
13
+ export function rstPathToSlug(rel) {
14
+ let p = rel.replace(/\\/g, "/").replace(/\.rst$/i, "");
15
+ if (p === "README" || p === "index")
16
+ return "index";
17
+ p = p.replace(/\/(README|index)$/i, "/index");
18
+ return p;
19
+ }
20
+ /** Walk `dir` for every `.rst` file (skipping dotdirs + _build/_static). */
21
+ export function walkRstFiles(dir) {
22
+ const out = [];
23
+ const SKIP = new Set(["_build", "_static", "_templates", "node_modules"]);
24
+ const walk = (d) => {
25
+ let entries;
26
+ try {
27
+ entries = readdirSync(d);
28
+ }
29
+ catch {
30
+ return;
31
+ }
32
+ for (const name of entries) {
33
+ if (name.startsWith(".") || SKIP.has(name))
34
+ continue;
35
+ const full = join(d, name);
36
+ let st;
37
+ try {
38
+ st = statSync(full);
39
+ }
40
+ catch {
41
+ continue;
42
+ }
43
+ if (st.isDirectory())
44
+ walk(full);
45
+ else if (name.toLowerCase().endsWith(".rst")) {
46
+ out.push({ filePath: full, slug: rstPathToSlug(relative(dir, full)) });
47
+ }
48
+ }
49
+ };
50
+ walk(dir);
51
+ return out;
52
+ }
53
+ /**
54
+ * Infer a nav tree from page slugs (no toctree available in plain mode).
55
+ * Directory segments become groups; `<dir>/index` is the group's landing
56
+ * page. Best-effort — the author can curate the emitted nav.yml.
57
+ */
58
+ export function inferNav(pages, titles, hrefPrefix = "") {
59
+ const root = [];
60
+ const groups = new Map();
61
+ // Single group-creation path (returns the group NODE); a group's children
62
+ // array is `.children`.
63
+ const ensureGroup = (dir) => {
64
+ if (!dir)
65
+ return null;
66
+ const existing = groups.get(dir);
67
+ if (existing)
68
+ return existing;
69
+ const parentDir = dir.includes("/") ? dir.slice(0, dir.lastIndexOf("/")) : "";
70
+ const label = prettify(dir.slice(dir.lastIndexOf("/") + 1));
71
+ const group = { label, children: [] };
72
+ groups.set(dir, group);
73
+ const parent = ensureGroup(parentDir);
74
+ (parent ? parent.children : root).push(group);
75
+ return group;
76
+ };
77
+ for (const p of pages.slice().sort((a, b) => a.slug.localeCompare(b.slug))) {
78
+ if (p.slug === "index")
79
+ continue; // root landing, not a nav entry
80
+ const dir = p.slug.includes("/") ? p.slug.slice(0, p.slug.lastIndexOf("/")) : "";
81
+ const base = p.slug.slice(p.slug.lastIndexOf("/") + 1);
82
+ const href = `${hrefPrefix}/${p.slug}`.replace(/\/+/g, "/");
83
+ if (base === "index") {
84
+ // Directory landing page — attach as the group's own href.
85
+ const g = ensureGroup(dir);
86
+ if (g)
87
+ g.href = href;
88
+ }
89
+ else {
90
+ const g = ensureGroup(dir);
91
+ (g ? g.children : root).push({ label: titles.get(p.slug) ?? prettify(base), href });
92
+ }
93
+ }
94
+ return root;
95
+ }
96
+ function prettify(s) {
97
+ return s
98
+ .split(/[-_]/)
99
+ .filter(Boolean)
100
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
101
+ .join(" ");
102
+ }
103
+ /**
104
+ * Detect: is this directory rST-DOMINANT — has `.rst` files and no competing
105
+ * `.md` files? A stray `CHANGELOG.rst` / `README.rst` in a Markdown corpus
106
+ * must not make the whole tree read as reStructuredText (format-rst is
107
+ * registered before the generic dogsbay-md detector). Requires both a
108
+ * present `.rst` and the absence of `.md`.
109
+ */
110
+ export function isRstDominant(dir) {
111
+ if (!existsSync(dir))
112
+ return false;
113
+ try {
114
+ if (!statSync(dir).isDirectory())
115
+ return false;
116
+ }
117
+ catch {
118
+ return false;
119
+ }
120
+ let rst = false;
121
+ let md = false;
122
+ const SKIP = new Set(["_build", "_static", "_templates", "node_modules"]);
123
+ const walk = (d) => {
124
+ let entries;
125
+ try {
126
+ entries = readdirSync(d);
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ for (const name of entries) {
132
+ if (name.startsWith(".") || SKIP.has(name))
133
+ continue;
134
+ const full = join(d, name);
135
+ let st;
136
+ try {
137
+ st = statSync(full);
138
+ }
139
+ catch {
140
+ continue;
141
+ }
142
+ if (st.isDirectory()) {
143
+ if (walk(full))
144
+ return true; // early-out once md seen
145
+ }
146
+ else {
147
+ const lower = name.toLowerCase();
148
+ if (lower.endsWith(".md"))
149
+ md = true;
150
+ else if (lower.endsWith(".rst"))
151
+ rst = true;
152
+ if (md)
153
+ return true; // competing markdown → not rst-dominant
154
+ }
155
+ }
156
+ return md;
157
+ };
158
+ walk(dir);
159
+ return rst && !md;
160
+ }
161
+ //# sourceMappingURL=plain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plain.js","sourceRoot":"","sources":["../../src/loaders/plain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { NavItem } from "@dogsbay/types";
2
+ export interface SphinxDoc {
3
+ /** Root-relative slug (docname), e.g. "advanced/setup". */
4
+ slug: string;
5
+ /** Absolute path to the emitted docutils XML. */
6
+ xmlPath: string;
7
+ }
8
+ export interface SphinxLoadResult {
9
+ /** Source directory containing conf.py. */
10
+ srcDir: string;
11
+ /** Directory the XML was built into. */
12
+ outDir: string;
13
+ docs: SphinxDoc[];
14
+ nav: NavItem[];
15
+ /** Root document name (master_doc / root_doc), default "index". */
16
+ rootDoc: string;
17
+ }
18
+ /** Find the Sphinx source dir (the dir with conf.py) at or below `dir`. */
19
+ export declare function findSphinxSrc(dir: string): string | null;
20
+ /**
21
+ * Load a Sphinx project: build to XML, enumerate docs, extract nav.
22
+ * `outDir` defaults to a temp dir. Throws (via the sidecar) when Python /
23
+ * Sphinx is unavailable or the build fails.
24
+ */
25
+ export declare function loadSphinx(sourceDir: string, hrefPrefix?: string): SphinxLoadResult;
26
+ //# sourceMappingURL=sphinx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sphinx.d.ts","sourceRoot":"","sources":["../../src/loaders/sphinx.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,GAAG,EAAE,OAAO,EAAE,CAAC;IACf,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;CACjB;AA0BD,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxD;AAkHD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,SAAK,GAAG,gBAAgB,CAW/E"}