Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Readd anchor image handling #519

Merged
merged 2 commits into from
Nov 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/src/main/res/values-b+sr+Latn/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@
<string name="empty_onboarding_title">Još nema Izvora</string>
<string name="empty_onboarding_prompt">Započni sa dodavanjem Izvora</string>
<string name="article_style_options">Font Opcije</string>
<string name="font_option_vollkorn">Volokorn</string>
<string name="font_option_atkinson_hyperlegible">Atkinson Hiperčitko</string>
<string name="font_option_poppins">Popins</string>
<string name="font_option_vollkorn">Vollkorn</string>
<string name="font_option_atkinson_hyperlegible">Atkinson Hyperlegible</string>
<string name="font_option_poppins">Poppins</string>
<string name="font_option_system_default">Sistemski podrazumevano</string>
<string name="article_font_menu_label">Font</string>
<string name="article_font_scale_label">Veličina Teksta</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-cs/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@
<string name="settings_article_list_summary">Souhrn</string>
<string name="article_style_options">Nastavení fontu</string>
<string name="font_option_vollkorn">Vollkorn</string>
<string name="font_option_atkinson_hyperlegible">Atkinson Hyperčitelný</string>
<string name="font_option_atkinson_hyperlegible">Atkinson Hyperlegible</string>
<string name="font_option_poppins">Poppins</string>
<string name="article_font_menu_label">Font</string>
<string name="article_byline">%1$s krát %2$s krát %3$s</string>
Expand Down
6 changes: 3 additions & 3 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,9 @@
<string name="empty_onboarding_title">No feeds yet</string>
<string name="empty_onboarding_prompt">Start by adding a feed</string>
<string name="article_style_options">Font style options</string>
<string name="font_option_vollkorn">Vollkorn</string>
<string name="font_option_atkinson_hyperlegible">Atkinson Hyperlegible</string>
<string name="font_option_poppins">Poppins</string>
<string name="font_option_vollkorn" translatable="false">Vollkorn</string>
<string name="font_option_atkinson_hyperlegible" translatable="false">Atkinson Hyperlegible</string>
<string name="font_option_poppins" translatable="false">Poppins</string>
<string name="font_option_system_default">System default</string>
<string name="article_font_menu_label">Font</string>
<string name="article_font_scale_label">Font scale</string>
Expand Down
24 changes: 23 additions & 1 deletion capy/src/main/java/com/jocmp/capy/articles/CleanLinks.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.jocmp.capy.articles
import org.jsoup.nodes.Element

internal fun cleanLinks(element: Element) {
element.getElementsByTag("img").forEachIndexed{ index, child ->
element.getElementsByTag("img").forEachIndexed { index, child ->
child.attr("src", child.absUrl("src"))

if (index > 0) {
Expand All @@ -14,4 +14,26 @@ internal fun cleanLinks(element: Element) {
element.select("img[data-src]").forEach { child ->
child.attr("src", child.absUrl("data-src"))
}

extractChildImages(element)
}

private fun extractChildImages(document: Element) {
document.select("a img").forEach {
attachImageToAnchorParent(it)
}
}

private fun attachImageToAnchorParent(img: Element) {
val parent = img.parentNode() as Element?
if (parent == null || parent.tagName() == "body") {
return;
} else if (parent.tagName() == "a") {
(parent.parentNode() as Element?)?.apply {
appendChild(img)
}
parent.remove()
} else {
attachImageToAnchorParent(img)
}
}
2 changes: 1 addition & 1 deletion capy/src/main/java/com/jocmp/capy/articles/FontOption.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ enum class FontOption {
val sorted: List<FontOption>
get() = listOf(
SYSTEM_DEFAULT,
POPPINS,
ATKINSON_HYPERLEGIBLE,
POPPINS,
VOLLKORN
)
}
Expand Down
65 changes: 65 additions & 0 deletions capy/src/test/java/com/jocmp/capy/articles/CleanLinksTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.jocmp.capy.articles

import com.jocmp.capy.articles.HtmlHelpers.html
import kotlin.test.Test

class CleanLinksTest {
@Test
fun `makes all subsequent links lazy loaded`() {
val document = html {
"""
<img src="https://example.com/1.png">
<img src="https://example.com/2.png">
<img src="https://example.com/3.png">
"""
}

cleanLinks(document)

HtmlHelpers.assertEquals(document) {
"""
<img src="https://example.com/1.png">
<img src="https://example.com/2.png" loading="lazy">
<img src="https://example.com/3.png" loading="lazy">
"""
}
}

@Test
fun `moves lazy-loaded src to src attribute`() {
val document = html {
"""
<img data-src="https://example.com/1.png">
"""
}

cleanLinks(document)

HtmlHelpers.assertEquals(document) {
"""
<img data-src="https://example.com/1.png" src="https://example.com/1.png">
"""
}
}

@Test
fun `pulls nested images out of links`() {
val document = html {
"""
<img src="https://example.com/1.png">
<a href=""https://example.com/nested.png">
<img src="https://example.com/nested.png">
</a>
"""
}

cleanLinks(document)

HtmlHelpers.assertEquals(document) {
"""
<img src="https://example.com/1.png">
<img src="https://example.com/nested.png" loading="lazy">
"""
}
}
}
28 changes: 28 additions & 0 deletions capy/src/test/java/com/jocmp/capy/articles/HtmlHelpers.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.jocmp.capy.articles

import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import kotlin.test.assertEquals

object HtmlHelpers {
fun html(content: () -> String): Document {
val documentString = """
<html>
<body>
${content()}
</body>
</html>
""".trimIndent()

val doc = Jsoup.parse(documentString)
return doc
}

fun assertEquals(actual: Document, expected: () -> String) {
assertEquals(expected = snapshot(expected()), actual = actual.body().html())
}

private fun snapshot(content: String): String {
return content.trimIndent().lines().joinToString(" ")
}
}