From 6649b1f0a5db6160d197a13ca79cfd67fbb02d77 Mon Sep 17 00:00:00 2001 From: svncommit Date: Sat, 23 Sep 2006 23:37:29 +0000 Subject: added TinyMCE spellchecker plugin, configured to use GoogleSpell --- program/js/tiny_mce/plugins/spellchecker/changelog | 11 + .../spellchecker/classes/TinyGoogleSpell.class.php | 107 ++++ .../spellchecker/classes/TinyPspell.class.php | 64 +++ .../spellchecker/classes/TinyPspellShell.class.php | 121 +++++ .../js/tiny_mce/plugins/spellchecker/config.php | 24 + .../tiny_mce/plugins/spellchecker/css/content.css | 5 + .../plugins/spellchecker/css/spellchecker.css | 34 ++ .../tiny_mce/plugins/spellchecker/editor_plugin.js | 1 + .../plugins/spellchecker/editor_plugin_src.js | 588 +++++++++++++++++++++ .../plugins/spellchecker/images/spellchecker.gif | Bin 0 -> 591 bytes .../tiny_mce/plugins/spellchecker/images/wline.gif | Bin 0 -> 46 bytes .../js/tiny_mce/plugins/spellchecker/langs/en.js | 15 + .../js/tiny_mce/plugins/spellchecker/tinyspell.php | 142 +++++ 13 files changed, 1112 insertions(+) create mode 100644 program/js/tiny_mce/plugins/spellchecker/changelog create mode 100644 program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php create mode 100644 program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php create mode 100644 program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php create mode 100644 program/js/tiny_mce/plugins/spellchecker/config.php create mode 100644 program/js/tiny_mce/plugins/spellchecker/css/content.css create mode 100644 program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css create mode 100644 program/js/tiny_mce/plugins/spellchecker/editor_plugin.js create mode 100644 program/js/tiny_mce/plugins/spellchecker/editor_plugin_src.js create mode 100644 program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif create mode 100644 program/js/tiny_mce/plugins/spellchecker/images/wline.gif create mode 100644 program/js/tiny_mce/plugins/spellchecker/langs/en.js create mode 100644 program/js/tiny_mce/plugins/spellchecker/tinyspell.php (limited to 'program/js/tiny_mce/plugins/spellchecker') diff --git a/program/js/tiny_mce/plugins/spellchecker/changelog b/program/js/tiny_mce/plugins/spellchecker/changelog new file mode 100644 index 000000000..608fcd56d --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/changelog @@ -0,0 +1,11 @@ +Version 1.0.2 (2006-08-02) + Added new spellchecker_report_mispellings option, contributed by Jeremy B. + Fixed various regexp bugs and issues. Some where contributed by Jeremy B. + Fixed the Google speller class so it uses curl, patch contributed by Yuriy Kramar. + Fixed encoding issues with language specific characters, patch contributed by codepit. + Fixed bug where the spellchecker wasn't working in MSIE if the editor was placed in a P tag. +Version 1.0.1 (2006-05-05) + Since sourceforge has a serious bug when it comes to replacing files with the same name this release was necessary. + Goggle spellchecker class was added. +Version 1.0 (2006-05-03) + Official first release. diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php b/program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php new file mode 100644 index 000000000..33e7b1cc1 --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php @@ -0,0 +1,107 @@ +lang = $lang; + } + + // Returns array with bad words or false if failed. + function checkWords($word_array) { + $words = array(); + $wordstr = implode(' ', $word_array); + + $matches = $this->_getMatches($wordstr); + + for ($i=0; $iunhtmlentities(mb_substr($wordstr, $matches[$i][1], $matches[$i][2], "UTF-8")); + + return $words; + } + + function unhtmlentities($string) { + $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string); + $string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string); + + $trans_tbl = get_html_translation_table(HTML_ENTITIES); + $trans_tbl = array_flip($trans_tbl); + + return strtr($string, $trans_tbl); + } + + // Returns array with suggestions or false if failed. + function getSuggestion($word) { + $sug = array(); + + $matches = $this->_getMatches($word); + + if (count($matches) > 0) + $sug = explode("\t", utf8_encode($this->unhtmlentities($matches[0][4]))); + + return $sug; + } + + function _xmlChars($string) { + $trans = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES); + + foreach ($trans as $k => $v) + $trans[$k] = "&#".ord($k).";"; + + return strtr($string, $trans); + } + + function _getMatches($word_list) { + $server = "www.google.com"; + $port = 443; + $path = "/tbproxy/spell?lang=" . $this->lang . "&hl=en"; + $host = "www.google.com"; + $url = "https://" . $server; + + // Setup XML request + $xml = '' . $word_list . ''; + + $header = "POST ".$path." HTTP/1.0 \r\n"; + $header .= "MIME-Version: 1.0 \r\n"; + $header .= "Content-type: application/PTI26 \r\n"; + $header .= "Content-length: ".strlen($xml)." \r\n"; + $header .= "Content-transfer-encoding: text \r\n"; + $header .= "Request-number: 1 \r\n"; + $header .= "Document-type: Request \r\n"; + $header .= "Interface-Version: Test 1.4 \r\n"; + $header .= "Connection: close \r\n\r\n"; + $header .= $xml; + //$this->_debugData($xml); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + $xml = curl_exec($ch); + curl_close($ch); + + //$this->_debugData($xml); + + // Grab and parse content + preg_match_all('/([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER); + + return $matches; + } + + function _debugData($data) { + $fh = @fopen("debug.log", 'a+'); + @fwrite($fh, $data); + @fclose($fh); + } +} + +// Setup classname, should be the same as the name of the spellchecker class +$spellCheckerConfig['class'] = "TinyGoogleSpell"; + +?> diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php b/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php new file mode 100644 index 000000000..21fb19448 --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php @@ -0,0 +1,64 @@ +lang = $lang; + $this->mode = $mode; + $this->plink = false; + $this->errorMsg = array(); + + if (!function_exists("pspell_new")) { + $this->errorMsg[] = "PSpell not found."; + return; + } + + $this->plink = pspell_new($this->lang, $this->spelling, $this->jargon, $this->encoding, $this->mode); + } + + // Returns array with bad words or false if failed. + function checkWords($wordArray) { + if (!$this->plink) { + $this->errorMsg[] = "No PSpell link found for checkWords."; + return array(); + } + + $wordError = array(); + foreach($wordArray as $word) { + if(!pspell_check($this->plink, trim($word))) + $wordError[] = $word; + } + + return $wordError; + } + + // Returns array with suggestions or false if failed. + function getSuggestion($word) { + if (!$this->plink) { + $this->errorMsg[] = "No PSpell link found for getSuggestion."; + return array(); + } + + return pspell_suggest($this->plink, $word); + } +} + +// Setup classname, should be the same as the name of the spellchecker class +$spellCheckerConfig['class'] = "TinyPspell"; + +?> \ No newline at end of file diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php b/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php new file mode 100644 index 000000000..348cac3d8 --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php @@ -0,0 +1,121 @@ +lang = $lang; + $this->mode = $mode; + $this->error = false; + $this->errorMsg = array(); + + $this->tmpfile = tempnam($config['tinypspellshell.tmp'], "tinyspell"); + + if(preg_match("#win#i",php_uname())) + $this->cmd = $config['tinypspellshell.aspell'] . " -a --lang=". $this->lang." --encoding=utf-8 -H < $this->tmpfile 2>&1"; + else + $this->cmd = "cat ". $this->tmpfile ." | " . $config['tinypspellshell.aspell'] . " -a --encoding=utf-8 -H --lang=". $this->lang; + } + + // Returns array with bad words or false if failed. + function checkWords($wordArray) { + if ($fh = fopen($this->tmpfile, "w")) { + fwrite($fh, "!\n"); + foreach($wordArray as $key => $value) + fwrite($fh, "^" . $value . "\n"); + fclose($fh); + } else { + $this->errorMsg[] = "PSpell not found."; + return array(); + } + + $data = shell_exec($this->cmd); + @unlink($this->tmpfile); + + $returnData = array(); + $dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY); + + foreach($dataArr as $dstr) { + $matches = array(); + + // Skip this line. + if (strpos($dstr, "@") === 0) + continue; + + preg_match("/\& (.*) .* .*: .*/i", $dstr, $matches); + + if (!empty($matches[1])) + $returnData[] = $matches[1]; + } + + return $returnData; + } + + // Returns array with suggestions or false if failed. + function getSuggestion($word) { + if (function_exists("mb_convert_encoding")) + $word = mb_convert_encoding($word, "ISO-8859-1", mb_detect_encoding($word, "UTF-8")); + else + $word = utf8_encode($word); + + if ($fh = fopen($this->tmpfile, "w")) { + fwrite($fh, "!\n"); + fwrite($fh, "^$word\n"); + fclose($fh); + } else + die("Error opening tmp file."); + + $data = shell_exec($this->cmd); + + @unlink($this->tmpfile); + + $returnData = array(); + $dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY); + + foreach($dataArr as $dstr) { + $matches = array(); + + // Skip this line. + if (strpos($dstr, "@") === 0) + continue; + + preg_match("/\& .* .* .*: (.*)/i", $dstr, $matches); + + if (!empty($matches[1])) { + // For some reason, the exec version seems to add commas? + $returnData[] = str_replace(",", "", $matches[1]); + } + } + return $returnData; + } + + function _debugData($data) { + $fh = @fopen("debug.log", 'a+'); + @fwrite($fh, $data); + @fclose($fh); + } + +} + +// Setup classname, should be the same as the name of the spellchecker class +$spellCheckerConfig['class'] = "TinyPspellShell"; + +?> \ No newline at end of file diff --git a/program/js/tiny_mce/plugins/spellchecker/config.php b/program/js/tiny_mce/plugins/spellchecker/config.php new file mode 100644 index 000000000..5b0f3d51e --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/config.php @@ -0,0 +1,24 @@ + diff --git a/program/js/tiny_mce/plugins/spellchecker/css/content.css b/program/js/tiny_mce/plugins/spellchecker/css/content.css new file mode 100644 index 000000000..fb82733cd --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/css/content.css @@ -0,0 +1,5 @@ +.mceItemHiddenSpellWord { + background: url('../images/wline.gif') repeat-x bottom left; + bo2rder-bottom: 1px dashed red; + cursor: default; +} diff --git a/program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css b/program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css new file mode 100644 index 000000000..aa4a8ea3b --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css @@ -0,0 +1,34 @@ +.mceMsgBox { + border: 1px solid gray; + padding: 8px; +} + +.mceMsgBox span { + vertical-align: top; + color: #555555; +} + +/* Misc */ + +.mceBlockBox { + display: none; + position: absolute; + left: 0; + top: 0; + z-index: 100; + filter:progid:DXImageTransform.Microsoft.Alpha(style=0, opacity=60); + -moz-opacity:0.6; + opacity: 0.6; + background-color: white; +} + +.mceMsgBox { + display: none; + z-index: 101; + position: absolute; + left: 0; + top: 0; + font-family: Arial, Verdana, Tahoma, Helvetica; + font-weight: bold; + font-size: 11px; +} diff --git a/program/js/tiny_mce/plugins/spellchecker/editor_plugin.js b/program/js/tiny_mce/plugins/spellchecker/editor_plugin.js new file mode 100644 index 000000000..dbcda6a56 --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('spellchecker','en,fr,sv,nn,nb');var TinyMCE_SpellCheckerPlugin={_contextMenu:new TinyMCE_Menu(),_menu:new TinyMCE_Menu(),_counter:0,_ajaxPage:'/tinyspell.php',getInfo:function(){return{longname:'Spellchecker',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_spellchecker.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};},handleEvent:function(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var inst=tinyMCE.selectedInstance,args='';var self=TinyMCE_SpellCheckerPlugin;var cm=self._contextMenu;var p,p2,x,y,sx,sy,h,elm;if((e.type=="click"||e.type=="contextmenu")&&elm){do{if(tinyMCE.getAttrib(elm,'class')=="mceItemHiddenSpellWord"){inst.spellCheckerElm=elm;args+='id='+inst.editorId+"|"+(++self._counter);args+='&cmd=suggest&check='+encodeURIComponent(elm.innerHTML);args+='&lang='+escape(inst.spellCheckerLang);elm=inst.spellCheckerElm;p=tinyMCE.getAbsPosition(inst.iframeElement);p2=tinyMCE.getAbsPosition(elm);h=parseInt(elm.offsetHeight);sx=inst.getBody().scrollLeft;sy=inst.getBody().scrollTop;x=p.absLeft+p2.absLeft-sx;y=p.absTop+p2.absTop-sy+h;cm.clear();cm.addTitle(tinyMCE.getLang('lang_spellchecker_wait','',true));cm.show();cm.moveTo(x,y);inst.selection.selectNode(elm,false,false);self._sendAjax(self.baseURL+self._ajaxPage,self._ajaxResponse,'post',args);tinyMCE.cancelEvent(e);return false;}}while((elm=elm.parentNode));}return true;},initInstance:function(inst){var self=TinyMCE_SpellCheckerPlugin,m=self._menu,cm=self._contextMenu,e;tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/spellchecker/css/content.css");if(!tinyMCE.hasMenu('spellcheckercontextmenu')){tinyMCE.importCSS(document,tinyMCE.baseURL+"/plugins/spellchecker/css/spellchecker.css");cm.init({drop_menu:false});tinyMCE.addMenu('spellcheckercontextmenu',cm);}if(!tinyMCE.hasMenu('spellcheckermenu')){m.init({});tinyMCE.addMenu('spellcheckermenu',m);}inst.spellCheckerLang='en';self._buildSettingsMenu(inst,null);e=self._getBlockBoxLayer(inst).create('div','mceBlockBox',document.getElementById(inst.editorId+'_parent'));self._getMsgBoxLayer(inst).create('div','mceMsgBox',document.getElementById(inst.editorId+'_parent'));},_getMsgBoxLayer:function(inst){if(!inst.spellCheckerMsgBoxL)inst.spellCheckerMsgBoxL=new TinyMCE_Layer(inst.editorId+'_spellcheckerMsgBox',false);return inst.spellCheckerMsgBoxL;},_getBlockBoxLayer:function(inst){if(!inst.spellCheckerBoxL)inst.spellCheckerBoxL=new TinyMCE_Layer(inst.editorId+'_spellcheckerBlockBox',false);return inst.spellCheckerBoxL;},_buildSettingsMenu:function(inst,lang){var i,ar=tinyMCE.getParam('spellchecker_languages','+English=en').split(','),p;var self=TinyMCE_SpellCheckerPlugin,m=self._menu,c;m.clear();m.addTitle(tinyMCE.getLang('lang_spellchecker_langs','',true));for(i=0;i';h+='';h+='';h+='';}else{if(tinyMCE.isMSIE&&!tinyMCE.isOpera)h+='';else h+='';h+='';h+='';h+='';h+='';}return h;},_menuButtonEvent:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'');},_toggleMenu:function(editor_id,id){var self=TinyMCE_SpellCheckerPlugin;var e=document.getElementById(editor_id+'_spellchecker');var inst=tinyMCE.getInstanceById(editor_id);if(self._menu.isVisible()){tinyMCE.hideMenus();return;}tinyMCE.lastMenuBtnClass=e.className.replace(/\s.*$/,'');tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButtonFocus');self._menu.moveRelativeTo(e,'bl');self._menu.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?0:1,-1);if(tinyMCE.isOpera)self._menu.moveBy(0,-2);self._onMenuEvent(inst,self._menu,'show');self._menu.show();tinyMCE.lastSelectedMenuBtn=editor_id+'_spellchecker';},_onMenuEvent:function(inst,m,n){TinyMCE_SpellCheckerPlugin._buildSettingsMenu(inst,inst.spellCheckerLang);},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),self=TinyMCE_SpellCheckerPlugin,args='',co,bb,mb,nl,i,e;switch(command){case"mceSpellCheck":if(!inst.spellcheckerOn){inst.spellCheckerBookmark=inst.selection.getBookmark();args+='id='+inst.editorId+"|"+(++self._counter);args+='&cmd=spell&check='+encodeURIComponent(self._getWordList(inst.getBody())).replace(/\'/g,'%27');args+='&lang='+escape(inst.spellCheckerLang);co=document.getElementById(inst.editorId+'_parent').firstChild;bb=self._getBlockBoxLayer(inst);bb.moveRelativeTo(co,'tl');bb.resizeTo(co.offsetWidth,co.offsetHeight);bb.show();mb=self._getMsgBoxLayer(inst);e=mb.getElement();e.innerHTML=''+tinyMCE.getLang('lang_spellchecker_swait','',true)+'';mb.show();mb.moveRelativeTo(co,'cc');if(tinyMCE.isMSIE&&!tinyMCE.isOpera){nl=co.getElementsByTagName('select');for(i=0;i?@[\]^_{|}\u201d\u201c');for(i=0;i0)wl[wl.length]=nl[i];}return wl.join(' ');},_removeWords:function(doc,word){var i,c,nl=doc.getElementsByTagName("span");var self=TinyMCE_SpellCheckerPlugin;var inst=tinyMCE.selectedInstance,b=inst?inst.selection.getBookmark():null;word=typeof(word)=='undefined'?null:word;for(i=nl.length-1;i>=0;i--){c=tinyMCE.getAttrib(nl[i],'class');if((c=='mceItemHiddenSpellWord'||c=='mceItemHidden')&&(word==null||nl[i].innerHTML==word))self._removeWord(nl[i]);}if(b)inst.selection.moveToBookmark(b);},_checkDone:function(inst){var self=TinyMCE_SpellCheckerPlugin;var w=self._countWords(inst);if(w==0){self._removeWords(inst.getDoc());inst.spellcheckerOn=false;tinyMCE.switchClass(inst.editorId+'_spellchecker','mceMenuButton');}},_countWords:function(inst){var i,w=0,nl=inst.getDoc().getElementsByTagName("span"),c;var self=TinyMCE_SpellCheckerPlugin;for(i=nl.length-1;i>=0;i--){c=tinyMCE.getAttrib(nl[i],'class');if(c=='mceItemHiddenSpellWord')w++;}return w;},_removeWord:function(e){if(e!=null)tinyMCE.setOuterHTML(e,e.innerHTML);},_markWords:function(doc,n,wl){var i,nv,nn,nl=tinyMCE.getNodeTree(n,new Array(),3);var r1,r2,r3,r4,r5,w='';var re=TinyMCE_SpellCheckerPlugin._getWordSeparators();for(i=0;i0)w+=wl[i]+((i==wl.length-1)?'':'|');}for(i=0;i$1$2');nv=nv.replace(r3,'$1$2');nn=doc.createElement('span');nn.className="mceItemHidden";nn.innerHTML=nv;nl[i].parentNode.replaceChild(nn,nl[i]);}}},_buildMenu:function(sg,max){var i,self=TinyMCE_SpellCheckerPlugin,cm=self._contextMenu;cm.clear();if(sg!=null){cm.addTitle(tinyMCE.getLang('lang_spellchecker_sug','',true));for(i=0;i'; + h += ''; + h += ''; + h += ''; + } else { + if (tinyMCE.isMSIE && !tinyMCE.isOpera) + h += ''; + else + h += ''; + + h += ''; + h += ''; + h += ''; + h += ''; + } + + return h; + }, + + _menuButtonEvent : function(e, o) { + if (o.className == 'mceMenuButtonFocus') + return; + + if (e == 'over') + o.className = o.className + ' mceMenuHover'; + else + o.className = o.className.replace(/\s.*$/, ''); + }, + + _toggleMenu : function(editor_id, id) { + var self = TinyMCE_SpellCheckerPlugin; + var e = document.getElementById(editor_id + '_spellchecker'); + var inst = tinyMCE.getInstanceById(editor_id); + + if (self._menu.isVisible()) { + tinyMCE.hideMenus(); + return; + } + + tinyMCE.lastMenuBtnClass = e.className.replace(/\s.*$/, ''); + tinyMCE.switchClass(editor_id + '_spellchecker', 'mceMenuButtonFocus'); + + self._menu.moveRelativeTo(e, 'bl'); + self._menu.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? 0 : 1, -1); + + if (tinyMCE.isOpera) + self._menu.moveBy(0, -2); + + self._onMenuEvent(inst, self._menu, 'show'); + + self._menu.show(); + + tinyMCE.lastSelectedMenuBtn = editor_id + '_spellchecker'; + }, + + _onMenuEvent : function(inst, m, n) { + TinyMCE_SpellCheckerPlugin._buildSettingsMenu(inst, inst.spellCheckerLang); + }, + + execCommand : function(editor_id, element, command, user_interface, value) { + var inst = tinyMCE.getInstanceById(editor_id), self = TinyMCE_SpellCheckerPlugin, args = '', co, bb, mb, nl, i, e; + + // Handle commands + switch (command) { + case "mceSpellCheck": + if (!inst.spellcheckerOn) { + inst.spellCheckerBookmark = inst.selection.getBookmark(); + + // Setup arguments + args += 'id=' + inst.editorId + "|" + (++self._counter); + args += '&cmd=spell&check=' + encodeURIComponent(self._getWordList(inst.getBody())).replace( /\'/g, '%27' ); + args += '&lang=' + escape(inst.spellCheckerLang); + + co = document.getElementById(inst.editorId + '_parent').firstChild; + bb = self._getBlockBoxLayer(inst); + bb.moveRelativeTo(co, 'tl'); + bb.resizeTo(co.offsetWidth, co.offsetHeight); + bb.show(); + + // Setup message box + mb = self._getMsgBoxLayer(inst); + e = mb.getElement(); + e.innerHTML = '' + tinyMCE.getLang('lang_spellchecker_swait', '', true) + ''; + mb.show(); + mb.moveRelativeTo(co, 'cc'); + + if (tinyMCE.isMSIE && !tinyMCE.isOpera) { + nl = co.getElementsByTagName('select'); + for (i=0; i?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c'); + + for (i=0; i 0) + wl[wl.length] = nl[i]; + } + + return wl.join(' '); + }, + + _removeWords : function(doc, word) { + var i, c, nl = doc.getElementsByTagName("span"); + var self = TinyMCE_SpellCheckerPlugin; + var inst = tinyMCE.selectedInstance, b = inst ? inst.selection.getBookmark() : null; + + word = typeof(word) == 'undefined' ? null : word; + + for (i=nl.length-1; i>=0; i--) { + c = tinyMCE.getAttrib(nl[i], 'class'); + + if ((c == 'mceItemHiddenSpellWord' || c == 'mceItemHidden') && (word == null || nl[i].innerHTML == word)) + self._removeWord(nl[i]); + } + + if (b) + inst.selection.moveToBookmark(b); + }, + + _checkDone : function(inst) { + var self = TinyMCE_SpellCheckerPlugin; + var w = self._countWords(inst); + + if (w == 0) { + self._removeWords(inst.getDoc()); + inst.spellcheckerOn = false; + tinyMCE.switchClass(inst.editorId + '_spellchecker', 'mceMenuButton'); + } + }, + + _countWords : function(inst) { + var i, w = 0, nl = inst.getDoc().getElementsByTagName("span"), c; + var self = TinyMCE_SpellCheckerPlugin; + + for (i=nl.length-1; i>=0; i--) { + c = tinyMCE.getAttrib(nl[i], 'class'); + + if (c == 'mceItemHiddenSpellWord') + w++; + } + + return w; + }, + + _removeWord : function(e) { + if (e != null) + tinyMCE.setOuterHTML(e, e.innerHTML); + }, + + _markWords : function(doc, n, wl) { + var i, nv, nn, nl = tinyMCE.getNodeTree(n, new Array(), 3); + var r1, r2, r3, r4, r5, w = ''; + var re = TinyMCE_SpellCheckerPlugin._getWordSeparators(); + + for (i=0; i 0) + w += wl[i] + ((i == wl.length-1) ? '' : '|'); + } + + for (i=0; i$1$2'); + nv = nv.replace(r3, '$1$2'); + + nn = doc.createElement('span'); + nn.className = "mceItemHidden"; + nn.innerHTML = nv; + + // Remove old text node + nl[i].parentNode.replaceChild(nn, nl[i]); + } + } + }, + + _buildMenu : function(sg, max) { + var i, self = TinyMCE_SpellCheckerPlugin, cm = self._contextMenu; + + cm.clear(); + + if (sg != null) { + cm.addTitle(tinyMCE.getLang('lang_spellchecker_sug', '', true)); + + for (i=0; i'; + die; + } + + // Basic config + $defaultLanguage = $spellCheckerConfig['default.language']; + $defaultMode = $spellCheckerConfig['default.mode']; + + // Normaly not required to configure + $defaultSpelling = $spellCheckerConfig['default.spelling']; + $defaultJargon = $spellCheckerConfig['default.jargon']; + $defaultEncoding = $spellCheckerConfig['default.encoding']; + $outputType = "xml"; // Do not change + + // Get input parameters. + + $check = urldecode($_REQUEST['check']); + $cmd = sanitize($_REQUEST['cmd']); + $lang = sanitize($_REQUEST['lang'], "strict"); + $mode = sanitize($_REQUEST['mode'], "strict"); + $spelling = sanitize($_REQUEST['spelling'], "strict"); + $jargon = sanitize($_REQUEST['jargon'], "strict"); + $encoding = sanitize($_REQUEST['encoding'], "strict"); + $sg = sanitize($_REQUEST['sg'], "bool"); + $words = array(); + + $validRequest = true; + + if (empty($check)) + $validRequest = false; + + if (empty($lang)) + $lang = $defaultLanguage; + + if (empty($mode)) + $mode = $defaultMode; + + if (empty($spelling)) + $spelling = $defaultSpelling; + + if (empty($jargon)) + $jargon = $defaultJargon; + + if (empty($encoding)) + $encoding = $defaultEncoding; + + function sanitize($str, $type="strict") { + switch ($type) { + case "strict": + $str = preg_replace("/[^a-zA-Z0-9_\-]/i", "", $str); + break; + case "loose": + $str = preg_replace("//i", "<", $str); + break; + case "bool": + if ($str == "true" || $str == true) + $str = true; + else + $str = false; + break; + } + + return $str; + } + + $result = array(); + $tinyspell = new $spellCheckerConfig['class']($spellCheckerConfig, $lang, $mode, $spelling, $jargon, $encoding); + + if (count($tinyspell->errorMsg) == 0) { + switch($cmd) { + case "spell": + // Space for non-exec version and \n for the exec version. + $words = preg_split("/ |\n/", $check, -1, PREG_SPLIT_NO_EMPTY); + $result = $tinyspell->checkWords($words); + break; + + case "suggest": + $result = $tinyspell->getSuggestion($check); + break; + + default: + // Just use this for now. + $tinyspell->errorMsg[] = "No command."; + $outputType = $outputType . "error"; + break; + } + } else + $outputType = $outputType . "error"; + + if (!$result) + $result = array(); + + // Output data + switch($outputType) { + case "xml": + header('Content-type: text/xml; charset=utf-8'); + $body = ''; + $body .= "\n"; + + if (count($result) == 0) + $body .= ''; + else + $body .= ''. urlencode(implode(" ", $result)) .''; + + echo $body; + break; + case "xmlerror"; + header('Content-type: text/xml; charset=utf-8'); + $body = ''; + $body .= "\n"; + $body .= 'errorMsg) .'" />'; + echo $body; + break; + case "html": + var_dump($result); + break; + case "htmlerror": + echo "Error"; + break; + } + +?> -- cgit v1.2.3