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.
- package/README.md +3 -0
- package/lib/coreApi/createContentModel/createContentModel.js +3 -1
- package/lib/coreApi/createContentModel/createContentModel.js.map +1 -1
- package/lib/coreApi/setDOMSelection/setDOMSelection.js +3 -4
- package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
- package/lib/coreApi/setDOMSelection/toggleCaret.d.ts +7 -0
- package/lib/coreApi/setDOMSelection/toggleCaret.js +15 -0
- package/lib/coreApi/setDOMSelection/toggleCaret.js.map +1 -0
- package/lib/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
- package/lib/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
- package/lib/corePlugin/entity/entityDelimiterUtils.js +12 -3
- package/lib/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
- package/lib/editor/core/DOMHelperImpl.js +23 -0
- package/lib/editor/core/DOMHelperImpl.js.map +1 -1
- package/lib-amd/coreApi/createContentModel/createContentModel.js +3 -1
- package/lib-amd/coreApi/createContentModel/createContentModel.js.map +1 -1
- package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +3 -5
- package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
- package/lib-amd/coreApi/setDOMSelection/toggleCaret.d.ts +7 -0
- package/lib-amd/coreApi/setDOMSelection/toggleCaret.js +17 -0
- package/lib-amd/coreApi/setDOMSelection/toggleCaret.js.map +1 -0
- package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js +3 -1
- package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
- package/lib-amd/corePlugin/entity/entityDelimiterUtils.js +12 -3
- package/lib-amd/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
- package/lib-amd/editor/core/DOMHelperImpl.js +23 -0
- package/lib-amd/editor/core/DOMHelperImpl.js.map +1 -1
- package/lib-mjs/coreApi/createContentModel/createContentModel.js +3 -1
- package/lib-mjs/coreApi/createContentModel/createContentModel.js.map +1 -1
- package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +3 -4
- package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
- package/lib-mjs/coreApi/setDOMSelection/toggleCaret.d.ts +7 -0
- package/lib-mjs/coreApi/setDOMSelection/toggleCaret.js +11 -0
- package/lib-mjs/coreApi/setDOMSelection/toggleCaret.js.map +1 -0
- package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
- package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
- package/lib-mjs/corePlugin/entity/entityDelimiterUtils.js +12 -3
- package/lib-mjs/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
- package/lib-mjs/editor/core/DOMHelperImpl.js +23 -0
- package/lib-mjs/editor/core/DOMHelperImpl.js.map +1 -1
- 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
|
-
|
|
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;
|
|
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;
|
|
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
|
-
|
|
225
|
-
|
|
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[
|
|
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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
|
|
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
|
-
|
|
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;
|
|
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 */);
|