@@ -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