diff --git a/packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts b/packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts index 649f625274f..adda5bcc132 100644 --- a/packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts +++ b/packages-content-model/roosterjs-content-model-dom/lib/domToModel/processors/textProcessor.ts @@ -4,7 +4,7 @@ import { addSelectionMarker } from '../utils/addSelectionMarker'; import { areSameFormats } from '../utils/areSameFormats'; import { createText } from '../../modelApi/creators/createText'; import { getRegularSelectionOffsets } from '../utils/getRegularSelectionOffsets'; -import { hasSpacesOnly } from '../../domUtils/stringUtil'; +import { hasSpacesOnly } from '../../modelApi/common/hasSpacesOnly'; import { ContentModelBlockGroup, DomToModelContext, diff --git a/packages-content-model/roosterjs-content-model-dom/lib/index.ts b/packages-content-model/roosterjs-content-model-dom/lib/index.ts index 52308359737..76431921855 100644 --- a/packages-content-model/roosterjs-content-model-dom/lib/index.ts +++ b/packages-content-model/roosterjs-content-model-dom/lib/index.ts @@ -49,6 +49,4 @@ export { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit'; export { BorderKeys } from './formatHandlers/common/borderFormatHandler'; export { defaultImplicitFormatMap } from './formatHandlers/utils/defaultStyles'; -export { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil'; - export { createDomToModelContext } from './domToModel/context/createDomToModelContext'; diff --git a/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnly.ts b/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnly.ts new file mode 100644 index 00000000000..ed65bda1429 --- /dev/null +++ b/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnly.ts @@ -0,0 +1,12 @@ +// A regex to match text that only has space and CR +// We use real space char " " (\u0020) here but not "\s" since "\s" will also match " " (\u00A0) which is something we need to keep +const SPACE_TEXT_REGEX = /^[\r\n\t ]*$/; + +/** + * @internal + * Check if the given string only has space, including line breaks. + * @param txt The string to check + */ +export function hasSpacesOnly(txt: string): boolean { + return SPACE_TEXT_REGEX.test(txt); +} diff --git a/packages-content-model/roosterjs-content-model-dom/test/domUtils/stringUtilTest.ts b/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnlyTest.ts similarity index 92% rename from packages-content-model/roosterjs-content-model-dom/test/domUtils/stringUtilTest.ts rename to packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnlyTest.ts index 2e2d1b8ab08..55002caaaef 100644 --- a/packages-content-model/roosterjs-content-model-dom/test/domUtils/stringUtilTest.ts +++ b/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnlyTest.ts @@ -1,4 +1,4 @@ -import { hasSpacesOnly } from '../../lib/domUtils/stringUtil'; +import { hasSpacesOnly } from '../../../lib/modelApi/common/hasSpacesOnly'; describe('hasSpacesOnly', () => { it('Empty string', () => { diff --git a/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts b/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts index beb5a58c107..4a4b0031a33 100644 --- a/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts +++ b/packages-content-model/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts @@ -1,4 +1,4 @@ -import { hasSpacesOnly } from '../../domUtils/stringUtil'; +import { hasSpacesOnly } from './hasSpacesOnly'; import { ContentModelParagraph, ContentModelSegment, diff --git a/packages-content-model/roosterjs-content-model-dom/lib/domUtils/stringUtil.ts b/packages-content-model/roosterjs-content-model-editor/lib/domUtils/stringUtil.ts similarity index 71% rename from packages-content-model/roosterjs-content-model-dom/lib/domUtils/stringUtil.ts rename to packages-content-model/roosterjs-content-model-editor/lib/domUtils/stringUtil.ts index 925e48a9d5b..94ebff5742c 100644 --- a/packages-content-model/roosterjs-content-model-dom/lib/domUtils/stringUtil.ts +++ b/packages-content-model/roosterjs-content-model-editor/lib/domUtils/stringUtil.ts @@ -1,11 +1,8 @@ -// A regex to match text that only has space and CR -// We use real space char " " (\u0020) here but not "\s" since "\s" will also match " " (\u00A0) which is something we need to keep -const SPACE_TEXT_REGEX = /^[\r\n\t ]*$/; - const SPACES_REGEX = /[\u2000\u2009\u200a​\u200b​\u202f\u205f​\u3000\s\t\r\n]/gm; const PUNCTUATIONS = '.,?!:"()[]\\/'; /** + * @internal * Check if the given character is punctuation * @param char The character to check */ @@ -14,6 +11,7 @@ export function isPunctuation(char: string) { } /** + * @internal * Check if the give character is a space. A space can be normal ASCII pace (32) or non-break space (160) or other kinds of spaces * such as ZeroWidthSpace, ... * @param char The character to check @@ -25,14 +23,6 @@ export function isSpace(char: string) { /** * @internal - * Check if the given string only has space, including line breaks. - * @param txt The string to check - */ -export function hasSpacesOnly(txt: string): boolean { - return SPACE_TEXT_REGEX.test(txt); -} - -/** * Normalize spaces of the given string. After normalization, all leading (for forward) or trailing (for backward) spaces * will be replaces with non-break space (160) * @param txt The string to normalize diff --git a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/deleteSteps/deleteWordSelection.ts b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/deleteSteps/deleteWordSelection.ts index e76d4968429..df61ea0c88d 100644 --- a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/deleteSteps/deleteWordSelection.ts +++ b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/deleteSteps/deleteWordSelection.ts @@ -1,10 +1,6 @@ import { ContentModelParagraph } from 'roosterjs-content-model-types'; -import { - isPunctuation, - isSpace, - isWhiteSpacePreserved, - normalizeText, -} from 'roosterjs-content-model-dom'; +import { isPunctuation, isSpace, normalizeText } from '../../../domUtils/stringUtil'; +import { isWhiteSpacePreserved } from 'roosterjs-content-model-dom'; import { DeleteResult, DeleteSelectionContext, diff --git a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/utils/deleteSegment.ts b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/utils/deleteSegment.ts index 05a8790395b..a0b014f0d5b 100644 --- a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/utils/deleteSegment.ts +++ b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/edit/utils/deleteSegment.ts @@ -1,12 +1,9 @@ import { ContentModelParagraph, ContentModelSegment } from 'roosterjs-content-model-types'; import { deleteSingleChar } from './deleteSingleChar'; import { EntityOperation } from 'roosterjs-editor-types'; +import { isWhiteSpacePreserved, normalizeSingleSegment } from 'roosterjs-content-model-dom'; +import { normalizeText } from '../../../domUtils/stringUtil'; import { OnDeleteEntity } from './DeleteSelectionStep'; -import { - isWhiteSpacePreserved, - normalizeSingleSegment, - normalizeText, -} from 'roosterjs-content-model-dom'; /** * @internal diff --git a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/selection/adjustWordSelection.ts b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/selection/adjustWordSelection.ts index 1b39451e405..450c4387902 100644 --- a/packages-content-model/roosterjs-content-model-editor/lib/modelApi/selection/adjustWordSelection.ts +++ b/packages-content-model/roosterjs-content-model-editor/lib/modelApi/selection/adjustWordSelection.ts @@ -1,4 +1,5 @@ -import { createText, isPunctuation, isSpace } from 'roosterjs-content-model-dom'; +import { createText } from 'roosterjs-content-model-dom'; +import { isPunctuation, isSpace } from '../../domUtils/stringUtil'; import { iterateSelections } from '../../modelApi/selection/iterateSelections'; import { ContentModelDocument, diff --git a/packages-content-model/roosterjs-content-model-editor/test/editor/plugins/paste/processPastedContentFromWacTest.ts b/packages-content-model/roosterjs-content-model-editor/test/editor/plugins/paste/processPastedContentFromWacTest.ts index b652884fa4c..524b2a079b5 100644 --- a/packages-content-model/roosterjs-content-model-editor/test/editor/plugins/paste/processPastedContentFromWacTest.ts +++ b/packages-content-model/roosterjs-content-model-editor/test/editor/plugins/paste/processPastedContentFromWacTest.ts @@ -2,6 +2,7 @@ import { Browser, moveChildNodes } from 'roosterjs-editor-dom'; import { ContentModelDocument } from 'roosterjs-content-model-types'; import { contentModelToDom, domToContentModel } from 'roosterjs-content-model-dom'; import { createBeforePasteEventMock } from './processPastedContentFromWordDesktopTest'; +import { itChromeOnly } from 'roosterjs-editor-dom/test/DomTestHelper'; import { processPastedContentWacComponents } from '../../../../lib/editor/plugins/PastePlugin/WacComponents/processPastedContentWacComponents'; let div: HTMLElement; @@ -1592,7 +1593,7 @@ describe('wordOnlineHandler', () => { ); }); - it('Table with merged cells.', () => { + itChromeOnly('Table with merged cells.', () => { const result: ContentModelDocument = { blockGroupType: 'Document', blocks: [ @@ -2742,22 +2743,6 @@ describe('wordOnlineHandler', () => { ], }; - if (Browser.isFirefox) { - delete result.blocks[0].blocks[0].blocks[0].rows[0].cells[0].format.borderTop; - delete result.blocks[0].blocks[0].blocks[0].rows[0].cells[0].format.borderRight; - delete result.blocks[0].blocks[0].blocks[0].rows[0].cells[0].format.borderLeft; - - delete result.blocks[0].blocks[0].blocks[0].rows[0].cells[1].format.borderTop; - delete result.blocks[0].blocks[0].blocks[0].rows[0].cells[1].format.borderRight; - delete result.blocks[0].blocks[0].blocks[0].rows[0].cells[1].format.borderLeft; - - delete result.blocks[0].blocks[0].blocks[0].rows[1].cells[0].format.borderRight; - delete result.blocks[0].blocks[0].blocks[0].rows[1].cells[0].format.borderLeft; - - delete result.blocks[0].blocks[0].blocks[0].rows[1].cells[1].format.borderRight; - delete result.blocks[0].blocks[0].blocks[0].rows[1].cells[1].format.borderLeft; - } - runTest( '

ODSP 
xFun 

Title of Announcement 

Announcement  

Hello  

 

[Brief description of change] 
 

[What changed and how it benefits devs] 

 

[Any action needed by devs] 

 

[Link to Documentation ] 
  

[What comes next if something comes next] 
 

', undefined,