@jasonbelmonti/markdown-engine 0.1.0 → 1.0.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.
- package/CHANGELOG.md +30 -4
- package/README.md +87 -8
- package/dist/api/annotation-target-runtime.d.ts +30 -0
- package/dist/api/annotation-target-runtime.d.ts.map +1 -0
- package/dist/api/annotation-target-runtime.js +161 -0
- package/dist/api/annotation-target-runtime.js.map +1 -0
- package/dist/api/annotation-target-validation.d.ts +4 -0
- package/dist/api/annotation-target-validation.d.ts.map +1 -0
- package/dist/api/annotation-target-validation.js +414 -0
- package/dist/api/annotation-target-validation.js.map +1 -0
- package/dist/api/annotations.d.ts +4 -0
- package/dist/api/annotations.d.ts.map +1 -0
- package/dist/api/annotations.js +16 -0
- package/dist/api/annotations.js.map +1 -0
- package/dist/api/compatibility.d.ts +15 -0
- package/dist/api/compatibility.d.ts.map +1 -0
- package/dist/api/compatibility.js +57 -0
- package/dist/api/compatibility.js.map +1 -0
- package/dist/api/contracts.d.ts +3 -1
- package/dist/api/contracts.d.ts.map +1 -1
- package/dist/api/contracts.js +2 -0
- package/dist/api/contracts.js.map +1 -1
- package/dist/api/document-queries.d.ts +3 -0
- package/dist/api/document-queries.d.ts.map +1 -0
- package/dist/api/document-queries.js +89 -0
- package/dist/api/document-queries.js.map +1 -0
- package/dist/api/document.d.ts +135 -2
- package/dist/api/document.d.ts.map +1 -1
- package/dist/api/normalize.d.ts +2 -1
- package/dist/api/normalize.d.ts.map +1 -1
- package/dist/api/normalize.js.map +1 -1
- package/dist/api/serialize.d.ts +5 -1
- package/dist/api/serialize.d.ts.map +1 -1
- package/dist/api/serialize.js +5 -0
- package/dist/api/serialize.js.map +1 -1
- package/dist/cli/args.d.ts +14 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +101 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/document-version.d.ts +14 -0
- package/dist/cli/document-version.d.ts.map +1 -0
- package/dist/cli/document-version.js +32 -0
- package/dist/cli/document-version.js.map +1 -0
- package/dist/cli/files.d.ts +5 -0
- package/dist/cli/files.d.ts.map +1 -0
- package/dist/cli/files.js +30 -0
- package/dist/cli/files.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/normalize-markdown.d.ts +8 -0
- package/dist/cli/normalize-markdown.d.ts.map +1 -0
- package/dist/cli/normalize-markdown.js +10 -0
- package/dist/cli/normalize-markdown.js.map +1 -0
- package/dist/cli/run.d.ts +11 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +37 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/ir/document-derived-views.d.ts +4 -0
- package/dist/ir/document-derived-views.d.ts.map +1 -0
- package/dist/ir/document-derived-views.js +25 -0
- package/dist/ir/document-derived-views.js.map +1 -0
- package/dist/ir/document-link-views.d.ts +3 -0
- package/dist/ir/document-link-views.d.ts.map +1 -0
- package/dist/ir/document-link-views.js +24 -0
- package/dist/ir/document-link-views.js.map +1 -0
- package/dist/ir/document-list-views.d.ts +3 -0
- package/dist/ir/document-list-views.d.ts.map +1 -0
- package/dist/ir/document-list-views.js +38 -0
- package/dist/ir/document-list-views.js.map +1 -0
- package/dist/ir/document-node-walk.d.ts +5 -0
- package/dist/ir/document-node-walk.d.ts.map +1 -0
- package/dist/ir/document-node-walk.js +16 -0
- package/dist/ir/document-node-walk.js.map +1 -0
- package/dist/ir/document-sections.d.ts +3 -0
- package/dist/ir/document-sections.d.ts.map +1 -0
- package/dist/ir/document-sections.js +57 -0
- package/dist/ir/document-sections.js.map +1 -0
- package/dist/ir/document-table-views.d.ts +3 -0
- package/dist/ir/document-table-views.d.ts.map +1 -0
- package/dist/ir/document-table-views.js +31 -0
- package/dist/ir/document-table-views.js.map +1 -0
- package/dist/ir/document-targets.d.ts +10 -0
- package/dist/ir/document-targets.d.ts.map +1 -0
- package/dist/ir/document-targets.js +44 -0
- package/dist/ir/document-targets.js.map +1 -0
- package/dist/ir/document-text-spans.d.ts +3 -0
- package/dist/ir/document-text-spans.d.ts.map +1 -0
- package/dist/ir/document-text-spans.js +18 -0
- package/dist/ir/document-text-spans.js.map +1 -0
- package/dist/ir/document.d.ts.map +1 -1
- package/dist/ir/document.js +12 -8
- package/dist/ir/document.js.map +1 -1
- package/dist/ir/source-ranges.d.ts +8 -0
- package/dist/ir/source-ranges.d.ts.map +1 -0
- package/dist/ir/source-ranges.js +21 -0
- package/dist/ir/source-ranges.js.map +1 -0
- package/package.json +20 -2
package/dist/cli/run.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { serialize } from "../api/contracts.js";
|
|
2
|
+
import { cliUsage, parseCliArgs } from "./args.js";
|
|
3
|
+
import { compatibilityModeForDocumentVersion } from "./document-version.js";
|
|
4
|
+
import { readMarkdownFile } from "./files.js";
|
|
5
|
+
import { normalizeMarkdown } from "./normalize-markdown.js";
|
|
6
|
+
export async function runCli(input) {
|
|
7
|
+
const argsResult = parseCliArgs(input.args);
|
|
8
|
+
if (argsResult.kind === "help") {
|
|
9
|
+
input.stdout.write(cliUsage);
|
|
10
|
+
return 0;
|
|
11
|
+
}
|
|
12
|
+
if (argsResult.kind === "error") {
|
|
13
|
+
input.stderr.write(`${argsResult.message}\n\n${cliUsage}`);
|
|
14
|
+
return 2;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const markdown = await readMarkdownFile(argsResult.targetPath, input.cwd);
|
|
18
|
+
const normalizeResult = normalizeMarkdown({
|
|
19
|
+
documentVersion: argsResult.documentVersion,
|
|
20
|
+
markdown,
|
|
21
|
+
path: argsResult.targetPath,
|
|
22
|
+
});
|
|
23
|
+
input.stdout.write(`${serialize(normalizeResult, {
|
|
24
|
+
compatibilityMode: compatibilityModeForDocumentVersion(argsResult.documentVersion),
|
|
25
|
+
pretty: true,
|
|
26
|
+
})}\n`);
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
input.stderr.write(`${errorMessage(error)}\n`);
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function errorMessage(error) {
|
|
35
|
+
return error instanceof Error ? error.message : String(error);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,mCAAmC,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAa5D,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAkB;IAC7C,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAChC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1E,MAAM,eAAe,GAAG,iBAAiB,CAAC;YACxC,eAAe,EAAE,UAAU,CAAC,eAAe;YAC3C,QAAQ;YACR,IAAI,EAAE,UAAU,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,KAAK,CAChB,GAAG,SAAS,CAAC,eAAe,EAAE;YAC5B,iBAAiB,EAAE,mCAAmC,CACpD,UAAU,CAAC,eAAe,CAC3B;YACD,MAAM,EAAE,IAAI;SACb,CAAC,IAAI,CACP,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { EngineDocument } from "../api/document.js";
|
|
2
|
+
import { type DocumentViewBuildOptions } from "./document-targets.js";
|
|
3
|
+
export declare function buildDocumentViews(document: EngineDocument, options: DocumentViewBuildOptions): EngineDocument;
|
|
4
|
+
//# sourceMappingURL=document-derived-views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-derived-views.d.ts","sourceRoot":"","sources":["../../src/ir/document-derived-views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKzD,OAAO,EAEL,KAAK,wBAAwB,EAE9B,MAAM,uBAAuB,CAAC;AAG/B,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,wBAAwB,GAChC,cAAc,CAoBhB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { collectLinks } from "./document-link-views.js";
|
|
2
|
+
import { collectLists } from "./document-list-views.js";
|
|
3
|
+
import { buildSections } from "./document-sections.js";
|
|
4
|
+
import { collectTables } from "./document-table-views.js";
|
|
5
|
+
import { targetFor, withNodeMetadata, } from "./document-targets.js";
|
|
6
|
+
import { collectTextSpans } from "./document-text-spans.js";
|
|
7
|
+
export function buildDocumentViews(document, options) {
|
|
8
|
+
const children = document.children.map((node, index) => withNodeMetadata(node, [index], options));
|
|
9
|
+
return {
|
|
10
|
+
...document,
|
|
11
|
+
version: "1.0.0",
|
|
12
|
+
target: targetFor("document", [], document.sourceRange),
|
|
13
|
+
children,
|
|
14
|
+
compatibility: {
|
|
15
|
+
mode: "default",
|
|
16
|
+
reason: "1.0 document contract",
|
|
17
|
+
},
|
|
18
|
+
sections: buildSections(children),
|
|
19
|
+
textSpans: collectTextSpans(children),
|
|
20
|
+
tables: collectTables(children),
|
|
21
|
+
lists: collectLists(children),
|
|
22
|
+
links: collectLinks(children),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=document-derived-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-derived-views.js","sourceRoot":"","sources":["../../src/ir/document-derived-views.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,SAAS,EAET,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,UAAU,kBAAkB,CAChC,QAAwB,EACxB,OAAiC;IAEjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrD,gBAAgB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CACzC,CAAC;IAEF,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC;QACvD,QAAQ;QACR,aAAa,EAAE;YACb,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,uBAAuB;SAChC;QACD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;QACjC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC;QACrC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC;QAC/B,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;QAC7B,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-link-views.d.ts","sourceRoot":"","sources":["../../src/ir/document-link-views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGjE,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,UAAU,EAAE,CAwBhF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { flatMapNodes } from "./document-node-walk.js";
|
|
2
|
+
export function collectLinks(nodes) {
|
|
3
|
+
return flatMapNodes(nodes, (node) => {
|
|
4
|
+
if (node.type !== "link" ||
|
|
5
|
+
node.target === undefined ||
|
|
6
|
+
typeof node.attributes?.url !== "string") {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
target: node.target,
|
|
12
|
+
url: node.attributes.url,
|
|
13
|
+
text: node.text ?? "",
|
|
14
|
+
...(typeof node.attributes.title === "string"
|
|
15
|
+
? { title: node.attributes.title }
|
|
16
|
+
: {}),
|
|
17
|
+
...(node.sourceRange !== undefined
|
|
18
|
+
? { sourceRange: node.sourceRange }
|
|
19
|
+
: {}),
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=document-link-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-link-views.js","sourceRoot":"","sources":["../../src/ir/document-link-views.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,UAAU,YAAY,CAAC,KAA4B;IACvD,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QAClC,IACE,IAAI,CAAC,IAAI,KAAK,MAAM;YACpB,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,QAAQ,EACxC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG;gBACxB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBACrB,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,QAAQ;oBAC3C,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;oBAClC,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;oBAChC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;oBACnC,CAAC,CAAC,EAAE,CAAC;aACR;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-list-views.d.ts","sourceRoot":"","sources":["../../src/ir/document-list-views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EACX,MAAM,oBAAoB,CAAC;AAG5B,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,UAAU,EAAE,CAEhF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { requireNodeTarget } from "./document-targets.js";
|
|
2
|
+
export function collectLists(nodes) {
|
|
3
|
+
return collectListsAtDepth(nodes, 0);
|
|
4
|
+
}
|
|
5
|
+
function collectListsAtDepth(nodes, depth) {
|
|
6
|
+
return nodes.flatMap((node) => {
|
|
7
|
+
const childDepth = node.type === "list" ? depth + 1 : depth;
|
|
8
|
+
const nestedLists = collectListsAtDepth(node.children ?? [], childDepth);
|
|
9
|
+
if (node.type !== "list" || node.target === undefined) {
|
|
10
|
+
return nestedLists;
|
|
11
|
+
}
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
target: node.target,
|
|
15
|
+
ordered: node.attributes?.ordered === true,
|
|
16
|
+
...(typeof node.attributes?.start === "number"
|
|
17
|
+
? { start: node.attributes.start }
|
|
18
|
+
: {}),
|
|
19
|
+
items: listItems(node, depth),
|
|
20
|
+
},
|
|
21
|
+
...nestedLists,
|
|
22
|
+
];
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function listItems(list, depth) {
|
|
26
|
+
return (list.children ?? [])
|
|
27
|
+
.filter((node) => node.type === "listItem" && node.target !== undefined)
|
|
28
|
+
.map((item, itemIndex) => ({
|
|
29
|
+
target: requireNodeTarget(item),
|
|
30
|
+
itemIndex,
|
|
31
|
+
depth,
|
|
32
|
+
...(typeof item.attributes?.checked === "boolean"
|
|
33
|
+
? { checked: item.attributes.checked }
|
|
34
|
+
: {}),
|
|
35
|
+
...(item.sourceRange !== undefined ? { sourceRange: item.sourceRange } : {}),
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=document-list-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-list-views.js","sourceRoot":"","sources":["../../src/ir/document-list-views.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,UAAU,YAAY,CAAC,KAA4B;IACvD,OAAO,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA4B,EAC5B,KAAa;IAEb,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5D,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtD,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,OAAO;YACL;gBACE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI;gBAC1C,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,QAAQ;oBAC5C,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;oBAClC,CAAC,CAAC,EAAE,CAAC;gBACP,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;aAC9B;YACD,GAAG,WAAW;SACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,KAAa;IAChD,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;SACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;SACvE,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAC/B,SAAS;QACT,KAAK;QACL,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,SAAS;YAC/C,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACtC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EngineNode } from "../api/document.js";
|
|
2
|
+
export declare function flatMapNodes<T>(nodes: readonly EngineNode[], callback: (node: EngineNode) => readonly T[]): T[];
|
|
3
|
+
export declare function flattenNodes(nodes: readonly EngineNode[]): EngineNode[];
|
|
4
|
+
export declare function nodeText(node: EngineNode): string;
|
|
5
|
+
//# sourceMappingURL=document-node-walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-node-walk.d.ts","sourceRoot":"","sources":["../../src/ir/document-node-walk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,wBAAgB,YAAY,CAAC,CAAC,EAC5B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC,EAAE,GAC3C,CAAC,EAAE,CAKL;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAEvE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAMjD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function flatMapNodes(nodes, callback) {
|
|
2
|
+
return nodes.flatMap((node) => [
|
|
3
|
+
...callback(node),
|
|
4
|
+
...flatMapNodes(node.children ?? [], callback),
|
|
5
|
+
]);
|
|
6
|
+
}
|
|
7
|
+
export function flattenNodes(nodes) {
|
|
8
|
+
return flatMapNodes(nodes, (node) => [node]);
|
|
9
|
+
}
|
|
10
|
+
export function nodeText(node) {
|
|
11
|
+
if (node.text !== undefined) {
|
|
12
|
+
return node.text;
|
|
13
|
+
}
|
|
14
|
+
return (node.children ?? []).map((child) => nodeText(child)).join("");
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=document-node-walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-node-walk.js","sourceRoot":"","sources":["../../src/ir/document-node-walk.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAC1B,KAA4B,EAC5B,QAA4C;IAE5C,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,GAAG,QAAQ,CAAC,IAAI,CAAC;QACjB,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,CAAC;KAC/C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA4B;IACvD,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-sections.d.ts","sourceRoot":"","sources":["../../src/ir/document-sections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EAEd,MAAM,oBAAoB,CAAC;AAa5B,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,SAAS,UAAU,EAAE,GAC9B,SAAS,aAAa,EAAE,CAsC1B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { requireNodeTarget } from "./document-targets.js";
|
|
2
|
+
export function buildSections(children) {
|
|
3
|
+
const sections = [];
|
|
4
|
+
const stack = [];
|
|
5
|
+
for (const node of children) {
|
|
6
|
+
if (isHeading(node)) {
|
|
7
|
+
const depth = headingDepth(node);
|
|
8
|
+
let currentSection = stack.at(-1);
|
|
9
|
+
while (currentSection !== undefined && currentSection.depth >= depth) {
|
|
10
|
+
stack.pop();
|
|
11
|
+
currentSection = stack.at(-1);
|
|
12
|
+
}
|
|
13
|
+
const section = sectionForHeading(node, depth, currentSection);
|
|
14
|
+
currentSection?.childSections.push(section.target);
|
|
15
|
+
sections.push(section);
|
|
16
|
+
stack.push(section);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (node.target !== undefined) {
|
|
20
|
+
stack.at(-1)?.bodyTargets.push(node.target);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return sections.map((section) => ({
|
|
24
|
+
target: section.target,
|
|
25
|
+
headingTarget: section.headingTarget,
|
|
26
|
+
...(section.parentSection !== undefined
|
|
27
|
+
? { parentSection: section.parentSection }
|
|
28
|
+
: {}),
|
|
29
|
+
depth: section.depth,
|
|
30
|
+
title: section.title,
|
|
31
|
+
bodyTargets: section.bodyTargets,
|
|
32
|
+
childSections: section.childSections,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
function isHeading(node) {
|
|
36
|
+
return node.type === "heading" && node.target !== undefined;
|
|
37
|
+
}
|
|
38
|
+
function headingDepth(node) {
|
|
39
|
+
return typeof node.attributes?.depth === "number" ? node.attributes.depth : 0;
|
|
40
|
+
}
|
|
41
|
+
function sectionForHeading(node, depth, parentSection) {
|
|
42
|
+
const headingTarget = requireNodeTarget(node);
|
|
43
|
+
return {
|
|
44
|
+
target: {
|
|
45
|
+
...headingTarget,
|
|
46
|
+
id: `section:${headingTarget.id}`,
|
|
47
|
+
nodeType: "section",
|
|
48
|
+
},
|
|
49
|
+
headingTarget,
|
|
50
|
+
...(parentSection !== undefined ? { parentSection: parentSection.target } : {}),
|
|
51
|
+
depth,
|
|
52
|
+
title: node.text ?? "",
|
|
53
|
+
bodyTargets: [],
|
|
54
|
+
childSections: [],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=document-sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-sections.js","sourceRoot":"","sources":["../../src/ir/document-sections.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAY1D,MAAM,UAAU,aAAa,CAC3B,QAA+B;IAE/B,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAElC,OAAO,cAAc,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBACrE,KAAK,CAAC,GAAG,EAAE,CAAC;gBACZ,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;YAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YAE/D,cAAc,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;YAC1C,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB;IACjC,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;AAC9D,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB;IACpC,OAAO,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAgB,EAChB,KAAa,EACb,aAAyC;IAEzC,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO;QACL,MAAM,EAAE;YACN,GAAG,aAAa;YAChB,EAAE,EAAE,WAAW,aAAa,CAAC,EAAE,EAAE;YACjC,QAAQ,EAAE,SAAS;SACpB;QACD,aAAa;QACb,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,KAAK;QACL,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;QACtB,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,EAAE;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-table-views.d.ts","sourceRoot":"","sources":["../../src/ir/document-table-views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEZ,MAAM,oBAAoB,CAAC;AAI5B,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,WAAW,EAAE,CAalF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { flatMapNodes, nodeText } from "./document-node-walk.js";
|
|
2
|
+
import { requireNodeTarget } from "./document-targets.js";
|
|
3
|
+
export function collectTables(nodes) {
|
|
4
|
+
return flatMapNodes(nodes, (node) => {
|
|
5
|
+
if (node.type !== "table" || node.target === undefined) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
return [
|
|
9
|
+
{
|
|
10
|
+
target: node.target,
|
|
11
|
+
cells: tableCells(node),
|
|
12
|
+
},
|
|
13
|
+
];
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function tableCells(table) {
|
|
17
|
+
const rows = (table.children ?? []).filter((node) => node.type === "tableRow");
|
|
18
|
+
return rows.flatMap((row, rowIndex) => (row.children ?? [])
|
|
19
|
+
.filter((node) => node.type === "tableCell" && node.target !== undefined)
|
|
20
|
+
.map((cell, columnIndex) => ({
|
|
21
|
+
target: requireNodeTarget(cell),
|
|
22
|
+
text: nodeText(cell),
|
|
23
|
+
rowIndex,
|
|
24
|
+
columnIndex,
|
|
25
|
+
header: rowIndex === 0,
|
|
26
|
+
...(cell.sourceRange !== undefined
|
|
27
|
+
? { sourceRange: cell.sourceRange }
|
|
28
|
+
: {}),
|
|
29
|
+
})));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=document-table-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-table-views.js","sourceRoot":"","sources":["../../src/ir/document-table-views.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,UAAU,aAAa,CAAC,KAA4B;IACxD,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;aACxB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAE/E,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CACpC,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;SACjB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;SACxE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3B,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;QACpB,QAAQ;QACR,WAAW;QACX,MAAM,EAAE,QAAQ,KAAK,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;YAChC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;YACnC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC,CACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SourceRange } from "../api/diagnostics.js";
|
|
2
|
+
import type { EngineNode, EngineNodeTarget } from "../api/document.js";
|
|
3
|
+
export interface DocumentViewBuildOptions {
|
|
4
|
+
preserveSourceLocations: boolean;
|
|
5
|
+
source: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function withNodeMetadata(node: EngineNode, path: readonly number[], options: DocumentViewBuildOptions): EngineNode;
|
|
8
|
+
export declare function targetFor(nodeType: string, path: readonly number[], sourceRange: SourceRange | undefined): EngineNodeTarget;
|
|
9
|
+
export declare function requireNodeTarget(node: EngineNode): EngineNodeTarget;
|
|
10
|
+
//# sourceMappingURL=document-targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-targets.d.ts","sourceRoot":"","sources":["../../src/ir/document-targets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EACV,UAAU,EAEV,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,wBAAwB;IACvC,uBAAuB,EAAE,OAAO,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAChC,UAAU,CAaZ;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,EAAE,WAAW,GAAG,SAAS,GACnC,gBAAgB,CAYlB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAMpE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { cloneSourceRange, sourceOffsetBounds } from "./source-ranges.js";
|
|
2
|
+
export function withNodeMetadata(node, path, options) {
|
|
3
|
+
const children = (node.children ?? []).map((child, index) => withNodeMetadata(child, [...path, index], options));
|
|
4
|
+
const target = targetFor(node.type, path, node.sourceRange);
|
|
5
|
+
const source = sourceSliceForRange(node.sourceRange, options);
|
|
6
|
+
return {
|
|
7
|
+
...node,
|
|
8
|
+
target,
|
|
9
|
+
...(source !== undefined ? { source } : {}),
|
|
10
|
+
...(children.length > 0 ? { children } : {}),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function targetFor(nodeType, path, sourceRange) {
|
|
14
|
+
const idPath = path.length === 0 ? "root" : path.join(".");
|
|
15
|
+
return {
|
|
16
|
+
kind: "node",
|
|
17
|
+
id: `node:${idPath}:${nodeType}`,
|
|
18
|
+
path: [...path],
|
|
19
|
+
nodeType,
|
|
20
|
+
...(sourceRange !== undefined
|
|
21
|
+
? { sourceRange: cloneSourceRange(sourceRange) }
|
|
22
|
+
: {}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function requireNodeTarget(node) {
|
|
26
|
+
if (node.target === undefined) {
|
|
27
|
+
throw new Error(`Expected ${node.type} node to have a target.`);
|
|
28
|
+
}
|
|
29
|
+
return node.target;
|
|
30
|
+
}
|
|
31
|
+
function sourceSliceForRange(sourceRange, options) {
|
|
32
|
+
if (!options.preserveSourceLocations || sourceRange === undefined) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
const offsets = sourceOffsetBounds(sourceRange, options.source.length);
|
|
36
|
+
if (offsets === undefined) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
range: cloneSourceRange(sourceRange),
|
|
41
|
+
text: options.source.slice(offsets.startOffset, offsets.endOffset),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=document-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-targets.js","sourceRoot":"","sources":["../../src/ir/document-targets.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAO1E,MAAM,UAAU,gBAAgB,CAC9B,IAAgB,EAChB,IAAuB,EACvB,OAAiC;IAEjC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAC1D,gBAAgB,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CACnD,CAAC;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE9D,OAAO;QACL,GAAG,IAAI;QACP,MAAM;QACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,QAAgB,EAChB,IAAuB,EACvB,WAAoC;IAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3D,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,QAAQ,MAAM,IAAI,QAAQ,EAAE;QAChC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QACf,QAAQ;QACR,GAAG,CAAC,WAAW,KAAK,SAAS;YAC3B,CAAC,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAChD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,yBAAyB,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAC1B,WAAoC,EACpC,OAAiC;IAEjC,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,gBAAgB,CAAC,WAAW,CAAC;QACpC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;KACnE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-text-spans.d.ts","sourceRoot":"","sources":["../../src/ir/document-text-spans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGrE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,SAAS,cAAc,EAAE,CAgB3B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { flatMapNodes } from "./document-node-walk.js";
|
|
2
|
+
export function collectTextSpans(nodes) {
|
|
3
|
+
return flatMapNodes(nodes, (node) => {
|
|
4
|
+
if (node.text === undefined || node.target === undefined) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
target: node.target,
|
|
10
|
+
text: node.text,
|
|
11
|
+
...(node.sourceRange !== undefined
|
|
12
|
+
? { sourceRange: node.sourceRange }
|
|
13
|
+
: {}),
|
|
14
|
+
},
|
|
15
|
+
];
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=document-text-spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-text-spans.js","sourceRoot":"","sources":["../../src/ir/document-text-spans.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAC9B,KAA4B;IAE5B,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;oBAChC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;oBACnC,CAAC,CAAC,EAAE,CAAC;aACR;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/ir/document.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/ir/document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKtD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,gBAAqB,GAC7B,cAAc,CA6BhB"}
|
package/dist/ir/document.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { hasOwnProperty, isPlainRecord } from "../internal/plain-record.js";
|
|
2
|
+
import { buildDocumentViews } from "./document-derived-views.js";
|
|
3
|
+
import { cloneSourceRange } from "./source-ranges.js";
|
|
2
4
|
export function normalizeParsedMarkdown(parsed, options = {}) {
|
|
3
5
|
const preserveSourceLocations = options.preserveSourceLocations ?? true;
|
|
4
6
|
const document = parsed.document;
|
|
5
7
|
const path = document.path ?? parsed.path;
|
|
6
|
-
|
|
8
|
+
const version = options.documentVersion ?? document.version;
|
|
9
|
+
const normalizedDocument = {
|
|
7
10
|
kind: "markdown-document",
|
|
8
|
-
version
|
|
11
|
+
version,
|
|
9
12
|
...(path !== undefined ? { path } : {}),
|
|
10
13
|
...(hasOwnProperty(parsed, "frontmatter")
|
|
11
14
|
? { frontmatter: cloneUnknown(parsed.frontmatter) }
|
|
@@ -15,6 +18,13 @@ export function normalizeParsedMarkdown(parsed, options = {}) {
|
|
|
15
18
|
: {}),
|
|
16
19
|
children: document.children.map((node) => normalizeNode(node, preserveSourceLocations)),
|
|
17
20
|
};
|
|
21
|
+
if (version === "1.0.0") {
|
|
22
|
+
return buildDocumentViews(normalizedDocument, {
|
|
23
|
+
preserveSourceLocations,
|
|
24
|
+
source: parsed.markdown,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return normalizedDocument;
|
|
18
28
|
}
|
|
19
29
|
function normalizeNode(node, preserveSourceLocations) {
|
|
20
30
|
return {
|
|
@@ -47,10 +57,4 @@ function cloneUnknown(value) {
|
|
|
47
57
|
}
|
|
48
58
|
return value;
|
|
49
59
|
}
|
|
50
|
-
function cloneSourceRange(sourceRange) {
|
|
51
|
-
return {
|
|
52
|
-
start: { ...sourceRange.start },
|
|
53
|
-
end: { ...sourceRange.end },
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
60
|
//# sourceMappingURL=document.js.map
|
package/dist/ir/document.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/ir/document.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/ir/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SourceRange } from "../api/diagnostics.js";
|
|
2
|
+
export interface SourceOffsetBounds {
|
|
3
|
+
startOffset: number;
|
|
4
|
+
endOffset: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function cloneSourceRange(sourceRange: SourceRange): SourceRange;
|
|
7
|
+
export declare function sourceOffsetBounds(sourceRange: SourceRange | undefined, sourceLength: number): SourceOffsetBounds | undefined;
|
|
8
|
+
//# sourceMappingURL=source-ranges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-ranges.d.ts","sourceRoot":"","sources":["../../src/ir/source-ranges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAKtE;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,YAAY,EAAE,MAAM,GACnB,kBAAkB,GAAG,SAAS,CAiBhC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function cloneSourceRange(sourceRange) {
|
|
2
|
+
return {
|
|
3
|
+
start: { ...sourceRange.start },
|
|
4
|
+
end: { ...sourceRange.end },
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
export function sourceOffsetBounds(sourceRange, sourceLength) {
|
|
8
|
+
const startOffset = sourceRange?.start.offset;
|
|
9
|
+
const endOffset = sourceRange?.end.offset;
|
|
10
|
+
if (typeof startOffset !== "number" ||
|
|
11
|
+
typeof endOffset !== "number" ||
|
|
12
|
+
!Number.isInteger(startOffset) ||
|
|
13
|
+
!Number.isInteger(endOffset) ||
|
|
14
|
+
startOffset < 0 ||
|
|
15
|
+
endOffset < startOffset ||
|
|
16
|
+
endOffset > sourceLength) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return { startOffset, endOffset };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=source-ranges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-ranges.js","sourceRoot":"","sources":["../../src/ir/source-ranges.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,gBAAgB,CAAC,WAAwB;IACvD,OAAO;QACL,KAAK,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE;QAC/B,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAoC,EACpC,YAAoB;IAEpB,MAAM,WAAW,GAAG,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;IAC9C,MAAM,SAAS,GAAG,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC;IAE1C,IACE,OAAO,WAAW,KAAK,QAAQ;QAC/B,OAAO,SAAS,KAAK,QAAQ;QAC7B,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;QAC9B,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;QAC5B,WAAW,GAAG,CAAC;QACf,SAAS,GAAG,WAAW;QACvB,SAAS,GAAG,YAAY,EACxB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jasonbelmonti/markdown-engine",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Deterministic Markdown parsing and validation engine package.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"markdown-engine": "dist/cli/index.js"
|
|
9
|
+
},
|
|
7
10
|
"repository": {
|
|
8
11
|
"type": "git",
|
|
9
12
|
"url": "git+https://github.com/jasonbelmonti/markdown-engine.git"
|
|
@@ -41,8 +44,23 @@
|
|
|
41
44
|
"prepublishOnly": "npm run release:verify",
|
|
42
45
|
"release:verify": "npm run typecheck && npm test && node scripts/check-boundaries.mjs && npm run build && node scripts/prove-repeatability.mjs --runs 10 && npm run release:check-clean",
|
|
43
46
|
"release:check-clean": "git diff --check HEAD -- && git diff --exit-code HEAD --",
|
|
47
|
+
"snapshots:update:parser": "npm run build && vitest run tests/parser-fixtures.test.ts -u \"--exclude=.worktrees/**\"",
|
|
48
|
+
"snapshots:update:rules": "npm run build && vitest run tests/rules.test.ts -u \"--exclude=.worktrees/**\"",
|
|
49
|
+
"snapshots:update:rich-ir": "npm run build && vitest run tests/rich-ir-targets.test.ts tests/rich-ir-queries.test.ts -u \"--exclude=.worktrees/**\"",
|
|
50
|
+
"snapshots:update:serialization": "npm run build && vitest run tests/serialization-repeatability.test.ts tests/boundary-inspection.test.ts -u \"--exclude=.worktrees/**\"",
|
|
51
|
+
"test:rich-ir:proving": "npm run build && vitest run tests/rich-ir-proving.test.ts \"--exclude=.worktrees/**\"",
|
|
52
|
+
"test:rich-ir:contract": "npm run build && tsc -p tsconfig.document-contract.json && vitest run tests/document-contract.test.ts \"--exclude=.worktrees/**\"",
|
|
53
|
+
"test:rich-ir:targets": "npm run build && vitest run tests/rich-ir-targets.test.ts \"--exclude=.worktrees/**\"",
|
|
54
|
+
"test:rich-ir:queries": "npm run build && vitest run tests/rich-ir-queries.test.ts \"--exclude=.worktrees/**\"",
|
|
55
|
+
"test:rich-ir:annotations": "npm run build && vitest run tests/rich-ir-annotations.test.ts \"--exclude=.worktrees/**\"",
|
|
56
|
+
"test:rich-ir:compat": "npm run build && vitest run tests/rich-ir-compat.test.ts \"--exclude=.worktrees/**\"",
|
|
57
|
+
"test:rich-ir:repeatability": "npm run build && vitest run tests/rich-ir-repeatability.test.ts \"--exclude=.worktrees/**\"",
|
|
58
|
+
"test:rich-ir:downstream": "npm run build && vitest run tests/rich-ir-downstream.test.ts \"--exclude=.worktrees/**\"",
|
|
59
|
+
"audit:rich-ir-boundary": "node scripts/check-boundaries.mjs",
|
|
60
|
+
"docs:rich-ir-contract": "node scripts/check-rich-ir-contract-docs.mjs",
|
|
44
61
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
45
|
-
"test": "npm run build && vitest run \"--exclude=.worktrees/**\""
|
|
62
|
+
"test": "npm run build && vitest run \"--exclude=.worktrees/**\"",
|
|
63
|
+
"test:snapshots": "npm run build && vitest run tests/parser-fixtures.test.ts tests/rules.test.ts tests/rich-ir-targets.test.ts tests/rich-ir-queries.test.ts tests/serialization-repeatability.test.ts \"--exclude=.worktrees/**\""
|
|
46
64
|
},
|
|
47
65
|
"engines": {
|
|
48
66
|
"node": "^20.19.0 || >=22.12.0"
|