Esempio n. 1
0
        public async Task <int?> GetSearchCountAsync(VerseSetDescriptor setDescriptor)
        {
            int?searchCount = null;

            var url = GetSearchCountUrl(setDescriptor);

            try
            {
                var webClient = new HtmlWeb();

                var document = await webClient.LoadFromWebAsync(url);

                var resultCountNode = document.DocumentNode.SelectSingleNode("//span[@id='resultsCount']/span");

                if (!string.IsNullOrWhiteSpace(resultCountNode?.InnerText))
                {
                    var searchCountStr = Numbers.GetNumberFromStr(resultCountNode?.InnerText);

                    if (int.TryParse(searchCountStr, out int count))
                    {
                        searchCount = count;
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Error retrieving search count for \"{setDescriptor.Code}\".");
            }

            return(searchCount);
        }
Esempio n. 2
0
        /// <summary>
        /// Given a string identifier code for a specific verse or sequence of
        /// verses, return a corresponding VerseSetDescriptor.
        ///
        /// Example: "40024013014" returns the VerseSetDescriptor for Matthew 24:13,14.
        /// </summary>
        public static VerseSetDescriptor FromCode(string verseSetCode)
        {
            VerseSetDescriptor descriptor = null;

            if (int.TryParse(verseSetCode.Substring(0, 2), out int bookId))
            {
                if (int.TryParse(verseSetCode.Substring(2, 3), out int chapter))
                {
                    if (int.TryParse(verseSetCode.Substring(5, 3), out int start))
                    {
                        var end = start;

                        if (verseSetCode.Length == 11)
                        {
                            int.TryParse(verseSetCode.Substring(8, 3), out end);
                        }

                        descriptor = new VerseSetDescriptor
                        {
                            BookId  = bookId,
                            Chapter = chapter,
                            Start   = start,
                            End     = end
                        };
                    }
                }
            }

            return(descriptor);
        }
Esempio n. 3
0
        /// <summary>
        /// Given a verse set identifying a single verse or sequence of verses from a
        /// single chapter, asynchronously retrieve the language-specific HTML from the
        /// WOL website, modifying the returned HTML in the process to suit our use.
        /// </summary>
        public async Task <string> GetVerseHtmlAsync(VerseSetDescriptor verseSet, string language)
        {
            string verseHtml = null;

            var url = GetVerseUrl(verseSet, language);

            try
            {
                var webClient = new HtmlWeb();

                var document = await webClient.LoadFromWebAsync(url);

                var articleNode = document.DocumentNode.SelectSingleNode("//li[contains(@class,'bibleCitation')]/article");

                if (!string.IsNullOrWhiteSpace(articleNode?.InnerHtml))
                {
                    verseHtml = CleanVerseHtml(articleNode);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Error retrieving HTML for \"{verseSet.Code}\".");
            }

            return(verseHtml);
        }
Esempio n. 4
0
        public async Task <string> GetVerseHtmlFromSetCode(string verseCode, string language)
        {
            // first check the cache
            string html = _unitOfWork.VerseCacheRepo.GetVerseHtmlByCode(verseCode, language);

            // if not cached, use the web retriever
            if (html == null)
            {
                var verseDescriptor = VerseSetDescriptor.FromCode(verseCode);

                html = await _webRetriever.GetVerseHtmlAsync(verseDescriptor, language);

                if (html != null)
                {
                    // do we already have a count from another language?
                    var searchCount = _unitOfWork.VerseCacheRepo.GetSearchCountByCode(verseCode);

                    if (searchCount == null)
                    {
                        searchCount = await _searchCountRetriever.GetSearchCountAsync(verseDescriptor);
                    }

                    _unitOfWork.VerseCacheRepo.AddVerseHtml(verseCode, language, html, searchCount ?? 0);

                    _unitOfWork.SaveChanges();
                }
            }

            return(html);
        }
Esempio n. 5
0
        /// <summary>
        /// Given a verse set id, get the url that will retrieve the
        /// search references from the WOL site (always uses Engligh).
        /// </summary>
        public string GetSearchCountUrl(VerseSetDescriptor setDescriptor)
        {
            var bookName = _verseParser.GetBookNameById(setDescriptor.BookId, "en");

            var tokens = new Dictionary <string, string>
            {
                { "book", bookName },
                { "chapter", setDescriptor.IsSingleChapterBook ? "" : $"{setDescriptor.Chapter}:" },
                { "verseStart", setDescriptor.Start.ToString() },
                { "verseEnd", setDescriptor.Start == setDescriptor.End ? "" : $"-{setDescriptor.End}" }
            };

            // replace the tokens in the template with the values we obtained above
            var url = Settings.Default.SearchCountUrlTemplate.FormatToken(tokens);

            return(url);
        }
Esempio n. 6
0
        /// <summary>
        /// Given a verse set id, get the url that will retrieve the
        /// verse from the WOL site using the configured language.
        /// </summary>
        public string GetVerseUrl(VerseSetDescriptor setDescriptor, string language)
        {
            var bookName = _verseParser.GetBookNameById(setDescriptor.BookId, language);

            var tokens = new Dictionary <string, string>
            {
                { "book", bookName },
                { "chapter", setDescriptor.IsSingleChapterBook ? "" : $"{setDescriptor.Chapter}:" },
                { "verseStart", setDescriptor.Start.ToString() },
                { "verseEnd", setDescriptor.Start == setDescriptor.End ? "" : $"-{setDescriptor.End}" }
            };

            // get the URL template specified for the language
            var settings = _languageSettingsProvider.GetLanguageSettings(language);

            // replace the tokens in the template with the values we obtained above
            var url = settings.ScriptureLookupUrlTemplate.FormatToken(tokens);

            return(url);
        }