115 lines
No EOL
3.8 KiB
JavaScript
115 lines
No EOL
3.8 KiB
JavaScript
import data from './data.json' with { type: "json" };
|
|
import gm from "gm";
|
|
import * as fs from "fs";
|
|
|
|
|
|
const myGm = gm.subClass({imageMagick: true});
|
|
|
|
const position = {x: 4, y: 2, gravity: "NorthEast"}
|
|
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 => {
|
|
console.log(`== Creating flags for ${prideflag.name.en}`);
|
|
const imageMetadata = {title:`Drapeau ${prideflag.name.fr.toLowerCase()} :`, list:[]};
|
|
prideflag.texts.forEach(text => {
|
|
const metadatas = createMetadatas(prideflag, text, false)
|
|
imageMetadata.list.push(metadatas);
|
|
|
|
console.log(`Creating button for text "${metadatas.text}" (${metadatas.file})`);
|
|
createButton(prideflag.source, position.x, position.y, text, position.gravity)
|
|
.write(`./output/${metadatas.file}`, function (err) {
|
|
if (err) {
|
|
console.error(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);
|
|
});
|
|
|
|
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) => {
|
|
if (err) {
|
|
console.error(err);
|
|
throw err;
|
|
}
|
|
}); |