Changeset 5


Ignore:
Timestamp:
02/13/05 07:41:12 (14 years ago)
Author:
gogo
Message:

Changes to improve aspell interaction, add the ability to add words to a personal
dictionary.

A compiled drop-in aspell distribution (for Linux x86) will be made available on the
website which can be just dropped-in.

http://xinha.gogo.co.nz/SpellChecker

Location:
trunk/plugins/SpellChecker
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/plugins/SpellChecker/lang/en.js

    r1 r5  
    1414 
    1515SpellChecker.I18N = { 
    16         "CONFIRM_LINK_CLICK"                    : "Please confirm that you want to open this link", 
    17         "Cancel"                                : "Cancel", 
    18         "Dictionary"                            : "Dictionary", 
    19         "Finished list of mispelled words"      : "Finished list of mispelled words", 
    20         "I will open it in a new page."         : "I will open it in a new page.", 
    21         "Ignore all"                            : "Ignore all", 
    22         "Ignore"                                : "Ignore", 
    23         "NO_ERRORS"                             : "No mispelled words found with the selected dictionary.", 
    24         "NO_ERRORS_CLOSING"                     : "Spell check complete, didn't find any mispelled words.  Closing now...", 
    25         "OK"                                    : "OK", 
    26         "Original word"                         : "Original word", 
    27         "Please wait.  Calling spell checker."  : "Please wait.  Calling spell checker.", 
    28         "Please wait: changing dictionary to"   : "Please wait: changing dictionary to", 
    29         "QUIT_CONFIRMATION"                     : "This will drop changes and quit spell checker.  Please confirm.", 
    30         "Re-check"                              : "Re-check", 
    31         "Replace all"                           : "Replace all", 
    32         "Replace with"                          : "Replace with", 
    33         "Replace"                               : "Replace", 
    34         "Revert"                                : "Revert", 
    35         "SC-spell-check"                        : "Spell-check", 
    36         "Suggestions"                           : "Suggestions", 
    37         "pliz weit ;-)"                         : "pliz weit ;-)" 
     16  "CONFIRM_LINK_CLICK"                    : "Please confirm that you want to open this link", 
     17  "Cancel"                                : "Cancel", 
     18  "Dictionary"                            : "Dictionary", 
     19  "Finished list of mispelled words"      : "Finished list of mispelled words", 
     20  "I will open it in a new page."         : "I will open it in a new page.", 
     21  "Ignore all"                            : "Ignore all", 
     22  "Ignore"                                : "Ignore", 
     23  "NO_ERRORS"                             : "No mispelled words found with the selected dictionary.", 
     24  "NO_ERRORS_CLOSING"                     : "Spell check complete, didn't find any mispelled words.  Closing now...", 
     25  "OK"                                    : "OK", 
     26  "Original word"                         : "Original word", 
     27  "Please wait.  Calling spell checker."  : "Please wait.  Calling spell checker.", 
     28  "Please wait: changing dictionary to"   : "Please wait: changing dictionary to", 
     29  "QUIT_CONFIRMATION"                     : "This will drop changes and quit spell checker.  Please confirm.", 
     30  "Re-check"                              : "Re-check", 
     31  "Replace all"                           : "Replace all", 
     32  "Replace with"                          : "Replace with", 
     33  "Replace"                               : "Replace", 
     34  "Revert"                                : "Revert", 
     35  "SC-spell-check"                        : "Spell-check", 
     36  "Suggestions"                           : "Suggestions", 
     37  "pliz weit ;-)"                         : "One moment..." 
    3838}; 
  • trunk/plugins/SpellChecker/spell-check-ui.html

    r1 r5  
    1010   Sponsored by www.americanbible.org 
    1111   Implementation by Mihai Bazon, http://dynarch.com/mishoo/ 
    12    
     12 
    1313   (c) dynarch.com 2003. 
    1414   Distributed under the same terms as HTMLArea itself. 
     
    9494                id="b_ignore">Ignore</button><button 
    9595                id="b_ignall">Ignore all</button> 
     96                <button 
     97                id="b_learn">Learn</button> 
    9698            </div> 
    9799          </div> 
  • trunk/plugins/SpellChecker/spell-check-ui.js

    r1 r5  
    1414 
    1515var HTMLArea = window.opener.HTMLArea; 
     16var _editor_url = window.opener._editor_url; 
     17 
    1618var is_ie = HTMLArea.is_ie; 
    1719var editor = SpellChecker.editor; 
     
    2426var suggested_words = {}; 
    2527 
     28var to_p_dict = []; // List of words to add to personal dictionary. 
     29var to_r_list = []; // List of words to add to replacement list. 
     30 
    2631function makeCleanDoc(leaveFixed) { 
    27         // document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML'; 
    28         var words = wrongWords.concat(fixedWords); 
    29         for (var i = words.length; --i >= 0;) { 
    30                 var el = words[i]; 
    31                 if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) { 
    32                         el.parentNode.insertBefore(el.firstChild, el); 
    33                         el.parentNode.removeChild(el); 
    34                 } else 
    35                         el.className = "HA-spellcheck-fixed"; 
    36         } 
    37         // we should use innerHTML here, but IE6's implementation fucks up the 
    38         // HTML to such extent that our poor Perl parser doesn't understand it 
    39         // anymore. 
    40         return window.opener.HTMLArea.getHTML(frame.contentWindow.document.body, false, editor); 
     32  // document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML'; 
     33  var words = wrongWords.concat(fixedWords); 
     34  for (var i = words.length; --i >= 0;) { 
     35    var el = words[i]; 
     36    if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) { 
     37      el.parentNode.insertBefore(el.firstChild, el); 
     38      el.parentNode.removeChild(el); 
     39    } else 
     40      el.className = "HA-spellcheck-fixed"; 
     41  } 
     42  // we should use innerHTML here, but IE6's implementation fucks up the 
     43  // HTML to such extent that our poor Perl parser doesn't understand it 
     44  // anymore. 
     45  return window.opener.HTMLArea.getHTML(frame.contentWindow.document.body, false, editor); 
    4146}; 
    4247 
    4348function recheckClicked() { 
    44         document.getElementById("status").innerHTML = i18n["Please wait: changing dictionary to"] + ': "' + document.getElementById("f_dictionary").value + '".'; 
    45         var field = document.getElementById("f_content"); 
    46         field.value = makeCleanDoc(true); 
    47         field.form.submit(); 
     49  document.getElementById("status").innerHTML = i18n["Please wait: changing dictionary to"] + ': "' + document.getElementById("f_dictionary").value + '".'; 
     50  var field = document.getElementById("f_content"); 
     51  field.value = makeCleanDoc(true); 
     52  field.form.submit(); 
    4853}; 
    4954 
    5055function saveClicked() { 
    51         if (modified) { 
    52                 editor.setHTML(makeCleanDoc(false)); 
    53         } 
    54         window.close(); 
    55         return false; 
     56  if (modified) { 
     57    editor.setHTML(makeCleanDoc(false)); 
     58  } 
     59 
     60  if(to_p_dict.length || to_r_list.length && editor.config.SpellChecker.backend == 'php') 
     61  { 
     62    var data = {}; 
     63    for(var i = 0;i < to_p_dict.length;i++) 
     64    { 
     65      data['to_p_dict[' + i + ']'] = to_p_dict[i]; 
     66    } 
     67    for(var i = 0;i < to_r_list.length;i++) 
     68    { 
     69      data['to_r_list[' + i + '][0]'] = to_r_list[i][0]; 
     70      data['to_r_list[' + i + '][1]'] = to_r_list[i][1]; 
     71    } 
     72    // var win = window; 
     73    window.opener.HTMLArea._postback(_editor_url + '/plugins/SpellChecker/spell-check-savedicts.php', data); 
     74    window.close(); 
     75  } 
     76  else 
     77  { 
     78    window.close(); 
     79  } 
     80  return false; 
    5681}; 
    5782 
    5883function cancelClicked() { 
    59         var ok = true; 
    60         if (modified) { 
    61                 ok = confirm(i18n["QUIT_CONFIRMATION"]); 
    62         } 
    63         if (ok) { 
    64                 window.close(); 
    65         } 
    66         return false; 
     84  var ok = true; 
     85  if (modified) { 
     86    ok = confirm(i18n["QUIT_CONFIRMATION"]); 
     87  } 
     88  if (ok) { 
     89    window.close(); 
     90  } 
     91  return false; 
    6792}; 
    6893 
    6994function replaceWord(el) { 
    70         var replacement = document.getElementById("v_replacement").value; 
    71         var this_word_modified = (el.innerHTML != replacement); 
    72         if (this_word_modified) 
    73                 modified = true; 
    74         if (el) { 
    75                 el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " "); 
    76         } 
    77         el.className += " HA-spellcheck-fixed"; 
    78         el.__msh_fixed = true; 
    79         if (!this_word_modified) { 
    80                 return false; 
    81         } 
    82         el.innerHTML = replacement; 
     95  var replacement = document.getElementById("v_replacement").value; 
     96  var this_word_modified = (el.innerHTML != replacement); 
     97  if (this_word_modified) 
     98    modified = true; 
     99  if (el) { 
     100    el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " "); 
     101  } 
     102  el.className += " HA-spellcheck-fixed"; 
     103  el.__msh_fixed = true; 
     104  if (!this_word_modified) { 
     105    return false; 
     106  } 
     107  to_r_list.push([el.innerHTML, replacement]); 
     108  el.innerHTML = replacement; 
    83109}; 
    84110 
    85111function replaceClicked() { 
    86         replaceWord(currentElement); 
    87         var start = currentElement.__msh_id; 
    88         var index = start; 
    89         do { 
    90                 ++index; 
    91                 if (index == wrongWords.length) { 
    92                         index = 0; 
    93                 } 
    94         } while ((index != start) && wrongWords[index].__msh_fixed); 
    95         if (index == start) { 
    96                 index = 0; 
    97                 alert(i18n["Finished list of mispelled words"]); 
    98         } 
    99         wrongWords[index].__msh_wordClicked(true); 
    100         return false; 
     112  replaceWord(currentElement); 
     113  var start = currentElement.__msh_id; 
     114  var index = start; 
     115  do { 
     116    ++index; 
     117    if (index == wrongWords.length) { 
     118      index = 0; 
     119    } 
     120  } while ((index != start) && wrongWords[index].__msh_fixed); 
     121  if (index == start) { 
     122    index = 0; 
     123    alert(i18n["Finished list of mispelled words"]); 
     124  } 
     125  wrongWords[index].__msh_wordClicked(true); 
     126  return false; 
    101127}; 
    102128 
    103129function revertClicked() { 
    104         document.getElementById("v_replacement").value = currentElement.__msh_origWord; 
    105         replaceWord(currentElement); 
    106         currentElement.className = "HA-spellcheck-error HA-spellcheck-current"; 
    107         return false; 
     130  document.getElementById("v_replacement").value = currentElement.__msh_origWord; 
     131  replaceWord(currentElement); 
     132  currentElement.className = "HA-spellcheck-error HA-spellcheck-current"; 
     133  return false; 
    108134}; 
    109135 
    110136function replaceAllClicked() { 
    111         var replacement = document.getElementById("v_replacement").value; 
    112         var ok = true; 
    113         var spans = allWords[currentElement.__msh_origWord]; 
    114         if (spans.length == 0) { 
    115                 alert("An impossible condition just happened.  Call FBI.  ;-)"); 
    116         } else if (spans.length == 1) { 
    117                 replaceClicked(); 
    118                 return false; 
    119         } 
    120         /* 
    121         var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n"; 
    122         if (replacement == currentElement.__msh_origWord) { 
    123                 ok = confirm(message + "Ignore all occurrences?"); 
    124         } else { 
    125                 ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?"); 
    126         } 
    127         */ 
    128         if (ok) { 
    129                 for (var i = 0; i < spans.length; ++i) { 
    130                         if (spans[i] != currentElement) { 
    131                                 replaceWord(spans[i]); 
    132                         } 
    133                 } 
    134                 // replace current element the last, so that we jump to the next word ;-) 
    135                 replaceClicked(); 
    136         } 
    137         return false; 
     137  var replacement = document.getElementById("v_replacement").value; 
     138  var ok = true; 
     139  var spans = allWords[currentElement.__msh_origWord]; 
     140  if (spans.length == 0) { 
     141    alert("An impossible condition just happened.  Call FBI.  ;-)"); 
     142  } else if (spans.length == 1) { 
     143    replaceClicked(); 
     144    return false; 
     145  } 
     146  /* 
     147  var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n"; 
     148  if (replacement == currentElement.__msh_origWord) { 
     149    ok = confirm(message + "Ignore all occurrences?"); 
     150  } else { 
     151    ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?"); 
     152  } 
     153  */ 
     154  if (ok) { 
     155    for (var i = 0; i < spans.length; ++i) { 
     156      if (spans[i] != currentElement) { 
     157        replaceWord(spans[i]); 
     158      } 
     159    } 
     160    // replace current element the last, so that we jump to the next word ;-) 
     161    replaceClicked(); 
     162  } 
     163  return false; 
    138164}; 
    139165 
    140166function ignoreClicked() { 
    141         document.getElementById("v_replacement").value = currentElement.__msh_origWord; 
    142         replaceClicked(); 
    143         return false; 
     167  document.getElementById("v_replacement").value = currentElement.__msh_origWord; 
     168  replaceClicked(); 
     169  return false; 
    144170}; 
    145171 
    146172function ignoreAllClicked() { 
    147         document.getElementById("v_replacement").value = currentElement.__msh_origWord; 
    148         replaceAllClicked(); 
    149         return false; 
     173  document.getElementById("v_replacement").value = currentElement.__msh_origWord; 
     174  replaceAllClicked(); 
     175  return false; 
    150176}; 
    151177 
    152178function learnClicked() { 
    153         alert("Not [yet] implemented"); 
    154         return false; 
     179  to_p_dict.push(currentElement.__msh_origWord); 
     180  return ignoreAllClicked(); 
    155181}; 
    156182 
    157183function internationalizeWindow() { 
    158         var types = ["div", "span", "button"]; 
    159         for (var i = 0; i < types.length; ++i) { 
    160                 var tag = types[i]; 
    161                 var els = document.getElementsByTagName(tag); 
    162                 for (var j = els.length; --j >= 0;) { 
    163                         var el = els[j]; 
    164                         if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) { 
    165                                 var txt = el.innerHTML; 
    166                                 if (typeof i18n[txt] != "undefined") { 
    167                                         el.innerHTML = i18n[txt]; 
    168                                 } 
    169                         } 
    170                 } 
    171         } 
     184  var types = ["div", "span", "button"]; 
     185  for (var i = 0; i < types.length; ++i) { 
     186    var tag = types[i]; 
     187    var els = document.getElementsByTagName(tag); 
     188    for (var j = els.length; --j >= 0;) { 
     189      var el = els[j]; 
     190      if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) { 
     191        var txt = el.innerHTML; 
     192        if (typeof i18n[txt] != "undefined") { 
     193          el.innerHTML = i18n[txt]; 
     194        } 
     195      } 
     196    } 
     197  } 
    172198}; 
    173199 
    174200function initDocument() { 
    175         internationalizeWindow(); 
    176         modified = false; 
    177         frame = document.getElementById("i_framecontent"); 
    178         var field = document.getElementById("f_content"); 
    179         field.value = HTMLArea.getHTML(editor._doc.body, false, editor); 
    180         field.form.submit(); 
    181         document.getElementById("f_init").value = "0"; 
    182  
    183         // assign some global event handlers 
    184  
    185         var select = document.getElementById("v_suggestions"); 
    186         select.onchange = function() { 
    187                 document.getElementById("v_replacement").value = this.value; 
    188         }; 
    189         if (is_ie) { 
    190                 select.attachEvent("ondblclick", replaceClicked); 
    191         } else { 
    192                 select.addEventListener("dblclick", replaceClicked, true); 
    193         } 
    194  
    195         document.getElementById("b_replace").onclick = replaceClicked; 
    196         // document.getElementById("b_learn").onclick = learnClicked; 
    197         document.getElementById("b_replall").onclick = replaceAllClicked; 
    198         document.getElementById("b_ignore").onclick = ignoreClicked; 
    199         document.getElementById("b_ignall").onclick = ignoreAllClicked; 
    200         document.getElementById("b_recheck").onclick = recheckClicked; 
    201         document.getElementById("b_revert").onclick = revertClicked; 
    202         document.getElementById("b_info").onclick = displayInfo; 
    203  
    204         document.getElementById("b_ok").onclick = saveClicked; 
    205         document.getElementById("b_cancel").onclick = cancelClicked; 
    206  
    207         select = document.getElementById("v_dictionaries"); 
    208         select.onchange = function() { 
    209                 document.getElementById("f_dictionary").value = this.value; 
    210         }; 
     201  internationalizeWindow(); 
     202  modified = false; 
     203  frame = document.getElementById("i_framecontent"); 
     204  var field = document.getElementById("f_content"); 
     205  field.value = HTMLArea.getHTML(editor._doc.body, false, editor); 
     206 
     207  if(editor.config.SpellChecker.backend == 'php') 
     208  { 
     209    field.form.action = _editor_url + '/plugins/SpellChecker/spell-check-logic.php'; 
     210  } 
     211 
     212  field.form.submit(); 
     213  document.getElementById("f_init").value = "0"; 
     214 
     215  // assign some global event handlers 
     216 
     217  var select = document.getElementById("v_suggestions"); 
     218  select.onchange = function() { 
     219    document.getElementById("v_replacement").value = this.value; 
     220  }; 
     221  if (is_ie) { 
     222    select.attachEvent("ondblclick", replaceClicked); 
     223  } else { 
     224    select.addEventListener("dblclick", replaceClicked, true); 
     225  } 
     226 
     227  document.getElementById("b_replace").onclick = replaceClicked; 
     228  if(editor.config.SpellChecker.backend == 'php') 
     229  { 
     230    document.getElementById("b_learn").onclick = learnClicked; 
     231  } 
     232  else 
     233  { 
     234    document.getElementById("b_learn").parent.removeChild(document.getElementById("b_learn")); 
     235  } 
     236  document.getElementById("b_replall").onclick = replaceAllClicked; 
     237  document.getElementById("b_ignore").onclick = ignoreClicked; 
     238  document.getElementById("b_ignall").onclick = ignoreAllClicked; 
     239  document.getElementById("b_recheck").onclick = recheckClicked; 
     240  document.getElementById("b_revert").onclick = revertClicked; 
     241  document.getElementById("b_info").onclick = displayInfo; 
     242 
     243  document.getElementById("b_ok").onclick = saveClicked; 
     244  document.getElementById("b_cancel").onclick = cancelClicked; 
     245 
     246  select = document.getElementById("v_dictionaries"); 
     247  select.onchange = function() { 
     248    document.getElementById("f_dictionary").value = this.value; 
     249  }; 
    211250}; 
    212251 
    213252function getAbsolutePos(el) { 
    214         var r = { x: el.offsetLeft, y: el.offsetTop }; 
    215         if (el.offsetParent) { 
    216                 var tmp = getAbsolutePos(el.offsetParent); 
    217                 r.x += tmp.x; 
    218                 r.y += tmp.y; 
    219         } 
    220         return r; 
     253  var r = { x: el.offsetLeft, y: el.offsetTop }; 
     254  if (el.offsetParent) { 
     255    var tmp = getAbsolutePos(el.offsetParent); 
     256    r.x += tmp.x; 
     257    r.y += tmp.y; 
     258  } 
     259  return r; 
    221260}; 
    222261 
    223262function wordClicked(scroll) { 
    224         var self = this; 
    225         if (scroll) (function() { 
    226                 var pos = getAbsolutePos(self); 
    227                 var ws = { x: frame.offsetWidth - 4, 
    228                            y: frame.offsetHeight - 4 }; 
    229                 var wp = { x: frame.contentWindow.document.body.scrollLeft, 
    230                            y: frame.contentWindow.document.body.scrollTop }; 
    231                 pos.x -= Math.round(ws.x/2); 
    232                 if (pos.x < 0) pos.x = 0; 
    233                 pos.y -= Math.round(ws.y/2); 
    234                 if (pos.y < 0) pos.y = 0; 
    235                 frame.contentWindow.scrollTo(pos.x, pos.y); 
    236         })(); 
    237         if (currentElement) { 
    238                 var a = allWords[currentElement.__msh_origWord]; 
    239                 currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " "); 
    240                 for (var i = 0; i < a.length; ++i) { 
    241                         var el = a[i]; 
    242                         if (el != currentElement) { 
    243                                 el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " "); 
    244                         } 
    245                 } 
    246         } 
    247         currentElement = this; 
    248         this.className += " HA-spellcheck-current"; 
    249         var a = allWords[currentElement.__msh_origWord]; 
    250         for (var i = 0; i < a.length; ++i) { 
    251                 var el = a[i]; 
    252                 if (el != currentElement) { 
    253                         el.className += " HA-spellcheck-same"; 
    254                 } 
    255         } 
    256         // document.getElementById("b_replall").disabled = (a.length <= 1); 
    257         // document.getElementById("b_ignall").disabled = (a.length <= 1); 
    258         var txt; 
    259         if (a.length == 1) { 
    260                 txt = "one occurrence"; 
    261         } else if (a.length == 2) { 
    262                 txt = "two occurrences"; 
    263         } else { 
    264                 txt = a.length + " occurrences"; 
    265         } 
    266         var suggestions = suggested_words[this.__msh_origWord]; 
    267         if (suggestions) 
    268                 suggestions = suggestions.split(/,/); 
    269         else 
    270                 suggestions = []; 
    271         var select = document.getElementById("v_suggestions"); 
    272         document.getElementById("statusbar").innerHTML = "Found " + txt + 
    273                 ' for word "<b>' + currentElement.__msh_origWord + '</b>"'; 
    274         for (var i = select.length; --i >= 0;) { 
    275                 select.remove(i); 
    276         } 
    277         for (var i = 0; i < suggestions.length; ++i) { 
    278                 var txt = suggestions[i]; 
    279                 var option = document.createElement("option"); 
    280                 option.value = txt; 
    281                 option.appendChild(document.createTextNode(txt)); 
    282                 select.appendChild(option); 
    283         } 
    284         document.getElementById("v_currentWord").innerHTML = this.__msh_origWord; 
    285         if (suggestions.length > 0) { 
    286                 select.selectedIndex = 0; 
    287                 select.onchange(); 
    288         } else { 
    289                 document.getElementById("v_replacement").value = this.innerHTML; 
    290         } 
    291         select.style.display = "none"; 
    292         select.style.display = "block"; 
    293         return false; 
     263  var self = this; 
     264  if (scroll) (function() { 
     265    var pos = getAbsolutePos(self); 
     266    var ws = { x: frame.offsetWidth - 4, 
     267         y: frame.offsetHeight - 4 }; 
     268    var wp = { x: frame.contentWindow.document.body.scrollLeft, 
     269         y: frame.contentWindow.document.body.scrollTop }; 
     270    pos.x -= Math.round(ws.x/2); 
     271    if (pos.x < 0) pos.x = 0; 
     272    pos.y -= Math.round(ws.y/2); 
     273    if (pos.y < 0) pos.y = 0; 
     274    frame.contentWindow.scrollTo(pos.x, pos.y); 
     275  })(); 
     276  if (currentElement) { 
     277    var a = allWords[currentElement.__msh_origWord]; 
     278    currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " "); 
     279    for (var i = 0; i < a.length; ++i) { 
     280      var el = a[i]; 
     281      if (el != currentElement) { 
     282        el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " "); 
     283      } 
     284    } 
     285  } 
     286  currentElement = this; 
     287  this.className += " HA-spellcheck-current"; 
     288  var a = allWords[currentElement.__msh_origWord]; 
     289  for (var i = 0; i < a.length; ++i) { 
     290    var el = a[i]; 
     291    if (el != currentElement) { 
     292      el.className += " HA-spellcheck-same"; 
     293    } 
     294  } 
     295  // document.getElementById("b_replall").disabled = (a.length <= 1); 
     296  // document.getElementById("b_ignall").disabled = (a.length <= 1); 
     297  var txt; 
     298  if (a.length == 1) { 
     299    txt = "one occurrence"; 
     300  } else if (a.length == 2) { 
     301    txt = "two occurrences"; 
     302  } else { 
     303    txt = a.length + " occurrences"; 
     304  } 
     305  var suggestions = suggested_words[this.__msh_origWord]; 
     306  if (suggestions) 
     307    suggestions = suggestions.split(/,/); 
     308  else 
     309    suggestions = []; 
     310  var select = document.getElementById("v_suggestions"); 
     311  document.getElementById("statusbar").innerHTML = "Found " + txt + 
     312    ' for word "<b>' + currentElement.__msh_origWord + '</b>"'; 
     313  for (var i = select.length; --i >= 0;) { 
     314    select.remove(i); 
     315  } 
     316  for (var i = 0; i < suggestions.length; ++i) { 
     317    var txt = suggestions[i]; 
     318    var option = document.createElement("option"); 
     319    option.value = txt; 
     320    option.appendChild(document.createTextNode(txt)); 
     321    select.appendChild(option); 
     322  } 
     323  document.getElementById("v_currentWord").innerHTML = this.__msh_origWord; 
     324  if (suggestions.length > 0) { 
     325    select.selectedIndex = 0; 
     326    select.onchange(); 
     327  } else { 
     328    document.getElementById("v_replacement").value = this.innerHTML; 
     329  } 
     330  select.style.display = "none"; 
     331  select.style.display = "block"; 
     332  return false; 
    294333}; 
    295334 
    296335function wordMouseOver() { 
    297         this.className += " HA-spellcheck-hover"; 
     336  this.className += " HA-spellcheck-hover"; 
    298337}; 
    299338 
    300339function wordMouseOut() { 
    301         this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " "); 
     340  this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " "); 
    302341}; 
    303342 
    304343function displayInfo() { 
    305         var info = frame.contentWindow.spellcheck_info; 
    306         if (!info) 
    307                 alert("No information available"); 
    308         else { 
    309                 var txt = "** Document information **"; 
    310                 for (var i in info) { 
    311                         txt += "\n" + i + " : " + info[i]; 
    312                 } 
    313                 alert(txt); 
    314         } 
    315         return false; 
     344  var info = frame.contentWindow.spellcheck_info; 
     345  if (!info) 
     346    alert("No information available"); 
     347  else { 
     348    var txt = "** Document information **"; 
     349    for (var i in info) { 
     350      txt += "\n" + i + " : " + info[i]; 
     351    } 
     352    alert(txt); 
     353  } 
     354  return false; 
    316355}; 
    317356 
    318357function finishedSpellChecking() { 
    319         // initialization of global variables 
    320         currentElement = null; 
    321         wrongWords = null; 
    322         allWords = {}; 
    323         fixedWords = []; 
    324         suggested_words = frame.contentWindow.suggested_words; 
    325  
    326         document.getElementById("status").innerHTML = "HTMLArea Spell Checker (<a href='readme-tech.html' target='_blank' title='Technical information'>info</a>)"; 
    327         var doc = frame.contentWindow.document; 
     358  // initialization of global variables 
     359  currentElement = null; 
     360  wrongWords = null; 
     361  allWords = {}; 
     362  fixedWords = []; 
     363  suggested_words = frame.contentWindow.suggested_words; 
     364 
     365  document.getElementById("status").innerHTML = "HTMLArea Spell Checker (<a href='readme-tech.html' target='_blank' title='Technical information'>info</a>)"; 
     366  var doc = frame.contentWindow.document; 
    328367        var spans = doc.getElementsByTagName("span"); 
    329368        var sps = []; 
    330         var id = 0; 
     369  var id = 0; 
    331370        for (var i = 0; i < spans.length; ++i) { 
    332371                var el = spans[i]; 
    333372                if (/HA-spellcheck-error/.test(el.className)) { 
    334373                        sps.push(el); 
    335                         el.__msh_wordClicked = wordClicked; 
    336                         el.onclick = function(ev) { 
    337                                 ev || (ev = window.event); 
    338                                 ev && HTMLArea._stopEvent(ev); 
    339                                 return this.__msh_wordClicked(false); 
    340                         }; 
    341                         el.onmouseover = wordMouseOver; 
    342                         el.onmouseout = wordMouseOut; 
    343                         el.__msh_id = id++; 
    344                         var txt = (el.__msh_origWord = el.firstChild.data); 
    345                         el.__msh_fixed = false; 
    346                         if (typeof allWords[txt] == "undefined") { 
    347                                 allWords[txt] = [el]; 
    348                         } else { 
    349                                 allWords[txt].push(el); 
    350                         } 
     374      el.__msh_wordClicked = wordClicked; 
     375      el.onclick = function(ev) { 
     376        ev || (ev = window.event); 
     377        ev && HTMLArea._stopEvent(ev); 
     378        return this.__msh_wordClicked(false); 
     379      }; 
     380      el.onmouseover = wordMouseOver; 
     381      el.onmouseout = wordMouseOut; 
     382      el.__msh_id = id++; 
     383      var txt = (el.__msh_origWord = el.firstChild.data); 
     384      el.__msh_fixed = false; 
     385      if (typeof allWords[txt] == "undefined") { 
     386        allWords[txt] = [el]; 
     387      } else { 
     388        allWords[txt].push(el); 
     389      } 
    351390                } else if (/HA-spellcheck-fixed/.test(el.className)) { 
    352                         fixedWords.push(el); 
    353                 } 
     391      fixedWords.push(el); 
     392    } 
    354393        } 
    355         wrongWords = sps; 
    356         if (sps.length == 0) { 
    357                 if (!modified) { 
    358                         alert(i18n["NO_ERRORS_CLOSING"]); 
    359                         window.close(); 
    360                 } else { 
    361                         alert(i18n["NO_ERRORS"]); 
    362                 } 
    363                 return false; 
    364         } 
    365         (currentElement = sps[0]).__msh_wordClicked(true); 
    366         var as = doc.getElementsByTagName("a"); 
    367         for (var i = as.length; --i >= 0;) { 
    368                 var a = as[i]; 
    369                 a.onclick = function() { 
    370                         if (confirm(i18n["CONFIRM_LINK_CLICK"] + ":\n" + 
    371                                     this.href + "\n" + i18n["I will open it in a new page."])) { 
    372                                 window.open(this.href); 
    373                         } 
    374                         return false; 
    375                 }; 
    376         } 
    377         var dicts = doc.getElementById("HA-spellcheck-dictionaries"); 
    378         if (dicts) { 
    379                 dicts.parentNode.removeChild(dicts); 
    380                 dicts = dicts.innerHTML.split(/,/); 
    381                 var select = document.getElementById("v_dictionaries"); 
    382                 for (var i = select.length; --i >= 0;) { 
    383                         select.remove(i); 
    384                 } 
    385                 for (var i = 0; i < dicts.length; ++i) { 
    386                         var txt = dicts[i]; 
    387                         var option = document.createElement("option"); 
    388                         if (/^@(.*)$/.test(txt)) { 
    389                                 txt = RegExp.$1; 
    390                                 option.selected = true; 
    391                         } 
    392                         option.value = txt; 
    393                         option.appendChild(document.createTextNode(txt)); 
    394                         select.appendChild(option); 
    395                 } 
    396         } 
    397 }; 
     394  wrongWords = sps; 
     395  if (sps.length == 0) { 
     396    if (!modified) { 
     397      alert(i18n["NO_ERRORS"]); 
     398      // window.close(); 
     399    } else { 
     400      alert(i18n["NO_ERRORS"]); 
     401    } 
     402    return false; 
     403  } 
     404  (currentElement = sps[0]).__msh_wordClicked(true); 
     405  var as = doc.getElementsByTagName("a"); 
     406  for (var i = as.length; --i >= 0;) { 
     407    var a = as[i]; 
     408    a.onclick = function() { 
     409      if (confirm(i18n["CONFIRM_LINK_CLICK"] + ":\n" + 
     410            this.href + "\n" + i18n["I will open it in a new page."])) { 
     411        window.open(this.href); 
     412      } 
     413      return false; 
     414    }; 
     415  } 
     416  var dicts = doc.getElementById("HA-spellcheck-dictionaries"); 
     417  if (dicts) { 
     418    dicts.parentNode.removeChild(dicts); 
     419    dicts = dicts.innerHTML.split(/,/); 
     420    var select = document.getElementById("v_dictionaries"); 
     421    for (var i = select.length; --i >= 0;) { 
     422      select.remove(i); 
     423    } 
     424    for (var i = 0; i < dicts.length; ++i) { 
     425      var txt = dicts[i]; 
     426      var option = document.createElement("option"); 
     427      if (/^@(.*)$/.test(txt)) { 
     428        txt = RegExp.$1; 
     429        option.selected = true; 
     430      } 
     431      option.value = txt; 
     432      option.appendChild(document.createTextNode(txt)); 
     433      select.appendChild(option); 
     434    } 
     435  } 
     436}; 
  • trunk/plugins/SpellChecker/spell-checker.js

    r1 r5  
    99// $Id: spell-checker.js,v 1.8 2004/07/13 15:19:51 mishoo Exp $ 
    1010 
     11HTMLArea.Config.prototype.SpellChecker = { 'backend': 'php', 'personalFilesDir' : '' }; 
     12 
    1113function SpellChecker(editor) { 
    12         this.editor = editor; 
     14  this.editor = editor; 
    1315 
    14         var cfg = editor.config; 
    15         var tt = SpellChecker.I18N; 
    16         var bl = SpellChecker.btnList; 
    17         var self = this; 
     16  var cfg = editor.config; 
     17  var tt = SpellChecker.I18N; 
     18  var bl = SpellChecker.btnList; 
     19  var self = this; 
    1820 
    19         // register the toolbar buttons provided by this plugin 
    20         var toolbar = []; 
    21         for (var i = 0; i < bl.length; ++i) { 
    22                 var btn = bl[i]; 
    23                 if (!btn) { 
    24                         toolbar.push("separator"); 
    25                 } else { 
    26                         var id = "SC-" + btn[0]; 
    27                         cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "SpellChecker"), false, 
    28                                            function(editor, id) { 
    29                                                    // dispatch button press event 
    30                                                    self.buttonPress(editor, id); 
    31                                            }, btn[1]); 
    32                         toolbar.push(id); 
    33                 } 
    34         } 
     21  // see if we can find the mode switch button, insert this before that 
     22  var id = "SC-spell-check"; 
     23  cfg.registerButton(id, tt[id], editor.imgURL("spell-check.gif", "SpellChecker"), false, 
     24             function(editor, id) { 
     25               // dispatch button press event 
     26               self.buttonPress(editor, id); 
     27             }); 
    3528 
    36         for (var i = 0; i < toolbar.length; ++i) { 
    37                 cfg.toolbar[0].push(toolbar[i]); 
    38         } 
     29  var done = false; 
     30  for(var i = 0; i < cfg.toolbar.length; i++) 
     31  { 
     32    if(cfg.toolbar[i].contains('htmlmode')) 
     33    { 
     34      var j = cfg.toolbar[i].indexOf('htmlmode'); 
     35      cfg.toolbar[i].splice(j,0,id); 
     36      done = true; 
     37      break; 
     38    } 
     39  } 
     40 
     41  if(!done) 
     42  { 
     43    cfg.toolbar[0].push(id); 
     44  } 
     45 
     46  /* 
     47  // register the toolbar buttons provided by this plugin 
     48  var toolbar = []; 
     49  for (var i = 0; i < bl.length; ++i) 
     50  { 
     51    var btn = bl[i]; 
     52    if (!btn) 
     53    { // toolbar.push("separator"); 
     54    } else { 
     55      var id = "SC-" + btn[0]; 
     56      cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "SpellChecker"), false, 
     57             function(editor, id) { 
     58               // dispatch button press event 
     59               self.buttonPress(editor, id); 
     60             }, btn[1]); 
     61      toolbar.push(id); 
     62    } 
     63  } 
     64 
     65  for (var i = 0; i < toolbar.length; ++i) { 
     66    cfg.toolbar[0].push(toolbar[i]); 
     67  } 
     68  */ 
    3969}; 
    4070 
    4171SpellChecker._pluginInfo = { 
    42         name          : "SpellChecker", 
    43         version       : "1.0", 
    44         developer     : "Mihai Bazon", 
    45         developer_url : "http://dynarch.com/mishoo/", 
    46         c_owner       : "Mihai Bazon", 
    47         sponsor       : "American Bible Society", 
    48         sponsor_url   : "http://www.americanbible.org", 
    49         license       : "htmlArea" 
     72  name          : "SpellChecker", 
     73  version       : "1.0", 
     74  developer     : "Mihai Bazon", 
     75  developer_url : "http://dynarch.com/mishoo/", 
     76  c_owner       : "Mihai Bazon", 
     77  sponsor       : "American Bible Society", 
     78  sponsor_url   : "http://www.americanbible.org", 
     79  license       : "htmlArea" 
    5080}; 
    5181 
    5282SpellChecker.btnList = [ 
    53         null, // separator 
    54         ["spell-check"] 
    55         ]; 
     83  null, // separator 
     84  ["spell-check"] 
     85  ]; 
    5686 
    5787SpellChecker.prototype.buttonPress = function(editor, id) { 
    58         switch (id) { 
    59             case "SC-spell-check": 
    60                 SpellChecker.editor = editor; 
    61                 SpellChecker.init = true; 
    62                 var uiurl = _editor_url + "plugins/SpellChecker/spell-check-ui.html"; 
    63                 var win; 
    64                 if (HTMLArea.is_ie) { 
    65                         win = window.open(uiurl, "SC_spell_checker", 
    66                                           "toolbar=no,location=no,directories=no,status=no,menubar=no," + 
    67                                           "scrollbars=no,resizable=yes,width=600,height=450"); 
    68                 } else { 
    69                         win = window.open(uiurl, "SC_spell_checker", 
    70                                           "toolbar=no,menubar=no,personalbar=no,width=600,height=450," + 
    71                                           "scrollbars=no,resizable=yes"); 
    72                 } 
    73                 win.focus(); 
    74                 break; 
    75         } 
     88  switch (id) { 
     89      case "SC-spell-check": 
     90    SpellChecker.editor = editor; 
     91    SpellChecker.init = true; 
     92    var uiurl = _editor_url + "plugins/SpellChecker/spell-check-ui.html"; 
     93    var win; 
     94    if (HTMLArea.is_ie) { 
     95      win = window.open(uiurl, "SC_spell_checker", 
     96            "toolbar=no,location=no,directories=no,status=no,menubar=no," + 
     97            "scrollbars=no,resizable=yes,width=600,height=450"); 
     98    } else { 
     99      win = window.open(uiurl, "SC_spell_checker", 
     100            "toolbar=no,menubar=no,personalbar=no,width=600,height=450," + 
     101            "scrollbars=no,resizable=yes"); 
     102    } 
     103    win.focus(); 
     104    break; 
     105  } 
    76106}; 
    77107 
Note: See TracChangeset for help on using the changeset viewer.