/** * @module plugins/backspace */ import type { IJodit } from 'jodit/types'; import { Dom } from 'jodit/core/dom/dom'; import { INSEPARABLE_TAGS } from 'jodit/core/constants'; import { checkRemoveEmptyParent } from './check-remove-empty-parent'; /** * Check possibility inseparable Element can be removed (img, hr etc.) * * @example * ```html *

first second | stop

* ``` * result * ```html *

first second | stop

* ``` * * @private */ export function checkRemoveUnbreakableElement( jodit: IJodit, fakeNode: Node, backspace: boolean ): boolean { const neighbor = Dom.findSibling(fakeNode, backspace); const parent = neighbor?.parentNode; if (Dom.isTag(parent, 'jodit-file')) { Dom.safeRemove(parent); return true; } if ( Dom.isTag(parent, 'jodit-link-preview-content') || Dom.isTag(fakeNode?.parentNode, 'jodit-link-preview-content') || Dom.isTag( fakeNode?.parentNode?.parentNode, 'jodit-link-preview-content' ) ) { let targetElement = neighbor ?? fakeNode; while (targetElement && targetElement.parentNode !== jodit.editor) { if (Dom.isTag(targetElement, 'jodit-link-preview')) { Dom.safeRemove(targetElement); return true; } targetElement = targetElement.parentNode as Node; } } if ( Dom.isElement(neighbor) && (Dom.isTag(neighbor, INSEPARABLE_TAGS) || Dom.isEmpty(neighbor)) ) { Dom.safeRemove(neighbor); if ( Dom.isTag(neighbor, 'br') && !Dom.findNotEmptySibling(fakeNode, false) ) { Dom.after(fakeNode, jodit.createInside.element('br')); } jodit.s.setCursorBefore(fakeNode); if (Dom.isTag(neighbor, 'br')) { checkRemoveEmptyParent(jodit, fakeNode, backspace); } return true; } return false; }