feat(blog): جدول — ستون‌ها قابل تغییر اندازه/افزودن و حذف؛ لینک کپشن تصویر؛ هدینگ‌های نسخه انگلیسی بزرگ‌تر

This commit is contained in:
aramesh-site deploy
2026-10-06 10:57:01 +00:00
parent 61a2e95278
commit 1b491357ab
45 changed files with 2341 additions and 81 deletions
+30
View File
@@ -67,3 +67,33 @@ export function toISODate(value?: DateObject | Date | null): string {
const pad = (n: number) => String(n).padStart(2, '0')
return `${gregorianDate.year}-${pad(gregorianDate.month.number)}-${pad(gregorianDate.day)}`
}
/** تاریخ مقاله → ISO میلادی برای datePublished اسکیمای JSON-LD؛ تاریخ نامفهوم → null.
* هم ISO ذخیره‌شده از انتخابگر پنل و هم شمسی دست‌نویس («۲۴ مرداد ۱۴۰۳») را می‌فهمد.
* هم‌ارز تابع _parse_site_date سمت بک‌اند (app/seo_pages.py) است. */
export function toPublishedISO(value?: string | null): string | null {
const raw = (value ?? '').trim()
if (!raw) return null
if (ISO_DATE.test(raw)) {
const parsed = new Date(raw)
if (!Number.isNaN(parsed.getTime())) return parsed.toISOString().slice(0, 10)
}
// شمسی دست‌نویس — ارقام فارسی به لاتین، نام ماه به شماره
const latin = raw.replace(/[۰-۹]/g, (c) => String('۰۱۲۳۴۵۶۷۸۹'.indexOf(c)))
const m = latin.match(/^(\d{1,2})\s*([\u0600-\u06FF]+)\s*(\d{4})$/)
const faMonths: Record<string, number> = {
'فروردین': 1, 'اردیبهشت': 2, 'خرداد': 3, 'تیر': 4, 'مرداد': 5, 'شهریور': 6,
'مهر': 7, 'آبان': 8, 'آذر': 9, 'دی': 10, 'بهمن': 11, 'اسفند': 12,
}
const month = m ? faMonths[m[2]] : undefined
if (!m || !month) return null
const jalali = new DateObject({ calendar: persian }).set({
year: Number(m[3]),
month,
day: Number(m[1]),
})
return jalali.isValid ? toISODate(jalali) : null
}
+5
View File
@@ -30,6 +30,11 @@ export function docToText(body: unknown): string {
return parts.join(' ')
}
/** آیا سند متن واقعی دارد؟ (سند خالی پوسته یا null: false) */
export function docHasText(body: unknown): boolean {
return docToText(body).trim().length > 0
}
/** متن تیترهای یک سطح مشخص (پیش‌فرض H2) */
export function docHeadings(body: unknown, level = 2): string[] {
if (Array.isArray(body)) return []