-
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
005615d
commit e24997d
Showing
1 changed file
with
89 additions
and
88 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |