Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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()));
        }