Minecraft Wiki
Advertisement

Этот модуль содержит оптимизированные варианты функций из библиотеки 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
Advertisement