Example #1
0
        public static bool IsChinese(this StringPointer str)
        {
            uint surrogate = 0;

            for (int i = str.Start; i < str.End; ++i)
            {
                char c = WordDictionary.StringMemory[i];
                if (c.IsHighSurrogate())
                {
                    surrogate = ((uint)c - 0xD800) << 10;
                }
                else if (c.IsLowSurrogate())
                {
                    surrogate |= ((uint)c - 0xDC00) & 0x3FF;
                    surrogate += 0x10000;
                    if (!IsChinese(surrogate))
                    {
                        return(false);
                    }
                }
                else if (!IsChinese((uint)c))
                {
                    return(false);
                }
            }
            return(true);
        }
Example #2
0
        public static float GetRelevance(StringPointer str, float strActualLength, float matchActualLength, int matchBegin, int matchEnd)
        {
            bool wordStart = matchBegin == str.Start || WordDictionary.StringMemory[matchBegin - 1].IsBlank();
            bool wordEnd   = matchEnd == str.End || WordDictionary.StringMemory[matchEnd].IsBlank();

            float relevance = matchActualLength / strActualLength;

            relevance += wordStart ? 0.8f : 0f;
            relevance += wordEnd ? 0.6f : 0f;

            return(relevance);
        }
Example #3
0
        public float SearchHanzis(StringPointer hanzi, StringPointer traditional)
        {
            if (ChineseSearchWords == null)
            {
                return(0f);
            }

            if (traditional.Length == 0)
            {
                return(SearchHanzi(hanzi));
            }
            else
            {
                return(Math.Max(SearchHanzi(hanzi), SearchHanzi(traditional)));
            }
        }
Example #4
0
        public float SearchPinyin(StringPointer str)
        {
            float strActualLength = str.ActualLength;

            float relevance = 0;
            float factor    = 0;

            foreach (StringSearch searchWord in PinyinSearchWords)
            {
                float wordRelevance = GetPinyinRelevance(str, strActualLength, searchWord);

                if (relevance == 0 && wordRelevance == 0)
                {
                    // quick return if the first search word is not a match
                    return(0);
                }

                relevance += wordRelevance;
                factor    += wordRelevance > WordSearch.MinRelevance ? 1 : 0;
            }
            return(relevance * factor);
        }
Example #5
0
 public IndexedWord(StringPointer indexedWord, ulong letterMask, int matchesCount)
 {
     IndexedWordStr = indexedWord;
     MatchesCount   = matchesCount;
     LetterMask     = letterMask;
 }
Example #6
0
        private static float GetTranslationRelevance(StringPointer str, float strActualLength, StringSearch search)
        {
            StringSearch.Result result = search.SearchIn(str);

            return(result.Found ? GetRelevance(str, strActualLength, search.SearchActualLength, result.Start, result.End) : 0);
        }
Example #7
0
 public static Result Search(StringPointer search, StringPointer str,
                             SearchFlags searchFlags = SearchFlags.IGNORE_CASE)
 {
     return(Search(WordDictionary.StringMemory, search.Start, search.Length, WordDictionary.StringMemory, str.Start, str.Length, searchFlags));
 }
Example #8
0
 public StringSearch(StringPointer str, SearchFlags searchFlags = SearchFlags.IGNORE_CASE)
     : this(WordDictionary.StringMemory, str.Start, str.Length, str.ActualLength, searchFlags)
 {
 }