Molodetz blogrol volgens DPP-template
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
import re
|
||||
from functools import lru_cache
|
||||
|
||||
import mistune
|
||||
from mistune.renderers.html import HTMLRenderer
|
||||
|
||||
from molodetz import config
|
||||
from molodetz.rendering import normalize_dashes
|
||||
|
||||
PROSE_DIR = config.TEMPLATES_DIR / "docs" / "prose"
|
||||
|
||||
SECTIONS = ("Begin hier", "Bouwen met de API", "Bijdragen en internals", "Beheer")
|
||||
|
||||
COMPONENTS = ("avatar", "code", "content", "title", "toast", "dialog", "context-menu", "upload", "lightbox", "chat")
|
||||
|
||||
DOCS_PAGES = [
|
||||
{"slug": "welkom", "title": "Welkom", "section": "Begin hier", "file": "welkom.md"},
|
||||
{"slug": "schrijven", "title": "Schrijven op de rol", "section": "Begin hier", "file": "schrijven.md"},
|
||||
{"slug": "binnen", "title": "Binnenkomen", "section": "Begin hier", "file": "binnen.md"},
|
||||
{"slug": "juridisch", "title": "Voorwaarden en privacy", "section": "Begin hier", "file": "juridisch.md"},
|
||||
{"slug": "api", "title": "API en authenticatie", "section": "Bouwen met de API", "file": "api.md"},
|
||||
{"slug": "architectuur", "title": "Architectuur", "section": "Bijdragen en internals", "file": "architectuur.md"},
|
||||
{"slug": "frontend", "title": "Frontend en componenten", "section": "Bijdragen en internals", "file": "frontend.md"},
|
||||
{"slug": "beheer", "title": "Beheer en services", "section": "Beheer", "file": "beheer.md", "admin": True},
|
||||
{"slug": "backups", "title": "Back-ups en onderhoud", "section": "Beheer", "file": "backups.md", "admin": True},
|
||||
] + [
|
||||
{
|
||||
"slug": f"component-{name}",
|
||||
"title": f"dp-{name}",
|
||||
"section": "Bijdragen en internals",
|
||||
"file": f"component-{name}.md",
|
||||
}
|
||||
for name in COMPONENTS
|
||||
]
|
||||
|
||||
|
||||
class ProseRenderer(HTMLRenderer):
|
||||
def heading(self, text, level, **attrs):
|
||||
anchor = re.sub(r"[^a-z0-9-]", "-", re.sub(r"<[^>]+>", "", text).lower())
|
||||
anchor = re.sub(r"-+", "-", anchor).strip("-")
|
||||
return f'<h{level} id="{anchor}"><a class="permalink" href="#{anchor}">{text}</a></h{level}>\n'
|
||||
|
||||
|
||||
_prose_markdown = mistune.create_markdown(escape=False, hard_wrap=True, renderer=ProseRenderer(escape=False), plugins=["table", "strikethrough", "url"])
|
||||
|
||||
|
||||
def visible_pages(viewer_is_admin):
|
||||
return [page for page in DOCS_PAGES if viewer_is_admin or not page.get("admin")]
|
||||
|
||||
|
||||
def page_by_slug(slug):
|
||||
for page in DOCS_PAGES:
|
||||
if page["slug"] == slug:
|
||||
return page
|
||||
return None
|
||||
|
||||
|
||||
@lru_cache(maxsize=64)
|
||||
def page_source(slug):
|
||||
page = page_by_slug(slug)
|
||||
if page is None:
|
||||
return ""
|
||||
return normalize_dashes((PROSE_DIR / page["file"]).read_text(encoding="utf-8"))
|
||||
|
||||
|
||||
@lru_cache(maxsize=64)
|
||||
def render_page(slug):
|
||||
return _prose_markdown(page_source(slug))
|
||||
|
||||
|
||||
def sidebar(viewer_is_admin):
|
||||
pages = visible_pages(viewer_is_admin)
|
||||
return [(section, [page for page in pages if page["section"] == section]) for section in SECTIONS]
|
||||
Reference in New Issue
Block a user