From 194cc826afc69a738767d11acad0d4c2a519f8b4 Mon Sep 17 00:00:00 2001 From: Ernest Date: Tue, 7 Jul 2026 17:05:32 +0200 Subject: [PATCH 1/3] fix(ios): inline math height calculations --- .../attachments/ENRMMathInlineAttachment.h | 2 + .../attachments/ENRMMathInlineAttachment.m | 8 ++++ .../ios/utils/ParagraphStyleUtils.m | 43 ++++++++++++------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.h b/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.h index 4bfb1dd1d..956792262 100644 --- a/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.h +++ b/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.h @@ -9,6 +9,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) CGFloat fontSize; @property (nonatomic, strong, nullable) RCTUIColor *mathTextColor; +@property (nonatomic, readonly) CGFloat boxHeight; + #if TARGET_OS_OSX /// Pre-renders the formula into self.image and sets self.bounds. /// Must be called after latex/fontSize/mathTextColor are set, before the diff --git a/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.m b/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.m index 4c5c5be81..6c02fdb50 100644 --- a/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.m +++ b/packages/react-native-enriched-markdown/ios/attachments/ENRMMathInlineAttachment.m @@ -10,6 +10,14 @@ @implementation ENRMMathInlineAttachment +- (CGFloat)boxHeight +{ +#if !TARGET_OS_OSX + [self prepareIfNeeded]; +#endif + return _cachedSize.height; +} + #if !TARGET_OS_OSX - (void)prepareIfNeeded diff --git a/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m b/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m index 550bd7033..f055bc0c3 100644 --- a/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m +++ b/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m @@ -284,7 +284,8 @@ void applyBaselineOffset(NSMutableAttributedString *output, NSRange range) return; } - __block CGFloat maximumLineHeight = 0; + // Math paragraphs leave maximumLineHeight at 0, so fall back to minimumLineHeight. + __block CGFloat targetLineHeight = 0; [output enumerateAttribute:NSParagraphStyleAttributeName inRange:range options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired @@ -292,29 +293,41 @@ void applyBaselineOffset(NSMutableAttributedString *output, NSRange range) if (!paragraphStyle) { return; } - maximumLineHeight = MAX(paragraphStyle.maximumLineHeight, maximumLineHeight); + CGFloat clamp = MAX(paragraphStyle.maximumLineHeight, paragraphStyle.minimumLineHeight); + targetLineHeight = MAX(clamp, targetLineHeight); }]; - if (maximumLineHeight <= 0) { + if (targetLineHeight <= 0) { return; } - __block CGFloat maximumFontLineHeight = 0; - [output enumerateAttribute:NSFontAttributeName - inRange:range - options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired - usingBlock:^(UIFont *font, __unused NSRange subrange, __unused BOOL *stop) { - if (!font) { - return; - } - maximumFontLineHeight = MAX(UIFontLineHeight(font), maximumFontLineHeight); - }]; + // Center on real text; on a math-only line center the math box instead of its font. + __block CGFloat textLineHeight = 0; + __block CGFloat mathBoxHeight = 0; + [output enumerateAttributesInRange:range + options:0 + usingBlock:^(NSDictionary *attrs, __unused NSRange subrange, + __unused BOOL *stop) { +#if ENRICHED_MARKDOWN_MATH + id attachment = attrs[NSAttachmentAttributeName]; + if ([attachment isKindOfClass:[ENRMMathInlineAttachment class]]) { + mathBoxHeight = MAX(((ENRMMathInlineAttachment *)attachment).boxHeight, mathBoxHeight); + return; + } +#endif + UIFont *font = attrs[NSFontAttributeName]; + if (font) { + textLineHeight = MAX(UIFontLineHeight(font), textLineHeight); + } + }]; + + CGFloat contentLineHeight = textLineHeight > 0 ? MAX(textLineHeight, mathBoxHeight) : mathBoxHeight; - if (maximumFontLineHeight <= 0 || maximumLineHeight < maximumFontLineHeight) { + if (contentLineHeight <= 0 || targetLineHeight <= contentLineHeight) { return; } - CGFloat baseLineOffset = (maximumLineHeight - maximumFontLineHeight) / 2.0; + CGFloat baseLineOffset = (targetLineHeight - contentLineHeight) / 2.0; [output enumerateAttribute:NSBaselineOffsetAttributeName inRange:range From fac9462e1dbd308750e446d6600d964f582d3088 Mon Sep 17 00:00:00 2001 From: Ernest Date: Wed, 8 Jul 2026 09:54:37 +0200 Subject: [PATCH 2/3] fix: cr changes --- .../ios/utils/ParagraphStyleUtils.m | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m b/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m index f055bc0c3..54c22c24f 100644 --- a/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m +++ b/packages/react-native-enriched-markdown/ios/utils/ParagraphStyleUtils.m @@ -303,15 +303,16 @@ void applyBaselineOffset(NSMutableAttributedString *output, NSRange range) // Center on real text; on a math-only line center the math box instead of its font. __block CGFloat textLineHeight = 0; - __block CGFloat mathBoxHeight = 0; +#if ENRICHED_MARKDOWN_MATH + __block BOOL hasMath = NO; +#endif [output enumerateAttributesInRange:range options:0 usingBlock:^(NSDictionary *attrs, __unused NSRange subrange, __unused BOOL *stop) { #if ENRICHED_MARKDOWN_MATH - id attachment = attrs[NSAttachmentAttributeName]; - if ([attachment isKindOfClass:[ENRMMathInlineAttachment class]]) { - mathBoxHeight = MAX(((ENRMMathInlineAttachment *)attachment).boxHeight, mathBoxHeight); + if ([attrs[NSAttachmentAttributeName] isKindOfClass:[ENRMMathInlineAttachment class]]) { + hasMath = YES; return; } #endif @@ -321,7 +322,24 @@ void applyBaselineOffset(NSMutableAttributedString *output, NSRange range) } }]; - CGFloat contentLineHeight = textLineHeight > 0 ? MAX(textLineHeight, mathBoxHeight) : mathBoxHeight; + CGFloat contentLineHeight = textLineHeight; + +#if ENRICHED_MARKDOWN_MATH + // Math only grows the content height, so measure it (parsing LaTeX) only when text + // alone wouldn't already fill the line. + if (hasMath && targetLineHeight > textLineHeight) { + __block CGFloat mathBoxHeight = 0; + [output enumerateAttribute:NSAttachmentAttributeName + inRange:range + options:0 + usingBlock:^(id value, __unused NSRange subrange, __unused BOOL *stop) { + if ([value isKindOfClass:[ENRMMathInlineAttachment class]]) { + mathBoxHeight = MAX(((ENRMMathInlineAttachment *)value).boxHeight, mathBoxHeight); + } + }]; + contentLineHeight = MAX(textLineHeight, mathBoxHeight); + } +#endif if (contentLineHeight <= 0 || targetLineHeight <= contentLineHeight) { return; From 4818e1ba17b18999fa1a09fb7de095439f88bfdd Mon Sep 17 00:00:00 2001 From: Ernest Date: Wed, 8 Jul 2026 10:14:46 +0200 Subject: [PATCH 3/3] test: update tests --- .../screenshots/ios/inline_math_display.png | Bin 15930 -> 15930 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.maestro/enrichedMarkdownText/screenshots/ios/inline_math_display.png b/.maestro/enrichedMarkdownText/screenshots/ios/inline_math_display.png index 554ba6ea2e502ccab1b172266dc1079c6f051692..8aee9318e84608d3f5087d289db3d548004ce1bc 100644 GIT binary patch delta 13407 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