site/node_modules/mathjax-full/ts/util/lengths.ts

158 lines
4.6 KiB
TypeScript
Raw Permalink Normal View History

2024-10-14 06:09:33 +00:00
/*************************************************************
*
* 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 Utility functions for handling dimensions (lengths)
*
* @author dpvc@mathjax.org (Davide Cervone)
*/
/**
* A very large number
*/
export const BIGDIMEN = 1000000;
/**
* Sizes of various units in pixels
*/
export const UNITS: {[unit: string]: number} = {
px: 1,
'in': 96, // 96 px to an inch
cm: 96 / 2.54, // 2.54 cm to an inch
mm: 96 / 25.4 // 10 mm to a cm
};
/**
* Sizes of various relative units in em's
*/
export const RELUNITS: {[unit: string]: number} = {
em: 1,
ex: .431, // this.TEX.x_height;
pt: 1 / 10, // 10 pt to an em
pc: 12 / 10, // 12 pc to a pt
mu: 1 / 18 // 18mu to an em for the scriptlevel
};
/**
* The various named spaces
*/
export const MATHSPACE: {[name: string]: number} = {
/* tslint:disable:whitespace */
veryverythinmathspace: 1/18,
verythinmathspace: 2/18,
thinmathspace: 3/18,
mediummathspace: 4/18,
thickmathspace: 5/18,
verythickmathspace: 6/18,
veryverythickmathspace: 7/18,
negativeveryverythinmathspace: -1/18,
negativeverythinmathspace: -2/18,
negativethinmathspace: -3/18,
negativemediummathspace: -4/18,
negativethickmathspace: -5/18,
negativeverythickmathspace: -6/18,
negativeveryverythickmathspace: -7/18,
/* tslint:enable */
thin: .04,
medium: .06,
thick: .1,
normal: 1,
big: 2,
small: 1 / Math.sqrt(2),
infinity: BIGDIMEN
};
/**
* @param {string|number} length A dimension (giving number and units) to be converted to ems
* @param {number} size The default size of the dimension (for percentage values)
* @param {number} scale The current scaling factor (to handle absolute units)
* @param {number} em The size of an em in pixels
* @return {number} The dimension converted to ems
*/
export function length2em(length: string | number, size: number = 0, scale: number = 1, em: number = 16): number {
if (typeof length !== 'string') {
length = String(length);
}
if (length === '' || length == null) {
return size;
}
if (MATHSPACE[length]) {
return MATHSPACE[length];
}
let match = length.match(/^\s*([-+]?(?:\.\d+|\d+(?:\.\d*)?))?(pt|em|ex|mu|px|pc|in|mm|cm|%)?/);
if (!match) {
return size;
}
let m = parseFloat(match[1] || '1'), unit = match[2];
if (UNITS.hasOwnProperty(unit)) {
return m * UNITS[unit] / em / scale;
}
if (RELUNITS.hasOwnProperty(unit)) {
return m * RELUNITS[unit];
}
if (unit === '%') {
return m / 100 * size; // percentage of the size
}
return m * size; // relative to size
}
/**
* @param {number} m A number to be shown as a percent
* @return {string} The number m as a percent
*/
export function percent(m: number): string {
return (100 * m).toFixed(1).replace(/\.?0+$/, '') + '%';
}
/**
* @param {number} m A number to be shown in ems
* @return {string} The number with units of ems
*/
export function em(m: number): string {
if (Math.abs(m) < .001) return '0';
return (m.toFixed(3).replace(/\.?0+$/, '')) + 'em';
}
/**
* @param {number} m A number to be shown in ems, but rounded to pixel boundaries
* @param {number} em The number of pixels in an em
* @return {string} The number with units of em
*/
export function emRounded(m: number, em: number = 16): string {
m = (Math.round(m * em) + .05) / em;
if (Math.abs(m) < .001) return '0em';
return m.toFixed(3).replace(/\.?0+$/, '') + 'em';
}
/**
* @param {number} m A number of em's to be shown as pixels
* @param {number} M The minimum number of pixels to allow
* @param {number} em The number of pixels in an em
* @return {string} The number with units of px
*/
export function px(m: number, M: number = -BIGDIMEN, em: number = 16): string {
m *= em;
if (M && m < M) m = M;
if (Math.abs(m) < .1) return '0';
return m.toFixed(1).replace(/\.0$/, '') + 'px';
}