diff --git a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt index bec2d38b0..e16965e98 100644 --- a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +++ b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt @@ -52,6 +52,7 @@ import com.swmansion.enriched.markdown.utils.common.parseLinkPillContent import com.swmansion.enriched.markdown.utils.common.parseLinkRecognition import com.swmansion.enriched.markdown.utils.text.extensions.replaceMathSpansWithPlaceholders import com.swmansion.enriched.markdown.utils.text.span.prepareWidthAwareSpans +import com.swmansion.enriched.markdown.utils.text.view.inViewSpanOrder import java.util.concurrent.ConcurrentHashMap import kotlin.math.ceil @@ -755,7 +756,7 @@ object MeasurementStore { ): StaticLayout { val builder = StaticLayout.Builder - .obtain(content, 0, content.length, paint, widthPx) + .obtain(inViewSpanOrder(content), 0, content.length, paint, widthPx) .setIncludePad(false) .setLineSpacing(0f, 1f) diff --git a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/segments/SegmentHeightMeasurer.kt b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/segments/SegmentHeightMeasurer.kt index 5397c9bad..99c214b11 100644 --- a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/segments/SegmentHeightMeasurer.kt +++ b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/segments/SegmentHeightMeasurer.kt @@ -11,6 +11,7 @@ import com.swmansion.enriched.markdown.styles.StyleConfig import com.swmansion.enriched.markdown.utils.common.BoundsForWidthUtils import com.swmansion.enriched.markdown.utils.text.extensions.replaceMathSpansWithPlaceholders import com.swmansion.enriched.markdown.utils.text.span.prepareWidthAwareSpans +import com.swmansion.enriched.markdown.utils.text.view.inViewSpanOrder import kotlin.math.ceil /** A stack's height and, for the root stack, the widest text line (px). */ @@ -219,7 +220,7 @@ object SegmentHeightMeasurer { } prepareWidthAwareSpans(text, widthPx) return StaticLayout.Builder - .obtain(text, 0, text.length, paint, widthPx) + .obtain(inViewSpanOrder(text), 0, text.length, paint, widthPx) .setIncludePad(false) .setLineSpacing(0f, 1f) .apply { diff --git a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/TextViewSetup.kt b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/TextViewSetup.kt index 5d75b83ec..8b3781c47 100644 --- a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/TextViewSetup.kt +++ b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/TextViewSetup.kt @@ -26,6 +26,14 @@ private object NoCopySpannableFactory : Spannable.Factory() { } } +/** + * [text] as the markdown text view lays it out. Build every StaticLayout that sizes such + * a view from this: span order decides which LineHeightSpan wins on a shared line, so a + * layout over the bare builder can measure lines shorter than the view draws them. + */ +internal fun inViewSpanOrder(text: CharSequence): CharSequence = + if (text is SpannableStringBuilder) InsertionOrderedSpannable(text) else text + /** * Hides that [buffer] is a `SpannableStringBuilder`. Layout reads a builder's paragraph * spans in position order rather than insertion order, which paints nested list margins