@mdanai/sdk 0.5.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/LICENSE +21 -0
- package/README.md +126 -0
- package/dist/core/errors.d.ts +14 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +13 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +69 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/markdown-body.d.ts +3 -0
- package/dist/core/markdown-body.d.ts.map +1 -0
- package/dist/core/markdown-body.js +65 -0
- package/dist/core/markdown-body.js.map +1 -0
- package/dist/core/markdown-renderer.d.ts +5 -0
- package/dist/core/markdown-renderer.d.ts.map +1 -0
- package/dist/core/markdown-renderer.js +75 -0
- package/dist/core/markdown-renderer.js.map +1 -0
- package/dist/core/negotiate.d.ts +3 -0
- package/dist/core/negotiate.d.ts.map +1 -0
- package/dist/core/negotiate.js +63 -0
- package/dist/core/negotiate.js.map +1 -0
- package/dist/core/parse/anchors.d.ts +2 -0
- package/dist/core/parse/anchors.d.ts.map +1 -0
- package/dist/core/parse/anchors.js +26 -0
- package/dist/core/parse/anchors.js.map +1 -0
- package/dist/core/parse/block-parser.d.ts +3 -0
- package/dist/core/parse/block-parser.d.ts.map +1 -0
- package/dist/core/parse/block-parser.js +117 -0
- package/dist/core/parse/block-parser.js.map +1 -0
- package/dist/core/parse/executable-block.d.ts +6 -0
- package/dist/core/parse/executable-block.d.ts.map +1 -0
- package/dist/core/parse/executable-block.js +48 -0
- package/dist/core/parse/executable-block.js.map +1 -0
- package/dist/core/parse/frontmatter.d.ts +7 -0
- package/dist/core/parse/frontmatter.d.ts.map +1 -0
- package/dist/core/parse/frontmatter.js +45 -0
- package/dist/core/parse/frontmatter.js.map +1 -0
- package/dist/core/serialize.d.ts +4 -0
- package/dist/core/serialize.d.ts.map +1 -0
- package/dist/core/serialize.js +126 -0
- package/dist/core/serialize.js.map +1 -0
- package/dist/core/types.d.ts +67 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validate.d.ts +3 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +107 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/elements/components/mdan-action.d.ts +6 -0
- package/dist/elements/components/mdan-action.d.ts.map +1 -0
- package/dist/elements/components/mdan-action.js +34 -0
- package/dist/elements/components/mdan-action.js.map +1 -0
- package/dist/elements/components/mdan-block.d.ts +9 -0
- package/dist/elements/components/mdan-block.d.ts.map +1 -0
- package/dist/elements/components/mdan-block.js +36 -0
- package/dist/elements/components/mdan-block.js.map +1 -0
- package/dist/elements/components/mdan-error.d.ts +9 -0
- package/dist/elements/components/mdan-error.d.ts.map +1 -0
- package/dist/elements/components/mdan-error.js +36 -0
- package/dist/elements/components/mdan-error.js.map +1 -0
- package/dist/elements/components/mdan-field.d.ts +6 -0
- package/dist/elements/components/mdan-field.d.ts.map +1 -0
- package/dist/elements/components/mdan-field.js +35 -0
- package/dist/elements/components/mdan-field.js.map +1 -0
- package/dist/elements/components/mdan-form.d.ts +6 -0
- package/dist/elements/components/mdan-form.d.ts.map +1 -0
- package/dist/elements/components/mdan-form.js +22 -0
- package/dist/elements/components/mdan-form.js.map +1 -0
- package/dist/elements/components/mdan-page.d.ts +9 -0
- package/dist/elements/components/mdan-page.d.ts.map +1 -0
- package/dist/elements/components/mdan-page.js +46 -0
- package/dist/elements/components/mdan-page.js.map +1 -0
- package/dist/elements/index.d.ts +3 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/index.js +3 -0
- package/dist/elements/index.js.map +1 -0
- package/dist/elements/mount.d.ts +11 -0
- package/dist/elements/mount.d.ts.map +1 -0
- package/dist/elements/mount.js +436 -0
- package/dist/elements/mount.js.map +1 -0
- package/dist/elements/register.d.ts +2 -0
- package/dist/elements/register.d.ts.map +1 -0
- package/dist/elements/register.js +27 -0
- package/dist/elements/register.js.map +1 -0
- package/dist/elements/theme.d.ts +2 -0
- package/dist/elements/theme.d.ts.map +1 -0
- package/dist/elements/theme.js +13 -0
- package/dist/elements/theme.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/server/bun.d.ts +19 -0
- package/dist/server/bun.d.ts.map +1 -0
- package/dist/server/bun.js +214 -0
- package/dist/server/bun.js.map +1 -0
- package/dist/server/content-type.d.ts +3 -0
- package/dist/server/content-type.d.ts.map +1 -0
- package/dist/server/content-type.js +5 -0
- package/dist/server/content-type.js.map +1 -0
- package/dist/server/hosted-app.d.ts +35 -0
- package/dist/server/hosted-app.d.ts.map +1 -0
- package/dist/server/hosted-app.js +113 -0
- package/dist/server/hosted-app.js.map +1 -0
- package/dist/server/html-render.d.ts +21 -0
- package/dist/server/html-render.d.ts.map +1 -0
- package/dist/server/html-render.js +360 -0
- package/dist/server/html-render.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +6 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/node-runtime.d.ts +2 -0
- package/dist/server/node-runtime.d.ts.map +1 -0
- package/dist/server/node-runtime.js +2 -0
- package/dist/server/node-runtime.js.map +1 -0
- package/dist/server/node.d.ts +23 -0
- package/dist/server/node.d.ts.map +1 -0
- package/dist/server/node.js +210 -0
- package/dist/server/node.js.map +1 -0
- package/dist/server/result.d.ts +7 -0
- package/dist/server/result.d.ts.map +1 -0
- package/dist/server/result.js +26 -0
- package/dist/server/result.js.map +1 -0
- package/dist/server/router.d.ts +12 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +24 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/runtime.d.ts +16 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +532 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/session.d.ts +5 -0
- package/dist/server/session.d.ts.map +1 -0
- package/dist/server/session.js +18 -0
- package/dist/server/session.js.map +1 -0
- package/dist/server/types.d.ts +72 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/web/headless.d.ts +32 -0
- package/dist/web/headless.d.ts.map +1 -0
- package/dist/web/headless.js +391 -0
- package/dist/web/headless.js.map +1 -0
- package/dist/web/index.d.ts +2 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +2 -0
- package/dist/web/index.js.map +1 -0
- package/package.json +81 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 MDAN
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# @mdanai/sdk
|
|
2
|
+
|
|
3
|
+
`@mdanai/sdk` is the reference SDK for building apps with MDAN.
|
|
4
|
+
|
|
5
|
+
It officially supports Node and Bun through a shared server runtime plus runtime-specific host adapters.
|
|
6
|
+
|
|
7
|
+
MDAN is a Markdown-first page and interaction format. `@mdanai/sdk` gives you the parser, server runtime, browser runtime, and default UI for working with it.
|
|
8
|
+
|
|
9
|
+
## Why MDAN
|
|
10
|
+
|
|
11
|
+
Plain Markdown is good for content, but weak at expressing interaction.
|
|
12
|
+
|
|
13
|
+
Once a page needs inputs, actions, partial updates, or navigation, that structure usually gets pushed into templates, frontend state, and custom API glue.
|
|
14
|
+
|
|
15
|
+
MDAN makes that interaction layer explicit while keeping the page source readable for humans, AI agents, and agentic systems.
|
|
16
|
+
|
|
17
|
+
In MDAN, page content is not only presentation. It is also shared prompt context for AI agents.
|
|
18
|
+
|
|
19
|
+
The same Markdown source can carry:
|
|
20
|
+
|
|
21
|
+
- content for humans to read
|
|
22
|
+
- state and task context for AI agents to interpret
|
|
23
|
+
- explicit interaction structure for both sides to continue from
|
|
24
|
+
|
|
25
|
+
The default server runtime keeps Markdown canonical while also supporting explicit `auto` `GET` dependencies. Server hosts resolve `auto` before returning results, so agents and browsers observe the same final state. See the protocol/runtime docs for the full rules.
|
|
26
|
+
|
|
27
|
+
## Use Cases
|
|
28
|
+
|
|
29
|
+
- skills apps with guided inputs and step-by-step actions for non-technical users
|
|
30
|
+
- agent apps that agents can read, enter, and continue over HTTP
|
|
31
|
+
- interactive docs, runbooks, and internal tools with embedded actions
|
|
32
|
+
- shared pages where humans and agents work from the same content and next-step actions
|
|
33
|
+
- agentic workflows where the server returns both updated results and the next actions to take
|
|
34
|
+
- custom hosted interfaces built with React, Vue, or your own server stack
|
|
35
|
+
|
|
36
|
+
## Syntax
|
|
37
|
+
|
|
38
|
+
The starter page keeps Markdown content and the interaction block in the same file:
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
---
|
|
42
|
+
title: "Agent App"
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# Agent App
|
|
46
|
+
|
|
47
|
+
Use this starter as the smallest end-to-end MDAN app.
|
|
48
|
+
|
|
49
|
+
<!-- mdan:block main -->
|
|
50
|
+
|
|
51
|
+
BLOCK main {
|
|
52
|
+
INPUT text required -> message
|
|
53
|
+
GET "/list" -> load_messages auto
|
|
54
|
+
GET "/list" -> refresh label:"Refresh"
|
|
55
|
+
POST "/post" (message) -> submit label:"Submit"
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Quick Start
|
|
60
|
+
|
|
61
|
+
Node starter:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npm create mdan@latest agent-app
|
|
65
|
+
cd agent-app
|
|
66
|
+
npm install
|
|
67
|
+
npm start
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Bun starter:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
bunx create-mdan agent-app
|
|
74
|
+
cd agent-app
|
|
75
|
+
bun install
|
|
76
|
+
bun start
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
You can also force either runtime with `--runtime node` or `--runtime bun`.
|
|
80
|
+
|
|
81
|
+
## Runtime Adapters
|
|
82
|
+
|
|
83
|
+
Shared server modeling stays on `@mdanai/sdk/server`:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import { createHostedApp } from "@mdanai/sdk/server";
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Then choose the host adapter for your runtime:
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import { createHost } from "@mdanai/sdk/server/node";
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { createHost } from "@mdanai/sdk/server/bun";
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Docs
|
|
100
|
+
|
|
101
|
+
- [Getting Started](https://docs.mdan.ai/getting-started)
|
|
102
|
+
- [Understanding MDAN](https://docs.mdan.ai/understanding-mdan)
|
|
103
|
+
- [SDK Overview](https://docs.mdan.ai/sdk)
|
|
104
|
+
- [Custom Rendering](https://docs.mdan.ai/custom-rendering)
|
|
105
|
+
- [Web Runtime](https://docs.mdan.ai/web-runtime)
|
|
106
|
+
- [API Reference](https://docs.mdan.ai/api-reference)
|
|
107
|
+
|
|
108
|
+
## Browser Debugging
|
|
109
|
+
|
|
110
|
+
If you want to inspect raw browser-side MDAN traffic while using the default UI or your own custom renderer, enable debug messages on the headless host:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { createHeadlessHost } from "@mdanai/sdk/web";
|
|
114
|
+
|
|
115
|
+
const host = createHeadlessHost({
|
|
116
|
+
root: document,
|
|
117
|
+
debugMessages: true
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
When enabled:
|
|
122
|
+
|
|
123
|
+
- the browser records outgoing and incoming MDAN messages
|
|
124
|
+
- each record keeps the raw Markdown payload
|
|
125
|
+
- messages are available at `window.__MDAN_DEBUG__.messages`
|
|
126
|
+
- the default `elements` UI also shows a small debug drawer in the browser
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface MdanSourceLocation {
|
|
2
|
+
line: number;
|
|
3
|
+
column: number;
|
|
4
|
+
}
|
|
5
|
+
declare class MdanBaseError extends Error {
|
|
6
|
+
readonly location: MdanSourceLocation | undefined;
|
|
7
|
+
constructor(message: string, location?: MdanSourceLocation);
|
|
8
|
+
}
|
|
9
|
+
export declare class MdanParseError extends MdanBaseError {
|
|
10
|
+
}
|
|
11
|
+
export declare class MdanValidationError extends MdanBaseError {
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,aAAc,SAAQ,KAAK;IAC/B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,CAAC;gBAEtC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB;CAK3D;AAED,qBAAa,cAAe,SAAQ,aAAa;CAAG;AAEpD,qBAAa,mBAAoB,SAAQ,aAAa;CAAG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class MdanBaseError extends Error {
|
|
2
|
+
location;
|
|
3
|
+
constructor(message, location) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = new.target.name;
|
|
6
|
+
this.location = location;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class MdanParseError extends MdanBaseError {
|
|
10
|
+
}
|
|
11
|
+
export class MdanValidationError extends MdanBaseError {
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAKA,MAAM,aAAc,SAAQ,KAAK;IACtB,QAAQ,CAAiC;IAElD,YAAY,OAAe,EAAE,QAA6B;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,aAAa;CAAG;AAEpD,MAAM,OAAO,mBAAoB,SAAQ,aAAa;CAAG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MdanComposedPage, MdanPage } from "./types.js";
|
|
2
|
+
export * from "./errors.js";
|
|
3
|
+
export * from "./markdown-renderer.js";
|
|
4
|
+
export * from "./markdown-body.js";
|
|
5
|
+
export * from "./negotiate.js";
|
|
6
|
+
export * from "./serialize.js";
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
export * from "./validate.js";
|
|
9
|
+
export interface ComposePageOptions {
|
|
10
|
+
blocks?: Record<string, string>;
|
|
11
|
+
visibleBlocks?: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function parsePage(source: string): MdanPage;
|
|
14
|
+
export declare function parseAndValidatePage(source: string): MdanPage;
|
|
15
|
+
export declare function composePage(source: string, options?: ComposePageOptions): MdanComposedPage;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAgB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3E,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAgBlD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAE7D;AAaD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,gBAAgB,CAS9F"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { MdanParseError } from "./errors.js";
|
|
2
|
+
import { parseAnchors } from "./parse/anchors.js";
|
|
3
|
+
import { parseBlocks } from "./parse/block-parser.js";
|
|
4
|
+
import { extractExecutableBlock } from "./parse/executable-block.js";
|
|
5
|
+
import { parseFrontmatter } from "./parse/frontmatter.js";
|
|
6
|
+
import { validatePage } from "./validate.js";
|
|
7
|
+
export * from "./errors.js";
|
|
8
|
+
export * from "./markdown-renderer.js";
|
|
9
|
+
export * from "./markdown-body.js";
|
|
10
|
+
export * from "./negotiate.js";
|
|
11
|
+
export * from "./serialize.js";
|
|
12
|
+
export * from "./types.js";
|
|
13
|
+
export * from "./validate.js";
|
|
14
|
+
export function parsePage(source) {
|
|
15
|
+
const { frontmatter, body } = parseFrontmatter(source);
|
|
16
|
+
const { markdown, executableContent } = extractExecutableBlock(body);
|
|
17
|
+
try {
|
|
18
|
+
return {
|
|
19
|
+
frontmatter,
|
|
20
|
+
markdown,
|
|
21
|
+
blocks: parseBlocks(executableContent),
|
|
22
|
+
blockAnchors: parseAnchors(markdown)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof Error) {
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
throw new MdanParseError("Unknown parse failure.");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function parseAndValidatePage(source) {
|
|
33
|
+
return validatePage(parsePage(source));
|
|
34
|
+
}
|
|
35
|
+
function attachFragmentHelper(page) {
|
|
36
|
+
const composed = page;
|
|
37
|
+
Object.defineProperty(composed, "fragment", {
|
|
38
|
+
value(blockName) {
|
|
39
|
+
return resolveFragmentForBlock(composed, blockName);
|
|
40
|
+
},
|
|
41
|
+
enumerable: false
|
|
42
|
+
});
|
|
43
|
+
return composed;
|
|
44
|
+
}
|
|
45
|
+
export function composePage(source, options = {}) {
|
|
46
|
+
const page = parseAndValidatePage(source);
|
|
47
|
+
if (options.blocks) {
|
|
48
|
+
page.blockContent = { ...options.blocks };
|
|
49
|
+
}
|
|
50
|
+
if (options.visibleBlocks) {
|
|
51
|
+
page.visibleBlockNames = [...options.visibleBlocks];
|
|
52
|
+
}
|
|
53
|
+
return attachFragmentHelper(page);
|
|
54
|
+
}
|
|
55
|
+
function resolveFragmentForBlock(page, blockName) {
|
|
56
|
+
const block = page.blocks.find((candidate) => candidate.name === blockName);
|
|
57
|
+
if (!block) {
|
|
58
|
+
throw new Error(`Unknown block "${blockName}".`);
|
|
59
|
+
}
|
|
60
|
+
const markdown = page.blockContent?.[blockName];
|
|
61
|
+
if (!markdown?.trim()) {
|
|
62
|
+
throw new Error(`Block "${blockName}" has no composed markdown content.`);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
markdown,
|
|
66
|
+
blocks: [block]
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-body.d.ts","sourceRoot":"","sources":["../../src/core/markdown-body.ts"],"names":[],"mappings":"AA+CA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBtE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI5E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { MdanParseError } from "./errors.js";
|
|
2
|
+
function splitMarkdownBody(body) {
|
|
3
|
+
const parts = [];
|
|
4
|
+
let current = "";
|
|
5
|
+
let inString = false;
|
|
6
|
+
let escaped = false;
|
|
7
|
+
for (const char of body) {
|
|
8
|
+
if (escaped) {
|
|
9
|
+
current += char;
|
|
10
|
+
escaped = false;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (char === "\\") {
|
|
14
|
+
current += char;
|
|
15
|
+
escaped = true;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (char === "\"") {
|
|
19
|
+
current += char;
|
|
20
|
+
inString = !inString;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (!inString && (char === "," || char === "\n")) {
|
|
24
|
+
const trimmed = current.trim();
|
|
25
|
+
if (trimmed) {
|
|
26
|
+
parts.push(trimmed);
|
|
27
|
+
}
|
|
28
|
+
current = "";
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
current += char;
|
|
32
|
+
}
|
|
33
|
+
const trimmed = current.trim();
|
|
34
|
+
if (trimmed) {
|
|
35
|
+
parts.push(trimmed);
|
|
36
|
+
}
|
|
37
|
+
return parts;
|
|
38
|
+
}
|
|
39
|
+
export function parseMarkdownBody(body) {
|
|
40
|
+
const result = {};
|
|
41
|
+
for (const part of splitMarkdownBody(body)) {
|
|
42
|
+
const match = part.match(/^([a-zA-Z_][\w-]*)\s*:\s*(.+)$/);
|
|
43
|
+
if (!match) {
|
|
44
|
+
throw new MdanParseError(`Invalid markdown body line: ${part}`);
|
|
45
|
+
}
|
|
46
|
+
let value;
|
|
47
|
+
try {
|
|
48
|
+
value = JSON.parse(match[2].trim());
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new MdanParseError(`Invalid markdown body line: ${part}`);
|
|
52
|
+
}
|
|
53
|
+
if (typeof value !== "string") {
|
|
54
|
+
throw new MdanParseError(`Invalid markdown body line: ${part}`);
|
|
55
|
+
}
|
|
56
|
+
result[match[1]] = value;
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
export function serializeMarkdownBody(values) {
|
|
61
|
+
return Object.entries(values)
|
|
62
|
+
.map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
|
|
63
|
+
.join(", ");
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=markdown-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-body.js","sourceRoot":"","sources":["../../src/core/markdown-body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,IAAI,IAAI,CAAC;YAChB,OAAO,GAAG,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,IAAI,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,IAAI,CAAC;YAChB,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,cAAc,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,cAAc,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,cAAc,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA8B;IAClE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-renderer.d.ts","sourceRoot":"","sources":["../../src/core/markdown-renderer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAoED,eAAO,MAAM,qBAAqB,EAAE,oBAiBnC,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
function escapeHtml(value) {
|
|
2
|
+
return value
|
|
3
|
+
.replaceAll("&", "&")
|
|
4
|
+
.replaceAll("<", "<")
|
|
5
|
+
.replaceAll(">", ">")
|
|
6
|
+
.replaceAll('"', """);
|
|
7
|
+
}
|
|
8
|
+
function parseRenderableMarkdown(markdown) {
|
|
9
|
+
const lines = markdown.split("\n");
|
|
10
|
+
const visible = [];
|
|
11
|
+
let inFrontmatter = false;
|
|
12
|
+
let frontmatterHandled = false;
|
|
13
|
+
let inCode = false;
|
|
14
|
+
for (const line of lines) {
|
|
15
|
+
const trimmed = line.trim();
|
|
16
|
+
if (!frontmatterHandled && trimmed === "---") {
|
|
17
|
+
inFrontmatter = !inFrontmatter;
|
|
18
|
+
if (!inFrontmatter) {
|
|
19
|
+
frontmatterHandled = true;
|
|
20
|
+
}
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (inFrontmatter) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (trimmed.startsWith("```")) {
|
|
27
|
+
inCode = !inCode;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (inCode || trimmed.startsWith("<!-- mdan:block")) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
visible.push(line);
|
|
34
|
+
}
|
|
35
|
+
return visible
|
|
36
|
+
.join("\n")
|
|
37
|
+
.split(/\n{2,}/)
|
|
38
|
+
.map((chunk) => chunk.trim())
|
|
39
|
+
.filter(Boolean)
|
|
40
|
+
.map((chunk) => {
|
|
41
|
+
const rows = chunk.split("\n").map((row) => row.trim()).filter(Boolean);
|
|
42
|
+
if (rows.every((row) => row.startsWith("- "))) {
|
|
43
|
+
return {
|
|
44
|
+
type: "ul",
|
|
45
|
+
items: rows.map((row) => row.slice(2).trim())
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (chunk.startsWith("# ")) {
|
|
49
|
+
return { type: "h1", text: chunk.slice(2).trim() };
|
|
50
|
+
}
|
|
51
|
+
if (chunk.startsWith("## ")) {
|
|
52
|
+
return { type: "h2", text: chunk.slice(3).trim() };
|
|
53
|
+
}
|
|
54
|
+
return { type: "p", text: rows.join(" ") };
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export const basicMarkdownRenderer = {
|
|
58
|
+
render(markdown) {
|
|
59
|
+
return parseRenderableMarkdown(markdown)
|
|
60
|
+
.map((node) => {
|
|
61
|
+
if (node.type === "h1") {
|
|
62
|
+
return `<h1>${escapeHtml(node.text)}</h1>`;
|
|
63
|
+
}
|
|
64
|
+
if (node.type === "h2") {
|
|
65
|
+
return `<h2>${escapeHtml(node.text)}</h2>`;
|
|
66
|
+
}
|
|
67
|
+
if (node.type === "p") {
|
|
68
|
+
return `<p>${escapeHtml(node.text)}</p>`;
|
|
69
|
+
}
|
|
70
|
+
return `<ul>${node.items.map((item) => `<li>${escapeHtml(item)}</li>`).join("")}</ul>`;
|
|
71
|
+
})
|
|
72
|
+
.join("\n");
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=markdown-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-renderer.js","sourceRoot":"","sources":["../../src/core/markdown-renderer.ts"],"names":[],"mappings":"AAUA,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,kBAAkB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7C,aAAa,GAAG,CAAC,aAAa,CAAC;YAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,MAAM,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,OAAO;SACX,IAAI,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO;gBACL,IAAI,EAAE,IAAa;gBACnB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC9C,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,IAAa,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,IAAa,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,GAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAyB;IACzD,MAAM,CAAC,QAAgB;QACrB,OAAO,uBAAuB,CAAC,QAAQ,CAAC;aACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7C,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7C,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACtB,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3C,CAAC;YACD,OAAO,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;QACzF,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiate.d.ts","sourceRoot":"","sources":["../../src/core/negotiate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAuBrD,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,kBAAkB,CA0DjF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
function parseAcceptHeader(acceptHeader) {
|
|
2
|
+
return acceptHeader
|
|
3
|
+
.split(",")
|
|
4
|
+
.map((part) => part.trim())
|
|
5
|
+
.filter(Boolean)
|
|
6
|
+
.map((part) => {
|
|
7
|
+
const [mediaType = "", ...params] = part.split(";").map((value) => value.trim());
|
|
8
|
+
const qParam = params.find((value) => value.startsWith("q="));
|
|
9
|
+
const q = qParam ? Number(qParam.slice(2)) : 1;
|
|
10
|
+
return {
|
|
11
|
+
mediaType: mediaType.toLowerCase(),
|
|
12
|
+
q: Number.isFinite(q) ? q : 1
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export function negotiateRepresentation(acceptHeader) {
|
|
17
|
+
if (!acceptHeader) {
|
|
18
|
+
return "html";
|
|
19
|
+
}
|
|
20
|
+
const accepted = parseAcceptHeader(acceptHeader);
|
|
21
|
+
const weightByRepresentation = {
|
|
22
|
+
"event-stream": 0,
|
|
23
|
+
markdown: 0,
|
|
24
|
+
html: 0
|
|
25
|
+
};
|
|
26
|
+
for (const entry of accepted) {
|
|
27
|
+
if (entry.q <= 0) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (entry.mediaType === "text/event-stream") {
|
|
31
|
+
weightByRepresentation["event-stream"] = Math.max(weightByRepresentation["event-stream"], entry.q);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (entry.mediaType === "text/markdown") {
|
|
35
|
+
weightByRepresentation.markdown = Math.max(weightByRepresentation.markdown, entry.q);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (["text/html", "text/*", "*/*"].includes(entry.mediaType)) {
|
|
39
|
+
weightByRepresentation.html = Math.max(weightByRepresentation.html, entry.q);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const candidates = Object.entries(weightByRepresentation).filter(([, weight]) => weight > 0);
|
|
43
|
+
if (candidates.length === 0) {
|
|
44
|
+
return "not-acceptable";
|
|
45
|
+
}
|
|
46
|
+
const tieBreaker = {
|
|
47
|
+
"event-stream": 3,
|
|
48
|
+
markdown: 2,
|
|
49
|
+
html: 1
|
|
50
|
+
};
|
|
51
|
+
candidates.sort((left, right) => {
|
|
52
|
+
if (right[1] !== left[1]) {
|
|
53
|
+
return right[1] - left[1];
|
|
54
|
+
}
|
|
55
|
+
return tieBreaker[right[0]] - tieBreaker[left[0]];
|
|
56
|
+
});
|
|
57
|
+
const winner = candidates[0]?.[0];
|
|
58
|
+
if (!winner) {
|
|
59
|
+
return "not-acceptable";
|
|
60
|
+
}
|
|
61
|
+
return winner;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=negotiate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiate.js","sourceRoot":"","sources":["../../src/core/negotiate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchors.d.ts","sourceRoot":"","sources":["../../../src/core/parse/anchors.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BvD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MdanParseError } from "../errors.js";
|
|
2
|
+
const anchorPattern = /<!--\s*mdan:block\s+([a-zA-Z_][\w-]*)\s*-->/g;
|
|
3
|
+
export function parseAnchors(markdown) {
|
|
4
|
+
const anchors = [];
|
|
5
|
+
const lines = markdown.split("\n");
|
|
6
|
+
let insideFence = false;
|
|
7
|
+
for (const line of lines) {
|
|
8
|
+
if (/^```/.test(line.trim())) {
|
|
9
|
+
insideFence = !insideFence;
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
if (insideFence) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const matches = [...line.matchAll(anchorPattern)];
|
|
16
|
+
for (const match of matches) {
|
|
17
|
+
const name = match[1];
|
|
18
|
+
if (!name) {
|
|
19
|
+
throw new MdanParseError("Encountered malformed block anchor.");
|
|
20
|
+
}
|
|
21
|
+
anchors.push(name);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return anchors;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=anchors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchors.js","sourceRoot":"","sources":["../../../src/core/parse/anchors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAErE,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,cAAc,CAAC,qCAAqC,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parse/block-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAA4B,MAAM,aAAa,CAAC;AA6EvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CA0DvD"}
|