Add export submodule to handle output

This submodule will handle saving the outfile to whatever format you
want.

For now, it can save in svg (default), png using inkscape, png, pdf or
ps using cairosvg.
master
Lertsenem 2020-07-09 14:31:22 +02:00
parent d02d788dba
commit 1272a64d54
2 changed files with 153 additions and 24 deletions

View File

@ -5,8 +5,7 @@ import logging
import os, os.path import os, os.path
import sys import sys
import jinja2 import export
import smashgg import smashgg
import version import version
@ -113,16 +112,22 @@ def main():
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
if args.version: if args.version:
print(version.VERSION_NAME) print(version.VERSION_NAME)
sys.exit(0) return 0
# Set default arguments
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Default rootdir is "."
if args.rootdir is None: if args.rootdir is None:
args.rootdir = "." # TODO compute script root? args.rootdir = "." # TODO compute script root?
# Default outfile is 'tournament-slug.svg'
if args.outfile is None:
args.outfile = "{}.svg".format(tournament.slug)
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
if args.command not in [ "top8" ]: if args.command not in [ "top8" ]:
parser.print_help() parser.print_help()
sys.exit(1) return 1
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
if args.command == "top8": if args.command == "top8":
@ -145,7 +150,7 @@ def main():
if tournament is None or top_players is None: if tournament is None or top_players is None:
log.error("Could not load data from smash.gg") log.error("Could not load data from smash.gg")
sys.exit(1) return 1
lkrz_data = "\n".join( lkrz_data = "\n".join(
[ tournament.conf() ] \ [ tournament.conf() ] \
@ -161,20 +166,7 @@ def main():
with open(args.lkrz_file, "w", encoding="utf8") as f: with open(args.lkrz_file, "w", encoding="utf8") as f:
f.write(lkrz_data) f.write(lkrz_data)
# Template rendering # Build the context which will be passed to the template
log.info("Génération du SVG en utilisant le template")
jj2_env = jinja2.Environment(
loader = jinja2.FileSystemLoader( args.templatesdir )
)
jj2_tpl = jj2_env.get_template(
os.path.join(
args.template,
"template.svg.j2",
)
)
context = { context = {
"tournament": tournament, "tournament": tournament,
"players" : sorted( "players" : sorted(
@ -188,13 +180,20 @@ def main():
), ),
} }
rv = export.generate_outfile(
args.templatesdir,
args.template,
context,
args.outfile,
log,
)
if args.outfile is None: if rv is None:
args.outfile = "{}.svg".format(tournament.slug) return 1
# TODO add png export
jj2_tpl.stream(context).dump( args.outfile ) log.info("Successfully saved outfile as '{}'".format(rv))
return 0
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
def getTournamentTop( def getTournamentTop(
@ -398,4 +397,5 @@ def getTournamentTop(
# ============================================================================= # =============================================================================
if __name__ == '__main__': if __name__ == '__main__':
main() rv = main()
sys.exit(rv)

129
lokrez/export.py Normal file
View File

@ -0,0 +1,129 @@
import os
import subprocess
import jinja2
# =============================================================================
def generate_outfile(
templatesdir,
templatename,
context,
outfilename,
log = None,
):
# Template rendering
# -------------------------------------------------------------------------
log.info("Generating SVG using '{}' template".format(templatename))
jj2_env = jinja2.Environment(
loader = jinja2.FileSystemLoader( templatesdir )
)
try:
jj2_tpl = jj2_env.get_template(
os.path.join(
templatename,
"template.svg.j2",
)
)
except:
log.error("Could not find template '{}'".format(templatename))
return None
extension = outfilename.split(".")[-1]
# To SVG
# -------------------------------------------------------------------------
if extension == "svg":
jj2_tpl.stream(context).dump( outfilename )
return outfilename
# To PNG with inkscape
# -------------------------------------------------------------------------
if extension == "png":
try:
log.info("Exporting to {} using inkscape".format(extension))
import subprocess
jj2_tpl.stream(context).dump( "tmp.svg" )
inkscape_process = subprocess.Popen(
[
"inkscape",
"tmp.svg",
"--export-filename",
outfilename,
],
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT,
universal_newlines = True,
)
for line_out in iter(inkscape_process.stdout.readline, ""):
log.debug(line_out)
inkscape_process.stdout.close()
rv = inkscape_process.wait()
if rv != 0:
raise Exception(
"Bad inkscape return code '{}'" \
.format(inkscape_process.returncode)
)
return outfilename
except Exception as e:
log.warning("Failed to export with inkscape")
try:
os.unlink("tmp.svg")
except:
pass
log.debug(e)
# To png, pdf or ps with cairosvg
# -------------------------------------------------------------------------
if extension in [ "png", "pdf", "ps" ]:
log.info("Exporting to {} using cairosvg".format(extension))
try:
import cairosvg
except ImportError as e:
log.error(
"Failed to export to '{}' with cairosvg" \
.format(
outfilename,
)
)
log.debug(e)
svg_str = jj2_tpl.render(context)
if extension == "png":
conversion_fun = cairosvg.svg2png
elif extension == "pdf":
conversion_fun = cairosvg.svg2pdf
elif extension == "ps":
conversion_fun = cairosvg.svg2ps
conversion_fun(
bytestring = svg_str,
write_to = outfilename,
)
return outfilename
# To unsupported format
# -------------------------------------------------------------------------
log.error(
"Can't export to '{}' : unsupported format '{}'" \
.format(
outfilename,
extension,
)
)
return None