public IActionResult Index() { var qs = Request.QueryString; if (qs.IsNotNull() && qs.Value.IsNotNullOrEmpty() && qs.Value.Length > 9) { var queryString = Uri.UnescapeDataString(qs.Value); SearchRangeType type = SearchRangeType.All; if (queryString.Contains(TYPE_QUERY)) { type = queryString.Contains(TYPE_QUERY + SearchRangeType.NewTestament.GetCategory()) ? SearchRangeType.NewTestament : SearchRangeType.OldTestament; queryString = queryString.Replace(TYPE_QUERY + SearchRangeType.NewTestament.GetCategory(), "").Replace(TYPE_QUERY + SearchRangeType.OldTestament.GetCategory(), ""); } var words = queryString.Replace("?text=", "").Split('+', StringSplitOptions.RemoveEmptyEntries); return(_Search(words, type)); } return(View()); }
private IActionResult _Search(string[] words, SearchRangeType type) { var session = new UnitOfWork(); var view = new XPView(session, typeof(Verse)); var bookShortcuts = new XPQuery <BookBase>(session).Select(x => new KeyValuePair <int, string>(x.NumberOfBook, x.BookShortcut)).ToList(); var translationNames = new XPQuery <Translation>(session).Where(x => !x.Hidden).Select(x => new KeyValuePair <string, string>(x.Name.Replace("'", "").Replace("+", ""), x.Description)).ToList(); var query = "Search?text="; foreach (var word in words) { query += word; if (word != words.Last()) { query += "+"; } } var dic = new Dictionary <string, string>(); foreach (SearchRangeType item in Enum.GetValues(typeof(SearchRangeType))) { if (item == type) { continue; } if (item == SearchRangeType.All) { dic.Add(item.GetDescription(), query); } else { dic.Add(item.GetDescription(), query + TYPE_QUERY + item.GetCategory()); } } var critera = String.Empty; foreach (var word in words) { critera += $"Contains(Lower([Text]),'{word.ToLower()}')"; if (word != words.Last()) { critera += " AND "; } } view.CriteriaString = critera.Trim(); view.Properties.Add(new ViewProperty("NumberOfVerse", SortDirection.None, "[NumberOfVerse]", false, true)); view.Properties.Add(new ViewProperty("VerseText", SortDirection.None, "[Text]", false, true)); view.Properties.Add(new ViewProperty("Index", SortDirection.None, "[Index]", false, true)); var model = new SearchResultsModel(words) { SearchType = type, Links = dic }; foreach (ViewRecord record in view) { var _index = record["Index"]; if (_index.IsNotNull()) { var index = new VerseIndex(_index.ToString()); if (type != SearchRangeType.All) { if (type == SearchRangeType.NewTestament && (index.NumberOfBook < 470 || index.NumberOfBook > 730)) { continue; } if (type == SearchRangeType.OldTestament && index.NumberOfBook >= 470) { continue; } } var baseBookShortcut = bookShortcuts.Where(x => x.Key == index.NumberOfBook).Select(x => x.Value).FirstOrDefault(); var translation = translationNames.Where(x => x.Key == index.TranslationName).FirstOrDefault(); if (translation.IsNull() || translation.Key.IsNull()) { continue; } var translationDesc = translation.Value; var verseText = record["VerseText"].ToString(); verseText = verseText.Replace("<J>", "<span style='color: darkred;'>").Replace("</J>", "</span>"); var simpleText = verseText.Replace("</t>", "").Replace("<t>", "").Replace("<pb/>", "").Replace("<n>", "").Replace("</n>", "").Replace("<e>", "").Replace("</e>", "").Replace("―", "").Replace('\'', ' ').Replace("<J>", "").Replace("</J>", "").Replace("<i>", "").Replace("</i>", ""); var translationName = translation.Key; if (translationName == "NPI" || translationName == "IPD") { simpleText = simpleText.Replace("―", ""); verseText = verseText.Replace("―", ""); } if (translationName == "PBD") { translationName = "SNPPD"; } simpleText = System.Text.RegularExpressions.Regex.Replace(simpleText, @"\<f\>\[[0-9]+\]\<\/f\>", ""); simpleText = $"{baseBookShortcut} {index.NumberOfChapter}:{record["NumberOfVerse"]} „{simpleText}” ({translationName})"; model.Add(new SearchItemModel() { Book = index.NumberOfBook, BookShortcut = baseBookShortcut, Chapter = index.NumberOfChapter, Verse = record["NumberOfVerse"].ToInt(), TranslationName = translationDesc, Translation = index.TranslationName, VerseText = verseText, SimpleText = simpleText, Index = _index.ToString() }); } } return(View(model)); }