87 lines
2.5 KiB
TypeScript
87 lines
2.5 KiB
TypeScript
import type { AnimationOptions } from "@snk/gif-creator";
|
|
import type { DrawOptions as DrawOptions } from "@snk/svg-creator";
|
|
import { palettes } from "./palettes";
|
|
|
|
export const parseOutputsOption = (lines: string[]) => lines.map(parseEntry);
|
|
|
|
export const parseEntry = (entry: string) => {
|
|
const m = entry.trim().match(/^(.+\.(svg|gif))(\?(.*)|\s*({.*}))?$/);
|
|
|
|
if (!m) return null;
|
|
|
|
const [, filename, format, _, q1, q2] = m;
|
|
|
|
const query = q1 ?? q2;
|
|
|
|
let sp = new URLSearchParams(query || "");
|
|
|
|
try {
|
|
const o = JSON.parse(query);
|
|
|
|
if (Array.isArray(o.color_dots)) o.color_dots = o.color_dots.join(",");
|
|
if (Array.isArray(o.dark_color_dots))
|
|
o.dark_color_dots = o.dark_color_dots.join(",");
|
|
|
|
sp = new URLSearchParams(o);
|
|
} catch (err) {
|
|
if (!(err instanceof SyntaxError)) throw err;
|
|
}
|
|
|
|
const drawOptions: DrawOptions = {
|
|
sizeDotBorderRadius: 2,
|
|
sizeCell: 16,
|
|
sizeDot: 12,
|
|
...palettes["default"],
|
|
dark: palettes["default"].dark && { ...palettes["default"].dark },
|
|
};
|
|
const animationOptions: AnimationOptions = { step: 1, frameDuration: 100 };
|
|
|
|
{
|
|
const palette = palettes[sp.get("palette")!];
|
|
if (palette) {
|
|
Object.assign(drawOptions, palette);
|
|
drawOptions.dark = palette.dark && { ...palette.dark };
|
|
}
|
|
}
|
|
|
|
{
|
|
const dark_palette = palettes[sp.get("dark_palette")!];
|
|
if (dark_palette) {
|
|
const clone = { ...dark_palette, dark: undefined };
|
|
drawOptions.dark = clone;
|
|
}
|
|
}
|
|
|
|
if (sp.has("color_snake")) drawOptions.colorSnake = sp.get("color_snake")!;
|
|
if (sp.has("color_dots")) {
|
|
const colors = sp.get("color_dots")!.split(/[,;]/);
|
|
drawOptions.colorDots = colors;
|
|
drawOptions.colorEmpty = colors[0];
|
|
drawOptions.dark = undefined;
|
|
}
|
|
if (sp.has("color_dot_border"))
|
|
drawOptions.colorDotBorder = sp.get("color_dot_border")!;
|
|
|
|
if (sp.has("dark_color_dots")) {
|
|
const colors = sp.get("dark_color_dots")!.split(/[,;]/);
|
|
drawOptions.dark = {
|
|
colorDotBorder: drawOptions.colorDotBorder,
|
|
colorSnake: drawOptions.colorSnake,
|
|
...drawOptions.dark,
|
|
colorDots: colors,
|
|
colorEmpty: colors[0],
|
|
};
|
|
}
|
|
if (sp.has("dark_color_dot_border") && drawOptions.dark)
|
|
drawOptions.dark.colorDotBorder = sp.get("color_dot_border")!;
|
|
if (sp.has("dark_color_snake") && drawOptions.dark)
|
|
drawOptions.dark.colorSnake = sp.get("color_snake")!;
|
|
|
|
return {
|
|
filename,
|
|
format: format as "svg" | "gif",
|
|
drawOptions,
|
|
animationOptions,
|
|
};
|
|
};
|