/// <summary> /// Record the location of a doubled word /// </summary> /// <param name="sender">The sender of the event</param> /// <param name="e">The event arguments</param> private void speller_DoubledWord(object sender, SpellingEventArgs e) { issues.Add(new SpellingIssue { Word = e.Word, Location = e.Position, }); }
/// <summary> /// Record the location of a misspelled word /// </summary> private void speller_MisspelledWord(object sender, SpellingEventArgs e) { issues.Add(new SpellingIssue { IsMisspelling = true, Word = e.Word, Location = e.Position, Suggestions = dictionary.SuggestCorrections(e.Word).ToList() }); }
/// <summary> /// Spell check the given text /// </summary> /// <param name="text">The text to spell check</param> /// <param name="location">The location of the text being spell checked</param> /// <returns>False if it was canceled or True if it completed.</returns> private bool SpellCheckInternal(string text, TextLocation location) { SpellingEventArgs se = null; List<Match> xmlTags = null; TextLocation priorWord = new TextLocation(); string currentWord; int textIdx; // Signal the start and allow it to be canceled CancelEventArgs ce = new CancelEventArgs(); this.OnSpellCheckTextStarting(ce); if(ce.Cancel) { this.OnSpellCheckTextCancelled(EventArgs.Empty); return false; } // Note the location of all XML elements if needed if(SpellCheckerConfiguration.IgnoreXmlElementsInText) xmlTags = reXml.Matches(text).OfType<Match>().ToList(); // Spell check each word in the given text foreach(var word in GetWordsInText(text)) { currentWord = text.Substring(word.Start, word.Length); textIdx = word.Start; if(!IsProbablyARealWord(currentWord) || (xmlTags != null && xmlTags.Count != 0 && xmlTags.Any(match => textIdx >= match.Index && textIdx <= match.Index + match.Length - 1))) continue; if(!dictionary.ShouldIgnoreWord(currentWord) && !dictionary.IsSpelledCorrectly(currentWord)) { // Sometimes it flags a word as misspelled if it ends with "'s". Try checking the word // without the "'s". If ignored or correct without it, don't flag it. This appears to be // caused by the definitions in the dictionary rather than Hunspell. if(currentWord.EndsWith("'s", StringComparison.OrdinalIgnoreCase)) { currentWord = currentWord.Substring(0, currentWord.Length - 2); if(dictionary.ShouldIgnoreWord(currentWord) || dictionary.IsSpelledCorrectly(currentWord)) continue; currentWord += "'s"; } se = new SpellingEventArgs(currentWord, location.ToPoint(text, textIdx)); this.OnMisspelledWord(se); if(se.Cancel) break; } else if(priorWord.Length != 0 && String.Compare(text.Substring(priorWord.Start, priorWord.Length), currentWord, StringComparison.OrdinalIgnoreCase) == 0 && IsAllWhitespace(text, priorWord.Start + priorWord.Length, word.Start - 1)) { se = new SpellingEventArgs(currentWord, location.ToPoint(text, textIdx)); this.OnDoubledWord(se); if(se.Cancel) break; } priorWord = word; } if(se != null && se.Cancel) { this.OnSpellCheckTextCancelled(EventArgs.Empty); return false; } this.OnSpellCheckTextCompleted(EventArgs.Empty); return true; }
/// <summary> /// This raises the <see cref="MisspelledWord" /> event /// </summary> protected virtual void OnMisspelledWord(SpellingEventArgs e) { EventHandler<SpellingEventArgs> handler = MisspelledWord; if(handler != null) handler(this, e); }
/// <summary> /// Spell check the given text /// </summary> /// <param name="text">The text to spell check</param> /// <param name="location">The location of the text being spell checked</param> /// <returns>False if it was canceled or True if it completed.</returns> private bool SpellCheckInternal(string text, TextLocation location) { SpellingEventArgs se = null; List <Match> xmlTags = null; TextLocation priorWord = new TextLocation(); string currentWord; int textIdx; // Signal the start and allow it to be canceled CancelEventArgs ce = new CancelEventArgs(); this.OnSpellCheckTextStarting(ce); if (ce.Cancel) { this.OnSpellCheckTextCancelled(EventArgs.Empty); return(false); } // Note the location of all XML elements if needed if (SpellCheckerConfiguration.IgnoreXmlElementsInText) { xmlTags = reXml.Matches(text).OfType <Match>().ToList(); } // Spell check each word in the given text foreach (var word in GetWordsInText(text)) { currentWord = text.Substring(word.Start, word.Length); textIdx = word.Start; if (!IsProbablyARealWord(currentWord) || (xmlTags != null && xmlTags.Count != 0 && xmlTags.Any(match => textIdx >= match.Index && textIdx <= match.Index + match.Length - 1))) { continue; } if (!dictionary.ShouldIgnoreWord(currentWord) && !dictionary.IsSpelledCorrectly(currentWord)) { // Sometimes it flags a word as misspelled if it ends with "'s". Try checking the word // without the "'s". If ignored or correct without it, don't flag it. This appears to be // caused by the definitions in the dictionary rather than Hunspell. if (currentWord.EndsWith("'s", StringComparison.OrdinalIgnoreCase)) { currentWord = currentWord.Substring(0, currentWord.Length - 2); if (dictionary.ShouldIgnoreWord(currentWord) || dictionary.IsSpelledCorrectly(currentWord)) { continue; } currentWord += "'s"; } se = new SpellingEventArgs(currentWord, location.ToPoint(text, textIdx)); this.OnMisspelledWord(se); if (se.Cancel) { break; } } else if (priorWord.Length != 0 && String.Compare(text.Substring(priorWord.Start, priorWord.Length), currentWord, StringComparison.OrdinalIgnoreCase) == 0 && IsAllWhitespace(text, priorWord.Start + priorWord.Length, word.Start - 1)) { se = new SpellingEventArgs(currentWord, location.ToPoint(text, textIdx)); this.OnDoubledWord(se); if (se.Cancel) { break; } } priorWord = word; } if (se != null && se.Cancel) { this.OnSpellCheckTextCancelled(EventArgs.Empty); return(false); } this.OnSpellCheckTextCompleted(EventArgs.Empty); return(true); }