Skip to content

Commit 432d9ab

Browse files
committed
Added support for data-img-url in images
1 parent 2fa239a commit 432d9ab

File tree

2 files changed

+79
-20
lines changed

2 files changed

+79
-20
lines changed

app/src/main/java/com/nononsenseapps/feeder/ui/compose/text/HtmlToComposable.kt

+31-8
Original file line numberDiff line numberDiff line change
@@ -1159,6 +1159,7 @@ private fun Element.firstBestDescendantImg(baseUrl: String): Element? {
11591159
baseUrl = baseUrl,
11601160
srcSet = element.attr("srcset") ?: "",
11611161
absSrc = element.attr("abs:src") ?: "",
1162+
dataImgUrl = element.attr("data-img-src") ?: "",
11621163
width = element.attr("width")?.toIntOrNull(),
11631164
height = element.attr("height")?.toIntOrNull(),
11641165
).hasImage
@@ -1258,6 +1259,7 @@ internal fun getImageSource(
12581259
baseUrl = baseUrl,
12591260
srcSet = element.attr("srcset") ?: "",
12601261
absSrc = element.attr("abs:src") ?: "",
1262+
dataImgUrl = element.attr("data-img-url") ?: "",
12611263
width = element.attr("width")?.toIntOrNull(),
12621264
height = element.attr("height")?.toIntOrNull(),
12631265
)
@@ -1266,10 +1268,11 @@ internal class ImageCandidates(
12661268
val baseUrl: String,
12671269
val srcSet: String,
12681270
val absSrc: String,
1271+
val dataImgUrl: String,
12691272
val width: Int?,
12701273
val height: Int?,
12711274
) {
1272-
val hasImage: Boolean = srcSet.isNotBlank() || absSrc.isNotBlank()
1275+
val hasImage: Boolean = srcSet.isNotBlank() || absSrc.isNotBlank() || dataImgUrl.isNotBlank()
12731276
val notHasImage: Boolean = !hasImage
12741277

12751278
fun getBestImageForMaxSize(
@@ -1290,7 +1293,7 @@ internal class ImageCandidates(
12901293
// Assume it corresponds to 1x pixel density
12911294
(1.0f / pixelDensity) to
12921295
ImageCandidateFromSetWithPixelDensity(
1293-
url = candidate.first(),
1296+
url = StringUtil.resolve(baseUrl, candidate.first()),
12941297
pixelDensity = 1.0f,
12951298
)
12961299
} else {
@@ -1302,7 +1305,7 @@ internal class ImageCandidates(
13021305

13031306
ratio to
13041307
ImageCandidateFromSetWithWidth(
1305-
url = candidate.first(),
1308+
url = StringUtil.resolve(baseUrl, candidate.first()),
13061309
width = width.toInt(),
13071310
)
13081311
}
@@ -1313,7 +1316,7 @@ internal class ImageCandidates(
13131316

13141317
ratio to
13151318
ImageCandidateFromSetWithPixelDensity(
1316-
url = candidate.first(),
1319+
url = StringUtil.resolve(baseUrl, candidate.first()),
13171320
pixelDensity = density,
13181321
)
13191322
}
@@ -1333,8 +1336,12 @@ internal class ImageCandidates(
13331336
}
13341337
.second
13351338

1336-
return if (setCandidate is NoImageCandidate) {
1337-
absSrc.takeIf { it.isNotBlank() }?.let {
1339+
if (setCandidate !is NoImageCandidate) {
1340+
return setCandidate
1341+
}
1342+
1343+
val dataImgUrlCandidate =
1344+
dataImgUrl.takeIf { it.isNotBlank() }?.let {
13381345
val url = StringUtil.resolve(baseUrl, it)
13391346
if (width != null && height != null) {
13401347
ImageCandidateWithSize(
@@ -1348,9 +1355,25 @@ internal class ImageCandidates(
13481355
)
13491356
}
13501357
} ?: NoImageCandidate
1351-
} else {
1352-
setCandidate
1358+
1359+
if (dataImgUrlCandidate !is NoImageCandidate) {
1360+
return dataImgUrlCandidate
13531361
}
1362+
1363+
return absSrc.takeIf { it.isNotBlank() }?.let {
1364+
val url = StringUtil.resolve(baseUrl, it)
1365+
if (width != null && height != null) {
1366+
ImageCandidateWithSize(
1367+
url = url,
1368+
width = width,
1369+
height = height,
1370+
)
1371+
} else {
1372+
ImageCandidateUnknownSize(
1373+
url = url,
1374+
)
1375+
}
1376+
} ?: NoImageCandidate
13541377
} catch (_: Throwable) {
13551378
return NoImageCandidate
13561379
}

app/src/test/java/com/nononsenseapps/feeder/ui/compose/text/HtmlToComposableUnitTest.kt

+48-12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
@file:Suppress("ktlint:standard:max-line-length")
2+
13
package com.nononsenseapps.feeder.ui.compose.text
24

35
import io.mockk.every
@@ -16,6 +18,7 @@ class HtmlToComposableUnitTest {
1618
fun setup() {
1719
every { element.attr("width") } returns null
1820
every { element.attr("height") } returns null
21+
every { element.attr("data-img-url") } returns null
1922
}
2023

2124
@Test
@@ -194,10 +197,11 @@ class HtmlToComposableUnitTest {
194197
assertTrue(result.hasImage)
195198

196199
val maxSize = 1024
197-
val best = result.getBestImageForMaxSize(
198-
maxSize,
199-
8.0f,
200-
)
200+
val best =
201+
result.getBestImageForMaxSize(
202+
maxSize,
203+
8.0f,
204+
)
201205
assertEquals(
202206
"https://www.politico.eu/cdn-cgi/image/width=1024,quality=80,onerror=redirect,format=auto/wp-content/uploads/2022/10/07/thumbnail_Kal-econ-cartoon-10-7-22synd.jpeg",
203207
best.url,
@@ -224,16 +228,47 @@ class HtmlToComposableUnitTest {
224228
assertTrue(result.hasImage)
225229

226230
val maxSize = 1024
227-
val best = result.getBestImageForMaxSize(
228-
maxSize,
229-
8.0f,
230-
)
231+
val best =
232+
result.getBestImageForMaxSize(
233+
maxSize,
234+
8.0f,
235+
)
231236
assertEquals(
232237
"https://duet-cdn.vox-cdn.com/thumbor/184x0:2614x1535/1080x720/filters:focal(1847x240:1848x241):format(webp)/cdn.vox-cdn.com/uploads/chorus_asset/file/24842461/Screenshot_2023_08_10_at_12.22.58_PM.png",
233238
best.url,
234239
)
235240
}
236241

242+
@Test
243+
fun findImageForXDAWithDataImgUrl() {
244+
every {
245+
element.attr("data-img-url")
246+
} returns "https://static1.xdaimages.com/wordpress/wp-content/uploads/2023/12/onedrive-app-for-microsoft-teams.png"
247+
every {
248+
element.attr("srcset")
249+
} returns null
250+
every {
251+
element.attr("abs:src")
252+
} returns null
253+
every { element.attr("width") } returns null
254+
every { element.attr("height") } returns null
255+
256+
val result = getImageSource("https://www.xda-developers.com", element)
257+
258+
assertTrue(result.hasImage)
259+
260+
val maxSize = 1024
261+
val best =
262+
result.getBestImageForMaxSize(
263+
maxSize,
264+
8.0f,
265+
)
266+
assertEquals(
267+
"https://static1.xdaimages.com/wordpress/wp-content/uploads/2023/12/onedrive-app-for-microsoft-teams.png",
268+
best.url,
269+
)
270+
}
271+
237272
@Test
238273
fun noSourcesMeansEmptyResult() {
239274
every { element.attr("srcset") } returns ""
@@ -246,10 +281,11 @@ class HtmlToComposableUnitTest {
246281
assertFalse(result.hasImage)
247282

248283
val maxSize = 1024
249-
val best = result.getBestImageForMaxSize(
250-
maxSize,
251-
8.0f,
252-
)
284+
val best =
285+
result.getBestImageForMaxSize(
286+
maxSize,
287+
8.0f,
288+
)
253289
assertEquals(
254290
"",
255291
best.url,

0 commit comments

Comments
 (0)