- Rebrand گنجور -> دیوان across GanjooRazor; lang=ur; Urdu home page and footer - Hijri century groups with Urdu names - Noto Nastaliq Urdu (default) / Noto Naskh Arabic switch - Remove footer links to Ganjoor-only services; link Wikisource, data and code - Linux deployment: Dockerfile, docker-compose (SQL Server 2022, API, site, Caddy) - DIVAN.md: changes and deploy guide Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
178 lines
9.4 KiB
Plaintext
178 lines
9.4 KiB
Plaintext
@page
|
|
@model GanjooRazor.Pages.SearchModel
|
|
@using DNTPersianUtils.Core
|
|
@{
|
|
Layout = "_Layout";
|
|
}
|
|
@section Head {
|
|
<meta name="robots" content="noindex, nofollow" />
|
|
<script src="/js/chart.js"></script>
|
|
}
|
|
@if (!string.IsNullOrEmpty(Model.LastError))
|
|
{
|
|
@Model.LastError
|
|
}
|
|
else
|
|
{
|
|
<partial name="_SearchHeaderPartial" model="@(new _SearchHeaderPartialModel(){ Poets = Model.Poets, SelectedPoetId = Model.PoetId, SearchQuery = Model.Query, ShowExactSearchHiddenField = Model.ExactSearch, CurrentCategory = Model.Poet?.Cat, SelectedCategoryId = Model.CatId })" />
|
|
|
|
<!-- #hdr2 -->
|
|
|
|
<div id="fa">
|
|
|
|
|
|
|
|
<div id="maincnt">
|
|
|
|
<partial name="_InlineLoginPartial" model="Model" />
|
|
|
|
<div class="spacer"> </div>
|
|
|
|
@if (!string.IsNullOrEmpty(Model.AlternativeSearchPhrase))
|
|
{
|
|
if (Model.Quoted)
|
|
{
|
|
<div class="poem">
|
|
<a role="button" class="pagebutton" href="/search?s=@Model.AlternativeSearchPhrase&author=@Model.PoetId">@Model.AlternativeSearchPhraseDescription</a>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="poem">
|
|
<a role="button" class="pagebutton" href="/search?s=@Model.AlternativeSearchPhrase&author=@Model.PoetId">@Model.AlternativeSearchPhraseDescription</a>
|
|
</div>
|
|
}
|
|
}
|
|
|
|
@if (!string.IsNullOrEmpty(Model.PagingToolsHtml))
|
|
{
|
|
@Html.Raw(Model.PagingToolsHtml)
|
|
<div class="spacer"> </div>
|
|
}
|
|
|
|
@if (Model.Poems == null)
|
|
{
|
|
<div class="poem">
|
|
<h2>شعری با مشخصات مورد نظر شما پیدا نشد.</h2>
|
|
<p>
|
|
<strong>توصیههایی برای دستیابی به نتیجهٔ مطلوبتر در جستجو:</strong>
|
|
</p>
|
|
<p>
|
|
الف) <strong>به جای جستجوی متن کامل یک بیت بهتر است حروف کلیدی آن را وارد کنید.</strong> از آنجا که اشعار به صورتهای مختلف در نسخههای متفاوت نقل شدهاند ممکن است چیزی که شما در ذهن دارید با چیزی که در پایگاه ما ثبت شده متفاوت باشد. به عنوان نمونه مصرع «کشتی شکستگانیم ای باد شرطه برخیز» از حافظ در بعضی از نسخهها به صورت «کشتی نشستگانیم ای باد شرطه برخیز» ضبط شده و شما با تایپ صورت صورت دوم آن را در دیوان نخواهید یافت. بهتر است برای یافتن این شعر کلماتی مانند کشتی و شرطه را جستجو کنیم.
|
|
</p>
|
|
<p>
|
|
ب) کلماتی را که ممکن است به صورت جدا یا سر هم نوشته شوند در گام اول به صورت جدا امتحان کنید (<strong>می شود</strong> و نه <del>میشود</del> یا <del>میشود</del>).
|
|
</p>
|
|
<p>
|
|
ج) در صورتی که نام سخنور را میدانید بهتر است از طریق لیست بازشوی جلوی جعبهٔ جستجو نام او را انتخاب کنید. این توصیه برای زمانی مناسب است که جستجوی عبارت مورد نظر شما باعث میشود آثار سخنورانی که مورد نظر شما نیستند در صدر نتایج قرار گیرد و به این وسیله شما میخواهید به فهرست محدودتری از نتایج دست پیدا کنید.
|
|
</p>
|
|
<p>
|
|
د) در صورتی که با فنون اولیهٔ جستجو آشنا نیستید یا <strong>معمولاً جستجوهایتان به نتیجهٔ مطلوب نمیرسد</strong> بد نیست نگاهی به <a href="http://hrmoh.ir/1385/04/18/howto-search-better/" title="توصیه هایی برای جستجوی بهتر در اینترنت">این نوشته</a> بیندازید.
|
|
</p>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
|
|
@if (Model.StatsAtTop && Model.QueryIsSingleWord)
|
|
{
|
|
<div class="sitem">
|
|
@* Model.Query is the untrusted "s" search-query string. It must never be
|
|
interpolated into a javascript: href/onclick - HTML-encoding alone does
|
|
not stop it breaking out of the JS string literal there, because the
|
|
browser HTML-decodes the attribute before handing it to the JS engine.
|
|
Passing it through a data-* attribute keeps it as inert text. *@
|
|
<a href="javascript:void(0)" data-search-query="@Model.Query" data-poet-id="@Model.PoetId" data-cat-id="@Model.CatId" onclick="loadWordCountsByCat(this.dataset.searchQuery, this.dataset.poetId, this.dataset.catId, false); return false;" id="load-word-counts" class="pagebutton comments-link">
|
|
مشاهدهٔ بسامد واژگان «@Model.QueryDin» به تفکیک بخش
|
|
</a>
|
|
|
|
<div id="wordcounts-placeholder">
|
|
</div>
|
|
|
|
</div>
|
|
}
|
|
|
|
|
|
for (int poemIndex = 0; poemIndex < Model.Poems.Count; poemIndex++)
|
|
{
|
|
var poem = Model.Poems[poemIndex];
|
|
|
|
<div class="sitem">
|
|
@if (Model.PaginationMetadata != null)
|
|
{
|
|
<div class="circled-number-diff">@(((Model.PaginationMetadata.currentPage - 1) * Model.PaginationMetadata.pageSize + poemIndex + 1).ToPersianNumbers())</div>
|
|
}
|
|
|
|
<h2>
|
|
<a href="@poem.FullUrl">@poem.FullTitle</a>
|
|
</h2>
|
|
<div class="spacer"> </div>
|
|
<div class="sit">
|
|
@Html.Raw(poem.PlainText)
|
|
</div>
|
|
|
|
<div class="poet">
|
|
<img src="@($"{GanjooRazor.APIRoot.InternetUrl}{poem.Category.Poet.ImageUrl}")" alt="@($"{poem.Category.Poet.Nickname}")" />
|
|
<a role="button" onclick="deletePoetFromSearch(@poem.Category.Poet.Id, '@(poem.Category.Poet.Nickname)')" class="actionlink" title="حذف @($"{poem.Category.Poet.Nickname}") از نتایج"><i class="notranslate noindent-info-button close-button"></i></a>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="spacer"> </div>
|
|
|
|
</div>
|
|
}
|
|
}
|
|
|
|
@if (!string.IsNullOrEmpty(Model.PagingToolsHtml))
|
|
{
|
|
<div class="spacer"> </div>
|
|
@Html.Raw(Model.PagingToolsHtml)
|
|
<div class="spacer"> </div>
|
|
<div>
|
|
تعداد کل نتایج: @Model.PaginationMetadata.totalCount.ToPersianNumbers() قطعه
|
|
<div>
|
|
<small>در هر قطعه ممکن است عبارت چند بار تکرار شده باشد. برای دستیابی به آمار با احتساب تکرارها <a href="https://blog.ganjoor.net/1403/04/06/words-frequency/">بسامد واژگان</a> را ببینید.</small>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@if (!Model.StatsAtTop && Model.QueryIsSingleWord)
|
|
{
|
|
<div class="sitem">
|
|
@* See the matching comment above for why this is a data-* attribute, not a javascript: href. *@
|
|
<a href="javascript:void(0)" data-search-query="@Model.Query" data-poet-id="@Model.PoetId" data-cat-id="@Model.CatId" onclick="loadWordCountsByCat(this.dataset.searchQuery, this.dataset.poetId, this.dataset.catId, false); return false;" id="load-word-counts" class="pagebutton comments-link">
|
|
مشاهدهٔ بسامد واژگان «@Model.QueryDin» به تفکیک بخش
|
|
</a>
|
|
|
|
<div id="wordcounts-placeholder">
|
|
</div>
|
|
|
|
</div>
|
|
}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<partial name="_FooterPartial" model=@(new _FooterPartialModel(){StickyEnabled = true}) />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
@if (ViewData["TrackingScript"] != null && !string.IsNullOrEmpty(ViewData["TrackingScript"].ToString()))
|
|
{
|
|
@Html.Raw(ViewData["TrackingScript"])
|
|
}
|
|
|
|
}
|
|
|
|
@if (Model.StatsAtTop && Model.QueryIsSingleWord)
|
|
{
|
|
<script>
|
|
loadWordCountsByCat('@Model.QueryDin', @Model.PoetId, @Model.CatId, true);
|
|
</script>
|
|
}
|
|
|