Skip to content

Commit

Permalink
Merge pull request #1033 from mathjax/font-extensions
Browse files Browse the repository at this point in the history
Fix font extension handling of extra variants, and handle those variants in enrichment.
  • Loading branch information
dpvc authored Dec 28, 2023
2 parents d582460 + 4d5f78e commit 52c4362
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 14 deletions.
11 changes: 8 additions & 3 deletions ts/core/MmlTree/MmlVisitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,12 @@ export class MmlVisitor extends AbstractVisitor<MmlNode> {
node.attributes.getAllAttributes()
) as PropertyList;
const variants = CLASS.variants;
if (attributes.hasOwnProperty('mathvariant') && variants.hasOwnProperty(attributes.mathvariant as string)) {
attributes.mathvariant = variants[attributes.mathvariant as string];
if (attributes.hasOwnProperty('mathvariant')) {
if (variants.hasOwnProperty(attributes.mathvariant as string)) {
attributes.mathvariant = variants[attributes.mathvariant as string];
} else if (node.getProperty('ignore-variant')) {
delete attributes.mathvariant;
}
}
return attributes;
}
Expand All @@ -154,7 +158,8 @@ export class MmlVisitor extends AbstractVisitor<MmlNode> {
const data = {} as PropertyList;
const variant = node.attributes.getExplicit('mathvariant') as string;
const variants = (this.constructor as typeof MmlVisitor).variants;
variant && variants.hasOwnProperty(variant) && this.setDataAttribute(data, 'variant', variant);
variant && (node.getProperty('ignore-variant') || variants.hasOwnProperty(variant)) &&
this.setDataAttribute(data, 'variant', variant);
node.getProperty('variantForm') && this.setDataAttribute(data, 'alternate', '1');
node.getProperty('pseudoscript') && this.setDataAttribute(data, 'pseudoscript', 'true');
node.getProperty('autoOP') === false && this.setDataAttribute(data, 'auto-op', 'false');
Expand Down
8 changes: 7 additions & 1 deletion ts/input/tex/TexParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,13 @@ export default class TexParser {
* @return {MmlNode} The newly created node.
*/
public create(kind: string, ...rest: any[]): MmlNode {
return this.configuration.nodeFactory.create(kind, ...rest);
const node = this.configuration.nodeFactory.create(kind, ...rest);
if (node.isToken && node.attributes.hasExplicit('mathvariant')) {
if ((node.attributes.get('mathvariant') as string).charAt(0) === '-') {
node.setProperty('ignore-variant', true);
}
}
return node;
}

/**
Expand Down
18 changes: 9 additions & 9 deletions ts/output/common/FontData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,8 @@ export interface FontExtensionData<C extends CharOptions, D extends DelimiterDat
/**
* Merge options into an object or array.
*/
export function mergeOptions(dst: OptionList, src: OptionList) {
return (src ? defaultOptions([dst], [src])[0] : dst);
export function mergeOptions(obj: OptionList, dst: string, src: OptionList) {
return (src ? defaultOptions(obj, {[dst]: src})[dst] : obj[dst]);
}

/****************************************************************************/
Expand Down Expand Up @@ -806,7 +806,7 @@ export class FontData<C extends CharOptions, V extends VariantData<C>, D extends
['sizeVariants', 'defaultSizeVariants'],
['stretchVariants', 'defaultStretchVariants']
] as [keyof FontExtensionData<CharOptions, DelimiterData>, keyof typeof FontData][]) {
mergeOptions(this[dst] as OptionList, data[src] as OptionList);
mergeOptions(this, dst, data[src] as OptionList);
}
if (data.delimiters) {
Object.assign(this.defaultDelimiters, data.delimiters);
Expand Down Expand Up @@ -843,7 +843,7 @@ export class FontData<C extends CharOptions, V extends VariantData<C>, D extends
* @param {OptionList} options The options to merge into the font options
*/
public setOptions(options: OptionList) {
mergeOptions(this.options, options);
defaultOptions(this.options, options);
}

/**
Expand All @@ -864,12 +864,12 @@ export class FontData<C extends CharOptions, V extends VariantData<C>, D extends

defaultOptions(this.options, data.options || {});
defaultOptions(this.params, data.parameters || {});
this.sizeVariants = mergeOptions(this.sizeVariants, data.sizeVariants);
this.stretchVariants = mergeOptions(this.stretchVariants, data.stretchVariants);
this.defineCssFonts(mergeOptions([], data.cssFonts));
this.createVariants(mergeOptions([], data.variants));
mergeOptions(this, 'sizeVariants', data.sizeVariants);
mergeOptions(this, 'stretchVariants', data.stretchVariants);
this.defineCssFonts(mergeOptions({cssFonts: {}}, 'cssFonts', data.cssFonts));
this.createVariants(mergeOptions({variants: []}, 'variants', data.variants));
if (data.delimiters) {
this.defineDelimiters(mergeOptions([], data.delimiters));
this.defineDelimiters(mergeOptions({delimiters: {}}, 'delimiters', data.delimiters));
this.CLASS.adjustDelimiters(this.delimiters, Object.keys(data.delimiters),
dynamicFont.sizeN, dynamicFont.stretchN);
}
Expand Down
23 changes: 22 additions & 1 deletion ts/output/svg/FontData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
* @author dpvc@mathjax.org (Davide Cervone)
*/

import {CharMap, CharOptions, CharDataArray, VariantData, DelimiterData, FontData} from '../common/FontData.js';
import {CharMap, CharOptions, CharDataArray, VariantData, DelimiterData,
FontData, FontExtensionData, mergeOptions} from '../common/FontData.js';
export * from '../common/FontData.js';

export type CharStringMap = {[name: number]: string};
Expand Down Expand Up @@ -54,6 +55,15 @@ export interface SvgDelimiterData extends DelimiterData {
}


/**
* Includes the data needed for SVG font extensions
*/
export interface SvgFontExtensionData<C extends SvgCharOptions, D extends SvgDelimiterData>
extends FontExtensionData<C, D> {
cacheIds: {[variant: string]: string}
}


/****************************************************************************/

/**
Expand Down Expand Up @@ -81,6 +91,17 @@ export class SvgFontData extends FontData<SvgCharOptions, SvgVariantData, SvgDel
return super.charOptions(font, n) as SvgCharOptions;
}

/**
* @override
*/
public static addExtension(
data: SvgFontExtensionData<SvgCharOptions, SvgDelimiterData>,
prefix: string = ''
) {
super.addExtension(data, prefix);
mergeOptions(this, 'variantCacheIds', data.cacheIds);
}

}

export type SvgFontDataClass = typeof SvgFontData;
Expand Down

0 comments on commit 52c4362

Please sign in to comment.