xurfer/xurfer/ext/janusxr/main.lua

68 lines
1.7 KiB
Lua

local api = ...
local ecs = api.ecs
local util = api.util
return {
name = "janusxr",
enabled = true,
onURI = function(obj)
if obj.URL ~= nil and obj.URLResponse ~= nil and obj.URLResponse.ok then
local res = obj.URLResponse
-- JML heuristic
if res.data:lower():match("<fireboxroom>") or res.data:lower():match("<room[ >]") then
local JML0
local JML
res.xml = api.parser.xml.newParser()
local xmlstr = res.data
-- cleanup JML0
local JML0 = xmlstr:gsub(".*<[Rr]oom","<room")
JML0 = JML0:gsub("</[Rr]oom>.*","</room>")
api.ext.janusxr.loadXML( JML0, res, obj )
end
end
end,
loadXML = function(xml,res,obj)
print("[i] janusxr: loading JML:\n\n" .. xml .. "\n\n")
util.traverseXML( res.xml:ParseXmlText(xml), function(node,raw)
if node.tag == 'object' and node.prop.id ~= nil then
local protocol = nil
foreach( api.protocol, function(name, p)
if node.prop.id:match("^"..name) then
protocol = p
end
end)
if protocol ~= nil then
local newobj = {
URI = { url = node.prop.id, method = 'GET' },
janusxr = node
}
api.ext.janusxr.parseProps(node, newobj)
api.ecs.add( api.world, newobj )
end
end
end)
end,
parseProps = function(node,obj)
local me = api.ext.janusxr
foreach( node.prop, function(k,v)
if k == 'pos' then
local xyz = me.parseFloats(v)
obj.x = xyz[1]
obj.y = xyz[2]
obj.z = xyz[3]
end
end)
end,
parseFloats = function(s)
local t = {}
for num in s:gmatch("%S+") do
t[#t+1] = tonumber(num)
end
return t
end
}