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 `${path}` } + 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')