Source code for svgen.generation.images

"""
A module for generating images from SVG files.
"""

# built-in
from asyncio import run
from contextlib import suppress
from pathlib import Path
import subprocess

# internal
from svgen.display import ICON_SIZES, AspectRatio, common_sizes
from svgen.element.svg import Svg
from svgen.inkscape import DEFAULT_ENTRY, invoke_multiple


[docs] def generate_icon(output_dir: Path) -> None: """Generate an icon from previously generated PNG outputs.""" args = ["icotool", "-c"] out_name_base = output_dir.name # Add size arguments. for size in ICON_SIZES: args.append( str(output_dir.joinpath(f"{out_name_base}-{size}x{size}.png")) ) # Add output argument. args += ["-o", str(output_dir.joinpath(f"{out_name_base}.ico"))] with suppress(subprocess.CalledProcessError, FileNotFoundError): subprocess.run(args, check=True)
[docs] def generate_images( doc: Svg, output: Path, cli_entry: str = DEFAULT_ENTRY ) -> bool: """Generate image outputs for this document.""" dir_name = output.with_suffix("") dir_name.mkdir(parents=True, exist_ok=True) arg_sets = [] out_name_base = dir_name.name doc_ratio = AspectRatio(doc.viewbox.width, doc.viewbox.height) for ratio in common_sizes(doc_ratio): out_path = dir_name.joinpath( f"{out_name_base}-{ratio.as_str('x')}.png" ) # Gather sets of arguments for inkscape. arg_sets.append(["-o", str(out_path), *ratio.args, str(output)]) # Run inkscape to generate outputs. result = False with suppress(FileNotFoundError): result = run(invoke_multiple(arg_sets, entry=cli_entry)) # Also generate an icon for square documents. if result and doc_ratio.square: generate_icon(dir_name) return result