123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- /*************************************************************
- *
- * Copyright (c) 2017-2022 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.
- */
- /**
- * @fileoverview Implements the CommonMsqrt wrapper for the MmlMsqrt object
- *
- * @author dpvc@mathjax.org (Davide Cervone)
- */
- import {AnyWrapper, WrapperConstructor, Constructor} from '../Wrapper.js';
- import {CommonMo} from './mo.js';
- import {BBox} from '../../../util/BBox.js';
- import {DIRECTION} from '../FontData.js';
- /*****************************************************************/
- /**
- * The CommonMsqrt interface
- */
- export interface CommonMsqrt extends AnyWrapper {
- /**
- * The index of the base of the root in childNodes
- */
- readonly base: number;
- /**
- * The index of the surd in childNodes
- */
- readonly surd: number;
- /**
- * The index of the root in childNodes (or null if none)
- */
- readonly root: number;
- /**
- * The requested height of the stretched surd character
- */
- surdH: number;
- /**
- * Combine the bounding box of the root (overridden in mroot)
- *
- * @param {BBox} bbox The bounding box so far
- * @param {BBox} sbox The bounding box of the surd
- * @param {number} H The height of the root as a whole
- */
- combineRootBBox(bbox: BBox, sbox: BBox, H: number): void;
- /**
- * @param {BBox} sbox The bounding box for the surd character
- * @return {number[]} The p, q, and x values for the TeX layout computations
- */
- getPQ(sbox: BBox): number[];
- /**
- * @param {BBox} sbox The bounding box of the surd
- * @param {number} H The height of the root as a whole
- * @return {number[]} The x offset of the surd, and the height, x offset, and scale of the root
- */
- getRootDimens(sbox: BBox, H: Number): number[];
- }
- /**
- * Shorthand for the CommonMsqrt constructor
- */
- export type MsqrtConstructor = Constructor<CommonMsqrt>;
- /*****************************************************************/
- /**
- * The CommonMsqrt wrapper mixin for the MmlMsqrt object
- *
- * @template T The Wrapper class constructor type
- */
- export function CommonMsqrtMixin<T extends WrapperConstructor>(Base: T): MsqrtConstructor & T {
- return class extends Base {
- /**
- * @return {number} The index of the base of the root in childNodes
- */
- get base(): number {
- return 0;
- }
- /**
- * @return {number} The index of the surd in childNodes
- */
- get surd(): number {
- return 1;
- }
- /**
- * @return {number} The index of the root in childNodes (or null if none)
- */
- get root(): number {
- return null;
- }
- /**
- * The requested height of the stretched surd character
- */
- public surdH: number;
- /**
- * Add the surd character so we can display it later
- *
- * @override
- */
- constructor(...args: any[]) {
- super(...args);
- const surd = this.createMo('\u221A');
- surd.canStretch(DIRECTION.Vertical);
- const {h, d} = this.childNodes[this.base].getOuterBBox();
- const t = this.font.params.rule_thickness;
- const p = (this.node.attributes.get('displaystyle') ? this.font.params.x_height : t);
- this.surdH = h + d + 2 * t + p / 4;
- (surd as CommonMo).getStretchedVariant([this.surdH - d, d], true);
- }
- /**
- * @override
- */
- public createMo(text: string) {
- const node = super.createMo(text);
- this.childNodes.push(node);
- return node;
- }
- /**
- * @override
- */
- public computeBBox(bbox: BBox, recompute: boolean = false) {
- const surdbox = this.childNodes[this.surd].getBBox();
- const basebox = new BBox(this.childNodes[this.base].getOuterBBox());
- const q = this.getPQ(surdbox)[1];
- const t = this.font.params.rule_thickness;
- const H = basebox.h + q + t;
- const [x] = this.getRootDimens(surdbox, H);
- bbox.h = H + t;
- this.combineRootBBox(bbox, surdbox, H);
- bbox.combine(surdbox, x, H - surdbox.h);
- bbox.combine(basebox, x + surdbox.w, 0);
- bbox.clean();
- this.setChildPWidths(recompute);
- }
- /**
- * Combine the bounding box of the root (overridden in mroot)
- *
- * @param {BBox} bbox The bounding box so far
- * @param {BBox} sbox The bounding box of the surd
- * @param {number} H The height of the root as a whole
- */
- public combineRootBBox(_bbox: BBox, _sbox: BBox, _H: number) {
- }
- /**
- * @param {BBox} sbox The bounding box for the surd character
- * @return {[number, number]} The p, q, and x values for the TeX layout computations
- */
- public getPQ(sbox: BBox): [number, number] {
- const t = this.font.params.rule_thickness;
- const p = (this.node.attributes.get('displaystyle') ? this.font.params.x_height : t);
- const q = (sbox.h + sbox.d > this.surdH ?
- ((sbox.h + sbox.d) - (this.surdH - 2 * t - p / 2)) / 2 :
- t + p / 4);
- return [p, q];
- }
- /**
- * @param {BBox} sbox The bounding box of the surd
- * @param {number} H The height of the root as a whole
- * @return {[number, number, number, number]} The x offset of the surd, and
- * the height, x offset, and scale of the root
- */
- public getRootDimens(_sbox: BBox, _H: number): [number, number, number, number] {
- return [0, 0, 0, 0];
- }
- };
- }
|