Added stylesheets generation for lichess boards

This commit is contained in:
Maciej Caderek
2022-05-03 05:34:39 +02:00
parent 2c5341a6b5
commit 00b6f63b0c
266 changed files with 1942 additions and 470 deletions

View File

@@ -0,0 +1,95 @@
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();