@dversum/mcp-server 2.2.0 → 2.4.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/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +23 -2
- package/dist/src/client.js.map +1 -1
- package/dist/src/tools/pages.d.ts.map +1 -1
- package/dist/src/tools/pages.js +19 -6
- package/dist/src/tools/pages.js.map +1 -1
- package/dist/src/utils/markdown.d.ts +20 -0
- package/dist/src/utils/markdown.d.ts.map +1 -0
- package/dist/src/utils/markdown.js +249 -0
- package/dist/src/utils/markdown.js.map +1 -0
- package/package.json +1 -1
package/dist/src/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAKlD,OAAO,CAAC,QAAQ;YAYF,OAAO;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAKlD,OAAO,CAAC,QAAQ;YAYF,OAAO;IAmEf,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1C"}
|
package/dist/src/client.js
CHANGED
|
@@ -24,11 +24,32 @@ export class DversumClient {
|
|
|
24
24
|
Authorization: `Bearer ${token}`,
|
|
25
25
|
"Content-Type": "application/json",
|
|
26
26
|
};
|
|
27
|
-
|
|
27
|
+
// 30s hard timeout so a slow / unreachable backend surfaces as a clean
|
|
28
|
+
// error to the AI client (and lets the user retry) instead of hanging the
|
|
29
|
+
// MCP request until the host's own multi-minute timeout kicks in.
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
const timer = setTimeout(() => controller.abort(), 30_000);
|
|
32
|
+
const fetchOptions = {
|
|
33
|
+
method,
|
|
34
|
+
headers,
|
|
35
|
+
signal: controller.signal,
|
|
36
|
+
};
|
|
28
37
|
if (options?.body !== undefined) {
|
|
29
38
|
fetchOptions.body = JSON.stringify(options.body);
|
|
30
39
|
}
|
|
31
|
-
|
|
40
|
+
let response;
|
|
41
|
+
try {
|
|
42
|
+
response = await fetch(url, fetchOptions);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
46
|
+
throw new Error(`Request to ${method} ${path} timed out after 30s. The dVersum backend may be slow or unreachable.`);
|
|
47
|
+
}
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
clearTimeout(timer);
|
|
52
|
+
}
|
|
32
53
|
if (!response.ok) {
|
|
33
54
|
let errorMessage = `API error ${response.status}: ${response.statusText}`;
|
|
34
55
|
try {
|
package/dist/src/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,OAAO,aAAa;IAChB,OAAO,CAAS;IAChB,aAAa,CAAS;IAE9B,YAAY,OAAe,EAAE,aAAqB;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,MAA+B;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,OAGC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC;QAEtD,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../../src/tools/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../../src/tools/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,aAAa,QA4HtB"}
|
package/dist/src/tools/pages.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { toTiptapDoc } from "../utils/markdown.js";
|
|
2
3
|
export function registerPageTools(server, client) {
|
|
3
4
|
server.tool("list_pages", "List all pages (Notion-like documents).", {
|
|
4
5
|
page: z.number().optional().describe("Page number (0-based)"),
|
|
@@ -22,22 +23,34 @@ export function registerPageTools(server, client) {
|
|
|
22
23
|
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
23
24
|
};
|
|
24
25
|
});
|
|
25
|
-
server.tool("create_page", "Create a new page.", {
|
|
26
|
+
server.tool("create_page", "Create a new page. Optionally provide initial `content` as MARKDOWN — it will be converted to the editor's internal format.", {
|
|
26
27
|
title: z.string().describe("Page title"),
|
|
27
28
|
parent_id: z.string().optional().describe("Parent page UUID (for nesting)"),
|
|
28
29
|
project_id: z.string().optional().describe("Project UUID (for project-scoped pages)"),
|
|
29
30
|
icon: z.string().optional().describe("Page icon (emoji)"),
|
|
31
|
+
content: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Optional initial page content as MARKDOWN (e.g. '# Title\\n\\nParagraph with **bold**'). Do NOT send Tiptap JSON or stringified JSON — write plain Markdown."),
|
|
30
35
|
}, async (input) => {
|
|
31
|
-
const
|
|
36
|
+
const { content, ...meta } = input;
|
|
37
|
+
const created = await client.post("/pages", meta);
|
|
38
|
+
if (content && created?.id) {
|
|
39
|
+
const doc = toTiptapDoc(content);
|
|
40
|
+
await client.put(`/pages/${created.id}/content`, { content: doc });
|
|
41
|
+
}
|
|
32
42
|
return {
|
|
33
|
-
content: [{ type: "text", text: JSON.stringify(
|
|
43
|
+
content: [{ type: "text", text: JSON.stringify(created, null, 2) }],
|
|
34
44
|
};
|
|
35
45
|
});
|
|
36
|
-
server.tool("update_page_content", "Update a page's content
|
|
46
|
+
server.tool("update_page_content", "Update a page's content. Write the content as MARKDOWN — it's converted to the editor's internal format server-side. Do NOT send Tiptap JSON or stringified JSON.", {
|
|
37
47
|
id: z.string().describe("The page UUID"),
|
|
38
|
-
content: z
|
|
48
|
+
content: z
|
|
49
|
+
.string()
|
|
50
|
+
.describe("Page content as MARKDOWN. Supports headings (# / ## / ###), paragraphs, **bold**, *italic*, `code`, fenced code blocks, bullet/numbered lists, blockquotes, and [links](url)."),
|
|
39
51
|
}, async ({ id, content }) => {
|
|
40
|
-
const
|
|
52
|
+
const doc = toTiptapDoc(content);
|
|
53
|
+
const data = await client.put(`/pages/${id}/content`, { content: doc });
|
|
41
54
|
return {
|
|
42
55
|
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
43
56
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../../src/tools/pages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../../src/tools/pages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface TiptapTextNode {
|
|
2
|
+
type: "text";
|
|
3
|
+
text: string;
|
|
4
|
+
marks?: Array<{
|
|
5
|
+
type: string;
|
|
6
|
+
attrs?: Record<string, unknown>;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export interface TiptapNode {
|
|
10
|
+
type: string;
|
|
11
|
+
attrs?: Record<string, unknown>;
|
|
12
|
+
content?: Array<TiptapNode | TiptapTextNode>;
|
|
13
|
+
}
|
|
14
|
+
export interface TiptapDoc {
|
|
15
|
+
type: "doc";
|
|
16
|
+
content: TiptapNode[];
|
|
17
|
+
}
|
|
18
|
+
/** Accepts a Markdown string OR a pre-built Tiptap doc and returns a Tiptap doc. */
|
|
19
|
+
export declare function toTiptapDoc(input: unknown): TiptapDoc;
|
|
20
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/utils/markdown.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CA6BrD"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// Minimal Markdown → Tiptap JSON converter.
|
|
2
|
+
//
|
|
3
|
+
// Why this exists: the page editor stores content as Tiptap JSON, but LLMs
|
|
4
|
+
// reliably mangle nested JSON when asked to generate it inline. Letting the AI
|
|
5
|
+
// write Markdown — which it does excellently — and converting here is far more
|
|
6
|
+
// robust than asking it to produce a valid Tiptap document tree.
|
|
7
|
+
//
|
|
8
|
+
// Supported block constructs (covers ~95% of AI-generated content):
|
|
9
|
+
// - # / ## / ### headings (h4–h6 collapse to h3)
|
|
10
|
+
// - paragraphs
|
|
11
|
+
// - - / * bullet lists (single level)
|
|
12
|
+
// - 1. ordered lists (single level)
|
|
13
|
+
// - ``` fenced code blocks (optional language)
|
|
14
|
+
// - > blockquote
|
|
15
|
+
// - --- horizontal rule
|
|
16
|
+
//
|
|
17
|
+
// Supported inline marks:
|
|
18
|
+
// - **bold** __bold__
|
|
19
|
+
// - *italic* _italic_
|
|
20
|
+
// - `inline code`
|
|
21
|
+
// - [link](url)
|
|
22
|
+
//
|
|
23
|
+
// If the caller passes something that already looks like a Tiptap doc
|
|
24
|
+
// ({ type: "doc", content: [...] }), it's returned as-is.
|
|
25
|
+
/** Accepts a Markdown string OR a pre-built Tiptap doc and returns a Tiptap doc. */
|
|
26
|
+
export function toTiptapDoc(input) {
|
|
27
|
+
// Already a Tiptap doc object — pass through.
|
|
28
|
+
if (typeof input === "object" &&
|
|
29
|
+
input !== null &&
|
|
30
|
+
input.type === "doc" &&
|
|
31
|
+
Array.isArray(input.content)) {
|
|
32
|
+
return input;
|
|
33
|
+
}
|
|
34
|
+
// String form: could be Markdown or accidentally a JSON-stringified Tiptap doc.
|
|
35
|
+
if (typeof input === "string") {
|
|
36
|
+
const trimmed = input.trim();
|
|
37
|
+
if (trimmed.startsWith("{") && trimmed.includes('"type":"doc"')) {
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(trimmed);
|
|
40
|
+
if (parsed?.type === "doc" && Array.isArray(parsed.content)) {
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// fall through to Markdown parsing
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return markdownToTiptap(input);
|
|
49
|
+
}
|
|
50
|
+
// Anything else — produce an empty doc rather than throw.
|
|
51
|
+
return { type: "doc", content: [{ type: "paragraph" }] };
|
|
52
|
+
}
|
|
53
|
+
function markdownToTiptap(md) {
|
|
54
|
+
const lines = md.replace(/\r\n/g, "\n").split("\n");
|
|
55
|
+
const content = [];
|
|
56
|
+
let i = 0;
|
|
57
|
+
while (i < lines.length) {
|
|
58
|
+
const line = lines[i];
|
|
59
|
+
// Heading
|
|
60
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.*)$/);
|
|
61
|
+
if (headingMatch) {
|
|
62
|
+
const level = Math.min(headingMatch[1].length, 3);
|
|
63
|
+
content.push({
|
|
64
|
+
type: "heading",
|
|
65
|
+
attrs: { level },
|
|
66
|
+
content: parseInline(headingMatch[2]),
|
|
67
|
+
});
|
|
68
|
+
i++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Horizontal rule
|
|
72
|
+
if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line)) {
|
|
73
|
+
content.push({ type: "horizontalRule" });
|
|
74
|
+
i++;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Fenced code block
|
|
78
|
+
if (/^```/.test(line)) {
|
|
79
|
+
const lang = line.replace(/^```/, "").trim();
|
|
80
|
+
i++;
|
|
81
|
+
const codeLines = [];
|
|
82
|
+
while (i < lines.length && !/^```/.test(lines[i])) {
|
|
83
|
+
codeLines.push(lines[i]);
|
|
84
|
+
i++;
|
|
85
|
+
}
|
|
86
|
+
const node = {
|
|
87
|
+
type: "codeBlock",
|
|
88
|
+
content: codeLines.length
|
|
89
|
+
? [{ type: "text", text: codeLines.join("\n") }]
|
|
90
|
+
: [],
|
|
91
|
+
};
|
|
92
|
+
if (lang)
|
|
93
|
+
node.attrs = { language: lang };
|
|
94
|
+
content.push(node);
|
|
95
|
+
i++; // skip closing fence (or off-end)
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// Bullet list
|
|
99
|
+
if (/^\s*[-*]\s+/.test(line)) {
|
|
100
|
+
const items = [];
|
|
101
|
+
while (i < lines.length && /^\s*[-*]\s+/.test(lines[i])) {
|
|
102
|
+
const itemText = lines[i].replace(/^\s*[-*]\s+/, "");
|
|
103
|
+
items.push({
|
|
104
|
+
type: "listItem",
|
|
105
|
+
content: [{ type: "paragraph", content: parseInline(itemText) }],
|
|
106
|
+
});
|
|
107
|
+
i++;
|
|
108
|
+
}
|
|
109
|
+
content.push({ type: "bulletList", content: items });
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Ordered list
|
|
113
|
+
if (/^\s*\d+\.\s+/.test(line)) {
|
|
114
|
+
const items = [];
|
|
115
|
+
while (i < lines.length && /^\s*\d+\.\s+/.test(lines[i])) {
|
|
116
|
+
const itemText = lines[i].replace(/^\s*\d+\.\s+/, "");
|
|
117
|
+
items.push({
|
|
118
|
+
type: "listItem",
|
|
119
|
+
content: [{ type: "paragraph", content: parseInline(itemText) }],
|
|
120
|
+
});
|
|
121
|
+
i++;
|
|
122
|
+
}
|
|
123
|
+
content.push({ type: "orderedList", content: items });
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// Blockquote
|
|
127
|
+
if (/^>\s?/.test(line)) {
|
|
128
|
+
const quoteLines = [];
|
|
129
|
+
while (i < lines.length && /^>\s?/.test(lines[i])) {
|
|
130
|
+
quoteLines.push(lines[i].replace(/^>\s?/, ""));
|
|
131
|
+
i++;
|
|
132
|
+
}
|
|
133
|
+
content.push({
|
|
134
|
+
type: "blockquote",
|
|
135
|
+
content: [
|
|
136
|
+
{ type: "paragraph", content: parseInline(quoteLines.join(" ")) },
|
|
137
|
+
],
|
|
138
|
+
});
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
// Empty line
|
|
142
|
+
if (line.trim() === "") {
|
|
143
|
+
i++;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
// Default: paragraph — collect contiguous non-empty, non-block lines.
|
|
147
|
+
const paraLines = [];
|
|
148
|
+
while (i < lines.length && !isBlockStart(lines[i])) {
|
|
149
|
+
paraLines.push(lines[i]);
|
|
150
|
+
i++;
|
|
151
|
+
}
|
|
152
|
+
content.push({
|
|
153
|
+
type: "paragraph",
|
|
154
|
+
content: parseInline(paraLines.join(" ")),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (content.length === 0)
|
|
158
|
+
content.push({ type: "paragraph" });
|
|
159
|
+
return { type: "doc", content };
|
|
160
|
+
}
|
|
161
|
+
function isBlockStart(line) {
|
|
162
|
+
if (line.trim() === "")
|
|
163
|
+
return true;
|
|
164
|
+
if (/^#{1,6}\s+/.test(line))
|
|
165
|
+
return true;
|
|
166
|
+
if (/^```/.test(line))
|
|
167
|
+
return true;
|
|
168
|
+
if (/^\s*[-*]\s+/.test(line))
|
|
169
|
+
return true;
|
|
170
|
+
if (/^\s*\d+\.\s+/.test(line))
|
|
171
|
+
return true;
|
|
172
|
+
if (/^>\s?/.test(line))
|
|
173
|
+
return true;
|
|
174
|
+
if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line))
|
|
175
|
+
return true;
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
// Parse a single inline string into an array of Tiptap text nodes with marks.
|
|
179
|
+
// Recognizes (in order of priority): inline code, bold (** or __), italic
|
|
180
|
+
// (single * or _), and [text](url) links. Nesting is not supported beyond
|
|
181
|
+
// simple cases.
|
|
182
|
+
function parseInline(input) {
|
|
183
|
+
if (!input)
|
|
184
|
+
return [];
|
|
185
|
+
const nodes = [];
|
|
186
|
+
let i = 0;
|
|
187
|
+
let buf = "";
|
|
188
|
+
const activeMarks = [];
|
|
189
|
+
const flush = () => {
|
|
190
|
+
if (buf.length > 0) {
|
|
191
|
+
const node = { type: "text", text: buf };
|
|
192
|
+
if (activeMarks.length > 0)
|
|
193
|
+
node.marks = activeMarks.map((m) => ({ ...m }));
|
|
194
|
+
nodes.push(node);
|
|
195
|
+
buf = "";
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
while (i < input.length) {
|
|
199
|
+
const rest = input.slice(i);
|
|
200
|
+
// Inline code: `code`
|
|
201
|
+
const codeMatch = rest.match(/^`([^`]+)`/);
|
|
202
|
+
if (codeMatch) {
|
|
203
|
+
flush();
|
|
204
|
+
nodes.push({ type: "text", text: codeMatch[1], marks: [{ type: "code" }] });
|
|
205
|
+
i += codeMatch[0].length;
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
// Link: [label](url)
|
|
209
|
+
const linkMatch = rest.match(/^\[([^\]]+)\]\(([^)]+)\)/);
|
|
210
|
+
if (linkMatch) {
|
|
211
|
+
flush();
|
|
212
|
+
nodes.push({
|
|
213
|
+
type: "text",
|
|
214
|
+
text: linkMatch[1],
|
|
215
|
+
marks: [{ type: "link", attrs: { href: linkMatch[2] } }],
|
|
216
|
+
});
|
|
217
|
+
i += linkMatch[0].length;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
// Bold: **text** or __text__
|
|
221
|
+
const boldMatch = rest.match(/^(\*\*|__)([^*_]+)\1/);
|
|
222
|
+
if (boldMatch) {
|
|
223
|
+
flush();
|
|
224
|
+
nodes.push({ type: "text", text: boldMatch[2], marks: [{ type: "bold" }] });
|
|
225
|
+
i += boldMatch[0].length;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Italic: *text* or _text_
|
|
229
|
+
const italicMatch = rest.match(/^(\*|_)([^*_]+)\1/);
|
|
230
|
+
if (italicMatch) {
|
|
231
|
+
flush();
|
|
232
|
+
nodes.push({
|
|
233
|
+
type: "text",
|
|
234
|
+
text: italicMatch[2],
|
|
235
|
+
marks: [{ type: "italic" }],
|
|
236
|
+
});
|
|
237
|
+
i += italicMatch[0].length;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
// Plain character
|
|
241
|
+
buf += input[i];
|
|
242
|
+
i++;
|
|
243
|
+
}
|
|
244
|
+
flush();
|
|
245
|
+
if (nodes.length === 0)
|
|
246
|
+
nodes.push({ type: "text", text: input });
|
|
247
|
+
return nodes;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/utils/markdown.ts"],"names":[],"mappings":"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"}
|