/************************************************************* * * Copyright (c) 2017-2025 The MathJax Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file Implements the CommonMspace wrapper mixin for the MmlMspace object * * @author dpvc@mathjax.org (Davide Cervone) */ import { CommonWrapper, CommonWrapperClass, CommonWrapperConstructor, } from '../Wrapper.js'; import { CommonWrapperFactory } from '../WrapperFactory.js'; import { CharOptions, VariantData, DelimiterData, FontData, FontDataClass, } from '../FontData.js'; import { CommonOutputJax } from '../../common.js'; import { MmlNode } from '../../../core/MmlTree/MmlNode.js'; import { MmlMspace } from '../../../core/MmlTree/MmlNodes/mspace.js'; import { BBox } from '../../../util/BBox.js'; import { LineBBox } from '../LineBBox.js'; /*****************************************************************/ /** * The CommonMspance interface * * @template N The DOM node type * @template T The DOM text node type * @template D The DOM document type * @template JX The OutputJax type * @template WW The Wrapper type * @template WF The WrapperFactory type * @template WC The WrapperClass type * @template CC The CharOptions type * @template VV The VariantData type * @template DD The DelimiterData type * @template FD The FontData type * @template FC The FontDataClass type */ export interface CommonMspace< N, T, D, JX extends CommonOutputJax, WW extends CommonWrapper, WF extends CommonWrapperFactory, WC extends CommonWrapperClass, CC extends CharOptions, VV extends VariantData, DD extends DelimiterData, FD extends FontData, FC extends FontDataClass, > extends CommonWrapper { /** * True when mspace is allowed to break */ canBreak: boolean; /** * The linebreak style */ breakStyle: string; /** * Set a breakpoint to the given type * * @param {string} linebreak The type of linebreak to set */ setBreakStyle(linebreak?: string): void; } /** * The CommonMspaceClass interface * * @template N The DOM node type * @template T The DOM text node type * @template D The DOM document type * @template JX The OutputJax type * @template WW The Wrapper type * @template WF The WrapperFactory type * @template WC The WrapperClass type * @template CC The CharOptions type * @template VV The VariantData type * @template DD The DelimiterData type * @template FD The FontData type * @template FC The FontDataClass type */ export interface CommonMspaceClass< N, T, D, JX extends CommonOutputJax, WW extends CommonWrapper, WF extends CommonWrapperFactory, WC extends CommonWrapperClass, CC extends CharOptions, VV extends VariantData, DD extends DelimiterData, FD extends FontData, FC extends FontDataClass, > extends CommonWrapperClass {} /*****************************************************************/ /** * The CommonMspace wrapper mixin for the MmlMspace object * * @param {CommonWrapperConstructor} Base The constructor class to extend * @returns {B} The mixin constructor * @template N The DOM node type * @template T The DOM text node type * @template D The DOM document type * @template JX The OutputJax type * @template WW The Wrapper type * @template WF The WrapperFactory type * @template WC The WrapperClass type * @template CC The CharOptions type * @template VV The VariantData type * @template DD The DelimiterData type * @template FD The FontData type * @template FC The FontDataClass type * * @template B The mixin interface to create */ export function CommonMspaceMixin< N, T, D, JX extends CommonOutputJax, WW extends CommonWrapper, WF extends CommonWrapperFactory, WC extends CommonWrapperClass, CC extends CharOptions, VV extends VariantData, DD extends DelimiterData, FD extends FontData, FC extends FontDataClass, B extends CommonWrapperClass, >( Base: CommonWrapperConstructor ): B { return class CommonMspaceMixin extends Base implements CommonMspace { /** * @override */ get canBreak() { return (this.node as MmlMspace).canBreak; } /** * @override */ public breakStyle: string; /** * @override */ get breakCount() { return this.breakStyle ? 1 : 0; } /** * @override */ public setBreakStyle(linebreak: string = '') { this.breakStyle = linebreak || ((this.node as MmlMspace).hasNewline || this.node.getProperty('forcebreak') ? 'before' : ''); } /***************************************************/ /** * @override */ constructor(factory: WF, node: MmlNode, parent: WW = null) { super(factory, node, parent); this.setBreakStyle(); } /** * @override */ public computeBBox(bbox: BBox, _recompute: boolean = false) { const attributes = this.node.attributes; bbox.w = this.length2em(attributes.get('width'), 0); bbox.h = this.length2em(attributes.get('height'), 0); bbox.d = this.length2em(attributes.get('depth'), 0); } /** * @override */ public computeLineBBox(i: number): LineBBox { const leadingString = this.node.attributes.get( 'data-lineleading' ) as string; const leading = this.length2em( leadingString, this.linebreakOptions.lineleading ); const bbox = LineBBox.from(BBox.zero(), leading); if (i === 1) { bbox.getIndentData(this.node); bbox.w = this.getBBox().w; bbox.isFirst = bbox.w === 0; } return bbox; } } as any as B; }