roosterjs-content-model-plugins 0.22.0 → 0.23.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/edit/deleteSteps/deleteWordSelection.js +1 -1
- package/lib/edit/deleteSteps/deleteWordSelection.js.map +1 -1
- package/lib/edit/keyboardInput.js +4 -3
- package/lib/edit/keyboardInput.js.map +1 -1
- package/lib/paste/ContentModelPastePlugin.d.ts +1 -2
- package/lib/paste/ContentModelPastePlugin.js +2 -12
- package/lib/paste/ContentModelPastePlugin.js.map +1 -1
- package/lib/paste/WacComponents/constants.d.ts +0 -8
- package/lib/paste/WacComponents/constants.js +1 -24
- package/lib/paste/WacComponents/constants.js.map +1 -1
- package/lib/paste/WacComponents/processPastedContentWacComponents.js +4 -6
- package/lib/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
- package/lib/paste/WordDesktop/getStyleMetadata.js +1 -1
- package/lib/paste/WordDesktop/getStyleMetadata.js.map +1 -1
- package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js +6 -19
- package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib/paste/WordDesktop/processWordLists.js +37 -12
- package/lib/paste/WordDesktop/processWordLists.js.map +1 -1
- package/lib-amd/edit/deleteSteps/deleteWordSelection.js +1 -1
- package/lib-amd/edit/deleteSteps/deleteWordSelection.js.map +1 -1
- package/lib-amd/edit/keyboardInput.js +4 -3
- package/lib-amd/edit/keyboardInput.js.map +1 -1
- package/lib-amd/paste/ContentModelPastePlugin.d.ts +1 -2
- package/lib-amd/paste/ContentModelPastePlugin.js +3 -12
- package/lib-amd/paste/ContentModelPastePlugin.js.map +1 -1
- package/lib-amd/paste/WacComponents/constants.d.ts +0 -8
- package/lib-amd/paste/WacComponents/constants.js +1 -24
- package/lib-amd/paste/WacComponents/constants.js.map +1 -1
- package/lib-amd/paste/WacComponents/processPastedContentWacComponents.js +5 -6
- package/lib-amd/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
- package/lib-amd/paste/WordDesktop/getStyleMetadata.js +1 -1
- package/lib-amd/paste/WordDesktop/getStyleMetadata.js.map +1 -1
- package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js +7 -18
- package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib-amd/paste/WordDesktop/processWordLists.js +37 -12
- package/lib-amd/paste/WordDesktop/processWordLists.js.map +1 -1
- package/lib-mjs/edit/deleteSteps/deleteWordSelection.js +1 -1
- package/lib-mjs/edit/deleteSteps/deleteWordSelection.js.map +1 -1
- package/lib-mjs/edit/keyboardInput.js +4 -3
- package/lib-mjs/edit/keyboardInput.js.map +1 -1
- package/lib-mjs/paste/ContentModelPastePlugin.d.ts +1 -2
- package/lib-mjs/paste/ContentModelPastePlugin.js +2 -12
- package/lib-mjs/paste/ContentModelPastePlugin.js.map +1 -1
- package/lib-mjs/paste/WacComponents/constants.d.ts +0 -8
- package/lib-mjs/paste/WacComponents/constants.js +0 -23
- package/lib-mjs/paste/WacComponents/constants.js.map +1 -1
- package/lib-mjs/paste/WacComponents/processPastedContentWacComponents.js +5 -7
- package/lib-mjs/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
- package/lib-mjs/paste/WordDesktop/getStyleMetadata.js +1 -1
- package/lib-mjs/paste/WordDesktop/getStyleMetadata.js.map +1 -1
- package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js +6 -19
- package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib-mjs/paste/WordDesktop/processWordLists.js +38 -13
- package/lib-mjs/paste/WordDesktop/processWordLists.js.map +1 -1
- package/package.json +5 -5
|
@@ -93,7 +93,7 @@ function iterateSegments(paragraph, markerIndex, forward, context) {
|
|
|
93
93
|
case 0:
|
|
94
94
|
step = forward ? 1 : -1;
|
|
95
95
|
segments = paragraph.segments;
|
|
96
|
-
preserveWhiteSpace = (0, roosterjs_content_model_dom_1.isWhiteSpacePreserved)(paragraph);
|
|
96
|
+
preserveWhiteSpace = (0, roosterjs_content_model_dom_1.isWhiteSpacePreserved)(paragraph.format.whiteSpace);
|
|
97
97
|
i = markerIndex + step;
|
|
98
98
|
_b.label = 1;
|
|
99
99
|
case 1:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteWordSelection.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteWordSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPunctuation, isSpace, normalizeText } from 'roosterjs-content-model-core';\nimport { isWhiteSpacePreserved } from 'roosterjs-content-model-dom';\nimport type {\n ContentModelParagraph,\n DeleteSelectionContext,\n DeleteSelectionStep,\n} from 'roosterjs-content-model-types';\n\nconst enum DeleteWordState {\n Start,\n Punctuation,\n Text,\n NonText,\n Space,\n End,\n}\n\ninterface CharInfo {\n text: boolean;\n space: boolean;\n punctuation: boolean;\n}\n\nfunction getDeleteWordSelection(direction: 'forward' | 'backward'): DeleteSelectionStep {\n return context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { marker, paragraph } = context.insertPoint;\n const startIndex = paragraph.segments.indexOf(marker);\n const deleteNext = direction == 'forward';\n\n const iterator = iterateSegments(paragraph, startIndex, deleteNext, context);\n let curr = iterator.next();\n\n for (let state = DeleteWordState.Start; state != DeleteWordState.End && !curr.done; ) {\n const { punctuation, space, text } = curr.value;\n\n // This is a state machine of how to delete a whole word together with space and punctuations.\n // For a full state machine chart, see\n // Forward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/ForwardDeleteWord.png\n // Backward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/BackwardDeleteWord.png\n switch (state) {\n case DeleteWordState.Start:\n state = space\n ? DeleteWordState.Space\n : punctuation\n ? DeleteWordState.Punctuation\n : DeleteWordState.Text;\n curr = iterator.next(true /*delete*/);\n break;\n\n case DeleteWordState.Punctuation:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.Text:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (text) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.NonText:\n if (punctuation || !space) {\n state = DeleteWordState.End;\n } else {\n curr = iterator.next(true /*delete*/);\n }\n break;\n\n case DeleteWordState.Space:\n if (space) {\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n state = deleteNext ? DeleteWordState.NonText : DeleteWordState.Punctuation;\n curr = iterator.next(true /*delete*/);\n } else {\n state = deleteNext ? DeleteWordState.End : DeleteWordState.Text;\n }\n break;\n }\n }\n };\n}\n\nfunction* iterateSegments(\n paragraph: ContentModelParagraph,\n markerIndex: number,\n forward: boolean,\n context: DeleteSelectionContext\n): Generator<CharInfo, null, boolean> {\n const step = forward ? 1 : -1;\n const segments = paragraph.segments;\n const preserveWhiteSpace = isWhiteSpacePreserved(paragraph);\n\n for (let i = markerIndex + step; i >= 0 && i < segments.length; i += step) {\n const segment = segments[i];\n\n switch (segment.segmentType) {\n case 'Text':\n for (\n let j = forward ? 0 : segment.text.length - 1;\n j >= 0 && j < segment.text.length;\n j += step\n ) {\n const c = segment.text[j];\n const punctuation = isPunctuation(c);\n const space = isSpace(c);\n const text = !punctuation && !space;\n\n if (yield { punctuation, space, text }) {\n let newText = segment.text;\n\n newText = newText.substring(0, j) + newText.substring(j + 1);\n\n if (!preserveWhiteSpace) {\n newText = normalizeText(newText, forward);\n }\n\n context.deleteResult = 'range';\n\n if (newText) {\n segment.text = newText;\n\n if (step > 0) {\n j -= step;\n }\n } else {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n break;\n }\n }\n }\n break;\n\n case 'Image':\n if (\n yield { punctuation: true, space: false, text: false } // Treat image as punctuation since they have the same behavior.\n ) {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n context.deleteResult = 'range';\n }\n break;\n\n case 'SelectionMarker':\n break;\n\n default:\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n */\nexport const forwardDeleteWordSelection = getDeleteWordSelection('forward');\n\n/**\n * @internal\n */\nexport const backwardDeleteWordSelection = getDeleteWordSelection('backward');\n"]}
|
|
1
|
+
{"version":3,"file":"deleteWordSelection.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteWordSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPunctuation, isSpace, normalizeText } from 'roosterjs-content-model-core';\nimport { isWhiteSpacePreserved } from 'roosterjs-content-model-dom';\nimport type {\n ContentModelParagraph,\n DeleteSelectionContext,\n DeleteSelectionStep,\n} from 'roosterjs-content-model-types';\n\nconst enum DeleteWordState {\n Start,\n Punctuation,\n Text,\n NonText,\n Space,\n End,\n}\n\ninterface CharInfo {\n text: boolean;\n space: boolean;\n punctuation: boolean;\n}\n\nfunction getDeleteWordSelection(direction: 'forward' | 'backward'): DeleteSelectionStep {\n return context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { marker, paragraph } = context.insertPoint;\n const startIndex = paragraph.segments.indexOf(marker);\n const deleteNext = direction == 'forward';\n\n const iterator = iterateSegments(paragraph, startIndex, deleteNext, context);\n let curr = iterator.next();\n\n for (let state = DeleteWordState.Start; state != DeleteWordState.End && !curr.done; ) {\n const { punctuation, space, text } = curr.value;\n\n // This is a state machine of how to delete a whole word together with space and punctuations.\n // For a full state machine chart, see\n // Forward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/ForwardDeleteWord.png\n // Backward delete: https://github.com/microsoft/roosterjs/blob/master/assets/design-charts/BackwardDeleteWord.png\n switch (state) {\n case DeleteWordState.Start:\n state = space\n ? DeleteWordState.Space\n : punctuation\n ? DeleteWordState.Punctuation\n : DeleteWordState.Text;\n curr = iterator.next(true /*delete*/);\n break;\n\n case DeleteWordState.Punctuation:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.Text:\n if (deleteNext && space) {\n state = DeleteWordState.NonText;\n curr = iterator.next(true /*delete*/);\n } else if (text) {\n curr = iterator.next(true /*delete*/);\n } else {\n state = DeleteWordState.End;\n }\n break;\n\n case DeleteWordState.NonText:\n if (punctuation || !space) {\n state = DeleteWordState.End;\n } else {\n curr = iterator.next(true /*delete*/);\n }\n break;\n\n case DeleteWordState.Space:\n if (space) {\n curr = iterator.next(true /*delete*/);\n } else if (punctuation) {\n state = deleteNext ? DeleteWordState.NonText : DeleteWordState.Punctuation;\n curr = iterator.next(true /*delete*/);\n } else {\n state = deleteNext ? DeleteWordState.End : DeleteWordState.Text;\n }\n break;\n }\n }\n };\n}\n\nfunction* iterateSegments(\n paragraph: ContentModelParagraph,\n markerIndex: number,\n forward: boolean,\n context: DeleteSelectionContext\n): Generator<CharInfo, null, boolean> {\n const step = forward ? 1 : -1;\n const segments = paragraph.segments;\n const preserveWhiteSpace = isWhiteSpacePreserved(paragraph.format.whiteSpace);\n\n for (let i = markerIndex + step; i >= 0 && i < segments.length; i += step) {\n const segment = segments[i];\n\n switch (segment.segmentType) {\n case 'Text':\n for (\n let j = forward ? 0 : segment.text.length - 1;\n j >= 0 && j < segment.text.length;\n j += step\n ) {\n const c = segment.text[j];\n const punctuation = isPunctuation(c);\n const space = isSpace(c);\n const text = !punctuation && !space;\n\n if (yield { punctuation, space, text }) {\n let newText = segment.text;\n\n newText = newText.substring(0, j) + newText.substring(j + 1);\n\n if (!preserveWhiteSpace) {\n newText = normalizeText(newText, forward);\n }\n\n context.deleteResult = 'range';\n\n if (newText) {\n segment.text = newText;\n\n if (step > 0) {\n j -= step;\n }\n } else {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n break;\n }\n }\n }\n break;\n\n case 'Image':\n if (\n yield { punctuation: true, space: false, text: false } // Treat image as punctuation since they have the same behavior.\n ) {\n segments.splice(i, 1);\n\n if (step > 0) {\n i -= step;\n }\n\n context.deleteResult = 'range';\n }\n break;\n\n case 'SelectionMarker':\n break;\n\n default:\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * @internal\n */\nexport const forwardDeleteWordSelection = getDeleteWordSelection('forward');\n\n/**\n * @internal\n */\nexport const backwardDeleteWordSelection = getDeleteWordSelection('backward');\n"]}
|
|
@@ -8,7 +8,7 @@ var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
|
|
|
8
8
|
*/
|
|
9
9
|
function keyboardInput(editor, rawEvent) {
|
|
10
10
|
var selection = editor.getDOMSelection();
|
|
11
|
-
if (shouldInputWithContentModel(selection, rawEvent)) {
|
|
11
|
+
if (shouldInputWithContentModel(selection, rawEvent, editor.isInIME())) {
|
|
12
12
|
editor.takeSnapshot();
|
|
13
13
|
editor.formatContentModel(function (model, context) {
|
|
14
14
|
var _a;
|
|
@@ -35,13 +35,14 @@ function keyboardInput(editor, rawEvent) {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
exports.keyboardInput = keyboardInput;
|
|
38
|
-
function shouldInputWithContentModel(selection, rawEvent) {
|
|
38
|
+
function shouldInputWithContentModel(selection, rawEvent, isInIME) {
|
|
39
39
|
if (!selection) {
|
|
40
40
|
return false; // Nothing to delete
|
|
41
41
|
}
|
|
42
42
|
else if (!(0, roosterjs_content_model_core_1.isModifierKey)(rawEvent) &&
|
|
43
43
|
(rawEvent.key == 'Enter' || rawEvent.key == 'Space' || rawEvent.key.length == 1)) {
|
|
44
|
-
return selection.type != 'range' ||
|
|
44
|
+
return (selection.type != 'range' ||
|
|
45
|
+
(!selection.range.collapsed && !rawEvent.isComposing && !isInIME)); // TODO: Also handle Enter key even selection is collapsed
|
|
45
46
|
}
|
|
46
47
|
else {
|
|
47
48
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboardInput.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-plugins/lib/edit/keyboardInput.ts"],"names":[],"mappings":";;;AAAA,6EAA8E;AAC9E,2EAAoE;AAIpE;;GAEG;AACH,SAAgB,aAAa,CAAC,MAA2B,EAAE,QAAuB;IAC9E,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IAE3C,IAAI,2BAA2B,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"keyboardInput.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-plugins/lib/edit/keyboardInput.ts"],"names":[],"mappings":";;;AAAA,6EAA8E;AAC9E,2EAAoE;AAIpE;;GAEG;AACH,SAAgB,aAAa,CAAC,MAA2B,EAAE,QAAuB;IAC9E,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IAE3C,IAAI,2BAA2B,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE;QACpE,MAAM,CAAC,YAAY,EAAE,CAAC;QAEtB,MAAM,CAAC,kBAAkB,CACrB,UAAC,KAAK,EAAE,OAAO;;YACX,IAAM,MAAM,GAAG,IAAA,8CAAe,EAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAEnD,0EAA0E;YAC1E,qFAAqF;YACrF,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YAE/B,oJAAoJ;YACpJ,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAEhC,IAAI,MAAM,CAAC,YAAY,IAAI,OAAO,EAAE;gBAChC,2HAA2H;gBAC3H,OAAO,CAAC,gBAAgB,GAAG,MAAA,MAAM,CAAC,WAAW,0CAAE,MAAM,CAAC,MAAM,CAAC;gBAE7D,IAAA,mDAAqB,EAAC,KAAK,CAAC,CAAC;gBAE7B,sFAAsF;gBACtF,OAAO,IAAI,CAAC;aACf;iBAAM;gBACH,OAAO,KAAK,CAAC;aAChB;QACL,CAAC,EACD;YACI,QAAQ,UAAA;SACX,CACJ,CAAC;QAEF,OAAO,IAAI,CAAC;KACf;AACL,CAAC;AApCD,sCAoCC;AAED,SAAS,2BAA2B,CAChC,SAA8B,EAC9B,QAAuB,EACvB,OAAgB;IAEhB,IAAI,CAAC,SAAS,EAAE;QACZ,OAAO,KAAK,CAAC,CAAC,oBAAoB;KACrC;SAAM,IACH,CAAC,IAAA,4CAAa,EAAC,QAAQ,CAAC;QACxB,CAAC,QAAQ,CAAC,GAAG,IAAI,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,EAClF;QACE,OAAO,CACH,SAAS,CAAC,IAAI,IAAI,OAAO;YACzB,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,CACpE,CAAC,CAAC,0DAA0D;KAChE;SAAM;QACH,OAAO,KAAK,CAAC;KAChB;AACL,CAAC","sourcesContent":["import { deleteSelection, isModifierKey } from 'roosterjs-content-model-core';\nimport { normalizeContentModel } from 'roosterjs-content-model-dom';\nimport type { IContentModelEditor } from 'roosterjs-content-model-editor';\nimport type { DOMSelection } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function keyboardInput(editor: IContentModelEditor, rawEvent: KeyboardEvent) {\n const selection = editor.getDOMSelection();\n\n if (shouldInputWithContentModel(selection, rawEvent, editor.isInIME())) {\n editor.takeSnapshot();\n\n editor.formatContentModel(\n (model, context) => {\n const result = deleteSelection(model, [], context);\n\n // We have deleted selection then we will let browser to handle the input.\n // With this combined operation, we don't wan to mass up the cached model so clear it\n context.clearModelCache = true;\n\n // Skip undo snapshot here and add undo snapshot before the operation so that we don't add another undo snapshot in middle of this replace operation\n context.skipUndoSnapshot = true;\n\n if (result.deleteResult == 'range') {\n // We have deleted something, next input should inherit the segment format from deleted content, so set pending format here\n context.newPendingFormat = result.insertPoint?.marker.format;\n\n normalizeContentModel(model);\n\n // Do not preventDefault since we still want browser to handle the final input for now\n return true;\n } else {\n return false;\n }\n },\n {\n rawEvent,\n }\n );\n\n return true;\n }\n}\n\nfunction shouldInputWithContentModel(\n selection: DOMSelection | null,\n rawEvent: KeyboardEvent,\n isInIME: boolean\n) {\n if (!selection) {\n return false; // Nothing to delete\n } else if (\n !isModifierKey(rawEvent) &&\n (rawEvent.key == 'Enter' || rawEvent.key == 'Space' || rawEvent.key.length == 1)\n ) {\n return (\n selection.type != 'range' ||\n (!selection.range.collapsed && !rawEvent.isComposing && !isInIME)\n ); // TODO: Also handle Enter key even selection is collapsed\n } else {\n return false;\n }\n}\n"]}
|
|
@@ -8,7 +8,6 @@ import type { EditorPlugin, IEditor, PluginEvent } from 'roosterjs-editor-types'
|
|
|
8
8
|
* (This class is still under development, and may still be changed in the future with some breaking changes)
|
|
9
9
|
*/
|
|
10
10
|
export declare class ContentModelPastePlugin implements EditorPlugin {
|
|
11
|
-
private unknownTagReplacement;
|
|
12
11
|
private allowExcelNoBorderTable?;
|
|
13
12
|
private editor;
|
|
14
13
|
/**
|
|
@@ -16,7 +15,7 @@ export declare class ContentModelPastePlugin implements EditorPlugin {
|
|
|
16
15
|
* @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN
|
|
17
16
|
* @param allowExcelNoBorderTable Allow table copied from Excel without border
|
|
18
17
|
*/
|
|
19
|
-
constructor(
|
|
18
|
+
constructor(allowExcelNoBorderTable?: boolean | undefined);
|
|
20
19
|
/**
|
|
21
20
|
* Get name of this plugin
|
|
22
21
|
*/
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.ContentModelPastePlugin = void 0;
|
|
5
5
|
var addParser_1 = require("./utils/addParser");
|
|
6
6
|
var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
|
|
7
|
-
var roosterjs_editor_dom_1 = require("roosterjs-editor-dom");
|
|
8
7
|
var deprecatedColorParser_1 = require("./utils/deprecatedColorParser");
|
|
9
8
|
var getPasteSource_1 = require("./pasteSourceValidations/getPasteSource");
|
|
10
9
|
var linkParser_1 = require("./utils/linkParser");
|
|
@@ -34,9 +33,7 @@ var ContentModelPastePlugin = /** @class */ (function () {
|
|
|
34
33
|
* @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN
|
|
35
34
|
* @param allowExcelNoBorderTable Allow table copied from Excel without border
|
|
36
35
|
*/
|
|
37
|
-
function ContentModelPastePlugin(
|
|
38
|
-
if (unknownTagReplacement === void 0) { unknownTagReplacement = 'SPAN'; }
|
|
39
|
-
this.unknownTagReplacement = unknownTagReplacement;
|
|
36
|
+
function ContentModelPastePlugin(allowExcelNoBorderTable) {
|
|
40
37
|
this.allowExcelNoBorderTable = allowExcelNoBorderTable;
|
|
41
38
|
this.editor = null;
|
|
42
39
|
}
|
|
@@ -95,7 +92,7 @@ var ContentModelPastePlugin = /** @class */ (function () {
|
|
|
95
92
|
}
|
|
96
93
|
break;
|
|
97
94
|
case 'googleSheets':
|
|
98
|
-
ev.
|
|
95
|
+
ev.domToModelOption.additionalAllowedTags.push("google-sheets-html-origin" /* GOOGLE_SHEET_NODE_NAME */);
|
|
99
96
|
break;
|
|
100
97
|
case 'powerPointDesktop':
|
|
101
98
|
(0, processPastedContentFromPowerPoint_1.processPastedContentFromPowerPoint)(ev, this.editor.getTrustedHTMLHandler());
|
|
@@ -105,12 +102,10 @@ var ContentModelPastePlugin = /** @class */ (function () {
|
|
|
105
102
|
(0, addParser_1.default)(ev.domToModelOption, 'tableCell', deprecatedColorParser_1.deprecatedBorderColorParser);
|
|
106
103
|
(0, addParser_1.default)(ev.domToModelOption, 'tableCell', tableBorderParser);
|
|
107
104
|
(0, addParser_1.default)(ev.domToModelOption, 'table', deprecatedColorParser_1.deprecatedBorderColorParser);
|
|
108
|
-
sanitizeBlockStyles(ev.sanitizingOption);
|
|
109
105
|
if (pasteType === 'mergeFormat') {
|
|
110
106
|
(0, addParser_1.default)(ev.domToModelOption, 'block', blockElementParser);
|
|
111
107
|
(0, addParser_1.default)(ev.domToModelOption, 'listLevel', blockElementParser);
|
|
112
108
|
}
|
|
113
|
-
ev.sanitizingOption.unknownTagReplacement = this.unknownTagReplacement;
|
|
114
109
|
};
|
|
115
110
|
return ContentModelPastePlugin;
|
|
116
111
|
}());
|
|
@@ -124,11 +119,6 @@ var blockElementParser = function (format, element) {
|
|
|
124
119
|
delete format.backgroundColor;
|
|
125
120
|
}
|
|
126
121
|
};
|
|
127
|
-
function sanitizeBlockStyles(sanitizingOption) {
|
|
128
|
-
(0, roosterjs_editor_dom_1.chainSanitizerCallback)(sanitizingOption.cssStyleCallbacks, 'display', function (value) {
|
|
129
|
-
return value != 'flex'; // return whether we keep the style
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
122
|
var ElementBorderKeys = new Map([
|
|
133
123
|
['borderTop', { w: 'borderTopWidth', s: 'borderTopStyle', c: 'borderTopColor' }],
|
|
134
124
|
['borderRight', { w: 'borderRightWidth', s: 'borderRightStyle', c: 'borderRightColor' }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentModelPastePlugin.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/ContentModelPastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import addParser from './utils/addParser';\nimport { BorderKeys } from 'roosterjs-content-model-dom';\nimport { chainSanitizerCallback } from 'roosterjs-editor-dom';\nimport { deprecatedBorderColorParser } from './utils/deprecatedColorParser';\nimport { getPasteSource } from './pasteSourceValidations/getPasteSource';\nimport { parseLink } from './utils/linkParser';\nimport { PastePropertyNames } from './pasteSourceValidations/constants';\nimport { PasteType as OldPasteType, PluginEventType } from 'roosterjs-editor-types';\nimport { processPastedContentFromExcel } from './Excel/processPastedContentFromExcel';\nimport { processPastedContentFromPowerPoint } from './PowerPoint/processPastedContentFromPowerPoint';\nimport { processPastedContentFromWordDesktop } from './WordDesktop/processPastedContentFromWordDesktop';\nimport { processPastedContentWacComponents } from './WacComponents/processPastedContentWacComponents';\nimport type { IContentModelEditor } from 'roosterjs-content-model-editor';\nimport type {\n BorderFormat,\n ContentModelBeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelTableCellFormat,\n FormatParser,\n PasteType,\n} from 'roosterjs-content-model-types';\nimport type {\n EditorPlugin,\n HtmlSanitizerOptions,\n IEditor,\n PluginEvent,\n} from 'roosterjs-editor-types';\n\n// Map old PasteType to new PasteType\n// TODO: We can remove this once we have standalone editor\nconst PasteTypeMap: Record<OldPasteType, PasteType> = {\n [OldPasteType.AsImage]: 'asImage',\n [OldPasteType.AsPlainText]: 'asPlainText',\n [OldPasteType.MergeFormat]: 'mergeFormat',\n [OldPasteType.Normal]: 'normal',\n};\n\n/**\n * Paste plugin, handles BeforePaste event and reformat some special content, including:\n * 1. Content copied from Word\n * 2. Content copied from Excel\n * 3. Content copied from Word Online or OneNote Online\n * 4. Content copied from Power Point\n * (This class is still under development, and may still be changed in the future with some breaking changes)\n */\nexport class ContentModelPastePlugin implements EditorPlugin {\n private editor: IContentModelEditor | null = null;\n\n /**\n * Construct a new instance of Paste class\n * @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN\n * @param allowExcelNoBorderTable Allow table copied from Excel without border\n */\n constructor(\n private unknownTagReplacement: string = 'SPAN',\n private allowExcelNoBorderTable?: boolean\n ) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'ContentModelPaste';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n // TODO: Later we may need a different interface for Content Model editor plugin\n this.editor = editor as IContentModelEditor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor || event.eventType != PluginEventType.BeforePaste) {\n return;\n }\n\n const ev = event as ContentModelBeforePasteEvent;\n\n if (!ev.domToModelOption) {\n return;\n }\n\n const pasteSource = getPasteSource(ev, false);\n const pasteType = PasteTypeMap[ev.pasteType];\n\n switch (pasteSource) {\n case 'wordDesktop':\n processPastedContentFromWordDesktop(ev, this.editor.getTrustedHTMLHandler());\n break;\n case 'wacComponents':\n processPastedContentWacComponents(ev);\n break;\n case 'excelOnline':\n case 'excelDesktop':\n if (pasteType === 'normal' || pasteType === 'mergeFormat') {\n // Handle HTML copied from Excel\n processPastedContentFromExcel(\n ev,\n this.editor.getTrustedHTMLHandler(),\n this.allowExcelNoBorderTable\n );\n }\n break;\n case 'googleSheets':\n ev.sanitizingOption.additionalTagReplacements[\n PastePropertyNames.GOOGLE_SHEET_NODE_NAME\n ] = '*';\n break;\n case 'powerPointDesktop':\n processPastedContentFromPowerPoint(ev, this.editor.getTrustedHTMLHandler());\n break;\n }\n\n addParser(ev.domToModelOption, 'link', parseLink);\n addParser(ev.domToModelOption, 'tableCell', deprecatedBorderColorParser);\n addParser(ev.domToModelOption, 'tableCell', tableBorderParser);\n addParser(ev.domToModelOption, 'table', deprecatedBorderColorParser);\n sanitizeBlockStyles(ev.sanitizingOption);\n\n if (pasteType === 'mergeFormat') {\n addParser(ev.domToModelOption, 'block', blockElementParser);\n addParser(ev.domToModelOption, 'listLevel', blockElementParser);\n }\n\n ev.sanitizingOption.unknownTagReplacement = this.unknownTagReplacement;\n }\n}\n\n/**\n * For block elements that have background color style, remove the background color when user selects the merge current format\n * paste option\n */\nconst blockElementParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.backgroundColor) {\n delete format.backgroundColor;\n }\n};\n\nfunction sanitizeBlockStyles(sanitizingOption: Required<HtmlSanitizerOptions>) {\n chainSanitizerCallback(sanitizingOption.cssStyleCallbacks, 'display', (value: string) => {\n return value != 'flex'; // return whether we keep the style\n });\n}\n\nconst ElementBorderKeys = new Map<\n keyof BorderFormat,\n {\n c: keyof CSSStyleDeclaration;\n s: keyof CSSStyleDeclaration;\n w: keyof CSSStyleDeclaration;\n }\n>([\n ['borderTop', { w: 'borderTopWidth', s: 'borderTopStyle', c: 'borderTopColor' }],\n ['borderRight', { w: 'borderRightWidth', s: 'borderRightStyle', c: 'borderRightColor' }],\n ['borderBottom', { w: 'borderBottomWidth', s: 'borderBottomStyle', c: 'borderBottomColor' }],\n ['borderLeft', { w: 'borderLeftWidth', s: 'borderLeftStyle', c: 'borderLeftColor' }],\n]);\n\nfunction tableBorderParser(format: ContentModelTableCellFormat, element: HTMLElement): void {\n BorderKeys.forEach(key => {\n if (!format[key]) {\n const styleSet = ElementBorderKeys.get(key);\n if (\n styleSet &&\n element.style[styleSet.w] &&\n element.style[styleSet.s] &&\n !element.style[styleSet.c]\n ) {\n format[key] = `${element.style[styleSet.w]} ${element.style[styleSet.s]}`;\n }\n }\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ContentModelPastePlugin.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/ContentModelPastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import addParser from './utils/addParser';\nimport { BorderKeys } from 'roosterjs-content-model-dom';\nimport { deprecatedBorderColorParser } from './utils/deprecatedColorParser';\nimport { getPasteSource } from './pasteSourceValidations/getPasteSource';\nimport { parseLink } from './utils/linkParser';\nimport { PastePropertyNames } from './pasteSourceValidations/constants';\nimport { PasteType as OldPasteType, PluginEventType } from 'roosterjs-editor-types';\nimport { processPastedContentFromExcel } from './Excel/processPastedContentFromExcel';\nimport { processPastedContentFromPowerPoint } from './PowerPoint/processPastedContentFromPowerPoint';\nimport { processPastedContentFromWordDesktop } from './WordDesktop/processPastedContentFromWordDesktop';\nimport { processPastedContentWacComponents } from './WacComponents/processPastedContentWacComponents';\nimport type { IContentModelEditor } from 'roosterjs-content-model-editor';\nimport type {\n BorderFormat,\n ContentModelBeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelTableCellFormat,\n FormatParser,\n PasteType,\n} from 'roosterjs-content-model-types';\nimport type { EditorPlugin, IEditor, PluginEvent } from 'roosterjs-editor-types';\n\n// Map old PasteType to new PasteType\n// TODO: We can remove this once we have standalone editor\nconst PasteTypeMap: Record<OldPasteType, PasteType> = {\n [OldPasteType.AsImage]: 'asImage',\n [OldPasteType.AsPlainText]: 'asPlainText',\n [OldPasteType.MergeFormat]: 'mergeFormat',\n [OldPasteType.Normal]: 'normal',\n};\n\n/**\n * Paste plugin, handles BeforePaste event and reformat some special content, including:\n * 1. Content copied from Word\n * 2. Content copied from Excel\n * 3. Content copied from Word Online or OneNote Online\n * 4. Content copied from Power Point\n * (This class is still under development, and may still be changed in the future with some breaking changes)\n */\nexport class ContentModelPastePlugin implements EditorPlugin {\n private editor: IContentModelEditor | null = null;\n\n /**\n * Construct a new instance of Paste class\n * @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN\n * @param allowExcelNoBorderTable Allow table copied from Excel without border\n */\n constructor(private allowExcelNoBorderTable?: boolean) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'ContentModelPaste';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n // TODO: Later we may need a different interface for Content Model editor plugin\n this.editor = editor as IContentModelEditor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor || event.eventType != PluginEventType.BeforePaste) {\n return;\n }\n\n const ev = event as ContentModelBeforePasteEvent;\n\n if (!ev.domToModelOption) {\n return;\n }\n\n const pasteSource = getPasteSource(ev, false);\n const pasteType = PasteTypeMap[ev.pasteType];\n\n switch (pasteSource) {\n case 'wordDesktop':\n processPastedContentFromWordDesktop(ev, this.editor.getTrustedHTMLHandler());\n break;\n case 'wacComponents':\n processPastedContentWacComponents(ev);\n break;\n case 'excelOnline':\n case 'excelDesktop':\n if (pasteType === 'normal' || pasteType === 'mergeFormat') {\n // Handle HTML copied from Excel\n processPastedContentFromExcel(\n ev,\n this.editor.getTrustedHTMLHandler(),\n this.allowExcelNoBorderTable\n );\n }\n break;\n case 'googleSheets':\n ev.domToModelOption.additionalAllowedTags.push(\n PastePropertyNames.GOOGLE_SHEET_NODE_NAME\n );\n break;\n case 'powerPointDesktop':\n processPastedContentFromPowerPoint(ev, this.editor.getTrustedHTMLHandler());\n break;\n }\n\n addParser(ev.domToModelOption, 'link', parseLink);\n addParser(ev.domToModelOption, 'tableCell', deprecatedBorderColorParser);\n addParser(ev.domToModelOption, 'tableCell', tableBorderParser);\n addParser(ev.domToModelOption, 'table', deprecatedBorderColorParser);\n\n if (pasteType === 'mergeFormat') {\n addParser(ev.domToModelOption, 'block', blockElementParser);\n addParser(ev.domToModelOption, 'listLevel', blockElementParser);\n }\n }\n}\n\n/**\n * For block elements that have background color style, remove the background color when user selects the merge current format\n * paste option\n */\nconst blockElementParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.backgroundColor) {\n delete format.backgroundColor;\n }\n};\n\nconst ElementBorderKeys = new Map<\n keyof BorderFormat,\n {\n c: keyof CSSStyleDeclaration;\n s: keyof CSSStyleDeclaration;\n w: keyof CSSStyleDeclaration;\n }\n>([\n ['borderTop', { w: 'borderTopWidth', s: 'borderTopStyle', c: 'borderTopColor' }],\n ['borderRight', { w: 'borderRightWidth', s: 'borderRightStyle', c: 'borderRightColor' }],\n ['borderBottom', { w: 'borderBottomWidth', s: 'borderBottomStyle', c: 'borderBottomColor' }],\n ['borderLeft', { w: 'borderLeftWidth', s: 'borderLeftStyle', c: 'borderLeftColor' }],\n]);\n\nfunction tableBorderParser(format: ContentModelTableCellFormat, element: HTMLElement): void {\n BorderKeys.forEach(key => {\n if (!format[key]) {\n const styleSet = ElementBorderKeys.get(key);\n if (\n styleSet &&\n element.style[styleSet.w] &&\n element.style[styleSet.s] &&\n !element.style[styleSet.c]\n ) {\n format[key] = `${element.style[styleSet.w]} ${element.style[styleSet.s]}`;\n }\n }\n });\n}\n"]}
|
|
@@ -30,10 +30,6 @@ export declare const PARAGRAPH: string;
|
|
|
30
30
|
* @internal
|
|
31
31
|
**/
|
|
32
32
|
export declare const LIST_CONTAINER_ELEMENT_CLASS_NAME: string;
|
|
33
|
-
/**
|
|
34
|
-
* @internal
|
|
35
|
-
**/
|
|
36
|
-
export declare const TABLE_CONTAINER: string;
|
|
37
33
|
/**
|
|
38
34
|
* @internal
|
|
39
35
|
**/
|
|
@@ -50,7 +46,3 @@ export declare const TEMP_ELEMENTS_CLASSES: string[];
|
|
|
50
46
|
* @internal
|
|
51
47
|
**/
|
|
52
48
|
export declare const WAC_IDENTIFY_SELECTOR: string;
|
|
53
|
-
/**
|
|
54
|
-
* @internal
|
|
55
|
-
**/
|
|
56
|
-
export declare const CLASSES_TO_KEEP: string[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.WAC_IDENTIFY_SELECTOR = exports.TEMP_ELEMENTS_CLASSES = exports.COMMENT_HIGHLIGHT_CLICKED_CLASS = exports.COMMENT_HIGHLIGHT_CLASS = exports.LIST_CONTAINER_ELEMENT_CLASS_NAME = exports.PARAGRAPH = exports.OUTLINE_ELEMENT = exports.IMAGE_CONTAINER = exports.IMAGE_BORDER = exports.NUMBER_LIST_STYLE = exports.BULLET_LIST_STYLE = exports.WORD_ONLINE_TABLE_TEMP_ELEMENT_CLASSES = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
/**
|
|
6
6
|
* @internal
|
|
@@ -41,10 +41,6 @@ exports.PARAGRAPH = 'Paragraph';
|
|
|
41
41
|
* @internal
|
|
42
42
|
**/
|
|
43
43
|
exports.LIST_CONTAINER_ELEMENT_CLASS_NAME = 'ListContainerWrapper';
|
|
44
|
-
/**
|
|
45
|
-
* @internal
|
|
46
|
-
**/
|
|
47
|
-
exports.TABLE_CONTAINER = 'TableContainer';
|
|
48
44
|
/**
|
|
49
45
|
* @internal
|
|
50
46
|
**/
|
|
@@ -64,23 +60,4 @@ exports.TEMP_ELEMENTS_CLASSES = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadA
|
|
|
64
60
|
**/
|
|
65
61
|
exports.WAC_IDENTIFY_SELECTOR = "ul[class^=\"" + exports.BULLET_LIST_STYLE + "\"]>." + exports.OUTLINE_ELEMENT + ",ol[class^=\"" + exports.NUMBER_LIST_STYLE + "\"]>." + exports.OUTLINE_ELEMENT + ",span." + exports.IMAGE_CONTAINER + ",span." + exports.IMAGE_BORDER + ",." + exports.COMMENT_HIGHLIGHT_CLASS + ",." + exports.COMMENT_HIGHLIGHT_CLICKED_CLASS + "," +
|
|
66
62
|
exports.WORD_ONLINE_TABLE_TEMP_ELEMENT_CLASSES.map(function (c) { return "table div[class^=\"" + c + "\"]"; }).join(',');
|
|
67
|
-
/**
|
|
68
|
-
* @internal
|
|
69
|
-
**/
|
|
70
|
-
exports.CLASSES_TO_KEEP = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([
|
|
71
|
-
exports.OUTLINE_ELEMENT,
|
|
72
|
-
exports.IMAGE_CONTAINER
|
|
73
|
-
], (0, tslib_1.__read)(exports.TEMP_ELEMENTS_CLASSES), false), [
|
|
74
|
-
exports.PARAGRAPH,
|
|
75
|
-
exports.IMAGE_BORDER,
|
|
76
|
-
exports.TABLE_CONTAINER,
|
|
77
|
-
exports.COMMENT_HIGHLIGHT_CLASS,
|
|
78
|
-
exports.COMMENT_HIGHLIGHT_CLICKED_CLASS,
|
|
79
|
-
'NumberListStyle',
|
|
80
|
-
'ListContainerWrapper',
|
|
81
|
-
'BulletListStyle',
|
|
82
|
-
'TableCellContent',
|
|
83
|
-
'WACImageContainer',
|
|
84
|
-
'LineBreakBlob',
|
|
85
|
-
], false);
|
|
86
63
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WacComponents/constants.ts"],"names":[],"mappings":";;;;AAAA;;IAEI;AACS,QAAA,sCAAsC,GAAa;IAC5D,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;IAC1B,2BAA2B;IAC3B,wBAAwB;IACxB,qBAAqB;CACxB,CAAC;AACF;;IAEI;AACS,QAAA,iBAAiB,GAAW,iBAAiB,CAAC;AAC3D;;IAEI;AACS,QAAA,iBAAiB,GAAW,iBAAiB,CAAC;AAC3D;;IAEI;AACS,QAAA,YAAY,GAAW,gBAAgB,CAAC;AACrD;;IAEI;AACS,QAAA,eAAe,GAAW,mBAAmB,CAAC;AAC3D;;IAEI;AACS,QAAA,eAAe,GAAW,gBAAgB,CAAC;AACxD;;IAEI;AACS,QAAA,SAAS,GAAW,WAAW,CAAC;AAC7C;;IAEI;AACS,QAAA,iCAAiC,GAAW,sBAAsB,CAAC;AAChF;;IAEI;AACS,QAAA,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WacComponents/constants.ts"],"names":[],"mappings":";;;;AAAA;;IAEI;AACS,QAAA,sCAAsC,GAAa;IAC5D,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;IAC1B,2BAA2B;IAC3B,wBAAwB;IACxB,qBAAqB;CACxB,CAAC;AACF;;IAEI;AACS,QAAA,iBAAiB,GAAW,iBAAiB,CAAC;AAC3D;;IAEI;AACS,QAAA,iBAAiB,GAAW,iBAAiB,CAAC;AAC3D;;IAEI;AACS,QAAA,YAAY,GAAW,gBAAgB,CAAC;AACrD;;IAEI;AACS,QAAA,eAAe,GAAW,mBAAmB,CAAC;AAC3D;;IAEI;AACS,QAAA,eAAe,GAAW,gBAAgB,CAAC;AACxD;;IAEI;AACS,QAAA,SAAS,GAAW,WAAW,CAAC;AAC7C;;IAEI;AACS,QAAA,iCAAiC,GAAW,sBAAsB,CAAC;AAChF;;IAEI;AACS,QAAA,uBAAuB,GAAW,sBAAsB,CAAC;AACtE;;IAEI;AACS,QAAA,+BAA+B,GAAW,yBAAyB,CAAC;AACjF;;IAEI;AACS,QAAA,qBAAqB,iFAC3B,8CAAsC;IACzC,wBAAwB;UAC1B;AACF;;IAEI;AACS,QAAA,qBAAqB,GAC9B,iBAAc,yBAAiB,aAAO,uBAAe,qBAAe,yBAAiB,aAAO,uBAAe,cAAS,uBAAe,cAAS,oBAAY,UAAK,+BAAuB,UAAK,uCAA+B,MAAG;IAC3N,8CAAsC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,wBAAqB,CAAC,QAAI,EAA1B,CAA0B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC","sourcesContent":["/**\n * @internal\n **/\nexport const WORD_ONLINE_TABLE_TEMP_ELEMENT_CLASSES: string[] = [\n 'TableInsertRowGapBlank',\n 'TableColumnResizeHandle',\n 'TableCellTopBorderHandle',\n 'TableCellLeftBorderHandle',\n 'TableHoverColumnHandle',\n 'TableHoverRowHandle',\n];\n/**\n * @internal\n **/\nexport const BULLET_LIST_STYLE: string = 'BulletListStyle';\n/**\n * @internal\n **/\nexport const NUMBER_LIST_STYLE: string = 'NumberListStyle';\n/**\n * @internal\n **/\nexport const IMAGE_BORDER: string = 'WACImageBorder';\n/**\n * @internal\n **/\nexport const IMAGE_CONTAINER: string = 'WACImageContainer';\n/**\n * @internal\n **/\nexport const OUTLINE_ELEMENT: string = 'OutlineElement';\n/**\n * @internal\n **/\nexport const PARAGRAPH: string = 'Paragraph';\n/**\n * @internal\n **/\nexport const LIST_CONTAINER_ELEMENT_CLASS_NAME: string = 'ListContainerWrapper';\n/**\n * @internal\n **/\nexport const COMMENT_HIGHLIGHT_CLASS: string = 'CommentHighlightRest';\n/**\n * @internal\n **/\nexport const COMMENT_HIGHLIGHT_CLICKED_CLASS: string = 'CommentHighlightClicked';\n/**\n * @internal\n **/\nexport const TEMP_ELEMENTS_CLASSES: string[] = [\n ...WORD_ONLINE_TABLE_TEMP_ELEMENT_CLASSES,\n 'ListMarkerWrappingSpan',\n];\n/**\n * @internal\n **/\nexport const WAC_IDENTIFY_SELECTOR: string =\n `ul[class^=\"${BULLET_LIST_STYLE}\"]>.${OUTLINE_ELEMENT},ol[class^=\"${NUMBER_LIST_STYLE}\"]>.${OUTLINE_ELEMENT},span.${IMAGE_CONTAINER},span.${IMAGE_BORDER},.${COMMENT_HIGHLIGHT_CLASS},.${COMMENT_HIGHLIGHT_CLICKED_CLASS},` +\n WORD_ONLINE_TABLE_TEMP_ELEMENT_CLASSES.map(c => `table div[class^=\"${c}\"]`).join(',');\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.processPastedContentWacComponents = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
4
|
var addParser_1 = require("../utils/addParser");
|
|
6
5
|
var setProcessor_1 = require("../utils/setProcessor");
|
|
7
6
|
var constants_1 = require("./constants");
|
|
@@ -137,17 +136,16 @@ var wacCommentParser = function (format, element) {
|
|
|
137
136
|
* @param ev ContentModelBeforePasteEvent
|
|
138
137
|
*/
|
|
139
138
|
function processPastedContentWacComponents(ev) {
|
|
140
|
-
var _a;
|
|
141
139
|
(0, addParser_1.default)(ev.domToModelOption, 'segment', wacSubSuperParser);
|
|
142
140
|
(0, addParser_1.default)(ev.domToModelOption, 'listItemThread', wacListItemParser);
|
|
143
141
|
(0, addParser_1.default)(ev.domToModelOption, 'listLevel', wacListLevelParser);
|
|
144
|
-
(0, addParser_1.default)(ev.domToModelOption, 'container',
|
|
142
|
+
(0, addParser_1.default)(ev.domToModelOption, 'container', wacContainerParser);
|
|
143
|
+
(0, addParser_1.default)(ev.domToModelOption, 'table', wacContainerParser);
|
|
145
144
|
(0, addParser_1.default)(ev.domToModelOption, 'segment', wacCommentParser);
|
|
146
145
|
(0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wacElementProcessor);
|
|
147
146
|
(0, setProcessor_1.setProcessor)(ev.domToModelOption, 'li', wacLiElementProcessor);
|
|
148
147
|
(0, setProcessor_1.setProcessor)(ev.domToModelOption, 'ol', wacListProcessor);
|
|
149
148
|
(0, setProcessor_1.setProcessor)(ev.domToModelOption, 'ul', wacListProcessor);
|
|
150
|
-
(_a = ev.sanitizingOption.additionalAllowedCssClasses).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(constants_1.CLASSES_TO_KEEP), false));
|
|
151
149
|
}
|
|
152
150
|
exports.processPastedContentWacComponents = processPastedContentWacComponents;
|
|
153
151
|
/**
|
|
@@ -185,8 +183,8 @@ var wacListProcessor = function (group, element, context) {
|
|
|
185
183
|
(_e = (_d = context.defaultElementProcessors).ul) === null || _e === void 0 ? void 0 : _e.call(_d, group, element, context);
|
|
186
184
|
}
|
|
187
185
|
};
|
|
188
|
-
var
|
|
189
|
-
if (element.
|
|
186
|
+
var wacContainerParser = function (format, element) {
|
|
187
|
+
if (element.style.marginLeft.startsWith('-')) {
|
|
190
188
|
delete format.marginLeft;
|
|
191
189
|
}
|
|
192
190
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processPastedContentWacComponents.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WacComponents/processPastedContentWacComponents.ts"],"names":[],"mappings":"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","sourcesContent":["import addParser from '../utils/addParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport {\n CLASSES_TO_KEEP,\n COMMENT_HIGHLIGHT_CLASS,\n COMMENT_HIGHLIGHT_CLICKED_CLASS,\n LIST_CONTAINER_ELEMENT_CLASS_NAME,\n TABLE_CONTAINER,\n TEMP_ELEMENTS_CLASSES,\n WAC_IDENTIFY_SELECTOR,\n} from './constants';\nimport type {\n ContentModelBeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelBlockGroup,\n ContentModelListItemLevelFormat,\n ContentModelSegmentFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst LIST_ELEMENT_TAGS = ['UL', 'OL', 'LI'];\nconst LIST_ELEMENT_SELECTOR = LIST_ELEMENT_TAGS.join(',');\n\nconst COMMENT_BG_COLOR_REST = 'rgba(209, 209, 209, 0.5)';\nconst COMMENTS_TEXT_HIGHLIGHT_CLICKED = 'rgba(197, 139, 204, 0.5)';\n\n/**\n * Wac components do not use sub and super tags, instead only add vertical align to a span.\n * This parser normalize the content for content model\n */\nconst wacSubSuperParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n const verticalAlign = element.style.verticalAlign;\n if (verticalAlign === 'super') {\n format.superOrSubScriptSequence = 'super';\n }\n if (verticalAlign === 'sub') {\n format.superOrSubScriptSequence = 'sub';\n }\n};\n\n/**\n * This processor does:\n * 1) Remove the display and margin of the element.\n * 2) When an element should be ignored but should handle the child elements call the default child processor.\n * 3) Removes the End of Paragraph element to avoid empty lines, we should only remove this if the previous element of the EOP is an EmptyTextRun\n * 4) Finally call the default processor.\n * @returns\n */\nconst wacElementProcessor: ElementProcessor<HTMLElement> = (\n group: ContentModelBlockGroup,\n element: HTMLElement,\n context: DomToModelContext\n): void => {\n const elementTag = element.tagName;\n\n if (element.matches(WAC_IDENTIFY_SELECTOR)) {\n element.style.removeProperty('display');\n element.style.removeProperty('margin');\n }\n\n if (element.classList.contains(LIST_CONTAINER_ELEMENT_CLASS_NAME)) {\n context.elementProcessors.child(group, element, context);\n return;\n }\n\n if (TEMP_ELEMENTS_CLASSES.some(className => element.classList.contains(className))) {\n return;\n } else if (shouldClearListContext(elementTag, element, context)) {\n const { listFormat } = context;\n listFormat.levels = [];\n listFormat.listParent = undefined;\n }\n\n context.defaultElementProcessors.element(group, element, context);\n};\n\n/**\n * This processor calls the default list processor and then sets the correct list level and list bullet.\n */\nconst wacLiElementProcessor: ElementProcessor<HTMLLIElement> = (\n group: ContentModelBlockGroup,\n element: HTMLLIElement,\n context: DomToModelContext\n): void => {\n context.defaultElementProcessors.li?.(group, element, context);\n const { listFormat } = context;\n const listParent = listFormat.listParent;\n if (listParent) {\n const lastblock = listParent.blocks[listParent.blocks.length - 1];\n if (\n lastblock.blockType == 'BlockGroup' &&\n lastblock.blockGroupType == 'ListItem' &&\n context.listFormat.listParent !== lastblock\n ) {\n const currentLevel = lastblock.levels[lastblock.levels.length - 1];\n\n // Get item level from 'data-aria-level' attribute\n const level = parseInt(element.getAttribute('data-aria-level') ?? '');\n if (level > 0) {\n if (level > lastblock.levels.length) {\n while (level != lastblock.levels.length) {\n lastblock.levels.push(currentLevel);\n }\n } else {\n lastblock.levels.splice(level, lastblock.levels.length - 1);\n lastblock.levels[level - 1] = currentLevel;\n }\n }\n }\n }\n};\n\n/**\n * This parsers does:\n * 1) Sets the display for dummy item to undefined when the current style is block.\n * 2) Removes the Margin Left\n */\nconst wacListItemParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat,\n element: HTMLElement\n): void => {\n if (element.style.display === 'block') {\n format.displayForDummyItem = undefined;\n }\n\n format.marginLeft = undefined;\n};\n\n/**\n * Wac usually adds padding to lists which is unwanted so remove it.\n */\nconst wacListLevelParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat\n): void => {\n format.marginLeft = undefined;\n format.paddingLeft = undefined;\n};\n\n/**\n * This function returns whether we need to clear the list format.\n * Word Online wraps lists inside divs to have this structure:\n *\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n * <div>\n * <p>...</p>\n * <div>\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n *\n * So if a elements is not contained inside of a list we should clear the list context to prevent normal text to be\n * transformed into list\n * For the above scenario, if we do not clear the format, the content inside of the second div would be transformed to a list too.\n */\nfunction shouldClearListContext(\n elementTag: string,\n element: HTMLElement,\n context: DomToModelContext\n) {\n return (\n context.listFormat.levels.length > 0 &&\n LIST_ELEMENT_TAGS.every(tag => tag != elementTag) &&\n !element.closest(LIST_ELEMENT_SELECTOR)\n );\n}\n\nconst wacCommentParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n if (\n (element.className.includes(COMMENT_HIGHLIGHT_CLASS) &&\n element.style.backgroundColor == COMMENT_BG_COLOR_REST) ||\n (element.className.includes(COMMENT_HIGHLIGHT_CLICKED_CLASS) &&\n element.style.backgroundColor == COMMENTS_TEXT_HIGHLIGHT_CLICKED)\n ) {\n delete format.backgroundColor;\n }\n};\n/**\n * @internal\n * Convert pasted content from Office Online\n * Once it is known that the document is from WAC\n * We need to remove the display property and margin from all the list item\n * @param ev ContentModelBeforePasteEvent\n */\nexport function processPastedContentWacComponents(ev: ContentModelBeforePasteEvent) {\n addParser(ev.domToModelOption, 'segment', wacSubSuperParser);\n addParser(ev.domToModelOption, 'listItemThread', wacListItemParser);\n addParser(ev.domToModelOption, 'listLevel', wacListLevelParser);\n addParser(ev.domToModelOption, 'container', wacBlockParser);\n addParser(ev.domToModelOption, 'segment', wacCommentParser);\n\n setProcessor(ev.domToModelOption, 'element', wacElementProcessor);\n setProcessor(ev.domToModelOption, 'li', wacLiElementProcessor);\n setProcessor(ev.domToModelOption, 'ol', wacListProcessor);\n setProcessor(ev.domToModelOption, 'ul', wacListProcessor);\n ev.sanitizingOption.additionalAllowedCssClasses.push(...CLASSES_TO_KEEP);\n}\n\n/**\n * List items from word have this format when using List items:\n * @example\n <div>\n <ol></ol>\n </div>\n <div>\n <ol></ol>\n </div>\n <div>\n <ol></ol>\n </div>\n * Due to this the div between each of the lists we need to restore the list context to use the previous list,\n * otherwise it could create a new list instead under the same list element\n */\nconst wacListProcessor: ElementProcessor<HTMLOListElement | HTMLUListElement> = (\n group: ContentModelBlockGroup,\n element: HTMLOListElement | HTMLUListElement,\n context: DomToModelContext\n): void => {\n const lastBlock = group.blocks[group.blocks.length - 1];\n const isWrappedInContainer = element.closest(`.${LIST_CONTAINER_ELEMENT_CLASS_NAME}`);\n if (\n isWrappedInContainer?.previousElementSibling?.classList.contains(\n LIST_CONTAINER_ELEMENT_CLASS_NAME\n )\n ) {\n if (lastBlock?.blockType === 'BlockGroup' && lastBlock.blockGroupType == 'ListItem') {\n context.listFormat = {\n threadItemCounts: [],\n levels: lastBlock.levels,\n listParent: group,\n };\n }\n }\n if (element.tagName.toUpperCase() === 'OL') {\n context.defaultElementProcessors.ol?.(group, element as HTMLOListElement, context);\n } else {\n context.defaultElementProcessors.ul?.(group, element as HTMLUListElement, context);\n }\n};\n\nconst wacBlockParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.classList.contains(TABLE_CONTAINER) && element.style.marginLeft.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"processPastedContentWacComponents.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WacComponents/processPastedContentWacComponents.ts"],"names":[],"mappings":";;;AAAA,gDAA2C;AAC3C,sDAAqD;AACrD,yCAMqB;AAYrB,IAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,IAAM,qBAAqB,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE1D,IAAM,qBAAqB,GAAG,0BAA0B,CAAC;AACzD,IAAM,+BAA+B,GAAG,0BAA0B,CAAC;AAEnE;;;GAGG;AACH,IAAM,iBAAiB,GAA4C,UAC/D,MAAiC,EACjC,OAAoB;IAEpB,IAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;IAClD,IAAI,aAAa,KAAK,OAAO,EAAE;QAC3B,MAAM,CAAC,wBAAwB,GAAG,OAAO,CAAC;KAC7C;IACD,IAAI,aAAa,KAAK,KAAK,EAAE;QACzB,MAAM,CAAC,wBAAwB,GAAG,KAAK,CAAC;KAC3C;AACL,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,IAAM,mBAAmB,GAAkC,UACvD,KAA6B,EAC7B,OAAoB,EACpB,OAA0B;IAE1B,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAEnC,IAAI,OAAO,CAAC,OAAO,CAAC,iCAAqB,CAAC,EAAE;QACxC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;KAC1C;IAED,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,6CAAiC,CAAC,EAAE;QAC/D,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO;KACV;IAED,IAAI,iCAAqB,CAAC,IAAI,CAAC,UAAA,SAAS,IAAI,OAAA,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAArC,CAAqC,CAAC,EAAE;QAChF,OAAO;KACV;SAAM,IAAI,sBAAsB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;QACrD,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;QAC/B,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;QACvB,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC;KACrC;IAED,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF;;GAEG;AACH,IAAM,qBAAqB,GAAoC,UAC3D,KAA6B,EAC7B,OAAsB,EACtB,OAA0B;;IAE1B,MAAA,MAAA,OAAO,CAAC,wBAAwB,EAAC,EAAE,mDAAG,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IACzC,IAAI,UAAU,EAAE;QACZ,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClE,IACI,SAAS,CAAC,SAAS,IAAI,YAAY;YACnC,SAAS,CAAC,cAAc,IAAI,UAAU;YACtC,OAAO,CAAC,UAAU,CAAC,UAAU,KAAK,SAAS,EAC7C;YACE,IAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEnE,kDAAkD;YAClD,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAA,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,mCAAI,EAAE,CAAC,CAAC;YACtE,IAAI,KAAK,GAAG,CAAC,EAAE;gBACX,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE;oBACjC,OAAO,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE;wBACrC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;qBACvC;iBACJ;qBAAM;oBACH,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC5D,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;iBAC9C;aACJ;SACJ;KACJ;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,IAAM,iBAAiB,GAAkD,UACrE,MAAuC,EACvC,OAAoB;IAEpB,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE;QACnC,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;KAC1C;IAED,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;AAClC,CAAC,CAAC;AAEF;;GAEG;AACH,IAAM,kBAAkB,GAAkD,UACtE,MAAuC;IAEvC,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;AACnC,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,sBAAsB,CAC3B,UAAkB,EAClB,OAAoB,EACpB,OAA0B;IAE1B,OAAO,CACH,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QACpC,iBAAiB,CAAC,KAAK,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,IAAI,UAAU,EAAjB,CAAiB,CAAC;QACjD,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAC1C,CAAC;AACN,CAAC;AAED,IAAM,gBAAgB,GAA4C,UAC9D,MAAiC,EACjC,OAAoB;IAEpB,IACI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,mCAAuB,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,qBAAqB,CAAC;QAC3D,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,2CAA+B,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,+BAA+B,CAAC,EACvE;QACE,OAAO,MAAM,CAAC,eAAe,CAAC;KACjC;AACL,CAAC,CAAC;AACF;;;;;;GAMG;AACH,SAAgB,iCAAiC,CAAC,EAAgC;IAC9E,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;IACpE,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAChE,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAChE,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC5D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAC/D,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC1D,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAC9D,CAAC;AAZD,8EAYC;AAED;;;;;;;;;;;;;;GAcG;AACH,IAAM,gBAAgB,GAA0D,UAC5E,KAA6B,EAC7B,OAA4C,EAC5C,OAA0B;;IAE1B,IAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxD,IAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAI,6CAAmC,CAAC,CAAC;IACtF,IACI,MAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,sBAAsB,0CAAE,SAAS,CAAC,QAAQ,CAC5D,6CAAiC,CACpC,EACH;QACE,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,MAAK,YAAY,IAAI,SAAS,CAAC,cAAc,IAAI,UAAU,EAAE;YACjF,OAAO,CAAC,UAAU,GAAG;gBACjB,gBAAgB,EAAE,EAAE;gBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,UAAU,EAAE,KAAK;aACpB,CAAC;SACL;KACJ;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QACxC,MAAA,MAAA,OAAO,CAAC,wBAAwB,EAAC,EAAE,mDAAG,KAAK,EAAE,OAA2B,EAAE,OAAO,CAAC,CAAC;KACtF;SAAM;QACH,MAAA,MAAA,OAAO,CAAC,wBAAwB,EAAC,EAAE,mDAAG,KAAK,EAAE,OAA2B,EAAE,OAAO,CAAC,CAAC;KACtF;AACL,CAAC,CAAC;AAEF,IAAM,kBAAkB,GAA0C,UAC9D,MAA+B,EAC/B,OAAoB;IAEpB,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QAC1C,OAAO,MAAM,CAAC,UAAU,CAAC;KAC5B;AACL,CAAC,CAAC","sourcesContent":["import addParser from '../utils/addParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport {\n COMMENT_HIGHLIGHT_CLASS,\n COMMENT_HIGHLIGHT_CLICKED_CLASS,\n LIST_CONTAINER_ELEMENT_CLASS_NAME,\n TEMP_ELEMENTS_CLASSES,\n WAC_IDENTIFY_SELECTOR,\n} from './constants';\nimport type {\n ContentModelBeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelBlockGroup,\n ContentModelListItemLevelFormat,\n ContentModelSegmentFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst LIST_ELEMENT_TAGS = ['UL', 'OL', 'LI'];\nconst LIST_ELEMENT_SELECTOR = LIST_ELEMENT_TAGS.join(',');\n\nconst COMMENT_BG_COLOR_REST = 'rgba(209, 209, 209, 0.5)';\nconst COMMENTS_TEXT_HIGHLIGHT_CLICKED = 'rgba(197, 139, 204, 0.5)';\n\n/**\n * Wac components do not use sub and super tags, instead only add vertical align to a span.\n * This parser normalize the content for content model\n */\nconst wacSubSuperParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n const verticalAlign = element.style.verticalAlign;\n if (verticalAlign === 'super') {\n format.superOrSubScriptSequence = 'super';\n }\n if (verticalAlign === 'sub') {\n format.superOrSubScriptSequence = 'sub';\n }\n};\n\n/**\n * This processor does:\n * 1) Remove the display and margin of the element.\n * 2) When an element should be ignored but should handle the child elements call the default child processor.\n * 3) Removes the End of Paragraph element to avoid empty lines, we should only remove this if the previous element of the EOP is an EmptyTextRun\n * 4) Finally call the default processor.\n * @returns\n */\nconst wacElementProcessor: ElementProcessor<HTMLElement> = (\n group: ContentModelBlockGroup,\n element: HTMLElement,\n context: DomToModelContext\n): void => {\n const elementTag = element.tagName;\n\n if (element.matches(WAC_IDENTIFY_SELECTOR)) {\n element.style.removeProperty('display');\n element.style.removeProperty('margin');\n }\n\n if (element.classList.contains(LIST_CONTAINER_ELEMENT_CLASS_NAME)) {\n context.elementProcessors.child(group, element, context);\n return;\n }\n\n if (TEMP_ELEMENTS_CLASSES.some(className => element.classList.contains(className))) {\n return;\n } else if (shouldClearListContext(elementTag, element, context)) {\n const { listFormat } = context;\n listFormat.levels = [];\n listFormat.listParent = undefined;\n }\n\n context.defaultElementProcessors.element(group, element, context);\n};\n\n/**\n * This processor calls the default list processor and then sets the correct list level and list bullet.\n */\nconst wacLiElementProcessor: ElementProcessor<HTMLLIElement> = (\n group: ContentModelBlockGroup,\n element: HTMLLIElement,\n context: DomToModelContext\n): void => {\n context.defaultElementProcessors.li?.(group, element, context);\n const { listFormat } = context;\n const listParent = listFormat.listParent;\n if (listParent) {\n const lastblock = listParent.blocks[listParent.blocks.length - 1];\n if (\n lastblock.blockType == 'BlockGroup' &&\n lastblock.blockGroupType == 'ListItem' &&\n context.listFormat.listParent !== lastblock\n ) {\n const currentLevel = lastblock.levels[lastblock.levels.length - 1];\n\n // Get item level from 'data-aria-level' attribute\n const level = parseInt(element.getAttribute('data-aria-level') ?? '');\n if (level > 0) {\n if (level > lastblock.levels.length) {\n while (level != lastblock.levels.length) {\n lastblock.levels.push(currentLevel);\n }\n } else {\n lastblock.levels.splice(level, lastblock.levels.length - 1);\n lastblock.levels[level - 1] = currentLevel;\n }\n }\n }\n }\n};\n\n/**\n * This parsers does:\n * 1) Sets the display for dummy item to undefined when the current style is block.\n * 2) Removes the Margin Left\n */\nconst wacListItemParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat,\n element: HTMLElement\n): void => {\n if (element.style.display === 'block') {\n format.displayForDummyItem = undefined;\n }\n\n format.marginLeft = undefined;\n};\n\n/**\n * Wac usually adds padding to lists which is unwanted so remove it.\n */\nconst wacListLevelParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat\n): void => {\n format.marginLeft = undefined;\n format.paddingLeft = undefined;\n};\n\n/**\n * This function returns whether we need to clear the list format.\n * Word Online wraps lists inside divs to have this structure:\n *\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n * <div>\n * <p>...</p>\n * <div>\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n *\n * So if a elements is not contained inside of a list we should clear the list context to prevent normal text to be\n * transformed into list\n * For the above scenario, if we do not clear the format, the content inside of the second div would be transformed to a list too.\n */\nfunction shouldClearListContext(\n elementTag: string,\n element: HTMLElement,\n context: DomToModelContext\n) {\n return (\n context.listFormat.levels.length > 0 &&\n LIST_ELEMENT_TAGS.every(tag => tag != elementTag) &&\n !element.closest(LIST_ELEMENT_SELECTOR)\n );\n}\n\nconst wacCommentParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n if (\n (element.className.includes(COMMENT_HIGHLIGHT_CLASS) &&\n element.style.backgroundColor == COMMENT_BG_COLOR_REST) ||\n (element.className.includes(COMMENT_HIGHLIGHT_CLICKED_CLASS) &&\n element.style.backgroundColor == COMMENTS_TEXT_HIGHLIGHT_CLICKED)\n ) {\n delete format.backgroundColor;\n }\n};\n/**\n * @internal\n * Convert pasted content from Office Online\n * Once it is known that the document is from WAC\n * We need to remove the display property and margin from all the list item\n * @param ev ContentModelBeforePasteEvent\n */\nexport function processPastedContentWacComponents(ev: ContentModelBeforePasteEvent) {\n addParser(ev.domToModelOption, 'segment', wacSubSuperParser);\n addParser(ev.domToModelOption, 'listItemThread', wacListItemParser);\n addParser(ev.domToModelOption, 'listLevel', wacListLevelParser);\n addParser(ev.domToModelOption, 'container', wacContainerParser);\n addParser(ev.domToModelOption, 'table', wacContainerParser);\n addParser(ev.domToModelOption, 'segment', wacCommentParser);\n\n setProcessor(ev.domToModelOption, 'element', wacElementProcessor);\n setProcessor(ev.domToModelOption, 'li', wacLiElementProcessor);\n setProcessor(ev.domToModelOption, 'ol', wacListProcessor);\n setProcessor(ev.domToModelOption, 'ul', wacListProcessor);\n}\n\n/**\n * List items from word have this format when using List items:\n * @example\n <div>\n <ol></ol>\n </div>\n <div>\n <ol></ol>\n </div>\n <div>\n <ol></ol>\n </div>\n * Due to this the div between each of the lists we need to restore the list context to use the previous list,\n * otherwise it could create a new list instead under the same list element\n */\nconst wacListProcessor: ElementProcessor<HTMLOListElement | HTMLUListElement> = (\n group: ContentModelBlockGroup,\n element: HTMLOListElement | HTMLUListElement,\n context: DomToModelContext\n): void => {\n const lastBlock = group.blocks[group.blocks.length - 1];\n const isWrappedInContainer = element.closest(`.${LIST_CONTAINER_ELEMENT_CLASS_NAME}`);\n if (\n isWrappedInContainer?.previousElementSibling?.classList.contains(\n LIST_CONTAINER_ELEMENT_CLASS_NAME\n )\n ) {\n if (lastBlock?.blockType === 'BlockGroup' && lastBlock.blockGroupType == 'ListItem') {\n context.listFormat = {\n threadItemCounts: [],\n levels: lastBlock.levels,\n listParent: group,\n };\n }\n }\n if (element.tagName.toUpperCase() === 'OL') {\n context.defaultElementProcessors.ol?.(group, element as HTMLOListElement, context);\n } else {\n context.defaultElementProcessors.ul?.(group, element as HTMLUListElement, context);\n }\n};\n\nconst wacContainerParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.marginLeft.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}
|
|
@@ -62,7 +62,7 @@ function getStyleMetadata(ev, trustedHTMLHandler) {
|
|
|
62
62
|
});
|
|
63
63
|
var data = {
|
|
64
64
|
'mso-level-number-format': record['mso-level-number-format'],
|
|
65
|
-
'mso-level-start-at': record['mso-level-start-at'],
|
|
65
|
+
'mso-level-start-at': record['mso-level-start-at'] || '1',
|
|
66
66
|
'mso-level-text': record['mso-level-text'],
|
|
67
67
|
};
|
|
68
68
|
if ((0, roosterjs_content_model_dom_1.getObjectKeys)(data).some(function (key) { return !!data[key]; })) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStyleMetadata.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/getStyleMetadata.ts"],"names":[],"mappings":";;;AAAA,2EAA4D;AAI5D,IAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAwB,gBAAgB,CACpC,EAAgC,EAChC,kBAA2C;IAE3C,IAAM,WAAW,GAA8B,IAAI,GAAG,EAAE,CAAC;IACzD,IAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5F,IAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,MAAM,CAAC,OAAO,CAAC,UAAA,KAAK;QAChB,IAAM,IAAI,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,CAAC,IAAI,EAAE,KAAI,EAAE,CAAC;QAE3C,IAAI,KAAK,GAAG,CAAC,CAAC;;YAEV,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACjD,IAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACnD,KAAK,GAAG,OAAO,CAAC;YAEhB,KAAK;YACL,IAAM,YAAY,GAAG,IAAI;iBACpB,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,eAAe,CAAC;iBACvC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;iBAC5B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,SAAS,EAAE;iBACX,QAAQ,EAAE,CAAC;YAEhB,KAAK;YACL,IAAM,QAAQ,GAAG,IAAI;iBAChB,SAAS,CAAC,eAAe,EAAE,aAAa,GAAG,CAAC,CAAC;iBAC7C,QAAQ,EAAE;iBACV,SAAS,EAAE,CAAC;YACjB,IAAM,MAAM,GAA2B,EAAE,CAAC;YAE1C,KAAK;YACL,IAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO,CAAC,OAAO,CAAC,UAAA,KAAK;gBACjB,KAAK;gBACC,IAAA,KAAA,oBAAe,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAA,EAA9B,GAAG,QAAA,EAAE,KAAK,QAAoB,CAAC;gBACtC,IAAI,GAAG,IAAI,KAAK,EAAE;oBACd,IAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;oBAC5E,IAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;oBAChF,KAAK;oBACL,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC;iBACvC;YACL,CAAC,CAAC,CAAC;YAEH,IAAM,IAAI,GAAiB;gBACvB,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,CAAC;gBAC5D,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"getStyleMetadata.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/getStyleMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { getObjectKeys } from 'roosterjs-content-model-dom';\nimport type { WordMetadata } from './WordMetadata';\nimport type { ContentModelBeforePasteEvent } from 'roosterjs-content-model-types';\n\nconst FORMATING_REGEX = /[\\n\\t'{}\"]+/g;\n\n/**\n * @internal\n * Word Desktop content has a style tag that contains data for the lists.\n * So this function query that style tag and extract the data from the innerHTML, since it is not available from the HTMLStyleElement.sheet.\n *\n * The format is like:\n * example of style element content\n * @list l0:level1 {\n * styleTag: styleValue;\n * ...\n * }\n *\n * To extract the data:\n * 1. Substring the value of the style selector, using @ index and { index\n * 2. Substring the value of the style rules by Substring the content between { and }\n * 3. Split the value of the rules using ; as separator { styleTag: styleValue; styleTag1: StyleValue1 } = ['styleTag: styleValue', 'styleTag1: StyleValue1']\n * 4. Split the value of the rule using : as separator: styleTag: styleValue = [styleTag, styleValue]\n * 5. Save data in record and only use the required information.\n *\n */\nexport default function getStyleMetadata(\n ev: ContentModelBeforePasteEvent,\n trustedHTMLHandler: (val: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = new Map();\n const doc = new DOMParser().parseFromString(trustedHTMLHandler(ev.htmlBefore), 'text/html');\n const styles = doc.querySelectorAll('style');\n\n styles.forEach(style => {\n const text = style?.innerHTML.trim() || '';\n\n let index = 0;\n while (index >= 0) {\n const indexAt = text.indexOf('@', index + 1);\n const indexCurlyEnd = text.indexOf('}', indexAt);\n const indexCurlyStart = text.indexOf('{', indexAt);\n index = indexAt;\n\n // 1.\n const metadataName = text\n .substring(indexAt + 1, indexCurlyStart)\n .replace(FORMATING_REGEX, '')\n .replace('list', '')\n .trimRight()\n .trimLeft();\n\n // 2.\n const dataName = text\n .substring(indexCurlyStart, indexCurlyEnd + 1)\n .trimLeft()\n .trimRight();\n const record: Record<string, string> = {};\n\n // 3.\n const entries = dataName.split(';');\n entries.forEach(entry => {\n // 4.\n const [key, value] = entry.split(':');\n if (key && value) {\n const formatedKey = key.replace(FORMATING_REGEX, '').trimRight().trimLeft();\n const formatedValue = value.replace(FORMATING_REGEX, '').trimRight().trimLeft();\n // 5.\n record[formatedKey] = formatedValue;\n }\n });\n\n const data: WordMetadata = {\n 'mso-level-number-format': record['mso-level-number-format'],\n 'mso-level-start-at': record['mso-level-start-at'] || '1',\n 'mso-level-text': record['mso-level-text'],\n };\n if (getObjectKeys(data).some(key => !!data[key])) {\n metadataMap.set(metadataName, data);\n }\n }\n });\n return metadataMap;\n}\n"]}
|
|
@@ -3,9 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.processPastedContentFromWordDesktop = void 0;
|
|
4
4
|
var addParser_1 = require("../utils/addParser");
|
|
5
5
|
var getStyleMetadata_1 = require("./getStyleMetadata");
|
|
6
|
-
var roosterjs_editor_dom_1 = require("roosterjs-editor-dom");
|
|
7
6
|
var getStyles_1 = require("../utils/getStyles");
|
|
8
|
-
var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
|
|
9
7
|
var processWordComments_1 = require("./processWordComments");
|
|
10
8
|
var processWordLists_1 = require("./processWordLists");
|
|
11
9
|
var setProcessor_1 = require("../utils/setProcessor");
|
|
@@ -21,17 +19,8 @@ function processPastedContentFromWordDesktop(ev, trustedHTMLHandler) {
|
|
|
21
19
|
(0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
|
|
22
20
|
(0, addParser_1.default)(ev.domToModelOption, 'block', removeNonValidLineHeight);
|
|
23
21
|
(0, addParser_1.default)(ev.domToModelOption, 'listLevel', listLevelParser);
|
|
24
|
-
(0, addParser_1.default)(ev.domToModelOption, '
|
|
25
|
-
|
|
26
|
-
// We found a problem that when paste an image with "border:none" then the resize border will be
|
|
27
|
-
// displayed incorrectly when resize it. So we need to drop this style
|
|
28
|
-
(0, roosterjs_editor_dom_1.chainSanitizerCallback)(ev.sanitizingOption.cssStyleCallbacks, 'border', function (value, element) { return element.tagName != 'IMG' || value != 'none'; });
|
|
29
|
-
// Preserve <o:p> when its innerHTML is " " to avoid dropping an empty line
|
|
30
|
-
(0, roosterjs_editor_dom_1.chainSanitizerCallback)(ev.sanitizingOption.elementCallbacks, 'O:P', function (element) {
|
|
31
|
-
(0, roosterjs_content_model_dom_1.moveChildNodes)(element);
|
|
32
|
-
element.appendChild(element.ownerDocument.createTextNode('\u00A0')); //
|
|
33
|
-
return true;
|
|
34
|
-
});
|
|
22
|
+
(0, addParser_1.default)(ev.domToModelOption, 'container', wordTableParser);
|
|
23
|
+
(0, addParser_1.default)(ev.domToModelOption, 'table', wordTableParser);
|
|
35
24
|
}
|
|
36
25
|
exports.processPastedContentFromWordDesktop = processPastedContentFromWordDesktop;
|
|
37
26
|
var wordDesktopElementProcessor = function (metadataKey) {
|
|
@@ -59,12 +48,10 @@ function listLevelParser(format, element, context, defaultStyle) {
|
|
|
59
48
|
}
|
|
60
49
|
format.marginBottom = undefined;
|
|
61
50
|
}
|
|
62
|
-
var
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (element.style.marginRight) {
|
|
67
|
-
format.marginRight = undefined;
|
|
51
|
+
var wordTableParser = function (format) {
|
|
52
|
+
var _a;
|
|
53
|
+
if ((_a = format.marginLeft) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
|
|
54
|
+
delete format.marginLeft;
|
|
68
55
|
}
|
|
69
56
|
};
|
|
70
57
|
//# sourceMappingURL=processPastedContentFromWordDesktop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processPastedContentFromWordDesktop.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;AAAA,gDAA2C;AAC3C,uDAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"processPastedContentFromWordDesktop.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;AAAA,gDAA2C;AAC3C,uDAAkD;AAClD,gDAA+C;AAC/C,6DAA4D;AAC5D,uDAAqD;AACrD,sDAAqD;AAYrD,IAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,IAAM,sCAAsC,GAAG,GAAG,CAAC;AAEnD;;;;GAIG;AACH,SAAgB,mCAAmC,CAC/C,EAAgC,EAChC,kBAA4C;IAE5C,IAAM,WAAW,GAA8B,IAAA,0BAAgB,EAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAExF,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;IACvF,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAClE,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AAXD,kFAWC;AAED,IAAM,2BAA2B,GAAG,UAChC,WAAsC;IAEtC,OAAO,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;QAC3B,IAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;QAClC,4FAA4F;QAC5F,IACI,CAAC,CACG,IAAA,kCAAe,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;YAC7D,IAAA,yCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CACvC,EACH;YACE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACrE;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,wBAAwB,CAC7B,MAA+B,EAC/B,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;IAEpD,kHAAkH;IAClH,IAAI,gBAAwB,CAAC;IAC7B,IACI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC/C,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/D,gBAAgB,GAAG,sCAAsC,EAC3D;QACE,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;KAC/C;AACL,CAAC;AAED,SAAS,eAAe,CACpB,MAAuC,EACvC,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;IAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;QAChC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;KAC/C;IAED,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;AACpC,CAAC;AAED,IAAM,eAAe,GAA0C,UAAC,MAAM;;IAClE,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC;KAC5B;AACL,CAAC,CAAC","sourcesContent":["import addParser from '../utils/addParser';\nimport getStyleMetadata from './getStyleMetadata';\nimport { getStyles } from '../utils/getStyles';\nimport { processWordComments } from './processWordComments';\nimport { processWordList } from './processWordLists';\nimport { setProcessor } from '../utils/setProcessor';\nimport type { WordMetadata } from './WordMetadata';\nimport type {\n ContentModelBeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelListItemLevelFormat,\n ContentModelTableFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst PERCENTAGE_REGEX = /%/;\nconst DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 120;\n\n/**\n * @internal\n * Handles Pasted content when source is Word Desktop\n * @param ev ContentModelBeforePasteEvent\n */\nexport function processPastedContentFromWordDesktop(\n ev: ContentModelBeforePasteEvent,\n trustedHTMLHandler: (text: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = getStyleMetadata(ev, trustedHTMLHandler);\n\n setProcessor(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));\n addParser(ev.domToModelOption, 'block', removeNonValidLineHeight);\n addParser(ev.domToModelOption, 'listLevel', listLevelParser);\n addParser(ev.domToModelOption, 'container', wordTableParser);\n addParser(ev.domToModelOption, 'table', wordTableParser);\n}\n\nconst wordDesktopElementProcessor = (\n metadataKey: Map<string, WordMetadata>\n): ElementProcessor<HTMLElement> => {\n return (group, element, context) => {\n const styles = getStyles(element);\n // Process Word Lists or Word Commands, otherwise use the default processor on this element.\n if (\n !(\n processWordList(styles, group, element, context, metadataKey) ||\n processWordComments(styles, element)\n )\n ) {\n context.defaultElementProcessors.element(group, element, context);\n }\n };\n};\n\nfunction removeNonValidLineHeight(\n format: ContentModelBlockFormat,\n element: HTMLElement,\n context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n): void {\n //If the line height is less than the browser default line height, line between the text is going to be too narrow\n let parsedLineHeight: number;\n if (\n PERCENTAGE_REGEX.test(element.style.lineHeight) &&\n !isNaN((parsedLineHeight = parseInt(element.style.lineHeight))) &&\n parsedLineHeight < DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE\n ) {\n format.lineHeight = defaultStyle.lineHeight;\n }\n}\n\nfunction listLevelParser(\n format: ContentModelListItemLevelFormat,\n element: HTMLElement,\n context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n): void {\n if (element.style.marginLeft != '') {\n format.marginLeft = defaultStyle.marginLeft;\n }\n\n format.marginBottom = undefined;\n}\n\nconst wordTableParser: FormatParser<ContentModelTableFormat> = (format): void => {\n if (format.marginLeft?.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}
|