diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts
index c6912d5e..6cd15b20 100644
--- a/src/ts/parser.svelte.ts
+++ b/src/ts/parser.svelte.ts
@@ -292,9 +292,38 @@ async function renderHighlightableMarkdown(data:string) {
}
-
export const assetRegex = /{{(raw|path|img|image|video|audio|bg|emotion|asset|video-img|source)::(.+?)}}/gms
+async function replaceAsync(string, regexp, replacerFunction) {
+ const replacements = await Promise.all(
+ Array.from(string.matchAll(regexp),
+ match => replacerFunction(...match as any)))
+ let i = 0;
+ return string.replace(regexp, () => replacements[i++])
+}
+
+async function getAssetSrc(assetArr: string[][], name: string, assetPaths: {[key: string]:{path: string, ext?: string}}) {
+ name = name.toLocaleLowerCase()
+ for (const asset of assetArr) {
+ if (trimmer(asset[0].toLocaleLowerCase()) !== trimmer(name)) continue
+ const assetPath = await getFileSrc(asset[1])
+ assetPaths[asset[0].toLocaleLowerCase()] = {
+ path: assetPath,
+ ext: asset[2]
+ }
+ return
+ }
+}
+
+async function getEmoSrc(emoArr: string[][], emoPaths: {[key: string]:{path: string}}) {
+ for (const emo of emoArr) {
+ const emoPath = await getFileSrc(emo[1])
+ emoPaths[emo[0].toLocaleLowerCase()] = {
+ path: emoPath,
+ }
+ }
+}
+
async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|character, mode:'normal'|'back', mode2:'unset'|'pre'|'post' = 'unset'){
const assetWidthString = (DBState.db.assetWidth && DBState.db.assetWidth !== -1 || DBState.db.assetWidth === 0) ? `max-width:${DBState.db.assetWidth}rem;` : ''
@@ -306,37 +335,20 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c
path:string
}} = {}
- if(char.additionalAssets){
- for(const asset of char.additionalAssets){
- const assetPath = await getFileSrc(asset[1])
- assetPaths[asset[0].toLocaleLowerCase()] = {
- path: assetPath,
- ext: asset[2]
- }
- }
- }
- if(char.emotionImages){
- for(const emo of char.emotionImages){
- const emoPath = await getFileSrc(emo[1])
- emoPaths[emo[0].toLocaleLowerCase()] = {
- path: emoPath,
- }
- }
- }
- const moduleAssets = getModuleAssets()
- if(moduleAssets.length > 0){
- for(const asset of moduleAssets){
- const assetPath = await getFileSrc(asset[1])
- assetPaths[asset[0].toLocaleLowerCase()] = {
- path: assetPath,
- ext: asset[2]
- }
- }
- }
+ if (char.emotionImages) await getEmoSrc(char.emotionImages, emoPaths)
+
const videoExtention = ['mp4', 'webm', 'avi', 'm4p', 'm4v']
let needsSourceAccess = false
- data = data.replaceAll(assetRegex, (full:string, type:string, name:string) => {
- name = name.toLocaleLowerCase()
+
+ data = await replaceAsync(data, assetRegex, async (full:string, type:string, name:string) => {
+ const moduleAssets = getModuleAssets()
+ if (char.additionalAssets) {
+ await getAssetSrc(char.additionalAssets, name, assetPaths)
+ }
+ if (moduleAssets.length > 0) {
+ await getAssetSrc(moduleAssets, name, assetPaths)
+ }
+
if(type === 'emotion'){
const path = emoPaths[name]?.path
if(!path){
@@ -344,6 +356,7 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c
}
return `
`
}
+
if(type === 'source'){
needsSourceAccess = true
switch(name){
@@ -355,13 +368,15 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c
}
}
}
+
let path = assetPaths[name]
+
if(!path){
if(DBState.db.legacyMediaFindings){
return ''
}
- path = getClosestMatch(name, assetPaths)
+ path = await getClosestMatch(char, name, assetPaths)
if(!path){
return ''
@@ -411,63 +426,72 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c
return data
}
-function getClosestMatch(name:string, assetPaths:{[key:string]:{path:string, ext?:string}}){
-
- if(Object.keys(assetPaths).length === 0){
- return null
- }
-
- //Levenshtein distance, new with 1d array
- const dest = (a:string, b:string) => {
- const h = a.length + 1
- const w = b.length + 1
- let d = new Int16Array(h * w)
- for(let i=0;i DBState.db.assetMaxDifference){
return null
}
+
+ const assetPath = await getFileSrc(targetPath)
+ assetPaths[closest] = {
+ path: assetPath,
+ ext: targetExt
+ }
+
return assetPaths[closest]
}
+//Levenshtein distance, new with 1d array
+function getDistance(a:string, b:string) {
+ const h = a.length + 1
+ const w = b.length + 1
+ let d = new Int16Array(h * w)
+ for(let i=0;i {
try {
let text = Buffer.from(txt, 'hex').toString('utf-8')