private Word ParsePinyin(ImportWordLoopItem item) { var pinyinStr = item.ArrayToParse[1].ToLower(); var pinyin = Regex.Replace(pinyinStr, PinyinExcludeRegexPattern, string.Empty); if (pinyin.Contains(item.SolidSyllables)) { return(new Word { OriginalWord = item.MainWord, Pronunciation = item.SeparatedSyllables, Translation = item.TranslationNative, SyllablesCount = item.Syllables.Length, Usage = item.Usage }); } var useNum = IsNumbersInPinyinUsed(pinyinStr); var leftPinyin = useNum ? pinyinStr : pinyin; var successFlag = false; var importedSyllables = new List <Syllable>(); foreach (var syllable in item.Syllables.Reverse()) { successFlag = false; var chineseChar = syllable.ChineseChar; foreach (var pinyinOption in _chinesePinyinConverter.Convert(chineseChar, useNum ? EToneType.Number : EToneType.Mark)) { var numFreePinyinOption = Regex.Replace(pinyinOption, PinyinExcludeRegexPattern, string.Empty); var allMarkTones = _chinesePinyinConverter.ToSyllablesAllTones(numFreePinyinOption); var allTones = useNum ? _chinesePinyinConverter.ToSyllablesNumberAllTones(pinyinOption) : allMarkTones; var tonesToLoop = allTones.Where(a => a != null).ToArray(); for (var i = 0; i < tonesToLoop.Length; i++) { var tone = tonesToLoop[i]; if (!leftPinyin.EndsWith(tone)) { continue; } leftPinyin = leftPinyin.Remove(leftPinyin.Length - tone.Length, tone.Length); successFlag = true; if (useNum) { var markTone = allMarkTones[i]; syllable.Pinyin = markTone; syllable.Color = _syllableColorProvider.GetSyllableColor(syllable.ChineseChar, tone); } importedSyllables.Insert(0, useNum ? syllable : GetSyllable(syllable.ChineseChar, tone)); break; } if (successFlag) { break; } } if (!successFlag) { break; } } if (successFlag) { return(new Word { OriginalWord = item.MainWord, Pronunciation = _syllablesToStringConverter.Join(importedSyllables.Select(a => a.Pinyin)), Translation = item.TranslationNative.Replace(ImportSeparator1, ReplaceSeparator) .Replace(ImportSeparator2, ReplaceSeparator), SyllablesCount = importedSyllables.Count, Usage = item.Usage }); } return(null); }
/// <summary> /// Imports and parses the words. /// Example: 电;diàn;electricity /// 电;;electricity;usage /// 电;dian4;electricity;usage /// </summary> /// <param name="rawWords">Array of words to parse</param> /// <returns>Parsed strings</returns> public ImportWordResult ImportWords(string[] rawWords) { var goodWords = new List <Word>(); var badWords = new List <string>(); foreach (var word in rawWords) { var arrayToParse = word.Split(new[] { ImportSeparator1, ImportSeparator2 }); if (arrayToParse.Length < 2) { badWords.Add(word); continue; } var usePinyin = !string.IsNullOrEmpty(arrayToParse[1]); var mainWord = arrayToParse[0]; var translationIndex = 2; var usageIndex = translationIndex + 1; var translationNative = arrayToParse[translationIndex]; var usage = string.Empty; if (arrayToParse.Length > usageIndex) { usage = string.Join(ImportSeparator1, arrayToParse.Skip(usageIndex)); } var syllables = GetOrderedSyllables(mainWord, EToneType.Mark); if (syllables.Length > MaxSyllablesToParse) { badWords.Add(word + $" (String is too long. Max syllables count is {MaxSyllablesToParse}.)"); continue; } var separatedSyllables = _syllablesToStringConverter.Join(syllables.Select(a => a.Pinyin)); var solidSyllables = separatedSyllables.Replace( _syllablesToStringConverter.GetSeparator(), string.Empty); if (usePinyin) { var loopItem = new ImportWordLoopItem(arrayToParse, goodWords, syllables, solidSyllables, mainWord, word, translationNative, separatedSyllables, badWords, usage); var wordPinyin = ParsePinyin(loopItem); if (wordPinyin == null) { badWords.Add(word + " (the pinyin is not quite suit for these chinese characters, pinyin will be generated automatically)"); } else { goodWords.Add(wordPinyin); continue; } } goodWords.Add(new Word { OriginalWord = mainWord, Pronunciation = separatedSyllables, Translation = translationNative, SyllablesCount = syllables.Length, Usage = usage }); } return(new ImportWordResult(goodWords.ToArray(), badWords.ToArray())); }