diff --git a/docs/source/_templates/redoc.html b/docs/source/_templates/redoc.html
index 2df21470..8aafd0be 100644
--- a/docs/source/_templates/redoc.html
+++ b/docs/source/_templates/redoc.html
@@ -12,7 +12,7 @@
{%- block extrahead %}
{{ super() }}
-
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 1d0941ac..7f80b823 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -6,6 +6,7 @@ import contextlib
import datetime
import io
import os
+import re
import subprocess
from pathlib import Path
from urllib.request import urlretrieve
@@ -174,15 +175,49 @@ def stage_redoc_js(app, exception):
logger.info(f"Skipping redoc download for builder: {app.builder.name}")
return
+ out_static = Path(app.builder.outdir) / "_static"
+
redoc_version = "2.1.3"
redoc_url = (
f"https://cdn.redoc.ly/redoc/v{redoc_version}/bundles/redoc.standalone.js"
)
- dest = Path(app.builder.outdir) / "_static/redoc.js"
+ dest = out_static / "redoc.js"
if not dest.exists():
logger.info(f"Downloading {redoc_url} -> {dest}")
urlretrieve(redoc_url, dest)
+ # stage fonts for redoc from google fonts
+ fonts_css_url = "https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700"
+ fonts_css_file = out_static / "redoc-fonts.css"
+ fonts_dir = out_static / "fonts"
+ fonts_dir.mkdir(exist_ok=True)
+ if not fonts_css_file.exists():
+ logger.info(f"Downloading {fonts_css_url} -> {fonts_css_file}")
+ urlretrieve(fonts_css_url, fonts_css_file)
+
+ # For each font external font URL,
+ # download the font and rewrite to a local URL
+ # The downloaded TTF fonts have license info in their metadata
+ with open(fonts_css_file) as f:
+ fonts_css = f.read()
+
+ fonts_css_changed = False
+ for font_url in re.findall(r'url\((https?[^\)]+)\)', fonts_css):
+ fonts_css_changed = True
+ filename = font_url.rpartition("/")[-1]
+ dest = fonts_dir / filename
+ local_url = str(dest.relative_to(fonts_css_file.parent))
+ fonts_css = fonts_css.replace(font_url, local_url)
+ if not dest.exists():
+ logger.info(f"Downloading {font_url} -> {dest}")
+ urlretrieve(font_url, dest)
+
+ if fonts_css_changed:
+ # rewrite font css with local URLs
+ with open(fonts_css_file, "w") as f:
+ logger.info(f"Rewriting URLs in {fonts_css_file}")
+ f.write(fonts_css)
+
def setup(app):
app.connect("build-finished", stage_redoc_js)