python4405de34 | 1 | """MkDocs hook: absolute URLs for Material language switcher (GitHub Pages subpath). |
| 2 | |
| 3 | mkdocs-static-i18n writes relative alternate links into HTML. On a project site |
| 4 | (site_url with a path, e.g. /cascade-ide/) an extra ``../`` or a URL without a |
| 5 | trailing slash can send users to the org root (https://ai-guiders.github.io/). |
| 6 | Rewrite language-switcher hrefs after each page is rendered. |
| 7 | """ |
| 8 | |
| 9 | from __future__ import annotations |
| 10 | |
| 11 | import re |
| 12 | from urllib.parse import urljoin |
| 13 | |
| 14 | from mkdocs.plugins import event_priority |
| 15 | |
| 16 | _REL_HREFLANG_RE = re.compile(r'(href=")((?:\.\./)+[^"]+)(" hreflang="[^"]+")') |
| 17 | |
| 18 | |
| 19 | @event_priority(-200) |
| 20 | def on_post_page(output, page, config, **kwargs): |
| 21 | abs_page = getattr(page, "abs_url", None) |
| 22 | if not abs_page or not output: |
| 23 | return output |
| 24 | |
| 25 | def _abs_href(match: re.Match[str]) -> str: |
| 26 | rel = match.group(2) |
| 27 | return f"{match.group(1)}{urljoin(abs_page, rel)}{match.group(3)}" |
| 28 | |
| 29 | return _REL_HREFLANG_RE.sub(_abs_href, output) |
| 30 | |
View only · write via MCP/CIDE