From b64f34c4312696e57b700425c9dd37ef6484d99c Mon Sep 17 00:00:00 2001 From: RoadToNowhereX <1423040201@qq.com> Date: Sun, 5 Apr 2026 09:31:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E4=B8=96=E7=95=8C=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/StartPanel/StartPanel.tsx | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/components/StartPanel/StartPanel.tsx b/src/components/StartPanel/StartPanel.tsx index 72c1649..68c0875 100644 --- a/src/components/StartPanel/StartPanel.tsx +++ b/src/components/StartPanel/StartPanel.tsx @@ -20,6 +20,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { useGlobalDrop } from "../useGlobalDrop"; import { CharacterCard } from "@lenml/char-card-reader"; import { useGlobalPaste } from "../useGlobalPaste"; +import { createBlackImage } from "../../tools/images"; // 对于某些特别的网站链接,转换为源图片非压缩地址 function getRawImageUrl(url: string) { @@ -125,7 +126,28 @@ export const StartPanel = ({ setOriginalFileName(file.name); async function readCardFile() { if (file.type === "application/json") { - return CharacterCard.from_json(JSON.parse(await file.text())); + const json = JSON.parse(await file.text()); + if (json.entries) { + if (!Array.isArray(json.entries) && typeof json.entries === "object") { + json.entries = Object.values(json.entries); + } + const tempAvatar = createBlackImage(file.name); + const avatar_url = tempAvatar.toDataURL(); + return CharacterCard.from_json( + { + spec: "chara_card_v2", + spec_version: "3.0", + data: { + name: file.name.replace(/\.json$/i, ""), + description: "Auto-generated card for lorebook", + first_mes: "", + character_book: json, + }, + }, + avatar_url + ); + } + return CharacterCard.from_json(json); } const arrayBuffer = await file.arrayBuffer(); setOriginalFile(arrayBuffer); From afca2d6dc518c8f1074ced24c8848aaa0f9c31a8 Mon Sep 17 00:00:00 2001 From: RoadToNowhereX <1423040201@qq.com> Date: Sun, 5 Apr 2026 19:46:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=96=E7=95=8C?= =?UTF-8?q?=E4=B9=A6=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/tabs/CharacterBookTab.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/components/tabs/CharacterBookTab.tsx b/src/components/tabs/CharacterBookTab.tsx index 4b73eef..47fcd92 100644 --- a/src/components/tabs/CharacterBookTab.tsx +++ b/src/components/tabs/CharacterBookTab.tsx @@ -77,6 +77,19 @@ export const CharacterBookTab: FC<{ ); }, [bookData]); + const handleExportJson = () => { + const jsonStr = JSON.stringify(bookData, null, 2); + const blob = new Blob([jsonStr], { type: "application/json" }); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = (bookData.name || "lorebook") + ".json"; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + }; + return (
))} -
+
+