@dogsbay/format-myst 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/README.md +61 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +79 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders/load.d.ts +31 -0
- package/dist/loaders/load.d.ts.map +1 -0
- package/dist/loaders/load.js +265 -0
- package/dist/loaders/load.js.map +1 -0
- package/dist/loaders/toc.d.ts +19 -0
- package/dist/loaders/toc.d.ts.map +1 -0
- package/dist/loaders/toc.js +154 -0
- package/dist/loaders/toc.js.map +1 -0
- package/dist/parse.d.ts +15 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +37 -0
- package/dist/parse.js.map +1 -0
- package/dist/translate.d.ts +53 -0
- package/dist/translate.d.ts.map +1 -0
- package/dist/translate.js +678 -0
- package/dist/translate.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Explicit MyST tables of contents:
|
|
3
|
+
* - `_toc.yml` — Jupyter Book (`format: jb-book`, root/parts/chapters/sections)
|
|
4
|
+
* - `myst.yml` — mystmd project config (`project.toc`, file/title/children)
|
|
5
|
+
*
|
|
6
|
+
* Both resolve to `NavItem[]`. Doc references (extensionless or `.md`) are
|
|
7
|
+
* turned into slugs + hrefs via the caller-supplied `slugToHref`.
|
|
8
|
+
*/
|
|
9
|
+
import { parse as parseYaml } from "yaml";
|
|
10
|
+
/** Normalize a MyST doc reference to a root-relative slug. */
|
|
11
|
+
export function refToSlug(ref) {
|
|
12
|
+
let p = String(ref).replace(/\\/g, "/").trim();
|
|
13
|
+
p = p.replace(/\.(md|ipynb|rst|myst)$/i, "");
|
|
14
|
+
p = p.replace(/^\.\//, "").replace(/^\//, "");
|
|
15
|
+
if (p === "README" || p === "index")
|
|
16
|
+
return "index";
|
|
17
|
+
p = p.replace(/\/(README|index)$/i, "/index");
|
|
18
|
+
return p;
|
|
19
|
+
}
|
|
20
|
+
function prettify(slug) {
|
|
21
|
+
const base = slug.slice(slug.lastIndexOf("/") + 1);
|
|
22
|
+
return base
|
|
23
|
+
.split(/[-_]/)
|
|
24
|
+
.filter(Boolean)
|
|
25
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
26
|
+
.join(" ");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse a Jupyter Book `_toc.yml`. Returns null when the YAML isn't a
|
|
30
|
+
* jb-book TOC (so the caller can fall back to another nav source).
|
|
31
|
+
*/
|
|
32
|
+
export function parseJupyterToc(yamlText, titles, slugToHref) {
|
|
33
|
+
let doc;
|
|
34
|
+
try {
|
|
35
|
+
doc = parseYaml(yamlText);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
if (!doc || typeof doc !== "object")
|
|
41
|
+
return null;
|
|
42
|
+
const d = doc;
|
|
43
|
+
if (typeof d.root !== "string")
|
|
44
|
+
return null;
|
|
45
|
+
const slugs = [];
|
|
46
|
+
const label = (slug) => titles.get(slug) ?? prettify(slug);
|
|
47
|
+
const leaf = (ref) => {
|
|
48
|
+
const slug = refToSlug(ref);
|
|
49
|
+
slugs.push(slug);
|
|
50
|
+
return { label: label(slug), href: slugToHref(slug) };
|
|
51
|
+
};
|
|
52
|
+
// A "chapter"/"section" entry: { file, sections?: [...], title? }.
|
|
53
|
+
const entryToNav = (raw) => {
|
|
54
|
+
if (!raw || typeof raw !== "object")
|
|
55
|
+
return null;
|
|
56
|
+
const e = raw;
|
|
57
|
+
if (typeof e.file !== "string" && typeof e.url !== "string" && typeof e.glob !== "string") {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
if (typeof e.url === "string") {
|
|
61
|
+
return { label: typeof e.title === "string" ? e.title : e.url, href: e.url };
|
|
62
|
+
}
|
|
63
|
+
if (typeof e.glob === "string")
|
|
64
|
+
return null; // globs need a filesystem walk; caller handles orphans
|
|
65
|
+
const slug = refToSlug(e.file);
|
|
66
|
+
slugs.push(slug);
|
|
67
|
+
const node = {
|
|
68
|
+
label: typeof e.title === "string" ? e.title : label(slug),
|
|
69
|
+
href: slugToHref(slug),
|
|
70
|
+
};
|
|
71
|
+
const subs = (e.sections ?? e.chapters);
|
|
72
|
+
if (Array.isArray(subs)) {
|
|
73
|
+
const children = subs.map(entryToNav).filter((n) => n !== null);
|
|
74
|
+
if (children.length)
|
|
75
|
+
node.children = children;
|
|
76
|
+
}
|
|
77
|
+
return node;
|
|
78
|
+
};
|
|
79
|
+
const nav = [];
|
|
80
|
+
// Root is the landing page — not usually a nav entry itself, but record it.
|
|
81
|
+
slugs.push(refToSlug(d.root));
|
|
82
|
+
if (Array.isArray(d.parts)) {
|
|
83
|
+
for (const part of d.parts) {
|
|
84
|
+
if (!part || typeof part !== "object")
|
|
85
|
+
continue;
|
|
86
|
+
const p = part;
|
|
87
|
+
const caption = typeof p.caption === "string" ? p.caption : "Section";
|
|
88
|
+
const chapters = Array.isArray(p.chapters) ? p.chapters : [];
|
|
89
|
+
const children = chapters.map(entryToNav).filter((n) => n !== null);
|
|
90
|
+
nav.push({ label: caption, children });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (Array.isArray(d.chapters)) {
|
|
94
|
+
for (const ch of d.chapters) {
|
|
95
|
+
const n = entryToNav(ch);
|
|
96
|
+
if (n)
|
|
97
|
+
nav.push(n);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { nav, slugs };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse a mystmd `myst.yml` `project.toc`. Returns null when there's no
|
|
104
|
+
* usable `project.toc`.
|
|
105
|
+
*/
|
|
106
|
+
export function parseMystYmlToc(yamlText, titles, slugToHref) {
|
|
107
|
+
let doc;
|
|
108
|
+
try {
|
|
109
|
+
doc = parseYaml(yamlText);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
const project = doc?.project;
|
|
115
|
+
const toc = project?.toc;
|
|
116
|
+
if (!Array.isArray(toc))
|
|
117
|
+
return null;
|
|
118
|
+
const slugs = [];
|
|
119
|
+
const label = (slug) => titles.get(slug) ?? prettify(slug);
|
|
120
|
+
const entryToNav = (raw) => {
|
|
121
|
+
if (!raw || typeof raw !== "object")
|
|
122
|
+
return null;
|
|
123
|
+
const e = raw;
|
|
124
|
+
if (typeof e.file === "string") {
|
|
125
|
+
const slug = refToSlug(e.file);
|
|
126
|
+
slugs.push(slug);
|
|
127
|
+
const node = {
|
|
128
|
+
label: typeof e.title === "string" ? e.title : label(slug),
|
|
129
|
+
href: slugToHref(slug),
|
|
130
|
+
};
|
|
131
|
+
if (Array.isArray(e.children)) {
|
|
132
|
+
const kids = e.children.map(entryToNav).filter((n) => n !== null);
|
|
133
|
+
if (kids.length)
|
|
134
|
+
node.children = kids;
|
|
135
|
+
}
|
|
136
|
+
return node;
|
|
137
|
+
}
|
|
138
|
+
if (typeof e.url === "string") {
|
|
139
|
+
return { label: typeof e.title === "string" ? e.title : e.url, href: e.url };
|
|
140
|
+
}
|
|
141
|
+
if (typeof e.title === "string") {
|
|
142
|
+
// A titled group with children but no file of its own.
|
|
143
|
+
const node = { label: e.title, children: [] };
|
|
144
|
+
if (Array.isArray(e.children)) {
|
|
145
|
+
node.children = e.children.map(entryToNav).filter((n) => n !== null);
|
|
146
|
+
}
|
|
147
|
+
return node;
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
};
|
|
151
|
+
const nav = toc.map(entryToNav).filter((n) => n !== null);
|
|
152
|
+
return { nav, slugs };
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=toc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toc.js","sourceRoot":"","sources":["../../src/loaders/toc.ts"],"names":[],"mappings":"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"}
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TreeNode } from "@dogsbay/types";
|
|
2
|
+
import { type TranslateLedgerEntry } from "./translate.js";
|
|
3
|
+
export interface ParseMystResult {
|
|
4
|
+
tree: TreeNode[];
|
|
5
|
+
frontmatter: Record<string, unknown>;
|
|
6
|
+
/** Frontmatter + translated body — the editable Dogsbay-MD for migrate. */
|
|
7
|
+
markdown: string;
|
|
8
|
+
/** Translated body only (no frontmatter). */
|
|
9
|
+
body: string;
|
|
10
|
+
ledger: TranslateLedgerEntry[];
|
|
11
|
+
/** In-body `{toctree}` references, in document order. */
|
|
12
|
+
toctree: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function parseMyst(src: string): ParseMystResult;
|
|
15
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,yDAAyD;IACzD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAID,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAmBtD"}
|
package/dist/parse.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MyST page → { tree, frontmatter, markdown, body, ledger, toctree }.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline (mirrors format-gitbook):
|
|
5
|
+
* 1. Split YAML frontmatter off the body so the body transform can't
|
|
6
|
+
* disturb it.
|
|
7
|
+
* 2. Translate the MyST body → Dogsbay-MD text (`mystToDogsbayMd`).
|
|
8
|
+
* 3. Parse the translated Dogsbay-MD with the canonical `dogsbayMdToTree`
|
|
9
|
+
* — MyST is a near-superset of CommonMark, so once the directives /
|
|
10
|
+
* roles / targets are rewritten, its own parser defines correctness
|
|
11
|
+
* and yields the TreeNode with zero new node types.
|
|
12
|
+
*
|
|
13
|
+
* `markdown` (frontmatter + translated body) is what `migrate-myst` writes
|
|
14
|
+
* to disk. `toctree` carries any in-body `{toctree}` entries so the loader
|
|
15
|
+
* can build nav.
|
|
16
|
+
*/
|
|
17
|
+
import { dogsbayMdToTree } from "@dogsbay/format-dogsbay-md";
|
|
18
|
+
import { mystToDogsbayMd } from "./translate.js";
|
|
19
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n?/;
|
|
20
|
+
export function parseMyst(src) {
|
|
21
|
+
const normalized = src.replace(/\r\n?/g, "\n");
|
|
22
|
+
const fmMatch = normalized.match(FRONTMATTER_RE);
|
|
23
|
+
const fmBlock = fmMatch ? fmMatch[0] : "";
|
|
24
|
+
const body = fmMatch ? normalized.slice(fmMatch[0].length) : normalized;
|
|
25
|
+
const { markdown: translatedBody, ledger, toctree } = mystToDogsbayMd(body);
|
|
26
|
+
const markdown = fmBlock ? `${fmBlock.replace(/\n?$/, "\n")}\n${translatedBody}` : translatedBody;
|
|
27
|
+
const { tree, frontmatter } = dogsbayMdToTree(markdown);
|
|
28
|
+
return {
|
|
29
|
+
tree,
|
|
30
|
+
frontmatter: frontmatter ?? {},
|
|
31
|
+
markdown,
|
|
32
|
+
body: translatedBody,
|
|
33
|
+
ledger,
|
|
34
|
+
toctree,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAA6B,MAAM,gBAAgB,CAAC;AAc5E,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAElD,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAExE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,cAAc,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IAElG,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAExD,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,WAAW,IAAI,EAAE;QAC9B,QAAQ;QACR,IAAI,EAAE,cAAc;QACpB,MAAM;QACN,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MyST Markdown → Dogsbay-MD text translator.
|
|
3
|
+
*
|
|
4
|
+
* MyST (Markedly Structured Text) is CommonMark + Sphinx-style
|
|
5
|
+
* **directives**, **roles**, and **targets**. Dogsbay-MD is CommonMark +
|
|
6
|
+
* `:::` block directives + `{attrs}`. So — exactly like the GitBook and
|
|
7
|
+
* AsciiDoc pipelines — translation is largely a delimiter rewrite: prose,
|
|
8
|
+
* lists, tables, and normal fenced code pass through untouched; only the
|
|
9
|
+
* MyST-specific constructs are rewritten, after which the canonical
|
|
10
|
+
* `dogsbayMdToTree` parser is the definition of correctness (zero new
|
|
11
|
+
* TreeNode types).
|
|
12
|
+
*
|
|
13
|
+
* Three MyST construct classes:
|
|
14
|
+
* - **Directives** — a fenced block, either ```` ```{name} ```` (backtick)
|
|
15
|
+
* or `:::{name}` (colon fence). An optional argument follows the name on
|
|
16
|
+
* the opener line; `:key: value` option lines may follow; then a blank
|
|
17
|
+
* line and the body. These map to `:::` block directives (callouts,
|
|
18
|
+
* tabs, grid, details, figure, math, code) and can NEST — emitted with
|
|
19
|
+
* DEPTH-AWARE fence lengths (outer gets more colons), mirroring
|
|
20
|
+
* format-dogsbay-md's serializer and format-gitbook's translator.
|
|
21
|
+
* - **Roles** — inline ``{name}`content` `` → a link / math / `<sub>` /
|
|
22
|
+
* code span / emphasis, per role.
|
|
23
|
+
* - **Targets** — `(label)=` on its own line before a block → a `{#label}`
|
|
24
|
+
* anchor on the following heading (or a bare `<a id>` otherwise), so
|
|
25
|
+
* `{ref}`label`` cross-references resolve.
|
|
26
|
+
*
|
|
27
|
+
* Fence-aware throughout: MyST syntax inside a plain fenced code block is
|
|
28
|
+
* literal and never rewritten. Anything unmapped is recorded in the
|
|
29
|
+
* returned `ledger` (never silent loss — same discipline as format-dita /
|
|
30
|
+
* format-gitbook) and passed through as best-effort text.
|
|
31
|
+
*
|
|
32
|
+
* See plans/format-myst.md.
|
|
33
|
+
*/
|
|
34
|
+
export interface TranslateLedgerEntry {
|
|
35
|
+
/** The MyST construct that wasn't cleanly mapped. */
|
|
36
|
+
construct: string;
|
|
37
|
+
/** Human-readable note on how it was handled. */
|
|
38
|
+
note: string;
|
|
39
|
+
/** 1-based source line, when known. */
|
|
40
|
+
line?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface TranslateResult {
|
|
43
|
+
markdown: string;
|
|
44
|
+
ledger: TranslateLedgerEntry[];
|
|
45
|
+
/**
|
|
46
|
+
* `toctree` entries collected from the body, in document order, so a
|
|
47
|
+
* loader can build nav without re-parsing. Each is a raw reference
|
|
48
|
+
* (a doc path or glob) exactly as authored.
|
|
49
|
+
*/
|
|
50
|
+
toctree: string[];
|
|
51
|
+
}
|
|
52
|
+
export declare function mystToDogsbayMd(src: string): TranslateResult;
|
|
53
|
+
//# sourceMappingURL=translate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B;;;;OAIG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAwID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAM5D"}
|