@page @model GanjooRazor.Areas.User.Pages.EditorModel @using DNTPersianUtils.Core @{ Layout = "_UserPanelLayout"; ViewData["Title"] = "ویرایشگر"; await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); }

@ViewData["Title"]

@if (!string.IsNullOrEmpty(Model.FatalError)) {
@Model.FatalError
} else {

نکات مهم در ویرایش متن

🔗 @Model.PageInformation.FullTitle

if (Model.MyLastEdit != null) {

ویرایش‌های بررسی‌نشدهٔ من

@if (Model.MyLastEdit.Title != null) { } @if (Model.MyLastEdit.Rhythm != null) { } @if (Model.MyLastEdit.Rhythm2 != null) { } @if (Model.MyLastEdit.RhymeLetters != null) { } @if (Model.MyLastEdit.PoemFormat != null) { } @if (Model.MyLastEdit.PoemSummary != null) { } @if (Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Length > 0) { @foreach (var verse in Model.MyLastEdit.VerseOrderText) { @if (verse.MarkForDelete) { } else { @if (verse.VersePosition != null) { } @if (verse.Text != null) { } @if (verse.LanguageId != null) { } @if (verse.CoupletSummary != null) { } } } } @if (Model.MyLastEdit.GeoDateTags != null && Model.MyLastEdit.GeoDateTags.Length > 0) { @foreach (var geoDateTag in Model.MyLastEdit.GeoDateTags) { } } @if (!string.IsNullOrEmpty(Model.MyLastEdit.Note)) { }
متن اولیه تغییرات من
تغییرات عنوان

@Model.MyLastEdit.OriginalTitle

@Model.MyLastEdit.Title

@Model.MyLastEdit.OriginalTitle

تغییرات وزن

@Model.MyLastEdit.OriginalRhythm

@Model.MyLastEdit.Rhythm

تغییرات وزن دوم

@Model.MyLastEdit.OriginalRhythm2

@Model.MyLastEdit.Rhythm2

تغییرات قافیه

@Model.RhymeLetters

@Model.MyLastEdit.RhymeLetters

تغییرات قالب شعری

@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.MyLastEdit.OriginalPoemFormat)

@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.MyLastEdit.PoemFormat)

خلاصهٔ پیشنهادی من

@Model.MyLastEdit.OriginalPoemSummary

@Model.MyLastEdit.PoemSummary

@Model.MyLastEdit.OriginalPoemSummary

تغییرات متن
@verse.OriginalText

@verse.OriginalText

باید حذف شود

@verse.OriginalText
@if (verse.OriginalVersePosition != null) { نوع پیشین مصرع:

@RMuseum.Models.Ganjoor.VersePositionHelper.GetVersePositionString((RMuseum.Models.Ganjoor.VersePosition)verse.OriginalVersePosition)

}
نوع پیشنهادی مصرع:

@RMuseum.Models.Ganjoor.VersePositionHelper.GetVersePositionString((RMuseum.Models.Ganjoor.VersePosition)verse.VersePosition)

@verse.OriginalText

@verse.OriginalText

@verse.Text

@verse.OriginalText

@verse.OriginalText
@if (verse.OriginalLanguageId == null) {

زبان: فارسی

} else {

زبان: @Model.Languages.Where(l => l.Id == verse.OriginalLanguageId).Single().Name

}

@Model.Languages.Where(l => l.Id == verse.LanguageId).Single().Name

معنی @(verse.OriginalText + " ...")

@verse.OriginalCoupletSummary

@verse.CoupletSummary

@verse.OriginalText

برچسب‌های زمان و مکان پیشنهادی

بیت: @(geoDateTag.CoupletIndex != null ? (Model.Couplets.Where(c => c.Item1 == geoDateTag.CoupletIndex).Select(c => c.Item2).FirstOrDefault() ?? "— کل شعر —") : "— کل شعر —")

@if (geoDateTag.MarkForDelete) {

درخواست حذف برچسب موجود (#@geoDateTag.ExistingTagId)

} else {

@if (geoDateTag.LocationId != null) { @(Model.Locations.Where(l => l.Id == geoDateTag.LocationId).Select(l => l.Name).FirstOrDefault()) } else if (!string.IsNullOrEmpty(geoDateTag.SuggestedLocationName)) { @($"{geoDateTag.SuggestedLocationName} (مکان جدید پیشنهادی)") } @if (geoDateTag.LunarYear != null) { @(" - سال " + geoDateTag.LunarYear) } @if (geoDateTag.LunarMonth != null) { switch (geoDateTag.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; } } @if (geoDateTag.LunarDay != null) { @(" روز " + geoDateTag.LunarDay) } @if (geoDateTag.IgnoreInCategory) { (در نقشهٔ کلی مجموعه نادیده گرفته می‌شود) }

@if (!string.IsNullOrEmpty(geoDateTag.SuggestionNote)) {

یادداشت: @geoDateTag.SuggestionNote

} }
یادداشت: @Model.MyLastEdit.Note
🗑 انصراف و حذف این ویرایش
}

