public async Task <IActionResult> OnPostGenerateCatPageAsync(GanjoorTOC GanjoorTOC) { if (!(await PreparePage())) { return(Page()); } var response = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/cat?url={PageInformation.FullUrl}&poems=true"); if (!response.IsSuccessStatusCode) { LastMessage = JsonConvert.DeserializeObject <string>(await response.Content.ReadAsStringAsync()); return(Page()); } var Cat = JsonConvert.DeserializeObject <GanjoorPoetCompleteViewModel>(await response.Content.ReadAsStringAsync()); using (HttpClient secureClient = new HttpClient()) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { var htmlRes = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/cat/toc/{Cat.Cat.Id}/{(int)GanjoorTOC}"); if (!htmlRes.IsSuccessStatusCode) { LastMessage = JsonConvert.DeserializeObject <string>(await htmlRes.Content.ReadAsStringAsync()); return(Page()); } ModifyModel.HtmlText = await htmlRes.Content.ReadAsStringAsync(); LastMessage = $"متن تولیدی دریافت شد. لطفا آن را کپی کنید و سپس <a href=\"/Admin/ModifyPage?id={Request.Query["id"]}\">اینجا</a> کلیک کنید و آن را درج نمایید."; } else { LastMessage = "لطفا از گنجور خارج و مجددا به آن وارد شوید."; } } return(Page()); }
private async Task <RServiceResult <string> > _GenerateTableOfContents(RMuseumDbContext context, int catId, GanjoorTOC options) { string html = ""; var subCats = await context.GanjoorCategories.Where(c => c.ParentId == catId).OrderBy(c => c.Id).AsNoTracking().ToArrayAsync(); foreach (var cat in subCats) { html += $"<p><a href=\"{cat.FullUrl}\">{cat.Title}</a></p>{Environment.NewLine}"; } var poems = await context.GanjoorPoems.Where(p => p.CatId == catId).OrderBy(p => p.Id).AsNoTracking().ToArrayAsync(); if (poems.Length > 0) { if (options == GanjoorTOC.Analyse) { if (poems.Where(p => !string.IsNullOrEmpty(p.RhymeLetters)).Count() * 100 / poems.Length > 50) { options = GanjoorTOC.AlphabeticWithFirstVerse; } else { options = GanjoorTOC.TitlesAndFirstVerse; } } } if ( options == GanjoorTOC.AlphabeticWithFirstCouplet || options == GanjoorTOC.AlphabeticWithFirstVerse || options == GanjoorTOC.AlphabeticWithSecondVerse ) { var taggedPoems = poems.Where(p => !string.IsNullOrEmpty(p.RhymeLetters)).ToArray(); if (taggedPoems.Length > 0) { html += $"<p>فهرست شعرها به ترتیب آخر حرف قافیه گردآوری شده است. برای پیدا کردن یک شعر کافی است حرف آخر قافیهٔ آن را در نظر بگیرید تا بتوانید آن را پیدا کنید.</p>{Environment.NewLine}"; var randomPoem = taggedPoems[new Random(DateTime.Now.Millisecond).Next(taggedPoems.Length)]; var randomPoemVerses = await context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == randomPoem.Id).OrderBy(v => v.VOrder).ToArrayAsync(); if (randomPoemVerses.Length > 2) { html += $"<p>مثلاً برای پیدا کردن شعری که مصرع <em>{randomPoemVerses[1].Text}</em> مصرع دوم یکی از بیتهای آن است باید شعرهایی را نگاه کنید که آخر حرف قافیهٔ آنها «<em><a href=\"#{ GPersianTextSync.UniquelyFarglisize(randomPoem.RhymeLetters.Substring(randomPoem.RhymeLetters.Length - 1)) }\">{randomPoem.RhymeLetters.Substring(randomPoem.RhymeLetters.Length - 1)}</a></em>» است.</p>{Environment.NewLine}"; } html += $"<h3><a id=\"index\">دسترسی سریع به حروف</a></h3>{Environment.NewLine}"; html += $"<p>{Environment.NewLine}"; string lastChar = ""; List <string> visitedLastChart = new List <string>(); foreach (var poem in taggedPoems) { string poemLastChar = poem.RhymeLetters.Substring(poem.RhymeLetters.Length - 1); if (poemLastChar != lastChar) { if (visitedLastChart.IndexOf(poemLastChar) == -1) { if (lastChar != "") { html += " | "; } html += $"<a href=\"#{GPersianTextSync.UniquelyFarglisize(poemLastChar)}\">{poemLastChar}</a>"; lastChar = poemLastChar; visitedLastChart.Add(poemLastChar); } } } html += $"</p>{Environment.NewLine}"; } } string last = ""; List <string> visitedLast = new List <string>(); foreach (var poem in poems) { if ( options == GanjoorTOC.AlphabeticWithFirstCouplet || options == GanjoorTOC.AlphabeticWithFirstVerse || options == GanjoorTOC.AlphabeticWithSecondVerse ) { if (!string.IsNullOrEmpty(poem.RhymeLetters)) { string poemLast = poem.RhymeLetters.Substring(poem.RhymeLetters.Length - 1); if (poemLast != last) { if (visitedLast.IndexOf(poemLast) == -1) { html += $"<h3><a href=\"#index\" id=\"{GPersianTextSync.UniquelyFarglisize(poemLast)}\">{poemLast}</a></h3>{Environment.NewLine}"; last = poemLast; visitedLast.Add(poemLast); } } } } html += $"<p><a href=\"{poem.FullUrl}\">{poem.Title}</a>"; var verses = await context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == poem.Id).OrderBy(v => v.VOrder).ToArrayAsync(); if (verses.Length > 0) { if (options == GanjoorTOC.TitlesAndFirstVerse || options == GanjoorTOC.AlphabeticWithFirstVerse) { html += $": {verses[0].Text}"; } else if (options == GanjoorTOC.AlphabeticWithSecondVerse || options == GanjoorTOC.TitlesAndSecondVerse) { if (verses.Length > 1) { html += $": {verses[1].Text}"; } else { html += $": {verses[0].Text}"; } } else if (options == GanjoorTOC.AlphabeticWithFirstCouplet || options == GanjoorTOC.TitlesAndFirstCouplet) { if (verses.Length > 1) { html += $": {verses[0].Text} - {verses[1].Text}"; } else { html += $": {verses[0].Text}"; } } else if (options == GanjoorTOC.TitlesAndFirstCenteredVerse) { if (verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).Any()) { html += $": {verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).First().Text}"; } else { html += $": {verses[0].Text}"; } } else if (options == GanjoorTOC.TitlesAndFirstCenteredCouplet) { if ( verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).Any() && verses.Where(v => v.VersePosition == VersePosition.CenteredVerse2).Any() ) { html += $": {verses.Where(v => v.VersePosition == VersePosition.CenteredVerse1).First().Text} - {verses.Where(v => v.VersePosition == VersePosition.CenteredVerse2).First().Text}"; } else { html += $": {verses[0].Text}"; } } } html += $"</p>{Environment.NewLine}"; } return(new RServiceResult <string>(html)); }
/// <summary> /// generate category TOC /// </summary> /// <param name="catId"></param> /// <param name="options"></param> /// <returns></returns> public async Task <RServiceResult <string> > GenerateTableOfContents(int catId, GanjoorTOC options) { return(await _GenerateTableOfContents(_context, catId, options)); }