Модуль:МестоПоНаселениюРегионы
Перейти к навигации
Перейти к поиску
require('strict')
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