diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index 72e1254c..3ad61a3b 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -311,14 +311,18 @@ async function replaceAsync(string, regexp, replacerFunction) { return string.replace(regexp, () => replacements[i++]) } -async function getAssetSrc(assetArr: string[][], name: string, assetPaths: {[key: string]:{path: string, ext?: string}}) { +async function getAssetSrc(assetArr: string[][], name: string, assetPaths: {[key: string]:{path: string[], ext?: string}}) { 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, + const key = asset[0].toLocaleLowerCase() + assetPaths[key] = { + path: [], ext: asset[2] } + if(assetPaths[key].ext === asset[2]){ + assetPaths[key].path.push(assetPath) + } return } } @@ -332,11 +336,11 @@ async function getEmoSrc(emoArr: string[][], emoPaths: {[key: string]:{path: str } } -async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|character, mode:'normal'|'back', mode2:'unset'|'pre'|'post' = 'unset'){ +async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|character, mode:'normal'|'back', arg:{ch:number}){ const assetWidthString = (DBState.db.assetWidth && DBState.db.assetWidth !== -1 || DBState.db.assetWidth === 0) ? `max-width:${DBState.db.assetWidth}rem;` : '' let assetPaths:{[key:string]:{ - path:string + path:string[] ext?:string }} = {} let emoPaths:{[key:string]:{ @@ -391,33 +395,39 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c return '' } } + + let p = path.path[0] + + if(path.path.length > 1){ + p = path.path[Math.floor(arg.ch % p.length)] + } switch(type){ case 'raw': case 'path': - return path.path + return p case 'img': - return `${path.path}` + return `${p}` case 'image': - return `
${path.path}
\n` + return `
${p}
\n` case 'video': - return `\n` + return `\n` case 'video-img': - return `\n` + return `\n` case 'audio': - return `\n` + return `\n` case 'bg': if(mode === 'back'){ - return `
` + return `
` } break case 'asset':{ if(path.ext && videoExtention.includes(path.ext)){ - return `\n` + return `\n` } - return `${path.path}\n` + return `${p}\n` } case 'bgm': - return `
\n` + return `
\n` } return '' }) @@ -437,7 +447,7 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c return data } -async function getClosestMatch(char: simpleCharacterArgument|character, name:string, assetPaths:{[key:string]:{path:string, ext?:string}}){ +async function getClosestMatch(char: simpleCharacterArgument|character, name:string, assetPaths:{[key:string]:{path:string[], ext?:string}}){ if(!char.additionalAssets) return null let closest = '' @@ -463,7 +473,7 @@ async function getClosestMatch(char: simpleCharacterArgument|character, name:str const assetPath = await getFileSrc(targetPath) assetPaths[closest] = { - path: assetPath, + path: [assetPath], ext: targetExt } @@ -557,7 +567,9 @@ export async function ParseMarkdown( let char = (typeof(charArg) === 'string') ? (findCharacterbyId(charArg)) : (charArg) if(char && char.type !== 'group'){ - data = await parseAdditionalAssets(data, char, additionalAssetMode, 'pre') + data = await parseAdditionalAssets(data, char, additionalAssetMode, { + ch: chatID + }) firstParsed = data } @@ -566,7 +578,9 @@ export async function ParseMarkdown( } if(firstParsed !== data && char && char.type !== 'group'){ - data = await parseAdditionalAssets(data, char, additionalAssetMode, 'post') + data = await parseAdditionalAssets(data, char, additionalAssetMode, { + ch: chatID + }) } data = await parseInlayAssets(data ?? '')