#!/usr/bin/env python3
"""Point the mirrored pages at local copies so nothing is fetched from the internet.
Idempotent: safe to run again after tools/mirror.sh.
- Google Fonts stylesheet -> /docs/_ext/fonts/fonts.css
- Mermaid (unpkg, in JS bundle) -> /docs/_ext/mermaid/mermaid.min.js
- external / media -> /docs/_ext// (when downloaded)
- https://trivy.dev/docs/latest/... links -> local page when mirrored
- Google Analytics loader call -> removed
"""
import pathlib
import re
ROOT = pathlib.Path(__file__).resolve().parent.parent / "site"
DOCS = ROOT / "docs" / "latest"
EXT = ROOT / "docs" / "_ext"
FONTS_LINK = re.compile(r' ')
PRECONNECT = re.compile(r' ')
ANALYTICS = ''
MEDIA = re.compile(r'(src|poster)="https://(user-images\.githubusercontent\.com|github\.com|raw\.githubusercontent\.com)(/[^"?]*)(\?[^"]*)?"')
DOC_LINK = re.compile(r'href="https://(?:www\.)?trivy\.dev/docs/(?:latest|v0\.\d+(?:\.\d+)?)/([^"#?]*)([#?][^"]*)?"')
MERMAID = re.compile(r'https://unpkg\.com/mermaid@[0-9.]+/dist/mermaid\.min\.js')
stats = dict(pages=0, fonts=0, analytics=0, media=0, links=0, mermaid=0)
def local_media(m):
attr, host, path = m.group(1), m.group(2), m.group(3)
if (EXT / host / path.lstrip("/")).is_file():
stats["media"] += 1
return f'{attr}="/docs/_ext/{host}{path}"'
return m.group(0)
def local_doc(m):
rest, frag = m.group(1), m.group(2) or ""
for cand in (f"guide/{rest}", rest): # current pages live under guide/
if (DOCS / cand / "index.html").is_file():
stats["links"] += 1
return f'href="/docs/latest/{cand}{frag}"'
return m.group(0)
def main():
fonts_ok = (EXT / "fonts" / "fonts.css").is_file()
for f in DOCS.rglob("*.html"):
text = orig = f.read_text(encoding="utf-8")
if fonts_ok:
text, n = FONTS_LINK.subn(' ', text)
stats["fonts"] += n
text = PRECONNECT.sub("", text)
stats["analytics"] += text.count(ANALYTICS)
text = text.replace(ANALYTICS, "")
text = MEDIA.sub(local_media, text)
text = DOC_LINK.sub(local_doc, text)
if text != orig:
f.write_text(text, encoding="utf-8")
stats["pages"] += 1
if (EXT / "mermaid" / "mermaid.min.js").is_file():
for js in (DOCS / "assets" / "javascripts").glob("bundle.*.min.js"):
text = js.read_text(encoding="utf-8")
text, n = MERMAID.subn("/docs/_ext/mermaid/mermaid.min.js", text)
if n:
js.write_text(text, encoding="utf-8")
stats["mermaid"] += n
print("localize: " + ", ".join(f"{k}={v}" for k, v in stats.items()))
if __name__ == "__main__":
main()