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.

89 lines
1.9 KiB

3 years ago
local function format_keyval(key, val)
if val == '' then
return nil
end
if key == 'EditorSuffix' then
return nil
end
if key == 'EditorName' then
return nil
end
return key .. '=' .. val
end
local function format_value(val)
if type(val) == 'string' then
val = val:gsub('\r\n', '|n'):gsub('[\r\n]', '|n')
if val:find(',', nil, false) then
val = '"' .. val .. '"'
end
end
return val
end
local function add_data(lines, key, data)
if key:find '[^%w_]' then
key = ('%q'):format(key)
end
local len = 0
for k in pairs(data) do
if k > len then
len = k
end
end
if len == 0 then
return
end
if len == 1 then
lines[#lines+1] = format_keyval(key, format_value(data[1]))
return
end
local values = {}
for i = 1, len do
values[i] = format_value(data[i])
end
lines[#lines+1] = format_keyval(key, table.concat(values, ','))
end
local function add_obj(lines, name, obj)
local values = {}
local keys = {}
for key in pairs(obj) do
keys[#keys+1] = key
end
table.sort(keys)
for _, key in ipairs(keys) do
if key:sub(1, 1) ~= '_' then
add_data(values, key, obj[key])
end
end
if #values == 0 then
return
end
lines[#lines+1] = ('[%s]'):format(name)
for _, value in ipairs(values) do
lines[#lines+1] = value
end
lines[#lines+1] = ''
end
local function add_chunk(lines, tbl)
local names = {}
for name in pairs(tbl) do
names[#names+1] = name
end
table.sort(names)
for _, name in ipairs(names) do
add_obj(lines, name, tbl[name])
end
end
return function (w2l, tbl)
local lines = {}
add_chunk(lines, tbl)
return table.concat(lines, '\r\n')
end