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: ~
(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:

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
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*

View File

@ -57,6 +57,7 @@ vim._submodules = {
fs = true,
iter = true,
re = true,
text = true,
}
-- 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',
'iter.lua',
'snippet.lua',
'text.lua',
],
'files': [
'runtime/lua/vim/iter.lua',
@ -184,6 +185,7 @@ CONFIG = {
'runtime/lua/vim/version.lua',
'runtime/lua/vim/_inspector.lua',
'runtime/lua/vim/snippet.lua',
'runtime/lua/vim/text.lua',
'runtime/lua/vim/_meta/builtin.lua',
'runtime/lua/vim/_meta/diff.lua',
'runtime/lua/vim/_meta/mpack.lua',
@ -247,6 +249,7 @@ CONFIG = {
'regex': 'vim.regex',
'spell': 'vim.spell',
'snippet': 'vim.snippet',
'text': 'vim.text',
},
'append_only': [
'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)