Exemplo n.º 1
0
        /// <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
        (
            [NotNull] string word,
            [NotNull] 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.Conditions[charCode] & (1 << i)) == (1 << i))
                    {
                        passCount++;
                    }
                }
                if (passCount == entry.ConditionCount)
                {
                    return(tempWord);
                }
            }

            return(word);
        }
Exemplo n.º 2
0
        /// <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.Conditions.Length; i++)
            {
                entry.Conditions[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.Conditions.Length; j++)
                            {
                                entry.Conditions[j] = entry.Conditions[j] | (1 << num);
                            }
                            // turn off chars in member group
                            for (int j = 0; j < numMember; j++)
                            {
                                int charCode = (int)memberChars[j];
                                entry.Conditions[charCode] = entry.Conditions[charCode] & ~(1 << num);
                            }
                        }
                        else
                        {
                            // turn on chars in member group
                            for (int j = 0; j < numMember; j++)
                            {
                                int charCode = (int)memberChars[j];
                                entry.Conditions[charCode] = entry.Conditions[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.Conditions.Length; j++)
                            {
                                entry.Conditions[j] = entry.Conditions[j] | (1 << num);
                            }
                        }
                        else
                        {
                            // turn on char
                            int charCode = (int)cond;
                            entry.Conditions[charCode] = entry.Conditions[charCode] | (1 << num);
                        }
                    } // not group

                    end = false;
                    num++;
                } // if end
            }     // foreach char

            entry.ConditionCount = num;
            return;
        }