roosterjs-content-model-core 9.24.0 → 9.26.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.
Files changed (41) hide show
  1. package/README.md +3 -0
  2. package/lib/coreApi/createContentModel/createContentModel.js +3 -1
  3. package/lib/coreApi/createContentModel/createContentModel.js.map +1 -1
  4. package/lib/coreApi/setDOMSelection/setDOMSelection.js +3 -4
  5. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  6. package/lib/coreApi/setDOMSelection/toggleCaret.d.ts +7 -0
  7. package/lib/coreApi/setDOMSelection/toggleCaret.js +15 -0
  8. package/lib/coreApi/setDOMSelection/toggleCaret.js.map +1 -0
  9. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  10. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  11. package/lib/corePlugin/entity/entityDelimiterUtils.js +12 -3
  12. package/lib/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
  13. package/lib/editor/core/DOMHelperImpl.js +23 -0
  14. package/lib/editor/core/DOMHelperImpl.js.map +1 -1
  15. package/lib-amd/coreApi/createContentModel/createContentModel.js +3 -1
  16. package/lib-amd/coreApi/createContentModel/createContentModel.js.map +1 -1
  17. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +3 -5
  18. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  19. package/lib-amd/coreApi/setDOMSelection/toggleCaret.d.ts +7 -0
  20. package/lib-amd/coreApi/setDOMSelection/toggleCaret.js +17 -0
  21. package/lib-amd/coreApi/setDOMSelection/toggleCaret.js.map +1 -0
  22. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js +3 -1
  23. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  24. package/lib-amd/corePlugin/entity/entityDelimiterUtils.js +12 -3
  25. package/lib-amd/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
  26. package/lib-amd/editor/core/DOMHelperImpl.js +23 -0
  27. package/lib-amd/editor/core/DOMHelperImpl.js.map +1 -1
  28. package/lib-mjs/coreApi/createContentModel/createContentModel.js +3 -1
  29. package/lib-mjs/coreApi/createContentModel/createContentModel.js.map +1 -1
  30. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +3 -4
  31. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  32. package/lib-mjs/coreApi/setDOMSelection/toggleCaret.d.ts +7 -0
  33. package/lib-mjs/coreApi/setDOMSelection/toggleCaret.js +11 -0
  34. package/lib-mjs/coreApi/setDOMSelection/toggleCaret.js.map +1 -0
  35. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  36. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  37. package/lib-mjs/corePlugin/entity/entityDelimiterUtils.js +12 -3
  38. package/lib-mjs/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
  39. package/lib-mjs/editor/core/DOMHelperImpl.js +23 -0
  40. package/lib-mjs/editor/core/DOMHelperImpl.js.map +1 -1
  41. package/package.json +3 -3
package/README.md CHANGED
@@ -51,6 +51,9 @@ There are also some extension packages to provide additional functionalities.
51
51
  1. [roosterjs-color-utils](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_color_utils.html):
52
52
  Provide color transformation utility to make editor work under dark mode.
53
53
 
54
+ 2. [roosterjs-content-model-markdown](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_content_model_types.html):
55
+ Defines public APIs to enable conversions between Markdown and ContentModel
56
+
54
57
  To be compatible with old (8.\*) versions, you can use `EditorAdapter` class from the following package which can act as a 8.\* Editor:
55
58
 
56
59
  1. [roosterjs-editor-adapter](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_adapter.html):
