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); }
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); }
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))); } }
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); }
public IndexedWord(StringPointer indexedWord, ulong letterMask, int matchesCount) { IndexedWordStr = indexedWord; MatchesCount = matchesCount; LetterMask = letterMask; }
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); }
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)); }
public StringSearch(StringPointer str, SearchFlags searchFlags = SearchFlags.IGNORE_CASE) : this(WordDictionary.StringMemory, str.Start, str.Length, str.ActualLength, searchFlags) { }