@ -112,10 +112,11 @@ const url = "https://fabien.benetou.fr/PIMVRdata/CabinData?action="
var primarySide = 0
var primarySide = 0
const sides = ["right", "left"]
const sides = ["right", "left"]
var generators = "line-link-entities link screenstack dynamic-view selectionboxonpinches keyboard "
var generators = "line-link-entities link screenstack dynamic-view selectionboxonpinches keyboard "
+ "commands-from-external-json glossary timeline issues web-url background-via-url observableui hidableenvironmentfot fot"
+ "commands-from-external-json glossary timeline issues web-url background-via-url observableui hidableenvironmentfot fot webdav "
// could be an array proper completed on each relevant component registration
// could be an array proper completed on each relevant component registration
var heightAdjustableClasses = ["commands-from-external-json"]
var heightAdjustableClasses = ["commands-from-external-json"]
const webdavURL = "https://webdav.benetou.fr";
const webdavURL = "https://webdav.benetou.fr";
var webdavClient
// could add a dedicated MakeyMakey mode with a fixed camera, e.g bird eye view, and an action based on some physical input that others, thanks to NAF, could see or even use.
// could add a dedicated MakeyMakey mode with a fixed camera, e.g bird eye view, and an action based on some physical input that others, thanks to NAF, could see or even use.
// ?inputmode=makeymakey
// ?inputmode=makeymakey
@ -796,7 +797,7 @@ AFRAME.registerComponent('pinchsecondary', {
this.el.addEventListener('pinchended', function (event) {
this.el.addEventListener('pinchended', function (event) {
selectedElement = getClosestTargetElement( event.detail.position )
selectedElement = getClosestTargetElement( event.detail.position )
// if close enough to a target among a list of potential targets, unselect previous target then select new
// if close enough to a target among a list of potential targets, unselect previous target then select new
if (selectedElement) interpretJXR( selectedElement.getAttribute("value") )
if (selectedElement) interpretJXR( selectedElement.getAttribute("value"), selectedElement )
selectedElement = null
selectedElement = null
if (setupMode) setupBBox["B"] = event.detail.position
if (setupMode) setupBBox["B"] = event.detail.position
if ( setupBBox["A"] & & setupBBox["B"] ) {
if ( setupBBox["A"] & & setupBBox["B"] ) {
@ -1192,7 +1193,7 @@ function parseJXR( code ){
return newcode
return newcode
}
}
function interpretJXR( code ){
function interpretJXR( code, sourceElement = null ){
if (code.length == 1) { // special case of being a single character, thus keyboard
if (code.length == 1) { // special case of being a single character, thus keyboard
if (code == ">") { // Enter equivalent
if (code == ">") { // Enter equivalent
addNewNote( hudTextEl.getAttribute("value") )
addNewNote( hudTextEl.getAttribute("value") )
@ -1203,13 +1204,22 @@ function interpretJXR( code ){
appendToHUD( code )
appendToHUD( code )
}
}
}
}
if (!code.match(/^jxr /)) return
if (!code.match(/^jxr /)) {
if (sourceElement & & sourceElement.className & & generators.includes(sourceElement.className) )
handleFromGenerator(sourceElement)
return
}
var uninterpreted = code
var uninterpreted = code
var parseCode = ""
var parseCode = ""
code.split("\n").map( lineOfCode => parseCode += parseJXR( lineOfCode ) + ";" )
code.split("\n").map( lineOfCode => parseCode += parseJXR( lineOfCode ) + ";" )
// could ignore meta code e.g showhistory / saveHistoryAsCompoundSnippet
// could ignore meta code e.g showhistory / saveHistoryAsCompoundSnippet
commandhistory.push( {date: +Date.now(), uninterpreted: uninterpreted, interpreted: parseCode} )
commandhistory.push( {date: +Date.now(), uninterpreted: uninterpreted, interpreted: parseCode} )
// examples to test via the console without putting the headset on:
/*
selectedElement = document.querySelectorAll(".commands-from-external-json")[1] ;
interpretJXR( selectedElement.getAttribute("value"), selectedElement );
*/
console.log( parseCode )
console.log( parseCode )
try {
try {
eval( parseCode )
eval( parseCode )
@ -1221,6 +1231,23 @@ function interpretJXR( code ){
// opt re-run it by moving the corresponding text in target volume
// opt re-run it by moving the corresponding text in target volume
}
}
function handleFromGenerator(el){
let value = el.getAttribute("value")
let generatorName = el.className // hijacking classes, could rely on a dedicated attribute instead, e.g generator
console.log("trying to get", value, "from generator", generatorName)
if (generatorName == "webdav"){
console.log("webdav generator, trying to handle files and directories")
webdavClient.stat(value).then( s => {
console.log("webdav stat", s)
if ( s.type == "directory")
webdavClient.getDirectoryContents(value).then( d => d.map( (c,i) => addNewNote( c.filename , "-1 "+(i/10+1)+" -1", undefined, undefined, generatorName) ) )
else
console.log("it's a file of MIME", s.mime)
})
// assume its a directory, not a file. If file, no error though.... but no content either.
}
}
AFRAME.registerComponent('toolbox', { // ununsed
AFRAME.registerComponent('toolbox', { // ununsed
init: function(){
init: function(){
var el = this.el
var el = this.el
@ -1348,13 +1375,12 @@ AFRAME.registerComponent('dynamic-view', {
AFRAME.registerComponent('webdav', {
AFRAME.registerComponent('webdav', {
init:function(){
init:function(){
// could become a parameter instead with optional credentials
// could become a parameter instead with optional credentials
const c lient = window.WebDAV.createClient(webdavURL);
webdavC lient = window.WebDAV.createClient(webdavURL);
let generatorName = this.attrName
let generatorName = this.attrName
async function getDirectory(path = "/"){
webdavClient.getDirectoryContents("/").then( d => d.map( (c,i) => addNewNote( c.filename , "-1 "+(i/10+1)+" -1", undefined, undefined, generatorName) ) )
return await client.getDirectoryContents(path);
}
getDirectory().then( d => d.map( (c,i) => addNewNote( c.filename , "-1 "+(i/10+1)+" -1", undefined, undefined, generatorName) ) )
// null doesn't fallback to default parameter. Fine when truly optional but fails otherwise, so prefer undefined.
// null doesn't fallback to default parameter. Fine when truly optional but fails otherwise, so prefer undefined.
// on the impact of provenance https://git.benetou.fr/utopiah/text-code-xr-engine/issues/52#issuecomment-209
// see interpretJXR and parseJXR, arguably others, e.g keyboard, could be used instead on specific tests, e.g length
},
},
});
});