UNPKG

@ckeditor/ckeditor5-table

Version:

Table feature for CKEditor 5.

68 lines (67 loc) 2.54 kB
/** * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * Checks if the provided model element is a `table`. * * @param modelElement Element to check if it is a table. */ export function isTable(modelElement) { return !!modelElement && modelElement.is('element', 'table'); } /** * Returns the caption model element from a given table element. Returns `null` if no caption is found. * * @param tableModelElement Table element in which we will try to find a caption element. */ export function getCaptionFromTableModelElement(tableModelElement) { for (const node of tableModelElement.getChildren()) { if (node.is('element', 'caption')) { return node; } } return null; } /** * Returns the caption model element for a model selection. Returns `null` if the selection has no caption element ancestor. * * @param selection The selection checked for caption presence. */ export function getCaptionFromModelSelection(selection) { const tableElement = getSelectionAffectedTable(selection); if (!tableElement) { return null; } return getCaptionFromTableModelElement(tableElement); } /** * {@link module:engine/view/matcher~Matcher} pattern. Checks if a given element is a caption. * * There are two possible forms of the valid caption: * - A `<figcaption>` element inside a `<figure class="table">` element. * - A `<caption>` inside a <table>. * * @returns Returns the object accepted by {@link module:engine/view/matcher~Matcher} or `null` if the element cannot be matched. */ export function matchTableCaptionViewElement(element) { const parent = element.parent; if (element.name == 'figcaption' && parent && parent.is('element', 'figure') && parent.hasClass('table')) { return { name: true }; } if (element.name == 'caption' && parent && parent.is('element', 'table')) { return { name: true }; } return null; } /** * Depending on the position of the selection we either return the table under cursor or look for the table higher in the hierarchy. */ export function getSelectionAffectedTable(selection) { const selectedElement = selection.getSelectedElement(); // Is the command triggered from the `tableToolbar`? if (selectedElement && selectedElement.is('element', 'table')) { return selectedElement; } return selection.getFirstPosition().findAncestor('table'); }