delimiter.dart
2.15 KB
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
import '../../ast/options.dart';
import '../../ast/size.dart';
import '../../ast/style.dart';
import '../../ast/symbols/symbols.dart';
import '../../ast/types.dart';
import '../../font/metrics/font_metrics.dart';
import '../../utils/unicode_literal.dart';
class DelimiterConf {
final FontOptions font;
final MathStyle style;
const DelimiterConf(this.font, this.style);
}
const mainRegular = FontOptions(fontFamily: 'Main');
const size1Regular = FontOptions(fontFamily: 'Size1');
const size2Regular = FontOptions(fontFamily: 'Size2');
const size3Regular = FontOptions(fontFamily: 'Size3');
const size4Regular = FontOptions(fontFamily: 'Size4');
const stackNeverDelimiterSequence = [
DelimiterConf(mainRegular, MathStyle.scriptscript),
DelimiterConf(mainRegular, MathStyle.script),
DelimiterConf(mainRegular, MathStyle.text),
DelimiterConf(size1Regular, MathStyle.text),
DelimiterConf(size2Regular, MathStyle.text),
DelimiterConf(size3Regular, MathStyle.text),
DelimiterConf(size4Regular, MathStyle.text),
];
const stackAlwaysDelimiterSequence = [
DelimiterConf(mainRegular, MathStyle.scriptscript),
DelimiterConf(mainRegular, MathStyle.script),
DelimiterConf(mainRegular, MathStyle.text),
];
const stackLargeDelimiterSequence = [
DelimiterConf(mainRegular, MathStyle.scriptscript),
DelimiterConf(mainRegular, MathStyle.script),
DelimiterConf(mainRegular, MathStyle.text),
DelimiterConf(size1Regular, MathStyle.text),
DelimiterConf(size2Regular, MathStyle.text),
DelimiterConf(size3Regular, MathStyle.text),
DelimiterConf(size4Regular, MathStyle.text),
];
double getHeightForDelim({
required String delim,
required String fontName,
required MathStyle style,
required MathOptions options,
}) {
final char = symbolRenderConfigs[delim]?.math?.replaceChar ?? delim;
final metrics =
getCharacterMetrics(character: char, fontName: fontName, mode: Mode.math);
if (metrics == null) {
throw StateError('Illegal delimiter char $delim'
'(${unicodeLiteral(delim)}) appeared in AST');
}
final fullHeight = metrics.height + metrics.depth;
final newOptions = options.havingStyle(style);
return fullHeight.cssEm.toLpUnder(newOptions);
}