package net.pterodactylus.sone.text
-import freenet.keys.FreenetURI
-import freenet.support.Base64
-import net.pterodactylus.sone.data.Sone
-import net.pterodactylus.sone.data.impl.IdOnlySone
-import net.pterodactylus.sone.database.PostProvider
-import net.pterodactylus.sone.database.SoneProvider
-import net.pterodactylus.sone.text.LinkType.CHK
-import net.pterodactylus.sone.text.LinkType.FREEMAIL
-import net.pterodactylus.sone.text.LinkType.HTTP
-import net.pterodactylus.sone.text.LinkType.HTTPS
-import net.pterodactylus.sone.text.LinkType.KSK
-import net.pterodactylus.sone.text.LinkType.POST
-import net.pterodactylus.sone.text.LinkType.SONE
-import net.pterodactylus.sone.text.LinkType.SSK
+import freenet.keys.*
+import freenet.support.*
+import net.pterodactylus.sone.data.*
+import net.pterodactylus.sone.data.impl.*
+import net.pterodactylus.sone.database.*
+import net.pterodactylus.sone.text.LinkType.*
import net.pterodactylus.sone.text.LinkType.USK
-import org.bitpedia.util.Base32
-import java.net.MalformedURLException
+import org.bitpedia.util.*
+import java.net.*
import javax.inject.*
/**
}
}.map { it.first }.toList()
+ private val NextLink.linkWithoutBacklink: String
+ get() {
+ val backlink = link.indexOf("/../")
+ val query = link.indexOf("?")
+ return if ((backlink > -1) && ((query == -1) || (query > -1) && (backlink < query)))
+ link.substring(0, backlink)
+ else
+ link
+ }
+
private fun NextLink.toPart(context: SoneTextParserContext?) = when (linkType) {
KSK, CHK -> try {
- FreenetURI(link).let { freenetUri ->
+ FreenetURI(linkWithoutBacklink).let { freenetUri ->
FreenetLinkPart(
- link,
- if (freenetUri.isKSK) {
- freenetUri.guessableKey
- } else {
- freenetUri.metaString ?: freenetUri.docName ?: link.substring(0, 9)
- },
- link.split('?').first()
+ linkWithoutBacklink,
+ freenetUri.allMetaStrings?.lastOrNull { it != "" } ?: freenetUri.docName ?: linkWithoutBacklink.substring(0, 9),
+ linkWithoutBacklink.split('?').first()
)
}
} catch (e: MalformedURLException) {
- PlainTextPart(link)
+ PlainTextPart(linkWithoutBacklink)
}
SSK, USK ->
try {
- FreenetURI(link).let { uri ->
+ FreenetURI(linkWithoutBacklink).let { uri ->
uri.allMetaStrings
- ?.takeIf { (it.size > 1) || ((it.size == 1) && (it.single() != ""))}
+ ?.takeIf { (it.size > 1) || ((it.size == 1) && (it.single() != "")) }
?.lastOrNull()
?: uri.docName
?: "${uri.keyType}@${uri.routingKey.freenetBase64}"
- }.let { FreenetLinkPart(link.removeSuffix("/"), it, trusted = context?.routingKey?.contentEquals(FreenetURI(link).routingKey) == true) }
+ }.let { FreenetLinkPart(linkWithoutBacklink.removeSuffix("/"), it, trusted = context?.routingKey?.contentEquals(FreenetURI(linkWithoutBacklink).routingKey) == true) }
} catch (e: MalformedURLException) {
- PlainTextPart(link)
+ PlainTextPart(linkWithoutBacklink)
}
SONE -> link.substring(7).let { SonePart(soneProvider?.getSone(it) ?: IdOnlySone(it)) }
POST -> postProvider?.getPost(link.substring(7))?.let { PostPart(it) } ?: PlainTextPart(link)