Skip to content

Commit eccb8a0

Browse files
authored
Merge pull request #1062 from mathjax/extension-smp-update
Add ability for extensions to set the SMP mappings for new variants
2 parents f798364 + da43002 commit eccb8a0

File tree

1 file changed

+27
-21
lines changed

1 file changed

+27
-21
lines changed

ts/output/common/FontData.ts

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ export type SmpMap = {
184184
* Data for Math Alphanumeric conversion: starting positions for
185185
* [Alpha, alpha, Greek, greek, Numbers]
186186
*/
187-
export type SmpData = [number, number, number?, number?, number?];
187+
export type SmpData = [number, number, number?, number?, number?, {[n: number]: number}?];
188188

189189

190190
/****************************************************************************/
@@ -317,6 +317,7 @@ export interface FontExtensionData<C extends CharOptions, D extends DelimiterDat
317317
name: string;
318318
options?: OptionList;
319319
variants?: string[][] | {'[+]'?: string[][], '[-]'?: string[][]};
320+
variantSmp?: {[name: string]: SmpData | string};
320321
cssFonts?: CssFontMap;
321322
accentMap?: RemapMap;
322323
moMap?: RemapMap;
@@ -439,8 +440,8 @@ export class FontData<C extends CharOptions, V extends VariantData<C>, D extends
439440
* Variant locations in the Math Alphabnumerics block:
440441
* [upper-alpha, lower-alpha, upper-Greek, lower-Greek, numbers]
441442
*/
442-
public static VariantSmp: {[name: string]: SmpData} = {
443-
bold: [0x1D400, 0x1D41A, 0x1D6A8, 0x1D6C2, 0x1D7CE],
443+
public static VariantSmp: {[name: string]: SmpData | string} = {
444+
bold: [0x1D400, 0x1D41A, 0x1D6A8, 0x1D6C2, 0x1D7CE, {0x3DC: 0x1D7CA, 0x3DD: 0x1D7CB}],
444445
italic: [0x1D434, 0x1D44E, 0x1D6E2, 0x1D6FC],
445446
'bold-italic': [0x1D468, 0x1D482, 0x1D71C, 0x1D736],
446447
script: [0x1D49C, 0x1D4B6],
@@ -797,6 +798,7 @@ export class FontData<C extends CharOptions, V extends VariantData<C>, D extends
797798
for (const [src, dst] of [
798799
['options', 'OPTIONS'],
799800
['variants', 'defaultVariants'],
801+
['variantSmp', 'VariantSmp'],
800802
['cssFonts', 'defaultCssFonts'],
801803
['accentMap', 'defaultAccentMap'],
802804
['moMap', 'defaultMoMap'],
@@ -866,6 +868,7 @@ export class FontData<C extends CharOptions, V extends VariantData<C>, D extends
866868
defaultOptions(this.params, data.parameters || {});
867869
mergeOptions(this, 'sizeVariants', data.sizeVariants);
868870
mergeOptions(this, 'stretchVariants', data.stretchVariants);
871+
mergeOptions(this.constructor, 'VariantSmp', data.variantSmp);
869872
this.defineCssFonts(mergeOptions({cssFonts: {}}, 'cssFonts', data.cssFonts));
870873
this.createVariants(mergeOptions({variants: []}, 'variants', data.variants));
871874
if (data.delimiters) {
@@ -949,27 +952,30 @@ export class FontData<C extends CharOptions, V extends VariantData<C>, D extends
949952
*/
950953
protected remapSmpChars(chars: CharMap<C>, name: string) {
951954
const CLASS = this.CLASS;
952-
if (CLASS.VariantSmp[name]) {
953-
const SmpRemap = CLASS.SmpRemap;
954-
const SmpGreek = [null, null, CLASS.SmpRemapGreekU, CLASS.SmpRemapGreekL];
955-
for (const [i, lo, hi] of CLASS.SmpRanges) {
956-
const base = CLASS.VariantSmp[name][i];
957-
if (!base) continue;
958-
for (let n = lo; n <= hi; n++) {
959-
if (n === 0x3A2) continue;
960-
const smp = base + n - lo;
961-
chars[n] = this.smpChar(SmpRemap[smp] || smp);
962-
}
963-
if (SmpGreek[i]) {
964-
for (const n of Object.keys(SmpGreek[i]).map((x) => parseInt(x))) {
965-
chars[n] = this.smpChar(base + SmpGreek[i][n]);
966-
}
955+
let remap = CLASS.VariantSmp[name];
956+
if (typeof remap === 'string') {
957+
remap = CLASS.VariantSmp[remap] as SmpData;
958+
}
959+
if (!remap) return;
960+
const SmpRemap = CLASS.SmpRemap;
961+
const SmpGreek = [null, null, CLASS.SmpRemapGreekU, CLASS.SmpRemapGreekL];
962+
for (const [i, lo, hi] of CLASS.SmpRanges) {
963+
const base = remap[i] as number;
964+
if (!base) continue;
965+
for (let n = lo; n <= hi; n++) {
966+
if (n === 0x3A2) continue;
967+
const smp = base + n - lo;
968+
chars[n] = this.smpChar(SmpRemap[smp] || smp);
969+
}
970+
if (SmpGreek[i]) {
971+
for (const n of Object.keys(SmpGreek[i]).map((x) => parseInt(x))) {
972+
chars[n] = this.smpChar(base + SmpGreek[i][n]);
967973
}
968974
}
969975
}
970-
if (name === 'bold') {
971-
chars[0x3DC] = this.smpChar(0x1D7CA);
972-
chars[0x3DD] = this.smpChar(0x1D7CB);
976+
const extra = remap[5] || {};
977+
for (const n of Object.keys(extra)) {
978+
chars[n as any] = this.smpChar(remap[5][n as any]);
973979
}
974980
}
975981

0 commit comments

Comments
 (0)