@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.
- package/LICENSE +24 -0
- package/README.md +21 -0
- package/dist/index-ByCDhWKM.d.ts +138 -0
- package/dist/index-ByCDhWKM.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/react/index.d.ts +4007 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +5095 -0
- package/dist/react/index.js.map +1 -0
- package/dist/src-C-5lYedg.js +417 -0
- package/dist/src-C-5lYedg.js.map +1 -0
- package/package.json +59 -0
|
@@ -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
|
+
}
|