@ampless/plugin-x-embed 1.0.0-alpha.7 → 1.0.0-alpha.9
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/editor.d.ts +20 -2
- package/dist/editor.js +26 -4
- package/package.json +2 -2
package/dist/editor.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Node } from '@tiptap/core';
|
|
2
|
-
import { TiptapNodeMarkdownAdapters } from 'ampless';
|
|
2
|
+
import { TiptapNodeHtmlAdapters, TiptapNodeMarkdownAdapters } from 'ampless';
|
|
3
3
|
|
|
4
4
|
declare module '@tiptap/core' {
|
|
5
5
|
interface Commands<ReturnType> {
|
|
@@ -47,4 +47,22 @@ declare const editorExtension: Node<any, any>;
|
|
|
47
47
|
*/
|
|
48
48
|
declare const tiptapNodeToMarkdown: TiptapNodeMarkdownAdapters;
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
/**
|
|
51
|
+
* tiptap → html adapter map. Serialises `amplessTweet` nodes to the
|
|
52
|
+
* canonical placeholder div `<div data-ampless-tweet data-tweet-id="..."
|
|
53
|
+
* class="ampless-tweet-placeholder">…</div>` so the admin's
|
|
54
|
+
* "format: tiptap → html" body switch is lossless. The div is what
|
|
55
|
+
* `Node.parseHTML`'s `tag: 'div[data-ampless-tweet]'` rule restores
|
|
56
|
+
* from. It is an admin format-switch interchange form; public rendering
|
|
57
|
+
* expands tweet embeds from the `tiptap` / `markdown` walkers, while
|
|
58
|
+
* `format: 'html'` preserves the div literally.
|
|
59
|
+
*
|
|
60
|
+
* `markdown → html` is a 2-hop via `generateJSON` (in admin format-switch);
|
|
61
|
+
* this adapter is reused by that path — no duplicate logic needed.
|
|
62
|
+
*
|
|
63
|
+
* `update-ampless` reads this export (via namespace import `* as`) and
|
|
64
|
+
* wires it into `installAdminTiptapNodeHtml`.
|
|
65
|
+
*/
|
|
66
|
+
declare const tiptapNodeToHtml: TiptapNodeHtmlAdapters;
|
|
67
|
+
|
|
68
|
+
export { AmplessTweetNode, editorExtension, tiptapNodeToHtml, tiptapNodeToMarkdown, tweetEditor };
|
package/dist/editor.js
CHANGED
|
@@ -23,6 +23,19 @@ function getBareUrlLinkHref(el) {
|
|
|
23
23
|
if (el.textContent?.trim() !== linkText) return null;
|
|
24
24
|
return href;
|
|
25
25
|
}
|
|
26
|
+
function placeholderAttrs(attrs) {
|
|
27
|
+
return {
|
|
28
|
+
"data-ampless-tweet": "",
|
|
29
|
+
"data-tweet-id": String(attrs.tweetId ?? ""),
|
|
30
|
+
class: "ampless-tweet-placeholder"
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function escapeAttr(v) {
|
|
34
|
+
return v.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
35
|
+
}
|
|
36
|
+
function attrsToHtmlString(attrs) {
|
|
37
|
+
return Object.entries(attrs).map(([k, v]) => v === "" ? k : `${k}="${escapeAttr(v)}"`).join(" ");
|
|
38
|
+
}
|
|
26
39
|
var AmplessTweetNode = Node.create({
|
|
27
40
|
name: "amplessTweet",
|
|
28
41
|
group: "block",
|
|
@@ -98,10 +111,9 @@ var AmplessTweetNode = Node.create({
|
|
|
98
111
|
renderHTML({ HTMLAttributes }) {
|
|
99
112
|
return [
|
|
100
113
|
"div",
|
|
101
|
-
mergeAttributes(HTMLAttributes, {
|
|
102
|
-
"data-
|
|
103
|
-
|
|
104
|
-
}),
|
|
114
|
+
mergeAttributes(HTMLAttributes, placeholderAttrs({
|
|
115
|
+
tweetId: HTMLAttributes["data-tweet-id"]
|
|
116
|
+
})),
|
|
105
117
|
["span", {}, `Tweet: ${HTMLAttributes["data-tweet-id"] ?? ""}`]
|
|
106
118
|
];
|
|
107
119
|
},
|
|
@@ -158,9 +170,19 @@ var tiptapNodeToMarkdown = {
|
|
|
158
170
|
return `https://x.com/i/status/${tweetId}`;
|
|
159
171
|
}
|
|
160
172
|
};
|
|
173
|
+
var tiptapNodeToHtml = {
|
|
174
|
+
amplessTweet: (node) => {
|
|
175
|
+
const tweetId = String(node.attrs?.tweetId ?? "").trim();
|
|
176
|
+
if (!tweetId) return null;
|
|
177
|
+
const attrs = placeholderAttrs(node.attrs ?? {});
|
|
178
|
+
const url = `https://x.com/i/status/${tweetId}`;
|
|
179
|
+
return `<div ${attrsToHtmlString(attrs)}><a href="${escapeAttr(url)}">${escapeAttr(url)}</a></div>`;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
161
182
|
export {
|
|
162
183
|
AmplessTweetNode,
|
|
163
184
|
editorExtension,
|
|
185
|
+
tiptapNodeToHtml,
|
|
164
186
|
tiptapNodeToMarkdown,
|
|
165
187
|
tweetEditor
|
|
166
188
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ampless/plugin-x-embed",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.9",
|
|
4
4
|
"description": "x.com (Twitter) embed plugin for ampless — renders tweet URLs inline as blockquotes hydrated by widgets.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"@tiptap/core": "^3",
|
|
34
34
|
"react": "^18 || ^19",
|
|
35
|
-
"ampless": "1.0.0-alpha.
|
|
35
|
+
"ampless": "1.0.0-alpha.47"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@tiptap/core": "^3.23.6",
|