پیمایش

🕘 سوابق ویرایش @if (Model.PageInformation.Poem.Previous != null) { @if (Model.ShowAdminOps) { شعر قبل ▶ } else { شعر قبل ▶ } } @if (Model.PageInformation.Poem.Next != null) { @if (Model.ShowAdminOps) { ◀ شعر بعد } else { ◀ شعر بعد } }

لغزش سریع

@if (Model.CanAssignRhythms) { 🎵 بخش وزن، قافیه و قالب شعری } else { 🧩 بخش قطعات } 💬 بخش معنی 🗺️ بخش زمان و مکان 🧑‍🎓 بخش شخصیت‌ها ⬇ پایین صفحه
@if (Model.CanEdit && !Model.ShowAdminOps) {
⚙️ امکانات مدیریتی
} @if (Model.TextSourceImage != null) {

منبع کاغذی:

(متن پیشنهادی نمی‌بایست از نسخهٔ متفاوتی باشد)

}

ویرایش متن

@if (Model.MyLastEdit != null && Model.MyLastEdit.Title != null) {
@Model.MyLastEdit.Title
} else {
@Model.PageInformation.Poem.Title
}

ویرایش مصرع‌ها

@foreach (var verse in Model.PageInformation.Poem.Verses) {

@Model.GetVerseCoupletNumber(verse).ToPersianNumbers()ترتیب مصرع یا خط از ابتدا: @verse.VOrder.ToPersianNumbers()

@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder && !string.IsNullOrEmpty(v.Text)).Any()) {
@Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder).First().Text
} else {
@verse.Text
}
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder).Any()) { } else { }
@if (verse.LanguageId == null) { 1 } else { @Model.Languages.Where(l => l.Id == verse.LanguageId).Single().Id }
@if (Model.MyLastEdit != null && Model.MyLastEdit.VerseOrderText != null && Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == verse.VOrder && v.MarkForDelete).Any()) { } else { }
⬇ رفتن به ذخیره @if (Model.ShowAdminOps && verse.VOrder > 1 && verse.VersePosition != RMuseum.Models.Ganjoor.VersePosition.Left) { ✂️ شکستن از اینجا }
}
@if (!Model.CanAssignRhythms) {
این مورد شامل بیش از یک قطعه شعر یا دارای پاراگراف نثر است و امکان انتساب وزن و قالب شعری به آن و یا تعیین حروف قافیهٔ آن وجود ندارد.
} else {

وزن

@(Model.GanjoorMetre1 == null ? "" : Model.GanjoorMetre1.Rhythm)

توجه داشته باشید که کارکرد برچسب‌گذاری اشعار در گنجور یافتن اشعار هم‌وزن است. از این جهت از پیشنهاد صورت‌های سلیقه‌ای و متفاوت یک وزن خودداری کنید تا این قابلیت مختل نشود. این نکته را هم مد نظر داشته باشید.

@if (Model.RhythmsByVerseCount != null) @foreach (var rhythm in Model.RhythmsByVerseCount) { }
🧹 پاک کردن وزن ➕ پیشنهاد وزن جدید

@Model.RhymeLetters

@if (Model.MyLastEdit != null && !string.IsNullOrEmpty(Model.MyLastEdit.RhymeLetters)) { } else { } 🧮 محاسبه

این فیلد قافیه و ردیف را با هم و بدون فاصله می‌خواهد، نه فقط قافیه. اگر بعد از حروف قافیه کلمه یا کلماتی عیناً در همهٔ ابیات تکرار شده باشند (ردیف)، آن‌ها هم باید در انتها بیایند. برای نمونه در بیت «... اگر تو یله کنی» / «... اگر تو گله کنی» چون «کنی» عیناً در هر دو مصرع تکرار شده و ردیف شعر است، حروف قافیه و ردیف باید «لهکنی» نوشته شود؛ نه «له» (با نادیده گرفتن ردیف) و نه «ه کنی» (با فاصلهٔ اشتباه). همچنین از حرکات (فتحه، ضمه، کسره) یا هر نشانهٔ اضافهٔ دیگر در این فیلد استفاده نشود.

🎶 این شعر دو وزنی است

@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.PoemFormat) @Model.PoemFormat

}
@if (Model.MyLastEdit != null && !string.IsNullOrEmpty(Model.MyLastEdit.Note)) { } else { }

