- var v;\r
-\r
- if (n.nodeType == 3) {\r
- v = n.nodeValue;\r
-\r
- if (r1.test(v) || r2.test(v) || r3.test(v) || r4.test(v)) {\r
- v = dom.encode(v);\r
- v = v.replace(r5, '<span class="mceItemHiddenSpellWord">$1</span>$2');\r
- v = v.replace(r3, '<span class="mceItemHiddenSpellWord">$1</span>$2');\r
-\r
- dom.replace(dom.create('span', {'class' : 'mceItemHidden'}, v), n);\r
+ var node, elem, txt, pos, v = n.nodeValue;\r
+\r
+ if (rx.test(v)) {\r
+ // Encode the content\r
+ v = dom.encode(v);\r
+ // Create container element\r
+ elem = dom.create('span', {'class' : 'mceItemHidden'});\r
+\r
+ // Following code fixes IE issues by creating text nodes\r
+ // using DOM methods instead of innerHTML.\r
+ // Bug #3124: <PRE> elements content is broken after spellchecking.\r
+ // Bug #1408: Preceding whitespace characters are removed\r
+ // @TODO: I'm not sure that both are still issues on IE9.\r
+ if (tinymce.isIE) {\r
+ // Enclose mispelled words with temporal tag\r
+ v = v.replace(rx, '$1<mcespell>$2</mcespell>');\r
+ // Loop over the content finding mispelled words\r
+ while ((pos = v.indexOf('<mcespell>')) != -1) {\r
+ // Add text node for the content before the word\r
+ txt = v.substring(0, pos);\r
+ if (txt.length) {\r
+ node = doc.createTextNode(dom.decode(txt));\r
+ elem.appendChild(node);\r
+ }\r
+ v = v.substring(pos+10);\r
+ pos = v.indexOf('</mcespell>');\r
+ txt = v.substring(0, pos);\r
+ v = v.substring(pos+11);\r
+ // Add span element for the word\r
+ elem.appendChild(dom.create('span', {'class' : 'mceItemHiddenSpellWord'}, txt));\r
+ }\r
+ // Add text node for the rest of the content\r
+ if (v.length) {\r
+ node = doc.createTextNode(dom.decode(v));\r
+ elem.appendChild(node);\r
+ }\r
+ } else {\r
+ // Other browsers preserve whitespace characters on innerHTML usage\r
+ elem.innerHTML = v.replace(rx, '$1<span class="mceItemHiddenSpellWord">$2</span>');\r