Для обертки выделенного текста в div использую insertNode. Оборачивая тегами, текст приобретает жирность например для тега <b>
Как обернуть тегами так, чтобы они были видны в div (<b>текст</b>), а не текст
var selection = window.getSelection().getRangeAt(0);
var selectedText = selection.extractContents();
var span = document.createElement(bb[index]);
span.appendChild(selectedText);
selection.insertNode(span);