WebDAV browsing as handleFromGenerator() example

webdav
Fabien Benetou 2 years ago
parent b96a58883c
commit 50d7cd0f0b
  1. 44
      index.html

@ -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 client = window.WebDAV.createClient(webdavURL); webdavClient = 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
}, },
}); });

Loading…
Cancel
Save