Модуль:МестоПоНаселениюРегионы

Для документации этого модуля может быть создана страница Модуль:МестоПоНаселениюРегионы/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