divan/GanjooRazor/Areas/User/Pages/Editor.cshtml
2026-08-06 20:03:38 +03:30

1606 lines
74 KiB
Plaintext

@page
@model GanjooRazor.Areas.User.Pages.EditorModel
@using DNTPersianUtils.Core
@{
Layout = "_UserPanelLayout";
ViewData["Title"] = "ویرایشگر";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
}
<div class="up-page-header">
<h1>@ViewData["Title"]</h1>
</div>
<script>
$(document).ready(function () {
$('[contenteditable]').keypress(function (e) { return e.which != 13; });
});
</script>
<script>
function resetVersePositions(verseCount) {
for (var i = 1; i <= verseCount; i++) {
var newVersePosition = 'versepostion-' + i.toString();
document.getElementById(newVersePosition).value = i % 2 == 1 ? 'Right' : 'Left';
}
upToast('انجام شد.');
}
function tarkib4VersePositions(verseCount) {
var index = 1;
for (var i = 1; i <= verseCount; i++) {
var newVersePosition = 'versepostion-' + i.toString();
document.getElementById(newVersePosition).value = index == 1 ? 'Right' : index == 2 ? 'Left' : index == 3 ? 'CenteredVerse1' : 'CenteredVerse2';
index++;
if(index == 5){
index = 1;
}
}
upToast('انجام شد.');
}
function tarkib5VersePositions(verseCount) {
var index = 1;
for (var i = 1; i <= verseCount; i++) {
var newVersePosition = 'versepostion-' + i.toString();
document.getElementById(newVersePosition).value = index == 1 || index == 3 ? 'Right' : index == 2 || index == 4 ? 'Left' : 'CenteredVerse1';
index++;
if(index == 6){
index = 1;
}
}
upToast('انجام شد.');
}
function tarkib6VersePositions(verseCount) {
var index = 1;
for (var i = 1; i <= verseCount; i++) {
var newVersePosition = 'versepostion-' + i.toString();
document.getElementById(newVersePosition).value = index == 1 || index == 3 ? 'Right' : index == 2 || index == 4 ? 'Left' : index == 5 ? 'CenteredVerse1' : 'CenteredVerse2';
index++;
if(index == 7){
index = 1;
}
}
upToast('انجام شد.');
}
function savePoemCorrections(id, verseCount) {
var verseOrderText = [];
var verseOrderMarkedForDelete = [];
var versePositions = [];
var verseOrderSummaries = [];
var verseLanguages = [];
for (var i = 0; i <= verseCount; i++) {
var oldElementName = '#original-' + i.toString();
var newElementName = '#id-' + i.toString();
var checkVIndex = '#marked-for-delete-' + i.toString();
var oldVersePosition = '#versepostion-original-' + i.toString();
var newVersePosition = '#versepostion-' + i.toString();
versePositions.push($(newVersePosition).val());
var oldVerseLanguage = '#language-old-' + i.toString();
var newVerseLanguage = '#language-' + i.toString();
verseLanguages.push($(newVerseLanguage).val());
var textChanged = $(newElementName).text() != $(oldElementName).text();
var checkedForDelete = i == 0 ? false : $(checkVIndex).is(":checked");
var positionChanged = i == 0 ? false : $(newVersePosition).val() != $(oldVersePosition).val();
var newLang = i == 0 ? '1' : $(newVerseLanguage).val();
var oldLang = i == 0 ? '1' : $(oldVerseLanguage).text();
var langChanged = newLang != oldLang;
if (textChanged || checkedForDelete || positionChanged || langChanged) {
verseOrderText.push(i.toString() + 'TextSeparator' + $(newElementName).text());
if ($(checkVIndex).is(":checked")) {
verseOrderMarkedForDelete.push(i);
}
}
var oldSummaryName = '#originalsummary-' + i.toString();
var newSummaryName = '#summary-' + i.toString();
if ($(oldSummaryName) != null && $(newSummaryName) != null && $(oldSummaryName).text() != $(newSummaryName).text()) {
verseOrderSummaries.push(i.toString() + 'TextSeparator' + $(newSummaryName).text());
}
}
var rhyme_letters = $('#rhyme-letters').val();
if (rhyme_letters == $('#rhyme-letters-old').text()) {
rhyme_letters = null;
}
var rhythm_new = $('#rhythm-new').val();
if (rhythm_new == $('#rhythm-old').text()) {
rhythm_new = null;
}
var rhythm_new2 = $('#rhythm-new2').val();
if (rhythm_new2 == $('#rhythm-old2').text()) {
rhythm_new2 = null;
}
var section_format = $('#poemformat').val();
if (section_format == $('#poemformat-old').text()) {
section_format = null;
}
if (verseOrderText.length == 0 && verseOrderSummaries.length == 0) {
if (rhythm_new == null && rhythm_new2 == null && rhyme_letters == null && section_format == null) {
upToast('شما هیچ تغییری در اطلاعات نداده‌اید!', 'error');
return;
}
}
$('#savecorrections').hide();
$('#saving').text('در حال ذخیره ...');
var pcs = {};
pcs.poemid = id;
pcs.verseOrderText = verseOrderText;
pcs.verseOrderMarkedForDelete = verseOrderMarkedForDelete;
pcs.versePositions = versePositions;
pcs.rhythm = rhythm_new;
pcs.rhythm2 = rhythm_new2;
pcs.rhyme = rhyme_letters;
pcs.format = section_format;
pcs.verseOrderSummaries = verseOrderSummaries;
pcs.verseLanguages = verseLanguages;
pcs.note = $('#note').val();
pcs.hideMyName = $('#hide-my-name').is(":checked");
var url = '?handler=SendPoemCorrections';
$.ajax({
type: "POST",
url: url,
data: JSON.stringify(pcs),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function () {
location.reload(true);
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
$('#savecorrections').show();
$('#saving').text('');
}
});
}
function computePoemRhyme(poemId, elementId) {
$.ajax({
type: "GET",
url: '?Handler=ComputeRhyme',
data: {
id: poemId
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
},
success: function (rhyme) {
$(elementId).val(rhyme);
return false;
},
});
}
async function deletePoemCorrections(id) {
var ok = await upConfirm('آیا از حذف تغییرات پیشنهادی اطمینان دارید؟');
if (!ok) return;
$('#deletecorrections').hide();
$('#saving').text('در حال ذخیره ...');
var url = '?handler=DeletePoemCorrections';
$.ajax({
type: "POST",
url: url,
data: {
poemid: id,
},
error: function (e) {
upToast(e.responseText || 'خطا رخ داد.', 'error');
},
success: function () {
location.reload(true);
},
});
}
function savemeta(id) {
$('#saving').text('در حال ذخیره ...');
var url = '?handler=SaveMeta';
$.ajax({
type: "POST",
url: url,
data: {
poemid: id,
noindex: $('#chk_noindex').is(":checked"),
redirectfromurl: $('#redirect_from_url').val(),
mixedmodeorder: $('#mixed_mode_order').val()
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
},
success: function () {
location.reload(true);
},
});
}
function internalEditorcompare(id, originalPrefix, editedPrefix, comparePrefix) {
var a = document.getElementById(originalPrefix + id.toString());
var b = document.getElementById(editedPrefix + id.toString());
var result = document.getElementById(comparePrefix + id.toString());
var diff = JsDiff.diffChars(a.textContent, b.textContent);
var fragment = document.createDocumentFragment();
for (var i = 0; i < diff.length; i++) {
if (diff[i].added && diff[i + 1] && diff[i + 1].removed) {
var swap = diff[i];
diff[i] = diff[i + 1];
diff[i + 1] = swap;
}
var node;
if (diff[i].removed) {
node = document.createElement('del');
node.style.color = 'red';
node.appendChild(document.createTextNode(diff[i].value));
} else if (diff[i].added) {
node = document.createElement('span');
node.style.color = 'white';
node.style.backgroundColor = 'green';
node.appendChild(document.createTextNode(diff[i].value));
} else {
node = document.createTextNode(diff[i].value);
}
fragment.appendChild(node);
}
result.textContent = '';
result.appendChild(fragment);
}
function editorcompare(id) {
internalEditorcompare(id, 'original-', 'id-', 'compare-');
}
function summarycompare(id) {
internalEditorcompare(id, 'originalsummary-', 'summary-', 'comparesummary-');
}
async function breakPoem(poemId, vOrder, vText) {
var ok = await upConfirm(vText);
if (!ok) return;
$('#breakpoem-' + String(vOrder)).hide();
var url = '?handler=BreakPoem';
$.ajax({
type: "POST",
url: url,
data: {
poemId: poemId,
vOrder: vOrder
},
success: function (id) {
if (String(id) == '-1') {
upToast('کار شکستن شعر شروع شد.');
return;
}
location.href = '/?p=' + String(id);
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
$('#breakpoem-' + String(vOrder)).show();
}
});
}
function updateRelatedSections(meterId, rhymeletters) {
var url = '?handler=UpdateRelatedSections';
$.ajax({
type: "POST",
url: url,
data: {
meterId: meterId,
rhyme: rhymeletters,
},
success: function () {
upToast('انجام شد.');
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
}
});
}
function secondR() {
const secondtrs = document.querySelectorAll('#secondr1, #secondr2, #secondr3, #secondr4, #secondr5, #secondr6');
secondtrs.forEach(function (secondtr) {
secondtr.removeAttribute("style");
});
document.getElementById('secondr-btn').style.display = 'none';
}
async function updateCoupletIndices(id){
var ok = await upConfirm('آیا از بازسازی اندیس‌های ابیات اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RefillCoupletIndices';
$.ajax({
type: "POST",
url: url,
data: {
id: id,
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
},
success: function () {
upToast('انجام شد.');
},
});
}
async function regenerateSections(id) {
var ok = await upConfirm('آیا از قطعه‌بندی مجدد اطمینان دارید؟');
if (!ok) return;
var ok2 = await upConfirm('قطعه‌بندی مجدد باعث حذف اطلاعات وزن‌ها می‌شود. آیا اطمینان دارید؟');
if (!ok2) return;
var url = '?handler=RegeneratePoemSections';
$.ajax({
type: "POST",
url: url,
data: {
id: id,
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
},
success: function () {
upToast('انجام شد.');
},
});
}
function newGeoDateTag(poemId) {
var url = '?handler=NewGeoDateTag';
var locationId = $('#location').val();
var year = $('#year').val();
var month = $('#month').val()
var day = $('#day').val()
$.ajax({
type: "POST",
url: url,
data: {
poemId: poemId,
locationId: locationId,
year: year,
month: month,
day: day,
verifiedDate: $("#verifiedDate").is(':checked'),
ignoreInCategory: $("#ignoreInCategory").is(':checked'),
},
success: function () {
location.reload();
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
}
});
}
async function deletTag(tagId) {
var ok = await upConfirm('آیا از حذف این برچسب اطمینان دارید؟');
if (!ok) return;
$.ajax({
type: "DELETE",
url: '?handler=GeoDateTag',
data: {
id: tagId,
},
success: function () {
upToast('انجام شد.');
location.reload();
},
error: function (e) {
upToast(e.responseText || String(e), 'error');
}
});
}
</script>
@if (!string.IsNullOrEmpty(Model.FatalError))
{
<div class="up-alert up-alert--danger">@Model.FatalError</div>
}
else
{
<div class="up-alert up-alert--info">
<p>لطفاً در ویرایش متن به <a href="https://blog.ganjoor.net/1400/05/23/notes-for-suggesting-corrections/" target="_blank">این نکات</a> توجه فرمایید.</p>
<p class="up-mt-0"><span class="red-color">جدید:</span> در مورد رسم‌الخط پیشنهادی گنجور <a href="https://blog.ganjoor.net/1402/12/11/dastoor-e-khat/" target="_blank">اینجا</a> را ببینید.</p>
</div>
<p><a role="button" target="_blank" href="@Model.PageInformation.FullUrl" class="up-btn up-btn--ghost">@Model.PageInformation.FullTitle</a></p>
if (Model.MyLastEdit != null)
{
<div class="up-card">
<h2 class="up-card__title">ویرایش‌های بررسی‌نشدهٔ من</h2>
<table>
<tr>
<td>متن اولیه</td>
<td>تغییرات من</td>
</tr>
@if (Model.MyLastEdit.Title != null)
{
<tr>
<td colspan="2">
تغییرات عنوان
</td>
</tr>
<tr>
<td>
<p class="red-color" id="title-lastedit-original">@Model.MyLastEdit.OriginalTitle</p>
</td>
<td>
<p class="green-color" id="title-lastedit-edited">@Model.MyLastEdit.Title</p>
</td>
</tr>
<tr>
<td colspan="2">
<p id="title-lastedit-compare">@Model.MyLastEdit.OriginalTitle</p>
<script>
$(document).ready(function () {
compareCorrectionBlocks('title-lastedit-original', 'title-lastedit-edited', 'title-lastedit-compare');
});
</script>
</td>
</tr>
}
@if (Model.MyLastEdit.Rhythm != null)
{
<tr>
<td colspan="2">
تغییرات وزن
</td>
</tr>
<tr>
<td>
<p class="red-color">@Model.MyLastEdit.OriginalRhythm</p>
</td>
<td>
<p class="green-color">@Model.MyLastEdit.Rhythm</p>
</td>
</tr>
}
@if (Model.MyLastEdit.Rhythm2 != null)
{
<tr>
<td colspan="2">
تغییرات وزن دوم
</td>
</tr>
<tr>
<td>
<p class="red-color">@Model.MyLastEdit.OriginalRhythm2</p>
</td>
<td>
<p class="green-color">@Model.MyLastEdit.Rhythm2</p>
</td>
</tr>
}
@if (Model.MyLastEdit.RhymeLetters != null)
{
<tr>
<td colspan="2">
تغییرات قافیه
</td>
</tr>
<tr>
<td>
<p class="red-color">@Model.RhymeLetters</p>
</td>
<td>
<p class="green-color">@Model.MyLastEdit.RhymeLetters</p>
</td>
</tr>
}
@if (Model.MyLastEdit.PoemFormat != null)
{
<tr>
<td colspan="2">
تغییرات قالب شعری
</td>
</tr>
<tr>
<td>
<p class="red-color"> @RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.MyLastEdit.OriginalPoemFormat)</p>
</td>
<td>
<p class="green-color"> @RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.MyLastEdit.PoemFormat)</p>
</td>
</tr>
}
@if (Model.MyLastEdit.PoemSummary != null)
{
<tr>
<td colspan="2">خلاصهٔ پیشنهادی من</td>
</tr>
<tr>
<td>
<p class="red-color" id="summary-lastedit-original">@Model.MyLastEdit.OriginalPoemSummary</p>
</td>
<td>
<p class="green-color" id="summary-lastedit-edited">@Model.MyLastEdit.PoemSummary</p>
</td>
</tr>
<tr>
<td colspan="2">
<p id="summary-lastedit-compare">@Model.MyLastEdit.OriginalPoemSummary</p>
<script>
$(document).ready(function () {
compareCorrectionBlocks('summary-lastedit-original', 'summary-lastedit-edited', 'summary-lastedit-compare');
});
</script>
</td>
</tr>
}
@if (Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Length > 0)
{
<tr>
<td colspan="2">
تغییرات متن
</td>
</tr>
@foreach (var verse in Model.MyLastEdit.VerseOrderText)
{
@if (verse.MarkForDelete)
{
<tr>
<td colspan="2">@verse.OriginalText</td>
</tr>
<tr>
<td>
<p>@verse.OriginalText</p>
</td>
<td>
<p class="red-color">باید حذف شود</p>
</td>
</tr>
}
else
{
@if (verse.VersePosition != null)
{
<tr>
<td colspan="2">@verse.OriginalText</td>
</tr>
<tr>
<td>
@if (verse.OriginalVersePosition != null)
{
<text>
نوع پیشین مصرع: <p class="red-color">@RMuseum.Models.Ganjoor.VersePositionHelper.GetVersePositionString((RMuseum.Models.Ganjoor.VersePosition)verse.OriginalVersePosition)</p>
</text>
}
</td>
<td>
نوع پیشنهادی مصرع: <p class="green-color">@RMuseum.Models.Ganjoor.VersePositionHelper.GetVersePositionString((RMuseum.Models.Ganjoor.VersePosition)verse.VersePosition)</p>
</td>
</tr>
}
@if (verse.Text != null)
{
<tr>
<td colspan="2">@verse.OriginalText</td>
</tr>
<tr>
<td>
<p class="red-color" id="verse@verse.Id-lastedit-original">@verse.OriginalText</p>
</td>
<td>
<p class="green-color" id="verse@verse.Id-lastedit-edited">@verse.Text</p>
</td>
</tr>
<tr>
<td colspan="2">
<p id="verse@verse.Id-lastedit-compare">@verse.OriginalText</p>
<script>
$(document).ready(function () {
compareCorrectionBlocks('verse@verse.Id-lastedit-original', 'verse@verse.Id-lastedit-edited', 'verse@verse.Id-lastedit-compare');
});
</script>
</td>
</tr>
}
@if (verse.LanguageId != null)
{
<tr>
<td colspan="2">@verse.OriginalText</td>
</tr>
<tr>
<td>
@if (verse.OriginalLanguageId == null)
{
<p class="red-color">زبان: فارسی</p>
}
else
{
<p class="red-color">زبان: @Model.Languages.Where(l => l.Id == verse.OriginalLanguageId).Single().Name</p>
}
</td>
<td>
<p class="green-color">@Model.Languages.Where(l => l.Id == verse.LanguageId).Single().Name</p>
</td>
</tr>
}
@if (verse.CoupletSummary != null)
{
<tr>
<td colspan="2">
<p>معنی @(verse.OriginalText + " ...")</p>
</td>
</tr>
<tr>
<td>
<p class="red-color" id="verse-summary@verse.Id-lastedit-original">@verse.OriginalCoupletSummary</p>
</td>
<td>
<p class="green-color" id="verse-summary@verse.Id-lastedit-edited">@verse.CoupletSummary</p>
</td>
</tr>
<tr>
<td colspan="2">
<p id="verse-summary@verse.Id-lastedit-compare">@verse.OriginalText</p>
<script>
$(document).ready(function () {
compareCorrectionBlocks('verse-summary@verse.Id-lastedit-original', 'verse-summary@verse.Id-lastedit-edited', 'verse-summary@verse.Id-lastedit-compare');
});
</script>
</td>
</tr>
}
}
}
}
@if (!string.IsNullOrEmpty(Model.MyLastEdit.Note))
{
<tr>
<td>یادداشت:</td>
<td>
@Model.MyLastEdit.Note
</td>
</tr>
}
<tr>
<td colspan="2" class="td-button-container">
<a role="button" id="deletecorrections" class="up-btn up-btn--danger" onclick="deletePoemCorrections(@Model.PageInformation.Poem.Id)">انصراف و حذف این ویرایش</a>
</td>
</tr>
</table>
</div>
}
<div class="up-btn-group">
<a href="/User/PoemCorrectionsHistory?id=@Model.PageInformation.Id" role="button" class="up-btn up-btn--ghost" target="_blank">سوابق ویرایش</a>
@if (Model.PageInformation.Poem.Previous != null)
{
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Previous.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر قبل</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Previous.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر قبل</a>
}
}
@if (Model.PageInformation.Poem.Next != null)
{
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Next.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر بعد</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Next.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر بعد</a>
}
}
@if (Model.CanAssignRhythms)
{
<a role="button" href="#rhythms-section" class="up-btn up-btn--sm up-btn--ghost">لغزش به بخش وزن</a>
}
else
{
<a role="button" href="#poem-sections" class="up-btn up-btn--sm up-btn--ghost">لغزش به بخش قطعات</a>
}
<a role="button" href="#summaries" class="up-btn up-btn--sm up-btn--ghost">لغزش به بخش معنی</a>
<a role="button" href="#footer" class="up-btn up-btn--sm up-btn--ghost">لغزش به پایین صفحه</a>
@if (Model.CanEdit && !Model.ShowAdminOps)
{
<a role="button" href="/User/Editor?id=@Model.PageInformation.Id&admin=1" class="up-btn up-btn--ghost">امکانات مدیریتی</a>
}
</div>
@if (Model.TextSourceImage != null)
{
<div class="up-card">
<p><strong>منبع کاغذی:</strong></p>
<p class="up-hint">(متن پیشنهادی نمی‌بایست از نسخهٔ متفاوتی باشد)</p>
<div class="related-images">
<div class="related-image-container">
<a target="_blank" href="@Html.Raw(Model.TextSourceImage.TargetPageUrl)">
<img src="@Html.Raw(Model.TextSourceImage.ThumbnailImageUrl)" alt="@Model.TextSourceImage.AltText" loading="lazy" class="related-image-main">
</a>
</div>
</div>
</div>
}
<div class="up-card">
<h2 class="up-card__title">ویرایش متن</h2>
<div class="up-field">
<label>عنوان فعلی</label>
<p id="original-0" class="up-field-static">@Model.PageInformation.Poem.Title</p>
</div>
<div class="up-field">
<label for="id-0">عنوان ویراستهٔ من</label>
@if (Model.MyLastEdit != null && Model.MyLastEdit.Title != null)
{
<div id="id-0" name="id-0" contenteditable="true" class="background-white">@Model.MyLastEdit.Title</div>
<script>
$(document).ready(function () {
editorcompare(0);
});
document.getElementById("id-0").addEventListener("input", function () {
editorcompare(0)
}, false);
</script>
}
else
{
<div type="text" id="id-0" name="id-0" contenteditable="true" class="background-white">@Model.PageInformation.Poem.Title</div>
<script>
document.getElementById("id-0").addEventListener("input", function () {
editorcompare(0)
}, false);
</script>
}
</div>
<div class="up-field">
<label>تغییرات</label>
<p id="compare-0" class="up-field-static">@Model.PageInformation.Poem.Title</p>
</div>
</div>
<div class="up-card">
<h2 class="up-card__title">ویرایش مصرع‌ها</h2>
@foreach (var verse in Model.PageInformation.Poem.Verses)
{
<div class="up-verse-row" id="tr-@verse.VOrder">
<p class="up-hint">بیت @Model.GetVerseCoupletNumber(verse).ToPersianNumbers() &mdash; ترتیب مصرع یا خط از ابتدا: @verse.VOrder.ToPersianNumbers()</p>
<div class="up-field">
<label>متن فعلی</label>
<p id="original-@($"{verse.VOrder}")" class="up-field-static">@verse.Text</p>
</div>
<div class="up-field">
<label for="id-@($"{verse.VOrder}")">ویراستهٔ من</label>
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder && !string.IsNullOrEmpty(v.Text)).Any())
{
<div id="id-@($"{verse.VOrder}")" name="name-@($"{verse.VOrder}")" contenteditable="true" class="background-white">@Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder).First().Text</div>
<script>
document.getElementById("id-@($"{verse.VOrder}")").addEventListener("input", function () {
editorcompare(@verse.VOrder)
}, false);
$(document).ready(function () {
editorcompare(@verse.VOrder);
});
</script>
}
else
{
<div id="id-@($"{verse.VOrder}")" name="name-@($"{verse.VOrder}")" contenteditable="true" class="background-white">@verse.Text</div>
<script>
document.getElementById("id-@($"{verse.VOrder}")").addEventListener("input", function () {
editorcompare(@verse.VOrder)
}, false);
</script>
}
</div>
<div class="up-field">
<label>تغییرات</label>
<p id="compare-@($"{verse.VOrder}")" class="up-field-static">@verse.Text</p>
</div>
<div class="up-field">
<label for="versepostion-@($"{verse.VOrder}")">نوع</label>
<select id="versepostion-@($"{verse.VOrder}")" name="versepostion-@($"{verse.VOrder}")">
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder && v.VersePosition != null).Any())
{
@foreach (var verseposition in RMuseum.Models.Ganjoor.VersePositionHelper.VersePositions)
if (verseposition.VersePosition == Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder).First().VersePosition)
{
<option value="@verseposition.VersePosition" selected>@verseposition.Text</option>
}
else
{
<option value="@verseposition.VersePosition">@verseposition.Text</option>
}
}
else
{
@foreach (var verseposition in RMuseum.Models.Ganjoor.VersePositionHelper.VersePositions)
if (verseposition.VersePosition == verse.VersePosition)
{
<option value="@verseposition.VersePosition" selected>@verseposition.Text</option>
}
else
{
<option value="@verseposition.VersePosition">@verseposition.Text</option>
}
}
</select>
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder).Any())
{
<input type="hidden" id="versepostion-original-@($"{verse.VOrder}")" name="versepostion-original-@($"{verse.VOrder}")" value="@Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder).First().VersePosition" />
}
else
{
<input type="hidden" id="versepostion-original-@($"{verse.VOrder}")" name="versepostion-original-@($"{verse.VOrder}")" value="@verse.VersePosition" />
}
</div>
<div class="up-field">
<label>زبان فعلی</label>
<p class="up-field-static">
@if (verse.LanguageId == null)
{
@("فارسی")
<span id="language-old-@verse.VOrder" class="hidden-recitation">1</span>
}
else
{
@Model.Languages.Where(l => l.Id == verse.LanguageId).Single().Name
<span id="language-old-@verse.VOrder" class="hidden-recitation">@Model.Languages.Where(l => l.Id == verse.LanguageId).Single().Id</span>
}
</p>
</div>
<div class="up-field">
<label for="language-@verse.VOrder">زبان</label>
<select id="language-@verse.VOrder">
@foreach (var lang in Model.Languages)
{
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder && v.LanguageId == lang.Id).Any())
{
<option value="@lang.Id" selected>@lang.Name</option>
}
else if (verse.LanguageId == null && lang.Id == 1)
{
<option value="1" selected>فارسی</option>
}
else if (verse.LanguageId == lang.Id)
{
<option value="@lang.Id" selected>@lang.Name</option>
}
else
{
<option value="@lang.Id">@lang.Name</option>
}
}
</select>
</div>
<div class="up-check-row">
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder && v.MarkForDelete).Any())
{
<input type="checkbox" name="marked-for-delete-@verse.VOrder" id="marked-for-delete-@verse.VOrder" checked />
}
else
{
<input type="checkbox" name="marked-for-delete-@verse.VOrder" id="marked-for-delete-@verse.VOrder" />
}
<label for="marked-for-delete-@verse.VOrder">باید حذف شود</label>
</div>
<div class="up-btn-group">
<a role="button" href="#savecorrections" class="up-btn up-btn--sm up-btn--ghost">لغزش به دکمهٔ ذخیره</a>
@if (Model.ShowAdminOps && verse.VOrder > 1 && verse.VersePosition != RMuseum.Models.Ganjoor.VersePosition.Left)
{
<a role="button" id="breakpoem-@verse.VOrder" class="up-btn up-btn--sm up-btn--danger" onclick="breakPoem(@Model.PageInformation.Poem.Id, @verse.VOrder, '@verse.Text')">شکستن از اینجا</a>
}
</div>
</div>
}
</div>
@if (!Model.CanAssignRhythms)
{
<div class="up-alert up-alert--warning">این مورد شامل بیش از یک قطعه شعر یا دارای پاراگراف نثر است و امکان انتساب وزن و قالب شعری به آن و یا تعیین حروف قافیهٔ آن وجود ندارد.</div>
}
else
{
<div class="up-card" id="rhythms-section">
<h2 class="up-card__title">وزن</h2>
<div class="up-field">
<label>وزن فعلی</label>
<p id="rhythm-old" class="up-field-static">@(Model.GanjoorMetre1 == null ? "" : Model.GanjoorMetre1.Rhythm)</p>
</div>
<div class="up-alert up-alert--warning">
<p class="up-mt-0">توجه داشته باشید که کارکرد برچسب‌گذاری اشعار در گنجور یافتن اشعار هم‌وزن است. از این جهت از پیشنهاد صورت‌های سلیقه‌ای و متفاوت یک وزن خودداری کنید تا این قابلیت مختل نشود. <a href="https://ganjoor.net/faq?id=14" target="_blank">این نکته</a> را هم مد نظر داشته باشید.</p>
</div>
<div class="up-field">
<label for="select-search">جستجوی وزن</label>
<input type="text" id="select-search" value="" oninput="doSearchInRhythmsCombo('select-search', 'rhythm-new')" list="inputRhythms" autocomplete="off" />
<datalist id="inputRhythms">
@if (Model.RhythmsByVerseCount != null)
@foreach (var rhythm in Model.RhythmsByVerseCount)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</datalist>
</div>
<div class="up-field">
<label for="rhythm-new">وزن ویراستهٔ من</label>
<select id="rhythm-new" name="rhythm-new">
@foreach (var rhythm in Model.RhythmsAlphabetically)
{
if (Model.MyLastEdit != null && Model.MyLastEdit.Rhythm == rhythm.Rhythm)
{
<option value="@rhythm.Rhythm" selected>@rhythm.Rhythm</option>
}
else
{
if (Model.GanjoorMetre1 != null && Model.GanjoorMetre1.Rhythm == rhythm.Rhythm)
{
<option value="@rhythm.Rhythm" selected>@rhythm.Rhythm</option>
}
else
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
}
}
</select>
<div class="up-btn-group up-mt-0">
<a role="button" onclick="resetRhythm('rhythm-new')" class="up-btn up-btn--sm up-btn--ghost">پاک کردن وزن</a>
<script>
function newRhythm() {
var rhythm = prompt("پیشنهاد وزن جدید", "");
if (rhythm != null) {
var select = document.getElementById('rhythm-new');
var options = select.options;
for (let i = 0; i < options.length; i++) {
if (options[i].value == rhythm) {
upToast('وزن پیشنهادی تکراری است.', 'error');
return;
}
}
var opt = document.createElement('option');
opt.value = rhythm;
opt.innerHTML = rhythm;
select.appendChild(opt);
var opt2 = document.createElement('option');
opt2.value = rhythm;
opt2.innerHTML = rhythm;
document.getElementById('rhythm-new2').appendChild(opt2);
upToast('وزن پیشنهادی به انتهای لیست وزن‌ها اضافه شده. لطفاً از لیست آن را انتخاب کنید.');
}
}
</script>
<a role="button" onclick="newRhythm()" class="up-btn up-btn--sm up-btn--ghost">پیشنهاد وزن جدید</a>
</div>
</div>
<div class="up-field">
<label>حروف قافیهٔ فعلی</label>
<p id="rhyme-letters-old" class="up-field-static">@Model.RhymeLetters</p>
</div>
<div class="up-field">
<label for="rhyme-letters">حروف قافیهٔ ویراستهٔ من (بدون فاصله و حرکات)</label>
<div class="up-btn-group up-mt-0">
@if (Model.MyLastEdit != null && !string.IsNullOrEmpty(Model.MyLastEdit.RhymeLetters))
{
<input type="text" id="rhyme-letters" name="rhyme-letters" value="@Model.MyLastEdit.RhymeLetters" style="flex:1;" />
}
else
{
<input type="text" id="rhyme-letters" name="rhyme-letters" value="@Model.RhymeLetters" style="flex:1;" />
}
<a role="button" onclick="computePoemRhyme(@Model.PageInformation.Id, '#rhyme-letters')" class="up-btn up-btn--ghost">محاسبه</a>
</div>
</div>
<div id="secondr-btn">
<a role="button" onclick="secondR()" class="up-btn up-btn--sm up-btn--ghost">این شعر دو وزنی است</a>
</div>
<div id="secondr1" style="display:none">
<h3 class="up-card__title">وزن دوم (شعرهای چندوزنی)</h3>
</div>
<div id="secondr2" class="up-alert up-alert--warning" style="display:none">
<p class="up-mt-0">تعدادی کمی از شعرها دو وزنی هستند.</p>
</div>
<div id="secondr3" class="up-field" style="display:none">
<label>وزن دوم فعلی</label>
<p id="rhythm-old2" class="up-field-static">@(Model.GanjoorMetre2 == null ? "" : Model.GanjoorMetre2.Rhythm)</p>
</div>
<div id="secondr4" class="up-field" style="display:none">
<label for="select-search2">جستجوی وزن (دوم)</label>
<input type="text" id="select-search2" value="" oninput="doSearchInRhythmsCombo('select-search2', 'rhythm-new2')" list="inputRhythms2" autocomplete="off" />
<datalist id="inputRhythms2">
@if (Model.RhythmsByVerseCount != null)
@foreach (var rhythm in Model.RhythmsByVerseCount)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</datalist>
</div>
<div id="secondr5" class="up-field" style="display:none">
<label for="rhythm-new2">وزن (دوم) انتخاب شده</label>
<select id="rhythm-new2" name="rhythm-new2">
@foreach (var rhythm in Model.RhythmsAlphabetically)
{
if (Model.MyLastEdit != null && Model.MyLastEdit.Rhythm2 == rhythm.Rhythm)
{
<option value="@rhythm.Rhythm" selected>@rhythm.Rhythm</option>
}
else
{
if (Model.GanjoorMetre2 != null && Model.GanjoorMetre2.Rhythm == rhythm.Rhythm)
{
<option value="@rhythm.Rhythm" selected>@rhythm.Rhythm</option>
}
else
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
}
}
</select>
<a role="button" onclick="resetRhythm('rhythm-new2')" class="up-btn up-btn--sm up-btn--ghost">پاک کردن وزن</a>
</div>
<div id="secondr6" style="display:none"></div>
<div class="up-field">
<label>قالب شعری فعلی</label>
<p class="up-field-static">
@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.PoemFormat)
<span id="poemformat-old" class="hidden-recitation">@Model.PoemFormat</span>
</p>
</div>
<div class="up-field">
<label for="poemformat">قالب شعری</label>
<select id="poemformat">
@foreach (var poemFormat in System.Enum.GetValues(typeof(RMuseum.Models.Ganjoor.GanjoorPoemFormat)))
{
@if (Model.MyLastEdit != null && (Model.MyLastEdit.PoemFormat == (RMuseum.Models.Ganjoor.GanjoorPoemFormat)poemFormat))
{
<option value="@poemFormat" selected>@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString((RMuseum.Models.Ganjoor.GanjoorPoemFormat)poemFormat)</option>
}
else if (Model.PoemFormat == (RMuseum.Models.Ganjoor.GanjoorPoemFormat)poemFormat)
{
<option value="@poemFormat" selected>@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString((RMuseum.Models.Ganjoor.GanjoorPoemFormat)poemFormat)</option>
}
else
{
<option value="@poemFormat">@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString((RMuseum.Models.Ganjoor.GanjoorPoemFormat)poemFormat)</option>
}
}
</select>
</div>
</div>
}
<div class="up-card">
<div class="up-field">
<label for="note">توضیح این ویرایش</label>
@if (Model.MyLastEdit != null && !string.IsNullOrEmpty(Model.MyLastEdit.Note))
{
<input type="text" id="note" name="note" value="@Model.MyLastEdit.Note" />
}
else
{
<input type="text" id="note" name="note" value="" />
}
</div>
</div>
<div class="up-card" id="summaries">
<h2 class="up-card__title">خلاصه و معنی</h2>
<div class="up-alert up-alert--warning">
<p>توجه فرمایید که هدف از این بخش، تفسیر متن اشعار <span style="color:red">نیست</span>. انتظار می‌رود در این بخش برای متون و اشعاری مثل داستان‌ها خلاصه یا لب مطلب را بنویسید (برای بعضی از انواع اشعار مثل غزل‌ها ممکن است خلاصهٔ کلی معنی نداشته باشد). برای خطوط یا ابیات نیز برگردان متن به نثر قابل فهم امروزی نوشته شود (لازم نیست برای همهٔ خطوط برگردان نثر نوشته شود). برای تفسیر یا درج عقاید شخصی خود راجع به اشعار از حاشیه‌ها استفاده کنید.</p>
<p>متن باید خلاصه، به فارسی نوشتاری رسمی (غیرمحاوره‌ای)، خالی از لغات نامأنوس (زبان همه‌کس فهم) و بدون غلط املایی و تایپی باشد.</p>
<p>اگر متن موجود به اندازهٔ کافی خوب باشد ممکن است متن خیلی متفاوت جایگزین تأیید نشود.</p>
<p>نام و مشخصات نویسندهٔ متن در صفحهٔ شعر نمایش داده نمی‌شود اما در تاریخچهٔ تغییرات نگهداری می‌شود.</p>
<p class="up-mt-0">در صورتی که متن تولید شده توسط <span style="color:red">هوش مصنوعی</span> را ویرایش می‌کنید عبارت نشان‌دهندهٔ تولید هوش مصنوعی بودن آن را <span style="color:red">حذف کنید</span>.</p>
</div>
<h3 class="up-card__title">خلاصه یا مفهوم کلی شعر یا متن</h3>
<p class="up-hint">اگر متن یا شعر یک مفهوم و خلاصهٔ کلی ندارد (مثل خیلی از غزلیات حافظ) برای آن متن کلی وارد نکنید.</p>
<div class="up-field">
<label>خلاصهٔ فعلی</label>
<p id="originalsummary-0" class="up-field-static">@Model.PageInformation.Poem.PoemSummary</p>
@if (string.IsNullOrEmpty(Model.PageInformation.Poem.PoemSummary))
{
<p class="up-hint">هنوز متنی برای خلاصهٔ کلی نوشته نشده است.</p>
}
</div>
<div class="up-field">
<label for="summary-0">خلاصهٔ ویراستهٔ من (به زبان غیرمحاوره‌ای و همه‌کس فهم)</label>
@if (Model.MyLastEdit != null && Model.MyLastEdit.PoemSummary != null)
{
<div id="summary-0" name="summary-0" contenteditable="true" class="background-white">@Model.MyLastEdit.PoemSummary</div>
<script>
document.getElementById("summary-0").addEventListener("input", function () {
summarycompare(0)
}, false);
$(document).ready(function () {
summarycompare(0);
});
</script>
}
else
{
<div id="summary-0" name="summary-0" contenteditable="true" class="background-white">@Model.PageInformation.Poem.PoemSummary</div>
<script>
document.getElementById("summary-0").addEventListener("input", function () {
summarycompare(0)
}, false);
</script>
}
</div>
<div class="up-field">
<label>تغییرات</label>
<p id="comparesummary-0" class="up-field-static">@Model.PageInformation.Poem.PoemSummary</p>
</div>
<a role="button" href="#savecorrections" class="up-btn up-btn--sm up-btn--ghost">لغزش به دکمهٔ ذخیره</a>
</div>
<div class="up-card">
<h2 class="up-card__title">برگردان خطوط به زبان ساده</h2>
@for (int verseIndex = 0; verseIndex < Model.PageInformation.Poem.Verses.Length; verseIndex++)
{
@if (
Model.PageInformation.Poem.Verses[verseIndex].VersePosition == RMuseum.Models.Ganjoor.VersePosition.Right
|| Model.PageInformation.Poem.Verses[verseIndex].VersePosition == RMuseum.Models.Ganjoor.VersePosition.CenteredVerse1
|| Model.PageInformation.Poem.Verses[verseIndex].VersePosition == RMuseum.Models.Ganjoor.VersePosition.Paragraph
)
{
<div class="up-verse-row">
<div class="up-field">
<label>متن</label>
@if (Model.PageInformation.Poem.Verses[verseIndex].VersePosition == RMuseum.Models.Ganjoor.VersePosition.Paragraph)
{
<p class="up-field-static">@Model.PageInformation.Poem.Verses[verseIndex].Text</p>
}
else
{
<div class="up-field-static">
@for (int nIndex = verseIndex; nIndex < Model.PageInformation.Poem.Verses.Length &&
(nIndex == verseIndex
||
(
Model.PageInformation.Poem.Verses[nIndex].VersePosition != RMuseum.Models.Ganjoor.VersePosition.Right
&& Model.PageInformation.Poem.Verses[nIndex].VersePosition != RMuseum.Models.Ganjoor.VersePosition.CenteredVerse1
&& Model.PageInformation.Poem.Verses[nIndex].VersePosition != RMuseum.Models.Ganjoor.VersePosition.Paragraph
))
; nIndex++)
{
<div>@Model.PageInformation.Poem.Verses[nIndex].Text</div>
}
</div>
}
</div>
<div class="up-alert up-alert--warning">
<p class="up-mt-0"><span style="color:red">تذکّر مهم:</span> از این کادر برای نوشتن چیزی جز معنی استفاده <span style="color:red">نکنید</span>.</p>
<p class="up-mt-0">در صورتی که متن تولید شده توسط هوش مصنوعی را ویرایش می‌کنید عبارت نشان‌دهندهٔ تولید <span style="color:red">هوش مصنوعی</span> بودن آن را <span style="color:red">حذف کنید</span>.</p>
</div>
<div class="up-field">
<label>معنای فعلی</label>
<p id="originalsummary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")" class="up-field-static">@Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary</p>
@if (string.IsNullOrEmpty(Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary))
{
<p class="up-hint">هنوز متنی برای معنی نوشته نشده است.</p>
}
</div>
<div class="up-field">
<label for="summary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")">معنای ویراستهٔ من (به زبان غیرمحاوره‌ای و همه‌کس فهم)</label>
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == Model.PageInformation.Poem.Verses[verseIndex].VOrder && !string.IsNullOrEmpty(v.CoupletSummary)).Any())
{
<div id="summary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")" name="summary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")" contenteditable="true" class="background-white">@Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == Model.PageInformation.Poem.Verses[verseIndex].VOrder).First().CoupletSummary</div>
<script>
document.getElementById("summary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")").addEventListener("input", function () {
summarycompare(@Model.PageInformation.Poem.Verses[verseIndex].VOrder)
}, false);
$(document).ready(function () {
summarycompare(@Model.PageInformation.Poem.Verses[verseIndex].VOrder);
});
</script>
}
else
{
<div id="summary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")" name="summary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")" contenteditable="true" class="background-white">@Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary</div>
<script>
document.getElementById("summary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")").addEventListener("input", function () {
summarycompare(@Model.PageInformation.Poem.Verses[verseIndex].VOrder)
}, false);
</script>
}
</div>
<div class="up-field">
<label>تغییرات</label>
<p id="comparesummary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")" class="up-field-static">@Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary</p>
</div>
<a role="button" href="#savecorrections" class="up-btn up-btn--sm up-btn--ghost">لغزش به دکمهٔ ذخیره</a>
</div>
}
}
</div>
@if (Model.PageInformation.Poem.Sections.Count(s => s.SectionType == RMuseum.Models.Ganjoor.PoemSectionType.WholePoem && s.VerseType == RMuseum.Models.Ganjoor.VersePoemSectionType.First) > 1)
{
<div class="up-card" id="poem-sections">
<h2 class="up-card__title">قطعات</h2>
@foreach (var poemSetion in Model.PageInformation.Poem.Sections.Where(s => s.SectionType == RMuseum.Models.Ganjoor.PoemSectionType.WholePoem && s.VerseType == RMuseum.Models.Ganjoor.VersePoemSectionType.First).ToList())
{
<div class="up-verse-row">
<a href="/User/Section?poemId=@poemSetion.PoemId&index=@poemSetion.Index" role="button" class="up-btn up-btn--sm up-btn--ghost">
قطعهٔ @(poemSetion.Number.ToPersianNumbers()):
</a>
<p>@Html.Raw(poemSetion.HtmlText)</p>
<p class="up-hint">وزن: @(poemSetion.GanjoorMetre == null ? "تعیین نشده" : poemSetion.GanjoorMetre.Rhythm)</p>
</div>
}
</div>
}
else
if (Model.PageInformation.Poem.Sections.Count(s => s.SectionType == RMuseum.Models.Ganjoor.PoemSectionType.WholePoem && s.VerseType == RMuseum.Models.Ganjoor.VersePoemSectionType.First) == 1)
{
foreach (var poemSetion in Model.PageInformation.Poem.Sections.Where(s => s.SectionType == RMuseum.Models.Ganjoor.PoemSectionType.WholePoem && s.VerseType == RMuseum.Models.Ganjoor.VersePoemSectionType.First).ToList())
{
<p id="poem-sections">
<a href="/User/Section?poemId=@poemSetion.PoemId&index=@poemSetion.Index" role="button" class="up-btn up-btn--ghost">
شکستن شعر به قطعات مجزا
</a>
</p>
}
}
<div class="up-btn-group">
<a href="/User/AllPoemSections?id=@Model.PageInformation.Id" role="button" class="up-btn up-btn--ghost">
همهٔ قطعات شعر
</a>
<a role="button" onclick="resetVersePositions(@Model.PageInformation.Poem.Verses.Length)" class="up-btn up-btn--ghost">چینش پیش‌فرض نوع مصرع‌ها</a>
<a role="button" onclick="tarkib4VersePositions(@Model.PageInformation.Poem.Verses.Length)" class="up-btn up-btn--ghost">چینش مربعی</a>
<a role="button" onclick="tarkib5VersePositions(@Model.PageInformation.Poem.Verses.Length)" class="up-btn up-btn--ghost">چینش مخمسی</a>
<a role="button" onclick="tarkib6VersePositions(@Model.PageInformation.Poem.Verses.Length)" class="up-btn up-btn--ghost">چینش مسدسی</a>
<a role="button" href="/User/VerseAdd/?id=@Model.PageInformation.Id" class="up-btn up-btn--ghost">اضافه کردن مصرع‌های جاافتاده</a>
@if (Model.PageInformation.Poem.Previous != null)
{
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Previous.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر قبل</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Previous.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر قبل</a>
}
}
@if (Model.PageInformation.Poem.Next != null)
{
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Next.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر بعد</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Next.Id" role="button" class="up-btn up-btn--ghost">ویرایش شعر بعد</a>
}
}
@if (Model.ShowAdminOps && Model.GanjoorMetre1 != null && !string.IsNullOrEmpty(Model.RhymeLetters))
{
<a role="button" onclick="updateRelatedSections(@Model.GanjoorMetre1.Id, '@Model.RhymeLetters')" class="up-btn up-btn--ghost">بازسازی فهرست اشعار هم‌آهنگ با وزن اول</a>
}
@if (Model.ShowAdminOps && Model.GanjoorMetre2 != null && !string.IsNullOrEmpty(Model.RhymeLetters))
{
<a role="button" onclick="updateRelatedSections(@Model.GanjoorMetre2.Id, '@Model.RhymeLetters')" class="up-btn up-btn--ghost">بازسازی فهرست اشعار هم‌آهنگ با وزن دوم</a>
}
@if (Model.ShowAdminOps)
{
<a role="button" onclick="updateCoupletIndices(@Model.PageInformation.Poem.Id)" class="up-btn up-btn--ghost">تصحیح اندیس‌های ابیات</a>
}
@if (Model.ShowAdminOps)
{
<a role="button" onclick="regenerateSections(@Model.PageInformation.Poem.Id)" class="up-btn up-btn--ghost">قطعه‌بندی مجدد</a>
}
@if (Model.CanEdit && !Model.ShowAdminOps)
{
<a role="button" href="/User/Editor?id=@Model.PageInformation.Id&admin=1" class="up-btn up-btn--ghost">امکانات مدیریتی</a>
}
</div>
@if (Model.ShowAdminOps)
{
<p class="up-hint">برای حذف شعر از قسمت مدیریت بخش اقدام کنید.</p>
}
<div class="up-card">
<div class="up-check-row">
@if (Model.MyLastEdit != null && Model.MyLastEdit.HideMyName)
{
<input type="checkbox" name="hide-my-name" id="hide-my-name" checked />
}
else
{
<input type="checkbox" name="hide-my-name" id="hide-my-name" />
}
<label for="hide-my-name">مشخصات من در تاریخچهٔ ویرایش‌های این شعر نمایش داده نشود</label>
</div>
<div class="up-form-actions">
<a role="button" id="savecorrections" class="up-btn up-btn--success up-btn--block" onclick="savePoemCorrections(@Model.PageInformation.Poem.Id, @Model.PageInformation.Poem.Verses.Length)">ذخیره</a>
</div>
<p id="saving" class="up-hint">&nbsp;</p>
</div>
@if (Model.ShowAdminOps)
{
<div class="up-card">
<h2 class="up-card__title">برچسب‌های زمان و مکان</h2>
<table>
<tr>
<th>مکان</th>
<th>سال</th>
<th>ماه</th>
<th>روز</th>
<th>تاریخ مستند</th>
<th>مختص شعر</th>
<th>#</th>
</tr>
@foreach (var tag in Model.PoemGeoDateTags)
{
<tr id="tag-@tag.Id">
<td>@($"{(tag.Location == null ? "" : tag.Location.Name)}")</td>
<td>@tag.LunarYear</td>
<td>
@{
switch (tag.LunarMonth)
{
case 1:
@("محرم")
;
break;
case 2:
@("صفر")
;
break;
case 3:
@("ربیع‌الاول")
;
break;
case 4:
@("ربیع‌الثانی")
;
break;
case 5:
@("جمادی‌الاول")
;
break;
case 6:
@("جمادی‌الثانی")
;
break;
case 7:
@("رجب")
;
break;
case 8:
@("شعبان")
;
break;
case 9:
@("رمضان")
;
break;
case 10:
@("شوال")
;
break;
case 11:
@("ذیقعده")
;
break;
case 12:
@("ذیحجه")
;
break;
}
}
</td>
<td>@tag.LunarDay</td>
<td>
@if (tag.VerifiedDate)
{
<input type="checkbox" disabled checked />
}
else
{
<input type="checkbox" disabled />
}
</td>
<td>
@if (tag.IgnoreInCategory)
{
<input type="checkbox" disabled checked />
}
else
{
<input type="checkbox" disabled />
}
</td>
<td>
<a role="button" onclick="deletTag(@tag.Id)" class="actionlink" title="حذف"><i class="noindent-info-button delete-icon"></i></a>
</td>
</tr>
}
<tr>
<td>
<select id="location">
@{
foreach (var location in Model.Locations)
{
<option value="@location.Id">@location.Name</option>
}
}
</select>
</td>
<td>
<input type="text" id="year" />
</td>
<td>
<select id="month">
<option value="0">هیچکدام</option>
<option value="1">محرم</option>
<option value="2">صفر</option>
<option value="3">ربیع‌الاول</option>
<option value="4">ربیع‌الثانی</option>
<option value="5">جمادی‌الاول</option>
<option value="6">جمادی‌الثانی</option>
<option value="7">رجب</option>
<option value="8">شعبان</option>
<option value="9">رمضان</option>
<option value="10">شوال</option>
<option value="11">ذیقعده</option>
<option value="12">ذیحجه</option>
</select>
</td>
<td>
<input type="text" id="day" />
</td>
<td>
<input type="checkbox" id="verifiedDate" />
</td>
<td>
<input type="checkbox" id="ignoreInCategory" />
</td>
<td></td>
</tr>
<tr>
<td colspan="7">
<a role="button" class="up-btn up-btn--sm up-btn--ghost" onclick="newGeoDateTag(@Model.PageInformation.Id)">برچسب جدید</a>
</td>
</tr>
</table>
<a href="/Admin/Locations" role="button" class="up-btn up-btn--sm up-btn--ghost">مکان‌ها</a>
</div>
}
@if (Model.ShowAdminOps)
{
<div class="up-card">
<h2 class="up-card__title">ابرداده‌های اضافه</h2>
<div class="up-check-row">
@if (Model.PageInformation.NoIndex)
{
<input type="checkbox" id="chk_noindex" name="chk_noindex" checked />
}
else
{
<input type="checkbox" id="chk_noindex" name="chk_noindex" />
}
<label for="chk_noindex">ایندکس نشود</label>
</div>
<div class="up-field up-field--ltr">
<label for="redirect_from_url">از این نشانی (کامل) هم به این صفحه ری‌دایرکت شود</label>
<input value="@Model.PageInformation.RedirectFromFullUrl" id="redirect_from_url" name="redirect_from_url" />
</div>
<div class="up-field">
<label for="mixed_mode_order">ترتیب در فهرست‌ها</label>
<input value="@Model.PageInformation.Poem.MixedModeOrder" id="mixed_mode_order" name="mixed_mode_order" />
</div>
<div class="up-form-actions">
<a role="button" class="up-btn up-btn--success" onclick="savemeta(@Model.PageInformation.Id)">ذخیرهٔ ابرداده‌ها</a>
</div>
</div>
}
<p id="footer" class="up-text-center">
<a role="button" href="#" class="up-btn up-btn--sm up-btn--ghost">لغزش به بالای صفحه</a>
</p>
}