Skip to content

Commit

Permalink
Version bump up to 8.44.2 (#1666)
Browse files Browse the repository at this point in the history
* convert alpha to decimals

* fix auto format list

* add null and refactor

* Content Model Selection API step 4: Refactor existing table API (#1479)

* Selection API step 1

* Selection API 2

* New selection API

* Refactor table API

* add  test

* Support element with namespace (#1489)

* Content Model: Fix a bug when process margin (#1493)

* Fix margin issue

* Fix test

* Fix A tag without href (#1495)

* Fix Cut/Copy page scroll issue (#1496)

* Fix Cut/Copy page scroll issue

* Fix test

* fix image plugin z-index calc

* Content Model Format State Step 1: Refactor formatSegmentWithContentModel() (#1490)

* Selection API step 1

* Selection API 2

* New selection API

* Refactor table API

* add  test

* Format state step 1

* Improve

* update condition per comments

* Content Model Format State Step 2: Allow retrieving metadata directly (#1491)

* Selection API step 1

* Selection API 2

* New selection API

* Refactor table API

* add  test

* Format state step 1

* FormatState step 2

* Improve

* Content Model Format State Step 3: Add getFormatState API and ContentModelPlugin (#1492)

* Selection API step 1

* Selection API 2

* New selection API

* Refactor table API

* add  test

* Format state step 1

* FormatState step 2

* FormatState step 3: Add getFormatState API and ContentModel plugin

* Improve

* Improve

* Improve

* fix test

* improve, fix safari issue

* fix test

* wip

* WIP

* wip

* Content Model: Add API clearFormat (#1497)

* Selection API step 1

* Selection API 2

* New selection API

* Refactor table API

* add  test

* Format state step 1

* FormatState step 2

* FormatState step 3: Add getFormatState API and ContentModel plugin

* Improve

* Content Model: clearFormat

* fix build

* Improve

* Improve

* fix test

* improve, fix safari issue

* fix test

* remove wrapper when content change

* fix

* Content Model: Move format API: link, image, captalization, ... (#1506)

* Selection API step 1

* Selection API 2

* New selection API

* Refactor table API

* add  test

* Format state step 1

* FormatState step 2

* FormatState step 3: Add getFormatState API and ContentModel plugin

* Improve

* Content Model: clearFormat

* fix build

* Improve

* Improve

* fix test

* improve, fix safari issue

* fix test

* ContentModel: Support insertLink and removeLink

* changeCapitalization and setImageAltText

* fix for image selection

* refactor

* refactor

* Test image edit with ShadowDOM

* improve

* Fix #1509 (#1511)

* ContentModel: Improve Divider (#1513)

* ContentModel: Improve Divider

* Add BorderFormat to ContentModelBlockFormat

* Add test

* fix build

* Content Model: Support "no color" when set color (#1514)

* Content Model: Support "no color" when set color

* improve

* Content Model: Use Entity handle readonly element (#1515)

* image wrapper using shadow dom

* Content Model: Support get and apply segment format (#1518)

* Do not merge table when insert a table (#1519)

* wip

* Content Model: Fix #1239 (#1521)

* WIP AND fix for span height

* stop dragging

* comment

* prototype

* remove change

* prevent drag

* remove new max-width

* Load fluent ui from cdnjs (#1525)

* small changes

* Content Model: Improve selection (#1526)

* Apply format to word where cursor is located (#1367)

* attempt with traversers

* attempt using splitTextNode

* Return to original implementation

* Fix build

* implementation with content model

* Implement word selection with new content model

* removed selectWordFromCollapsedRange.ts

* optimization fixes and file changes

* standardize function and remove castings

* fix paragraph and pending state

* fix pending state, name change

* Added test cases, disabled end or start of word

* fixed dependency

* fix pending state

* more tests

* fixed tests

* End of word format fix (#1528)

* End of word format fix

Fix scenario where format was wrongly applied where the cursor was located at the end of a word

* add tests

* Variable based dark color (#1531)

* Variable based dark color

* fix test

* improve

* Improve

* Fix comment

* Fix #1532: Support isCode in FormatState (#1533)

* Fix #1532

* add comment

* fix build

* fix comment

* Bump ua-parser-js from 0.7.31 to 0.7.33 (#1535)

Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.31 to 0.7.33.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Changelog](https://github.com/faisalman/ua-parser-js/blob/master/changelog.md)
- [Commits](faisalman/ua-parser-js@0.7.31...0.7.33)

---
updated-dependencies:
- dependency-name: ua-parser-js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Fix #1529 #1530 and 187095 (#1534)

* WIP

* test and fixes

* unit tests

* fix list trigger

* Content Model: Adjust selection for link to select a word (#1538)

* Content Model: Adjust word selection for link

* add test

* fix build

* Fix table format (#1541)

* refactor

* move comment

* Content Model code simplify 1 (#1544)

* Content Model code simplify 2: Clean up EditorContext (#1545)

* Content Model code simplify 1

* Content Model: Clean up EditorContext

* improve

* Content Model code simplify 3: Remove get/setPendingFormat from editor interface (#1546)

* Content Model code simplify 1

* Content Model: Clean up EditorContext

* improve

* Content Model: Remove get/setPendingFormat

* Add support for paragraph line spacing for content model (#1543)

* Fetch line height from children

* Create new content model api

* Spacing btn

* Fix tests

* Remove key from roosterjs-react

* testing

* Allow segment to hold lineHeight format

* Remove lineHeight from segments whenever possible

* Fix imports

* Remove normalization

* Add todo for edge case

* Render segment line height

* Content Model Editor 1: Rename interface IExperimentalContentModelEditor (#1547)

* Content Model code simplify 1

* Content Model: Clean up EditorContext

* improve

* Content Model: Remove get/setPendingFormat

* Content Model: Rename IExperimentalContentModelEditor

* fix build

* WIP PROTOTYPE

* Content Model Editor 2: Publish ContentModelEditor class (#1548)

* Content Model code simplify 1

* Content Model: Clean up EditorContext

* improve

* Content Model: Remove get/setPendingFormat

* Content Model: Rename IExperimentalContentModelEditor

* Publish ContentModelEditor class

* fix build

* add test

* fix build

* fix build

* Reorganize Contente Model code (#1555)

* blur issue

* Fix some block format issues (#1554)

* Fix some block format issues

* Improve

* Content Model: Fix image size for outlook (#1556)

* Content Model: Fix image size for outlook

* Fix build

* fix build

* improve

* add filter to client rects

* Content Model: Support align table to center (#1557)

* simply code

* Content Model: Fix PRE tag (#1559)

* Content Model: Support insert image with src (#1563)

* Content Model: Get init segment format from root container (#1567)

* Content Model: Get init segment format from root container

* Improve

* add test

* Add missing setSpacing comment (#1564)

* do not call updateHandle

* check viewport

* Content Model: Improve pending format implementation (#1570)

* Disable list indentation on mac (#1552)

* Disable list indentation on mac

* Switch to default disabled

* Content Model: Improve hyperlink handling (#1569)

* Add support for adding/removing space before/after paragraphs in content model (#1565)

* Create api for block margins

* Create space before after buttons

* Update testing

* Fix by using decorator

* Replace positive value with none

* Treat no margin as space removed

* Fix testing

* Improve tag name selecting

* testing

* rename and improve logic

* Add support for formatState on onClick call

* Update button impl

* Revert "Update button impl"

This reverts commit edce3ad.

* Revert "Add support for formatState on onClick call"

This reverts commit 3d6b83d.

* use getFormatState()

* Update test name

* Fix a pending format issue in firefox (#1572)

* Content Model: Keep root level entity when format with Content Model (#1573)

* Content Model: Preserve segment format when insert table (#1574)

* delete table

* delete table

* fix enum

* refactor

* Fix #1585 (#1587)

* strict mode

* remove file

* add zeros

* enable strict mode

* Content Model: Improve clearFormat API (#1579)

* Content Model:  Improve clearFormat

* Improve

* Improve

* fix build

* improve

* WIP

* Content Model: Improve getFormatState (#1594)

* Fix color issue with Font tag (#1595)

* refactor

* Fix #1586 (#1597)

* Add `dir` and `textAlign` in `FormatState` (#1590)

Co-authored-by: Echo Li <[email protected]>

* uncoment

* Step 1: Add HTMLSpanElements around ReadOnly Inline entities to prevent cursor issues, (#1580)

* init

* add tests and build fixes

* Fix failing tests in EntityPlugin

* Fix comments

* Fix comments

* Move functionality to insertEntity

* typedoc

* refactor

* refactor

* add tests

* Content Model: Improve pending format behavior (#1598)

* Improve pending format behavior

* fix test

* trigger plugin event

* fix build

* remove code

* Add flight check in InsertEntity #1602

* Improve PRE again (#1601)

* Step 2: Prevent user from typing inside of readonly entities around the Readonly Inline Entity (#1581)

* init

* add tests and build fixes

* Fix failing tests in EntityPlugin

* Prevent user from typing inside of the

* Add unit tests

* Fix comments

* Fix comments

* remove typed text from Delimiter

* add unit tests

* Add selection condition and remove KeyUp

* delete image with delete key

* preventDefault

* Content Model: Support inline CODE style #1536 (#1603)

* #1536

* fix build

* fix build

* add test

* Step 3: Add Content Edit Features to prevent cursor to be stuck between ZeroWidthSpace & ReadOnly Entity (#1582)

* init

* add tests and build fixes

* Fix failing tests in EntityPlugin

* Prevent user from typing inside of the

* Add contentEditable Entities

* Add unit tests

* add Unit tests

* fix test and typeDef

* try fix tests

* Fix comments

* Fix comments

* remove typed text from Delimiter

* add unit tests

* Add contentEditable Entities

* add Unit tests

* fix test and typeDef

* try fix tests

* unit tests

* re run tests

* refactor

* Add selection condition and remove KeyUp

* More to another file path

* remove dup function

* Fix

* Update comments

* refactor

* change keydown to keypress

* add char

* Inline Entity Content Edit Features improvements. (#1606)

* inline Entity fixes

* Add delimiter to content model

* Use isFeatureEnabled instead

* Revert "Use isFeatureEnabled instead"

This reverts commit a09aa3a.

* Revert "Add delimiter to content model"

This reverts commit 59be341.

* add null check

* Improve dark color again (#1609)

* Improve dark color again

* fix insertContent when source is light and target is dark

* Delimiters in Content Model (#1608)

* inline Entity fixes

* Add delimiter to content model

* Use isFeatureEnabled instead

* Remove

* Add comment

* fix comments and add unit tests

* fix build

* Update comment

* Add more comments

* Show correct font when jump between table cells (#1612)

* simulate rotation

* Type assert (#1617)

* Content Model: Fix a bug in normalization (#1613)

* Fix table selection regression (#1618)

* rotate image

* uncomment blur

* Fix Arrow Keys + Delimiter bug (#1620)

* Fix

* add Unit test

* Add delimiters To InlineReadonly Entities on EditorReady and Paste (#1614)

* Add delimiters on EditorReady and Paste

* Handle ContentChanged Event

* Add a unit test

* Fix

* Fix build

* Reuse Content Model (#1610)

* Reuse Content Model

* fix test

* fix test

* add comment

* improve

* improve

* Improve

* fix test

* improve

* image rotation and tests

* comment

* Handle Enter in a Delimiter (#1622)

When pressing Enter on a delimiter, usually when the entity is at the end of the block or is the only element in the block, sometimes the delimiter element is moved away from the Entity or the element after Enter also contains the Delimiter class. This PR adds functionality to prevent this from happening.

Before
![DelimiterEnterBefore](https://user-images.githubusercontent.com/8291124/223553792-8b236323-9ca9-4393-8c5e-63c9043fc040.gif)

After
![DelimiterEnterAfter](https://user-images.githubusercontent.com/8291124/223554716-0dedd8e7-d035-43fc-9639-ebc7a570007c.gif)

* add check and do not sanitize Notes protocol (#1626)

* Content Model: Fix fidelity issue of list (#1624)

* Content Model: Fix fidelity issue of list

* fix demo

* Content Model: Fix format change while editing (#1625)

* Content Model: Fix format change while editing

* add test

* Improve Movement Between Delimiters (#1628)

The Content Edit was not working when cursor was between Entities, this PR fixes it,

To Repro add multiple Readonly inline entities together. Without this change we had to use Arrow Key twice, now we only need to press it once

* WIP

* Improve deletion of entities (#1630)

mprove the Content Edit Feature to delete delimiters.
If After the Content Edit was handled:

If the Entity still exists, add the delimiter removed.
If the entity was removed in the ContentChanged Event, remove the Delimiters.
If the event was not default prevented, select the delimiters and entity and let the browser handle the deletion.
Also, in EntityPlugin if the known entity removed is a inline entity, normalize delimiters

* flip and rotate

* Handle Selection Not Collapsed for delimiters (#1629)

Handle a scenario where the delimiter is removed when user selects the text + delimiter.

Repro

Add Entity
type Next and Before the Entity
Select the text after/before the entity
press a key the modified the content
Actual:
The delimiter is removed in some scenarios

Expected:
Do not remove the delimiter

To fix modify the selection and prevent the user typing inside of the delimiter when selection is not collapsed

* comment

* Check delimiter classes when adding Delimiters to a new Entity #1632

I was only checking if the element was a delimiter, but also need to check that the classes are correct,
Otherwise, if the next sibling of the entity that we are adding the delimiters is a delimiterBefore of another entity, we won't add the delimiter after.

* fix flips

* fix hyperlink regression

* remove max-width from insertSrc

* Add a parameter to enable/disable handling keyboard editing from Content Model (#1641)

* Add a parameter to enable/disable handling keyboard editing from Content Model

* fix test

* Fix Tab/ShiftTab indenting for lists on Mac (#1645)

* Do not had BR when pasting two LI blocks. (#1646)

* init

* init

* use closest

* squash

* Enter on Delimiter change and Add classes to sanitizing option (#1644)

* Fix Enter and Paste

* add classes supported to the BeforePaste Event

* Add unit test

* Strict Mode for Format Utils (#1647)

* Strict Mode for Table Folder in API Package (#1648)

* init

* Fix error after merge

* Content Model: Cache table step 1 (#1649)

* Content Model: Cache table step 1

* improvement

* refactor

* fix test

* fix fireforx test

* Content Model: Cache table step 2 (#1651)

* remove handler

* remove change

* add image format to get format state

* add image format to get format state

* add image format to get format state

* add content model format state

* only one selected image

* Support default format in Content Model (#1655)

* Fix Movement Between Entity Delimiter issue (#1640)

* Init

* Use traverser of current block instead of all.

* fix multiple inlines in entity issue

* change && to ||

---------

Co-authored-by: Jiuqing Song <[email protected]>

* fix merge

* update version

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Júlia Roldi <[email protected]>
Co-authored-by: Jiuqing Song <[email protected]>
Co-authored-by: Julia Roldi <[email protected]>
Co-authored-by: Shai Petel <[email protected]>
Co-authored-by: Shai Petel <[email protected]>
Co-authored-by: Andres-CT98 <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ian Elizondo <[email protected]>
Co-authored-by: Echo-az <[email protected]>
Co-authored-by: Echo Li <[email protected]>
Co-authored-by: Bryan Valverde U <[email protected]>
Co-authored-by: charlxu <[email protected]>
Co-authored-by: Bi Wu <[email protected]>
  • Loading branch information
14 people authored Mar 24, 2023
1 parent 1f768f3 commit 5b62515
Show file tree
Hide file tree
Showing 126 changed files with 4,643 additions and 853 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "roosterjs",
"version": "8.44.1",
"version": "8.44.2",
"description": "Framework-independent javascript editor",
"repository": {
"type": "git",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,60 @@ const ImageResizeMenuItem: ContextMenuItem<ImageEditMenuItemStringKey, ImageEdit
},
};

const ImageRotateMenuItem: ContextMenuItem<ImageEditMenuItemStringKey, ImageEdit> = {
key: 'menuNameImageRotate',
unlocalizedText: 'Rotate image',
subItems: {
menuNameImageRotateLeft: 'Left',
menuNameImageRotateRight: 'Right',
},
shouldShow: (_, node, imageEdit) => {
return (
!!imageEdit?.isOperationAllowed(ImageEditOperation.Rotate) &&
canRegenerateImage(node as HTMLImageElement)
);
},
onClick: (key, editor, node, strings, uiUtilities, imageEdit) => {
editor.addUndoSnapshot(() => {
switch (key) {
case 'menuNameImageRotateLeft':
imageEdit?.rotateImage(node as HTMLImageElement, -Math.PI / 2);
break;
case 'menuNameImageRotateRight':
imageEdit?.rotateImage(node as HTMLImageElement, Math.PI / 2);
break;
}
});
},
};

const ImageFlipMenuItem: ContextMenuItem<ImageEditMenuItemStringKey, ImageEdit> = {
key: 'menuNameImageFlip',
unlocalizedText: 'Flip image',
subItems: {
menuNameImageRotateFlipHorizontally: 'Flip Horizontally',
menuNameImageRotateFlipVertically: 'Flip Vertically',
},
shouldShow: (_, node, imageEdit) => {
return (
!!imageEdit?.isOperationAllowed(ImageEditOperation.Rotate) &&
canRegenerateImage(node as HTMLImageElement)
);
},
onClick: (key, editor, node, strings, uiUtilities, imageEdit) => {
editor.addUndoSnapshot(() => {
switch (key) {
case 'menuNameImageRotateFlipHorizontally':
imageEdit?.flipImage(node as HTMLImageElement, 'horizontal');
break;
case 'menuNameImageRotateFlipVertically':
imageEdit?.flipImage(node as HTMLImageElement, 'vertical');
break;
}
});
},
};

const ImageCropMenuItem: ContextMenuItem<ImageEditMenuItemStringKey, ImageEdit> = {
key: 'menuNameImageCrop',
unlocalizedText: 'Crop image',
Expand Down Expand Up @@ -123,7 +177,14 @@ export default function createImageEditMenuProvider(
): EditorPlugin {
return createContextMenuProvider<ImageEditMenuItemStringKey, ImageEdit>(
'imageEdit',
[ImageAltTextMenuItem, ImageResizeMenuItem, ImageCropMenuItem, ImageRemoveMenuItem],
[
ImageAltTextMenuItem,
ImageResizeMenuItem,
ImageCropMenuItem,
ImageRemoveMenuItem,
ImageRotateMenuItem,
ImageFlipMenuItem,
],
strings,
shouldShowImageEditItems,
imageEditPlugin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,17 @@ export type ImageEditMenuItemStringKey =
| 'menuNameImageAltText'
| 'menuNameImageResize'
| 'menuNameImageCrop'
| 'menuNameImageRotate'
| 'menuNameImageRemove'
| 'menuNameImageFlip'
| 'menuNameImageSizeBestFit'
| 'menuNameImageSizeSmall'
| 'menuNameImageSizeMedium'
| 'menuNameImageSizeOriginal'
| 'menuNameImageRotateLeft'
| 'menuNameImageRotateRight'
| 'menuNameImageRotateFlipHorizontally'
| 'menuNameImageRotateFlipVertically'
| OkButtonStringKey
| CancelButtonStringKey;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export default function domToContentModel(
editorContext: EditorContext,
option: DomToModelOption
): ContentModelDocument {
const model = createContentModelDocument();
const model = createContentModelDocument(editorContext.defaultFormat);
const context = createDomToModelContext(editorContext, option);

// For root element, use computed style as initial value of segment formats
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ export const listItemProcessor: ElementProcessor<HTMLLIElement> = (group, elemen
);

const listItem = createListItem(listFormat.levels, context.segmentFormat);
parseFormat(
element,
context.formatParsers.listItemElement,
listItem.format,
context
);

listFormat.listParent!.blocks.push(listItem);

parseFormat(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ export const tableProcessor: ElementProcessor<HTMLTableElement> = (
const { table: selectedTable, firstCell, lastCell } = context.tableSelection || {};
const hasTableSelection = selectedTable == tableElement && !!firstCell && !!lastCell;

table.cachedElement = tableElement;

parseFormat(tableElement, context.formatParsers.table, table.format, context);
parseFormat(
tableElement,
Expand Down Expand Up @@ -87,6 +89,8 @@ export const tableProcessor: ElementProcessor<HTMLTableElement> = (
table.cells[row + rowSpan - 1][targetCol] = cell;

if (hasTd) {
cell.cachedElement = td;

stackFormat(context, { segment: 'shallowClone' }, () => {
parseFormat(
td,
Expand Down
19 changes: 19 additions & 0 deletions packages/roosterjs-content-model/lib/editor/ContentModelEditor.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import contentModelToDom from '../modelToDom/contentModelToDom';
import domToContentModel from '../domToModel/domToContentModel';
import { ContentModelDocument } from '../publicTypes/group/ContentModelDocument';
import { ContentModelSegmentFormat } from '../publicTypes/format/ContentModelSegmentFormat';
import { Editor } from 'roosterjs-editor-core';
import { EditorContext } from '../publicTypes/context/EditorContext';
import { EditorOptions, ExperimentalFeatures } from 'roosterjs-editor-types';
Expand All @@ -17,6 +18,7 @@ import {
export default class ContentModelEditor extends Editor implements IContentModelEditor {
private cachedModel: ContentModelDocument | null;
private reuseModel: boolean = false;
private defaultFormat: ContentModelSegmentFormat = {};

/**
* Creates an instance of Editor
Expand All @@ -27,6 +29,7 @@ export default class ContentModelEditor extends Editor implements IContentModelE
super(contentDiv, options);
this.cachedModel = null;
this.reuseModel = this.isFeatureEnabled(ExperimentalFeatures.ReusableContentModel);
this.defaultFormat = this.getDefaultSegmentFormat();
}

/**
Expand Down Expand Up @@ -90,11 +93,27 @@ export default class ContentModelEditor extends Editor implements IContentModelE

return {
isDarkMode: this.isDarkMode(),
defaultFormat: this.defaultFormat,
getDarkColor: core.lifecycle.getDarkColor,
darkColorHandler: this.getDarkColorHandler(),
addDelimiterForEntity: this.isFeatureEnabled(
ExperimentalFeatures.InlineEntityReadOnlyDelimiters
),
};
}

private getDefaultSegmentFormat(): ContentModelSegmentFormat {
const format = this.getDefaultFormat();

return {
fontWeight: format.bold ? 'bold' : undefined,
italic: format.italic || undefined,
underline: format.underline || undefined,
fontFamily: format.fontFamily || undefined,
fontSize: format.fontSize || undefined,
textColor: format.textColors?.lightModeColor || format.textColor || undefined,
backgroundColor:
format.backgroundColors?.lightModeColor || format.backgroundColor || undefined,
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,15 @@ export const directionFormatHandler: FormatHandler<DirectionFormat> = {
parse: (format, element, _, defaultStyle) => {
const dir = element.style.direction || element.dir || defaultStyle.direction;
const alignFromAttr = element.getAttribute('align');
const align = element.style.textAlign || alignFromAttr || defaultStyle.textAlign;
const textAlign = element.style.textAlign || alignFromAttr || defaultStyle.textAlign;
const alignSelf = element.style.alignSelf;
const isLI = element.tagName === 'li';
const isFlex =
element.parentElement &&
element.parentElement.style.display === 'flex' &&
element.style.flexDirection === 'column';
const shouldApplyAlignSelf = isLI && isFlex;
const align = shouldApplyAlignSelf ? alignSelf : textAlign;

if (dir) {
format.direction = dir == 'rtl' ? 'rtl' : 'ltr';
Expand Down Expand Up @@ -62,9 +70,16 @@ export const directionFormatHandler: FormatHandler<DirectionFormat> = {

if (format.isTextAlignFromAttr) {
element.setAttribute('align', value);
} else if (element.tagName === 'LI') {
element.style.alignSelf = format.textAlign;
} else {
element.style.textAlign = value;
}
}

if (element.tagName == 'OL' || element.tagName == 'UL') {
element.style.flexDirection = 'column';
element.style.display = 'flex';
}
},
};
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ const defaultFormatKeysPerCategory: {
} = {
block: blockFormatHandlers,
listItem: ['listItemThread', 'listItemMetadata'],
listItemElement: ['direction'],
listLevel: ['listType', 'listLevelThread', 'listLevelMetadata', 'direction', 'margin'],
segment: [
'superOrSubScript',
Expand All @@ -112,24 +113,16 @@ const defaultFormatKeysPerCategory: {
segmentOnTableCell: ['fontFamily', 'fontSize', 'underline', 'italic', 'bold'],
tableCell: [
'border',
'borderBox',
'backgroundColor',
'padding',
'direction',
'verticalAlign',
'wordBreak',
'textColor',
],
table: [
'id',
'border',
'borderBox',
'tableSpacing',
'margin',
'backgroundColor',
'display',
'direction',
],
table: ['id', 'border', 'margin', 'backgroundColor', 'display', 'direction'],
tableBorder: ['borderBox', 'tableSpacing'],
tableCellBorder: ['borderBox'],
image: ['id', 'size', 'margin', 'padding', 'borderBox', 'border', 'boxShadow'],
link: ['link', 'textColor', 'underline'],
code: ['fontFamily'],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { alignTable } from '../table/alignTable';
import { ContentModelDocument } from '../../publicTypes/group/ContentModelDocument';
import { ContentModelListItem } from '../../publicTypes/group/ContentModelListItem';
import { getOperationalBlocks } from '../selection/collectSelections';
import { TableOperation } from 'roosterjs-editor-types';

const ResultMap: Record<
'left' | 'center' | 'right',
Record<'ltr' | 'rtl', 'start' | 'center' | 'end'>
> = {
left: {
ltr: 'start',
rtl: 'end',
},
center: {
ltr: 'center',
rtl: 'center',
},
right: {
ltr: 'end',
rtl: 'start',
},
};

const TableAlignMap: Record<
'left' | 'center' | 'right',
Record<
'ltr' | 'rtl',
TableOperation.AlignLeft | TableOperation.AlignCenter | TableOperation.AlignRight
>
> = {
left: {
ltr: TableOperation.AlignLeft,
rtl: TableOperation.AlignRight,
},
center: {
ltr: TableOperation.AlignCenter,
rtl: TableOperation.AlignCenter,
},
right: {
ltr: TableOperation.AlignRight,
rtl: TableOperation.AlignLeft,
},
};

/**
* @internal
*/
export function setModelAlignment(
model: ContentModelDocument,
alignment: 'left' | 'center' | 'right'
) {
const paragraphOrListItemOrTable = getOperationalBlocks<ContentModelListItem>(
model,
['ListItem'],
['TableCell']
);

paragraphOrListItemOrTable.forEach(({ block }) => {
const newAligment = ResultMap[alignment][block.format.direction == 'rtl' ? 'rtl' : 'ltr'];
if (block.blockType === 'Table') {
alignTable(
block,
TableAlignMap[alignment][block.format.direction == 'rtl' ? 'rtl' : 'ltr']
);
} else if (block) {
const { format } = block;
format.textAlign = newAligment;
}
});

return paragraphOrListItemOrTable.length > 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ export function clearModelFormat(
model: ContentModelDocument,
blocksToClear: [ContentModelBlockGroup[], ContentModelBlock][],
segmentsToClear: ContentModelSegment[],
tablesToClear: [ContentModelTable, boolean][],
defaultSegmentFormat?: ContentModelSegmentFormat
tablesToClear: [ContentModelTable, boolean][]
) {
iterateSelections(
[model],
Expand All @@ -44,7 +43,7 @@ export function clearModelFormat(
// So no need to clear format of list number.
// Otherwise, we will clear all format of selected text. And since they are under LI tag, we
// also need to clear the format of LI (format holder) so that the format is really cleared
includeListFormatHolder: defaultSegmentFormat ? 'never' : 'anySegment',
includeListFormatHolder: model.format ? 'never' : 'anySegment',
}
);

Expand All @@ -70,7 +69,7 @@ export function clearModelFormat(
}

// 3. Finally clear format for segments
clearSegmentsFormat(segmentsToClear, defaultSegmentFormat);
clearSegmentsFormat(segmentsToClear, model.format);

// 4. Clear format for table if any
createTablesFormat(tablesToClear);
Expand Down
Loading

0 comments on commit 5b62515

Please sign in to comment.