Old post...but to go along with Johnathan's answer, I made an extension that just used RegEx to clean up the paste:
// Clear the Word header
wordGarbage = wordGarbage.replace(/<html[\S\s]*<!--StartFragment-->[\S\s]*?</gim,"<");
// Fix the lists
wordGarbage = wordGarbage.replace(/<p class=MsoListParagraphCxSpFirst[\S\s]*?mso-list:l1[\S\s]*?<\!\[endif\]>([\S\s]*?)<\/p>/gim,"<ul><li>$1</li>");
wordGarbage = wordGarbage.replace(/<p class=MsoListParagraphCxSpFirst[\S\s]*?mso-list:l0[\S\s]*?<\!\[endif\]>([\S\s]*?)<\/p>/gim,"<ol><li>$1</li>");
wordGarbage = wordGarbage.replace(/<p class=MsoListParagraphCxSpMiddle[\S\s]*?<!\[endif\]>([\S\s]*?)<\/p>/gim,"<li>$1</li> ");
wordGarbage = wordGarbage.replace(/<p class=MsoListParagraphCxSpLast[\S\s]*?mso-list:l1[\S\s]*?<\!\[endif\]>([\S\s]*?)<\/p>/gim,"<li>$1</li></ul>");
wordGarbage = wordGarbage.replace(/<p class=MsoListParagraphCxSpLast[\S\s]*?mso-list:l0[\S\s]*?<\!\[endif\]>([\S\s]*?)<\/p>/gim,"<li>$1</li></ol>");
// Remvoe all the classes
wordGarbage = wordGarbage.replace(/[\s]?class=[\S\s]*?>/gim,">");
// Get the radio button that was selected
var whatToDo = document.querySelector('input[name = "action"]:checked').value;
if (whatToDo === "keepStyles") {
// Just remove the mso entries
wordGarbage = wordGarbage.replace(/mso[\S\s]*?([;'])/gim,"$1");
}
else if (whatToDo === "removeStyles")
{
// Remove all styles
wordGarbage = wordGarbage.replace(/[\s]?style=[\S\s]*?>/gim,">");
}
// Remove empty paragraphs
wordGarbage = wordGarbage.replace(/<o:p><\/o:p>/gim,"");
// Clean up breaks
wordGarbage = wordGarbage.replace(/<p><o:p> <\/o:p><\/p>/gim,"<p> </p>");
// Remove all the styles in the table datas
//wordGarbage = wordGarbage.replace(/<td[\S\s]*?>/gim,"<td>");
//wordGarbage = wordGarbage.replace(/(<td[\s\S]*?)style=[\s\S]*?>/gim,"$1>");
// Clear the footer
wordGarbage = wordGarbage.replace(/[\s]*<!--EndFragment-->[\S\s]*<\/html>/gim,"");
I used the extension example to pop a window, get the paste from the users clipboard with the help of this, and then return it cleaned up. Only catch is that this does not work for nested lists.
Hope this helps someone. Enjoy!