2021-12-02 18:11:34 +00:00
|
|
|
package corewala.buran
|
|
|
|
|
2022-07-29 19:09:26 +00:00
|
|
|
import corewala.toURI
|
|
|
|
|
|
|
|
const val GEMSCHEME = "gemini://"
|
2021-12-02 18:11:34 +00:00
|
|
|
const val TRAVERSE = "../"
|
|
|
|
const val SOLIDUS = "/"
|
|
|
|
const val DIREND = "/"
|
2022-08-04 16:17:20 +00:00
|
|
|
const val QUERY = "?"
|
2021-12-02 18:11:34 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* Easy uri path handling for Gemini
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
class OppenURI constructor(private var ouri: String) {
|
|
|
|
|
|
|
|
constructor(): this("")
|
|
|
|
|
|
|
|
var host: String = ""
|
2022-07-29 19:09:26 +00:00
|
|
|
var scheme: String = ""
|
2021-12-02 18:11:34 +00:00
|
|
|
|
|
|
|
init {
|
2022-07-29 19:09:26 +00:00
|
|
|
if(ouri.isNotEmpty()){
|
|
|
|
host = ouri.toURI().host
|
|
|
|
scheme = ouri.toURI().scheme
|
|
|
|
}
|
2021-12-02 18:11:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fun set(ouri: String){
|
|
|
|
this.ouri = ouri
|
2022-07-29 19:09:26 +00:00
|
|
|
if(ouri.isNotEmpty()){
|
|
|
|
host = ouri.toURI().host
|
|
|
|
scheme = ouri.toURI().scheme
|
|
|
|
}
|
2021-12-02 18:11:34 +00:00
|
|
|
}
|
|
|
|
|
2022-05-15 16:26:06 +00:00
|
|
|
fun resolve(reference: String): String{
|
2022-07-29 19:09:26 +00:00
|
|
|
if(ouri == "$GEMSCHEME$host") ouri = "$ouri/"
|
2022-05-15 16:26:06 +00:00
|
|
|
when {
|
2022-07-29 19:09:26 +00:00
|
|
|
reference.startsWith(GEMSCHEME) -> set(reference)
|
|
|
|
reference.startsWith(SOLIDUS) -> ouri = "$scheme://$host$reference"
|
2021-12-02 18:11:34 +00:00
|
|
|
reference.startsWith(TRAVERSE) -> {
|
|
|
|
if(!ouri.endsWith(DIREND)) ouri = ouri.removeFile()
|
|
|
|
val traversalCount = reference.split(TRAVERSE).size - 1
|
|
|
|
ouri = traverse(traversalCount) + reference.replace(TRAVERSE, "")
|
|
|
|
}
|
2022-08-04 16:17:20 +00:00
|
|
|
reference.startsWith(QUERY) -> {
|
|
|
|
ouri = if(reference.contains(QUERY)){
|
|
|
|
ouri.substringBefore(QUERY) + reference
|
|
|
|
}else{
|
|
|
|
ouri + reference
|
|
|
|
}
|
|
|
|
}
|
2021-12-02 18:11:34 +00:00
|
|
|
else -> {
|
|
|
|
ouri = when {
|
2022-08-04 16:17:20 +00:00
|
|
|
ouri.endsWith(DIREND) -> {
|
|
|
|
"${ouri}$reference"
|
|
|
|
}
|
2021-12-02 18:11:34 +00:00
|
|
|
else -> "${ouri.substring(0, ouri.lastIndexOf("/"))}/$reference"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-05-15 16:26:06 +00:00
|
|
|
return ouri
|
2021-12-02 18:11:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun traverse(count: Int): String{
|
2022-07-29 19:09:26 +00:00
|
|
|
val path = ouri.removePrefix("$GEMSCHEME$host")
|
2021-12-02 18:11:34 +00:00
|
|
|
val segments = path.split(SOLIDUS).filter { it.isNotEmpty() }
|
|
|
|
val segmentCount = segments.size
|
2022-07-29 19:09:26 +00:00
|
|
|
var nouri = "$GEMSCHEME$host"
|
2021-12-02 18:11:34 +00:00
|
|
|
|
|
|
|
segments.forEachIndexed{ index, segment ->
|
|
|
|
if(index < segmentCount - count){
|
|
|
|
nouri += "/$segment"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return "$nouri/"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
fun copy(): OppenURI = OppenURI(ouri)
|
|
|
|
|
|
|
|
override fun toString(): String = ouri
|
|
|
|
|
|
|
|
private fun String.removeFile(): String{
|
|
|
|
return this.substring(0, ouri.lastIndexOf("/") + 1)
|
|
|
|
}
|
|
|
|
}
|