+
+ var range = window.getSelection().getRangeAt(0);
+ var contents = range.cloneContents();
+ if (contents.querySelector(tag) === null) {
+ element = range.startContainer;
+ if (element.nodeType === Node.TEXT_NODE) {
+ element = element.parentElement;
+ }
+
+ var parentWithTheSameTag = element.closest(tag);
+ if (parentWithTheSameTag !== null && this.core.editor()[0].contains(parentWithTheSameTag)) {
+ // We need to split the matching parent element
+ // by moving everything to the left and the right
+ // into separate nodes.
+ var leftElement = document.createElement(tag);
+ parentWithTheSameTag.insertAdjacentElement("beforebegin", leftElement);
+
+ var leftRange = document.createRange();
+ leftRange.selectNodeContents(parentWithTheSameTag);
+ leftRange.setEnd(range.startContainer, range.startOffset);
+ leftElement.appendChild(leftRange.extractContents());
+
+ var rightElement = document.createElement(tag);
+ parentWithTheSameTag.insertAdjacentElement("afterend", rightElement);
+
+ var rightRange = document.createRange();
+ rightRange.selectNodeContents(parentWithTheSameTag);
+ rightRange.setStart(range.endContainer, range.endOffset);
+ rightElement.appendChild(rightRange.extractContents());
+
+ // Finally remove the offending parent element.
+ var parentElement = parentWithTheSameTag.parentElement;
+ while (parentWithTheSameTag.childNodes.length) {
+ parentElement.insertBefore(parentWithTheSameTag.childNodes[0], parentWithTheSameTag);
+ }
+ parentWithTheSameTag.remove();
+
+ return;
+ }
+ }