Модуль:Песочница/Seryo93/Test

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация
local AreaPlaceARRS = {}
bit32 = require( 'bit32' )

 	local function LimitDouble(Val)
	    local MaxNumber = 2147483648
    	return Val - (math.floor(Val / MaxNumber) * MaxNumber)
	end
	
	local function shl(Val, Shift)
	    if Shift > 0 then
    	    return  LimitDouble(Val * (2 ^ Shift))
	    else
    	    return Value
	    end 
	end

	local function shr(Val, Shift)
	    if Shift > 0 then 
    		return math.floor(Val / (2 ^ Shift))
	    else
    		return Val
	    end
	end

	local function MakeHash(PlaceName)    
		local dataLength = mw.ustring.len(PlaceName)
    	if dataLength == 0 then return 0 end
		local hash = dataLength
		local remainingBytes =  math.fmod(dataLength, 2)
	    local numberOfLoops = math.floor(dataLength / 2)
	    local currentIndex = 0
    	local tmp = 0
    	while (numberOfLoops > 0) do 
			hash = LimitDouble(hash + mw.ustring.codepoint(PlaceName, currentIndex + 1))
			tmp = bit32.bxor(shl(mw.ustring.codepoint(PlaceName, currentIndex + 2), 11), hash)
			hash = bit32.bxor(shl(hash, 16), tmp)
			hash = LimitDouble(hash + shr(hash, 11))
			currentIndex = currentIndex + 2
			numberOfLoops = numberOfLoops - 1
	    end
		if remainingBytes == 1 then
			hash = LimitDouble(hash + mw.ustring.codepoint(PlaceName, currentIndex + 1))
			hash = bit32.bxor(hash, shl(hash, 10))
			hash = LimitDouble(hash + shr(hash, 1))
	    end
		hash = bit32.bxor(hash, shl(hash, 3))
		hash = LimitDouble(hash + shr(hash, 5))
		hash = bit32.bxor(hash, shl(hash, 4))
		hash = LimitDouble(hash + shr(hash, 17))
		hash = bit32.bxor(hash, shl(hash, 25))
		hash = LimitDouble(hash + shr(hash, 6))
		return hash
	end
	
function string.starts(String,Start)
   return string.sub(String,1,string.len(Start))==Start
end

function AreaPlaceARRS.main(frame)
	local args = frame:getParent().args

    if args == nil then return "Введите название объекта АТД" end
    local PlaceHash = tonumber(args[1])
    if PlaceHash ~= nil then
    assert(type(PlaceHash) == "number", "PlaceHash must be number or nil")
 	local NumPage = math.floor((PlaceHash - 1) / 33554432 + 2)
	if NumPage == 2 and (PlaceHash - 1) < 16777216 then NumPage = 1 end
	local templatename
	if NumPage < 10  then templatename = "Население/STA-00"..NumPage else templatename = "Население/STA-0"..NumPage	end
		return templatename
	end	
end

function AreaPlaceARRS.checktype(frame)
    return type(frame:expandTemplate{ title = 'Население/STA-005', args = { 107744721 } })
end


return AreaPlaceARRS