From 50d7cd0f0b3b589a3a328547ad2be824122a4ee4 Mon Sep 17 00:00:00 2001 From: Fabien Benetou Date: Sat, 22 Oct 2022 11:58:33 +0200 Subject: [PATCH] WebDAV browsing as handleFromGenerator() example --- index.html | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/index.html b/index.html index 4dca04f..ec0edc8 100644 --- a/index.html +++ b/index.html @@ -112,10 +112,11 @@ const url = "https://fabien.benetou.fr/PIMVRdata/CabinData?action=" var primarySide = 0 const sides = ["right", "left"] 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 var heightAdjustableClasses = ["commands-from-external-json"] 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. // ?inputmode=makeymakey @@ -796,7 +797,7 @@ AFRAME.registerComponent('pinchsecondary', { this.el.addEventListener('pinchended', function (event) { selectedElement = getClosestTargetElement( event.detail.position ) // 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 if (setupMode) setupBBox["B"] = event.detail.position if ( setupBBox["A"] && setupBBox["B"] ) { @@ -1192,7 +1193,7 @@ function parseJXR( code ){ 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 == ">") { // Enter equivalent addNewNote( hudTextEl.getAttribute("value") ) @@ -1203,13 +1204,22 @@ function interpretJXR( 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 parseCode = "" code.split("\n").map( lineOfCode => parseCode += parseJXR( lineOfCode ) + ";" ) // could ignore meta code e.g showhistory / saveHistoryAsCompoundSnippet 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 ) try { eval( parseCode ) @@ -1221,6 +1231,23 @@ function interpretJXR( code ){ // 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 init: function(){ var el = this.el @@ -1348,13 +1375,12 @@ AFRAME.registerComponent('dynamic-view', { AFRAME.registerComponent('webdav', { init:function(){ // could become a parameter instead with optional credentials - const client = window.WebDAV.createClient(webdavURL); + webdavClient = window.WebDAV.createClient(webdavURL); let generatorName = this.attrName - async function getDirectory(path = "/"){ - return await client.getDirectoryContents(path); - } - getDirectory().then( d => d.map( (c,i) => addNewNote( c.filename , "-1 "+(i/10+1)+" -1", undefined, undefined, generatorName) ) ) + webdavClient.getDirectoryContents("/").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. + // 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 }, });