Export multiple atlases for pages (#2401)

This commit is contained in:
Belleve 2024-06-29 17:03:59 -10:00 committed by GitHub
parent 65a9419355
commit f3126d0f35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 193 additions and 121 deletions

View file

@ -30,6 +30,7 @@ exportGlyphNames = true
[buildPlans.IosevkaSlab]
family = "Iosevka Slab"
desc = "Slab-serif"
buildCharMap = true
serifs = "slab"
snapshotFamily = 'Iosevka Slab'
snapshotFeature = {"NWID" = 0}
@ -677,6 +678,7 @@ inherits = "ss18"
family = "Iosevka Aile"
desc = "Sans-serif"
spacing = "quasi-proportional"
buildCharMap = true
snapshotFamily = 'Iosevka Aile'
snapshotFeature = {"NWID" = 0}
exportGlyphNames = true
@ -761,6 +763,7 @@ css = "normal"
family = "Iosevka Etoile"
desc = "Slab-serif"
spacing = "quasi-proportional"
buildCharMap = true
serifs = 'slab'
snapshotFamily = 'Iosevka Etoile'
snapshotFeature = {"NWID" = 0}

80
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "@iosevka/monorepo",
"version": "30.3.0",
"version": "30.3.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@iosevka/monorepo",
"version": "30.3.0",
"version": "30.3.1",
"workspaces": [
"packages/*",
"tools/*"
@ -4310,16 +4310,16 @@
},
"packages/font": {
"name": "@iosevka/font",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iarna/toml": "^2.2.5",
"@iosevka/font-glyphs": "30.3.0",
"@iosevka/font-otl": "30.3.0",
"@iosevka/geometry": "30.3.0",
"@iosevka/geometry-cache": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/param": "30.3.0",
"@iosevka/util": "30.3.0",
"@iosevka/font-glyphs": "30.3.1",
"@iosevka/font-otl": "30.3.1",
"@iosevka/geometry": "30.3.1",
"@iosevka/geometry-cache": "30.3.1",
"@iosevka/glyph": "30.3.1",
"@iosevka/param": "30.3.1",
"@iosevka/util": "30.3.1",
"harfbuzzjs": "^0.3.4",
"ot-builder": "^1.7.3",
"semver": "^7.6.0"
@ -4327,100 +4327,100 @@
},
"packages/font-glyphs": {
"name": "@iosevka/font-glyphs",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/font-kits": "30.3.0",
"@iosevka/geometry": "30.3.0",
"@iosevka/geometry-cache": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/util": "30.3.0",
"@iosevka/font-kits": "30.3.1",
"@iosevka/geometry": "30.3.1",
"@iosevka/geometry-cache": "30.3.1",
"@iosevka/glyph": "30.3.1",
"@iosevka/util": "30.3.1",
"typo-geom": "^0.15.1"
}
},
"packages/font-kits": {
"name": "@iosevka/font-kits",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/geometry": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/util": "30.3.0"
"@iosevka/geometry": "30.3.1",
"@iosevka/glyph": "30.3.1",
"@iosevka/util": "30.3.1"
}
},
"packages/font-otl": {
"name": "@iosevka/font-otl",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/font-glyphs": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/font-glyphs": "30.3.1",
"@iosevka/glyph": "30.3.1",
"toposort": "^2.0.2"
}
},
"packages/geometry": {
"name": "@iosevka/geometry",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/util": "30.3.0",
"@iosevka/util": "30.3.1",
"spiro": "^3.0.1",
"typo-geom": "^0.15.1"
}
},
"packages/geometry-cache": {
"name": "@iosevka/geometry-cache",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/geometry": "30.3.0",
"@iosevka/geometry": "30.3.1",
"@msgpack/msgpack": "^2.8.0"
}
},
"packages/glyph": {
"name": "@iosevka/glyph",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/geometry": "30.3.0"
"@iosevka/geometry": "30.3.1"
}
},
"packages/param": {
"name": "@iosevka/param",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/util": "30.3.0"
"@iosevka/util": "30.3.1"
}
},
"packages/util": {
"name": "@iosevka/util",
"version": "30.3.0"
"version": "30.3.1"
},
"tools/amend-readme": {
"name": "@iosevka/amend-readme",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iarna/toml": "^2.2.5",
"@iosevka/param": "30.3.0",
"@iosevka/param": "30.3.1",
"@unicode/unicode-15.1.0": "^1.5.2"
}
},
"tools/data-export": {
"name": "@iosevka/data-export",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iarna/toml": "^2.2.5",
"@iosevka/param": "30.3.0",
"@iosevka/param": "30.3.1",
"@unicode/unicode-15.1.0": "^1.5.2",
"cldr": "^7.5.0"
}
},
"tools/generate-samples": {
"name": "@iosevka/generate-samples",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/data-export": "30.3.0"
"@iosevka/data-export": "30.3.1"
}
},
"tools/misc": {
"name": "@iosevka/misc",
"version": "30.3.0",
"version": "30.3.1",
"dependencies": {
"@iosevka/util": "30.3.0",
"@iosevka/util": "30.3.1",
"semver": "^7.6.0",
"wawoff2": "^2.0.1"
}

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/monorepo",
"version": "30.3.0",
"version": "30.3.1",
"workspaces": [
"packages/*",
"tools/*"

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/font-glyphs",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs",
@ -8,11 +8,11 @@
"./unicode-knowledge": "./src/meta/unicode-knowledge.mjs"
},
"dependencies": {
"@iosevka/font-kits": "30.3.0",
"@iosevka/geometry": "30.3.0",
"@iosevka/geometry-cache": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/util": "30.3.0",
"@iosevka/font-kits": "30.3.1",
"@iosevka/geometry": "30.3.1",
"@iosevka/geometry-cache": "30.3.1",
"@iosevka/glyph": "30.3.1",
"@iosevka/util": "30.3.1",
"typo-geom": "^0.15.1"
}
}

