Skip to content

Commit cc93da6

Browse files
BugFix: Image goes over the text (#117)
1 parent 4cbb0b9 commit cc93da6

4 files changed

Lines changed: 60 additions & 22 deletions

File tree

  • android-sample/src/main/java/com/zachklipp/richtext/sample
  • desktop-sample/src/main/kotlin/com/halilibo/richtext/desktop
  • richtext-commonmark/src/androidMain/kotlin/com/halilibo/richtext/markdown
  • richtext-ui/src/commonMain/kotlin/com/halilibo/richtext/ui/string

android-sample/src/main/java/com/zachklipp/richtext/sample/MarkdownSample.kt

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.compose.foundation.verticalScroll
1212
import androidx.compose.material.Card
1313
import androidx.compose.material.Checkbox
1414
import androidx.compose.material.MaterialTheme
15+
import androidx.compose.material.ProvideTextStyle
1516
import androidx.compose.material.Surface
1617
import androidx.compose.material.Text
1718
import androidx.compose.material.darkColors
@@ -25,8 +26,10 @@ import androidx.compose.runtime.setValue
2526
import androidx.compose.ui.Alignment
2627
import androidx.compose.ui.Modifier
2728
import androidx.compose.ui.platform.LocalContext
29+
import androidx.compose.ui.text.TextStyle
2830
import androidx.compose.ui.tooling.preview.Preview
2931
import androidx.compose.ui.unit.dp
32+
import androidx.compose.ui.unit.em
3033
import com.halilibo.richtext.markdown.Markdown
3134
import com.halilibo.richtext.markdown.MarkdownParseOptions
3235
import com.halilibo.richtext.ui.RichTextStyle
@@ -100,17 +103,19 @@ import com.halilibo.richtext.ui.resolveDefaults
100103

101104
SelectionContainer {
102105
Column(Modifier.verticalScroll(rememberScrollState())) {
103-
MaterialRichText(
104-
style = richTextStyle,
105-
modifier = Modifier.padding(8.dp),
106-
) {
107-
Markdown(
108-
content = sampleMarkdown,
109-
markdownParseOptions = markdownParseOptions,
110-
onLinkClicked = {
111-
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
112-
}
113-
)
106+
ProvideTextStyle(TextStyle(lineHeight = 1.3.em)) {
107+
MaterialRichText(
108+
style = richTextStyle,
109+
modifier = Modifier.padding(8.dp),
110+
) {
111+
Markdown(
112+
content = sampleMarkdown,
113+
markdownParseOptions = markdownParseOptions,
114+
onLinkClicked = {
115+
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
116+
}
117+
)
118+
}
114119
}
115120
}
116121
}
@@ -155,9 +160,14 @@ private val sampleMarkdown = """
155160
---
156161
157162
## Full-bleed Image
158-
159163
![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/1920px-Image_created_with_a_mobile_phone.png)
160164
165+
## Images smaller than the width should center
166+
![](https://cdn.nostr.build/p/4a84.png)
167+
168+
On LineHeight bug, the image below goes over this text.
169+
![](https://cdn.nostr.build/p/PxZ0.jpg)
170+
161171
## Emphasis
162172
163173
Emphasis, aka italics, with *asterisks* or _underscores_.

desktop-sample/src/main/kotlin/com/halilibo/richtext/desktop/Main.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.foundation.rememberScrollState
1515
import androidx.compose.foundation.text.BasicTextField
1616
import androidx.compose.foundation.text.selection.SelectionContainer
1717
import androidx.compose.foundation.verticalScroll
18+
import androidx.compose.material.ProvideTextStyle
1819
import androidx.compose.material.Slider
1920
import androidx.compose.material.Surface
2021
import androidx.compose.material.Text
@@ -26,8 +27,10 @@ import androidx.compose.runtime.remember
2627
import androidx.compose.runtime.setValue
2728
import androidx.compose.ui.Modifier
2829
import androidx.compose.ui.graphics.Color
30+
import androidx.compose.ui.text.TextStyle
2931
import androidx.compose.ui.unit.IntOffset
3032
import androidx.compose.ui.unit.dp
33+
import androidx.compose.ui.unit.em
3134
import androidx.compose.ui.unit.sp
3235
import androidx.compose.ui.window.singleWindowApplication
3336
import com.halilibo.richtext.markdown.Markdown
@@ -76,13 +79,15 @@ fun main(): Unit = singleWindowApplication(
7679
.padding(8.dp)
7780
)
7881
}
79-
MaterialRichText(
80-
modifier = Modifier
81-
.weight(1f)
82-
.verticalScroll(rememberScrollState()),
83-
style = richTextStyle
84-
) {
85-
Markdown(content = text)
82+
ProvideTextStyle(TextStyle(lineHeight = 1.3.em)) {
83+
MaterialRichText(
84+
modifier = Modifier
85+
.weight(1f)
86+
.verticalScroll(rememberScrollState()),
87+
style = richTextStyle
88+
) {
89+
Markdown(content = text)
90+
}
8691
}
8792
}
8893
}
@@ -177,6 +182,18 @@ private val sampleMarkdown = """
177182
###### Header 6
178183
---
179184
185+
## Full-bleed Image
186+
187+
![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/1920px-Image_created_with_a_mobile_phone.png)
188+
189+
## Images smaller than the width should center
190+
![](https://cdn.nostr.build/p/4a84.png)
191+
192+
On LineHeight bug, the image below goes over this text.
193+
![](https://cdn.nostr.build/p/PxZ0.jpg)
194+
195+
---
196+
180197
## Emphasis
181198
182199
Emphasis, aka italics, with *asterisks* or _underscores_.

richtext-commonmark/src/androidMain/kotlin/com/halilibo/richtext/markdown/RemoteImage.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import androidx.compose.runtime.Composable
77
import androidx.compose.runtime.derivedStateOf
88
import androidx.compose.runtime.getValue
99
import androidx.compose.runtime.remember
10+
import androidx.compose.ui.Alignment
1011
import androidx.compose.ui.Modifier
1112
import androidx.compose.ui.geometry.isSpecified
1213
import androidx.compose.ui.layout.ContentScale
1314
import androidx.compose.ui.platform.LocalContext
1415
import androidx.compose.ui.platform.LocalDensity
1516
import androidx.compose.ui.unit.dp
16-
import coil.annotation.ExperimentalCoilApi
1717
import coil.compose.rememberAsyncImagePainter
1818
import coil.request.ImageRequest
1919
import coil.size.Size
@@ -23,7 +23,6 @@ private val DEFAULT_IMAGE_SIZE = 64.dp
2323
/**
2424
* Implementation of RemoteImage by using Coil library for Android.
2525
*/
26-
@OptIn(ExperimentalCoilApi::class)
2726
@Composable
2827
internal actual fun RemoteImage(
2928
url: String,
@@ -41,7 +40,7 @@ internal actual fun RemoteImage(
4140

4241
val density = LocalDensity.current
4342

44-
BoxWithConstraints {
43+
BoxWithConstraints(modifier, contentAlignment = Alignment.Center) {
4544
val sizeModifier by remember(density, painter) {
4645
derivedStateOf {
4746
val painterIntrinsicSize = painter.state.painter?.intrinsicSize

richtext-ui/src/commonMain/kotlin/com/halilibo/richtext/ui/string/RichTextString.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.compose.foundation.text.appendInlineContent
66
import androidx.compose.runtime.Immutable
77
import androidx.compose.ui.graphics.Color
88
import androidx.compose.ui.text.AnnotatedString
9+
import androidx.compose.ui.text.ParagraphStyle
910
import androidx.compose.ui.text.SpanStyle
1011
import androidx.compose.ui.text.buildAnnotatedString
1112
import androidx.compose.ui.text.font.FontFamily
@@ -295,7 +296,18 @@ public data class RichTextString internal constructor(
295296
) {
296297
val tag = randomUUID()
297298
formatObjects["inline:$tag"] = content
299+
300+
// Resets the style to defaults.
301+
//
302+
// This is important for inline content because the user might set a global line height
303+
// via ProvideTextStyle(TextStyle(lineHeight = 1.3.em)) { ... }
304+
// Once set, the line height is fixed for all objects and any inline content (like images)
305+
// will expand over the text. Since this is not a text section, it should be fine.
306+
//
307+
// Fixed line height seems to only affect mobile.
308+
builder.pushStyle(ParagraphStyle())
298309
builder.appendInlineContent(tag, alternateText)
310+
builder.pop()
299311
}
300312

301313
/**

0 commit comments

Comments
 (0)