diff --git a/ts/core/MmlTree/MmlVisitor.ts b/ts/core/MmlTree/MmlVisitor.ts index e970240c5..119017ed5 100644 --- a/ts/core/MmlTree/MmlVisitor.ts +++ b/ts/core/MmlTree/MmlVisitor.ts @@ -138,8 +138,12 @@ export class MmlVisitor extends AbstractVisitor { 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; } @@ -154,7 +158,8 @@ export class MmlVisitor extends AbstractVisitor { 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'); diff --git a/ts/input/tex/TexParser.ts b/ts/input/tex/TexParser.ts index f5d518ead..518b9926e 100644 --- a/ts/input/tex/TexParser.ts +++ b/ts/input/tex/TexParser.ts @@ -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; } /** diff --git a/ts/output/common/FontData.ts b/ts/output/common/FontData.ts index 14f5614eb..6e7aa8cb9 100644 --- a/ts/output/common/FontData.ts +++ b/ts/output/common/FontData.ts @@ -332,8 +332,8 @@ export interface FontExtensionData, D extends ['sizeVariants', 'defaultSizeVariants'], ['stretchVariants', 'defaultStretchVariants'] ] as [keyof FontExtensionData, 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); @@ -843,7 +843,7 @@ export class FontData, 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); } /** @@ -864,12 +864,12 @@ export class FontData, 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); } diff --git a/ts/output/svg/FontData.ts b/ts/output/svg/FontData.ts index 6af974f48..83a96258e 100644 --- a/ts/output/svg/FontData.ts +++ b/ts/output/svg/FontData.ts @@ -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}; @@ -54,6 +55,15 @@ export interface SvgDelimiterData extends DelimiterData { } +/** + * Includes the data needed for SVG font extensions + */ +export interface SvgFontExtensionData +extends FontExtensionData { + cacheIds: {[variant: string]: string} +} + + /****************************************************************************/ /** @@ -81,6 +91,17 @@ export class SvgFontData extends FontData, + prefix: string = '' + ) { + super.addExtension(data, prefix); + mergeOptions(this, 'variantCacheIds', data.cacheIds); + } + } export type SvgFontDataClass = typeof SvgFontData;