/**
* @module plugins/clean-html
*/
import type { IJodit } from 'jodit/types';
import { Dom } from 'jodit/core/dom/dom';
import { attr } from 'jodit/core/helpers/utils';
import {
isInlineBlock,
removeFormatForCollapsedSelection
} from './remove-format-for-collapsed-selection';
/**
* Remove formatting for all selected elements
* @private
*/
export function removeFormatForSelection(jodit: IJodit): void {
// console.log(
// '🚀 ~ file: remove-format-for-selection.ts:19 ~ removeFormatForSelection ~ removeFormatForSelection'
// );
const { s, editor, createInside } = jodit,
{ range } = s,
left = range.cloneRange(),
right = range.cloneRange(),
fakeLeft = createInside.fake(),
fakeRight = createInside.fake();
left.collapse(true);
right.collapse(false);
Dom.safeInsertNode(left, fakeLeft);
Dom.safeInsertNode(right, fakeRight);
range.setStartBefore(fakeLeft);
range.collapse(true);
s.selectRange(range);
removeFormatForCollapsedSelection(jodit, fakeLeft);
range.setEndAfter(fakeRight);
range.collapse(false);
s.selectRange(range);
removeFormatForCollapsedSelection(jodit, fakeRight);
const shouldUnwrap: Node[] = [];
Dom.between(fakeLeft, fakeRight, node => {
if (isInlineBlock(node) && !Dom.isTag(node, ['a'])) {
shouldUnwrap.push(node);
}
if (Dom.isElement(node) && attr(node, 'style')) {
attr(node, 'style', null);
}
});
shouldUnwrap.forEach(node => Dom.unwrap(node));
const clearParent = (node: Node, left: boolean): true | void => {
if (!Dom.findNotEmptySibling(node, left)) {
const pn = node.parentNode as Element;
if (pn && pn !== editor && attr(pn, 'style')) {
attr(pn, 'style', null);
clearParent(pn, left);
return true;
}
}
};
clearParent(fakeLeft, true) && clearParent(fakeRight, false);
range.setStartAfter(fakeLeft);
range.setEndBefore(fakeRight);
s.selectRange(range);
Dom.safeRemove(fakeLeft);
Dom.safeRemove(fakeRight);
}