Skip to content

Commit

Permalink
Update split.lua
Browse files Browse the repository at this point in the history
  • Loading branch information
VorTechnix committed Sep 12, 2024
1 parent 005615d commit e24997d
Showing 1 changed file with 89 additions and 88 deletions.
177 changes: 89 additions & 88 deletions worldeditadditions_core/utils/strings/split.lua
Original file line number Diff line number Diff line change
@@ -1,89 +1,90 @@
-- Licence: GPLv2 (MPL-2.0 is compatible, so we can use this here)
-- Source: https://stackoverflow.com/a/43582076/1460422

-- gsplit: iterate over substrings in a string separated by a pattern
--
-- Parameters:
-- text (string) - the string to iterate over
-- pattern (string) - the separator pattern
-- plain (boolean) - if true (or truthy), pattern is interpreted as a plain
-- string, not a Lua pattern
--
-- Returns: iterator
--
-- Usage:
-- for substr in gsplit(text, pattern, plain) do
-- doSomething(substr)
-- end
local function gsplit(text, pattern, plain)
local splitStart, length = 1, #text
return function ()
if splitStart then
local sepStart, sepEnd = string.find(text, pattern, splitStart, plain)
local ret
if not sepStart then
ret = string.sub(text, splitStart)
splitStart = nil
elseif sepEnd < sepStart then
-- Empty separator!
ret = string.sub(text, splitStart, sepStart)
if sepStart < length then
splitStart = sepStart + 1
else
splitStart = nil
end
else
ret = sepStart > splitStart and string.sub(text, splitStart, sepStart - 1) or ''
splitStart = sepEnd + 1
end
return ret
end
end
end


--- Split a string into substrings separated by a pattern. -- Deprecated
-- @param text string The string to iterate over
-- @param pattern string The separator pattern
-- @param plain boolean If true (or truthy), pattern is interpreted as a
-- plain string, not a Lua pattern
-- @returns table A sequence table containing the substrings
local function dsplit(text, pattern, plain)
local ret = {}
for match in gsplit(text, pattern, plain) do
table.insert(ret, match)
end
return ret
end

--- Split a string into substrings separated by a pattern.
-- @param str string The string to iterate over
-- @param dlm string The delimiter (separator) pattern
-- @param plain boolean If true (or truthy), pattern is interpreted as a
-- plain string, not a Lua pattern
-- @returns table A sequence table containing the substrings
local function split(str,dlm,plain)
local pos, ret = 0, {}
local ins, i = str:find(dlm,pos,plain)
-- "if plain" shaves off some time in the while statement
if plain then
while ins do
table.insert(ret,str:sub(pos,ins - 1))
pos = ins + #dlm
ins = str:find(dlm,pos,true)
end
else
while ins do
table.insert(ret,str:sub(pos,ins - 1))
pos = i + 1
ins, i = str:find(dlm,pos)
end
end
-- print(pos..","..#str)
if str:sub(pos,#str) ~= "" then
table.insert(ret,str:sub(pos,#str))
end
return ret
end

-- Licence: GPLv2 (MPL-2.0 is compatible, so we can use this here)
-- Source: https://stackoverflow.com/a/43582076/1460422

-- gsplit: iterate over substrings in a string separated by a pattern
--
-- Parameters:
-- text (string) - the string to iterate over
-- pattern (string) - the separator pattern
-- plain (boolean) - if true (or truthy), pattern is interpreted as a plain
-- string, not a Lua pattern
--
-- Returns: iterator
--
-- Usage:
-- for substr in gsplit(text, pattern, plain) do
-- doSomething(substr)
-- end
local function gsplit(text, pattern, plain)
local splitStart, length = 1, #text
return function ()
if splitStart then
local sepStart, sepEnd = string.find(text, pattern, splitStart, plain)
local ret
if not sepStart then
ret = string.sub(text, splitStart)
splitStart = nil
elseif sepEnd < sepStart then
-- Empty separator!
ret = string.sub(text, splitStart, sepStart)
if sepStart < length then
splitStart = sepStart + 1
else
splitStart = nil
end
else
ret = sepStart > splitStart and string.sub(text, splitStart, sepStart - 1) or ''
splitStart = sepEnd + 1
end
return ret
end
end
end


--- Split a string into substrings separated by a pattern. -- Deprecated
-- @param text string The string to iterate over
-- @param pattern string The separator pattern
-- @param plain boolean If true (or truthy), pattern is interpreted as a
-- plain string, not a Lua pattern
-- @returns table A sequence table containing the substrings
local function dsplit(text, pattern, plain)
local ret = {}
for match in gsplit(text, pattern, plain) do
table.insert(ret, match)
end
return ret
end

--- Split a string into substrings separated by a pattern.
-- @param str string The string to iterate over
-- @param dlm string The delimiter (separator) pattern (default: "%s+")
-- @param plain boolean If true (or truthy), pattern is interpreted as a
-- plain string, not a Lua pattern
-- @returns table A sequence table containing the substrings
local function split(str,dlm,plain)
if not dlm then dlm = "%s+" end
local pos, ret = 0, {}
local ins, i = str:find(dlm,pos,plain)
-- "if plain" shaves off some time in the while statement
if plain then
while ins do
table.insert(ret,str:sub(pos,ins - 1))
pos = ins + #dlm
ins = str:find(dlm,pos,true)
end
else
while ins do
table.insert(ret,str:sub(pos,ins - 1))
pos = i + 1
ins, i = str:find(dlm,pos)
end
end
-- print(pos..","..#str)
if str:sub(pos,#str) ~= "" then
table.insert(ret,str:sub(pos,#str))
end
return ret
end

return split

0 comments on commit e24997d

Please sign in to comment.