summaryrefslogtreecommitdiff
path: root/src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt
diff options
context:
space:
mode:
authorKyren223 <ulmliad223@gmail.com>2024-05-09 18:09:24 +0300
committerKyren223 <ulmliad223@gmail.com>2024-05-09 18:09:24 +0300
commit9b9c0f0594209b8c4ecdb7901293734ccf567437 (patch)
tree0843cb07aa00ce80418f01a1ad083f72e45d7d93 /src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt
parent1e30fa7ded9939fa45a45f82f84c1e8cd95d68aa (diff)
Finished implementing all the settings, mapping menu, trident list menu, and fixed all the bugs/issues.
Added more index actions for a total of 10 actions (compared to the original 4). Updated README.md and TODO.md. Changed version to 2.0.0. Versions now follow the semver standard. which means that for each major version there will be backwards incompatible changes. for minor versions there will be new features and bug fixes. and for patch versions there will be bug fixes only.
Diffstat (limited to 'src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt')
-rw-r--r--src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt88
1 files changed, 69 insertions, 19 deletions
diff --git a/src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt b/src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt
index b7e19ac..b2302d7 100644
--- a/src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt
+++ b/src/main/kotlin/me/kyren223/trident/utils/TridentUtils.kt
@@ -2,9 +2,10 @@ package me.kyren223.trident.utils
import com.intellij.ide.util.PropertiesComponent
import com.intellij.openapi.project.Project
+import com.intellij.openapi.project.guessProjectDir
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
-import me.kyren223.trident.data.SettingsState
+import me.kyren223.trident.data.Settings
object TridentList {
private const val PROPERTIES_KEY = "TridentList"
@@ -16,12 +17,41 @@ object TridentList {
return expandedPath.isNotBlank() && LocalFileSystem.getInstance().findFileByPath(expandedPath) != null
}
+ private fun getShortPath(path: String): String? {
+ // For path `/path/to/file.ext` the result should be `$file`
+ // Unless for dot files, in which case it should be `$ext`
+ // Examples:
+ // - `/path/to/TridentUtils.kt` -> `$TridentUtils`
+ // - `/path/to/someBinary` -> `$someBinary`
+ // - `/path/to/.ideavimrc` -> `$ideavimrc`
+ return path.split("/")
+ .lastOrNull()
+ ?.let {
+ it.split(".")
+ .let { parts ->
+ when (parts.size) {
+ 0 -> it
+ 1, 2 -> parts.firstOrNull()
+ else -> return null
+ }
+ }
+ }
+ ?.let { "\$${it}" }
+ }
+
fun append(project: Project, file: VirtualFile) {
- // TODO add a setting to automatically add an expansion to mappings if it doesn't exist
- // Should be `$<file>` for `<path>/<file>.<extension>`
- // Unless if the file starts with a dot, in which case it should be `$<extension>`
val files = get(project).toMutableList()
- files.add(file.path)
+
+ val automaticMapping = Settings.state.automaticMapping
+ val path = if (automaticMapping) {
+ val shortPath = getShortPath(file.path) ?: file.path
+ if (TridentMappings.exists(project, shortPath)) file.path else {
+ TridentMappings.append(project, shortPath, file.path)
+ shortPath
+ }
+ } else file.path
+
+ files.add(path)
set(project, files)
}
@@ -37,7 +67,9 @@ object TridentList {
}
private fun getFiles(project: Project): List<VirtualFile> {
- return get(project).mapNotNull { LocalFileSystem.getInstance().findFileByPath(it) }
+ return get(project)
+ .map { TridentMappings.expand(project, it) }
+ .mapNotNull { LocalFileSystem.getInstance().findFileByPath(it) }
}
fun getIndexOfFile(project: Project, file: VirtualFile): Int? {
@@ -46,9 +78,9 @@ object TridentList {
}
fun select(project: Project, index: Int): VirtualFile? {
- // TODO make this a setting if it should "cycle" or not
+ val cycle = Settings.state.indexCycling
val count = getFiles(project).size
- val i = ((index % count) + count) % count
+ val i = if (cycle) ((index % count) + count) % count else index
val files = getFiles(project)
return files.getOrNull(i)
}
@@ -58,14 +90,13 @@ object TridentMappings {
private const val PROPERTIES_KEY = "TridentMappings"
private fun isValidEntry(key: String, value: String): Boolean {
- // TODO change requirements, key should be alphanumeric and must only have 1 $ as the first character
// Requirements:
// - Key and value must not be blank
- // - key must only contain alphanumeric characters and $
+ // - key must only contain alphanumeric characters and start with $
// - value must not contain =
return key.isNotBlank() && value.isNotBlank() &&
- key.matches(Regex("^[a-zA-Z0-9\$]+$")) &&
- value.matches(Regex("^[^=]+$"))
+ key.matches(Regex("""^\$[a-zA-Z0-9]+$""")) &&
+ value.matches(Regex("""^[^=]+$"""))
}
fun append(project: Project, key: String, value: String, overwrite: Boolean = false) {
@@ -89,18 +120,37 @@ object TridentMappings {
fun get(project: Project): Map<String, String> {
val properties = PropertiesComponent.getInstance(project)
val list = properties.getList(PROPERTIES_KEY) ?: return emptyMap()
- return list.map { it.split("=") }.associate { it[0] to it[1] }
+ val map = list
+ .map { it.split("=") }
+ .associate { it[0] to it[1] }
+ .toMutableMap()
+ project.guessProjectDir()?.let {
+ map["..."] = it.path
+ map["\$project"] = it.path
+ }
+ return map
}
fun expand(project: Project, path: String): String {
- val recursive = SettingsState.instance.recursiveMapping
+ val recursive = Settings.state.recursiveMapping
val mappings = get(project).toList().sortedByDescending { it.first.length }
- var expanded = path
-
- mappings.forEach { (key, value) ->
- expanded = expanded.replace(key, if (recursive) expand(project, value) else value)
+ var expandedPath = path
+ while (true) {
+ var expanded = false
+ mappings.forEach { (key, value) ->
+ val expansion = expandedPath.replace(key, value)
+ if (expansion != expandedPath) {
+ expandedPath = expansion
+ expanded = true
+ }
+ }
+ if (!recursive || !expanded) break
}
- return expanded
+ return expandedPath
+ }
+
+ fun exists(project: Project, key: String): Boolean {
+ return get(project).containsKey(key)
}
} \ No newline at end of file