notes/hooks/tag_nav.py

56 lines
1.3 KiB
Python

import sys
import os
sys.path.insert(0, os.path.dirname(__file__))
from notes import get_notes_from_nav
from mkdocs.structure.nav import Navigation, Section
from collections import defaultdict
from mkdocs.utils import meta
from mkdocs.plugins import event_priority
class TagSection(Section):
"""
A modified section which is active if any of its children are active
(regardless of what mkdocs tells it).
"""
@property
def active(self):
return any(c.active for c in self.children)
@active.setter
def active(self, value: bool):
pass
@event_priority(100)
def on_nav(nav: Navigation, config, files):
"""
Structure the nav sections by tag
"""
notes_section, notes = get_notes_from_nav(nav)
notes_page = notes_section.children[0]
pages_to_tag = defaultdict(list)
orphan_pages = []
for note in notes:
with open(note.file.abs_src_path) as f:
_, metadata = meta.get_data(f.read())
if tags := metadata.get("tags"):
for tag in tags:
pages_to_tag[tag].append(note)
else:
orphan_pages.append(note)
tag_sections = [
TagSection(tag, pages)
for tag, pages in pages_to_tag.items()
]
notes_section.children = tag_sections + orphan_pages + [notes_page]