Skip to content

Commit

Permalink
Handle more URL types
Browse files Browse the repository at this point in the history
This is a partial fix to #556, but it at least prevents crashing when an unknown
URL type is encountered. There is still some work to do, since the
markdown plugin doesn't properly interpret URLs the way we want.

User-related parsing still doesn't work because there's work needed in
the markdown layer, but once that's done, this should just work as
intended.
  • Loading branch information
beatgammit committed Jun 15, 2023
1 parent f680226 commit 8b75fd2
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
42 changes: 42 additions & 0 deletions app/src/main/java/com/jerboa/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,49 @@ fun LazyListState.isScrolledToEnd(): Boolean {
return out
}

/*
* Parses a "url" and returns a spec-compliant Url:
*
* - https://host/path - leave as-is
* - /c/community -> https://currentInstance/c/community
* - /c/community@instance -> https://instance/c/community
* - !community@instance -> https://instance/c/community
* - @user@instance -> https://instance/u/user
*/
fun parseUrl(url: String): String? {
if (url.startsWith("https://")) {
return url
} else if (url.startsWith("/c/")) {
if (url.count({ c -> c == '@' }) == 1) {
val (community, host) = url.split("@", limit = 2)
return "https://$host$community"
}
return "https://${API.currentInstance}$url"
} else if (url.startsWith("/u/")) {
if (url.count({ c -> c == '@' }) == 1) {
val (userPath, host) = url.split("@", limit = 2)
return "https://$host$userPath"
}
return "https://${API.currentInstance}$url"
} else if (url.startsWith("!")) {
if (url.count({ c -> c == '@' }) == 1) {
val (community, host) = url.substring(1).split("@", limit = 2)
return "https://$host/c/$community"
}
return "https://${API.currentInstance}/c/${url.substring(1)}"
} else if (url.startsWith("@")) {
if (url.count({ c -> c == '@' }) == 2) {
val (user, host) = url.substring(1).split("@", limit = 2)
return "https://$host/u/$user"
}
return "https://${API.currentInstance}/u/${url.substring(1)}"
}
return null
}

fun openLink(url: String, ctx: Context, useCustomTab: Boolean, usePrivateTab: Boolean) {
val url = parseUrl(url) ?: return

if (useCustomTab) {
val intent = CustomTabsIntent.Builder()
.build().apply {
Expand Down
16 changes: 16 additions & 0 deletions app/src/test/java/com/jerboa/UtilsKtTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.jerboa
import androidx.compose.ui.unit.dp
import com.jerboa.datatypes.api.GetUnreadCountResponse
import com.jerboa.ui.theme.SMALL_PADDING
import com.jerboa.api.API
import org.junit.Assert.*
import org.junit.Test

Expand Down Expand Up @@ -136,4 +137,19 @@ class UtilsKtTest {
assertEquals("1.2M", siFormat(1234500))
assertEquals("12M", siFormat(12345000))
}

@Test
fun testParseUrl() {
val cases = mapOf(
"https://feddit.de" to "https://feddit.de",
"/c/community" to "https://${API.currentInstance}/c/community",
"/c/[email protected]" to "https://instance.ml/c/community",
"[email protected]" to "https://instance.ml/c/community",
"!community" to "https://${API.currentInstance}/c/community",
"/u/[email protected]" to "https://instance.ml/u/user",
"@[email protected]" to "https://instance.ml/u/user",
)

cases.forEach { (url, exp) -> assertEquals(exp, parseUrl(url)) }
}
}

0 comments on commit 8b75fd2

Please sign in to comment.