Upgrade TinyMCE to v3.4.5
[citadel.git] / webcit / tiny_mce / plugins / spellchecker / editor_plugin_src.js
index d8680baf2cdfac60b4dc0e8624713aebdf7401f6..ee4df887c9953883e33a56039c175b997c037772 100644 (file)
                                        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
                                                }\r
                                        });\r
 \r
-\r
                                        if (t.editor.getParam("spellchecker_enable_learn_rpc")) {\r
                                                m.add({\r
                                                        title : 'spellchecker.learn_word',\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