@@ -5233,7 +5233,7 @@ Current version indicated by LITEVER below.
52335233 image: b64Url
52345234 }
52355235 indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5236- allCharacterNames.push({name: charName, thumbnail: dataUrl})
5236+ allCharacterNames.push({name: charName, thumbnail: dataUrl, type: "Character" })
52375237 updateCharacterListFromAllDe();
52385238 })
52395239 })
@@ -5244,6 +5244,24 @@ Current version indicated by LITEVER below.
52445244 }
52455245 }
52465246
5247+ function saveLorebookToIndexDB(filename, data)
5248+ {
5249+ let charName = filename.replaceAll(/[^\w()_\-'",!\[\].]/g, " ").replaceAll(/\s+/g, " ").trim();
5250+ let dataToSave = {
5251+ name: charName,
5252+ data: data
5253+ }
5254+ indexeddb_save(`character_${charName}`, JSON.stringify(dataToSave)).then(() => {
5255+ allCharacterNames.push({name: charName, type: "World Info"})
5256+ updateCharacterListFromAllDe();
5257+ })
5258+ }
5259+
5260+ function getTypeFromAllCharacterData(data)
5261+ {
5262+ return !!data?.type ? data.type : "Character"
5263+ }
5264+
52475265 function convertTavernPng(data, filename) //import tavern png data. adapted from png-chunks-extract under MIT license
52485266 {
52495267 //accepts png input data, and returns the extracted JSON
@@ -24180,7 +24198,7 @@ Current version indicated by LITEVER below.
2418024198 function getImageUrlFromCharacter(characterName)
2418124199 {
2418224200 let charData = allCharacterNames.find(c => c.name === characterName)
24183- if (charData !== undefined)
24201+ if (charData !== undefined && charData?.thumbnail !== undefined )
2418424202 {
2418524203 let charName = characterName.replaceAll(/[^\w]/g, "_"), id = `style_image_${charName}`;
2418624204 let varName = `--img_character_${charName}`
@@ -37260,7 +37278,9 @@ flowchart TD\n${treeToViewOutput.outputText.trim()}`
3726037278 #popupContainer .popupContent
3726137279 {
3726237280 overflow-y: auto;
37281+ overflow-x: hidden;
3726337282 height: calc(100% - 40px);
37283+ width: 70vw;
3726437284 }
3726537285
3726637286 #popupContainer .popupfooter button
@@ -37385,50 +37405,95 @@ flowchart TD\n${treeToViewOutput.outputText.trim()}`
3738537405 })
3738637406
3738737407 let showCharacterList = async () => {
37388- let container = document.createElement("div");
37389- container.classList.add("fillContainer", "autoGrid")
37390- container.style.width = "70vw"
37391- container.style.overflowX = "hidden"
37392- if (allCharacterNames.length === 0)
37393- {
37408+ let containers = []
37409+
37410+ let createIcon = (name, image) => {
3739437411 let charIcon = document.createElement("span");
37395- charIcon.innerText = "No characters added yet";
37396- charIcon.style.color = "white";
37412+ let charText = document.createElement("b");
37413+ charIcon.classList.add("containAndScaleImage", "tile")
37414+ charIcon.style.backgroundImage = !!image ? image : "var(--img_esobold)"
37415+ charIcon.title = name
37416+ charText.innerText = name
37417+ charIcon.appendChild(charText)
37418+ return charIcon
37419+ }
37420+ let getContainerForType = (containerName) => {
37421+ let containerNameAsClass = containerName.replaceAll(/\s/g, "_")
37422+ let existingContainer = containers.find(container => container.classList.contains(containerNameAsClass));
37423+ if (!!existingContainer)
37424+ {
37425+ return existingContainer;
37426+ }
37427+
37428+ let container = document.createElement("div");
37429+ container.classList.add("autoGrid")
37430+ container.style.overflowX = "hidden"
37431+ container.style.border = "lightcoral"
37432+ container.style.borderStyle = "dashed"
37433+ container.style.marginBottom = "10px"
37434+ container.classList.add(containerNameAsClass)
37435+ containers.push(container)
37436+
37437+ let charIcon = createIcon(containerName, "var(--img_load)")
3739737438 container.appendChild(charIcon);
37439+ return container
37440+ }
37441+
37442+ if (allCharacterNames.length === 0)
37443+ {
37444+ let charIcon = createIcon("No characters added yet")
37445+ getContainerForType("Character").appendChild(charIcon);
3739837446 }
3739937447 else
3740037448 {
3740137449 for (let i = 0; i < allCharacterNames.length; i++)
3740237450 {
37403- let {name, thumbnail} = allCharacterNames[i];
37404- let charIcon = document.createElement("span");
37405- let charText = document.createElement("b");
37406- charIcon.classList.add("containAndScaleImage", "tile")
37407- charIcon.style.backgroundImage = `url(${thumbnail})`
37408- charIcon.title = name
37409- charText.innerText = name
37451+ let {name, thumbnail} = allCharacterNames[i], type = getTypeFromAllCharacterData(allCharacterNames[i]);
37452+ let charIcon = createIcon(name, !!thumbnail ? `url(${thumbnail})` : undefined)
3741037453 charIcon.onclick = () => {
37411- popupUtils.reset().title("Character Options").button("Load character", async () => {
37412- popupUtils.reset()
37413- let charData = await getCharacterData(name)
37414- load_tavern_obj(charData.data);
37415- }).button("Add character to WI", async () => {
37416- popupUtils.reset()
37417- let charData = await getCharacterData(name)
37418- let wiToAdd = importCharacterCardAsWIInternal(charData.data);
37419- current_wi = current_wi.filter(wi => wi?.folder !== name)
37420- current_wi.push(...wiToAdd)
37421- }).button("Delete character", async () => {
37454+ if (type === "Character")
37455+ {
37456+ popupUtils.reset().title("Character Options").button("Load character", async () => {
37457+ popupUtils.reset()
37458+ let charData = await getCharacterData(name)
37459+ load_tavern_obj(charData.data);
37460+ }).button("Add character to WI", async () => {
37461+ popupUtils.reset()
37462+ let charData = await getCharacterData(name)
37463+ let wiToAdd = importCharacterCardAsWIInternal(charData.data);
37464+ current_wi = current_wi.filter(wi => wi?.folder !== name)
37465+ current_wi.push(...wiToAdd)
37466+ }).button("Delete character", async () => {
37467+ popupUtils.reset()
37468+ allCharacterNames = allCharacterNames.filter(c => c.name !== name)
37469+ updateCharacterListFromAll()
37470+ }).button("Close", () => popupUtils.reset()).show();
37471+ }
37472+ else if (type === "World Info")
37473+ {
37474+ popupUtils.reset().title("World Info Options").button("Add to WI", async () => {
37475+ popupUtils.reset()
37476+ let charData = await getCharacterData(name)
37477+ let wiToAdd = charData.data;
37478+ current_wi = current_wi.filter(wi => wi?.folder !== name)
37479+ current_wi.push(...wiToAdd)
37480+ }).button("Delete world info", async () => {
37481+ popupUtils.reset()
37482+ allCharacterNames = allCharacterNames.filter(c => c.name !== name)
37483+ updateCharacterListFromAll()
37484+ }).button("Close", () => popupUtils.reset()).show();
37485+ }
37486+ else
37487+ {
3742237488 popupUtils.reset()
37423- allCharacterNames = allCharacterNames.filter(c => c.name !== name)
37424- updateCharacterListFromAll()
37425- }).button("Close", () => popupUtils.reset()).show();
37489+ }
3742637490 }
37427- charIcon.appendChild(charText)
37428- container.appendChild(charIcon)
37491+ getContainerForType(type).appendChild(charIcon)
3742937492 }
3743037493 }
37431- popupUtils.reset().title("Character List").content(container).button("Upload characters", () => {
37494+ popupUtils.reset().title(`Character List (${allCharacterNames.length})`)
37495+ containers.forEach(container => popupUtils.content(container))
37496+ popupUtils.button("Upload characters, lorebooks and world info", () => {
3743237497 popupUtils.reset()
3743337498 promptUserForLocalFile(async (result) => {
3743437499 let { file, fileName, ext, content, plaintext, dataArr } = result;
@@ -37438,12 +37503,34 @@ flowchart TD\n${treeToViewOutput.outputText.trim()}`
3743837503 {
3743937504 let arr = new Uint8Array(dataArr)
3744037505 let res = convertTavernPng(arr)
37441- if (!res)
37506+ }
37507+ else if (ext === ".webp")
37508+ {
37509+ let arr = new Uint8Array(dataArr)
37510+ getTavernExifJSON(arr)
37511+ }
37512+ else
37513+ {
37514+ let wiToAdd = JSON.parse(plaintext);
37515+ let has_tav_wi_check = has_tavern_wi_check(wiToAdd);
37516+ if(has_tav_wi_check)
37517+ {
37518+ wiToAdd = load_tavern_wi(wiToAdd);
37519+ if(wiToAdd && wiToAdd.length > 0)
37520+ {
37521+ wiToAdd.forEach(wi => wi.wigroup = fileName.replace("'", ""))
37522+ }
37523+ }
37524+ if (Array.isArray(wiToAdd))
3744237525 {
37443- getTavernExifJSON(arr)
37526+ wiToAdd = wiToAdd.filter(wi => wi?.key !== undefined)
37527+ if (wiToAdd.length > 0)
37528+ {
37529+ saveLorebookToIndexDB(fileName, wiToAdd)
37530+ }
3744437531 }
3744537532 }
37446- }, [".png", ".webp"], true)
37533+ }, [".png", ".webp", ".json" ], true)
3744737534 }).button("Delete all characters", async () => {
3744837535 popupUtils.reset()
3744937536 waitingToast.show()
0 commit comments