75 lines
2.3 KiB
TypeScript
Executable file
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()}'`);
|
|
}
|