mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-10-11 12:42:43 +02:00
Single pass to avoid multiple intermediate lists
O(n) traversal (no drop/takeWhile/filter allocations) Mutable buffer for collecting images
This commit is contained in:
@@ -561,22 +561,27 @@ private fun RenderWordsWithImageGallery(
|
|||||||
context: RenderContext,
|
context: RenderContext,
|
||||||
) {
|
) {
|
||||||
var i = 0
|
var i = 0
|
||||||
while (i < words.size) {
|
val n = words.size
|
||||||
|
|
||||||
|
while (i < n) {
|
||||||
val word = words[i]
|
val word = words[i]
|
||||||
|
|
||||||
if (word is ImageSegment || word is Base64Segment) {
|
if (word is ImageSegment || word is Base64Segment) {
|
||||||
// Collect consecutive images (skipping whitespace) using takeWhile
|
// Collect consecutive image/whitespace segments without extra list allocations
|
||||||
fun isImageOrWhitespace(segment: Segment): Boolean =
|
val imageSegments = mutableListOf<Segment>()
|
||||||
segment is ImageSegment ||
|
var j = i
|
||||||
segment is Base64Segment ||
|
|
||||||
(segment is RegularTextSegment && segment.segmentText.isBlank())
|
|
||||||
|
|
||||||
val consecutiveSegments = words.drop(i).takeWhile { isImageOrWhitespace(it) }
|
while (j < n) {
|
||||||
val imageSegments = consecutiveSegments.filter { it is ImageSegment || it is Base64Segment }
|
val seg = words[j]
|
||||||
val j = i + consecutiveSegments.size
|
when {
|
||||||
|
seg is ImageSegment || seg is Base64Segment -> imageSegments.add(seg)
|
||||||
|
seg is RegularTextSegment && seg.segmentText.isBlank() -> { /* skip whitespace */ }
|
||||||
|
else -> break
|
||||||
|
}
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
|
||||||
if (imageSegments.size > 1) {
|
if (imageSegments.size > 1) {
|
||||||
// Multiple images - render as gallery
|
|
||||||
val imageContents =
|
val imageContents =
|
||||||
imageSegments
|
imageSegments
|
||||||
.mapNotNull { segment ->
|
.mapNotNull { segment ->
|
||||||
@@ -592,13 +597,11 @@ private fun RenderWordsWithImageGallery(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Single image - render normally
|
RenderWordWithPreview(imageSegments.firstOrNull() ?: word, context)
|
||||||
RenderWordWithPreview(word, context)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i = j // Skip processed images
|
i = j // jump past processed run
|
||||||
} else {
|
} else {
|
||||||
// Non-image word - render normally
|
|
||||||
RenderWordWithPreview(word, context)
|
RenderWordWithPreview(word, context)
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user