Привет!
Судя по вопросу до рабочего визивига еще далеко. А судя по отсутствию ответов понятно, что не многие так "глубоко копают" JavaScript.
Если перед получением выделенного фрагмента Вставить такой код:
range.selectNode(range.commonAncestorContainer.parentNode);
Тогда при выделении текста от начала до конца какого либо тега получим текст вместе с его контейнером т.е. обрамленный тегами.
Правда если выделить несколько узлов, получим их общего родителя, возможны варианты получить все вместе с тегом <body>, по этому нужно хорошо продумать алгоритм.
Если есть другие варианты буду рад увидеть.