Skip to content

Commit

Permalink
Merge pull request #2565 from microsoft/u/juliaroldi/export-formatSeg…
Browse files Browse the repository at this point in the history
…ment

Export formatTextSegmentBeforeSelectionMarker
  • Loading branch information
juliaroldi authored Apr 5, 2024
2 parents 53f1f4d + 29d5315 commit 86cc784
Show file tree
Hide file tree
Showing 11 changed files with 818 additions and 1,874 deletions.
1 change: 1 addition & 0 deletions packages/roosterjs-content-model-api/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export { formatTableWithContentModel } from './publicApi/utils/formatTableWithCo
export { formatImageWithContentModel } from './publicApi/utils/formatImageWithContentModel';
export { formatParagraphWithContentModel } from './publicApi/utils/formatParagraphWithContentModel';
export { formatSegmentWithContentModel } from './publicApi/utils/formatSegmentWithContentModel';
export { formatTextSegmentBeforeSelectionMarker } from './publicApi/utils/formatTextSegmentBeforeSelectionMarker';

export { setListType } from './modelApi/list/setListType';
export { setModelListStyle } from './modelApi/list/setModelListStyle';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import type {
} from 'roosterjs-content-model-types';

/**
* @internal
* Invoke a callback to format the text segment before the selection marker using Content Model
* @param editor The editor object
* @param callback The callback to format the text segment.
*/
export function formatTextSegmentBeforeSelectionMarker(
editor: IEditor,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
import { formatTextSegmentBeforeSelectionMarker } from '../../../lib/publicApi/utils/formatTextSegmentBeforeSelectionMarker';
import {
ContentModelDocument,
ContentModelParagraph,
ContentModelSegmentFormat,
ContentModelText,
FormatContentModelContext,
} from 'roosterjs-content-model-types';

describe('formatTextSegmentBeforeSelectionMarker', () => {
function runTest(
input: ContentModelDocument,
callback: (
model: ContentModelDocument,
previousSegment: ContentModelText,
paragraph: ContentModelParagraph,
markerFormat: ContentModelSegmentFormat,
context: FormatContentModelContext
) => boolean,
expectedModel: ContentModelDocument,
expectedResult: boolean
) {
const formatWithContentModelSpy = jasmine
.createSpy('formatWithContentModel')
.and.callFake((callback, options) => {
const result = callback(input, {
newEntities: [],
deletedEntities: [],
newImages: [],
canUndoByBackspace: true,
});
expect(result).toBe(expectedResult);
});

formatTextSegmentBeforeSelectionMarker(
{
focus: () => {},
formatContentModel: formatWithContentModelSpy,
} as any,
callback
);

expect(formatWithContentModelSpy).toHaveBeenCalled();
expect(input).toEqual(expectedModel);
}

it('no selection marker', () => {
const input: ContentModelDocument = {
blockGroupType: 'Document',
blocks: [
{
blockType: 'Paragraph',
segments: [
{
segmentType: 'Text',
text: 'test',
format: {},
},
],
format: {},
},
],
};
runTest(input, () => true, input, false);
});

it('no previous segment', () => {
const input: ContentModelDocument = {
blockGroupType: 'Document',
blocks: [
{
blockType: 'Paragraph',
segments: [
{
segmentType: 'SelectionMarker',
isSelected: true,
format: {},
},
],
format: {},
},
],
};
runTest(input, () => true, input, false);
});

it('previous segment is not text', () => {
const input: ContentModelDocument = {
blockGroupType: 'Document',
blocks: [
{
blockType: 'Paragraph',
segments: [
{
segmentType: 'Image',
src: 'test',
format: {},
dataset: {},
},
{
segmentType: 'SelectionMarker',
isSelected: true,
format: {},
},
],
format: {},
},
],
};
runTest(input, () => true, input, false);
});

it('format segment', () => {
const input: ContentModelDocument = {
blockGroupType: 'Document',
blocks: [
{
blockType: 'Paragraph',
segments: [
{
segmentType: 'Text',
text: 'first',
format: {},
},
{
segmentType: 'Text',
text: 'second',
format: {},
},
{
segmentType: 'SelectionMarker',
isSelected: true,
format: {},
},
],
format: {},
},
],
};
const expectedModel: ContentModelDocument = {
blockGroupType: 'Document',
blocks: [
{
blockType: 'Paragraph',
segments: [
{
segmentType: 'Text',
text: 'first',
format: {},
},
{
segmentType: 'Text',
text: 'second',
format: {
textColor: 'red',
},
},
{
segmentType: 'SelectionMarker',
isSelected: true,
format: {},
},
],
format: {},
},
],
};
runTest(
input,
(_model, previousSegment) => {
previousSegment.format = { textColor: 'red' };
return true;
},
expectedModel,
true
);
});
});
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createLink } from './link/createLink';
import { createLinkAfterSpace } from './link/createLinkAfterSpace';
import { formatTextSegmentBeforeSelectionMarker } from '../pluginUtils/formatTextSegmentBeforeSelectionMarker';
import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';
import { keyboardListTrigger } from './list/keyboardListTrigger';
import { transformHyphen } from './hyphen/transformHyphen';
import { unlink } from './link/unlink';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { addLink } from 'roosterjs-content-model-dom';
import { formatTextSegmentBeforeSelectionMarker } from '../../pluginUtils/formatTextSegmentBeforeSelectionMarker';
import { matchLink } from 'roosterjs-content-model-api';
import { formatTextSegmentBeforeSelectionMarker, matchLink } from 'roosterjs-content-model-api';
import type { IEditor, LinkData } from 'roosterjs-content-model-types';

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { formatTextSegmentBeforeSelectionMarker } from '../../pluginUtils/formatTextSegmentBeforeSelectionMarker';
import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';

import type { IEditor } from 'roosterjs-content-model-types';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { formatTextSegmentBeforeSelectionMarker } from '../../pluginUtils/formatTextSegmentBeforeSelectionMarker';
import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';
import { splitTextSegment } from '../../pluginUtils/splitTextSegment';

import type {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as createLink from '../../lib/autoFormat/link/createLink';
import * as formatTextSegmentBeforeSelectionMarker from '../../lib/pluginUtils/formatTextSegmentBeforeSelectionMarker';
import * as formatTextSegmentBeforeSelectionMarker from 'roosterjs-content-model-api/lib/publicApi/utils/formatTextSegmentBeforeSelectionMarker';
import * as unlink from '../../lib/autoFormat/link/unlink';
import { AutoFormatOptions, AutoFormatPlugin } from '../../lib/autoFormat/AutoFormatPlugin';
import { createLinkAfterSpace } from '../../lib/autoFormat/link/createLinkAfterSpace';
Expand Down
Loading

0 comments on commit 86cc784

Please sign in to comment.