UNPKG

kashi

Version:

Singing at the top of my lungs

1 lines 3.22 kB
const e=/\[\d{2}:\d{2}.\d{2}\]/,t=/^\[\d{2}:\d{2}.\d{2}\](.*)$/;var i,r,n,s,o,a,l,h,f,c,w=function(e,t,i,r,n){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?n.call(e,i):n?n.value=i:t.set(e,i),i},u=function(e,t,i,r){if("a"===i&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?r:"a"===i?r.call(e):r?r.value:t.get(e)};class d{constructor(e){if(i.add(this),r.set(this,null),n.set(this,null),s.set(this,[]),o.set(this,void 0),a.set(this,new Map),l.set(this,void 0),e.url&&e.file)throw new Error("Cannot specify both url and file.");if(!e.url&&!e.file)throw new Error("Must specify either url or file.");if(!(e.container&&e.container instanceof HTMLDivElement))throw new Error("Container must be an instance of HTMLDivElement.");e.emptyLineText&&this.setEmptyLineText(e.emptyLineText),w(this,o,e.container,"f"),this.subscribe("fileSet",u(this,i,"m",c).bind(this)),this.subscribe("emptyLineTextSet",u(this,i,"m",c).bind(this)),e.url?this.setUrl(e.url):e.file&&this.setFile(e.file)}get url(){return u(this,r,"f")}get file(){return u(this,n,"f")}get emptyLineText(){return u(this,l,"f")??"..."}async setUrl(e){try{const t=await fetch(e);if(!t.ok)throw new Error(`HTTP error! Status: ${t.status}.`);const i=t.headers.get("Content-Type");if(!i||!i.includes("text/plain"))throw new Error("Invalid content type. Expected text/plain.");const n=await t.blob();w(this,r,e,"f"),this.notify("urlSet",{url:e}),this.setFile(n)}catch(e){throw new Error((e instanceof Error&&e.message.length?e.message+" ":"")+"Failed to fetch the lyric file.")}}async setFile(e){const t=await u(this,i,"m",h).call(this,e);w(this,s,u(this,i,"m",f).call(this,t),"f"),w(this,n,e,"f"),this.notify("fileSet",{file:e})}setEmptyLineText(e){w(this,l,e,"f"),this.notify("emptyLineTextSet",{emptyLineText:e})}subscribe(e,t){u(this,a,"f").set(e,[...u(this,a,"f").get(e)??[],t])}unsubscribe(e,t){const i=u(this,a,"f").get(e);i&&i.length>1?u(this,a,"f").set(e,[...i.filter(e=>e!==t)]):u(this,a,"f").delete(e)}notify(e,t){[...u(this,a,"f").get(e)??[]].forEach(e=>{e(t)})}}r=new WeakMap,n=new WeakMap,s=new WeakMap,o=new WeakMap,a=new WeakMap,l=new WeakMap,i=new WeakSet,h=async function(e){return new Promise((t,i)=>{const r=new FileReader;r.onload=e=>{"string"==typeof e.target?.result&&e.target?.result.trim().length?t(e.target.result):i(new Error("Failed to read file content."))},r.onerror=()=>i(new Error("Error reading file.")),r.readAsText(e)})},f=function(e){const i=e.split("\n").reduce((e,i)=>{const r=i.trim();return t.test(r)?[...e,r]:e},[]);if(0===i.length)throw new Error("No valid lyric lines found in the file.");return i},c=function(){u(this,o,"f").innerHTML=u(this,s,"f").map(t=>`<p>${t.replace(e,"")||(u(this,l,"f")??"...")}</p>`).join(""),this.notify("lyricLinesUpdated",{lyricLines:u(this,s,"f")})};export{d as Kashi};