58 lines
2.7 KiB
JavaScript
58 lines
2.7 KiB
JavaScript
// ساخت BreadcrumbList معتبر برای schema.org — منبع واحدِ همهٔ breadcrumbهای سایت.
|
|
//
|
|
// چرا این فایل هست: سرچکنسول روی nobat724.com خطای بحرانی
|
|
// «Missing field "item" (in "itemListElement")» میداد. علتش این بود که
|
|
// `item` فقط وقتی اضافه میشد که هم href داشته باشیم هم origin — و در
|
|
// /clinics اصلاً origin پاس داده نمیشد، پس هیچکدام از عنصرها `item` نداشتند و
|
|
// کل BreadcrumbList نامعتبر میشد.
|
|
//
|
|
// قاعدهای که اینجا تضمین میشود: یا **همهٔ** عنصرها `item` مطلق دارند، یا اصلاً
|
|
// JSON-LD تولید نمیشود. اسکیمای ناقص از نبودِ اسکیما بدتر است (صفحه از rich
|
|
// resultها حذف میشود و در سرچکنسول بهعنوان خطای بحرانی مینشیند).
|
|
//
|
|
// list: Array<string | { name, href }> — همیشه href بده، حتی برای آیتم آخر
|
|
// (صفحهٔ جاری)؛ ظاهر تغییری نمیکند چون آیتم آخر هرگز لینک نمیشود.
|
|
|
|
/** ورودی خام را به [{name, href}] یکدست میکند و بینامها را میاندازد. */
|
|
export function normalizeBreadcrumb(list = []) {
|
|
return (Array.isArray(list) ? list : [])
|
|
.map((item) => (typeof item === "string" ? { name: item } : item))
|
|
.filter((item) => item && typeof item.name === "string" && item.name.trim() !== "");
|
|
}
|
|
|
|
/** origin + href → URL مطلق. هر ورودی ناقص → null. */
|
|
export function absoluteUrl(origin, href) {
|
|
if (!origin || typeof href !== "string" || href === "") return null;
|
|
if (/^https?:\/\//i.test(href)) return href;
|
|
const base = String(origin).replace(/\/+$/, "");
|
|
const path = href.startsWith("/") ? href : `/${href}`;
|
|
return path === "/" ? base : `${base}${path}`;
|
|
}
|
|
|
|
/**
|
|
* BreadcrumbList معتبر، یا `null` وقتی حتی یک عنصر URL مطلق ندارد.
|
|
* @returns {object|null}
|
|
*/
|
|
export function buildBreadcrumbJsonLd(list, origin) {
|
|
const items = normalizeBreadcrumb(list);
|
|
if (items.length === 0) return null;
|
|
|
|
const elements = [];
|
|
for (const [idx, item] of items.entries()) {
|
|
const url = absoluteUrl(origin, item.href);
|
|
if (!url) return null; // بدون item کاملِ همهٔ عنصرها، اسکیما را منتشر نمیکنیم
|
|
elements.push({
|
|
"@type": "ListItem",
|
|
position: idx + 1,
|
|
name: item.name,
|
|
item: url,
|
|
});
|
|
}
|
|
|
|
return {
|
|
"@context": "https://schema.org",
|
|
"@type": "BreadcrumbList",
|
|
itemListElement: elements,
|
|
};
|
|
}
|