@@ -14,7 +14,8 @@ var createContentModel = function (core, option, selectionOverride) {
14
14
  var _a;
15
15
  // Flush all mutations if any, so that we can get an up-to-date Content Model
16
16
  (_a = core.cache.textMutationObserver) === null || _a === void 0 ? void 0 : _a.flushMutations();
17
- if (!selectionOverride && (!option || option.tryGetFromCache)) {
17
+ var tryGetFromCache = !option || (option.tryGetFromCache && typeof option.recalculateTableSize === 'undefined');
18
+ if (!selectionOverride && tryGetFromCache) {
18
19
  var cachedModel = core.cache.cachedModel;
19
20
  if (cachedModel) {
20
21
  // When in shadow edit, use a cloned model so we won't pollute the cached one
@@ -28,6 +29,7 @@ var createContentModel = function (core, option, selectionOverride) {
28
29
  : selectionOverride || core.api.getDOMSelection(core) || undefined;
29
30
  var saveIndex = !option && !selectionOverride;
30
31
  var editorContext = core.api.createEditorContext(core, saveIndex);
32
+ editorContext.recalculateTableSize = option === null || option === void 0 ? void 0 : option.recalculateTableSize;
31
33
  var settings = core.environment.domToModelSettings;
32
34
  var domToModelContext = option
33
35
  ? (0, roosterjs_content_model_dom_1.createDomToModelContext)(editorContext, settings.builtIn, settings.customized, option)
@@ -1 +1 @@
1
- {"version":3,"file":"createContentModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/createContentModel/createContentModel.ts"],"names":[],"mappings":";;;AAAA,kEAAiE;AACjE,2EAKqC;AAGrC;;;;;;GAMG;AACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB;;IAClF,6EAA6E;IAC7E,MAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,0CAAE,cAAc,EAAE,CAAC;IAElD,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE;QAC3D,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAE3C,IAAI,WAAW,EAAE;YACb,6EAA6E;YAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB;gBACpC,CAAC,CAAC,IAAA,wCAAU,EAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;gBACzD,CAAC,CAAC,WAAW,CAAC;SACrB;KACJ;IAED,IAAM,SAAS,GACX,iBAAiB,IAAI,MAAM;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;IAC3E,IAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC;IAChD,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpE,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;IACrD,IAAM,iBAAiB,GAAG,MAAM;QAC5B,CAAC,CAAC,IAAA,qDAAuB,EAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QACvF,CAAC,CAAC,IAAA,+DAAiC,EAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE5E,IAAI,SAAS,EAAE;QACX,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;KAC3C;IAED,IAAM,KAAK,GAAG,IAAA,+CAAiB,EAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAErE,IAAI,SAAS,EAAE;QACX,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KAC7C;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AArCW,QAAA,kBAAkB,sBAqC7B","sourcesContent":["import { updateCache } from '../../corePlugin/cache/updateCache';\nimport {\n cloneModel,\n createDomToModelContext,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type { CreateContentModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create Content Model from DOM tree in this editor\n * @param core The editor core object\n * @param option The option to customize the behavior of DOM to Content Model conversion\n * @param selectionOverride When passed, use this selection range instead of current selection in editor\n */\nexport const createContentModel: CreateContentModel = (core, option, selectionOverride) => {\n // Flush all mutations if any, so that we can get an up-to-date Content Model\n core.cache.textMutationObserver?.flushMutations();\n\n if (!selectionOverride && (!option || option.tryGetFromCache)) {\n const cachedModel = core.cache.cachedModel;\n\n if (cachedModel) {\n // When in shadow edit, use a cloned model so we won't pollute the cached one\n return core.lifecycle.shadowEditFragment\n ? cloneModel(cachedModel, { includeCachedElement: true })\n : cachedModel;\n }\n }\n\n const selection =\n selectionOverride == 'none'\n ? undefined\n : selectionOverride || core.api.getDOMSelection(core) || undefined;\n const saveIndex = !option && !selectionOverride;\n const editorContext = core.api.createEditorContext(core, saveIndex);\n const settings = core.environment.domToModelSettings;\n const domToModelContext = option\n ? createDomToModelContext(editorContext, settings.builtIn, settings.customized, option)\n : createDomToModelContextWithConfig(settings.calculated, editorContext);\n\n if (selection) {\n domToModelContext.selection = selection;\n }\n\n const model = domToContentModel(core.logicalRoot, domToModelContext);\n\n if (saveIndex) {\n updateCache(core.cache, model, selection);\n }\n\n return model;\n};\n"]}
1
+ {"version":3,"file":"createContentModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/createContentModel/createContentModel.ts"],"names":[],"mappings":";;;AAAA,kEAAiE;AACjE,2EAKqC;AAGrC;;;;;;GAMG;AACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB;;IAClF,6EAA6E;IAC7E,MAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,0CAAE,cAAc,EAAE,CAAC;IAClD,IAAM,eAAe,GACjB,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,OAAO,MAAM,CAAC,oBAAoB,KAAK,WAAW,CAAC,CAAC;IAE9F,IAAI,CAAC,iBAAiB,IAAI,eAAe,EAAE;QACvC,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAE3C,IAAI,WAAW,EAAE;YACb,6EAA6E;YAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB;gBACpC,CAAC,CAAC,IAAA,wCAAU,EAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;gBACzD,CAAC,CAAC,WAAW,CAAC;SACrB;KACJ;IAED,IAAM,SAAS,GACX,iBAAiB,IAAI,MAAM;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;IAC3E,IAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC;IAChD,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEpE,aAAa,CAAC,oBAAoB,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,oBAAoB,CAAC;IAElE,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;IACrD,IAAM,iBAAiB,GAAG,MAAM;QAC5B,CAAC,CAAC,IAAA,qDAAuB,EAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QACvF,CAAC,CAAC,IAAA,+DAAiC,EAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE5E,IAAI,SAAS,EAAE;QACX,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;KAC3C;IAED,IAAM,KAAK,GAAG,IAAA,+CAAiB,EAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAErE,IAAI,SAAS,EAAE;QACX,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KAC7C;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AA1CW,QAAA,kBAAkB,sBA0C7B","sourcesContent":["import { updateCache } from '../../corePlugin/cache/updateCache';\nimport {\n cloneModel,\n createDomToModelContext,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type { CreateContentModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create Content Model from DOM tree in this editor\n * @param core The editor core object\n * @param option The option to customize the behavior of DOM to Content Model conversion\n * @param selectionOverride When passed, use this selection range instead of current selection in editor\n */\nexport const createContentModel: CreateContentModel = (core, option, selectionOverride) => {\n // Flush all mutations if any, so that we can get an up-to-date Content Model\n core.cache.textMutationObserver?.flushMutations();\n const tryGetFromCache =\n !option || (option.tryGetFromCache && typeof option.recalculateTableSize === 'undefined');\n\n if (!selectionOverride && tryGetFromCache) {\n const cachedModel = core.cache.cachedModel;\n\n if (cachedModel) {\n // When in shadow edit, use a cloned model so we won't pollute the cached one\n return core.lifecycle.shadowEditFragment\n ? cloneModel(cachedModel, { includeCachedElement: true })\n : cachedModel;\n }\n }\n\n const selection =\n selectionOverride == 'none'\n ? undefined\n : selectionOverride || core.api.getDOMSelection(core) || undefined;\n const saveIndex = !option && !selectionOverride;\n const editorContext = core.api.createEditorContext(core, saveIndex);\n\n editorContext.recalculateTableSize = option?.recalculateTableSize;\n\n const settings = core.environment.domToModelSettings;\n const domToModelContext = option\n ? createDomToModelContext(editorContext, settings.builtIn, settings.customized, option)\n : createDomToModelContextWithConfig(settings.calculated, editorContext);\n\n if (selection) {\n domToModelContext.selection = selection;\n }\n\n const model = domToContentModel(core.logicalRoot, domToModelContext);\n\n if (saveIndex) {\n updateCache(core.cache, model, selection);\n }\n\n return model;\n};\n"]}
@@ -6,13 +6,12 @@ var areSameSelections_1 = require("../../corePlugin/cache/areSameSelections");
6
6
  var ensureUniqueId_1 = require("../setEditorStyle/ensureUniqueId");
7
7
  var findLastedCoInMergedCell_1 = require("./findLastedCoInMergedCell");
8
8
  var findTableCellElement_1 = require("./findTableCellElement");
9
+ var toggleCaret_1 = require("./toggleCaret");
9
10
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
10
11
  var DOM_SELECTION_CSS_KEY = '_DOMSelection';
11
- var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
12
12
  var HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';
13
13
  var IMAGE_ID = 'image';
14
14
  var TABLE_ID = 'table';
15
- var CARET_CSS_RULE = 'caret-color: transparent';
16
15
  var TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';
17
16
  var SELECTION_SELECTOR = '*::selection';
18
17
  var DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
@@ -32,8 +31,8 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
32
31
  var isDarkMode = core.lifecycle.isDarkMode;
33
32
  core.selection.skipReselectOnFocus = true;
34
33
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);
35
- core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);
36
34
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);
35
+ (0, toggleCaret_1.toggleCaret)(core, false /* hide */);
37
36
  try {
38
37
  switch (selection === null || selection === void 0 ? void 0 : selection.type) {
39
38
  case 'image':
@@ -87,8 +86,8 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
87
86
  ? core.selection.tableCellSelectionBackgroundColorDark
88
87
  : core.selection.tableCellSelectionBackgroundColor;
89
88
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
90
- core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);
91
89
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
90
+ (0, toggleCaret_1.toggleCaret)(core, true /* hide */);
92
91
  var nodeToSelect = ((_c = firstCell.cell) === null || _c === void 0 ? void 0 : _c.firstElementChild) || firstCell.cell;
93
92
  if (nodeToSelect) {
94
93
  setRangeSelection(doc, nodeToSelect || undefined, true /* collapse */);
@@ -1 +1 @@
1
- {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport {\n getSafeIdSelector,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ParsedTable,\n SelectionChangedEvent,\n SetDOMSelection,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst CARET_CSS_RULE = 'caret-color: transparent';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n const isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(ensureUniqueId(image, IMAGE_ID))]\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n setRangeSelection(doc, image, false /* collapse */);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n };\n\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelector = getSafeIdSelector(tableId);\n\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [tableSelector, `${tableSelector} *`]\n : handleTableSelected(\n parsedTable,\n tableSelector,\n table,\n firstCell,\n lastCell\n );\n\n core.selection.selection = selection;\n\n const tableSelectionColor = isDarkMode\n ? core.selection.tableCellSelectionBackgroundColorDark\n : core.selection.tableCellSelectionBackgroundColor;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `background-color:${tableSelectionColor}!important;`,\n tableSelectors\n );\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n doc,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction handleTableSelected(\n parsedTable: ParsedTable,\n tableSelector: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `${tableSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined, collapse: boolean) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n let isReverted: boolean | undefined = undefined;\n\n range.selectNode(element);\n if (collapse) {\n range.collapse();\n } else {\n const selection = doc.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 && selection.getRangeAt(0);\n if (selection && range) {\n isReverted =\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset;\n }\n }\n\n addRangeToSelection(doc, range, isReverted);\n }\n}\n"]}
1
+ {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { toggleCaret } from './toggleCaret';\nimport {\n getSafeIdSelector,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ParsedTable,\n SelectionChangedEvent,\n SetDOMSelection,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n const isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n toggleCaret(core, false /* hide */);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(ensureUniqueId(image, IMAGE_ID))]\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n setRangeSelection(doc, image, false /* collapse */);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n };\n\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelector = getSafeIdSelector(tableId);\n\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [tableSelector, `${tableSelector} *`]\n : handleTableSelected(\n parsedTable,\n tableSelector,\n table,\n firstCell,\n lastCell\n );\n\n core.selection.selection = selection;\n\n const tableSelectionColor = isDarkMode\n ? core.selection.tableCellSelectionBackgroundColorDark\n : core.selection.tableCellSelectionBackgroundColor;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `background-color:${tableSelectionColor}!important;`,\n tableSelectors\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n toggleCaret(core, true /* hide */);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n doc,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction handleTableSelected(\n parsedTable: ParsedTable,\n tableSelector: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `${tableSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined, collapse: boolean) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n let isReverted: boolean | undefined = undefined;\n\n range.selectNode(element);\n if (collapse) {\n range.collapse();\n } else {\n const selection = doc.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 && selection.getRangeAt(0);\n if (selection && range) {\n isReverted =\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset;\n }\n }\n\n addRangeToSelection(doc, range, isReverted);\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { EditorCore } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal Show/Hide caret in editor
4
+ * @param core The editor core
5
+ * @param isHiding True to hide caret, false to show caret
6
+ */
7
+ export declare function toggleCaret(core: EditorCore, isHiding: boolean): void;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toggleCaret = void 0;
4
+ var CARET_CSS_RULE = 'caret-color: transparent';
5
+ var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
6
+ /**
7
+ * @internal Show/Hide caret in editor
8
+ * @param core The editor core
9
+ * @param isHiding True to hide caret, false to show caret
10
+ */
11
+ function toggleCaret(core, isHiding) {
12
+ core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, isHiding ? CARET_CSS_RULE : null);
13
+ }
14
+ exports.toggleCaret = toggleCaret;
15
+ //# sourceMappingURL=toggleCaret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggleCaret.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/toggleCaret.ts"],"names":[],"mappings":";;;AAEA,IAAM,cAAc,GAAG,0BAA0B,CAAC;AAClD,IAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAEtD;;;;GAIG;AACH,SAAgB,WAAW,CAAC,IAAgB,EAAE,QAAiB;IAC3D,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzF,CAAC;AAFD,kCAEC","sourcesContent":["import type { EditorCore } from 'roosterjs-content-model-types';\n\nconst CARET_CSS_RULE = 'caret-color: transparent';\nconst HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';\n\n/**\n * @internal Show/Hide caret in editor\n * @param core The editor core\n * @param isHiding True to hide caret, false to show caret\n */\nexport function toggleCaret(core: EditorCore, isHiding: boolean) {\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, isHiding ? CARET_CSS_RULE : null);\n}\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.switchShadowEdit = void 0;
4
4
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
5
+ var toggleCaret_1 = require("../setDOMSelection/toggleCaret");
5
6
  /**
6
7
  * @internal
7
8
  * Switch the Shadow Edit mode of editor On/Off
@@ -24,10 +25,12 @@ var switchShadowEdit = function (editorCore, isOn) {
24
25
  if (!core.cache.cachedModel && model) {
25
26
  core.cache.cachedModel = model;
26
27
  }
28
+ (0, toggleCaret_1.toggleCaret)(core, true /* hide */);
27
29
  core.lifecycle.shadowEditFragment = fragment;
