function filterMapVisualMetaJSON( contentFilename ){ let file = filesWithMetadata[contentFilename] if (!file) return let contentType = file.contentType let sidecarFile = contentFilename.replace("dynamicview", "glossary") const scale = 1/1000 const xOffset = 1 const yOffset = 1 const idprefix = 'visualmetaexport_' if ( contentType.includes("json") && contentFilename.endsWith("_dynamicviewvisualmetaexport.json")) { console.log('it is a map visualmeta export file', contentFilename) fetch( contentFilename ).then( r => r.json() ).then( json => { fetch( sidecarFile ).then( r => r.json() ).then( sidecarjson => { let glossary = Object.entries( sidecarjson.entries ).map( i => i[1].phrase ) // console.log( json, sidecarjson ) json.nodes.map( n => { let x = json.layout.nodePositions[ n.identifier ].x * scale + xOffset let y = -json.layout.nodePositions[ n.identifier ].y * scale + yOffset let z = -1/2 let el = addNewNote( n.title, "" + x + " " + y + " " + z ) el.id = "visualmetaexport_"+n.title.toLowerCase().replaceAll(" ","_").replaceAll(".","_").replaceAll("'","_") el.setAttribute("outline-width", 0) // optional background color "#7c7c7c" // could use onpicked/onreleased to show links from glossary // check if any word from title is in glossary // if so, display line or highlight visually by removing outline // reset onreleased }) Object.entries( sidecarjson.entries ).map( i => i[1].phrase ).map( n => { Object.entries( sidecarjson.entries ) .map( i => { return {phrase:i[1].phrase, entry:i[1].entry} } ) .filter( i => i.entry.toLowerCase().includes(n.toLowerCase()) ) .map( i => { let el = document.createElement("a-entity") el.setAttribute('live-selector-line', 'start: #'+(idprefix+n.toLowerCase().replaceAll(" ","_").replaceAll(".","_").replaceAll("'","_")) +'; end: #'+(idprefix+i.phrase.toLowerCase().replaceAll(" ","_").replaceAll(".","_").replaceAll("'","_")) +';' ) el.classList.add('visualmeta_export_link') AFRAME.scenes[0].appendChild(el) }) }) Array.from( document.querySelectorAll("[line]") ).map( el => el.setAttribute("line", "color", "black")) // should filter a bit better otherwise take lines from other components and elements e.g. raycaster AFRAME.scenes[0].emit('mapvisualmetajsonloaded', contentFilename) // to use the event consider : //AFRAME.scenes[0].addEventListener("mapvisualmetajsonloaded", e => console.log(e)) }) }) } applyNextFilter( contentFilename ) } sequentialFilters.push( filterMapVisualMetaJSON )