@lofcz/platejs-media 52.0.11

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.
@@ -0,0 +1,417 @@
1
+ import { KEYS, bindFirst, createSlatePlugin, createTSlatePlugin, getInjectedPlugins, isUrl, pipeInsertDataQuery } from "platejs";
2
+ import videoParser from "js-video-url-parser";
3
+
4
+ //#region src/lib/BaseAudioPlugin.ts
5
+ const BaseAudioPlugin = createSlatePlugin({
6
+ key: KEYS.audio,
7
+ node: {
8
+ isElement: true,
9
+ isVoid: true
10
+ }
11
+ });
12
+
13
+ //#endregion
14
+ //#region src/lib/BaseFilePlugin.ts
15
+ const BaseFilePlugin = createSlatePlugin({
16
+ key: KEYS.file,
17
+ node: {
18
+ isElement: true,
19
+ isVoid: true
20
+ }
21
+ });
22
+
23
+ //#endregion
24
+ //#region src/lib/BaseVideoPlugin.ts
25
+ const BaseVideoPlugin = createSlatePlugin({
26
+ key: KEYS.video,
27
+ node: {
28
+ dangerouslyAllowAttributes: ["width", "height"],
29
+ isElement: true,
30
+ isVoid: true
31
+ }
32
+ });
33
+
34
+ //#endregion
35
+ //#region src/lib/image/transforms/insertImage.ts
36
+ const insertImage = (editor, url, options = {}) => {
37
+ const image = {
38
+ children: [{ text: "" }],
39
+ type: editor.getType(KEYS.img),
40
+ url
41
+ };
42
+ editor.tf.insertNodes(image, {
43
+ nextBlock: true,
44
+ ...options
45
+ });
46
+ };
47
+
48
+ //#endregion
49
+ //#region src/lib/image/transforms/insertImageFromFiles.ts
50
+ const insertImageFromFiles = (editor, files, options = {}) => {
51
+ for (const file of files) {
52
+ const reader = new FileReader();
53
+ const [mime] = file.type.split("/");
54
+ if (mime === "image") {
55
+ reader.addEventListener("load", async () => {
56
+ if (!reader.result) return;
57
+ const uploadImage = editor.getOptions(BaseImagePlugin).uploadImage;
58
+ insertImage(editor, uploadImage ? await uploadImage(reader.result) : reader.result, options);
59
+ });
60
+ reader.readAsDataURL(file);
61
+ }
62
+ }
63
+ };
64
+
65
+ //#endregion
66
+ //#region src/lib/image/utils/isImageUrl.ts
67
+ const imageExtensions = new Set([
68
+ "3dv",
69
+ "ai",
70
+ "amf",
71
+ "art",
72
+ "art",
73
+ "ase",
74
+ "awg",
75
+ "blp",
76
+ "bmp",
77
+ "bw",
78
+ "bw",
79
+ "cd5",
80
+ "cdr",
81
+ "cgm",
82
+ "cit",
83
+ "cmx",
84
+ "cpt",
85
+ "cr2",
86
+ "cur",
87
+ "cut",
88
+ "dds",
89
+ "dib",
90
+ "djvu",
91
+ "dxf",
92
+ "e2d",
93
+ "ecw",
94
+ "egt",
95
+ "egt",
96
+ "emf",
97
+ "eps",
98
+ "exif",
99
+ "fs",
100
+ "gbr",
101
+ "gif",
102
+ "gpl",
103
+ "grf",
104
+ "hdp",
105
+ "icns",
106
+ "ico",
107
+ "iff",
108
+ "iff",
109
+ "int",
110
+ "int",
111
+ "inta",
112
+ "jfif",
113
+ "jng",
114
+ "jp2",
115
+ "jpeg",
116
+ "jpg",
117
+ "jps",
118
+ "jxr",
119
+ "lbm",
120
+ "lbm",
121
+ "liff",
122
+ "max",
123
+ "miff",
124
+ "mng",
125
+ "msp",
126
+ "nitf",
127
+ "nrrd",
128
+ "odg",
129
+ "ota",
130
+ "pam",
131
+ "pbm",
132
+ "pc1",
133
+ "pc2",
134
+ "pc3",
135
+ "pcf",
136
+ "pct",
137
+ "pcx",
138
+ "pcx",
139
+ "pdd",
140
+ "pdn",
141
+ "pgf",
142
+ "pgm",
143
+ "PI1",
144
+ "PI2",
145
+ "PI3",
146
+ "pict",
147
+ "png",
148
+ "pnm",
149
+ "pns",
150
+ "ppm",
151
+ "psb",
152
+ "psd",
153
+ "psp",
154
+ "px",
155
+ "pxm",
156
+ "pxr",
157
+ "qfx",
158
+ "ras",
159
+ "raw",
160
+ "rgb",
161
+ "rgb",
162
+ "rgba",
163
+ "rle",
164
+ "sct",
165
+ "sgi",
166
+ "sgi",
167
+ "sid",
168
+ "stl",
169
+ "sun",
170
+ "svg",
171
+ "sxd",
172
+ "tga",
173
+ "tga",
174
+ "tif",
175
+ "tiff",
176
+ "v2d",
177
+ "vnd",
178
+ "vrml",
179
+ "vtf",
180
+ "wdp",
181
+ "webp",
182
+ "wmf",
183
+ "x3d",
184
+ "xar",
185
+ "xbm",
186
+ "xcf",
187
+ "xpm"
188
+ ]);
189
+ const isImageUrl = (url) => {
190
+ if (!isUrl(url)) return false;
191
+ const ext = new URL(url).pathname.split(".").pop();
192
+ return imageExtensions.has(ext);
193
+ };
194
+
195
+ //#endregion
196
+ //#region src/lib/image/withImageEmbed.ts
197
+ /** If inserted text is image url, insert image instead. */
198
+ const withImageEmbed = ({ editor, getOptions, tf: { insertData } }) => ({ transforms: { insertData(dataTransfer) {
199
+ if (getOptions().disableEmbedInsert) return insertData(dataTransfer);
200
+ const text = dataTransfer.getData("text/plain");
201
+ if (isImageUrl(text)) {
202
+ insertImage(editor, text);
203
+ return;
204
+ }
205
+ insertData(dataTransfer);
206
+ } } });
207
+
208
+ //#endregion
209
+ //#region src/lib/image/withImageUpload.ts
210
+ /**
211
+ * Allows for pasting images from clipboard. Not yet: dragging and dropping
212
+ * images, selecting them through a file system dialog.
213
+ */
214
+ const withImageUpload = ({ editor, getOptions, plugin, tf: { insertData } }) => ({ transforms: { insertData(dataTransfer) {
215
+ if (getOptions().disableUploadInsert) return insertData(dataTransfer);
216
+ const mimeType = "text/plain";
217
+ const text = dataTransfer.getData(mimeType);
218
+ const { files } = dataTransfer;
219
+ if (!text && files && files.length > 0) {
220
+ if (!pipeInsertDataQuery(editor, getInjectedPlugins(editor, plugin), {
221
+ data: text,
222
+ dataTransfer,
223
+ mimeType
224
+ })) return insertData(dataTransfer);
225
+ insertImageFromFiles(editor, files);
226
+ } else return insertData(dataTransfer);
227
+ } } });
228
+
229
+ //#endregion
230
+ //#region src/lib/image/BaseImagePlugin.ts
231
+ /** Enables support for images. */
232
+ const BaseImagePlugin = createTSlatePlugin({
233
+ key: KEYS.img,
234
+ node: {
235
+ dangerouslyAllowAttributes: [
236
+ "alt",
237
+ "width",
238
+ "height"
239
+ ],
240
+ isElement: true,
241
+ isVoid: true
242
+ },
243
+ parsers: { html: { deserializer: {
244
+ rules: [{ validNodeName: "IMG" }],
245
+ parse: ({ element, type }) => ({
246
+ type,
247
+ url: element.getAttribute("src")
248
+ })
249
+ } } }
250
+ }).overrideEditor(withImageUpload).overrideEditor(withImageEmbed).extendEditorTransforms(({ editor }) => ({ insert: { imageFromFiles: bindFirst(insertImageFromFiles, editor) } }));
251
+
252
+ //#endregion
253
+ //#region src/lib/media/insertMedia.ts
254
+ const insertMedia = async (editor, { getUrl, type = editor.getType(KEYS.img), ...options } = {}) => {
255
+ const url = getUrl ? await getUrl() : window.prompt(`Enter the URL of the ${type === KEYS.img ? KEYS.img : KEYS.mediaEmbed}`);
256
+ if (!url) return;
257
+ if (type === editor.getType(KEYS.img)) insertImage(editor, url, options);
258
+ else insertMediaEmbed(editor, { url }, options);
259
+ };
260
+
261
+ //#endregion
262
+ //#region src/lib/media/parseMediaUrl.ts
263
+ const allowedProtocols = new Set(["http:", "https:"]);
264
+ const parseMediaUrl = (url, { urlParsers }) => {
265
+ const embed = (() => {
266
+ for (const parser of urlParsers) {
267
+ const data = parser(url);
268
+ if (data) return data;
269
+ }
270
+ })();
271
+ if (embed?.url) try {
272
+ const { protocol } = new URL(embed.url);
273
+ if (!allowedProtocols.has(protocol)) return;
274
+ } catch {
275
+ console.warn(`Could not parse URL: ${embed.url}`);
276
+ return;
277
+ }
278
+ return embed;
279
+ };
280
+
281
+ //#endregion
282
+ //#region src/lib/media-embed/parseIframeUrl.ts
283
+ const regexMatchSrc = /src=".*?"/;
284
+ const regexGroupQuotes = /"([^"]*)"/;
285
+ const parseIframeUrl = (url) => {
286
+ if (!url.startsWith("http")) {
287
+ const returnString = (regexMatchSrc.exec(url)?.[0])?.match(regexGroupQuotes)?.[1];
288
+ if (returnString) return returnString;
289
+ }
290
+ return url;
291
+ };
292
+
293
+ //#endregion
294
+ //#region src/lib/media-embed/BaseMediaEmbedPlugin.ts
295
+ /**
296
+ * Enables support for embeddable media such as YouTube or Vimeo videos,
297
+ * Instagram posts and tweets or Google Maps.
298
+ */
299
+ const BaseMediaEmbedPlugin = createTSlatePlugin({
300
+ key: KEYS.mediaEmbed,
301
+ node: {
302
+ isElement: true,
303
+ isVoid: true
304
+ },
305
+ options: { transformUrl: parseIframeUrl },
306
+ parsers: { html: { deserializer: {
307
+ rules: [{ validNodeName: "IFRAME" }],
308
+ parse: ({ element, type }) => {
309
+ const url = element.getAttribute("src");
310
+ if (url) return {
311
+ type,
312
+ url
313
+ };
314
+ }
315
+ } } }
316
+ });
317
+
318
+ //#endregion
319
+ //#region src/lib/media-embed/parseTwitterUrl.ts
320
+ const twitterRegex = /^https?:\/\/(?:twitter|x)\.com\/(?:#!\/)?(\w+)\/status(es)?\/(\d+)/;
321
+ const TWITTER_ID_INDEX = 3;
322
+ const parseTwitterUrl = (url) => {
323
+ const match = twitterRegex.exec(url);
324
+ if (match) return {
325
+ id: match[TWITTER_ID_INDEX],
326
+ provider: "twitter",
327
+ url
328
+ };
329
+ };
330
+
331
+ //#endregion
332
+ //#region src/lib/media-embed/parseVideoUrl.ts
333
+ const YOUTUBE_PREFIX = "https://www.youtube.com/embed/";
334
+ const VIMEO_PREFIX = "https://player.vimeo.com/video/";
335
+ const DAILYMOTION_PREFIX = "https://www.dailymotion.com/embed/video/";
336
+ const YOUKU_PREFIX = "https://player.youku.com/embed/";
337
+ const COUB_PREFIX = "https://coub.com/embed/";
338
+ const VIDEO_PROVIDERS = [
339
+ "youtube",
340
+ "vimeo",
341
+ "dailymotion",
342
+ "youku",
343
+ "coub"
344
+ ];
345
+ const parseVideoUrl = (url) => {
346
+ if (!isUrl(url)) return;
347
+ const videoData = videoParser.parse(url);
348
+ if (videoData?.provider && videoData.id) {
349
+ const { id, provider } = videoData;
350
+ return {
351
+ id,
352
+ provider,
353
+ url: {
354
+ coub: `${COUB_PREFIX}${id}`,
355
+ dailymotion: `${DAILYMOTION_PREFIX}${id}`,
356
+ vimeo: `${VIMEO_PREFIX}${id}`,
357
+ youku: `${YOUKU_PREFIX}${id}`,
358
+ youtube: `${YOUTUBE_PREFIX}${id}`
359
+ }[provider]
360
+ };
361
+ }
362
+ };
363
+
364
+ //#endregion
365
+ //#region src/lib/media-embed/transforms/insertMediaEmbed.ts
366
+ const insertMediaEmbed = (editor, { url = "" }, options = {}) => {
367
+ if (!editor.selection) return;
368
+ const selectionParentEntry = editor.api.parent(editor.selection);
369
+ if (!selectionParentEntry) return;
370
+ const [, path] = selectionParentEntry;
371
+ editor.tf.insertNodes({
372
+ children: [{ text: "" }],
373
+ type: editor.getType(KEYS.mediaEmbed),
374
+ url
375
+ }, {
376
+ at: path,
377
+ nextBlock: true,
378
+ ...options
379
+ });
380
+ };
381
+
382
+ //#endregion
383
+ //#region src/lib/placeholder/transforms/insertPlaceholder.ts
384
+ const insertPlaceholder = (editor, mediaType, options) => {
385
+ editor.tf.withoutNormalizing(() => editor.tf.insertNodes({
386
+ children: [{ text: "" }],
387
+ mediaType,
388
+ type: editor.getType(KEYS.placeholder)
389
+ }, options));
390
+ };
391
+ const insertImagePlaceholder = (editor, options) => insertPlaceholder(editor, KEYS.img, options);
392
+ const insertVideoPlaceholder = (editor, options) => insertPlaceholder(editor, KEYS.video, options);
393
+ const insertAudioPlaceholder = (editor, options) => insertPlaceholder(editor, KEYS.audio, options);
394
+ const insertFilePlaceholder = (editor, options) => insertPlaceholder(editor, KEYS.file, options);
395
+
396
+ //#endregion
397
+ //#region src/lib/placeholder/transforms/setMediaNode.ts
398
+ const setMediaNode = (editor, props, options) => editor.tf.setNodes(props, options);
399
+
400
+ //#endregion
401
+ //#region src/lib/placeholder/BasePlaceholderPlugin.ts
402
+ const BasePlaceholderPlugin = createTSlatePlugin({
403
+ key: KEYS.placeholder,
404
+ node: {
405
+ isElement: true,
406
+ isVoid: true
407
+ }
408
+ }).extendEditorTransforms(({ editor }) => ({ insert: {
409
+ audioPlaceholder: bindFirst(insertAudioPlaceholder, editor),
410
+ filePlaceholder: bindFirst(insertFilePlaceholder, editor),
411
+ imagePlaceholder: bindFirst(insertImagePlaceholder, editor),
412
+ videoPlaceholder: bindFirst(insertVideoPlaceholder, editor)
413
+ } }));
414
+
415
+ //#endregion
416
+ export { BaseFilePlugin as C, BaseVideoPlugin as S, withImageUpload as _, insertImagePlaceholder as a, insertImageFromFiles as b, insertMediaEmbed as c, parseTwitterUrl as d, BaseMediaEmbedPlugin as f, BaseImagePlugin as g, insertMedia as h, insertFilePlaceholder as i, VIDEO_PROVIDERS as l, parseMediaUrl as m, setMediaNode as n, insertPlaceholder as o, parseIframeUrl as p, insertAudioPlaceholder as r, insertVideoPlaceholder as s, BasePlaceholderPlugin as t, parseVideoUrl as u, withImageEmbed as v, BaseAudioPlugin as w, insertImage as x, isImageUrl as y };
417
+ //# sourceMappingURL=src-C-5lYedg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-C-5lYedg.js","names":["createSlatePlugin","KEYS","BaseAudioPlugin","key","audio","node","isElement","isVoid","createSlatePlugin","KEYS","BaseFilePlugin","key","file","node","isElement","isVoid","createSlatePlugin","KEYS","BaseVideoPlugin","key","video","node","dangerouslyAllowAttributes","isElement","isVoid","InsertNodesOptions","SlateEditor","TImageElement","KEYS","insertImage","editor","url","ArrayBuffer","options","text","image","children","type","getType","img","tf","insertNodes","nextBlock","InsertNodesOptions","SlateEditor","BaseImagePlugin","insertImage","insertImageFromFiles","editor","files","FileList","options","file","reader","FileReader","mime","type","split","addEventListener","result","uploadImage","getOptions","uploadedUrl","readAsDataURL","isUrl","imageExtensions","Set","isImageUrl","url","ext","URL","pathname","split","pop","has","OverrideEditor","ImageConfig","insertImage","isImageUrl","withImageEmbed","editor","getOptions","tf","insertData","transforms","dataTransfer","disableEmbedInsert","text","getData","OverrideEditor","getInjectedPlugins","pipeInsertDataQuery","ImageConfig","insertImageFromFiles","withImageUpload","editor","getOptions","plugin","tf","insertData","transforms","dataTransfer","disableUploadInsert","mimeType","text","getData","files","length","injectedPlugins","data","PluginConfig","bindFirst","createTSlatePlugin","KEYS","MediaPluginOptions","insertImageFromFiles","withImageEmbed","withImageUpload","ImageConfig","disableEmbedInsert","disableUploadInsert","uploadImage","dataUrl","ArrayBuffer","Promise","BaseImagePlugin","key","img","node","dangerouslyAllowAttributes","isElement","isVoid","parsers","html","deserializer","rules","validNodeName","parse","element","type","url","getAttribute","overrideEditor","extendEditorTransforms","editor","insert","imageFromFiles","InsertNodesOptions","SlateEditor","KEYS","insertImage","insertMediaEmbed","InsertMediaOptions","type","getUrl","Promise","insertMedia","editor","E","getType","img","options","url","window","prompt","mediaEmbed","EmbedUrlData","id","provider","url","EmbedUrlParser","allowedProtocols","Set","parseMediaUrl","urlParsers","embed","parser","data","protocol","URL","has","console","warn","regexMatchSrc","regexGroupQuotes","parseIframeUrl","url","startsWith","src","exec","returnString","match","PluginConfig","createTSlatePlugin","KEYS","MediaPluginOptions","parseIframeUrl","MediaEmbedConfig","BaseMediaEmbedPlugin","key","mediaEmbed","node","isElement","isVoid","options","transformUrl","parsers","html","deserializer","rules","validNodeName","parse","element","type","url","getAttribute","EmbedUrlData","twitterRegex","TWITTER_ID_INDEX","parseTwitterUrl","url","match","exec","id","provider","videoParser","isUrl","EmbedUrlData","YOUTUBE_PREFIX","VIMEO_PREFIX","DAILYMOTION_PREFIX","YOUKU_PREFIX","COUB_PREFIX","VIDEO_PROVIDERS","parseVideoUrl","url","videoData","parse","provider","id","providerUrls","Record","coub","dailymotion","vimeo","youku","youtube","InsertNodesOptions","SlateEditor","TMediaEmbedElement","KEYS","insertMediaEmbed","editor","url","Partial","options","selection","selectionParentEntry","api","parent","path","tf","insertNodes","children","text","type","getType","mediaEmbed","at","nextBlock","InsertNodesOptions","SlateEditor","TPlaceholderElement","KEYS","insertPlaceholder","editor","mediaType","options","tf","withoutNormalizing","insertNodes","children","text","type","getType","placeholder","insertImagePlaceholder","img","insertVideoPlaceholder","video","insertAudioPlaceholder","audio","insertFilePlaceholder","file","SetNodesOptions","SlateEditor","props","type","url","id","initialHeight","initialWidth","isUpload","name","placeholderId","width","setMediaNode","editor","options","tf","setNodes","PluginConfig","bindFirst","createTSlatePlugin","KEYS","insertAudioPlaceholder","insertFilePlaceholder","insertImagePlaceholder","insertVideoPlaceholder","MediaPlaceholderOptions","rules","PlaceholderRule","PlaceholderConfig","mediaType","BasePlaceholderPlugin","key","placeholder","node","isElement","isVoid","extendEditorTransforms","editor","insert","audioPlaceholder","filePlaceholder","imagePlaceholder","videoPlaceholder"],"sources":["../src/lib/BaseAudioPlugin.ts","../src/lib/BaseFilePlugin.ts","../src/lib/BaseVideoPlugin.ts","../src/lib/image/transforms/insertImage.ts","../src/lib/image/transforms/insertImageFromFiles.ts","../src/lib/image/utils/isImageUrl.ts","../src/lib/image/withImageEmbed.ts","../src/lib/image/withImageUpload.ts","../src/lib/image/BaseImagePlugin.ts","../src/lib/media/insertMedia.ts","../src/lib/media/parseMediaUrl.ts","../src/lib/media-embed/parseIframeUrl.ts","../src/lib/media-embed/BaseMediaEmbedPlugin.ts","../src/lib/media-embed/parseTwitterUrl.ts","../src/lib/media-embed/parseVideoUrl.ts","../src/lib/media-embed/transforms/insertMediaEmbed.ts","../src/lib/placeholder/transforms/insertPlaceholder.ts","../src/lib/placeholder/transforms/setMediaNode.ts","../src/lib/placeholder/BasePlaceholderPlugin.ts"],"sourcesContent":["import { createSlatePlugin, KEYS } from 'platejs';\n\nexport const BaseAudioPlugin = createSlatePlugin({\n key: KEYS.audio,\n node: { isElement: true, isVoid: true },\n});\n","import { createSlatePlugin, KEYS } from 'platejs';\n\nexport const BaseFilePlugin = createSlatePlugin({\n key: KEYS.file,\n node: { isElement: true, isVoid: true },\n});\n","import { createSlatePlugin, KEYS } from 'platejs';\n\nexport const BaseVideoPlugin = createSlatePlugin({\n key: KEYS.video,\n node: {\n dangerouslyAllowAttributes: ['width', 'height'],\n isElement: true,\n isVoid: true,\n },\n});\n","import type { InsertNodesOptions, SlateEditor, TImageElement } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const insertImage = (\n editor: SlateEditor,\n url: ArrayBuffer | string,\n options: InsertNodesOptions = {}\n) => {\n const text = { text: '' };\n const image: TImageElement = {\n children: [text],\n type: editor.getType(KEYS.img),\n url: url as any,\n };\n editor.tf.insertNodes<TImageElement>(image, {\n nextBlock: true,\n ...(options as any),\n });\n};\n","import type { InsertNodesOptions, SlateEditor } from 'platejs';\n\nimport { BaseImagePlugin } from '../BaseImagePlugin';\nimport { insertImage } from './insertImage';\n\nexport const insertImageFromFiles = (\n editor: SlateEditor,\n files: FileList,\n options: InsertNodesOptions = {}\n) => {\n for (const file of files) {\n const reader = new FileReader();\n const [mime] = file.type.split('/');\n\n if (mime === 'image') {\n reader.addEventListener('load', async () => {\n if (!reader.result) {\n return;\n }\n\n const uploadImage = editor.getOptions(BaseImagePlugin).uploadImage;\n\n const uploadedUrl = uploadImage\n ? await uploadImage(reader.result)\n : reader.result;\n\n insertImage(editor, uploadedUrl, options);\n });\n\n reader.readAsDataURL(file);\n }\n }\n};\n","import { isUrl } from 'platejs';\n\nconst imageExtensions = new Set([\n '3dv',\n 'ai',\n 'amf',\n 'art',\n 'art',\n 'ase',\n 'awg',\n 'blp',\n 'bmp',\n 'bw',\n 'bw',\n 'cd5',\n 'cdr',\n 'cgm',\n 'cit',\n 'cmx',\n 'cpt',\n 'cr2',\n 'cur',\n 'cut',\n 'dds',\n 'dib',\n 'djvu',\n 'dxf',\n 'e2d',\n 'ecw',\n 'egt',\n 'egt',\n 'emf',\n 'eps',\n 'exif',\n 'fs',\n 'gbr',\n 'gif',\n 'gpl',\n 'grf',\n 'hdp',\n 'icns',\n 'ico',\n 'iff',\n 'iff',\n 'int',\n 'int',\n 'inta',\n 'jfif',\n 'jng',\n 'jp2',\n 'jpeg',\n 'jpg',\n 'jps',\n 'jxr',\n 'lbm',\n 'lbm',\n 'liff',\n 'max',\n 'miff',\n 'mng',\n 'msp',\n 'nitf',\n 'nrrd',\n 'odg',\n 'ota',\n 'pam',\n 'pbm',\n 'pc1',\n 'pc2',\n 'pc3',\n 'pcf',\n 'pct',\n 'pcx',\n 'pcx',\n 'pdd',\n 'pdn',\n 'pgf',\n 'pgm',\n 'PI1',\n 'PI2',\n 'PI3',\n 'pict',\n 'png',\n 'pnm',\n 'pns',\n 'ppm',\n 'psb',\n 'psd',\n 'psp',\n 'px',\n 'pxm',\n 'pxr',\n 'qfx',\n 'ras',\n 'raw',\n 'rgb',\n 'rgb',\n 'rgba',\n 'rle',\n 'sct',\n 'sgi',\n 'sgi',\n 'sid',\n 'stl',\n 'sun',\n 'svg',\n 'sxd',\n 'tga',\n 'tga',\n 'tif',\n 'tiff',\n 'v2d',\n 'vnd',\n 'vrml',\n 'vtf',\n 'wdp',\n 'webp',\n 'wmf',\n 'x3d',\n 'xar',\n 'xbm',\n 'xcf',\n 'xpm',\n]);\n\nexport const isImageUrl = (url: string) => {\n if (!isUrl(url)) return false;\n\n const ext = new URL(url).pathname.split('.').pop() as string;\n\n return imageExtensions.has(ext);\n};\n","import type { OverrideEditor } from 'platejs';\n\nimport type { ImageConfig } from './BaseImagePlugin';\n\nimport { insertImage } from './transforms/insertImage';\nimport { isImageUrl } from './utils/isImageUrl';\n\n/** If inserted text is image url, insert image instead. */\nexport const withImageEmbed: OverrideEditor<ImageConfig> = ({\n editor,\n getOptions,\n tf: { insertData },\n}) => ({\n transforms: {\n insertData(dataTransfer) {\n if (getOptions().disableEmbedInsert) {\n return insertData(dataTransfer);\n }\n\n const text = dataTransfer.getData('text/plain');\n\n if (isImageUrl(text)) {\n insertImage(editor, text);\n\n return;\n }\n\n insertData(dataTransfer);\n },\n },\n});\n","import {\n type OverrideEditor,\n getInjectedPlugins,\n pipeInsertDataQuery,\n} from 'platejs';\n\nimport type { ImageConfig } from './BaseImagePlugin';\n\nimport { insertImageFromFiles } from './transforms';\n\n/**\n * Allows for pasting images from clipboard. Not yet: dragging and dropping\n * images, selecting them through a file system dialog.\n */\nexport const withImageUpload: OverrideEditor<ImageConfig> = ({\n editor,\n getOptions,\n plugin,\n tf: { insertData },\n}) => ({\n transforms: {\n insertData(dataTransfer) {\n if (getOptions().disableUploadInsert) {\n return insertData(dataTransfer);\n }\n\n const mimeType = 'text/plain';\n const text = dataTransfer.getData(mimeType);\n const { files } = dataTransfer;\n\n if (!text && files && files.length > 0) {\n const injectedPlugins = getInjectedPlugins(editor, plugin);\n\n if (\n !pipeInsertDataQuery(editor, injectedPlugins, {\n data: text,\n dataTransfer,\n mimeType,\n })\n ) {\n return insertData(dataTransfer);\n }\n\n insertImageFromFiles(editor, files);\n } else {\n return insertData(dataTransfer);\n }\n },\n },\n});\n","import {\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport type { MediaPluginOptions } from '../media';\n\nimport { insertImageFromFiles } from './transforms';\nimport { withImageEmbed } from './withImageEmbed';\nimport { withImageUpload } from './withImageUpload';\n\nexport type ImageConfig = PluginConfig<\n 'img',\n {\n /** Disable url embed on insert data. */\n disableEmbedInsert?: boolean;\n /** Disable file upload on insert data. */\n disableUploadInsert?: boolean;\n /**\n * An optional method that will upload the image to a server. The method\n * receives the base64 dataUrl of the uploaded image, and should return the\n * URL of the uploaded image.\n */\n uploadImage?: (\n dataUrl: ArrayBuffer | string\n ) => ArrayBuffer | Promise<ArrayBuffer | string> | string;\n } & MediaPluginOptions\n>;\n\n/** Enables support for images. */\nexport const BaseImagePlugin = createTSlatePlugin<ImageConfig>({\n key: KEYS.img,\n node: {\n dangerouslyAllowAttributes: ['alt', 'width', 'height'],\n isElement: true,\n isVoid: true,\n },\n parsers: {\n html: {\n deserializer: {\n rules: [\n {\n validNodeName: 'IMG',\n },\n ],\n parse: ({ element, type }) => ({\n type,\n url: element.getAttribute('src'),\n }),\n },\n },\n },\n})\n .overrideEditor(withImageUpload)\n .overrideEditor(withImageEmbed)\n .extendEditorTransforms(({ editor }) => ({\n insert: {\n imageFromFiles: bindFirst(insertImageFromFiles, editor),\n },\n }));\n","import type { InsertNodesOptions, SlateEditor } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nimport { insertImage, insertMediaEmbed } from '../..';\n\nexport interface InsertMediaOptions extends InsertNodesOptions {\n /**\n * Default onClick is getting the image url by calling this promise before\n * inserting the image.\n */\n type?: string;\n\n getUrl?: () => Promise<string>;\n}\n\nexport const insertMedia = async <E extends SlateEditor>(\n editor: E,\n {\n getUrl,\n type = editor.getType(KEYS.img),\n ...options\n }: InsertMediaOptions = {}\n) => {\n const url = getUrl\n ? await getUrl()\n : // biome-ignore lint/suspicious/noAlert: intentional user input for media URL\n window.prompt(\n `Enter the URL of the ${type === KEYS.img ? KEYS.img : KEYS.mediaEmbed}`\n );\n\n if (!url) return;\n if (type === editor.getType(KEYS.img)) {\n insertImage(editor, url, options);\n } else {\n insertMediaEmbed(editor, { url }, options);\n }\n};\n","export type EmbedUrlData = {\n id?: string;\n provider?: string;\n url?: string;\n};\n\nexport type EmbedUrlParser = (url: string) => EmbedUrlData | undefined;\n\n// Unlike the link plugin, there's no legitimate reason for non-HTTP source URLs\nconst allowedProtocols = new Set(['http:', 'https:']);\n\nexport const parseMediaUrl = (\n url: string,\n {\n urlParsers,\n }: {\n urlParsers: EmbedUrlParser[];\n }\n): EmbedUrlData | undefined => {\n const embed = (() => {\n for (const parser of urlParsers) {\n const data = parser(url);\n\n if (data) {\n return data;\n }\n }\n })();\n\n // Harden against XSS\n if (embed?.url) {\n try {\n const { protocol } = new URL(embed.url);\n\n if (!allowedProtocols.has(protocol)) {\n return;\n }\n } catch {\n console.warn(`Could not parse URL: ${embed.url}`);\n\n return;\n }\n }\n\n return embed;\n};\n","const regexMatchSrc = /src=\".*?\"/;\nconst regexGroupQuotes = /\"([^\"]*)\"/;\n\nexport const parseIframeUrl = (url: string) => {\n // if not starting with http, assume pasting of full iframe embed code\n if (!url.startsWith('http')) {\n const src = regexMatchSrc.exec(url)?.[0];\n const returnString = src?.match(regexGroupQuotes)?.[1];\n\n if (returnString) {\n return returnString;\n }\n }\n\n return url;\n};\n","import { type PluginConfig, createTSlatePlugin, KEYS } from 'platejs';\n\nimport type { MediaPluginOptions } from '../media/index';\n\nimport { parseIframeUrl } from './parseIframeUrl';\n\nexport type MediaEmbedConfig = PluginConfig<'media_embed', MediaPluginOptions>;\n\n/**\n * Enables support for embeddable media such as YouTube or Vimeo videos,\n * Instagram posts and tweets or Google Maps.\n */\nexport const BaseMediaEmbedPlugin = createTSlatePlugin<MediaEmbedConfig>({\n key: KEYS.mediaEmbed,\n node: { isElement: true, isVoid: true },\n options: {\n transformUrl: parseIframeUrl,\n },\n parsers: {\n html: {\n deserializer: {\n rules: [\n {\n validNodeName: 'IFRAME',\n },\n ],\n parse: ({ element, type }) => {\n const url = element.getAttribute('src');\n\n if (url) {\n return {\n type,\n url,\n };\n }\n },\n },\n },\n },\n});\n","import type { EmbedUrlData } from '../media/parseMediaUrl';\n\nconst twitterRegex =\n /^https?:\\/\\/(?:twitter|x)\\.com\\/(?:#!\\/)?(\\w+)\\/status(es)?\\/(\\d+)/;\n\nconst TWITTER_ID_INDEX = 3;\n\nexport const parseTwitterUrl = (url: string): EmbedUrlData | undefined => {\n const match = twitterRegex.exec(url);\n\n if (match) {\n return {\n id: match[TWITTER_ID_INDEX],\n provider: 'twitter',\n url,\n };\n }\n};\n","import videoParser from 'js-video-url-parser';\nimport { isUrl } from 'platejs';\n\nimport type { EmbedUrlData } from '../media';\n\nconst YOUTUBE_PREFIX = 'https://www.youtube.com/embed/';\nconst VIMEO_PREFIX = 'https://player.vimeo.com/video/';\nconst DAILYMOTION_PREFIX = 'https://www.dailymotion.com/embed/video/';\nconst YOUKU_PREFIX = 'https://player.youku.com/embed/';\nconst COUB_PREFIX = 'https://coub.com/embed/';\n\nexport const VIDEO_PROVIDERS = [\n 'youtube',\n 'vimeo',\n 'dailymotion',\n 'youku',\n 'coub',\n];\n\nexport const parseVideoUrl = (url: string): EmbedUrlData | undefined => {\n if (!isUrl(url)) return;\n\n const videoData = videoParser.parse(url);\n\n if (videoData?.provider && videoData.id) {\n const { id, provider } = videoData;\n\n const providerUrls: Record<string, string> = {\n coub: `${COUB_PREFIX}${id}`,\n dailymotion: `${DAILYMOTION_PREFIX}${id}`,\n vimeo: `${VIMEO_PREFIX}${id}`,\n youku: `${YOUKU_PREFIX}${id}`,\n youtube: `${YOUTUBE_PREFIX}${id}`,\n };\n\n return {\n id,\n provider,\n url: providerUrls[provider],\n };\n }\n};\n","import type {\n InsertNodesOptions,\n SlateEditor,\n TMediaEmbedElement,\n} from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const insertMediaEmbed = (\n editor: SlateEditor,\n { url = '' }: Partial<TMediaEmbedElement>,\n options: InsertNodesOptions = {}\n): void => {\n if (!editor.selection) return;\n\n const selectionParentEntry = editor.api.parent(editor.selection);\n\n if (!selectionParentEntry) return;\n\n const [, path] = selectionParentEntry;\n editor.tf.insertNodes<TMediaEmbedElement>(\n {\n children: [{ text: '' }],\n type: editor.getType(KEYS.mediaEmbed),\n url,\n },\n {\n at: path,\n nextBlock: true,\n ...(options as any),\n }\n );\n};\n","import type {\n InsertNodesOptions,\n SlateEditor,\n TPlaceholderElement,\n} from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const insertPlaceholder = (\n editor: SlateEditor,\n mediaType: string,\n options?: InsertNodesOptions\n) => {\n editor.tf.withoutNormalizing(() =>\n editor.tf.insertNodes<TPlaceholderElement>(\n {\n children: [{ text: '' }],\n mediaType,\n type: editor.getType(KEYS.placeholder),\n },\n options as any\n )\n );\n};\n\nexport const insertImagePlaceholder = (\n editor: SlateEditor,\n options?: InsertNodesOptions\n) => insertPlaceholder(editor, KEYS.img, options);\n\nexport const insertVideoPlaceholder = (\n editor: SlateEditor,\n options?: InsertNodesOptions\n) => insertPlaceholder(editor, KEYS.video, options);\n\nexport const insertAudioPlaceholder = (\n editor: SlateEditor,\n options?: InsertNodesOptions\n) => insertPlaceholder(editor, KEYS.audio, options);\n\nexport const insertFilePlaceholder = (\n editor: SlateEditor,\n options?: InsertNodesOptions\n) => insertPlaceholder(editor, KEYS.file, options);\n","import type { SetNodesOptions, SlateEditor } from 'platejs';\n\ntype props = {\n type: string;\n url: string;\n id?: string;\n initialHeight?: number;\n initialWidth?: number;\n isUpload?: boolean;\n name?: string;\n placeholderId?: string;\n width?: number;\n};\n\nexport const setMediaNode = (\n editor: SlateEditor,\n props: props,\n options?: SetNodesOptions\n) => editor.tf.setNodes(props, options);\n","import {\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport {\n insertAudioPlaceholder,\n insertFilePlaceholder,\n insertImagePlaceholder,\n insertVideoPlaceholder,\n} from './transforms';\n\nexport type MediaPlaceholderOptions = {\n rules?: PlaceholderRule[];\n};\n\nexport type PlaceholderConfig = PluginConfig<\n 'placeholder',\n MediaPlaceholderOptions\n>;\n\nexport type PlaceholderRule = {\n mediaType: string;\n};\n\nexport const BasePlaceholderPlugin = createTSlatePlugin<PlaceholderConfig>({\n key: KEYS.placeholder,\n node: { isElement: true, isVoid: true },\n}).extendEditorTransforms(({ editor }) => ({\n insert: {\n audioPlaceholder: bindFirst(insertAudioPlaceholder, editor),\n filePlaceholder: bindFirst(insertFilePlaceholder, editor),\n imagePlaceholder: bindFirst(insertImagePlaceholder, editor),\n videoPlaceholder: bindFirst(insertVideoPlaceholder, editor),\n },\n}));\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@lofcz/platejs-media",
3
+ "version": "52.0.11",
4
+ "description": "Plate Media plugin",
5
+ "keywords": [
6
+ "plate",
7
+ "plugin",
8
+ "slate"
9
+ ],
10
+ "homepage": "https://platejs.org",
11
+ "bugs": {
12
+ "url": "https://github.com/udecode/plate/issues"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/lofcz/plate.git",
17
+ "directory": "packages/media"
18
+ },
19
+ "license": "MIT",
20
+ "sideEffects": false,
21
+ "exports": {
22
+ ".": "./dist/index.js",
23
+ "./react": "./dist/react/index.js",
24
+ "./package.json": "./package.json"
25
+ },
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "files": [
29
+ "dist/**/*"
30
+ ],
31
+ "dependencies": {
32
+ "js-video-url-parser": "^0.5.1",
33
+ "react-compiler-runtime": "^1.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@plate/scripts": "1.0.0"
37
+ },
38
+ "peerDependencies": {
39
+ "platejs": ">=52.0.11",
40
+ "react": ">=18.0.0",
41
+ "react-dom": ">=18.0.0"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "type": "module",
47
+ "module": "./dist/index.js",
48
+ "scripts": {
49
+ "brl": "plate-pkg p:brl",
50
+ "build": "plate-pkg p:build",
51
+ "build:watch": "plate-pkg p:build:watch",
52
+ "clean": "plate-pkg p:clean",
53
+ "lint": "plate-pkg p:lint",
54
+ "lint:fix": "plate-pkg p:lint:fix",
55
+ "test": "plate-pkg p:test",
56
+ "test:watch": "plate-pkg p:test:watch",
57
+ "typecheck": "plate-pkg p:typecheck"
58
+ }
59
+ }