tarot-cartes/gen.ts
2024-02-04 17:30:56 +01:00

75 lines
2.3 KiB
TypeScript
Executable file

#!/bin/env -S deno run -A
const promises = [] as Promise<unknown>[];
const target = Deno.cwd() + "/target";
const in_flight = new Set<string>();
function wait(ms: number): Promise<void> {
return new Promise((res) => setTimeout(() => res(), ms));
}
async function block_while(l: () => boolean) {
while (l()) await wait(100);
}
await Deno.mkdir("target", { recursive: true });
await Deno.remove("target", { recursive: true });
await Deno.mkdir("target");
await Deno.mkdir("target/pdf");
await Deno.mkdir("target/png");
for (const set of ["club", "diamond", "heart", "spade"]) {
for (let i = 1; i <= 14; i += 1) {
const id = `${set}-${i}`;
await block_while(() => (in_flight.size >= 8));
promises.push(
(async () => {
const tmp_path = `/tmp/models-${
Date.now() + Math.floor(Math.random() * 100000)
}`;
await Deno.mkdir(tmp_path + "/base", { recursive: true });
const [html, pdf, png] = [
`${tmp_path}/base/page.html`,
`${target}/pdf/${id}.pdf`,
`${target}/png/${id}.png`,
];
await Deno.writeTextFile(
html,
Deno.readTextFileSync("./models/base/card.html").split("\n").map((
l,
) =>
l.startsWith(" <script> const card = ")
? `<script> const card = { "num": ${i}, "suite": '${set}' }; </script>`
: l
).join("\n"),
);
const script = `
cp -r ./models/* "${tmp_path}"
cd "${tmp_path}/base"
chromium --headless --disable-gpu --run-all-compositor-stages-before-draw --no-pdf-header-footer --print-to-pdf="${pdf}" "${html}"
`;
await Deno.run({ cmd: ["sh", "-c", script] }).status();
await Deno.run({
cmd: [
"convert",
["-density", "900"],
[pdf],
["-quality", "100"],
png,
].flat(),
})
.status();
console.log(`[gen.ts] completed '${id}'`);
in_flight.delete(id);
await Deno.remove(tmp_path, { recursive: true });
})(),
);
in_flight.add(id);
console.log(`[gen.ts] launched '${id}'`);
}
}
await Promise.all(promises);
console.log("[gen.ts] done");
if (in_flight.size > 0) {
console.log(`[gen.ts] failed '${Array.from(in_flight.keys()).join()}'`);
}