@dversum/mcp-server 2.3.0 → 2.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/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 +314 -0
- package/dist/src/utils/markdown.js.map +1 -0
- package/package.json +1 -1
|
@@ -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":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,MAAqB;IAErB,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,yCAAyC,EACzC;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,UAAU,EACV,mCAAmC,EACnC;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACzC,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,6HAA6H,EAC7H;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACrF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACzD,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,8JAA8J,CAC/J;KACJ,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClE,IAAI,OAAO,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,mKAAmK,EACnK;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACxC,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,CACP,+KAA+K,CAChL;KACJ,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mCAAmC,EACnC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,iDAAiD,EACjD;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACnD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC9D,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,4DAA4D,EAC5D;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACzC,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -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":"AA0BA,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,314 @@
|
|
|
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
|
+
// - | col | col | GFM pipe tables (header row + |---|---| divider + body rows)
|
|
17
|
+
//
|
|
18
|
+
// Supported inline marks:
|
|
19
|
+
// - **bold** __bold__
|
|
20
|
+
// - *italic* _italic_
|
|
21
|
+
// - `inline code`
|
|
22
|
+
// - [link](url)
|
|
23
|
+
//
|
|
24
|
+
// If the caller passes something that already looks like a Tiptap doc
|
|
25
|
+
// ({ type: "doc", content: [...] }), it's returned as-is.
|
|
26
|
+
/** Accepts a Markdown string OR a pre-built Tiptap doc and returns a Tiptap doc. */
|
|
27
|
+
export function toTiptapDoc(input) {
|
|
28
|
+
// Already a Tiptap doc object — pass through.
|
|
29
|
+
if (typeof input === "object" &&
|
|
30
|
+
input !== null &&
|
|
31
|
+
input.type === "doc" &&
|
|
32
|
+
Array.isArray(input.content)) {
|
|
33
|
+
return input;
|
|
34
|
+
}
|
|
35
|
+
// String form: could be Markdown or accidentally a JSON-stringified Tiptap doc.
|
|
36
|
+
if (typeof input === "string") {
|
|
37
|
+
const trimmed = input.trim();
|
|
38
|
+
if (trimmed.startsWith("{") && trimmed.includes('"type":"doc"')) {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(trimmed);
|
|
41
|
+
if (parsed?.type === "doc" && Array.isArray(parsed.content)) {
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// fall through to Markdown parsing
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return markdownToTiptap(input);
|
|
50
|
+
}
|
|
51
|
+
// Anything else — produce an empty doc rather than throw.
|
|
52
|
+
return { type: "doc", content: [{ type: "paragraph" }] };
|
|
53
|
+
}
|
|
54
|
+
function markdownToTiptap(md) {
|
|
55
|
+
const lines = md.replace(/\r\n/g, "\n").split("\n");
|
|
56
|
+
const content = [];
|
|
57
|
+
let i = 0;
|
|
58
|
+
while (i < lines.length) {
|
|
59
|
+
const line = lines[i];
|
|
60
|
+
// Heading
|
|
61
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.*)$/);
|
|
62
|
+
if (headingMatch) {
|
|
63
|
+
const level = Math.min(headingMatch[1].length, 3);
|
|
64
|
+
content.push({
|
|
65
|
+
type: "heading",
|
|
66
|
+
attrs: { level },
|
|
67
|
+
content: parseInline(headingMatch[2]),
|
|
68
|
+
});
|
|
69
|
+
i++;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
// Horizontal rule
|
|
73
|
+
if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line)) {
|
|
74
|
+
content.push({ type: "horizontalRule" });
|
|
75
|
+
i++;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Fenced code block
|
|
79
|
+
if (/^```/.test(line)) {
|
|
80
|
+
const lang = line.replace(/^```/, "").trim();
|
|
81
|
+
i++;
|
|
82
|
+
const codeLines = [];
|
|
83
|
+
while (i < lines.length && !/^```/.test(lines[i])) {
|
|
84
|
+
codeLines.push(lines[i]);
|
|
85
|
+
i++;
|
|
86
|
+
}
|
|
87
|
+
const node = {
|
|
88
|
+
type: "codeBlock",
|
|
89
|
+
content: codeLines.length
|
|
90
|
+
? [{ type: "text", text: codeLines.join("\n") }]
|
|
91
|
+
: [],
|
|
92
|
+
};
|
|
93
|
+
if (lang)
|
|
94
|
+
node.attrs = { language: lang };
|
|
95
|
+
content.push(node);
|
|
96
|
+
i++; // skip closing fence (or off-end)
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
// Bullet list
|
|
100
|
+
if (/^\s*[-*]\s+/.test(line)) {
|
|
101
|
+
const items = [];
|
|
102
|
+
while (i < lines.length && /^\s*[-*]\s+/.test(lines[i])) {
|
|
103
|
+
const itemText = lines[i].replace(/^\s*[-*]\s+/, "");
|
|
104
|
+
items.push({
|
|
105
|
+
type: "listItem",
|
|
106
|
+
content: [{ type: "paragraph", content: parseInline(itemText) }],
|
|
107
|
+
});
|
|
108
|
+
i++;
|
|
109
|
+
}
|
|
110
|
+
content.push({ type: "bulletList", content: items });
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
// Ordered list
|
|
114
|
+
if (/^\s*\d+\.\s+/.test(line)) {
|
|
115
|
+
const items = [];
|
|
116
|
+
while (i < lines.length && /^\s*\d+\.\s+/.test(lines[i])) {
|
|
117
|
+
const itemText = lines[i].replace(/^\s*\d+\.\s+/, "");
|
|
118
|
+
items.push({
|
|
119
|
+
type: "listItem",
|
|
120
|
+
content: [{ type: "paragraph", content: parseInline(itemText) }],
|
|
121
|
+
});
|
|
122
|
+
i++;
|
|
123
|
+
}
|
|
124
|
+
content.push({ type: "orderedList", content: items });
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// GFM pipe table — must have a `|---|---|` divider on the next line.
|
|
128
|
+
if (isTableHeaderLine(line) && i + 1 < lines.length && isTableDividerLine(lines[i + 1])) {
|
|
129
|
+
const headerCells = splitTableRow(line);
|
|
130
|
+
i += 2; // consume header + divider
|
|
131
|
+
const bodyRows = [];
|
|
132
|
+
while (i < lines.length && isTableHeaderLine(lines[i])) {
|
|
133
|
+
bodyRows.push(splitTableRow(lines[i]));
|
|
134
|
+
i++;
|
|
135
|
+
}
|
|
136
|
+
content.push(buildTableNode(headerCells, bodyRows));
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
// Blockquote
|
|
140
|
+
if (/^>\s?/.test(line)) {
|
|
141
|
+
const quoteLines = [];
|
|
142
|
+
while (i < lines.length && /^>\s?/.test(lines[i])) {
|
|
143
|
+
quoteLines.push(lines[i].replace(/^>\s?/, ""));
|
|
144
|
+
i++;
|
|
145
|
+
}
|
|
146
|
+
content.push({
|
|
147
|
+
type: "blockquote",
|
|
148
|
+
content: [
|
|
149
|
+
{ type: "paragraph", content: parseInline(quoteLines.join(" ")) },
|
|
150
|
+
],
|
|
151
|
+
});
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// Empty line
|
|
155
|
+
if (line.trim() === "") {
|
|
156
|
+
i++;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// Default: paragraph — collect contiguous non-empty, non-block lines.
|
|
160
|
+
const paraLines = [];
|
|
161
|
+
while (i < lines.length && !isBlockStart(lines[i])) {
|
|
162
|
+
paraLines.push(lines[i]);
|
|
163
|
+
i++;
|
|
164
|
+
}
|
|
165
|
+
content.push({
|
|
166
|
+
type: "paragraph",
|
|
167
|
+
content: parseInline(paraLines.join(" ")),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (content.length === 0)
|
|
171
|
+
content.push({ type: "paragraph" });
|
|
172
|
+
return { type: "doc", content };
|
|
173
|
+
}
|
|
174
|
+
function isBlockStart(line) {
|
|
175
|
+
if (line.trim() === "")
|
|
176
|
+
return true;
|
|
177
|
+
if (/^#{1,6}\s+/.test(line))
|
|
178
|
+
return true;
|
|
179
|
+
if (/^```/.test(line))
|
|
180
|
+
return true;
|
|
181
|
+
if (/^\s*[-*]\s+/.test(line))
|
|
182
|
+
return true;
|
|
183
|
+
if (/^\s*\d+\.\s+/.test(line))
|
|
184
|
+
return true;
|
|
185
|
+
if (/^>\s?/.test(line))
|
|
186
|
+
return true;
|
|
187
|
+
if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line))
|
|
188
|
+
return true;
|
|
189
|
+
if (isTableHeaderLine(line))
|
|
190
|
+
return true;
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
// ─── Pipe tables (GFM) ─────────────────────────────────────────────
|
|
194
|
+
//
|
|
195
|
+
// A header row is any line that starts AND ends with `|` (after trim).
|
|
196
|
+
// We don't insist on more than one cell so a single-column table parses.
|
|
197
|
+
function isTableHeaderLine(line) {
|
|
198
|
+
const t = line.trim();
|
|
199
|
+
return t.startsWith("|") && t.endsWith("|") && t.length >= 2;
|
|
200
|
+
}
|
|
201
|
+
// Divider row: cells made of only `-`, `:` and whitespace, e.g.
|
|
202
|
+
// |---|---| |:---|---:| | --- | :---: |
|
|
203
|
+
function isTableDividerLine(line) {
|
|
204
|
+
const t = line.trim();
|
|
205
|
+
if (!t.startsWith("|") || !t.endsWith("|"))
|
|
206
|
+
return false;
|
|
207
|
+
const cells = splitTableRow(t);
|
|
208
|
+
if (cells.length === 0)
|
|
209
|
+
return false;
|
|
210
|
+
return cells.every((c) => /^:?-{3,}:?$/.test(c.trim()));
|
|
211
|
+
}
|
|
212
|
+
// Split `| a | b | c |` → ["a", "b", "c"]. Strips leading/trailing pipes
|
|
213
|
+
// and trims each cell.
|
|
214
|
+
function splitTableRow(line) {
|
|
215
|
+
const t = line.trim().replace(/^\||\|$/g, "");
|
|
216
|
+
return t.split("|").map((c) => c.trim());
|
|
217
|
+
}
|
|
218
|
+
function buildTableNode(header, body) {
|
|
219
|
+
const colCount = header.length;
|
|
220
|
+
const rows = [];
|
|
221
|
+
// Header row uses tableHeader cells.
|
|
222
|
+
rows.push({
|
|
223
|
+
type: "tableRow",
|
|
224
|
+
content: header.map((cell) => ({
|
|
225
|
+
type: "tableHeader",
|
|
226
|
+
content: [{ type: "paragraph", content: parseInline(cell) }],
|
|
227
|
+
})),
|
|
228
|
+
});
|
|
229
|
+
// Body rows — pad or truncate to header column count so the row is valid.
|
|
230
|
+
for (const row of body) {
|
|
231
|
+
const cells = [];
|
|
232
|
+
for (let c = 0; c < colCount; c++) {
|
|
233
|
+
const value = row[c] ?? "";
|
|
234
|
+
cells.push({
|
|
235
|
+
type: "tableCell",
|
|
236
|
+
content: [{ type: "paragraph", content: parseInline(value) }],
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
rows.push({ type: "tableRow", content: cells });
|
|
240
|
+
}
|
|
241
|
+
return { type: "table", content: rows };
|
|
242
|
+
}
|
|
243
|
+
// Parse a single inline string into an array of Tiptap text nodes with marks.
|
|
244
|
+
// Recognizes (in order of priority): inline code, bold (** or __), italic
|
|
245
|
+
// (single * or _), and [text](url) links. Nesting is not supported beyond
|
|
246
|
+
// simple cases.
|
|
247
|
+
function parseInline(input) {
|
|
248
|
+
if (!input)
|
|
249
|
+
return [];
|
|
250
|
+
const nodes = [];
|
|
251
|
+
let i = 0;
|
|
252
|
+
let buf = "";
|
|
253
|
+
const activeMarks = [];
|
|
254
|
+
const flush = () => {
|
|
255
|
+
if (buf.length > 0) {
|
|
256
|
+
const node = { type: "text", text: buf };
|
|
257
|
+
if (activeMarks.length > 0)
|
|
258
|
+
node.marks = activeMarks.map((m) => ({ ...m }));
|
|
259
|
+
nodes.push(node);
|
|
260
|
+
buf = "";
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
while (i < input.length) {
|
|
264
|
+
const rest = input.slice(i);
|
|
265
|
+
// Inline code: `code`
|
|
266
|
+
const codeMatch = rest.match(/^`([^`]+)`/);
|
|
267
|
+
if (codeMatch) {
|
|
268
|
+
flush();
|
|
269
|
+
nodes.push({ type: "text", text: codeMatch[1], marks: [{ type: "code" }] });
|
|
270
|
+
i += codeMatch[0].length;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
// Link: [label](url)
|
|
274
|
+
const linkMatch = rest.match(/^\[([^\]]+)\]\(([^)]+)\)/);
|
|
275
|
+
if (linkMatch) {
|
|
276
|
+
flush();
|
|
277
|
+
nodes.push({
|
|
278
|
+
type: "text",
|
|
279
|
+
text: linkMatch[1],
|
|
280
|
+
marks: [{ type: "link", attrs: { href: linkMatch[2] } }],
|
|
281
|
+
});
|
|
282
|
+
i += linkMatch[0].length;
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
// Bold: **text** or __text__
|
|
286
|
+
const boldMatch = rest.match(/^(\*\*|__)([^*_]+)\1/);
|
|
287
|
+
if (boldMatch) {
|
|
288
|
+
flush();
|
|
289
|
+
nodes.push({ type: "text", text: boldMatch[2], marks: [{ type: "bold" }] });
|
|
290
|
+
i += boldMatch[0].length;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
// Italic: *text* or _text_
|
|
294
|
+
const italicMatch = rest.match(/^(\*|_)([^*_]+)\1/);
|
|
295
|
+
if (italicMatch) {
|
|
296
|
+
flush();
|
|
297
|
+
nodes.push({
|
|
298
|
+
type: "text",
|
|
299
|
+
text: italicMatch[2],
|
|
300
|
+
marks: [{ type: "italic" }],
|
|
301
|
+
});
|
|
302
|
+
i += italicMatch[0].length;
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
// Plain character
|
|
306
|
+
buf += input[i];
|
|
307
|
+
i++;
|
|
308
|
+
}
|
|
309
|
+
flush();
|
|
310
|
+
if (nodes.length === 0)
|
|
311
|
+
nodes.push({ type: "text", text: input });
|
|
312
|
+
return nodes;
|
|
313
|
+
}
|
|
314
|
+
//# 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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"}
|