예제 #1
0
        private async Task SearchResultsFetcherManga(string searchText)
        {
            try
            {
                mangaRockAPI = RestService.For <IMangaRockAPI>(ServiceUrl.base_manga_url);
                Dictionary <string, string> jsonDict = new Dictionary <string, string> {
                    { "type", "series" },
                    { "keywords", searchText }
                };
                searchResult = await mangaRockAPI.GetSearchResults(CommonFunctions.DictionaryToJson(jsonDict));

                string tempValues = CommonFunctions.ListToListString(searchResult.data);
                searchResultDetails = await mangaRockAPI.GetSearchResultDetails(tempValues);
            }
            catch (Exception LatestUpdateFetchingException)
            {
                Crashes.TrackError(LatestUpdateFetchingException);
                await DisplayAlert("Dead", "Exception Occurred. Please Try Again After Some Time.", "ok");
            }
        }
예제 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="userSessionId"></param>
        /// <param name="searchText"></param>
        /// <returns></returns>
        /// <remarks>
        /// I should update parameter for GetSessionDetailByUserSessionId to be a string and decouple dependency from MongoDb ObjectId Model
        /// I should also create my own "OcrResult" to decouple dependency from Microsoft Azure Models
        /// </remarks>
        public async Task <SearchResultsDto> SearchUserSession(string userSessionId, string searchText)
        {
            var result = new SearchResultsDto();
            var sessionDetailsFound = await _sessionDetailRepo.GetSessionDetailByUserSessionId(ObjectId.Parse(userSessionId)).ConfigureAwait(false);

            //var rawText = String.Empty;
            try
            {
                var detail  = sessionDetailsFound.PrintedTextResult;
                var regions = detail.Regions;
                foreach (OcrRegion region in regions)
                {
                    var lines = region.Lines;
                    foreach (OcrLine line in lines)
                    {
                        var words = line.Words;
                        foreach (OcrWord word in words)
                        {
                            if (word.Text.ToLower().Contains(searchText.ToLower())) //Searh for match
                            {
                                //find how many regions to exclude
                                var regionFoundIndex = regions.IndexOf(region);
                                var skipLastCount    = regions.Count - regionFoundIndex;
                                if (skipLastCount < 0)
                                {
                                    skipLastCount = 0;
                                }
                                //find haw many lines of text there are to find the word
                                var reg = regions.SkipLast(skipLastCount);
                                var linesInPriorRegions = 0;
                                if (reg.Any())
                                {
                                    linesInPriorRegions = reg.Sum(x => x.Lines.Count());
                                }
                                var lineNumber = linesInPriorRegions + region.Lines.IndexOf(line) + 1;

                                //find how many words to exclude
                                var wordsFoundIndex   = words.IndexOf(word);
                                var skipLastWordCount = words.Count - wordsFoundIndex;
                                if (skipLastWordCount < 0)
                                {
                                    skipLastWordCount = 0;
                                }
                                //find how many characters to find the word in the line
                                var filteredWords    = words.SkipLast(skipLastWordCount);
                                var charInPriorWords = 0;
                                if (filteredWords.Any())
                                {
                                    charInPriorWords = filteredWords.Sum(w => w.Text.Length);
                                }
                                var intPosition = charInPriorWords + filteredWords.Count(); //count number of words and spaces. will not include special characters.

                                //Map from Ocr classes to custom classes (to reduce dependency on Ocr classes
                                var resultText = new SearchResultText()
                                {
                                    BoundingBox = word.BoundingBox,
                                    Text        = word.Text
                                };

                                var resultLine = new SearchResultLine()
                                {
                                    BoundingBox = line.BoundingBox,
                                    Text        = words.Select(w => new SearchResultText()
                                    {
                                        BoundingBox = w.BoundingBox, Text = w.Text
                                    }).ToList()
                                };

                                var resultRegion = new SearchResultRegion()
                                {
                                    BoundingBox = region.BoundingBox,
                                    Lines       = new List <SearchResultLine>()
                                    {
                                        resultLine
                                    }
                                };

                                var resultDetail = new SearchResultDetail()
                                {
                                    Language    = detail.Language,
                                    TextAngle   = detail.TextAngle,
                                    Orientation = detail.Orientation,
                                    Regions     = new List <SearchResultRegion>()
                                    {
                                        resultRegion
                                    }
                                };

                                //build result details
                                var resultDetails = new SearchResultDetails(resultText, resultLine, resultRegion, resultDetail, lineNumber, intPosition);

                                //add to results
                                result.ResultDetails.Add(resultDetails);
                            }
                        }
                    }
                }
            }
            finally
            {
                if (sessionDetailsFound != null)
                {
                    sessionDetailsFound = null;
                }
            }

            return(result);
        }