diff options
Diffstat (limited to 'tools/scrub.py')
| -rw-r--r-- | tools/scrub.py | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/tools/scrub.py b/tools/scrub.py new file mode 100644 index 0000000..206a96c --- /dev/null +++ b/tools/scrub.py @@ -0,0 +1,36 @@ +"""Scrub RTD-crawled HTML for self-hosted serving (spec §6): +strip RTD platform JS, analytics, ad units, and the RTD flyout; localize +absolute self/RTD URLs; inject our picker bundle.""" +from __future__ import annotations + +import re + +STRIP_SCRIPTS = re.compile( + r"<script[^>]*(?:readthedocs|googletagmanager|google-analytics|gtag/js|ethicalads)[^>]*>\s*</script>", + re.I, +) +STRIP_INLINE = re.compile( + r"<script[^>]*>(?:(?!</script>).)*?(?:READTHEDOCS_DATA|gtag\(|GoogleAnalyticsObject|ethicalads)(?:(?!</script>).)*?</script>", + re.I | re.S, +) +STRIP_DIVS = re.compile( + r'<div[^>]*(?:id="rtd-footer-container"|id="ethical-ad-placement"|class="[^"]*(?:rst-versions|ethical-sidebar)[^"]*")[^>]*>.*?</div>', + re.I | re.S, +) +ABS_SELF = re.compile(r'(href|src)="https?://docs\.vyos\.io(/[^"]*)"') +ABS_RTD = re.compile(r'(href|src)="https?://[a-z0-9.-]*readthedocs\.(?:io|org)(/[^"]*)"') + +PICKER = ('<div id="vyos-version-picker"></div>' + '<link rel="stylesheet" href="/en/{slug}/_static/css/version-picker.css"/>' + '<script src="/en/{slug}/_static/js/version-picker.js"></script>') + + +def scrub_html(html: str, slug: str) -> str: + out = STRIP_SCRIPTS.sub("", html) + out = STRIP_INLINE.sub("", out) + out = STRIP_DIVS.sub("", out) + out = ABS_SELF.sub(r'\1="\2"', out) + out = ABS_RTD.sub(r'\1="\2"', out) + if "vyos-version-picker" not in out: + out = out.replace("</body>", PICKER.format(slug=slug) + "</body>", 1) + return out |
