This commit is contained in:
2025-12-02 04:23:21 +01:00
parent 8c8369c42b
commit ad65392806

View File

@@ -15,6 +15,190 @@ pub mut:
}
pub fn (mut s Site) sidebar() SideBar {
// TODO: implement, use all info abouve []page, []categories, []links to build the sidebar
return SideBar{}
mut result := SideBar{
my_sidebar: []NavItem{}
}
// If no pages, return empty sidebar
if s.pages.len == 0 {
return result
}
// Build a map of category_id -> pages for efficient lookup
mut category_pages := map[int][]Page{}
mut uncategorized_pages := []Page{}
// Group pages by category
for page in s.pages {
if page.category_id == 0 {
// Page at root level (no category)
uncategorized_pages << page
} else {
// Page belongs to a category
if page.category_id !in category_pages {
category_pages[page.category_id] = []Page{}
}
category_pages[page.category_id] << page
}
}
// Sort pages within each category by their order in the pages array
for category_id in category_pages.keys() {
category_pages[category_id].sort(a.src < b.src)
}
// Sort uncategorized pages
uncategorized_pages.sort(a.src < b.src)
// ============================================================
// PASS 1: Add categories with their pages
// ============================================================
for i, category in s.categories {
category_id := i + 1 // categories are 1-indexed
// Skip if no pages in this category
if category_id !in category_pages {
continue
}
mut category_items := []NavItem{}
// Add pages in this category
for page in category_pages[category_id] {
if !page.hide {
// Convert page src format "collection:name" to path "collection/name"
path := page.src.replace(':', '/')
nav_doc := NavDoc{
path: path
label: if page.label.len > 0 { page.label } else { page.title }
}
category_items << nav_doc
}
}
// Only add category if it has visible items
if category_items.len > 0 {
nav_cat := NavCat{
label: if category.path.len > 0 {
category.path
} else {
'Section ${category_id}'
}
collapsible: category.collapsible
collapsed: category.collapsed
items: category_items
}
result.my_sidebar << nav_cat
}
}
// ============================================================
// PASS 2: Add uncategorized pages at root level
// ============================================================
for page in uncategorized_pages {
if !page.hide {
// Convert page src format "collection:name" to path "collection/name"
path := page.src.replace(':', '/')
nav_doc := NavDoc{
path: path
label: if page.label.len > 0 { page.label } else { page.title }
}
result.my_sidebar << nav_doc
}
}
// ============================================================
// PASS 3: Add standalone links (if needed)
// ============================================================
for link in s.links {
nav_link := NavLink{
label: link.label
href: link.href
description: link.description
}
result.my_sidebar << nav_link
}
return result
}
pub fn (mut s Site) sidebar_str() string {
mut result := []string{}
mut sidebar := s.sidebar()
if sidebar.my_sidebar.len == 0 {
return 'Sidebar is empty\n'
}
result << '📑 SIDEBAR STRUCTURE'
result << '━'.repeat(60)
for i, item in sidebar.my_sidebar {
is_last := i == sidebar.my_sidebar.len - 1
prefix := if is_last { ' ' } else { ' ' }
match item {
NavDoc {
result << '${prefix}📄 ${item.label}'
result << ' path: ${item.path}'
}
NavCat {
// Category header
collapse_icon := if item.collapsed { ' ' } else { ' ' }
result << '${prefix}${collapse_icon}📁 ${item.label}'
// Category metadata
if !item.collapsed {
result << ' collapsible: ${item.collapsible}'
result << ' items: ${item.items.len}'
// Sub-items
for j, sub_item in item.items {
is_last_sub := j == item.items.len - 1
sub_prefix := if is_last_sub { ' ' } else { ' ' }
match sub_item {
NavDoc {
result << '${sub_prefix}📄 ${sub_item.label} [${sub_item.path}]'
}
NavCat {
// Nested categories
sub_collapse_icon := if sub_item.collapsed { ' ' } else { ' ' }
result << '${sub_prefix}${sub_collapse_icon}📁 ${sub_item.label}'
}
NavLink {
result << '${sub_prefix}🔗 ${sub_item.label}'
if sub_item.description.len > 0 {
result << ' ${sub_item.description}'
}
}
}
}
}
}
NavLink {
result << '${prefix}🔗 ${item.label}'
result << ' href: ${item.href}'
if item.description.len > 0 {
result << ' desc: ${item.description}'
}
}
}
// Add spacing between root items
if i < sidebar.my_sidebar.len - 1 {
result << ''
}
}
result << '━'.repeat(60)
result << '📊 SUMMARY'
result << ' Total items: ${sidebar.my_sidebar.len}'
result << ' Pages: ${s.pages.len}'
result << ' Categories: ${s.categories.len}'
result << ' Links: ${s.links.len}'
return result.join('\n') + '\n'
}