roosterjs-content-model-dom 9.23.0 → 9.25.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/README.md +3 -0
- package/lib/domToModel/processors/linkProcessor.js +6 -2
- package/lib/domToModel/processors/linkProcessor.js.map +1 -1
- package/lib/domToModel/processors/tableProcessor.js +18 -15
- package/lib/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib/domUtils/readFile.js +14 -9
- package/lib/domUtils/readFile.js.map +1 -1
- package/lib/modelApi/editing/retrieveModelFormatState.d.ts +2 -2
- package/lib/modelApi/editing/retrieveModelFormatState.js +28 -11
- package/lib/modelApi/editing/retrieveModelFormatState.js.map +1 -1
- package/lib/modelToDom/handlers/handleList.js +6 -3
- package/lib/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-amd/domToModel/processors/linkProcessor.js +6 -2
- package/lib-amd/domToModel/processors/linkProcessor.js.map +1 -1
- package/lib-amd/domToModel/processors/tableProcessor.js +18 -15
- package/lib-amd/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-amd/domUtils/readFile.js +14 -9
- package/lib-amd/domUtils/readFile.js.map +1 -1
- package/lib-amd/modelApi/editing/retrieveModelFormatState.d.ts +2 -2
- package/lib-amd/modelApi/editing/retrieveModelFormatState.js +28 -11
- package/lib-amd/modelApi/editing/retrieveModelFormatState.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleList.js +6 -3
- package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-mjs/domToModel/processors/linkProcessor.js +6 -2
- package/lib-mjs/domToModel/processors/linkProcessor.js.map +1 -1
- package/lib-mjs/domToModel/processors/tableProcessor.js +18 -15
- package/lib-mjs/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-mjs/domUtils/readFile.js +14 -9
- package/lib-mjs/domUtils/readFile.js.map +1 -1
- package/lib-mjs/modelApi/editing/retrieveModelFormatState.d.ts +2 -2
- package/lib-mjs/modelApi/editing/retrieveModelFormatState.js +28 -11
- package/lib-mjs/modelApi/editing/retrieveModelFormatState.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleList.js +6 -3
- package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
- package/package.json +2 -2
|
@@ -5,15 +5,20 @@
|
|
|
5
5
|
* If fail to read, dataUrl will be null
|
|
6
6
|
*/
|
|
7
7
|
export function readFile(file, callback) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
try {
|
|
9
|
+
if (file) {
|
|
10
|
+
var reader_1 = new FileReader();
|
|
11
|
+
reader_1.onload = function () {
|
|
12
|
+
callback(reader_1.result);
|
|
13
|
+
};
|
|
14
|
+
reader_1.onerror = function () {
|
|
15
|
+
callback(null);
|
|
16
|
+
};
|
|
17
|
+
reader_1.readAsDataURL(file);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch (_a) {
|
|
21
|
+
callback(null);
|
|
17
22
|
}
|
|
18
23
|
}
|
|
19
24
|
//# sourceMappingURL=readFile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readFile.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/readFile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,QAA0C;IAC3E,IAAI,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"readFile.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/readFile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,QAA0C;IAC3E,IAAI;QACA,IAAI,IAAI,EAAE;YACN,IAAM,QAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,QAAM,CAAC,MAAM,GAAG;gBACZ,QAAQ,CAAC,QAAM,CAAC,MAAgB,CAAC,CAAC;YACtC,CAAC,CAAC;YACF,QAAM,CAAC,OAAO,GAAG;gBACb,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC,CAAC;YACF,QAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;SAC9B;KACJ;IAAC,WAAM;QACJ,QAAQ,CAAC,IAAI,CAAC,CAAC;KAClB;AACL,CAAC","sourcesContent":["/**\n * Read a file object and invoke a callback function with the data url of this file\n * @param file The file to read\n * @param callback the callback to invoke with data url of the file.\n * If fail to read, dataUrl will be null\n */\nexport function readFile(file: File, callback: (dataUrl: string | null) => void) {\n try {\n if (file) {\n const reader = new FileReader();\n reader.onload = () => {\n callback(reader.result as string);\n };\n reader.onerror = () => {\n callback(null);\n };\n reader.readAsDataURL(file);\n }\n } catch {\n callback(null);\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConflictFormatSolution, ContentModelFormatState, ContentModelSegmentFormat, ReadonlyContentModelDocument } from 'roosterjs-content-model-types';
|
|
1
|
+
import type { ConflictFormatSolution, ContentModelFormatState, ContentModelSegmentFormat, ReadonlyContentModelDocument, DOMHelper } from 'roosterjs-content-model-types';
|
|
2
2
|
/**
|
|
3
3
|
* Retrieve format state from the given Content Model
|
|
4
4
|
* @param model The Content Model to retrieve format state from
|
|
@@ -6,4 +6,4 @@ import type { ConflictFormatSolution, ContentModelFormatState, ContentModelSegme
|
|
|
6
6
|
* @param formatState Existing format state object, used for receiving the result
|
|
7
7
|
* @param conflictSolution The strategy for handling format conflicts
|
|
8
8
|
*/
|
|
9
|
-
export declare function retrieveModelFormatState(model: ReadonlyContentModelDocument, pendingFormat: ContentModelSegmentFormat | null, formatState: ContentModelFormatState, conflictSolution?: ConflictFormatSolution): void;
|
|
9
|
+
export declare function retrieveModelFormatState(model: ReadonlyContentModelDocument, pendingFormat: ContentModelSegmentFormat | null, formatState: ContentModelFormatState, conflictSolution?: ConflictFormatSolution, domHelper?: DOMHelper): void;
|
|
@@ -12,13 +12,18 @@ import { parseValueWithUnit } from '../../formatHandlers/utils/parseValueWithUni
|
|
|
12
12
|
* @param formatState Existing format state object, used for receiving the result
|
|
13
13
|
* @param conflictSolution The strategy for handling format conflicts
|
|
14
14
|
*/
|
|
15
|
-
export function retrieveModelFormatState(model, pendingFormat, formatState, conflictSolution) {
|
|
15
|
+
export function retrieveModelFormatState(model, pendingFormat, formatState, conflictSolution, domHelper) {
|
|
16
16
|
if (conflictSolution === void 0) { conflictSolution = 'remove'; }
|
|
17
17
|
var firstTableContext;
|
|
18
18
|
var firstBlock;
|
|
19
19
|
var isFirst = true;
|
|
20
20
|
var isFirstImage = true;
|
|
21
21
|
var isFirstSegment = true;
|
|
22
|
+
var containerFormat = undefined;
|
|
23
|
+
var modelFormat = __assign({}, model.format);
|
|
24
|
+
delete modelFormat.italic;
|
|
25
|
+
delete modelFormat.underline;
|
|
26
|
+
delete modelFormat.fontWeight;
|
|
22
27
|
iterateSelections(model, function (path, tableContext, block, segments) {
|
|
23
28
|
// Structure formats
|
|
24
29
|
retrieveStructureFormat(formatState, path, isFirst, conflictSolution);
|
|
@@ -36,13 +41,19 @@ export function retrieveModelFormatState(model, pendingFormat, formatState, conf
|
|
|
36
41
|
retrieveParagraphFormat(formatState, block, isFirst, conflictSolution);
|
|
37
42
|
// Segment formats
|
|
38
43
|
segments === null || segments === void 0 ? void 0 : segments.forEach(function (segment) {
|
|
39
|
-
var _a, _b, _c;
|
|
44
|
+
var _a, _b, _c, _d;
|
|
40
45
|
if (isFirstSegment || segment.segmentType != 'SelectionMarker') {
|
|
41
|
-
var
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
var currentFormat = Object.assign({}, block.format, (_a = block.decorator) === null || _a === void 0 ? void 0 : _a.format, segment.format, (_b = segment.code) === null || _b === void 0 ? void 0 : _b.format, (_c = segment.link) === null || _c === void 0 ? void 0 : _c.format, pendingFormat);
|
|
47
|
+
// Sometimes the content may not specify all required format but just leverage the container format to do so.
|
|
48
|
+
// In this case, we need to merge the container format into the current format
|
|
49
|
+
// to make sure the current format contains all required format.
|
|
50
|
+
if (!hasAllRequiredFormat(currentFormat)) {
|
|
51
|
+
if (!containerFormat) {
|
|
52
|
+
containerFormat = (_d = domHelper === null || domHelper === void 0 ? void 0 : domHelper.getContainerFormat()) !== null && _d !== void 0 ? _d : modelFormat;
|
|
53
|
+
}
|
|
54
|
+
currentFormat = Object.assign({}, containerFormat, currentFormat);
|
|
55
|
+
}
|
|
56
|
+
retrieveSegmentFormat(formatState, isFirst, currentFormat, conflictSolution);
|
|
46
57
|
mergeValue(formatState, 'isCodeInline', !!(segment === null || segment === void 0 ? void 0 : segment.code), isFirst, conflictSolution);
|
|
47
58
|
}
|
|
48
59
|
// We only care the format of selection marker when it is the first selected segment. This is because when selection marker
|
|
@@ -185,11 +196,17 @@ function mergeValue(format, key, newValue, isFirst, conflictSolution, parseFn) {
|
|
|
185
196
|
}
|
|
186
197
|
}
|
|
187
198
|
function px2Pt(px) {
|
|
188
|
-
if (px
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
199
|
+
if (px) {
|
|
200
|
+
var index = px.indexOf('px');
|
|
201
|
+
if (index !== -1 && index === px.length - 2) {
|
|
202
|
+
// Edge may not handle the floating computing well which causes the calculated value to be a little less than the actual value
|
|
203
|
+
// So add 0.05 to fix it
|
|
204
|
+
return Math.round(parseFloat(px) * 75 + 0.05) / 100 + 'pt';
|
|
205
|
+
}
|
|
192
206
|
}
|
|
193
207
|
return px;
|
|
194
208
|
}
|
|
209
|
+
function hasAllRequiredFormat(format) {
|
|
210
|
+
return !!format.fontFamily && !!format.fontSize && !!format.textColor;
|
|
211
|
+
}
|
|
195
212
|
//# sourceMappingURL=retrieveModelFormatState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieveModelFormatState.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/retrieveModelFormatState.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractBorderValues } from '../../domUtils/style/borderValues';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getTableMetadata } from '../metadata/updateTableMetadata';\nimport { isBold } from '../../domUtils/style/isBold';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { parseValueWithUnit } from '../../formatHandlers/utils/parseValueWithUnit';\nimport type {\n ConflictFormatSolution,\n ContentModelFormatState,\n ContentModelSegmentFormat,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelBlock,\n ReadonlyContentModelImage,\n ReadonlyTableSelectionContext,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelFormatContainer,\n ReadonlyContentModelListItem,\n ReadonlyContentModelDocument,\n} from 'roosterjs-content-model-types';\n\n/**\n * Retrieve format state from the given Content Model\n * @param model The Content Model to retrieve format state from\n * @param pendingFormat Existing pending format, if any\n * @param formatState Existing format state object, used for receiving the result\n * @param conflictSolution The strategy for handling format conflicts\n */\nexport function retrieveModelFormatState(\n model: ReadonlyContentModelDocument,\n pendingFormat: ContentModelSegmentFormat | null,\n formatState: ContentModelFormatState,\n conflictSolution: ConflictFormatSolution = 'remove'\n) {\n let firstTableContext: ReadonlyTableSelectionContext | undefined;\n let firstBlock: ReadonlyContentModelBlock | undefined;\n let isFirst = true;\n let isFirstImage = true;\n let isFirstSegment = true;\n\n iterateSelections(\n model,\n (path, tableContext, block, segments) => {\n // Structure formats\n retrieveStructureFormat(formatState, path, isFirst, conflictSolution);\n\n // Multiple line format\n if (block) {\n if (firstBlock) {\n formatState.isMultilineSelection = true;\n } else {\n firstBlock = block;\n }\n }\n\n if (block?.blockType == 'Paragraph') {\n // Paragraph formats\n retrieveParagraphFormat(formatState, block, isFirst, conflictSolution);\n\n // Segment formats\n segments?.forEach(segment => {\n if (isFirstSegment || segment.segmentType != 'SelectionMarker') {\n const modelFormat = { ...model.format };\n\n delete modelFormat.italic;\n delete modelFormat.underline;\n delete modelFormat.fontWeight;\n\n retrieveSegmentFormat(\n formatState,\n isFirst,\n Object.assign(\n {},\n modelFormat,\n block.format,\n block.decorator?.format,\n segment.format,\n segment.code?.format,\n segment.link?.format,\n pendingFormat\n ),\n conflictSolution\n );\n\n mergeValue(formatState, 'isCodeInline', !!segment?.code, isFirst, conflictSolution);\n }\n\n // We only care the format of selection marker when it is the first selected segment. This is because when selection marker\n // is after some other selected segments, it mostly like appears at the beginning of a seconde line when the whole first line\n // is selected (e.g. triple-click on a line) then the second selection marker doesn't contain a correct format, so we need to\n // ignore it\n isFirstSegment = false;\n\n formatState.canUnlink = formatState.canUnlink || !!segment.link;\n formatState.canAddImageAltText =\n formatState.canAddImageAltText ||\n segments.some(segment => segment.segmentType == 'Image');\n\n isFirst = false;\n\n if (segment.segmentType === 'Image') {\n if (isFirstImage) {\n retrieveImageFormat(segment, formatState);\n isFirstImage = false;\n } else {\n formatState.imageFormat = undefined;\n }\n }\n });\n\n isFirst = false;\n }\n\n if (tableContext) {\n if (firstTableContext) {\n const { table, colIndex, rowIndex } = firstTableContext;\n\n // Merge table format\n if (\n tableContext.table == table &&\n (tableContext.colIndex != colIndex || tableContext.rowIndex != rowIndex)\n ) {\n formatState.canMergeTableCell = true;\n formatState.isMultilineSelection = true;\n }\n } else {\n // Table formats\n retrieveTableFormat(tableContext, formatState);\n firstTableContext = tableContext;\n }\n }\n },\n {\n includeListFormatHolder: 'never',\n }\n );\n\n if (formatState.fontSize) {\n formatState.fontSize = px2Pt(formatState.fontSize);\n }\n}\n\nfunction retrieveSegmentFormat(\n result: ContentModelFormatState,\n isFirst: boolean,\n mergedFormat: ContentModelSegmentFormat,\n conflictSolution: ConflictFormatSolution = 'remove'\n) {\n const superOrSubscript = mergedFormat.superOrSubScriptSequence?.split(' ')?.pop();\n\n mergeValue(result, 'isBold', isBold(mergedFormat.fontWeight), isFirst, conflictSolution);\n mergeValue(result, 'isItalic', mergedFormat.italic, isFirst, conflictSolution);\n mergeValue(result, 'isUnderline', mergedFormat.underline, isFirst, conflictSolution);\n mergeValue(result, 'isStrikeThrough', mergedFormat.strikethrough, isFirst, conflictSolution);\n mergeValue(result, 'isSuperscript', superOrSubscript == 'super', isFirst, conflictSolution);\n mergeValue(result, 'isSubscript', superOrSubscript == 'sub', isFirst, conflictSolution);\n mergeValue(result, 'letterSpacing', mergedFormat.letterSpacing, isFirst, conflictSolution);\n\n mergeValue(result, 'fontName', mergedFormat.fontFamily, isFirst, conflictSolution);\n mergeValue(\n result,\n 'fontSize',\n mergedFormat.fontSize,\n isFirst,\n conflictSolution,\n val => parseValueWithUnit(val, undefined, 'pt') + 'pt'\n );\n mergeValue(result, 'backgroundColor', mergedFormat.backgroundColor, isFirst, conflictSolution);\n mergeValue(result, 'textColor', mergedFormat.textColor, isFirst, conflictSolution);\n mergeValue(result, 'fontWeight', mergedFormat.fontWeight, isFirst, conflictSolution);\n mergeValue(result, 'lineHeight', mergedFormat.lineHeight, isFirst, conflictSolution);\n}\n\nfunction retrieveParagraphFormat(\n result: ContentModelFormatState,\n paragraph: ReadonlyContentModelParagraph,\n isFirst: boolean,\n conflictSolution: ConflictFormatSolution = 'remove'\n) {\n const headingLevel = parseInt((paragraph.decorator?.tagName || '').substring(1));\n const validHeadingLevel = headingLevel >= 1 && headingLevel <= 6 ? headingLevel : undefined;\n\n mergeValue(result, 'marginBottom', paragraph.format.marginBottom, isFirst, conflictSolution);\n mergeValue(result, 'marginTop', paragraph.format.marginTop, isFirst, conflictSolution);\n mergeValue(result, 'headingLevel', validHeadingLevel, isFirst, conflictSolution);\n mergeValue(result, 'textAlign', paragraph.format.textAlign, isFirst, conflictSolution);\n mergeValue(result, 'direction', paragraph.format.direction, isFirst, conflictSolution);\n}\n\nfunction retrieveStructureFormat(\n result: ContentModelFormatState,\n path: ReadonlyContentModelBlockGroup[],\n isFirst: boolean,\n conflictSolution: ConflictFormatSolution = 'remove'\n) {\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem'], []);\n const containerIndex = getClosestAncestorBlockGroupIndex(path, ['FormatContainer'], []);\n\n if (listItemIndex >= 0) {\n const listItem = path[listItemIndex] as ReadonlyContentModelListItem;\n const listType = listItem?.levels[listItem.levels.length - 1]?.listType;\n\n mergeValue(result, 'isBullet', listType == 'UL', isFirst, conflictSolution);\n mergeValue(result, 'isNumbering', listType == 'OL', isFirst, conflictSolution);\n }\n\n mergeValue(\n result,\n 'isBlockQuote',\n containerIndex >= 0 &&\n (path[containerIndex] as ReadonlyContentModelFormatContainer)?.tagName == 'blockquote',\n isFirst,\n conflictSolution\n );\n}\n\nfunction retrieveTableFormat(\n tableContext: ReadonlyTableSelectionContext,\n result: ContentModelFormatState\n) {\n const tableFormat = getTableMetadata(tableContext.table);\n\n result.isInTable = true;\n result.tableHasHeader = tableContext.table.rows.some(row =>\n row.cells.some(cell => cell.isHeader)\n );\n\n if (tableFormat) {\n result.tableFormat = tableFormat;\n }\n}\n\nfunction retrieveImageFormat(image: ReadonlyContentModelImage, result: ContentModelFormatState) {\n const { format } = image;\n const borderKey = 'borderTop';\n const extractedBorder = extractBorderValues(format[borderKey]);\n const borderColor = extractedBorder.color;\n const borderWidth = extractedBorder.width;\n const borderStyle = extractedBorder.style;\n result.imageFormat = {\n borderColor,\n borderWidth,\n borderStyle,\n boxShadow: format.boxShadow,\n borderRadius: format.borderRadius,\n };\n}\n\nfunction mergeValue<K extends keyof ContentModelFormatState>(\n format: ContentModelFormatState,\n key: K,\n newValue: ContentModelFormatState[K] | undefined,\n isFirst: boolean,\n conflictSolution: ConflictFormatSolution = 'remove',\n parseFn: (val: ContentModelFormatState[K]) => ContentModelFormatState[K] = val => val,\n) {\n if (isFirst) {\n if (newValue !== undefined) {\n format[key] = newValue;\n }\n } else if (parseFn(newValue) !== parseFn(format[key])) {\n switch (conflictSolution) {\n case 'remove':\n delete format[key];\n break;\n case 'keepFirst':\n break;\n case 'returnMultiple':\n if (typeof format[key] === 'string') {\n (format[key] as string) = 'Multiple';\n } else {\n delete format[key];\n }\n break;\n }\n }\n}\n\nfunction px2Pt(px: string) {\n if (px && px.indexOf('px') == px.length - 2) {\n // Edge may not handle the floating computing well which causes the calculated value is a little less than actual value\n // So add 0.05 to fix it\n return Math.round(parseFloat(px) * 75 + 0.05) / 100 + 'pt';\n }\n return px;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"retrieveModelFormatState.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/retrieveModelFormatState.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractBorderValues } from '../../domUtils/style/borderValues';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getTableMetadata } from '../metadata/updateTableMetadata';\nimport { isBold } from '../../domUtils/style/isBold';\nimport { iterateSelections } from '../selection/iterateSelections';\nimport { parseValueWithUnit } from '../../formatHandlers/utils/parseValueWithUnit';\nimport type {\n ConflictFormatSolution,\n ContentModelFormatState,\n ContentModelSegmentFormat,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelBlock,\n ReadonlyContentModelImage,\n ReadonlyTableSelectionContext,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelFormatContainer,\n ReadonlyContentModelListItem,\n ReadonlyContentModelDocument,\n DOMHelper,\n} from 'roosterjs-content-model-types';\n\n/**\n * Retrieve format state from the given Content Model\n * @param model The Content Model to retrieve format state from\n * @param pendingFormat Existing pending format, if any\n * @param formatState Existing format state object, used for receiving the result\n * @param conflictSolution The strategy for handling format conflicts\n */\nexport function retrieveModelFormatState(\n model: ReadonlyContentModelDocument,\n pendingFormat: ContentModelSegmentFormat | null,\n formatState: ContentModelFormatState,\n conflictSolution: ConflictFormatSolution = 'remove',\n domHelper?: DOMHelper\n) {\n let firstTableContext: ReadonlyTableSelectionContext | undefined;\n let firstBlock: ReadonlyContentModelBlock | undefined;\n let isFirst = true;\n let isFirstImage = true;\n let isFirstSegment = true;\n let containerFormat: ContentModelSegmentFormat | undefined = undefined;\n\n const modelFormat = { ...model.format };\n\n delete modelFormat.italic;\n delete modelFormat.underline;\n delete modelFormat.fontWeight;\n\n iterateSelections(\n model,\n (path, tableContext, block, segments) => {\n // Structure formats\n retrieveStructureFormat(formatState, path, isFirst, conflictSolution);\n\n // Multiple line format\n if (block) {\n if (firstBlock) {\n formatState.isMultilineSelection = true;\n } else {\n firstBlock = block;\n }\n }\n\n if (block?.blockType == 'Paragraph') {\n // Paragraph formats\n retrieveParagraphFormat(formatState, block, isFirst, conflictSolution);\n\n // Segment formats\n segments?.forEach(segment => {\n if (isFirstSegment || segment.segmentType != 'SelectionMarker') {\n let currentFormat = Object.assign(\n {},\n block.format,\n block.decorator?.format,\n segment.format,\n segment.code?.format,\n segment.link?.format,\n pendingFormat\n );\n\n // Sometimes the content may not specify all required format but just leverage the container format to do so.\n // In this case, we need to merge the container format into the current format\n // to make sure the current format contains all required format.\n if (!hasAllRequiredFormat(currentFormat)) {\n if (!containerFormat) {\n containerFormat = domHelper?.getContainerFormat() ?? modelFormat;\n }\n\n currentFormat = Object.assign({}, containerFormat, currentFormat);\n }\n\n retrieveSegmentFormat(\n formatState,\n isFirst,\n currentFormat,\n conflictSolution\n );\n\n mergeValue(\n formatState,\n 'isCodeInline',\n !!segment?.code,\n isFirst,\n conflictSolution\n );\n }\n\n // We only care the format of selection marker when it is the first selected segment. This is because when selection marker\n // is after some other selected segments, it mostly like appears at the beginning of a seconde line when the whole first line\n // is selected (e.g. triple-click on a line) then the second selection marker doesn't contain a correct format, so we need to\n // ignore it\n isFirstSegment = false;\n\n formatState.canUnlink = formatState.canUnlink || !!segment.link;\n formatState.canAddImageAltText =\n formatState.canAddImageAltText ||\n segments.some(segment => segment.segmentType == 'Image');\n\n isFirst = false;\n\n if (segment.segmentType === 'Image') {\n if (isFirstImage) {\n retrieveImageFormat(segment, formatState);\n isFirstImage = false;\n } else {\n formatState.imageFormat = undefined;\n }\n }\n });\n\n isFirst = false;\n }\n\n if (tableContext) {\n if (firstTableContext) {\n const { table, colIndex, rowIndex } = firstTableContext;\n\n // Merge table format\n if (\n tableContext.table == table &&\n (tableContext.colIndex != colIndex || tableContext.rowIndex != rowIndex)\n ) {\n formatState.canMergeTableCell = true;\n formatState.isMultilineSelection = true;\n }\n } else {\n // Table formats\n retrieveTableFormat(tableContext, formatState);\n firstTableContext = tableContext;\n }\n }\n },\n {\n includeListFormatHolder: 'never',\n }\n );\n\n if (formatState.fontSize) {\n formatState.fontSize = px2Pt(formatState.fontSize);\n }\n}\n\nfunction retrieveSegmentFormat(\n result: ContentModelFormatState,\n isFirst: boolean,\n mergedFormat: ContentModelSegmentFormat,\n conflictSolution: ConflictFormatSolution = 'remove'\n) {\n const superOrSubscript = mergedFormat.superOrSubScriptSequence?.split(' ')?.pop();\n\n mergeValue(result, 'isBold', isBold(mergedFormat.fontWeight), isFirst, conflictSolution);\n mergeValue(result, 'isItalic', mergedFormat.italic, isFirst, conflictSolution);\n mergeValue(result, 'isUnderline', mergedFormat.underline, isFirst, conflictSolution);\n mergeValue(result, 'isStrikeThrough', mergedFormat.strikethrough, isFirst, conflictSolution);\n mergeValue(result, 'isSuperscript', superOrSubscript == 'super', isFirst, conflictSolution);\n mergeValue(result, 'isSubscript', superOrSubscript == 'sub', isFirst, conflictSolution);\n mergeValue(result, 'letterSpacing', mergedFormat.letterSpacing, isFirst, conflictSolution);\n\n mergeValue(result, 'fontName', mergedFormat.fontFamily, isFirst, conflictSolution);\n mergeValue(\n result,\n 'fontSize',\n mergedFormat.fontSize,\n isFirst,\n conflictSolution,\n val => parseValueWithUnit(val, undefined, 'pt') + 'pt'\n );\n mergeValue(result, 'backgroundColor', mergedFormat.backgroundColor, isFirst, conflictSolution);\n mergeValue(result, 'textColor', mergedFormat.textColor, isFirst, conflictSolution);\n mergeValue(result, 'fontWeight', mergedFormat.fontWeight, isFirst, conflictSolution);\n mergeValue(result, 'lineHeight', mergedFormat.lineHeight, isFirst, conflictSolution);\n}\n\nfunction retrieveParagraphFormat(\n result: ContentModelFormatState,\n paragraph: ReadonlyContentModelParagraph,\n isFirst: boolean,\n conflictSolution: ConflictFormatSolution = 'remove'\n) {\n const headingLevel = parseInt((paragraph.decorator?.tagName || '').substring(1));\n const validHeadingLevel = headingLevel >= 1 && headingLevel <= 6 ? headingLevel : undefined;\n\n mergeValue(result, 'marginBottom', paragraph.format.marginBottom, isFirst, conflictSolution);\n mergeValue(result, 'marginTop', paragraph.format.marginTop, isFirst, conflictSolution);\n mergeValue(result, 'headingLevel', validHeadingLevel, isFirst, conflictSolution);\n mergeValue(result, 'textAlign', paragraph.format.textAlign, isFirst, conflictSolution);\n mergeValue(result, 'direction', paragraph.format.direction, isFirst, conflictSolution);\n}\n\nfunction retrieveStructureFormat(\n result: ContentModelFormatState,\n path: ReadonlyContentModelBlockGroup[],\n isFirst: boolean,\n conflictSolution: ConflictFormatSolution = 'remove'\n) {\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem'], []);\n const containerIndex = getClosestAncestorBlockGroupIndex(path, ['FormatContainer'], []);\n\n if (listItemIndex >= 0) {\n const listItem = path[listItemIndex] as ReadonlyContentModelListItem;\n const listType = listItem?.levels[listItem.levels.length - 1]?.listType;\n\n mergeValue(result, 'isBullet', listType == 'UL', isFirst, conflictSolution);\n mergeValue(result, 'isNumbering', listType == 'OL', isFirst, conflictSolution);\n }\n\n mergeValue(\n result,\n 'isBlockQuote',\n containerIndex >= 0 &&\n (path[containerIndex] as ReadonlyContentModelFormatContainer)?.tagName == 'blockquote',\n isFirst,\n conflictSolution\n );\n}\n\nfunction retrieveTableFormat(\n tableContext: ReadonlyTableSelectionContext,\n result: ContentModelFormatState\n) {\n const tableFormat = getTableMetadata(tableContext.table);\n\n result.isInTable = true;\n result.tableHasHeader = tableContext.table.rows.some(row =>\n row.cells.some(cell => cell.isHeader)\n );\n\n if (tableFormat) {\n result.tableFormat = tableFormat;\n }\n}\n\nfunction retrieveImageFormat(image: ReadonlyContentModelImage, result: ContentModelFormatState) {\n const { format } = image;\n const borderKey = 'borderTop';\n const extractedBorder = extractBorderValues(format[borderKey]);\n const borderColor = extractedBorder.color;\n const borderWidth = extractedBorder.width;\n const borderStyle = extractedBorder.style;\n result.imageFormat = {\n borderColor,\n borderWidth,\n borderStyle,\n boxShadow: format.boxShadow,\n borderRadius: format.borderRadius,\n };\n}\n\nfunction mergeValue<K extends keyof ContentModelFormatState>(\n format: ContentModelFormatState,\n key: K,\n newValue: ContentModelFormatState[K] | undefined,\n isFirst: boolean,\n conflictSolution: ConflictFormatSolution = 'remove',\n parseFn: (val: ContentModelFormatState[K]) => ContentModelFormatState[K] = val => val\n) {\n if (isFirst) {\n if (newValue !== undefined) {\n format[key] = newValue;\n }\n } else if (parseFn(newValue) !== parseFn(format[key])) {\n switch (conflictSolution) {\n case 'remove':\n delete format[key];\n break;\n case 'keepFirst':\n break;\n case 'returnMultiple':\n if (typeof format[key] === 'string') {\n (format[key] as string) = 'Multiple';\n } else {\n delete format[key];\n }\n break;\n }\n }\n}\n\nfunction px2Pt(px: string) {\n if (px) {\n const index = px.indexOf('px');\n if (index !== -1 && index === px.length - 2) {\n // Edge may not handle the floating computing well which causes the calculated value to be a little less than the actual value\n // So add 0.05 to fix it\n return Math.round(parseFloat(px) * 75 + 0.05) / 100 + 'pt';\n }\n }\n return px;\n}\n\nfunction hasAllRequiredFormat(format: ContentModelSegmentFormat) {\n return !!format.fontFamily && !!format.fontSize && !!format.textColor;\n}\n"]}
|
|
@@ -5,7 +5,7 @@ import { applyMetadata } from '../utils/applyMetadata';
|
|
|
5
5
|
* @internal
|
|
6
6
|
*/
|
|
7
7
|
export var handleList = function (doc, parent, listItem, context, refNode) {
|
|
8
|
-
var _a, _b;
|
|
8
|
+
var _a, _b, _c;
|
|
9
9
|
var layer = 0;
|
|
10
10
|
var nodeStack = context.listFormat.nodeStack;
|
|
11
11
|
if (nodeStack.length == 0) {
|
|
@@ -19,7 +19,10 @@ export var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
19
19
|
var itemLevel = listItem.levels[layer];
|
|
20
20
|
if (stackLevel.listType != itemLevel.listType ||
|
|
21
21
|
((_a = stackLevel.dataset) === null || _a === void 0 ? void 0 : _a.editingInfo) != itemLevel.dataset.editingInfo ||
|
|
22
|
-
(itemLevel.listType == 'OL' &&
|
|
22
|
+
(itemLevel.listType == 'OL' &&
|
|
23
|
+
typeof itemLevel.format.startNumberOverride === 'number') ||
|
|
24
|
+
(itemLevel.listType == 'UL' &&
|
|
25
|
+
itemLevel.format.listStyleType != ((_b = stackLevel.format) === null || _b === void 0 ? void 0 : _b.listStyleType))) {
|
|
23
26
|
break;
|
|
24
27
|
}
|
|
25
28
|
}
|
|
@@ -38,7 +41,7 @@ export var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
38
41
|
// Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling
|
|
39
42
|
applyFormat(newList, context.formatAppliers.listLevel, level.format, context);
|
|
40
43
|
applyFormat(newList, context.formatAppliers.dataset, level.dataset, context);
|
|
41
|
-
(
|
|
44
|
+
(_c = context.onNodeCreated) === null || _c === void 0 ? void 0 : _c.call(context, level, newList);
|
|
42
45
|
}
|
|
43
46
|
return refNode;
|
|
44
47
|
};
|
|
@@ -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;AAOvD;;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;SACf,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,UAAU,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzC,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,
|
|
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;AAOvD;;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;SACf,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,UAAU,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzC,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;KACJ;IAED,mDAAmD;IACnD,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE5B,oDAAoD;IACpD,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC5C,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC1D,IAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAExD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,SAAS,CAAC,IAAI,YAAG,IAAI,EAAE,OAAO,IAAK,KAAK,EAAG,CAAC;QAE5C,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEpF,oIAAoI;QACpI,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEhF,uIAAuI;QACvI,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9E,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE7E,MAAA,OAAO,CAAC,aAAa,+CAArB,OAAO,EAAiB,KAAK,EAAE,OAAO,CAAC,CAAC;KAC3C;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\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 });\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 stackLevel = nodeStack[layer + 1];\n const itemLevel = listItem.levels[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 }\n }\n\n // Cut off remained list levels that we can't reuse\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 newList = doc.createElement(level.listType || 'UL');\n const lastParent = nodeStack[nodeStack.length - 1].node;\n\n lastParent.insertBefore(newList, layer == 0 ? refNode : null);\n nodeStack.push({ node: newList, ...level });\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 context.onNodeCreated?.(level, newList);\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.25.0"
|
|
7
7
|
},
|
|
8
|
-
"version": "9.
|
|
8
|
+
"version": "9.25.0",
|
|
9
9
|
"main": "./lib/index.js",
|
|
10
10
|
"typings": "./lib/index.d.ts",
|
|
11
11
|
"module": "./lib-mjs/index.js",
|