@clevertask/scribe 0.1.14 → 0.1.16
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/README.md +8 -4
- package/dist/components/Menu/ExternalLinkDisplayOptions.js +2 -2
- package/dist/components/Scribe/extension/external-link-preview/attributes.d.ts +4 -1
- package/dist/components/Scribe/extension/external-link-preview/attributes.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/attributes.js +9 -2
- package/dist/components/Scribe/extension/external-link-preview/commands.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/commands.js +67 -66
- package/dist/components/Scribe/extension/external-link-preview/index.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/index.js +2 -1
- package/dist/components/Scribe/extension/external-link-preview/node-view.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/node-view.js +2 -2
- package/dist/components/Scribe/extension/external-link-preview/paste.d.ts +2 -2
- package/dist/components/Scribe/extension/external-link-preview/paste.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/paste.js +24 -25
- package/dist/components/Scribe/extension/external-link-preview/render-html.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/render-html.js +3 -3
- package/dist/components/Scribe/extension/external-link-preview/resolver.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/resolver.js +1 -1
- package/dist/components/Scribe/extension/external-link-preview/serialization.d.ts.map +1 -1
- package/dist/components/Scribe/extension/external-link-preview/serialization.js +3 -3
- package/dist/components/Scribe/extension/external-link-preview/types.d.ts +7 -0
- package/dist/components/Scribe/extension/external-link-preview/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -126,7 +126,7 @@ Simple headed tables serialize as GFM Markdown. Tables with merged cells, multip
|
|
|
126
126
|
> [!NOTE]
|
|
127
127
|
> External Link Previews are experimental. Their public API, built-in card presentation, and link-options UI may change as we test them in real document workflows.
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
Compact links work locally without a metadata provider. Scribe builds their visible label from authored link text or, for a raw URL, from its hostname and path. The exact destination—including its query and fragment—remains unchanged. Preview cards are opt-in: Scribe owns their editor behavior and presentation, while your app owns metadata fetching. Pass a resolver that calls an authenticated app endpoint; Scribe never requests the destination website directly.
|
|
130
130
|
|
|
131
131
|
That endpoint should validate the destination, block private or reserved network addresses, re-check redirects, and enforce response-size and timeout limits before returning sanitized metadata.
|
|
132
132
|
|
|
@@ -156,15 +156,19 @@ function DocumentEditor() {
|
|
|
156
156
|
externalLinkPreview={{
|
|
157
157
|
resolve: resolveLinkPreview,
|
|
158
158
|
shouldPreview,
|
|
159
|
+
// Defaults to false. When enabled, standalone pastes become local Compact links.
|
|
160
|
+
autoPreviewOnPaste: false,
|
|
159
161
|
}}
|
|
160
162
|
/>
|
|
161
163
|
);
|
|
162
164
|
}
|
|
163
165
|
```
|
|
164
166
|
|
|
165
|
-
|
|
167
|
+
By default, pasting a standalone external URL creates an ordinary link. Select it and choose Compact to shorten only its presentation, with no metadata request. A meaningful authored label is kept; a raw URL is shown as `hostname/path` without its query or fragment. Switching back to Plain restores the original label and exact destination. Set `autoPreviewOnPaste: true` only if standalone URL pastes should become local Compact links automatically. Pasting a URL over selected text always keeps an ordinary labeled link.
|
|
166
168
|
|
|
167
|
-
|
|
169
|
+
While editing, select a Plain, Compact, or Card link to open its contextual menu. From there you can edit or open the destination, or switch presentation. A Preview card is available only when the link has its own line and metadata is already stored or a resolver is configured. Refresh is available only for Preview cards with a resolver. Keyboard users can press `Alt + F10` from a selected link to open the same menu and press Escape to return to the document.
|
|
170
|
+
|
|
171
|
+
The resolver runs only when a Preview card needs metadata: after explicit Card conversion, programmatic Card insertion, a Card destination edit, or Card refresh. Compact creation, editing, automatic paste, and document reopen make no metadata request. The resolver receives an `AbortSignal`, and can return `pageTitle`, `description`, `siteName`, `faviconUrl`, `imageUrl`, and `fetchedAt`. Use `shouldPreview` to keep app-owned or otherwise unsupported destinations on the ordinary-link path.
|
|
168
172
|
|
|
169
173
|
Preview nodes use sanitized raw HTML when content is serialized as Markdown, so their metadata and presentation survive Scribe's current Markdown round trip. A caller-owned `externalEditor` must register `ExternalLinkPreview` itself.
|
|
170
174
|
|
|
@@ -250,7 +254,7 @@ If your content arrives as HTML (for example from a server), use the helper belo
|
|
|
250
254
|
| `autoFocus` | `boolean` | `false` | Controls whether the editor should automatically focus when mounted. |
|
|
251
255
|
| `extensions` | `Extension[]` | `undefined` | You can set your own extensions for the text editor. For more information, [check the tip tap extensions docs](https://tiptap.dev/docs/editor/core-concepts/extensions) |
|
|
252
256
|
| `externalEditor` | `Editor` | `undefined` | Uses a caller-owned Tiptap editor. The caller remains responsible for its extension and plugin lifecycle, including table resizing, and for destroying it. |
|
|
253
|
-
| `externalLinkPreview` | `Partial<ExternalLinkPreviewOptions>` | `undefined` | Experimental. Opts into external-link metadata resolution and enhanced Compact/Card presentation. The consumer owns fetching and destination policy.
|
|
257
|
+
| `externalLinkPreview` | `Partial<ExternalLinkPreviewOptions>` | `undefined` | Experimental. Opts into external-link metadata resolution and enhanced Compact/Card presentation. The consumer owns fetching and destination policy; automatic previews on paste default to disabled. |
|
|
254
258
|
| `editorProps` | `EditorProps` | `undefined` | A tiptap-based prop to handle advanced use cases, you can read about it on their [documentation](https://tiptap.dev/docs/editor/api/editor#editorprops) |
|
|
255
259
|
| `showBarMenu` | `boolean` | `true` | Determines whether to show the text editor top menu bar or not. This menu bar shows options to format the text |
|
|
256
260
|
| `placeholderText` | `string` | `Type "/" for commands...` | Change the initial placeholder for your text editor |
|
|
@@ -9,7 +9,7 @@ var s = [
|
|
|
9
9
|
label: "Plain link"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
|
-
description: "Show
|
|
12
|
+
description: "Show a concise label without fetching metadata.",
|
|
13
13
|
display: "compact",
|
|
14
14
|
label: "Compact"
|
|
15
15
|
},
|
|
@@ -46,7 +46,7 @@ var s = [
|
|
|
46
46
|
direction: "column",
|
|
47
47
|
gap: "1",
|
|
48
48
|
children: s.map((r) => {
|
|
49
|
-
let i = u === r.display, s = b[r.display], c = `${h}-${r.display}-description`, l = r.display === "card" && !s ? "Preview
|
|
49
|
+
let i = u === r.display, s = b[r.display], c = `${h}-${r.display}-description`, l = r.display === "card" && !s ? "Preview cards require metadata support and their own line." : r.description;
|
|
50
50
|
return /* @__PURE__ */ a(e, {
|
|
51
51
|
type: "button",
|
|
52
52
|
"aria-describedby": c,
|
|
@@ -14,5 +14,8 @@ export declare const normalizeExternalLinkPreviewMetadata: (metadata: ExternalLi
|
|
|
14
14
|
export declare const normalizeExternalLinkPreviewMetadataPatch: (metadata: ExternalLinkPreviewMetadata) => Partial<Required<ExternalLinkPreviewMetadata>>;
|
|
15
15
|
export declare const normalizeExternalLinkPreviewAttributes: (input: Partial<Record<keyof ExternalLinkPreviewAttributes, unknown>>) => ExternalLinkPreviewAttributes | null;
|
|
16
16
|
export declare const getExternalLinkPreviewHostname: (href: string) => string;
|
|
17
|
-
|
|
17
|
+
/** Build a concise, presentation-only label without changing the authored destination. */
|
|
18
|
+
export declare const getExternalLinkPreviewReadableLabel: (href: string) => string;
|
|
19
|
+
export declare const getExternalLinkPreviewTitle: (attributes: Pick<ExternalLinkPreviewAttributes, "href" | "linkText" | "pageTitle" | "siteName">, display: ExternalLinkPreviewDisplay) => string;
|
|
20
|
+
export declare const hasExternalLinkPreviewMetadata: (attributes: Pick<ExternalLinkPreviewAttributes, "pageTitle" | "description" | "siteName" | "faviconUrl" | "imageUrl">) => boolean;
|
|
18
21
|
//# sourceMappingURL=attributes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EACjC,MAAM,SAAS,CAAC;AA8CjB,8EAA8E;AAC9E,eAAO,MAAM,+BAA+B,wBAAwB,CAAC;AACrE,eAAO,MAAM,8BAA8B,8CAA4C,CAAC;AACxF,eAAO,MAAM,qCAAqC,gCAAgC,CAAC;AAEnF,eAAO,MAAM,4BAA4B,UAAW,OAAO,KAAG,KAAK,IAAI,0BAC2B,CAAC;AAwBnG,eAAO,MAAM,oCAAoC,UAAW,OAAO,KAAG,MAAM,GAAG,IACE,CAAC;AAElF,oGAAoG;AACpG,eAAO,MAAM,gCAAgC,UAAW,OAAO,KAAG,MAAM,GAAG,IAuB1E,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,oCAAoC,UAAW,OAAO,KAAG,MAAM,GAAG,IAwB9E,CAAC;AAcF,eAAO,MAAM,oCAAoC,aACrC,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,KACjF,QAAQ,CAAC,2BAA2B,CAOrC,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,yCAAyC,aAC1C,2BAA2B,KACpC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAW/C,CAAC;AAEF,eAAO,MAAM,sCAAsC,UAC1C,OAAO,CAAC,MAAM,CAAC,MAAM,6BAA6B,EAAE,OAAO,CAAC,CAAC,KACnE,6BAA6B,GAAG,IAgBlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,SAAU,MAAM,WAM1D,CAAC;AAEF,eAAO,MAAM,2BAA2B,eAC1B,IAAI,CAAC,6BAA6B,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EACjC,MAAM,SAAS,CAAC;AA8CjB,8EAA8E;AAC9E,eAAO,MAAM,+BAA+B,wBAAwB,CAAC;AACrE,eAAO,MAAM,8BAA8B,8CAA4C,CAAC;AACxF,eAAO,MAAM,qCAAqC,gCAAgC,CAAC;AAEnF,eAAO,MAAM,4BAA4B,UAAW,OAAO,KAAG,KAAK,IAAI,0BAC2B,CAAC;AAwBnG,eAAO,MAAM,oCAAoC,UAAW,OAAO,KAAG,MAAM,GAAG,IACE,CAAC;AAElF,oGAAoG;AACpG,eAAO,MAAM,gCAAgC,UAAW,OAAO,KAAG,MAAM,GAAG,IAuB1E,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,oCAAoC,UAAW,OAAO,KAAG,MAAM,GAAG,IAwB9E,CAAC;AAcF,eAAO,MAAM,oCAAoC,aACrC,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,KACjF,QAAQ,CAAC,2BAA2B,CAOrC,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,yCAAyC,aAC1C,2BAA2B,KACpC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAW/C,CAAC;AAEF,eAAO,MAAM,sCAAsC,UAC1C,OAAO,CAAC,MAAM,CAAC,MAAM,6BAA6B,EAAE,OAAO,CAAC,CAAC,KACnE,6BAA6B,GAAG,IAgBlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,SAAU,MAAM,WAM1D,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,mCAAmC,SAAU,MAAM,WAS/D,CAAC;AAEF,eAAO,MAAM,2BAA2B,eAC1B,IAAI,CAAC,6BAA6B,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC,WACtF,0BAA0B,WAWpC,CAAC;AAEF,eAAO,MAAM,8BAA8B,eAC7B,IAAI,CACd,6BAA6B,EAC7B,WAAW,GAAG,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,CACrE,YAQA,CAAC"}
|
|
@@ -77,6 +77,13 @@ var t = /^\/(?![\\/])/, n = /^https?:\/\//i, r = 16384, i = 16384, a = 512, o =
|
|
|
77
77
|
} catch {
|
|
78
78
|
return e;
|
|
79
79
|
}
|
|
80
|
-
}, D = (e) =>
|
|
80
|
+
}, D = (e) => {
|
|
81
|
+
try {
|
|
82
|
+
let t = new URL(e), n = t.pathname === "/" ? "" : t.pathname;
|
|
83
|
+
return `${t.host}${n}`;
|
|
84
|
+
} catch {
|
|
85
|
+
return e;
|
|
86
|
+
}
|
|
87
|
+
}, O = (e, t) => t === "compact" ? e.linkText === e.href ? D(e.href) : e.linkText : e.pageTitle || e.siteName || E(e.href), k = (e) => !!(e.pageTitle || e.description || e.siteName || e.faviconUrl || e.imageUrl);
|
|
81
88
|
//#endregion
|
|
82
|
-
export { m as EXTERNAL_LINK_PREVIEW_NODE_NAME, h as EXTERNAL_LINK_PREVIEW_SELECTOR, g as EXTERNAL_LINK_PREVIEW_TARGET_SELECTOR, E as getExternalLinkPreviewHostname, D as getExternalLinkPreviewTitle, _ as isExternalLinkPreviewDisplay, T as normalizeExternalLinkPreviewAttributes, b as normalizeExternalLinkPreviewHref, y as normalizeExternalLinkPreviewLinkText, x as normalizeExternalLinkPreviewMediaUrl, C as normalizeExternalLinkPreviewMetadata, w as normalizeExternalLinkPreviewMetadataPatch };
|
|
89
|
+
export { m as EXTERNAL_LINK_PREVIEW_NODE_NAME, h as EXTERNAL_LINK_PREVIEW_SELECTOR, g as EXTERNAL_LINK_PREVIEW_TARGET_SELECTOR, E as getExternalLinkPreviewHostname, D as getExternalLinkPreviewReadableLabel, O as getExternalLinkPreviewTitle, k as hasExternalLinkPreviewMetadata, _ as isExternalLinkPreviewDisplay, T as normalizeExternalLinkPreviewAttributes, b as normalizeExternalLinkPreviewHref, y as normalizeExternalLinkPreviewLinkText, x as normalizeExternalLinkPreviewMediaUrl, C as normalizeExternalLinkPreviewMetadata, w as normalizeExternalLinkPreviewMetadataPatch };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,IAAI,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,IAAI,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAUpD,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAE7B,gCAAgC,EAChC,gCAAgC,EACjC,MAAM,SAAS,CAAC;AAEjB,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,mBAAmB,EAAE;YACnB,iEAAiE;YACjE,yBAAyB,EAAE,CAAC,OAAO,EAAE,gCAAgC,KAAK,UAAU,CAAC;YACrF,yFAAyF;YACzF,sBAAsB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;YAC9F,0FAA0F;YAC1F,iCAAiC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;YACzF,kEAAkE;YAClE,0BAA0B,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;YACpE,oFAAoF;YACpF,yBAAyB,EAAE,CACzB,OAAO,EAAE,gCAAgC,EACzC,cAAc,CAAC,EAAE,MAAM,KACpB,UAAU,CAAC;SACjB,CAAC;KACH;CACF;AAED,UAAU,cAAc;IACtB,UAAU,EAAE,6BAA6B,CAAC;IAC1C,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAWD,eAAO,MAAM,8BAA8B,gBAC5B,WAAW,mBACP,MAAM,KACtB,cAAc,GAAG,IAyCnB,CAAC;AAkHF,eAAO,MAAM,iCAAiC,wCAG3C;IACD,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C;IACC,yBAAyB,YACb,gCAAgC,wBACvB;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IA8ChF,sBAAsB,YACV,mBAAmB,mBAAmB,MAAM,wBACnC;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IA4FhF,iCAAiC,kBACf,MAAM,mBAAmB,MAAM,wBAC5B;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IA+BhF,0BAA0B,oBACN,MAAM,wBACL;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IAsBhF,yBAAyB,YACb,gCAAgC,mBAAmB,MAAM,wBAChD;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;CAsEhF,CAAC"}
|
|
@@ -1,118 +1,119 @@
|
|
|
1
1
|
import { v as e } from "../../../../dist-tNcpTcFT.js";
|
|
2
2
|
import { normalizeLinkUrl as t } from "../../../Menu/linkUrl.js";
|
|
3
|
-
import { EXTERNAL_LINK_PREVIEW_NODE_NAME as n,
|
|
4
|
-
import { startExternalLinkPreviewResolution as
|
|
5
|
-
import { NodeSelection as
|
|
3
|
+
import { EXTERNAL_LINK_PREVIEW_NODE_NAME as n, hasExternalLinkPreviewMetadata as r, normalizeExternalLinkPreviewAttributes as i, normalizeExternalLinkPreviewHref as a } from "./attributes.js";
|
|
4
|
+
import { startExternalLinkPreviewResolution as o } from "./resolver.js";
|
|
5
|
+
import { NodeSelection as s, TextSelection as c } from "@tiptap/pm/state";
|
|
6
6
|
//#region lib/components/Scribe/extension/external-link-preview/commands.ts
|
|
7
|
-
var
|
|
8
|
-
let { selection: n } = e,
|
|
9
|
-
if (
|
|
10
|
-
let a =
|
|
11
|
-
if (!
|
|
12
|
-
let c =
|
|
7
|
+
var l = (e, t) => {
|
|
8
|
+
let { selection: n } = e, r = typeof t == "number";
|
|
9
|
+
if (r && (!Number.isInteger(t) || t < 0 || t >= e.doc.content.size)) return null;
|
|
10
|
+
let a = r ? t : n.from, o = r ? e.doc.nodeAt(a) : n instanceof s ? n.node : null;
|
|
11
|
+
if (!o || o.type.name !== "externalLinkPreview") return null;
|
|
12
|
+
let c = i(o.attrs);
|
|
13
13
|
if (!c) return null;
|
|
14
14
|
let l = e.doc.resolve(a);
|
|
15
15
|
return {
|
|
16
16
|
attributes: c,
|
|
17
|
-
node:
|
|
17
|
+
node: o,
|
|
18
18
|
position: a,
|
|
19
|
-
isSoleTextblockContent: l.parent.isTextblock && l.parent.childCount === 1 && l.parent.content.size ===
|
|
19
|
+
isSoleTextblockContent: l.parent.isTextblock && l.parent.childCount === 1 && l.parent.content.size === o.nodeSize
|
|
20
20
|
};
|
|
21
|
-
},
|
|
21
|
+
}, u = (t) => {
|
|
22
22
|
let n = t.doc.type.schema.marks.link;
|
|
23
23
|
if (!n) return null;
|
|
24
24
|
let { selection: r } = t;
|
|
25
25
|
if (!r.$from.sameParent(r.$to) || !r.$from.parent.isTextblock) return null;
|
|
26
|
-
let
|
|
27
|
-
if (!
|
|
26
|
+
let i = e(r.$from, n), o = r.$from.start(), s = r.$from.parent;
|
|
27
|
+
if (!i) return null;
|
|
28
28
|
let c, l = !0, u = "";
|
|
29
|
-
t.doc.nodesBetween(
|
|
29
|
+
t.doc.nodesBetween(i.from, i.to, (e, t) => {
|
|
30
30
|
if (!e.isText) {
|
|
31
31
|
e.isInline && (l = !1);
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
|
-
let r = e.marks.find((e) => e.type === n),
|
|
34
|
+
let r = e.marks.find((e) => e.type === n), a = Math.max(i.from, t), o = Math.min(i.to, t + e.nodeSize);
|
|
35
35
|
if (!r || e.marks.some((e) => e.type !== n) || c && r.attrs.href !== c.attrs.href) {
|
|
36
36
|
l = !1;
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
|
-
c = r, u += e.text?.slice(
|
|
39
|
+
c = r, u += e.text?.slice(a - t, o - t) ?? "";
|
|
40
40
|
});
|
|
41
|
-
let d =
|
|
41
|
+
let d = a(c?.attrs.href);
|
|
42
42
|
return !l || !c || !d ? null : {
|
|
43
43
|
href: d,
|
|
44
44
|
linkText: u || d,
|
|
45
45
|
mark: c,
|
|
46
|
-
from:
|
|
47
|
-
to:
|
|
48
|
-
isSoleTextblockContent:
|
|
46
|
+
from: i.from,
|
|
47
|
+
to: i.to,
|
|
48
|
+
isSoleTextblockContent: i.from === o && i.to === o + s.content.size
|
|
49
49
|
};
|
|
50
|
-
},
|
|
50
|
+
}, d = (e, t) => {
|
|
51
51
|
if (!t) return !0;
|
|
52
52
|
try {
|
|
53
53
|
return t(e);
|
|
54
54
|
} catch {
|
|
55
55
|
return !1;
|
|
56
56
|
}
|
|
57
|
-
},
|
|
58
|
-
e.setSelection(
|
|
59
|
-
},
|
|
57
|
+
}, f = (e, t) => {
|
|
58
|
+
e.setSelection(s.create(e.doc, t));
|
|
59
|
+
}, p = (e, t) => e.doc.type.schema.nodes.externalLinkPreview?.create(t) ?? null, m = (e, t, n = t.attributes.href, r = t.attributes.linkText) => {
|
|
60
60
|
let i = e.doc.type.schema.marks.link, a = e.doc.resolve(t.position).parent;
|
|
61
61
|
if (!i || !a.type.allowsMarkType(i)) return !1;
|
|
62
62
|
let o = e.doc.type.schema.text(r, [i.create({ href: n })]);
|
|
63
|
-
return e.replaceWith(t.position, t.position + t.node.nodeSize, o), e.setSelection(
|
|
64
|
-
},
|
|
65
|
-
insertExternalLinkPreview: (t) => ({ dispatch:
|
|
66
|
-
let
|
|
63
|
+
return e.replaceWith(t.position, t.position + t.node.nodeSize, o), e.setSelection(c.create(e.doc, t.position, t.position + o.nodeSize)), !0;
|
|
64
|
+
}, h = ({ resolveMetadata: e, shouldPreview: s }) => ({
|
|
65
|
+
insertExternalLinkPreview: (t) => ({ dispatch: a, tr: c }) => {
|
|
66
|
+
let l = i({
|
|
67
67
|
...t,
|
|
68
68
|
linkText: t.linkText ?? t.href,
|
|
69
69
|
display: t.display ?? "compact"
|
|
70
|
-
}),
|
|
71
|
-
if (!
|
|
72
|
-
let
|
|
73
|
-
if (!
|
|
74
|
-
if (!
|
|
75
|
-
let
|
|
76
|
-
return
|
|
70
|
+
}), u = c.doc.type.schema.nodes[n], { selection: p } = c, m = l?.display === "card" && !r(l);
|
|
71
|
+
if (!l || !u || m && !e || !d(l.href, s) || !p.$from.sameParent(p.$to) || !p.$from.parent.isTextblock || l.display === "card" && p.$from.parent.content.size !== p.content().size) return !1;
|
|
72
|
+
let h = p.$from.index();
|
|
73
|
+
if (!p.$from.parent.canReplaceWith(h, h, u)) return !1;
|
|
74
|
+
if (!a) return !0;
|
|
75
|
+
let g = u.create(l), _ = p.from;
|
|
76
|
+
return c.replaceRangeWith(p.from, p.to, g), f(c, _), m && o(c, _, l.href), !0;
|
|
77
77
|
},
|
|
78
|
-
setExternalLinkDisplay: (t, n) => ({ dispatch:
|
|
79
|
-
let
|
|
80
|
-
if (
|
|
81
|
-
|
|
78
|
+
setExternalLinkDisplay: (t, n) => ({ dispatch: a, tr: c }) => {
|
|
79
|
+
let h = () => (c.setMeta("preventDispatch", !0), !1), g = l(c, n);
|
|
80
|
+
if (g) {
|
|
81
|
+
let n = t === "card" && !r(g.attributes);
|
|
82
|
+
if (t === "card" && !g.isSoleTextblockContent) return h();
|
|
82
83
|
if (t === "plain") {
|
|
83
|
-
let e =
|
|
84
|
-
return !e || !t.type.allowsMarkType(e) ?
|
|
84
|
+
let e = c.doc.type.schema.marks.link, t = c.doc.resolve(g.position).parent;
|
|
85
|
+
return !e || !t.type.allowsMarkType(e) ? h() : !a || m(c, g);
|
|
85
86
|
}
|
|
86
|
-
return t !== "compact" && t !== "card" ?
|
|
87
|
-
...
|
|
87
|
+
return t !== "compact" && t !== "card" || n && !e ? h() : !a || g.attributes.display === t || (c.setNodeMarkup(g.position, void 0, {
|
|
88
|
+
...g.attributes,
|
|
88
89
|
display: t
|
|
89
|
-
}),
|
|
90
|
+
}), f(c, g.position), n && o(c, g.position, g.attributes.href), !0);
|
|
90
91
|
}
|
|
91
|
-
if (typeof n == "number") return
|
|
92
|
-
let
|
|
93
|
-
if (!
|
|
94
|
-
let
|
|
95
|
-
href:
|
|
96
|
-
linkText:
|
|
92
|
+
if (typeof n == "number") return h();
|
|
93
|
+
let _ = u(c);
|
|
94
|
+
if (!_ || t === "plain" || t === "card" && !e || t === "card" && !_.isSoleTextblockContent || !d(_.href, s)) return t === "plain" && _ ? !0 : h();
|
|
95
|
+
let v = i({
|
|
96
|
+
href: _.href,
|
|
97
|
+
linkText: _.linkText,
|
|
97
98
|
display: t
|
|
98
|
-
}),
|
|
99
|
-
return !
|
|
99
|
+
}), y = v ? p(c, v) : null;
|
|
100
|
+
return !v || !y ? h() : !a || (c.replaceWith(_.from, _.to, y), f(c, _.from), t === "card" && o(c, _.from, v.href), !0);
|
|
100
101
|
},
|
|
101
102
|
convertExternalLinkPreviewToPlain: (e, n) => ({ dispatch: r, tr: i }) => {
|
|
102
|
-
let a = () => (i.setMeta("preventDispatch", !0), !1), o =
|
|
103
|
+
let a = () => (i.setMeta("preventDispatch", !0), !1), o = l(i, n), s = t(e);
|
|
103
104
|
if (!o || !s) return a();
|
|
104
|
-
let
|
|
105
|
-
return !
|
|
105
|
+
let c = i.doc.type.schema.marks.link, u = i.doc.resolve(o.position).parent;
|
|
106
|
+
return !c || !u.type.allowsMarkType(c) ? a() : !r || m(i, o, s, o.attributes.linkText === o.attributes.href ? s : o.attributes.linkText);
|
|
106
107
|
},
|
|
107
108
|
refreshExternalLinkPreview: (t) => ({ dispatch: n, tr: r }) => {
|
|
108
|
-
let i =
|
|
109
|
-
return !i || !e || !
|
|
109
|
+
let i = l(r, t);
|
|
110
|
+
return !i || i.attributes.display !== "card" || !e || !d(i.attributes.href, s) ? !1 : (n && (typeof t == "number" && f(r, i.position), o(r, i.position, i.attributes.href), r.setMeta("addToHistory", !1)), !0);
|
|
110
111
|
},
|
|
111
|
-
updateExternalLinkPreview: (t, n) => ({ dispatch:
|
|
112
|
-
let
|
|
113
|
-
if (!p) return
|
|
114
|
-
let m = t.href ?? p.attributes.href, h =
|
|
115
|
-
if (!h || !
|
|
112
|
+
updateExternalLinkPreview: (t, n) => ({ dispatch: r, tr: c }) => {
|
|
113
|
+
let u = () => (c.setMeta("preventDispatch", !0), !1), p = l(c, n);
|
|
114
|
+
if (!p) return u();
|
|
115
|
+
let m = t.href ?? p.attributes.href, h = a(m), g = h !== p.attributes.href;
|
|
116
|
+
if (!h || !d(h, s)) return u();
|
|
116
117
|
let _ = Object.fromEntries(Object.entries(t).filter(([, e]) => e !== void 0)), v = g ? {
|
|
117
118
|
pageTitle: null,
|
|
118
119
|
description: null,
|
|
@@ -120,15 +121,15 @@ var c = (e, t) => {
|
|
|
120
121
|
faviconUrl: null,
|
|
121
122
|
imageUrl: null,
|
|
122
123
|
fetchedAt: null
|
|
123
|
-
} : {}, y =
|
|
124
|
+
} : {}, y = i({
|
|
124
125
|
...p.attributes,
|
|
125
126
|
...v,
|
|
126
127
|
..._,
|
|
127
128
|
href: h,
|
|
128
129
|
linkText: t.linkText ?? (g && p.attributes.linkText === p.attributes.href ? h : p.attributes.linkText)
|
|
129
130
|
});
|
|
130
|
-
return y ? !Object.entries(y).some(([e, t]) => p.attributes[e] !== t) || !
|
|
131
|
+
return y ? !Object.entries(y).some(([e, t]) => p.attributes[e] !== t) || !r || (c.setNodeMarkup(p.position, void 0, y), f(c, p.position), g && p.attributes.display === "card" && e && o(c, p.position, y.href), !0) : u();
|
|
131
132
|
}
|
|
132
133
|
});
|
|
133
134
|
//#endregion
|
|
134
|
-
export {
|
|
135
|
+
export { h as createExternalLinkPreviewCommands, l as getSelectedExternalLinkPreview };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAyBpC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAyC1D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAyBpC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAyC1D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,uCAmJ9B,CAAC;AAEH,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,SAAS,CAAC;AACzD,YAAY,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,mCAAmC,EACnC,2BAA2B,EAC3B,kCAAkC,EAClC,gCAAgC,EAChC,gCAAgC,GACjC,MAAM,SAAS,CAAC"}
|
|
@@ -32,6 +32,7 @@ var b = (e) => {
|
|
|
32
32
|
addOptions() {
|
|
33
33
|
return {
|
|
34
34
|
HTMLAttributes: {},
|
|
35
|
+
autoPreviewOnPaste: !1,
|
|
35
36
|
resolve: void 0,
|
|
36
37
|
shouldPreview: void 0
|
|
37
38
|
};
|
|
@@ -122,7 +123,7 @@ var b = (e) => {
|
|
|
122
123
|
return [
|
|
123
124
|
_({
|
|
124
125
|
previewType: this.type,
|
|
125
|
-
|
|
126
|
+
autoPreviewOnPaste: this.options.autoPreviewOnPaste === !0,
|
|
126
127
|
shouldPreview: this.options.shouldPreview
|
|
127
128
|
}),
|
|
128
129
|
v(this.options.shouldPreview),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-view.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/node-view.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAkB,MAAM,eAAe,CAAC;AAiCpF,eAAO,MAAM,2BAA2B,6BAA8B,aAAa,
|
|
1
|
+
{"version":3,"file":"node-view.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/node-view.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAkB,MAAM,eAAe,CAAC;AAiCpF,eAAO,MAAM,2BAA2B,6BAA8B,aAAa,gCAgGlF,CAAC"}
|
|
@@ -38,7 +38,7 @@ var c = (e, t) => {
|
|
|
38
38
|
"data-type": "external-link-preview",
|
|
39
39
|
children: "Invalid external link"
|
|
40
40
|
});
|
|
41
|
-
let h = p.display === "card" && m.isSoleTextblockContent ? "card" : "compact", g = r(p), _ = p.siteName || n(p.href);
|
|
41
|
+
let h = p.display === "card" && m.isSoleTextblockContent ? "card" : "compact", g = r(p, h), _ = h === "card" ? p.siteName || n(p.href) : null;
|
|
42
42
|
return /* @__PURE__ */ o(e, {
|
|
43
43
|
as: "span",
|
|
44
44
|
className: `scribe-external-link-preview scribe-external-link-preview--${h}`,
|
|
@@ -64,7 +64,7 @@ var c = (e, t) => {
|
|
|
64
64
|
alt: ""
|
|
65
65
|
}) : null, /* @__PURE__ */ s("span", {
|
|
66
66
|
"data-link-preview-main": "",
|
|
67
|
-
children: [p.faviconUrl ? /* @__PURE__ */ o("img", {
|
|
67
|
+
children: [h === "card" && p.faviconUrl ? /* @__PURE__ */ o("img", {
|
|
68
68
|
"data-link-preview-favicon": "",
|
|
69
69
|
src: p.faviconUrl,
|
|
70
70
|
alt: ""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { NodeType } from "@tiptap/pm/model";
|
|
2
2
|
import { Plugin } from "@tiptap/pm/state";
|
|
3
|
-
export declare const createExternalLinkPreviewPastePlugin: ({ previewType,
|
|
3
|
+
export declare const createExternalLinkPreviewPastePlugin: ({ previewType, autoPreviewOnPaste, shouldPreview, }: {
|
|
4
4
|
previewType: NodeType;
|
|
5
|
-
|
|
5
|
+
autoPreviewOnPaste: boolean;
|
|
6
6
|
shouldPreview?: (href: string) => boolean;
|
|
7
7
|
}) => Plugin<any>;
|
|
8
8
|
//# sourceMappingURL=paste.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paste.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/paste.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAiB,MAAM,EAAa,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"paste.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/paste.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAiB,MAAM,EAAa,MAAM,kBAAkB,CAAC;AA6EpE,eAAO,MAAM,oCAAoC,wDAI9C;IACD,WAAW,EAAE,QAAQ,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C,gBAgEG,CAAC"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { normalizeLinkUrl as e } from "../../../Menu/linkUrl.js";
|
|
2
2
|
import { normalizeExternalLinkPreviewAttributes as t, normalizeExternalLinkPreviewHref as n } from "./attributes.js";
|
|
3
|
-
import {
|
|
4
|
-
import { NodeSelection as i, Plugin as a, PluginKey as o } from "@tiptap/pm/state";
|
|
3
|
+
import { NodeSelection as r, Plugin as i, PluginKey as a } from "@tiptap/pm/state";
|
|
5
4
|
//#region lib/components/Scribe/extension/external-link-preview/paste.ts
|
|
6
|
-
var
|
|
5
|
+
var o = new a("scribeExternalLinkPreviewPaste"), s = (e) => {
|
|
7
6
|
let t = e.clipboardData?.getData("text/plain");
|
|
8
7
|
if (!t) return null;
|
|
9
8
|
let n = t.trim();
|
|
10
9
|
return n && !/[\r\n]/.test(n) ? n : null;
|
|
11
|
-
},
|
|
10
|
+
}, c = (e, t) => {
|
|
12
11
|
let { selection: n, schema: r } = e.state, i = r.marks.link;
|
|
13
12
|
if (n.empty || !i) return !1;
|
|
14
13
|
let a = e.state.tr.setMeta("preventAutolink", !0), o = !1;
|
|
@@ -17,38 +16,38 @@ var s = new o("scribeExternalLinkPreviewPaste"), c = (e) => {
|
|
|
17
16
|
let c = Math.max(r, n.from), l = Math.min(r + e.nodeSize, n.to);
|
|
18
17
|
c < l && (a.addMark(c, l, i.create({ href: t })), o = !0);
|
|
19
18
|
}), o ? (e.dispatch(a), !0) : !1;
|
|
20
|
-
},
|
|
19
|
+
}, l = (e, t) => {
|
|
21
20
|
let { selection: n } = e.state, r = !0;
|
|
22
21
|
return n.$from.parent.forEach((e) => {
|
|
23
22
|
(!e.isText || e.textContent.trim()) && (r = !1);
|
|
24
23
|
}), !n.empty || n.$from.parent.type.name !== "paragraph" || !r ? !1 : n.$from.parent.canReplaceWith(0, n.$from.parent.childCount, t);
|
|
25
|
-
},
|
|
26
|
-
key:
|
|
27
|
-
props: { handlePaste(
|
|
28
|
-
let
|
|
29
|
-
if (!
|
|
30
|
-
let
|
|
31
|
-
if (!
|
|
32
|
-
let e =
|
|
33
|
-
return e &&
|
|
24
|
+
}, u = ({ previewType: a, autoPreviewOnPaste: u, shouldPreview: d }) => new i({
|
|
25
|
+
key: o,
|
|
26
|
+
props: { handlePaste(i, o) {
|
|
27
|
+
let f = s(o);
|
|
28
|
+
if (!f) return !1;
|
|
29
|
+
let p = e(f);
|
|
30
|
+
if (!i.state.selection.empty && p) {
|
|
31
|
+
let e = c(i, p);
|
|
32
|
+
return e && o.preventDefault(), e;
|
|
34
33
|
}
|
|
35
|
-
let
|
|
36
|
-
if (!
|
|
34
|
+
let m = n(f);
|
|
35
|
+
if (!u || !m || !l(i, a)) return !1;
|
|
37
36
|
try {
|
|
38
|
-
if (
|
|
37
|
+
if (d && !d(m)) return !1;
|
|
39
38
|
} catch {
|
|
40
39
|
return !1;
|
|
41
40
|
}
|
|
42
|
-
let
|
|
43
|
-
href:
|
|
44
|
-
linkText:
|
|
41
|
+
let h = t({
|
|
42
|
+
href: m,
|
|
43
|
+
linkText: f,
|
|
45
44
|
display: "compact"
|
|
46
45
|
});
|
|
47
|
-
if (!
|
|
48
|
-
|
|
49
|
-
let
|
|
50
|
-
return
|
|
46
|
+
if (!h) return !1;
|
|
47
|
+
o.preventDefault();
|
|
48
|
+
let g = i.state.selection.$from.start(), _ = g + i.state.selection.$from.parent.content.size, v = g, y = i.state.tr.replaceWith(g, _, a.create(h));
|
|
49
|
+
return y.setSelection(r.create(y.doc, v)), i.dispatch(y.scrollIntoView()), !0;
|
|
51
50
|
} }
|
|
52
51
|
});
|
|
53
52
|
//#endregion
|
|
54
|
-
export {
|
|
53
|
+
export { u as createExternalLinkPreviewPastePlugin };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-html.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/render-html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"render-html.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/render-html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAiC7D,eAAO,MAAM,6BAA6B,oCAGvC;IACD,UAAU,EAAE,6BAA6B,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C,KAAG,aA4BH,CAAC"}
|
|
@@ -6,8 +6,8 @@ var i = (e) => {
|
|
|
6
6
|
let r = [[
|
|
7
7
|
"span",
|
|
8
8
|
{ "data-link-preview-title": "" },
|
|
9
|
-
n(e)
|
|
10
|
-
]], i = e.siteName || t(e.href);
|
|
9
|
+
n(e, e.display)
|
|
10
|
+
]], i = e.display === "card" ? e.siteName || t(e.href) : null;
|
|
11
11
|
return i && r.push([
|
|
12
12
|
"span",
|
|
13
13
|
{ "data-link-preview-site": "" },
|
|
@@ -19,7 +19,7 @@ var i = (e) => {
|
|
|
19
19
|
]), [
|
|
20
20
|
"span",
|
|
21
21
|
{ "data-link-preview-main": "" },
|
|
22
|
-
e.faviconUrl ? ["img", {
|
|
22
|
+
e.display === "card" && e.faviconUrl ? ["img", {
|
|
23
23
|
"data-link-preview-favicon": "",
|
|
24
24
|
src: e.faviconUrl,
|
|
25
25
|
alt: ""
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAiB,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOpE,OAAO,KAAK,EAAE,mCAAmC,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEhG,UAAU,0BAA0B;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;IAC7D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,gCAAgC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACnD;AAOD,eAAO,MAAM,oCAAoC,6CAEhD,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAiB,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOpE,OAAO,KAAK,EAAE,mCAAmC,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEhG,UAAU,0BAA0B;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;IAC7D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,gCAAgC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACnD;AAOD,eAAO,MAAM,oCAAoC,6CAEhD,CAAC;AAUF,eAAO,MAAM,kCAAkC,gBAChC,WAAW,YACd,MAAM,QACV,MAAM,gBASb,CAAC;AAEF,eAAO,MAAM,sCAAsC,UAC1C,WAAW,YACR,MAAM,KACf,mCAWF,CAAC;AAyHF,eAAO,MAAM,uCAAuC,yBAGjD;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,2BAA2B,CAAC;CACvC,6CAkEA,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeExternalLinkPreviewAttributes as e, normalizeExternalLinkPreviewMetadataPatch as t } from "./attributes.js";
|
|
2
2
|
import { NodeSelection as n, Plugin as r, PluginKey as i } from "@tiptap/pm/state";
|
|
3
3
|
//#region lib/components/Scribe/extension/external-link-preview/resolver.ts
|
|
4
|
-
var a = new i("scribeExternalLinkPreviewResolver"), o = (e, t) => e?.type.name === "externalLinkPreview" && e.attrs.href === t, s = (e, t) => Array.from(e.requests.values()).find((e) => e.token === t), c = (e, t, n) => (e.setMeta(a, {
|
|
4
|
+
var a = new i("scribeExternalLinkPreviewResolver"), o = (e, t) => e?.type.name === "externalLinkPreview" && e.attrs.display === "card" && e.attrs.href === t, s = (e, t) => Array.from(e.requests.values()).find((e) => e.token === t), c = (e, t, n) => (e.setMeta(a, {
|
|
5
5
|
type: "start",
|
|
6
6
|
href: n,
|
|
7
7
|
position: t
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/serialization.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAc7D,eAAO,MAAM,2CAA2C,YAC7C,OAAO,KACf,6BAA6B,GAAG,IAiBlC,CAAC;AAEF,eAAO,MAAM,oCAAoC,eAAgB,6BAA6B,2BAgB7F,CAAC;AAWF,eAAO,MAAM,iCAAiC,YACnC,OAAO,cACJ,6BAA6B,
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/serialization.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAc7D,eAAO,MAAM,2CAA2C,YAC7C,OAAO,KACf,6BAA6B,GAAG,IAiBlC,CAAC;AAEF,eAAO,MAAM,oCAAoC,eAAgB,6BAA6B,2BAgB7F,CAAC;AAWF,eAAO,MAAM,iCAAiC,YACnC,OAAO,cACJ,6BAA6B,SAmE1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mCAAmC,YAAa,OAAO,KAAG,OAUtE,CAAC;AAEF,eAAO,MAAM,mCAAmC,SAAU,OAAO,KAAG,IAwBnE,CAAC"}
|
|
@@ -40,15 +40,15 @@ var a = {
|
|
|
40
40
|
let e = i.createElement("img");
|
|
41
41
|
e.setAttribute("data-link-preview-image", ""), e.setAttribute("src", t.imageUrl), e.setAttribute("alt", ""), a.append(e);
|
|
42
42
|
}
|
|
43
|
-
if (o.setAttribute("data-link-preview-main", ""), t.faviconUrl) {
|
|
43
|
+
if (o.setAttribute("data-link-preview-main", ""), t.display === "card" && t.faviconUrl) {
|
|
44
44
|
let e = i.createElement("img");
|
|
45
45
|
e.setAttribute("data-link-preview-favicon", ""), e.setAttribute("src", t.faviconUrl), e.setAttribute("alt", ""), o.append(e);
|
|
46
46
|
} else {
|
|
47
47
|
let e = c(i, "data-link-preview-favicon-fallback", "↗");
|
|
48
48
|
e.setAttribute("aria-hidden", "true"), o.append(e);
|
|
49
49
|
}
|
|
50
|
-
l.setAttribute("data-link-preview-copy", ""), l.append(c(i, "data-link-preview-title", r(t)));
|
|
51
|
-
let u = t.siteName || n(t.href);
|
|
50
|
+
l.setAttribute("data-link-preview-copy", ""), l.append(c(i, "data-link-preview-title", r(t, t.display)));
|
|
51
|
+
let u = t.display === "card" ? t.siteName || n(t.href) : null;
|
|
52
52
|
u && l.append(c(i, "data-link-preview-site", u)), t.display === "card" && t.description && l.append(c(i, "data-link-preview-description", t.description)), o.append(l), a.append(o), e.replaceChildren(a);
|
|
53
53
|
}, u = (e) => {
|
|
54
54
|
let t = o(e);
|
|
@@ -32,6 +32,13 @@ export type ExternalLinkPreviewResolver = (href: string, context: ExternalLinkPr
|
|
|
32
32
|
/** @experimental Part of Scribe's evolving external-link-preview contract. */
|
|
33
33
|
export interface ExternalLinkPreviewOptions {
|
|
34
34
|
HTMLAttributes?: Record<string, unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* Automatically turn a standalone pasted URL into a local Compact preview.
|
|
37
|
+
* This does not request metadata.
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
40
|
+
autoPreviewOnPaste?: boolean;
|
|
41
|
+
/** Resolve metadata when a Preview card needs enrichment. */
|
|
35
42
|
resolve?: ExternalLinkPreviewResolver;
|
|
36
43
|
shouldPreview?: (href: string) => boolean;
|
|
37
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,eAAO,MAAM,8BAA8B,YAAI,SAAS,EAAE,MAAM,CAAU,CAAC;AAE3E,8EAA8E;AAC9E,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzF,8EAA8E;AAC9E,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,0BAA0B,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,kCAAkC;IACjD,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,8EAA8E;AAC9E,MAAM,MAAM,2BAA2B,GAAG,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kCAAkC,KACxC,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAAC;AAEjD,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C;AAED,8EAA8E;AAC9E,MAAM,WAAW,gCAAiC,SAAQ,2BAA2B;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAED,8EAA8E;AAC9E,MAAM,WAAW,gCAAiC,SAAQ,2BAA2B;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,0BAA0B,CAAC;AAEvE,8EAA8E;AAC9E,MAAM,MAAM,mCAAmC,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,eAAO,MAAM,8BAA8B,YAAI,SAAS,EAAE,MAAM,CAAU,CAAC;AAE3E,8EAA8E;AAC9E,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzF,8EAA8E;AAC9E,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,0BAA0B,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,kCAAkC;IACjD,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,8EAA8E;AAC9E,MAAM,MAAM,2BAA2B,GAAG,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kCAAkC,KACxC,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAAC;AAEjD,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C;AAED,8EAA8E;AAC9E,MAAM,WAAW,gCAAiC,SAAQ,2BAA2B;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAED,8EAA8E;AAC9E,MAAM,WAAW,gCAAiC,SAAQ,2BAA2B;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,0BAA0B,CAAC;AAEvE,8EAA8E;AAC9E,MAAM,MAAM,mCAAmC,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clevertask/scribe",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A Radix-based Tiptap rich text editor with a Notion-style block interface for viewing and creating content. Perfect for diverse needs like notes, documents, AI chat, Markdown parsing, and comments.",
|
|
6
6
|
"keywords": [
|