More cleanup

This commit is contained in:
be5invis 2022-07-17 01:02:50 -07:00
parent 4a418cd473
commit 5d39aae19d
4 changed files with 109 additions and 99 deletions

View file

@ -260,7 +260,8 @@ const ApplePostNames = new Map([
[0x111, "dcroat"] [0x111, "dcroat"]
/* spell-checker: enable */ /* spell-checker: enable */
]); ]);
function byCode(gSrc, primaryUnicode, conflictSet) {
export function byCode(gSrc, primaryUnicode, conflictSet) {
if (gSrc.glyphRank === 9999) return ".notdef"; if (gSrc.glyphRank === 9999) return ".notdef";
if (gSrc.glyphRank === 9998) return ".null"; if (gSrc.glyphRank === 9998) return ".null";
let preferredName = null; let preferredName = null;
@ -276,14 +277,16 @@ function byCode(gSrc, primaryUnicode, conflictSet) {
function formatCodePointHex(u) { function formatCodePointHex(u) {
return u.toString(16).padStart(4, "0").toUpperCase(); return u.toString(16).padStart(4, "0").toUpperCase();
} }
function bySpacing(gSrcBase, gOtBase, internalNameMap, conflictSet) {
export function bySpacing(gSrcBase, gOtBase, internalNameMap, conflictSet) {
if (!gOtBase.name) return 0; if (!gOtBase.name) return 0;
let n = 0; let n = 0;
n += nameByPairGr(Nwid, Wwid, "NWID", "WWID", gSrcBase, gOtBase, internalNameMap, conflictSet); n += nameByPairGr(Nwid, Wwid, "NWID", "WWID", gSrcBase, gOtBase, internalNameMap, conflictSet);
n += nameByPairGr(Wwid, Nwid, "WWID", "NWID", gSrcBase, gOtBase, internalNameMap, conflictSet); n += nameByPairGr(Wwid, Nwid, "WWID", "NWID", gSrcBase, gOtBase, internalNameMap, conflictSet);
return n; return n;
} }
function byGr(gSrcBase, gOtBase, internalNameMap, conflictSet) {
export function byGr(gSrcBase, gOtBase, internalNameMap, conflictSet) {
if (!gOtBase.name) return 0; if (!gOtBase.name) return 0;
let n = 0; let n = 0;
for (const cv of AnyCv.query(gSrcBase)) { for (const cv of AnyCv.query(gSrcBase)) {
@ -323,12 +326,9 @@ function nameByGr(gr, gSrcBase, gOtBase, internalNameMap, conflictSet) {
} }
return 0; return 0;
} }
function byBuildOrder(rank, gSrc, gnOrig) {
export function byBuildOrder(rank, gSrc, gnOrig) {
if (!gnOrig) gnOrig = `.g${rank}`; if (!gnOrig) gnOrig = `.g${rank}`;
gnOrig = Joining.amendOtName(gnOrig, Joining.get(gSrc)); gnOrig = Joining.amendOtName(gnOrig, Joining.get(gSrc));
return gnOrig; return gnOrig;
} }
export { byCode };
export { bySpacing };
export { byGr };
export { byBuildOrder };

View file

@ -1,5 +1,97 @@
import { Ot } from "ot-builder"; import { Ot } from "ot-builder";
export function convertGsub(table, glyphs) {
ConvertGsubGposImpl(GsubHandlers, Ot.Gsub.Table, table, glyphs);
}
export function convertGpos(table, glyphs) {
ConvertGsubGposImpl(GposHandlers, Ot.Gpos.Table, table, glyphs);
}
export function convertGdef(otdGdef, glyphs) {
const gdef = new Ot.Gdef.Table();
gdef.glyphClassDef = new Map();
for (const gn in otdGdef.glyphClassDef) {
const g = glyphs.queryByName(gn);
if (g) gdef.glyphClassDef.set(g, otdGdef.glyphClassDef[gn]);
}
return gdef;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
function ConvertGsubGposImpl(handlers, T, table, glyphs) {
if (!table) return null;
const ls = new LookupStore(handlers, glyphs);
if (table.lookups) {
if (table.lookupOrder) {
for (const l of table.lookupOrder) ls.declare(l, table.lookups[l]);
}
for (const l in table.lookups) ls.declare(l, table.lookups[l]);
for (const l in table.lookups) ls.fill(l, table.lookups[l]);
}
const fs = new FeatureStore(ls);
if (table.features) {
for (const f in table.features) fs.fill(f, table.features[f]);
}
const ss = new ScriptLanguageStore(fs);
if (table.languages) {
for (const sl in table.languages) ss.fill(sl, table.languages[sl]);
}
return new T(ss.extract(), fs.extract(), ls.extract());
}
class ScriptLanguageStore {
constructor(features) {
this.featureStore = features;
this.m_scriptMapping = new Map();
}
extract() {
return this.m_scriptMapping;
}
fill(id, data) {
const scriptTag = id.slice(0, 4);
const languageTag = id.slice(5, 9).padEnd(4);
let sr = this.m_scriptMapping.get(scriptTag);
if (!sr) {
sr = { defaultLanguage: null, languages: new Map() };
this.m_scriptMapping.set(scriptTag, sr);
}
const lr = this.createLanguageRecord(data);
if (languageTag === "dflt" || languageTag === "DFLT") sr.defaultLanguage = lr;
else sr.languages.set(languageTag, lr);
}
createLanguageRecord(data) {
const features = [];
for (const fid of data.features) {
const feature = this.featureStore.query(fid);
if (feature) features.push(feature);
}
return {
requiredFeature: this.featureStore.query(data.requiredFeature) || null,
features: features
};
}
}
class FeatureStore {
constructor(lookups) {
this.lookupStore = lookups;
this.m_mapping = new Map();
}
extract() {
return Array.from(this.m_mapping.values());
}
query(id) {
return this.m_mapping.get(id);
}
fill(id, data) {
const tag = id.slice(0, 4);
const lookups = [];
for (const lid of data) {
const lookup = this.lookupStore.query(lid);
if (lookup) lookups.push(lookup);
}
this.m_mapping.set(id, { tag, lookups });
}
}
class LookupStore { class LookupStore {
constructor(handlers, glyphs) { constructor(handlers, glyphs) {
this.glyphs = glyphs; this.glyphs = glyphs;
@ -26,6 +118,9 @@ class LookupStore {
handler.fill(dst, otdLookup, this); handler.fill(dst, otdLookup, this);
} }
} }
///////////////////////////////////////////////////////////////////////////////////////////////////
const GsubSingleHandler = { const GsubSingleHandler = {
init() { init() {
return new Ot.Gsub.Single(); return new Ot.Gsub.Single();
@ -133,6 +228,7 @@ const GsubReverseHandler = {
} }
} }
}; };
function mapGlyphListAll(gl, store) { function mapGlyphListAll(gl, store) {
const out = []; const out = [];
for (const item of gl) { for (const item of gl) {
@ -160,6 +256,9 @@ const GsubHandlers = {
gsub_chaining: GsubChainingHandler, gsub_chaining: GsubChainingHandler,
gsub_reverse: GsubReverseHandler gsub_reverse: GsubReverseHandler
}; };
///////////////////////////////////////////////////////////////////////////////////////////////////
const GposMarkToBaseHandler = { const GposMarkToBaseHandler = {
init() { init() {
return new Ot.Gpos.MarkToBase(); return new Ot.Gpos.MarkToBase();
@ -222,90 +321,3 @@ const GposHandlers = {
gpos_mark_to_base: GposMarkToBaseHandler, gpos_mark_to_base: GposMarkToBaseHandler,
gpos_mark_to_mark: GposMarkToMarkHandler gpos_mark_to_mark: GposMarkToMarkHandler
}; };
class FeatureStore {
constructor(lookups) {
this.lookupStore = lookups;
this.m_mapping = new Map();
}
extract() {
return Array.from(this.m_mapping.values());
}
query(id) {
return this.m_mapping.get(id);
}
fill(id, data) {
const tag = id.slice(0, 4);
const lookups = [];
for (const lid of data) {
const lookup = this.lookupStore.query(lid);
if (lookup) lookups.push(lookup);
}
this.m_mapping.set(id, { tag, lookups });
}
}
class ScriptLanguageStore {
constructor(features) {
this.featureStore = features;
this.m_scriptMapping = new Map();
}
extract() {
return this.m_scriptMapping;
}
fill(id, data) {
const scriptTag = id.slice(0, 4);
const languageTag = id.slice(5, 9).padEnd(4);
let sr = this.m_scriptMapping.get(scriptTag);
if (!sr) {
sr = { defaultLanguage: null, languages: new Map() };
this.m_scriptMapping.set(scriptTag, sr);
}
const lr = this.createLanguageRecord(data);
if (languageTag === "dflt" || languageTag === "DFLT") sr.defaultLanguage = lr;
else sr.languages.set(languageTag, lr);
}
createLanguageRecord(data) {
const features = [];
for (const fid of data.features) {
const feature = this.featureStore.query(fid);
if (feature) features.push(feature);
}
return {
requiredFeature: this.featureStore.query(data.requiredFeature) || null,
features: features
};
}
}
function ConvertGsubGposT(handlers, T) {
return function (table, glyphs) {
if (!table) return null;
const ls = new LookupStore(handlers, glyphs);
if (table.lookups) {
if (table.lookupOrder) {
for (const l of table.lookupOrder) ls.declare(l, table.lookups[l]);
}
for (const l in table.lookups) ls.declare(l, table.lookups[l]);
for (const l in table.lookups) ls.fill(l, table.lookups[l]);
}
const fs = new FeatureStore(ls);
if (table.features) {
for (const f in table.features) fs.fill(f, table.features[f]);
}
const ss = new ScriptLanguageStore(fs);
if (table.languages) {
for (const sl in table.languages) ss.fill(sl, table.languages[sl]);
}
return new T(ss.extract(), fs.extract(), ls.extract());
};
}
function convertGdef(otdGdef, glyphs) {
const gdef = new Ot.Gdef.Table();
gdef.glyphClassDef = new Map();
for (const gn in otdGdef.glyphClassDef) {
const g = glyphs.queryByName(gn);
if (g) gdef.glyphClassDef.set(g, otdGdef.glyphClassDef[gn]);
}
return gdef;
}
export const convertGsub = ConvertGsubGposT(GsubHandlers, Ot.Gsub.Table);
export const convertGpos = ConvertGsubGposT(GposHandlers, Ot.Gpos.Table);
export { convertGdef };

View file

@ -1,6 +1,6 @@
import { mix } from "../utils.mjs"; import { mix } from "../utils.mjs";
class Box { export class Box {
constructor(t, b, l, r) { constructor(t, b, l, r) {
this.top = t; this.top = t;
this.bottom = this.bot = b; this.bottom = this.bot = b;
@ -40,4 +40,3 @@ class Box {
return mix(this.bottom, this.top, t); return mix(this.bottom, this.top, t);
} }
} }
export { Box };

View file

@ -1,4 +1,4 @@
class Output { export class Output {
constructor() { constructor() {
this.buffer = ""; this.buffer = "";
} }
@ -6,4 +6,3 @@ class Output {
this.buffer += s.join("") + "\n"; this.buffer += s.join("") + "\n";
} }
} }
export { Output };