Compare commits

...

6 Commits

5
.gitignore vendored

@ -1,2 +1,3 @@
original/ original
output/ output
**/__pycache__

@ -0,0 +1 @@
.idea

@ -0,0 +1,5 @@
To run
-
```bash
$ python src/main.py
```

201
automate/poetry.lock generated

@ -0,0 +1,201 @@
[[package]]
name = "cairocffi"
version = "1.3.0"
description = "cffi-based cairo bindings for Python"
category = "main"
optional = false
python-versions = ">=3.7"
[package.dependencies]
cffi = ">=1.1.0"
[package.extras]
doc = ["sphinx", "sphinx-rtd-theme"]
test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
xcb = ["xcffib (>=0.3.2)"]
[[package]]
name = "cairosvg"
version = "2.5.2"
description = "A Simple SVG Converter based on Cairo"
category = "main"
optional = false
python-versions = ">=3.5"
[package.dependencies]
cairocffi = "*"
cssselect2 = "*"
defusedxml = "*"
pillow = "*"
tinycss2 = "*"
[package.extras]
doc = ["sphinx", "sphinx-rtd-theme"]
test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
[[package]]
name = "cffi"
version = "1.15.1"
description = "Foreign Function Interface for Python calling C code."
category = "main"
optional = false
python-versions = "*"
[package.dependencies]
pycparser = "*"
[[package]]
name = "cssselect2"
version = "0.6.0"
description = "CSS selectors for Python ElementTree"
category = "main"
optional = false
python-versions = ">=3.7"
[package.dependencies]
tinycss2 = "*"
webencodings = "*"
[package.extras]
doc = ["sphinx", "sphinx-rtd-theme"]
test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
[[package]]
name = "defusedxml"
version = "0.7.1"
description = "XML bomb protection for Python stdlib modules"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "pillow"
version = "9.2.0"
description = "Python Imaging Library (Fork)"
category = "main"
optional = false
python-versions = ">=3.7"
[package.extras]
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
[[package]]
name = "pycparser"
version = "2.21"
description = "C parser in Python"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "pyyaml"
version = "6.0"
description = "YAML parser and emitter for Python"
category = "main"
optional = false
python-versions = ">=3.6"
[[package]]
name = "tinycss2"
version = "1.1.1"
description = "A tiny CSS parser"
category = "main"
optional = false
python-versions = ">=3.6"
[package.dependencies]
webencodings = ">=0.4"
[package.extras]
doc = ["sphinx", "sphinx-rtd-theme"]
test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
[[package]]
name = "types-pyyaml"
version = "6.0.10"
description = "Typing stubs for PyYAML"
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "typing-extensions"
version = "4.3.0"
description = "Backported and Experimental Type Hints for Python 3.7+"
category = "main"
optional = false
python-versions = ">=3.7"
[[package]]
name = "webencodings"
version = "0.5.1"
description = "Character encoding aliases for legacy web content"
category = "main"
optional = false
python-versions = "*"
[metadata]
lock-version = "1.1"
python-versions = "^3.10"
content-hash = "f53bba5be8f79539f2f1e96e0fccc6feaf7553d646a307ea39be9e6d3cefc64c"
[metadata.files]
cairocffi = []
cairosvg = []
cffi = []
cssselect2 = []
defusedxml = [
{file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
{file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
]
pillow = []
pycparser = [
{file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
{file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
]
pyyaml = [
{file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
{file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
{file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
{file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
{file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
{file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
{file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
{file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
{file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
{file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
{file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
{file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
{file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
{file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
{file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
{file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
{file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
{file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
{file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
{file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
{file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
{file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
{file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
{file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
{file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
{file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
{file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
{file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
{file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
]
tinycss2 = [
{file = "tinycss2-1.1.1-py3-none-any.whl", hash = "sha256:fe794ceaadfe3cf3e686b22155d0da5780dd0e273471a51846d0a02bc204fec8"},
{file = "tinycss2-1.1.1.tar.gz", hash = "sha256:b2e44dd8883c360c35dd0d1b5aad0b610e5156c2cb3b33434634e539ead9d8bf"},
]
types-pyyaml = []
typing-extensions = []
webencodings = [
{file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
{file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
]

@ -0,0 +1,18 @@
[tool.poetry]
name = "automate"
version = "0.1.0"
description = ""
authors = ["ENDERZOMBI102 <enderzombi102.end@gmail.com>"]
[tool.poetry.dependencies]
python = "^3.10"
PyYAML = "^6.0"
types-PyYAML = "^6.0.10"
CairoSVG = "^2.5.2"
typing-extensions = "^4.3.0"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 3874.2258 3789.6472"
version="1.1"
id="svg24"
sodipodi:docname="LGBTQ+_rainbow_flag_Quasar__Progress__variant.svg"
inkscape:export-filename="LGBTQ+_rainbow_flag_Quasar__Progress__variant.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
width="3874.2258"
height="3789.6472"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs28">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14155">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14157"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14159">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14161"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14163">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14165"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14167">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14169"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14171">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14173"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14175">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14177"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14179">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14181"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14183">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14185"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14187">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14189"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14191">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14193"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath14195">
<path
d="M 1791.279,3596.5354 C 1707.8921,3494.8749 1499.6789,3296.686 1328.5832,3156.1158 821.64013,2739.6176 752.64507,2679.3419 546.81566,2473.1469 167.35625,2093.0134 6.2060809,1711.1037 6.7583143,1193.2647 7.0277642,940.4763 22.865211,843.08481 87.934765,694.07902 198.33022,441.27835 360.94821,253.42759 568.85525,138.53691 716.10851,57.164187 788.7336,21.011626 1034.6367,19.532581 c 257.2321,-1.54657 311.3826,31.083159 462.6958,121.520119 184.1741,110.07717 373.7411,345.33114 412.9273,512.44507 l 24.2024,103.21531 59.685,-142.15127 c 337.2766,-803.28945 1414.0826,-791.27118 1788.8166,19.96543 118.8763,257.3471 131.9274,806.84736 26.515,1116.37806 -137.5064,403.7713 -395.7764,711.5993 -992.8088,1183.3142 -391.5439,309.3591 -834.6822,777.4266 -865.5303,843.1671 -35.8092,76.3132 -1.7081,11.9592 -159.8607,-180.8512 z"
id="path14197"
style="fill:#ff0000;fill-opacity:0;stroke-width:6.31403"
inkscape:label="path2417" />
</clipPath>
</defs>
<sodipodi:namedview
id="namedview26"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="0.1499586"
inkscape:cx="2467.3476"
inkscape:cy="1817.1682"
inkscape:window-width="1920"
inkscape:window-height="991"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="svg24" />
<rect
fill="#750787"
width="6000"
height="3810"
id="rect2"
clip-path="url(#clipPath14195)"
x="0"
y="0"
transform="translate(-6.7569001,-19.037855)" />
<rect
fill="#004dff"
width="6000"
height="3175"
id="rect4"
clip-path="url(#clipPath14191)"
x="0"
y="0"
transform="translate(-6.7569001,-19.037855)" />
<rect
fill="#008026"
width="6000"
height="2540"
id="rect6"
clip-path="url(#clipPath14187)"
x="0"
y="0"
transform="translate(-6.7569001,-19.037855)" />
<rect
fill="#ffed00"
width="6000"
height="1905"
id="rect8"
clip-path="url(#clipPath14183)"
x="0"
y="0"
transform="translate(-6.7569001,-19.037855)" />
<rect
fill="#ff8c00"
width="6000"
height="1270"
id="rect10"
clip-path="url(#clipPath14179)"
x="0"
y="0"
transform="translate(-6.7569001,-19.037855)" />
<rect
fill="#e40303"
width="6000"
height="635"
id="rect12"
clip-path="url(#clipPath14175)"
x="0"
y="0"
transform="translate(-6.7569001,-19.037855)" />
<polygon
points="-1,2850 -1,960 950,1905 "
fill="#ffffff"
id="polygon14"
clip-path="url(#clipPath14171)"
transform="translate(-6.7569001,-19.037855)" />
<polygon
points="1420,1905 -1,3330 -1,2850 950,1905 -1,960 -1,480 "
fill="#ffafc8"
id="polygon16"
clip-path="url(#clipPath14167)"
transform="translate(-6.7569001,-19.037855)" />
<polygon
points="1912,1905 -1,3810 -1,3330 1420,1905 -1,480 -1,0 "
fill="#74d7ee"
id="polygon18"
clip-path="url(#clipPath14163)"
transform="translate(-6.7569001,-19.037855)" />
<polygon
points="-1,3810 480,3810 2384,1905 480,0 -1,0 1912,1905 "
fill="#613915"
id="polygon20"
clip-path="url(#clipPath14159)"
transform="translate(-6.7569001,-19.037855)" />
<polygon
points="2864,1905 960,3810 480,3810 2384,1905 480,0 960,0 "
fill="#000000"
id="polygon22"
clip-path="url(#clipPath14155)"
transform="translate(-6.7569001,-19.037855)" />
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

@ -0,0 +1,15 @@
name: 'blobfox'
basedOff: null
variants:
- name: 'base'
src: '../vector/blobfox.svg'
- name: 'boop'
objects:
- type: svg
src: 'resources/lgbtq_heart.svg'
overwrites:
- id: 'eye-left'
color: 0xfffffffff
remove: true

@ -0,0 +1,11 @@
name: 'neugeme'
basedOff: 'blobfox' # all variants from 'blobfox' will be imported in this unit, unless they are already present
variants:
- name: 'base'
overwrites:
- id: 'body'
color: 0x02FFFD
- id: 'hair'
color: 0x02FFFD
- id: 'blobfox'
remove: true

@ -0,0 +1,29 @@
from dataclasses import dataclass
from pathlib import Path
from typing_extensions import Self
from data.object import Object
from data.overwrite import Overwrite
@dataclass
class Emote:
name: str
origin: list[ str ] #: the origins in order of definition
base: str | None = None
src: Path | None = None
objects: list[Object] = None
overwrites: list[Overwrite] = None
@classmethod
def load( cls, data: list[dict], origin: str ) -> list[Self]:
return [
Emote(
origin=[ origin ],
**entry | {
'base': 'base' if 'base' not in entry and 'src' not in entry else entry.get( 'base', None ),
'overwrites': Overwrite.load( entry.get( 'overwrites', [ ] ) ),
'objects': Object.load( entry.get( 'objects', [ ] ) )
}
) for entry in data
]

@ -0,0 +1,17 @@
from dataclasses import dataclass
from pathlib import Path
from typing_extensions import Self
@dataclass(frozen=True)
class Object:
type: str
src: Path | None
@classmethod
def load( cls, data: list[dict] ) -> list[ Self ]:
objects: list[ Object ] = []
for obj in data or []:
objects += [ Object( **obj ) ]
return objects

@ -0,0 +1,17 @@
from dataclasses import dataclass
from typing_extensions import Self
@dataclass(frozen=True)
class Overwrite:
id: str
color: str | None = None
remove: bool = False
@classmethod
def load( cls, data: list[dict] ) -> list[Self]:
overwrites: list[ Overwrite ] = [ ]
for overwrite in data or [ ]:
overwrites += [ Overwrite( **overwrite ) ]
return overwrites

@ -0,0 +1,80 @@
from __future__ import annotations
import typing
from dataclasses import dataclass
from pathlib import Path
from typing import Final
from collections.abc import Collection, Iterator
import util
from data.emote import Emote
if typing.TYPE_CHECKING:
from generator import Generator
# noinspection PyFinal
@dataclass(frozen=True, slots=True)
class Variants( Collection[Emote] ):
""" An immutable variant list """
name: Final[ str ]
basedOff: Final[ tuple[ str ] ]
variants: Final[ tuple[ Emote ] ]
def __init__( self, path: Path, gen: Generator ) -> None:
data = util.load( path )
object.__setattr__( self, 'name', data[ 'name' ] )
object.__setattr__( self, 'basedOff', data.get( 'basedOff', None ) )
if data['basedOff']:
# loading a set based off another, load the base one before this
base = gen.load( path.parent / f'{data["basedOff"]}.yml' )
# additional emotes may be defined
additional = [ ]
# apply overwrites and append new emotes to `additional`
for emote in Emote.load( data['variants'], self.name ):
if emote.name in base:
base._applyOverwrite( emote )
else:
additional += [ emote ]
# save the newly created set of emotes
object.__setattr__( self, 'variants', base.variants + tuple( additional ) )
else:
# loading a baseless set, just load it directly
object.__setattr__( self, 'variants', tuple( Emote.load( data['variants'], self.name ) ) )
def __iter__( self ) -> Iterator[Emote ]:
return self.variants.__iter__()
def __contains__( self, item: object ) -> bool:
if isinstance( item, str ):
for elem in self.variants:
if elem.name == item:
return True
return False
return item in self.variants
def __getitem__( self, item: int | str ) -> Emote:
if isinstance( item, int ):
return self.variants[ item ]
if isinstance( item, str ):
for elem in self.variants:
if elem.name == item:
return elem
raise KeyError( f'A variant with name "{item}" does not exist' )
raise ValueError( f'Invalid __getitem__ input: {item}' )
def __len__( self ) -> int:
return len( self.variants )
def _applyOverwrite( self, overwriter: Emote ) -> None:
emote = self[ overwriter.name ]
emote.origin += overwriter.origin
emote.overwrites += overwriter.overwrites
emote.objects += overwriter.objects

@ -0,0 +1,40 @@
from pathlib import Path
from PIL.Image import Image
from cairosvg.surface import Surface
from data.emote import Emote
from data.variants import Variants
class Generator:
declarations: dict[ str, Variants ]
surfaces: dict[ str, Surface ]
def __init__( self, declFile: Path ) -> None:
if not declFile.exists():
raise FileNotFoundError('Declaration file does not exist!')
self.declarations = { declFile.name[:-4]: self.load( declFile ) }
def load( self, declFile: Path ) -> Variants:
return Variants( declFile, self )
def generate( self, emote: Emote ) -> Image:
pass
def export( self, sets: list[str], outputDir: Path = Path( '.' ) ) -> None:
"""
Generates the images in the given folder
\t
:param sets: the sets to export to PNGs
:param outputDir: output directory
"""
if not outputDir.exists():
outputDir.mkdir()
for set in sets:
# for emote in emotes
pass

@ -0,0 +1,55 @@
import os
import sys
from argparse import ArgumentParser
from pathlib import Path
from typing import cast
from generator import Generator
parser = ArgumentParser(
prog=( 'automation' + '.exe' if 'win' in os.name.lower() else '' ) if getattr( sys, 'frozen', False ) else 'main.py',
description='Generates blobfoxes from yaml and svgs'
)
parser.add_argument(
'-d',
'--declfile',
help='Declaration file to export',
action='store',
type=Path,
dest='declFile',
required=True
)
parser.add_argument(
'-e',
'--export',
help='A comma-separated list of emote to export',
action='store',
dest='exports',
default='<all>'
)
parser.add_argument(
'-o',
'--output',
help='Output directory',
action='store',
type=Path,
dest='output',
default=Path('.')
)
class Arguments:
declFile: Path
exports: str
output: Path
if __name__ == '__main__':
args: Arguments = cast( parser.parse_args( sys.argv[1:] ), Arguments )
gen = Generator( args.declFile )
gen.export( args.exports.split(','), args.output )

@ -0,0 +1,14 @@
from pathlib import Path
from typing import Any
import yaml
def load( path: Path ) -> Any:
""" Parse the first YAML document in a stream and produce the corresponding Python object. """
return yaml.load( path.read_text(), yaml.FullLoader )
def loads( data: str ) -> Any:
""" Parse the first YAML document in a string and produce the corresponding Python object. """
return yaml.load( data, yaml.FullLoader )
Loading…
Cancel
Save