96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { PieceType, PieceColor } from "../src/types";
|
|
import fs from "fs";
|
|
import pieces from "./utils/pieces";
|
|
import encode from "./utils/encode";
|
|
|
|
const PIECES_FOLDER = "public/pieces";
|
|
const OUT_DIR = "public/stylus/pieces";
|
|
|
|
type CSSEntry = (key: string, dataURL: string, forceStyle?: boolean) => string;
|
|
type Header = (netName: string, entries: string[]) => string;
|
|
|
|
const LichessCSSEntry: CSSEntry = (key, dataURL, forceStyle = true) => {
|
|
const [piece, color] = key.split("") as [PieceType, PieceColor];
|
|
|
|
return `.is2d .${pieces.names[piece]}.${
|
|
pieces.colors[color]
|
|
} {background-image:url('${dataURL}')${forceStyle ? " !important" : ""}}`;
|
|
};
|
|
|
|
const ChesscomCSSEntry: CSSEntry = (key, dataURL, forceStyle = true) => {
|
|
const [piece, color] = key.split("") as [PieceType, PieceColor];
|
|
const selector = `${color}${piece}`;
|
|
|
|
return `.piece.${selector}, .promotion-piece.${selector} {background-image:url('${dataURL}')${
|
|
forceStyle ? " !important" : ""
|
|
}}`;
|
|
};
|
|
|
|
const LichessHeader: Header = (setName, entries) => {
|
|
return `
|
|
/* ==UserStyle==
|
|
@name Lichess ${setName} chess set
|
|
@namespace lichess.org
|
|
@version 1.0.0
|
|
@description Chess set for lichess.org
|
|
@author sharechess.github.io
|
|
==/UserStyle== */
|
|
|
|
@-moz-document domain("lichess.org") {
|
|
${entries.join("\n")}
|
|
}
|
|
`;
|
|
};
|
|
|
|
const ChesscomHeader: Header = (setName, entries) => {
|
|
return `
|
|
/* ==UserStyle==
|
|
@name Chess.com ${setName} chess set
|
|
@namespace chess.com
|
|
@version 1.0.0
|
|
@description Chess set for chess.com
|
|
@author sharechess.github.io
|
|
==/UserStyle== */
|
|
|
|
@-moz-document domain("chess.com") {
|
|
${entries.join("\n")}
|
|
}
|
|
`;
|
|
};
|
|
|
|
const createUserStyles = () => {
|
|
if (!fs.existsSync(OUT_DIR)) {
|
|
fs.mkdirSync(OUT_DIR, { recursive: true });
|
|
}
|
|
|
|
const sets = fs.readdirSync(PIECES_FOLDER);
|
|
|
|
for (const setName of sets) {
|
|
const files = fs.readdirSync(`${PIECES_FOLDER}/${setName}`);
|
|
|
|
const setNamePretty = setName
|
|
.split(/[-_]/)
|
|
.map((chunk) => chunk[0].toUpperCase() + chunk.substring(1))
|
|
.join(" ");
|
|
|
|
const entriesLichess = [];
|
|
const entriesChesscom = [];
|
|
|
|
for (const fileName of files) {
|
|
const key = fileName.split(".")[0];
|
|
const dataURL = encode(`${PIECES_FOLDER}/${setName}/${fileName}`);
|
|
|
|
entriesLichess.push(LichessCSSEntry(key, dataURL));
|
|
entriesChesscom.push(ChesscomCSSEntry(key, dataURL));
|
|
}
|
|
|
|
const cssLichess = LichessHeader(setNamePretty, entriesLichess);
|
|
const cssChesscom = ChesscomHeader(setNamePretty, entriesChesscom);
|
|
|
|
fs.writeFileSync(`${OUT_DIR}/${setName}_lichess.user.css`, cssLichess);
|
|
fs.writeFileSync(`${OUT_DIR}/${setName}_chesscom.user.css`, cssChesscom);
|
|
}
|
|
};
|
|
|
|
createUserStyles();
|