خلاصه و معنی

توجه فرمایید که هدف از این بخش، تفسیر متن اشعار نیست. انتظار می‌رود در این بخش برای متون و اشعاری مثل داستان‌ها خلاصه یا لب مطلب را بنویسید (برای بعضی از انواع اشعار مثل غزل‌ها ممکن است خلاصهٔ کلی معنی نداشته باشد). برای خطوط یا ابیات نیز برگردان متن به نثر قابل فهم امروزی نوشته شود (لازم نیست برای همهٔ خطوط برگردان نثر نوشته شود). برای تفسیر یا درج عقاید شخصی خود راجع به اشعار از حاشیه‌ها استفاده کنید.

متن باید خلاصه، به فارسی نوشتاری رسمی (غیرمحاوره‌ای)، خالی از لغات نامأنوس (زبان همه‌کس فهم) و بدون غلط املایی و تایپی باشد.

اگر متن موجود به اندازهٔ کافی خوب باشد ممکن است متن خیلی متفاوت جایگزین تأیید نشود.

نام و مشخصات نویسندهٔ متن در صفحهٔ شعر نمایش داده نمی‌شود اما در تاریخچهٔ تغییرات نگهداری می‌شود.

در صورتی که متن تولید شده توسط هوش مصنوعی را ویرایش می‌کنید عبارت نشان‌دهندهٔ تولید هوش مصنوعی بودن آن را حذف کنید.

خلاصه یا مفهوم کلی شعر یا متن

اگر متن یا شعر یک مفهوم و خلاصهٔ کلی ندارد (مثل خیلی از غزلیات حافظ) برای آن متن کلی وارد نکنید.

@if (Model.MyLastEdit != null && Model.MyLastEdit.PoemSummary != null) {
@Model.MyLastEdit.PoemSummary
} else {
@Model.PageInformation.Poem.PoemSummary
} @if (string.IsNullOrEmpty(Model.PageInformation.Poem.PoemSummary)) {

هنوز متنی برای خلاصهٔ کلی نوشته نشده است.

}
⬇ رفتن به ذخیره

برگردان خطوط به زبان ساده

@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 (Model.PageInformation.Poem.Verses[verseIndex].VersePosition == RMuseum.Models.Ganjoor.VersePosition.Paragraph) {

@Model.PageInformation.Poem.Verses[verseIndex].Text

} else {
@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++) {
@Model.PageInformation.Poem.Verses[nIndex].Text
}
}

تذکّر مهم: از این کادر برای نوشتن چیزی جز معنی استفاده نکنید.

در صورتی که متن تولید شده توسط هوش مصنوعی را ویرایش می‌کنید عبارت نشان‌دهندهٔ تولید هوش مصنوعی بودن آن را حذف کنید.

@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()) {
@Model.MyLastEdit.VerseOrderText.Where(v => v.VORder == Model.PageInformation.Poem.Verses[verseIndex].VOrder).First().CoupletSummary
} else {
@Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary
} @if (string.IsNullOrEmpty(Model.PageInformation.Poem.Verses[verseIndex].CoupletSummary)) {

هنوز متنی برای معنی نوشته نشده است.

}
⬇ رفتن به ذخیره
} }
@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()) {
🧩 قطعهٔ @(poemSetion.Number.ToPersianNumbers()):

@Html.Raw(poemSetion.HtmlText)

وزن: @(poemSetion.GanjoorMetre == null ? "تعیین نشده" : poemSetion.GanjoorMetre.Rhythm)

}
} 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()) {

✂️ شکستن شعر به قطعات مجزا

} }

قطعات و مصرع‌ها

📚 همهٔ قطعات شعر ➕ مصرع‌های جاافتاده

چینش مصرع‌ها

🔄 پیش‌فرض 3️⃣ مثلثی 4️⃣ مربعی 5️⃣ مخمسی 6️⃣ مسدسی 7️⃣ مسبعی 8️⃣ مثمنی

پیمایش

@if (Model.PageInformation.Poem.Previous != null) { @if (Model.ShowAdminOps) { شعر قبل ▶ } else { شعر قبل ▶ } } @if (Model.PageInformation.Poem.Next != null) { @if (Model.ShowAdminOps) { ◀ شعر بعد } else { ◀ شعر بعد } }
@if (Model.ShowAdminOps) {

ابزارهای مدیریتی

@if (Model.GanjoorMetre1 != null && !string.IsNullOrEmpty(Model.RhymeLetters)) { 🔁 هم‌آهنگ‌های وزن اول } @if (Model.GanjoorMetre2 != null && !string.IsNullOrEmpty(Model.RhymeLetters)) { 🔁 هم‌آهنگ‌های وزن دوم } 🔢 تصحیح اندیس‌های ابیات ♻️ قطعه‌بندی مجدد
} @if (Model.CanEdit && !Model.ShowAdminOps) {
⚙️ امکانات مدیریتی
} @if (Model.ShowAdminOps) {

برای حذف شعر از قسمت مدیریت بخش اقدام کنید.

}

