@pilotiq/tiptap 0.1.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 +67 -0
- package/dist/Block.d.ts +47 -0
- package/dist/Block.d.ts.map +1 -0
- package/dist/Block.js +56 -0
- package/dist/Block.js.map +1 -0
- package/dist/MentionProvider.d.ts +97 -0
- package/dist/MentionProvider.d.ts.map +1 -0
- package/dist/MentionProvider.js +104 -0
- package/dist/MentionProvider.js.map +1 -0
- package/dist/RichTextField.d.ts +286 -0
- package/dist/RichTextField.d.ts.map +1 -0
- package/dist/RichTextField.js +369 -0
- package/dist/RichTextField.js.map +1 -0
- package/dist/extensions/BlockNodeExtension.d.ts +41 -0
- package/dist/extensions/BlockNodeExtension.d.ts.map +1 -0
- package/dist/extensions/BlockNodeExtension.js +103 -0
- package/dist/extensions/BlockNodeExtension.js.map +1 -0
- package/dist/extensions/DragHandleExtension.d.ts +19 -0
- package/dist/extensions/DragHandleExtension.d.ts.map +1 -0
- package/dist/extensions/DragHandleExtension.js +166 -0
- package/dist/extensions/DragHandleExtension.js.map +1 -0
- package/dist/extensions/GridExtension.d.ts +49 -0
- package/dist/extensions/GridExtension.d.ts.map +1 -0
- package/dist/extensions/GridExtension.js +105 -0
- package/dist/extensions/GridExtension.js.map +1 -0
- package/dist/extensions/MentionExtension.d.ts +71 -0
- package/dist/extensions/MentionExtension.d.ts.map +1 -0
- package/dist/extensions/MentionExtension.js +165 -0
- package/dist/extensions/MentionExtension.js.map +1 -0
- package/dist/extensions/MergeTagExtension.d.ts +24 -0
- package/dist/extensions/MergeTagExtension.d.ts.map +1 -0
- package/dist/extensions/MergeTagExtension.js +57 -0
- package/dist/extensions/MergeTagExtension.js.map +1 -0
- package/dist/extensions/SlashCommandExtension.d.ts +71 -0
- package/dist/extensions/SlashCommandExtension.d.ts.map +1 -0
- package/dist/extensions/SlashCommandExtension.js +244 -0
- package/dist/extensions/SlashCommandExtension.js.map +1 -0
- package/dist/extensions/TextSizeMarks.d.ts +33 -0
- package/dist/extensions/TextSizeMarks.d.ts.map +1 -0
- package/dist/extensions/TextSizeMarks.js +47 -0
- package/dist/extensions/TextSizeMarks.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +25 -0
- package/dist/plugin.js.map +1 -0
- package/dist/react/BlockNodeView.d.ts +19 -0
- package/dist/react/BlockNodeView.d.ts.map +1 -0
- package/dist/react/BlockNodeView.js +60 -0
- package/dist/react/BlockNodeView.js.map +1 -0
- package/dist/react/BlockSidePanel.d.ts +105 -0
- package/dist/react/BlockSidePanel.d.ts.map +1 -0
- package/dist/react/BlockSidePanel.js +339 -0
- package/dist/react/BlockSidePanel.js.map +1 -0
- package/dist/react/FloatingToolbar.d.ts +13 -0
- package/dist/react/FloatingToolbar.d.ts.map +1 -0
- package/dist/react/FloatingToolbar.js +113 -0
- package/dist/react/FloatingToolbar.js.map +1 -0
- package/dist/react/MentionMenu.d.ts +26 -0
- package/dist/react/MentionMenu.d.ts.map +1 -0
- package/dist/react/MentionMenu.js +64 -0
- package/dist/react/MentionMenu.js.map +1 -0
- package/dist/react/Palette.d.ts +26 -0
- package/dist/react/Palette.d.ts.map +1 -0
- package/dist/react/Palette.js +21 -0
- package/dist/react/Palette.js.map +1 -0
- package/dist/react/SlashMenu.d.ts +24 -0
- package/dist/react/SlashMenu.d.ts.map +1 -0
- package/dist/react/SlashMenu.js +74 -0
- package/dist/react/SlashMenu.js.map +1 -0
- package/dist/react/TableFloatingToolbar.d.ts +7 -0
- package/dist/react/TableFloatingToolbar.d.ts.map +1 -0
- package/dist/react/TableFloatingToolbar.js +108 -0
- package/dist/react/TableFloatingToolbar.js.map +1 -0
- package/dist/react/TiptapEditor.d.ts +20 -0
- package/dist/react/TiptapEditor.d.ts.map +1 -0
- package/dist/react/TiptapEditor.js +398 -0
- package/dist/react/TiptapEditor.js.map +1 -0
- package/dist/react/Toolbar.d.ts +45 -0
- package/dist/react/Toolbar.d.ts.map +1 -0
- package/dist/react/Toolbar.js +204 -0
- package/dist/react/Toolbar.js.map +1 -0
- package/dist/react/toolbarButtons.d.ts +36 -0
- package/dist/react/toolbarButtons.d.ts.map +1 -0
- package/dist/react/toolbarButtons.js +300 -0
- package/dist/react/toolbarButtons.js.map +1 -0
- package/dist/register.d.ts +20 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +27 -0
- package/dist/register.js.map +1 -0
- package/dist/render.d.ts +89 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +439 -0
- package/dist/render.js.map +1 -0
- package/package.json +92 -0
- package/src/Block.ts +75 -0
- package/src/MentionProvider.ts +153 -0
- package/src/RichTextField.test.ts +447 -0
- package/src/RichTextField.ts +508 -0
- package/src/extensions/BlockNodeExtension.ts +134 -0
- package/src/extensions/DragHandleExtension.ts +184 -0
- package/src/extensions/GridExtension.test.ts +31 -0
- package/src/extensions/GridExtension.ts +138 -0
- package/src/extensions/MentionExtension.ts +248 -0
- package/src/extensions/MergeTagExtension.ts +75 -0
- package/src/extensions/SlashCommandExtension.test.ts +147 -0
- package/src/extensions/SlashCommandExtension.ts +332 -0
- package/src/extensions/TextSizeMarks.ts +73 -0
- package/src/index.ts +28 -0
- package/src/plugin.test.ts +19 -0
- package/src/plugin.ts +26 -0
- package/src/react/BlockNodeView.tsx +99 -0
- package/src/react/BlockSidePanel.test.ts +412 -0
- package/src/react/BlockSidePanel.tsx +451 -0
- package/src/react/FloatingToolbar.tsx +304 -0
- package/src/react/MentionMenu.tsx +120 -0
- package/src/react/Palette.tsx +86 -0
- package/src/react/SlashMenu.tsx +129 -0
- package/src/react/TableFloatingToolbar.tsx +154 -0
- package/src/react/TiptapEditor.tsx +535 -0
- package/src/react/Toolbar.tsx +438 -0
- package/src/react/toolbarButtons.tsx +579 -0
- package/src/register.test.ts +14 -0
- package/src/register.ts +27 -0
- package/src/render.test.ts +745 -0
- package/src/render.ts +480 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbarButtons.js","sourceRoot":"","sources":["../../src/react/toolbarButtons.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register the Tiptap editor as the pilotiq renderer for `fieldType: 'richtext'`.
|
|
3
|
+
*
|
|
4
|
+
* Call once in your app's client-side entry point:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { registerTiptap } from '@pilotiq/tiptap'
|
|
8
|
+
* registerTiptap()
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Also wires the read-side renderer (`@pilotiq/pilotiq/richtext`) so that
|
|
12
|
+
* `TextEntry` / `TextColumn` auto-detect Tiptap content and render finished
|
|
13
|
+
* HTML on `ViewPage` / list tables — without shipping the editor parser to
|
|
14
|
+
* display-only pages.
|
|
15
|
+
*
|
|
16
|
+
* Without this call, `RichTextField` form fields render as nothing —
|
|
17
|
+
* pilotiq's SchemaRenderer can't find a renderer for the `'richtext'` type.
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerTiptap(): void;
|
|
20
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAGrC"}
|
package/dist/register.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { registerFieldRenderer } from '@pilotiq/pilotiq/react';
|
|
2
|
+
import { registerRichTextRenderer } from '@pilotiq/pilotiq/richtext';
|
|
3
|
+
import { TiptapEditor } from './react/TiptapEditor.js';
|
|
4
|
+
import { renderRichTextToHtml, isRichTextValue } from './render.js';
|
|
5
|
+
/**
|
|
6
|
+
* Register the Tiptap editor as the pilotiq renderer for `fieldType: 'richtext'`.
|
|
7
|
+
*
|
|
8
|
+
* Call once in your app's client-side entry point:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { registerTiptap } from '@pilotiq/tiptap'
|
|
12
|
+
* registerTiptap()
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Also wires the read-side renderer (`@pilotiq/pilotiq/richtext`) so that
|
|
16
|
+
* `TextEntry` / `TextColumn` auto-detect Tiptap content and render finished
|
|
17
|
+
* HTML on `ViewPage` / list tables — without shipping the editor parser to
|
|
18
|
+
* display-only pages.
|
|
19
|
+
*
|
|
20
|
+
* Without this call, `RichTextField` form fields render as nothing —
|
|
21
|
+
* pilotiq's SchemaRenderer can't find a renderer for the `'richtext'` type.
|
|
22
|
+
*/
|
|
23
|
+
export function registerTiptap() {
|
|
24
|
+
registerFieldRenderer('richtext', TiptapEditor);
|
|
25
|
+
registerRichTextRenderer(renderRichTextToHtml, isRichTextValue);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEnE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc;IAC5B,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IAC/C,wBAAwB,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAA;AACjE,CAAC"}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-safe Tiptap renderer.
|
|
3
|
+
*
|
|
4
|
+
* Walks a Tiptap JSON document (or HTML string) and returns an HTML string.
|
|
5
|
+
* Pure function — no DOM, no Tiptap runtime, no React. Safe to call from
|
|
6
|
+
* any server context: route handlers, page-data builders, RSC, edge.
|
|
7
|
+
*
|
|
8
|
+
* Output is intentionally NOT sanitized. Same posture as `Markdown` /
|
|
9
|
+
* `Html` display primes in `@pilotiq/pilotiq` — admin-trusted authors only.
|
|
10
|
+
* Text content gets HTML-escaped, link / image hrefs get scheme-checked,
|
|
11
|
+
* but the surrounding markup is constructed by us, not parsed from user
|
|
12
|
+
* input, so there's no place an unexpected tag can sneak in.
|
|
13
|
+
*
|
|
14
|
+
* Coverage matches what `RichTextField` ships in Phases A-G:
|
|
15
|
+
* nodes — doc / paragraph / heading / blockquote / codeBlock / bulletList
|
|
16
|
+
* / orderedList / listItem / horizontalRule / hardBreak / text
|
|
17
|
+
* / image / table / tableRow / tableCell / tableHeader
|
|
18
|
+
* / details / detailsSummary / detailsContent
|
|
19
|
+
* / grid / gridColumn
|
|
20
|
+
* / mergeTag / mention
|
|
21
|
+
* marks — bold / italic / strike / underline / subscript / superscript
|
|
22
|
+
* / code / link / textStyle (color) / highlight (color)
|
|
23
|
+
* / lead (paragraph emphasis) / small (semantic <small>)
|
|
24
|
+
* attrs — heading.level / orderedList.start / codeBlock.language
|
|
25
|
+
* / paragraph.textAlign + heading.textAlign
|
|
26
|
+
* / image.src + alt + title + width + height
|
|
27
|
+
* / tableCell.colspan + rowspan + colwidth (also tableHeader)
|
|
28
|
+
* / mergeTag.id / mention.id + label + trigger
|
|
29
|
+
* custom blocks — render to `<div data-type="..." data-attrs="...">` so
|
|
30
|
+
* consumers can replay or style by data-type.
|
|
31
|
+
*/
|
|
32
|
+
export interface RenderRichTextOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Override the rendering of a custom block (anything that isn't a
|
|
35
|
+
* built-in node). Receives the raw node; return the HTML string.
|
|
36
|
+
* Default emits `<div data-type="..." data-attrs="...">`.
|
|
37
|
+
*/
|
|
38
|
+
renderBlock?: (node: TiptapNode) => string;
|
|
39
|
+
/**
|
|
40
|
+
* Substitution map for `{{ tag }}` placeholders inserted via
|
|
41
|
+
* `RichTextField.mergeTags(['name', …])`. When the renderer hits a
|
|
42
|
+
* `mergeTag` node whose `id` is a key in this map, it emits the value
|
|
43
|
+
* (HTML-escaped). Unmatched ids fall back to a styled `<span class="merge-tag">`
|
|
44
|
+
* that preserves the placeholder visually.
|
|
45
|
+
*/
|
|
46
|
+
mergeTags?: Record<string, string>;
|
|
47
|
+
/**
|
|
48
|
+
* Override the label rendered inside a mention chip at read time. The
|
|
49
|
+
* editor caches the label on insert (so static snapshots stay self-
|
|
50
|
+
* contained), but rendered surfaces can call back into a directory or
|
|
51
|
+
* cache to refresh stale names. Return `undefined` to fall back to the
|
|
52
|
+
* cached label.
|
|
53
|
+
*/
|
|
54
|
+
resolveMention?: (trigger: string, id: string) => string | undefined;
|
|
55
|
+
}
|
|
56
|
+
/** Tiptap JSON node — structural, no runtime dep on `@tiptap/core`. */
|
|
57
|
+
export interface TiptapNode {
|
|
58
|
+
type: string;
|
|
59
|
+
text?: string;
|
|
60
|
+
attrs?: Record<string, unknown>;
|
|
61
|
+
content?: TiptapNode[];
|
|
62
|
+
marks?: TiptapMark[];
|
|
63
|
+
}
|
|
64
|
+
export interface TiptapMark {
|
|
65
|
+
type: string;
|
|
66
|
+
attrs?: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Render Tiptap content to HTML.
|
|
70
|
+
*
|
|
71
|
+
* Accepts:
|
|
72
|
+
* - a Tiptap JSON document (`{ type: 'doc', content: [...] }`) — walked
|
|
73
|
+
* and converted node-by-node;
|
|
74
|
+
* - a JSON-encoded string of the same — parsed then walked;
|
|
75
|
+
* - a raw HTML string — returned verbatim (the editor was configured
|
|
76
|
+
* with `.storage('html')` and the value is already HTML).
|
|
77
|
+
*
|
|
78
|
+
* Returns `''` on null / undefined / unparseable input.
|
|
79
|
+
*/
|
|
80
|
+
export declare function renderRichTextToHtml(content: unknown, opts?: RenderRichTextOptions): string;
|
|
81
|
+
/**
|
|
82
|
+
* Detect whether a value looks like Tiptap rich-text content. Conservative:
|
|
83
|
+
* only matches the canonical document root (`{ type: 'doc', content: [...] }`),
|
|
84
|
+
* either object-form or as a JSON-encoded string. Plain text and arbitrary
|
|
85
|
+
* objects are NOT auto-detected — display surfaces should fall through to
|
|
86
|
+
* their default formatter.
|
|
87
|
+
*/
|
|
88
|
+
export declare function isRichTextValue(v: unknown): boolean;
|
|
89
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,MAAM,CAAA;IAC1C;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CACrE;AAED,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAM,MAAM,CAAA;IAChB,IAAI,CAAC,EAAK,MAAM,CAAA;IAChB,KAAK,CAAC,EAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,KAAK,CAAC,EAAI,UAAU,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAI,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CAmB/F;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAanD"}
|
package/dist/render.js
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-safe Tiptap renderer.
|
|
3
|
+
*
|
|
4
|
+
* Walks a Tiptap JSON document (or HTML string) and returns an HTML string.
|
|
5
|
+
* Pure function — no DOM, no Tiptap runtime, no React. Safe to call from
|
|
6
|
+
* any server context: route handlers, page-data builders, RSC, edge.
|
|
7
|
+
*
|
|
8
|
+
* Output is intentionally NOT sanitized. Same posture as `Markdown` /
|
|
9
|
+
* `Html` display primes in `@pilotiq/pilotiq` — admin-trusted authors only.
|
|
10
|
+
* Text content gets HTML-escaped, link / image hrefs get scheme-checked,
|
|
11
|
+
* but the surrounding markup is constructed by us, not parsed from user
|
|
12
|
+
* input, so there's no place an unexpected tag can sneak in.
|
|
13
|
+
*
|
|
14
|
+
* Coverage matches what `RichTextField` ships in Phases A-G:
|
|
15
|
+
* nodes — doc / paragraph / heading / blockquote / codeBlock / bulletList
|
|
16
|
+
* / orderedList / listItem / horizontalRule / hardBreak / text
|
|
17
|
+
* / image / table / tableRow / tableCell / tableHeader
|
|
18
|
+
* / details / detailsSummary / detailsContent
|
|
19
|
+
* / grid / gridColumn
|
|
20
|
+
* / mergeTag / mention
|
|
21
|
+
* marks — bold / italic / strike / underline / subscript / superscript
|
|
22
|
+
* / code / link / textStyle (color) / highlight (color)
|
|
23
|
+
* / lead (paragraph emphasis) / small (semantic <small>)
|
|
24
|
+
* attrs — heading.level / orderedList.start / codeBlock.language
|
|
25
|
+
* / paragraph.textAlign + heading.textAlign
|
|
26
|
+
* / image.src + alt + title + width + height
|
|
27
|
+
* / tableCell.colspan + rowspan + colwidth (also tableHeader)
|
|
28
|
+
* / mergeTag.id / mention.id + label + trigger
|
|
29
|
+
* custom blocks — render to `<div data-type="..." data-attrs="...">` so
|
|
30
|
+
* consumers can replay or style by data-type.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Render Tiptap content to HTML.
|
|
34
|
+
*
|
|
35
|
+
* Accepts:
|
|
36
|
+
* - a Tiptap JSON document (`{ type: 'doc', content: [...] }`) — walked
|
|
37
|
+
* and converted node-by-node;
|
|
38
|
+
* - a JSON-encoded string of the same — parsed then walked;
|
|
39
|
+
* - a raw HTML string — returned verbatim (the editor was configured
|
|
40
|
+
* with `.storage('html')` and the value is already HTML).
|
|
41
|
+
*
|
|
42
|
+
* Returns `''` on null / undefined / unparseable input.
|
|
43
|
+
*/
|
|
44
|
+
export function renderRichTextToHtml(content, opts = {}) {
|
|
45
|
+
if (content === null || content === undefined)
|
|
46
|
+
return '';
|
|
47
|
+
if (typeof content === 'string') {
|
|
48
|
+
const trimmed = content.trimStart();
|
|
49
|
+
if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(content);
|
|
52
|
+
return renderNode(parsed, opts);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return content;
|
|
59
|
+
}
|
|
60
|
+
if (typeof content === 'object')
|
|
61
|
+
return renderNode(content, opts);
|
|
62
|
+
return '';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Detect whether a value looks like Tiptap rich-text content. Conservative:
|
|
66
|
+
* only matches the canonical document root (`{ type: 'doc', content: [...] }`),
|
|
67
|
+
* either object-form or as a JSON-encoded string. Plain text and arbitrary
|
|
68
|
+
* objects are NOT auto-detected — display surfaces should fall through to
|
|
69
|
+
* their default formatter.
|
|
70
|
+
*/
|
|
71
|
+
export function isRichTextValue(v) {
|
|
72
|
+
if (v === null || v === undefined)
|
|
73
|
+
return false;
|
|
74
|
+
if (typeof v === 'object')
|
|
75
|
+
return isTiptapDoc(v);
|
|
76
|
+
if (typeof v === 'string') {
|
|
77
|
+
const trimmed = v.trimStart();
|
|
78
|
+
if (!trimmed.startsWith('{'))
|
|
79
|
+
return false;
|
|
80
|
+
try {
|
|
81
|
+
return isTiptapDoc(JSON.parse(v));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
function isTiptapDoc(v) {
|
|
90
|
+
return (typeof v === 'object' && v !== null
|
|
91
|
+
&& v.type === 'doc'
|
|
92
|
+
&& Array.isArray(v.content));
|
|
93
|
+
}
|
|
94
|
+
// ─── Node walker ─────────────────────────────────────────────────────
|
|
95
|
+
function renderNode(node, opts) {
|
|
96
|
+
if (node === null || node === undefined)
|
|
97
|
+
return '';
|
|
98
|
+
if (Array.isArray(node))
|
|
99
|
+
return node.map(n => renderNode(n, opts)).join('');
|
|
100
|
+
if (typeof node !== 'object')
|
|
101
|
+
return '';
|
|
102
|
+
const n = node;
|
|
103
|
+
switch (n.type) {
|
|
104
|
+
case 'doc': return renderChildren(n, opts);
|
|
105
|
+
case 'paragraph': return wrap('p', n, opts, alignStyle(n));
|
|
106
|
+
case 'heading': {
|
|
107
|
+
const level = clampLevel(n.attrs?.['level']);
|
|
108
|
+
return wrap(`h${level}`, n, opts, alignStyle(n));
|
|
109
|
+
}
|
|
110
|
+
case 'blockquote': return wrap('blockquote', n, opts);
|
|
111
|
+
case 'codeBlock': {
|
|
112
|
+
const lang = typeof n.attrs?.['language'] === 'string'
|
|
113
|
+
? n.attrs['language']
|
|
114
|
+
: undefined;
|
|
115
|
+
const cls = lang ? ` class="language-${escapeAttr(lang)}"` : '';
|
|
116
|
+
return `<pre><code${cls}>${renderChildren(n, opts)}</code></pre>`;
|
|
117
|
+
}
|
|
118
|
+
case 'bulletList': return wrap('ul', n, opts);
|
|
119
|
+
case 'orderedList': {
|
|
120
|
+
const startRaw = n.attrs?.['start'];
|
|
121
|
+
const start = typeof startRaw === 'number' ? startRaw : Number(startRaw);
|
|
122
|
+
const startAttr = Number.isFinite(start) && start !== 1 ? ` start="${Math.trunc(start)}"` : '';
|
|
123
|
+
return `<ol${startAttr}>${renderChildren(n, opts)}</ol>`;
|
|
124
|
+
}
|
|
125
|
+
case 'listItem': return wrap('li', n, opts);
|
|
126
|
+
case 'horizontalRule': return '<hr>';
|
|
127
|
+
case 'hardBreak': return '<br>';
|
|
128
|
+
case 'image': return renderImage(n);
|
|
129
|
+
case 'table': return renderTable(n, opts);
|
|
130
|
+
case 'tableRow': return wrap('tr', n, opts);
|
|
131
|
+
case 'tableCell': return renderCell('td', n, opts);
|
|
132
|
+
case 'tableHeader': return renderCell('th', n, opts);
|
|
133
|
+
case 'details': return renderDetails(n, opts);
|
|
134
|
+
case 'detailsSummary': return wrap('summary', n, opts);
|
|
135
|
+
// The editor's NodeView wraps content in a `<div data-type="detailsContent">`
|
|
136
|
+
// for click handling, but the read-side HTML doesn't need a wrapper —
|
|
137
|
+
// a `<details>` block's content sits directly after the `<summary>` per
|
|
138
|
+
// the platform spec, which matches reader expectations.
|
|
139
|
+
case 'detailsContent': return renderChildren(n, opts);
|
|
140
|
+
case 'grid': return renderGrid(n, opts);
|
|
141
|
+
case 'gridColumn': return wrap('div', n, opts);
|
|
142
|
+
case 'mergeTag': return renderMergeTag(n, opts);
|
|
143
|
+
case 'mention': return renderMention(n, opts);
|
|
144
|
+
case 'text': return renderText(n);
|
|
145
|
+
default:
|
|
146
|
+
if (opts.renderBlock)
|
|
147
|
+
return opts.renderBlock(n);
|
|
148
|
+
return renderCustomBlock(n);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function renderChildren(n, opts) {
|
|
152
|
+
if (!n.content)
|
|
153
|
+
return '';
|
|
154
|
+
return n.content.map(c => renderNode(c, opts)).join('');
|
|
155
|
+
}
|
|
156
|
+
function wrap(tag, n, opts, extraAttrs = '') {
|
|
157
|
+
return `<${tag}${extraAttrs}>${renderChildren(n, opts)}</${tag}>`;
|
|
158
|
+
}
|
|
159
|
+
function alignStyle(n) {
|
|
160
|
+
const align = n.attrs?.['textAlign'];
|
|
161
|
+
if (typeof align !== 'string' || align === '' || align === 'left')
|
|
162
|
+
return '';
|
|
163
|
+
// `start` / `end` / `center` / `justify` — TextAlign extension allows-list.
|
|
164
|
+
if (!/^[a-z]+$/.test(align))
|
|
165
|
+
return '';
|
|
166
|
+
return ` style="text-align: ${align}"`;
|
|
167
|
+
}
|
|
168
|
+
function clampLevel(raw) {
|
|
169
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
170
|
+
if (!Number.isFinite(n))
|
|
171
|
+
return 1;
|
|
172
|
+
return Math.min(6, Math.max(1, Math.trunc(n)));
|
|
173
|
+
}
|
|
174
|
+
// ─── Text + marks ────────────────────────────────────────────────────
|
|
175
|
+
function renderText(n) {
|
|
176
|
+
let html = escapeHtml(String(n.text ?? ''));
|
|
177
|
+
const marks = Array.isArray(n.marks) ? n.marks : [];
|
|
178
|
+
// Tiptap stores marks innermost-first in array order; wrap from index
|
|
179
|
+
// 0 outward so the first mark ends up nested deepest — matches Tiptap's
|
|
180
|
+
// own DOM serialization.
|
|
181
|
+
for (const mark of marks)
|
|
182
|
+
html = wrapMark(html, mark);
|
|
183
|
+
return html;
|
|
184
|
+
}
|
|
185
|
+
function wrapMark(inner, mark) {
|
|
186
|
+
if (!mark || typeof mark !== 'object')
|
|
187
|
+
return inner;
|
|
188
|
+
const attrs = (mark.attrs ?? {});
|
|
189
|
+
switch (mark.type) {
|
|
190
|
+
case 'bold': return `<strong>${inner}</strong>`;
|
|
191
|
+
case 'italic': return `<em>${inner}</em>`;
|
|
192
|
+
case 'strike': return `<s>${inner}</s>`;
|
|
193
|
+
case 'underline': return `<u>${inner}</u>`;
|
|
194
|
+
case 'subscript': return `<sub>${inner}</sub>`;
|
|
195
|
+
case 'superscript': return `<sup>${inner}</sup>`;
|
|
196
|
+
case 'code': return `<code>${inner}</code>`;
|
|
197
|
+
case 'lead': return `<span class="lead">${inner}</span>`;
|
|
198
|
+
case 'small': return `<small>${inner}</small>`;
|
|
199
|
+
case 'link': {
|
|
200
|
+
const href = sanitizeUrl(attrs['href']);
|
|
201
|
+
const target = typeof attrs['target'] === 'string'
|
|
202
|
+
? ` target="${escapeAttr(String(attrs['target']))}"` : '';
|
|
203
|
+
const rel = attrs['target'] === '_blank' ? ' rel="noopener noreferrer"' : '';
|
|
204
|
+
return `<a href="${href}"${target}${rel}>${inner}</a>`;
|
|
205
|
+
}
|
|
206
|
+
case 'textStyle': {
|
|
207
|
+
const color = attrs['color'];
|
|
208
|
+
if (typeof color !== 'string' || color === '')
|
|
209
|
+
return inner;
|
|
210
|
+
const safe = sanitizeColor(color);
|
|
211
|
+
if (!safe)
|
|
212
|
+
return inner;
|
|
213
|
+
return `<span style="color: ${safe}">${inner}</span>`;
|
|
214
|
+
}
|
|
215
|
+
case 'highlight': {
|
|
216
|
+
const color = attrs['color'];
|
|
217
|
+
if (typeof color !== 'string' || color === '')
|
|
218
|
+
return `<mark>${inner}</mark>`;
|
|
219
|
+
const safe = sanitizeColor(color);
|
|
220
|
+
if (!safe)
|
|
221
|
+
return `<mark>${inner}</mark>`;
|
|
222
|
+
return `<mark style="background-color: ${safe}">${inner}</mark>`;
|
|
223
|
+
}
|
|
224
|
+
default:
|
|
225
|
+
return inner;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// ─── Image ───────────────────────────────────────────────────────────
|
|
229
|
+
function renderImage(n) {
|
|
230
|
+
const attrs = (n.attrs ?? {});
|
|
231
|
+
const src = sanitizeUrl(attrs['src']);
|
|
232
|
+
// Don't emit a broken `<img>` if src couldn't be sanitized to anything
|
|
233
|
+
// meaningful. `sanitizeUrl` returns `'#'` for unsafe inputs — and `<img
|
|
234
|
+
// src="#">` re-fetches the page, which is the worst possible default.
|
|
235
|
+
if (src === '#')
|
|
236
|
+
return '';
|
|
237
|
+
const alt = typeof attrs['alt'] === 'string' ? ` alt="${escapeAttr(String(attrs['alt']))}"` : ' alt=""';
|
|
238
|
+
const title = typeof attrs['title'] === 'string' ? ` title="${escapeAttr(String(attrs['title']))}"` : '';
|
|
239
|
+
const width = pixelAttr('width', attrs['width']);
|
|
240
|
+
const height = pixelAttr('height', attrs['height']);
|
|
241
|
+
return `<img src="${src}"${alt}${title}${width}${height}>`;
|
|
242
|
+
}
|
|
243
|
+
function pixelAttr(name, raw) {
|
|
244
|
+
if (raw === null || raw === undefined || raw === '')
|
|
245
|
+
return '';
|
|
246
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
247
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
248
|
+
return '';
|
|
249
|
+
return ` ${name}="${Math.trunc(n)}"`;
|
|
250
|
+
}
|
|
251
|
+
// ─── Tables ──────────────────────────────────────────────────────────
|
|
252
|
+
/**
|
|
253
|
+
* Render a Tiptap `table` node. The Tiptap table extension stores per-column
|
|
254
|
+
* widths on individual cells via `colwidth: number[]` — we collect the widths
|
|
255
|
+
* from the first row and emit a `<colgroup>` so read-side renders match the
|
|
256
|
+
* editor's column proportions.
|
|
257
|
+
*/
|
|
258
|
+
function renderTable(n, opts) {
|
|
259
|
+
const colgroup = buildColgroup(n);
|
|
260
|
+
return `<table>${colgroup}<tbody>${renderChildren(n, opts)}</tbody></table>`;
|
|
261
|
+
}
|
|
262
|
+
function buildColgroup(table) {
|
|
263
|
+
const firstRow = table.content?.find((c) => c.type === 'tableRow');
|
|
264
|
+
if (!firstRow || !firstRow.content)
|
|
265
|
+
return '';
|
|
266
|
+
const widths = [];
|
|
267
|
+
let hasAnyWidth = false;
|
|
268
|
+
for (const cell of firstRow.content) {
|
|
269
|
+
if (cell.type !== 'tableCell' && cell.type !== 'tableHeader')
|
|
270
|
+
continue;
|
|
271
|
+
const colspan = clampPositiveInt(cell.attrs?.['colspan']) ?? 1;
|
|
272
|
+
const colwidth = cell.attrs?.['colwidth'];
|
|
273
|
+
const widthArr = Array.isArray(colwidth)
|
|
274
|
+
? colwidth.map((w) => clampPositiveInt(w))
|
|
275
|
+
: [];
|
|
276
|
+
for (let i = 0; i < colspan; i++) {
|
|
277
|
+
const w = widthArr[i] ?? null;
|
|
278
|
+
if (w !== null)
|
|
279
|
+
hasAnyWidth = true;
|
|
280
|
+
widths.push(w);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Only emit a colgroup when at least one width is known. Tiptap's table
|
|
284
|
+
// extension only sets colwidth after the user drags a column-resize handle —
|
|
285
|
+
// out-of-the-box tables have no widths, so an always-emitted colgroup would
|
|
286
|
+
// be noise.
|
|
287
|
+
if (!hasAnyWidth)
|
|
288
|
+
return '';
|
|
289
|
+
const cols = widths.map((w) => w !== null ? `<col style="width: ${w}px">` : '<col>');
|
|
290
|
+
return `<colgroup>${cols.join('')}</colgroup>`;
|
|
291
|
+
}
|
|
292
|
+
function renderCell(tag, n, opts) {
|
|
293
|
+
const attrs = (n.attrs ?? {});
|
|
294
|
+
const colspan = clampPositiveInt(attrs['colspan']);
|
|
295
|
+
const rowspan = clampPositiveInt(attrs['rowspan']);
|
|
296
|
+
const span = [
|
|
297
|
+
colspan && colspan !== 1 ? ` colspan="${colspan}"` : '',
|
|
298
|
+
rowspan && rowspan !== 1 ? ` rowspan="${rowspan}"` : '',
|
|
299
|
+
].join('');
|
|
300
|
+
return `<${tag}${span}>${renderChildren(n, opts)}</${tag}>`;
|
|
301
|
+
}
|
|
302
|
+
function clampPositiveInt(raw) {
|
|
303
|
+
if (raw === null || raw === undefined || raw === '')
|
|
304
|
+
return null;
|
|
305
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
306
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
307
|
+
return null;
|
|
308
|
+
return Math.trunc(n);
|
|
309
|
+
}
|
|
310
|
+
// ─── Details (collapsible blocks) ────────────────────────────────────
|
|
311
|
+
/**
|
|
312
|
+
* Render a `details` node. The `open` attribute round-trips the editor's
|
|
313
|
+
* open/closed state when `Details.configure({ persist: true })` is set —
|
|
314
|
+
* matches the platform `<details open>` attribute exactly so a reader's
|
|
315
|
+
* snapshot reflects how the author last left it.
|
|
316
|
+
*/
|
|
317
|
+
function renderDetails(n, opts) {
|
|
318
|
+
const isOpen = n.attrs?.['open'] === true;
|
|
319
|
+
return `<details${isOpen ? ' open' : ''}>${renderChildren(n, opts)}</details>`;
|
|
320
|
+
}
|
|
321
|
+
// ─── Grid (multi-column layout) ──────────────────────────────────────
|
|
322
|
+
/**
|
|
323
|
+
* Render a `grid` node. The `data-columns` attribute round-trips the
|
|
324
|
+
* editor's column count; class names mirror the editor's `renderHTML` so
|
|
325
|
+
* one stylesheet paints both surfaces (consumer owns the CSS — same
|
|
326
|
+
* posture as `lead` / `small`).
|
|
327
|
+
*
|
|
328
|
+
* Out-of-range column counts (anything other than 2 or 3) clamp to 2 —
|
|
329
|
+
* the schema enforces it on the editor side, but a tampered Tiptap JSON
|
|
330
|
+
* fed straight to the renderer shouldn't paint a `grid-cols-99` class.
|
|
331
|
+
*/
|
|
332
|
+
function renderGrid(n, opts) {
|
|
333
|
+
const cols = clampGridColumnsForRender(n.attrs?.['columns']);
|
|
334
|
+
return `<div class="pilotiq-grid pilotiq-grid-cols-${cols}">${renderChildren(n, opts)}</div>`;
|
|
335
|
+
}
|
|
336
|
+
function clampGridColumnsForRender(raw) {
|
|
337
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
338
|
+
if (!Number.isFinite(n))
|
|
339
|
+
return 2;
|
|
340
|
+
const trunc = Math.trunc(n);
|
|
341
|
+
return trunc === 3 ? 3 : 2;
|
|
342
|
+
}
|
|
343
|
+
// ─── Merge tags + mentions ───────────────────────────────────────────
|
|
344
|
+
/**
|
|
345
|
+
* Render a `mergeTag` atom — either substitute the value from
|
|
346
|
+
* `opts.mergeTags` (HTML-escaped) or fall back to a styled `<span>` that
|
|
347
|
+
* preserves the placeholder visually so server-rendered previews stay
|
|
348
|
+
* informative when no substitution map is supplied.
|
|
349
|
+
*/
|
|
350
|
+
function renderMergeTag(n, opts) {
|
|
351
|
+
const id = String((n.attrs ?? {})['id'] ?? '').trim();
|
|
352
|
+
if (id === '')
|
|
353
|
+
return '';
|
|
354
|
+
const map = opts.mergeTags;
|
|
355
|
+
// Only substitute when the map explicitly carries the id — using
|
|
356
|
+
// `Object.prototype.hasOwnProperty` so `null` / empty-string substitutions
|
|
357
|
+
// still win over the fallback span.
|
|
358
|
+
if (map && Object.prototype.hasOwnProperty.call(map, id)) {
|
|
359
|
+
return escapeHtml(String(map[id] ?? ''));
|
|
360
|
+
}
|
|
361
|
+
return `<span class="merge-tag" data-id="${escapeAttr(id)}">{{ ${escapeHtml(id)} }}</span>`;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Render a `mention` atom as a styled `<span>` carrying the cached label.
|
|
365
|
+
* `opts.resolveMention` can override the label per `(trigger, id)` pair —
|
|
366
|
+
* useful for refreshing display names from a directory at render time.
|
|
367
|
+
* Both `id` and `trigger` are required; missing either drops the chip.
|
|
368
|
+
*/
|
|
369
|
+
function renderMention(n, opts) {
|
|
370
|
+
const attrs = (n.attrs ?? {});
|
|
371
|
+
const id = String(attrs['id'] ?? '').trim();
|
|
372
|
+
const trigger = String(attrs['trigger'] ?? '').trim();
|
|
373
|
+
if (id === '' || trigger === '')
|
|
374
|
+
return '';
|
|
375
|
+
const cached = String(attrs['label'] ?? '').trim();
|
|
376
|
+
const resolved = opts.resolveMention?.(trigger, id);
|
|
377
|
+
const label = resolved !== undefined ? resolved : (cached !== '' ? cached : id);
|
|
378
|
+
return (`<span class="mention" data-trigger="${escapeAttr(trigger)}" data-id="${escapeAttr(id)}">` +
|
|
379
|
+
escapeHtml(`${trigger}${label}`) +
|
|
380
|
+
`</span>`);
|
|
381
|
+
}
|
|
382
|
+
// ─── Custom blocks ───────────────────────────────────────────────────
|
|
383
|
+
function renderCustomBlock(n) {
|
|
384
|
+
const type = String(n.type ?? '');
|
|
385
|
+
const dataAttrs = n.attrs ? ` data-attrs="${escapeAttr(JSON.stringify(n.attrs))}"` : '';
|
|
386
|
+
const inner = n.content ? renderChildren(n, {}) : '';
|
|
387
|
+
return `<div data-type="${escapeAttr(type)}"${dataAttrs}>${inner}</div>`;
|
|
388
|
+
}
|
|
389
|
+
// ─── Escapers + sanitizers ───────────────────────────────────────────
|
|
390
|
+
function escapeHtml(s) {
|
|
391
|
+
return s.replace(/[&<>"']/g, ch => HTML_ESCAPES[ch] ?? ch);
|
|
392
|
+
}
|
|
393
|
+
const HTML_ESCAPES = {
|
|
394
|
+
'&': '&',
|
|
395
|
+
'<': '<',
|
|
396
|
+
'>': '>',
|
|
397
|
+
'"': '"',
|
|
398
|
+
"'": ''',
|
|
399
|
+
};
|
|
400
|
+
function escapeAttr(s) {
|
|
401
|
+
return escapeHtml(s);
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Allowlist for color values. Accepts hex (`#abc` / `#abcdef`), rgb()/rgba(),
|
|
405
|
+
* hsl()/hsla(), oklch(), and named colors (alpha-only). Returns `''` for
|
|
406
|
+
* anything that doesn't match — caller falls back to no inline style.
|
|
407
|
+
*/
|
|
408
|
+
function sanitizeColor(raw) {
|
|
409
|
+
const v = raw.trim();
|
|
410
|
+
if (v === '')
|
|
411
|
+
return '';
|
|
412
|
+
if (/^#[0-9a-f]{3,8}$/i.test(v))
|
|
413
|
+
return v;
|
|
414
|
+
if (/^rgba?\([^()<>"']+\)$/i.test(v))
|
|
415
|
+
return v;
|
|
416
|
+
if (/^hsla?\([^()<>"']+\)$/i.test(v))
|
|
417
|
+
return v;
|
|
418
|
+
if (/^oklch\([^()<>"']+\)$/i.test(v))
|
|
419
|
+
return v;
|
|
420
|
+
if (/^[a-z]+$/i.test(v))
|
|
421
|
+
return v;
|
|
422
|
+
return '';
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Block dangerous URL schemes. Anything that isn't an absolute http(s),
|
|
426
|
+
* mailto, tel, anchor (#…), root-relative (/…), or relative path falls
|
|
427
|
+
* back to `#`. Output is HTML-escaped.
|
|
428
|
+
*/
|
|
429
|
+
function sanitizeUrl(raw) {
|
|
430
|
+
if (typeof raw !== 'string')
|
|
431
|
+
return '#';
|
|
432
|
+
const v = raw.trim();
|
|
433
|
+
if (v === '')
|
|
434
|
+
return '#';
|
|
435
|
+
if (/^(?:javascript|data|vbscript):/i.test(v))
|
|
436
|
+
return '#';
|
|
437
|
+
return escapeAttr(v);
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=render.js.map
|