From e24997dd80ba54b40692906d582027d4149ed957 Mon Sep 17 00:00:00 2001 From: VorTechnix <45538536+VorTechnix@users.noreply.github.com> Date: Thu, 12 Sep 2024 09:54:40 -0700 Subject: [PATCH] Update split.lua --- .../utils/strings/split.lua | 177 +++++++++--------- 1 file changed, 89 insertions(+), 88 deletions(-) diff --git a/worldeditadditions_core/utils/strings/split.lua b/worldeditadditions_core/utils/strings/split.lua index dbdaa74..2173dbd 100644 --- a/worldeditadditions_core/utils/strings/split.lua +++ b/worldeditadditions_core/utils/strings/split.lua @@ -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 \ No newline at end of file