roosterjs-content-model-dom 9.54.0 → 9.55.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/lib/domUtils/event/extractClipboardItems.d.ts +1 -1
- package/lib/domUtils/event/extractClipboardItems.js +2 -2
- package/lib/domUtils/event/extractClipboardItems.js.map +1 -1
- package/lib/domUtils/selection/pruneUnselectedModel.js +8 -5
- package/lib/domUtils/selection/pruneUnselectedModel.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +3 -2
- package/lib/index.js.map +1 -1
- package/lib/modelApi/common/normalizeSegment.js +33 -2
- package/lib/modelApi/common/normalizeSegment.js.map +1 -1
- package/lib/modelApi/editing/cloneModel.d.ts +6 -0
- package/lib/modelApi/editing/cloneModel.js +13 -1
- package/lib/modelApi/editing/cloneModel.js.map +1 -1
- package/lib-amd/domUtils/event/extractClipboardItems.d.ts +1 -1
- package/lib-amd/domUtils/event/extractClipboardItems.js +2 -2
- package/lib-amd/domUtils/event/extractClipboardItems.js.map +1 -1
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js +8 -5
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js.map +1 -1
- package/lib-amd/index.d.ts +1 -1
- package/lib-amd/index.js +2 -1
- package/lib-amd/index.js.map +1 -1
- package/lib-amd/modelApi/common/normalizeSegment.js +33 -2
- package/lib-amd/modelApi/common/normalizeSegment.js.map +1 -1
- package/lib-amd/modelApi/editing/cloneModel.d.ts +6 -0
- package/lib-amd/modelApi/editing/cloneModel.js +13 -1
- package/lib-amd/modelApi/editing/cloneModel.js.map +1 -1
- package/lib-mjs/domUtils/event/extractClipboardItems.d.ts +1 -1
- package/lib-mjs/domUtils/event/extractClipboardItems.js +2 -2
- package/lib-mjs/domUtils/event/extractClipboardItems.js.map +1 -1
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js +8 -5
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js.map +1 -1
- package/lib-mjs/index.d.ts +1 -1
- package/lib-mjs/index.js +1 -1
- package/lib-mjs/index.js.map +1 -1
- package/lib-mjs/modelApi/common/normalizeSegment.js +33 -2
- package/lib-mjs/modelApi/common/normalizeSegment.js.map +1 -1
- package/lib-mjs/modelApi/editing/cloneModel.d.ts +6 -0
- package/lib-mjs/modelApi/editing/cloneModel.js +11 -0
- package/lib-mjs/modelApi/editing/cloneModel.js.map +1 -1
- package/package.json +2 -2
|
@@ -5,4 +5,4 @@ import type { ClipboardData } from 'roosterjs-content-model-types';
|
|
|
5
5
|
* @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images
|
|
6
6
|
Only text types are supported, and do not add "text/" prefix to the type values
|
|
7
7
|
*/
|
|
8
|
-
export declare function extractClipboardItems(items: DataTransferItem[], allowedCustomPasteType?: string[]): Promise<ClipboardData>;
|
|
8
|
+
export declare function extractClipboardItems(items: DataTransferItem[], allowedCustomPasteType?: string[], isPasteNative?: boolean): Promise<ClipboardData>;
|
|
@@ -16,7 +16,7 @@ var ContentHandlers = (_a = {},
|
|
|
16
16
|
* @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images
|
|
17
17
|
Only text types are supported, and do not add "text/" prefix to the type values
|
|
18
18
|
*/
|
|
19
|
-
function extractClipboardItems(items, allowedCustomPasteType) {
|
|
19
|
+
function extractClipboardItems(items, allowedCustomPasteType, isPasteNative) {
|
|
20
20
|
var data = {
|
|
21
21
|
types: [],
|
|
22
22
|
text: '',
|
|
@@ -24,7 +24,7 @@ function extractClipboardItems(items, allowedCustomPasteType) {
|
|
|
24
24
|
files: [],
|
|
25
25
|
rawHtml: null,
|
|
26
26
|
customValues: {},
|
|
27
|
-
pasteNativeEvent:
|
|
27
|
+
pasteNativeEvent: !!isPasteNative,
|
|
28
28
|
};
|
|
29
29
|
return Promise.all((items || []).map(function (item) {
|
|
30
30
|
var type = item.type;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractClipboardItems.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts"],"names":[],"mappings":";;;;AAAA,wCAAuC;AAGvC,IAAM,eAAe;IAGjB,GAAC,WAAW,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,EAAtB,CAAsB;IACtD,GAAC,YAAY,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;IACpD,GAAC,QAAQ,IAAG,UAAC,IAAI,EAAE,KAAK,EAAE,IAAK,IAAK,OAAA,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,EAA3C,CAA2C;IAC/E,GAAC,mBAAmB,IAAG,mBAAmB;IAC1C,GAAC,eAAe,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;OAC1D,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,qBAAqB,CACjC,KAAyB,EACzB,sBAAiC;
|
|
1
|
+
{"version":3,"file":"extractClipboardItems.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts"],"names":[],"mappings":";;;;AAAA,wCAAuC;AAGvC,IAAM,eAAe;IAGjB,GAAC,WAAW,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,EAAtB,CAAsB;IACtD,GAAC,YAAY,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;IACpD,GAAC,QAAQ,IAAG,UAAC,IAAI,EAAE,KAAK,EAAE,IAAK,IAAK,OAAA,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,EAA3C,CAA2C;IAC/E,GAAC,mBAAmB,IAAG,mBAAmB;IAC1C,GAAC,eAAe,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;OAC1D,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,qBAAqB,CACjC,KAAyB,EACzB,sBAAiC,EACjC,aAAuB;IAEvB,IAAM,IAAI,GAAkB;QACxB,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,CAAC,CAAC,aAAa;KACpC,CAAC;IAEF,OAAO,OAAO,CAAC,GAAG,CACd,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAA,IAAI;QAClB,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;YACnE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,OAAO,IAAI,OAAO,CAAO,UAAA,OAAO;gBAC5B,IAAI,IAAI,CAAC,KAAK,EAAE;oBACZ,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,UAAA,OAAO;wBACxB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;wBAC5B,OAAO,EAAE,CAAC;oBACd,CAAC,CAAC,CAAC;iBACN;qBAAM;oBACH,OAAO,EAAE,CAAC;iBACb;YACL,CAAC,CAAC,CAAC;SACN;aAAM,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;YAC5B,OAAO,IAAI,OAAO,CAAO,UAAA,OAAO;gBAC5B,IAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,CAAC,IAAI,EAAE;oBACR,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,IAAI,CAAC,KAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC1B;gBACD,OAAO,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;SACN;aAAM;YACH,IAAM,YAAU,GAAG,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;YACtE,IAAM,SAAO,GACT,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAU,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7E,OAAO,IAAI,OAAO,CAAO,UAAA,OAAO;gBAC5B,OAAA,SAAO;oBACH,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAA,KAAK;wBAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtB,SAAO,CAAC,IAAI,EAAE,KAAK,EAAE,YAAU,CAAC,CAAC;wBACjC,OAAO,EAAE,CAAC;oBACd,CAAC,CAAC;oBACJ,CAAC,CAAC,OAAO,EAAE;YANf,CAMe,CAClB,CAAC;SACL;IACL,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC,CAAC;AACvB,CAAC;AAzDD,sDAyDC;AAED,SAAS,mBAAmB,CAAC,IAAmB,EAAE,KAAa;IAC3D,IAAI;QACA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAoB,CAAC;KAC3D;IAAC,WAAM,GAAE;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,sBAAiC;IACzE,IAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,IAAM,KAAK,GACP,sBAAsB,IAAI,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC","sourcesContent":["import { readFile } from '../readFile';\nimport type { ClipboardData, EdgeLinkPreview } from 'roosterjs-content-model-types';\n\nconst ContentHandlers: {\n [contentType: string]: (data: ClipboardData, value: string, type?: string) => void;\n} = {\n ['text/html']: (data, value) => (data.rawHtml = value),\n ['text/plain']: (data, value) => (data.text = value),\n ['text/*']: (data, value, type?) => !!type && (data.customValues[type] = value),\n ['text/link-preview']: tryParseLinkPreview,\n ['text/uri-list']: (data, value) => (data.text = value),\n};\n\n/**\n * Extract clipboard items to be a ClipboardData object for IE\n * @param items The clipboard items retrieve from a DataTransfer object\n * @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images\n Only text types are supported, and do not add \"text/\" prefix to the type values\n */\nexport function extractClipboardItems(\n items: DataTransferItem[],\n allowedCustomPasteType?: string[],\n isPasteNative?: boolean\n): Promise<ClipboardData> {\n const data: ClipboardData = {\n types: [],\n text: '',\n image: null,\n files: [],\n rawHtml: null,\n customValues: {},\n pasteNativeEvent: !!isPasteNative,\n };\n\n return Promise.all(\n (items || []).map(item => {\n const type = item.type;\n\n if (type.indexOf('image/') == 0 && !data.image && item.kind == 'file') {\n data.types.push(type);\n data.image = item.getAsFile();\n return new Promise<void>(resolve => {\n if (data.image) {\n readFile(data.image, dataUrl => {\n data.imageDataUri = dataUrl;\n resolve();\n });\n } else {\n resolve();\n }\n });\n } else if (item.kind == 'file') {\n return new Promise<void>(resolve => {\n const file = item.getAsFile();\n if (!!file) {\n data.types.push(type);\n data.files!.push(file);\n }\n resolve();\n });\n } else {\n const customType = getAllowedCustomType(type, allowedCustomPasteType);\n const handler =\n ContentHandlers[type] || (customType ? ContentHandlers['text/*'] : null);\n return new Promise<void>(resolve =>\n handler\n ? item.getAsString(value => {\n data.types.push(type);\n handler(data, value, customType);\n resolve();\n })\n : resolve()\n );\n }\n })\n ).then(() => data);\n}\n\nfunction tryParseLinkPreview(data: ClipboardData, value: string) {\n try {\n data.customValues['link-preview'] = value;\n data.linkPreview = JSON.parse(value) as EdgeLinkPreview;\n } catch {}\n}\n\nfunction getAllowedCustomType(type: string, allowedCustomPasteType?: string[]) {\n const textType = type.indexOf('text/') == 0 ? type.substring('text/'.length) : null;\n const index =\n allowedCustomPasteType && textType ? allowedCustomPasteType.indexOf(textType) : -1;\n return textType && index >= 0 ? textType : undefined;\n}\n"]}
|
|
@@ -12,6 +12,7 @@ function pruneUnselectedModel(model) {
|
|
|
12
12
|
exports.pruneUnselectedModel = pruneUnselectedModel;
|
|
13
13
|
function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
|
|
14
14
|
var e_1, _a, _b;
|
|
15
|
+
var _c;
|
|
15
16
|
for (var index = model.blocks.length - 1; index >= 0; index--) {
|
|
16
17
|
var block = model.blocks[index];
|
|
17
18
|
switch (block.blockType) {
|
|
@@ -35,15 +36,17 @@ function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
|
|
|
35
36
|
case 'Paragraph':
|
|
36
37
|
var newSegments = [];
|
|
37
38
|
try {
|
|
38
|
-
for (var
|
|
39
|
-
var segment =
|
|
39
|
+
for (var _d = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
40
|
+
var segment = _e.value;
|
|
41
|
+
var isSelectedOrUndeletable = segment.isSelected || ((_c = segment.link) === null || _c === void 0 ? void 0 : _c.format.undeletable);
|
|
40
42
|
if (segment.segmentType == 'General') {
|
|
41
43
|
pruneUnselectedModel(segment);
|
|
42
|
-
if (segment.blocks.length > 0 ||
|
|
44
|
+
if (segment.blocks.length > 0 || isSelectedOrUndeletable) {
|
|
43
45
|
newSegments.push(segment);
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
|
-
else if (
|
|
48
|
+
else if (isSelectedOrUndeletable &&
|
|
49
|
+
segment.segmentType != 'SelectionMarker') {
|
|
47
50
|
newSegments.push(segment);
|
|
48
51
|
}
|
|
49
52
|
}
|
|
@@ -51,7 +54,7 @@ function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
|
|
|
51
54
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
52
55
|
finally {
|
|
53
56
|
try {
|
|
54
|
-
if (
|
|
57
|
+
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
55
58
|
}
|
|
56
59
|
finally { if (e_1) throw e_1.error; }
|
|
57
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pruneUnselectedModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/pruneUnselectedModel.ts"],"names":[],"mappings":";;;;AASA;;GAEG;AACH,SAAgB,oBAAoB,CAChC,KAA0E;IAE1E,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAEzE,MAAM,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC;AAND,oDAMC;AAED,SAAS,4BAA4B,CACjC,KAA0E,EAC1E,uBAAgC
|
|
1
|
+
{"version":3,"file":"pruneUnselectedModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/pruneUnselectedModel.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlockGroupBase,\n ContentModelBlockGroupType,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelTableCell,\n ContentModelTableRow,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function pruneUnselectedModel(\n model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>\n) {\n pruneUnselectedModelInternal(model, false /* isSelectionAfterElement */);\n\n unwrap(model);\n}\n\nfunction pruneUnselectedModelInternal(\n model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>,\n isSelectionAfterElement: boolean\n) {\n for (let index = model.blocks.length - 1; index >= 0; index--) {\n const block = model.blocks[index];\n\n switch (block.blockType) {\n case 'BlockGroup':\n pruneUnselectedModelInternal(block, isSelectionAfterElement);\n if (\n block.blockGroupType == 'General'\n ? block.blocks.length == 0 && !block.isSelected\n : block.blocks.length == 0\n ) {\n model.blocks.splice(index, 1);\n }\n break;\n case 'Divider':\n case 'Entity':\n if (!block.isSelected) {\n model.blocks.splice(index, 1);\n } else {\n isSelectionAfterElement = true;\n }\n break;\n case 'Paragraph':\n const newSegments: ContentModelSegment[] = [];\n for (const segment of block.segments) {\n const isSelectedOrUndeletable =\n segment.isSelected || segment.link?.format.undeletable;\n\n if (segment.segmentType == 'General') {\n pruneUnselectedModel(segment);\n if (segment.blocks.length > 0 || isSelectedOrUndeletable) {\n newSegments.push(segment);\n }\n } else if (\n isSelectedOrUndeletable &&\n segment.segmentType != 'SelectionMarker'\n ) {\n newSegments.push(segment);\n }\n }\n block.segments = newSegments;\n if (block.segments.length == 0) {\n model.blocks.splice(index, 1);\n } else {\n isSelectionAfterElement = true;\n }\n break;\n case 'Table':\n const filteredRows: ContentModelTableRow[] = [];\n for (let i = 0; i < block.rows.length; i++) {\n const row = block.rows[i];\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (!cell.isSelected) {\n pruneUnselectedModelInternal(cell, isSelectionAfterElement);\n } else {\n isSelectionAfterElement = true;\n }\n }\n\n const newCells: ContentModelTableCell[] = [];\n for (let k = 0; k < row.cells.length; k++) {\n const cell = row.cells[k];\n if (cell.isSelected || cell.blocks.length > 0) {\n newCells.push(cell);\n }\n }\n row.cells = newCells;\n\n if (row.cells.length > 0) {\n filteredRows.push(row);\n }\n }\n\n if (\n !isSelectionAfterElement &&\n filteredRows.length == 1 &&\n filteredRows[0].cells.length == 1 &&\n !filteredRows[0].cells[0].isSelected\n ) {\n const cell = filteredRows[0].cells[0];\n model.blocks.splice(index, 1, ...cell.blocks);\n } else if (filteredRows.length == 0) {\n model.blocks.splice(index, 1);\n } else {\n block.rows = filteredRows;\n }\n break;\n }\n }\n return isSelectionAfterElement;\n}\n\nfunction unwrap(model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>) {\n let block = model.blocks[0];\n if (model.blocks.length == 1) {\n while (block.blockType == 'BlockGroup') {\n model.blocks = block.blocks;\n block = model.blocks[0];\n\n if (model.blocks.length > 1) {\n return;\n }\n }\n\n if (block.blockType == 'Paragraph') {\n block.isImplicit = true;\n block.format = {};\n inheritSegmentFormatToChildren(block);\n }\n }\n}\n\nfunction inheritSegmentFormatToChildren(parent: ContentModelParagraph) {\n const value = parent.segmentFormat;\n if (value !== undefined) {\n for (let index = 0; index < parent.segments.length; index++) {\n const segment = parent.segments[index];\n segment.format = {\n ...parent.segmentFormat,\n ...segment.format,\n };\n }\n }\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -92,7 +92,7 @@ export { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';
|
|
|
92
92
|
export { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';
|
|
93
93
|
export { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';
|
|
94
94
|
export { setSelection } from './modelApi/selection/setSelection';
|
|
95
|
-
export { cloneModel } from './modelApi/editing/cloneModel';
|
|
95
|
+
export { cloneModel, cloneModelForPaste } from './modelApi/editing/cloneModel';
|
|
96
96
|
export { mergeModel } from './modelApi/editing/mergeModel';
|
|
97
97
|
export { deleteSelection } from './modelApi/editing/deleteSelection';
|
|
98
98
|
export { deleteSegment } from './modelApi/editing/deleteSegment';
|
package/lib/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.formatContainerProcessor = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
|
|
4
4
|
exports.trimModelForSelection = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
|
|
5
|
-
exports.
|
|
6
|
-
exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = void 0;
|
|
5
|
+
exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModelForPaste = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = void 0;
|
|
6
|
+
exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = void 0;
|
|
7
7
|
var domToContentModel_1 = require("./domToModel/domToContentModel");
|
|
8
8
|
Object.defineProperty(exports, "domToContentModel", { enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } });
|
|
9
9
|
var contentModelToDom_1 = require("./modelToDom/contentModelToDom");
|
|
@@ -234,6 +234,7 @@ var setSelection_1 = require("./modelApi/selection/setSelection");
|
|
|
234
234
|
Object.defineProperty(exports, "setSelection", { enumerable: true, get: function () { return setSelection_1.setSelection; } });
|
|
235
235
|
var cloneModel_1 = require("./modelApi/editing/cloneModel");
|
|
236
236
|
Object.defineProperty(exports, "cloneModel", { enumerable: true, get: function () { return cloneModel_1.cloneModel; } });
|
|
237
|
+
Object.defineProperty(exports, "cloneModelForPaste", { enumerable: true, get: function () { return cloneModel_1.cloneModelForPaste; } });
|
|
237
238
|
var mergeModel_1 = require("./modelApi/editing/mergeModel");
|
|
238
239
|
Object.defineProperty(exports, "mergeModel", { enumerable: true, get: function () { return mergeModel_1.mergeModel; } });
|
|
239
240
|
var deleteSelection_1 = require("./modelApi/editing/deleteSelection");
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { formatContainerProcessor } from './domToModel/processors/formatContainerProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\nexport { scrollRectIntoView } from './domUtils/scrollRectIntoView';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/utils/borderKeys';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { trimModelForSelection } from './domUtils/selection/trimModelForSelection';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { getNodePositionFromEvent } from './domUtils/event/getNodePositionFromEvent';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { retrieveDocumentMetadata } from './domUtils/retrieveDocumentMetadata';\nexport { transformColor, TransformColorOptions } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\nexport { getRangesByText } from './domUtils/getRangesByText';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { formatContainerProcessor } from './domToModel/processors/formatContainerProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\nexport { scrollRectIntoView } from './domUtils/scrollRectIntoView';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/utils/borderKeys';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { trimModelForSelection } from './domUtils/selection/trimModelForSelection';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { getNodePositionFromEvent } from './domUtils/event/getNodePositionFromEvent';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { retrieveDocumentMetadata } from './domUtils/retrieveDocumentMetadata';\nexport { transformColor, TransformColorOptions } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\nexport { getRangesByText } from './domUtils/getRangesByText';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel, cloneModelForPaste } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
|
|
@@ -27,7 +27,34 @@ exports.normalizeAllSegments = normalizeAllSegments;
|
|
|
27
27
|
function normalizeSingleSegment(paragraph, segment, ignoreTrailingSpaces) {
|
|
28
28
|
if (ignoreTrailingSpaces === void 0) { ignoreTrailingSpaces = false; }
|
|
29
29
|
var context = resetNormalizeSegmentContext();
|
|
30
|
+
var index = paragraph.segments.indexOf(segment);
|
|
30
31
|
context.ignoreTrailingSpaces = ignoreTrailingSpaces;
|
|
32
|
+
// Search backward for the nearest non-empty text segment (skipping SelectionMarkers and empty text),
|
|
33
|
+
// to determine whether leading spaces of the current segment should be preserved.
|
|
34
|
+
// If the previous text doesn't end with a space, keep the leading space to maintain word separation.
|
|
35
|
+
for (var i = index - 1; i >= 0; i--) {
|
|
36
|
+
var s = paragraph.segments[i];
|
|
37
|
+
if (s.segmentType == 'Text') {
|
|
38
|
+
if (s.text.length > 0) {
|
|
39
|
+
if (s.text.substr(-1) != SPACE) {
|
|
40
|
+
context.ignoreLeadingSpaces = false;
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (s.segmentType == 'Image') {
|
|
46
|
+
// If the previous segment is an image, we should keep the leading space of the current segment to maintain word separation.
|
|
47
|
+
context.ignoreLeadingSpaces = false;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
else if (s.segmentType == 'Br') {
|
|
51
|
+
// If the previous segment is a line break, we should ignore the leading space of the current segment.
|
|
52
|
+
context.ignoreLeadingSpaces = true;
|
|
53
|
+
}
|
|
54
|
+
else if (s.segmentType != 'SelectionMarker') {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
31
58
|
normalizeSegment(paragraph, segment, context);
|
|
32
59
|
}
|
|
33
60
|
exports.normalizeSingleSegment = normalizeSingleSegment;
|
|
@@ -68,6 +95,10 @@ function normalizeSegment(paragraph, segment, context) {
|
|
|
68
95
|
context.ignoreLeadingSpaces = false;
|
|
69
96
|
break;
|
|
70
97
|
case 'Text':
|
|
98
|
+
// Skip empty text segments to avoid affecting normalization context
|
|
99
|
+
if (segment.text.length == 0) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
71
102
|
context.textSegments.push(segment);
|
|
72
103
|
context.lastInlineSegment = segment;
|
|
73
104
|
context.lastTextSegment = segment;
|
|
@@ -75,9 +106,9 @@ function normalizeSegment(paragraph, segment, context) {
|
|
|
75
106
|
var last = segment.text.substr(-1);
|
|
76
107
|
if (!(0, hasSpacesOnly_1.hasSpacesOnly)(segment.text)) {
|
|
77
108
|
if (first == SPACE) {
|
|
78
|
-
// 1. Multiple leading space => single
|
|
109
|
+
// 1. Multiple leading space => single space or empty (depends on if previous segment ends with space)
|
|
79
110
|
(0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
|
|
80
|
-
textSegment.text = textSegment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' :
|
|
111
|
+
textSegment.text = textSegment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' : SPACE);
|
|
81
112
|
});
|
|
82
113
|
}
|
|
83
114
|
if (last == SPACE) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalizeSegment.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasSpacesOnly } from './hasSpacesOnly';\nimport { mutateSegment } from './mutate';\nimport type {\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelText,\n} from 'roosterjs-content-model-types';\n\nconst SPACE = '\\u0020';\nconst NONE_BREAK_SPACE = '\\u00A0';\nconst LEADING_SPACE_REGEX = /^\\u0020+/;\nconst TRAILING_SPACE_REGEX = /\\u0020+$/;\n\n/**\n * @internal\n */\nexport function normalizeAllSegments(paragraph: ReadonlyContentModelParagraph) {\n const context = resetNormalizeSegmentContext();\n\n paragraph.segments.forEach(segment => {\n normalizeSegment(paragraph, segment, context);\n });\n\n normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);\n normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);\n}\n\n/**\n * Normalize a given segment, make sure its spaces are correctly represented by space and non-break space\n * @param segment The segment to normalize\n * @param ignoreTrailingSpaces Whether we should ignore the trailing space of the text segment @default false\n */\nexport function normalizeSingleSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelSegment,\n ignoreTrailingSpaces: boolean = false\n) {\n const context = resetNormalizeSegmentContext();\n\n context.ignoreTrailingSpaces = ignoreTrailingSpaces;\n normalizeSegment(paragraph, segment, context);\n}\n\n/**\n * @internal Export for test only\n */\nexport interface NormalizeSegmentContext {\n textSegments: ReadonlyContentModelText[];\n ignoreLeadingSpaces: boolean;\n ignoreTrailingSpaces: boolean;\n lastTextSegment: ReadonlyContentModelText | undefined;\n lastInlineSegment: ReadonlyContentModelSegment | undefined;\n}\n\n/**\n * @internal Export for test only\n */\nexport function createNormalizeSegmentContext(): NormalizeSegmentContext {\n return resetNormalizeSegmentContext();\n}\n\nfunction resetNormalizeSegmentContext(\n context?: Partial<NormalizeSegmentContext>\n): NormalizeSegmentContext {\n return Object.assign(context ?? {}, {\n textSegments: [],\n ignoreLeadingSpaces: true,\n ignoreTrailingSpaces: true,\n lastInlineSegment: undefined,\n lastTextSegment: undefined,\n });\n}\n\n/**\n * @internal Export for test only\n */\nexport function normalizeSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelSegment,\n context: NormalizeSegmentContext\n) {\n switch (segment.segmentType) {\n case 'Br':\n normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);\n normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);\n\n // Line ends, reset all states\n resetNormalizeSegmentContext(context);\n break;\n\n case 'Entity':\n case 'General':\n case 'Image':\n // Here \"inline segment\" means a segment showing some content inline such as text, image, or other inline HTML elements\n // BR will end current line, so it is not treated as \"inline\" here.\n // We will do some normalization to the trailing spaces for non-inline-segments\n context.lastInlineSegment = segment;\n context.ignoreLeadingSpaces = false;\n break;\n\n case 'Text':\n context.textSegments.push(segment);\n context.lastInlineSegment = segment;\n context.lastTextSegment = segment;\n\n const first = segment.text.substring(0, 1);\n const last = segment.text.substr(-1);\n\n if (!hasSpacesOnly(segment.text)) {\n if (first == SPACE) {\n // 1. Multiple leading space => single or empty (depends on if previous segment ends with space)\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = textSegment.text.replace(\n LEADING_SPACE_REGEX,\n context.ignoreLeadingSpaces ? '' : NONE_BREAK_SPACE\n );\n });\n }\n\n if (last == SPACE) {\n // 2. Multiple trailing space => single space\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = textSegment.text.replace(\n TRAILING_SPACE_REGEX,\n context.ignoreTrailingSpaces ? SPACE : NONE_BREAK_SPACE\n );\n });\n }\n }\n\n context.ignoreLeadingSpaces = last == SPACE;\n\n break;\n }\n}\n\nfunction normalizeTextSegments(\n paragraph: ReadonlyContentModelParagraph,\n segments: ReadonlyContentModelText[],\n lastInlineSegment: ReadonlyContentModelSegment | undefined\n) {\n segments.forEach(segment => {\n // 3. Segment ends with replace it with space if the previous char is not space so that next segment can wrap\n // Only do this for segments that is not the last one since the last space will be removed in step 4\n if (segment != lastInlineSegment) {\n const text = segment.text;\n\n if (\n text.substr(-1) == NONE_BREAK_SPACE &&\n text.length > 1 &&\n text.substr(-2, 1) != SPACE\n ) {\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = text.substring(0, text.length - 1) + SPACE;\n });\n }\n }\n });\n}\n\nfunction normalizeLastTextSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelText | undefined,\n lastInlineSegment: ReadonlyContentModelSegment | undefined\n) {\n if (segment && segment == lastInlineSegment && segment?.text.substr(-1) == SPACE) {\n // 4. last text segment of the paragraph, remove trailing space\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = textSegment.text.replace(TRAILING_SPACE_REGEX, '');\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"normalizeSegment.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasSpacesOnly } from './hasSpacesOnly';\nimport { mutateSegment } from './mutate';\nimport type {\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelText,\n} from 'roosterjs-content-model-types';\n\nconst SPACE = '\\u0020';\nconst NONE_BREAK_SPACE = '\\u00A0';\nconst LEADING_SPACE_REGEX = /^\\u0020+/;\nconst TRAILING_SPACE_REGEX = /\\u0020+$/;\n\n/**\n * @internal\n */\nexport function normalizeAllSegments(paragraph: ReadonlyContentModelParagraph) {\n const context = resetNormalizeSegmentContext();\n\n paragraph.segments.forEach(segment => {\n normalizeSegment(paragraph, segment, context);\n });\n\n normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);\n normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);\n}\n\n/**\n * Normalize a given segment, make sure its spaces are correctly represented by space and non-break space\n * @param segment The segment to normalize\n * @param ignoreTrailingSpaces Whether we should ignore the trailing space of the text segment @default false\n */\nexport function normalizeSingleSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelSegment,\n ignoreTrailingSpaces: boolean = false\n) {\n const context = resetNormalizeSegmentContext();\n const index = paragraph.segments.indexOf(segment);\n\n context.ignoreTrailingSpaces = ignoreTrailingSpaces;\n\n // Search backward for the nearest non-empty text segment (skipping SelectionMarkers and empty text),\n // to determine whether leading spaces of the current segment should be preserved.\n // If the previous text doesn't end with a space, keep the leading space to maintain word separation.\n for (let i = index - 1; i >= 0; i--) {\n const s = paragraph.segments[i];\n\n if (s.segmentType == 'Text') {\n if (s.text.length > 0) {\n if (s.text.substr(-1) != SPACE) {\n context.ignoreLeadingSpaces = false;\n }\n break;\n }\n } else if (s.segmentType == 'Image') {\n // If the previous segment is an image, we should keep the leading space of the current segment to maintain word separation.\n context.ignoreLeadingSpaces = false;\n break;\n } else if (s.segmentType == 'Br') {\n // If the previous segment is a line break, we should ignore the leading space of the current segment.\n context.ignoreLeadingSpaces = true;\n } else if (s.segmentType != 'SelectionMarker') {\n break;\n }\n }\n\n normalizeSegment(paragraph, segment, context);\n}\n\n/**\n * @internal Export for test only\n */\nexport interface NormalizeSegmentContext {\n textSegments: ReadonlyContentModelText[];\n ignoreLeadingSpaces: boolean;\n ignoreTrailingSpaces: boolean;\n lastTextSegment: ReadonlyContentModelText | undefined;\n lastInlineSegment: ReadonlyContentModelSegment | undefined;\n}\n\n/**\n * @internal Export for test only\n */\nexport function createNormalizeSegmentContext(): NormalizeSegmentContext {\n return resetNormalizeSegmentContext();\n}\n\nfunction resetNormalizeSegmentContext(\n context?: Partial<NormalizeSegmentContext>\n): NormalizeSegmentContext {\n return Object.assign(context ?? {}, {\n textSegments: [],\n ignoreLeadingSpaces: true,\n ignoreTrailingSpaces: true,\n lastInlineSegment: undefined,\n lastTextSegment: undefined,\n });\n}\n\n/**\n * @internal Export for test only\n */\nexport function normalizeSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelSegment,\n context: NormalizeSegmentContext\n) {\n switch (segment.segmentType) {\n case 'Br':\n normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);\n normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);\n\n // Line ends, reset all states\n resetNormalizeSegmentContext(context);\n break;\n\n case 'Entity':\n case 'General':\n case 'Image':\n // Here \"inline segment\" means a segment showing some content inline such as text, image, or other inline HTML elements\n // BR will end current line, so it is not treated as \"inline\" here.\n // We will do some normalization to the trailing spaces for non-inline-segments\n context.lastInlineSegment = segment;\n context.ignoreLeadingSpaces = false;\n break;\n\n case 'Text':\n // Skip empty text segments to avoid affecting normalization context\n if (segment.text.length == 0) {\n break;\n }\n\n context.textSegments.push(segment);\n context.lastInlineSegment = segment;\n context.lastTextSegment = segment;\n\n const first = segment.text.substring(0, 1);\n const last = segment.text.substr(-1);\n\n if (!hasSpacesOnly(segment.text)) {\n if (first == SPACE) {\n // 1. Multiple leading space => single space or empty (depends on if previous segment ends with space)\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = textSegment.text.replace(\n LEADING_SPACE_REGEX,\n context.ignoreLeadingSpaces ? '' : SPACE\n );\n });\n }\n\n if (last == SPACE) {\n // 2. Multiple trailing space => single space\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = textSegment.text.replace(\n TRAILING_SPACE_REGEX,\n context.ignoreTrailingSpaces ? SPACE : NONE_BREAK_SPACE\n );\n });\n }\n }\n\n context.ignoreLeadingSpaces = last == SPACE;\n\n break;\n }\n}\n\nfunction normalizeTextSegments(\n paragraph: ReadonlyContentModelParagraph,\n segments: ReadonlyContentModelText[],\n lastInlineSegment: ReadonlyContentModelSegment | undefined\n) {\n segments.forEach(segment => {\n // 3. Segment ends with replace it with space if the previous char is not space so that next segment can wrap\n // Only do this for segments that is not the last one since the last space will be removed in step 4\n if (segment != lastInlineSegment) {\n const text = segment.text;\n\n if (\n text.substr(-1) == NONE_BREAK_SPACE &&\n text.length > 1 &&\n text.substr(-2, 1) != SPACE\n ) {\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = text.substring(0, text.length - 1) + SPACE;\n });\n }\n }\n });\n}\n\nfunction normalizeLastTextSegment(\n paragraph: ReadonlyContentModelParagraph,\n segment: ReadonlyContentModelText | undefined,\n lastInlineSegment: ReadonlyContentModelSegment | undefined\n) {\n if (segment && segment == lastInlineSegment && segment?.text.substr(-1) == SPACE) {\n // 4. last text segment of the paragraph, remove trailing space\n mutateSegment(paragraph, segment, textSegment => {\n textSegment.text = textSegment.text.replace(TRAILING_SPACE_REGEX, '');\n });\n }\n}\n"]}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { ContentModelDocument, CloneModelOptions, ReadonlyContentModelDocument } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* Clone a content model for paste operations, ensuring that cached elements are handled appropriately.
|
|
4
|
+
* @param model The content model to clone
|
|
5
|
+
* @returns A cloned content model suitable for paste operations
|
|
6
|
+
*/
|
|
7
|
+
export declare function cloneModelForPaste(model: ReadonlyContentModelDocument): ContentModelDocument;
|
|
2
8
|
/**
|
|
3
9
|
* Clone a content model
|
|
4
10
|
* @param model The content model to clone
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.cloneModel = void 0;
|
|
3
|
+
exports.cloneModel = exports.cloneModelForPaste = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
+
var CloneOption = {
|
|
6
|
+
includeCachedElement: function (node, type) { return (type == 'cache' ? undefined : node); },
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Clone a content model for paste operations, ensuring that cached elements are handled appropriately.
|
|
10
|
+
* @param model The content model to clone
|
|
11
|
+
* @returns A cloned content model suitable for paste operations
|
|
12
|
+
*/
|
|
13
|
+
function cloneModelForPaste(model) {
|
|
14
|
+
return cloneModel(model, CloneOption);
|
|
15
|
+
}
|
|
16
|
+
exports.cloneModelForPaste = cloneModelForPaste;
|
|
5
17
|
/**
|
|
6
18
|
* Clone a content model
|
|
7
19
|
* @param model The content model to clone
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloneModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/cloneModel.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlock,\n ContentModelBlockBase,\n ContentModelBlockGroupBase,\n ContentModelBlockGroupType,\n ContentModelBlockType,\n ContentModelDivider,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelFormatBase,\n ContentModelFormatContainer,\n ContentModelGeneralBlock,\n ContentModelImage,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentBase,\n ContentModelSegmentType,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelTableCell,\n ContentModelWithDataset,\n ContentModelWithFormat,\n ContentModelGeneralSegment,\n ContentModelText,\n ContentModelTableRow,\n ContentModelListLevel,\n CloneModelOptions,\n ReadonlyContentModelDocument,\n ReadonlyContentModelBlockGroupBase,\n ReadonlyContentModelBlock,\n ReadonlyContentModelFormatContainer,\n ReadonlyContentModelBlockBase,\n ReadonlyContentModelGeneralBlock,\n ReadonlyContentModelListItem,\n ReadonlyContentModelSelectionMarker,\n ReadonlyContentModelSegmentBase,\n ReadonlyContentModelWithDataset,\n ReadonlyContentModelDivider,\n ReadonlyContentModelListLevel,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelTable,\n ReadonlyContentModelTableRow,\n ReadonlyContentModelTableCell,\n ReadonlyContentModelGeneralSegment,\n ReadonlyContentModelImage,\n ReadonlyContentModelText,\n} from 'roosterjs-content-model-types';\n\n/**\n * Clone a content model\n * @param model The content model to clone\n * @param options @optional Options to specify customize the clone behavior\n */\nexport function cloneModel(\n model: ReadonlyContentModelDocument,\n options?: CloneModelOptions\n): ContentModelDocument {\n const newModel: ContentModelDocument = cloneBlockGroupBase(model, options || {});\n\n if (model.format) {\n newModel.format = Object.assign({}, model.format);\n }\n\n return newModel;\n}\n\nfunction cloneBlock(\n block: ReadonlyContentModelBlock,\n options: CloneModelOptions\n): ContentModelBlock {\n switch (block.blockType) {\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'FormatContainer':\n return cloneFormatContainer(block, options);\n case 'General':\n return cloneGeneralBlock(block, options);\n case 'ListItem':\n return cloneListItem(block, options);\n }\n break;\n case 'Divider':\n return cloneDivider(block, options);\n case 'Entity':\n return cloneEntity(block, options);\n case 'Paragraph':\n return cloneParagraph(block, options);\n case 'Table':\n return cloneTable(block, options);\n }\n}\n\nfunction cloneSegment(\n segment: ReadonlyContentModelSegment,\n options: CloneModelOptions\n): ContentModelSegment {\n switch (segment.segmentType) {\n case 'Br':\n return cloneSegmentBase(segment);\n case 'Entity':\n return cloneEntity(segment, options);\n case 'General':\n return cloneGeneralSegment(segment, options);\n case 'Image':\n return cloneImage(segment);\n case 'SelectionMarker':\n return cloneSelectionMarker(segment);\n case 'Text':\n return cloneText(segment);\n }\n}\n\nfunction cloneModelWithFormat<T extends ContentModelFormatBase>(\n model: ContentModelWithFormat<T>\n): ContentModelWithFormat<T> {\n return {\n format: Object.assign({}, model.format),\n };\n}\n\nfunction cloneModelWithDataset<T>(\n model: ReadonlyContentModelWithDataset<T>\n): ContentModelWithDataset<T> {\n return {\n dataset: Object.assign({}, model.dataset),\n };\n}\n\nfunction cloneBlockBase<T extends ContentModelBlockType>(\n block: ReadonlyContentModelBlockBase<T>\n): ContentModelBlockBase<T> {\n const { blockType } = block;\n\n return Object.assign(\n {\n blockType,\n },\n cloneModelWithFormat(block)\n );\n}\n\nfunction cloneBlockGroupBase<T extends ContentModelBlockGroupType>(\n group: ReadonlyContentModelBlockGroupBase<T>,\n options: CloneModelOptions\n): ContentModelBlockGroupBase<T> {\n const { blockGroupType, blocks } = group;\n\n return {\n blockGroupType: blockGroupType,\n blocks: blocks.map(block => cloneBlock(block, options)),\n };\n}\n\nfunction cloneSegmentBase<T extends ContentModelSegmentType>(\n segment: ReadonlyContentModelSegmentBase<T>\n): ContentModelSegmentBase<T> {\n const { segmentType, isSelected, code, link } = segment;\n\n const newSegment: ContentModelSegmentBase<T> = Object.assign(\n {\n segmentType,\n isSelected,\n },\n cloneModelWithFormat(segment)\n );\n\n if (code) {\n newSegment.code = cloneModelWithFormat(code);\n }\n if (link) {\n newSegment.link = Object.assign(cloneModelWithFormat(link), cloneModelWithDataset(link));\n }\n\n return newSegment;\n}\n\nfunction cloneEntity(entity: ContentModelEntity, options: CloneModelOptions): ContentModelEntity {\n const { wrapper, entityFormat } = entity;\n\n return Object.assign(\n {\n wrapper: handleCachedElement(wrapper, 'entity', options),\n entityFormat: { ...entityFormat },\n },\n cloneBlockBase(entity),\n cloneSegmentBase(entity)\n );\n}\n\nfunction cloneParagraph(\n paragraph: ReadonlyContentModelParagraph,\n options: CloneModelOptions\n): ContentModelParagraph {\n const { cachedElement, segments, isImplicit, decorator, segmentFormat } = paragraph;\n\n const newParagraph: ContentModelParagraph = Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isImplicit,\n segments: segments.map(segment => cloneSegment(segment, options)),\n segmentFormat: segmentFormat ? { ...segmentFormat } : undefined,\n },\n cloneBlockBase(paragraph),\n cloneModelWithFormat(paragraph)\n );\n\n if (decorator) {\n newParagraph.decorator = Object.assign(\n {\n tagName: decorator.tagName,\n },\n cloneModelWithFormat(decorator)\n );\n }\n\n return newParagraph;\n}\n\nfunction cloneTable(\n table: ReadonlyContentModelTable,\n options: CloneModelOptions\n): ContentModelTable {\n const { cachedElement, widths, rows } = table;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n widths: Array.from(widths),\n rows: rows.map(row => cloneTableRow(row, options)),\n },\n cloneBlockBase(table),\n cloneModelWithDataset(table)\n );\n}\n\nfunction cloneTableRow(\n row: ReadonlyContentModelTableRow,\n options: CloneModelOptions\n): ContentModelTableRow {\n const { height, cells, cachedElement } = row;\n\n return Object.assign(\n {\n height,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n cells: cells.map(cell => cloneTableCell(cell, options)),\n },\n cloneModelWithFormat(row)\n );\n}\n\nfunction cloneTableCell(\n cell: ReadonlyContentModelTableCell,\n options: CloneModelOptions\n): ContentModelTableCell {\n const { cachedElement, isSelected, spanAbove, spanLeft, isHeader } = cell;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isSelected,\n spanAbove,\n spanLeft,\n isHeader,\n },\n cloneBlockGroupBase(cell, options),\n cloneModelWithFormat(cell),\n cloneModelWithDataset(cell)\n );\n}\n\nfunction cloneFormatContainer(\n container: ReadonlyContentModelFormatContainer,\n options: CloneModelOptions\n): ContentModelFormatContainer {\n const { tagName, cachedElement } = container;\n const newContainer: ContentModelFormatContainer = Object.assign(\n { tagName, cachedElement: handleCachedElement(cachedElement, 'cache', options) },\n cloneBlockBase(container),\n cloneBlockGroupBase(container, options)\n );\n\n if (container.zeroFontSize) {\n newContainer.zeroFontSize = true;\n }\n\n return newContainer;\n}\n\nfunction cloneListItem(\n item: ReadonlyContentModelListItem,\n options: CloneModelOptions\n): ContentModelListItem {\n const { formatHolder, levels, cachedElement } = item;\n\n return Object.assign(\n {\n formatHolder: cloneSelectionMarker(formatHolder),\n levels: levels.map(cloneListLevel),\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(item),\n cloneBlockGroupBase(item, options)\n );\n}\n\nfunction cloneListLevel(level: ReadonlyContentModelListLevel): ContentModelListLevel {\n const { listType } = level;\n\n return Object.assign({ listType }, cloneModelWithFormat(level), cloneModelWithDataset(level));\n}\nfunction cloneDivider(\n divider: ReadonlyContentModelDivider,\n options: CloneModelOptions\n): ContentModelDivider {\n const { tagName, isSelected, cachedElement } = divider;\n\n return Object.assign(\n {\n isSelected,\n tagName,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(divider)\n );\n}\n\nfunction cloneGeneralBlock(\n general: ReadonlyContentModelGeneralBlock,\n options: CloneModelOptions\n): ContentModelGeneralBlock {\n const { element } = general;\n\n return Object.assign(\n {\n element: handleCachedElement(element, 'general', options),\n },\n cloneBlockBase(general),\n cloneBlockGroupBase(general, options)\n );\n}\n\nfunction cloneSelectionMarker(\n marker: ReadonlyContentModelSelectionMarker\n): ContentModelSelectionMarker {\n return Object.assign({ isSelected: marker.isSelected }, cloneSegmentBase(marker));\n}\n\nfunction cloneImage(image: ReadonlyContentModelImage): ContentModelImage {\n const { src, alt, title, isSelectedAsImageSelection } = image;\n\n return Object.assign(\n { src, alt, title, isSelectedAsImageSelection },\n cloneSegmentBase(image),\n cloneModelWithDataset(image)\n );\n}\n\nfunction cloneGeneralSegment(\n general: ReadonlyContentModelGeneralSegment,\n options: CloneModelOptions\n): ContentModelGeneralSegment {\n return Object.assign(cloneGeneralBlock(general, options), cloneSegmentBase(general));\n}\n\nfunction cloneText(textSegment: ReadonlyContentModelText): ContentModelText {\n const { text } = textSegment;\n return Object.assign({ text }, cloneSegmentBase(textSegment));\n}\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T,\n type: 'general' | 'entity',\n options: CloneModelOptions\n): T;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'cache',\n options: CloneModelOptions\n): T | undefined;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'general' | 'entity' | 'cache',\n options: CloneModelOptions\n): T | undefined {\n const { includeCachedElement } = options;\n\n if (!node) {\n return undefined;\n } else if (!includeCachedElement) {\n return type == 'cache' ? undefined : (node.cloneNode(true /*deep*/) as T);\n } else if (includeCachedElement === true) {\n return node;\n } else {\n const result = includeCachedElement(node, type) as T | undefined;\n\n if ((type == 'general' || type == 'entity') && !result) {\n throw new Error('Entity and General Model must has wrapper element');\n }\n\n return result;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cloneModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/cloneModel.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlock,\n ContentModelBlockBase,\n ContentModelBlockGroupBase,\n ContentModelBlockGroupType,\n ContentModelBlockType,\n ContentModelDivider,\n ContentModelDocument,\n ContentModelEntity,\n ContentModelFormatBase,\n ContentModelFormatContainer,\n ContentModelGeneralBlock,\n ContentModelImage,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSegmentBase,\n ContentModelSegmentType,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelTableCell,\n ContentModelWithDataset,\n ContentModelWithFormat,\n ContentModelGeneralSegment,\n ContentModelText,\n ContentModelTableRow,\n ContentModelListLevel,\n CloneModelOptions,\n ReadonlyContentModelDocument,\n ReadonlyContentModelBlockGroupBase,\n ReadonlyContentModelBlock,\n ReadonlyContentModelFormatContainer,\n ReadonlyContentModelBlockBase,\n ReadonlyContentModelGeneralBlock,\n ReadonlyContentModelListItem,\n ReadonlyContentModelSelectionMarker,\n ReadonlyContentModelSegmentBase,\n ReadonlyContentModelWithDataset,\n ReadonlyContentModelDivider,\n ReadonlyContentModelListLevel,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n ReadonlyContentModelTable,\n ReadonlyContentModelTableRow,\n ReadonlyContentModelTableCell,\n ReadonlyContentModelGeneralSegment,\n ReadonlyContentModelImage,\n ReadonlyContentModelText,\n} from 'roosterjs-content-model-types';\n\nconst CloneOption: CloneModelOptions = {\n includeCachedElement: (node, type) => (type == 'cache' ? undefined : node),\n};\n\n/**\n * Clone a content model for paste operations, ensuring that cached elements are handled appropriately.\n * @param model The content model to clone\n * @returns A cloned content model suitable for paste operations\n */\nexport function cloneModelForPaste(model: ReadonlyContentModelDocument) {\n return cloneModel(model, CloneOption);\n}\n\n/**\n * Clone a content model\n * @param model The content model to clone\n * @param options @optional Options to specify customize the clone behavior\n */\nexport function cloneModel(\n model: ReadonlyContentModelDocument,\n options?: CloneModelOptions\n): ContentModelDocument {\n const newModel: ContentModelDocument = cloneBlockGroupBase(model, options || {});\n\n if (model.format) {\n newModel.format = Object.assign({}, model.format);\n }\n\n return newModel;\n}\n\nfunction cloneBlock(\n block: ReadonlyContentModelBlock,\n options: CloneModelOptions\n): ContentModelBlock {\n switch (block.blockType) {\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'FormatContainer':\n return cloneFormatContainer(block, options);\n case 'General':\n return cloneGeneralBlock(block, options);\n case 'ListItem':\n return cloneListItem(block, options);\n }\n break;\n case 'Divider':\n return cloneDivider(block, options);\n case 'Entity':\n return cloneEntity(block, options);\n case 'Paragraph':\n return cloneParagraph(block, options);\n case 'Table':\n return cloneTable(block, options);\n }\n}\n\nfunction cloneSegment(\n segment: ReadonlyContentModelSegment,\n options: CloneModelOptions\n): ContentModelSegment {\n switch (segment.segmentType) {\n case 'Br':\n return cloneSegmentBase(segment);\n case 'Entity':\n return cloneEntity(segment, options);\n case 'General':\n return cloneGeneralSegment(segment, options);\n case 'Image':\n return cloneImage(segment);\n case 'SelectionMarker':\n return cloneSelectionMarker(segment);\n case 'Text':\n return cloneText(segment);\n }\n}\n\nfunction cloneModelWithFormat<T extends ContentModelFormatBase>(\n model: ContentModelWithFormat<T>\n): ContentModelWithFormat<T> {\n return {\n format: Object.assign({}, model.format),\n };\n}\n\nfunction cloneModelWithDataset<T>(\n model: ReadonlyContentModelWithDataset<T>\n): ContentModelWithDataset<T> {\n return {\n dataset: Object.assign({}, model.dataset),\n };\n}\n\nfunction cloneBlockBase<T extends ContentModelBlockType>(\n block: ReadonlyContentModelBlockBase<T>\n): ContentModelBlockBase<T> {\n const { blockType } = block;\n\n return Object.assign(\n {\n blockType,\n },\n cloneModelWithFormat(block)\n );\n}\n\nfunction cloneBlockGroupBase<T extends ContentModelBlockGroupType>(\n group: ReadonlyContentModelBlockGroupBase<T>,\n options: CloneModelOptions\n): ContentModelBlockGroupBase<T> {\n const { blockGroupType, blocks } = group;\n\n return {\n blockGroupType: blockGroupType,\n blocks: blocks.map(block => cloneBlock(block, options)),\n };\n}\n\nfunction cloneSegmentBase<T extends ContentModelSegmentType>(\n segment: ReadonlyContentModelSegmentBase<T>\n): ContentModelSegmentBase<T> {\n const { segmentType, isSelected, code, link } = segment;\n\n const newSegment: ContentModelSegmentBase<T> = Object.assign(\n {\n segmentType,\n isSelected,\n },\n cloneModelWithFormat(segment)\n );\n\n if (code) {\n newSegment.code = cloneModelWithFormat(code);\n }\n if (link) {\n newSegment.link = Object.assign(cloneModelWithFormat(link), cloneModelWithDataset(link));\n }\n\n return newSegment;\n}\n\nfunction cloneEntity(entity: ContentModelEntity, options: CloneModelOptions): ContentModelEntity {\n const { wrapper, entityFormat } = entity;\n\n return Object.assign(\n {\n wrapper: handleCachedElement(wrapper, 'entity', options),\n entityFormat: { ...entityFormat },\n },\n cloneBlockBase(entity),\n cloneSegmentBase(entity)\n );\n}\n\nfunction cloneParagraph(\n paragraph: ReadonlyContentModelParagraph,\n options: CloneModelOptions\n): ContentModelParagraph {\n const { cachedElement, segments, isImplicit, decorator, segmentFormat } = paragraph;\n\n const newParagraph: ContentModelParagraph = Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isImplicit,\n segments: segments.map(segment => cloneSegment(segment, options)),\n segmentFormat: segmentFormat ? { ...segmentFormat } : undefined,\n },\n cloneBlockBase(paragraph),\n cloneModelWithFormat(paragraph)\n );\n\n if (decorator) {\n newParagraph.decorator = Object.assign(\n {\n tagName: decorator.tagName,\n },\n cloneModelWithFormat(decorator)\n );\n }\n\n return newParagraph;\n}\n\nfunction cloneTable(\n table: ReadonlyContentModelTable,\n options: CloneModelOptions\n): ContentModelTable {\n const { cachedElement, widths, rows } = table;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n widths: Array.from(widths),\n rows: rows.map(row => cloneTableRow(row, options)),\n },\n cloneBlockBase(table),\n cloneModelWithDataset(table)\n );\n}\n\nfunction cloneTableRow(\n row: ReadonlyContentModelTableRow,\n options: CloneModelOptions\n): ContentModelTableRow {\n const { height, cells, cachedElement } = row;\n\n return Object.assign(\n {\n height,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n cells: cells.map(cell => cloneTableCell(cell, options)),\n },\n cloneModelWithFormat(row)\n );\n}\n\nfunction cloneTableCell(\n cell: ReadonlyContentModelTableCell,\n options: CloneModelOptions\n): ContentModelTableCell {\n const { cachedElement, isSelected, spanAbove, spanLeft, isHeader } = cell;\n\n return Object.assign(\n {\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n isSelected,\n spanAbove,\n spanLeft,\n isHeader,\n },\n cloneBlockGroupBase(cell, options),\n cloneModelWithFormat(cell),\n cloneModelWithDataset(cell)\n );\n}\n\nfunction cloneFormatContainer(\n container: ReadonlyContentModelFormatContainer,\n options: CloneModelOptions\n): ContentModelFormatContainer {\n const { tagName, cachedElement } = container;\n const newContainer: ContentModelFormatContainer = Object.assign(\n { tagName, cachedElement: handleCachedElement(cachedElement, 'cache', options) },\n cloneBlockBase(container),\n cloneBlockGroupBase(container, options)\n );\n\n if (container.zeroFontSize) {\n newContainer.zeroFontSize = true;\n }\n\n return newContainer;\n}\n\nfunction cloneListItem(\n item: ReadonlyContentModelListItem,\n options: CloneModelOptions\n): ContentModelListItem {\n const { formatHolder, levels, cachedElement } = item;\n\n return Object.assign(\n {\n formatHolder: cloneSelectionMarker(formatHolder),\n levels: levels.map(cloneListLevel),\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(item),\n cloneBlockGroupBase(item, options)\n );\n}\n\nfunction cloneListLevel(level: ReadonlyContentModelListLevel): ContentModelListLevel {\n const { listType } = level;\n\n return Object.assign({ listType }, cloneModelWithFormat(level), cloneModelWithDataset(level));\n}\nfunction cloneDivider(\n divider: ReadonlyContentModelDivider,\n options: CloneModelOptions\n): ContentModelDivider {\n const { tagName, isSelected, cachedElement } = divider;\n\n return Object.assign(\n {\n isSelected,\n tagName,\n cachedElement: handleCachedElement(cachedElement, 'cache', options),\n },\n cloneBlockBase(divider)\n );\n}\n\nfunction cloneGeneralBlock(\n general: ReadonlyContentModelGeneralBlock,\n options: CloneModelOptions\n): ContentModelGeneralBlock {\n const { element } = general;\n\n return Object.assign(\n {\n element: handleCachedElement(element, 'general', options),\n },\n cloneBlockBase(general),\n cloneBlockGroupBase(general, options)\n );\n}\n\nfunction cloneSelectionMarker(\n marker: ReadonlyContentModelSelectionMarker\n): ContentModelSelectionMarker {\n return Object.assign({ isSelected: marker.isSelected }, cloneSegmentBase(marker));\n}\n\nfunction cloneImage(image: ReadonlyContentModelImage): ContentModelImage {\n const { src, alt, title, isSelectedAsImageSelection } = image;\n\n return Object.assign(\n { src, alt, title, isSelectedAsImageSelection },\n cloneSegmentBase(image),\n cloneModelWithDataset(image)\n );\n}\n\nfunction cloneGeneralSegment(\n general: ReadonlyContentModelGeneralSegment,\n options: CloneModelOptions\n): ContentModelGeneralSegment {\n return Object.assign(cloneGeneralBlock(general, options), cloneSegmentBase(general));\n}\n\nfunction cloneText(textSegment: ReadonlyContentModelText): ContentModelText {\n const { text } = textSegment;\n return Object.assign({ text }, cloneSegmentBase(textSegment));\n}\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T,\n type: 'general' | 'entity',\n options: CloneModelOptions\n): T;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'cache',\n options: CloneModelOptions\n): T | undefined;\n\nfunction handleCachedElement<T extends HTMLElement>(\n node: T | undefined,\n type: 'general' | 'entity' | 'cache',\n options: CloneModelOptions\n): T | undefined {\n const { includeCachedElement } = options;\n\n if (!node) {\n return undefined;\n } else if (!includeCachedElement) {\n return type == 'cache' ? undefined : (node.cloneNode(true /*deep*/) as T);\n } else if (includeCachedElement === true) {\n return node;\n } else {\n const result = includeCachedElement(node, type) as T | undefined;\n\n if ((type == 'general' || type == 'entity') && !result) {\n throw new Error('Entity and General Model must has wrapper element');\n }\n\n return result;\n }\n}\n"]}
|
|
@@ -5,4 +5,4 @@ import type { ClipboardData } from 'roosterjs-content-model-types';
|
|
|
5
5
|
* @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images
|
|
6
6
|
Only text types are supported, and do not add "text/" prefix to the type values
|
|
7
7
|
*/
|
|
8
|
-
export declare function extractClipboardItems(items: DataTransferItem[], allowedCustomPasteType?: string[]): Promise<ClipboardData>;
|
|
8
|
+
export declare function extractClipboardItems(items: DataTransferItem[], allowedCustomPasteType?: string[], isPasteNative?: boolean): Promise<ClipboardData>;
|
|
@@ -16,7 +16,7 @@ define(["require", "exports", "../readFile"], function (require, exports, readFi
|
|
|
16
16
|
* @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images
|
|
17
17
|
Only text types are supported, and do not add "text/" prefix to the type values
|
|
18
18
|
*/
|
|
19
|
-
function extractClipboardItems(items, allowedCustomPasteType) {
|
|
19
|
+
function extractClipboardItems(items, allowedCustomPasteType, isPasteNative) {
|
|
20
20
|
var data = {
|
|
21
21
|
types: [],
|
|
22
22
|
text: '',
|
|
@@ -24,7 +24,7 @@ define(["require", "exports", "../readFile"], function (require, exports, readFi
|
|
|
24
24
|
files: [],
|
|
25
25
|
rawHtml: null,
|
|
26
26
|
customValues: {},
|
|
27
|
-
pasteNativeEvent:
|
|
27
|
+
pasteNativeEvent: !!isPasteNative,
|
|
28
28
|
};
|
|
29
29
|
return Promise.all((items || []).map(function (item) {
|
|
30
30
|
var type = item.type;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractClipboardItems.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts"],"names":[],"mappings":";;;;;IAGA,IAAM,eAAe;QAGjB,GAAC,WAAW,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,EAAtB,CAAsB;QACtD,GAAC,YAAY,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;QACpD,GAAC,QAAQ,IAAG,UAAC,IAAI,EAAE,KAAK,EAAE,IAAK,IAAK,OAAA,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,EAA3C,CAA2C;QAC/E,GAAC,mBAAmB,IAAG,mBAAmB;QAC1C,GAAC,eAAe,IAAG,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,EAAnB,CAAmB;WAC1D,CAAC;IAEF;;;;;OAKG;IACH,SAAgB,qBAAqB,CACjC,KAAyB,EACzB,sBAAiC;
|
|
1
|
+
{"version":3,"file":"extractClipboardItems.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from '../readFile';\nimport type { ClipboardData, EdgeLinkPreview } from 'roosterjs-content-model-types';\n\nconst ContentHandlers: {\n [contentType: string]: (data: ClipboardData, value: string, type?: string) => void;\n} = {\n ['text/html']: (data, value) => (data.rawHtml = value),\n ['text/plain']: (data, value) => (data.text = value),\n ['text/*']: (data, value, type?) => !!type && (data.customValues[type] = value),\n ['text/link-preview']: tryParseLinkPreview,\n ['text/uri-list']: (data, value) => (data.text = value),\n};\n\n/**\n * Extract clipboard items to be a ClipboardData object for IE\n * @param items The clipboard items retrieve from a DataTransfer object\n * @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images\n Only text types are supported, and do not add \"text/\" prefix to the type values\n */\nexport function extractClipboardItems(\n items: DataTransferItem[],\n allowedCustomPasteType?: string[],\n isPasteNative?: boolean\n): Promise<ClipboardData> {\n const data: ClipboardData = {\n types: [],\n text: '',\n image: null,\n files: [],\n rawHtml: null,\n customValues: {},\n pasteNativeEvent: !!isPasteNative,\n };\n\n return Promise.all(\n (items || []).map(item => {\n const type = item.type;\n\n if (type.indexOf('image/') == 0 && !data.image && item.kind == 'file') {\n data.types.push(type);\n data.image = item.getAsFile();\n return new Promise<void>(resolve => {\n if (data.image) {\n readFile(data.image, dataUrl => {\n data.imageDataUri = dataUrl;\n resolve();\n });\n } else {\n resolve();\n }\n });\n } else if (item.kind == 'file') {\n return new Promise<void>(resolve => {\n const file = item.getAsFile();\n if (!!file) {\n data.types.push(type);\n data.files!.push(file);\n }\n resolve();\n });\n } else {\n const customType = getAllowedCustomType(type, allowedCustomPasteType);\n const handler =\n ContentHandlers[type] || (customType ? ContentHandlers['text/*'] : null);\n return new Promise<void>(resolve =>\n handler\n ? item.getAsString(value => {\n data.types.push(type);\n handler(data, value, customType);\n resolve();\n })\n : resolve()\n );\n }\n })\n ).then(() => data);\n}\n\nfunction tryParseLinkPreview(data: ClipboardData, value: string) {\n try {\n data.customValues['link-preview'] = value;\n data.linkPreview = JSON.parse(value) as EdgeLinkPreview;\n } catch {}\n}\n\nfunction getAllowedCustomType(type: string, allowedCustomPasteType?: string[]) {\n const textType = type.indexOf('text/') == 0 ? type.substring('text/'.length) : null;\n const index =\n allowedCustomPasteType && textType ? allowedCustomPasteType.indexOf(textType) : -1;\n return textType && index >= 0 ? textType : undefined;\n}\n"]}
|