Add new export-options and svg_embed_png option

New set of options to tweak the export, and the first one: a way to
embed PNG images inside the resulting SVG file.
master
Lertsenem 2021-01-06 09:33:36 +01:00
parent 863411f6ca
commit 6bc8e8c9e3
2 changed files with 71 additions and 2 deletions

View File

@ -146,6 +146,7 @@ def generate_pic(
outform, outform,
log = log, log = log,
cachedir = dir_cache, cachedir = dir_cache,
options = { "svg_embed_png": options.get("svg_embed_png",False) },
) )
if pic is None: if pic is None:
@ -247,6 +248,12 @@ def main():
default = [], default = [],
help = "Template-specific options", help = "Template-specific options",
) )
top8_parser.add_argument(
"--export-options", "-E",
action = "append",
default = [],
help = "Export options (like svg_embed_png)",
)
top8_parser.add_argument( top8_parser.add_argument(
"--lkrz-file", "-f", "--lkrz-file", "-f",
@ -463,6 +470,7 @@ def main():
args.outfile, args.outfile,
log = log, log = log,
cachedir = args.cachedir, cachedir = args.cachedir,
options={"svg_embed_png": "svg_embed_png" in args.export_options},
) )
if rv is None: if rv is None:

View File

@ -1,7 +1,9 @@
import base64
import io import io
import os import os
import subprocess import subprocess
import tempfile import tempfile
import urllib
import jinja2 import jinja2
@ -13,12 +15,14 @@ def generate_outfile(
outfilename, outfilename,
log = None, log = None,
cachedir = None, cachedir = None,
options = {},
): ):
# Template rendering # Template rendering
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
log.info("Generating SVG using '{}' template".format(templatename)) log.info("Generating SVG using '{}' template".format(templatename))
log.debug("Context : {}".format(context)) log.debug("Context : {}".format(context))
log.debug("Options : {}".format(options))
log.debug( log.debug(
"Initializing jinja2 with template dir '{}'" \ "Initializing jinja2 with template dir '{}'" \
@ -43,7 +47,34 @@ def generate_outfile(
# To SVG # To SVG
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
if outfilename.suffix == ".svg": if outfilename.suffix == ".svg":
if options.get("svg_embed_png", False):
log.debug("embedding png images")
with open(outfilename, "w") as out:
for line in jj2_tpl.render(context).splitlines():
l = line.strip()
if ( l.startswith("xlink:href=\"file://")
and l.endswith(".png\"") ):
image_url = urllib.parse.urlparse(
"=".join( l.split("=")[1:] )[1:-1],
)
log.debug("embedding image '{}'".format(image_url.path))
with open(image_url.path, "rb") as image:
line = "xlink:href=\"data:image/png;base64,{d}\"" \
.format(
d = base64 \
.b64encode(image.read()) \
.decode("ascii"),
)
out.write(line)
out.write("\n")
else:
jj2_tpl.stream(context).dump( str(outfilename) ) jj2_tpl.stream(context).dump( str(outfilename) )
return outfilename return outfilename
# To PNG with inkscape # To PNG with inkscape
@ -156,6 +187,7 @@ def generate_pic(
outform="svg", outform="svg",
log = None, log = None,
cachedir = None, cachedir = None,
options = {},
): ):
if outform not in ["svg", "png"]: if outform not in ["svg", "png"]:
@ -191,7 +223,36 @@ def generate_pic(
# To SVG # To SVG
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
if outform == "svg": if outform == "svg":
return jj2_tpl.render(context)
out = io.StringIO()
if options.get("svg_embed_png", False):
log.debug("embedding png images")
for line in jj2_tpl.render(context).splitlines():
l = line.strip()
if ( l.startswith("xlink:href=\"")
and l.endswith(".png\"") ):
image_url = urllib.parse.urlparse(
"=".join( l.split("=")[1:] )[1:-1],
)
log.debug("embedding image '{}'".format(image_url.path))
with open(image_url.path, "rb") as image:
line = "xlink:href=\"data:image/png;base64,{d}\"" \
.format(
d = base64 \
.b64encode(image.read()) \
.decode("ascii"),
)
out.write(line)
out.write("\n")
else:
out.write(jj2_tpl.render(context))
out.seek(0)
return out
# To PNG with inkscape # To PNG with inkscape
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------