@quadrats/common 0.6.7 → 0.7.0
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/blockquote/createBlockquote.d.ts +1 -1
- package/blockquote/createBlockquote.js +33 -33
- package/blockquote/index.cjs.js +32 -34
- package/bold/createBold.d.ts +2 -1
- package/bold/createBold.js +6 -4
- package/bold/index.cjs.js +6 -6
- package/divider/createDivider.d.ts +1 -1
- package/divider/createDivider.js +29 -29
- package/divider/index.cjs.js +29 -31
- package/embed/createEmbed.js +40 -40
- package/embed/deserializeEmbedElementToData.js +6 -6
- package/embed/index.cjs.js +54 -56
- package/embed/serializeEmbedCode.js +8 -8
- package/embed/strategies/facebook/index.cjs.js +45 -47
- package/embed/strategies/facebook/index.d.ts +5 -5
- package/embed/strategies/facebook/index.js +45 -45
- package/embed/strategies/instagram/index.cjs.js +29 -31
- package/embed/strategies/instagram/index.d.ts +3 -3
- package/embed/strategies/instagram/index.js +29 -29
- package/embed/strategies/podcast-apple/index.cjs.js +16 -18
- package/embed/strategies/podcast-apple/index.d.ts +4 -4
- package/embed/strategies/podcast-apple/index.js +16 -16
- package/embed/strategies/spotify/index.cjs.js +14 -16
- package/embed/strategies/spotify/index.d.ts +4 -4
- package/embed/strategies/spotify/index.js +14 -14
- package/embed/strategies/twitter/index.cjs.js +41 -43
- package/embed/strategies/twitter/index.d.ts +4 -4
- package/embed/strategies/twitter/index.js +41 -41
- package/embed/strategies/vimeo/index.cjs.js +14 -16
- package/embed/strategies/vimeo/index.d.ts +3 -3
- package/embed/strategies/vimeo/index.js +14 -14
- package/embed/strategies/youtube/index.cjs.js +14 -16
- package/embed/strategies/youtube/index.d.ts +3 -3
- package/embed/strategies/youtube/index.js +14 -14
- package/embed/typings.d.ts +1 -1
- package/file-uploader/_virtual/_tslib.js +3 -1
- package/file-uploader/createFileUploader.js +76 -76
- package/file-uploader/getFilesFromInput.js +24 -24
- package/file-uploader/index.cjs.js +102 -102
- package/file-uploader/typings.d.ts +6 -6
- package/footnote/createFootnote.d.ts +1 -1
- package/footnote/createFootnote.js +65 -65
- package/footnote/index.cjs.js +65 -67
- package/footnote/typings.d.ts +1 -1
- package/heading/constants.js +1 -1
- package/heading/createHeading.d.ts +1 -1
- package/heading/createHeading.js +45 -45
- package/heading/index.cjs.js +46 -48
- package/heading/typings.d.ts +1 -1
- package/highlight/createHighlight.d.ts +2 -1
- package/highlight/createHighlight.js +6 -4
- package/highlight/index.cjs.js +6 -6
- package/image/constants.js +4 -4
- package/image/createImage.js +195 -195
- package/image/getImageElementCommonProps.js +6 -6
- package/image/getImageFigureElementCommonProps.js +5 -5
- package/image/index.cjs.js +211 -213
- package/image/isHostingNotRequired.js +2 -2
- package/image/typings.d.ts +8 -8
- package/input-block/createInputBlock.js +37 -37
- package/input-block/index.cjs.js +37 -39
- package/input-widget/typings.d.ts +1 -1
- package/italic/createItalic.d.ts +2 -1
- package/italic/createItalic.js +6 -4
- package/italic/index.cjs.js +6 -6
- package/link/createLink.js +147 -147
- package/link/index.cjs.js +146 -148
- package/link/typings.d.ts +2 -2
- package/list/constants.js +4 -4
- package/list/createList.js +185 -185
- package/list/index.cjs.js +188 -190
- package/list/typings.d.ts +4 -4
- package/package.json +4 -4
- package/read-more/createReadMore.d.ts +1 -1
- package/read-more/createReadMore.js +51 -51
- package/read-more/index.cjs.js +50 -52
- package/strikethrough/createStrikethrough.d.ts +2 -1
- package/strikethrough/createStrikethrough.js +6 -4
- package/strikethrough/index.cjs.js +6 -6
- package/toggle-mark/createToggleMarkCreator.d.ts +4 -4
- package/toggle-mark/createToggleMarkCreator.js +36 -36
- package/toggle-mark/index.cjs.js +36 -38
- package/underline/createUnderline.d.ts +2 -1
- package/underline/createUnderline.js +6 -4
- package/underline/index.cjs.js +6 -6
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { EmbedElement, EmbedStrategy } from '@quadrats/common/embed';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type TwitterEmbedType = 'tweet';
|
|
3
|
+
export type TwitterEmbedElementData = {
|
|
4
4
|
embedType: TwitterEmbedType;
|
|
5
5
|
tweetId: string;
|
|
6
6
|
};
|
|
7
|
-
export
|
|
8
|
-
export
|
|
7
|
+
export type TwitterEmbedElement = EmbedElement & TwitterEmbedElementData;
|
|
8
|
+
export type TwitterEmbedStrategy = EmbedStrategy<TwitterEmbedElementData, string>;
|
|
9
9
|
export declare function getTwitterTweetDataFromUrl(url: string): TwitterEmbedElementData | undefined;
|
|
10
10
|
export declare function getTwitterTweetDataFromBlockquote(embedCode: string): TwitterEmbedElementData | undefined;
|
|
11
11
|
export declare const TwitterEmbedStrategy: TwitterEmbedStrategy;
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
function getTwitterTweetDataFromUrl(url) {
|
|
2
|
-
const result = /^https:\/\/twitter.com\/[\w]*\/status\/([\w-]*)/i.exec(url);
|
|
3
|
-
if (result) {
|
|
4
|
-
const [, tweetId] = result;
|
|
5
|
-
return {
|
|
6
|
-
embedType: 'tweet',
|
|
7
|
-
tweetId,
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
function getTwitterTweetDataFromBlockquote(embedCode) {
|
|
12
|
-
const template = document.createElement('template');
|
|
13
|
-
template.innerHTML = embedCode;
|
|
14
|
-
const { firstChild } = template.content;
|
|
15
|
-
if (!firstChild || firstChild.nodeName !== 'BLOCKQUOTE') {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const blockquote = firstChild;
|
|
19
|
-
const link = blockquote.lastChild;
|
|
20
|
-
const url = link === null || link === void 0 ? void 0 : link.getAttribute('href');
|
|
21
|
-
return url ? getTwitterTweetDataFromUrl(url) : undefined;
|
|
22
|
-
}
|
|
23
|
-
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
24
|
-
const TwitterEmbedStrategy = {
|
|
25
|
-
serialize: (embedCode) => {
|
|
26
|
-
const getter = embedCode.startsWith('<blockquote') ? getTwitterTweetDataFromBlockquote : getTwitterTweetDataFromUrl;
|
|
27
|
-
return getter(embedCode);
|
|
28
|
-
},
|
|
29
|
-
deserialize: (data) => {
|
|
30
|
-
if (data.embedType === 'tweet') {
|
|
31
|
-
return data.tweetId;
|
|
32
|
-
}
|
|
33
|
-
return '';
|
|
34
|
-
},
|
|
35
|
-
isElementDataValid: (data) => {
|
|
36
|
-
if (data.embedType === 'tweet') {
|
|
37
|
-
const { tweetId } = data;
|
|
38
|
-
return typeof tweetId === 'string' && !!tweetId;
|
|
39
|
-
}
|
|
40
|
-
return true;
|
|
41
|
-
},
|
|
1
|
+
function getTwitterTweetDataFromUrl(url) {
|
|
2
|
+
const result = /^https:\/\/twitter.com\/[\w]*\/status\/([\w-]*)/i.exec(url);
|
|
3
|
+
if (result) {
|
|
4
|
+
const [, tweetId] = result;
|
|
5
|
+
return {
|
|
6
|
+
embedType: 'tweet',
|
|
7
|
+
tweetId,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function getTwitterTweetDataFromBlockquote(embedCode) {
|
|
12
|
+
const template = document.createElement('template');
|
|
13
|
+
template.innerHTML = embedCode;
|
|
14
|
+
const { firstChild } = template.content;
|
|
15
|
+
if (!firstChild || firstChild.nodeName !== 'BLOCKQUOTE') {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const blockquote = firstChild;
|
|
19
|
+
const link = blockquote.lastChild;
|
|
20
|
+
const url = link === null || link === void 0 ? void 0 : link.getAttribute('href');
|
|
21
|
+
return url ? getTwitterTweetDataFromUrl(url) : undefined;
|
|
22
|
+
}
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
24
|
+
const TwitterEmbedStrategy = {
|
|
25
|
+
serialize: (embedCode) => {
|
|
26
|
+
const getter = embedCode.startsWith('<blockquote') ? getTwitterTweetDataFromBlockquote : getTwitterTweetDataFromUrl;
|
|
27
|
+
return getter(embedCode);
|
|
28
|
+
},
|
|
29
|
+
deserialize: (data) => {
|
|
30
|
+
if (data.embedType === 'tweet') {
|
|
31
|
+
return data.tweetId;
|
|
32
|
+
}
|
|
33
|
+
return '';
|
|
34
|
+
},
|
|
35
|
+
isElementDataValid: (data) => {
|
|
36
|
+
if (data.embedType === 'tweet') {
|
|
37
|
+
const { tweetId } = data;
|
|
38
|
+
return typeof tweetId === 'string' && !!tweetId;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
},
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
export { TwitterEmbedStrategy, getTwitterTweetDataFromBlockquote, getTwitterTweetDataFromUrl };
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
deserialize: ({ videoId }) => `https://player.vimeo.com/video/${videoId}`,
|
|
18
|
-
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
4
|
+
const VimeoEmbedStrategy = {
|
|
5
|
+
serialize: (embedCode) => {
|
|
6
|
+
var _a;
|
|
7
|
+
const videoId = (_a = (/^https:\/\/vimeo.com\/([\w-]*)/i.exec(embedCode)
|
|
8
|
+
|| /^https:\/\/player.vimeo.com\/video\/([\w-]*)/i.exec(embedCode))) === null || _a === void 0 ? void 0 : _a[1];
|
|
9
|
+
if (videoId) {
|
|
10
|
+
return {
|
|
11
|
+
videoId,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
deserialize: ({ videoId }) => `https://player.vimeo.com/video/${videoId}`,
|
|
16
|
+
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
19
17
|
};
|
|
20
18
|
|
|
21
19
|
exports.VimeoEmbedStrategy = VimeoEmbedStrategy;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EmbedElement, EmbedStrategy } from '@quadrats/common/embed';
|
|
2
|
-
export
|
|
2
|
+
export type VimeoEmbedElementData = {
|
|
3
3
|
videoId: string;
|
|
4
4
|
};
|
|
5
|
-
export
|
|
6
|
-
export
|
|
5
|
+
export type VimeoEmbedElement = EmbedElement & VimeoEmbedElementData;
|
|
6
|
+
export type VimeoEmbedStrategy = EmbedStrategy<VimeoEmbedElementData, string>;
|
|
7
7
|
export declare const VimeoEmbedStrategy: VimeoEmbedStrategy;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
2
|
-
const VimeoEmbedStrategy = {
|
|
3
|
-
serialize: (embedCode) => {
|
|
4
|
-
var _a;
|
|
5
|
-
const videoId = (_a = (/^https:\/\/vimeo.com\/([\w-]*)/i.exec(embedCode)
|
|
6
|
-
|| /^https:\/\/player.vimeo.com\/video\/([\w-]*)/i.exec(embedCode))) === null || _a === void 0 ? void 0 : _a[1];
|
|
7
|
-
if (videoId) {
|
|
8
|
-
return {
|
|
9
|
-
videoId,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
deserialize: ({ videoId }) => `https://player.vimeo.com/video/${videoId}`,
|
|
14
|
-
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
2
|
+
const VimeoEmbedStrategy = {
|
|
3
|
+
serialize: (embedCode) => {
|
|
4
|
+
var _a;
|
|
5
|
+
const videoId = (_a = (/^https:\/\/vimeo.com\/([\w-]*)/i.exec(embedCode)
|
|
6
|
+
|| /^https:\/\/player.vimeo.com\/video\/([\w-]*)/i.exec(embedCode))) === null || _a === void 0 ? void 0 : _a[1];
|
|
7
|
+
if (videoId) {
|
|
8
|
+
return {
|
|
9
|
+
videoId,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
deserialize: ({ videoId }) => `https://player.vimeo.com/video/${videoId}`,
|
|
14
|
+
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export { VimeoEmbedStrategy };
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
deserialize: ({ videoId }) => `https://www.youtube.com/embed/${videoId}`,
|
|
18
|
-
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
4
|
+
const YoutubeEmbedStrategy = {
|
|
5
|
+
serialize: (embedCode) => {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
const videoIdByShort = (_a = /^https:\/\/youtu.be\/([\w-]*)/.exec(embedCode)) === null || _a === void 0 ? void 0 : _a[1];
|
|
8
|
+
const videoId = videoIdByShort !== null && videoIdByShort !== void 0 ? videoIdByShort : (_b = /^https:\/\/www.youtube.com\/(watch\?v=|embed\/)([\w-]*)/i.exec(embedCode)) === null || _b === void 0 ? void 0 : _b[2];
|
|
9
|
+
if (videoId) {
|
|
10
|
+
return {
|
|
11
|
+
videoId,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
deserialize: ({ videoId }) => `https://www.youtube.com/embed/${videoId}`,
|
|
16
|
+
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
19
17
|
};
|
|
20
18
|
|
|
21
19
|
exports.YoutubeEmbedStrategy = YoutubeEmbedStrategy;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EmbedElement, EmbedStrategy } from '@quadrats/common/embed';
|
|
2
|
-
export
|
|
2
|
+
export type YoutubeEmbedElementData = {
|
|
3
3
|
videoId: string;
|
|
4
4
|
};
|
|
5
|
-
export
|
|
6
|
-
export
|
|
5
|
+
export type YoutubeEmbedElement = EmbedElement & YoutubeEmbedElementData;
|
|
6
|
+
export type YoutubeEmbedStrategy = EmbedStrategy<YoutubeEmbedElementData, string>;
|
|
7
7
|
export declare const YoutubeEmbedStrategy: YoutubeEmbedStrategy;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
2
|
-
const YoutubeEmbedStrategy = {
|
|
3
|
-
serialize: (embedCode) => {
|
|
4
|
-
var _a, _b;
|
|
5
|
-
const videoIdByShort = (_a = /^https:\/\/youtu.be\/([\w-]*)/.exec(embedCode)) === null || _a === void 0 ? void 0 : _a[1];
|
|
6
|
-
const videoId = videoIdByShort !== null && videoIdByShort !== void 0 ? videoIdByShort : (_b = /^https:\/\/www.youtube.com\/(watch\?v=|embed\/)([\w-]*)/i.exec(embedCode)) === null || _b === void 0 ? void 0 : _b[2];
|
|
7
|
-
if (videoId) {
|
|
8
|
-
return {
|
|
9
|
-
videoId,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
deserialize: ({ videoId }) => `https://www.youtube.com/embed/${videoId}`,
|
|
14
|
-
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
2
|
+
const YoutubeEmbedStrategy = {
|
|
3
|
+
serialize: (embedCode) => {
|
|
4
|
+
var _a, _b;
|
|
5
|
+
const videoIdByShort = (_a = /^https:\/\/youtu.be\/([\w-]*)/.exec(embedCode)) === null || _a === void 0 ? void 0 : _a[1];
|
|
6
|
+
const videoId = videoIdByShort !== null && videoIdByShort !== void 0 ? videoIdByShort : (_b = /^https:\/\/www.youtube.com\/(watch\?v=|embed\/)([\w-]*)/i.exec(embedCode)) === null || _b === void 0 ? void 0 : _b[2];
|
|
7
|
+
if (videoId) {
|
|
8
|
+
return {
|
|
9
|
+
videoId,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
deserialize: ({ videoId }) => `https://www.youtube.com/embed/${videoId}`,
|
|
14
|
+
isElementDataValid: ({ videoId }) => typeof videoId === 'string' && !!videoId,
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export { YoutubeEmbedStrategy };
|
package/embed/typings.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface EmbedStrategy<EmbedData extends Record<string, unknown>, Render
|
|
|
19
19
|
readonly deserialize: (element: EmbedElement & EmbedData) => RenderData;
|
|
20
20
|
readonly isElementDataValid: (data: Record<keyof EmbedData, unknown>) => boolean;
|
|
21
21
|
}
|
|
22
|
-
export
|
|
22
|
+
export type EmbedStrategies<Provider extends string> = Record<Provider, EmbedStrategy<any, any>>;
|
|
23
23
|
export interface Embed<P extends string, T extends Editor = Editor> extends WithElementType, Withable {
|
|
24
24
|
strategies: EmbedStrategies<P>;
|
|
25
25
|
insertEmbed(editor: T, providers: P[], embedCode: string, defaultNode?: Node | string): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/******************************************************************************
|
|
2
2
|
Copyright (c) Microsoft Corporation.
|
|
3
3
|
|
|
4
4
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
@@ -12,6 +12,8 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
12
12
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
13
13
|
PERFORMANCE OF THIS SOFTWARE.
|
|
14
14
|
***************************************************************************** */
|
|
15
|
+
/* global Reflect, Promise */
|
|
16
|
+
|
|
15
17
|
|
|
16
18
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
17
19
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -1,84 +1,84 @@
|
|
|
1
1
|
import { __awaiter } from './_virtual/_tslib.js';
|
|
2
2
|
import { readFileAsDataURL } from '@quadrats/utils';
|
|
3
|
-
import { Transforms, createParagraphElement
|
|
3
|
+
import { HistoryEditor, Transforms, createParagraphElement } from '@quadrats/core';
|
|
4
4
|
import { FILE_UPLOADER_TYPE } from './constants.js';
|
|
5
5
|
import { getFilesFromInput } from './getFilesFromInput.js';
|
|
6
6
|
|
|
7
|
-
function createFileUploader(options = {}) {
|
|
8
|
-
const { type = FILE_UPLOADER_TYPE } = options;
|
|
9
|
-
const createFileUploaderElement = (editor, file, options) => __awaiter(this, void 0, void 0, function* () {
|
|
10
|
-
const { createElement, getBody, getHeaders, getUrl, uploader, } = options;
|
|
11
|
-
const [mime] = file.type.split('/');
|
|
12
|
-
const createByMime = createElement[mime];
|
|
13
|
-
if (!createByMime) {
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
const { dataURL: createElementByDataURL, response: createElementByResponse } = createByMime;
|
|
17
|
-
const headers = yield (getHeaders === null || getHeaders === void 0 ? void 0 : getHeaders(file));
|
|
18
|
-
const xhr = uploader || new XMLHttpRequest();
|
|
19
|
-
const dataURL = yield readFileAsDataURL(file);
|
|
20
|
-
let sent = false;
|
|
21
|
-
const fileUploaderElement = {
|
|
22
|
-
type,
|
|
23
|
-
register: (getPath, onProgress) => {
|
|
24
|
-
xhr.onload = () => {
|
|
25
|
-
if (xhr.status < 400) {
|
|
26
|
-
const path = getPath();
|
|
27
|
-
if (path) {
|
|
28
|
-
HistoryEditor.withoutSaving(editor, () => {
|
|
29
|
-
Transforms.removeNodes(editor, { at: path });
|
|
30
|
-
Transforms.insertNodes(editor, createElementByResponse(xhr.response), { at: path });
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
throw xhr.response;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
xhr.upload.onprogress = ({ loaded, total }) => onProgress((loaded * 100) / total);
|
|
39
|
-
if (!sent) {
|
|
40
|
-
sent = true;
|
|
41
|
-
xhr.send(getBody(file));
|
|
42
|
-
}
|
|
43
|
-
return () => {
|
|
44
|
-
xhr.onload = null;
|
|
45
|
-
xhr.upload.onprogress = null;
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
children: [createElementByDataURL(dataURL)],
|
|
49
|
-
};
|
|
50
|
-
xhr.open('POST', getUrl(file));
|
|
51
|
-
if (headers) {
|
|
52
|
-
for (const headerName in headers) {
|
|
53
|
-
xhr.setRequestHeader(headerName, headers[headerName]);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return fileUploaderElement;
|
|
57
|
-
});
|
|
58
|
-
const upload = (editor, options) => __awaiter(this, void 0, void 0, function* () {
|
|
59
|
-
const { accept, multiple } = options;
|
|
60
|
-
const files = yield getFilesFromInput({ accept, multiple });
|
|
61
|
-
if (!files) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
files.reduce((prev, file) => __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
yield prev;
|
|
66
|
-
return createFileUploaderElement(editor, file, options).then((fileUploaderElement) => {
|
|
67
|
-
if (fileUploaderElement) {
|
|
68
|
-
Transforms.insertNodes(editor, [fileUploaderElement, createParagraphElement()], options);
|
|
69
|
-
Transforms.move(editor);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}), Promise.resolve());
|
|
73
|
-
});
|
|
74
|
-
return {
|
|
75
|
-
type,
|
|
76
|
-
createFileUploaderElement,
|
|
77
|
-
upload,
|
|
78
|
-
with(editor) {
|
|
79
|
-
return editor;
|
|
80
|
-
},
|
|
81
|
-
};
|
|
7
|
+
function createFileUploader(options = {}) {
|
|
8
|
+
const { type = FILE_UPLOADER_TYPE } = options;
|
|
9
|
+
const createFileUploaderElement = (editor, file, options) => __awaiter(this, void 0, void 0, function* () {
|
|
10
|
+
const { createElement, getBody, getHeaders, getUrl, uploader, } = options;
|
|
11
|
+
const [mime] = file.type.split('/');
|
|
12
|
+
const createByMime = createElement[mime];
|
|
13
|
+
if (!createByMime) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const { dataURL: createElementByDataURL, response: createElementByResponse } = createByMime;
|
|
17
|
+
const headers = yield (getHeaders === null || getHeaders === void 0 ? void 0 : getHeaders(file));
|
|
18
|
+
const xhr = uploader || new XMLHttpRequest();
|
|
19
|
+
const dataURL = yield readFileAsDataURL(file);
|
|
20
|
+
let sent = false;
|
|
21
|
+
const fileUploaderElement = {
|
|
22
|
+
type,
|
|
23
|
+
register: (getPath, onProgress) => {
|
|
24
|
+
xhr.onload = () => {
|
|
25
|
+
if (xhr.status < 400) {
|
|
26
|
+
const path = getPath();
|
|
27
|
+
if (path) {
|
|
28
|
+
HistoryEditor.withoutSaving(editor, () => {
|
|
29
|
+
Transforms.removeNodes(editor, { at: path });
|
|
30
|
+
Transforms.insertNodes(editor, createElementByResponse(xhr.response), { at: path });
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
throw xhr.response;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
xhr.upload.onprogress = ({ loaded, total }) => onProgress((loaded * 100) / total);
|
|
39
|
+
if (!sent) {
|
|
40
|
+
sent = true;
|
|
41
|
+
xhr.send(getBody(file));
|
|
42
|
+
}
|
|
43
|
+
return () => {
|
|
44
|
+
xhr.onload = null;
|
|
45
|
+
xhr.upload.onprogress = null;
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
children: [createElementByDataURL(dataURL)],
|
|
49
|
+
};
|
|
50
|
+
xhr.open('POST', getUrl(file));
|
|
51
|
+
if (headers) {
|
|
52
|
+
for (const headerName in headers) {
|
|
53
|
+
xhr.setRequestHeader(headerName, headers[headerName]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return fileUploaderElement;
|
|
57
|
+
});
|
|
58
|
+
const upload = (editor, options) => __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
const { accept, multiple } = options;
|
|
60
|
+
const files = yield getFilesFromInput({ accept, multiple });
|
|
61
|
+
if (!files) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
files.reduce((prev, file) => __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
yield prev;
|
|
66
|
+
return createFileUploaderElement(editor, file, options).then((fileUploaderElement) => {
|
|
67
|
+
if (fileUploaderElement) {
|
|
68
|
+
Transforms.insertNodes(editor, [fileUploaderElement, createParagraphElement()], options);
|
|
69
|
+
Transforms.move(editor);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}), Promise.resolve());
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
type,
|
|
76
|
+
createFileUploaderElement,
|
|
77
|
+
upload,
|
|
78
|
+
with(editor) {
|
|
79
|
+
return editor;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
export { createFileUploader };
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
function getFilesFromInput(options = {}) {
|
|
2
|
-
const { accept, multiple } = options;
|
|
3
|
-
return new Promise((resolve) => {
|
|
4
|
-
const inputEl = document.createElement('input');
|
|
5
|
-
if (accept) {
|
|
6
|
-
inputEl.accept = accept.join(',');
|
|
7
|
-
}
|
|
8
|
-
inputEl.multiple = !!multiple;
|
|
9
|
-
inputEl.type = 'file';
|
|
10
|
-
inputEl.addEventListener('change', () => {
|
|
11
|
-
const { files: fileList } = inputEl;
|
|
12
|
-
if (!fileList || !fileList.length) {
|
|
13
|
-
resolve(undefined);
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
const files = [];
|
|
17
|
-
for (const file of fileList) {
|
|
18
|
-
files.push(file);
|
|
19
|
-
}
|
|
20
|
-
resolve(files);
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
inputEl.click();
|
|
24
|
-
});
|
|
1
|
+
function getFilesFromInput(options = {}) {
|
|
2
|
+
const { accept, multiple } = options;
|
|
3
|
+
return new Promise((resolve) => {
|
|
4
|
+
const inputEl = document.createElement('input');
|
|
5
|
+
if (accept) {
|
|
6
|
+
inputEl.accept = accept.join(',');
|
|
7
|
+
}
|
|
8
|
+
inputEl.multiple = !!multiple;
|
|
9
|
+
inputEl.type = 'file';
|
|
10
|
+
inputEl.addEventListener('change', () => {
|
|
11
|
+
const { files: fileList } = inputEl;
|
|
12
|
+
if (!fileList || !fileList.length) {
|
|
13
|
+
resolve(undefined);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
const files = [];
|
|
17
|
+
for (const file of fileList) {
|
|
18
|
+
files.push(file);
|
|
19
|
+
}
|
|
20
|
+
resolve(files);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
inputEl.click();
|
|
24
|
+
});
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export { getFilesFromInput };
|