// https://cdnjs.com/libraries/sql.js // https://github.com/sql-js/sql.js?tab=readme-ov-file#loading-a-database-from-a-server function filterTemplateExample( contentFilename ){ let file = filesWithMetadata[contentFilename] if (!file) return // can be removed for URLs as those are not with metadata let contentType = file.contentType // mereology option let openingOptions = filesWithMetadata[contentFilename].openingOptions // can be used via e.g. showFile("https://fabien.benetou.fr/?action=source",{ mereology:"whole"}) // filtering, only applying what's next to a certain content type and/or with filename filtering with .startsWith() .endsWith() .includes() or regex if ( contentType.includes("xml") && contentFilename.includes("pdfxml/") ) { console.log('it is a pdf unpacked file', contentFilename) /* // example of zip support fetch( contentFilename ).then( r => r.blob(r) ).then( file => zip.loadAsync(file) ).then( f => { console.log(f.files) let filenameFromZip = Object.entries( f.files ).filter( i => i[0].includes("partialfilename.ext") ).map( i => i[0] )[0] f.files[filenameFromZip].async("string").then( dyn_content => { json = JSON.parse( dyn_content ) }) }) */ fetch( contentFilename ).then( r => r.text() ).then( txt => { console.log( "mereology", openingOptions.mereology ) switch( openingOptions.mereology ) { case "whole": addNewNote(txt, "0 1.4 -.8") break; case "listonly": default: txt.replaceAll('* ','').split('\n').map( (c,i) => addNewNote(c, "0 "+(1+i/10)+" -.8") ) } const rootEl = document.createElement("a-entity") // having a root element to attach on makes manipulation later on easier and safer, bringing a context for later modifications file.filteredEl = rootEl rootEl.test = _ => console.log( 'test' ) // function that can then be called on the created element later on // e.g. filesWithMetadata["https://companion.benetou.fr/saved/pdfxml/3209542.3209570.xml"].filteredEl.nextPage('ok') AFRAME.scenes[0].appendChild(rootEl) AFRAME.scenes[0].emit('templateexampleloaded', contentFilename) // to use the event consider : //AFRAME.scenes[0].addEventListener("templateexampleloaded", e => console.log(e)) } ); } applyNextFilter( contentFilename ) // can stop here or move on to the next filter that might or not be applied } sequentialFilters.push( filterTemplateExample ) // adding this to the list of filters to go through, order matters // typically one would be generic filters first then more specific ones after