28
30
  }
29
31
  else {
30
32
  core.lifecycle.shadowEditFragment = null;
33
+ (0, toggleCaret_1.toggleCaret)(core, false /* hide */);
31
34
  core.api.triggerEvent(core, {
32
35
  eventType: 'leavingShadowEdit',
33
36
  }, false /*broadcast*/);
@@ -1 +1 @@
1
- {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/switchShadowEdit/switchShadowEdit.ts"],"names":[],"mappings":";;;AAAA,2EAAgF;AAGhF;;;;;GAKG;AACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;IAC/D,IAAM,IAAI,GAAG,UAAU,CAAC;IAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAC7C,IAAI,IAAI,EAAE;YACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjF,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;YACzE,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,oIAAoI;YACpI,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;gBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;aAClC;YAED,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;SAChD;aAAM;YACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAEzC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBACxB,iDAAiD;gBACjD,IAAA,+CAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;gBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;iBAC/H,CAAC,CAAC;aACN;SACJ;KACJ;AACL,CAAC,CAAC;AA/CW,QAAA,gBAAgB,oBA+C3B","sourcesContent":["import { iterateSelections, moveChildNodes } from 'roosterjs-content-model-dom';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The EditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n const fragment = core.logicalRoot.ownerDocument.createDocumentFragment();\n const clonedRoot = core.logicalRoot.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\n};\n"]}
1
+ {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/switchShadowEdit/switchShadowEdit.ts"],"names":[],"mappings":";;;AAAA,2EAAgF;AAChF,8DAA6D;AAG7D;;;;;GAKG;AACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;IAC/D,IAAM,IAAI,GAAG,UAAU,CAAC;IAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QAC7C,IAAI,IAAI,EAAE;YACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjF,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;YACzE,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,oIAAoI;YACpI,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;gBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;aAClC;YAED,IAAA,yBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAEnC,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;SAChD;aAAM;YACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAEzC,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAEpC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;gBACI,SAAS,EAAE,mBAAmB;aACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;YAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBACxB,iDAAiD;gBACjD,IAAA,+CAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;gBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;iBAC/H,CAAC,CAAC;aACN;SACJ;KACJ;AACL,CAAC,CAAC;AAnDW,QAAA,gBAAgB,oBAmD3B","sourcesContent":["import { iterateSelections, moveChildNodes } from 'roosterjs-content-model-dom';\nimport { toggleCaret } from '../setDOMSelection/toggleCaret';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The EditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n const fragment = core.logicalRoot.ownerDocument.createDocumentFragment();\n const clonedRoot = core.logicalRoot.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n toggleCaret(core, true /* hide */);\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n toggleCaret(core, false /* hide */);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\n};\n"]}
@@ -221,8 +221,13 @@ function handleInputOnDelimiter(editor, range, focusedNode, rawEvent) {
221
221
  }
222
222
  else {
223
223
  if (isEnter) {
224
- rawEvent.preventDefault();
225
- editor.formatContentModel(exports.handleEnterInlineEntity);
224
+ editor.formatContentModel(function (model, context) {
225
+ var result = (0, exports.handleEnterInlineEntity)(model, context);
226
+ if (result) {
227
+ rawEvent.preventDefault();
228
+ }
229
+ return result;
230
+ });
226
231
  }
227
232
  else {
228
233
  editor.takeSnapshot();
@@ -266,9 +271,13 @@ var handleEnterInlineEntity = function (model) {
266
271
  (0, roosterjs_content_model_dom_1.iterateSelections)(model, function (path, _tableContext, block) {
267
272
  if ((block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
268
273
  readonlySelectionBlock = block;
269
- selectionBlockParent = path[path.length - 1];
274
+ selectionBlockParent = path[0];
270
275
  }
271
276
  });
277
+ if ((selectionBlockParent === null || selectionBlockParent === void 0 ? void 0 : selectionBlockParent.blockGroupType) == 'ListItem') {
278
+ // No need to handle list item since it will be handled by common enter handler code
279
+ return false;
280
+ }
272
281
  if (readonlySelectionBlock && selectionBlockParent) {
273
282
  var markerIndex = readonlySelectionBlock.segments.findIndex(function (segment) { return segment.segmentType == 'SelectionMarker'; });
274
283
  if (markerIndex >= 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"entityDelimiterUtils.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/entity/entityDelimiterUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { adjustSelectionAroundEntity } from './adjustSelectionAroundEntity';\nimport { normalizePos } from '../selection/normalizePos';\nimport {\n addDelimiters,\n createBr,\n createModelToDomContext,\n createParagraph,\n isEntityDelimiter,\n isEntityElement,\n isNodeOfType,\n parseEntityFormat,\n findClosestEntityWrapper,\n iterateSelections,\n isCharacterValue,\n findClosestBlockEntityContainer,\n mutateSegment,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n CompositionEndEvent,\n ContentModelFormatter,\n ContentModelSegmentFormat,\n IEditor,\n KeyDownEvent,\n RangeSelection,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelParagraph,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DelimiterBefore = 'entityDelimiterBefore';\nconst DelimiterAfter = 'entityDelimiterAfter';\nconst DelimiterSelector = '.' + DelimiterAfter + ',.' + DelimiterBefore;\nconst ZeroWidthSpace = '\\u200B';\nconst EntityInfoName = '_Entity';\nconst InlineEntitySelector = 'span.' + EntityInfoName;\n\n/**\n * @internal exported only for unit test\n */\nexport function preventTypeInDelimiter(node: HTMLElement, editor: IEditor) {\n const isAfter = node.classList.contains(DelimiterAfter);\n const entitySibling = isAfter ? node.previousElementSibling : node.nextElementSibling;\n if (entitySibling && isEntityElement(entitySibling)) {\n removeInvalidDelimiters(\n [entitySibling.previousElementSibling, entitySibling.nextElementSibling].filter(\n element => !!element\n ) as HTMLElement[]\n );\n editor.formatContentModel((model, context) => {\n iterateSelections(model, (_path, _tableContext, block, _segments) => {\n if (block?.blockType == 'Paragraph') {\n block.segments.forEach(segment => {\n if (\n segment.segmentType == 'Text' &&\n segment.text.indexOf(ZeroWidthSpace) >= 0\n ) {\n mutateSegment(block, segment, segment => {\n segment.text = segment.text.replace(ZeroWidthSpace, '');\n });\n }\n });\n }\n });\n\n context.skipUndoSnapshot = true;\n\n return true;\n });\n }\n}\n\nfunction addDelimitersIfNeeded(\n nodes: Element[] | NodeListOf<Element>,\n format: ContentModelSegmentFormat | null\n) {\n if (nodes.length > 0) {\n const context = createModelToDomContext();\n nodes.forEach(node => {\n if (\n isNodeOfType(node, 'ELEMENT_NODE') &&\n isEntityElement(node) &&\n !node.isContentEditable\n ) {\n addDelimiters(node.ownerDocument, node as HTMLElement, format, context);\n }\n });\n }\n}\n\nfunction removeNode(el: Node | undefined | null) {\n el?.parentElement?.removeChild(el);\n}\n\nfunction removeInvalidDelimiters(nodes: Element[] | NodeListOf<Element>) {\n nodes.forEach(node => {\n if (!isNodeOfType(node, 'ELEMENT_NODE')) {\n return;\n }\n if (isEntityDelimiter(node)) {\n const sibling = node.classList.contains(DelimiterBefore)\n ? node.nextElementSibling\n : node.previousElementSibling;\n if (!(isNodeOfType(sibling, 'ELEMENT_NODE') && isEntityElement(sibling))) {\n removeNode(node);\n }\n } else {\n removeDelimiterAttr(node);\n }\n });\n}\n\nfunction removeDelimiterAttr(node: Element | undefined | null, checkEntity: boolean = true) {\n if (!node) {\n return;\n }\n\n const isAfter = node.classList.contains(DelimiterAfter);\n const entitySibling = isAfter ? node.previousElementSibling : node.nextElementSibling;\n if (checkEntity && entitySibling && isEntityElement(entitySibling)) {\n return;\n }\n\n node.classList.remove(DelimiterAfter, DelimiterBefore);\n\n node.normalize();\n node.childNodes.forEach(cn => {\n const index = cn.textContent?.indexOf(ZeroWidthSpace) ?? -1;\n if (index >= 0) {\n const range = new Range();\n range.setStart(cn, index);\n range.setEnd(cn, index + 1);\n range.deleteContents();\n }\n });\n}\n\nfunction getFocusedElement(\n selection: RangeSelection,\n existingTextInDelimiter?: string\n): HTMLElement | null {\n const { range, isReverted } = selection;\n let node: Node | null = isReverted ? range.startContainer : range.endContainer;\n let offset = isReverted ? range.startOffset : range.endOffset;\n\n if (node) {\n const pos = normalizePos(node, offset);\n node = pos.node;\n offset = pos.offset;\n }\n\n if (!isNodeOfType(node, 'ELEMENT_NODE')) {\n const textToCheck = existingTextInDelimiter\n ? ZeroWidthSpace + existingTextInDelimiter\n : ZeroWidthSpace;\n\n if (node.textContent != textToCheck && (node.textContent || '').length == offset) {\n node = node.nextSibling ?? node.parentElement?.closest(DelimiterSelector) ?? null;\n } else {\n node = node?.parentElement?.closest(DelimiterSelector) ?? null;\n }\n } else {\n node = node.childNodes.length == offset ? node : node.childNodes.item(offset);\n }\n if (node && !node.hasChildNodes()) {\n node = node.nextSibling;\n }\n return isNodeOfType(node, 'ELEMENT_NODE') ? node : null;\n}\n\n/**\n * @internal\n */\nexport function handleDelimiterContentChangedEvent(editor: IEditor) {\n const helper = editor.getDOMHelper();\n removeInvalidDelimiters(helper.queryElements(DelimiterSelector));\n addDelimitersIfNeeded(helper.queryElements(InlineEntitySelector), editor.getPendingFormat());\n}\n\n/**\n * @internal\n */\nexport function handleCompositionEndEvent(editor: IEditor, event: CompositionEndEvent) {\n const selection = editor.getDOMSelection();\n\n if (selection?.type == 'range' && selection.range.collapsed) {\n const node = getFocusedElement(selection, event.rawEvent.data);\n\n if (\n node?.firstChild &&\n isNodeOfType(node.firstChild, 'TEXT_NODE') &&\n node.matches(DelimiterSelector) &&\n node.textContent == ZeroWidthSpace + event.rawEvent.data\n ) {\n preventTypeInDelimiter(node, editor);\n }\n }\n}\n\n/**\n * @internal\n */\nexport function handleDelimiterKeyDownEvent(editor: IEditor, event: KeyDownEvent) {\n const selection = editor.getDOMSelection();\n\n if (!selection || selection.type != 'range') {\n return;\n }\n\n const rawEvent = event.rawEvent;\n const range = selection.range;\n const key = rawEvent.key;\n\n switch (key) {\n case 'Enter':\n if (range.collapsed) {\n handleInputOnDelimiter(editor, range, getFocusedElement(selection), rawEvent);\n } else {\n const helper = editor.getDOMHelper();\n const entity = findClosestEntityWrapper(range.startContainer, helper);\n\n if (\n entity &&\n isNodeOfType(entity, 'ELEMENT_NODE') &&\n helper.isNodeInEditor(entity)\n ) {\n triggerEntityEventOnEnter(editor, entity, rawEvent);\n }\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowRight':\n if (!rawEvent.altKey && !rawEvent.ctrlKey && !rawEvent.metaKey) {\n // Handle in async so focus is already moved, this makes us easier to check if we should adjust the selection\n editor.getDocument().defaultView?.requestAnimationFrame(() => {\n adjustSelectionAroundEntity(editor, key, rawEvent.shiftKey);\n });\n }\n break;\n\n default:\n if (isCharacterValue(rawEvent) && range.collapsed) {\n handleInputOnDelimiter(editor, range, getFocusedElement(selection), rawEvent);\n }\n\n break;\n }\n}\n\nfunction handleInputOnDelimiter(\n editor: IEditor,\n range: Range,\n focusedNode: HTMLElement | null,\n rawEvent: KeyboardEvent\n) {\n const helper = editor.getDOMHelper();\n\n if (focusedNode && isEntityDelimiter(focusedNode) && helper.isNodeInEditor(focusedNode)) {\n const blockEntityContainer = findClosestBlockEntityContainer(focusedNode, helper);\n const isEnter = rawEvent.key === 'Enter';\n\n if (blockEntityContainer && helper.isNodeInEditor(blockEntityContainer)) {\n const isAfter = focusedNode.classList.contains(DelimiterAfter);\n\n if (isAfter) {\n range.setStartAfter(blockEntityContainer);\n } else {\n range.setStartBefore(blockEntityContainer);\n }\n\n range.collapse(true /* toStart */);\n\n if (isEnter) {\n rawEvent.preventDefault();\n }\n\n editor.formatContentModel(handleKeyDownInBlockDelimiter, {\n selectionOverride: {\n type: 'range',\n isReverted: false,\n range,\n },\n });\n } else {\n if (isEnter) {\n rawEvent.preventDefault();\n editor.formatContentModel(handleEnterInlineEntity);\n } else {\n editor.takeSnapshot();\n editor\n .getDocument()\n .defaultView?.requestAnimationFrame(() =>\n preventTypeInDelimiter(focusedNode, editor)\n );\n }\n }\n }\n}\n\n/**\n * @internal Exported Only for unit test\n * @returns\n */\nexport const handleKeyDownInBlockDelimiter: ContentModelFormatter = (model, context) => {\n iterateSelections(model, (_path, _tableContext, readonlyBlock) => {\n if (readonlyBlock?.blockType == 'Paragraph') {\n const block = mutateBlock(readonlyBlock);\n\n delete block.isImplicit;\n const selectionMarker = block.segments.find(w => w.segmentType == 'SelectionMarker');\n if (selectionMarker?.segmentType == 'SelectionMarker') {\n block.segmentFormat = { ...selectionMarker.format };\n context.newPendingFormat = { ...selectionMarker.format };\n }\n block.segments.unshift(createBr());\n }\n });\n\n return true;\n};\n\n/**\n * @internal Exported Only for unit test\n * @returns\n */\nexport const handleEnterInlineEntity: ContentModelFormatter = model => {\n let readonlySelectionBlock: ReadonlyContentModelParagraph | undefined;\n let selectionBlockParent: ReadonlyContentModelBlockGroup | undefined;\n\n iterateSelections(model, (path, _tableContext, block) => {\n if (block?.blockType == 'Paragraph') {\n readonlySelectionBlock = block;\n selectionBlockParent = path[path.length - 1];\n }\n });\n\n if (readonlySelectionBlock && selectionBlockParent) {\n const markerIndex = readonlySelectionBlock.segments.findIndex(\n segment => segment.segmentType == 'SelectionMarker'\n );\n\n if (markerIndex >= 0) {\n const selectionBlock = mutateBlock(readonlySelectionBlock);\n const segmentsAfterMarker = selectionBlock.segments.splice(markerIndex);\n\n const newPara: ShallowMutableContentModelParagraph = createParagraph(\n false,\n selectionBlock.format,\n selectionBlock.segmentFormat,\n selectionBlock.decorator\n );\n\n if (\n selectionBlock.segments.every(\n x => x.segmentType == 'SelectionMarker' || x.segmentType == 'Br'\n ) ||\n segmentsAfterMarker.every(x => x.segmentType == 'SelectionMarker')\n ) {\n newPara.segments.push(createBr(selectionBlock.format));\n }\n\n newPara.segments.push(...segmentsAfterMarker);\n\n const selectionBlockIndex = selectionBlockParent.blocks.indexOf(selectionBlock);\n if (selectionBlockIndex >= 0) {\n mutateBlock(selectionBlockParent).blocks.splice(\n selectionBlockIndex + 1,\n 0,\n newPara\n );\n }\n }\n }\n\n return true;\n};\n\nconst triggerEntityEventOnEnter = (\n editor: IEditor,\n wrapper: HTMLElement,\n rawEvent: KeyboardEvent\n) => {\n const format = parseEntityFormat(wrapper);\n if (format.id && format.entityType && !format.isFakeEntity) {\n editor.triggerEvent('entityOperation', {\n operation: 'click',\n entity: {\n id: format.id,\n type: format.entityType,\n isReadonly: !!format.isReadonly,\n wrapper,\n },\n rawEvent: rawEvent,\n });\n }\n};\n"]}
1
+ {"version":3,"file":"entityDelimiterUtils.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/entity/entityDelimiterUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { adjustSelectionAroundEntity } from './adjustSelectionAroundEntity';\nimport { normalizePos } from '../selection/normalizePos';\nimport {\n addDelimiters,\n createBr,\n createModelToDomContext,\n createParagraph,\n isEntityDelimiter,\n isEntityElement,\n isNodeOfType,\n parseEntityFormat,\n findClosestEntityWrapper,\n iterateSelections,\n isCharacterValue,\n findClosestBlockEntityContainer,\n mutateSegment,\n mutateBlock,\n} from 'roosterjs-content-model-dom';\nimport type {\n CompositionEndEvent,\n ContentModelFormatter,\n ContentModelSegmentFormat,\n IEditor,\n KeyDownEvent,\n RangeSelection,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelParagraph,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst DelimiterBefore = 'entityDelimiterBefore';\nconst DelimiterAfter = 'entityDelimiterAfter';\nconst DelimiterSelector = '.' + DelimiterAfter + ',.' + DelimiterBefore;\nconst ZeroWidthSpace = '\\u200B';\nconst EntityInfoName = '_Entity';\nconst InlineEntitySelector = 'span.' + EntityInfoName;\n\n/**\n * @internal exported only for unit test\n */\nexport function preventTypeInDelimiter(node: HTMLElement, editor: IEditor) {\n const isAfter = node.classList.contains(DelimiterAfter);\n const entitySibling = isAfter ? node.previousElementSibling : node.nextElementSibling;\n if (entitySibling && isEntityElement(entitySibling)) {\n removeInvalidDelimiters(\n [entitySibling.previousElementSibling, entitySibling.nextElementSibling].filter(\n element => !!element\n ) as HTMLElement[]\n );\n editor.formatContentModel((model, context) => {\n iterateSelections(model, (_path, _tableContext, block, _segments) => {\n if (block?.blockType == 'Paragraph') {\n block.segments.forEach(segment => {\n if (\n segment.segmentType == 'Text' &&\n segment.text.indexOf(ZeroWidthSpace) >= 0\n ) {\n mutateSegment(block, segment, segment => {\n segment.text = segment.text.replace(ZeroWidthSpace, '');\n });\n }\n });\n }\n });\n\n context.skipUndoSnapshot = true;\n\n return true;\n });\n }\n}\n\nfunction addDelimitersIfNeeded(\n nodes: Element[] | NodeListOf<Element>,\n format: ContentModelSegmentFormat | null\n) {\n if (nodes.length > 0) {\n const context = createModelToDomContext();\n nodes.forEach(node => {\n if (\n isNodeOfType(node, 'ELEMENT_NODE') &&\n isEntityElement(node) &&\n !node.isContentEditable\n ) {\n addDelimiters(node.ownerDocument, node as HTMLElement, format, context);\n }\n });\n }\n}\n\nfunction removeNode(el: Node | undefined | null) {\n el?.parentElement?.removeChild(el);\n}\n\nfunction removeInvalidDelimiters(nodes: Element[] | NodeListOf<Element>) {\n nodes.forEach(node => {\n if (!isNodeOfType(node, 'ELEMENT_NODE')) {\n return;\n }\n if (isEntityDelimiter(node)) {\n const sibling = node.classList.contains(DelimiterBefore)\n ? node.nextElementSibling\n : node.previousElementSibling;\n if (!(isNodeOfType(sibling, 'ELEMENT_NODE') && isEntityElement(sibling))) {\n removeNode(node);\n }\n } else {\n removeDelimiterAttr(node);\n }\n });\n}\n\nfunction removeDelimiterAttr(node: Element | undefined | null, checkEntity: boolean = true) {\n if (!node) {\n return;\n }\n\n const isAfter = node.classList.contains(DelimiterAfter);\n const entitySibling = isAfter ? node.previousElementSibling : node.nextElementSibling;\n if (checkEntity && entitySibling && isEntityElement(entitySibling)) {\n return;\n }\n\n node.classList.remove(DelimiterAfter, DelimiterBefore);\n\n node.normalize();\n node.childNodes.forEach(cn => {\n const index = cn.textContent?.indexOf(ZeroWidthSpace) ?? -1;\n if (index >= 0) {\n const range = new Range();\n range.setStart(cn, index);\n range.setEnd(cn, index + 1);\n range.deleteContents();\n }\n });\n}\n\nfunction getFocusedElement(\n selection: RangeSelection,\n existingTextInDelimiter?: string\n): HTMLElement | null {\n const { range, isReverted } = selection;\n let node: Node | null = isReverted ? range.startContainer : range.endContainer;\n let offset = isReverted ? range.startOffset : range.endOffset;\n\n if (node) {\n const pos = normalizePos(node, offset);\n node = pos.node;\n offset = pos.offset;\n }\n\n if (!isNodeOfType(node, 'ELEMENT_NODE')) {\n const textToCheck = existingTextInDelimiter\n ? ZeroWidthSpace + existingTextInDelimiter\n : ZeroWidthSpace;\n\n if (node.textContent != textToCheck && (node.textContent || '').length == offset) {\n node = node.nextSibling ?? node.parentElement?.closest(DelimiterSelector) ?? null;\n } else {\n node = node?.parentElement?.closest(DelimiterSelector) ?? null;\n }\n } else {\n node = node.childNodes.length == offset ? node : node.childNodes.item(offset);\n }\n if (node && !node.hasChildNodes()) {\n node = node.nextSibling;\n }\n return isNodeOfType(node, 'ELEMENT_NODE') ? node : null;\n}\n\n/**\n * @internal\n */\nexport function handleDelimiterContentChangedEvent(editor: IEditor) {\n const helper = editor.getDOMHelper();\n removeInvalidDelimiters(helper.queryElements(DelimiterSelector));\n addDelimitersIfNeeded(helper.queryElements(InlineEntitySelector), editor.getPendingFormat());\n}\n\n/**\n * @internal\n */\nexport function handleCompositionEndEvent(editor: IEditor, event: CompositionEndEvent) {\n const selection = editor.getDOMSelection();\n\n if (selection?.type == 'range' && selection.range.collapsed) {\n const node = getFocusedElement(selection, event.rawEvent.data);\n\n if (\n node?.firstChild &&\n isNodeOfType(node.firstChild, 'TEXT_NODE') &&\n node.matches(DelimiterSelector) &&\n node.textContent == ZeroWidthSpace + event.rawEvent.data\n ) {\n preventTypeInDelimiter(node, editor);\n }\n }\n}\n\n/**\n * @internal\n */\nexport function handleDelimiterKeyDownEvent(editor: IEditor, event: KeyDownEvent) {\n const selection = editor.getDOMSelection();\n\n if (!selection || selection.type != 'range') {\n return;\n }\n\n const rawEvent = event.rawEvent;\n const range = selection.range;\n const key = rawEvent.key;\n\n switch (key) {\n case 'Enter':\n if (range.collapsed) {\n handleInputOnDelimiter(editor, range, getFocusedElement(selection), rawEvent);\n } else {\n const helper = editor.getDOMHelper();\n const entity = findClosestEntityWrapper(range.startContainer, helper);\n\n if (\n entity &&\n isNodeOfType(entity, 'ELEMENT_NODE') &&\n helper.isNodeInEditor(entity)\n ) {\n triggerEntityEventOnEnter(editor, entity, rawEvent);\n }\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowRight':\n if (!rawEvent.altKey && !rawEvent.ctrlKey && !rawEvent.metaKey) {\n // Handle in async so focus is already moved, this makes us easier to check if we should adjust the selection\n editor.getDocument().defaultView?.requestAnimationFrame(() => {\n adjustSelectionAroundEntity(editor, key, rawEvent.shiftKey);\n });\n }\n break;\n\n default:\n if (isCharacterValue(rawEvent) && range.collapsed) {\n handleInputOnDelimiter(editor, range, getFocusedElement(selection), rawEvent);\n }\n\n break;\n }\n}\n\nfunction handleInputOnDelimiter(\n editor: IEditor,\n range: Range,\n focusedNode: HTMLElement | null,\n rawEvent: KeyboardEvent\n) {\n const helper = editor.getDOMHelper();\n\n if (focusedNode && isEntityDelimiter(focusedNode) && helper.isNodeInEditor(focusedNode)) {\n const blockEntityContainer = findClosestBlockEntityContainer(focusedNode, helper);\n const isEnter = rawEvent.key === 'Enter';\n\n if (blockEntityContainer && helper.isNodeInEditor(blockEntityContainer)) {\n const isAfter = focusedNode.classList.contains(DelimiterAfter);\n\n if (isAfter) {\n range.setStartAfter(blockEntityContainer);\n } else {\n range.setStartBefore(blockEntityContainer);\n }\n\n range.collapse(true /* toStart */);\n\n if (isEnter) {\n rawEvent.preventDefault();\n }\n\n editor.formatContentModel(handleKeyDownInBlockDelimiter, {\n selectionOverride: {\n type: 'range',\n isReverted: false,\n range,\n },\n });\n } else {\n if (isEnter) {\n editor.formatContentModel((model, context) => {\n const result = handleEnterInlineEntity(model, context);\n\n if (result) {\n rawEvent.preventDefault();\n }\n\n return result;\n });\n } else {\n editor.takeSnapshot();\n editor\n .getDocument()\n .defaultView?.requestAnimationFrame(() =>\n preventTypeInDelimiter(focusedNode, editor)\n );\n }\n }\n }\n}\n\n/**\n * @internal Exported Only for unit test\n * @returns\n */\nexport const handleKeyDownInBlockDelimiter: ContentModelFormatter = (model, context) => {\n iterateSelections(model, (_path, _tableContext, readonlyBlock) => {\n if (readonlyBlock?.blockType == 'Paragraph') {\n const block = mutateBlock(readonlyBlock);\n\n delete block.isImplicit;\n const selectionMarker = block.segments.find(w => w.segmentType == 'SelectionMarker');\n if (selectionMarker?.segmentType == 'SelectionMarker') {\n block.segmentFormat = { ...selectionMarker.format };\n context.newPendingFormat = { ...selectionMarker.format };\n }\n block.segments.unshift(createBr());\n }\n });\n\n return true;\n};\n\n/**\n * @internal Exported Only for unit test\n * @returns\n */\nexport const handleEnterInlineEntity: ContentModelFormatter = model => {\n let readonlySelectionBlock: ReadonlyContentModelParagraph | undefined;\n let selectionBlockParent: ReadonlyContentModelBlockGroup | undefined;\n\n iterateSelections(model, (path, _tableContext, block) => {\n if (block?.blockType == 'Paragraph') {\n readonlySelectionBlock = block;\n selectionBlockParent = path[0];\n }\n });\n\n if (selectionBlockParent?.blockGroupType == 'ListItem') {\n // No need to handle list item since it will be handled by common enter handler code\n return false;\n }\n\n if (readonlySelectionBlock && selectionBlockParent) {\n const markerIndex = readonlySelectionBlock.segments.findIndex(\n segment => segment.segmentType == 'SelectionMarker'\n );\n\n if (markerIndex >= 0) {\n const selectionBlock = mutateBlock(readonlySelectionBlock);\n const segmentsAfterMarker = selectionBlock.segments.splice(markerIndex);\n\n const newPara: ShallowMutableContentModelParagraph = createParagraph(\n false,\n selectionBlock.format,\n selectionBlock.segmentFormat,\n selectionBlock.decorator\n );\n\n if (\n selectionBlock.segments.every(\n x => x.segmentType == 'SelectionMarker' || x.segmentType == 'Br'\n ) ||\n segmentsAfterMarker.every(x => x.segmentType == 'SelectionMarker')\n ) {\n newPara.segments.push(createBr(selectionBlock.format));\n }\n\n newPara.segments.push(...segmentsAfterMarker);\n\n const selectionBlockIndex = selectionBlockParent.blocks.indexOf(selectionBlock);\n if (selectionBlockIndex >= 0) {\n mutateBlock(selectionBlockParent).blocks.splice(\n selectionBlockIndex + 1,\n 0,\n newPara\n );\n }\n }\n }\n\n return true;\n};\n\nconst triggerEntityEventOnEnter = (\n editor: IEditor,\n wrapper: HTMLElement,\n rawEvent: KeyboardEvent\n) => {\n const format = parseEntityFormat(wrapper);\n if (format.id && format.entityType && !format.isFakeEntity) {\n editor.triggerEvent('entityOperation', {\n operation: 'click',\n entity: {\n id: format.id,\n type: format.entityType,\n isReadonly: !!format.isReadonly,\n wrapper,\n },\n rawEvent: rawEvent,\n });\n }\n};\n"]}
@@ -80,6 +80,29 @@ var DOMHelperImpl = /** @class */ (function () {
80
80
  DOMHelperImpl.prototype.getClonedRoot = function () {
81
81
  return this.contentDiv.cloneNode(true /*deep*/);
82
82
  };
83
+ /**
84
+ * Get format of the container element
85
+ */
86
+ DOMHelperImpl.prototype.getContainerFormat = function () {
87
+ var _a, _b;
88
+ var window = this.contentDiv.ownerDocument.defaultView;
89
+ var style = window === null || window === void 0 ? void 0 : window.getComputedStyle(this.contentDiv);
90
+ return style
91
+ ? {
92
+ fontSize: style.fontSize,
93
+ fontFamily: style.fontFamily,
94
+ fontWeight: style.fontWeight,
95
+ textColor: style.color,
96
+ backgroundColor: style.backgroundColor,
97
+ italic: style.fontStyle == 'italic',
98
+ letterSpacing: style.letterSpacing,
99
+ lineHeight: style.lineHeight,
100
+ strikethrough: (_a = style.textDecoration) === null || _a === void 0 ? void 0 : _a.includes('line-through'),
101
+ superOrSubScriptSequence: style.verticalAlign,
102
+ underline: (_b = style.textDecoration) === null || _b === void 0 ? void 0 : _b.includes('underline'),
103
+ }
104
+ : {};
105
+ };
83
106
  return DOMHelperImpl;
84
107
  }());
85
108
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DOMHelperImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/DOMHelperImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { isNodeOfType, parseValueWithUnit, toArray } from 'roosterjs-content-model-dom';\nimport type { DOMHelper } from 'roosterjs-content-model-types';\n\nclass DOMHelperImpl implements DOMHelper {\n constructor(private contentDiv: HTMLElement) {}\n\n queryElements(selector: string): HTMLElement[] {\n return toArray(this.contentDiv.querySelectorAll(selector)) as HTMLElement[];\n }\n\n getTextContent(): string {\n return this.contentDiv.textContent || '';\n }\n\n isNodeInEditor(node: Node, excludeRoot?: boolean): boolean {\n return excludeRoot && node == this.contentDiv ? false : this.contentDiv.contains(node);\n }\n\n calculateZoomScale(): number {\n const originalWidth = this.contentDiv.getBoundingClientRect()?.width || 0;\n const visualWidth = this.contentDiv.offsetWidth;\n\n return visualWidth > 0 && originalWidth > 0\n ? Math.round((originalWidth / visualWidth) * 100) / 100\n : 1;\n }\n\n setDomAttribute(name: string, value: string | null) {\n if (value === null) {\n this.contentDiv.removeAttribute(name);\n } else {\n this.contentDiv.setAttribute(name, value);\n }\n }\n\n getDomAttribute(name: string): string | null {\n return this.contentDiv.getAttribute(name);\n }\n\n getDomStyle<T extends keyof CSSStyleDeclaration>(style: T): CSSStyleDeclaration[T] {\n return this.contentDiv.style[style];\n }\n\n findClosestElementAncestor(startFrom: Node, selector?: string): HTMLElement | null {\n const startElement = isNodeOfType(startFrom, 'ELEMENT_NODE')\n ? startFrom\n : startFrom.parentElement;\n const closestElement = selector\n ? (startElement?.closest(selector) as HTMLElement | null)\n : startElement;\n\n return closestElement &&\n this.isNodeInEditor(closestElement) &&\n closestElement != this.contentDiv\n ? closestElement\n : null;\n }\n\n hasFocus(): boolean {\n const activeElement = this.contentDiv.ownerDocument.activeElement;\n return !!(activeElement && this.contentDiv.contains(activeElement));\n }\n\n /**\n * Check if the root element is in RTL mode\n */\n isRightToLeft(): boolean {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n\n return style?.direction == 'rtl';\n }\n\n /**\n * Get the width of the editable area of the editor content div\n */\n getClientWidth(): number {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n const paddingLeft = parseValueWithUnit(style?.paddingLeft);\n const paddingRight = parseValueWithUnit(style?.paddingRight);\n return this.contentDiv.clientWidth - (paddingLeft + paddingRight);\n }\n\n /**\n * Get a deep cloned root element\n */\n getClonedRoot(): HTMLElement {\n return this.contentDiv.cloneNode(true /*deep*/) as HTMLElement;\n }\n}\n\n/**\n * @internal Create new instance of DOMHelper\n */\nexport function createDOMHelper(contentDiv: HTMLElement): DOMHelper {\n return new DOMHelperImpl(contentDiv);\n}\n"]}
1
+ {"version":3,"file":"DOMHelperImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/DOMHelperImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { isNodeOfType, parseValueWithUnit, toArray } from 'roosterjs-content-model-dom';\nimport type { ContentModelSegmentFormat, DOMHelper } from 'roosterjs-content-model-types';\n\nclass DOMHelperImpl implements DOMHelper {\n constructor(private contentDiv: HTMLElement) {}\n\n queryElements(selector: string): HTMLElement[] {\n return toArray(this.contentDiv.querySelectorAll(selector)) as HTMLElement[];\n }\n\n getTextContent(): string {\n return this.contentDiv.textContent || '';\n }\n\n isNodeInEditor(node: Node, excludeRoot?: boolean): boolean {\n return excludeRoot && node == this.contentDiv ? false : this.contentDiv.contains(node);\n }\n\n calculateZoomScale(): number {\n const originalWidth = this.contentDiv.getBoundingClientRect()?.width || 0;\n const visualWidth = this.contentDiv.offsetWidth;\n\n return visualWidth > 0 && originalWidth > 0\n ? Math.round((originalWidth / visualWidth) * 100) / 100\n : 1;\n }\n\n setDomAttribute(name: string, value: string | null) {\n if (value === null) {\n this.contentDiv.removeAttribute(name);\n } else {\n this.contentDiv.setAttribute(name, value);\n }\n }\n\n getDomAttribute(name: string): string | null {\n return this.contentDiv.getAttribute(name);\n }\n\n getDomStyle<T extends keyof CSSStyleDeclaration>(style: T): CSSStyleDeclaration[T] {\n return this.contentDiv.style[style];\n }\n\n findClosestElementAncestor(startFrom: Node, selector?: string): HTMLElement | null {\n const startElement = isNodeOfType(startFrom, 'ELEMENT_NODE')\n ? startFrom\n : startFrom.parentElement;\n const closestElement = selector\n ? (startElement?.closest(selector) as HTMLElement | null)\n : startElement;\n\n return closestElement &&\n this.isNodeInEditor(closestElement) &&\n closestElement != this.contentDiv\n ? closestElement\n : null;\n }\n\n hasFocus(): boolean {\n const activeElement = this.contentDiv.ownerDocument.activeElement;\n return !!(activeElement && this.contentDiv.contains(activeElement));\n }\n\n /**\n * Check if the root element is in RTL mode\n */\n isRightToLeft(): boolean {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n\n return style?.direction == 'rtl';\n }\n\n /**\n * Get the width of the editable area of the editor content div\n */\n getClientWidth(): number {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n const paddingLeft = parseValueWithUnit(style?.paddingLeft);\n const paddingRight = parseValueWithUnit(style?.paddingRight);\n return this.contentDiv.clientWidth - (paddingLeft + paddingRight);\n }\n\n /**\n * Get a deep cloned root element\n */\n getClonedRoot(): HTMLElement {\n return this.contentDiv.cloneNode(true /*deep*/) as HTMLElement;\n }\n\n /**\n * Get format of the container element\n */\n getContainerFormat(): ContentModelSegmentFormat {\n const window = this.contentDiv.ownerDocument.defaultView;\n\n const style = window?.getComputedStyle(this.contentDiv);\n\n return style\n ? {\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n fontWeight: style.fontWeight,\n textColor: style.color,\n backgroundColor: style.backgroundColor,\n italic: style.fontStyle == 'italic',\n letterSpacing: style.letterSpacing,\n lineHeight: style.lineHeight,\n strikethrough: style.textDecoration?.includes('line-through'),\n superOrSubScriptSequence: style.verticalAlign,\n underline: style.textDecoration?.includes('underline'),\n }\n : {};\n }\n}\n\n/**\n * @internal Create new instance of DOMHelper\n */\nexport function createDOMHelper(contentDiv: HTMLElement): DOMHelper {\n return new DOMHelperImpl(contentDiv);\n}\n"]}
@@ -13,7 +13,8 @@ define(["require", "exports", "../../corePlugin/cache/updateCache", "roosterjs-c
13
13
  var _a;
14
14
  // Flush all mutations if any, so that we can get an up-to-date Content Model
15
15
  (_a = core.cache.textMutationObserver) === null || _a === void 0 ? void 0 : _a.flushMutations();
16
- if (!selectionOverride && (!option || option.tryGetFromCache)) {
16
+ var tryGetFromCache = !option || (option.tryGetFromCache && typeof option.recalculateTableSize === 'undefined');
17
+ if (!selectionOverride && tryGetFromCache) {
17
18
  var cachedModel = core.cache.cachedModel;
18
19
  if (cachedModel) {
19
20
  // When in shadow edit, use a cloned model so we won't pollute the cached one
@@ -27,6 +28,7 @@ define(["require", "exports", "../../corePlugin/cache/updateCache", "roosterjs-c
27
28
  : selectionOverride || core.api.getDOMSelection(core) || undefined;
28
29
  var saveIndex = !option && !selectionOverride;
29
30
  var editorContext = core.api.createEditorContext(core, saveIndex);
31
+ editorContext.recalculateTableSize = option === null || option === void 0 ? void 0 : option.recalculateTableSize;
30
32
  var settings = core.environment.domToModelSettings;
31
33
  var domToModelContext = option
32
34
  ? (0, roosterjs_content_model_dom_1.createDomToModelContext)(editorContext, settings.builtIn, settings.customized, option)
@@ -1 +1 @@
1
- {"version":3,"file":"createContentModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/createContentModel/createContentModel.ts"],"names":[],"mappings":";;;;IASA;;;;;;OAMG;IACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB;;QAClF,6EAA6E;QAC7E,MAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,0CAAE,cAAc,EAAE,CAAC;QAElD,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE;YAC3D,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAE3C,IAAI,WAAW,EAAE;gBACb,6EAA6E;gBAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB;oBACpC,CAAC,CAAC,IAAA,wCAAU,EAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;oBACzD,CAAC,CAAC,WAAW,CAAC;aACrB;SACJ;QAED,IAAM,SAAS,GACX,iBAAiB,IAAI,MAAM;YACvB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QAC3E,IAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACpE,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;QACrD,IAAM,iBAAiB,GAAG,MAAM;YAC5B,CAAC,CAAC,IAAA,qDAAuB,EAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;YACvF,CAAC,CAAC,IAAA,+DAAiC,EAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAE5E,IAAI,SAAS,EAAE;YACX,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;SAC3C;QAED,IAAM,KAAK,GAAG,IAAA,+CAAiB,EAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAErE,IAAI,SAAS,EAAE;YACX,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;SAC7C;QAED,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IArCW,QAAA,kBAAkB,sBAqC7B","sourcesContent":["import { updateCache } from '../../corePlugin/cache/updateCache';\nimport {\n cloneModel,\n createDomToModelContext,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type { CreateContentModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create Content Model from DOM tree in this editor\n * @param core The editor core object\n * @param option The option to customize the behavior of DOM to Content Model conversion\n * @param selectionOverride When passed, use this selection range instead of current selection in editor\n */\nexport const createContentModel: CreateContentModel = (core, option, selectionOverride) => {\n // Flush all mutations if any, so that we can get an up-to-date Content Model\n core.cache.textMutationObserver?.flushMutations();\n\n if (!selectionOverride && (!option || option.tryGetFromCache)) {\n const cachedModel = core.cache.cachedModel;\n\n if (cachedModel) {\n // When in shadow edit, use a cloned model so we won't pollute the cached one\n return core.lifecycle.shadowEditFragment\n ? cloneModel(cachedModel, { includeCachedElement: true })\n : cachedModel;\n }\n }\n\n const selection =\n selectionOverride == 'none'\n ? undefined\n : selectionOverride || core.api.getDOMSelection(core) || undefined;\n const saveIndex = !option && !selectionOverride;\n const editorContext = core.api.createEditorContext(core, saveIndex);\n const settings = core.environment.domToModelSettings;\n const domToModelContext = option\n ? createDomToModelContext(editorContext, settings.builtIn, settings.customized, option)\n : createDomToModelContextWithConfig(settings.calculated, editorContext);\n\n if (selection) {\n domToModelContext.selection = selection;\n }\n\n const model = domToContentModel(core.logicalRoot, domToModelContext);\n\n if (saveIndex) {\n updateCache(core.cache, model, selection);\n }\n\n return model;\n};\n"]}
1
+ {"version":3,"file":"createContentModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/createContentModel/createContentModel.ts"],"names":[],"mappings":";;;;IASA;;;;;;OAMG;IACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB;;QAClF,6EAA6E;QAC7E,MAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,0CAAE,cAAc,EAAE,CAAC;QAClD,IAAM,eAAe,GACjB,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,OAAO,MAAM,CAAC,oBAAoB,KAAK,WAAW,CAAC,CAAC;QAE9F,IAAI,CAAC,iBAAiB,IAAI,eAAe,EAAE;YACvC,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAE3C,IAAI,WAAW,EAAE;gBACb,6EAA6E;gBAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB;oBACpC,CAAC,CAAC,IAAA,wCAAU,EAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;oBACzD,CAAC,CAAC,WAAW,CAAC;aACrB;SACJ;QAED,IAAM,SAAS,GACX,iBAAiB,IAAI,MAAM;YACvB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QAC3E,IAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEpE,aAAa,CAAC,oBAAoB,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,oBAAoB,CAAC;QAElE,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;QACrD,IAAM,iBAAiB,GAAG,MAAM;YAC5B,CAAC,CAAC,IAAA,qDAAuB,EAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;YACvF,CAAC,CAAC,IAAA,+DAAiC,EAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAE5E,IAAI,SAAS,EAAE;YACX,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;SAC3C;QAED,IAAM,KAAK,GAAG,IAAA,+CAAiB,EAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAErE,IAAI,SAAS,EAAE;YACX,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;SAC7C;QAED,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IA1CW,QAAA,kBAAkB,sBA0C7B","sourcesContent":["import { updateCache } from '../../corePlugin/cache/updateCache';\nimport {\n cloneModel,\n createDomToModelContext,\n createDomToModelContextWithConfig,\n domToContentModel,\n} from 'roosterjs-content-model-dom';\nimport type { CreateContentModel } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create Content Model from DOM tree in this editor\n * @param core The editor core object\n * @param option The option to customize the behavior of DOM to Content Model conversion\n * @param selectionOverride When passed, use this selection range instead of current selection in editor\n */\nexport const createContentModel: CreateContentModel = (core, option, selectionOverride) => {\n // Flush all mutations if any, so that we can get an up-to-date Content Model\n core.cache.textMutationObserver?.flushMutations();\n const tryGetFromCache =\n !option || (option.tryGetFromCache && typeof option.recalculateTableSize === 'undefined');\n\n if (!selectionOverride && tryGetFromCache) {\n const cachedModel = core.cache.cachedModel;\n\n if (cachedModel) {\n // When in shadow edit, use a cloned model so we won't pollute the cached one\n return core.lifecycle.shadowEditFragment\n ? cloneModel(cachedModel, { includeCachedElement: true })\n : cachedModel;\n }\n }\n\n const selection =\n selectionOverride == 'none'\n ? undefined\n : selectionOverride || core.api.getDOMSelection(core) || undefined;\n const saveIndex = !option && !selectionOverride;\n const editorContext = core.api.createEditorContext(core, saveIndex);\n\n editorContext.recalculateTableSize = option?.recalculateTableSize;\n\n const settings = core.environment.domToModelSettings;\n const domToModelContext = option\n ? createDomToModelContext(editorContext, settings.builtIn, settings.customized, option)\n : createDomToModelContextWithConfig(settings.calculated, editorContext);\n\n if (selection) {\n domToModelContext.selection = selection;\n }\n\n const model = domToContentModel(core.logicalRoot, domToModelContext);\n\n if (saveIndex) {\n updateCache(core.cache, model, selection);\n }\n\n return model;\n};\n"]}
@@ -1,13 +1,11 @@
1
- define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/areSameSelections", "../setEditorStyle/ensureUniqueId", "./findLastedCoInMergedCell", "./findTableCellElement", "roosterjs-content-model-dom"], function (require, exports, addRangeToSelection_1, areSameSelections_1, ensureUniqueId_1, findLastedCoInMergedCell_1, findTableCellElement_1, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/areSameSelections", "../setEditorStyle/ensureUniqueId", "./findLastedCoInMergedCell", "./findTableCellElement", "./toggleCaret", "roosterjs-content-model-dom"], function (require, exports, addRangeToSelection_1, areSameSelections_1, ensureUniqueId_1, findLastedCoInMergedCell_1, findTableCellElement_1, toggleCaret_1, roosterjs_content_model_dom_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.setDOMSelection = void 0;
5
5
  var DOM_SELECTION_CSS_KEY = '_DOMSelection';
6
- var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
7
6
  var HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';
8
7
  var IMAGE_ID = 'image';
9
8
  var TABLE_ID = 'table';
10
- var CARET_CSS_RULE = 'caret-color: transparent';
11
9
  var TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';
12
10
  var SELECTION_SELECTOR = '*::selection';
13
11
  var DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
@@ -27,8 +25,8 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
27
25
  var isDarkMode = core.lifecycle.isDarkMode;
28
26
  core.selection.skipReselectOnFocus = true;
29
27
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);
30
- core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);
31
28
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);
29
+ (0, toggleCaret_1.toggleCaret)(core, false /* hide */);
32
30
  try {
33
31
  switch (selection === null || selection === void 0 ? void 0 : selection.type) {
34
32
  case 'image':
@@ -82,8 +80,8 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
82
80
  ? core.selection.tableCellSelectionBackgroundColorDark
83
81
  : core.selection.tableCellSelectionBackgroundColor;
84
82
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
85
- core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);
86
83
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
84
+ (0, toggleCaret_1.toggleCaret)(core, true /* hide */);
87
85
  var nodeToSelect = ((_c = firstCell.cell) === null || _c === void 0 ? void 0 : _c.firstElementChild) || firstCell.cell;
88
86
  if (nodeToSelect) {
89
87
  setRangeSelection(doc, nodeToSelect || undefined, true /* collapse */);