🗺️ برچسب‌های زمان و مکان (پیشنهادی)

می‌توانید پیشنهاد دهید که این شعر به مکان یا تاریخ خاصی اشاره دارد. پیشنهادهای شما پس از بررسی ناظران اعمال خواهد شد. با دکمهٔ «ذخیره» بالا همراه با بقیهٔ تغییرات ثبت می‌شود.

@if (Model.PoemGeoDateTags != null && Model.PoemGeoDateTags.Any(t => t.PersonId == null)) { @* شخصیت tags are shown in their own section below, not mixed in with geo/date tags here - see #person-tag-section *@ @foreach (var tag in Model.PoemGeoDateTags.Where(t => t.PersonId == null)) { }
بیت مکان سال ماه روز #
@(Model.Couplets.Where(c => c.Item1 == tag.CoupletIndex).Select(c => c.Item2).FirstOrDefault() ?? "— کل شعر —") @($"{(tag.Location == null ? "" : tag.Location.Name)}") @tag.LunarYear @{ 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; } } @tag.LunarDay 🗑️ درخواست حذف
}

اگر این برچسب به یک بیت مشخص اشاره دارد، آن را انتخاب کنید تا دیگران بتوانند شاهد آن را در متن پیدا کنند.

شروع به تایپ کنید تا فهرست مکان‌های موجود بر اساس نام فیلتر شود؛ اگر مکان مورد نظر پیدا نشد، گزینهٔ تعریف آن به‌عنوان مکان جدید نمایش داده می‌شود.

📍 مکان جدید پیشنهاد بده
➕ افزودن به فهرست پیشنهادها
@* شخصیت (person) tags use the same GanjoorPoemGeoDateTagCorrection structure as the geo/date tags above (see the JS comment above geoDateTagSuggestions), but a couplet referring to a place/time and a couplet referring to a person are unrelated claims, so this is its own card with its own "existing tags" table, its own pending list, and its own add button - a suggestion coming out of this card never carries a location or a date. *@

🧑‍🎓 برچسب‌های شخصیت (پیشنهادی)

می‌توانید پیشنهاد دهید که این شعر به یک شخصیت (تاریخی یا داستانی) اشاره دارد. پیشنهادهای شما پس از بررسی ناظران اعمال خواهد شد. با دکمهٔ «ذخیره» بالا همراه با بقیهٔ تغییرات ثبت می‌شود.

@if (Model.PoemGeoDateTags != null && Model.PoemGeoDateTags.Any(t => t.PersonId != null)) { @foreach (var tag in Model.PoemGeoDateTags.Where(t => t.PersonId != null)) { }
بیت شخصیت #
@(Model.Couplets.Where(c => c.Item1 == tag.CoupletIndex).Select(c => c.Item2).FirstOrDefault() ?? "— کل شعر —") @(tag.Person != null ? tag.Person.Name : $"شخصیت #{tag.PersonId}") 🗑️ درخواست حذف
}

اگر این برچسب به یک بیت مشخص اشاره دارد، آن را انتخاب کنید تا دیگران بتوانند شاهد آن را در متن پیدا کنند.

شروع به تایپ کنید تا فهرست شخصیت‌ها بر اساس نام فیلتر شود؛ اگر شخصیت مورد نظر پیدا نشد، گزینهٔ تعریف او به‌عنوان شخصیت جدید نمایش داده می‌شود.

👤 شخصیت جدید پیشنهاد بده
➕ افزودن به فهرست پیشنهادها
@if (Model.MyLastEdit != null && Model.MyLastEdit.HideMyName) { } else { }
💾 ذخیره

 

@if (Model.ShowAdminOps) {

برچسب‌های زمان و مکان

@foreach (var tag in Model.PoemGeoDateTags) { }
مکان سال ماه روز تاریخ مستند مختص شعر #
@($"{(tag.Location == null ? "" : tag.Location.Name)}") @tag.LunarYear @{ 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; } } @tag.LunarDay @if (tag.VerifiedDate) { } else { } @if (tag.IgnoreInCategory) { } else { }
➕ برچسب جدید
📍 مکان‌ها
} @if (Model.ShowAdminOps) {

ابرداده‌های اضافه

@if (Model.PageInformation.NoIndex) { } else { }
💾 ذخیرهٔ ابرداده‌ها
} }