diff --git a/config/current.ver b/config/current.ver index 76700a7..d66ddbd 100644 --- a/config/current.ver +++ b/config/current.ver @@ -1 +1 @@ -1.1.53 \ No newline at end of file +1.1.54 \ No newline at end of file diff --git a/public/assets/js/bridge/rte-editor.js b/public/assets/js/bridge/rte-editor.js index 61ac882..543d69d 100644 --- a/public/assets/js/bridge/rte-editor.js +++ b/public/assets/js/bridge/rte-editor.js @@ -502,6 +502,54 @@ saveSelection(); } catch {} }; + const removeInlineFormatting = () => { + try { + content.focus(); + restoreSelection(); + const docRef = content.ownerDocument || document; + const range = getSelectionRange(); + if (!range || range.collapsed) return; + const fragment = range.extractContents(); + const unwrap = (node) => { + const parent = node.parentNode; + if (!parent) return; + while (node.firstChild) parent.insertBefore(node.firstChild, node); + parent.removeChild(node); + }; + const strip = (node) => { + if (!node) return; + if (node.nodeType === 1) { + const tag = node.tagName ? node.tagName.toUpperCase() : ''; + if (tag === 'B' || tag === 'STRONG' || tag === 'I' || tag === 'EM' || tag === 'U' || tag === 'S' || tag === 'STRIKE') { + const children = Array.from(node.childNodes); + children.forEach(strip); + unwrap(node); + return; + } + if (tag === 'SPAN') { + try { + node.style.fontWeight = ''; + node.style.fontStyle = ''; + node.style.textDecoration = ''; + node.style.textDecorationLine = ''; + node.style.textDecorationStyle = ''; + } catch {} + const styleAttr = node.getAttribute('style'); + if (!styleAttr || !String(styleAttr).trim()) { + const children = Array.from(node.childNodes); + children.forEach(strip); + unwrap(node); + return; + } + } + Array.from(node.childNodes).forEach(strip); + } + }; + Array.from(fragment.childNodes).forEach(strip); + range.insertNode(fragment); + saveSelection(); + } catch {} + }; const addButton = (labelHtml, title, cmd, valueGetter, handler) => { const btn = doc.createElement('button'); @@ -653,7 +701,16 @@ addButton(icon('M7 6h10v2H7zM9 10h6v2H9zM8 14h8v2H8z'), 'Hochgestellt', 'superscript'); addButton(icon('M7 4h4v4H7V4zm6 12h4v4h-4v-4zM7 10h10v2H7v-2z'), 'Einzug', 'indent'); addButton(icon('M13 4h4v4h-4V4zM7 16h4v4H7v-4zM7 10h10v2H7v-2z'), 'Ausruecken', 'outdent'); - addButton(icon('M5 5h14v2H5zM5 9h10v2H5zM5 13h14v2H5zM5 17h10v2H5z'), 'Formatierung entfernen', 'removeFormat'); + addButton( + icon('M5 5h14v2H5zM5 9h10v2H5zM5 13h14v2H5zM5 17h10v2H5z'), + 'Formatierung entfernen', + null, + null, + () => { + exec('removeFormat'); + removeInlineFormatting(); + } + ); const fontOptions = (this.B.RTE_FONTS && Array.isArray(this.B.RTE_FONTS) && this.B.RTE_FONTS.length) ? this.B.RTE_FONTS