[ Index ]

PHP Cross Reference of Mambo 4.6.5

[ Variables ]     [ Functions ]     [ Classes ]     [ Constants ]     [ Statistics ]

title

Body

[close]

/mambots/editors/mostlyce/jscripts/tiny_mce/plugins/spellchecker/ -> editor_plugin_src.js (source)

   1  /**

   2   * $Id: editor_plugin_src.js 425 2007-11-21 15:17:39Z spocke $

   3   *

   4   * @author Moxiecode

   5   * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.

   6   */
   7  
   8  (function() {
   9      var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM;
  10  
  11      tinymce.create('tinymce.plugins.SpellcheckerPlugin', {
  12          getInfo : function() {
  13              return {
  14                  longname : 'Spellchecker',
  15                  author : 'Moxiecode Systems AB',
  16                  authorurl : 'http://tinymce.moxiecode.com',
  17                  infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',
  18                  version : "2.0"
  19              };
  20          },
  21  
  22          init : function(ed, url) {
  23              var t = this, cm;
  24  
  25              t.url = url;
  26              t.editor = ed;
  27  
  28              // Register commands

  29              ed.addCommand('mceSpellCheck', function() {
  30                  if (!t.active) {
  31                      ed.setProgressState(1);
  32                      t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) {
  33                          if (r.length > 0) {
  34                              t.active = 1;
  35                              t._markWords(r);
  36                              ed.setProgressState(0);
  37                              ed.nodeChanged();
  38                          } else {
  39                              ed.setProgressState(0);
  40                              ed.windowManager.alert('spellchecker.no_mpell');
  41                          }
  42                      });
  43                  } else
  44                      t._done();
  45              });
  46  
  47              ed.onInit.add(function() {
  48                  ed.dom.loadCSS(url + '/css/content.css');
  49              });
  50  
  51              ed.onClick.add(t._showMenu, t);
  52              ed.onContextMenu.add(t._showMenu, t);
  53              ed.onBeforeGetContent.add(function() {
  54                  if (t.active)
  55                      t._removeWords();
  56              });
  57  
  58              ed.onNodeChange.add(function(ed, cm) {
  59                  cm.setActive('spellchecker', t.active);
  60              });
  61  
  62              ed.onSetContent.add(function() {
  63                  t._done();
  64              });
  65  
  66              ed.onBeforeGetContent.add(function() {
  67                  t._done();
  68              });
  69  
  70              ed.onBeforeExecCommand.add(function(ed, cmd) {
  71                  if (cmd == 'mceFullScreen')
  72                      t._done();
  73              });
  74  
  75              // Find selected language

  76              t.languages = {};
  77              each(ed.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').split(','), function(v) {
  78                  v = v.split('=');
  79  
  80                  if (v[0].indexOf('+') === 0) {
  81                      v[0] = v[0].substring(1);
  82                      t.selectedLang = v[1];
  83                  }
  84  
  85                  t.languages[v[0]] = v[1];
  86              });
  87          },
  88  
  89          createControl : function(n, cm) {
  90              var t = this, c, ed = t.editor;
  91  
  92              if (n == 'spellchecker') {
  93                  c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});
  94  
  95                  c.onRenderMenu.add(function(c, m) {
  96                      m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
  97                      each(t.languages, function(v, k) {
  98                          var o = {icon : 1}, mi;
  99  
 100                          o.onclick = function() {
 101                              mi.setSelected(1);
 102                              t.selectedItem.setSelected(0);
 103                              t.selectedItem = mi;
 104                              t.selectedLang = v;
 105                          };
 106  
 107                          o.title = k;
 108                          mi = m.add(o);
 109                          mi.setSelected(v == t.selectedLang);
 110  
 111                          if (v == t.selectedLang)
 112                              t.selectedItem = mi;
 113                      })
 114                  });
 115  
 116                  return c;
 117              }
 118          },
 119  
 120          // Internal functions

 121  
 122          _walk : function(n, f) {
 123              var d = this.editor.getDoc(), w;
 124  
 125              if (d.createTreeWalker) {
 126                  w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
 127  
 128                  while ((n = w.nextNode()) != null)
 129                      f.call(this, n);
 130              } else
 131                  tinymce.walk(n, f, 'childNodes');
 132          },
 133  
 134          _getSeparators : function() {
 135              var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');
 136  
 137              // Build word separator regexp

 138              for (i=0; i<str.length; i++)
 139                  re += '\\' + str.charAt(i);
 140  
 141              return re;
 142          },
 143  
 144          _getWords : function() {
 145              var ed = this.editor, wl = [], tx = '', lo = {};
 146  
 147              // Get area text

 148              this._walk(ed.getBody(), function(n) {
 149                  if (n.nodeType == 3)
 150                      tx += n.nodeValue + ' ';
 151              });
 152  
 153              // Split words by separator

 154              tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' ');
 155              tx = tinymce.trim(tx.replace(/(\s+)/g, ' '));
 156  
 157              // Build word array and remove duplicates

 158              each(tx.split(' '), function(v) {
 159                  if (!lo[v]) {
 160                      wl.push(v);
 161                      lo[v] = 1;
 162                  }
 163              });
 164  
 165              return wl;
 166          },
 167  
 168          _removeWords : function(w) {
 169              var ed = this.editor, dom = ed.dom, se = ed.selection, b = se.getBookmark();
 170  
 171              each(dom.select('span').reverse(), function(n) {
 172                  if (n && (dom.hasClass(n, 'mceItemHiddenSpellWord') || dom.hasClass(n, 'mceItemHidden'))) {
 173                      if (!w || dom.decode(n.innerHTML) == w)
 174                          dom.remove(n, 1);
 175                  }
 176              });
 177  
 178              se.moveToBookmark(b);
 179          },
 180  
 181          _markWords : function(wl) {
 182              var r1, r2, r3, r4, r5, w = '', ed = this.editor, re = this._getSeparators(), dom = ed.dom, nl = [];
 183              var se = ed.selection, b = se.getBookmark();
 184  
 185              each(wl, function(v) {
 186                  w += (w ? '|' : '') + v;
 187              });
 188  
 189              r1 = new RegExp('([' + re + '])(' + w + ')([' + re + '])', 'g');
 190              r2 = new RegExp('^(' + w + ')', 'g');
 191              r3 = new RegExp('(' + w + ')([' + re + ']?)$', 'g');
 192              r4 = new RegExp('^(' + w + ')([' + re + ']?)$', 'g');
 193              r5 = new RegExp('(' + w + ')([' + re + '])', 'g');
 194  
 195              // Collect all text nodes

 196              this._walk(this.editor.getBody(), function(n) {
 197                  if (n.nodeType == 3) {
 198                      nl.push(n);
 199                  }
 200              });
 201  
 202              // Wrap incorrect words in spans

 203              each(nl, function(n) {
 204                  var v;
 205  
 206                  if (n.nodeType == 3) {
 207                      v = n.nodeValue;
 208  
 209                      if (r1.test(v) || r2.test(v) || r3.test(v) || r4.test(v)) {
 210                          v = dom.encode(v);
 211                          v = v.replace(r5, '<span class="mceItemHiddenSpellWord">$1</span>$2');
 212                          v = v.replace(r3, '<span class="mceItemHiddenSpellWord">$1</span>$2');
 213  
 214                          dom.replace(dom.create('span', {'class' : 'mceItemHidden'}, v), n);
 215                      }
 216                  }
 217              });
 218  
 219              se.moveToBookmark(b);
 220          },
 221  
 222          _showMenu : function(ed, e) {
 223              var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin());
 224  
 225              if (!m) {
 226                  p1 = DOM.getPos(ed.getContentAreaContainer());
 227                  //p2 = DOM.getPos(ed.getContainer());

 228  
 229                  m = ed.controlManager.createDropMenu('spellcheckermenu', {
 230                      offset_x : p1.x,
 231                      offset_y : p1.y,
 232                      'class' : 'noIcons'
 233                  });
 234  
 235                  t._menu = m;
 236              }
 237  
 238              if (dom.hasClass(e.target, 'mceItemHiddenSpellWord')) {
 239                  m.removeAll();
 240                  m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
 241  
 242                  t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(e.target.innerHTML)], function(r) {
 243                      m.removeAll();
 244  
 245                      if (r.length > 0) {
 246                          m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
 247                          each(r, function(v) {
 248                              m.add({title : v, onclick : function() {
 249                                  dom.replace(ed.getDoc().createTextNode(v), e.target);
 250                                  t._checkDone();
 251                              }});
 252                          });
 253  
 254                          m.addSeparator();
 255                      } else
 256                          m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
 257  
 258                      m.add({
 259                          title : 'spellchecker.ignore_word',
 260                          onclick : function() {
 261                              dom.remove(e.target, 1);
 262                              t._checkDone();
 263                          }
 264                      });
 265  
 266                      m.add({
 267                          title : 'spellchecker.ignore_words',
 268                          onclick : function() {
 269                              t._removeWords(dom.decode(e.target.innerHTML));
 270                              t._checkDone();
 271                          }
 272                      });
 273  
 274                      m.update();
 275                  });
 276  
 277                  ed.selection.select(e.target);
 278                  p1 = dom.getPos(e.target);
 279                  m.showMenu(p1.x, p1.y + e.target.offsetHeight - vp.y);
 280  
 281                  return tinymce.dom.Event.cancel(e);
 282              } else
 283                  m.hideMenu();
 284          },
 285  
 286          _checkDone : function() {
 287              var t = this, ed = t.editor, dom = ed.dom, o;
 288  
 289              each(dom.select('span'), function(n) {
 290                  if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) {
 291                      o = true;
 292                      return false;
 293                  }
 294              });
 295  
 296              if (!o)
 297                  t._done();
 298          },
 299  
 300          _done : function() {
 301              var t = this, la = t.active;
 302  
 303              t.active = 0;
 304              t._removeWords();
 305  
 306              if (t._menu)
 307                  t._menu.hideMenu();
 308  
 309              if (la)
 310                  t.editor.nodeChanged();
 311          },
 312  
 313          _sendRPC : function(m, p, cb) {
 314              var t = this, url = t.editor.getParam("spellchecker_rpc_url", this.url+'/rpc.php');
 315  
 316              if (url == '{backend}') {
 317                  alert('Please specify: spellchecker_rpc_url');
 318                  return;
 319              }
 320  
 321              JSONRequest.sendRPC({
 322                  url : url,
 323                  method : m,
 324                  params : p,
 325                  success : cb,
 326                  error : function(e, x) {
 327                      t.editor.setProgressState(0);
 328                      t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText));
 329                  }
 330              });
 331          }
 332      });
 333  
 334      // Register plugin

 335      tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin);
 336  })();