divan/GanjooRazor/Areas/User/Pages/SuggestQuoted.cshtml
2026-09-27 14:03:38 +03:30

283 lines
15 KiB
Plaintext

@page
@model GanjooRazor.Areas.User.Pages.SuggestQuotedModel
@using DNTPersianUtils.Core
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
Layout = "_UserPanelLayout";
ViewData["Title"] = "پیشنهاد مشق شعر";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
}
<div class="up-page-header">
<h1>@ViewData["Title"]</h1>
</div>
@if (!string.IsNullOrEmpty(Model.LastMessage))
{
<div class="up-alert up-alert--danger">@Html.Raw(Model.LastMessage)</div>
}
@if (Model.GanjoorQuotedPoem != null && Model.Couplets != null)
{
<script>
function selectGanjoorPage() {
document.getElementById('display-frame').style.display = 'none';
document.getElementById('select-poem').style.display = 'block';
document.getElementById('finalize-select').style.display = 'block';
document.getElementById('finalize-select2').style.display = 'block';
}
function getCouplets(verses) {
let coupetIndex = -1;
let coupletText = "";
let coupletIndices = [];
let coupletTexts = [];
let verseIndex = 0;
let incompleteCouplet = false;
while (verseIndex < verses.length) {
switch (verses[verseIndex].versePosition) {
case 5: // Comment
incompleteCouplet = false;
break;
case -1: // Paragraph
case 4: // Single
incompleteCouplet = false;
if (coupletText) {
coupletIndices.push(coupetIndex);
coupletTexts.push(coupletText);
coupletText = "";
}
coupetIndex++;
coupletIndices.push(coupetIndex);
coupletTexts.push(verses[verseIndex].text);
break;
case 0: // Right
case 2: // CenteredVerse1
incompleteCouplet = false;
if (coupletText) {
coupletIndices.push(coupetIndex);
coupletTexts.push(coupletText);
}
coupetIndex++;
coupletText = verses[verseIndex].text;
break;
case 1: // Left
case 3: // CenteredVerse2
incompleteCouplet = true;
coupletText += ` - ${verses[verseIndex].text}`;
break;
}
verseIndex++;
}
if (incompleteCouplet && coupletText) {
coupletIndices.push(coupetIndex);
coupletTexts.push(coupletText);
}
return { coupletIndices, coupletTexts };
}
function finalizeSelectPage() {
document.getElementById('loading-selection').style.display = 'block';
document.getElementById('finalize-select2').style.display = 'none';
document.getElementById('display-frame').style.display = 'block';
document.getElementById('select-poem').style.display = 'none';
document.getElementById('finalize-select').style.display = 'none';
const currentUrl = document.getElementById('select-poem').contentWindow.location.href;
var url = currentUrl.substring(currentUrl.indexOf('/', currentUrl.indexOf('//') + 2));
fetch('@(GanjooRazor.APIRoot.InternetUrl)/api/ganjoor/page?url=' + url)
.then((response) => response.json())
.then((json) => {
if (json.poem == null) {
document.getElementById('loading-selection').style.display = 'none';
upToast('صفحه‌ای که انتخاب کرده‌اید حاوی یک شعر نیست.', 'error');
selectGanjoorPage();
return;
}
document.getElementById('GanjoorQuotedPoem_RelatedPoemId').value = json.poem.id;
document.getElementById('GanjoorQuotedPoem_RelatedPoetId').value = json.poem.category.poet.id;
document.getElementById('GanjoorQuotedPoem_CachedRelatedPoemPoetName').value = json.poem.category.poet.nickname;
document.getElementById('GanjoorQuotedPoem_CachedRelatedPoemPoetDeathYearInLHijri').value = json.poem.category.poet.deathYearInLHijri.toString();
document.getElementById('GanjoorQuotedPoem_CachedRelatedPoemPoetUrl').value = json.poem.category.poet.fullUrl;
document.getElementById('GanjoorQuotedPoem_CachedRelatedPoemPoetImage').value = json.poem.category.poet.imageUrl;
document.getElementById('GanjoorQuotedPoem_CachedRelatedPoemFullTitle').value = json.poem.fullTitle;
document.getElementById('GanjoorQuotedPoem_CachedRelatedPoemFullUrl').value = json.poem.fullUrl;
const result = getCouplets(json.poem.verses);
var coupletIndices = result.coupletIndices;
var coupletTexts = result.coupletTexts;
var x = document.getElementById("GanjoorQuotedPoem_RelatedCoupletIndex");
x.length = 0;
for (var i = 0; i < coupletIndices.length; i++) {
var option = document.createElement("option");
option.text = bshfarsinum((i + 1).toString()) + ' - ' + coupletTexts[i];
option.value = coupletIndices[i];
x.add(option);
}
x.value = coupletIndices[0];
document.getElementById('loading-selection').style.display = 'none';
}).catch((error) => {
document.getElementById('loading-selection').style.display = 'none';
upToast('در انتخاب صفحه خطایی رخ داد. جزئیات بیشتر: ' + error, 'error');
selectGanjoorPage();
});
}
</script>
<div class="up-alert up-alert--info">
<p class="up-mt-0">از این طریق می‌توانید نقل قول یک شاعر از یک شاعر دیگر را در گنجور ثبت کنید. توجه داشته باشید که اقتفا (یکسانی قافیه) دلیل کافی بر نقل قول نیست. باید در شعرها حداقل یک مصرع بعینه (با تخفیف تفاوت جزئی واژگان) نقل قول شده باشد.</p>
</div>
<div class="up-card">
<form method="post" class="up-form">
@Html.AntiForgeryToken()
<div class="up-alert up-alert--info">
<p class="up-mt-0">از فهرست زیر بیتی را که نقل قول در آن رخ داده مشخص کنید.</p>
</div>
<p>
بیت مرجع از <a href="/?p=@Model.GanjoorQuotedPoem.PoemId">شعر</a>:
<input type="hidden" asp-for="GanjoorQuotedPoem.Id" />
<input type="hidden" asp-for="GanjoorQuotedPoem.PoemId" />
<input type="hidden" asp-for="GanjoorQuotedPoem.PoetId" />
</p>
<div class="up-field">
<label for="GanjoorQuotedPoem_CoupletIndex">بیت</label>
<select asp-for="GanjoorQuotedPoem.CoupletIndex">
@foreach (var item in Model.Couplets)
{
<option value="@item.Item1">@($"{(item.Item1 + 1).ToPersianNumbers()} - {item.Item2}")</option>
}
</select>
</div>
<div class="up-check-row">
<input asp-for="GanjoorQuotedPoem.CoupletVerse1ShouldBeEmphasized" />
<label for="GanjoorQuotedPoem_CoupletVerse1ShouldBeEmphasized">نقل قول در مصرع اول</label>
</div>
<div class="up-check-row">
<input asp-for="GanjoorQuotedPoem.CoupletVerse2ShouldBeEmphasized" />
<label for="GanjoorQuotedPoem_CoupletVerse2ShouldBeEmphasized">نقل قول در مصرع دوم</label>
</div>
<div class="up-alert up-alert--info">
<p class="up-mt-0">اگر شعر مرتبط در گنجور وجود دارد آن را با «گزینش شعر مرتبط» و پیدا کردن آن در صفحه‌ای که باز می‌شود مشخص کنید.</p>
</div>
<a onclick="finalizeSelectPage()" class="up-btn up-btn--ghost" role="button" id="finalize-select2" style="display:none">انتخاب کردم</a>
<iframe id="select-poem" src="/" height="600" style="display:none;width:100%;margin:auto"></iframe>
<div class="up-btn-group">
<a onclick="selectGanjoorPage()" class="up-btn up-btn--ghost" role="button" id="display-frame">🔎 گزینش شعر مرتبط</a>
<input asp-for="GanjoorQuotedPoem.RelatedPoemId" type="hidden" />
<a onclick="finalizeSelectPage()" class="up-btn up-btn--ghost" role="button" id="finalize-select" style="display:none">انتخاب کردم</a>
<div id="loading-selection" style="display:none"><img src="/image/loading.gif" /></div>
</div>
@if (Model.GanjoorQuotedPoem.RelatedPoemId != null)
{
<p><a href="/?p=@Model.GanjoorQuotedPoem.RelatedPoemId">🔗 مشاهدهٔ شعر مرتبط</a></p>
}
<div class="up-field">
<label for="GanjoorQuotedPoem_RelatedCoupletIndex">بیت مرتبط</label>
<select asp-for="GanjoorQuotedPoem.RelatedCoupletIndex">
@foreach (var item in Model.RelatedCouplets)
{
<option value="@item.Item1">@($"{(item.Item1 + 1).ToPersianNumbers()} - {item.Item2}")</option>
}
</select>
</div>
<div class="up-alert up-alert--info">
<p class="up-mt-0">اگر شعر مرتبط در گنجور وجود ندارد مصرع اول و دوم مرتبط آن را در کادرهای بعد تایپ کنید.</p>
</div>
<div class="up-field">
<label for="GanjoorQuotedPoem_RelatedCoupletVerse1">مصرع اول مرتبط (خارج از گنجور)</label>
<p class="up-hint">اگر شعر را از طریق دکمهٔ «گزینش شعر مرتبط» انتخاب کرده‌اید کادر زیر را خالی بگذارید.</p>
<input asp-for="GanjoorQuotedPoem.RelatedCoupletVerse1" size="65" />
</div>
<div class="up-check-row">
<input asp-for="GanjoorQuotedPoem.RelatedCoupletVerse1ShouldBeEmphasized" />
<label for="GanjoorQuotedPoem_RelatedCoupletVerse1ShouldBeEmphasized">نقل قول در مصرع اول شعر مرتبط</label>
</div>
<div class="up-field">
<label for="GanjoorQuotedPoem_RelatedCoupletVerse2">مصرع دوم مرتبط (خارج از گنجور)</label>
<p class="up-hint">اگر شعر را از طریق دکمهٔ «گزینش شعر مرتبط» انتخاب کرده‌اید کادر زیر را خالی بگذارید.</p>
<input asp-for="GanjoorQuotedPoem.RelatedCoupletVerse2" size="65" />
</div>
<div class="up-check-row">
<input asp-for="GanjoorQuotedPoem.RelatedCoupletVerse2ShouldBeEmphasized" />
<label for="GanjoorQuotedPoem_RelatedCoupletVerse2ShouldBeEmphasized">نقل قول در مصرع دوم شعر مرتبط</label>
<input asp-for="GanjoorQuotedPoem.SortOrder" hidden />
</div>
<div class="up-check-row">
<input asp-for="GanjoorQuotedPoem.IsPriorToRelated" />
<label for="GanjoorQuotedPoem_IsPriorToRelated">این شعر قدیمی‌تر از شعر مرتبط است</label>
<input asp-for="GanjoorQuotedPoem.ChosenForMainList" type="hidden" />
<input asp-for="GanjoorQuotedPoem.IndirectQuotation" type="hidden" />
</div>
<div class="up-check-row">
<input asp-for="GanjoorQuotedPoem.ClaimedByBothPoets" />
<label for="GanjoorQuotedPoem_ClaimedByBothPoets">منتسب به هر دو شاعر</label>
</div>
<div class="up-field">
<label for="GanjoorQuotedPoem_CachedRelatedPoemPoetName">شاعر</label>
<input asp-for="GanjoorQuotedPoem.RelatedPoetId" hidden />
<input asp-for="GanjoorQuotedPoem.CachedRelatedPoemPoetName" />
</div>
<div class="up-field">
<label for="GanjoorQuotedPoem_CachedRelatedPoemPoetDeathYearInLHijri">سالمرگ شاعر</label>
<input asp-for="GanjoorQuotedPoem.CachedRelatedPoemPoetDeathYearInLHijri" />
</div>
<div class="up-field up-field--ltr">
<label for="GanjoorQuotedPoem_CachedRelatedPoemPoetUrl">نشانی صفحهٔ شاعر</label>
<input asp-for="GanjoorQuotedPoem.CachedRelatedPoemPoetUrl" size="65" />
<input asp-for="GanjoorQuotedPoem.CachedRelatedPoemPoetImage" type="hidden" />
</div>
<div class="up-field">
<label for="GanjoorQuotedPoem_CachedRelatedPoemFullTitle">عنوان شعر</label>
<input asp-for="GanjoorQuotedPoem.CachedRelatedPoemFullTitle" size="65" />
</div>
<div class="up-field up-field--ltr">
<label for="GanjoorQuotedPoem_CachedRelatedPoemFullUrl">نشانی شعر</label>
<input asp-for="GanjoorQuotedPoem.CachedRelatedPoemFullUrl" size="65" />
<input asp-for="GanjoorQuotedPoem.Published" hidden />
<input asp-for="GanjoorQuotedPoem.SamePoemsQuotedCount" hidden />
</div>
<div class="up-field">
<label for="GanjoorQuotedPoem_Note"><span class="up-field-icon" aria-hidden="true">🗒️</span> یادداشت</label>
<textarea asp-for="GanjoorQuotedPoem.Note" rows="4" cols="80" class="editor"></textarea>
</div>
<div class="up-hint">نیازی به پیشنهاد معکوس این نقل قول نیست. در صورت تأیید، معکوس آن هم به طور خودکار ایجاد می‌شود.</div>
<div class="up-form-actions">
<input type="submit" value="پیشنهاد" class="up-btn up-btn--success up-btn--block" />
</div>
</form>
</div>
}