Этот модуль содержит оптимизированные варианты функций из библиотеки Scribunto mw.text. Их использование позволяет достичь сокращения времени, затраченного на выполнение кода, а также используемой памяти интерпретатора.
-- Source: https://phabricator.wikimedia.org/diffusion/ELUA/browse/master/includes/engines/LuaCommon/lualib/mw.text.lua
-- With modification, of course (:
local p = {}
function p.gsplit( text, pattern, plain )
local s, l = 1, text:len()
return function ()
if s then
local e, n = text:find( pattern, s, plain )
local ret
if not e then
ret = text:sub( s )
s = nil
elseif n < e then
-- Empty separator!
ret = text:sub( s, e )
if e < l then
s = e + 1
else
s = nil
end
else
ret = e > s and text:sub( s, e - 1 ) or ''
s = n + 1
end
return ret
end
end, nil, nil
end
function p.split( text, pattern, plain )
local ret = {}
for m in p.gsplit( text, pattern, plain ) do
ret[#ret+1] = m
end
return ret
end
function p.trim( s, charset )
charset = charset or '\t\r\n\f '
s = s:gsub( '^[' .. charset .. ']*(.-)[' .. charset .. ']*$', '%1' )
return s
end
function p.fastTrim(str)
local byte = string.byte
local startIndex = 0
local space, newline, tab = byte(" \n\t", 1, 3)
local strByte
repeat
startIndex = startIndex + 1
strByte = byte(str, startIndex, startIndex)
until (strByte ~= space) and (strByte ~= newline) and (strByte ~= tab)
local endIndex = str:len() + 1
repeat
endIndex = endIndex - 1
strByte = byte(str, endIndex, endIndex)
until (strByte ~= space) and (strByte ~= newline) and (strByte ~= tab)
return str:sub(startIndex, endIndex)
end
return p