1
Fork 0
dotfiles/.local/bin/project-avatar

133 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import os
import re
import subprocess
import sys
import typing
def main() -> None:
parser = create_parser()
args = parser.parse_args()
if os.path.isfile(args.filename):
if args.overwrite:
os.remove(args.filename)
else:
print("Target file already exists, use --overwrite to overwrite.")
sys.exit(1)
subprocess.run(
[
"gegl",
"-o",
args.filename,
"--",
*gegl_graph(args.height, args.width, args.text, args.font_size),
],
check=True,
)
if not os.path.isfile(args.filename):
print("Something went wrong with GEGL")
sys.exit(1)
subprocess.run(
[
"convert",
args.filename,
"-background",
"transparent",
"-gravity",
"center",
"-extent",
f"{args.width}x{args.height}",
args.filename,
],
check=True,
)
if args.clean:
subprocess.run(
[
"mat2",
"--inplace",
args.filename,
],
check=True,
)
def create_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Project Avatar Generator")
parser.add_argument(
"filename",
help="The image filename to write to.",
)
parser.add_argument(
"text",
help="The text for the project avatar.",
)
parser.add_argument(
"--width",
help="The width of the image.",
type=int,
default=256,
)
parser.add_argument(
"--height",
help="The height of the image.",
type=int,
default=256,
)
parser.add_argument(
"--overwrite",
help="Overwrite an existing image.",
action="store_true",
)
parser.add_argument(
"--clean",
help="Use MAT2 to clean the image.",
action="store_true",
)
parser.add_argument(
"--font-size",
help="The font size to use for the text.",
type=int,
default=150,
)
return parser
def gegl_graph(height: int, width: int, text: str, font_size: int) -> typing.List[str]:
graph = f"""
gegl:text
string={text}
width={width}
height={height}
color=white
font=Heavitas
size={font_size}
alignment=1
vertical-alignment=1
gegl:dropshadow
x=0
y=0
color=black
opacity=1
grow-radius=4
radius=0
gegl:long-shadow
angle=90
color=black
length=20
"""
return re.sub("\s\s+", "\n", graph).strip().splitlines()
if __name__ == "__main__":
main()