From 7c3ad578560da36851fc42d9eae8ccf872ce6f6b Mon Sep 17 00:00:00 2001 From: Kwaroran Date: Sat, 8 Mar 2025 15:25:10 +0900 Subject: [PATCH] Add bgm cbs --- src/ts/globalApi.svelte.ts | 2 +- src/ts/{observer.ts => observer.svelte.ts} | 28 ++++++++++++++++++---- src/ts/parser.svelte.ts | 6 +++-- 3 files changed, 29 insertions(+), 7 deletions(-) rename src/ts/{observer.ts => observer.svelte.ts} (81%) diff --git a/src/ts/globalApi.svelte.ts b/src/ts/globalApi.svelte.ts index 168dafe1..c2e7af2a 100644 --- a/src/ts/globalApi.svelte.ts +++ b/src/ts/globalApi.svelte.ts @@ -35,7 +35,7 @@ import { save } from "@tauri-apps/plugin-dialog"; import { listen } from '@tauri-apps/api/event' import { registerPlugin } from '@capacitor/core'; import { language } from "src/lang"; -import { startObserveDom } from "./observer"; +import { startObserveDom } from "./observer.svelte"; import { updateGuisize } from "./gui/guisize"; import { encodeCapKeySafe } from "./storage/mobileStorage"; import { updateLorebooks } from "./characters"; diff --git a/src/ts/observer.ts b/src/ts/observer.svelte.ts similarity index 81% rename from src/ts/observer.ts rename to src/ts/observer.svelte.ts index 652250bc..8d7f2fe3 100644 --- a/src/ts/observer.ts +++ b/src/ts/observer.svelte.ts @@ -3,12 +3,14 @@ import { sleep } from "./util"; import { getCurrentCharacter, getCurrentChat, setCurrentChat } from "./storage/database.svelte"; import { runLuaButtonTrigger } from "./process/lua"; +let bgmElement:HTMLAudioElement|null = null; function nodeObserve(node:HTMLElement){ const triggerName = node.getAttribute('risu-trigger'); const btnEvent = node.getAttribute('risu-btn'); const observerAdded = node.getAttribute('risu-observer'); const hlLang = node.getAttribute('x-hl-lang'); + const ctrlName = node.getAttribute('risu-ctrl'); if(observerAdded){ return @@ -87,6 +89,27 @@ function nodeObserve(node:HTMLElement){ }, {once: true}) }) } + + if(ctrlName){ + const split = ctrlName.split('___'); + + switch(split[0]){ + case 'bgm':{ + const volume = split[1] === 'auto' ? 0.5 : parseFloat(split[1]); + if(!bgmElement){ + bgmElement = new Audio(split[2]); + bgmElement.volume = volume + bgmElement.addEventListener('ended', ()=>{ + bgmElement.remove(); + bgmElement = null; + }) + bgmElement.play(); + } + break + } + } + } + } export async function startObserveDom(){ @@ -102,11 +125,8 @@ export async function startObserveDom(){ }) }) - //We are using a while loop intead of MutationObserver because MutationObserver is expensive for just a few elements while(true){ - document.querySelectorAll('[risu-trigger]').forEach(nodeObserve); - document.querySelectorAll('[risu-btn]').forEach(nodeObserve); - document.querySelectorAll('[x-hl-lang]').forEach(nodeObserve); + document.querySelectorAll('[risu-trigger], [risu-btn], [x-hl-lang], [risu-ctrl]').forEach(nodeObserve); await sleep(100); } } \ No newline at end of file diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index 4d6d8a3e..75ae99df 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -292,7 +292,7 @@ async function renderHighlightableMarkdown(data:string) { } -export const assetRegex = /{{(raw|path|img|image|video|audio|bg|emotion|asset|video-img|source)::(.+?)}}/gms +export const assetRegex = /{{(raw|path|img|image|video|audio|bgm|bg|emotion|asset|video-img|source)::(.+?)}}/gms async function replaceAsync(string, regexp, replacerFunction) { const replacements = await Promise.all( @@ -407,6 +407,8 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c } return `${path.path}\n` } + case 'bgm': + return `
\n` } return '' }) @@ -568,7 +570,7 @@ export async function ParseMarkdown( } return decodeStyle(DOMPurify.sanitize(data, { ADD_TAGS: ["iframe", "style", "risu-style", "x-em",], - ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling", "risu-btn", 'risu-trigger', 'risu-mark', 'x-hl-lang', 'x-hl-text'], + ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling", "risu-ctrl" ,"risu-btn", 'risu-trigger', 'risu-mark', 'x-hl-lang', 'x-hl-text'], })) }