Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 1x 1x 1x 3014x 3014x 3014x 558x 547x 11x 11x 2232x 234x 1x 547x 547x 547x 8x 539x 12x 4x 8x 8x 8x 1x 1x 6x 527x 527x | import { isSuperOrSubScript } from './superOrSubScriptFormatHandler';
import { parseValueWithUnit } from '../utils/parseValueWithUnit';
import type { EditorContext, FontSizeFormat } from 'roosterjs-content-model-types';
import type { FormatHandler } from '../FormatHandler';
/**
* @internal
*/
export const fontSizeFormatHandler: FormatHandler<FontSizeFormat> = {
parse: (format, element, context, defaultStyle) => {
const fontSize = element.style.fontSize || defaultStyle.fontSize;
const verticalAlign = element.style.verticalAlign || defaultStyle.verticalAlign;
// when font size is 'smaller' and the style is for superscript/subscript,
// the font size will be handled by superOrSubScript handler
if (fontSize && !isSuperOrSubScript(fontSize, verticalAlign) && fontSize != 'inherit') {
if (element.style.fontSize) {
format.fontSize = normalizeFontSize(
fontSize,
context.segmentFormat.fontSize,
context
);
} else Eif (defaultStyle.fontSize) {
format.fontSize = fontSize;
}
}
},
apply: (format, element, context) => {
if (format.fontSize && format.fontSize != context.implicitFormat.fontSize) {
element.style.fontSize = format.fontSize;
}
},
};
// https://developer.mozilla.org/en-US/docs/Web/CSS/font-size
const KnownFontSizes: Record<string, string> = {
'xx-small': '6.75pt',
'x-small': '7.5pt',
small: '9.75pt',
medium: '12pt',
large: '13.5pt',
'x-large': '18pt',
'xx-large': '24pt',
'xxx-large': '36pt',
};
function normalizeFontSize(
fontSize: string,
contextFont: string | undefined,
context: EditorContext
): string | undefined {
const knownFontSize = KnownFontSizes[fontSize];
const isRemUnit = fontSize.endsWith('rem');
if (knownFontSize) {
return knownFontSize;
} else if (
fontSize == 'smaller' ||
fontSize == 'larger' ||
fontSize.endsWith('em') ||
fontSize.endsWith('%') ||
isRemUnit
) {
if (!contextFont && !isRemUnit) {
return undefined;
} else {
const existingFontSize = isRemUnit
? context.rootFontSize
: parseValueWithUnit(contextFont);
Eif (existingFontSize) {
switch (fontSize) {
case 'smaller':
return Math.round((existingFontSize * 500) / 6) / 100 + 'px';
case 'larger':
return Math.round((existingFontSize * 600) / 5) / 100 + 'px';
default:
return parseValueWithUnit(fontSize, existingFontSize, 'px') + 'px';
}
}
}
} else Iif (fontSize == 'inherit' || fontSize == 'revert' || fontSize == 'unset') {
return undefined;
} else {
return fontSize;
}
}
|