added xrsh transcript example

This commit is contained in:
Leon van Kammen 2025-02-10 21:11:34 +01:00
parent f6e7178dc3
commit 8774cbcb69
4 changed files with 43 additions and 26 deletions

View file

@ -8,6 +8,7 @@
<!-- AFRAME v1.5.0 + extra THREE.js extra loaders -->
<script src="./../../../dist/aframe.min.js"></script>
<script src="./../../../dist/xrfragment.aframe.js"></script>
<script src="./../../../src/3rd/js/plugin/frontend/tab-to-href.js"></script>
<script src="https://xrsh.isvery.ninja/xrsh.js"></script>
<!-- important: allow touchevents in AR -->
@ -33,7 +34,7 @@
</a-entity>
<a-entity id="home" xrf="./../../assets/elearning.glb"></a-entity>
<a-entity isoterminal position="0 1.6 -0.3"></a-entity>
<a-entity isoterminal="width: 600; height:300" position="0 1.6 -0.3"></a-entity>
</a-scene>
<!-- initialize XRSH -->
@ -42,35 +43,51 @@
const isoterminal = document.querySelector('[isoterminal]').components.isoterminal
const sanitizeTranscript = (str) => {
return str
.replaceAll("<[^>]*>", "") // strip html
.split('\n')
.map( (l) => String(l+'.').replace(/(^|:|;|!|\?|\.)\.$/g,'\$1') ) // add dot if needed
.join('. ')
}
const transcriptToText = (t) => t.map( (o) => `${o.name} ${o.description}`).join(" ")
// describe current scene
xrf.addEventListener('navigateLoaded', () => {
let subscene = xrf.frag.pos.last || xrf.navigator.URI.XRF?.pos?.string
subscene = subscene ? subscene = xrf.scene.getObjectByName( subscene ) : false
let transcript = transcriptToText( xrf.sceneToTranscript(subscene) )
term.send(`\r${transcript}\n\r`)
})
isoterminal.el.addEventListener('init', () => {
// override/extend bootmenu-array with your own REPL(s)
// see com/isoterminal/feat/boot.REPL.*.js for examples
ISOTerminal.prototype.boot.menu = [] // reset options
window.term = isoterminal.term
// clear bootmenu-array
// see com/isoterminal/feat/boot.REPL.*.js for REPL examples
ISOTerminal.prototype.boot.menu = []
const sanitizeTranscript = (str) => {
return str
.replaceAll("<[^>]*>", "") // strip html
.split('\n')
.map( (l) => String(l+'.').replace(/(^|:|;|!|\?|\.)\.$/g,'\$1') ) // add dot if needed
.join('. ')
}
// we've received our terminal \o/
term = window.term = isoterminal.term
// describe mouseover button (and scene to be teleported to, if any)
xrf.addEventListener('href', (e) => {
if( typeof e.selected == 'undefined' || !e.mesh ) return; // only process mouse-overs
let name = "object"
let info = ""
let name = "object"
let info = ""
let subscene = false
if( e.mesh.userData ){
if( e.mesh.userData.href && e.mesh.userData.href.match("pos=") ){
name = "portal: "
info = "to "+ xrfragment.URI.parse( e.mesh.userData.href ).XRF.pos.string
name = "action: "
subscene = xrfragment.URI.parse( e.mesh.userData.href ).XRF.pos.string
info = "to "+ subscene
}
if( e.mesh.userData['aria-description'] ){
info = sanitizeTranscript(e.mesh.userData['aria-description'])
info += "\n\r"+sanitizeTranscript(e.mesh.userData['aria-description'])
}
if( subscene ){
info += `\n\r${transcriptToText( xrf.sceneToTranscript(subscene,false,true) )}`
}
if( !info && e.mesh.name ) name = e.mesh.name
// traverse ancestors to nearest aria-description
// info: scene description
}
term.send(`\r\n${name} ${info}\n\r`)
})

File diff suppressed because one or more lines are too long

2
make
View file

@ -123,7 +123,7 @@ build(){
cp src/3rd/js/plugin/frontend/\$editor.js dist/xrfragment.plugin.editor.js
cp src/3rd/js/plugin/frontend/css.js dist/xrfragment.plugin.frontend.css.js
jscat src/3rd/js/plugin/frontend/{snackbar,accessibility,\$menu,frontend,chatcommand/*,joystick}.js > dist/xrfragment.plugin.frontend.js
jscat src/3rd/js/plugin/frontend/{snackbar,accessibility,\$menu,frontend,chatcommand/*,joystick,tab-to-href}.js > dist/xrfragment.plugin.frontend.js
jscat src/3rd/js/plugin/matrix/{matrix-crdt,matrix}.js > dist/xrfragment.plugin.matrix.js
jscat src/3rd/js/plugin/p2p/{trystero-torrent.min,trystero}.js > dist/xrfragment.plugin.p2p.js

View file

@ -1,6 +1,6 @@
xrf.sceneToTranscript = (scene, node, currentPosition ) => {
let items = []
scene = currentPosition && xrf.frag.pos.last ? xrf.scene.getObjectByName(xrf.frag.pos.last) : scene || xrf.scene
scene = currentPosition && xrf.frag.pos.last ? xrf.scene.getObjectByName(xrf.frag.pos.last) : (scene || xrf.scene)
scene.traverse( (n) => {
let isSRC = false
n.traverseAncestors( (m) => m.userData.src ? isSRC = true : false )