-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
26d11ab
commit be220bd
Showing
10 changed files
with
196 additions
and
164 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 0 additions & 40 deletions
40
.../module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/builder/ItemSectionResolver.kt
This file was deleted.
Oops, something went wrong.
112 changes: 0 additions & 112 deletions
112
...t/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/builder/BasicItemResolver.kt
This file was deleted.
Oops, something went wrong.
96 changes: 96 additions & 0 deletions
96
...item/src/main/kotlin/cn/fd/ratziel/module/item/impl/builder/resolver/BasicItemResolver.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
package cn.fd.ratziel.module.item.impl.builder.resolver | ||
|
||
import cn.fd.ratziel.core.Priority | ||
import cn.fd.ratziel.core.serialization.handlePrimitives | ||
import cn.fd.ratziel.core.util.priority | ||
import cn.fd.ratziel.core.util.sortPriority | ||
import cn.fd.ratziel.core.util.splitNonEscaped | ||
import cn.fd.ratziel.function.argument.ArgumentFactory | ||
import cn.fd.ratziel.module.item.api.builder.ItemResolver | ||
import cn.fd.ratziel.module.item.impl.builder.DefaultItemSerializer | ||
import cn.fd.ratziel.module.item.impl.builder.resolver.sectionResolvers.PapiResolver | ||
import cn.fd.ratziel.module.item.impl.builder.resolver.sectionResolvers.RandomResolver | ||
import kotlinx.serialization.json.JsonElement | ||
import kotlinx.serialization.json.JsonPrimitive | ||
import taboolib.common.util.VariableReader | ||
|
||
/** | ||
* BasicItemResolver - 基础解析器 | ||
* | ||
* 解析 [SectionTagResolver] 和玩家变量 | ||
* | ||
* @author TheFloodDragon | ||
* @since 2024/5/24 21:32 | ||
*/ | ||
object BasicItemResolver : ItemResolver { | ||
|
||
val accessibleNodes: MutableSet<String> = DefaultItemSerializer.occupiedNodes.toMutableSet() | ||
|
||
/** | ||
* 字符串解析器 | ||
*/ | ||
val resolvers: MutableList<Priority<SectionStringResolver>> = mutableListOf( | ||
PapiResolver priority -1, | ||
BasicTagResolver priority 99, | ||
) | ||
|
||
override fun resolve(element: JsonElement, arguments: ArgumentFactory): JsonElement = | ||
// 过滤节点 | ||
CleanUpUtil.handleOnFilter(element, accessibleNodes) { filtered -> | ||
// 处理 JsonPrimitive | ||
filtered.value.handlePrimitives { resolvePrimitive(it, arguments) } | ||
} | ||
|
||
fun resolvePrimitive(element: JsonPrimitive, arguments: ArgumentFactory): JsonElement { | ||
var handle = element.content | ||
// 遍历字符串解析器处理 | ||
for (resolver in resolvers.sortPriority()) { | ||
handle = resolver.resolve(handle, arguments) | ||
} | ||
return JsonPrimitive(handle) | ||
} | ||
|
||
object BasicTagResolver : SectionStringResolver { | ||
|
||
/** | ||
* 标签解析器 | ||
*/ | ||
val resolvers: MutableList<SectionTagResolver> = mutableListOf( | ||
RandomResolver | ||
) | ||
|
||
/** | ||
* 参数分割符 | ||
*/ | ||
const val ARGUMENT_SEPRATION_SIGN = ":" | ||
|
||
/** | ||
* 变量读取器 | ||
*/ | ||
val reader = VariableReader("{", "}") | ||
|
||
override fun resolve(element: String, arguments: ArgumentFactory): String = | ||
reader.readToFlatten(element).joinToString("") { | ||
// 如果是标签, 则通过标签解析器解析 | ||
if (it.isVariable) { | ||
handle(it.text, arguments) | ||
} else it.text // 不然就是它本身 | ||
} // 拼接结果成字符串并返回 | ||
|
||
/** | ||
* 寻找 [SectionTagResolver] 并处理 | ||
*/ | ||
fun handle(source: String, arguments: ArgumentFactory): String { | ||
// 分割 | ||
val split = source.splitNonEscaped(ARGUMENT_SEPRATION_SIGN) | ||
// 获取名称 | ||
val name = split.firstOrNull() ?: return source | ||
// 获取解析器 | ||
val resolver = resolvers.find { it.name == name || it.alias.contains(name) } | ||
// 解析并返回 | ||
return resolver?.resolve(split.drop(1), arguments) ?: source | ||
} | ||
|
||
} | ||
|
||
} |
36 changes: 36 additions & 0 deletions
36
...odule-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/builder/resolver/CleanUpUtil.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package cn.fd.ratziel.module.item.impl.builder.resolver | ||
|
||
import cn.fd.ratziel.core.serialization.asMutable | ||
import kotlinx.serialization.json.JsonElement | ||
import kotlinx.serialization.json.JsonObject | ||
import java.util.function.Function | ||
|
||
/** | ||
* CleanUpUtil | ||
* | ||
* @author TheFloodDragon | ||
* @since 2024/6/25 20:03 | ||
*/ | ||
object CleanUpUtil { | ||
|
||
@JvmStatic | ||
fun handleOnFilter( | ||
element: JsonObject, | ||
accessibleNodes: Iterable<String>, | ||
action: Function<Map.Entry<String, JsonElement>, JsonElement> | ||
): JsonObject { | ||
val builder = element.asMutable() | ||
for (entry in builder) { | ||
// 在允许的节点范围内 | ||
if (entry.key in accessibleNodes) { | ||
builder[entry.key] = action.apply(entry) // 通过操作替换节点 | ||
} | ||
} | ||
return builder.asImmutable() | ||
} | ||
|
||
@JvmStatic | ||
fun handleOnFilter(element: JsonElement, accessibleNodes: Iterable<String>, action: Function<Map.Entry<String, JsonElement>, JsonElement>): JsonElement = | ||
if (element is JsonObject) handleOnFilter(element, accessibleNodes, action) else element | ||
|
||
} |
11 changes: 11 additions & 0 deletions
11
.../src/main/kotlin/cn/fd/ratziel/module/item/impl/builder/resolver/SectionStringResolver.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package cn.fd.ratziel.module.item.impl.builder.resolver | ||
|
||
import cn.fd.ratziel.module.item.api.ArgumentResolver | ||
|
||
/** | ||
* SectionStringResolver | ||
* | ||
* @author TheFloodDragon | ||
* @since 2024/6/25 20:16 | ||
*/ | ||
interface SectionStringResolver : ArgumentResolver<String, String> |
23 changes: 23 additions & 0 deletions
23
...tem/src/main/kotlin/cn/fd/ratziel/module/item/impl/builder/resolver/SectionTagResolver.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package cn.fd.ratziel.module.item.impl.builder.resolver | ||
|
||
import cn.fd.ratziel.module.item.api.ArgumentResolver | ||
|
||
/** | ||
* SectionTagResolver | ||
* | ||
* @author TheFloodDragon | ||
* @since 2024/6/25 20:04 | ||
*/ | ||
interface SectionTagResolver : ArgumentResolver<Iterable<String>, String?> { | ||
|
||
/** | ||
* 解析器名称 | ||
*/ | ||
val name: String | ||
|
||
/** | ||
* 解析器别名 | ||
*/ | ||
val alias: Array<String> | ||
|
||
} |
24 changes: 24 additions & 0 deletions
24
...n/kotlin/cn/fd/ratziel/module/item/impl/builder/resolver/sectionResolvers/PapiResolver.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package cn.fd.ratziel.module.item.impl.builder.resolver.sectionResolvers | ||
|
||
import cn.fd.ratziel.function.argument.ArgumentFactory | ||
import cn.fd.ratziel.function.argument.popOrNull | ||
import cn.fd.ratziel.module.item.impl.builder.resolver.SectionStringResolver | ||
import org.bukkit.OfflinePlayer | ||
import taboolib.platform.compat.replacePlaceholder | ||
|
||
/** | ||
* PapiResolver | ||
* | ||
* @author TheFloodDragon | ||
* @since 2024/6/25 20:18 | ||
*/ | ||
object PapiResolver : SectionStringResolver { | ||
|
||
override fun resolve(element: String, arguments: ArgumentFactory): String { | ||
// 获取玩家 | ||
val player = arguments.popOrNull<OfflinePlayer>()?.value ?: return element // 没玩家处理啥? | ||
// 处理Papi变量 | ||
return element.replacePlaceholder(player) | ||
} | ||
|
||
} |
Oops, something went wrong.