Skip to content

Commit 5ee5214

Browse files
content: Scale inline KaTeX content based on the surrounding text
This applies the correct font scaling if the KaTeX content is inside a header.
1 parent 3841fdd commit 5ee5214

File tree

2 files changed

+37
-18
lines changed

2 files changed

+37
-18
lines changed

lib/widgets/content.dart

+17-8
Original file line numberDiff line numberDiff line change
@@ -816,24 +816,34 @@ class MathBlock extends StatelessWidget {
816816
children: [TextSpan(text: node.texSource)])));
817817
}
818818

819-
return _Katex(inline: false, nodes: nodes);
819+
return _Katex(
820+
inline: false,
821+
textStyle: ContentTheme.of(context).textStylePlainParagraph,
822+
nodes: nodes);
820823
}
821824
}
822825

823826
// Base text style from .katex class in katex.scss :
824827
// https://github.com/KaTeX/KaTeX/blob/613c3da8/src/styles/katex.scss#L13-L15
825-
const kBaseKatexTextStyle = TextStyle(
826-
fontSize: kBaseFontSize * 1.21,
827-
fontFamily: 'KaTeX_Main',
828-
height: 1.2);
828+
TextStyle mkBaseKatexTextStyle(TextStyle style) {
829+
assert(style.fontSize != null);
830+
return style.copyWith(
831+
fontSize: style.fontSize! * 1.21,
832+
fontFamily: 'KaTeX_Main',
833+
height: 1.2,
834+
fontWeight: FontWeight.normal,
835+
fontStyle: FontStyle.normal);
836+
}
829837

830838
class _Katex extends StatelessWidget {
831839
const _Katex({
832840
required this.inline,
841+
required this.textStyle,
833842
required this.nodes,
834843
});
835844

836845
final bool inline;
846+
final TextStyle textStyle;
837847
final List<KatexNode> nodes;
838848

839849
@override
@@ -856,8 +866,7 @@ class _Katex extends StatelessWidget {
856866
return Directionality(
857867
textDirection: TextDirection.ltr,
858868
child: DefaultTextStyle(
859-
style: kBaseKatexTextStyle.copyWith(
860-
color: ContentTheme.of(context).textStylePlainParagraph.color),
869+
style: mkBaseKatexTextStyle(textStyle),
861870
child: widget));
862871
}
863872
}
@@ -1270,7 +1279,7 @@ class _InlineContentBuilder {
12701279
: WidgetSpan(
12711280
alignment: PlaceholderAlignment.baseline,
12721281
baseline: TextBaseline.alphabetic,
1273-
child: _Katex(inline: true, nodes: nodes));
1282+
child: _Katex(inline: true, textStyle: widget.style, nodes: nodes));
12741283

12751284
case GlobalTimeNode():
12761285
return WidgetSpan(alignment: PlaceholderAlignment.middle,

test/widgets/content_test.dart

+20-10
Original file line numberDiff line numberDiff line change
@@ -595,15 +595,19 @@ void main() {
595595
final content = ContentExample.mathBlockKatexSizing;
596596
await prepareContent(tester, plainContent(content.html));
597597

598+
final context = tester.element(find.byType(MathBlock));
599+
final baseTextStyle =
600+
mkBaseKatexTextStyle(ContentTheme.of(context).textStylePlainParagraph);
601+
598602
final mathBlockNode = content.expectedNodes.single as MathBlockNode;
599603
final baseNode = mathBlockNode.nodes!.single;
600604
final nodes = baseNode.nodes!.skip(1); // Skip .strut node.
601605
for (final katexNode in nodes) {
602-
final fontSize = katexNode.styles.fontSizeEm! * kBaseKatexTextStyle.fontSize!;
606+
final fontSize = katexNode.styles.fontSizeEm! * baseTextStyle.fontSize!;
603607
checkKatexText(tester, katexNode.text!,
604608
fontFamily: 'KaTeX_Main',
605609
fontSize: fontSize,
606-
fontHeight: kBaseKatexTextStyle.height!);
610+
fontHeight: baseTextStyle.height!);
607611
}
608612
});
609613

@@ -616,17 +620,21 @@ void main() {
616620
final content = ContentExample.mathBlockKatexNestedSizing;
617621
await prepareContent(tester, plainContent(content.html));
618622

619-
var fontSize = 0.5 * kBaseKatexTextStyle.fontSize!;
623+
final context = tester.element(find.byType(MathBlock));
624+
final baseTextStyle =
625+
mkBaseKatexTextStyle(ContentTheme.of(context).textStylePlainParagraph);
626+
627+
var fontSize = 0.5 * baseTextStyle.fontSize!;
620628
checkKatexText(tester, '1',
621629
fontFamily: 'KaTeX_Main',
622630
fontSize: fontSize,
623-
fontHeight: kBaseKatexTextStyle.height!);
631+
fontHeight: baseTextStyle.height!);
624632

625633
fontSize = 4.976 * fontSize;
626634
checkKatexText(tester, '2',
627635
fontFamily: 'KaTeX_Main',
628636
fontSize: fontSize,
629-
fontHeight: kBaseKatexTextStyle.height!);
637+
fontHeight: baseTextStyle.height!);
630638
});
631639

632640
testWidgets('displays KaTeX content with different delimiter sizing', (tester) async {
@@ -642,22 +650,24 @@ void main() {
642650
final baseNode = mathBlockNode.nodes!.single;
643651
var nodes = baseNode.nodes!.skip(1); // Skip .strut node.
644652

645-
final fontSize = kBaseKatexTextStyle.fontSize!;
653+
final context = tester.element(find.byType(MathBlock));
654+
final baseTextStyle =
655+
mkBaseKatexTextStyle(ContentTheme.of(context).textStylePlainParagraph);
646656

647657
final firstNode = nodes.first;
648658
checkKatexText(tester, firstNode.text!,
649659
fontFamily: 'KaTeX_Main',
650-
fontSize: fontSize,
651-
fontHeight: kBaseKatexTextStyle.height!);
660+
fontSize: baseTextStyle.fontSize!,
661+
fontHeight: baseTextStyle.height!);
652662
nodes = nodes.skip(1);
653663

654664
for (var katexNode in nodes) {
655665
katexNode = katexNode.nodes!.single; // Skip empty .mord parent.
656666
final fontFamily = katexNode.styles.fontFamily!;
657667
checkKatexText(tester, katexNode.text!,
658668
fontFamily: fontFamily,
659-
fontSize: fontSize,
660-
fontHeight: kBaseKatexTextStyle.height!);
669+
fontSize: baseTextStyle.fontSize!,
670+
fontHeight: baseTextStyle.height!);
661671
}
662672
});
663673
});

0 commit comments

Comments
 (0)