1
Fork 0

Dynamically create tag pages

This commit is contained in:
Jake Howard 2023-09-09 10:48:03 +01:00
parent c8eb405165
commit b04042a839
Signed by: jake
GPG Key ID: 57AFB45680EDD477
7 changed files with 78 additions and 0 deletions

View File

@ -1 +1,6 @@
---
tags:
- tag1
- tag2
---
# Nested

1
content/tags/tag1.md Normal file
View File

@ -0,0 +1 @@
Tag 1 content

54
hooks/tags.py Normal file
View File

@ -0,0 +1,54 @@
from mkdocs.utils import meta
from mkdocs.structure.files import File, Files
import tempfile
import os
import shutil
TAGS_TEMP_DIR = os.path.join(tempfile.gettempdir(), "tags")
shutil.rmtree(TAGS_TEMP_DIR, ignore_errors=True)
os.mkdir(TAGS_TEMP_DIR)
def on_files(files: Files, config):
tags = set()
template = config["theme"].get_env().get_template("tag-template.md")
list_template = config["theme"].get_env().get_template("tag-list-template.md")
for file in files.documentation_pages():
with open(file.abs_src_path) as f:
_, metadata = meta.get_data(f.read())
tags.update(metadata.get("tags", []))
for tag in tags:
found_tag_page = files.get_file_from_path(f"tags/{tag}.md")
if found_tag_page:
with open(found_tag_page.abs_src_path) as f:
content, _ = meta.get_data(f.read())
else:
content = ""
filename = f"{tag}.md"
with open(os.path.join(TAGS_TEMP_DIR, filename), "w") as f:
f.write(template.render(tag=tag, content=content))
files.append(File(
path=filename,
src_dir=TAGS_TEMP_DIR,
dest_dir=os.path.join(config["site_dir"], "tags"),
use_directory_urls=True
))
with open(os.path.join(TAGS_TEMP_DIR, "tags.md"), "w") as f:
f.write(list_template.render())
files.append(File(
path="tags.md",
src_dir=TAGS_TEMP_DIR,
dest_dir=config["site_dir"],
use_directory_urls=True
))
return files

View File

@ -8,3 +8,4 @@ theme:
hooks:
- hooks/nav.py
- hooks/tags.py

View File

@ -0,0 +1,6 @@
---
template: tag.html
title: All tags
---
All the tags

6
theme/tag-template.md Normal file
View File

@ -0,0 +1,6 @@
---
template: tag.html
title: {{ tag }}
---
{{ content }}

5
theme/tag.html Normal file
View File

@ -0,0 +1,5 @@
I'm a tag
{{ page.title }}
{{ page.content }}