
自定义书
使用网页编辑器简易创建自定义书。支持插入图片、自动排版、自定义背景、通过资源包注册书、国际化、插入点击链接
查看大图FlexiBook
适用于 1.20.1-26.2 neoforge 与 fabric 的自适应布局书籍
更多版本即将推出
自定义数据组件 + 客户端布局引擎 + AdaptiveBookScreen,在保持类书籍交互体验的同时,支持以下功能:
你无需编写代码即可使用网页版书籍编辑器。它位于 Github 上的源代码仓库中
(CurseForge 上的描述几乎全部复制自 Github README.md)
- HTML 子集标记(
[h1]/[p]/[b]/[color]/[img]/[link]等) - 打开书籍时解析翻译键并根据当前客户端语言重新分页
- 长内容自动缩小;可选双栏布局
- 安全链接:仅允许已注册的命令 ID 或经过确认的 http(s) URL
- 书内搜索高亮
- 内置默认字体
flexibook:default(unihex Unifont;省略font不会回退到minecraft:default) - 面向其他模组的
AdaptiveBookBuilder/FlexiBookAPI - 数据驱动的主题(
assets/<ns>/flexibook/themes/<id>.json)
| 文档 | 描述 |
|---|---|
| docs/API.md | 面向其他模组的完整 API(字体 §12,数据书籍 §14)— 英文 |
| docs/API.zh-CN.md | 完整 API — 中文 |
| editor/README.md | 配套实时编辑器(Electron;与游戏使用相同的 unihex ZIP) |
| docs/EDITOR_PACK_GUIDE.md | 资源包导出/导入及 /flexibook give(详细) |
| docs/README.md | 设计 / 计划 / 待办索引 |
| README.zh-CN.md | 中文说明 |
环境要求
- Gradle 需要 JDK 21(JDK 25/26 会与 Gradle/Groovy 字节码冲突)
- Minecraft 1.21.1
- NeoForge 21.1.x(参见
gradle.properties中的neo_version)
构建
# 如果默认 Java 不是 21:
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
# 或者在 gradle.properties 中设置 org.gradle.java.home=..../gradlew build
jar 文件:build/libs/flexibook-1.0.0.jar
./gradlew runClient
游戏内使用
创造模式标签页 FlexiBook:
- 空白
flexi_book - FlexiBook 实地指南示例(EN/ZH 语言;自适应布局、i18n、富文本、图片、链接、搜索)
右键打开;使用方向键或按钮翻页;底部可搜索。
资源包中的数据驱动书籍(启用资源包后按 F3+T):
/flexibook list
/flexibook give <namespace:bookId>
# 例如 /flexibook give note:note11
需要权限等级 ≥ 2。创造模式仅列出空白书籍和内置演示;自定义资源包请使用命令。
集成其他模组
完整参考(依赖、Builder、标记、链接安全、组件、i18n、主题 JSON、常见问题):docs/API.md。
ItemStack book = FlexiBookAPI.builder("my_guide")
.titleKey("mymod.book.title")
// .defaultFont(...) 可选 → 运行时 resolvedFont() = flexibook:default
.h1("mymod.book.ch1")
.p("mymod.book.p1")
.font("mymod.book.quote", ResourceLocation.withDefaultNamespace("uniform")) // 按段落覆盖
.bullet("mymod.book.b1")
.image(ResourceLocation.fromNamespaceAndPath("mymod", "textures/gui/icon.png"), 48, 48)
.link("mymod.book.click", FlexiBookAPI.commandAction("mymod:open_map"))
.divider()
.fromMarkup("[p]mymod.book.extra[/p]") // 仅在元素为空时使用整书原始标记
.buildItem();// 仅限安全操作(不要注册任意 shell 命令)
FlexiBookAPI.registerCommandAction("mymod:open_map", ctx -> ctx.message("mymod.map.opened"));
仅使用原始标记(未显式指定 font 仍使用内置默认字体):
AdaptiveBookContent content = AdaptiveBookContent.ofMarkup(
new TranslatableText("mymod.book.title"),
"""
[h1]mymod.book.ch1[/h1]
[p]mymod.book.p1[/p]
[bullet]mymod.book.b1[/bullet]
"""
);
// content.resolvedFont() → flexibook:default
ItemStack stack = FlexiBookAPI.createBook(content);
数据组件 ID:flexibook:adaptive_book_content。
主题通过资源包 JSON 注册:assets/<namespace>/flexibook/themes/<path>.json → ID namespace:path。
字体优先级:span/heading 字体 → 书籍级 font → flexibook:default(参见 docs/API.md §12)。
六部分资源包结构
assets/<ns>/
lang/*.json
font/*
textures/gui/book.png
textures/item/flexi_book.png # 可选:置于 assets/flexibook/... 下时覆盖 flexibook 物品图标
flexibook/
books/<id>.json # 索引:内容 + 主题 + 可选字体
contents/<id>.json # 正文
themes/<id>.json
ItemStack stack = FlexiBookAPI.createBookFromDefinition(
ResourceLocation.fromNamespaceAndPath("myguide", "guide"));
标记速查表
| 标签 | 作用 |
|---|---|
[h1] [h2] |
标题 |
[p] |
段落(内联样式可嵌套) |
[b] [i] [u] |
粗体 / 斜体 / 下划线 |
[color=#RRGGBB] |
颜色 |
[font font="ns:id"] / [font=ns:id] |
内联字体(覆盖书籍级 font) |
[br] |
换行 |
[divider] |
分隔线 |
[img src="..." width="48" height="48" /] |
图片(资源路径) |
[link cmd="modid:action"] / [link url="https://..."] |
安全链接 |
[bullet] |
列表项 |
[div class="..."] |
盒状容器 |
转义:\[ \]。
v1 范围
已完成: DataComponent、双存储(元素或 rawMarkup)、TagParser、自适应布局及缓存、单页 Screen、Builder、双语示例书籍、搜索、数据驱动主题(default + contain + JSON 重载)、内置 flexibook:default unihex(与编辑器相同的 ZIP)、带 Unihex 预览的独立编辑器、资源包导出/导入、/flexibook give|list。
v1 中未包含 / 已简化:
- 完整的讲台支持(
FlexiBookAPI.LecternCompat仅为桩代码) - 不劫持原版
written_book - 书内所见即所得编辑、表格、自动目录、3D 翻页动画
许可证
GNU GPL v3 © PhantomDaze
正在加载版本记录…

正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。