payload-richtext-tiptap 0.0.129 → 0.0.131
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/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.js +17 -2
- package/dist/src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.js +29 -17
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.js +40 -16
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.js +17 -13
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.js +16 -6
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.js +30 -25
- package/dist/src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/VideoBlock/VideoBlock.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/VideoBlock/VideoBlock.js +17 -2
- package/dist/src/fields/TiptapEditor/extensions/VideoBlock/VideoBlock.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageBlock.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,EAAE,MAAM,cAAc,CAAC;AAKtD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,UAAU,EAAE;YACV,aAAa,EAAE,CAAC,UAAU,EAAE;gBAC1B,GAAG,EAAE,MAAM,CAAC;gBACZ,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,eAAe,EAAE,CAAC,UAAU,EAAE;gBAC5B,GAAG,EAAE,MAAM,CAAC;gBACZ,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;gBACpB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,UAAU,CAAC;YACvE,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC;YAClD,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC;SAClD,CAAC;KACH;CACF;AAED,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"ImageBlock.d.ts","sourceRoot":"","sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,EAAE,MAAM,cAAc,CAAC;AAKtD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,UAAU,EAAE;YACV,aAAa,EAAE,CAAC,UAAU,EAAE;gBAC1B,GAAG,EAAE,MAAM,CAAC;gBACZ,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,eAAe,EAAE,CAAC,UAAU,EAAE;gBAC5B,GAAG,EAAE,MAAM,CAAC;gBACZ,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;gBACpB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,KAAK,UAAU,CAAC;YACjB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,UAAU,CAAC;YACvE,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC;YAClD,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC;SAClD,CAAC;KACH;CACF;AAED,eAAO,MAAM,UAAU,mFAiHrB,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
|
@@ -56,8 +56,23 @@ export const ImageBlock = Image.extend({
|
|
|
56
56
|
},
|
|
57
57
|
renderHTML ({ HTMLAttributes }) {
|
|
58
58
|
return [
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
'div',
|
|
60
|
+
{
|
|
61
|
+
class: "imageBlock"
|
|
62
|
+
},
|
|
63
|
+
[
|
|
64
|
+
"img",
|
|
65
|
+
mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)
|
|
66
|
+
],
|
|
67
|
+
[
|
|
68
|
+
"textarea",
|
|
69
|
+
mergeAttributes({
|
|
70
|
+
class: "w-full text-gray-400 h-16 mb-2 placeholder-black p-1 text-sm text-gray-400 border-0 rounded appearance-none"
|
|
71
|
+
}, {
|
|
72
|
+
defaultValue: HTMLAttributes.caption
|
|
73
|
+
}),
|
|
74
|
+
HTMLAttributes.caption
|
|
75
|
+
]
|
|
61
76
|
];
|
|
62
77
|
},
|
|
63
78
|
addCommands () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"sourcesContent":["\"use client\";\n\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { mergeAttributes, Range } from \"@tiptap/core\";\n\nimport { ImageBlockView } from \"./components/ImageBlockView.js\";\nimport { Image } from \"../Image/Image.js\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: {\n src: string;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAt: (attributes: {\n src: string;\n pos: number | Range;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType;\n setImageBlockWidth: (width: number) => ReturnType;\n setImageCaption: (caption: string) => ReturnType;\n };\n }\n}\n\nexport const ImageBlock = Image.extend({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n caption: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"caption\"),\n renderHTML: (attributes) => ({\n caption: attributes.caption,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src*=\"tiptap.dev\"]:not([src^=\"data:\"]), img[src*=\"windows.net\"]:not([src^=\"data:\"])',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"img\",\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/fields/TiptapEditor/extensions/ImageBlock/ImageBlock.ts"],"sourcesContent":["\"use client\";\n\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { mergeAttributes, Range } from \"@tiptap/core\";\n\nimport { ImageBlockView } from \"./components/ImageBlockView.js\";\nimport { Image } from \"../Image/Image.js\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: {\n src: string;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAt: (attributes: {\n src: string;\n pos: number | Range;\n assetId?: string;\n caption?: string;\n }) => ReturnType;\n setImageBlockAlign: (align: \"left\" | \"center\" | \"right\") => ReturnType;\n setImageBlockWidth: (width: number) => ReturnType;\n setImageCaption: (caption: string) => ReturnType;\n };\n }\n}\n\nexport const ImageBlock = Image.extend({\n name: \"imageBlock\",\n\n group: \"block\",\n\n defining: true,\n\n isolating: true,\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"src\"),\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n width: {\n default: \"100%\",\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n align: {\n default: \"center\",\n parseHTML: (element) => element.getAttribute(\"data-align\"),\n renderHTML: (attributes) => ({\n \"data-align\": attributes.align,\n }),\n },\n alt: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"alt\"),\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n caption: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"caption\"),\n renderHTML: (attributes) => ({\n caption: attributes.caption,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src*=\"tiptap.dev\"]:not([src^=\"data:\"]), img[src*=\"windows.net\"]:not([src^=\"data:\"])',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n { class: \"imageBlock\" },\n [\n \"img\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n ],\n [\"textarea\", mergeAttributes({\n class: \"w-full text-gray-400 h-16 mb-2 placeholder-black p-1 text-sm text-gray-400 border-0 rounded appearance-none\"\n }, { defaultValue: HTMLAttributes.caption }), HTMLAttributes.caption],\n ];\n },\n\n addCommands() {\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: \"imageBlock\",\n attrs: { src: attrs.src, caption: attrs.caption },\n });\n },\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) => {\n console.log(attrs);\n return commands.insertContentAt(attrs.pos, {\n type: \"imageBlock\",\n attrs: { src: attrs.src, caption: attrs.caption },\n });\n },\n setImageCaption:\n (caption) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { caption }),\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes(\"imageBlock\", {\n width: `${Math.max(0, Math.min(100, width))}%`,\n }),\n };\n },\n\n addNodeView() {\n //@ts-ignore\n return ReactNodeViewRenderer(ImageBlockView);\n },\n});\n\nexport default ImageBlock;\n"],"names":["ReactNodeViewRenderer","mergeAttributes","ImageBlockView","Image","ImageBlock","extend","name","group","defining","isolating","addAttributes","src","default","parseHTML","element","getAttribute","renderHTML","attributes","width","align","alt","caption","tag","HTMLAttributes","class","options","defaultValue","addCommands","setImageBlock","attrs","commands","insertContent","type","setImageBlockAt","console","log","insertContentAt","pos","setImageCaption","updateAttributes","setImageBlockAlign","setImageBlockWidth","Math","max","min","addNodeView"],"mappings":"AAAA;AAEA,SAASA,qBAAqB,QAAQ,gBAAgB;AACtD,SAASC,eAAe,QAAe,eAAe;AAEtD,SAASC,cAAc,QAAQ,iCAAiC;AAChE,SAASC,KAAK,QAAQ,oBAAoB;AAuB1C,OAAO,MAAMC,aAAaD,MAAME,MAAM,CAAC;IACrCC,MAAM;IAENC,OAAO;IAEPC,UAAU;IAEVC,WAAW;IAEXC;QACE,OAAO;YACLC,KAAK;gBACHC,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3BN,KAAKM,WAAWN,GAAG;oBACrB,CAAA;YACF;YACAO,OAAO;gBACLN,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3B,cAAcA,WAAWC,KAAK;oBAChC,CAAA;YACF;YACAC,OAAO;gBACLP,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3B,cAAcA,WAAWE,KAAK;oBAChC,CAAA;YACF;YACAC,KAAK;gBACHR,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3BG,KAAKH,WAAWG,GAAG;oBACrB,CAAA;YACF;YACAC,SAAS;gBACPT,SAAS;gBACTC,WAAW,CAACC,UAAYA,QAAQC,YAAY,CAAC;gBAC7CC,YAAY,CAACC,aAAgB,CAAA;wBAC3BI,SAASJ,WAAWI,OAAO;oBAC7B,CAAA;YACF;QACF;IACF;IAEAR;QACE,OAAO;YACL;gBACES,KAAK;YACP;SACD;IACH;IAEAN,YAAW,EAAEO,cAAc,EAAE;QAC3B,OAAO;YACL;YACA;gBAAEC,OAAO;YAAa;YACtB;gBACE;gBACAvB,gBAAgB,IAAI,CAACwB,OAAO,CAACF,cAAc,EAAEA;aAC9C;YACD;gBAAC;gBAAYtB,gBAAgB;oBAC3BuB,OAAO;gBACT,GAAG;oBAAEE,cAAcH,eAAeF,OAAO;gBAAC;gBAAIE,eAAeF,OAAO;aAAC;SACtE;IACH;IAEAM;QACE,OAAO;YACLC,eACE,CAACC,QACC,CAAC,EAAEC,QAAQ,EAAE;oBACX,OAAOA,SAASC,aAAa,CAAC;wBAC5BC,MAAM;wBACNH,OAAO;4BAAElB,KAAKkB,MAAMlB,GAAG;4BAAEU,SAASQ,MAAMR,OAAO;wBAAC;oBAClD;gBACF;YAEJY,iBACE,CAACJ,QACC,CAAC,EAAEC,QAAQ,EAAE;oBACXI,QAAQC,GAAG,CAACN;oBACZ,OAAOC,SAASM,eAAe,CAACP,MAAMQ,GAAG,EAAE;wBACzCL,MAAM;wBACNH,OAAO;4BAAElB,KAAKkB,MAAMlB,GAAG;4BAAEU,SAASQ,MAAMR,OAAO;wBAAC;oBAClD;gBACF;YACJiB,iBACE,CAACjB,UACC,CAAC,EAAES,QAAQ,EAAE,GACXA,SAASS,gBAAgB,CAAC,cAAc;wBAAElB;oBAAQ;YACxDmB,oBACE,CAACrB,QACC,CAAC,EAAEW,QAAQ,EAAE,GACXA,SAASS,gBAAgB,CAAC,cAAc;wBAAEpB;oBAAM;YAEtDsB,oBACE,CAACvB,QACC,CAAC,EAAEY,QAAQ,EAAE,GACXA,SAASS,gBAAgB,CAAC,cAAc;wBACtCrB,OAAO,CAAC,EAAEwB,KAAKC,GAAG,CAAC,GAAGD,KAAKE,GAAG,CAAC,KAAK1B,QAAQ,CAAC,CAAC;oBAChD;QACR;IACF;IAEA2B;QACE,YAAY;QACZ,OAAO7C,sBAAsBE;IAC/B;AACF,GAAG;AAEH,eAAeE,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facebook.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,QAAQ,EAAE;YACR;;eAEG;YAEH,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SACjE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"facebook.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,QAAQ,EAAE;YACR;;eAEG;YAEH,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SACjE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,QAAQ,gBA2GnB,CAAA"}
|
|
@@ -26,7 +26,7 @@ export const Facebook = Node.create({
|
|
|
26
26
|
default: null
|
|
27
27
|
},
|
|
28
28
|
width: {
|
|
29
|
-
default: '
|
|
29
|
+
default: '100%'
|
|
30
30
|
},
|
|
31
31
|
showText: {
|
|
32
32
|
default: true
|
|
@@ -56,26 +56,38 @@ export const Facebook = Node.create({
|
|
|
56
56
|
}),
|
|
57
57
|
[
|
|
58
58
|
'div',
|
|
59
|
-
|
|
59
|
+
{
|
|
60
60
|
class: 'rsme-embed rsme-facebook-embed'
|
|
61
|
-
},
|
|
61
|
+
},
|
|
62
62
|
[
|
|
63
63
|
'div',
|
|
64
64
|
{
|
|
65
|
-
class: '
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
'
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
class: 'rsme-d-none'
|
|
66
|
+
},
|
|
67
|
+
[
|
|
68
|
+
'div',
|
|
69
|
+
{
|
|
70
|
+
id: 'fb-root'
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
[
|
|
74
|
+
'div',
|
|
75
|
+
mergeAttributes(HTMLAttributes, {
|
|
76
|
+
class: 'fb-post',
|
|
77
|
+
'data-href': HTMLAttributes.url,
|
|
78
|
+
'data-width': '500',
|
|
79
|
+
'data-show-text': "true"
|
|
80
|
+
})
|
|
81
|
+
],
|
|
82
|
+
[
|
|
83
|
+
'script',
|
|
84
|
+
{
|
|
85
|
+
async: true,
|
|
86
|
+
defer: true,
|
|
87
|
+
crossorigin: 'anonymous',
|
|
88
|
+
src: 'https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v22.0'
|
|
89
|
+
}
|
|
90
|
+
]
|
|
79
91
|
]
|
|
80
92
|
]
|
|
81
93
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n facebook: {\n /**\n * Add an image\n */\n\n insertFacebook: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport FacebookEmbed from './FacebookEmbed.js'\n\nexport const Facebook = Node.create({\n name: 'facebook',\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"facebook-post\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Facebook/facebook.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n facebook: {\n /**\n * Add an image\n */\n\n insertFacebook: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport FacebookEmbed from './FacebookEmbed.js'\n\nexport const Facebook = Node.create({\n name: 'facebook',\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"facebook-post\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '100%',\n },\n\n showText: {\n default: true,\n },\n }\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"facebook\",\n class: `react-renderer node-facebook ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', { class: 'rsme-embed rsme-facebook-embed', },\n [\n 'div',\n { class: 'rsme-d-none' },\n ['div', { id: 'fb-root' }],\n [\n 'div',\n mergeAttributes(HTMLAttributes, {\n class: 'fb-post',\n 'data-href': HTMLAttributes.url,\n 'data-width': '500',\n 'data-show-text': \"true\",\n })\n ],\n [\n 'script',\n {\n async: true,\n defer: true,\n crossorigin: 'anonymous',\n src: 'https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v22.0',\n\n },\n ],\n ]\n ]\n\n ]]\n },\n\n\n addNodeView() {\n return ReactNodeViewRenderer(FacebookEmbed)\n },\n\n addCommands() {\n return {\n insertFacebook:\n (url, className) =>\n ({ commands, state }) => {\n return commands.insertContent({\n type: 'facebook',\n attrs: {\n url,\n class: className,\n src: url,\n },\n })\n },\n }\n },\n})\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","FacebookEmbed","Facebook","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","class","src","width","showText","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","id","async","defer","crossorigin","addNodeView","addCommands","insertFacebook","className","commands","insertContent","attrs","isValidHttpUrl","string","URL","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,mBAAmB,qBAAoB;AAE9C,OAAO,MAAMC,WAAWJ,KAAKK,MAAM,CAAC;IAClCC,MAAM;IACNC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IACtBC;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YAEAI,UAAU;gBACRJ,SAAS;YACX;QACF;IACF;IACAK;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAACpB,IAAI;gBACtB,GACCqB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA7B,gBAAgB6B,gBAAgB;gBAC9B,aAAa;gBACbf,OAAO,CAAC,6BAA6B,EAAEe,eAAef,KAAK,IAAI,GAAG,CAAC;YACrE;YAAI;gBACF;gBACAd,gBACE;oBAAEc,OAAO;gBAAuB;gBAElC;oBAAC;oBAAO;wBAAEA,OAAO;oBAAkC;oBACjD;wBACE;wBACA;4BAAEA,OAAO;wBAAc;wBACvB;4BAAC;4BAAO;gCAAEgB,IAAI;4BAAU;yBAAE;wBAC1B;4BACE;4BACA9B,gBAAgB6B,gBAAgB;gCAC9Bf,OAAO;gCACP,aAAae,eAAejB,GAAG;gCAC/B,cAAc;gCACd,kBAAkB;4BACpB;yBACD;wBACD;4BACE;4BACA;gCACEmB,OAAO;gCACPC,OAAO;gCACPC,aAAa;gCACblB,KAAK;4BAEP;yBACD;qBACF;iBACF;aAEF;SAAC;IACN;IAGAmB;QACE,OAAOjC,sBAAsBC;IAC/B;IAEAiC;QACE,OAAO;YACLC,gBACE,CAACxB,KAAKyB,YACJ,CAAC,EAAEC,QAAQ,EAAEhB,KAAK,EAAE;oBAClB,OAAOgB,SAASC,aAAa,CAAC;wBAC5Bd,MAAM;wBACNe,OAAO;4BACL5B;4BACAE,OAAOuB;4BACPtB,KAAKH;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAAS6B,eAAeC,MAAc;IACpC,IAAI9B;IAEJ,IAAI;QACFA,MAAM,IAAI+B,IAAID;IAChB,EAAE,OAAOE,GAAG;QACV,OAAO;IACT;IAEA,OAAOhC,IAAIiC,QAAQ,KAAK,WAAWjC,IAAIiC,QAAQ,KAAK;AACtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,SAAS,EAAE;YACT;;eAEG;YAEH,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAClE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,SAAS,EAAE;YACT;;eAEG;YAEH,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAClE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,SAAS,gBA0HpB,CAAA"}
|
|
@@ -22,7 +22,7 @@ export const Instagram = Node.create({
|
|
|
22
22
|
default: '328px'
|
|
23
23
|
},
|
|
24
24
|
height: {
|
|
25
|
-
default: '
|
|
25
|
+
default: '550px'
|
|
26
26
|
},
|
|
27
27
|
frameborder: {
|
|
28
28
|
default: '0'
|
|
@@ -57,15 +57,36 @@ export const Instagram = Node.create({
|
|
|
57
57
|
[
|
|
58
58
|
'div',
|
|
59
59
|
mergeAttributes({
|
|
60
|
-
class: 'rsme-embed rsme-instagram-embed
|
|
61
|
-
style: 'overflow: hidden; width: 328px; border-radius: 3px; position: relative;'
|
|
60
|
+
class: 'rsme-embed rsme-instagram-embed'
|
|
62
61
|
}),
|
|
63
62
|
[
|
|
64
|
-
'
|
|
65
|
-
mergeAttributes({
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
63
|
+
'blockquote',
|
|
64
|
+
mergeAttributes(HTMLAttributes, {
|
|
65
|
+
class: 'instagram-media',
|
|
66
|
+
style: "background:#FFF; border:0; margin:1px; max-width:540px; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);",
|
|
67
|
+
"data-instgrm-captioned": true,
|
|
68
|
+
"data-instgrm-permalink": `${convertInstaUrlToEmbed(HTMLAttributes.url)}?utm_source=ig_embed&utm_campaign=loading`,
|
|
69
|
+
"data-instgrm-version": "14"
|
|
70
|
+
}),
|
|
71
|
+
[
|
|
72
|
+
'div',
|
|
73
|
+
{
|
|
74
|
+
class: 'instagram-media-pre-embed rsme-d-none'
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
],
|
|
78
|
+
[
|
|
79
|
+
'script',
|
|
80
|
+
{
|
|
81
|
+
async: true,
|
|
82
|
+
src: 'https://www.instagram.com/embed.js',
|
|
83
|
+
charset: 'utf-8',
|
|
84
|
+
onload: `() => {
|
|
85
|
+
if (window.instgrm) {
|
|
86
|
+
window.instgrm.Embeds.process();
|
|
87
|
+
}
|
|
88
|
+
}`
|
|
89
|
+
}
|
|
69
90
|
]
|
|
70
91
|
]
|
|
71
92
|
]
|
|
@@ -88,14 +109,7 @@ export const Instagram = Node.create({
|
|
|
88
109
|
insertInstagram: (url, className)=>({ commands, state })=>{
|
|
89
110
|
let embedUrl = "";
|
|
90
111
|
if (url) {
|
|
91
|
-
|
|
92
|
-
const urlObj = new URL(url);
|
|
93
|
-
const path = urlObj.pathname;
|
|
94
|
-
const postId = path.split('/').filter(Boolean)[1] // Get the post ID after /p/
|
|
95
|
-
;
|
|
96
|
-
if (postId) {
|
|
97
|
-
embedUrl = `https://www.instagram.com/p/${postId}/embed/`;
|
|
98
|
-
}
|
|
112
|
+
embedUrl = convertInstaUrlToEmbed(url);
|
|
99
113
|
}
|
|
100
114
|
return commands.insertContent({
|
|
101
115
|
type: 'instagram',
|
|
@@ -109,6 +123,16 @@ export const Instagram = Node.create({
|
|
|
109
123
|
};
|
|
110
124
|
}
|
|
111
125
|
});
|
|
126
|
+
function convertInstaUrlToEmbed(url) {
|
|
127
|
+
if (!url) return undefined;
|
|
128
|
+
try {
|
|
129
|
+
const urlWithNoQueryOrUsername = url.split(/[?#]/)[0].replace(/\.com\/.*?\/p/, '.com/p').replace(/\.com\/.*?\/reel/, '.com/reel');
|
|
130
|
+
const cleanUrlWithEndingSlash = `${urlWithNoQueryOrUsername}${urlWithNoQueryOrUsername.endsWith('/') ? '' : '/'}`;
|
|
131
|
+
return cleanUrlWithEndingSlash;
|
|
132
|
+
} catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
112
136
|
function isValidHttpUrl(string) {
|
|
113
137
|
let url;
|
|
114
138
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n instagram: {\n /**\n * Add an image\n */\n\n insertInstagram: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport InstagramEmbed from './InstagramEmbed.js'\n\nexport const Instagram = Node.create({\n name: 'instagram',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Instagram/instagram.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n instagram: {\n /**\n * Add an image\n */\n\n insertInstagram: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport InstagramEmbed from './InstagramEmbed.js'\n\nexport const Instagram = Node.create({\n name: 'instagram',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '550px',\n },\n frameborder: {\n default: '0',\n },\n scrolling: {\n default: 'no',\n },\n allowtransparency: {\n default: 'true',\n },\n }\n },\n\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"instagram\"]',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"instagram\",\n class: `react-renderer node-instagram ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-instagram-embed', }),\n\n [\n 'blockquote',\n mergeAttributes(HTMLAttributes, {\n class: 'instagram-media',\n style: \"background:#FFF; border:0; margin:1px; max-width:540px; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);\",\n \"data-instgrm-captioned\": true,\n \"data-instgrm-permalink\": `${convertInstaUrlToEmbed(HTMLAttributes.url)}?utm_source=ig_embed&utm_campaign=loading`,\n \"data-instgrm-version\": \"14\"\n }),\n ['div', { class: 'instagram-media-pre-embed rsme-d-none' },]\n ],\n [\n 'script',\n {\n async: true,\n src: 'https://www.instagram.com/embed.js',\n charset: 'utf-8',\n onload: `() => {\n if (window.instgrm) {\n window.instgrm.Embeds.process();\n }\n }`,\n },\n ],\n ],\n\n ]\n ]\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(InstagramEmbed)\n },\n\n addCommands() {\n return {\n insertInstagram:\n (url, className) =>\n ({ commands, state }) => {\n let embedUrl = \"\"\n if (url) {\n embedUrl = convertInstaUrlToEmbed(url)\n\n }\n return commands.insertContent({\n type: 'instagram',\n attrs: {\n url: url,\n class: className,\n src: embedUrl,\n },\n })\n },\n }\n },\n})\nfunction convertInstaUrlToEmbed(url: string): string | undefined {\n if (!url) return undefined;\n try {\n const urlWithNoQueryOrUsername = url.split(/[?#]/)[0].replace(/\\.com\\/.*?\\/p/, '.com/p').replace(/\\.com\\/.*?\\/reel/, '.com/reel');\n const cleanUrlWithEndingSlash = `${urlWithNoQueryOrUsername}${urlWithNoQueryOrUsername.endsWith('/') ? '' : '/'}`;\n return cleanUrlWithEndingSlash\n } catch {\n return undefined;\n }\n}\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","InstagramEmbed","Instagram","create","name","group","content","draggable","addAttributes","url","default","class","src","width","height","frameborder","scrolling","allowtransparency","parseHTML","tag","renderHTML","HTMLAttributes","style","convertInstaUrlToEmbed","async","charset","onload","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertInstagram","className","commands","embedUrl","insertContent","attrs","undefined","urlWithNoQueryOrUsername","split","replace","cleanUrlWithEndingSlash","endsWith","isValidHttpUrl","string","URL","_","protocol"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiktok.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN;;eAEG;YAEH,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAC/D,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"tiktok.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN;;eAEG;YAEH,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAC/D,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAIpD,eAAO,MAAM,MAAM,gBAoGjB,CAAA"}
|
|
@@ -22,7 +22,7 @@ export const Tiktok = Node.create({
|
|
|
22
22
|
default: '328px'
|
|
23
23
|
},
|
|
24
24
|
height: {
|
|
25
|
-
default: '
|
|
25
|
+
default: '550px'
|
|
26
26
|
},
|
|
27
27
|
frameborder: {
|
|
28
28
|
default: '0'
|
|
@@ -67,9 +67,9 @@ export const Tiktok = Node.create({
|
|
|
67
67
|
},
|
|
68
68
|
[
|
|
69
69
|
'iframe',
|
|
70
|
-
mergeAttributes({
|
|
71
|
-
src: HTMLAttributes.
|
|
72
|
-
}
|
|
70
|
+
mergeAttributes(HTMLAttributes, {
|
|
71
|
+
src: convertTikTokUrlToEmbed(HTMLAttributes.url)
|
|
72
|
+
})
|
|
73
73
|
]
|
|
74
74
|
]
|
|
75
75
|
]
|
|
@@ -92,15 +92,8 @@ export const Tiktok = Node.create({
|
|
|
92
92
|
return {
|
|
93
93
|
insertTiktok: (url, className)=>({ commands, state })=>{
|
|
94
94
|
let embedUrl;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const path = urlObj.pathname;
|
|
98
|
-
const videoId = path.split('/').filter(Boolean)[2] // Get video ID from path
|
|
99
|
-
;
|
|
100
|
-
if (videoId) {
|
|
101
|
-
embedUrl = `https://www.tiktok.com/embed/v3/${videoId}`;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
95
|
+
// Usage in the original location:
|
|
96
|
+
embedUrl = url ? convertTikTokUrlToEmbed(url) : undefined;
|
|
104
97
|
return commands.insertContent({
|
|
105
98
|
type: 'tiktok',
|
|
106
99
|
attrs: {
|
|
@@ -113,6 +106,17 @@ export const Tiktok = Node.create({
|
|
|
113
106
|
};
|
|
114
107
|
}
|
|
115
108
|
});
|
|
109
|
+
function convertTikTokUrlToEmbed(url) {
|
|
110
|
+
if (!url) return undefined;
|
|
111
|
+
try {
|
|
112
|
+
const urlObj = new URL(url);
|
|
113
|
+
const path = urlObj.pathname;
|
|
114
|
+
const videoId = path.split('/').filter(Boolean)[2];
|
|
115
|
+
return videoId ? `https://www.tiktok.com/embed/v3/${videoId}` : undefined;
|
|
116
|
+
} catch {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
116
120
|
function isValidHttpUrl(string) {
|
|
117
121
|
let url;
|
|
118
122
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tiktok: {\n /**\n * Add an image\n */\n\n insertTiktok: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TiktokEmbed from './TiktokEmbed.js'\n\nexport const Tiktok = Node.create({\n name: 'tiktok',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Tiktok/tiktok.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tiktok: {\n /**\n * Add an image\n */\n\n insertTiktok: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TiktokEmbed from './TiktokEmbed.js'\n\nexport const Tiktok = Node.create({\n name: 'tiktok',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n addAttributes() {\n return {\n url: { default: null },\n class: { default: null },\n src: {\n default: null,\n },\n width: {\n default: '328px',\n },\n height: {\n default: '550px',\n },\n frameborder: {\n default: '0',\n },\n scrolling: {\n default: 'no',\n },\n allowtransparency: {\n default: 'true',\n },\n }\n },\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"tiktok\"]',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes({\n \"data-type\": \"tiktok\",\n class: `react-renderer node-tiktok ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-tiktok-embed', style: 'overflow: hidden; border-radius: 8px;' }),\n ['div', { class: 'tiktok-embed-container' },\n ['iframe', mergeAttributes(HTMLAttributes, { src: convertTikTokUrlToEmbed(HTMLAttributes.url) },)],\n ]\n ]\n ]\n ]\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TiktokEmbed)\n },\n\n addCommands() {\n return {\n insertTiktok:\n (url, className) =>\n ({ commands, state }) => {\n\n\n let embedUrl\n\n\n // Usage in the original location:\n embedUrl = url ? convertTikTokUrlToEmbed(url) : undefined;\n return commands.insertContent({\n type: 'tiktok',\n attrs: {\n url,\n class: className,\n src: embedUrl,\n },\n })\n },\n }\n },\n})\n\nfunction convertTikTokUrlToEmbed(url: string): string | undefined {\n if (!url) return undefined;\n try {\n const urlObj = new URL(url);\n const path = urlObj.pathname;\n const videoId = path.split('/').filter(Boolean)[2];\n return videoId ? `https://www.tiktok.com/embed/v3/${videoId}` : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","TiktokEmbed","Tiktok","create","name","group","content","draggable","addAttributes","url","default","class","src","width","height","frameborder","scrolling","allowtransparency","parseHTML","tag","renderHTML","HTMLAttributes","style","convertTikTokUrlToEmbed","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","addNodeView","addCommands","insertTiktok","className","commands","embedUrl","undefined","insertContent","attrs","urlObj","URL","path","pathname","videoId","split","filter","Boolean","isValidHttpUrl","string","_","protocol"],"mappings":"AAYA,SAASA,IAAI,EAAEC,eAAe,QAAQ,eAAc;AACpD,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,iBAAiB,mBAAkB;AAE1C,OAAO,MAAMC,SAASJ,KAAKK,MAAM,CAAC;IAChCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IAEtBC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,OAAO;gBAAED,SAAS;YAAK;YACvBE,KAAK;gBACHF,SAAS;YACX;YACAG,OAAO;gBACLH,SAAS;YACX;YACAI,QAAQ;gBACNJ,SAAS;YACX;YACAK,aAAa;gBACXL,SAAS;YACX;YACAM,WAAW;gBACTN,SAAS;YACX;YACAO,mBAAmB;gBACjBP,SAAS;YACX;QACF;IACF;IACAQ;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IACAC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACAtB,gBAAgB;gBACd,aAAa;gBACbY,OAAO,CAAC,2BAA2B,EAAEU,eAAeV,KAAK,IAAI,GAAG,CAAC;YACnE;YAAI;gBACF;gBACAZ,gBACE;oBAAEY,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOZ,gBAAgB;wBAAEY,OAAO;wBAAgCW,OAAO;oBAAwC;oBAC9G;wBAAC;wBAAO;4BAAEX,OAAO;wBAAyB;wBACxC;4BAAC;4BAAUZ,gBAAgBsB,gBAAgB;gCAAET,KAAKW,wBAAwBF,eAAeZ,GAAG;4BAAE;yBAAI;qBACnG;iBACF;aACF;SACF;IACH;IACAe;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAC3B,IAAI;gBACtB,GACC4B,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEAC;QACE,OAAOlC,sBAAsBC;IAC/B;IAEAkC;QACE,OAAO;YACLC,cACE,CAAC3B,KAAK4B,YACJ,CAAC,EAAEC,QAAQ,EAAEV,KAAK,EAAE;oBAGlB,IAAIW;oBAGJ,kCAAkC;oBAClCA,WAAW9B,MAAMc,wBAAwBd,OAAO+B;oBAChD,OAAOF,SAASG,aAAa,CAAC;wBAC5BV,MAAM;wBACNW,OAAO;4BACLjC;4BACAE,OAAO0B;4BACPzB,KAAK2B;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAAShB,wBAAwBd,GAAW;IAC1C,IAAI,CAACA,KAAK,OAAO+B;IACjB,IAAI;QACF,MAAMG,SAAS,IAAIC,IAAInC;QACvB,MAAMoC,OAAOF,OAAOG,QAAQ;QAC5B,MAAMC,UAAUF,KAAKG,KAAK,CAAC,KAAKC,MAAM,CAACC,QAAQ,CAAC,EAAE;QAClD,OAAOH,UAAU,CAAC,gCAAgC,EAAEA,QAAQ,CAAC,GAAGP;IAClE,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEA,SAASW,eAAeC,MAAc;IACpC,IAAI3C;IAEJ,IAAI;QACFA,MAAM,IAAImC,IAAIQ;IAChB,EAAE,OAAOC,GAAG;QACV,OAAO;IACT;IAEA,OAAO5C,IAAI6C,QAAQ,KAAK,WAAW7C,IAAI6C,QAAQ,KAAK;AACtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twitter.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"twitter.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,gBAsGlB,CAAA"}
|
|
@@ -69,7 +69,7 @@ export const Twitter = Node.create({
|
|
|
69
69
|
[
|
|
70
70
|
'a',
|
|
71
71
|
{
|
|
72
|
-
href: HTMLAttributes.
|
|
72
|
+
href: convertYoutubeUrlToEmbed(HTMLAttributes.url) ?? HTMLAttributes.src
|
|
73
73
|
},
|
|
74
74
|
''
|
|
75
75
|
]
|
|
@@ -94,11 +94,7 @@ export const Twitter = Node.create({
|
|
|
94
94
|
insertTwitter: (url, className)=>({ commands, state })=>{
|
|
95
95
|
let formattedUrl = url;
|
|
96
96
|
if (url) {
|
|
97
|
-
|
|
98
|
-
if (tweetMatch) {
|
|
99
|
-
const [_, username, tweetId] = tweetMatch;
|
|
100
|
-
formattedUrl = `https://twitter.com/${username}/status/${tweetId}`;
|
|
101
|
-
}
|
|
97
|
+
formattedUrl = convertYoutubeUrlToEmbed(url);
|
|
102
98
|
}
|
|
103
99
|
return commands.insertContent({
|
|
104
100
|
type: 'twitter',
|
|
@@ -112,6 +108,20 @@ export const Twitter = Node.create({
|
|
|
112
108
|
};
|
|
113
109
|
}
|
|
114
110
|
});
|
|
111
|
+
function convertYoutubeUrlToEmbed(url) {
|
|
112
|
+
if (!url) return undefined;
|
|
113
|
+
try {
|
|
114
|
+
let formattedUrl;
|
|
115
|
+
const tweetMatch = url.match(/(?:twitter\.com|x\.com)\/([^\/]+)\/status\/(\d+)/);
|
|
116
|
+
if (tweetMatch) {
|
|
117
|
+
const [_, username, tweetId] = tweetMatch;
|
|
118
|
+
formattedUrl = `https://twitter.com/${username}/status/${tweetId}`;
|
|
119
|
+
}
|
|
120
|
+
return formattedUrl ? formattedUrl : undefined;
|
|
121
|
+
} catch {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
115
125
|
function isValidHttpUrl(string) {
|
|
116
126
|
let url;
|
|
117
127
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n twitter: {\n /**\n * Add an image\n */\n\n insertTwitter: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, PasteRule, markPasteRule, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TwitterEmbed from './TwitterEmbed.js'\n\nexport const Twitter = Node.create({\n name: 'twitter',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"twitter\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n src: { default: null },\n class: { default: null },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n // renderHTML({ HTMLAttributes }) {\n // return [\n // \"div\",\n // mergeAttributes(HTMLAttributes, { \"data-type\": \"twitter\" }),\n // 0,\n // ];\n // },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"twitter\",\n class: `react-renderer node-twitter ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-twitter-embed', style: 'overflow: hidden; width: 325px; border-radius: 12px;' }),\n\n [\n 'blockquote',\n { class: 'twitter-tweet' },\n ['a', { href: HTMLAttributes.
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Twitter/twitter.ts"],"sourcesContent":["declare module '@tiptap/core' {\n interface Commands<ReturnType> {\n twitter: {\n /**\n * Add an image\n */\n\n insertTwitter: (url?: string, className?: string) => ReturnType\n }\n }\n}\n\nimport { Node, PasteRule, markPasteRule, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport TwitterEmbed from './TwitterEmbed.js'\n\nexport const Twitter = Node.create({\n name: 'twitter',\n\n group: 'block',\n content: 'inline*',\n draggable: true,\n\n // content: 'inline*',\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"twitter\"]',\n },\n ]\n },\n\n addAttributes() {\n return {\n url: { default: null },\n src: { default: null },\n class: { default: null },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => {\n return this.editor\n .chain()\n .insertContentAt(this.editor.state.selection.head, {\n type: this.type.name,\n })\n .focus()\n .run()\n },\n }\n },\n\n // renderHTML({ HTMLAttributes }) {\n // return [\n // \"div\",\n // mergeAttributes(HTMLAttributes, { \"data-type\": \"twitter\" }),\n // 0,\n // ];\n // },\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"twitter\",\n class: `react-renderer node-twitter ${HTMLAttributes.class ?? \"\"}`,\n }), [\n 'div',\n mergeAttributes(\n { class: 'socialMediaContainer' },\n ),\n ['div', mergeAttributes({ class: 'rsme-embed rsme-twitter-embed', style: 'overflow: hidden; width: 325px; border-radius: 12px;' }),\n\n [\n 'blockquote',\n { class: 'twitter-tweet' },\n ['a', { href: convertYoutubeUrlToEmbed(HTMLAttributes.url) ?? HTMLAttributes.src }, ''],\n ],\n [\n 'script',\n {\n async: true,\n src: 'https://platform.twitter.com/widgets.js',\n charset: 'utf-8',\n },\n ],\n ]\n ]\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TwitterEmbed)\n },\n\n addCommands() {\n return {\n insertTwitter:\n (url, className) =>\n ({ commands, state }) => {\n let formattedUrl = url\n if (url) {\n\n formattedUrl = convertYoutubeUrlToEmbed(url)\n }\n return commands.insertContent({\n type: 'twitter',\n attrs: {\n url: url,\n class: className,\n src: formattedUrl,\n },\n })\n },\n }\n },\n})\n\nfunction convertYoutubeUrlToEmbed(url: string): string | undefined {\n if (!url) return undefined;\n try {\n let formattedUrl\n const tweetMatch = url.match(/(?:twitter\\.com|x\\.com)\\/([^\\/]+)\\/status\\/(\\d+)/)\n if (tweetMatch) {\n const [_, username, tweetId] = tweetMatch\n formattedUrl = `https://twitter.com/${username}/status/${tweetId}`\n }\n return formattedUrl ? formattedUrl : undefined;\n } catch {\n return undefined;\n }\n}\nfunction isValidHttpUrl(string: string) {\n let url\n\n try {\n url = new URL(string)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n"],"names":["Node","mergeAttributes","ReactNodeViewRenderer","TwitterEmbed","Twitter","create","name","group","content","draggable","parseHTML","tag","addAttributes","url","default","src","class","addKeyboardShortcuts","editor","chain","insertContentAt","state","selection","head","type","focus","run","renderHTML","HTMLAttributes","style","href","convertYoutubeUrlToEmbed","async","charset","addNodeView","addCommands","insertTwitter","className","commands","formattedUrl","insertContent","attrs","undefined","tweetMatch","match","_","username","tweetId","isValidHttpUrl","string","URL","protocol"],"mappings":"AAYA,SAASA,IAAI,EAA4BC,eAAe,QAAQ,eAAc;AAC9E,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,OAAOC,kBAAkB,oBAAmB;AAE5C,OAAO,MAAMC,UAAUJ,KAAKK,MAAM,CAAC;IACjCC,MAAM;IAENC,OAAO;IACPC,SAAS;IACTC,WAAW;IAEX,sBAAsB;IAEtBC;QACE,OAAO;YACL;gBACEC,KAAK;YACP;SACD;IACH;IAEAC;QACE,OAAO;YACLC,KAAK;gBAAEC,SAAS;YAAK;YACrBC,KAAK;gBAAED,SAAS;YAAK;YACrBE,OAAO;gBAAEF,SAAS;YAAK;QACzB;IACF;IAEAG;QACE,OAAO;YACL,aAAa;gBACX,OAAO,IAAI,CAACC,MAAM,CACfC,KAAK,GACLC,eAAe,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK,CAACC,SAAS,CAACC,IAAI,EAAE;oBACjDC,MAAM,IAAI,CAACA,IAAI,CAAClB,IAAI;gBACtB,GACCmB,KAAK,GACLC,GAAG;YACR;QACF;IACF;IAEA,mCAAmC;IACnC,aAAa;IACb,aAAa;IACb,mEAAmE;IACnE,SAAS;IACT,OAAO;IACP,KAAK;IACLC,YAAW,EAAEC,cAAc,EAAE;QAC3B,OAAO;YACL;YACA3B,gBAAgB2B,gBAAgB;gBAC9B,aAAa;gBACbZ,OAAO,CAAC,4BAA4B,EAAEY,eAAeZ,KAAK,IAAI,GAAG,CAAC;YACpE;YAAI;gBACF;gBACAf,gBACE;oBAAEe,OAAO;gBAAuB;gBAElC;oBAAC;oBAAOf,gBAAgB;wBAAEe,OAAO;wBAAiCa,OAAO;oBAAuD;oBAE9H;wBACE;wBACA;4BAAEb,OAAO;wBAAgB;wBACzB;4BAAC;4BAAK;gCAAEc,MAAMC,yBAAyBH,eAAef,GAAG,KAAKe,eAAeb,GAAG;4BAAC;4BAAG;yBAAG;qBACxF;oBACD;wBACE;wBACA;4BACEiB,OAAO;4BACPjB,KAAK;4BACLkB,SAAS;wBACX;qBACD;iBACF;aACF;SACF;IACH;IAEAC;QACE,OAAOhC,sBAAsBC;IAC/B;IAEAgC;QACE,OAAO;YACLC,eACE,CAACvB,KAAKwB,YACJ,CAAC,EAAEC,QAAQ,EAAEjB,KAAK,EAAE;oBAClB,IAAIkB,eAAe1B;oBACnB,IAAIA,KAAK;wBAEP0B,eAAeR,yBAAyBlB;oBAC1C;oBACA,OAAOyB,SAASE,aAAa,CAAC;wBAC5BhB,MAAM;wBACNiB,OAAO;4BACL5B,KAAKA;4BACLG,OAAOqB;4BACPtB,KAAKwB;wBACP;oBACF;gBACF;QACN;IACF;AACF,GAAE;AAEF,SAASR,yBAAyBlB,GAAW;IAC3C,IAAI,CAACA,KAAK,OAAO6B;IACjB,IAAI;QACF,IAAIH;QACJ,MAAMI,aAAa9B,IAAI+B,KAAK,CAAC;QAC7B,IAAID,YAAY;YACd,MAAM,CAACE,GAAGC,UAAUC,QAAQ,GAAGJ;YAC/BJ,eAAe,CAAC,oBAAoB,EAAEO,SAAS,QAAQ,EAAEC,QAAQ,CAAC;QACpE;QACA,OAAOR,eAAeA,eAAeG;IACvC,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AACA,SAASM,eAAeC,MAAc;IACpC,IAAIpC;IAEJ,IAAI;QACFA,MAAM,IAAIqC,IAAID;IAChB,EAAE,OAAOJ,GAAG;QACV,OAAO;IACT;IAEA,OAAOhC,IAAIsC,QAAQ,KAAK,WAAWtC,IAAIsC,QAAQ,KAAK;AACtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/extensions/SocialMedia/Youtube/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;;eAEG;YAEH,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;SAChE,CAAA;KACF;CACF;AAED,OAAO,EAAE,IAAI,EAA6C,MAAM,cAAc,CAAA;AAI9E,eAAO,MAAM,OAAO,gBAgGlB,CAAA"}
|
|
@@ -73,9 +73,9 @@ export const Youtube = Node.create({
|
|
|
73
73
|
},
|
|
74
74
|
[
|
|
75
75
|
'iframe',
|
|
76
|
-
mergeAttributes({
|
|
77
|
-
src: HTMLAttributes.
|
|
78
|
-
}
|
|
76
|
+
mergeAttributes(HTMLAttributes, {
|
|
77
|
+
src: convertYoutubeUrlToEmbed(HTMLAttributes.url)
|
|
78
|
+
})
|
|
79
79
|
]
|
|
80
80
|
]
|
|
81
81
|
]
|
|
@@ -90,28 +90,7 @@ export const Youtube = Node.create({
|
|
|
90
90
|
insertYoutube: (url, className)=>({ commands, state })=>{
|
|
91
91
|
let embedUrl = '';
|
|
92
92
|
if (url) {
|
|
93
|
-
|
|
94
|
-
const urlObj = new URL(url);
|
|
95
|
-
let videoId = '';
|
|
96
|
-
if (urlObj.hostname === 'youtu.be') {
|
|
97
|
-
// Handle youtu.be format
|
|
98
|
-
videoId = urlObj.pathname.slice(1);
|
|
99
|
-
} else {
|
|
100
|
-
// Handle youtube.com formats
|
|
101
|
-
const searchParams = new URLSearchParams(urlObj.search);
|
|
102
|
-
videoId = searchParams.get('v') || '';
|
|
103
|
-
if (!videoId) {
|
|
104
|
-
// Try extracting from pathname for embed URLs
|
|
105
|
-
const matches = urlObj.pathname.match(/\/embed\/([^/?]+)/);
|
|
106
|
-
if (matches) {
|
|
107
|
-
videoId = matches[1];
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (videoId) {
|
|
112
|
-
// Convert to embed URL
|
|
113
|
-
embedUrl = `https://www.youtube.com/embed/${videoId}`;
|
|
114
|
-
}
|
|
93
|
+
embedUrl = convertYoutubeUrlToEmbed(url);
|
|
115
94
|
}
|
|
116
95
|
return commands.insertContent({
|
|
117
96
|
type: 'youtube',
|
|
@@ -125,6 +104,32 @@ export const Youtube = Node.create({
|
|
|
125
104
|
};
|
|
126
105
|
}
|
|
127
106
|
});
|
|
107
|
+
function convertYoutubeUrlToEmbed(url) {
|
|
108
|
+
if (!url) return undefined;
|
|
109
|
+
try {
|
|
110
|
+
// Extract video ID from various YouTube URL formats
|
|
111
|
+
const urlObj = new URL(url);
|
|
112
|
+
let videoId = '';
|
|
113
|
+
if (urlObj.hostname === 'youtu.be') {
|
|
114
|
+
// Handle youtu.be format
|
|
115
|
+
videoId = urlObj.pathname.slice(1);
|
|
116
|
+
} else {
|
|
117
|
+
// Handle youtube.com formats
|
|
118
|
+
const searchParams = new URLSearchParams(urlObj.search);
|
|
119
|
+
videoId = searchParams.get('v') || '';
|
|
120
|
+
if (!videoId) {
|
|
121
|
+
// Try extracting from pathname for embed URLs
|
|
122
|
+
const matches = urlObj.pathname.match(/\/embed\/([^/?]+)/);
|
|
123
|
+
if (matches) {
|
|
124
|
+
videoId = matches[1];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return videoId ? `https://www.youtube.com/embed/${videoId}` : undefined;
|
|
129
|
+
} catch {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
128
133
|
function isValidHttpUrl(string) {
|
|
129
134
|
let url;
|
|
130
135
|
try {
|