import fs from "fs"; import path from "path"; import { parseVariantsData } from "@iosevka/data-export/variants-data"; import { ImgX, MdCol } from "../md-format-tools.mjs"; import { sampleImageCountEmOfCv } from "./cv-ot.mjs"; export default async function processCherryPickingStyles(argv, dirs) { const variantsData = await parseVariantsData(argv); const md = new MdCol("Section-Cherry-Picking-Styles"); const headerPath = path.resolve(dirs.fragments, "description-cherry-picking-styles.md"); md.log(await fs.promises.readFile(headerPath, "utf-8")); for (const cv of [...variantsData.specials, ...variantsData.primes]) { if (!cv.tag && !cv.isSpecial) continue; const sampleText = cv.descSampleText .map(c => (c === "`" ? "`` ` ``" : `\`${c}\``)) .join(", "); const explainText = cv.samplerExplain ? ` (${cv.samplerExplain})` : ``; const info = { introMD: cv.description || `Styles for ${sampleText + explainText}`, sampleImageCountEm: sampleImageCountEmOfCv(cv), alternatives: [] }; const defaults = figureOutDefaults(variantsData, cv); for (const cvv of cv.variants) { if (!cvv.rank && !cv.isSpecial) continue; if (cv.tag) { info.alternatives.push({ imageId: `${cv.key}-${cvv.key}`, selectors: [`${cv.key} = '${cvv.key}'`, `${cv.tag} = ${cvv.rank}`], description: formatDescription(cvv.description) + formatDefaults(cvv.key, defaults) }); } else { info.alternatives.push({ imageId: `${cv.key}-${cvv.key}`, selectors: [`${cv.key} = '${cvv.key}'`], description: formatDescription(cvv.description) + formatDefaults(cvv.key, defaults) }); } } formatCv(md, dirs, info); } return md; } function formatCv(md, dirs, info) { const INDENT = ` `; md.log(` - ${info.introMD}`); md.log(`${INDENT}
${info.alternatives.length} variants`); const imgWidth = 32 * info.sampleImageCountEm; let sTable = INDENT + "" + "\n"; for (const alt of info.alternatives) { const imageId = `${dirs.images}/cv-${alt.imageId}`; const image = ImgX(imageId, imgWidth); const selectorText = alt.selectors.map(x => `${x}`).join(", "); sTable += INDENT + `` + `\n`; sTable += INDENT + `\n`; } sTable += INDENT + "
${image}${selectorText}
${alt.description}
"; md.log(sTable); } function formatDescription(s) { return s .replace(/`` (\S+?) ``/g, ($0, $1) => `${escapeHtml($1)}`) .replace(/`([^`]+?)`/g, ($0, $1) => `${escapeHtml($1)}`); } function escapeHtml(s) { return s.replace(/&/g, "&").replace(//g, ">"); } function formatDefaults(selector, defaults) { let dcs = [], mask = 0; for (const dc of defaults) { if (dc.result !== selector) continue; dcs.push(dc); mask |= dc.mask; } if (!dcs.length) return ""; if (mask === 0xf) return ` (default)`; if (mask === 0x5) return ` (default for Upright)`; if (mask === 0xa) return ` (default for Italic)`; if (mask === 0x3) return ` (default for Sans)`; if (mask === 0xc) return ` (default for Slab)`; return ` (default for ${dcs.map(x => x.desc).join(", ")})`; } function figureOutDefaults(variantsData, gr) { const defaultConfigs = [ { desc: "Sans Upright", mask: 1, result: null, composition: { ...variantsData.defaults.sans.upright } }, { desc: "Sans Italic", mask: 2, result: null, composition: { ...variantsData.defaults.sans.italic } }, { desc: "Slab Upright", mask: 4, result: null, composition: { ...variantsData.defaults.slab.upright } }, { desc: "Slab Italic", mask: 8, result: null, composition: { ...variantsData.defaults.slab.italic } } ]; for (const variant of gr.variants) { for (const dc of defaultConfigs) { if (variant.key === dc.composition[gr.key]) dc.result = variant.key; } } return defaultConfigs; }