feat(blog): جدول — ستونها قابل تغییر اندازه/افزودن و حذف؛ لینک کپشن تصویر؛ هدینگهای نسخه انگلیسی بزرگتر
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 []
|
||||
|
||||
Reference in New Issue
Block a user