/// <summary> /// Removes the affix suffix rule entry for the word if valid /// </summary> /// <param name="word" type="string"> /// <para> /// The word to be modified /// </para> /// </param> /// <param name="entry" type="NetSpell.SpellChecker.Dictionary.Affix.AffixEntry"> /// <para> /// The affix rule entry to use /// </para> /// </param> /// <returns> /// The word after affix removed. Will be the same word if affix could not be removed. /// </returns> /// <remarks> /// This method does not verify that the returned word is a valid word, only that the affix can be removed /// </remarks> public static string RemoveSuffix(string word, AffixEntry entry) { int tempLength = word.Length - entry.AddCharacters.Length; if ((tempLength > 0) && (tempLength + entry.StripCharacters.Length >= entry.ConditionCount) && (word.EndsWith(entry.AddCharacters))) { // word with out affix string tempWord = word.Substring(0, tempLength); // add back strip chars tempWord += entry.StripCharacters; // check that this is valid int passCount = 0; for (int i = 0; i < entry.ConditionCount; i++) { int charCode = (int)tempWord[tempWord.Length - (entry.ConditionCount - i)]; if ((entry.Condition[charCode] & (1 << i)) == (1 << i)) { passCount++; } } if (passCount == entry.ConditionCount) { return(tempWord); } } return(word); }
/// <summary> /// Adds a 'AffixEntry' item with the specified value to the 'AffixEntryCollection' /// </summary> /// <param name='value'> /// The 'AffixEntry' to add. /// </param> /// <returns> /// The index at which the new element was inserted. /// </returns> public int Add(AffixEntry value) { return(List.Add(value)); }
/// <summary> /// Removes a specific item from the 'AffixEntryCollection'. /// </summary> /// <param name='value'> /// The item to remove from the 'AffixEntryCollection'. /// </param> public void Remove(AffixEntry value) { List.Remove(value); }
/// <summary> /// Inserts an existing 'AffixEntry' into the collection at the specified index. /// </summary> /// <param name='index'> /// The zero-based index where the new item should be inserted. /// </param> /// <param name='value'> /// The item to insert. /// </param> public void Insert(int index, AffixEntry value) { List.Insert(index, value); }
/// <summary> /// Returns the index of a 'AffixEntry' object in the collection. /// </summary> /// <param name='value'> /// The 'AffixEntry' object whose index will be retrieved. /// </param> /// <returns> /// If found, the index of the value; otherwise, -1. /// </returns> public int IndexOf(AffixEntry value) { return(List.IndexOf(value)); }
/// <summary> /// Gets a value indicating whether the 'AffixEntryCollection' contains the specified value. /// </summary> /// <param name='value'> /// The item to locate. /// </param> /// <returns> /// True if the item exists in the collection; false otherwise. /// </returns> public bool Contains(AffixEntry value) { return(List.Contains(value)); }
/// <summary> /// Generates the condition character array /// </summary> /// <param name="conditionText" type="string"> /// <para> /// the text form of the conditions /// </para> /// </param> /// <param name="entry" type="NetSpell.SpellChecker.Dictionary.Affix.AffixEntry"> /// <para> /// The AffixEntry to add the condition array to /// </para> /// </param> public static void EncodeConditions(string conditionText, AffixEntry entry) { // clear the conditions array for (int i = 0; i < entry.Condition.Length; i++) { entry.Condition[i] = 0; } // if no condition just return if (conditionText == ".") { entry.ConditionCount = 0; return; } bool neg = false; /* complement indicator */ bool group = false; /* group indicator */ bool end = false; /* end condition indicator */ int num = 0; /* number of conditions */ char [] memberChars = new char[200]; int numMember = 0; /* number of member in group */ foreach (char cond in conditionText) { // parse member group if (cond == '[') { group = true; // start a group } else if (cond == '^' && group) { neg = true; // negative group } else if (cond == ']') { end = true; // end of a group } else if (group) { // add chars to group memberChars[numMember] = cond; numMember++; } else { end = true; // no group } // set condition if (end) { if (group) { if (neg) { // turn all chars on for (int j = 0; j < entry.Condition.Length; j++) { entry.Condition[j] = entry.Condition[j] | (1 << num); } // turn off chars in member group for (int j = 0; j < numMember; j++) { int charCode = (int)memberChars[j]; entry.Condition[charCode] = entry.Condition[charCode] & ~(1 << num); } } else { // turn on chars in member group for (int j = 0; j < numMember; j++) { int charCode = (int)memberChars[j]; entry.Condition[charCode] = entry.Condition[charCode] | (1 << num); } } group = false; neg = false; numMember = 0; } // if group else { if (cond == '.') { // wild card character, turn all chars on for (int j = 0; j < entry.Condition.Length; j++) { entry.Condition[j] = entry.Condition[j] | (1 << num); } } else { // turn on char int charCode = (int)cond; entry.Condition[charCode] = entry.Condition[charCode] | (1 << num); } } // not group end = false; num++; } // if end } // foreach char entry.ConditionCount = num; return; }