summaryrefslogtreecommitdiff
path: root/demo/template.py
blob: 01d778bd59f4c375931948b844306ede50b1717f (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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/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)


if __name__ == "__main__":
    generate_site()