From f3126d0f35a8a5eb767e3915b716579941e4a592 Mon Sep 17 00:00:00 2001 From: Belleve Date: Sat, 29 Jun 2024 17:03:59 -1000 Subject: [PATCH] Export multiple atlases for pages (#2401) --- build-plans.toml | 3 + package-lock.json | 80 +++++++++---------- package.json | 2 +- packages/font-glyphs/package.json | 12 +-- packages/font-kits/package.json | 8 +- packages/font-otl/package.json | 6 +- packages/font/package.json | 16 ++-- packages/geometry-cache/package.json | 4 +- packages/geometry/package.json | 4 +- packages/glyph/package.json | 4 +- packages/param/package.json | 4 +- packages/util/package.json | 2 +- tools/amend-readme/package.json | 4 +- tools/data-export/package.json | 4 +- tools/data-export/src/atlas.mjs | 24 ++++++ .../coverage-export/gather-coverage-data.mjs | 34 +++++++- tools/data-export/src/{index.mjs => meta.mjs} | 10 --- tools/data-export/src/supported-languages.mjs | 17 ++-- tools/generate-samples/package.json | 4 +- tools/misc/package.json | 4 +- verdafile.mjs | 68 +++++++++++----- 21 files changed, 193 insertions(+), 121 deletions(-) create mode 100644 tools/data-export/src/atlas.mjs rename tools/data-export/src/{index.mjs => meta.mjs} (64%) diff --git a/build-plans.toml b/build-plans.toml index 8b86dff4f..96d319fd3 100644 --- a/build-plans.toml +++ b/build-plans.toml @@ -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} diff --git a/package-lock.json b/package-lock.json index b42f2f9c6..bcd6a4f07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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" } diff --git a/package.json b/package.json index 5a9d08e69..f636544cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/monorepo", - "version": "30.3.0", + "version": "30.3.1", "workspaces": [ "packages/*", "tools/*" diff --git a/packages/font-glyphs/package.json b/packages/font-glyphs/package.json index 69526f6be..1fce12ca2 100644 --- a/packages/font-glyphs/package.json +++ b/packages/font-glyphs/package.json @@ -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" } } diff --git a/packages/font-kits/package.json b/packages/font-kits/package.json index e668cb4b2..1f8cba42b 100644 --- a/packages/font-kits/package.json +++ b/packages/font-kits/package.json @@ -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" } } diff --git a/packages/font-otl/package.json b/packages/font-otl/package.json index 93e3884dd..bd3ed2f53 100644 --- a/packages/font-otl/package.json +++ b/packages/font-otl/package.json @@ -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" } } diff --git a/packages/font/package.json b/packages/font/package.json index af699b243..79cc17ab0 100644 --- a/packages/font/package.json +++ b/packages/font/package.json @@ -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" diff --git a/packages/geometry-cache/package.json b/packages/geometry-cache/package.json index 15d2a7b39..ec8b9c437 100644 --- a/packages/geometry-cache/package.json +++ b/packages/geometry-cache/package.json @@ -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" } } diff --git a/packages/geometry/package.json b/packages/geometry/package.json index e7110e0e5..70f826c22 100644 --- a/packages/geometry/package.json +++ b/packages/geometry/package.json @@ -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" } diff --git a/packages/glyph/package.json b/packages/glyph/package.json index 8e9c49be3..ed4da1203 100644 --- a/packages/glyph/package.json +++ b/packages/glyph/package.json @@ -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" } } diff --git a/packages/param/package.json b/packages/param/package.json index 1044e5927..13754df05 100644 --- a/packages/param/package.json +++ b/packages/param/package.json @@ -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" } } diff --git a/packages/util/package.json b/packages/util/package.json index be5c74eab..e1dea23c1 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/util", - "version": "30.3.0", + "version": "30.3.1", "private": true, "exports": { ".": "./src/index.mjs", diff --git a/tools/amend-readme/package.json b/tools/amend-readme/package.json index 25e698a45..c4daaf7ea 100644 --- a/tools/amend-readme/package.json +++ b/tools/amend-readme/package.json @@ -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" } } diff --git a/tools/data-export/package.json b/tools/data-export/package.json index f5008d17f..f3203099a 100644 --- a/tools/data-export/package.json +++ b/tools/data-export/package.json @@ -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" } diff --git a/tools/data-export/src/atlas.mjs b/tools/data-export/src/atlas.mjs new file mode 100644 index 000000000..f10665b06 --- /dev/null +++ b/tools/data-export/src/atlas.mjs @@ -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), + ); + } +} diff --git a/tools/data-export/src/coverage-export/gather-coverage-data.mjs b/tools/data-export/src/coverage-export/gather-coverage-data.mjs index a1cac10cd..66eea6381 100644 --- a/tools/data-export/src/coverage-export/gather-coverage-data.mjs +++ b/tools/data-export/src/coverage-export/gather-coverage-data.mjs @@ -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) { diff --git a/tools/data-export/src/index.mjs b/tools/data-export/src/meta.mjs similarity index 64% rename from tools/data-export/src/index.mjs rename to tools/data-export/src/meta.mjs index a829ea6a6..3788e53b9 100644 --- a/tools/data-export/src/index.mjs +++ b/tools/data-export/src/meta.mjs @@ -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), - ); } diff --git a/tools/data-export/src/supported-languages.mjs b/tools/data-export/src/supported-languages.mjs index f8a71e167..4e2760842 100644 --- a/tools/data-export/src/supported-languages.mjs +++ b/tools/data-export/src/supported-languages.mjs @@ -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(), }; } diff --git a/tools/generate-samples/package.json b/tools/generate-samples/package.json index d84cb9dff..bc2cde938 100644 --- a/tools/generate-samples/package.json +++ b/tools/generate-samples/package.json @@ -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" } } diff --git a/tools/misc/package.json b/tools/misc/package.json index 57944050b..c751b62d5 100644 --- a/tools/misc/package.json +++ b/tools/misc/package.json @@ -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" } } diff --git a/verdafile.mjs b/verdafile.mjs index 9a9d7d6e0..f3c868ec3 100644 --- a/verdafile.mjs +++ b/verdafile.mjs @@ -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);