diff --git a/hyperglass/.gitignore b/hyperglass/.gitignore index 27daead..4d57f3e 100644 --- a/hyperglass/.gitignore +++ b/hyperglass/.gitignore @@ -6,4 +6,4 @@ gunicorn_config.py gunicorn_dev_config.py test.py __pycache__/ -parsing/ +parsing/ \ No newline at end of file diff --git a/hyperglass/configuration/models.py b/hyperglass/configuration/models.py index a70ad25..78b6056 100644 --- a/hyperglass/configuration/models.py +++ b/hyperglass/configuration/models.py @@ -254,20 +254,8 @@ class Branding(BaseSettings): class Font(BaseSettings): """Class model for params.branding.font""" - class Primary(BaseSettings): - """Class model for params.branding.font.primary""" - - name: str = "Nunito" - url: UrlStr = "https://fonts.googleapis.com/css?family=Nunito:400,600,700" - - class Mono(BaseSettings): - """Class model for params.branding.font.mono""" - - name: str = "Fira Mono" - url: UrlStr = "https://fonts.googleapis.com/css?family=Fira+Mono" - - primary: Primary = Primary() - mono: Mono = Mono() + primary: str = "Nunito" + mono: str = "Fira Code" class Footer(BaseSettings): """Class model for params.branding.font""" diff --git a/hyperglass/render/templates/theme.sass.j2 b/hyperglass/render/templates/theme.sass.j2 index fb4ab77..5d08d6c 100644 --- a/hyperglass/render/templates/theme.sass.j2 +++ b/hyperglass/render/templates/theme.sass.j2 @@ -33,6 +33,13 @@ $hg-loading: findAltBackgroundColor($hg-background) $hg-footer: findFooterColor($hg-background) // Theme Overrides + +$font-family-sans-serif: "{{ font.primary }}", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" + +$font-family-monospace: "{{ font.mono }}", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace + +$headings-font-weight: 400 + $enable-responsive-font-sizes: true $enable-validation-icons: false diff --git a/hyperglass/render/webassets.py b/hyperglass/render/webassets.py index d9b1f5d..989061c 100644 --- a/hyperglass/render/webassets.py +++ b/hyperglass/render/webassets.py @@ -38,6 +38,36 @@ def render_frontend_config(): raise HyperglassError(frontend_error) +def get_fonts(): + """Downloads google fonts""" + font_dir = hyperglass_root.joinpath("static/fonts") + font_bin = str( + hyperglass_root.joinpath("static/node_modules/get-google-fonts/cli.js") + ) + font_base = "https://fonts.googleapis.com/css?family={p}|{m}&display=swap" + font_primary = "+".join(params.branding.font.primary.split(" ")).strip() + font_mono = "+".join(params.branding.font.mono.split(" ")).strip() + font_url = font_base.format(p=font_primary + ":300,400,700", m=font_mono + ":400") + proc = subprocess.Popen( + ["node", font_bin, "-w", "-i", font_url, "-o", font_dir], + cwd=hyperglass_root.joinpath("static"), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + try: + stdout, stderr = proc.communicate(timeout=60) + except subprocess.TimeoutExpired: + proc.kill() + stdout, stderr = proc.communicate() + if proc.returncode != 0: + output_error = stderr.decode("utf-8") + logger.error(output_error) + raise HyperglassError(f"Error downloading font from URL {font_url}") + else: + proc.kill() + logger.debug(f"Downloaded font from URL {font_url}") + + def render_theme(): """Renders Jinja2 template to Sass file""" rendered_theme_file = hyperglass_root.joinpath("static/theme.sass") @@ -60,7 +90,7 @@ def build_assets(): stderr=subprocess.PIPE, ) try: - stdout, stderr = proc.communicate(timeout=15) + stdout, stderr = proc.communicate(timeout=60) except subprocess.TimeoutExpired: proc.kill() stdout, stderr = proc.communicate() @@ -76,13 +106,22 @@ def build_assets(): def render_assets(): - """Controller function for rendering sass theme elements and building web assets""" + """ + Controller function for rendering sass theme elements and building + web assets + """ try: logger.debug("Rendering front end config...") render_frontend_config() logger.debug("Rendered front end config") except HyperglassError as frontend_error: raise HyperglassError(frontend_error) + try: + logger.debug("Downloading theme fonts...") + get_fonts() + logger.debug("Downloaded theme fonts") + except HyperglassError as theme_error: + raise HyperglassError(theme_error) try: logger.debug("Rendering theme elements...") render_theme() diff --git a/hyperglass/static/.gitignore b/hyperglass/static/.gitignore index cff9800..3b952cd 100644 --- a/hyperglass/static/.gitignore +++ b/hyperglass/static/.gitignore @@ -7,5 +7,5 @@ old/ yarn-error.log theme.sass test* -frontend.js frontend.json +fonts/ \ No newline at end of file diff --git a/hyperglass/static/main.scss b/hyperglass/static/main.scss index 17dddb8..3389bcf 100644 --- a/hyperglass/static/main.scss +++ b/hyperglass/static/main.scss @@ -1,6 +1,7 @@ // Custom Classes // Imports +@import "./fonts/fonts.css"; @import "./theme.sass"; @import "./node_modules/bootstrap/scss/bootstrap"; @import "./overrides.sass"; \ No newline at end of file