SoUI 0.5版本占坑
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.4 KiB

local table_concat = table.concat
local current_x, current_y
local function get_data(x, y, k)
local str = {}
str[#str+1] = 'C'
if x ~= current_x then
current_x = x
str[#str+1] = ('X%d'):format(x)
end
if y ~= current_y then
current_y = y
str[#str+1] = ('Y%d'):format(y)
end
if tonumber(k) then
str[#str+1] = ('K%s'):format(k)
else
str[#str+1] = ('K"%s"'):format(k)
end
return table_concat(str, ';')
end
local current_titles
local function insert_title(buf, title)
local x = #current_titles+1
current_titles[x] = title
current_titles[title] = x
buf[#buf+1] = get_data(x, 1, title)
return x
end
local function get_title(buf, title)
return current_titles[title] or insert_title(buf, title)
end
local function insert_obj(buf, tbl)
local y = 1
for name, obj in pairs(tbl) do
y = y + 1
buf[#buf+1] = get_data(1, y, name)
for key, value in pairs(obj) do
local str = get_data(get_title(buf, key), y, value)
buf[#buf+1] = str
end
end
return y
end
return function(t, id_title)
local buf = {'ID;PWXL;N;E', ''}
current_x = nil
current_y = nil
current_titles = {}
insert_title(buf, id_title)
local y = insert_obj(buf, t)
buf[#buf+1] = 'E'
buf[2] = ('B;X%d;Y%d;D%d'):format(#current_titles, y, 0)
return table_concat(buf, '\r\n')
end