import { Arr, Optional } from '@ephox/katamari'; import { SelectorFilter, SelectorFind, SugarElement } from '@ephox/sugar'; import Editor from '../api/Editor'; import * as ElementType from '../dom/ElementType'; import * as MultiRange from './MultiRange'; const getCellsFromRanges = (ranges: Range[]): SugarElement[] => Arr.filter(MultiRange.getSelectedNodes(ranges), ElementType.isTableCell); const getCellsFromElement = (elm: SugarElement): SugarElement[] => SelectorFilter.descendants(elm, 'td[data-mce-selected],th[data-mce-selected]'); const getCellsFromElementOrRanges = (ranges: Range[], element: SugarElement): SugarElement[] => { const selectedCells = getCellsFromElement(element); return selectedCells.length > 0 ? selectedCells : getCellsFromRanges(ranges); }; const getCellsFromEditor = (editor: Editor): SugarElement[] => getCellsFromElementOrRanges(MultiRange.getRanges(editor.selection.getSel()), SugarElement.fromDom(editor.getBody())); const getClosestTable = (cell: SugarElement, isRoot: (e: SugarElement) => boolean): Optional> => SelectorFind.ancestor(cell, 'table', isRoot); export { getCellsFromRanges, getCellsFromElement, getCellsFromElementOrRanges, getCellsFromEditor, getClosestTable };