mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
test/helpers: Add format_string and format_luav
First intended to provide %r functionality like in Python (and also support for %*.*s, but this was not checked), second adds nice table formatting for use in cases similar to screen:snapshot_util().
This commit is contained in:
parent
5b32bce73c
commit
520c0b91a5
@ -307,6 +307,83 @@ local function dedent(str, leave_indent)
|
||||
return str
|
||||
end
|
||||
|
||||
local SUBTBL = {
|
||||
'\\000', '\\001', '\\002', '\\003', '\\004',
|
||||
'\\005', '\\006', '\\007', '\\008', '\\t',
|
||||
'\\n', '\\011', '\\012', '\\r', '\\014',
|
||||
'\\015', '\\016', '\\017', '\\018', '\\019',
|
||||
'\\020', '\\021', '\\022', '\\023', '\\024',
|
||||
'\\025', '\\026', '\\027', '\\028', '\\029',
|
||||
'\\030', '\\031',
|
||||
}
|
||||
|
||||
local format_luav
|
||||
|
||||
format_luav = function(v, indent)
|
||||
local linesep = '\n'
|
||||
local next_indent = nil
|
||||
if indent == nil then
|
||||
indent = ''
|
||||
linesep = ''
|
||||
else
|
||||
next_indent = indent .. ' '
|
||||
end
|
||||
local ret = ''
|
||||
if type(v) == 'string' then
|
||||
ret = '\'' .. tostring(v):gsub('[\'\\]', '\\%0'):gsub('[%z\1-\31]', function(match)
|
||||
return SUBTBL[match:byte()]
|
||||
end) .. '\''
|
||||
elseif type(v) == 'table' then
|
||||
local processed_keys = {}
|
||||
ret = '{' .. linesep
|
||||
for i, subv in ipairs(v) do
|
||||
ret = ret .. (next_indent or '') .. format_luav(subv, next_indent) .. ',\n'
|
||||
processed_keys[i] = true
|
||||
end
|
||||
for k, subv in pairs(v) do
|
||||
if not processed_keys[k] then
|
||||
if type(k) == 'string' and k:match('^[a-zA-Z_][a-zA-Z0-9_]*$') then
|
||||
ret = ret .. next_indent .. k .. ' = '
|
||||
else
|
||||
ret = ret .. next_indent .. '[' .. format_luav(k) .. '] = '
|
||||
end
|
||||
ret = ret .. format_luav(subv, next_indent) .. ',\n'
|
||||
end
|
||||
end
|
||||
ret = ret .. indent .. '}'
|
||||
else
|
||||
-- Not implemented yet
|
||||
assert(false)
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
local function format_string(fmt, ...)
|
||||
local i = 0
|
||||
local args = {...}
|
||||
local function getarg()
|
||||
i = i + 1
|
||||
return args[i]
|
||||
end
|
||||
local ret = fmt:gsub('%%[0-9*]*%.?[0-9*]*[cdEefgGiouXxqsr%%]', function(match)
|
||||
local subfmt = match:gsub('%*', function(match)
|
||||
return getarg()
|
||||
end)
|
||||
local arg = nil
|
||||
if subfmt:sub(-1) ~= '%' then
|
||||
arg = getarg()
|
||||
end
|
||||
if subfmt:sub(-1) == 'r' then
|
||||
-- %r is like %q, but it is supposed to single-quote strings and not
|
||||
-- double-quote them, and also work not only for strings.
|
||||
subfmt = subfmt:sub(1, -2) .. 's'
|
||||
arg = format_luav(arg)
|
||||
end
|
||||
return subfmt:format(arg)
|
||||
end)
|
||||
return ret
|
||||
end
|
||||
|
||||
return {
|
||||
eq = eq,
|
||||
neq = neq,
|
||||
@ -323,4 +400,6 @@ return {
|
||||
shallowcopy = shallowcopy,
|
||||
concat_tables = concat_tables,
|
||||
dedent = dedent,
|
||||
format_luav = format_luav,
|
||||
format_string = format_string,
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user