t._done();\r
});\r
\r
- ed.onInit.add(function() {\r
- if (ed.settings.content_css !== false)\r
- ed.dom.loadCSS(url + '/css/content.css');\r
- });\r
+ if (ed.settings.content_css !== false)\r
+ ed.contentCSS.push(url + '/css/content.css');\r
\r
ed.onClick.add(t._showMenu, t);\r
ed.onContextMenu.add(t._showMenu, t);\r
var o = {icon : 1}, mi;\r
\r
o.onclick = function() {\r
+ if (v == t.selectedLang) {\r
+ return;\r
+ }\r
mi.setSelected(1);\r
t.selectedItem.setSelected(0);\r
t.selectedItem = mi;\r
},\r
\r
_markWords : function(wl) {\r
- var r1, r2, r3, r4, r5, w = '', ed = this.editor, re = this._getSeparators(), dom = ed.dom, nl = [];\r
- var se = ed.selection, b = se.getBookmark();\r
-\r
- each(wl, function(v) {\r
- w += (w ? '|' : '') + v;\r
- });\r
-\r
- r1 = new RegExp('([' + re + '])(' + w + ')([' + re + '])', 'g');\r
- r2 = new RegExp('^(' + w + ')', 'g');\r
- r3 = new RegExp('(' + w + ')([' + re + ']?)$', 'g');\r
- r4 = new RegExp('^(' + w + ')([' + re + ']?)$', 'g');\r
- r5 = new RegExp('(' + w + ')([' + re + '])', 'g');\r
+ var ed = this.editor, dom = ed.dom, doc = ed.getDoc(), se = ed.selection, b = se.getBookmark(), nl = [],\r
+ w = wl.join('|'), re = this._getSeparators(), rx = new RegExp('(^|[' + re + '])(' + w + ')(?=[' + re + ']|$)', 'g');\r
\r
// Collect all text nodes\r
- this._walk(this.editor.getBody(), function(n) {\r
+ this._walk(ed.getBody(), function(n) {\r
if (n.nodeType == 3) {\r
nl.push(n);\r
}\r
\r
// Wrap incorrect words in spans\r
each(nl, function(n) {\r
- 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
}\r
+\r
+ // Finally, replace the node with the container\r
+ dom.replace(elem, n);\r
}\r
});\r
\r
e = 0; // Fixes IE memory leak\r
\r
if (!m) {\r
- p1 = DOM.getPos(ed.getContentAreaContainer());\r
- //p2 = DOM.getPos(ed.getContainer());\r
-\r
- m = ed.controlManager.createDropMenu('spellcheckermenu', {\r
- offset_x : p1.x,\r
- offset_y : p1.y,\r
- 'class' : 'mceNoIcons'\r
- });\r
-\r
+ m = ed.controlManager.createDropMenu('spellcheckermenu', {'class' : 'mceNoIcons'});\r
t._menu = m;\r
}\r
\r
m.update();\r
});\r
\r
+ p1 = dom.getPos(ed.getContentAreaContainer());\r
+ m.settings.offset_x = p1.x;\r
+ m.settings.offset_y = p1.y;\r
+\r
ed.selection.select(wordSpan);\r
p1 = dom.getPos(wordSpan);\r
m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y);\r