roosterjs-content-model-dom 9.50.1 → 9.51.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/domToModel/processors/listItemProcessor.js +16 -6
- package/lib/domToModel/processors/listItemProcessor.js.map +1 -1
- package/lib/domToModel/processors/listProcessor.js +3 -1
- package/lib/domToModel/processors/listProcessor.js.map +1 -1
- package/lib/modelToDom/handlers/handleBlockGroupChildren.js +1 -1
- package/lib/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
- package/lib/modelToDom/handlers/handleList.js +7 -13
- package/lib/modelToDom/handlers/handleList.js.map +1 -1
- package/lib/modelToDom/handlers/handleListItem.js +2 -4
- package/lib/modelToDom/handlers/handleListItem.js.map +1 -1
- package/lib-amd/domToModel/processors/listItemProcessor.js +16 -7
- package/lib-amd/domToModel/processors/listItemProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/listProcessor.js +3 -1
- package/lib-amd/domToModel/processors/listProcessor.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleBlockGroupChildren.js +1 -1
- package/lib-amd/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleList.js +7 -13
- package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleListItem.js +2 -4
- package/lib-amd/modelToDom/handlers/handleListItem.js.map +1 -1
- package/lib-mjs/domToModel/processors/listItemProcessor.js +16 -6
- package/lib-mjs/domToModel/processors/listItemProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/listProcessor.js +3 -1
- package/lib-mjs/domToModel/processors/listProcessor.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleBlockGroupChildren.js +1 -1
- package/lib-mjs/modelToDom/handlers/handleBlockGroupChildren.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleList.js +7 -13
- package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleListItem.js +2 -4
- package/lib-mjs/modelToDom/handlers/handleListItem.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.listItemProcessor = void 0;
|
|
4
4
|
var createListItem_1 = require("../../modelApi/creators/createListItem");
|
|
5
|
+
var createListLevel_1 = require("../../modelApi/creators/createListLevel");
|
|
5
6
|
var parseFormat_1 = require("../utils/parseFormat");
|
|
6
7
|
var stackFormat_1 = require("../utils/stackFormat");
|
|
7
8
|
/**
|
|
@@ -10,14 +11,22 @@ var stackFormat_1 = require("../utils/stackFormat");
|
|
|
10
11
|
var listItemProcessor = function (group, element, context) {
|
|
11
12
|
var _a;
|
|
12
13
|
var listFormat = context.listFormat;
|
|
13
|
-
|
|
14
|
+
var originalListParent = listFormat.listParent;
|
|
15
|
+
var shouldPopListLevel = false;
|
|
16
|
+
try {
|
|
17
|
+
listFormat.listParent = (_a = listFormat.listParent) !== null && _a !== void 0 ? _a : group;
|
|
18
|
+
var listParent_1 = listFormat.listParent;
|
|
19
|
+
if (listFormat.levels.length == 0) {
|
|
20
|
+
listFormat.levels.push((0, createListLevel_1.createListLevel)(listFormat.potentialListType || 'UL', context.blockFormat));
|
|
21
|
+
shouldPopListLevel = true;
|
|
22
|
+
}
|
|
14
23
|
(0, stackFormat_1.stackFormat)(context, {
|
|
15
24
|
segment: 'shallowCloneForBlock',
|
|
16
25
|
}, function () {
|
|
17
26
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
|
|
18
27
|
var listItem = (0, createListItem_1.createListItem)(listFormat.levels, context.segmentFormat);
|
|
19
28
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
|
|
20
|
-
|
|
29
|
+
listParent_1.blocks.push(listItem);
|
|
21
30
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listItemThread, listItem.levels[listItem.levels.length - 1].format, context);
|
|
22
31
|
context.elementProcessors.child(listItem, element, context);
|
|
23
32
|
var firstChild = listItem.blocks[0];
|
|
@@ -29,10 +38,11 @@ var listItemProcessor = function (group, element, context) {
|
|
|
29
38
|
}
|
|
30
39
|
});
|
|
31
40
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
finally {
|
|
42
|
+
if (shouldPopListLevel) {
|
|
43
|
+
listFormat.levels.pop();
|
|
44
|
+
}
|
|
45
|
+
listFormat.listParent = originalListParent;
|
|
36
46
|
}
|
|
37
47
|
};
|
|
38
48
|
exports.listItemProcessor = listItemProcessor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AACxE,oDAAmD;AACnD,oDAAmD;AAGnD;;GAEG;AACI,IAAM,iBAAiB,GAAoC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IAC9E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAE/B,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AACxE,2EAA0E;AAC1E,oDAAmD;AACnD,oDAAmD;AAGnD;;GAEG;AACI,IAAM,iBAAiB,GAAoC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IAC9E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC;IACjD,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,IAAI;QACA,UAAU,CAAC,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,KAAK,CAAC;QAEvD,IAAM,YAAU,GAAG,UAAU,CAAC,UAAU,CAAC;QAEzC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;YAC/B,UAAU,CAAC,MAAM,CAAC,IAAI,CAClB,IAAA,iCAAe,EAAC,UAAU,CAAC,iBAAiB,IAAI,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAC7E,CAAC;YACF,kBAAkB,GAAG,IAAI,CAAC;SAC7B;QAED,IAAA,yBAAW,EACP,OAAO,EACP;YACI,OAAO,EAAE,sBAAsB;SAClC,EACD;YACI,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,OAAO,CAAC,aAAa,EACrB,OAAO,CACV,CAAC;YAEF,IAAM,QAAQ,GAAG,IAAA,+BAAc,EAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;YAC1E,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,eAAe,EACrC,QAAQ,CAAC,MAAM,EACf,OAAO,CACV,CAAC;YAEF,YAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEjC,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAClD,OAAO,CACV,CAAC;YAEF,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE5D,IAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAEtC,IACI,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;gBAC3B,UAAU,CAAC,SAAS,IAAI,WAAW;gBACnC,UAAU,CAAC,UAAU,EACvB;gBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBAClD,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;aAC1B;QACL,CAAC,CACJ,CAAC;KACL;YAAS;QACN,IAAI,kBAAkB,EAAE;YACpB,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;SAC3B;QAED,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC;KAC9C;AACL,CAAC,CAAC;AApEW,QAAA,iBAAiB,qBAoE5B","sourcesContent":["import { createListItem } from '../../modelApi/creators/createListItem';\nimport { createListLevel } from '../../modelApi/creators/createListLevel';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listItemProcessor: ElementProcessor<HTMLLIElement> = (group, element, context) => {\n const { listFormat } = context;\n const originalListParent = listFormat.listParent;\n let shouldPopListLevel = false;\n\n try {\n listFormat.listParent = listFormat.listParent ?? group;\n\n const listParent = listFormat.listParent;\n\n if (listFormat.levels.length == 0) {\n listFormat.levels.push(\n createListLevel(listFormat.potentialListType || 'UL', context.blockFormat)\n );\n shouldPopListLevel = true;\n }\n\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n },\n () => {\n parseFormat(\n element,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n const listItem = createListItem(listFormat.levels, context.segmentFormat);\n parseFormat(\n element,\n context.formatParsers.listItemElement,\n listItem.format,\n context\n );\n\n listParent.blocks.push(listItem);\n\n parseFormat(\n element,\n context.formatParsers.listItemThread,\n listItem.levels[listItem.levels.length - 1].format,\n context\n );\n\n context.elementProcessors.child(listItem, element, context);\n\n const firstChild = listItem.blocks[0];\n\n if (\n listItem.blocks.length == 1 &&\n firstChild.blockType == 'Paragraph' &&\n firstChild.isImplicit\n ) {\n Object.assign(listItem.format, firstChild.format);\n firstChild.format = {};\n }\n }\n );\n } finally {\n if (shouldPopListLevel) {\n listFormat.levels.pop();\n }\n\n listFormat.listParent = originalListParent;\n }\n};\n"]}
|
|
@@ -12,13 +12,15 @@ var listProcessor = function (group, element, context) {
|
|
|
12
12
|
segment: 'shallowCloneForBlock',
|
|
13
13
|
paragraph: 'shallowCloneForGroup',
|
|
14
14
|
}, function () {
|
|
15
|
-
var
|
|
15
|
+
var tagName = element.tagName;
|
|
16
|
+
var level = (0, createListLevel_1.createListLevel)(tagName, context.blockFormat);
|
|
16
17
|
var listFormat = context.listFormat;
|
|
17
18
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.dataset, level.dataset, context);
|
|
18
19
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listLevelThread, level.format, context);
|
|
19
20
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listLevel, level.format, context);
|
|
20
21
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.segment, context.segmentFormat, context);
|
|
21
22
|
var originalListParent = listFormat.listParent;
|
|
23
|
+
listFormat.potentialListType = tagName;
|
|
22
24
|
listFormat.listParent = listFormat.listParent || group;
|
|
23
25
|
listFormat.levels.push(level);
|
|
24
26
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAC1E,oDAAmD;AACnD,oDAAmD;AAGnD;;GAEG;AACI,IAAM,aAAa,GAA0D,UAChF,KAAK,EACL,OAAO,EACP,OAAO;IAEP,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EAAE,sBAAsB;QAC/B,SAAS,EAAE,sBAAsB;KACpC,EACD;QACI,IAAM,KAAK,GAA0B,IAAA,iCAAe,
|
|
1
|
+
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAC1E,oDAAmD;AACnD,oDAAmD;AAGnD;;GAEG;AACI,IAAM,aAAa,GAA0D,UAChF,KAAK,EACL,OAAO,EACP,OAAO;IAEP,IAAA,yBAAW,EACP,OAAO,EACP;QACI,OAAO,EAAE,sBAAsB;QAC/B,SAAS,EAAE,sBAAsB;KACpC,EACD;QACI,IAAM,OAAO,GAAG,OAAO,CAAC,OAAsB,CAAC;QAC/C,IAAM,KAAK,GAA0B,IAAA,iCAAe,EAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;QAE/B,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7E,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEpF,IAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC;QAEjD,UAAU,CAAC,iBAAiB,GAAG,OAAO,CAAC;QACvC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;QACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI;YACA,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC5D;gBAAS;YACN,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACxB,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC;SAC9C;IACL,CAAC,CACJ,CAAC;AACN,CAAC,CAAC;AAnCW,QAAA,aAAa,iBAmCxB","sourcesContent":["import { createListLevel } from '../../modelApi/creators/createListLevel';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ContentModelListLevel, ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listProcessor: ElementProcessor<HTMLOListElement | HTMLUListElement> = (\n group,\n element,\n context\n) => {\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n paragraph: 'shallowCloneForGroup',\n },\n () => {\n const tagName = element.tagName as 'OL' | 'UL';\n const level: ContentModelListLevel = createListLevel(tagName, context.blockFormat);\n const { listFormat } = context;\n\n parseFormat(element, context.formatParsers.dataset, level.dataset, context);\n parseFormat(element, context.formatParsers.listLevelThread, level.format, context);\n parseFormat(element, context.formatParsers.listLevel, level.format, context);\n parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);\n\n const originalListParent = listFormat.listParent;\n\n listFormat.potentialListType = tagName;\n listFormat.listParent = listFormat.listParent || group;\n listFormat.levels.push(level);\n\n try {\n context.elementProcessors.child(group, element, context);\n } finally {\n listFormat.levels.pop();\n listFormat.listParent = originalListParent;\n }\n }\n );\n};\n"]}
|
|
@@ -40,7 +40,7 @@ var handleBlockGroupChildren = function (doc, parent, group, context) {
|
|
|
40
40
|
exports.handleBlockGroupChildren = handleBlockGroupChildren;
|
|
41
41
|
function cleanUpNodeStack(nodeStack, context) {
|
|
42
42
|
var _a, _b;
|
|
43
|
-
if (
|
|
43
|
+
if (nodeStack.length > 0) {
|
|
44
44
|
// Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node
|
|
45
45
|
for (var i = nodeStack.length - 1; i > 0; i--) {
|
|
46
46
|
var node = (_b = (_a = nodeStack.pop()) === null || _a === void 0 ? void 0 : _a.refNode) !== null && _b !== void 0 ? _b : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;AAAA,8DAA6D;AAQ7D;;GAEG;AACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;iBAC7B;aACJ;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEhD,uEAAuE;QACvE,IAAA,mCAAgB,EAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACvD;YAAS;QACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;KACpC;AACL,CAAC,CAAC;AA1CW,QAAA,wBAAwB,4BA0CnC;AAEF,SAAS,gBAAgB,CAAC,SAAoC,EAAE,OAA0B;;IACtF,IAAI,
|
|
1
|
+
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;AAAA,8DAA6D;AAQ7D;;GAEG;AACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;iBAC7B;aACJ;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEhD,uEAAuE;QACvE,IAAA,mCAAgB,EAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACvD;YAAS;QACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;KACpC;AACL,CAAC,CAAC;AA1CW,QAAA,wBAAwB,4BA0CnC;AAEF,SAAS,gBAAgB,CAAC,SAAoC,EAAE,OAA0B;;IACtF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACtB,qFAAqF;QACrF,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAM,IAAI,GAAG,MAAA,MAAA,SAAS,CAAC,GAAG,EAAE,0CAAE,OAAO,mCAAI,IAAI,CAAC;YAE9C,IAAA,mCAAgB,EAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;SACpD;KACJ;AACL,CAAC","sourcesContent":["import { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport type {\n ContentModelBlockGroup,\n ContentModelHandler,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleBlockGroupChildren: ContentModelHandler<ContentModelBlockGroup> = (\n doc: Document,\n parent: Node,\n group: ContentModelBlockGroup,\n context: ModelToDomContext\n) => {\n const { listFormat } = context;\n const nodeStack = listFormat.nodeStack;\n let refNode: Node | null = parent.firstChild;\n\n try {\n group.blocks.forEach((childBlock, index) => {\n // When process list, we need a node stack.\n // When there are two continuous lists, they should share the same stack\n // so that list items with same type/threadId can be merged into the same list element\n // In other cases, clear the stack so that two separate lists won't share the same list element\n if (\n index == 0 ||\n childBlock.blockType != 'BlockGroup' ||\n childBlock.blockGroupType != 'ListItem'\n ) {\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n if (listFormat.nodeStack.length > 0) {\n listFormat.nodeStack = [];\n }\n }\n\n refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);\n\n if (childBlock.blockType == 'Entity') {\n context.domIndexer?.onBlockEntity(childBlock, group);\n }\n });\n\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n // Remove all rest node if any since they don't appear in content model\n cleanUpRestNodes(refNode, context.rewriteFromModel);\n } finally {\n listFormat.nodeStack = nodeStack;\n }\n};\n\nfunction cleanUpNodeStack(nodeStack: ModelToDomListStackItem[], context: ModelToDomContext) {\n if (nodeStack.length > 0) {\n // Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node\n for (let i = nodeStack.length - 1; i > 0; i--) {\n const node = nodeStack.pop()?.refNode ?? null;\n\n cleanUpRestNodes(node, context.rewriteFromModel);\n }\n }\n}\n"]}
|
|
@@ -37,20 +37,16 @@ var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
37
37
|
// Apply metadata to list level to make sure list style is correct after rendering
|
|
38
38
|
(0, applyMetadata_1.applyMetadata)(itemLevel, context.metadataAppliers.listLevel, itemLevel.format, context);
|
|
39
39
|
}
|
|
40
|
-
if (
|
|
41
|
-
parentLevel.refNode &&
|
|
42
|
-
itemLevel.cachedElement == parentLevel.refNode) {
|
|
40
|
+
if (parentLevel.refNode && itemLevel.cachedElement == parentLevel.refNode) {
|
|
43
41
|
// Move refNode to next node since we are reusing this cached element
|
|
44
42
|
parentLevel.refNode = parentLevel.refNode.nextSibling;
|
|
45
43
|
}
|
|
46
44
|
}
|
|
47
45
|
// Cut off remained list levels that we can't reuse
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
(0, cleanUpRestNodes_1.cleanUpRestNodes)(stackLevel.refNode, context.rewriteFromModel);
|
|
53
|
-
}
|
|
46
|
+
// Clean up all rest nodes in the reused list levels
|
|
47
|
+
for (var i = layer + 1; i < nodeStack.length; i++) {
|
|
48
|
+
var stackLevel = nodeStack[i];
|
|
49
|
+
(0, cleanUpRestNodes_1.cleanUpRestNodes)(stackLevel.refNode, context.rewriteFromModel);
|
|
54
50
|
}
|
|
55
51
|
nodeStack.splice(layer + 1);
|
|
56
52
|
// Create new list levels that are after reused ones
|
|
@@ -61,7 +57,7 @@ var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
61
57
|
var isNewlyCreated = false;
|
|
62
58
|
var levelRefNode = (_c = nodeStack[layer].refNode) !== null && _c !== void 0 ? _c : null;
|
|
63
59
|
context.listFormat.currentLevel = layer;
|
|
64
|
-
if (
|
|
60
|
+
if (level.cachedElement) {
|
|
65
61
|
newList = level.cachedElement;
|
|
66
62
|
nodeStack[layer].refNode = (0, reuseCachedElement_1.reuseCachedElement)(lastParent, level.cachedElement, levelRefNode, context.rewriteFromModel);
|
|
67
63
|
nodeStack.push({
|
|
@@ -83,9 +79,7 @@ var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
83
79
|
format: (0, tslib_1.__assign)({}, level.format),
|
|
84
80
|
dataset: (0, tslib_1.__assign)({}, level.dataset),
|
|
85
81
|
});
|
|
86
|
-
|
|
87
|
-
level.cachedElement = newList;
|
|
88
|
-
}
|
|
82
|
+
level.cachedElement = newList;
|
|
89
83
|
}
|
|
90
84
|
(0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevelThread, level.format, context);
|
|
91
85
|
// Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":";;;;AAAA,oDAAmD;AACnD,wDAAuD;AACvD,8DAA6D;AAC7D,wEAAuE;AAOvE;;GAEG;AACI,IAAM,UAAU,GAAmD,UACtE,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;IAEpB,IAAI,KAAK,GAAG,CAAC,CAAC;IACN,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;IAEzC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACvB,SAAS,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,OAAO,SAAA;SACV,CAAC,CAAC;KACN;IAED,0EAA0E;IAC1E,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC5E,IAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,IAAM,UAAU,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzC,OAAO,CAAC,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;QAExC,IACI,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ;YACzC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,WAAW,KAAI,SAAS,CAAC,OAAO,CAAC,WAAW;YAChE,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;gBACvB,OAAO,SAAS,CAAC,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC;YAC7D,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;gBACvB,SAAS,CAAC,MAAM,CAAC,aAAa,KAAI,MAAA,UAAU,CAAC,MAAM,0CAAE,aAAa,CAAA,CAAC,EACzE;YACE,MAAM;SACT;aAAM,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI,EAAE;YACnC,kFAAkF;YAClF,IAAA,6BAAa,EAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC3F;QAED,
|
|
1
|
+
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleList: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n let layer = 0;\n const { nodeStack } = context.listFormat;\n\n if (nodeStack.length == 0) {\n nodeStack.push({\n node: parent,\n refNode,\n });\n }\n\n // Skip existing list levels that has same properties so we can reuse them\n for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {\n const parentLevel = nodeStack[layer];\n const stackLevel = nodeStack[layer + 1];\n const itemLevel = listItem.levels[layer];\n\n context.listFormat.currentLevel = layer;\n\n if (\n stackLevel.listType != itemLevel.listType ||\n stackLevel.dataset?.editingInfo != itemLevel.dataset.editingInfo ||\n (itemLevel.listType == 'OL' &&\n typeof itemLevel.format.startNumberOverride === 'number') ||\n (itemLevel.listType == 'UL' &&\n itemLevel.format.listStyleType != stackLevel.format?.listStyleType)\n ) {\n break;\n } else if (itemLevel.listType == 'UL') {\n // Apply metadata to list level to make sure list style is correct after rendering\n applyMetadata(itemLevel, context.metadataAppliers.listLevel, itemLevel.format, context);\n }\n\n if (parentLevel.refNode && itemLevel.cachedElement == parentLevel.refNode) {\n // Move refNode to next node since we are reusing this cached element\n parentLevel.refNode = parentLevel.refNode.nextSibling;\n }\n }\n\n // Cut off remained list levels that we can't reuse\n // Clean up all rest nodes in the reused list levels\n for (let i = layer + 1; i < nodeStack.length; i++) {\n const stackLevel = nodeStack[i];\n\n cleanUpRestNodes(stackLevel.refNode, context.rewriteFromModel);\n }\n\n nodeStack.splice(layer + 1);\n\n // Create new list levels that are after reused ones\n for (; layer < listItem.levels.length; layer++) {\n const level = listItem.levels[layer];\n const lastParent = nodeStack[nodeStack.length - 1].node;\n\n let newList: HTMLOListElement | HTMLUListElement;\n let isNewlyCreated = false;\n const levelRefNode = nodeStack[layer].refNode ?? null;\n\n context.listFormat.currentLevel = layer;\n\n if (level.cachedElement) {\n newList = level.cachedElement;\n\n nodeStack[layer].refNode = reuseCachedElement(\n lastParent,\n level.cachedElement,\n levelRefNode,\n context.rewriteFromModel\n );\n nodeStack.push({\n node: newList,\n refNode: newList.firstChild,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n } else {\n newList = doc.createElement(level.listType == 'OL' ? 'ol' : 'ul');\n isNewlyCreated = true;\n\n lastParent.insertBefore(newList, levelRefNode);\n nodeStack.push({\n node: newList,\n refNode: null,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n\n level.cachedElement = newList;\n }\n\n applyFormat(newList, context.formatAppliers.listLevelThread, level.format, context);\n\n // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listLevel, level.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(newList, context.formatAppliers.listLevel, level.format, context);\n applyFormat(newList, context.formatAppliers.dataset, level.dataset, context);\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(level, newList);\n }\n }\n\n return nodeStack[0].refNode;\n};\n"]}
|
|
@@ -23,7 +23,7 @@ var handleListItem = function (doc, parent, listItem, context, refNode) {
|
|
|
23
23
|
var level = listItem.levels[listItem.levels.length - 1];
|
|
24
24
|
var li;
|
|
25
25
|
var isNewlyCreated = false;
|
|
26
|
-
if (
|
|
26
|
+
if (listItem.cachedElement) {
|
|
27
27
|
li = listItem.cachedElement;
|
|
28
28
|
// Check if the cached LI is used as refNode under another list level,
|
|
29
29
|
// since we know we are going to move it under the current listParent,
|
|
@@ -42,9 +42,7 @@ var handleListItem = function (doc, parent, listItem, context, refNode) {
|
|
|
42
42
|
// This happens when outdent a list item to cause it has no list level
|
|
43
43
|
listParent.insertBefore(li, (itemRefNode === null || itemRefNode === void 0 ? void 0 : itemRefNode.parentNode) == listParent ? itemRefNode : null);
|
|
44
44
|
context.rewriteFromModel.addedBlockElements.push(li);
|
|
45
|
-
|
|
46
|
-
listItem.cachedElement = li;
|
|
47
|
-
}
|
|
45
|
+
listItem.cachedElement = li;
|
|
48
46
|
}
|
|
49
47
|
if (level) {
|
|
50
48
|
(0, applyFormat_1.applyFormat)(li, context.formatAppliers.segment, listItem.formatHolder.format, context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":";;;AAAA,oDAAmD;AACnD,wDAAuD;AACvD,4EAA2E;AAC3E,wEAAuE;AACvE,wFAAuF;AACvF,oDAAmD;AACnD,gDAA+C;AAQ/C,IAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,IAAM,qBAAqB,GAAG,cAAc,CAAC;AAE7C;;GAEG;AACI,IAAM,cAAc,GAAmD,UAC1E,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;IAEpB,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;IACzC,IAAM,SAAS,GAAqC,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,mCAAI,EAAE,CAAC;IAC5F,IAAM,WAAW,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;IAC9C,IAAM,UAAU,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC;IAC5C,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,IAAI,EAAiB,CAAC;IACtB,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,IAAI,
|
|
1
|
+
{"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { isGenericRoleElement } from '../../domUtils/isGenericRoleElement';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport { setParagraphNotImplicit } from '../../modelApi/block/setParagraphNotImplicit';\nimport { stackFormat } from '../utils/stackFormat';\nimport { unwrap } from '../../domUtils/unwrap';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\nconst HtmlRoleAttribute = 'role';\nconst PresentationRoleValue = 'presentation';\n\n/**\n * @internal\n */\nexport const handleListItem: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n refNode = context.modelHandlers.list(doc, parent, listItem, context, refNode);\n\n const { nodeStack } = context.listFormat;\n const leafLevel: Partial<ModelToDomListStackItem> = nodeStack?.[nodeStack.length - 1] ?? {};\n const itemRefNode = leafLevel.refNode || null;\n const listParent = leafLevel.node || parent;\n const level = listItem.levels[listItem.levels.length - 1];\n\n let li: HTMLLIElement;\n let isNewlyCreated = false;\n\n if (listItem.cachedElement) {\n li = listItem.cachedElement;\n\n // Check if the cached LI is used as refNode under another list level,\n // since we know we are going to move it under the current listParent,\n // we need to update the refNode of the previous list level to avoid removing it later\n for (let i = 0; i < nodeStack.length - 1; i++) {\n if (nodeStack[i].refNode === li) {\n nodeStack[i].refNode = li.nextSibling;\n }\n }\n\n leafLevel.refNode = reuseCachedElement(\n listParent,\n li,\n itemRefNode,\n context.rewriteFromModel\n );\n } else {\n li = doc.createElement('li');\n isNewlyCreated = true;\n\n // It is possible listParent is the same with parent param.\n // This happens when outdent a list item to cause it has no list level\n listParent.insertBefore(li, itemRefNode?.parentNode == listParent ? itemRefNode : null);\n context.rewriteFromModel.addedBlockElements.push(li);\n listItem.cachedElement = li;\n }\n\n if (level) {\n applyFormat(li, context.formatAppliers.segment, listItem.formatHolder.format, context);\n applyFormat(li, context.formatAppliers.listItemThread, level.format, context);\n\n // Need to apply metadata after applying listItem format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listItem, listItem.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(li, context.formatAppliers.listItemElement, listItem.format, context);\n\n stackFormat(context, listItem.formatHolder.format, () => {\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n });\n } else {\n // There is no level for this list item, that means it should be moved out of the list\n // For each paragraph, make it not implicit so it will have a DIV around it, to avoid more paragraphs connected together\n listItem.blocks.forEach(setParagraphNotImplicit);\n\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n\n unwrap(li);\n }\n\n // Add role=\"presentation\" to all generic role elements inside the LI element\n // This is to make sure the elements are announced correctly by screen readers\n // when using arrow keys to navigate the list.\n for (let index = 0; index < li.children.length; index++) {\n const element = li.children.item(index);\n if (isGenericRoleElement(element)) {\n element.setAttribute(HtmlRoleAttribute, PresentationRoleValue);\n }\n }\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(listItem, li);\n }\n\n return refNode;\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
define(["require", "exports", "../../modelApi/creators/createListItem", "../utils/parseFormat", "../utils/stackFormat"], function (require, exports, createListItem_1, parseFormat_1, stackFormat_1) {
|
|
1
|
+
define(["require", "exports", "../../modelApi/creators/createListItem", "../../modelApi/creators/createListLevel", "../utils/parseFormat", "../utils/stackFormat"], function (require, exports, createListItem_1, createListLevel_1, parseFormat_1, stackFormat_1) {
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.listItemProcessor = void 0;
|
|
@@ -8,14 +8,22 @@ define(["require", "exports", "../../modelApi/creators/createListItem", "../util
|
|
|
8
8
|
var listItemProcessor = function (group, element, context) {
|
|
9
9
|
var _a;
|
|
10
10
|
var listFormat = context.listFormat;
|
|
11
|
-
|
|
11
|
+
var originalListParent = listFormat.listParent;
|
|
12
|
+
var shouldPopListLevel = false;
|
|
13
|
+
try {
|
|
14
|
+
listFormat.listParent = (_a = listFormat.listParent) !== null && _a !== void 0 ? _a : group;
|
|
15
|
+
var listParent_1 = listFormat.listParent;
|
|
16
|
+
if (listFormat.levels.length == 0) {
|
|
17
|
+
listFormat.levels.push((0, createListLevel_1.createListLevel)(listFormat.potentialListType || 'UL', context.blockFormat));
|
|
18
|
+
shouldPopListLevel = true;
|
|
19
|
+
}
|
|
12
20
|
(0, stackFormat_1.stackFormat)(context, {
|
|
13
21
|
segment: 'shallowCloneForBlock',
|
|
14
22
|
}, function () {
|
|
15
23
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
|
|
16
24
|
var listItem = (0, createListItem_1.createListItem)(listFormat.levels, context.segmentFormat);
|
|
17
25
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
|
|
18
|
-
|
|
26
|
+
listParent_1.blocks.push(listItem);
|
|
19
27
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listItemThread, listItem.levels[listItem.levels.length - 1].format, context);
|
|
20
28
|
context.elementProcessors.child(listItem, element, context);
|
|
21
29
|
var firstChild = listItem.blocks[0];
|
|
@@ -27,10 +35,11 @@ define(["require", "exports", "../../modelApi/creators/createListItem", "../util
|
|
|
27
35
|
}
|
|
28
36
|
});
|
|
29
37
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
finally {
|
|
39
|
+
if (shouldPopListLevel) {
|
|
40
|
+
listFormat.levels.pop();
|
|
41
|
+
}
|
|
42
|
+
listFormat.listParent = originalListParent;
|
|
34
43
|
}
|
|
35
44
|
};
|
|
36
45
|
exports.listItemProcessor = listItemProcessor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":";;;;IAMA;;OAEG;IACI,IAAM,iBAAiB,GAAoC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;QAC9E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;QAC/B,IAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC;QACjD,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAE/B,IAAI;YACA,UAAU,CAAC,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,KAAK,CAAC;YAEvD,IAAM,YAAU,GAAG,UAAU,CAAC,UAAU,CAAC;YAEzC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;gBAC/B,UAAU,CAAC,MAAM,CAAC,IAAI,CAClB,IAAA,iCAAe,EAAC,UAAU,CAAC,iBAAiB,IAAI,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAC7E,CAAC;gBACF,kBAAkB,GAAG,IAAI,CAAC;aAC7B;YAED,IAAA,yBAAW,EACP,OAAO,EACP;gBACI,OAAO,EAAE,sBAAsB;aAClC,EACD;gBACI,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,OAAO,CAAC,aAAa,EACrB,OAAO,CACV,CAAC;gBAEF,IAAM,QAAQ,GAAG,IAAA,+BAAc,EAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;gBAC1E,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,eAAe,EACrC,QAAQ,CAAC,MAAM,EACf,OAAO,CACV,CAAC;gBAEF,YAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEjC,IAAA,yBAAW,EACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAClD,OAAO,CACV,CAAC;gBAEF,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBAE5D,IAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAEtC,IACI,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;oBAC3B,UAAU,CAAC,SAAS,IAAI,WAAW;oBACnC,UAAU,CAAC,UAAU,EACvB;oBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;oBAClD,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;iBAC1B;YACL,CAAC,CACJ,CAAC;SACL;gBAAS;YACN,IAAI,kBAAkB,EAAE;gBACpB,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;aAC3B;YAED,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC;SAC9C;IACL,CAAC,CAAC;IApEW,QAAA,iBAAiB,qBAoE5B","sourcesContent":["import { createListItem } from '../../modelApi/creators/createListItem';\nimport { createListLevel } from '../../modelApi/creators/createListLevel';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listItemProcessor: ElementProcessor<HTMLLIElement> = (group, element, context) => {\n const { listFormat } = context;\n const originalListParent = listFormat.listParent;\n let shouldPopListLevel = false;\n\n try {\n listFormat.listParent = listFormat.listParent ?? group;\n\n const listParent = listFormat.listParent;\n\n if (listFormat.levels.length == 0) {\n listFormat.levels.push(\n createListLevel(listFormat.potentialListType || 'UL', context.blockFormat)\n );\n shouldPopListLevel = true;\n }\n\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n },\n () => {\n parseFormat(\n element,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n const listItem = createListItem(listFormat.levels, context.segmentFormat);\n parseFormat(\n element,\n context.formatParsers.listItemElement,\n listItem.format,\n context\n );\n\n listParent.blocks.push(listItem);\n\n parseFormat(\n element,\n context.formatParsers.listItemThread,\n listItem.levels[listItem.levels.length - 1].format,\n context\n );\n\n context.elementProcessors.child(listItem, element, context);\n\n const firstChild = listItem.blocks[0];\n\n if (\n listItem.blocks.length == 1 &&\n firstChild.blockType == 'Paragraph' &&\n firstChild.isImplicit\n ) {\n Object.assign(listItem.format, firstChild.format);\n firstChild.format = {};\n }\n }\n );\n } finally {\n if (shouldPopListLevel) {\n listFormat.levels.pop();\n }\n\n listFormat.listParent = originalListParent;\n }\n};\n"]}
|
|
@@ -10,13 +10,15 @@ define(["require", "exports", "../../modelApi/creators/createListLevel", "../uti
|
|
|
10
10
|
segment: 'shallowCloneForBlock',
|
|
11
11
|
paragraph: 'shallowCloneForGroup',
|
|
12
12
|
}, function () {
|
|
13
|
-
var
|
|
13
|
+
var tagName = element.tagName;
|
|
14
|
+
var level = (0, createListLevel_1.createListLevel)(tagName, context.blockFormat);
|
|
14
15
|
var listFormat = context.listFormat;
|
|
15
16
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.dataset, level.dataset, context);
|
|
16
17
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listLevelThread, level.format, context);
|
|
17
18
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.listLevel, level.format, context);
|
|
18
19
|
(0, parseFormat_1.parseFormat)(element, context.formatParsers.segment, context.segmentFormat, context);
|
|
19
20
|
var originalListParent = listFormat.listParent;
|
|
21
|
+
listFormat.potentialListType = tagName;
|
|
20
22
|
listFormat.listParent = listFormat.listParent || group;
|
|
21
23
|
listFormat.levels.push(level);
|
|
22
24
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":";;;;IAKA;;OAEG;IACI,IAAM,aAAa,GAA0D,UAChF,KAAK,EACL,OAAO,EACP,OAAO;QAEP,IAAA,yBAAW,EACP,OAAO,EACP;YACI,OAAO,EAAE,sBAAsB;YAC/B,SAAS,EAAE,sBAAsB;SACpC,EACD;YACI,IAAM,KAAK,GAA0B,IAAA,iCAAe,
|
|
1
|
+
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":";;;;IAKA;;OAEG;IACI,IAAM,aAAa,GAA0D,UAChF,KAAK,EACL,OAAO,EACP,OAAO;QAEP,IAAA,yBAAW,EACP,OAAO,EACP;YACI,OAAO,EAAE,sBAAsB;YAC/B,SAAS,EAAE,sBAAsB;SACpC,EACD;YACI,IAAM,OAAO,GAAG,OAAO,CAAC,OAAsB,CAAC;YAC/C,IAAM,KAAK,GAA0B,IAAA,iCAAe,EAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;YAE/B,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5E,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnF,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7E,IAAA,yBAAW,EAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAEpF,IAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC;YAEjD,UAAU,CAAC,iBAAiB,GAAG,OAAO,CAAC;YACvC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;YACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE9B,IAAI;gBACA,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;aAC5D;oBAAS;gBACN,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACxB,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC;aAC9C;QACL,CAAC,CACJ,CAAC;IACN,CAAC,CAAC;IAnCW,QAAA,aAAa,iBAmCxB","sourcesContent":["import { createListLevel } from '../../modelApi/creators/createListLevel';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ContentModelListLevel, ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listProcessor: ElementProcessor<HTMLOListElement | HTMLUListElement> = (\n group,\n element,\n context\n) => {\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n paragraph: 'shallowCloneForGroup',\n },\n () => {\n const tagName = element.tagName as 'OL' | 'UL';\n const level: ContentModelListLevel = createListLevel(tagName, context.blockFormat);\n const { listFormat } = context;\n\n parseFormat(element, context.formatParsers.dataset, level.dataset, context);\n parseFormat(element, context.formatParsers.listLevelThread, level.format, context);\n parseFormat(element, context.formatParsers.listLevel, level.format, context);\n parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);\n\n const originalListParent = listFormat.listParent;\n\n listFormat.potentialListType = tagName;\n listFormat.listParent = listFormat.listParent || group;\n listFormat.levels.push(level);\n\n try {\n context.elementProcessors.child(group, element, context);\n } finally {\n listFormat.levels.pop();\n listFormat.listParent = originalListParent;\n }\n }\n );\n};\n"]}
|
|
@@ -40,7 +40,7 @@ define(["require", "exports", "../utils/cleanUpRestNodes"], function (require, e
|
|
|
40
40
|
exports.handleBlockGroupChildren = handleBlockGroupChildren;
|
|
41
41
|
function cleanUpNodeStack(nodeStack, context) {
|
|
42
42
|
var _a, _b;
|
|
43
|
-
if (
|
|
43
|
+
if (nodeStack.length > 0) {
|
|
44
44
|
// Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node
|
|
45
45
|
for (var i = nodeStack.length - 1; i > 0; i--) {
|
|
46
46
|
var node = (_b = (_a = nodeStack.pop()) === null || _a === void 0 ? void 0 : _a.refNode) !== null && _b !== void 0 ? _b : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;;IAQA;;OAEG;IACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;QAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;QAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;QAE7C,IAAI;YACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;gBACnC,2CAA2C;gBAC3C,wEAAwE;gBACxE,sFAAsF;gBACtF,+FAA+F;gBAC/F,IACI,KAAK,IAAI,CAAC;oBACV,UAAU,CAAC,SAAS,IAAI,YAAY;oBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;oBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;wBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;qBAC7B;iBACJ;gBAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;oBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;iBACxD;YACL,CAAC,CAAC,CAAC;YAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEhD,uEAAuE;YACvE,IAAA,mCAAgB,EAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;SACvD;gBAAS;YACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;SACpC;IACL,CAAC,CAAC;IA1CW,QAAA,wBAAwB,4BA0CnC;IAEF,SAAS,gBAAgB,CAAC,SAAoC,EAAE,OAA0B;;QACtF,IAAI,
|
|
1
|
+
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":";;;;IAQA;;OAEG;IACI,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;QAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;QAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;QAE7C,IAAI;YACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;gBACnC,2CAA2C;gBAC3C,wEAAwE;gBACxE,sFAAsF;gBACtF,+FAA+F;gBAC/F,IACI,KAAK,IAAI,CAAC;oBACV,UAAU,CAAC,SAAS,IAAI,YAAY;oBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;oBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;wBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;qBAC7B;iBACJ;gBAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;oBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;iBACxD;YACL,CAAC,CAAC,CAAC;YAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEhD,uEAAuE;YACvE,IAAA,mCAAgB,EAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;SACvD;gBAAS;YACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;SACpC;IACL,CAAC,CAAC;IA1CW,QAAA,wBAAwB,4BA0CnC;IAEF,SAAS,gBAAgB,CAAC,SAAoC,EAAE,OAA0B;;QACtF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,qFAAqF;YACrF,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC3C,IAAM,IAAI,GAAG,MAAA,MAAA,SAAS,CAAC,GAAG,EAAE,0CAAE,OAAO,mCAAI,IAAI,CAAC;gBAE9C,IAAA,mCAAgB,EAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;aACpD;SACJ;IACL,CAAC","sourcesContent":["import { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport type {\n ContentModelBlockGroup,\n ContentModelHandler,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleBlockGroupChildren: ContentModelHandler<ContentModelBlockGroup> = (\n doc: Document,\n parent: Node,\n group: ContentModelBlockGroup,\n context: ModelToDomContext\n) => {\n const { listFormat } = context;\n const nodeStack = listFormat.nodeStack;\n let refNode: Node | null = parent.firstChild;\n\n try {\n group.blocks.forEach((childBlock, index) => {\n // When process list, we need a node stack.\n // When there are two continuous lists, they should share the same stack\n // so that list items with same type/threadId can be merged into the same list element\n // In other cases, clear the stack so that two separate lists won't share the same list element\n if (\n index == 0 ||\n childBlock.blockType != 'BlockGroup' ||\n childBlock.blockGroupType != 'ListItem'\n ) {\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n if (listFormat.nodeStack.length > 0) {\n listFormat.nodeStack = [];\n }\n }\n\n refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);\n\n if (childBlock.blockType == 'Entity') {\n context.domIndexer?.onBlockEntity(childBlock, group);\n }\n });\n\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n // Remove all rest node if any since they don't appear in content model\n cleanUpRestNodes(refNode, context.rewriteFromModel);\n } finally {\n listFormat.nodeStack = nodeStack;\n }\n};\n\nfunction cleanUpNodeStack(nodeStack: ModelToDomListStackItem[], context: ModelToDomContext) {\n if (nodeStack.length > 0) {\n // Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node\n for (let i = nodeStack.length - 1; i > 0; i--) {\n const node = nodeStack.pop()?.refNode ?? null;\n\n cleanUpRestNodes(node, context.rewriteFromModel);\n }\n }\n}\n"]}
|
|
@@ -33,20 +33,16 @@ define(["require", "exports", "tslib", "../utils/applyFormat", "../utils/applyMe
|
|
|
33
33
|
// Apply metadata to list level to make sure list style is correct after rendering
|
|
34
34
|
(0, applyMetadata_1.applyMetadata)(itemLevel, context.metadataAppliers.listLevel, itemLevel.format, context);
|
|
35
35
|
}
|
|
36
|
-
if (
|
|
37
|
-
parentLevel.refNode &&
|
|
38
|
-
itemLevel.cachedElement == parentLevel.refNode) {
|
|
36
|
+
if (parentLevel.refNode && itemLevel.cachedElement == parentLevel.refNode) {
|
|
39
37
|
// Move refNode to next node since we are reusing this cached element
|
|
40
38
|
parentLevel.refNode = parentLevel.refNode.nextSibling;
|
|
41
39
|
}
|
|
42
40
|
}
|
|
43
41
|
// Cut off remained list levels that we can't reuse
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
(0, cleanUpRestNodes_1.cleanUpRestNodes)(stackLevel.refNode, context.rewriteFromModel);
|
|
49
|
-
}
|
|
42
|
+
// Clean up all rest nodes in the reused list levels
|
|
43
|
+
for (var i = layer + 1; i < nodeStack.length; i++) {
|
|
44
|
+
var stackLevel = nodeStack[i];
|
|
45
|
+
(0, cleanUpRestNodes_1.cleanUpRestNodes)(stackLevel.refNode, context.rewriteFromModel);
|
|
50
46
|
}
|
|
51
47
|
nodeStack.splice(layer + 1);
|
|
52
48
|
// Create new list levels that are after reused ones
|
|
@@ -57,7 +53,7 @@ define(["require", "exports", "tslib", "../utils/applyFormat", "../utils/applyMe
|
|
|
57
53
|
var isNewlyCreated = false;
|
|
58
54
|
var levelRefNode = (_c = nodeStack[layer].refNode) !== null && _c !== void 0 ? _c : null;
|
|
59
55
|
context.listFormat.currentLevel = layer;
|
|
60
|
-
if (
|
|
56
|
+
if (level.cachedElement) {
|
|
61
57
|
newList = level.cachedElement;
|
|
62
58
|
nodeStack[layer].refNode = (0, reuseCachedElement_1.reuseCachedElement)(lastParent, level.cachedElement, levelRefNode, context.rewriteFromModel);
|
|
63
59
|
nodeStack.push({
|
|
@@ -79,9 +75,7 @@ define(["require", "exports", "tslib", "../utils/applyFormat", "../utils/applyMe
|
|
|
79
75
|
format: (0, tslib_1.__assign)({}, level.format),
|
|
80
76
|
dataset: (0, tslib_1.__assign)({}, level.dataset),
|
|
81
77
|
});
|
|
82
|
-
|
|
83
|
-
level.cachedElement = newList;
|
|
84
|
-
}
|
|
78
|
+
level.cachedElement = newList;
|
|
85
79
|
}
|
|
86
80
|
(0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevelThread, level.format, context);
|
|
87
81
|
// Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":";;;;IAUA;;OAEG;IACI,IAAM,UAAU,GAAmD,UACtE,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;QAEpB,IAAI,KAAK,GAAG,CAAC,CAAC;QACN,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;QAEzC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;YACvB,SAAS,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,OAAO,SAAA;aACV,CAAC,CAAC;SACN;QAED,0EAA0E;QAC1E,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC5E,IAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YACrC,IAAM,UAAU,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzC,OAAO,CAAC,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;YAExC,IACI,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ;gBACzC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,WAAW,KAAI,SAAS,CAAC,OAAO,CAAC,WAAW;gBAChE,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;oBACvB,OAAO,SAAS,CAAC,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC;gBAC7D,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;oBACvB,SAAS,CAAC,MAAM,CAAC,aAAa,KAAI,MAAA,UAAU,CAAC,MAAM,0CAAE,aAAa,CAAA,CAAC,EACzE;gBACE,MAAM;aACT;iBAAM,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI,EAAE;gBACnC,kFAAkF;gBAClF,IAAA,6BAAa,EAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aAC3F;YAED,
|
|
1
|
+
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleList: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n let layer = 0;\n const { nodeStack } = context.listFormat;\n\n if (nodeStack.length == 0) {\n nodeStack.push({\n node: parent,\n refNode,\n });\n }\n\n // Skip existing list levels that has same properties so we can reuse them\n for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {\n const parentLevel = nodeStack[layer];\n const stackLevel = nodeStack[layer + 1];\n const itemLevel = listItem.levels[layer];\n\n context.listFormat.currentLevel = layer;\n\n if (\n stackLevel.listType != itemLevel.listType ||\n stackLevel.dataset?.editingInfo != itemLevel.dataset.editingInfo ||\n (itemLevel.listType == 'OL' &&\n typeof itemLevel.format.startNumberOverride === 'number') ||\n (itemLevel.listType == 'UL' &&\n itemLevel.format.listStyleType != stackLevel.format?.listStyleType)\n ) {\n break;\n } else if (itemLevel.listType == 'UL') {\n // Apply metadata to list level to make sure list style is correct after rendering\n applyMetadata(itemLevel, context.metadataAppliers.listLevel, itemLevel.format, context);\n }\n\n if (parentLevel.refNode && itemLevel.cachedElement == parentLevel.refNode) {\n // Move refNode to next node since we are reusing this cached element\n parentLevel.refNode = parentLevel.refNode.nextSibling;\n }\n }\n\n // Cut off remained list levels that we can't reuse\n // Clean up all rest nodes in the reused list levels\n for (let i = layer + 1; i < nodeStack.length; i++) {\n const stackLevel = nodeStack[i];\n\n cleanUpRestNodes(stackLevel.refNode, context.rewriteFromModel);\n }\n\n nodeStack.splice(layer + 1);\n\n // Create new list levels that are after reused ones\n for (; layer < listItem.levels.length; layer++) {\n const level = listItem.levels[layer];\n const lastParent = nodeStack[nodeStack.length - 1].node;\n\n let newList: HTMLOListElement | HTMLUListElement;\n let isNewlyCreated = false;\n const levelRefNode = nodeStack[layer].refNode ?? null;\n\n context.listFormat.currentLevel = layer;\n\n if (level.cachedElement) {\n newList = level.cachedElement;\n\n nodeStack[layer].refNode = reuseCachedElement(\n lastParent,\n level.cachedElement,\n levelRefNode,\n context.rewriteFromModel\n );\n nodeStack.push({\n node: newList,\n refNode: newList.firstChild,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n } else {\n newList = doc.createElement(level.listType == 'OL' ? 'ol' : 'ul');\n isNewlyCreated = true;\n\n lastParent.insertBefore(newList, levelRefNode);\n nodeStack.push({\n node: newList,\n refNode: null,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n\n level.cachedElement = newList;\n }\n\n applyFormat(newList, context.formatAppliers.listLevelThread, level.format, context);\n\n // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listLevel, level.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(newList, context.formatAppliers.listLevel, level.format, context);\n applyFormat(newList, context.formatAppliers.dataset, level.dataset, context);\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(level, newList);\n }\n }\n\n return nodeStack[0].refNode;\n};\n"]}
|
|
@@ -17,7 +17,7 @@ define(["require", "exports", "../utils/applyFormat", "../utils/applyMetadata",
|
|
|
17
17
|
var level = listItem.levels[listItem.levels.length - 1];
|
|
18
18
|
var li;
|
|
19
19
|
var isNewlyCreated = false;
|
|
20
|
-
if (
|
|
20
|
+
if (listItem.cachedElement) {
|
|
21
21
|
li = listItem.cachedElement;
|
|
22
22
|
// Check if the cached LI is used as refNode under another list level,
|
|
23
23
|
// since we know we are going to move it under the current listParent,
|
|
@@ -36,9 +36,7 @@ define(["require", "exports", "../utils/applyFormat", "../utils/applyMetadata",
|
|
|
36
36
|
// This happens when outdent a list item to cause it has no list level
|
|
37
37
|
listParent.insertBefore(li, (itemRefNode === null || itemRefNode === void 0 ? void 0 : itemRefNode.parentNode) == listParent ? itemRefNode : null);
|
|
38
38
|
context.rewriteFromModel.addedBlockElements.push(li);
|
|
39
|
-
|
|
40
|
-
listItem.cachedElement = li;
|
|
41
|
-
}
|
|
39
|
+
listItem.cachedElement = li;
|
|
42
40
|
}
|
|
43
41
|
if (level) {
|
|
44
42
|
(0, applyFormat_1.applyFormat)(li, context.formatAppliers.segment, listItem.formatHolder.format, context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":";;;;IAcA,IAAM,iBAAiB,GAAG,MAAM,CAAC;IACjC,IAAM,qBAAqB,GAAG,cAAc,CAAC;IAE7C;;OAEG;IACI,IAAM,cAAc,GAAmD,UAC1E,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;QAEpB,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEtE,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;QACzC,IAAM,SAAS,GAAqC,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,mCAAI,EAAE,CAAC;QAC5F,IAAM,WAAW,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;QAC9C,IAAM,UAAU,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC;QAC5C,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE1D,IAAI,EAAiB,CAAC;QACtB,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,IAAI,
|
|
1
|
+
{"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { isGenericRoleElement } from '../../domUtils/isGenericRoleElement';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport { setParagraphNotImplicit } from '../../modelApi/block/setParagraphNotImplicit';\nimport { stackFormat } from '../utils/stackFormat';\nimport { unwrap } from '../../domUtils/unwrap';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\nconst HtmlRoleAttribute = 'role';\nconst PresentationRoleValue = 'presentation';\n\n/**\n * @internal\n */\nexport const handleListItem: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n refNode = context.modelHandlers.list(doc, parent, listItem, context, refNode);\n\n const { nodeStack } = context.listFormat;\n const leafLevel: Partial<ModelToDomListStackItem> = nodeStack?.[nodeStack.length - 1] ?? {};\n const itemRefNode = leafLevel.refNode || null;\n const listParent = leafLevel.node || parent;\n const level = listItem.levels[listItem.levels.length - 1];\n\n let li: HTMLLIElement;\n let isNewlyCreated = false;\n\n if (listItem.cachedElement) {\n li = listItem.cachedElement;\n\n // Check if the cached LI is used as refNode under another list level,\n // since we know we are going to move it under the current listParent,\n // we need to update the refNode of the previous list level to avoid removing it later\n for (let i = 0; i < nodeStack.length - 1; i++) {\n if (nodeStack[i].refNode === li) {\n nodeStack[i].refNode = li.nextSibling;\n }\n }\n\n leafLevel.refNode = reuseCachedElement(\n listParent,\n li,\n itemRefNode,\n context.rewriteFromModel\n );\n } else {\n li = doc.createElement('li');\n isNewlyCreated = true;\n\n // It is possible listParent is the same with parent param.\n // This happens when outdent a list item to cause it has no list level\n listParent.insertBefore(li, itemRefNode?.parentNode == listParent ? itemRefNode : null);\n context.rewriteFromModel.addedBlockElements.push(li);\n listItem.cachedElement = li;\n }\n\n if (level) {\n applyFormat(li, context.formatAppliers.segment, listItem.formatHolder.format, context);\n applyFormat(li, context.formatAppliers.listItemThread, level.format, context);\n\n // Need to apply metadata after applying listItem format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listItem, listItem.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(li, context.formatAppliers.listItemElement, listItem.format, context);\n\n stackFormat(context, listItem.formatHolder.format, () => {\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n });\n } else {\n // There is no level for this list item, that means it should be moved out of the list\n // For each paragraph, make it not implicit so it will have a DIV around it, to avoid more paragraphs connected together\n listItem.blocks.forEach(setParagraphNotImplicit);\n\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n\n unwrap(li);\n }\n\n // Add role=\"presentation\" to all generic role elements inside the LI element\n // This is to make sure the elements are announced correctly by screen readers\n // when using arrow keys to navigate the list.\n for (let index = 0; index < li.children.length; index++) {\n const element = li.children.item(index);\n if (isGenericRoleElement(element)) {\n element.setAttribute(HtmlRoleAttribute, PresentationRoleValue);\n }\n }\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(listItem, li);\n }\n\n return refNode;\n};\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createListItem } from '../../modelApi/creators/createListItem';
|
|
2
|
+
import { createListLevel } from '../../modelApi/creators/createListLevel';
|
|
2
3
|
import { parseFormat } from '../utils/parseFormat';
|
|
3
4
|
import { stackFormat } from '../utils/stackFormat';
|
|
4
5
|
/**
|
|
@@ -7,14 +8,22 @@ import { stackFormat } from '../utils/stackFormat';
|
|
|
7
8
|
export var listItemProcessor = function (group, element, context) {
|
|
8
9
|
var _a;
|
|
9
10
|
var listFormat = context.listFormat;
|
|
10
|
-
|
|
11
|
+
var originalListParent = listFormat.listParent;
|
|
12
|
+
var shouldPopListLevel = false;
|
|
13
|
+
try {
|
|
14
|
+
listFormat.listParent = (_a = listFormat.listParent) !== null && _a !== void 0 ? _a : group;
|
|
15
|
+
var listParent_1 = listFormat.listParent;
|
|
16
|
+
if (listFormat.levels.length == 0) {
|
|
17
|
+
listFormat.levels.push(createListLevel(listFormat.potentialListType || 'UL', context.blockFormat));
|
|
18
|
+
shouldPopListLevel = true;
|
|
19
|
+
}
|
|
11
20
|
stackFormat(context, {
|
|
12
21
|
segment: 'shallowCloneForBlock',
|
|
13
22
|
}, function () {
|
|
14
23
|
parseFormat(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
|
|
15
24
|
var listItem = createListItem(listFormat.levels, context.segmentFormat);
|
|
16
25
|
parseFormat(element, context.formatParsers.listItemElement, listItem.format, context);
|
|
17
|
-
|
|
26
|
+
listParent_1.blocks.push(listItem);
|
|
18
27
|
parseFormat(element, context.formatParsers.listItemThread, listItem.levels[listItem.levels.length - 1].format, context);
|
|
19
28
|
context.elementProcessors.child(listItem, element, context);
|
|
20
29
|
var firstChild = listItem.blocks[0];
|
|
@@ -26,10 +35,11 @@ export var listItemProcessor = function (group, element, context) {
|
|
|
26
35
|
}
|
|
27
36
|
});
|
|
28
37
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
finally {
|
|
39
|
+
if (shouldPopListLevel) {
|
|
40
|
+
listFormat.levels.pop();
|
|
41
|
+
}
|
|
42
|
+
listFormat.listParent = originalListParent;
|
|
33
43
|
}
|
|
34
44
|
};
|
|
35
45
|
//# sourceMappingURL=listItemProcessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,MAAM,CAAC,IAAM,iBAAiB,GAAoC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IAC9E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAE/B,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"listItemProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listItemProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,MAAM,CAAC,IAAM,iBAAiB,GAAoC,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;;IAC9E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC;IACjD,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,IAAI;QACA,UAAU,CAAC,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,KAAK,CAAC;QAEvD,IAAM,YAAU,GAAG,UAAU,CAAC,UAAU,CAAC;QAEzC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;YAC/B,UAAU,CAAC,MAAM,CAAC,IAAI,CAClB,eAAe,CAAC,UAAU,CAAC,iBAAiB,IAAI,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAC7E,CAAC;YACF,kBAAkB,GAAG,IAAI,CAAC;SAC7B;QAED,WAAW,CACP,OAAO,EACP;YACI,OAAO,EAAE,sBAAsB;SAClC,EACD;YACI,WAAW,CACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,OAAO,CAAC,aAAa,EACrB,OAAO,CACV,CAAC;YAEF,IAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;YAC1E,WAAW,CACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,eAAe,EACrC,QAAQ,CAAC,MAAM,EACf,OAAO,CACV,CAAC;YAEF,YAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEjC,WAAW,CACP,OAAO,EACP,OAAO,CAAC,aAAa,CAAC,cAAc,EACpC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAClD,OAAO,CACV,CAAC;YAEF,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE5D,IAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAEtC,IACI,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;gBAC3B,UAAU,CAAC,SAAS,IAAI,WAAW;gBACnC,UAAU,CAAC,UAAU,EACvB;gBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBAClD,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;aAC1B;QACL,CAAC,CACJ,CAAC;KACL;YAAS;QACN,IAAI,kBAAkB,EAAE;YACpB,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;SAC3B;QAED,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC;KAC9C;AACL,CAAC,CAAC","sourcesContent":["import { createListItem } from '../../modelApi/creators/createListItem';\nimport { createListLevel } from '../../modelApi/creators/createListLevel';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listItemProcessor: ElementProcessor<HTMLLIElement> = (group, element, context) => {\n const { listFormat } = context;\n const originalListParent = listFormat.listParent;\n let shouldPopListLevel = false;\n\n try {\n listFormat.listParent = listFormat.listParent ?? group;\n\n const listParent = listFormat.listParent;\n\n if (listFormat.levels.length == 0) {\n listFormat.levels.push(\n createListLevel(listFormat.potentialListType || 'UL', context.blockFormat)\n );\n shouldPopListLevel = true;\n }\n\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n },\n () => {\n parseFormat(\n element,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n const listItem = createListItem(listFormat.levels, context.segmentFormat);\n parseFormat(\n element,\n context.formatParsers.listItemElement,\n listItem.format,\n context\n );\n\n listParent.blocks.push(listItem);\n\n parseFormat(\n element,\n context.formatParsers.listItemThread,\n listItem.levels[listItem.levels.length - 1].format,\n context\n );\n\n context.elementProcessors.child(listItem, element, context);\n\n const firstChild = listItem.blocks[0];\n\n if (\n listItem.blocks.length == 1 &&\n firstChild.blockType == 'Paragraph' &&\n firstChild.isImplicit\n ) {\n Object.assign(listItem.format, firstChild.format);\n firstChild.format = {};\n }\n }\n );\n } finally {\n if (shouldPopListLevel) {\n listFormat.levels.pop();\n }\n\n listFormat.listParent = originalListParent;\n }\n};\n"]}
|
|
@@ -9,13 +9,15 @@ export var listProcessor = function (group, element, context) {
|
|
|
9
9
|
segment: 'shallowCloneForBlock',
|
|
10
10
|
paragraph: 'shallowCloneForGroup',
|
|
11
11
|
}, function () {
|
|
12
|
-
var
|
|
12
|
+
var tagName = element.tagName;
|
|
13
|
+
var level = createListLevel(tagName, context.blockFormat);
|
|
13
14
|
var listFormat = context.listFormat;
|
|
14
15
|
parseFormat(element, context.formatParsers.dataset, level.dataset, context);
|
|
15
16
|
parseFormat(element, context.formatParsers.listLevelThread, level.format, context);
|
|
16
17
|
parseFormat(element, context.formatParsers.listLevel, level.format, context);
|
|
17
18
|
parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);
|
|
18
19
|
var originalListParent = listFormat.listParent;
|
|
20
|
+
listFormat.potentialListType = tagName;
|
|
19
21
|
listFormat.listParent = listFormat.listParent || group;
|
|
20
22
|
listFormat.levels.push(level);
|
|
21
23
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,MAAM,CAAC,IAAM,aAAa,GAA0D,UAChF,KAAK,EACL,OAAO,EACP,OAAO;IAEP,WAAW,CACP,OAAO,EACP;QACI,OAAO,EAAE,sBAAsB;QAC/B,SAAS,EAAE,sBAAsB;KACpC,EACD;QACI,IAAM,KAAK,GAA0B,eAAe,
|
|
1
|
+
{"version":3,"file":"listProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/listProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,MAAM,CAAC,IAAM,aAAa,GAA0D,UAChF,KAAK,EACL,OAAO,EACP,OAAO;IAEP,WAAW,CACP,OAAO,EACP;QACI,OAAO,EAAE,sBAAsB;QAC/B,SAAS,EAAE,sBAAsB;KACpC,EACD;QACI,IAAM,OAAO,GAAG,OAAO,CAAC,OAAsB,CAAC;QAC/C,IAAM,KAAK,GAA0B,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3E,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;QAE/B,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5E,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnF,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7E,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEpF,IAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC;QAEjD,UAAU,CAAC,iBAAiB,GAAG,OAAO,CAAC;QACvC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;QACvD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI;YACA,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC5D;gBAAS;YACN,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACxB,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC;SAC9C;IACL,CAAC,CACJ,CAAC;AACN,CAAC,CAAC","sourcesContent":["import { createListLevel } from '../../modelApi/creators/createListLevel';\nimport { parseFormat } from '../utils/parseFormat';\nimport { stackFormat } from '../utils/stackFormat';\nimport type { ContentModelListLevel, ElementProcessor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listProcessor: ElementProcessor<HTMLOListElement | HTMLUListElement> = (\n group,\n element,\n context\n) => {\n stackFormat(\n context,\n {\n segment: 'shallowCloneForBlock',\n paragraph: 'shallowCloneForGroup',\n },\n () => {\n const tagName = element.tagName as 'OL' | 'UL';\n const level: ContentModelListLevel = createListLevel(tagName, context.blockFormat);\n const { listFormat } = context;\n\n parseFormat(element, context.formatParsers.dataset, level.dataset, context);\n parseFormat(element, context.formatParsers.listLevelThread, level.format, context);\n parseFormat(element, context.formatParsers.listLevel, level.format, context);\n parseFormat(element, context.formatParsers.segment, context.segmentFormat, context);\n\n const originalListParent = listFormat.listParent;\n\n listFormat.potentialListType = tagName;\n listFormat.listParent = listFormat.listParent || group;\n listFormat.levels.push(level);\n\n try {\n context.elementProcessors.child(group, element, context);\n } finally {\n listFormat.levels.pop();\n listFormat.listParent = originalListParent;\n }\n }\n );\n};\n"]}
|
|
@@ -36,7 +36,7 @@ export var handleBlockGroupChildren = function (doc, parent, group, context) {
|
|
|
36
36
|
};
|
|
37
37
|
function cleanUpNodeStack(nodeStack, context) {
|
|
38
38
|
var _a, _b;
|
|
39
|
-
if (
|
|
39
|
+
if (nodeStack.length > 0) {
|
|
40
40
|
// Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node
|
|
41
41
|
for (var i = nodeStack.length - 1; i > 0; i--) {
|
|
42
42
|
var node = (_b = (_a = nodeStack.pop()) === null || _a === void 0 ? void 0 : _a.refNode) !== null && _b !== void 0 ? _b : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAQ7D;;GAEG;AACH,MAAM,CAAC,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;iBAC7B;aACJ;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEhD,uEAAuE;QACvE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACvD;YAAS;QACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;KACpC;AACL,CAAC,CAAC;AAEF,SAAS,gBAAgB,CAAC,SAAoC,EAAE,OAA0B;;IACtF,IAAI,
|
|
1
|
+
{"version":3,"file":"handleBlockGroupChildren.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleBlockGroupChildren.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAQ7D;;GAEG;AACH,MAAM,CAAC,IAAM,wBAAwB,GAAgD,UACjF,GAAa,EACb,MAAY,EACZ,KAA6B,EAC7B,OAA0B;IAElB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;IAC/B,IAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,GAAgB,MAAM,CAAC,UAAU,CAAC;IAE7C,IAAI;QACA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,KAAK;;YACnC,2CAA2C;YAC3C,wEAAwE;YACxE,sFAAsF;YACtF,+FAA+F;YAC/F,IACI,KAAK,IAAI,CAAC;gBACV,UAAU,CAAC,SAAS,IAAI,YAAY;gBACpC,UAAU,CAAC,cAAc,IAAI,UAAU,EACzC;gBACE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;iBAC7B;aACJ;YAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,EAAE;gBAClC,MAAA,OAAO,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACxD;QACL,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEhD,uEAAuE;QACvE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACvD;YAAS;QACN,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;KACpC;AACL,CAAC,CAAC;AAEF,SAAS,gBAAgB,CAAC,SAAoC,EAAE,OAA0B;;IACtF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACtB,qFAAqF;QACrF,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAM,IAAI,GAAG,MAAA,MAAA,SAAS,CAAC,GAAG,EAAE,0CAAE,OAAO,mCAAI,IAAI,CAAC;YAE9C,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;SACpD;KACJ;AACL,CAAC","sourcesContent":["import { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport type {\n ContentModelBlockGroup,\n ContentModelHandler,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleBlockGroupChildren: ContentModelHandler<ContentModelBlockGroup> = (\n doc: Document,\n parent: Node,\n group: ContentModelBlockGroup,\n context: ModelToDomContext\n) => {\n const { listFormat } = context;\n const nodeStack = listFormat.nodeStack;\n let refNode: Node | null = parent.firstChild;\n\n try {\n group.blocks.forEach((childBlock, index) => {\n // When process list, we need a node stack.\n // When there are two continuous lists, they should share the same stack\n // so that list items with same type/threadId can be merged into the same list element\n // In other cases, clear the stack so that two separate lists won't share the same list element\n if (\n index == 0 ||\n childBlock.blockType != 'BlockGroup' ||\n childBlock.blockGroupType != 'ListItem'\n ) {\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n if (listFormat.nodeStack.length > 0) {\n listFormat.nodeStack = [];\n }\n }\n\n refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);\n\n if (childBlock.blockType == 'Entity') {\n context.domIndexer?.onBlockEntity(childBlock, group);\n }\n });\n\n cleanUpNodeStack(listFormat.nodeStack, context);\n\n // Remove all rest node if any since they don't appear in content model\n cleanUpRestNodes(refNode, context.rewriteFromModel);\n } finally {\n listFormat.nodeStack = nodeStack;\n }\n};\n\nfunction cleanUpNodeStack(nodeStack: ModelToDomListStackItem[], context: ModelToDomContext) {\n if (nodeStack.length > 0) {\n // Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node\n for (let i = nodeStack.length - 1; i > 0; i--) {\n const node = nodeStack.pop()?.refNode ?? null;\n\n cleanUpRestNodes(node, context.rewriteFromModel);\n }\n }\n}\n"]}
|
|
@@ -34,20 +34,16 @@ export var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
34
34
|
// Apply metadata to list level to make sure list style is correct after rendering
|
|
35
35
|
applyMetadata(itemLevel, context.metadataAppliers.listLevel, itemLevel.format, context);
|
|
36
36
|
}
|
|
37
|
-
if (
|
|
38
|
-
parentLevel.refNode &&
|
|
39
|
-
itemLevel.cachedElement == parentLevel.refNode) {
|
|
37
|
+
if (parentLevel.refNode && itemLevel.cachedElement == parentLevel.refNode) {
|
|
40
38
|
// Move refNode to next node since we are reusing this cached element
|
|
41
39
|
parentLevel.refNode = parentLevel.refNode.nextSibling;
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
// Cut off remained list levels that we can't reuse
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
cleanUpRestNodes(stackLevel.refNode, context.rewriteFromModel);
|
|
50
|
-
}
|
|
43
|
+
// Clean up all rest nodes in the reused list levels
|
|
44
|
+
for (var i = layer + 1; i < nodeStack.length; i++) {
|
|
45
|
+
var stackLevel = nodeStack[i];
|
|
46
|
+
cleanUpRestNodes(stackLevel.refNode, context.rewriteFromModel);
|
|
51
47
|
}
|
|
52
48
|
nodeStack.splice(layer + 1);
|
|
53
49
|
// Create new list levels that are after reused ones
|
|
@@ -58,7 +54,7 @@ export var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
58
54
|
var isNewlyCreated = false;
|
|
59
55
|
var levelRefNode = (_c = nodeStack[layer].refNode) !== null && _c !== void 0 ? _c : null;
|
|
60
56
|
context.listFormat.currentLevel = layer;
|
|
61
|
-
if (
|
|
57
|
+
if (level.cachedElement) {
|
|
62
58
|
newList = level.cachedElement;
|
|
63
59
|
nodeStack[layer].refNode = reuseCachedElement(lastParent, level.cachedElement, levelRefNode, context.rewriteFromModel);
|
|
64
60
|
nodeStack.push({
|
|
@@ -80,9 +76,7 @@ export var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
80
76
|
format: __assign({}, level.format),
|
|
81
77
|
dataset: __assign({}, level.dataset),
|
|
82
78
|
});
|
|
83
|
-
|
|
84
|
-
level.cachedElement = newList;
|
|
85
|
-
}
|
|
79
|
+
level.cachedElement = newList;
|
|
86
80
|
}
|
|
87
81
|
applyFormat(newList, context.formatAppliers.listLevelThread, level.format, context);
|
|
88
82
|
// Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAOvE;;GAEG;AACH,MAAM,CAAC,IAAM,UAAU,GAAmD,UACtE,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;IAEpB,IAAI,KAAK,GAAG,CAAC,CAAC;IACN,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;IAEzC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACvB,SAAS,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,OAAO,SAAA;SACV,CAAC,CAAC;KACN;IAED,0EAA0E;IAC1E,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC5E,IAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,IAAM,UAAU,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzC,OAAO,CAAC,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;QAExC,IACI,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ;YACzC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,WAAW,KAAI,SAAS,CAAC,OAAO,CAAC,WAAW;YAChE,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;gBACvB,OAAO,SAAS,CAAC,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC;YAC7D,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;gBACvB,SAAS,CAAC,MAAM,CAAC,aAAa,KAAI,MAAA,UAAU,CAAC,MAAM,0CAAE,aAAa,CAAA,CAAC,EACzE;YACE,MAAM;SACT;aAAM,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI,EAAE;YACnC,kFAAkF;YAClF,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC3F;QAED,
|
|
1
|
+
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { cleanUpRestNodes } from '../utils/cleanUpRestNodes';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleList: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n let layer = 0;\n const { nodeStack } = context.listFormat;\n\n if (nodeStack.length == 0) {\n nodeStack.push({\n node: parent,\n refNode,\n });\n }\n\n // Skip existing list levels that has same properties so we can reuse them\n for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {\n const parentLevel = nodeStack[layer];\n const stackLevel = nodeStack[layer + 1];\n const itemLevel = listItem.levels[layer];\n\n context.listFormat.currentLevel = layer;\n\n if (\n stackLevel.listType != itemLevel.listType ||\n stackLevel.dataset?.editingInfo != itemLevel.dataset.editingInfo ||\n (itemLevel.listType == 'OL' &&\n typeof itemLevel.format.startNumberOverride === 'number') ||\n (itemLevel.listType == 'UL' &&\n itemLevel.format.listStyleType != stackLevel.format?.listStyleType)\n ) {\n break;\n } else if (itemLevel.listType == 'UL') {\n // Apply metadata to list level to make sure list style is correct after rendering\n applyMetadata(itemLevel, context.metadataAppliers.listLevel, itemLevel.format, context);\n }\n\n if (parentLevel.refNode && itemLevel.cachedElement == parentLevel.refNode) {\n // Move refNode to next node since we are reusing this cached element\n parentLevel.refNode = parentLevel.refNode.nextSibling;\n }\n }\n\n // Cut off remained list levels that we can't reuse\n // Clean up all rest nodes in the reused list levels\n for (let i = layer + 1; i < nodeStack.length; i++) {\n const stackLevel = nodeStack[i];\n\n cleanUpRestNodes(stackLevel.refNode, context.rewriteFromModel);\n }\n\n nodeStack.splice(layer + 1);\n\n // Create new list levels that are after reused ones\n for (; layer < listItem.levels.length; layer++) {\n const level = listItem.levels[layer];\n const lastParent = nodeStack[nodeStack.length - 1].node;\n\n let newList: HTMLOListElement | HTMLUListElement;\n let isNewlyCreated = false;\n const levelRefNode = nodeStack[layer].refNode ?? null;\n\n context.listFormat.currentLevel = layer;\n\n if (level.cachedElement) {\n newList = level.cachedElement;\n\n nodeStack[layer].refNode = reuseCachedElement(\n lastParent,\n level.cachedElement,\n levelRefNode,\n context.rewriteFromModel\n );\n nodeStack.push({\n node: newList,\n refNode: newList.firstChild,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n } else {\n newList = doc.createElement(level.listType == 'OL' ? 'ol' : 'ul');\n isNewlyCreated = true;\n\n lastParent.insertBefore(newList, levelRefNode);\n nodeStack.push({\n node: newList,\n refNode: null,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n\n level.cachedElement = newList;\n }\n\n applyFormat(newList, context.formatAppliers.listLevelThread, level.format, context);\n\n // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listLevel, level.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(newList, context.formatAppliers.listLevel, level.format, context);\n applyFormat(newList, context.formatAppliers.dataset, level.dataset, context);\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(level, newList);\n }\n }\n\n return nodeStack[0].refNode;\n};\n"]}
|
|
@@ -20,7 +20,7 @@ export var handleListItem = function (doc, parent, listItem, context, refNode) {
|
|
|
20
20
|
var level = listItem.levels[listItem.levels.length - 1];
|
|
21
21
|
var li;
|
|
22
22
|
var isNewlyCreated = false;
|
|
23
|
-
if (
|
|
23
|
+
if (listItem.cachedElement) {
|
|
24
24
|
li = listItem.cachedElement;
|
|
25
25
|
// Check if the cached LI is used as refNode under another list level,
|
|
26
26
|
// since we know we are going to move it under the current listParent,
|
|
@@ -39,9 +39,7 @@ export var handleListItem = function (doc, parent, listItem, context, refNode) {
|
|
|
39
39
|
// This happens when outdent a list item to cause it has no list level
|
|
40
40
|
listParent.insertBefore(li, (itemRefNode === null || itemRefNode === void 0 ? void 0 : itemRefNode.parentNode) == listParent ? itemRefNode : null);
|
|
41
41
|
context.rewriteFromModel.addedBlockElements.push(li);
|
|
42
|
-
|
|
43
|
-
listItem.cachedElement = li;
|
|
44
|
-
}
|
|
42
|
+
listItem.cachedElement = li;
|
|
45
43
|
}
|
|
46
44
|
if (level) {
|
|
47
45
|
applyFormat(li, context.formatAppliers.segment, listItem.formatHolder.format, context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAQ/C,IAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,IAAM,qBAAqB,GAAG,cAAc,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,IAAM,cAAc,GAAmD,UAC1E,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;IAEpB,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;IACzC,IAAM,SAAS,GAAqC,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,mCAAI,EAAE,CAAC;IAC5F,IAAM,WAAW,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;IAC9C,IAAM,UAAU,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC;IAC5C,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,IAAI,EAAiB,CAAC;IACtB,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,IAAI,
|
|
1
|
+
{"version":3,"file":"handleListItem.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleListItem.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport { isGenericRoleElement } from '../../domUtils/isGenericRoleElement';\nimport { reuseCachedElement } from '../../domUtils/reuseCachedElement';\nimport { setParagraphNotImplicit } from '../../modelApi/block/setParagraphNotImplicit';\nimport { stackFormat } from '../utils/stackFormat';\nimport { unwrap } from '../../domUtils/unwrap';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n ModelToDomListStackItem,\n} from 'roosterjs-content-model-types';\n\nconst HtmlRoleAttribute = 'role';\nconst PresentationRoleValue = 'presentation';\n\n/**\n * @internal\n */\nexport const handleListItem: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n refNode = context.modelHandlers.list(doc, parent, listItem, context, refNode);\n\n const { nodeStack } = context.listFormat;\n const leafLevel: Partial<ModelToDomListStackItem> = nodeStack?.[nodeStack.length - 1] ?? {};\n const itemRefNode = leafLevel.refNode || null;\n const listParent = leafLevel.node || parent;\n const level = listItem.levels[listItem.levels.length - 1];\n\n let li: HTMLLIElement;\n let isNewlyCreated = false;\n\n if (listItem.cachedElement) {\n li = listItem.cachedElement;\n\n // Check if the cached LI is used as refNode under another list level,\n // since we know we are going to move it under the current listParent,\n // we need to update the refNode of the previous list level to avoid removing it later\n for (let i = 0; i < nodeStack.length - 1; i++) {\n if (nodeStack[i].refNode === li) {\n nodeStack[i].refNode = li.nextSibling;\n }\n }\n\n leafLevel.refNode = reuseCachedElement(\n listParent,\n li,\n itemRefNode,\n context.rewriteFromModel\n );\n } else {\n li = doc.createElement('li');\n isNewlyCreated = true;\n\n // It is possible listParent is the same with parent param.\n // This happens when outdent a list item to cause it has no list level\n listParent.insertBefore(li, itemRefNode?.parentNode == listParent ? itemRefNode : null);\n context.rewriteFromModel.addedBlockElements.push(li);\n listItem.cachedElement = li;\n }\n\n if (level) {\n applyFormat(li, context.formatAppliers.segment, listItem.formatHolder.format, context);\n applyFormat(li, context.formatAppliers.listItemThread, level.format, context);\n\n // Need to apply metadata after applying listItem format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listItem, listItem.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(li, context.formatAppliers.listItemElement, listItem.format, context);\n\n stackFormat(context, listItem.formatHolder.format, () => {\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n });\n } else {\n // There is no level for this list item, that means it should be moved out of the list\n // For each paragraph, make it not implicit so it will have a DIV around it, to avoid more paragraphs connected together\n listItem.blocks.forEach(setParagraphNotImplicit);\n\n context.modelHandlers.blockGroupChildren(doc, li, listItem, context);\n\n unwrap(li);\n }\n\n // Add role=\"presentation\" to all generic role elements inside the LI element\n // This is to make sure the elements are announced correctly by screen readers\n // when using arrow keys to navigate the list.\n for (let index = 0; index < li.children.length; index++) {\n const element = li.children.item(index);\n if (isGenericRoleElement(element)) {\n element.setAttribute(HtmlRoleAttribute, PresentationRoleValue);\n }\n }\n\n if (isNewlyCreated) {\n context.onNodeCreated?.(listItem, li);\n }\n\n return refNode;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"description": "Content Model for roosterjs",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.1",
|
|
6
|
-
"roosterjs-content-model-types": "^9.
|
|
6
|
+
"roosterjs-content-model-types": "^9.51.0"
|
|
7
7
|
},
|
|
8
|
-
"version": "9.
|
|
8
|
+
"version": "9.51.0",
|
|
9
9
|
"main": "./lib/index.js",
|
|
10
10
|
"typings": "./lib/index.d.ts",
|
|
11
11
|
"module": "./lib-mjs/index.js",
|