diff --git a/.gitignore b/.gitignore
index b09796f..dab42dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,3 @@
-original/
output/
-Cargo.lock
-target/
-blobfox-*.zip
-species/custom/
+.vscode/
+.frontmatter/
diff --git a/Cargo.toml b/Cargo.toml
deleted file mode 100644
index d358b4f..0000000
--- a/Cargo.toml
+++ /dev/null
@@ -1,24 +0,0 @@
-[package]
-name = "blobfox-template"
-version = "0.1.0"
-edition = "2021"
-default-run = "blobfox-template"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-serde = { version = "1.0.140", features = ["derive"] }
-toml = "0.5.9"
-# Original repo is abandonned :(
-# TODO: switch back to the official crate once https://github.com/eminence/xmltree-rs/pull/33 is merged
-# xmltree = "0.10.3"
-xmltree = { git = "https://github.com/MFEK/xmltree.rlib" }
-mustache = { git = "https://git.shadamethyst.xyz/adri326/rust-mustache.git" }
-clap = { version = "3.2", features = ["derive"] }
-mkdirp = "1.0.0"
-resvg = "0.23"
-usvg = "0.23"
-tiny-skia = "0.6"
-png = "0.17"
-css-color-parser = "0.1.2"
-wax = "0.5.0"
diff --git a/README.md b/README.md
index 3cc3721..b3416d9 100644
--- a/README.md
+++ b/README.md
@@ -36,25 +36,22 @@ If you'd like to help, there are a few things that need attention outside of imp
- vectorize high-value emotes (emotes which contain assets not present in others);
the usual procedure is to copy the `blobfox.svg` file and to edit away, making sure not to move the body around
- draw base emotes for other species:
- - raccoon
- - doberman
- - german shepherd
- - collie
- - sheep
- - bird
- - etc.
+ - raccoon
+ - doberman
+ - german shepherd
+ - collie
+ - sheep
+ - bird
+ - etc.
- clean up the SVG for the existing emotes (the `clean` binary in `feat/template` is meant to do the heavy-lifting)
### TODO
-- set_stroke!
-- blobfox_ohmy
-- blobfox_trumpet
-- blobfox_highfive
-- googly eyes?
-- tea/coffee
-- sad
-- uwu
+- snuggles
+- husky
+- stella
+- amber
+- pride hearts
## License
@@ -66,7 +63,7 @@ For simplicity, the authors of the different parts of this project have been gro
- Feuerfuchs: [original website (down as of writing)](https://feuerfuchs.dev/), [archive](https://web.archive.org/web/20211115174913/https://www.feuerfuchs.dev/en/projects/blobfox-emojis/)
- [LambdAurora](https://git.lambdaurora.dev/lambdaurora/), hosts [a mirror](https://git.lambdaurora.dev/lambdaurora/blobfox)
- [Shad Amethyst](https://git.shadamethyst.xyz/adri326/)
-
+- Lost Quasar
@@ -75,11 +72,12 @@ For simplicity, the authors of the different parts of this project have been gro
Any contribution to the [original repository of this project](https://git.shadamethyst.xyz/adri326/blobfox) must be made available under the [license of this project](./LICENSE.txt).
This means that:
+
- You must either be the author of the code/asset/image you wish to contribute, or have been given explicit permission by the original author to contribute it here.
- Assets and images must be released under the Apache 2.0 license
- If a contribution is derived from an asset or image, then this asset must also be released under the Apache 2.0 license
- Ideally, contributions should contain a list of contributors, so that these can be added to the list of contributors
-For svg files, please include the [svg-default-metadata.xml](./svg-default-metadata.xml) file in the svg file (and complete the blank fields).
+For svg files, please include the [svg-default-metadata.xml](credits.svg) file in the svg file (and complete the blank fields).
Don't hesitate to open an issue if you are unsure about any of the above points!
diff --git a/assets/colors/arcticfox.yaml b/assets/colors/arcticfox.yaml
new file mode 100644
index 0000000..4fa022c
--- /dev/null
+++ b/assets/colors/arcticfox.yaml
@@ -0,0 +1,8 @@
+body_color: "eef2f4"
+ear_color: "8599ad"
+ear_fluff_color: "a0c7de"
+hand_color: "eef2f4"
+tail_color: "eef2f4"
+marks_color: "eee64e"
+sheen_color: "bfdef4"
+hand_stroke_color: "8599ad"
\ No newline at end of file
diff --git a/assets/colors/cat.yaml b/assets/colors/cat.yaml
new file mode 100644
index 0000000..ce17c47
--- /dev/null
+++ b/assets/colors/cat.yaml
@@ -0,0 +1,5 @@
+body_color: "fcc21b"
+ear_color: "e9ae20"
+ear_fluff_color: "8a6135"
+hand_color: "fcc21b"
+tail_color: "fcc21b"
\ No newline at end of file
diff --git a/assets/colors/fox.yaml b/assets/colors/fox.yaml
new file mode 100644
index 0000000..fcf38ad
--- /dev/null
+++ b/assets/colors/fox.yaml
@@ -0,0 +1,6 @@
+body_color: "ff8702"
+ear_color: "313131"
+ear_fluff_color: "ebdccc"
+hand_color: "ff8702"
+hand_stroke_color: "313131"
+tail_color: "ff8702"
diff --git a/assets/credits.svg b/assets/credits.svg
new file mode 100644
index 0000000..b7e7fd7
--- /dev/null
+++ b/assets/credits.svg
@@ -0,0 +1,21 @@
+
+
\ No newline at end of file
diff --git a/assets/eyes/left/base.svg b/assets/eyes/left/base.svg
new file mode 100644
index 0000000..c688088
--- /dev/null
+++ b/assets/eyes/left/base.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/eyes/left/evil.svg b/assets/eyes/left/evil.svg
new file mode 100644
index 0000000..533c4bc
--- /dev/null
+++ b/assets/eyes/left/evil.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/eyes/left/happy.svg b/assets/eyes/left/happy.svg
new file mode 100644
index 0000000..d504e20
--- /dev/null
+++ b/assets/eyes/left/happy.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/eyes/left/small.svg b/assets/eyes/left/small.svg
new file mode 100644
index 0000000..4bcabeb
--- /dev/null
+++ b/assets/eyes/left/small.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/assets/eyes/left/squint.svg b/assets/eyes/left/squint.svg
new file mode 100644
index 0000000..27a5a27
--- /dev/null
+++ b/assets/eyes/left/squint.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/eyes/right/base.svg b/assets/eyes/right/base.svg
new file mode 100644
index 0000000..7dd15ac
--- /dev/null
+++ b/assets/eyes/right/base.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/eyes/right/evil.svg b/assets/eyes/right/evil.svg
new file mode 100644
index 0000000..2098272
--- /dev/null
+++ b/assets/eyes/right/evil.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/eyes/right/happy.svg b/assets/eyes/right/happy.svg
new file mode 100644
index 0000000..d7b5a8c
--- /dev/null
+++ b/assets/eyes/right/happy.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/eyes/right/small.svg b/assets/eyes/right/small.svg
new file mode 100644
index 0000000..365c0df
--- /dev/null
+++ b/assets/eyes/right/small.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/assets/eyes/right/squint.svg b/assets/eyes/right/squint.svg
new file mode 100644
index 0000000..5b4cdcd
--- /dev/null
+++ b/assets/eyes/right/squint.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/species/blobfox/assets/flag_ace.svg b/assets/flag/flag_ace.svg
similarity index 100%
rename from species/blobfox/assets/flag_ace.svg
rename to assets/flag/flag_ace.svg
diff --git a/species/blobfox/assets/flag_agender.svg b/assets/flag/flag_agender.svg
similarity index 100%
rename from species/blobfox/assets/flag_agender.svg
rename to assets/flag/flag_agender.svg
diff --git a/species/blobfox/assets/flag_demisexual.svg b/assets/flag/flag_demisexual.svg
similarity index 100%
rename from species/blobfox/assets/flag_demisexual.svg
rename to assets/flag/flag_demisexual.svg
diff --git a/species/blobfox/assets/flag_enby.svg b/assets/flag/flag_enby.svg
similarity index 100%
rename from species/blobfox/assets/flag_enby.svg
rename to assets/flag/flag_enby.svg
diff --git a/species/blobfox/assets/flag_pan.svg b/assets/flag/flag_pan.svg
similarity index 100%
rename from species/blobfox/assets/flag_pan.svg
rename to assets/flag/flag_pan.svg
diff --git a/species/blobfox/assets/flag_progress.svg b/assets/flag/flag_progress.svg
similarity index 100%
rename from species/blobfox/assets/flag_progress.svg
rename to assets/flag/flag_progress.svg
diff --git a/species/blobfox/assets/flag_trans.svg b/assets/flag/flag_trans.svg
similarity index 100%
rename from species/blobfox/assets/flag_trans.svg
rename to assets/flag/flag_trans.svg
diff --git a/species/blobarcticfox/assets/base.svg b/assets/fur/arcticfox/base.svg
similarity index 55%
rename from species/blobarcticfox/assets/base.svg
rename to assets/fur/arcticfox/base.svg
index 6403f7a..1ed9328 100644
--- a/species/blobarcticfox/assets/base.svg
+++ b/assets/fur/arcticfox/base.svg
@@ -1,13 +1,5 @@
diff --git a/species/blobarcticfox/assets/snug.svg b/assets/fur/arcticfox/snug.svg
similarity index 60%
rename from species/blobarcticfox/assets/snug.svg
rename to assets/fur/arcticfox/snug.svg
index 4af5cd7..533c6bc 100644
--- a/species/blobarcticfox/assets/snug.svg
+++ b/assets/fur/arcticfox/snug.svg
@@ -1,15 +1,6 @@
-
diff --git a/species/blobfox/assets/base.svg b/assets/fur/fox/base.svg
similarity index 51%
rename from species/blobfox/assets/base.svg
rename to assets/fur/fox/base.svg
index a1e3ef6..9cfc53f 100644
--- a/species/blobfox/assets/base.svg
+++ b/assets/fur/fox/base.svg
@@ -1,13 +1,5 @@
-
- blobfox
-
-
-
-
-
-
-
+
@@ -15,34 +7,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
diff --git a/species/blobfox/assets/snug.svg b/assets/fur/fox/snug.svg
similarity index 62%
rename from species/blobfox/assets/snug.svg
rename to assets/fur/fox/snug.svg
index 98213ca..acfa0d0 100644
--- a/species/blobfox/assets/snug.svg
+++ b/assets/fur/fox/snug.svg
@@ -1,14 +1,5 @@
-
- blobfox_snug
-
-
-
-
-
-
-
-
+
@@ -17,33 +8,4 @@
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_snug
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
diff --git a/assets/hand/arcticfox/big_left.svg b/assets/hand/arcticfox/big_left.svg
new file mode 100644
index 0000000..3384437
--- /dev/null
+++ b/assets/hand/arcticfox/big_left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/arcticfox/big_right.svg b/assets/hand/arcticfox/big_right.svg
new file mode 100644
index 0000000..3f6aeb3
--- /dev/null
+++ b/assets/hand/arcticfox/big_right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/arcticfox/left.svg b/assets/hand/arcticfox/left.svg
new file mode 100644
index 0000000..f3b94a2
--- /dev/null
+++ b/assets/hand/arcticfox/left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/arcticfox/right.svg b/assets/hand/arcticfox/right.svg
new file mode 100644
index 0000000..828dfae
--- /dev/null
+++ b/assets/hand/arcticfox/right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/cat/big_left.svg b/assets/hand/cat/big_left.svg
new file mode 100644
index 0000000..4c4c915
--- /dev/null
+++ b/assets/hand/cat/big_left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/cat/big_right.svg b/assets/hand/cat/big_right.svg
new file mode 100644
index 0000000..084ddbc
--- /dev/null
+++ b/assets/hand/cat/big_right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/cat/left.svg b/assets/hand/cat/left.svg
new file mode 100644
index 0000000..f310fc7
--- /dev/null
+++ b/assets/hand/cat/left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/cat/right.svg b/assets/hand/cat/right.svg
new file mode 100644
index 0000000..e40a39a
--- /dev/null
+++ b/assets/hand/cat/right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/fox/big_left.svg b/assets/hand/fox/big_left.svg
new file mode 100644
index 0000000..5a4760f
--- /dev/null
+++ b/assets/hand/fox/big_left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/fox/big_right.svg b/assets/hand/fox/big_right.svg
new file mode 100644
index 0000000..f2eea3b
--- /dev/null
+++ b/assets/hand/fox/big_right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/fox/left.svg b/assets/hand/fox/left.svg
new file mode 100644
index 0000000..c16d93c
--- /dev/null
+++ b/assets/hand/fox/left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/hand/fox/right.svg b/assets/hand/fox/right.svg
new file mode 100644
index 0000000..52d57fd
--- /dev/null
+++ b/assets/hand/fox/right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/holding/crowbar.svg b/assets/holding/crowbar.svg
new file mode 100644
index 0000000..fbbd3bf
--- /dev/null
+++ b/assets/holding/crowbar.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/assets/holding/cup.svg b/assets/holding/cup.svg
new file mode 100644
index 0000000..c238f92
--- /dev/null
+++ b/assets/holding/cup.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/assets/holding/cup_liquid/coffee.svg b/assets/holding/cup_liquid/coffee.svg
new file mode 100644
index 0000000..1f290ac
--- /dev/null
+++ b/assets/holding/cup_liquid/coffee.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/holding/cup_liquid/hot_coco.svg b/assets/holding/cup_liquid/hot_coco.svg
new file mode 100644
index 0000000..b3a494a
--- /dev/null
+++ b/assets/holding/cup_liquid/hot_coco.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/holding/egg.svg b/assets/holding/egg.svg
new file mode 100644
index 0000000..d38135b
--- /dev/null
+++ b/assets/holding/egg.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/assets/holding/heart.svg b/assets/holding/heart.svg
new file mode 100644
index 0000000..067f2f0
--- /dev/null
+++ b/assets/holding/heart.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/holding/knife.svg b/assets/holding/knife.svg
new file mode 100644
index 0000000..8880ed7
--- /dev/null
+++ b/assets/holding/knife.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/assets/mouth/cat/w_mouth.svg b/assets/mouth/cat/w_mouth.svg
new file mode 100644
index 0000000..03bb2dc
--- /dev/null
+++ b/assets/mouth/cat/w_mouth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/mouth/fox/w_mouth.svg b/assets/mouth/fox/w_mouth.svg
new file mode 100644
index 0000000..fd43ca8
--- /dev/null
+++ b/assets/mouth/fox/w_mouth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/nose/fox/base.svg b/assets/nose/fox/base.svg
new file mode 100644
index 0000000..5ad7e47
--- /dev/null
+++ b/assets/nose/fox/base.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/nose/fox/evil.svg b/assets/nose/fox/evil.svg
new file mode 100644
index 0000000..b0995c1
--- /dev/null
+++ b/assets/nose/fox/evil.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/nose/fox/happy.svg b/assets/nose/fox/happy.svg
new file mode 100644
index 0000000..9f10d8f
--- /dev/null
+++ b/assets/nose/fox/happy.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/nose/fox/squint.svg b/assets/nose/fox/squint.svg
new file mode 100644
index 0000000..c5f42f9
--- /dev/null
+++ b/assets/nose/fox/squint.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/overlay/blanket.svg b/assets/overlay/blanket.svg
new file mode 100644
index 0000000..06defa4
--- /dev/null
+++ b/assets/overlay/blanket.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/overlay/blanket_ear/arcticfox.svg b/assets/overlay/blanket_ear/arcticfox.svg
new file mode 100644
index 0000000..4fd286d
--- /dev/null
+++ b/assets/overlay/blanket_ear/arcticfox.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/overlay/blanket_ear/cat.svg b/assets/overlay/blanket_ear/cat.svg
new file mode 100644
index 0000000..f9c2583
--- /dev/null
+++ b/assets/overlay/blanket_ear/cat.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/overlay/blanket_ear/fox.svg b/assets/overlay/blanket_ear/fox.svg
new file mode 100644
index 0000000..7eee6e2
--- /dev/null
+++ b/assets/overlay/blanket_ear/fox.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/overlay/blush.svg b/assets/overlay/blush.svg
new file mode 100644
index 0000000..380a3fb
--- /dev/null
+++ b/assets/overlay/blush.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/overlay/boop_hand.svg b/assets/overlay/boop_hand.svg
new file mode 100644
index 0000000..6b1e49d
--- /dev/null
+++ b/assets/overlay/boop_hand.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/overlay/steam.svg b/assets/overlay/steam.svg
new file mode 100644
index 0000000..8b1d9a5
--- /dev/null
+++ b/assets/overlay/steam.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/overlay/zzz.svg b/assets/overlay/zzz.svg
new file mode 100644
index 0000000..58e68db
--- /dev/null
+++ b/assets/overlay/zzz.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/blobfox.tar.gz b/blobfox.tar.gz
deleted file mode 100755
index 1cbcd82..0000000
Binary files a/blobfox.tar.gz and /dev/null differ
diff --git a/clean.sh b/clean.sh
deleted file mode 100755
index 6698dca..0000000
--- a/clean.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-cargo run --bin clean -- "$1"
-xmllint "$1" --format --output "$1"
diff --git a/custom/blobfox_approve.png b/custom/blobfox_approve.png
deleted file mode 100644
index 6ae52f4..0000000
Binary files a/custom/blobfox_approve.png and /dev/null differ
diff --git a/custom/blobfox_msnuggle_poly3.png b/custom/blobfox_msnuggle_poly3.png
deleted file mode 100644
index 200080c..0000000
Binary files a/custom/blobfox_msnuggle_poly3.png and /dev/null differ
diff --git a/custom/blobfox_plural.png b/custom/blobfox_plural.png
deleted file mode 100644
index 1b4c4d9..0000000
Binary files a/custom/blobfox_plural.png and /dev/null differ
diff --git a/custom/blobfox_pride.png b/custom/blobfox_pride.png
deleted file mode 100644
index 7cef724..0000000
Binary files a/custom/blobfox_pride.png and /dev/null differ
diff --git a/definitions.toml b/definitions.toml
new file mode 100644
index 0000000..1d9f36d
--- /dev/null
+++ b/definitions.toml
@@ -0,0 +1,4 @@
+coffee_cup = ["overlay/steam.svg","holding/cup.svg","holding/cup_liquid/coffee.svg"]
+hot_coco_cup = ["overlay/steam.svg","holding/cup.svg","holding/cup_liquid/hot_coco.svg"]
+arctic_base = ["fur/arcticfox/base.svg", "eyes/left/base.svg", "eyes/right/base.svg", "nose/fox/base.svg", "mouth/fox/w_mouth.svg"]
+arctic_hand_right = ["hand/arcticfox/right.svg"]
\ No newline at end of file
diff --git a/designs.toml b/designs.toml
new file mode 100644
index 0000000..bf0af77
--- /dev/null
+++ b/designs.toml
@@ -0,0 +1,2 @@
+arctic_hot_coco = ["arctic_base", "hot_coco_cup", "arctic_hand_right"]
+arctic_coffee = ["arctic_base", "coffee_cup", "arctic_hand_right"]
diff --git a/snuggle.toml b/snuggle.toml
deleted file mode 100644
index 6c3575f..0000000
--- a/snuggle.toml
+++ /dev/null
@@ -1,63 +0,0 @@
-name = "snuggle"
-dx = -90
-dy = -30
-bold = 12.0
-
-# TODO: (medium) read from the species declaration and grab all the svgs with a given tag
-# TODO: (low) generate the SVGs in-memory instead of reading them from the disk
-[left]
-blobfox = "blobfox_snuggle_left"
-blobfox_blush = "blobfox_blush"
-blobfox_happy = "blobfox_happy"
-blobfox_aww = "blobfox_aww"
-
-blobhusky = "blobhusky_snuggle_left"
-blobhusky_blush = "blobhusky_blush"
-blobhusky_happy = "blobhusky_happy"
-blobhusky_aww = "blobhusky_aww"
-
-blobcat = "blobcat_snuggle_left"
-blobcat_blush = "blobcat_blush"
-blobcat_happy = "blobcat_happy"
-blobcat_aww = "blobcat_aww"
-
-blobstella = "blobstella_snuggle_left"
-blobstella_blush = "blobstella_blush"
-blobstella_happy = "blobstella_happy"
-blobstella_aww = "blobstella_aww"
-
-blobarcticfox = "blobarcticfox_snuggle_left"
-blobarcticfox_blush = "blobarcticfox_blush"
-blobarcticfox_happy = "blobarcticfox_happy"
-blobarcticfox_aww = "blobarcticfox_aww"
-
-[right]
-blobfox = "blobfox_snuggle_right"
-blobfox_blush = "blobfox_snuggle_right_blush"
-blobfox_heart = "blobfox_snuggle_right_heart"
-blobfox_blush_heart = "blobfox_snuggle_right_blush_heart"
-
-blobarcticfox = "blobarcticfox_snuggle_right"
-blobarcticfox_blush = "blobarcticfox_snuggle_right_blush"
-blobarcticfox_heart = "blobarcticfox_snuggle_right_heart"
-blobarcticfox_blush_heart = "blobarcticfox_snuggle_right_blush_heart"
-
-blobhusky = "blobhusky_snuggle_right"
-blobhusky_blush = "blobhusky_snuggle_right_blush"
-blobhusky_heart = "blobhusky_snuggle_right_heart"
-blobhusky_blush_heart = "blobhusky_snuggle_right_blush_heart"
-
-blobcat = "blobcat_snuggle_right"
-blobcat_blush = "blobcat_snuggle_right_blush"
-blobcat_heart = "blobcat_snuggle_right_heart"
-blobcat_blush_heart = "blobcat_snuggle_right_blush_heart"
-
-blobamber = "blobamber_snuggle_right"
-blobamber_blush = "blobamber_snuggle_right_blush"
-blobamber_heart = "blobamber_snuggle_right_heart"
-blobamber_blush_heart = "blobamber_snuggle_right_blush_heart"
-
-blobstella = "blobstella_snuggle_right"
-blobstella_blush = "blobstella_snuggle_right_blush"
-blobstella_heart = "blobstella_snuggle_right_heart"
-blobstella_blush_heart = "blobstella_snuggle_right_blush_heart"
diff --git a/species/blobamber/assets/base.svg b/species/blobamber/assets/base.svg
deleted file mode 100644
index da558d2..0000000
--- a/species/blobamber/assets/base.svg
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
- blobcat
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobcat
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
-
-
diff --git a/species/blobamber/assets/owo.svg b/species/blobamber/assets/owo.svg
deleted file mode 100644
index 846d084..0000000
--- a/species/blobamber/assets/owo.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/species/blobamber/species.toml b/species/blobamber/species.toml
deleted file mode 100644
index 50ec5e4..0000000
--- a/species/blobamber/species.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-name = "blobamber"
-base = "../blobcat/"
-
-[vars]
-body_color = "#6a6862"
-ear_color = "#313131"
-ear_fluff_color = "#474747"
-hand_color = "#6a6862"
-tail_color = "#6a6862"
-marks_color = "#c8c8c8"
diff --git a/species/blobamber/templates/body-basic.mustache b/species/blobamber/templates/body-basic.mustache
deleted file mode 100644
index ad731ad..0000000
--- a/species/blobamber/templates/body-basic.mustache
+++ /dev/null
@@ -1,3 +0,0 @@
-{{>blobcat.body-basic}}
-
-{{#set-fill}} {{vars.marks_color}} | {{#base}}#belly{{/base}} {{/set-fill}}
diff --git a/species/blobamber/templates/body-comfy.mustache b/species/blobamber/templates/body-comfy.mustache
deleted file mode 100644
index 75d3d7a..0000000
--- a/species/blobamber/templates/body-comfy.mustache
+++ /dev/null
@@ -1,8 +0,0 @@
-{{>blobcat.body-comfy}}
-
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#belly{{/base}}
- {{/set-fill}}
-
diff --git a/species/blobamber/templates/body-snuggle.mustache b/species/blobamber/templates/body-snuggle.mustache
deleted file mode 100644
index e6540c9..0000000
--- a/species/blobamber/templates/body-snuggle.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{>blobcat.body-snuggle}}
-
-
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#belly{{/base}}
- {{/set-fill}}
-
-
diff --git a/species/blobamber/templates/eyes.mustache b/species/blobamber/templates/eyes.mustache
deleted file mode 100644
index b9efa84..0000000
--- a/species/blobamber/templates/eyes.mustache
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-{{#blobamber.owo}}#blobamber-owo-defs{{/blobamber.owo}}
-{{#blobamber.base}}#blobamber-defs{{/blobamber.base}}
-
-{{#tags.eyes-owo}}
-
- {{#owo}}#left-eye{{/owo}}
- {{#owo}}#right-eye{{/owo}}
-
-{{/tags.eyes-owo}}
-{{^tags.eyes-owo}}
- {{>blobcat.eyes}}
-{{/tags.eyes-owo}}
diff --git a/species/blobamber/templates/hands.mustache b/species/blobamber/templates/hands.mustache
deleted file mode 100644
index f733084..0000000
--- a/species/blobamber/templates/hands.mustache
+++ /dev/null
@@ -1,14 +0,0 @@
-{{#tags.hand-3c}}
-{{#tags.holding}}
-
-{{/tags.holding}}
-{{^tags.holding}}
-
-{{/tags.holding}}
-{{/tags.hand-3c}}
-
-{{>blobcat.hands}}
-
-{{#tags.hand-3c}}
-
-{{/tags.hand-3c}}
diff --git a/species/blobarcticfox/assets/snuggle_right.svg b/species/blobarcticfox/assets/snuggle_right.svg
deleted file mode 100644
index d59afe1..0000000
--- a/species/blobarcticfox/assets/snuggle_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
- blobarcticfox_snuggle_right
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobarcticfox_snuggle_right
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
-
diff --git a/species/blobarcticfox/species.toml b/species/blobarcticfox/species.toml
deleted file mode 100644
index 4b4124e..0000000
--- a/species/blobarcticfox/species.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-name = "blobarcticfox"
-base = "../blobfox"
-
-[vars]
-body_color = "#eef2f4"
-ear_color = "#8599ad"
-ear_fluff_color = "#a0c7de"
-hand_color = "#eef2f4"
-tail_color = "#eef2f4"
-marks_color = "#eee64e"
-sheen_color = "#bfdef4"
-hand_stroke_color = "#8599ad"
diff --git a/species/blobarcticfox/templates/body-basic.mustache b/species/blobarcticfox/templates/body-basic.mustache
deleted file mode 100644
index b2bc7f7..0000000
--- a/species/blobarcticfox/templates/body-basic.mustache
+++ /dev/null
@@ -1,22 +0,0 @@
-{{! Left ear }}
-{{#tags.ear-owo}}
- {{#set-fill}} {{vars.ear_fluff_color}} | {{#boop_owo}}#left-ear-fluff{{/boop_owo}} {{/set-fill}}
- {{#set-fill}} {{vars.ear_color}} | {{#boop_owo}}#left-ear{{/boop_owo}} {{/set-fill}}
-{{/tags.ear-owo}}
-{{^tags.ear-owo}}
- {{#set-fill}} {{vars.ear_color}} | {{#base}}#left-ear{{/base}} {{/set-fill}}
-{{/tags.ear-owo}}
-
-{{! Body }}
-
-
- {{#base}}#body{{/base}}
-
-
-{{#base}}#body-sheen{{/base}}
-{{#set-fill}} {{vars.body_color}} | {{#base}}#body{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.body_color}} | {{#base}}#hair{{/base}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#base}}#right-ear{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#base}}#right-ear-fluff{{/base}} {{/set-fill}}
diff --git a/species/blobarcticfox/templates/body-snug.mustache b/species/blobarcticfox/templates/body-snug.mustache
deleted file mode 100644
index cee0335..0000000
--- a/species/blobarcticfox/templates/body-snug.mustache
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
- {{#snug}}#body{{/snug}}
-
-
-
- {{! TODO: owo ear }}
- {{#set-fill}} {{vars.ear_color}} | {{#snug}}#left-ear{{/snug}} {{/set-fill}}
-
- {{! TODO: set-stroke }}
- {{#snug}}#body-sheen{{/snug}}
- {{#set-fill}} {{vars.body_color}} | {{#snug}}#body{{/snug}} {{/set-fill}}
- {{#set-fill}} {{vars.body_color}} | {{#snug}}#hair{{/snug}} {{/set-fill}}
-
- {{#set-fill}} {{vars.ear_color}} | {{#snug}}#right-ear{{/snug}} {{/set-fill}}
- {{#set-fill}} {{vars.ear_fluff_color}} | {{#snug}}#right-ear-fluff{{/snug}} {{/set-fill}}
-
- {{#tags.tail}}
-
- {{#set-fill}} {{vars.body_color}} | {{#snug}}#tail{{/snug}} {{/set-fill}}
-
- {{/tags.tail}}
-
diff --git a/species/blobarcticfox/templates/body-snuggle.mustache b/species/blobarcticfox/templates/body-snuggle.mustache
deleted file mode 100644
index 156a12c..0000000
--- a/species/blobarcticfox/templates/body-snuggle.mustache
+++ /dev/null
@@ -1,16 +0,0 @@
-{{! Left ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#left-ear{{/snuggle_right}} {{/set-fill}}
-
-{{! Body }}
-
-
- {{#snuggle_right}}#body{{/snuggle_right}}
-
-
-{{#set-fill}} {{vars.sheen_color}} | {{#snuggle_right}}#body-sheen{{/snuggle_right}} {{/set-fill}}
-{{#set-fill}} {{vars.body_color}} | {{#snuggle_right}}#body{{/snuggle_right}} {{/set-fill}}
-{{#set-fill}} {{vars.body_color}} | {{#snuggle_right}}#hair{{/snuggle_right}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#right-ear{{/snuggle_right}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#snuggle_right}}#right-ear-fluff{{/snuggle_right}} {{/set-fill}}
diff --git a/species/blobcat/assets/comfy.svg b/species/blobcat/assets/comfy.svg
deleted file mode 100644
index 24d0417..0000000
--- a/species/blobcat/assets/comfy.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
- blobcat_comfy
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobcat_comfy
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobcat/assets/snuggle_right.svg b/species/blobcat/assets/snuggle_right.svg
deleted file mode 100644
index a76b618..0000000
--- a/species/blobcat/assets/snuggle_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
- blobfox_snuggle_right
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_snuggle_right
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobcat/species.toml b/species/blobcat/species.toml
deleted file mode 100644
index b712f45..0000000
--- a/species/blobcat/species.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-name = "blobcat"
-base = "../blobfox/"
-
-[vars]
-body_color = "#fcc21b"
-ear_color = "#e9ae20"
-ear_fluff_color = "#8a6135"
-hand_color = "#fcc21b"
-tail_color = "#fcc21b"
diff --git a/species/blobcat/templates/blush.mustache b/species/blobcat/templates/blush.mustache
deleted file mode 100644
index eb247cc..0000000
--- a/species/blobcat/templates/blush.mustache
+++ /dev/null
@@ -1,14 +0,0 @@
-{{! Pull the defs from the svg for the gradients }}
-{{#blush}}#blush-defs{{/blush}}
-
-
- {{#blush}}#left-blush{{/blush}}
- {{#blush}}#left-blush-line{{/blush}}
- {{#blush}}#left-blush-line-2{{/blush}}
-
-
-
- {{#blush}}#right-blush{{/blush}}
- {{#blush}}#right-blush-line{{/blush}}
- {{#blush}}#right-blush-line-2{{/blush}}
-
diff --git a/species/blobcat/templates/body-basic.mustache b/species/blobcat/templates/body-basic.mustache
deleted file mode 100644
index b11822a..0000000
--- a/species/blobcat/templates/body-basic.mustache
+++ /dev/null
@@ -1,20 +0,0 @@
-{{! Left ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#base}}#left-ear{{/base}} {{/set-fill}}
-
-{{! Body }}
-
-
- {{#base}}#body{{/base}}
-
-
-{{#set-fill}} {{vars.body_color}} | {{#base}}#body{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.body_color}} | {{#base}}#hair{{/base}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#base}}#right-ear{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#base}}#right-ear-fluff{{/base}} {{/set-fill}}
-
-{{! Whiskers }}
-{{^tags.hands-reach}}
- {{>whiskers}}
-{{/tags.hands-reach}}
diff --git a/species/blobcat/templates/body-comfy.mustache b/species/blobcat/templates/body-comfy.mustache
deleted file mode 100644
index 7671e34..0000000
--- a/species/blobcat/templates/body-comfy.mustache
+++ /dev/null
@@ -1,3 +0,0 @@
-{{>blobfox.body-comfy}}
-
-{{>whiskers}}
diff --git a/species/blobcat/templates/body-snug.mustache b/species/blobcat/templates/body-snug.mustache
deleted file mode 100644
index b43dde5..0000000
--- a/species/blobcat/templates/body-snug.mustache
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- {{#snug}}#body{{/snug}}
-
-
-
-
- {{#set-fill}} {{vars.ear_color}} | {{#base}}#left-ear{{/base}} {{/set-fill}}
-
-
- {{#set-fill}}
- {{vars.body_color}}
- | {{#snug}}#body{{/snug}}
- {{/set-fill}}
-
-
- {{#set-fill}} {{vars.ear_color}} | {{#base}}#right-ear{{/base}} {{/set-fill}}
- {{#set-fill}} {{vars.ear_fluff_color}} | {{#base}}#right-ear-fluff{{/base}} {{/set-fill}}
-
-
- {{>tail}}
-
diff --git a/species/blobcat/templates/body-snuggle.mustache b/species/blobcat/templates/body-snuggle.mustache
deleted file mode 100644
index 0b204cf..0000000
--- a/species/blobcat/templates/body-snuggle.mustache
+++ /dev/null
@@ -1,18 +0,0 @@
-{{! Left ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#left-ear{{/snuggle_right}} {{/set-fill}}
-
-{{! Body }}
-
-
- {{#snuggle_right}}#body{{/snuggle_right}}
-
-
-{{#set-fill}} {{vars.body_color}} | {{#snuggle_right}}#body{{/snuggle_right}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#right-ear{{/snuggle_right}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#snuggle_right}}#right-ear-fluff{{/snuggle_right}} {{/set-fill}}
-
-
- {{>whiskers}}
-
diff --git a/species/blobcat/templates/hand-boop.mustache b/species/blobcat/templates/hand-boop.mustache
deleted file mode 100644
index 719360f..0000000
--- a/species/blobcat/templates/hand-boop.mustache
+++ /dev/null
@@ -1,3 +0,0 @@
-
- {{>blobfox.hand-boop}}
-
diff --git a/species/blobcat/templates/hands.mustache b/species/blobcat/templates/hands.mustache
deleted file mode 100644
index d4457ed..0000000
--- a/species/blobcat/templates/hands.mustache
+++ /dev/null
@@ -1,3 +0,0 @@
-{{#set-fill}}
- {{vars.hand_color}} | {{>blobfox.hands}}
-{{/set-fill}}
diff --git a/species/blobcat/templates/mouth.mustache b/species/blobcat/templates/mouth.mustache
deleted file mode 100644
index 8c75cd3..0000000
--- a/species/blobcat/templates/mouth.mustache
+++ /dev/null
@@ -1,13 +0,0 @@
-{{#tags.boop}}
-
-{{/tags.boop}}
-{{#tags.mouth-hmpf}}
-
-{{/tags.mouth-hmpf}}
- {{>blobfox.mouth}}
-{{#tags.boop}}
-
-{{/tags.boop}}
-{{#tags.mouth-hmpf}}
-
-{{/tags.mouth-hmpf}}
diff --git a/species/blobcat/templates/nose.mustache b/species/blobcat/templates/nose.mustache
deleted file mode 100644
index 73e3e4d..0000000
--- a/species/blobcat/templates/nose.mustache
+++ /dev/null
@@ -1,17 +0,0 @@
-{{#tags.body-snug}}
-
- {{#blobfox.base}}#nose{{/blobfox.base}}
-
-{{/tags.body-snug}}
-
-{{#tags.boop}}
-
- {{#blobfox.base}}#nose{{/blobfox.base}}
-
-{{/tags.boop}}
-
-{{#tags.mouth-hmpf}}
-
- {{#blobfox.base}}#nose{{/blobfox.base}}
-
-{{/tags.mouth-hmpf}}
diff --git a/species/blobcat/templates/tail.mustache b/species/blobcat/templates/tail.mustache
deleted file mode 100644
index 640f6fe..0000000
--- a/species/blobcat/templates/tail.mustache
+++ /dev/null
@@ -1,4 +0,0 @@
-{{#set-fill}}
- {{vars.tail_color}}
- | {{>blobfox.tail}}
-{{/set-fill}}
diff --git a/species/blobcat/templates/whiskers.mustache b/species/blobcat/templates/whiskers.mustache
deleted file mode 100644
index f2bea3d..0000000
--- a/species/blobcat/templates/whiskers.mustache
+++ /dev/null
@@ -1,14 +0,0 @@
-
-{{#tags.left-hand}}{{#tags.right-hand}}{{#tags.holding}}
-
-{{/tags.holding}}{{/tags.right-hand}}{{/tags.left-hand}}
-
- {{#base}}#left-whisker{{/base}}
- {{#base}}#left-whisker-2{{/base}}
- {{#base}}#right-whisker{{/base}}
- {{#base}}#right-whisker-2{{/base}}
-
-{{#tags.left-hand}}{{#tags.right-hand}}{{#tags.holding}}
-
-{{/tags.holding}}{{/tags.right-hand}}{{/tags.left-hand}}
-
diff --git a/species/blobfox/assets/3c_evil.svg b/species/blobfox/assets/3c_evil.svg
deleted file mode 100644
index 4993b63..0000000
--- a/species/blobfox/assets/3c_evil.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
- blobfox_3c_evil
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_3c_evil
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/blush.svg b/species/blobfox/assets/blush.svg
deleted file mode 100644
index ceaf1c4..0000000
--- a/species/blobfox/assets/blush.svg
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
- blobfox_blush
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_blush
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Feuerfuchs
-
-
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/boop_owo.svg b/species/blobfox/assets/boop_owo.svg
deleted file mode 100644
index 4e52aba..0000000
--- a/species/blobfox/assets/boop_owo.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
- blobfox_boop_owo
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_boop_owo
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/coffee.svg b/species/blobfox/assets/coffee.svg
deleted file mode 100644
index 3844688..0000000
--- a/species/blobfox/assets/coffee.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
- coffee
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
- coffee
-
-
-
-
diff --git a/species/blobfox/assets/comfy.svg b/species/blobfox/assets/comfy.svg
deleted file mode 100644
index 7ca990f..0000000
--- a/species/blobfox/assets/comfy.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
- blobfox_comfy
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_comfy
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/crowbar.svg b/species/blobfox/assets/crowbar.svg
deleted file mode 100644
index ec01bf7..0000000
--- a/species/blobfox/assets/crowbar.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
- crowbar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
- crowbar
-
-
-
-
diff --git a/species/blobfox/assets/egg.svg b/species/blobfox/assets/egg.svg
deleted file mode 100644
index 7d80699..0000000
--- a/species/blobfox/assets/egg.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
- blobfox_egg
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_egg
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/heart.svg b/species/blobfox/assets/heart.svg
deleted file mode 100644
index 0963cbb..0000000
--- a/species/blobfox/assets/heart.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
- blobfox_heart
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_heart
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/knife.svg b/species/blobfox/assets/knife.svg
deleted file mode 100644
index a1b7b29..0000000
--- a/species/blobfox/assets/knife.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
- blobfox
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/reach_aww.svg b/species/blobfox/assets/reach_aww.svg
deleted file mode 100644
index dc61a34..0000000
--- a/species/blobfox/assets/reach_aww.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
- blobfox_reach_aww
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_reach_aww
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/snug_sleep.svg b/species/blobfox/assets/snug_sleep.svg
deleted file mode 100644
index 9d31afd..0000000
--- a/species/blobfox/assets/snug_sleep.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
- blobfox_snug
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_snug
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/assets/snuggle_right.svg b/species/blobfox/assets/snuggle_right.svg
deleted file mode 100644
index 6a26c88..0000000
--- a/species/blobfox/assets/snuggle_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
- blobfox_snuggle_right
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox_snuggle_right
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobfox/species.toml b/species/blobfox/species.toml
deleted file mode 100644
index 539cda7..0000000
--- a/species/blobfox/species.toml
+++ /dev/null
@@ -1,66 +0,0 @@
-# Add options in here as needs be
-name = "blobfox"
-
-[vars]
-body_color = "#ff8702"
-ear_color = "#313131"
-ear_fluff_color = "#ebdccc"
-hand_color = "#ff8702"
-hand_stroke_color = "#313131"
-tail_color = "#ff8702"
-
-[variants]
-base = ["body-basic", "eyes-basic", "mouth-w"]
-happy = ["body-basic", "eyes-happy", "mouth-w"]
-evil = ["body-basic", "eyes-evil", "mouth-w"]
-owo = ["body-basic", "ear-owo", "eyes-owo", "mouth-w"]
-aww = ["body-basic", "eyes-aww", "mouth-w"]
-
-"3c" = ["body-basic", "eyes-basic", "mouth-w", "hand-3c", "left-hand"]
-"3c_evil" = ["body-basic", "eyes-evil", "mouth-w", "hand-3c", "left-hand"]
-
-boop = ["body-basic", "boop", "eyes-basic", "mouth-w"]
-boop_aww = ["body-basic", "boop", "eyes-aww", "mouth-w"]
-boop_owo = ["body-basic", "ear-owo", "boop", "eyes-owo", "mouth-w"]
-
-reach = ["body-basic", "eyes-basic", "mouth-w", "hands-reach", "left-hand", "right-hand"]
-reach_aww = ["body-basic", "eyes-aww", "mouth-w", "hands-reach", "left-hand", "right-hand"]
-reach_owo = ["body-basic", "ear-owo", "eyes-owo", "mouth-w", "hands-reach", "left-hand", "right-hand"]
-
-snug = ["body-snug", "eyes-happy", "tail"]
-snug_aww = ["body-snug", "eyes-aww", "tail"]
-snug_owo = ["body-snug", "ear-owo", "eyes-owo", "tail"]
-snug_boop_owo = ["body-snug", "ear-owo", "eyes-owo", "tail", "boop"]
-snug_sleep = ["body-snug", "eyes-happy", "tail", "zzz"]
-
-comfy = ["body-comfy", "eyes-basic", "mouth-w"]
-comfy_blush = ["body-comfy", "eyes-closed", "blush", "mouth-hmpf"]
-comfy_evil = ["body-comfy", "eyes-evil", "mouth-w"]
-comfy_happy = ["body-comfy", "eyes-happy", "mouth-w"]
-comfy_aww = ["body-comfy", "eyes-aww", "mouth-w"]
-comfy_boop = ["body-comfy", "boop", "eyes-basic", "mouth-w"]
-
-stabby = ["body-basic", "holding", "eyes-evil", "mouth-w", "hand-3c", "left-hand"]
-gordon = ["body-basic", "holding", "eyes-basic", "mouth-w", "hand-3c", "left-hand"]
-
-coffee = ["body-basic", "holding", "eyes-basic", "mouth-w", "hand-cup", "right-hand"]
-coffee_happy = ["body-basic", "holding", "eyes-happy", "mouth-w", "hand-cup", "right-hand"]
-
-blush = ["body-basic", "ear-blush", "eyes-closed", "blush", "mouth-hmpf"]
-
-heart = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-egg = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding"]
-
-# Flags
-heart_progress = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-heart_enby = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-heart_ace = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-heart_demisexual = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-heart_pan = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-heart_trans = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-heart_agender = ["body-basic", "eyes-basic", "left-hand", "right-hand", "holding", "big-object"]
-
-# Snuggle
-snuggle_left = ["body-basic", "eyes-closed", "mouth-w"]
-snuggle_right = ["body-snuggle", "eyes-snuggle", "mouth-w"]
-snuggle_right_blush = ["body-snuggle", "eyes-snuggle", "mouth-w", "blush"]
diff --git a/species/blobfox/templates/blush.mustache b/species/blobfox/templates/blush.mustache
deleted file mode 100644
index 33212d1..0000000
--- a/species/blobfox/templates/blush.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{! Pull the defs from the svg for the gradients }}
-{{#blush}}#blush-defs{{/blush}}
-
-{{#blush}}#right-blush{{/blush}}
-{{#blush}}#right-blush-line{{/blush}}
-{{#blush}}#right-blush-line-2{{/blush}}
-
-{{#blush}}#left-blush{{/blush}}
-{{#blush}}#left-blush-line{{/blush}}
-{{#blush}}#left-blush-line-2{{/blush}}
diff --git a/species/blobfox/templates/body-basic.mustache b/species/blobfox/templates/body-basic.mustache
deleted file mode 100644
index 56ea475..0000000
--- a/species/blobfox/templates/body-basic.mustache
+++ /dev/null
@@ -1,21 +0,0 @@
-{{! Left ear }}
-{{#tags.ear-owo}}
- {{#set-fill}} {{vars.ear_fluff_color}} | {{#boop_owo}}#left-ear-fluff{{/boop_owo}} {{/set-fill}}
- {{#set-fill}} {{vars.ear_color}} | {{#boop_owo}}#left-ear{{/boop_owo}} {{/set-fill}}
-{{/tags.ear-owo}}
-{{^tags.ear-owo}}
- {{#set-fill}} {{vars.ear_color}} | {{#base}}#left-ear{{/base}} {{/set-fill}}
-{{/tags.ear-owo}}
-
-{{! Body }}
-
-
- {{#base}}#body{{/base}}
-
-
-{{#set-fill}} {{vars.body_color}} | {{#base}}#body{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.body_color}} | {{#base}}#hair{{/base}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#base}}#right-ear{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#base}}#right-ear-fluff{{/base}} {{/set-fill}}
diff --git a/species/blobfox/templates/body-comfy.mustache b/species/blobfox/templates/body-comfy.mustache
deleted file mode 100644
index 1afe1dc..0000000
--- a/species/blobfox/templates/body-comfy.mustache
+++ /dev/null
@@ -1,18 +0,0 @@
-{{! Left ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#comfy}}#left-ear{{/comfy}} {{/set-fill}}
-
-{{! Body }}
-
-
- {{#comfy}}#body{{/comfy}}
-
-
-{{#set-fill}} {{vars.body_color}} | {{#comfy}}#body{{/comfy}} {{/set-fill}}
-
-{{! Blanket }}
-{{#comfy}}#blanket-line{{/comfy}}
-{{#comfy}}#blanket{{/comfy}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#comfy}}#right-ear{{/comfy}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#comfy}}#right-ear-fluff{{/comfy}} {{/set-fill}}
diff --git a/species/blobfox/templates/body-snug.mustache b/species/blobfox/templates/body-snug.mustache
deleted file mode 100644
index 9639284..0000000
--- a/species/blobfox/templates/body-snug.mustache
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
- {{#snug}}#body{{/snug}}
-
-
-
- {{! TODO: owo ear }}
- {{#set-fill}} {{vars.ear_color}} | {{#snug}}#left-ear{{/snug}} {{/set-fill}}
-
- {{#set-fill}} {{vars.body_color}} | {{#snug}}#body{{/snug}} {{/set-fill}}
- {{#set-fill}} {{vars.body_color}} | {{#snug}}#hair{{/snug}} {{/set-fill}}
-
- {{#set-fill}} {{vars.ear_color}} | {{#snug}}#right-ear{{/snug}} {{/set-fill}}
- {{#set-fill}} {{vars.ear_fluff_color}} | {{#snug}}#right-ear-fluff{{/snug}} {{/set-fill}}
-
- {{#tags.tail}}
- {{>tail}}
- {{/tags.tail}}
-
-
-
diff --git a/species/blobfox/templates/body-snuggle.mustache b/species/blobfox/templates/body-snuggle.mustache
deleted file mode 100644
index 80811ba..0000000
--- a/species/blobfox/templates/body-snuggle.mustache
+++ /dev/null
@@ -1,15 +0,0 @@
-{{! Left ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#left-ear{{/snuggle_right}} {{/set-fill}}
-
-{{! Body }}
-
-
- {{#snuggle_right}}#body{{/snuggle_right}}
-
-
-{{#set-fill}} {{vars.body_color}} | {{#snuggle_right}}#body{{/snuggle_right}} {{/set-fill}}
-{{#set-fill}} {{vars.body_color}} | {{#snuggle_right}}#hair{{/snuggle_right}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#right-ear{{/snuggle_right}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#snuggle_right}}#right-ear-fluff{{/snuggle_right}} {{/set-fill}}
diff --git a/species/blobfox/templates/body.mustache b/species/blobfox/templates/body.mustache
deleted file mode 100644
index ca18fc8..0000000
--- a/species/blobfox/templates/body.mustache
+++ /dev/null
@@ -1,14 +0,0 @@
-
- {{#tags.body-basic}}
- {{>body-basic}}
- {{/tags.body-basic}}
- {{#tags.body-snug}}
- {{>body-snug}}
- {{/tags.body-snug}}
- {{#tags.body-comfy}}
- {{>body-comfy}}
- {{/tags.body-comfy}}
- {{#tags.body-snuggle}}
- {{>body-snuggle}}
- {{/tags.body-snuggle}}
-
diff --git a/species/blobfox/templates/coffee.mustache b/species/blobfox/templates/coffee.mustache
deleted file mode 100644
index 4e43c60..0000000
--- a/species/blobfox/templates/coffee.mustache
+++ /dev/null
@@ -1,6 +0,0 @@
-
- {{#coffee}}#smoke{{/coffee}}
- {{#coffee}}#cup{{/coffee}}
- {{#coffee}}#cup-handle{{/coffee}}
- {{#coffee}}#liquid{{/coffee}}
-
diff --git a/species/blobfox/templates/crowbar.mustache b/species/blobfox/templates/crowbar.mustache
deleted file mode 100644
index 6e6a7e0..0000000
--- a/species/blobfox/templates/crowbar.mustache
+++ /dev/null
@@ -1,6 +0,0 @@
-
- {{#crowbar}}#crowbar-base{{/crowbar}}
- {{#crowbar}}#crowbar-reflection{{/crowbar}}
- {{#crowbar}}#crowbar-shadow{{/crowbar}}
- {{#crowbar}}#crowbar-shadow-2{{/crowbar}}
-
diff --git a/species/blobfox/templates/eyes.mustache b/species/blobfox/templates/eyes.mustache
deleted file mode 100644
index 214917b..0000000
--- a/species/blobfox/templates/eyes.mustache
+++ /dev/null
@@ -1,30 +0,0 @@
-
- {{#tags.eyes-basic}}
- {{#base}}#left-eye{{/base}}
- {{#base}}#right-eye{{/base}}
- {{/tags.eyes-basic}}
- {{#tags.eyes-owo}}
- {{#boop_owo}}#left-eye{{/boop_owo}}
- {{#boop_owo}}#right-eye{{/boop_owo}}
- {{/tags.eyes-owo}}
- {{#tags.eyes-happy}}
- {{#snug}}#left-eye{{/snug}}
- {{#snug}}#right-eye{{/snug}}
- {{/tags.eyes-happy}}
- {{#tags.eyes-aww}}
- {{#reach_aww}}#left-eye{{/reach_aww}}
- {{#reach_aww}}#right-eye{{/reach_aww}}
- {{/tags.eyes-aww}}
- {{#tags.eyes-evil}}
- {{#3c_evil}}#left-eye{{/3c_evil}}
- {{#3c_evil}}#right-eye{{/3c_evil}}
- {{/tags.eyes-evil}}
- {{#tags.eyes-closed}}
- {{#blush}}#left-eye{{/blush}}
- {{#blush}}#right-eye{{/blush}}
- {{/tags.eyes-closed}}
- {{#tags.eyes-snuggle}}
- {{#snuggle_right}}#left-eye{{/snuggle_right}}
- {{#snuggle_right}}#right-eye{{/snuggle_right}}
- {{/tags.eyes-snuggle}}
-
diff --git a/species/blobfox/templates/footer.mustache b/species/blobfox/templates/footer.mustache
deleted file mode 100644
index c2667cb..0000000
--- a/species/blobfox/templates/footer.mustache
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/species/blobfox/templates/hand-boop.mustache b/species/blobfox/templates/hand-boop.mustache
deleted file mode 100644
index 716d758..0000000
--- a/species/blobfox/templates/hand-boop.mustache
+++ /dev/null
@@ -1 +0,0 @@
-{{#boop_owo}}#hand-boop{{/boop_owo}}
diff --git a/species/blobfox/templates/hands.mustache b/species/blobfox/templates/hands.mustache
deleted file mode 100644
index 46468e8..0000000
--- a/species/blobfox/templates/hands.mustache
+++ /dev/null
@@ -1,62 +0,0 @@
-
- {{#tags.hands-reach}}
- {{#set-stroke}}
- {{vars.hand_stroke_color}} |
- {{#set-fill}}
- {{vars.hand_color}}
- | {{#reach_aww}}#left-hand{{/reach_aww}}
- {{/set-fill}}
- {{/set-stroke}}
- {{#set-stroke}}
- {{vars.hand_stroke_color}} |
- {{#set-fill}}
- {{vars.hand_color}}
- | {{#reach_aww}}#right-hand{{/reach_aww}}
- {{/set-fill}}
- {{/set-stroke}}
- {{/tags.hands-reach}}
-
- {{#tags.hand-3c}}
- {{#tags.holding}}
- {{#set-stroke}}
- {{vars.hand_stroke_color}} |
- {{#set-fill}} {{vars.hand_color}} | {{#knife}}#left-hand{{/knife}} {{/set-fill}}
- {{/set-stroke}}
- {{/tags.holding}}
- {{^tags.holding}}
- {{! :3c hand }}
-
- {{#set-stroke}}
- {{vars.hand_stroke_color}} |
- {{#set-fill}} {{vars.hand_color}} | {{#3c_evil}}#left-hand{{/3c_evil}} {{/set-fill}}
- {{/set-stroke}}
- {{/tags.holding}}
- {{/tags.hand-3c}}
- {{^tags.hand-3c}}
- {{#tags.holding}}
- {{#tags.left-hand}}
- {{#set-stroke}}
- {{vars.hand_stroke_color}} |
- {{#set-fill}} {{vars.hand_color}} | {{#heart}}#left-hand{{/heart}} {{/set-fill}}
- {{/set-stroke}}
- {{/tags.left-hand}}
-
- {{#tags.right-hand}}
- {{#tags.hand-cup}}
- {{#set-stroke}}
- {{vars.hand_stroke_color}} |
- {{#set-fill}} {{vars.hand_color}} | {{#coffee}}#right-hand{{/coffee}} {{/set-fill}}
- {{/set-stroke}}
- {{/tags.hand-cup}}
- {{^tags.hand-cup}}
- {{#set-stroke}}
- {{vars.hand_stroke_color}} |
- {{#set-fill}} {{vars.hand_color}} | {{#heart}}#right-hand{{/heart}} {{/set-fill}}
- {{/set-stroke}}
- {{/tags.hand-cup}}
- {{/tags.right-hand}}
- {{/tags.holding}}
- {{/tags.hand-3c}}
-
-
-
diff --git a/species/blobfox/templates/header.mustache b/species/blobfox/templates/header.mustache
deleted file mode 100644
index 4ce388b..0000000
--- a/species/blobfox/templates/header.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-
- {{variant_name}}
-
diff --git a/species/blobfox/templates/knife.mustache b/species/blobfox/templates/knife.mustache
deleted file mode 100644
index 6f1dbe3..0000000
--- a/species/blobfox/templates/knife.mustache
+++ /dev/null
@@ -1,6 +0,0 @@
-
- {{#knife}}#blade-back{{/knife}}
- {{#knife}}#blade-front{{/knife}}
- {{#knife}}#handle{{/knife}}
- {{#knife}}#handle-screw{{/knife}}
-
diff --git a/species/blobfox/templates/mouth.mustache b/species/blobfox/templates/mouth.mustache
deleted file mode 100644
index a1674b5..0000000
--- a/species/blobfox/templates/mouth.mustache
+++ /dev/null
@@ -1,6 +0,0 @@
-{{#tags.mouth-w}}
- {{#base}}#mouth{{/base}}
-{{/tags.mouth-w}}
-{{#tags.mouth-hmpf}}
- {{#blush}}#mouth{{/blush}}
-{{/tags.mouth-hmpf}}
diff --git a/species/blobfox/templates/nose.mustache b/species/blobfox/templates/nose.mustache
deleted file mode 100644
index 2377355..0000000
--- a/species/blobfox/templates/nose.mustache
+++ /dev/null
@@ -1,25 +0,0 @@
-
- {{#tags.eyes-basic}}
- {{#base}}#nose-outline{{/base}}
- {{/tags.eyes-basic}}
- {{#tags.eyes-owo}}
- {{#boop_owo}}#nose-outline{{/boop_owo}}
- {{/tags.eyes-owo}}
- {{#tags.eyes-aww}}
- {{#reach_aww}}#nose-outline{{/reach_aww}}
- {{/tags.eyes-aww}}
- {{#tags.eyes-happy}}
- {{#snug}}#nose-outline{{/snug}}
- {{/tags.eyes-happy}}
- {{#tags.eyes-evil}}
- {{#3c_evil}}#nose-outline{{/3c_evil}}
- {{/tags.eyes-evil}}
- {{#tags.eyes-closed}}
- {{#blush}}#nose-outline{{/blush}}
- {{/tags.eyes-closed}}
- {{#tags.eyes-snuggle}}
- {{#snuggle_right}}#nose-outline{{/snuggle_right}}
- {{/tags.eyes-snuggle}}
-
- {{#base}}#nose{{/base}}
-
diff --git a/species/blobfox/templates/tail.mustache b/species/blobfox/templates/tail.mustache
deleted file mode 100644
index 5d21db4..0000000
--- a/species/blobfox/templates/tail.mustache
+++ /dev/null
@@ -1,3 +0,0 @@
-
- {{#set-fill}} {{vars.tail_color}} | {{#snug}}#tail{{/snug}} {{/set-fill}}
-
diff --git a/species/blobfox/templates/zzz.mustache b/species/blobfox/templates/zzz.mustache
deleted file mode 100644
index 5929654..0000000
--- a/species/blobfox/templates/zzz.mustache
+++ /dev/null
@@ -1,5 +0,0 @@
-
- {{#snug_sleep}}#zzz-1{{/snug_sleep}}
- {{#snug_sleep}}#zzz-2{{/snug_sleep}}
- {{#snug_sleep}}#zzz-3{{/snug_sleep}}
-
diff --git a/species/blobfox/variants/3c.mustache b/species/blobfox/variants/3c.mustache
deleted file mode 100644
index 4665694..0000000
--- a/species/blobfox/variants/3c.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/3c_evil.mustache b/species/blobfox/variants/3c_evil.mustache
deleted file mode 100644
index 4665694..0000000
--- a/species/blobfox/variants/3c_evil.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/aww.mustache b/species/blobfox/variants/aww.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/aww.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/base.mustache b/species/blobfox/variants/base.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/base.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/blush.mustache b/species/blobfox/variants/blush.mustache
deleted file mode 100644
index 4f0c58b..0000000
--- a/species/blobfox/variants/blush.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>blush}}
-{{>footer}}
diff --git a/species/blobfox/variants/boop.mustache b/species/blobfox/variants/boop.mustache
deleted file mode 100644
index 153c9c3..0000000
--- a/species/blobfox/variants/boop.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hand-boop}}
-{{>footer}}
diff --git a/species/blobfox/variants/boop_aww.mustache b/species/blobfox/variants/boop_aww.mustache
deleted file mode 100644
index 153c9c3..0000000
--- a/species/blobfox/variants/boop_aww.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hand-boop}}
-{{>footer}}
diff --git a/species/blobfox/variants/boop_owo.mustache b/species/blobfox/variants/boop_owo.mustache
deleted file mode 100644
index 153c9c3..0000000
--- a/species/blobfox/variants/boop_owo.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hand-boop}}
-{{>footer}}
diff --git a/species/blobfox/variants/coffee.mustache b/species/blobfox/variants/coffee.mustache
deleted file mode 100644
index 51723aa..0000000
--- a/species/blobfox/variants/coffee.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>coffee}}
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/coffee_happy.mustache b/species/blobfox/variants/coffee_happy.mustache
deleted file mode 100644
index 51723aa..0000000
--- a/species/blobfox/variants/coffee_happy.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>coffee}}
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/comfy.mustache b/species/blobfox/variants/comfy.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/comfy.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/comfy_aww.mustache b/species/blobfox/variants/comfy_aww.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/comfy_aww.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/comfy_blush.mustache b/species/blobfox/variants/comfy_blush.mustache
deleted file mode 100644
index 4f0c58b..0000000
--- a/species/blobfox/variants/comfy_blush.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>blush}}
-{{>footer}}
diff --git a/species/blobfox/variants/comfy_boop.mustache b/species/blobfox/variants/comfy_boop.mustache
deleted file mode 100644
index 153c9c3..0000000
--- a/species/blobfox/variants/comfy_boop.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hand-boop}}
-{{>footer}}
diff --git a/species/blobfox/variants/comfy_evil.mustache b/species/blobfox/variants/comfy_evil.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/comfy_evil.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/comfy_happy.mustache b/species/blobfox/variants/comfy_happy.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/comfy_happy.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/egg.mustache b/species/blobfox/variants/egg.mustache
deleted file mode 100644
index d0487e7..0000000
--- a/species/blobfox/variants/egg.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
- {{#egg}}#egg{{/egg}}
- {{#egg}}#egg-reflection{{/egg}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/evil.mustache b/species/blobfox/variants/evil.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/evil.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/gordon.mustache b/species/blobfox/variants/gordon.mustache
deleted file mode 100644
index cedc49c..0000000
--- a/species/blobfox/variants/gordon.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>crowbar}}
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/happy.mustache b/species/blobfox/variants/happy.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/happy.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart.mustache b/species/blobfox/variants/heart.mustache
deleted file mode 100644
index c32d417..0000000
--- a/species/blobfox/variants/heart.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
- {{#heart}}#heart{{/heart}}
- {{#heart}}#heart-reflection{{/heart}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart_ace.mustache b/species/blobfox/variants/heart_ace.mustache
deleted file mode 100644
index abf3d49..0000000
--- a/species/blobfox/variants/heart_ace.mustache
+++ /dev/null
@@ -1,25 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#flag_ace}}{{/flag_ace}}
-
-
-
- {{#set-fill}} rgba(255,255,255,0.5) | {{#heart}}#heart-reflection{{/heart}} {{/set-fill}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart_agender.mustache b/species/blobfox/variants/heart_agender.mustache
deleted file mode 100644
index a6f52b1..0000000
--- a/species/blobfox/variants/heart_agender.mustache
+++ /dev/null
@@ -1,25 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#flag_agender}}{{/flag_agender}}
-
-
-
- {{#set-fill}} rgba(255,255,255,0.5) | {{#heart}}#heart-reflection{{/heart}} {{/set-fill}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart_demisexual.mustache b/species/blobfox/variants/heart_demisexual.mustache
deleted file mode 100644
index fff4d22..0000000
--- a/species/blobfox/variants/heart_demisexual.mustache
+++ /dev/null
@@ -1,25 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#flag_demisexual}}{{/flag_demisexual}}
-
-
-
- {{#set-fill}} rgba(255,255,255,0.5) | {{#heart}}#heart-reflection{{/heart}} {{/set-fill}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart_enby.mustache b/species/blobfox/variants/heart_enby.mustache
deleted file mode 100644
index 05c2eb4..0000000
--- a/species/blobfox/variants/heart_enby.mustache
+++ /dev/null
@@ -1,25 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#flag_enby}}{{/flag_enby}}
-
-
-
- {{#set-fill}} rgba(255,255,255,0.5) | {{#heart}}#heart-reflection{{/heart}} {{/set-fill}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart_pan.mustache b/species/blobfox/variants/heart_pan.mustache
deleted file mode 100644
index db05a5e..0000000
--- a/species/blobfox/variants/heart_pan.mustache
+++ /dev/null
@@ -1,25 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#flag_pan}}{{/flag_pan}}
-
-
-
- {{#set-fill}} rgba(255,255,255,0.5) | {{#heart}}#heart-reflection{{/heart}} {{/set-fill}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart_progress.mustache b/species/blobfox/variants/heart_progress.mustache
deleted file mode 100644
index ad45bdc..0000000
--- a/species/blobfox/variants/heart_progress.mustache
+++ /dev/null
@@ -1,26 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
- {{! NOTE: The progress flag has a different aspect ratio compared to the other flags }}
-
-
- {{#flag_progress}}{{/flag_progress}}
-
-
-
- {{#set-fill}} rgba(255,255,255,0.5) | {{#heart}}#heart-reflection{{/heart}} {{/set-fill}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/heart_trans.mustache b/species/blobfox/variants/heart_trans.mustache
deleted file mode 100644
index b84abe7..0000000
--- a/species/blobfox/variants/heart_trans.mustache
+++ /dev/null
@@ -1,25 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#heart}}#heart{{/heart}}
-
-
-
-
- {{#flag_trans}}{{/flag_trans}}
-
-
-
- {{#set-fill}} rgba(255,255,255,0.5) | {{#heart}}#heart-reflection{{/heart}} {{/set-fill}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/owo.mustache b/species/blobfox/variants/owo.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/owo.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/reach.mustache b/species/blobfox/variants/reach.mustache
deleted file mode 100644
index 4665694..0000000
--- a/species/blobfox/variants/reach.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/reach_aww.mustache b/species/blobfox/variants/reach_aww.mustache
deleted file mode 100644
index 4665694..0000000
--- a/species/blobfox/variants/reach_aww.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/reach_owo.mustache b/species/blobfox/variants/reach_owo.mustache
deleted file mode 100644
index 4665694..0000000
--- a/species/blobfox/variants/reach_owo.mustache
+++ /dev/null
@@ -1,9 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>hands}}
-{{>footer}}
diff --git a/species/blobfox/variants/snug.mustache b/species/blobfox/variants/snug.mustache
deleted file mode 100644
index b6d9c9e..0000000
--- a/species/blobfox/variants/snug.mustache
+++ /dev/null
@@ -1,6 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
-{{>footer}}
diff --git a/species/blobfox/variants/snug_aww.mustache b/species/blobfox/variants/snug_aww.mustache
deleted file mode 100644
index b6d9c9e..0000000
--- a/species/blobfox/variants/snug_aww.mustache
+++ /dev/null
@@ -1,6 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
-{{>footer}}
diff --git a/species/blobfox/variants/snug_boop_owo.mustache b/species/blobfox/variants/snug_boop_owo.mustache
deleted file mode 100644
index 7b06cd4..0000000
--- a/species/blobfox/variants/snug_boop_owo.mustache
+++ /dev/null
@@ -1,8 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
-
- {{>hand-boop}}
-{{>footer}}
diff --git a/species/blobfox/variants/snug_owo.mustache b/species/blobfox/variants/snug_owo.mustache
deleted file mode 100644
index b6d9c9e..0000000
--- a/species/blobfox/variants/snug_owo.mustache
+++ /dev/null
@@ -1,6 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
-{{>footer}}
diff --git a/species/blobfox/variants/snug_sleep.mustache b/species/blobfox/variants/snug_sleep.mustache
deleted file mode 100644
index 0493c4e..0000000
--- a/species/blobfox/variants/snug_sleep.mustache
+++ /dev/null
@@ -1,8 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
-
- {{>zzz}}
-{{>footer}}
diff --git a/species/blobfox/variants/snuggle_left.mustache b/species/blobfox/variants/snuggle_left.mustache
deleted file mode 100644
index be8b98b..0000000
--- a/species/blobfox/variants/snuggle_left.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-{{>footer}}
diff --git a/species/blobfox/variants/snuggle_right.mustache b/species/blobfox/variants/snuggle_right.mustache
deleted file mode 100644
index 18d23bb..0000000
--- a/species/blobfox/variants/snuggle_right.mustache
+++ /dev/null
@@ -1,11 +0,0 @@
-{{>header}}
- {{>body}}
-
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
-
- {{#snuggle_right}}#heart{{/snuggle_right}}
-{{>footer}}
diff --git a/species/blobfox/variants/snuggle_right_blush.mustache b/species/blobfox/variants/snuggle_right_blush.mustache
deleted file mode 100644
index 3b401c5..0000000
--- a/species/blobfox/variants/snuggle_right_blush.mustache
+++ /dev/null
@@ -1,12 +0,0 @@
-{{>header}}
- {{>body}}
-
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
- {{>blush}}
-
-
- {{#snuggle_right}}#heart{{/snuggle_right}}
-{{>footer}}
diff --git a/species/blobfox/variants/stabby.mustache b/species/blobfox/variants/stabby.mustache
deleted file mode 100644
index 699f4ec..0000000
--- a/species/blobfox/variants/stabby.mustache
+++ /dev/null
@@ -1,10 +0,0 @@
-{{>header}}
- {{>body}}
-
- {{>eyes}}
- {{>nose}}
- {{>mouth}}
-
- {{>knife}}
- {{>hands}}
-{{>footer}}
diff --git a/species/blobhusky/assets/base.svg b/species/blobhusky/assets/base.svg
deleted file mode 100644
index 0fdcc85..0000000
--- a/species/blobhusky/assets/base.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
- blobhusky
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobhusky
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobhusky/assets/snuggle_right.svg b/species/blobhusky/assets/snuggle_right.svg
deleted file mode 100644
index 7fddd34..0000000
--- a/species/blobhusky/assets/snuggle_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
- blobhusky_snuggle_right
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobhusky_snuggle_right
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/species/blobhusky/species.toml b/species/blobhusky/species.toml
deleted file mode 100644
index ff110d0..0000000
--- a/species/blobhusky/species.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-name = "blobhusky"
-base = "../blobfox/"
-
-[vars]
-body_color = "#6b6b6f"
-ear_color = "#313131"
-ear_fluff_color = "#e1e1e3"
-hand_color = "#e1e1e3"
-tail_color = "#e1e1e3"
-marks_color = "#e1e1e3"
diff --git a/species/blobhusky/templates/body-basic.mustache b/species/blobhusky/templates/body-basic.mustache
deleted file mode 100644
index f439e81..0000000
--- a/species/blobhusky/templates/body-basic.mustache
+++ /dev/null
@@ -1,5 +0,0 @@
-{{>blobfox.body-basic}}
-
-
- {{#set-fill}} {{vars.marks_color}} | {{#base}}#marks{{/base}} {{/set-fill}}
-
diff --git a/species/blobhusky/templates/body-comfy.mustache b/species/blobhusky/templates/body-comfy.mustache
deleted file mode 100644
index 8ed1112..0000000
--- a/species/blobhusky/templates/body-comfy.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-{{>blobfox.body-comfy}}
-
-
-
- {{#set-fill}} {{vars.marks_color}} | {{#base}}#marks{{/base}} {{/set-fill}}
-
-
diff --git a/species/blobhusky/templates/body-snug.mustache b/species/blobhusky/templates/body-snug.mustache
deleted file mode 100644
index 285cfad..0000000
--- a/species/blobhusky/templates/body-snug.mustache
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
- {{#snug}}#body{{/snug}}
-
-
-
- {{! TODO: owo ear }}
- {{#set-fill}} {{vars.ear_color}} | {{#snug}}#left-ear{{/snug}} {{/set-fill}}
-
- {{#set-fill}} {{vars.body_color}} | {{#snug}}#body{{/snug}} {{/set-fill}}
- {{#set-fill}} {{vars.body_color}} | {{#snug}}#hair{{/snug}} {{/set-fill}}
-
- {{#set-fill}} {{vars.ear_color}} | {{#snug}}#right-ear{{/snug}} {{/set-fill}}
- {{#set-fill}} {{vars.ear_fluff_color}} | {{#snug}}#right-ear-fluff{{/snug}} {{/set-fill}}
-
-
-
- {{#set-fill}} {{vars.marks_color}} | {{#base}}#marks{{/base}} {{/set-fill}}
-
-
-
- {{#tags.tail}}
-
- {{#set-fill}} {{vars.tail_color}} | {{#snug}}#tail{{/snug}} {{/set-fill}}
-
- {{/tags.tail}}
-
diff --git a/species/blobhusky/templates/body-snuggle.mustache b/species/blobhusky/templates/body-snuggle.mustache
deleted file mode 100644
index d10b1fa..0000000
--- a/species/blobhusky/templates/body-snuggle.mustache
+++ /dev/null
@@ -1,5 +0,0 @@
-{{>blobfox.body-snuggle}}
-
-
- {{#set-fill}} {{vars.marks_color}} | {{#snuggle_right}}#marks{{/snuggle_right}} {{/set-fill}}
-
diff --git a/species/blobstella/assets/base.svg b/species/blobstella/assets/base.svg
deleted file mode 100644
index 1c7fcd2..0000000
--- a/species/blobstella/assets/base.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
- blobcat
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobcat
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
-
-
diff --git a/species/blobstella/assets/flag_pan.svg b/species/blobstella/assets/flag_pan.svg
deleted file mode 100644
index ea27db9..0000000
--- a/species/blobstella/assets/flag_pan.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/species/blobstella/species.toml b/species/blobstella/species.toml
deleted file mode 100644
index 9a4ba0f..0000000
--- a/species/blobstella/species.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-name = "blobstella"
-base = "../blobcat/"
-
-[vars]
-body_color = "#54b6e7"
-ear_color = "#3398c7"
-ear_fluff_color = "#224f66"
-hand_color = "#54b6e7"
-tail_color = "#54b6e7"
-marks_color = "#eee64e"
diff --git a/species/blobstella/templates/body-basic.mustache b/species/blobstella/templates/body-basic.mustache
deleted file mode 100644
index 128eee0..0000000
--- a/species/blobstella/templates/body-basic.mustache
+++ /dev/null
@@ -1,32 +0,0 @@
-{{! Left ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#base}}#left-ear{{/base}} {{/set-fill}}
-
-{{! Body }}
-
-
- {{#base}}#body{{/base}}
-
-
-{{#set-fill}} {{vars.body_color}} | {{#base}}#body{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.body_color}} | {{#base}}#hair{{/base}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#base}}#right-ear{{/base}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#base}}#right-ear-fluff{{/base}} {{/set-fill}}
-
-{{! Marks }}
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#left-marks{{/base}}
- {{/set-fill}}
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#right-marks{{/base}}
- {{/set-fill}}
-
-
-{{! Whiskers }}
-{{^tags.hands-reach}}
- {{>whiskers}}
-{{/tags.hands-reach}}
diff --git a/species/blobstella/templates/body-comfy.mustache b/species/blobstella/templates/body-comfy.mustache
deleted file mode 100644
index cf590a0..0000000
--- a/species/blobstella/templates/body-comfy.mustache
+++ /dev/null
@@ -1,18 +0,0 @@
-{{>blobfox.body-comfy}}
-
-
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#left-marks{{/base}}
- {{/set-fill}}
-
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#right-marks{{/base}}
- {{/set-fill}}
-
-
-
-{{>whiskers}}
diff --git a/species/blobstella/templates/body-snug.mustache b/species/blobstella/templates/body-snug.mustache
deleted file mode 100644
index bb260f0..0000000
--- a/species/blobstella/templates/body-snug.mustache
+++ /dev/null
@@ -1,14 +0,0 @@
-{{>blobcat.body-snug}}
-
-
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#left-marks{{/base}}
- {{/set-fill}}
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#right-marks{{/base}}
- {{/set-fill}}
-
-
diff --git a/species/blobstella/templates/body-snuggle.mustache b/species/blobstella/templates/body-snuggle.mustache
deleted file mode 100644
index 9353992..0000000
--- a/species/blobstella/templates/body-snuggle.mustache
+++ /dev/null
@@ -1,33 +0,0 @@
-{{! Left ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#left-ear{{/snuggle_right}} {{/set-fill}}
-
-{{! Body }}
-
-
- {{#snuggle_right}}#body{{/snuggle_right}}
-
-
-{{#set-fill}} {{vars.body_color}} | {{#snuggle_right}}#body{{/snuggle_right}} {{/set-fill}}
-
-{{! Right ear }}
-{{#set-fill}} {{vars.ear_color}} | {{#snuggle_right}}#right-ear{{/snuggle_right}} {{/set-fill}}
-{{#set-fill}} {{vars.ear_fluff_color}} | {{#snuggle_right}}#right-ear-fluff{{/snuggle_right}} {{/set-fill}}
-
-
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#left-marks{{/base}}
- {{/set-fill}}
-
-
- {{#set-fill}}
- {{vars.marks_color}}
- | {{#base}}#right-marks{{/base}}
- {{/set-fill}}
-
-
-
-
- {{>whiskers}}
-
diff --git a/src/bin/clean.rs b/src/bin/clean.rs
deleted file mode 100644
index f66d7f5..0000000
--- a/src/bin/clean.rs
+++ /dev/null
@@ -1,70 +0,0 @@
-use xmltree::{XMLNode, Element};
-use clap::Parser;
-use std::collections::HashMap;
-use std::path::PathBuf;
-
-/// Replaces meaningless `id`s given by inkscape with the `inkscape:label` of the elements
-fn main() {
- let args = Args::parse();
-
- for path in args.files {
- let file = std::fs::File::open(path.clone()).unwrap_or_else(|err| {
- panic!("Error while reading {}: {}", path.display(), err);
- });
- let mut element = Element::parse(file).expect("Couldn't parse SVG!");
-
- clean(&mut element);
-
- let mut s: Vec = Vec::new();
- element.write(&mut s).expect("Couldn't export SVG!");
-
- std::fs::write(path.clone(), s).unwrap_or_else(|err| {
- panic!("Error while writing {}: {}", path.display(), err);
- });
- }
-}
-
-fn clean(element: &mut Element) {
- let mut counts: HashMap = HashMap::new();
-
- fn count_rec(element: &Element, counts: &mut HashMap) {
- if let Some(label) = element.attributes.get("label") {
- if let Some(count) = counts.get_mut(label) {
- *count += 1;
- } else {
- counts.insert(label.to_string(), 1);
- }
- }
-
- for child in element.children.iter() {
- if let XMLNode::Element(ref child) = child {
- count_rec(child, counts);
- }
- }
- }
-
- count_rec(element, &mut counts);
-
- fn update_rec(element: &mut Element, counts: &HashMap) {
- if let Some(label) = element.attributes.get("label") {
- if let Some(1) = counts.get(label) {
- element.attributes.insert("id".to_string(), label.to_string());
- }
- }
-
- for child in element.children.iter_mut() {
- if let XMLNode::Element(ref mut child) = child {
- update_rec(child, counts);
- }
- }
- }
-
- update_rec(element, &counts);
-}
-
-#[derive(Parser)]
-#[clap(author, version, about, long_about = None)]
-struct Args {
- #[clap(value_parser)]
- files: Vec,
-}
diff --git a/src/bin/rescale.rs b/src/bin/rescale.rs
deleted file mode 100644
index d99b988..0000000
--- a/src/bin/rescale.rs
+++ /dev/null
@@ -1,310 +0,0 @@
-use clap::Parser;
-use std::fmt::Write;
-use std::path::PathBuf;
-use xmltree::{Element, XMLNode};
-
-/// Scales everything (as best as it can) to a different user unit, without breaking the semantics
-fn main() {
- let args = Args::parse();
-
- if args.input == args.output {
- println!("Warning: you should **not** set `output` to the same file as `input`, as this program may very well break your svg!");
- }
-
- let file = std::fs::File::open(&args.input).unwrap_or_else(|err| {
- panic!("Error while reading {}: {}", args.input.display(), err);
- });
- let mut element = Element::parse(file).expect("Couldn't parse SVG!");
-
- let view_box = get_viewbox(&element);
-
- let scale = if let Some(width) = args.width {
- width / view_box.2
- } else if let Some(height) = args.height {
- height / view_box.3
- } else {
- panic!("Expected either width or height as arguments");
- };
-
- rescale(&mut element, scale);
-
- *element.attributes.get_mut("viewBox").unwrap() = format!(
- "{} {} {} {}",
- view_box.0 * scale,
- view_box.1 * scale,
- view_box.2 * scale,
- view_box.3 * scale,
- );
-
- let mut s: Vec = Vec::new();
- element.write(&mut s).expect("Couldn't export SVG!");
- std::fs::write(&args.output, s).unwrap_or_else(|err| {
- panic!("Error while writing {}: {}", args.output.display(), err);
- });
-}
-
-fn get_viewbox(element: &Element) -> (f64, f64, f64, f64) {
- let view_box = element
- .attributes
- .get("viewBox")
- .expect("missing viewBox attribute on svg");
- let view_box: Vec = view_box
- .split(" ")
- .filter(|s| !s.is_empty())
- .map(|s| s.parse().unwrap())
- .collect();
-
- if view_box.len() != 4 {
- panic!(
- "Parse error: expected viewBox to be four space-separated numbers, got {} numbers",
- view_box.len()
- );
- }
-
- (view_box[0], view_box[1], view_box[2], view_box[3])
-}
-
-fn rescale(element: &mut Element, scale: f64) {
- if element.name == "path" {
- if let Some(path) = element.attributes.get_mut("d") {
- let mut new_path = String::new();
- for instruction in path.split_whitespace() {
- if let [Ok(left), Ok(right)] = instruction
- .split(',')
- .map(|s| s.parse::())
- .collect::>()[..]
- {
- write!(&mut new_path, "{},{} ", left * scale, right * scale).unwrap();
- } else if let Ok(number) = instruction.parse::() {
- write!(&mut new_path, "{} ", number * scale).unwrap();
- } else {
- write!(&mut new_path, "{} ", instruction).unwrap();
- }
- }
- *path = new_path;
- }
- } else if element.name == "image" {
- if let Some(width) = element.attributes.get_mut("width") {
- if let Ok(parsed) = width.parse::() {
- *width = (parsed * scale).to_string();
- }
- }
- if let Some(height) = element.attributes.get_mut("height") {
- if let Ok(parsed) = height.parse::() {
- *height = (parsed * scale).to_string();
- }
- }
- } else if element.name == "namedview" {
- if let Some(units) = element.attributes.get_mut("document-units") {
- *units = "px".to_string();
- }
- } else if
- element.name == "ellipse"
- || element.name == "radialGradient"
- || element.name == "linearGradient"
- || element.name == "rect"
- {
- const PROPS: [&'static str; 15] = [
- "cx",
- "cy",
- "rx",
- "ry",
- "fx",
- "fy",
- "r",
- "x1",
- "x2",
- "y1",
- "y2",
- "x",
- "y",
- "width",
- "height",
- ];
-
- for prop in PROPS {
- if let Some(attr) = element.attributes.get_mut(prop) {
- if let Ok(parsed) = attr.parse::() {
- *attr = (parsed * scale).to_string();
- }
- }
- }
- } else if element.name == "polygon" {
- if let Some(points) = element.attributes.get_mut("points") {
- let new_points = points.split_whitespace().map(|pair| {
- let parsed = pair.split(',').map(|x| x.parse::()).collect::>();
- if let [Ok(x), Ok(y)] = parsed[..] {
- format!("{},{}", x * scale, y * scale)
- } else if let [Ok(z)] = parsed[..] {
- format!("{}", z * scale)
- } else {
- pair.to_string()
- }
- }).collect::>().join(" ");
-
- *points = new_points;
- }
- }
-
- if let Some(style) = element.attributes.get_mut("style") {
- let mut new_style = String::new();
- for instruction in style.split(';') {
- match instruction.split(':').map(|x| x.trim()).collect::>()[..] {
- ["stroke-width", width] => {
- let (width, unit): (String, String) =
- width.chars().partition(|x| !x.is_ascii_alphabetic());
- let width = width.parse::().unwrap();
-
- write!(&mut new_style, "stroke-width: {}{};", width * scale, unit).unwrap();
- }
- ref any => write!(&mut new_style, "{};", any.join(":")).unwrap(),
- }
- }
- *style = new_style;
- }
-
- // TODO: replace with Option::or if and when Polonius
- // or another successor to the current borrow-checker gets merged
- let mut transform = element.attributes.get_mut("transform");
- if transform.is_none() {
- transform = element.attributes.get_mut("gradientTransform");
- }
-
- if let Some(transform) = transform {
- let mut new_transform = String::new();
-
- for (instruction, args) in parse_transform(transform) {
- match instruction.trim() {
- "rotate" => {
- let parsed: Vec = args
- .split(|c| matches!(c, ' ' | ','))
- .filter(|s| !s.is_empty())
- .map(|x| x.parse().unwrap())
- .collect();
- if parsed.len() == 3 {
- write!(
- &mut new_transform,
- "rotate({} {} {})",
- parsed[0],
- parsed[1] * scale,
- parsed[2] * scale
- )
- .unwrap();
- } else {
- write!(&mut new_transform, "rotate({})", args).unwrap();
- }
- }
- "translate" => {
- let parsed: Vec = args
- .split(|c| matches!(c, ' ' | ','))
- .filter(|s| !s.is_empty())
- .map(|x| x.parse().unwrap())
- .collect();
- if parsed.len() == 2 {
- write!(
- &mut new_transform,
- "translate({} {})",
- parsed[0] * scale,
- parsed[1] * scale
- )
- .unwrap();
- } else {
- write!(&mut new_transform, "translate({})", args).unwrap();
- }
- }
- "matrix" => {
- let parsed: Vec = args
- .split(|c| matches!(c, ' ' | ','))
- .filter(|s| !s.is_empty())
- .map(|x| x.parse().unwrap())
- .collect();
- if parsed.len() == 6 {
- write!(
- &mut new_transform,
- "matrix({} {} {} {} {} {})",
- parsed[0],
- parsed[1],
- parsed[2],
- parsed[3],
- parsed[4] * scale,
- parsed[5] * scale,
- )
- .unwrap();
- } else {
- write!(&mut new_transform, "matrix({})", args).unwrap();
- }
- }
- _ => {
- write!(&mut new_transform, "{}({})", instruction, args).unwrap();
- }
- }
- new_transform.push(' ');
- }
-
- // TODO: transform-origin
-
- *transform = new_transform;
- }
-
- for child in element.children.iter_mut() {
- if let XMLNode::Element(ref mut child) = child {
- rescale(child, scale);
- }
- }
-}
-
-fn parse_transform(raw: &str) -> Vec<(String, String)> {
- let mut res: Vec<(String, String)> = Vec::new();
- let mut instruction = String::new();
- let mut args = String::new();
- let mut depth = 0;
-
- for c in raw.chars() {
- if c == '(' {
- depth += 1;
- if depth > 1 {
- args.push(c);
- }
- } else if c == ')' {
- depth -= 1;
- assert!(depth >= 0);
- if depth >= 1 {
- args.push(c);
- }
- } else if c == ' ' {
- if depth == 0 {
- let instruction = std::mem::take(&mut instruction);
- let args = std::mem::take(&mut args);
- res.push((instruction, args));
- } else {
- args.push(c);
- }
- } else {
- if depth == 0 {
- instruction.push(c);
- } else {
- args.push(c);
- }
- }
- }
-
- res.push((instruction, args));
-
- res
-}
-
-#[derive(Parser)]
-#[clap(author, version, about, long_about = None)]
-struct Args {
- #[clap(value_parser)]
- input: PathBuf,
-
- #[clap(value_parser)]
- output: PathBuf,
-
- #[clap(short, long, value_parser)]
- width: Option,
-
- #[clap(short, long, value_parser)]
- height: Option,
-}
diff --git a/src/bin/snuggle.rs b/src/bin/snuggle.rs
deleted file mode 100644
index 59d9d43..0000000
--- a/src/bin/snuggle.rs
+++ /dev/null
@@ -1,238 +0,0 @@
-//! Very crude tool for generating snuggle emotes
-use clap::Parser;
-use std::fmt::Write;
-use std::path::PathBuf;
-use std::collections::HashMap;
-use serde::{Serialize, Deserialize};
-use xmltree::{Element, XMLNode};
-use wax::{Glob, Pattern};
-
-use blobfox_template::{
- parse,
- template,
- export,
-};
-
-#[derive(Serialize, Deserialize, Debug)]
-struct Desc {
- /// Name of the snuggle emote (eg. `snuggle`, `nom`)
- name: String,
-
- /// How much to move the "left" emote by, horizontally
- dx: f64,
- /// How much to move the "left" emote by, vertically
- dy: f64,
- /// How much to scale the "left" emote by, unimplemented!
- scale: Option,
-
- /// How much of a margin to add to the "right" emote, in SVG units
- bold: f64,
-
- /// Optional transform to add to the "right" emote cutout
- #[serde(default)]
- transform: String,
-
- /// name/filename list of emotes for the "left" emotes
- left: HashMap,
- /// name/filename list of emotes for the "right" emotes
- right: HashMap,
-}
-
-#[derive(Parser, Clone)]
-#[clap(author, version, about, long_about = None)]
-struct Args {
- /// Path to the description
- #[clap(short, long, value_parser)]
- desc: PathBuf,
-
- /// Disable automatically resizing the SVG's viewBox, defaults to false
- #[clap(short, long, value_parser, default_value = "false")]
- no_resize: bool,
-
- /// Dimension to export the images as; can be specified multiple times
- #[clap(long, value_parser)]
- dim: Vec,
-
- /// Input directory, containing the svgs to combine
- #[clap(short, long, value_parser)]
- input_dir: Option,
-
- /// Output directory
- #[clap(short, long, value_parser)]
- output_dir: Option,
-
- /// A glob to filter which emotes to output; supports wildcards, like `blobfox_snuggle*`
- #[clap(value_parser)]
- glob: Option,
-}
-
-impl From for export::ExportArgs {
- fn from(args: Args) -> export::ExportArgs {
- export::ExportArgs {
- no_resize: args.no_resize,
- dim: args.dim,
- }
- }
-}
-
-fn main() {
- let args = Args::parse();
- let input_dir = args.input_dir.clone().unwrap_or(PathBuf::from("output/vector/"));
- let output_dir = args.output_dir.clone().unwrap_or(PathBuf::from("output/"));
-
- let files = std::fs::read_dir(&input_dir).unwrap_or_else(|err| {
- panic!("Couldn't read directory {}: {}", input_dir.display(), err);
- }).filter_map(|entry| {
- std::fs::read_dir(entry.ok()?.path()).ok()
- }).flatten().filter_map(|entry| {
- let entry = entry.ok()?;
- Some((entry.path().file_stem()?.to_str()?.to_string(), entry.path()))
- }).collect::>();
-
- let desc = std::fs::read_to_string(&args.desc).unwrap_or_else(|err| {
- panic!("Couldn't open {}: {}", args.desc.display(), err);
- });
- let desc: Desc = toml::from_str(&desc).unwrap();
-
- let export_args: export::ExportArgs = args.clone().into();
-
- let glob = args.glob.as_ref().map(|s| Glob::new(s).expect("Invalid parameter glob"));
-
- for (left_name, left_path) in desc.left.iter() {
- if let Some(left_path) = files.get(left_path) {
- let left = std::fs::read_to_string(left_path).unwrap_or_else(|err| {
- panic!("Couldn't open {}: {}", left_path.display(), err);
- });
-
- for (right_name, right_path) in desc.right.iter() {
- if let Some(right_path) = files.get(right_path) {
- let name = format!("{}_{}_{}", left_name, desc.name, right_name);
- if let Some(ref glob) = &glob {
- if !glob.is_match(&*name) {
- continue // Skip this emote
- }
- }
-
- let right = std::fs::read_to_string(&right_path).unwrap_or_else(|err| {
- panic!("Couldn't open {}: {}", right_path.display(), err);
- });
-
- let snuggle = generate_snuggle(&left, &right, &desc);
- let snuggle = export::xml_to_str(&snuggle).unwrap();
-
- export::export(
- snuggle,
- &output_dir,
- &desc.name,
- &name,
- &export_args
- ).unwrap();
- }
- }
- }
- }
-}
-
-fn generate_snuggle(left: &str, right: &str, desc: &Desc) -> Element {
- let left_usvg = export::get_usvg(&left).unwrap();
- let left_bbox = left_usvg.svg_node().view_box.rect;
-
- // == Generate mask ==
- let mut mask = Element::new("mask");
- mask.attributes.insert("id".to_string(), "snuggle-mask".to_string());
-
- let mut rect = Element::new("rect");
- rect.attributes.insert("fill".to_string(), "white".to_string());
- // TODO: use scale?
- rect.attributes.insert("x".to_string(), (desc.dx + left_bbox.x()).to_string());
- rect.attributes.insert("y".to_string(), (desc.dy + left_bbox.y()).to_string());
- rect.attributes.insert("width".to_string(), left_bbox.width().to_string());
- rect.attributes.insert("height".to_string(), left_bbox.height().to_string());
-
- mask.children.push(XMLNode::Element(rect));
-
- let mut right_mask = Element::new("g");
- right_mask.attributes.insert("transform".to_string(), desc.transform.clone());
-
- let mut right_xml = Element::parse(right.as_bytes()).unwrap();
- bolden(desc.bold, &mut right_xml);
- template::set_fill("#000000", &mut right_xml);
- template::set_stroke("#000000", &mut right_xml);
-
- for child in right_xml.children {
- if let XMLNode::Element(child) = child {
- right_mask.children.push(XMLNode::Element(child));
- }
- }
-
- mask.children.push(XMLNode::Element(right_mask));
-
- // == Insert both emotes ==
- let mut right_xml = Element::parse(right.as_bytes()).unwrap();
- let left_xml = Element::parse(left.as_bytes()).unwrap();
-
- let mut left_group = Element::new("g");
- left_group.attributes.insert("transform".to_string(), format!(
- "translate({} {})",
- desc.dx,
- desc.dy
- ));
- left_group.children = left_xml.children;
-
- let mut left_group2 = Element::new("g");
- left_group2.attributes.insert("mask".to_string(), "url(#snuggle-mask)".to_string());
- left_group2.children.push(XMLNode::Element(left_group));
-
- // == Fill in root element ==
- let mut res = Element::new("svg");
- res.attributes.insert("xmlns".to_string(), "http://www.w3.org/2000/svg".to_string());
- res.attributes.insert("version".to_string(), "1.1".to_string());
- res.attributes.insert("width".to_string(), "128".to_string());
- res.attributes.insert("height".to_string(), "128".to_string());
- res.children.push(XMLNode::Element(mask));
- res.children.append(&mut right_xml.children);
- res.children.push(XMLNode::Element(left_group2));
-
- res
-}
-
-/// Increases the `stroke-width` of any drawn element by `amount`.
-/// If the element has no stroke but has a filling, then it is considered to have a zero stroke width
-fn bolden(amount: f64, xml: &mut Element) {
- if let Some(stroke_width) = xml.attributes.get_mut("stroke-width") {
- if let Ok(parsed) = stroke_width.parse::() {
- *stroke_width = format!("{}", parsed + amount);
- }
- } else if xml.attributes.contains_key("fill") {
- xml.attributes.insert("stroke-width".to_string(), amount.to_string());
- }
-
- if let Some(style) = xml.attributes.get_mut("style") {
- let mut new_style = String::new();
- let mut stroke_width = None;
- for (name, value) in parse::parse_css(style) {
- if name == "stroke-width" {
- stroke_width = value.parse::().ok();
- continue
- }
-
- if name == "fill" && stroke_width.is_none() {
- stroke_width = Some(0.0);
- }
-
- write!(&mut new_style, "{}:{};", name, value).unwrap();
- }
-
- if let Some(stroke_width) = stroke_width {
- write!(&mut new_style, "stroke-width: {};", stroke_width + amount).unwrap();
- }
-
- *style = new_style;
- }
-
- for child in xml.children.iter_mut() {
- if let XMLNode::Element(ref mut child) = child {
- bolden(amount, child);
- }
- }
-}
diff --git a/src/export.rs b/src/export.rs
deleted file mode 100644
index f6442f5..0000000
--- a/src/export.rs
+++ /dev/null
@@ -1,223 +0,0 @@
-use usvg::{
- Tree,
- NodeExt,
- Options,
-};
-use xmltree::{XMLNode, Element};
-use std::path::{PathBuf};
-use std::collections::HashSet;
-
-#[derive(Debug)]
-pub enum ExportError {
- Xml(xmltree::Error),
- XmlParse(xmltree::ParseError),
- Usvg(usvg::Error),
- Io(PathBuf, std::io::Error),
- NoBBox,
- Utf8(std::string::FromUtf8Error),
- Encode(png::EncodingError),
-}
-
-impl From for ExportError {
- fn from(err: xmltree::ParseError) -> Self {
- Self::XmlParse(err)
- }
-}
-
-impl From for ExportError {
- fn from(err: xmltree::Error) -> Self {
- Self::Xml(err)
- }
-}
-
-impl From for ExportError {
- fn from(err: usvg::Error) -> Self {
- Self::Usvg(err)
- }
-}
-
-impl From for ExportError {
- fn from(err: std::string::FromUtf8Error) -> Self {
- Self::Utf8(err)
- }
-}
-
-impl From for ExportError {
- fn from(err: png::EncodingError) -> Self {
- Self::Encode(err)
- }
-}
-
-pub struct ExportArgs {
- pub no_resize: bool,
- pub dim: Vec,
-}
-
-pub fn get_usvg(svg_str: &str) -> Result {
- let usvg_options = Options::default();
- Tree::from_str(svg_str, &usvg_options.to_ref())
-}
-
-pub fn get_xml(svg_str: &str) -> Result {
- Element::parse(svg_str.as_bytes())
-}
-
-pub fn xml_to_str(svg_xml: &Element) -> Result {
- let mut s: Vec = Vec::new();
-
- svg_xml.write(&mut s)?;
-
- Ok(String::from_utf8(s)?)
-}
-
-fn get_new_bbox(svg: &Tree) -> Option<(f64, f64, f64, f64)> {
- let bbox = svg.root().calculate_bbox()?;
-
- // FIXME: remove once https://github.com/RazrFalcon/resvg/issues/528 is fixed
- const MARGIN: f64 = 2.0;
-
- let x = bbox.x() - MARGIN;
- let y = bbox.y() - MARGIN;
- let width = bbox.width() + MARGIN * 2.0;
- let height = bbox.height() + MARGIN * 2.0;
-
- if width > height {
- let y = y - (width - height) / 2.0;
-
- Some((x, y, width, width))
- } else {
- let x = x - (height - width) / 2.0;
-
- Some((x, y, height, height))
- }
-}
-
-/// Removes all elements marked with `blobfox-ignore-size="true"`
-
-macro_rules! strip {
- ( $name:tt, $attribute:expr ) => {
- fn $name(svg_str: &str) -> Result {
- let mut xml = get_xml(svg_str)?;
-
- fn rec(element: &mut Element) {
- // TODO: replace with Vec::drain_filter once https://github.com/rust-lang/rust/issues/43244 gets merged
- for child in std::mem::take(&mut element.children) {
- match child {
- XMLNode::Element(mut child) => {
- if let Some("true") = child.attributes.get($attribute).map(|s| s.as_str()) {
- continue
- }
-
- rec(&mut child);
-
- element.children.push(XMLNode::Element(child));
- }
- child => element.children.push(child),
- }
- }
- }
-
- rec(&mut xml);
-
- xml_to_str(&xml)
- }
- }
-}
-
-strip!(strip_ignore_size, "blobfox-ignore-size");
-strip!(strip_only_size, "blobfox-only-size");
-
-pub fn resize(svg_str: String) -> Result {
- let stripped = strip_ignore_size(&svg_str)?;
-
- if let Some(new_bbox) = get_new_bbox(&get_usvg(&stripped)?) {
- let mut svg_xml = get_xml(&svg_str)?;
- svg_xml.attributes.insert(
- "viewBox".to_string(),
- format!("{} {} {} {}", new_bbox.0, new_bbox.1, new_bbox.2, new_bbox.3),
- );
-
- xml_to_str(&svg_xml)
- } else {
- Err(ExportError::NoBBox)
- }
-}
-
-/// Finds all the `` in the svg and combines them all into one
-pub fn combine_defs(svg_str: String) -> Result {
- let mut svg_xml = get_xml(&svg_str)?;
-
- let mut defs = Vec::new();
-
- fn collect_defs(element: &mut Element, defs: &mut Vec) {
- for child in std::mem::take(&mut element.children) {
- match child {
- XMLNode::Element(child) if child.name == "defs" => {
- defs.push(child);
- }
- mut child => {
- if let XMLNode::Element(ref mut child) = &mut child {
- collect_defs(child, defs);
- }
- element.children.push(child);
- }
- }
- }
- }
-
- collect_defs(&mut svg_xml, &mut defs);
-
- let mut defs_element = Element::new("defs");
- defs_element.children = defs
- .into_iter()
- .map(|def| {
- def.children.into_iter().filter(|child| matches!(child, XMLNode::Element(_)))
- })
- .flatten()
- .collect::>();
- defs_element.attributes.insert("id".to_string(), "defs".to_string());
-
- svg_xml.children.insert(0, XMLNode::Element(defs_element));
-
- xml_to_str(&svg_xml)
-}
-
-pub fn export(
- mut svg_str: String,
- output_dir: &PathBuf,
- species_name: &str,
- output_name: &str,
- args: &ExportArgs,
-) -> Result<(), ExportError> {
- if !args.no_resize {
- svg_str = resize(svg_str)?;
- }
-
- svg_str = strip_only_size(&svg_str)?;
-
- svg_str = combine_defs(svg_str)?;
-
- mkdirp::mkdirp(output_dir.join(format!("vector/{}", species_name))).unwrap();
-
- let output = output_dir.join(&format!("vector/{}/{}.svg", species_name, output_name));
- std::fs::write(output.clone(), svg_str.clone()).map_err(|err| ExportError::Io(output, err))?;
-
- let svg_usvg = get_usvg(&svg_str)?;
- for resolution in args.dim.iter().copied().filter(|r| *r != 0).collect::>() {
- mkdirp::mkdirp(output_dir.join(&format!("{}/{}", resolution, species_name))).unwrap();
- let output = output_dir.join(&format!("{}/{}/{}.png", resolution, species_name, output_name));
-
- let mut image = tiny_skia::Pixmap::new(resolution, resolution).unwrap();
-
- resvg::render(
- &svg_usvg,
- usvg::FitTo::Width(resolution),
- tiny_skia::Transform::identity(),
- image.as_mut()
- ).unwrap();
-
- image.save_png(output)?;
- }
-
- Ok(())
-}
diff --git a/src/lib.rs b/src/lib.rs
deleted file mode 100644
index 6a4f2b2..0000000
--- a/src/lib.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod parse;
-pub mod template;
-pub mod export;
diff --git a/src/main.py b/src/main.py
new file mode 100644
index 0000000..957cbe5
--- /dev/null
+++ b/src/main.py
@@ -0,0 +1,29 @@
+from svgutils.compose import *
+from cairosvg import svg2png
+import toml
+
+CONFIG["svg.file_path"] = "../assets/"
+
+
+with open("../definitions.toml", "r") as def_file:
+ definitions = toml.loads(def_file.read())
+with open("../designs.toml", "r") as design_file:
+ designs = toml.loads(design_file.read())
+
+partsList = []
+for key in designs:
+ currentDesign = designs[key]
+ for part in currentDesign:
+ for url in definitions[part]:
+ partsList.append(url)
+ svg_parts = []
+ for part in partsList:
+ svg_parts.append(SVG(part))
+ Figure(
+ "128",
+ "128",
+ *svg_parts,
+ SVG("credits.svg")
+ ).save("../output/vector/"+key+".svg")
+ svg2png(url="../output/vector/"+key+".svg", write_to="../output/512/"+key+".png", output_width=512)
+print("Done!")
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
deleted file mode 100644
index b3bd418..0000000
--- a/src/main.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-use clap::Parser;
-use std::path::PathBuf;
-
-use blobfox_template::{
- parse::*,
- template::*,
- export::*,
-};
-
-fn main() {
- let args = Args::parse();
-
- let species = load_species(args.decl.clone()).unwrap();
- let context = RenderingContext::new(species);
-
- let output_dir = args.output_dir.clone().unwrap_or(PathBuf::from("output/"));
-
- if args.names.is_empty() {
- for name in context.species().variant_paths.keys() {
- generate_variant(&context, name, &output_dir, &args);
- }
- } else {
- for name in args.names.iter() {
- generate_variant(&context, name, &output_dir, &args);
- }
- }
-}
-
-fn generate_variant(context: &RenderingContext, name: &str, output_dir: &PathBuf, args: &Args) {
- let args: ExportArgs = args.clone().into();
-
- if let Some(path) = context.species().variant_paths.get(name) {
- match context.compile(path).and_then(|template| {
- template.render_data_to_string(&context.get_data(name))
- }) {
- Ok(svg) => {
- match export(
- svg,
- output_dir,
- &context.species().name,
- &format!("{}_{}", context.species().name, name),
- &args
- ) {
- Ok(_) => {}
- Err(err) => {
- eprintln!("Error while rendering {}: {:?}", name, err);
- }
- }
- }
- Err(err) => {
- eprintln!("Error while rendering {}: {}", name, err);
- }
- }
- } else {
- eprintln!("No variant named {}!", name);
- }
-}
-
-#[derive(Parser, Debug, Clone)]
-#[clap(author, version, about, long_about = None)]
-pub struct Args {
- /// A folder containing the declaration from which the emotes should be generated
- #[clap(short, long, value_parser)]
- decl: PathBuf,
-
- /// List of the emote names to export
- #[clap(value_parser)]
- names: Vec,
-
- /// Disable automatically resizing the SVG's viewBox, defaults to false
- #[clap(short, long, value_parser, default_value = "false")]
- no_resize: bool,
-
- /// Dimension to export the images as; can be specified multiple times
- #[clap(long, value_parser)]
- dim: Vec,
-
- /// Output directory
- #[clap(short, long, value_parser)]
- output_dir: Option,
-}
-
-impl From for ExportArgs {
- fn from(args: Args) -> ExportArgs {
- ExportArgs {
- no_resize: args.no_resize,
- dim: args.dim,
- }
- }
-}
diff --git a/src/parse.rs b/src/parse.rs
deleted file mode 100644
index f744d6a..0000000
--- a/src/parse.rs
+++ /dev/null
@@ -1,143 +0,0 @@
-use xmltree::{Element};
-use serde::{Serialize, Deserialize};
-use std::path::{PathBuf, Path};
-use std::collections::HashMap;
-
-/// Error returned upon failing to parse something
-#[derive(Debug)]
-pub enum ParseError {
- Io(PathBuf, std::io::Error),
- XmlParse(xmltree::ParseError),
- Toml(toml::de::Error),
-}
-
-impl From for ParseError {
- fn from(err: xmltree::ParseError) -> Self {
- Self::XmlParse(err)
- }
-}
-
-impl From for ParseError {
- fn from(err: toml::de::Error) -> Self {
- Self::Toml(err)
- }
-}
-
-#[derive(Serialize, Deserialize, Debug)]
-pub struct SpeciesDecl {
- /// Imports xml and svg files from this folder if they aren't found
- pub base: Option,
-
- /// The name of the species
- pub name: String,
-
- #[serde(default)]
- pub variants: HashMap>,
-
- #[serde(default)]
- pub vars: HashMap,
-
- #[serde(skip)]
- pub template_paths: HashMap,
-
- #[serde(skip)]
- pub variant_paths: HashMap,
-
- #[serde(skip)]
- pub asset_paths: HashMap,
-
- #[serde(skip)]
- pub parent: Option>,
-}
-
-/// Loads the given file as an XML tree
-pub fn load_xml(path: impl AsRef) -> Result {
- let file = std::fs::File::open(path.as_ref()).map_err(|err| {
- ParseError::Io(path.as_ref().to_path_buf(), err)
- })?;
-
- Ok(Element::parse(file)?)
-}
-
-/// Loads the basic description of a SpeciesDecl
-pub fn load_species(path: impl AsRef) -> Result {
- let declaration_path = path.as_ref().join("species.toml");
- let declaration = std::fs::read_to_string(&declaration_path).map_err(|err| {
- ParseError::Io(declaration_path, err)
- })?;
-
- let mut res: SpeciesDecl = toml::from_str(&declaration)?;
-
- if let Some(ref base) = &res.base {
- let path = path.as_ref().to_path_buf().join(base);
- let base = load_species(path)?;
-
- res.template_paths = base.template_paths.clone();
- res.variant_paths = base.variant_paths.clone();
- res.asset_paths = base.asset_paths.clone();
- res.variants = base.variants.clone();
- for (key, value) in base.vars.iter() {
- if !res.vars.contains_key(key) {
- res.vars.insert(key.clone(), value.clone());
- }
- }
- res.parent = Some(Box::new(base));
- }
-
- // Read the `templates` directory and populate the `template_paths` field;
- // on error, ignore the directory.
- for (name, path) in read_dir_xml(path.as_ref().join("templates")) {
- res.template_paths.insert(name, path);
- }
-
- // Read the `variants` directory
- for (name, path) in read_dir_xml(path.as_ref().join("variants")) {
- res.variant_paths.insert(name, path);
- }
-
- // Read the `assets` directory
- for (name, path) in read_dir_xml(path.as_ref().join("assets")) {
- res.asset_paths.insert(name, path);
- }
-
- Ok(res)
-}
-
-fn read_dir_xml(path: impl AsRef) -> HashMap {
- let mut res = HashMap::new();
-
- if let Ok(iter) = std::fs::read_dir(path) {
- for entry in iter.filter_map(|x| x.ok()) {
- match (entry.path().file_stem(), entry.path().extension()) {
- (Some(name), Some(ext)) => {
- if matches!(ext.to_str(), Some("xml") | Some("svg") | Some("mustache")) {
- if let Some(name) = name.to_str() {
- res.insert(
- name.to_string(),
- entry.path().to_path_buf()
- );
- }
- }
- }
- _ => {}
- }
- }
- }
-
- res
-}
-
-pub fn parse_css<'b>(css: &'b str) -> impl Iterator- + 'b {
- css.split(';').filter_map(|rule| {
- let mut iter = rule.splitn(2, ':');
- if let Some(name) = iter.next() {
- if let Some(value) = iter.next() {
- Some((name.trim(), value))
- } else {
- None
- }
- } else {
- None
- }
- })
-}
diff --git a/src/template.rs b/src/template.rs
deleted file mode 100644
index 8b121a8..0000000
--- a/src/template.rs
+++ /dev/null
@@ -1,331 +0,0 @@
-use crate::parse::{SpeciesDecl, parse_css};
-use mustache::{Context, Data, MapBuilder, PartialLoader, Template};
-use std::collections::HashMap;
-use std::path::Path;
-use std::sync::{Arc, Mutex};
-use xmltree::{Element, XMLNode};
-use css_color_parser::Color as CssColor;
-
-#[derive(Debug, Clone)]
-pub struct RenderingContext {
- species: Arc,
-
- rendered_variants: Arc>>,
-
- loaded_assets: Arc>>,
-
- parent: Option>,
-}
-
-impl RenderingContext {
- pub fn new(mut species: SpeciesDecl) -> Self {
- let parent = std::mem::take(&mut species.parent).map(|parent| {
- Box::new(Self::new(*parent))
- });
-
- Self {
- species: Arc::new(species),
- rendered_variants: Arc::new(Mutex::new(HashMap::new())),
- loaded_assets: Arc::new(Mutex::new(HashMap::new())),
- parent
- }
- }
-
- pub fn compile(&self, path: impl AsRef) -> Result, mustache::Error> {
- let template = std::fs::read_to_string(path)?;
- Context::with_loader(self.clone()).compile(template.chars())
- }
-
- fn render_to_string(
- &self,
- string: &str,
- variant_name: &str,
- ) -> Result {
- Context::with_loader(self.clone())
- .compile(string.chars())?
- .render_data_to_string(&self.get_data(variant_name))
- }
-
- pub fn get_data(&self, variant_name: &str) -> Data {
- self.get_builder(variant_name, true).build()
- }
-
- fn get_builder(&self, variant_name: &str, include_parent: bool) -> MapBuilder {
- let mut builder = MapBuilder::new();
-
- builder = builder.insert_map("variant", |mut builder| {
- for variant_name in self.species.variant_paths.keys() {
- let this = self.clone();
- let variant_name = variant_name.to_string();
- builder = builder.insert_fn(variant_name.clone(), move |selector| {
- let svg = this.get_variant(&variant_name);
- if let Some(svg) = svg {
- if let Some(element) = query_selector(svg, &selector) {
- if let Some(string) = xml_to_string(element) {
- return string;
- }
- }
- }
-
- String::new()
- })
- }
- builder
- });
-
- for asset_name in self.species.asset_paths.keys() {
- let this = self.clone();
- let asset_name = asset_name.to_string();
-
- builder = builder.insert_fn(asset_name.clone(), move |selector| {
- let svg = this.get_asset(&asset_name);
- if let Some(svg) = svg {
- if let Some(element) = query_selector(svg, &selector) {
- if let Some(string) = xml_to_string(element) {
- return string;
- }
- }
- }
-
- String::new()
- });
- }
-
- for (cb, name) in [
- (set_fill as fn(&str, &mut Element), "set-fill"),
- (set_stroke, "set-stroke")
- ] {
- let this = self.clone();
- let variant_name_owned = variant_name.to_string();
-
- builder = builder.insert_fn(name, move |input| {
- // Parse `color|xml`
- if let [color, xml] = input.splitn(2, '|').collect::>()[..] {
- // Render `color` and `xml`
- if let (Ok(color), Ok(xml)) = (
- this.render_to_string(&color, &variant_name_owned),
- this.render_to_string(&xml, &variant_name_owned),
- ) {
- // Convert `xml` to XML
- match Element::parse(xml.as_bytes()) {
- Ok(mut xml) => {
- cb(&color.trim(), &mut xml);
-
- // Render XML to string
- if let Some(res) = xml_to_string(xml) {
- res
- } else {
- String::from("")
- }
- }
- Err(err) => {
- format!("", err)
- }
- }
- } else {
- String::from("")
- }
- } else {
- String::from("")
- }
- });
- }
-
- builder = builder.insert("vars", &self.species.vars).unwrap();
-
- if include_parent {
- let mut this = self.clone();
-
- loop {
- builder = builder.insert_map(&this.species.name, |_| {
- this.get_builder(variant_name, false)
- });
-
- if let Some(ref parent) = this.parent {
- this = *parent.clone();
- } else {
- break
- }
- }
- }
-
- // TODO: memoize the builder to this stage
-
- // Variant tags
- if let Some(tags) = self.species.variants.get(variant_name) {
- builder = builder.insert_map("tags", move |mut builder| {
- for tag in tags.iter() {
- builder = builder.insert_bool(tag, true);
- }
-
- builder
- });
- }
-
- builder
- }
-
- pub fn get_variant(&self, name: &String) -> Option {
- let rendered = self.rendered_variants.lock().unwrap().get(name).cloned();
- if let Some(rendered) = rendered {
- Some(rendered)
- } else if let Some(path) = self.species.variant_paths.get(name) {
- // TODO: log error
- let template = self.compile(path).ok()?;
- let data = self.get_data(name);
- let rendered = template.render_data_to_string(&data).ok()?;
-
- let parsed = Element::parse(rendered.as_bytes()).ok()?;
- self.rendered_variants
- .lock()
- .unwrap()
- .insert(name.clone(), parsed.clone());
-
- Some(parsed)
- } else {
- None
- }
- }
-
- pub fn get_asset(&self, name: &String) -> Option {
- let loaded = self.loaded_assets.lock().unwrap().get(name).cloned();
- if let Some(loaded) = loaded {
- Some(loaded)
- } else if let Some(path) = self.species.asset_paths.get(name) {
- let string = std::fs::read_to_string(path).ok()?;
- let parsed = Element::parse(string.as_bytes()).ok()?;
- self.loaded_assets
- .lock()
- .unwrap()
- .insert(name.clone(), parsed.clone());
-
- Some(parsed)
- } else {
- None
- }
- }
-
- pub fn species(&self) -> Arc {
- Arc::clone(&self.species)
- }
-}
-
-impl PartialLoader for RenderingContext {
- fn load(&self, name: impl AsRef) -> Result {
- let name = name.as_ref().to_str().ok_or(mustache::Error::InvalidStr)?;
-
- let components = name.split('.').collect::>();
-
- if components.len() == 1 {
- if let Some(path) = self.species.template_paths.get(name) {
- Ok(std::fs::read_to_string(path)?)
- } else {
- eprintln!("No template named {}", name);
- Err(mustache::Error::NoFilename)
- }
- } else if components.len() == 2 {
- if components[0] == self.species.name {
- self.load(components[1])
- } else if let Some(ref parent) = self.parent {
- parent.load(name)
- } else {
- eprintln!(
- "Cannot get template named {}: no species called {} in the inheritance tree",
- name,
- components[0]
- );
- Err(mustache::Error::NoFilename)
- }
- } else {
- eprintln!("Cannot get template named {}: expected `name` or `species.name`", name);
- Err(mustache::Error::NoFilename)
- }
- }
-}
-
-macro_rules! set_color {
- ( $fn_name:tt, $color_name:expr, $opacity_name:expr ) => {
- pub fn $fn_name(color: &str, xml: &mut Element) {
- let (color, opacity) = if let Ok(parsed) = color.parse::() {
- (format!("#{:02x}{:02x}{:02x}", parsed.r, parsed.g, parsed.b), parsed.a)
- } else {
- (color.to_string(), 1.0)
- };
-
- fn rec(color: &str, opacity: f32, xml: &mut Element) {
- if let Some(style) = xml.attributes.get_mut("style") {
- let mut new_style = Vec::new();
-
- for (name, value) in parse_css(style) {
- if name != $color_name && name != $opacity_name {
- new_style.push(format!("{}:{}", name, value));
- }
- }
-
- new_style.push(format!(concat!($color_name, ": {};"), color));
- new_style.push(format!(concat!($opacity_name, ": {};"), opacity));
-
- *style = new_style.join(";");
- }
- if let Some(_fill) = xml.attributes.get($color_name) {
- xml.attributes.insert($color_name.to_string(), color.to_string());
- }
- if let Some(_fill) = xml.attributes.get($opacity_name) {
- xml.attributes.insert($opacity_name.to_string(), opacity.to_string());
- }
-
- for child in xml.children.iter_mut() {
- if let XMLNode::Element(ref mut child) = child {
- rec(color, opacity, child);
- }
- }
- }
-
- rec(&color, opacity, xml)
- }
- }
-}
-
-set_color!(set_fill, "fill", "fill-opacity");
-set_color!(set_stroke, "stroke", "stroke-opacity");
-
-pub fn query_selector(svg: Element, pattern: &str) -> Option {
- if pattern == "" {
- // NOTE: it looks like having a nested svg makes resvg unhappy
- let mut group = Element::new("g");
- group.children = svg.children;
- return Some(group);
- }
-
- for child in svg.children {
- if let XMLNode::Element(child) = child {
- if let ("#", pattern_id) = pattern.split_at(1) {
- if child
- .attributes
- .get("id")
- .map(|id| id == pattern_id)
- .unwrap_or(false)
- {
- return Some(child);
- } else if child.children.len() > 0 {
- if let Some(res) = query_selector(child, pattern) {
- return Some(res);
- }
- }
- }
- }
- }
-
- None
-}
-
-pub fn xml_to_string(element: Element) -> Option {
- let mut s: Vec = Vec::new();
- let mut config = xmltree::EmitterConfig::default();
- config.perform_indent = true;
- config.write_document_declaration = false;
-
- element.write_with_config(&mut s, config).ok()?;
-
- String::from_utf8(s).ok()
-}
diff --git a/svg-default-metadata.xml b/svg-default-metadata.xml
deleted file mode 100644
index ec69094..0000000
--- a/svg-default-metadata.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- NAME OF THE EMOTE
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- YOUR NAME
-
-
-
-
-
diff --git a/vector/blobamber.svg b/vector/blobamber.svg
deleted file mode 100644
index a9c0e87..0000000
--- a/vector/blobamber.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobcatBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 LicenseblobcatFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfox
\ No newline at end of file
diff --git a/vector/blobamber_owo.svg b/vector/blobamber_owo.svg
deleted file mode 100644
index 557c910..0000000
--- a/vector/blobamber_owo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/vector/blobarcticfox.svg b/vector/blobarcticfox.svg
deleted file mode 100644
index 1c778c8..0000000
--- a/vector/blobarcticfox.svg
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
- blobfox
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/vector/blobarcticfox_snug.svg b/vector/blobarcticfox_snug.svg
deleted file mode 100644
index 3a59cf4..0000000
--- a/vector/blobarcticfox_snug.svg
+++ /dev/null
@@ -1,130 +0,0 @@
-
-blobarcticfox_snugBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobarcticfox_snugFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobarcticfox_snuggle_right.svg b/vector/blobarcticfox_snuggle_right.svg
deleted file mode 100644
index c0c7cf9..0000000
--- a/vector/blobarcticfox_snuggle_right.svg
+++ /dev/null
@@ -1,136 +0,0 @@
-
-blobarcticfox_snuggle_rightBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobarcticfox_snuggle_rightFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobcat.svg b/vector/blobcat.svg
deleted file mode 100644
index f09892d..0000000
--- a/vector/blobcat.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobcatBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 LicenseblobcatFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfox
\ No newline at end of file
diff --git a/vector/blobcat_comfy.svg b/vector/blobcat_comfy.svg
deleted file mode 100644
index 901500a..0000000
--- a/vector/blobcat_comfy.svg
+++ /dev/null
@@ -1,164 +0,0 @@
-
-blobcat_comfyBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobcat_comfyFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobcat_snuggle_right.svg b/vector/blobcat_snuggle_right.svg
deleted file mode 100644
index 3dd1908..0000000
--- a/vector/blobcat_snuggle_right.svg
+++ /dev/null
@@ -1,134 +0,0 @@
-
-blobfox_snuggle_rightBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_snuggle_rightFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox.svg b/vector/blobfox.svg
deleted file mode 100644
index 0482991..0000000
--- a/vector/blobfox.svg
+++ /dev/null
@@ -1,159 +0,0 @@
-
-
- blobfox
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobfox
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/vector/blobfox_3c_evil.svg b/vector/blobfox_3c_evil.svg
deleted file mode 100644
index ad963a5..0000000
--- a/vector/blobfox_3c_evil.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobfox_3c_evilBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_3c_evilFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
\ No newline at end of file
diff --git a/vector/blobfox_blush.svg b/vector/blobfox_blush.svg
deleted file mode 100644
index 990e73a..0000000
--- a/vector/blobfox_blush.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobfox_blushBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_blushhttps://git.shadamethyst.xyz/adri326/blobfoxFeuerfuchsShad Amethyst
\ No newline at end of file
diff --git a/vector/blobfox_boop_owo.svg b/vector/blobfox_boop_owo.svg
deleted file mode 100644
index b617451..0000000
--- a/vector/blobfox_boop_owo.svg
+++ /dev/null
@@ -1,161 +0,0 @@
-
-blobfox_boop_owoBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_boop_owoFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_comfy.svg b/vector/blobfox_comfy.svg
deleted file mode 100644
index b874fa3..0000000
--- a/vector/blobfox_comfy.svg
+++ /dev/null
@@ -1,130 +0,0 @@
-
-blobfox_comfyBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_comfyFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_cry.svg b/vector/blobfox_cry.svg
deleted file mode 100644
index f946b27..0000000
--- a/vector/blobfox_cry.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobfox_cryBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_cryFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
\ No newline at end of file
diff --git a/vector/blobfox_egg.svg b/vector/blobfox_egg.svg
deleted file mode 100644
index e3b8235..0000000
--- a/vector/blobfox_egg.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobfox_eggBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_eggFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
\ No newline at end of file
diff --git a/vector/blobfox_heart.svg b/vector/blobfox_heart.svg
deleted file mode 100644
index 8e3353b..0000000
--- a/vector/blobfox_heart.svg
+++ /dev/null
@@ -1,131 +0,0 @@
-
-blobfox_heartBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_heartFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_nom_egg.svg b/vector/blobfox_nom_egg.svg
deleted file mode 100644
index ae10c21..0000000
--- a/vector/blobfox_nom_egg.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobfox_nom_eggBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_nom_eggFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
\ No newline at end of file
diff --git a/vector/blobfox_plural.svg b/vector/blobfox_plural.svg
deleted file mode 100644
index 03044c6..0000000
--- a/vector/blobfox_plural.svg
+++ /dev/null
@@ -1,893 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/vector/blobfox_plural2.svg b/vector/blobfox_plural2.svg
deleted file mode 100644
index 04fd00e..0000000
--- a/vector/blobfox_plural2.svg
+++ /dev/null
@@ -1,308 +0,0 @@
-
-
-
-
diff --git a/vector/blobfox_reach_aww.svg b/vector/blobfox_reach_aww.svg
deleted file mode 100644
index ea4b888..0000000
--- a/vector/blobfox_reach_aww.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-blobfox_reach_awwBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_reach_awwFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_snug.svg b/vector/blobfox_snug.svg
deleted file mode 100644
index c25266a..0000000
--- a/vector/blobfox_snug.svg
+++ /dev/null
@@ -1,125 +0,0 @@
-
-blobfox_snugBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_snugFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_snug2.svg b/vector/blobfox_snug2.svg
deleted file mode 100644
index a8d56a8..0000000
--- a/vector/blobfox_snug2.svg
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-blobfox_snug2Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_snug2Feuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_snug_sleep.svg b/vector/blobfox_snug_sleep.svg
deleted file mode 100644
index 482492e..0000000
--- a/vector/blobfox_snug_sleep.svg
+++ /dev/null
@@ -1,148 +0,0 @@
-
-blobfox_snugBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_snugFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_snuggle_right.svg b/vector/blobfox_snuggle_right.svg
deleted file mode 100644
index fa633af..0000000
--- a/vector/blobfox_snuggle_right.svg
+++ /dev/null
@@ -1,131 +0,0 @@
-
-blobfox_snuggle_rightBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_snuggle_rightFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobfox_waaaa.svg b/vector/blobfox_waaaa.svg
deleted file mode 100644
index cf95276..0000000
--- a/vector/blobfox_waaaa.svg
+++ /dev/null
@@ -1,212 +0,0 @@
-
-
-
-blobfox_cryBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobfox_cryFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobhusky.svg b/vector/blobhusky.svg
deleted file mode 100644
index 8727731..0000000
--- a/vector/blobhusky.svg
+++ /dev/null
@@ -1,165 +0,0 @@
-
-
- blobhusky
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 License
-
-
- blobhusky
-
-
- Feuerfuchs
-
-
- https://git.shadamethyst.xyz/adri326/blobfox
-
-
- Shad Amethyst
-
-
-
-
-
-
diff --git a/vector/blobhusky_snuggle_right.svg b/vector/blobhusky_snuggle_right.svg
deleted file mode 100644
index eabffa0..0000000
--- a/vector/blobhusky_snuggle_right.svg
+++ /dev/null
@@ -1,136 +0,0 @@
-
-blobhusky_snuggle_rightBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 Licenseblobhusky_snuggle_rightFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
diff --git a/vector/blobstella.svg b/vector/blobstella.svg
deleted file mode 100644
index fae8aed..0000000
--- a/vector/blobstella.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobcatBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 LicenseblobcatFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfox
\ No newline at end of file
diff --git a/vector/coffee.svg b/vector/coffee.svg
deleted file mode 100644
index 5eda2be..0000000
--- a/vector/coffee.svg
+++ /dev/null
@@ -1,109 +0,0 @@
-
-coffeeBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 LicenseFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethystcoffee
diff --git a/vector/crowbar.svg b/vector/crowbar.svg
deleted file mode 100644
index e1428e9..0000000
--- a/vector/crowbar.svg
+++ /dev/null
@@ -1,98 +0,0 @@
-
-crowbarBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 LicenseFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethystcrowbar
diff --git a/vector/knife.svg b/vector/knife.svg
deleted file mode 100644
index e0973ca..0000000
--- a/vector/knife.svg
+++ /dev/null
@@ -1 +0,0 @@
-blobfoxBlobfox team (https://git.shadamethyst.xyz/adri326/blobfox), licensed under the Apache 2.0 LicenseblobfoxFeuerfuchshttps://git.shadamethyst.xyz/adri326/blobfoxShad Amethyst
\ No newline at end of file