#!/usr/bin/env python3 # This file is in the public domain. # # This script runs the jinga2 templating engine on an input template-file # using the specified locale for gettext translations, and outputs # the resulting (HTML) ouptut-file. # # Note that the gettext files need to be prepared first. This script # is thus to be invoked via the Makefile. import os import os.path import sys import re import gettext import jinja2 import glob import codecs import os import os.path import click import shutil from pathlib import Path env = jinja2.Environment( loader=jinja2.FileSystemLoader(os.path.realpath(os.path.dirname(__file__))), extensions=["jinja2.ext.i18n"], lstrip_blocks=True, trim_blocks=True, undefined=jinja2.StrictUndefined, autoescape=False, ) default_ctx = {} default_ctx["merchant_blog_url"] = os.environ.get( "TALER_ENV_URL_MERCHANT_BLOG", "#" ) default_ctx["merchant_donations_url"] = os.environ.get( "TALER_ENV_URL_MERCHANT_DONATIONS", "#" ) default_ctx["merchant_survey_url"] = os.environ.get( "TALER_ENV_URL_MERCHANT_SURVEY", "#" ) default_ctx["intro_url"] = os.environ.get("TALER_ENV_URL_INTRO", "#") default_ctx["bank_url"] = os.environ.get("TALER_ENV_URL_BANK", "#") default_ctx["auditor_url"] = os.environ.get("TALER_ENV_URL_AUDITOR", "#") default_ctx["backoffice_url"] = os.environ.get("TALER_ENV_URL_BACKOFFICE", "#") @click.command() @click.argument("outdir") def generate_site(outdir): """Generate the site from templates.""" out_path = Path.cwd().joinpath(outdir) os.chdir(os.path.dirname(os.path.realpath(__file__))) os.makedirs(out_path.as_posix(), exist_ok=True) for in_file in glob.glob("*.j2"): name, ext = re.match(r"(.*)\.([^.]+)$", in_file.rstrip(".j2")).groups() tmpl = env.get_template(in_file) def self_localized(other_locale): """ Return URL for the current page in another locale. """ return "../" + other_locale + "/" + in_file.rstrip(".j2") def url_localized(filename): return "../" + locale + "/" + filename def url(x): # TODO: look at the app root environment variable # TODO: check if file exists return "../" + x for l in ("en", "de", "it", "es"): locale = os.path.basename(l) if os.path.isdir(os.path.join("./locale/", locale)): tr = gettext.translation( "messages", localedir="locale", languages=[locale] ) env.install_gettext_translations(tr, newstyle=True) else: print("warning: locale {} not found".format(locale)) ctx = dict( lang=locale, url=url, self_localized=self_localized, url_localized=url_localized, filename=name + "." + ext, ) ctx.update(default_ctx) content = tmpl.render(**ctx) out_name = (out_path / locale / in_file.rstrip(".j2")).as_posix() os.makedirs((out_path / locale).as_posix(), exist_ok=True) with codecs.open(out_name, "w", "utf-8") as f: f.write(content) for p in Path.cwd().glob("static/**/*.css"): target = out_path / p.relative_to(Path.cwd()) target.parent.mkdir(parents=True, exist_ok=True) shutil.copy(p, target) for f in Path.cwd().glob("dist/*"): target = out_path / f.relative_to(Path.cwd()) target.parent.mkdir(parents=True, exist_ok=True) shutil.copy(f, target) if __name__ == "__main__": generate_site()