roosterjs-content-model-plugins 9.9.0 → 9.10.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/autoFormat/numbers/transformOrdinals.d.ts +1 -2
- package/lib/autoFormat/numbers/transformOrdinals.js +16 -5
- package/lib/autoFormat/numbers/transformOrdinals.js.map +1 -1
- package/lib/edit/inputSteps/handleEnterOnList.js +5 -1
- package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
- package/lib/imageEdit/ImageEditPlugin.d.ts +2 -2
- package/lib/imageEdit/ImageEditPlugin.js +45 -33
- package/lib/imageEdit/ImageEditPlugin.js.map +1 -1
- package/lib/imageEdit/utils/findEditingImage.d.ts +1 -1
- package/lib/imageEdit/utils/findEditingImage.js +44 -4
- package/lib/imageEdit/utils/findEditingImage.js.map +1 -1
- package/lib/markdown/utils/setFormat.js +14 -4
- package/lib/markdown/utils/setFormat.js.map +1 -1
- package/lib/paste/WacComponents/constants.d.ts +4 -0
- package/lib/paste/WacComponents/constants.js +7 -3
- package/lib/paste/WacComponents/constants.js.map +1 -1
- package/lib/paste/WacComponents/processPastedContentWacComponents.js +3 -1
- package/lib/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
- package/lib-amd/autoFormat/numbers/transformOrdinals.d.ts +1 -2
- package/lib-amd/autoFormat/numbers/transformOrdinals.js +16 -5
- package/lib-amd/autoFormat/numbers/transformOrdinals.js.map +1 -1
- package/lib-amd/edit/inputSteps/handleEnterOnList.js +5 -1
- package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
- package/lib-amd/imageEdit/ImageEditPlugin.d.ts +2 -2
- package/lib-amd/imageEdit/ImageEditPlugin.js +45 -33
- package/lib-amd/imageEdit/ImageEditPlugin.js.map +1 -1
- package/lib-amd/imageEdit/utils/findEditingImage.d.ts +1 -1
- package/lib-amd/imageEdit/utils/findEditingImage.js +44 -5
- package/lib-amd/imageEdit/utils/findEditingImage.js.map +1 -1
- package/lib-amd/markdown/utils/setFormat.js +14 -4
- package/lib-amd/markdown/utils/setFormat.js.map +1 -1
- package/lib-amd/paste/WacComponents/constants.d.ts +4 -0
- package/lib-amd/paste/WacComponents/constants.js +7 -3
- package/lib-amd/paste/WacComponents/constants.js.map +1 -1
- package/lib-amd/paste/WacComponents/processPastedContentWacComponents.js +3 -1
- package/lib-amd/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
- package/lib-mjs/autoFormat/numbers/transformOrdinals.d.ts +1 -2
- package/lib-mjs/autoFormat/numbers/transformOrdinals.js +16 -5
- package/lib-mjs/autoFormat/numbers/transformOrdinals.js.map +1 -1
- package/lib-mjs/edit/inputSteps/handleEnterOnList.js +5 -1
- package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
- package/lib-mjs/imageEdit/ImageEditPlugin.d.ts +2 -2
- package/lib-mjs/imageEdit/ImageEditPlugin.js +46 -34
- package/lib-mjs/imageEdit/ImageEditPlugin.js.map +1 -1
- package/lib-mjs/imageEdit/utils/findEditingImage.d.ts +1 -1
- package/lib-mjs/imageEdit/utils/findEditingImage.js +44 -4
- package/lib-mjs/imageEdit/utils/findEditingImage.js.map +1 -1
- package/lib-mjs/markdown/utils/setFormat.js +14 -4
- package/lib-mjs/markdown/utils/setFormat.js.map +1 -1
- package/lib-mjs/paste/WacComponents/constants.d.ts +4 -0
- package/lib-mjs/paste/WacComponents/constants.js +6 -2
- package/lib-mjs/paste/WacComponents/constants.js.map +1 -1
- package/lib-mjs/paste/WacComponents/processPastedContentWacComponents.js +4 -2
- package/lib-mjs/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/markdown/utils/setFormat.ts"],"names":[],"mappings":";;;;AAAA,2EAGqC;AAOrC;;GAEG;AACH,SAAgB,SAAS,CACrB,MAAe,EACf,SAAiB,EACjB,MAAiC,EACjC,UAAmC;IAEnC,IAAA,oEAAsC,EAClC,MAAM,EACN,UAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO;QACtD,IAAI,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE;YACpE,IAAM,
|
|
1
|
+
{"version":3,"file":"setFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/markdown/utils/setFormat.ts"],"names":[],"mappings":";;;;AAAA,2EAGqC;AAOrC;;GAEG;AACH,SAAgB,SAAS,CACrB,MAAe,EACf,SAAiB,EACjB,MAAiC,EACjC,UAAmC;IAEnC,IAAA,oEAAsC,EAClC,MAAM,EACN,UAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO;QACtD,IAAI,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE;YACpE,IAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC;YACzC,IAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,gBAAgB,mDACjB,YAAY,KACf,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC,aAAa,EAC3C,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAC7B,UAAU,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAC5D,CAAC;YACF,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC1C,IAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;gBACzC,IAAM,cAAc,GAAG,WAAW;qBAC7B,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;qBAC/B,WAAW,CAAC,SAAS,CAAC,CAAC;gBAE5B,IACI,4BAA4B,CAAC,WAAW,EAAE,cAAc,CAAC;oBACzD,aAAa,GAAG,cAAc,GAAG,CAAC,EACpC;oBACE,IAAM,aAAa,GAAG,IAAA,8CAAgB,EAClC,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,CAChB,CAAC;oBAEF,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,aAAa,CAAC,MAAM,mDACb,aAAa,CAAC,MAAM,GACpB,MAAM,CACZ,CAAC;oBACF,IAAI,UAAU,EAAE;wBACZ,aAAa,CAAC,IAAI,GAAG;4BACjB,MAAM,EAAE,UAAU;yBACrB,CAAC;qBACL;oBAED,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAClC,OAAO,IAAI,CAAC;iBACf;aACJ;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CACJ,CAAC;AACN,CAAC;AAtDD,8BAsDC;AAED;;;;GAIG;AACH,SAAS,4BAA4B,CAAC,IAAY,EAAE,KAAa;IAC7D,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;AAClE,CAAC","sourcesContent":["import {\n formatTextSegmentBeforeSelectionMarker,\n splitTextSegment,\n} from 'roosterjs-content-model-api';\nimport type {\n ContentModelCodeFormat,\n ContentModelSegmentFormat,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function setFormat(\n editor: IEditor,\n character: string,\n format: ContentModelSegmentFormat,\n codeFormat?: ContentModelCodeFormat\n) {\n formatTextSegmentBeforeSelectionMarker(\n editor,\n (_model, previousSegment, paragraph, markerFormat, context) => {\n if (previousSegment.text[previousSegment.text.length - 1] == character) {\n const textSegment = previousSegment.text;\n const textBeforeMarker = textSegment.slice(0, -1);\n context.newPendingFormat = {\n ...markerFormat,\n strikethrough: !!markerFormat.strikethrough,\n italic: !!markerFormat.italic,\n fontWeight: markerFormat?.fontWeight ? 'bold' : undefined,\n };\n if (textBeforeMarker.indexOf(character) > -1) {\n const lastCharIndex = textSegment.length;\n const firstCharIndex = textSegment\n .substring(0, lastCharIndex - 1)\n .lastIndexOf(character);\n\n if (\n hasSpaceBeforeFirstCharacter(textSegment, firstCharIndex) &&\n lastCharIndex - firstCharIndex > 2\n ) {\n const formattedText = splitTextSegment(\n previousSegment,\n paragraph,\n firstCharIndex,\n lastCharIndex\n );\n\n formattedText.text = formattedText.text.replace(character, '').slice(0, -1);\n formattedText.format = {\n ...formattedText.format,\n ...format,\n };\n if (codeFormat) {\n formattedText.code = {\n format: codeFormat,\n };\n }\n\n context.canUndoByBackspace = true;\n return true;\n }\n }\n }\n return false;\n }\n );\n}\n\n/**\n * The markdown should not be trigger inside a word, then check if exist a space before the trigger character\n * Should trigger markdown example: _one two_\n * Should not trigger markdown example: one_two_\n */\nfunction hasSpaceBeforeFirstCharacter(text: string, index: number) {\n return !text[index - 1] || text[index - 1].trim().length == 0;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
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;
|
|
3
|
+
exports.WAC_IDENTIFY_SELECTOR = exports.REMOVE_MARGIN_ELEMENTS = 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
|
|
@@ -57,7 +57,11 @@ exports.TEMP_ELEMENTS_CLASSES = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadA
|
|
|
57
57
|
], false);
|
|
58
58
|
/**
|
|
59
59
|
* @internal
|
|
60
|
-
|
|
61
|
-
exports.
|
|
60
|
+
*/
|
|
61
|
+
exports.REMOVE_MARGIN_ELEMENTS = "span." + exports.IMAGE_CONTAINER + ",span." + exports.IMAGE_BORDER + ",." + exports.COMMENT_HIGHLIGHT_CLASS + ",." + exports.COMMENT_HIGHLIGHT_CLICKED_CLASS + "," +
|
|
62
62
|
exports.WORD_ONLINE_TABLE_TEMP_ELEMENT_CLASSES.map(function (c) { return "table div[class^=\"" + c + "\"]"; }).join(',');
|
|
63
|
+
/**
|
|
64
|
+
* @internal
|
|
65
|
+
**/
|
|
66
|
+
exports.WAC_IDENTIFY_SELECTOR = "ul[class^=\"" + exports.BULLET_LIST_STYLE + "\"]>." + exports.OUTLINE_ELEMENT + ",ol[class^=\"" + exports.NUMBER_LIST_STYLE + "\"]>." + exports.OUTLINE_ELEMENT + "," + exports.REMOVE_MARGIN_ELEMENTS;
|
|
63
67
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../packages/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;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../packages/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;AAEF;;GAEG;AACU,QAAA,sBAAsB,GAC/B,UAAQ,uBAAe,cAAS,oBAAY,UAAK,+BAAuB,UAAK,uCAA+B,MAAG;IAC/G,8CAAsC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,wBAAqB,CAAC,QAAI,EAA1B,CAA0B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE1F;;IAEI;AACS,QAAA,qBAAqB,GAAW,iBAAc,yBAAiB,aAAO,uBAAe,qBAAe,yBAAiB,aAAO,uBAAe,SAAI,8BAAwB,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/**\n * @internal\n */\nexport const REMOVE_MARGIN_ELEMENTS: string =\n `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\n/**\n * @internal\n **/\nexport const WAC_IDENTIFY_SELECTOR: string = `ul[class^=\"${BULLET_LIST_STYLE}\"]>.${OUTLINE_ELEMENT},ol[class^=\"${NUMBER_LIST_STYLE}\"]>.${OUTLINE_ELEMENT},${REMOVE_MARGIN_ELEMENTS}`;\n"]}
|
|
@@ -31,7 +31,7 @@ var wacSubSuperParser = function (format, element) {
|
|
|
31
31
|
*/
|
|
32
32
|
var wacElementProcessor = function (group, element, context) {
|
|
33
33
|
var elementTag = element.tagName;
|
|
34
|
-
if (element.matches(constants_1.
|
|
34
|
+
if (element.matches(constants_1.REMOVE_MARGIN_ELEMENTS)) {
|
|
35
35
|
element.style.removeProperty('display');
|
|
36
36
|
element.style.removeProperty('margin');
|
|
37
37
|
}
|
|
@@ -104,6 +104,7 @@ var wacListItemParser = function (format, element) {
|
|
|
104
104
|
format.displayForDummyItem = undefined;
|
|
105
105
|
}
|
|
106
106
|
format.marginLeft = undefined;
|
|
107
|
+
format.marginRight = undefined;
|
|
107
108
|
};
|
|
108
109
|
/**
|
|
109
110
|
* Wac usually adds padding to lists which is unwanted so remove it.
|
|
@@ -151,6 +152,7 @@ var wacCommentParser = function (format, element) {
|
|
|
151
152
|
function processPastedContentWacComponents(ev) {
|
|
152
153
|
(0, addParser_1.addParser)(ev.domToModelOption, 'segment', wacSubSuperParser);
|
|
153
154
|
(0, addParser_1.addParser)(ev.domToModelOption, 'listItemThread', wacListItemParser);
|
|
155
|
+
(0, addParser_1.addParser)(ev.domToModelOption, 'listItemElement', wacListItemParser);
|
|
154
156
|
(0, addParser_1.addParser)(ev.domToModelOption, 'listLevel', wacListLevelParser);
|
|
155
157
|
(0, addParser_1.addParser)(ev.domToModelOption, 'container', wacContainerParser);
|
|
156
158
|
(0, addParser_1.addParser)(ev.domToModelOption, 'table', wacContainerParser);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processPastedContentWacComponents.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WacComponents/processPastedContentWacComponents.ts"],"names":[],"mappings":";;;;AAAA,gDAA+C;AAC/C,2EAA2E;AAC3E,sDAAqD;AACrD,yCAMqB;AAcrB,IAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,IAAM,qBAAqB,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAa1D;;;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,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAA,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,mCAAI,EAAE,CAAC,CAAC;IACtE,IAAM,UAAU,GAAG,OAAO,CAAC,UAAwB,CAAC;IACpD,IAAM,QAAQ,GACV,CAAA,MAAA,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,QAAQ;SAChE,MAAA,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,0CAAE,OAAO,CAAC,WAAW,EAAkB,CAAA,CAAC;IACrE,IAAM,QAAQ,GAA0B,IAAA,6CAAe,EAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACvF,IAAA,yCAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtF,IAAA,yCAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChF,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,iBAAiB,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;IAEtF,IAAI,KAAK,GAAG,CAAC,EAAE;QACX,IAAI,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE;YAC1C,OAAO,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC9C,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC5C;SACJ;aAAM;YACH,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;SACnD;KACJ;IAED,MAAA,MAAA,OAAO,CAAC,wBAAwB,EAAC,EAAE,mDAAG,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE/D,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,IAAI,SAAS,CAAC,SAAS,IAAI,YAAY,IAAI,SAAS,CAAC,cAAc,IAAI,UAAU,EAAE;YAC/E,IAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnE,mBAAmB,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACvD;KACJ;IAED,IAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,UAAA,CAAC;QACvB,IAAM,QAAQ,GAA0B;YACpC,OAAO,4BAAO,CAAC,CAAC,OAAO,CAAE;YACzB,MAAM,4BAAO,CAAC,CAAC,MAAM,CAAE;YACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACvB,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,iBAAiB,GAAG,SAAS,CAAC;IACzC,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;AAC3B,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,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,mCAAuB,CAAC;QACnD,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,2CAA+B,CAAC,EAC7D;QACE,OAAO,MAAM,CAAC,eAAe,CAAC;KACjC;AACL,CAAC,CAAC;AACF;;;;;;GAMG;AACH,SAAgB,iCAAiC,CAAC,EAAoB;IAClE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;IACpE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAChE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAChE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC5D,IAAA,qBAAS,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;AACnE,CAAC;AAVD,8EAUC;AAED,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;AAEF,SAAS,mBAAmB,CACxB,YAA+C,EAC/C,OAAsB,EACtB,GAAsB;IAEtB,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE;QAChD,OAAO;KACV;IAED,IAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAM,UAAU,GAAG,GAAG,CAAC,UAAwB,CAAC;IAC1C,IAAA,KAAA,oBAAqB,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAA,EAA1D,KAAK,QAAA,EAAE,SAAS,QAA0C,CAAC;IAElE,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;QAC5B,UAAU,CAAC,cAAc,GAAG,EAAE,CAAC;KAClC;IAED,IAAM,MAAM,GAAuB,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACxE,IAAI,MAAM,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE;QAC/B,YAAY,CAAC,MAAM,CAAC,mBAAmB,GAAG,KAAK,CAAC;KACnD;IACD,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;AACjD,CAAC;AACD,SAAS,uBAAuB,CAC5B,IAAoC,EACpC,IAAoC;IAEpC,IAAM,SAAS,GACX,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,CAAC,IAAI,CAAC,KAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAqB,CAAC,CAAC;IAC1F,IAAM,KAAK,GACP,QAAQ,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAC,OAAO,CAAC,KAAI,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,IAAM,SAAS,GAAG,QAAQ,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAC,iBAAiB,CAAC,KAAI,EAAE,CAAC,CAAC;IAExE,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["import { addParser } from '../utils/addParser';\nimport { createListLevel, parseFormat } from 'roosterjs-content-model-dom';\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 BeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelBlockGroup,\n ContentModelListItemLevelFormat,\n ContentModelListLevel,\n ContentModelSegmentFormat,\n DomToModelContext,\n DomToModelListFormat,\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\ninterface WacContext extends DomToModelListFormat {\n /**\n * Current list levels\n */\n currentListLevels?: ContentModelListLevel[];\n /**\n * Array to keep the start of the lists and determine if the start override should be set.\n */\n listItemThread?: number[];\n}\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 const level = parseInt(element.getAttribute('data-aria-level') ?? '');\n const listFormat = context.listFormat as WacContext;\n const listType =\n listFormat.levels[context.listFormat.levels.length - 1]?.listType ||\n (element.closest('ol,ul')?.tagName.toUpperCase() as 'UL' | 'OL');\n const newLevel: ContentModelListLevel = createListLevel(listType, context.blockFormat);\n parseFormat(element, context.formatParsers.listLevelThread, newLevel.format, context);\n parseFormat(element, context.formatParsers.listLevel, newLevel.format, context);\n context.listFormat.levels = listFormat.currentListLevels || context.listFormat.levels;\n\n if (level > 0) {\n if (level > context.listFormat.levels.length) {\n while (level != context.listFormat.levels.length) {\n context.listFormat.levels.push(newLevel);\n }\n } else {\n context.listFormat.levels.splice(level, context.listFormat.levels.length - 1);\n context.listFormat.levels[level - 1] = newLevel;\n }\n }\n\n context.defaultElementProcessors.li?.(group, element, context);\n\n const listParent = listFormat.listParent;\n if (listParent) {\n const lastblock = listParent.blocks[listParent.blocks.length - 1];\n if (lastblock.blockType == 'BlockGroup' && lastblock.blockGroupType == 'ListItem') {\n const currentLevel = lastblock.levels[lastblock.levels.length - 1];\n updateStartOverride(currentLevel, element, context);\n }\n }\n\n const newLevels: ContentModelListLevel[] = [];\n listFormat.levels.forEach(v => {\n const newValue: ContentModelListLevel = {\n dataset: { ...v.dataset },\n format: { ...v.format },\n listType: v.listType,\n };\n newLevels.push(newValue);\n });\n listFormat.currentListLevels = newLevels;\n listFormat.levels = [];\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.className.includes(COMMENT_HIGHLIGHT_CLICKED_CLASS)\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 BeforePasteEvent\n */\nexport function processPastedContentWacComponents(ev: BeforePasteEvent) {\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}\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\nfunction updateStartOverride(\n currentLevel: ContentModelListLevel | undefined,\n element: HTMLLIElement,\n ctx: DomToModelContext\n) {\n if (!currentLevel || currentLevel.listType == 'UL') {\n return;\n }\n\n const list = element.closest('ol');\n const listFormat = ctx.listFormat as WacContext;\n const [start, listLevel] = extractWordListMetadata(list, element);\n\n if (!listFormat.listItemThread) {\n listFormat.listItemThread = [];\n }\n\n const thread: number | undefined = listFormat.listItemThread[listLevel];\n if (thread && start - thread != 1) {\n currentLevel.format.startNumberOverride = start;\n }\n listFormat.listItemThread[listLevel] = start;\n}\nfunction extractWordListMetadata(\n list: HTMLElement | null | undefined,\n item: HTMLElement | null | undefined\n) {\n const itemIndex =\n item && Array.from(list?.querySelectorAll('li') || []).indexOf(item as HTMLLIElement);\n const start =\n parseInt(list?.getAttribute('start') || '1') + (itemIndex && itemIndex > 0 ? itemIndex : 0);\n const listLevel = parseInt(item?.getAttribute('data-aria-level') || '');\n\n return [start, listLevel];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"processPastedContentWacComponents.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WacComponents/processPastedContentWacComponents.ts"],"names":[],"mappings":"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","sourcesContent":["import { addParser } from '../utils/addParser';\nimport { createListLevel, parseFormat } from 'roosterjs-content-model-dom';\nimport { setProcessor } from '../utils/setProcessor';\nimport {\n COMMENT_HIGHLIGHT_CLASS,\n COMMENT_HIGHLIGHT_CLICKED_CLASS,\n LIST_CONTAINER_ELEMENT_CLASS_NAME,\n REMOVE_MARGIN_ELEMENTS,\n TEMP_ELEMENTS_CLASSES,\n} from './constants';\nimport type {\n BeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelBlockGroup,\n ContentModelListItemLevelFormat,\n ContentModelListLevel,\n ContentModelSegmentFormat,\n DomToModelContext,\n DomToModelListFormat,\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\ninterface WacContext extends DomToModelListFormat {\n /**\n * Current list levels\n */\n currentListLevels?: ContentModelListLevel[];\n /**\n * Array to keep the start of the lists and determine if the start override should be set.\n */\n listItemThread?: number[];\n}\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(REMOVE_MARGIN_ELEMENTS)) {\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 const level = parseInt(element.getAttribute('data-aria-level') ?? '');\n const listFormat = context.listFormat as WacContext;\n const listType =\n listFormat.levels[context.listFormat.levels.length - 1]?.listType ||\n (element.closest('ol,ul')?.tagName.toUpperCase() as 'UL' | 'OL');\n const newLevel: ContentModelListLevel = createListLevel(listType, context.blockFormat);\n parseFormat(element, context.formatParsers.listLevelThread, newLevel.format, context);\n parseFormat(element, context.formatParsers.listLevel, newLevel.format, context);\n context.listFormat.levels = listFormat.currentListLevels || context.listFormat.levels;\n\n if (level > 0) {\n if (level > context.listFormat.levels.length) {\n while (level != context.listFormat.levels.length) {\n context.listFormat.levels.push(newLevel);\n }\n } else {\n context.listFormat.levels.splice(level, context.listFormat.levels.length - 1);\n context.listFormat.levels[level - 1] = newLevel;\n }\n }\n\n context.defaultElementProcessors.li?.(group, element, context);\n\n const listParent = listFormat.listParent;\n if (listParent) {\n const lastblock = listParent.blocks[listParent.blocks.length - 1];\n if (lastblock.blockType == 'BlockGroup' && lastblock.blockGroupType == 'ListItem') {\n const currentLevel = lastblock.levels[lastblock.levels.length - 1];\n updateStartOverride(currentLevel, element, context);\n }\n }\n\n const newLevels: ContentModelListLevel[] = [];\n listFormat.levels.forEach(v => {\n const newValue: ContentModelListLevel = {\n dataset: { ...v.dataset },\n format: { ...v.format },\n listType: v.listType,\n };\n newLevels.push(newValue);\n });\n listFormat.currentListLevels = newLevels;\n listFormat.levels = [];\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 format.marginRight = 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.className.includes(COMMENT_HIGHLIGHT_CLICKED_CLASS)\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 BeforePasteEvent\n */\nexport function processPastedContentWacComponents(ev: BeforePasteEvent) {\n addParser(ev.domToModelOption, 'segment', wacSubSuperParser);\n addParser(ev.domToModelOption, 'listItemThread', wacListItemParser);\n addParser(ev.domToModelOption, 'listItemElement', 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}\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\nfunction updateStartOverride(\n currentLevel: ContentModelListLevel | undefined,\n element: HTMLLIElement,\n ctx: DomToModelContext\n) {\n if (!currentLevel || currentLevel.listType == 'UL') {\n return;\n }\n\n const list = element.closest('ol');\n const listFormat = ctx.listFormat as WacContext;\n const [start, listLevel] = extractWordListMetadata(list, element);\n\n if (!listFormat.listItemThread) {\n listFormat.listItemThread = [];\n }\n\n const thread: number | undefined = listFormat.listItemThread[listLevel];\n if (thread && start - thread != 1) {\n currentLevel.format.startNumberOverride = start;\n }\n listFormat.listItemThread[listLevel] = start;\n}\nfunction extractWordListMetadata(\n list: HTMLElement | null | undefined,\n item: HTMLElement | null | undefined\n) {\n const itemIndex =\n item && Array.from(list?.querySelectorAll('li') || []).indexOf(item as HTMLLIElement);\n const start =\n parseInt(list?.getAttribute('start') || '1') + (itemIndex && itemIndex > 0 ? itemIndex : 0);\n const listLevel = parseInt(item?.getAttribute('data-aria-level') || '');\n\n return [start, listLevel];\n}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ContentModelText, FormatContentModelContext, ShallowMutableContentModelParagraph } from 'roosterjs-content-model-types';
|
|
2
2
|
/**
|
|
3
3
|
* @internal
|
|
4
|
-
*/
|
|
5
|
-
export declare function transformOrdinals(previousSegment: ContentModelText, paragraph: ShallowMutableContentModelParagraph, context: FormatContentModelContext): boolean;
|
|
4
|
+
*/ export declare function transformOrdinals(previousSegment: ContentModelText, paragraph: ShallowMutableContentModelParagraph, context: FormatContentModelContext): boolean;
|
|
@@ -11,15 +11,18 @@ define(["require", "exports", "roosterjs-content-model-api"], function (require,
|
|
|
11
11
|
return ORDINALS[value] || 'th';
|
|
12
12
|
};
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* The two last characters of ordinal number (st, nd, rd, th)
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
var ORDINAL_LENGTH = 2;
|
|
17
|
+
/**
|
|
18
|
+
* @internal
|
|
19
|
+
*/ function transformOrdinals(previousSegment, paragraph, context) {
|
|
17
20
|
var _a;
|
|
18
21
|
var value = (_a = previousSegment.text.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.trim();
|
|
19
22
|
if (value) {
|
|
20
|
-
var ordinal = value.substring(value.length -
|
|
21
|
-
var
|
|
22
|
-
if (
|
|
23
|
+
var ordinal = value.substring(value.length - ORDINAL_LENGTH); // This value is equal st, nd, rd, th
|
|
24
|
+
var numericValue = getNumericValue(value); //This is the numeric part. Ex: 10th, numeric value = 10
|
|
25
|
+
if (numericValue && getOrdinal(numericValue) === ordinal) {
|
|
23
26
|
var ordinalSegment = (0, roosterjs_content_model_api_1.splitTextSegment)(previousSegment, paragraph, previousSegment.text.length - 3, previousSegment.text.length - 1);
|
|
24
27
|
ordinalSegment.format.superOrSubScriptSequence = 'super';
|
|
25
28
|
context.canUndoByBackspace = true;
|
|
@@ -29,5 +32,13 @@ define(["require", "exports", "roosterjs-content-model-api"], function (require,
|
|
|
29
32
|
return false;
|
|
30
33
|
}
|
|
31
34
|
exports.transformOrdinals = transformOrdinals;
|
|
35
|
+
function getNumericValue(text) {
|
|
36
|
+
var number = text.substring(0, text.length - ORDINAL_LENGTH);
|
|
37
|
+
var isNumber = /^-?\d+$/.test(number);
|
|
38
|
+
if (isNumber) {
|
|
39
|
+
return parseInt(text);
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
32
43
|
});
|
|
33
44
|
//# sourceMappingURL=transformOrdinals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformOrdinals.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformOrdinals.ts"],"names":[],"mappings":";;;;IAOA,IAAM,UAAU,GAAG,UAAC,KAAa;QAC7B,IAAM,QAAQ,GAA2B;YACrC,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,IAAI;SACV,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC,CAAC;IAEF;;OAEG;IACH,SAAgB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"transformOrdinals.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformOrdinals.ts"],"names":[],"mappings":";;;;IAOA,IAAM,UAAU,GAAG,UAAC,KAAa;QAC7B,IAAM,QAAQ,GAA2B;YACrC,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,IAAI;SACV,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC,CAAC;IAEF;;OAEG;IACH,IAAM,cAAc,GAAG,CAAC,CAAC;IAEzB;;OAEG,CAAC,SAAgB,iBAAiB,CACjC,eAAiC,EACjC,SAA8C,EAC9C,OAAkC;;QAElC,IAAM,KAAK,GAAG,MAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,IAAI,EAAE,CAAC;QAC5D,IAAI,KAAK,EAAE;YACP,IAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,sCAAsC;YACtG,IAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,wDAAwD;YACrG,IAAI,YAAY,IAAI,UAAU,CAAC,YAAY,CAAC,KAAK,OAAO,EAAE;gBACtD,IAAM,cAAc,GAAG,IAAA,8CAAgB,EACnC,eAAe,EACf,SAAS,EACT,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAC/B,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAClC,CAAC;gBAEF,cAAc,CAAC,MAAM,CAAC,wBAAwB,GAAG,OAAO,CAAC;gBACzD,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAClC,OAAO,IAAI,CAAC;aACf;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAvBG,8CAuBH;IAED,SAAS,eAAe,CAAC,IAAY;QACjC,IAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC;QAC/D,IAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;SACzB;QACD,OAAO,IAAI,CAAC;IAChB,CAAC","sourcesContent":["import { splitTextSegment } from 'roosterjs-content-model-api';\nimport type {\n ContentModelText,\n FormatContentModelContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst getOrdinal = (value: number) => {\n const ORDINALS: Record<number, string> = {\n 1: 'st',\n 2: 'nd',\n 3: 'rd',\n };\n return ORDINALS[value] || 'th';\n};\n\n/**\n * The two last characters of ordinal number (st, nd, rd, th)\n */\nconst ORDINAL_LENGTH = 2;\n\n/**\n * @internal\n */ export function transformOrdinals(\n previousSegment: ContentModelText,\n paragraph: ShallowMutableContentModelParagraph,\n context: FormatContentModelContext\n): boolean {\n const value = previousSegment.text.split(' ').pop()?.trim();\n if (value) {\n const ordinal = value.substring(value.length - ORDINAL_LENGTH); // This value is equal st, nd, rd, th\n const numericValue = getNumericValue(value); //This is the numeric part. Ex: 10th, numeric value = 10\n if (numericValue && getOrdinal(numericValue) === ordinal) {\n const ordinalSegment = splitTextSegment(\n previousSegment,\n paragraph,\n previousSegment.text.length - 3,\n previousSegment.text.length - 1\n );\n\n ordinalSegment.format.superOrSubScriptSequence = 'super';\n context.canUndoByBackspace = true;\n return true;\n }\n }\n return false;\n}\n\nfunction getNumericValue(text: string) {\n const number = text.substring(0, text.length - ORDINAL_LENGTH);\n const isNumber = /^-?\\d+$/.test(number);\n if (isNumber) {\n return parseInt(text);\n }\n return null;\n}\n"]}
|
|
@@ -32,7 +32,11 @@ define(["require", "exports", "tslib", "roosterjs-content-model-api", "../utils/
|
|
|
32
32
|
if ((0, roosterjs_content_model_dom_1.isBlockGroupOfType)(nextListItem, 'ListItem') &&
|
|
33
33
|
nextListItem.levels[0]) {
|
|
34
34
|
nextListItem.levels.forEach(function (level) {
|
|
35
|
-
|
|
35
|
+
// Remove startNumberOverride so that next list item can join current list, unless it is 1.
|
|
36
|
+
// List start with 1 means it should be an explicit new list and should never join another list before it
|
|
37
|
+
if (level.format.startNumberOverride !== 1) {
|
|
38
|
+
level.format.startNumberOverride = undefined;
|
|
39
|
+
}
|
|
36
40
|
});
|
|
37
41
|
}
|
|
38
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleEnterOnList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts"],"names":[],"mappings":";;;;IAkBA;;OAEG;IACI,IAAM,iBAAiB,GAAwB,UAAA,OAAO;QACjD,IAAA,YAAY,GAAkB,OAAO,aAAzB,EAAE,WAAW,GAAK,OAAO,YAAZ,CAAa;QAE9C,IAAI,YAAY,IAAI,YAAY,IAAI,YAAY,IAAI,iBAAiB,EAAE;YAC3D,IAAA,IAAI,GAAK,WAAW,KAAhB,CAAiB;YAC7B,IAAM,KAAK,GAAG,IAAA,+DAAiC,EAC3C,IAAI,EACJ,CAAC,UAAU,CAAC,EACZ,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACnC,CAAC;YAEF,IAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAM,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAEnC,IAAI,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,cAAc,MAAK,UAAU,IAAI,UAAU,EAAE;gBAC/D,IAAI,QAAQ,GAAG,IAAA,yCAAW,EAAC,gBAAgB,CAAC,CAAC;gBAE7C,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;oBAC3B,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;iBACzB;qBAAM;oBACH,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;oBAE5D,IAAI,OAAO,CAAC,aAAa,EAAE;wBACvB,OAAO,CAAC,aAAa,CAAC,YAAY,GAAG,IAAA,iDAAmB;4BACpD,QAAQ;+CACL,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,UAC1B,CAAC;qBACN;iBACJ;gBAED,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACtD,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gBAEnD,IAAI,SAAS,EAAE;oBACX,IAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;oBAEtD,IACI,IAAA,gDAAkB,EAAuB,YAAY,EAAE,UAAU,CAAC;wBAClE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EACxB;wBACE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,UAAA,KAAK;4BAC7B,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"handleEnterOnList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts"],"names":[],"mappings":";;;;IAkBA;;OAEG;IACI,IAAM,iBAAiB,GAAwB,UAAA,OAAO;QACjD,IAAA,YAAY,GAAkB,OAAO,aAAzB,EAAE,WAAW,GAAK,OAAO,YAAZ,CAAa;QAE9C,IAAI,YAAY,IAAI,YAAY,IAAI,YAAY,IAAI,iBAAiB,EAAE;YAC3D,IAAA,IAAI,GAAK,WAAW,KAAhB,CAAiB;YAC7B,IAAM,KAAK,GAAG,IAAA,+DAAiC,EAC3C,IAAI,EACJ,CAAC,UAAU,CAAC,EACZ,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACnC,CAAC;YAEF,IAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAM,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAEnC,IAAI,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,cAAc,MAAK,UAAU,IAAI,UAAU,EAAE;gBAC/D,IAAI,QAAQ,GAAG,IAAA,yCAAW,EAAC,gBAAgB,CAAC,CAAC;gBAE7C,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;oBAC3B,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;iBACzB;qBAAM;oBACH,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;oBAE5D,IAAI,OAAO,CAAC,aAAa,EAAE;wBACvB,OAAO,CAAC,aAAa,CAAC,YAAY,GAAG,IAAA,iDAAmB;4BACpD,QAAQ;+CACL,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,UAC1B,CAAC;qBACN;iBACJ;gBAED,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACtD,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gBAEnD,IAAI,SAAS,EAAE;oBACX,IAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;oBAEtD,IACI,IAAA,gDAAkB,EAAuB,YAAY,EAAE,UAAU,CAAC;wBAClE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EACxB;wBACE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,UAAA,KAAK;4BAC7B,2FAA2F;4BAC3F,yGAAyG;4BACzG,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,KAAK,CAAC,EAAE;gCACxC,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;6BAChD;wBACL,CAAC,CAAC,CAAC;qBACN;iBACJ;gBAED,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;aAClC;SACJ;IACL,CAAC,CAAC;IArDW,QAAA,iBAAiB,qBAqD5B;IAEF,IAAM,eAAe,GAAG,UAAC,QAAsC;QAC3D,OAAO,CACH,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAC5B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW;YAC5C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YACxC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,iBAAiB;YAChE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CACtD,CAAC;IACN,CAAC,CAAC;IAEF,IAAM,iBAAiB,GAAG,UACtB,OAAoC,EACpC,QAAsC,EACtC,UAA0C;;QAElC,IAAA,WAAW,GAAK,OAAO,YAAZ,CAAa;QAChC,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC;QAC1C,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvD,IAAM,YAAY,GAAG,IAAA,+BAAc,EAAC,WAAW,CAAC,CAAC;QAEjD,IAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAM,WAAW,GAAuC,IAAA,4CAAc,EAClE,MAAM,EACN,WAAW,CAAC,MAAM,CAAC,MAAM,CAC5B,CAAC;QAEF,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtC,IAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;QAEnE,IAAI,SAAS,IAAI,CAAC,IAAI,mBAAmB,GAAG,CAAC,EAAE;YAC3C,CAAA,KAAA,WAAW,CAAC,MAAM,CAAA,CAAC,IAAI,8DAChB,IAAA,yCAAW,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,mBAAmB,CAAC,WAC5E;SACL;QAED,WAAW,CAAC,SAAS,GAAG,YAAY,CAAC;QACrC,IAAA,yCAAW,EAAC,UAAU,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;QAErE,IAAI,OAAO,CAAC,aAAa,IAAI,WAAW,EAAE;YACtC,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC;SACxC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC,CAAC;IAEF,IAAM,kBAAkB,GAAG,UAAC,QAAsC;QAC9D,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAA,KAAK;YAC5B,OAAO,IAAA,6CAAe,EAClB,KAAK,CAAC,QAAQ,kDAEP,KAAK,CAAC,MAAM,KACf,mBAAmB,EAAE,SAAS,EAC9B,mBAAmB,EAAE,SAAS,KAElC,KAAK,CAAC,OAAO,CAChB,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAC","sourcesContent":["import { getListAnnounceData } from 'roosterjs-content-model-api';\nimport { splitParagraph } from '../utils/splitParagraph';\nimport {\n createListItem,\n createListLevel,\n getClosestAncestorBlockGroupIndex,\n isBlockGroupOfType,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelListItem,\n DeleteSelectionStep,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelListItem,\n ShallowMutableContentModelListItem,\n ValidDeleteSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleEnterOnList: DeleteSelectionStep = context => {\n const { deleteResult, insertPoint } = context;\n\n if (deleteResult == 'notDeleted' || deleteResult == 'nothingToDelete') {\n const { path } = insertPoint;\n const index = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n\n const readonlyListItem = path[index];\n const listParent = path[index + 1];\n\n if (readonlyListItem?.blockGroupType === 'ListItem' && listParent) {\n let listItem = mutateBlock(readonlyListItem);\n\n if (isEmptyListItem(listItem)) {\n listItem.levels.pop();\n } else {\n listItem = createNewListItem(context, listItem, listParent);\n\n if (context.formatContext) {\n context.formatContext.announceData = getListAnnounceData([\n listItem,\n ...path.slice(index + 1),\n ]);\n }\n }\n\n const listIndex = listParent.blocks.indexOf(listItem);\n const nextBlock = listParent.blocks[listIndex + 1];\n\n if (nextBlock) {\n const nextListItem = listParent.blocks[listIndex + 1];\n\n if (\n isBlockGroupOfType<ContentModelListItem>(nextListItem, 'ListItem') &&\n nextListItem.levels[0]\n ) {\n nextListItem.levels.forEach(level => {\n // Remove startNumberOverride so that next list item can join current list, unless it is 1.\n // List start with 1 means it should be an explicit new list and should never join another list before it\n if (level.format.startNumberOverride !== 1) {\n level.format.startNumberOverride = undefined;\n }\n });\n }\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n\nconst isEmptyListItem = (listItem: ReadonlyContentModelListItem) => {\n return (\n listItem.blocks.length === 1 &&\n listItem.blocks[0].blockType === 'Paragraph' &&\n listItem.blocks[0].segments.length === 2 &&\n listItem.blocks[0].segments[0].segmentType === 'SelectionMarker' &&\n listItem.blocks[0].segments[1].segmentType === 'Br'\n );\n};\n\nconst createNewListItem = (\n context: ValidDeleteSelectionContext,\n listItem: ReadonlyContentModelListItem,\n listParent: ReadonlyContentModelBlockGroup\n) => {\n const { insertPoint } = context;\n const listIndex = listParent.blocks.indexOf(listItem);\n const currentPara = insertPoint.paragraph;\n const paraIndex = listItem.blocks.indexOf(currentPara);\n const newParagraph = splitParagraph(insertPoint);\n\n const levels = createNewListLevel(listItem);\n const newListItem: ShallowMutableContentModelListItem = createListItem(\n levels,\n insertPoint.marker.format\n );\n\n newListItem.blocks.push(newParagraph);\n\n const remainingBlockCount = listItem.blocks.length - paraIndex - 1;\n\n if (paraIndex >= 0 && remainingBlockCount > 0) {\n newListItem.blocks.push(\n ...mutateBlock(listItem).blocks.splice(paraIndex + 1, remainingBlockCount)\n );\n }\n\n insertPoint.paragraph = newParagraph;\n mutateBlock(listParent).blocks.splice(listIndex + 1, 0, newListItem);\n\n if (context.lastParagraph == currentPara) {\n context.lastParagraph = newParagraph;\n }\n\n return newListItem;\n};\n\nconst createNewListLevel = (listItem: ReadonlyContentModelListItem) => {\n return listItem.levels.map(level => {\n return createListLevel(\n level.listType,\n {\n ...level.format,\n startNumberOverride: undefined,\n displayForDummyItem: undefined, // When ENTER, we should create a new regular list item, so force its dummy item display to undefined\n },\n level.dataset\n );\n });\n};\n"]}
|
|
@@ -53,7 +53,8 @@ export declare class ImageEditPlugin implements ImageEditor, EditorPlugin {
|
|
|
53
53
|
onPluginEvent(event: PluginEvent): void;
|
|
54
54
|
private isImageSelection;
|
|
55
55
|
private mouseUpHandler;
|
|
56
|
-
private
|
|
56
|
+
private mouseDownHandler;
|
|
57
|
+
private onDropHandler;
|
|
57
58
|
private keyDownHandler;
|
|
58
59
|
private applyFormatWithContentModel;
|
|
59
60
|
private startEditing;
|
|
@@ -68,5 +69,4 @@ export declare class ImageEditPlugin implements ImageEditor, EditorPlugin {
|
|
|
68
69
|
private removeImageWrapper;
|
|
69
70
|
flipImage(direction: 'horizontal' | 'vertical'): void;
|
|
70
71
|
rotateImage(angleRad: number): void;
|
|
71
|
-
get isEditingImage(): boolean;
|
|
72
72
|
}
|
|
@@ -12,6 +12,7 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
12
12
|
onSelectState: ['resize', 'rotate'],
|
|
13
13
|
};
|
|
14
14
|
var MouseRightButton = 2;
|
|
15
|
+
var DRAG_ID = '_dragging';
|
|
15
16
|
/**
|
|
16
17
|
* ImageEdit plugin handles the following image editing features:
|
|
17
18
|
* - Resize image
|
|
@@ -39,7 +40,6 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
39
40
|
this.croppers = [];
|
|
40
41
|
this.zoomScale = 1;
|
|
41
42
|
this.disposer = null;
|
|
42
|
-
//EXPOSED FOR TEST ONLY
|
|
43
43
|
this.isEditing = false;
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
@@ -65,6 +65,16 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
67
|
},
|
|
68
|
+
dragstart: {
|
|
69
|
+
beforeDispatch: function (ev) {
|
|
70
|
+
if (_this.editor) {
|
|
71
|
+
var target = ev.target;
|
|
72
|
+
if (_this.isImageSelection(target)) {
|
|
73
|
+
target.id = target.id + DRAG_ID;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
},
|
|
68
78
|
});
|
|
69
79
|
};
|
|
70
80
|
/**
|
|
@@ -92,12 +102,20 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
92
102
|
return;
|
|
93
103
|
}
|
|
94
104
|
switch (event.eventType) {
|
|
105
|
+
case 'mouseDown':
|
|
106
|
+
this.mouseDownHandler(this.editor, event);
|
|
107
|
+
break;
|
|
95
108
|
case 'mouseUp':
|
|
96
109
|
this.mouseUpHandler(this.editor, event);
|
|
97
110
|
break;
|
|
98
111
|
case 'keyDown':
|
|
99
112
|
this.keyDownHandler(this.editor, event);
|
|
100
113
|
break;
|
|
114
|
+
case 'contentChanged':
|
|
115
|
+
if (event.source == roosterjs_content_model_dom_1.ChangeSource.Drop) {
|
|
116
|
+
this.onDropHandler(this.editor);
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
101
119
|
}
|
|
102
120
|
};
|
|
103
121
|
ImageEditPlugin.prototype.isImageSelection = function (target) {
|
|
@@ -116,23 +134,31 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
116
134
|
this.applyFormatWithContentModel(editor, this.isCropMode, shouldSelectImage);
|
|
117
135
|
}
|
|
118
136
|
};
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
parent = parent.parentNode;
|
|
137
|
+
ImageEditPlugin.prototype.mouseDownHandler = function (editor, event) {
|
|
138
|
+
if (this.isEditing &&
|
|
139
|
+
this.isImageSelection(event.rawEvent.target) &&
|
|
140
|
+
event.rawEvent.button !== MouseRightButton) {
|
|
141
|
+
this.applyFormatWithContentModel(editor, this.isCropMode, this.shadowSpan === event.rawEvent.target);
|
|
125
142
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
143
|
+
};
|
|
144
|
+
ImageEditPlugin.prototype.onDropHandler = function (editor) {
|
|
145
|
+
var selection = editor.getDOMSelection();
|
|
146
|
+
if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image') {
|
|
147
|
+
editor.formatContentModel(function (model) {
|
|
148
|
+
var imageDragged = (0, findEditingImage_1.findEditingImage)(model, selection.image.id);
|
|
149
|
+
var imageDropped = (0, findEditingImage_1.findEditingImage)(model, selection.image.id.replace(DRAG_ID, '').trim());
|
|
150
|
+
if (imageDragged && imageDropped) {
|
|
151
|
+
var draggedIndex = imageDragged.paragraph.segments.indexOf(imageDragged.image);
|
|
152
|
+
(0, roosterjs_content_model_dom_1.mutateBlock)(imageDragged.paragraph).segments.splice(draggedIndex, 1);
|
|
153
|
+
var segment = imageDropped.image;
|
|
154
|
+
var paragraph = imageDropped.paragraph;
|
|
155
|
+
(0, roosterjs_content_model_dom_1.mutateSegment)(paragraph, segment, function (image) {
|
|
156
|
+
image.isSelected = true;
|
|
157
|
+
image.isSelectedAsImageSelection = true;
|
|
158
|
+
});
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
136
162
|
});
|
|
137
163
|
}
|
|
138
164
|
};
|
|
@@ -142,13 +168,7 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
142
168
|
this.removeImageWrapper();
|
|
143
169
|
}
|
|
144
170
|
else {
|
|
145
|
-
|
|
146
|
-
var isImageSelection = (selection === null || selection === void 0 ? void 0 : selection.type) == 'image';
|
|
147
|
-
if (isImageSelection) {
|
|
148
|
-
this.selectBeforeEditingImage(editor, selection.image);
|
|
149
|
-
}
|
|
150
|
-
this.applyFormatWithContentModel(editor, this.isCropMode, ((0, roosterjs_content_model_dom_1.isModifierKey)(event.rawEvent) || event.rawEvent.shiftKey) && isImageSelection //if it's a modifier key over a image, the image should select the image
|
|
151
|
-
);
|
|
171
|
+
this.applyFormatWithContentModel(editor, this.isCropMode, true /** should selectImage */, false /* isApiOperation */);
|
|
152
172
|
}
|
|
153
173
|
}
|
|
154
174
|
};
|
|
@@ -175,9 +195,9 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
175
195
|
clonedImage_1) {
|
|
176
196
|
(0, roosterjs_content_model_dom_1.mutateSegment)(previousSelectedImage.paragraph, previousSelectedImage.image, function (image) {
|
|
177
197
|
(0, applyChange_1.applyChange)(editor, selectedImage_1, image, imageEditInfo_1, lastSrc_1, _this.wasImageResized || _this.isCropMode, clonedImage_1);
|
|
178
|
-
delete image.dataset.isEditing;
|
|
179
198
|
image.isSelected = shouldSelectImage;
|
|
180
199
|
image.isSelectedAsImageSelection = shouldSelectImage;
|
|
200
|
+
delete image.dataset.isEditing;
|
|
181
201
|
});
|
|
182
202
|
if (shouldSelectImage) {
|
|
183
203
|
(0, normalizeImageSelection_1.normalizeImageSelection)(previousSelectedImage);
|
|
@@ -407,14 +427,6 @@ define(["require", "exports", "tslib", "./utils/applyChange", "./utils/canRegene
|
|
|
407
427
|
});
|
|
408
428
|
}
|
|
409
429
|
};
|
|
410
|
-
Object.defineProperty(ImageEditPlugin.prototype, "isEditingImage", {
|
|
411
|
-
//EXPOSED FOR TEST ONLY
|
|
412
|
-
get: function () {
|
|
413
|
-
return this.isEditing;
|
|
414
|
-
},
|
|
415
|
-
enumerable: false,
|
|
416
|
-
configurable: true
|
|
417
|
-
});
|
|
418
430
|
return ImageEditPlugin;
|
|
419
431
|
}());
|
|
420
432
|
exports.ImageEditPlugin = ImageEditPlugin;
|