Skip to content

Commit 9eb8593

Browse files
authored
Merge pull request #1954 from microsoft/u/juliaroldi/bump-8.51.1-0.11.0
Bump Rooster to 8.51.1 and content-model to 0.11.0
2 parents 65adaf2 + 61e0c7a commit 9eb8593

File tree

59 files changed

+1381
-884
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1381
-884
lines changed

packages-content-model/roosterjs-content-model-dom/lib/domToModel/context/createDomToModelContext.ts

Lines changed: 8 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,24 @@ import { defaultFormatParsers, getFormatParsers } from '../../formatHandlers/def
22
import { defaultProcessorMap } from './defaultProcessors';
33
import { defaultStyleMap } from '../../formatHandlers/utils/defaultStyles';
44
import { DomToModelContext, DomToModelOption, EditorContext } from 'roosterjs-content-model-types';
5-
import { SelectionRangeTypes } from 'roosterjs-editor-types';
5+
import { SelectionRangeEx } from 'roosterjs-editor-types';
66

77
/**
88
* Create context object form DOM to Content Model conversion
99
* @param editorContext Context of editor
1010
* @param options Options for this context
11+
* @param selection Selection that already exists in content
1112
*/
1213
export function createDomToModelContext(
1314
editorContext?: EditorContext,
14-
options?: DomToModelOption
15+
options?: DomToModelOption,
16+
selection?: SelectionRangeEx
1517
): DomToModelContext {
1618
const context: DomToModelContext = {
1719
...editorContext,
1820

1921
blockFormat: {},
2022
segmentFormat: {},
21-
zoomScaleFormat: {},
2223
isInSelection: false,
2324

2425
listFormat: {
@@ -57,46 +58,12 @@ export function createDomToModelContext(
5758
allowCacheElement: !options?.disableCacheElement,
5859
};
5960

60-
const range = options?.selectionRange;
61-
let selectionRoot: Node | undefined;
62-
63-
switch (range?.type) {
64-
case SelectionRangeTypes.Normal:
65-
const regularRange = range.ranges[0];
66-
if (regularRange) {
67-
selectionRoot = regularRange.commonAncestorContainer;
68-
context.regularSelection = {
69-
startContainer: regularRange.startContainer,
70-
startOffset: regularRange.startOffset,
71-
endContainer: regularRange.endContainer,
72-
endOffset: regularRange.endOffset,
73-
isSelectionCollapsed: regularRange.collapsed,
74-
};
75-
}
76-
break;
77-
78-
case SelectionRangeTypes.TableSelection:
79-
if (range.coordinates && range.table) {
80-
selectionRoot = range.table;
81-
context.tableSelection = {
82-
table: range.table,
83-
firstCell: { ...range.coordinates.firstCell },
84-
lastCell: { ...range.coordinates.lastCell },
85-
};
86-
}
87-
88-
break;
89-
90-
case SelectionRangeTypes.ImageSelection:
91-
selectionRoot = range.image;
92-
context.imageSelection = {
93-
image: range.image,
94-
};
95-
break;
61+
if (editorContext?.isRootRtl) {
62+
context.blockFormat.direction = 'rtl';
9663
}
9764

98-
if (selectionRoot) {
99-
context.selectionRootNode = selectionRoot;
65+
if (selection) {
66+
context.rangeEx = selection;
10067
}
10168

10269
return context;

packages-content-model/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
import { createContentModelDocument } from '../modelApi/creators/createContentModelDocument';
22
import { createDomToModelContext } from './context/createDomToModelContext';
3-
import { isNodeOfType } from '../domUtils/isNodeOfType';
4-
import { NodeType } from 'roosterjs-editor-types';
53
import { normalizeContentModel } from '../modelApi/common/normalizeContentModel';
6-
import { parseFormat } from './utils/parseFormat';
7-
import { rootDirectionFormatHandler } from '../formatHandlers/root/rootDirectionFormatHandler';
8-
import { zoomScaleFormatHandler } from '../formatHandlers/root/zoomScaleFormatHandler';
4+
import { SelectionRangeEx } from 'roosterjs-editor-types';
95
import {
106
ContentModelDocument,
117
DomToModelOption,
@@ -15,25 +11,19 @@ import {
1511
/**
1612
* Create Content Model from DOM tree in this editor
1713
* @param root Root element of DOM tree to create Content Model from
18-
* @param editorContext Context of content model editor
1914
* @param option The option to customize the behavior of DOM to Content Model conversion
15+
* @param editorContext Context of content model editor
16+
* @param selection Existing selection range in editor
2017
* @returns A ContentModelDocument object that contains all the models created from the give root element
2118
*/
2219
export function domToContentModel(
2320
root: HTMLElement | DocumentFragment,
21+
option?: DomToModelOption,
2422
editorContext?: EditorContext,
25-
option?: DomToModelOption
23+
selection?: SelectionRangeEx
2624
): ContentModelDocument {
2725
const model = createContentModelDocument(editorContext?.defaultFormat);
28-
const context = createDomToModelContext(editorContext, option);
29-
30-
if (isNodeOfType(root, NodeType.Element)) {
31-
// Need to calculate direction (ltr or rtl), use it as initial value
32-
parseFormat(root, [rootDirectionFormatHandler.parse], context.blockFormat, context);
33-
34-
// Need to calculate zoom scale value from root element, use this value to calculate sizes for elements
35-
parseFormat(root, [zoomScaleFormatHandler.parse], context.zoomScaleFormat, context);
36-
}
26+
const context = createDomToModelContext(editorContext, option, selection);
3727

3828
context.elementProcessors.child(model, root, context);
3929

packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/childProcessor.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { addSelectionMarker } from '../utils/addSelectionMarker';
22
import { getRegularSelectionOffsets } from '../utils/getRegularSelectionOffsets';
33
import { isNodeOfType } from '../../domUtils/isNodeOfType';
4-
import { NodeType } from 'roosterjs-editor-types';
4+
import { NodeType, SelectionRangeTypes } from 'roosterjs-editor-types';
55
import {
66
ContentModelBlockGroup,
77
DomToModelContext,
@@ -73,8 +73,8 @@ export function handleRegularSelection(
7373
addSelectionMarker(group, context);
7474
}
7575

76-
if (index == nodeEndOffset) {
77-
if (!context.regularSelection!.isSelectionCollapsed) {
76+
if (index == nodeEndOffset && context.rangeEx?.type == SelectionRangeTypes.Normal) {
77+
if (!context.rangeEx.areAllCollapsed) {
7878
addSelectionMarker(group, context);
7979
}
8080
context.isInSelection = false;

packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/headingProcessor.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { blockProcessor } from './blockProcessor';
33
import { ContentModelSegmentFormat, ElementProcessor } from 'roosterjs-content-model-types';
44
import { createParagraph } from '../../modelApi/creators/createParagraph';
55
import { createParagraphDecorator } from '../../modelApi/creators/createParagraphDecorator';
6+
import { getObjectKeys } from 'roosterjs-editor-dom';
67
import { parseFormat } from '../utils/parseFormat';
78
import { stackFormat } from '../utils/stackFormat';
89

@@ -18,6 +19,13 @@ export const headingProcessor: ElementProcessor<HTMLHeadingElement> = (group, el
1819

1920
parseFormat(element, context.formatParsers.segmentOnBlock, segmentFormat, context);
2021

22+
// These formats are already declared on heading element, no need to keep them in context.
23+
// And we should not duplicate them in context, either. Because when we want to turn off header,
24+
// inner text should not keep those text format from header.
25+
getObjectKeys(segmentFormat).forEach(key => {
26+
delete context.segmentFormat[key];
27+
});
28+
2129
context.blockDecorator = createParagraphDecorator(element.tagName, segmentFormat);
2230

2331
blockProcessor(group, element, context);

packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/imageProcessor.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { addSegment } from '../../modelApi/common/addSegment';
33
import { ContentModelImageFormat, ElementProcessor } from 'roosterjs-content-model-types';
44
import { createImage } from '../../modelApi/creators/createImage';
55
import { parseFormat } from '../utils/parseFormat';
6+
import { SelectionRangeTypes } from 'roosterjs-editor-types';
67
import { stackFormat } from '../utils/stackFormat';
78

89
/**
@@ -32,7 +33,10 @@ export const imageProcessor: ElementProcessor<HTMLImageElement> = (group, elemen
3233
if (context.isInSelection) {
3334
image.isSelected = true;
3435
}
35-
if (context.imageSelection?.image == element) {
36+
if (
37+
context.rangeEx?.type == SelectionRangeTypes.ImageSelection &&
38+
context.rangeEx.image == element
39+
) {
3640
image.isSelectedAsImageSelection = true;
3741
image.isSelected = true;
3842
}

packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { createTable } from '../../modelApi/creators/createTable';
33
import { createTableCell } from '../../modelApi/creators/createTableCell';
44
import { getBoundingClientRect } from '../utils/getBoundingClientRect';
55
import { parseFormat } from '../utils/parseFormat';
6+
import { SelectionRangeTypes } from 'roosterjs-editor-types';
67
import { stackFormat } from '../utils/stackFormat';
78
import {
89
ContentModelTableCellFormat,
@@ -39,8 +40,16 @@ export const tableProcessor: ElementProcessor<HTMLTableElement> = (
3940
parseFormat(tableElement, context.formatParsers.block, context.blockFormat, context);
4041

4142
const table = createTable(tableElement.rows.length, context.blockFormat);
42-
const { table: selectedTable, firstCell, lastCell } = context.tableSelection || {};
43-
const hasTableSelection = selectedTable == tableElement && !!firstCell && !!lastCell;
43+
const tableSelection =
44+
context.rangeEx?.type == SelectionRangeTypes.TableSelection
45+
? context.rangeEx
46+
: null;
47+
const selectedTable = tableSelection?.table;
48+
const coordinates = tableSelection?.coordinates;
49+
const hasTableSelection =
50+
selectedTable == tableElement &&
51+
!!coordinates?.firstCell &&
52+
!!coordinates?.lastCell;
4453

4554
if (context.allowCacheElement) {
4655
table.cachedElement = tableElement;
@@ -59,7 +68,7 @@ export const tableProcessor: ElementProcessor<HTMLTableElement> = (
5968

6069
const columnPositions: number[] = [0];
6170
const rowPositions: number[] = [0];
62-
const zoomScale = context.zoomScaleFormat.zoomScale || 1;
71+
const zoomScale = context.zoomScale || 1;
6372

6473
for (let row = 0; row < tableElement.rows.length; row++) {
6574
const tr = tableElement.rows[row];
@@ -213,10 +222,10 @@ export const tableProcessor: ElementProcessor<HTMLTableElement> = (
213222
if (
214223
(hasSelectionBeforeCell && hasSelectionAfterCell) ||
215224
(hasTableSelection &&
216-
row >= firstCell.y &&
217-
row <= lastCell.y &&
218-
targetCol >= firstCell.x &&
219-
targetCol <= lastCell.x)
225+
row >= coordinates.firstCell.y &&
226+
row <= coordinates.lastCell.y &&
227+
targetCol >= coordinates.firstCell.x &&
228+
targetCol <= coordinates.lastCell.x)
220229
) {
221230
cell.isSelected = true;
222231
}

packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { addDecorators } from '../../modelApi/common/addDecorators';
22
import { addSegment } from '../../modelApi/common/addSegment';
33
import { addSelectionMarker } from '../utils/addSelectionMarker';
44
import { areSameFormats } from '../utils/areSameFormats';
5+
import { createText } from '../../modelApi/creators/createText';
6+
import { getRegularSelectionOffsets } from '../utils/getRegularSelectionOffsets';
7+
import { hasSpacesOnly } from '../../domUtils/stringUtil';
58
import {
69
ContentModelBlockGroup,
710
DomToModelContext,
811
ElementProcessor,
912
} from 'roosterjs-content-model-types';
10-
import { createText } from '../../modelApi/creators/createText';
11-
import { getRegularSelectionOffsets } from '../utils/getRegularSelectionOffsets';
12-
import { hasSpacesOnly } from '../../domUtils/stringUtil';
1313

1414
/**
1515
* @internal
@@ -35,7 +35,7 @@ export const textProcessor: ElementProcessor<Text> = (
3535
if (txtEndOffset >= 0) {
3636
addTextSegment(group, txt.substring(0, txtEndOffset), context);
3737

38-
if (!context.regularSelection!.isSelectionCollapsed) {
38+
if (context.rangeEx && !context.rangeEx.areAllCollapsed) {
3939
addSelectionMarker(group, context);
4040
}
4141

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { DomToModelContext } from 'roosterjs-content-model-types';
2+
import { SelectionRangeTypes } from 'roosterjs-editor-types';
23

34
/**
45
* Get offset numbers of a regular (range based) selection.
@@ -11,14 +12,11 @@ export function getRegularSelectionOffsets(
1112
context: DomToModelContext,
1213
currentContainer: Node
1314
): [number, number] {
14-
let startOffset =
15-
context.regularSelection?.startContainer == currentContainer
16-
? context.regularSelection.startOffset!
17-
: -1;
18-
let endOffset =
19-
context.regularSelection?.endContainer == currentContainer
20-
? context.regularSelection.endOffset!
21-
: -1;
15+
const range =
16+
context.rangeEx?.type == SelectionRangeTypes.Normal ? context.rangeEx.ranges[0] : null;
17+
18+
let startOffset = range?.startContainer == currentContainer ? range.startOffset : -1;
19+
let endOffset = range?.endContainer == currentContainer ? range.endOffset! : -1;
2220

2321
return [startOffset, endOffset];
2422
}

packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/root/rootDirectionFormatHandler.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

packages-content-model/roosterjs-content-model-dom/lib/formatHandlers/root/zoomScaleFormatHandler.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)