Compare commits

...

21 commits
1.0.0 ... main

Author SHA1 Message Date
Kazhnuz
3a93952adc 🔖 Version 1.1.0 2025-02-13 20:32:12 +01:00
Kazhnuz
6749104d78 📝 Add changelog 2025-02-13 15:43:08 +01:00
Kazhnuz
77d4b00594 🐛 More replaceAll changes 2025-02-13 15:42:03 +01:00
Kazhnuz
89669b1ef8 Ajout des variantes "& fier⋅e" 2025-02-13 15:23:24 +01:00
Kazhnuz
d1554e0101 🔊 Ajoute le compte des drapeaux traités 2025-02-13 15:21:12 +01:00
Kazhnuz
d4027dd1e1 🐛 Retrait de certains caractère spéciaux 2025-02-12 20:14:06 +01:00
Kazhnuz
5a3b4e3163 🐛 Remove accent in filenames 2025-02-12 20:12:59 +01:00
Kazhnuz
f538c62f4a 🎨 Put the adaptedText in a variable 2025-02-12 20:11:57 +01:00
Kazhnuz
e6cd9c09d5 🎨 Better format for datas 2025-02-12 20:07:05 +01:00
Kazhnuz
e1e8426c3c 🐛 Improve generation 2025-02-12 20:05:55 +01:00
Kazhnuz
8058e27a3f Ajout des drapeaux polyamoureux 2025-02-12 20:00:11 +01:00
Kazhnuz
0ff878e852 Ajout des drapeaux demigenres 2025-02-12 19:58:18 +01:00
Kazhnuz
8473f6edc8 Ajout des drapeaux genderfluid 2025-02-08 22:03:13 +01:00
Kazhnuz
26e60dcc37 Ajout des drapeaux aro-ace
Ajoute #2
2025-02-08 21:10:19 +01:00
Kazhnuz
ed781f3261 🐛 Fix french name for intersexe 2025-02-05 00:13:33 +01:00
Kazhnuz
5f6def202d Add "now" variants 2025-02-04 20:58:21 +01:00
Kazhnuz
e963276ac6 ♻️ Use functions for the script 2025-02-04 20:27:53 +01:00
Kazhnuz
9a4dd35aec 🏳️‍🌈 Be gay do crime
Fixes #5
2025-02-04 19:53:04 +01:00
Kazhnuz
9e92f3ceb8 🔊 Show generation time 2025-02-04 19:45:58 +01:00
Kazhnuz
574e4a001c Ajoute les LGBTQ+ rights
Fixes #6
2025-02-04 19:39:02 +01:00
Kazhnuz
342f7a876e (data): ajoute les variantes demi
Fixes #3
2025-02-02 20:30:20 +01:00
12 changed files with 360 additions and 35 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
output output
tmp
node_modules node_modules
package-lock.json package-lock.json

46
CHANGELOG.md Normal file
View file

@ -0,0 +1,46 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [1.1.0] - 2025-02-13
### Fixed
- Fixed french name for intersex
- Fixed names by removing accents and other weird things
- Used replaceAll everywhere
### Added
- Added demisexual and demiromantic flags
- Added "LGBTQ+ rights" texts
- Added "now!" variants
- Added aro-ace flags
- Added genderfluid flags
- Added demigenders flags
- Added polyamours flags
- Added "& proud" texts
### Changed
- The script show now the time generation
- Count the number of flags and buttons generated
- The script uses now functions and should be more readable
## [1.0.0] - 2025-02-02
Initial release of the project, containing the following things :
- Present flags : Pride, Asexual, Agender, Aromantic, Bisexual, Demiboy, Demigirl, Gay, Lesbian, Intersex, Non-binary, Pansexual, Transgender
- Texts in french and english
- Anti-terf, anti-transphobia texts.
- Protect trans kids texts
- Trans rights texts
[unreleased]: https://git.kobold.cafe/kazhnuz/pride-buttons/compare/1.0.0...main
[1.0.0]: https://git.kobold.cafe/kazhnuz/pride-buttons/releases/tag/1.0.0

242
data.json
View file

