feat: add vim.text module (#26069)

This commit is contained in:
Gregory Anders 2023-11-16 11:35:54 -06:00 committed by GitHub
parent b4b7ca2d54
commit 4bf47222c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 84 additions and 0 deletions

View File

@ -3752,4 +3752,26 @@ vim.snippet.jumpable({direction}) *vim.snippet.jumpable()*
Return: ~ Return: ~
(boolean) (boolean)
==============================================================================
Lua module: vim.text *vim.text*
vim.text.hexdecode({enc}) *vim.text.hexdecode()*
Hex decode a string.
Parameters: ~
• {enc} (string) String to decode
Return: ~
(string) Decoded string
vim.text.hexencode({str}) *vim.text.hexencode()*
Hex encode a string.
Parameters: ~
• {str} (string) String to encode
Return: ~
(string) Hex encoded string
vim:tw=78:ts=8:sw=4:sts=4:et:ft=help:norl: vim:tw=78:ts=8:sw=4:sts=4:et:ft=help:norl:

View File

@ -214,6 +214,9 @@ The following new APIs and features were added.
• The 'termsync' option asks the terminal emulator to buffer screen updates • The 'termsync' option asks the terminal emulator to buffer screen updates
until the redraw cycle is complete. Requires support from the terminal. until the redraw cycle is complete. Requires support from the terminal.
• Added |vim.text.hexencode()| and |vim.text.hexdecode()| to convert strings
to and from byte representations.
============================================================================== ==============================================================================
CHANGED FEATURES *news-changed* CHANGED FEATURES *news-changed*

View File

@ -57,6 +57,7 @@ vim._submodules = {
fs = true, fs = true,
iter = true, iter = true,
re = true, re = true,
text = true,
} }
-- These are for loading runtime modules in the vim namespace lazily. -- These are for loading runtime modules in the vim namespace lazily.

32
runtime/lua/vim/text.lua Normal file
View File

@ -0,0 +1,32 @@
--- Text processing functions.
local M = {}
--- Hex encode a string.
---
--- @param str string String to encode
--- @return string Hex encoded string
function M.hexencode(str)
local bytes = { str:byte(1, #str) }
local enc = {} ---@type string[]
for i = 1, #bytes do
enc[i] = string.format('%02X', bytes[i])
end
return table.concat(enc)
end
--- Hex decode a string.
---
--- @param enc string String to decode
--- @return string Decoded string
function M.hexdecode(enc)
assert(#enc % 2 == 0, 'string must have an even number of hex characters')
local str = {} ---@type string[]
for i = 1, #enc, 2 do
local n = assert(tonumber(enc:sub(i, i + 1), 16))
str[#str + 1] = string.char(n)
end
return table.concat(str)
end
return M

View File

@ -167,6 +167,7 @@ CONFIG = {
'version.lua', 'version.lua',
'iter.lua', 'iter.lua',
'snippet.lua', 'snippet.lua',
'text.lua',
], ],
'files': [ 'files': [
'runtime/lua/vim/iter.lua', 'runtime/lua/vim/iter.lua',
@ -184,6 +185,7 @@ CONFIG = {
'runtime/lua/vim/version.lua', 'runtime/lua/vim/version.lua',
'runtime/lua/vim/_inspector.lua', 'runtime/lua/vim/_inspector.lua',
'runtime/lua/vim/snippet.lua', 'runtime/lua/vim/snippet.lua',
'runtime/lua/vim/text.lua',
'runtime/lua/vim/_meta/builtin.lua', 'runtime/lua/vim/_meta/builtin.lua',
'runtime/lua/vim/_meta/diff.lua', 'runtime/lua/vim/_meta/diff.lua',
'runtime/lua/vim/_meta/mpack.lua', 'runtime/lua/vim/_meta/mpack.lua',
@ -247,6 +249,7 @@ CONFIG = {
'regex': 'vim.regex', 'regex': 'vim.regex',
'spell': 'vim.spell', 'spell': 'vim.spell',
'snippet': 'vim.snippet', 'snippet': 'vim.snippet',
'text': 'vim.text',
}, },
'append_only': [ 'append_only': [
'shared.lua', 'shared.lua',

View File

@ -0,0 +1,23 @@
local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local eq = helpers.eq
describe('vim.text', function()
before_each(clear)
describe('hexencode() and hexdecode()', function()
it('works', function()
local cases = {
{ 'Hello world!', '48656C6C6F20776F726C6421' },
{ '😂', 'F09F9882' },
}
for _, v in ipairs(cases) do
local input, output = unpack(v)
eq(output, vim.text.hexencode(input))
eq(input, vim.text.hexdecode(output))
end
end)
end)
end)