Skip to content

Commit

Permalink
Experimental | Update ItemResolver
Browse files Browse the repository at this point in the history
  • Loading branch information
TheFloodDragon committed Jun 25, 2024
1 parent 26d11ab commit be220bd
Show file tree
Hide file tree
Showing 10 changed files with 196 additions and 164 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,7 @@ operator fun JsonObject.get(names: Iterable<String>): JsonElement? {
/**
* 可变化
*/
fun Map<String, JsonElement>.asMutable(): MutableJsonObject =
when (this) {
is MutableJsonObject -> this
is MutableMap<*, *> -> MutableJsonObject(this as MutableMap<String, JsonElement>)
else -> MutableJsonObject(this.toMutableMap())
}
fun Map<String, JsonElement>.asMutable(): MutableJsonObject = if (this is MutableJsonObject) this else MutableJsonObject(this.toMutableMap())

/**
* 处理 [JsonObject]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import cn.fd.ratziel.module.item.api.builder.ItemSerializer
import cn.fd.ratziel.module.item.api.registry.ComponentRegistry
import cn.fd.ratziel.module.item.api.registry.ResolverRegistry
import cn.fd.ratziel.module.item.api.registry.SerializerRegistry
import cn.fd.ratziel.module.item.impl.builder.BasicItemResolver
import cn.fd.ratziel.module.item.impl.builder.DefaultItemSerializer
import cn.fd.ratziel.module.item.impl.builder.resolver.BasicItemResolver
import cn.fd.ratziel.module.item.impl.component.ItemDisplay
import cn.fd.ratziel.module.item.impl.component.ItemDurability
import cn.fd.ratziel.module.item.impl.component.ItemMetadata
Expand Down Expand Up @@ -38,8 +38,7 @@ object ItemRegistry {
Component.register(ItemSundry::class.java, ItemSundry)
Component.register(ItemMetadata::class.java, ItemMetadata)
// 注册默认物品解析器
Resolver.register(BasicItemResolver, 0)
Resolver.register(BasicItemResolver.CleanUp, Byte.MAX_VALUE)// 最后清除
Resolver.register(BasicItemResolver)
}

object Component : ComponentRegistry {
Expand Down

This file was deleted.

This file was deleted.

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
}

}

}
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

}
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>
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>

}
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)
}

}
Loading

0 comments on commit be220bd

Please sign in to comment.