feat: categories with titles

This commit is contained in:
2026-02-22 07:18:43 +01:00
parent 2a83df1962
commit 9dacd6fca5
20 changed files with 735 additions and 207 deletions

View File

@@ -294,23 +294,47 @@ function buildMenuItemHref(item: MenuItemData): string {
return '#';
}
function toTemplateMenuItem(item: MenuItemData): TemplateMenuItem {
const children = (Array.isArray(item.children) ? item.children : []).map((child) => toTemplateMenuItem(child));
function resolveMenuItemTitle(
item: MenuItemData,
categoryMetadata?: Record<string, { title?: string }>,
): string {
if (item.kind === 'category-archive') {
const categoryName = (item.categoryName || '').trim();
const metadataTitle = categoryName.length > 0
? (categoryMetadata?.[categoryName]?.title || '').trim()
: '';
if (metadataTitle.length > 0) {
return metadataTitle;
}
}
return item.title;
}
function toTemplateMenuItem(
item: MenuItemData,
categoryMetadata?: Record<string, { title?: string }>,
): TemplateMenuItem {
const children = (Array.isArray(item.children) ? item.children : []).map((child) => toTemplateMenuItem(child, categoryMetadata));
return {
title: item.title,
title: resolveMenuItemTitle(item, categoryMetadata),
href: buildMenuItemHref(item),
has_children: children.length > 0,
children,
};
}
export function buildTemplateMenuItems(menu: MenuDocument | null | undefined): TemplateMenuItem[] {
export function buildTemplateMenuItems(
menu: MenuDocument | null | undefined,
categoryMetadata?: Record<string, { title?: string }>,
): TemplateMenuItem[] {
const items = menu?.items;
if (!Array.isArray(items)) {
return [];
}
return items.map((item) => toTemplateMenuItem(item));
return items.map((item) => toTemplateMenuItem(item, categoryMetadata));
}
export function normalizeMacroName(name: string): string {