summaryrefslogtreecommitdiff
path: root/tools/scrub.py
blob: 206a96cce6189a2e3c0a3464191a5a28753c8b9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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