@ -2,66 +2,280 @@
{ {
"source": "./sources/pride.gif", "source": "./sources/pride.gif",
"name": {"en":"Pride", "fr":"Pride"}, "name": {"en":"Pride", "fr":"Pride"},
"texts": ["LGBTQ+", "proud", "fier⋅e", "fier", "fière", "queer"] "texts": [
"LGBTQ+", "proud", "fier⋅e", "fier", "fière", "queer",
"LGBTQ+\n& proud", "queer\n& proud",
"LGBTQ+\n& fier", "queer\n& fier",
"LGBTQ+\n& fière", "queer\n& fière",
"LGBTQ+\n& fier⋅e", "queer\n& fier⋅e",
"LGBTQ+\nrights", "LGBTQ+\nunited!", "LGBTQ+\nunite!", "LGBTQ+\nunis!",
"queer\nrights", "queer\nunited!", "queer\nunite!", "queer\nunis!",
"Be gay\ndo crime"
],
"textsNow": [
"LGBTQ+\nrights", "LGBTQ+\nunited!", "LGBTQ+\nunite!", "LGBTQ+\nunis!",
"queer\nrights", "queer\nunited!", "queer\nunite!", "queer\nunis!",
"Be gay\ndo crime"
]
}, },
{ {
"source": "./sources/ace.gif", "source": "./sources/ace.gif",
"name": {"en":"Asexual", "fr":"Asexuel"}, "name": {"en":"Asexual", "fr":"Asexuel"},
"texts": ["ace", "asexual", "asexuel", "asexuelle", "asexuel⋅le"] "texts": [
"ace", "asexual", "asexuel", "asexuelle", "asexuel⋅le",
"ace\n& proud", "asexual\n& proud",
"asexuel\n& fier", "ace\n& fier",
"asexuelle\n& fière", "ace\n& fière",
"asexuel⋅le\n& fier⋅e", "ace\n& fier⋅e",
"Be ace\ndo crime"
],
"textsNow": ["Be ace\ndo crime"]
},
{
"source": "./sources/aroace.gif",
"name": {"en":"Aro&ace", "fr":"Aro&ace"},
"texts": [
"aroace", "aro & ace",
"aroace\n& proud", "aro & ace\n& proud",
"aroace\n& fier", "aro & ace\n& fier",
"aroace\n& fière", "aro & ace\n& fière",
"aroace\n& fier⋅e", "aro & ace\n& fier⋅e",
"Be aroace\ndo crime"
],
"textsNow": ["Be aroace\ndo crime"]
},
{
"source": "./sources/aroace-2.gif",
"name": {"en":"Aroace", "fr":"Aroace"},
"texts": [
"aroace", "aro & ace",
"aroace\n& proud", "aro & ace\n& proud",
"aroace\n& fier", "aro & ace\n& fier",
"aroace\n& fière", "aro & ace\n& fière",
"aroace\n& fier⋅e", "aro & ace\n& fier⋅e",
"Be aroace\ndo crime"
],
"textsNow": ["Be aroace\ndo crime"]
}, },
{ {
"source": "./sources/agender.gif", "source": "./sources/agender.gif",
"name": {"en":"Agender", "fr":"Agenre"}, "name": {"en":"Agender", "fr":"Agenre"},
"texts": ["agender", "agenre"] "texts": [
"agender", "agenre",
"agender\n& proud",
"agenre\n& fier",
"agenre\n& fière",
"agenre\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
}, },
{ {
"source": "./sources/aromantic.gif", "source": "./sources/aromantic.gif",
"name": {"en":"Aromantic", "fr":"Aromantique"}, "name": {"en":"Aromantic", "fr":"Aromantique"},
"texts": ["aromantic", "aromantique", "aro"] "texts": [
"aromantic", "aromantique", "aro",
"aromantic\n& proud", "aro\n& proud",
"aromantique\n& fier", "aro\n& fier",
"aromantique\n& fière", "aro\n& fière",
"aromantique\n& fier⋅e", "aro\n& fier⋅e",
"Be aro\ndo crime"
],
"textsNow": ["Be aro\ndo crime"]
}, },
{ {
"source": "./sources/bisexual.gif", "source": "./sources/bisexual.gif",
"name": {"en":"Bisexual", "fr":"Bisexuel"}, "name": {"en":"Bisexual", "fr":"Bisexuel"},
"texts": ["bisexual", "bisexuel", "bisexuelle", "bisexuel⋅le", "bi"] "texts": [
"bisexual", "bisexuel", "bisexuelle", "bisexuel⋅le", "bi",
"bisexual\n& proud", "bi\n& proud",
"bisexuel\n& fier", "bi\n& fier",
"bisexuelle\n& fière", "bi\n& fière",
"bisexuel⋅le\n& fier⋅e", "bi\n& fier⋅e",
"Be gay\ndo crime", "Be bi\ndo crime"
],
"textsNow": ["Be gay\ndo crime", "Be bi\ndo crime"]
}, },
{ {
"source": "./sources/demiboy.gif", "source": "./sources/demiboy.gif",
"name": {"en":"Demiboy", "fr":"Demigars"}, "name": {"en":"Demiboy", "fr":"Demigars"},
"texts": ["demiboy", "demiman", "demigars", "demihomme", "demimec"] "texts": [
"demiboy", "demiman", "demigars", "demihomme", "demimec",
"demiboy\n& proud", "demiman\n& proud",
"demigars\n& fier", "demihomme\n& fier", "demimec\n& fier", "demiboy\n& fier",
"demigars\n& fier⋅e", "demihomme\n& fier⋅e", "demimec\n& fier⋅e", "demiboy\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
}, },
{ {
"source": "./sources/demigirl.gif", "source": "./sources/demigirl.gif",
"name": {"en":"Demigirl", "fr":"Demifille"}, "name": {"en":"Demigirl", "fr":"Demifille"},
"texts": ["demigirl", "demiwoman", "demifemme", "demifille", "demimeuf"] "texts": [
"demigirl", "demiwoman", "demifemme", "demifille", "demimeuf",
"demigirl\n& proud", "demiwoman\n& proud",
"demifille\n& fière", "demifemme\n& fière", "demimeuf\n& fière",
"demifille\n& fier⋅e", "demifemme\n& fier⋅e", "demimeuf\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
},
{
"source": "./sources/demigender.gif",
"name": {"en":"Demigender", "fr":"Demigenre"},
"texts": [
"demigender", "demigenre",
"demigender\n& proud",
"demigenre\n& fier",
"demigenre\n& fière",
"demigenre\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
},
{
"source": "./sources/demiromantic.gif",
"name": {"en":"Demiromantic", "fr":"Demiromantique"},
"texts": [
"demiromantic", "demiromantique", "demirom", "demiaro",
"demiromantic\n& proud", "demirom\n& proud", "demiaro\n& proud",
"demiromantique\n& fier", "demirom\n& fier", "demiaro\n& fier",
"demiromantique\n& fière", "demirom\n& fière", "demiaro\n& fière",
"demiromantique\n& fier⋅e", "demirom\n& fier⋅e", "demiaro\n& fier⋅e",
"Be demi\ndo crime"
],
"textsNow": ["Be demi\ndo crime"]
},
{
"source": "./sources/demisexual.gif",
"name": {"en":"Demisexual", "fr":"Demisexuel"},
"texts": [
"demisexual", "demisexuel", "demisexuelle", "demisexuel⋅le", "demiace",
"demisexual\n& proud", "demiace\n& proud",
"demisexuel\n& fier", "demiace\n& fier",
"demisexuelle\n& fière", "demiace\n& fière",
"demisexuel⋅le\n& fier⋅e", "demiace\n& fier⋅e",
"Be demi\ndo crime"
],
"textsNow": ["Be demi\ndo crime"]
},
{
"source": "./sources/genderfluid.gif",
"name": {"en":"Genderfluid", "fr":"Genderfluide"},
"texts": [
"genderfluid", "genderfluide",
"genderfluid\n& proud",
"genderfluide\n& fier",
"genderfluide\n& fière",
"genderfluide\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
},
{
"source": "./sources/genderflux.gif",
"name": {"en":"Genderflux", "fr":"Genderflux"},
"texts": [
"genderflux",
"genderflux\n& proud",
"genderflux\n& fier",
"genderflux\n& fière",
"genderflux\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
}, },
{ {
"source": "./sources/gay.gif", "source": "./sources/gay.gif",
"name": {"en":"Gay", "fr":"Gay"}, "name": {"en":"Gay", "fr":"Gay"},
"texts": ["gay", "homosexuel", "homosexuel⋅le"] "texts": [
"gay", "homosexuel", "homosexuel⋅le",
"gay\n& proud",
"homosexuel\n& fier", "gay\n& fier",
"homosexuel⋅le\n& fier⋅e", "gay\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
}, },
{ {
"source": "./sources/intersex-1.gif", "source": "./sources/intersex-1.gif",
"name": {"en":"Intersex", "fr":"Intersexué"}, "name": {"en":"Intersex", "fr":"Intersexe"},
"texts": ["Intersex", "Intersexué", "Intersexuée", "Intersexué⋅e"] "texts": [
"Intersex", "Intersexe",
"Intersex\n& proud",
"Intersexe\n& fier",
"Intersexe\n& fière",
"Intersexe\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
}, },
{ {
"source": "./sources/lesbian.gif", "source": "./sources/lesbian.gif",
"name": {"en":"Lesbian", "fr":"Lesbienne"}, "name": {"en":"Lesbian", "fr":"Lesbienne"},
"texts": ["lesbienne", "lesbian", "homosexuelle", "homosexuel⋅le"] "texts": [
"lesbienne", "lesbian", "homosexuelle", "homosexuel⋅le",
"lesbian\n& proud",
"lesbienne\n& fière", "homosexuelle\n& fière",
"lesbienne\n& fier⋅e", "homosexuel⋅le\n& fier⋅e",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
}, },
{ {
"source": "./sources/nonbinary.gif", "source": "./sources/nonbinary.gif",
"name": {"en":"Non-Binary", "fr":"Non-binaire"}, "name": {"en":"Non-Binary", "fr":"Non-binaire"},
"texts": ["non-binary", "non-binaire", "enby", "nb"] "texts": [
"non-binary", "non-binaire", "enby", "nb",
"nb\n& proud", "enby\n& proud", "non-binary\n& proud",
"nb\n& fier", "enby\n& fier", "non-binaire\n& fier",
"nb\n& fier⋅e", "enby\n& fier⋅e", "non-binaire\n& fier⋅e",
"nb\n& fière", "enby\n& fière", "non-binaire\n& fière",
"Be gay\ndo crime"
],
"textsNow": ["Be gay\ndo crime"]
}, },
{ {
"source": "./sources/pansexual.gif", "source": "./sources/pansexual.gif",
"name": {"en":"Pansexual", "fr":"Pansexuel"}, "name": {"en":"Pansexual", "fr":"Pansexuel"},
"texts": ["pansexual", "pan", "pansexuel", "pansexuelle", "pansexuel⋅le"] "texts": [
"pansexual", "pan", "pansexuel", "pansexuelle", "pansexuel⋅le",
"pansexual\n& proud", "pan\n& proud",
"pansexuel\n& fier", "pan\n& fier",
"pansexuel⋅le\n& fier⋅e", "pan\n& fier⋅e",
"pansexuelle\n& fière", "pan\n& fière",
"Be gay\ndo crime", "Be pan\ndo crime"
],
"textsNow": ["Be gay\ndo crime", "Be pan\ndo crime"]
},
{
"source": "./sources/polyamour-2.gif",
"name": {"en":"Polyamourous", "fr":"Polyamour"},
"texts": [
"Polyamourous", "Polyamour", "poly",
"Polyamourous\n& proud", "poly\n& proud",
"poly\n& fier",
"poly\n& fier⋅e",
"poly\n& fière"
]
}, },
{ {
"source": "./sources/trans.gif", "source": "./sources/trans.gif",
"name": {"en":"Transgender", "fr":"Transgenre"}, "name": {"en":"Transgender", "fr":"Transgenre"},
"texts": ["transgender", "transgenre", "trans", "fuck\ntransphobes", "trans\nrights", "fuck\nterfs", "no to\nterfs", "Non aux\nterfs", "stop\ntransphobia", "stop à la\ntransphobie", "protect\ntrans kids", "droits\ntrans"] "texts": [
"transgender", "transgenre", "trans",
"transgender\n& proud", "trans\n& proud",
"transgenre\n& fier", "trans\n& fier",
"transgenre\n& fier⋅e", "trans\n& fier⋅e",
"transgenre\n& fière", "trans\n& fier⋅e",
"fuck\ntransphobes", "fuck\nterfs", "no to\nterfs", "Non aux\nterfs", "stop\ntransphobia", "stop à la\ntransphobie",
"trans\nrights", "protect\ntrans kids", "droits\ntrans",
"Be gay\ndo crime"
],
"textsNow": [
"stop\ntransphobia", "stop à la\ntransphobie",
"trans\nrights", "protect\ntrans kids", "droits\ntrans",
"Be gay\ndo crime"
]
} }
] ]

106
main.js
View file

@ -8,40 +8,104 @@ const myGm = gm.subClass({imageMagick: true});
const position = {x: 4, y: 2, gravity: "NorthEast"} const position = {x: 4, y: 2, gravity: "NorthEast"}
const metadatas = [] const metadatas = []
function createFilename(prideflag, text, now = false) {
const adaptedText = text
.replaceAll("⋅", "_")
.replaceAll(" ", "_")
.replaceAll("\n", '-')
.normalize("NFD").replaceAll(/[\u0300-\u036f]/g, "")
.replaceAll("&", "and")
.replaceAll("+", "")
.toLowerCase();
return `${prideflag.name.en.toLowerCase()}-${adaptedText}${now?'-now':''}.png`;
}
function createButton(source, x, y, text, gravity) {
const turnedText = text
.replaceAll("⋅", "-")
.toUpperCase();
return myGm(source)
.font('./NFPixels-Regular.ttf', 10)
.drawText(x-1, y, turnedText, gravity)
.drawText(x+1, y, turnedText, gravity)
.drawText(x, y+1, turnedText, gravity)
.drawText(x, y-1, turnedText, gravity)
.drawText(x-1, y-1, turnedText, gravity)
.drawText(x+1, y+1, turnedText, gravity)
.drawText(x-1, y+1, turnedText, gravity)
.drawText(x+1, y-1, turnedText, gravity)
.fill("#FFFFFF")
.drawText(x, y, turnedText, gravity);
};
function createMetadatas(prideflag, text, now = false) {
const filename = createFilename(prideflag, text, now);
const textForAlt = text.replaceAll("\n", " ").toLowerCase();
const alt = `Drapeau ${prideflag.name.fr.toLowerCase()} avec écrit "${textForAlt}${now?", now!": ""}"`
return {file:filename, alt:alt, text:textForAlt};
}
let count = 0;
let flagCount = 0;
const start = Date.now();
data.forEach(prideflag => { data.forEach(prideflag => {
console.log(`== Creating flags for ${prideflag.name.en}`); console.log(`== Creating flags for ${prideflag.name.en}`);
const imageMetadata = {title:`Drapeau ${prideflag.name.fr.toLowerCase()} :`, list:[]}; const imageMetadata = {title:`Drapeau ${prideflag.name.fr.toLowerCase()} :`, list:[]};
prideflag.texts.forEach(text => { prideflag.texts.forEach(text => {
const outputfile = `${prideflag.name.en.toLowerCase()}-${text.replace("⋅", "_").replace(" ", "_").replace("\n", '-').toLowerCase()}.png` const metadatas = createMetadatas(prideflag, text, false)
console.log(`Creating button for text ${text} (${outputfile})`); imageMetadata.list.push(metadatas);
const data = {file: outputfile, alt:`Drapeau ${prideflag.name.fr.toLowerCase()} avec écrit "${text.replace("\n", " ").toLowerCase()}"`};
imageMetadata.list.push(data); console.log(`Creating button for text "${metadatas.text}" (${metadatas.file})`);
const turnedText = text createButton(prideflag.source, position.x, position.y, text, position.gravity)
.replace("⋅", "-") .write(`./output/${metadatas.file}`, function (err) {
.toUpperCase();
myGm(prideflag.source)
.font('./NFPixels-Regular.ttf', 10)
.drawText(position.x-1, position.y, turnedText, position.gravity)
.drawText(position.x+1, position.y, turnedText, position.gravity)
.drawText(position.x, position.y+1, turnedText, position.gravity)
.drawText(position.x, position.y-1, turnedText, position.gravity)
.drawText(position.x-1, position.y-1, turnedText, position.gravity)
.drawText(position.x+1, position.y+1, turnedText, position.gravity)
.drawText(position.x-1, position.y+1, turnedText, position.gravity)
.drawText(position.x+1, position.y-1, turnedText, position.gravity)
.fill("#FFFFFF")
.drawText(position.x, position.y, turnedText, position.gravity)
.write(`./output/${outputfile}`, function (err) {
if (err) { if (err) {
console.error(err); console.error(err);
throw err; throw err;
}; };
}); });
count++;
}) })
if (prideflag.textsNow) {
prideflag.textsNow.forEach(text => {
const metadatas = createMetadatas(prideflag, text, true)
imageMetadata.list.push(metadatas);
console.log(`Creating button for text "${metadatas.text}" (${metadatas.file})`);
createButton(prideflag.source, position.x+12, position.y, text, position.gravity)
.write(`./tmp/${metadatas.file}`, function (err) {
if (err) {
console.error(err);
throw err;
};
});
setTimeout(() => {
myGm(`./tmp/${metadatas.file}`)
.composite("./sources/now.gif")
.write(`./output/${metadatas.file}`, function (err) {
if (err) {
console.error(err);
throw err;
};
});
}, 100);
count++;
})
}
flagCount++;
metadatas.push(imageMetadata); metadatas.push(imageMetadata);
}); });
console.log(metadatas); const millis = Date.now() - start;
console.log("");
console.log("-----------------------")
console.log(`Generation finished in ${millis / 1000}s`);
console.log(`${flagCount} flags processed`);
console.log(`${count} files generated`);
fs.writeFile("./output/pridebuttons.json", JSON.stringify(metadatas), (err) => { fs.writeFile("./output/pridebuttons.json", JSON.stringify(metadatas), (err) => {
if (err) { if (err) {

BIN
sources/aroace-2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

BIN
sources/aroace.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

BIN
sources/demigender.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

BIN
sources/genderfluid.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

BIN
sources/genderflux.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

BIN
sources/now.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

BIN
sources/polyamour-1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

BIN
sources/polyamour-2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B