UNPKG

snbt-js

Version:

TypeScript library for parsing and manipulating Minecraft SNBT data

170 lines (124 loc) 5.3 kB
# SNBT 数据处理库技术文档 ## 概述 该 JavaScript 库提供了完整的 NBT(Named Binary Tag)数据格式处理能力,包括 NBT 数据的解析、创建、修改和序列化功能。NBT 是 Minecraft 中广泛使用的一种二进制数据格式,用于存储和传输结构化数据。 ## 主要功能 - 完整支持 NBT 数据类型(对象、列表、整数数组、数字、字符串、布尔值和空值) - 支持带语法高亮的 NBT 字符串输出 - 强大的路径解析功能(支持点语法和方括号索引) - 两种解析模式:安全的手动解析器和不安全的 eval 解析器 - 严格的类型检查和边界约束 ## 辅助函数 ### `gettype = Object.prototype.toString` 用于获取对象的内部类型标识符,如 `[object Array]`### `changeToFloat(val)` 将输入值转换为浮点数表示: - 如果值包含小数点,直接返回数字 - 如果是整数,返回带一位小数的字符串表示 **参数**- `val`:要转换的值 **返回**:数字或字符串形式的浮点数 ### `highlightCode(text, type)` 为文本生成带颜色样式的 HTML 片段: **参数**- `text`:要着色的文本 - `type`:类型标识符("key"、"str"、"num"、"bool"、"unit") **返回**:HTML span 元素字符串 ### `arrangementNbt(str)` 预处理 NBT 字符串,将带单位的数字转换为 NbtNumber 实例(用于 `decodeNbtStr`)。 ### `decodeNbtStr(str)`(已弃用) ⚠️ 使用 `eval` 解析 NBT 字符串(存在安全风险,建议使用 `parseNbtString` 替代)。 ### `changeObj(jsObj)` 将普通 JavaScript 对象转换为 NBT 对象树。 ### `parsePath(path)` 解析点语法和方括号索引组成的路径为路径数组: - 支持带引号的字符串键 - 支持数字索引 - 支持混合路径(如 `player.inventory[0].id`**参数**- `path`:路径字符串 **返回**:路径数组(字符串和数字组成) ## NBT 类型类 ### `NbtObject` 表示 NBT 复合标签(键值对集合)。 **方法**- `addChild(key, value)`:添加子元素 - `isempty()`:检查对象是否为空 - `get(...path)`:按路径获取值(支持多级路径) - `set(path, value)`:按路径设置值 - `text(ispretty)`:序列化为字符串(可选语法高亮) ### `NbtList` 表示 NBT 列表(有序集合)。 **方法**- `addChild(value)`:添加元素 - `isempty()`:检查列表是否为空 - `get(...path)`:按索引获取值(支持多级路径) - `set(path, value)`:按索引设置值 - `text(ispretty)`:序列化为字符串(可选语法高亮) ### `NbtIntArray` 表示 NBT 整数数组(仅允许整数)。 **方法**- `addChild(value)`:添加整数元素(必须为无单位的 NbtNumber) - `isempty()`:检查数组是否为空 - `get(index)`:按索引获取值(仅支持单级索引) - `set(index, value)`:按索引设置值(仅支持单级索引) - `text(ispretty)`:序列化为整数数组格式(如 `[I; 1, 2, 3]`### `NbtNumber` 表示 NBT 数值类型(支持单位后缀)。 **构造**`new NbtNumber(value, unit="")` - `unit`:单位类型("b"=字节, "s"=短整型, "d"=双精度, "f"=单精度, ""=整型) **方法**- `text(ispretty)`:序列化为字符串(带单位后缀) ### `NbtString` 表示 NBT 字符串类型。 **方法**- `text(ispretty)`:序列化为带引号的字符串(自动转义特殊字符) ### `NbtBool` 表示布尔值类型。 **方法**- `text(ispretty)`:序列化为 "true" 或 "false" ### `NbtNull` 表示空值类型。 **方法**- `text(ispretty)`:序列化为 "null" ## 核心解析器 ### `parseNbtString(str)` 安全解析 NBT 字符串为 NBT 对象树(推荐使用)。 **功能**- 完整支持 NBT 语法(复合标签、列表、数组、基本类型) - 支持带引号的字符串(含转义序列) - 支持带单位的数字 - 支持尾随逗号 - 精确的错误位置报告 **参数**- `str`:NBT 格式字符串 **返回**:NBT 对象树的根节点 **错误处理**:解析失败时抛出带位置和上下文信息的错误 ## 使用示例 ```javascript // 创建 NBT 对象 const playerData = new NbtObject({ health: new NbtNumber(20, "f"), inventory: new NbtList([ new NbtObject({ id: new NbtString("minecraft:diamond_sword"), count: new NbtNumber(1) }) ]) }); // 序列化为字符串(带高亮) console.log(playerData.text(true)); // 使用路径获取值 console.log(playerData.get("inventory", 0, "id").value); // 解析 NBT 字符串 const parsed = parseNbtString(`{ name: "Steve", position: [I; 100, 64, -200], isAlive: true }`); ``` ## 注意事项 1. 优先使用 `parseNbtString` 替代已弃用的 `decodeNbtStr` 2. 修改 NbtIntArray 时需确保值为整数 3. 路径解析区分字符串键和数字索引 4. 高亮输出需在支持 HTML 的环境中使用 该库提供了完整且安全的 NBT 数据处理能力,适用于 Minecraft 相关工具开发、数据转换和可视化等场景。