From eab426e8b50bde45e3f03382a6f5749e7d71963e Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Mon, 28 Sep 2026 15:22:20 +0200 Subject: [PATCH] more tests + add tree-icon to playables --- .../tronverse/tronverse-icosagallery.jpg | Bin 0 -> 42688 bytes src/page/dir.html | 20 +++++- src/page/janusxr.html | 4 +- src/plugin/janusxr/layout/grid.lua | 1 - src/plugin/janusxr/layout/portals.lua | 4 +- src/plugin/openbrush.lua | 63 ++++++++++++------ src/test/main.lua | 12 ++-- src/test/plugin_git.lua | 1 + src/test/plugin_janusxr.lua | 20 +++++- src/test/plugin_openbrush.lua | 23 +++++++ 10 files changed, 114 insertions(+), 34 deletions(-) create mode 100644 src/myverse/tronverse/tronverse-icosagallery.jpg diff --git a/src/myverse/tronverse/tronverse-icosagallery.jpg b/src/myverse/tronverse/tronverse-icosagallery.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1b6d4223e208be1d488036b14ae914d18990b0e GIT binary patch literal 42688 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 OI-fe>fbi&ly8j0(H(mn( literal 0 HcmV?d00001 diff --git a/src/page/dir.html b/src/page/dir.html index beecce1..ddb1d51 100644 --- a/src/page/dir.html +++ b/src/page/dir.html @@ -39,7 +39,7 @@ end}

{if items then - function getURL(url) + function getURL(url, item) if app.arg[1] == 'generate' or url:match("://") then url = '?view=3D#janus.url=' .. EscapeFragment( url ) url = util.baseURLify(url) @@ -54,15 +54,29 @@ end} local visible = item.view2D == nil or (item.view2D ~= nil and item.view2D ~= false) if visible then local icon = 'list-tree' + local url = item.url local thumbnail = '' if #item.thumbnail > 0 then thumbnail = 'style="background-image: url(' .. EscapeFragment( util.stripPath(item.thumbnail) ) .. ');"' end - if item.view3D or item.portal3D == false then icon = 'play' end + if (item.view3D or item.portal3D == false) + or (item.janusxr and item.janusxr.room) + or (item.xrfragment and item.xrfragment.href) + then + url = url .. '?view=3D' + icon = 'play' + end print([[
- +
 ]] .. item.title .. [[ + ]] .. ( + item.janusxr and item.janusxr.room and [[ + + + + ]] or '' + ) .. [[
diff --git a/src/page/janusxr.html b/src/page/janusxr.html index e866fa7..f78ea73 100644 --- a/src/page/janusxr.html +++ b/src/page/janusxr.html @@ -72,7 +72,7 @@ end} {if not defined(item) and defined(items) and #items > 0 then - local layout = itemdir.layout or '' + local layout = (itemdir.janusxr and itemdir.janusxr.layout) or '' if #layout > 0 and app.plugin.janusxr.layout[ layout ] then print( app.plugin.janusxr.layout[ layout ].render(items) ) else @@ -81,7 +81,7 @@ end} end} {if not defined(item) and defined(itemsremote) and #itemsremote > 0 then for i,v in pairs(itemsremote) do - local width = v.portal_width or tonumber( app.opts.plugin_global_portal_width ) + local width = (v.janusxr and v.janusxr.portal_width) or tonumber( app.opts.plugin_global_portal_width ) local center = -((#itemsremote*width)/1.3) + (i*width) local url = v.url local thumb = ' shader_id="defaultportal" round="true"' diff --git a/src/plugin/janusxr/layout/grid.lua b/src/plugin/janusxr/layout/grid.lua index dccc6dc..0aef867 100644 --- a/src/plugin/janusxr/layout/grid.lua +++ b/src/plugin/janusxr/layout/grid.lua @@ -14,7 +14,6 @@ local grid = { local turns = 0 local index = 0 for i, v in pairs(items) do - jml = '\n' local url = v.redirect and v.redirect or v.url local overlay = v.title:match('overlay') and true or false -- Position current item diff --git a/src/plugin/janusxr/layout/portals.lua b/src/plugin/janusxr/layout/portals.lua index bdfb4ea..d689e6a 100644 --- a/src/plugin/janusxr/layout/portals.lua +++ b/src/plugin/janusxr/layout/portals.lua @@ -3,11 +3,11 @@ local portals = { local jml = '' for i,v in pairs(items) do local url = v.url - local width = tonumber(app.opts.plugin_global_portal_width ) + local width = util.pluck('parent.janusxr.portal_width', v, false) or app.opts.plugin_global_portal_width + width = tonumber(width) local thumb = ' shader_id="defaultportal"' if #v.thumbnail > 0 then thumb = ' thumb_id="img' .. i .. '" ' - if v.portal_width then width = tonumber(v.portal_width) end end local center = -((#items*width)/1.3) + (i*width) if v.dir then url = url .. "/" end diff --git a/src/plugin/openbrush.lua b/src/plugin/openbrush.lua index 4da1533..51692a9 100644 --- a/src/plugin/openbrush.lua +++ b/src/plugin/openbrush.lua @@ -11,32 +11,42 @@ local function scanTiltFile(exp) end end -local function scanForOpenBrush(exp) - local tags = app.plugin.openbrush.tags - if not tags then - tags = util.split( app.opts.plugin_openbrush_sync_hashtag, ' ') - table.insert( tags,"openbrush") - app.plugin.openbrush.tags = tags - end +local function scanForOpenBrush(exp,opts) + local tags = app.plugin.openbrush.getTags() foreach( tags, function(k,tag) tag = tag:gsub("#","") - if exp.path:match('/' .. tag:gsub("-","%%-") .. '/') then -- might not be precise enough - if not exp.parent.janusxr then - exp.parent.janusxr = {} + if exp.url:match( app.plugin.openbrush.pattern.collection(tag) ) then -- collection + if not exp.janusxr then + exp.janusxr = {} end - exp.parent.janusxr.room = app.opts[ "plugin_openbrush_wrap_room_" .. app.opts.plugin_openbrush_layout ] or 'empty' - exp.parent.portal_width = tonumber( app.opts.plugin_openbrush_portal_width ) - exp.parent.grid_size = tonumber( app.opts.plugin_openbrush_grid_size ) - exp.parent.layout = app.opts.plugin_openbrush_layout + exp.janusxr.layout = app.opts.plugin_openbrush_layout + exp.janusxr.room = app.opts[ "plugin_openbrush_wrap_room_" .. app.opts.plugin_openbrush_layout ] or 'empty' + exp.janusxr.portal_width = tonumber( app.opts.plugin_openbrush_portal_width ) + exp.janusxr.grid_size = tonumber( app.opts.plugin_openbrush_grid_size ) end end) scanTiltFile(exp) end - -app.on('scan_experience', scanForOpenBrush ) -app.on('scan_experience_file', scanForOpenBrush ) -app.on("scan_experience_janusxr", function(opts) scanForOpenBrush(opts.exp) end) +app.on('scan_experience', function(exp) scanForOpenBrush(exp,{dir=true}) end) +app.on('scan_experience_janusxr', function(opts) + local exp = opts.exp + if exp then + local tags = app.plugin.openbrush.getTags() + foreach( tags, function(k,tag) + tag = tag:gsub("#","") + if exp.url:match( app.plugin.openbrush.pattern.asset(tag) ) then -- asset + -- disable janusxr room wrapping (if any) + exp.janusxr = nil + -- also for the parent, and redirect to indirect child asset + if exp.parent.layout == nil and exp.parent.janusxr then + exp.parent.janusxr = nil + exp.parent.redirect = exp.url + end + end + end) + end +end) app.on('set', function(k,v) end) @@ -62,7 +72,7 @@ local plugin = { key='app.opts.plugin_openbrush_layout', title='Layout assets', info='NOTE: use #overlay in asset-title to skip layout (sky/floor/e.g.)', - default="grid", + default="portals", values={portals="As portals", grid="As grid"} }, { @@ -205,6 +215,21 @@ local plugin = { } }, + pattern = { + collection = function(tag) return '/' .. tag:gsub("-","%%-") .. '$' end, + asset = function(tag) return '/' .. tag:gsub("-","%%-") .. '/' end, + }, + + getTags = function() + local tags = app.plugin.openbrush.tags + if not tags then + tags = util.split( app.opts.plugin_openbrush_sync_hashtag, ' ') + table.insert( tags,"openbrush") + app.plugin.openbrush.tags = tags + end + return tags + end, + -- expected by src/.lua/apiSync.lua apiCall = function(tag) return 'https://api.' .. app.opts.plugin_openbrush_sync_URL .. '/v1/assets?xrforge=' .. EscapeFragment(app.host) diff --git a/src/test/main.lua b/src/test/main.lua index 538631b..2a8b523 100644 --- a/src/test/main.lua +++ b/src/test/main.lua @@ -5,13 +5,13 @@ local describe, it, expect = lust.describe, lust.it, lust.expect lust.queueServerRequest = util.queueServerRequest ---require('test/plugin_global')(lust) ---require('test/plugin_git')(lust) ---require('test/plugin_diskscan')(lust) ---require('test/plugin_xrfragment')(lust) +require('test/plugin_global')(lust) +require('test/plugin_git')(lust) +require('test/plugin_diskscan')(lust) +require('test/plugin_xrfragment')(lust) require('test/plugin_janusxr')(lust) ---require('test/plugin_openbrush')(lust) ---require('test/util')(lust) +require('test/plugin_openbrush')(lust) +require('test/util')(lust) if lust.errors == 0 then print("✅ all tests passed") diff --git a/src/test/plugin_git.lua b/src/test/plugin_git.lua index bace5ea..7c46fbd 100644 --- a/src/test/plugin_git.lua +++ b/src/test/plugin_git.lua @@ -13,6 +13,7 @@ return function(lust) app.init() local destdir = app.opts.plugin_diskscan_dir .. '/' .. 'xrfragment' expect( util.fileExist( destdir ) ).to.be.truthy() + os.execute('rm -rf ' .. destdir) end) end) diff --git a/src/test/plugin_janusxr.lua b/src/test/plugin_janusxr.lua index aa47490..e92f6f9 100644 --- a/src/test/plugin_janusxr.lua +++ b/src/test/plugin_janusxr.lua @@ -30,7 +30,25 @@ return function(lust) describe('ℹ️ wrap AFRAME file', function() -- Can be nested it('detect & serve to iframe', function() - -- *TODO* + app.init() + app.use( require('page/dir').middleware ) + app.use( app.response() ) + app.on('response', function(opts) + expect( not opts.res._body:match('use_local_asset=""') ).to.be.truthy() + expect( not opts.res._body:match('') ).to.be.truthy() + end) + + local url = '/myverse/janusxr_tutorial/AFRAME' + + foreach(app.cache.items, function(k,exp) + if exp.url:match(url) then + if exp.url:match( url .. "$") then + --print_r(exp) + lust.queueServerRequest('GET', url, nil, nil, nil, nil, nil, 8080 ) + app.run() + end + end + end) end) end) diff --git a/src/test/plugin_openbrush.lua b/src/test/plugin_openbrush.lua index 8ed6cce..774b2e1 100644 --- a/src/test/plugin_openbrush.lua +++ b/src/test/plugin_openbrush.lua @@ -17,6 +17,29 @@ return function(lust) expect( t.assets and #t.assets > 0 ).to.be.truthy() end) + describe('ℹ️ grid-layout', function() -- Can be nested + it('unwrap janusxr-room for assets', function() + app.init() + app.use( require('page/dir').middleware ) + app.use( app.response() ) + app.on('response', function(opts) + expect( not opts.res._body:match('/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery/tronverse_floor.glb') ).to.be.truthy() + end) + + local url = '/myverse/tronverse/tronverse-icosagallery' + + foreach(app.cache.items, function(k,exp) + if exp.url:match(url) then + if exp.url:match( url .. "$") then + --print_r(exp) + lust.queueServerRequest('GET', url, nil, nil, nil, nil, nil, 8080 ) + app.run() + end + end + end) + end) + end) + --describe('download icosa.gallery assets', function() -- Can be nested -- local json = util.readfile('/zip/test/json/icosagallery.json') -- local opts = {body=json}