private void ProcessForParallelBookVerses( BibleTranslationDifferencesEx baseTranslationDifferencesEx, BibleTranslationDifferencesEx parallelTranslationDifferencesEx, ParallelBibleInfo result) { foreach (int bookIndex in parallelTranslationDifferencesEx.BibleVersesDifferences.Keys) { if (!result.TryGetValue(bookIndex, out ModuleVersePointersComparisonTable bookVersePointersComparisonTables)) { bookVersePointersComparisonTables = new ModuleVersePointersComparisonTable(); result.Add(bookIndex, bookVersePointersComparisonTables); } var baseBookVerses = baseTranslationDifferencesEx.GetBibleVersesDifferences(bookIndex); var parallelBookVerses = parallelTranslationDifferencesEx.BibleVersesDifferences[bookIndex]; foreach (var parallelVerseKVP in parallelBookVerses) { if (baseBookVerses == null || !baseBookVerses.ContainsKey(parallelVerseKVP.Key)) // вариант, когда и там, и там есть, мы уже разобрали { bookVersePointersComparisonTables.Add(parallelVerseKVP.Key, parallelVerseKVP.Value); } } } }
public ParallelBibleInfo GetParallelBibleInfo( string baseModuleShortName, string parallelModuleShortName, BibleTranslationDifferences baseBookTranslationDifferences, BibleTranslationDifferences parallelBookTranslationDifferences, bool refreshCache = false) { var key = GetKey(baseModuleShortName, parallelModuleShortName); if (refreshCache || !_cache.TryGetValue(key, out ParallelBibleInfo result)) { result = new ParallelBibleInfo(); if (baseModuleShortName.ToLower() != parallelModuleShortName.ToLower()) { var verseFactory = new BibleTranslationDifferencesBaseVersesFormula.VerseFactory((s, bookIndex) => { var verseEntry = _stringParser.TryGetVerse(s, 0); if (verseEntry.VersePointerFound) { return(verseEntry.VersePointer.ToModuleVersePointer(false, bookIndex)); } else { throw new NotSupportedException($"Verse formula is invalid: {s}"); } }); var baseTranslationDifferencesEx = new BibleTranslationDifferencesEx(baseBookTranslationDifferences, verseFactory); var parallelTranslationDifferencesEx = new BibleTranslationDifferencesEx(parallelBookTranslationDifferences, verseFactory); ProcessForBaseBookVerses(baseTranslationDifferencesEx, parallelTranslationDifferencesEx, result); ProcessForParallelBookVerses(baseTranslationDifferencesEx, parallelTranslationDifferencesEx, result); } lock (_locker) { if (!_cache.ContainsKey(key)) { _cache.Add(key, result); } else { _cache[key] = result; } } } return(result); }
private void ProcessForBaseBookVerses( BibleTranslationDifferencesEx baseTranslationDifferencesEx, BibleTranslationDifferencesEx parallelTranslationDifferencesEx, ParallelBibleInfo result) { foreach (int bookIndex in baseTranslationDifferencesEx.BibleVersesDifferences.Keys) { var bookVersePointersComparisonTables = new ModuleVersePointersComparisonTable(); result.Add(bookIndex, bookVersePointersComparisonTables); var baseBookVerses = baseTranslationDifferencesEx.BibleVersesDifferences[bookIndex]; var parallelBookVerses = parallelTranslationDifferencesEx.GetBibleVersesDifferences(bookIndex); foreach (var baseVerseKey in baseBookVerses.Keys) { if (parallelBookVerses != null && parallelBookVerses.TryGetValue(baseVerseKey, out ComparisonVersesInfo parallelVerses)) { var baseVerses = baseBookVerses[baseVerseKey]; JoinBaseAndParallelVerses(baseVerseKey, baseVerses, parallelVerses, bookVersePointersComparisonTables); } else { var baseVerses = baseBookVerses[baseVerseKey]; int?versePartIndex = baseVerses.Count(v => !v.IsApocrypha && !v.IsEmpty) > 1 ? (int?)0 : null; foreach (var baseVersePointer in baseVerses) { parallelVerses = ComparisonVersesInfo.FromVersePointer( new ModuleVersePointer(baseVerseKey) { PartIndex = versePartIndex.HasValue ? versePartIndex++ : null, IsEmpty = baseVersePointer.IsApocrypha || baseVerseKey.IsEmpty, SkipCheck = baseVerseKey.SkipCheck, EmptyVerseContent = baseVerseKey.EmptyVerseContent }); var key = (ModuleVersePointer)baseVersePointer.Clone(); key.PartIndex = null; // нам просто здесь не важно - часть это стиха или нет. bookVersePointersComparisonTables.Add(key, parallelVerses); } } } } }