mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	feat: add vim.str_utf_pos function
vim.str_utf_pos returns the codepoints for all utf-8 chars (only, currently) in a string
This commit is contained in:
		@@ -176,6 +176,29 @@ static int nlua_str_utfindex(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
 | 
				
			|||||||
  return 2;
 | 
					  return 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// return byte indices of codepoints in a string (only supports utf-8 currently).
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Expects a string.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Returns a list of codepoints.
 | 
				
			||||||
 | 
					static int nlua_str_utf_pos(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t s1_len;
 | 
				
			||||||
 | 
					  const char *s1 = luaL_checklstring(lstate, 1, &s1_len);
 | 
				
			||||||
 | 
					  lua_newtable(lstate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  size_t idx = 1;
 | 
				
			||||||
 | 
					  size_t clen;
 | 
				
			||||||
 | 
					  for (size_t i = 0; i < s1_len && s1[i] != NUL; i += clen) {
 | 
				
			||||||
 | 
					    clen = (size_t)utf_ptr2len_len((const char_u *)(s1)+i, (int)(s1_len-i));
 | 
				
			||||||
 | 
					    lua_pushinteger(lstate, (long)i + 1);
 | 
				
			||||||
 | 
					    lua_rawseti(lstate, -2, (int)idx);
 | 
				
			||||||
 | 
					    idx++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// convert UTF-32 or UTF-16 indices to byte index.
 | 
					/// convert UTF-32 or UTF-16 indices to byte index.
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// Expects up to three args: string, index and use_utf16.
 | 
					/// Expects up to three args: string, index and use_utf16.
 | 
				
			||||||
@@ -435,6 +458,9 @@ static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
 | 
				
			|||||||
  // str_byteindex
 | 
					  // str_byteindex
 | 
				
			||||||
  lua_pushcfunction(lstate, &nlua_str_byteindex);
 | 
					  lua_pushcfunction(lstate, &nlua_str_byteindex);
 | 
				
			||||||
  lua_setfield(lstate, -2, "str_byteindex");
 | 
					  lua_setfield(lstate, -2, "str_byteindex");
 | 
				
			||||||
 | 
					  // str_utf_pos
 | 
				
			||||||
 | 
					  lua_pushcfunction(lstate, &nlua_str_utf_pos);
 | 
				
			||||||
 | 
					  lua_setfield(lstate, -2, "str_utf_pos");
 | 
				
			||||||
  // neovim version
 | 
					  // neovim version
 | 
				
			||||||
  lua_pushcfunction(lstate, &nlua_nvim_version);
 | 
					  lua_pushcfunction(lstate, &nlua_nvim_version);
 | 
				
			||||||
  lua_setfield(lstate, -2, "version");
 | 
					  lua_setfield(lstate, -2, "version");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -179,6 +179,12 @@ describe('lua stdlib', function()
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it("vim.str_utf_pos", function()
 | 
				
			||||||
 | 
					    exec_lua([[_G.test_text = "xy åäö ɧ 汉语 ↥ 🤦x🦄 å بِيَّ"]])
 | 
				
			||||||
 | 
					    local expected_positions = { 1,2,3,4,6,8,10,11,13,14,17,20,21,24,25,29,30,34,35,36,38,39,41,43,45,47 }
 | 
				
			||||||
 | 
					    eq(expected_positions, exec_lua("return vim.str_utf_pos(_G.test_text)"))
 | 
				
			||||||
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it("vim.schedule", function()
 | 
					  it("vim.schedule", function()
 | 
				
			||||||
    exec_lua([[
 | 
					    exec_lua([[
 | 
				
			||||||
      test_table = {}
 | 
					      test_table = {}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user