From 120e6563df3fb74a970799fbc472225484bf28c4 Mon Sep 17 00:00:00 2001 From: azaozz Date: Sat, 5 Nov 2011 18:32:47 +0000 Subject: [PATCH] Update the spellchecker plugin for TinyMCE to 2.0.6, fixes #19105 git-svn-id: http://svn.automattic.com/wordpress/trunk@19178 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- .../plugins/spellchecker/changelog.txt | 5 +++++ .../spellchecker/classes/EnchantSpell.php | 8 +++++-- .../spellchecker/classes/PSpellShell.php | 20 +++++++++++------- .../plugins/spellchecker/editor_plugin.js | 2 +- wp-includes/js/tinymce/wp-tinymce.js.gz | Bin 95777 -> 95790 bytes wp-includes/version.php | 2 +- 6 files changed, 25 insertions(+), 12 deletions(-) diff --git a/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt b/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt index 22f6b72a4a..f41ec7fdb1 100644 --- a/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt +++ b/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt @@ -1,3 +1,8 @@ +Version 2.0.6 (2011-09-29) + Fixed incorrect position of suggestion menu. + Fixed handling of mispelled words with no suggestions in PSpellShell engine. + Fixed PSpellShell command on Windows. + Fixed bug where Javascript error is produced when enchant_dict_suggest() returns unexpected result. Version 2.0.5 (2011-03-24) Merged with the latest TinyMCE spellchecker version. Version 2.0.4 (2010-12-20) diff --git a/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php b/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php index 7e2bd9770e..cefc8cf2ce 100644 --- a/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php +++ b/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php @@ -48,16 +48,20 @@ class EnchantSpell extends SpellChecker { */ function &getSuggestions($lang, $word) { $r = enchant_broker_init(); - $suggs = array(); if (enchant_broker_dict_exists($r,$lang)) { $d = enchant_broker_request_dict($r, $lang); $suggs = enchant_dict_suggest($d, $word); + // enchant_dict_suggest() sometimes returns NULL + if (!is_array($suggs)) + $suggs = array(); + enchant_broker_free_dict($d); } else { - + $suggs = array(); } + enchant_broker_free($r); return $suggs; diff --git a/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php b/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php index c4b5220d3d..3d6d4a9a26 100644 --- a/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php +++ b/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php @@ -38,13 +38,13 @@ class PSpellShell extends SpellChecker { $matches = array(); // Skip this line. - if (strpos($dstr, "@") === 0) + if ($dstr[0] == "@") continue; - preg_match("/\& ([^ ]+) .*/i", $dstr, $matches); + preg_match("/(\&|#) ([^ ]+) .*/i", $dstr, $matches); - if (!empty($matches[1])) - $returnData[] = utf8_encode(trim($matches[1])); + if (!empty($matches[2])) + $returnData[] = utf8_encode(trim($matches[2])); } return $returnData; @@ -82,7 +82,7 @@ class PSpellShell extends SpellChecker { $matches = array(); // Skip this line. - if (strpos($dstr, "@") === 0) + if ($dstr[0] == "@") continue; preg_match("/\&[^:]+:(.*)/i", $dstr, $matches); @@ -103,10 +103,14 @@ class PSpellShell extends SpellChecker { function _getCMD($lang) { $this->_tmpfile = tempnam($this->_config['PSpellShell.tmp'], "tinyspell"); - if(preg_match("#win#i", php_uname())) - return $this->_config['PSpellShell.aspell'] . " -a --lang=". escapeshellarg($lang) . " --encoding=utf-8 -H < " . $this->_tmpfile . " 2>&1"; + $file = $this->_tmpfile; + $lang = preg_replace("/[^-_a-z]/", "", strtolower($lang)); + $bin = $this->_config['PSpellShell.aspell']; - return "cat ". $this->_tmpfile ." | " . $this->_config['PSpellShell.aspell'] . " -a --encoding=utf-8 -H --lang=". escapeshellarg($lang); + if (preg_match("#win#i", php_uname())) + return "$bin -a --lang=$lang --encoding=utf-8 -H < $file 2>&1"; + + return "cat $file | $bin -a --lang=$lang --encoding=utf-8 -H"; } } diff --git a/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js b/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js index e59c2c157b..f7cadd6e7f 100644 --- a/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js +++ b/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js @@ -1 +1 @@ -(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url",this.url+'/rpc.php');if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');for(d=0;d$2");while((r=o.indexOf(""))!=-1){m=o.substring(0,r);if(m.length){q=document.createTextNode(f.decode(m));p.appendChild(q)}o=o.substring(r+10);r=o.indexOf("");m=o.substring(0,r);o=o.substring(r+11);p.appendChild(f.create("span",{"class":"mceItemHiddenSpellWord"},m))}if(o.length){q=document.createTextNode(f.decode(o));p.appendChild(q)}}else{p.innerHTML=o.replace(e,'$1$2')}f.replace(p,s)}});h.moveToBookmark(i)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=k.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})(); \ No newline at end of file +(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url",this.url+'/rpc.php');if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');for(d=0;d$2");while((s=p.indexOf(""))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(f.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(f.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(f.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(e,'$1$2')}f.replace(q,t)}});h.moveToBookmark(i)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}if(h.getParam("show_ignore_words",true)){e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}})}if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})(); \ No newline at end of file diff --git a/wp-includes/js/tinymce/wp-tinymce.js.gz b/wp-includes/js/tinymce/wp-tinymce.js.gz index b4a21e551ecb89a66b27b7910130dfe1268b508a..9ef7627f545f33075e43f54fbb15de318b4d00c2 100644 GIT binary patch delta 6831 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