Модуль:ХалкъалъулКъадаралъулРахъалъБакІИкълимал

Для документации этого модуля может быть создана страница Модуль:ХалкъалъулКъадаралъулРахъалъБакІИкълимал/doc

require('Module:No globals')
local bit32 = require( 'bit32' )

local ArrayPopSRC= mw.loadData('Module:Statistical/RUS-AAA')

local ArrayPopCur = {}

 	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
local function Getreg(regname)
    local PlaceName = regname

    if PlaceName == nil then return "Введите название объекта АТД" end
    PlaceName = mw.text.trim(PlaceName)
 
	local PlaceHash = MakeHash(PlaceName)
	local function FormatH()    
	    return PlaceHash
	end

    local PlaceData = nil
 	PlaceData = ArrayPopSRC[PlaceHash]

    local LastRecord = 0
    for k in pairs(PlaceData) do LastRecord = LastRecord + 1 end
    local NumRecord = LastRecord

	local function FormatN()    
	    return PlaceData[NumRecord][2]
	end
 
    return FormatN()
end

local ArrayReg = {
'Алтай край',
'Амурск област',
'Архангелск област',
'Астрахан област',
'Белгород област',
'Брянск област',
'Владимир област',
'Волгоград област',
'Вологодск област',
'Воронеж област',
'Москва',
'Санкт-Петербург',
'ЖугьутІ автономияб област',
'Забайкал край',
'Иваново област',
'Иркутск област',
'Къабарда-Балкъар',
'Калининград област',
'Калуга област',
'Камчатка край',
'Къарачай-Черкес',
'Карелия Республика',
'Кемерово област',
'Киров област',
'Кострома област',
'Краснодар край',
'Красноярск край',
'Курган област',
'Курск област',
'Ленинград област',
'Липецк област',
'Магадан област',
'Москва област',
'Мурманск област',
'Ненец автономияб икълим',
'Нижегородск област',
'Новгород област',
'Новосибирск област',
'Омск област',
'Оренбург област',
'Орел област',
'Пенза област',
'Перм край',
'Приморск край',
'Псков област',
'Адигея',
'Алтай Республика',
'Башкортостан',
'Бурятия',
'Дагъистан',
'Гъалгъай',
'Калмикия',
'Коми Республика',
'Крим Республика',
'Марий Эл',
'Мордовия',
'Якутия',
'Шималияб Гьиристан',
'Татарстан',
'Тива',
'Хакасия',
'Ростов област',
'Рязан област',
'Самара област',
'Саратов област',
'Сахалин област',
'Свердловск област',
'Севастопол',
'Смоленск област',
'Ставропол край',
'Тамбов област',
'Твер област',
'Томск област',
'Тула област',
'Тюмен област',
'Удмуртия',
'Улянов област',
'Хабаровск край',
'Ханти-Мансийск автономияб икълим — Югра',
'Челябинск област',
'Буртиялъ',
'Чувашия',
'Чукотка автономияб икълим',
'Ямал-Ненец автономияб икълим',
'Ярослав област'}

local NOAOCheck = {'Ненец автономияб икълим гьечІого Архангелск област', 'автономиял икълимал гьечІого Тюмен област'}

local ForceAOCheck = {'Архангелск област', 'Тюмен област'}

local ArrayDatas = {}

local ArrayIndexes = {}

local ArrayTemps = {}

local PopPlace = {}
PopPlace.__index = PopPlace

function PopPlace:gkeyfromVal( t, value )
  for k,v in pairs(t) do
    if v==value then return k end
  end
  return ''
end

function table.contains(table, element)
  for _, value in pairs(table) do
    if value == element then
      return true
    end
  end
  return false
end

function PopPlace:NAOCheck(Regarg, NAOARG)
	if table.contains(NOAOCheck, Regarg) then
		return true
	end
	if NAOARG=='NOAO' then
		if table.contains(ForceAOCheck, Regarg) then
			return false
		else
			return true
		end
	end
	return false
end

function PopPlace:render()
	if self.args['ФО'] then 
		ArrayReg = require('Module:ХалкъалъулКъадаралъулРахъалъБакІИкълимал/'..self.args['ФО'])
	end
	for p,v in ipairs(ArrayReg) do
		ArrayPopCur[v..""]=Getreg(v)
	end
	local AOBase, NAOPop, TOBase, KHMAOPop, YNAOPop
	AOBase = ArrayPopCur['Архангелск област']
	NAOPop = ArrayPopCur['Ненец автономияб икълим']
	TOBase = ArrayPopCur['Тюмен област']
	KHMAOPop = ArrayPopCur['Ханти-Мансийск автономияб икълим — Югра']
	YNAOPop = ArrayPopCur['Ямал-Ненец автономияб икълим']	
	if self:NAOCheck(self.args['1'], self.args['2']) then
		local GETArOblForReplace = self:gkeyfromVal(ArrayReg, 'Архангелск област')
		local GETTOblForReplace = self:gkeyfromVal(ArrayReg, 'Тюмен област')
		ArrayReg[GETArOblForReplace] = tostring(ArrayReg[GETArOblForReplace]..' Ненец автономияб икълим гьечІого')
		ArrayReg[GETTOblForReplace] = tostring(ArrayReg[GETTOblForReplace]..' автономиял икълимал гьечІого')
	end	
	for p,v in ipairs(ArrayReg) do
		if v=='Ненец автономияб икълим гьечІого Архангелск област' then
		ArrayDatas[#ArrayDatas+1] = AOBase-NAOPop
		ArrayTemps[v..""]=AOBase-NAOPop
		elseif v=='автономиял икълимал гьечІого Тюмен област' then
		ArrayDatas[#ArrayDatas+1]=TOBase-KHMAOPop-YNAOPop
		ArrayTemps[v..""]=TOBase-KHMAOPop-YNAOPop
		else
		ArrayDatas[#ArrayDatas+1] = ArrayPopCur[v]
		ArrayTemps[v..""]=ArrayPopCur[v]
		end
	end		
	table.sort(ArrayDatas, function(a,b) return a>b end)
	for _,o in ipairs(ArrayReg) do 
		ArrayIndexes[o..""] = self:gkeyfromVal(ArrayDatas, ArrayTemps[o..""])
	end
	--end
	ArrayPopSRC, ArrayDatas, ArrayTemps, NOAOCheck, ForceAOCheck, AOBase, NAOPop, TOBase, KHMAOPop, YNAOPop = nil
	if table.contains(ArrayReg, self.args['1']) then
	ArrayReg = nil
	return ArrayIndexes[self.args['1']] or ''
	end
end

function PopPlace.new(frame, args)
	if not args then
		args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:ХалкъалъулКъадаралъулРахъалъБакІИкълимал'}})
		--return
	end
	local obj = {
		frame = frame,
		args = args
	}
    
	return setmetatable(obj, PopPlace)
end

local p = {}

function p.main(frame)
	return PopPlace.new(frame):render()
	
end

return p