View file

@ -1,14 +1,14 @@
{
"name": "@iosevka/font-kits",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
"./boole-kit": "./src/boole-kit.mjs",
"./spiro-kit": "./src/spiro-kit.mjs"
},
"dependencies": {
"@iosevka/geometry": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/util": "30.3.0"
"@iosevka/geometry": "30.3.1",
"@iosevka/glyph": "30.3.1",
"@iosevka/util": "30.3.1"
}
}

View file

@ -1,13 +1,13 @@
{
"name": "@iosevka/font-otl",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs"
},
"dependencies": {
"@iosevka/font-glyphs": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/font-glyphs": "30.3.1",
"@iosevka/glyph": "30.3.1",
"toposort": "^2.0.2"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/font",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs",
@ -10,13 +10,13 @@
},
"dependencies": {
"@iarna/toml": "^2.2.5",
"@iosevka/font-glyphs": "30.3.0",
"@iosevka/font-otl": "30.3.0",
"@iosevka/geometry": "30.3.0",
"@iosevka/geometry-cache": "30.3.0",
"@iosevka/glyph": "30.3.0",
"@iosevka/param": "30.3.0",
"@iosevka/util": "30.3.0",
"@iosevka/font-glyphs": "30.3.1",
"@iosevka/font-otl": "30.3.1",
"@iosevka/geometry": "30.3.1",
"@iosevka/geometry-cache": "30.3.1",
"@iosevka/glyph": "30.3.1",
"@iosevka/param": "30.3.1",
"@iosevka/util": "30.3.1",
"harfbuzzjs": "^0.3.4",
"ot-builder": "^1.7.3",
"semver": "^7.6.0"

View file

@ -1,12 +1,12 @@
{
"name": "@iosevka/geometry-cache",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs"
},
"dependencies": {
"@iosevka/geometry": "30.3.0",
"@iosevka/geometry": "30.3.1",
"@msgpack/msgpack": "^2.8.0"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/geometry",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs",
@ -13,7 +13,7 @@
"./spiro-control": "./src/spiro-control.mjs"
},
"dependencies": {
"@iosevka/util": "30.3.0",
"@iosevka/util": "30.3.1",
"spiro": "^3.0.1",
"typo-geom": "^0.15.1"
}

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/glyph",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/glyph.mjs",
@ -9,6 +9,6 @@
"./relation": "./src/relation.mjs"
},
"dependencies": {
"@iosevka/geometry": "30.3.0"
"@iosevka/geometry": "30.3.1"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/param",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs",
@ -9,6 +9,6 @@
"./metric-override": "./src/metric-override.mjs"
},
"dependencies": {
"@iosevka/util": "30.3.0"
"@iosevka/util": "30.3.1"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/util",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs",

View file

@ -1,13 +1,13 @@
{
"name": "@iosevka/amend-readme",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs"
},
"dependencies": {
"@iarna/toml": "^2.2.5",
"@iosevka/param": "30.3.0",
"@iosevka/param": "30.3.1",
"@unicode/unicode-15.1.0": "^1.5.2"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@iosevka/data-export",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs",
@ -10,7 +10,7 @@
},
"dependencies": {
"@iarna/toml": "^2.2.5",
"@iosevka/param": "30.3.0",
"@iosevka/param": "30.3.1",
"@unicode/unicode-15.1.0": "^1.5.2",
"cldr": "^7.5.0"
}

View file

@ -0,0 +1,24 @@
import fs from "fs";
import { getCharMapAndSupportedLanguageList } from "./supported-languages.mjs";
export default main;
async function main(argv) {
const cl = await getCharMapAndSupportedLanguageList(
argv.charMapPath,
argv.charMapItalicPath,
argv.charMapObliquePath,
);
if (argv.outputShared) {
await fs.promises.writeFile(argv.outputShared, JSON.stringify(cl.shared, null, 2));
}
{
delete cl.udatMap;
await fs.promises.writeFile(
argv.output,
JSON.stringify({ version: argv.version, ...cl.unique }, null, 2),
);
}
}

View file

@ -25,6 +25,8 @@ export async function gatherCoverageData(covUpright, covItalic, covOblique) {
const lookup = await createCharDataLookup();
const udatMap = [];
for (const [[lchBlockStart, lchBlockEnd], block] of await collectBlockData()) {
let blockResults = [];
const [lchStart, lchEnd] = findFirstLastChar(lchBlockStart, lchBlockEnd, covUpright);
@ -35,7 +37,7 @@ export async function gatherCoverageData(covUpright, covItalic, covOblique) {
const cdItalic = covItalic.get(lch);
const cdOblique = covOblique.get(lch);
if (cdUpright && cdItalic && cdOblique) {
const [glyphName, typoFs, uprightFs, charProps] = cdUpright;
const [, typoFs, uprightFs, charProps] = cdUpright;
const [, , italicFs] = cdItalic;
const [, , obliqueFs] = cdOblique;
@ -44,7 +46,6 @@ export async function gatherCoverageData(covUpright, covItalic, covOblique) {
gc,
charName,
inFont: true,
glyphName: glyphName,
...charProps,
...putFeatSeries(featureSeriesStore, "typographicFeatureSets", typoFs),
...putFeatSeries(featureSeriesStore, "cvFeatureSetsUpright", uprightFs),
@ -55,10 +56,11 @@ export async function gatherCoverageData(covUpright, covItalic, covOblique) {
blockResults.push({ lch, gc, charName, inFont: false, glyphName: undefined });
}
}
if (blockResults.length) {
unicodeCoverage.push({
name: block,
characters: blockResults.sort((a, b) => a.lch - b.lch),
...cleanupBlockResultsForExport(blockResults, udatMap),
});
}
}
@ -69,7 +71,31 @@ export async function gatherCoverageData(covUpright, covItalic, covOblique) {
featureSeries[id] = x;
}
return { unicodeCoverage, featureSeries };
return { unicodeCoverage, featureSeries, udatMap };
}
function cleanupBlockResultsForExport(br, udatMap) {
br.sort((a, b) => a.lch - b.lch);
let result = [];
let lchMin = 0xffffff;
let lchMax = 0;
for (const ch of br) {
let ch1 = { ...ch };
if (ch1.lch < lchMin) lchMin = ch1.lch;
if (ch1.lch > lchMax) lchMax = ch1.lch;
udatMap.push([ch1.lch, ch1.gc, ch1.charName]);
delete ch1.gc;
delete ch1.charName;
result.push(ch1);
}
return {
lchMin,
lchMax,
characters: result,
};
}
function putFeatSeries(store, k, featSeriesList) {

View file

@ -1,18 +1,12 @@
import fs from "fs";
import { parseLigationData } from "./ligation-data.mjs";
import { getCharMapAndSupportedLanguageList } from "./supported-languages.mjs";
import { parseVariantsData } from "./variants-data.mjs";
export default main;
async function main(argv) {
const variantsData = await parseVariantsData(argv);
const ligationData = await parseLigationData(argv);
const cl = await getCharMapAndSupportedLanguageList(
argv.charMapPath,
argv.charMapItalicPath,
argv.charMapObliquePath,
);
await fs.promises.writeFile(
argv.exportPathMeta,
JSON.stringify(
@ -29,8 +23,4 @@ async function main(argv) {
2,
),
);
await fs.promises.writeFile(
argv.exportPathCov,
JSON.stringify({ version: argv.version, ...cl }, null, 2),
);
}

View file

@ -97,12 +97,17 @@ export async function getCharMapAndSupportedLanguageList(cmpUpright, cmpItalic,
const covData = await gatherCoverageData(rawCoverage, rawCoverageItalic, rawCoverageOblique);
return {
stats: {
glyphCount: charMap.length,
codePointCount: rawCoverage.size,
unique: {
featureSeries: covData.featureSeries,
unicodeCoverage: covData.unicodeCoverage,
},
shared: {
stats: {
glyphCount: charMap.length,
codePointCount: rawCoverage.size,
},
udatMap: covData.udatMap,
languages: Array.from(getSupportedLanguageSet(rawCoverage)).sort(),
},
featureSeries: covData.featureSeries,
unicodeCoverage: covData.unicodeCoverage,
languages: Array.from(getSupportedLanguageSet(rawCoverage)).sort(),
};
}

View file

@ -1,11 +1,11 @@
{
"name": "@iosevka/generate-samples",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"exports": {
".": "./src/index.mjs"
},
"dependencies": {
"@iosevka/data-export": "30.3.0"
"@iosevka/data-export": "30.3.1"
}
}

View file

@ -1,10 +1,10 @@
{
"name": "@iosevka/misc",
"version": "30.3.0",
"version": "30.3.1",
"private": true,
"dependencies": {
"semver": "^7.6.0",
"wawoff2": "^2.0.1",
"@iosevka/util": "30.3.0"
"@iosevka/util": "30.3.1"
}
}

View file

@ -952,6 +952,11 @@ async function CreateGroupArchiveFile(dir, out, ...files) {
const Pages = task(`pages`, async t => {
await t.need(
PagesDataExport,
PagesFontVersionSync,
PagesAtlasExport(`Iosevka`),
PagesAtlasExport(`IosevkaSlab`),
PagesAtlasExport(`IosevkaAile`),
PagesAtlasExport(`IosevkaEtoile`),
PagesFontExport`Iosevka`,
PagesFontExport`IosevkaSlab`,
PagesFontExport`IosevkaAile`,
@ -969,28 +974,9 @@ const PagesDir = oracle(`pages-dir-path`, async t => {
return rp.buildOptions.__pagesDir;
});
const PagesDataExport = task(`pages:data-export`, async t => {
const PagesFontVersionSync = task(`pages:font-version-sync`, async t => {
const [version] = await t.need(Version);
const [pagesDir] = await t.need(PagesDir, Version, Parameters, UtilScripts);
const [cm, cmi, cmo] = await t.need(
BuildCM("Iosevka", "Iosevka-Regular"),
BuildCM("Iosevka", "Iosevka-Italic"),
BuildCM("Iosevka", "Iosevka-Oblique"),
);
await node(`tools/generate-samples/src/tokenized-sample-code.mjs`, {
output: Path.resolve(pagesDir, "shared/tokenized-sample-code/alphabet.txt.json"),
});
await node(`tools/data-export/src/index.mjs`, {
version,
paramsDir: Path.resolve("params"),
charMapPath: cm.full,
charMapItalicPath: cmi.full,
charMapObliquePath: cmo.full,
exportPathMeta: Path.resolve(pagesDir, "shared/data-import/raw/metadata.json"),
exportPathCov: Path.resolve(pagesDir, "shared/data-import/raw/coverage.json"),
});
// Update packages.json version
const [pagesDir] = await t.need(PagesDir);
const packageJson = JSON.parse(
await FS.promises.readFile(Path.resolve(pagesDir, "package.json"), "utf-8"),
);
@ -1001,6 +987,40 @@ const PagesDataExport = task(`pages:data-export`, async t => {
);
});
const PagesDataExport = task(`pages:data-export`, async t => {
const [version] = await t.need(Version);
const [pagesDir] = await t.need(PagesDir, Parameters, UtilScripts);
await node(`tools/generate-samples/src/tokenized-sample-code.mjs`, {
output: Path.resolve(pagesDir, "shared/tokenized-sample-code/alphabet.txt.json"),
});
await node(`tools/data-export/src/meta.mjs`, {
version,
paramsDir: Path.resolve("params"),
exportPathMeta: Path.resolve(pagesDir, "shared/data-import/raw/metadata.json"),
});
});
const PagesAtlasExport = task.group(`pages:atlas-export`, async (t, gr) => {
const [version] = await t.need(Version);
const [pagesDir] = await t.need(PagesDir, Parameters, UtilScripts);
const [cm, cmi, cmo] = await t.need(
BuildCM(gr, `${gr}-Regular`),
BuildCM(gr, `${gr}-Italic`),
BuildCM(gr, `${gr}-Oblique`),
);
await node(`tools/data-export/src/atlas.mjs`, {
version,
charMapPath: cm.full,
charMapItalicPath: cmi.full,
charMapObliquePath: cmo.full,
outputShared:
gr === "Iosevka"
? Path.resolve(pagesDir, "shared/data-import/raw/atlas-shared.json")
: null,
output: Path.resolve(pagesDir, `shared/data-import/raw/atlas-${gr}.json`),
});
});
const PagesFontExport = task.group(`pages:font-export`, async (target, gr) => {
target.is.volatile();
const [pagesDir] = await target.need(PagesDir);
@ -1012,8 +1032,12 @@ const PagesFontExport = task.group(`pages:font-export`, async (target, gr) => {
await rm(Path.resolve(outDir, "TTF"));
});
const PagesFastFontExport = task.group(`pages:fast-font-export`, async (target, gr) => {
const PagesFastFont = task.group(`pages:ff`, async (t, gr) => {
await t.need(PagesDataExport, PagesAtlasExport(gr), PagesFastFontExportImpl(gr));
});
const PagesFastFontExportImpl = task.group(`pages:fast-font-export-impl`, async (target, gr) => {
target.is.volatile();
const [pagesDir] = await target.need(PagesDir);
if (!pagesDir) return;
const outDir = Path.resolve(pagesDir, "shared/fonts/imports", gr);