divan/GanjooRazor/Areas/User/Pages/Editor.cshtml
2023-03-30 15:48:35 +03:30

1616 lines
65 KiB
Plaintext

@page
@model GanjooRazor.Areas.User.Pages.EditorModel
@using DNTPersianUtils.Core
@{
Layout = "_UserPanelLayout";
ViewData["Title"] = "ویرایشگر";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
string color = "#eee";
}
<h1>@ViewData["Title"]</h1>
<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';
}
alert('انجام شد.');
}
function savePoemCorrections(id, verseCount) {
var verseOrderText = [];
var verseOrderMarkedForDelete = [];
var versePositions = [];
var verseOrderSummaries = [];
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());
if ($(newElementName).text() != $(oldElementName).text() || $(checkVIndex).is(":checked") || $(newVersePosition).val() != $(oldVersePosition).val()) {
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;
}
if (verseOrderText.length == 0 && verseOrderSummaries.length == 0) {
if (rhythm_new == null && rhythm_new2 == null && rhyme_letters == null) {
alert('شما هیچ تغییری در متن نداده‌اید!');
return;
}
}
$('#savecorrections').hide();
$('#saving').text('در حال ذخیره ...');
var url = '?handler=SendPoemCorrections';
$.ajax({
type: "POST",
url: url,
data: {
poemid: id,
verseOrderText: verseOrderText,
verseOrderMarkedForDelete: verseOrderMarkedForDelete,
versePositions: versePositions,
rhythm: rhythm_new,
rhythm2: rhythm_new2,
rhyme: rhyme_letters,
verseOrderSummaries: verseOrderSummaries,
note: $('#note').val()
},
success: function () {
location.reload(true);
},
error: function (e) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
$('#savecorrections').show();
$('#saving').text('');
}
});
}
function computePoemRhyme(poemId, elementId) {
$.ajax({
type: "GET",
url: '?Handler=ComputeRhyme',
data: {
id: poemId
},
error: function () {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
},
success: function (rhyme) {
$(elementId).val(rhyme);
return false;
},
});
}
function deletePoemCorrections(id) {
if (!confirm('آیا از حذف تغییرات پیشنهادی اطمینان دارید؟'))
return;
$('#deletecorrections').hide();
$('#saving').text('در حال ذخیره ...');
var url = '?handler=DeletePoemCorrections';
$.ajax({
type: "POST",
url: url,
data: {
poemid: id,
},
error: function () {
alert('خطا رخ داد.')
},
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) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
},
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-');
}
function breakPoem(poemId, vOrder, vText) {
if (!confirm(vText))
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') {
alert('کار شکستن شعر شروع شد.');
return;
}
location.href = '/?p=' + String(id);
},
error: function (e) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
$('#breakpoem-' + String(vOrder)).show();
}
});
}
function updateRelatedSections(meterId, rhymeletters) {
var url = '?handler=UpdateRelatedSections';
$.ajax({
type: "POST",
url: url,
data: {
meterId: meterId,
rhyme: rhymeletters,
},
success: function () {
alert('انجام شد.');
},
error: function (e) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
}
});
}
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';
}
function regenerateSections(id) {
if (!confirm('آیا از قطعه‌بندی مجدد اطمینان دارید؟'))
return;
if (!confirm('قطعه‌بندی مجدد باعث حذف اطلاعات وزن‌ها می‌شود. آیا اطمینان دارید؟'))
return;
var url = '?handler=RegeneratePoemSections';
$.ajax({
type: "POST",
url: url,
data: {
id: id,
},
error: function (e) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
},
success: function () {
alert('انجام شد.');
},
});
}
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) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
}
});
}
function deletTag(tagId) {
if (!confirm('آیا از حذف این برچسب اطمینان دارید؟')) {
return;
}
$.ajax({
type: "DELETE",
url: '?handler=GeoDateTag',
data: {
id: tagId,
},
success: function () {
alert('انجام شد.');
location.reload();
},
error: function (e) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
}
});
}
</script>
@if (!string.IsNullOrEmpty(Model.FatalError))
{
<p>@Model.FatalError</p>
}
else
{
<p>لطفاً در ویرایش متن به <a href="https://blog.ganjoor.net/1400/05/23/notes-for-suggesting-corrections/" target="_blank">این نکات</a> توجه فرمایید.</p>
<p><a role="button" target="_blank" href="@Model.PageInformation.FullUrl" class="actionlink">@Model.PageInformation.FullTitle</a></p>
if (Model.MyLastEdit != null)
{
<table>
<tr>
<td colspan="2">ویرایشهای بررسی نشدهٔ من</td>
</tr>
<tr>
<td>متن اولیه</td>
<td>تغییرات من</td>
</tr>
@if (Model.MyLastEdit.Title != null)
{
<tr>
<td>
<p class="red-color">@Model.MyLastEdit.OriginalTitle</p>
</td>
<td>
<p class="green-color">@Model.MyLastEdit.Title</p>
</td>
</tr>
}
@if (Model.MyLastEdit.Rhythm != null)
{
<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>
<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>
<p class="red-color">@Model.RhymeLetters</p>
</td>
<td>
<p class="green-color">@Model.MyLastEdit.RhymeLetters</p>
</td>
</tr>
}
@if (Model.MyLastEdit.VerseOrderText != null)
@foreach (var verse in Model.MyLastEdit.VerseOrderText)
{
@if (verse.MarkForDelete)
{
<tr>
<td>
<p>@verse.OriginalText</p>
</td>
<td>
<p class="red-color">باید حذف شود</p>
</td>
</tr>
}
else
{
@if (verse.VersePosition != null)
{
<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>
<p class="red-color">@verse.OriginalText</p>
</td>
<td>
<p class="green-color">@verse.Text</p>
</td>
</tr>
}
@if (verse.CoupletSummary != null)
{
<tr>
<td colspan="2">
<p>معنی @(verse.OriginalText + " ...")</p>
</td>
</tr>
<tr>
<td>
<p class="red-color">@verse.OriginalCoupletSummary</p>
</td>
<td>
<p class="green-color">@verse.CoupletSummary</p>
</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="editor-button background-red" onclick="deletePoemCorrections(@Model.PageInformation.Poem.Id)">انصراف و حذف این ویرایش</a>
</td>
</tr>
</table>
}
<table>
<tr>
<td><a href="/User/PoemCorrectionsHistory?id=@Model.PageInformation.Id" role="button" class="pagebutton" target="_blank">سوابق ویرایش</a></td>
</tr>
@if (Model.PageInformation.Poem.Previous != null)
{
<tr>
<td>
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Previous.Id" role="button" class="pagebutton">ویرایش شعر قبل</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Previous.Id" role="button" class="pagebutton">ویرایش شعر قبل</a>
}
</td>
</tr>
}
@if (Model.PageInformation.Poem.Next != null)
{
<tr>
<td>
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Next.Id" role="button" class="pagebutton">ویرایش شعر بعد</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Next.Id" role="button" class="pagebutton">ویرایش شعر بعد</a>
}
</td>
</tr>
}
@if (Model.CanAssignRhythms)
{
<tr>
<td class="td-button-container">
<a role="button" href="#rhythms-section" class="editor-button background-gray">لغزش به بخش وزن</a>
</td>
</tr>
}
else
{
<tr>
<td class="td-button-container">
<a role="button" href="#poem-sections" class="editor-button background-gray">لغزش به بخش قطعات</a>
</td>
</tr>
}
<tr>
<td class="td-button-container">
<a role="button" href="#summaries" class="editor-button background-gray">لغزش به بخش معنی </a>
</td>
</tr>
@if (Model.CanEdit && !Model.ShowAdminOps)
{
<tr>
<td><a role="button" href="/User/Editor?id=@Model.PageInformation.Id&admin=1" class="pagebutton">امکانات مدیریتی</a></td>
</tr>
}
@if (Model.TextSourceImage != null)
{
<tr>
<td>
<p><strong>منبع کاغذی:</strong></p>
<p>(متن پیشنهادی نمی‌بایست از نسخهٔ متفاوتی باشد)</p>
</td>
</tr>
<tr>
<td>
<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" width="200" class="related-image">
</a>
</div>
</div>
</td>
</tr>
}
<tr>
<td>
<p><strong>ویرایش متن:</strong></p>
</td>
</tr>
<tr>
<td>
عنوان فعلی:
</td>
</tr>
<tr>
<td>
<p id="original-0">@Model.PageInformation.Poem.Title</p>
</td>
</tr>
<tr>
<td>
عنوان ویراستهٔ من:
</td>
</tr>
<tr>
<td>
@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>
}
</td>
</tr>
<tr>
<td>
تغییرات:
</td>
</tr>
<tr>
<td>
<p id="compare-0">@Model.PageInformation.Poem.Title</p>
</td>
</tr>
@foreach (var verse in Model.PageInformation.Poem.Verses)
{
if (color == "#eee")
{
color = "#ddd";
}
else
{
color = "#eee";
}
<tr id="tr-@verse.VOrder" style="background-color:@color">
<td>
بیت @Model.GetVerseCoupletNumber(verse).ToPersianNumbers()
</td>
</tr>
<tr style="background-color:@color">
<td>
ترتیب مصرع یا خط از ابتدا: @verse.VOrder.ToPersianNumbers()
</td>
</tr>
<tr style="background-color:@color">
<td>
متن فعلی:
</td>
</tr>
<tr style="background-color:@color">
<td>
<p id="original-@($"{verse.VOrder}")">@verse.Text</p>
</td>
</tr>
<tr style="background-color:@color">
<td>
ویراستهٔ من:
</td>
</tr>
<tr style="background-color:@color">
<td>
@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>
}
</td>
</tr>
<tr style="background-color:@color">
<td>
تغییرات:
</td>
</tr>
<tr style="background-color:@color">
<td>
<p id="compare-@($"{verse.VOrder}")">@verse.Text</p>
</td>
</tr>
<tr style="background-color:@color">
<td>
نوع
</td>
</tr>
<tr style="background-color:@color">
<td>
<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" />
}
</td>
</tr>
<tr style="background-color:@color">
<td>
@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 />
<label for="marked-for-delete-@verse.VOrder">باید حذف شود</label>
}
else
{
<input type="checkbox" name="marked-for-delete-@verse.VOrder" id="marked-for-delete-@verse.VOrder" />
<label for="marked-for-delete-@verse.VOrder">باید حذف شود</label>
}
</td>
</tr>
<tr style="background-color:@color">
<td class="td-button-container">
<a role="button" href="#savecorrections" class="editor-button background-gray">لغزش به دکمهٔ ذخیره</a>
</td>
</tr>
@if (Model.ShowAdminOps && verse.VOrder > 1 && verse.VersePosition != RMuseum.Models.Ganjoor.VersePosition.Left)
{
<tr style="background-color:@color">
<td class="td-button-container">
<a role="button" id="breakpoem-@verse.VOrder" class="editor-button background-red" onclick="breakPoem(@Model.PageInformation.Poem.Id, @verse.VOrder, '@verse.Text')">شکستن از اینجا</a>
</td>
</tr>
}
}
@if (!Model.CanAssignRhythms)
{
<tr>
<td>
<p class="red-color">این مورد شامل بیش از یک قطعه شعر یا دارای پاراگراف نثر است و امکان انتساب وزن به آن یا تعیین حروف قافیهٔ ان وجود ندارد.</p>
</td>
</tr>
}
<tr id="rhythms-section">
<td>
وزن فعلی:
</td>
</tr>
<tr>
<td>
<p id="rhythm-old">@(Model.GanjoorMetre1 == null ? "" : Model.GanjoorMetre1.Rhythm)</p>
</td>
</tr>
<tr>
<td>
وزن ویراستهٔ من:
</td>
</tr>
<tr>
<td>
<label for="select-search">جستجوی وزن:</label><br />
<input type="text" id="select-search" value="" oninput="doSearchInRhythmsCombo('select-search', 'rhythm-new')" list="inputRhythms" autocomplete="off" size="50" />
<datalist id="inputRhythms">
@if (Model.RhythmsByVerseCount != null)
@foreach (var rhythm in Model.RhythmsByVerseCount)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</datalist>
</td>
</tr>
<tr>
<td>
<label for="rhythm-new">وزن انتخاب شده:</label>
<br />
<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>
<a role="button" onclick="resetRhythm('rhythm-new')" class="pagebutton">پاک کردن وزن</a>
<br />
<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) {
alert('وزن پیشنهادی تکراری است.');
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);
alert('وزن پیشنهادی به انتهای لیست وزن‌ها اضافه شده. لطفاً از لیست آن را انتخاب کنید.');
}
}
</script>
<a role="button" onclick="newRhythm()" class="pagebutton">پیشنهاد وزن جدید</a>
</td>
</tr>
<tr>
<td>
حروف قافیهٔ فعلی:
</td>
</tr>
<tr>
<td>
<p id="rhyme-letters-old">@Model.RhymeLetters</p>
</td>
</tr>
<tr>
<td>
حروف قافیهٔ ویراستهٔ من (بدون فاصله و حرکات):
</td>
</tr>
<tr>
<td>
@if (Model.MyLastEdit != null && !string.IsNullOrEmpty(Model.MyLastEdit.RhymeLetters))
{
<input type="text" id="rhyme-letters" name="rhyme-letters" value="@Model.MyLastEdit.RhymeLetters" size="50" />
}
else
{
<input type="text" id="rhyme-letters" name="rhyme-letters" value="@Model.RhymeLetters" size="50" />
}
<a role="button" onclick="computePoemRhyme(@Model.PageInformation.Id, '#rhyme-letters')" class="pagebutton">محاسبه</a>
</td>
</tr>
<tr id="secondr-btn">
<td>
<a role="button" onclick="secondR()" class="pagebutton">این شعر دو وزنی است</a>
</td>
</tr>
<tr id="secondr1" style="display:none">
<td>
وزن دوم (شعرهای چندوزنی):
</td>
</tr>
<tr id="secondr2" style="display:none">
<td>
<p class="red-color">تعدادی کمی از شعرها دو وزنی هستند.</p>
</td>
</tr>
<tr id="secondr3" style="display:none">
<td>
<p id="rhythm-old2">@(Model.GanjoorMetre2 == null ? "" : Model.GanjoorMetre2.Rhythm)</p>
</td>
</tr>
<tr id="secondr4" style="display:none">
<td>
وزن ویراستهٔ من (دوم):
</td>
</tr>
<tr id="secondr5" style="display:none">
<td>
<label for="select-search2">جستجوی وزن (دوم):</label><br />
<input type="text" id="select-search2" value="" oninput="doSearchInRhythmsCombo('select-search2', 'rhythm-new2')" list="inputRhythms" autocomplete="off" size="50" />
<datalist id="inputRhythms2">
@if (Model.RhythmsByVerseCount != null)
@foreach (var rhythm in Model.RhythmsByVerseCount)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</datalist>
</td>
</tr>
<tr id="secondr6" style="display:none">
<td>
<label for="rhythm-new2">وزن (دوم) انتخاب شده:</label><br /><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="pagebutton">پاک کردن وزن</a>
</td>
</tr>
<tr>
<td>
توضیح این ویرایش:
</td>
</tr>
<tr>
<td>
@if (Model.MyLastEdit != null && !string.IsNullOrEmpty(Model.MyLastEdit.Note))
{
<input type="text" id="note" name="note" value="@Model.MyLastEdit.Note" size="50" />
}
else
{
<input type="text" id="note" name="note" value="" size="50" />
}
</td>
</tr>
<tr>
<td id="summaries" style="background-color:black; color: white">خلاصه و معنی</td>
</tr>
<tr>
<td style="background-color:#ffffe1">
<p>توجه فرمایید که هدف از این بخش، تفسیر متن اشعار <span style="color:red">نیست</span>. انتظار می‌رود در این بخش برای متون و اشعاری مثل داستان‌ها خلاصه یا لب مطلب را بنویسید (برای بعضی از انواع اشعار مثل غزل‌ها ممکن است خلاصهٔ کلی معنی نداشته باشد). برای خطوط یا ابیات نیز برگردان متن به نثر قابل فهم امروزی نوشته شود (لازم نیست برای همهٔ خطوط برگردان نثر نوشته شود). برای تفسیر یا درج عقاید شخصی خود راجع به اشعار از حاشیه‌ها استفاده کنید.</p>
<p>متن باید خلاصه، به فارسی نوشتاری رسمی (غیرمحاوره‌ای)، خالی از لغات نامأنوس (زبان همه‌کس فهم و ناسره) و بدون غلط املایی و تایپی باشد.</p>
<p>
اگر متن موجود به اندازهٔ کافی خوب باشد ممکن است متن خیلی متفاوت جایگزین تأیید نشود.
</p>
<p>
نام و مشخصات نویسندهٔ متن در صفحهٔ شعر نمایش داده نمی‌شود اما در تاریخچهٔ تغییرات نگهداری می‌شود.
</p>
</td>
</tr>
<tr>
<td style="background-color:black; color: white">خلاصه یا مفهوم کلی شعر یا متن:</td>
</tr>
<tr>
<td style="background-color:#ffffe1">
اگر متن یا شعر یک مفهوم و خلاصهٔ کلی ندارد (مثل خیلی از غزلیات حافظ) برای آن متن کلی وارد نکنید.
</td>
</tr>
<tr>
<td>
<p id="originalsummary-0">@Model.PageInformation.Poem.PoemSummary</p>
@if (string.IsNullOrEmpty(Model.PageInformation.Poem.PoemSummary))
{
<p>هنوز متنی برای خلاصهٔ کلی نوشته نشده است.</p>
}
</td>
</tr>
<tr>
<td>
خلاصهٔ ویراستهٔ من (به زبان غیرمحاوره‌ای و ناسره):
</td>
</tr>
<tr>
<td>
@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>
}
</td>
</tr>
<tr>
<td>
تغییرات:
</td>
</tr>
<tr>
<td>
<p id="comparesummary-0">@Model.PageInformation.Poem.PoemSummary</p>
</td>
</tr>
<tr>
<td class="td-button-container">
<a role="button" href="#savecorrections" class="editor-button background-gray">لغزش به دکمهٔ ذخیره</a>
</td>
</tr>
<tr>
<td style="background-color:black; color: white">برگردان خطوط به نثر روان:</td>
</tr>
@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
)
{
if (color == "#eee")
{
color = "#ddd";
}
else
{
color = "#eee";
}
<tr style="background-color:@color">
<td>
@if (Model.PageInformation.Poem.Verses[verseIndex].VersePosition == RMuseum.Models.Ganjoor.VersePosition.Paragraph)
{
@Model.PageInformation.Poem.Verses[verseIndex].Text
}
else
{
<table>
@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++)
{
<tr>
<td>@Model.PageInformation.Poem.Verses[nIndex].Text</td>
</tr>
}
</table>
}
</td>
</tr>
<tr style="background-color:@color">
<td>
معنای خط یا بیت:
</td>
</tr>
<tr style="background-color:@color">
<td>
<p id="originalsummary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")">@Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary</p>
@if (string.IsNullOrEmpty(Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary))
{
<p>هنوز متنی برای معنی نوشته نشده است.</p>
}
</td>
</tr>
<tr style="background-color:@color">
<td>
معنای ویراستهٔ من (به زبان غیرمحاوره‌ای و ناسره):
</td>
</tr>
<tr style="background-color:@color">
<td>
@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>
}
</td>
</tr>
<tr style="background-color:@color">
<td>
تغییرات:
</td>
</tr>
<tr style="background-color:@color">
<td>
<p id="comparesummary-@($"{Model.PageInformation.Poem.Verses[verseIndex].VOrder}")">@Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary</p>
</td>
</tr>
<tr>
<td class="td-button-container">
<a role="button" href="#savecorrections" class="editor-button background-gray">لغزش به دکمهٔ ذخیره</a>
</td>
</tr>
}
}
@if (Model.PageInformation.Poem.Sections.Count(s => s.SectionType == RMuseum.Models.Ganjoor.PoemSectionType.WholePoem && s.VerseType == RMuseum.Models.Ganjoor.VersePoemSectionType.First) > 1)
{
<tr>
<td id="poem-sections">
قطعات:
</td>
</tr>
<tr>
<td>
<table>
@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())
{
<tr>
<td>
<a href="/User/Section?poemId=@poemSetion.PoemId&index=@poemSetion.Index" role="button" class="pagebutton">
قطعهٔ @(poemSetion.Number.ToPersianNumbers()):
</a>
</td>
</tr>
<tr>
<td>
@Html.Raw(poemSetion.HtmlText)
</td>
</tr>
<tr>
<td>
وزن: @(poemSetion.GanjoorMetre == null ? "تعیین نشده" : poemSetion.GanjoorMetre.Rhythm)
</td>
</tr>
<tr>
<td>
<hr />
</td>
</tr>
}
</table>
</td>
</tr>
}
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())
{
<tr>
<td id="poem-sections">
<a href="/User/Section?poemId=@poemSetion.PoemId&index=@poemSetion.Index" role="button" class="pagebutton">
شکستن شعر به قطعات مجزا
</a>
</td>
</tr>
}
}
<tr>
<td>
<a href="/User/AllPoemSections?id=@Model.PageInformation.Id" role="button" class="pagebutton">
همهٔ قطعات شعر
</a>
</td>
</tr>
<tr>
<td><a role="button" onclick="resetVersePositions(@Model.PageInformation.Poem.Verses.Length)" class="pagebutton">چینش پیش‌فرض نوع مصرع‌ها</a></td>
</tr>
<tr>
<td><a role="button" href="/User/VerseAdd/?id=@Model.PageInformation.Id" class="pagebutton">اضافه کردن مصرع‌های جاافتاده</a></td>
</tr>
@if (Model.PageInformation.Poem.Previous != null)
{
<tr>
<td>
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Previous.Id" role="button" class="pagebutton">ویرایش شعر قبل</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Previous.Id" role="button" class="pagebutton">ویرایش شعر قبل</a>
}
</td>
</tr>
}
@if (Model.PageInformation.Poem.Next != null)
{
<tr>
<td>
@if (Model.ShowAdminOps)
{
<a href="/User/Editor?admin=1&id=@Model.PageInformation.Poem.Next.Id" role="button" class="pagebutton">ویرایش شعر بعد</a>
}
else
{
<a href="/User/Editor?id=@Model.PageInformation.Poem.Next.Id" role="button" class="pagebutton">ویرایش شعر بعد</a>
}
</td>
</tr>
}
@if (Model.ShowAdminOps && Model.GanjoorMetre1 != null && !string.IsNullOrEmpty(Model.RhymeLetters))
{
<tr>
<td><a role="button" onclick="updateRelatedSections(@Model.GanjoorMetre1.Id, '@Model.RhymeLetters')" class="pagebutton">بازسازی فهرست اشعار هم‌آهنگ با وزن اول</a></td>
</tr>
}
@if (Model.ShowAdminOps && Model.GanjoorMetre2 != null && !string.IsNullOrEmpty(Model.RhymeLetters))
{
<tr>
<td><a role="button" onclick="updateRelatedSections(@Model.GanjoorMetre2.Id, '@Model.RhymeLetters')" class="pagebutton">بازسازی فهرست اشعار هم‌آهنگ با وزن دوم</a></td>
</tr>
}
@if (Model.ShowAdminOps)
{
<tr>
<td><a role="button" onclick="regenerateSections(@Model.PageInformation.Poem.Id)" class="pagebutton">قطعه‌بندی مجدد</a></td>
</tr>
<tr>
<td>برای حذف شعر از قسمت مدیریت بخش اقدام کنید.</td>
</tr>
}
@if (Model.CanEdit && !Model.ShowAdminOps)
{
<tr>
<td><a role="button" href="/User/Editor?id=@Model.PageInformation.Id&admin=1" class="pagebutton">امکانات مدیریتی</a></td>
</tr>
}
<tr>
<td class="td-button-container">
<a role="button" id="savecorrections" class="editor-button background-green" onclick="savePoemCorrections(@Model.PageInformation.Poem.Id, @Model.PageInformation.Poem.Verses.Length)">ذخیره</a>
</td>
</tr>
<tr>
<td><p id="saving">&nbsp;</p></td>
</tr>
@if (Model.ShowAdminOps)
{
<tr>
<td>برچسب‌های زمان و مکان</td>
</tr>
<tr>
<td>
<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="pagebutton" onclick="newGeoDateTag(@Model.PageInformation.Id)">برچسب جدید</a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<a href="/Admin/Locations" role="button" class="pagebutton">مکان‌ها</a>
</td>
</tr>
}
@if (Model.ShowAdminOps)
{
<tr>
<td>
<table>
<tr>
<td colspan="2">ابرداده‌های اضافه</td>
</tr>
<tr>
<td>
<span class="inputlabel">ایندکس نشود</span>
</td>
<td>
@if (Model.PageInformation.NoIndex)
{
<input type="checkbox" id="chk_noindex" name="chk_noindex" checked />
}
else
{
<input type="checkbox" id="chk_noindex" name="chk_noindex" />
}
</td>
</tr>
<tr>
<td>
<span class="inputlabel">از این نشانی (کامل) هم به این صفحه ری‌دایرکت شود</span>
</td>
<td>
<input style="text-align:left;direction:ltr;" value="@Model.PageInformation.RedirectFromFullUrl" id="redirect_from_url" name="redirect_from_url" />
</td>
</tr>
<tr>
<td>
<span class="inputlabel">ترتیب در فهرستها:</span>
</td>
<td>
<input value="@Model.PageInformation.Poem.MixedModeOrder" id="mixed_mode_order" name="mixed_mode_order" />
</td>
</tr>
<tr style="background-color:@color">
<td class="td-button-container" colspan="2">
<a role="button" class="editor-button background-green" onclick="savemeta(@Model.PageInformation.Id)">ذخیرهٔ ابرداده‌ها</a>
</td>
</tr>
</table>
</td>
</tr>
}
<tr>
<td class="td-button-container">
<a role="button" href="#" class="editor-button background-gray">لغزش به بالای صفحه</a>
</td>
</tr>
</table>
}