Модуль:Культурное наследие народов РФ

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
(i) Документация

Этот модуль предназначен для обработки данных регистрационного номера ОКН в шаблоне {{Культурное наследие народов РФ}}

См. также

Во избежание поломок страниц, использующих данный модуль, желательно экспериментировать в Песочнице для модулей.

require('Module:No globals')
local IRH = {}
IRH.__index = IRH

local IRHconfig = require('Module:Культурное наследие народов РФ/config')

local Munconfig -- пока пустой, он должен require'ться только при указании региона

local IRHucfirst

local Regconfig -- пока пустой, берётся из ФО

local theobjword, theregword
local wordseparator

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

function IRH:armsgen(regid, statusid, munid)
local arms
arms = 'Coat of Arms of the Russian Federation 2.svg'
if statusid~='Ф' then
if regid then
	if self:getregiondatas().regarms[regid] then
		arms = self:getregiondatas().regarms[regid]
		end
	end
	if statusid=='М' then
		if munid and ((munid~=nil) and (munid~='')) then
		if (Munconfig and Munconfig.munarms) and Munconfig.munarms[munid] then
			arms = Munconfig.munarms[munid]
		end
		end
	end
end
return arms
end

function IRH:regidexists(regid, disp)
local cato
if disp==true then cato = 'Объекты культурного наследия ' else cato = 'Объекты культурного наследия России ' end
if mw.title.new('Category:'..cato..self:getregiondatas().regins[regid]).exists then
	return true
end
return false
end

function IRH:dispterrcheck(regid)
	if table.contains(IRHconfig.reginsdisp,regid) then return true end
	return false
end

function IRH:gencat(regid, statusid, number, voynumber, munid)
	local regdisp
	local regido
	local cat
	cat = 'Объекты культурного наследия России'
	if self.args['снят'] then
	cat = ''
	else
	if regid and self:getregiondatas().regins[regid] then
	regdisp = self:dispterrcheck(regid)
	regido = self:regidexists(regid, regdisp) else regdisp = false
	regido = false
	end
	if statusid then
		if regid then
			if self:getregiondatas().regins[regid] then
				if IRHconfig.statuscats[statusid] and IRHconfig.statuscats[statusid][1] then
					if mw.title.new('Category:' .. IRHconfig.statuscats[statusid][1]..' объекты культурного наследия '..self:getregiondatas().regins[regid]).exists then
					cat = IRHconfig.statuscats[statusid][1]..' объекты культурного наследия '..self:getregiondatas().regins[regid]
					else
					local cattemp
					cattemp = cat
					if regdisp==true then
					cat=mw.ustring.sub(cat,1,28)
					end						
					local secondcat
					if IRHconfig.statuscats[statusid] and IRHconfig.statuscats[statusid][2] and mw.title.new('Category:' .. cattemp..' '..IRHconfig.statuscats[statusid][2]).exists then
					secondcat = ']][[Категория:'..cattemp..' '..IRHconfig.statuscats[statusid][2]
					else secondcat = ''
					end
					if regido==true then
					cat = cat..' '..self:getregiondatas().regins[regid]
					else
					if cat=='Объекты культурного наследия' then cat=cat..' России'
					end
					if number or (voynumber and ((voynumber ~='') and (voynumber ~= nil))) then
					if secondcat~='' then
					cat=mw.ustring.sub(secondcat,15,-1)
					secondcat = ''
					end
					end
					end
					cat = cat..secondcat
				end
				else
					if regdisp==true then
					cat=mw.ustring.sub(cat,1,28)
					end				
					if regido==true then
					cat = cat..' '..self:getregiondatas().regins[regid]
					else
					if cat=='Объекты культурного наследия' then cat = cat..' в России'
					end
					end
				end
			else
				if IRHconfig.statuscats[statusid] and IRHconfig.statuscats[statusid][2] then
					if mw.title.new('Category:' .. cat..' '..IRHconfig.statuscats[statusid][2]).exists then
					cat = cat..' '..IRHconfig.statuscats[statusid][2]
					end
				end
			end
					if munid and ((munid~=nil) and (munid~='')) then
					if Munconfig and Munconfig.munins[munid] then
					if IRHconfig.statuscats[statusid] and IRHconfig.statuscats[statusid][1] then
					if mw.title.new('Category:' .. IRHconfig.statuscats[statusid][1]..' объекты культурного наследия '..Munconfig.munins[munid]).exists then
					cat = IRHconfig.statuscats[statusid][1]..' объекты культурного наследия '..Munconfig.munins[munid]
					else
					local thirdcat
					local checker
					if regdisp==true then checker = 'Объекты культурного наследия ' else checker = 'Объекты культурного наследия России ' end
					if mw.title.new('Category:'..checker..Munconfig.munins[munid]).exists then
					if self:getregiondatas().regins[regid]~=nil then
					if mw.title.new('Category:' .. IRHconfig.statuscats[statusid][1]..' объекты культурного наследия '..self:getregiondatas().regins[regid]).exists then
					thirdcat = ']][[Категория:'..checker..Munconfig.munins[munid]
					else
					thirdcat = ''
					if regdisp==true then
					cat = mw.ustring.gsub(cat,'Объекты культурного наследия '..self:getregiondatas().regins[regid],'Объекты культурного наследия '..Munconfig.munins[munid])
					else
					cat = mw.ustring.gsub(cat,'Объекты культурного наследия России '..self:getregiondatas().regins[regid],'Объекты культурного наследия России '..Munconfig.munins[munid])
					end
					end
					else
					thirdcat = ']][[Категория:Объекты культурного наследия России '..Munconfig.munins[munid]
					end
					else thirdcat = ''
					end
					cat = cat..thirdcat
					end
					end
				end
				end
	else
		if IRHconfig.statuscats[statusid] and IRHconfig.statuscats[statusid][2] then
			if mw.title.new('Category:' .. cat..' '..IRHconfig.statuscats[statusid][2]).exists then
			cat = cat..' '..IRHconfig.statuscats[statusid][2]
			end
		end
	end
	else
		if regid then
			if self:getregiondatas().regins[regid] then
				if regdisp==true then
				cat=mw.ustring.sub(cat,1,28)
				end
				if regido==true then
				cat = cat..' '..self:getregiondatas().regins[regid]
				else
				if cat=='Объекты культурного наследия' then cat = cat..' в России' end
				end
				end
				if munid and ((munid~=nil) and (munid~='')) then
				if (Munconfig and Munconfig.munins[munid]) then
					local checker
					if regdisp==true then
					checker = 'Объекты культурного наследия ' else checker = 'Объекты культурного наследия России '
					end
					if mw.title.new('Category:'..checker..''..Munconfig.munins[munid]).exists then
					cat = checker..Munconfig.munins[munid]
					end
				end			
			end
			end
	end
	end
	if cat=='Объекты культурного наследия России' then
	if number or (voynumber and ((voynumber ~='') and (voynumber ~= nil))) then
	cat = ''
	end
	end
	return cat
				
end

function IRH:genmunicipality(munid)
	if munid then
	if tonumber(munid) then
		munid = Munconfig.municipality[munid]
	end
	if not (Munconfig.munarms[munid] or Munconfig.munins[munid]) then
		munid = nil
		end
	end
	return munid
end

function IRH:returnnotnill(variable)
	if variable then
		if variable ~=nil then
			return variable
			end
		end
	return ''
end

function IRH:getregiondatas()
	if Regconfig then
		return Regconfig
	else
		return IRHconfig
	end
end

function IRH:genstatus(statusid, number, voyagecode)
	local statusword
	statusword = ''
	if statusid then
	if tonumber(statusid) then
	statusid = IRHconfig.statuskeys[tostring(statusid)] else
	if (mw.ustring.len(statusid)==3) then
	if mw.ustring.sub(statusid,-2) == 'ВГ' then
	statusid = IRHconfig.statuskeysvoy[tostring(mw.ustring.sub(statusid,1,1))]
	end
	else
	statusid = statusid
	end
	end
	else 
	if number then
	statusid = statusid or IRHconfig.statuskeys[tostring(mw.ustring.sub(number,-1))]
	else
		if voyagecode then
			statusid = statusid or IRHconfig.statuskeysvoy[tostring(mw.ustring.sub(voyagecode, 3, 3))]
		end
	end
	end
	if statusid then
	if not IRHconfig.statuscats[statusid] then
	statusid = nil
	end	
	if statusid~=nil and IRHconfig.statuscats[statusid] and IRHconfig.statuscats[statusid][2] then
    statusword = IRHconfig.statuscats[statusid][2]
    else statusword = '' end
    end
	return {['statusid']=statusid, ['statusword']=statusword,}
end

function IRH:genreg(regid, number, voynumber)
	if regid then
	if tonumber(regid) then
	regid = IRHconfig.regionsEGR[tostring(regid)]
	else
	if mw.ustring.len(regid)==4 then
	if mw.ustring.sub(regid,-2)=='ВГ' then
	regid = IRHconfig.regionsvoy[tostrins(mw.ustring.sub(regid,1,2))]
	end
	end
	end
	end
	if number then
	regid = regid or IRHconfig.regionsEGR[mw.ustring.sub(number,1,2)]
	else
	if voynumber then
		if (voynumber ~= nil) and (voynumber ~= '') then
		regid = regid or IRHconfig.regionsvoy[mw.ustring.sub(voynumber,1,2)]
		end
	end
	end
	if IRHconfig.regionsaliases[regid] then
	regid = IRHconfig.regionsaliases[regid] end
	for _,v in ipairs(IRHconfig.fdlist) do
		for b,r in ipairs(IRHconfig.feddistr[v]) do
			if regid==r then
				Regconfig = 'Модуль:Культурное наследие народов РФ/config/'..v
				break
			end
		if Regconfig ~=nil then break end
		end
	end
	if Regconfig ~= nil then
		if not mw.title.new(Regconfig).exists then
			Regconfig=nil
		end
	end
	if Regconfig ~= nil then
		Regconfig = require(Regconfig).Reg()
	end
	return regid
end

function IRH:tablecount(tab)
local Count
Count = 0
for Index, Value in pairs( tab ) do
  Count = Count + 1
end
return Count
end

function IRH:getmunconfig(regid)
	local IsFD
	IsFD = false
	local MCSTRtest
	local Munconfigstring
	for _,v in ipairs(IRHconfig.fdlist) do
		for _,s in ipairs(IRHconfig.feddistr[v]) do
			if regid==s then
				Munconfigstring = 'Модуль:Культурное наследие народов РФ/config/'..v
				IsFD = true
				break
			end
		if Munconfigstring~=nil then break end
		end
	end
	if Munconfigstring ~= nil then
		if not mw.title.new(Munconfigstring).exists then
			Munconfigstring=nil
			IsFD = false
		end
	end
		--if IsFD==false or self.args['reg_pages'] then
		if mw.title.new('Модуль:Культурное наследие народов РФ/config/'..regid).exists then
			MCSTRtest = require('Модуль:Культурное наследие народов РФ/config/'..regid)
			if (MCSTRtest~=nil) and (type(MCSTRtest)~='boolean') then
			Munconfigstring ='Модуль:Культурное наследие народов РФ/config/'..regid
			end
		end
		--end
	if Munconfigstring~= nil and Munconfigstring~='' then
	if IsFD==true then 
	return require(Munconfigstring).Mun(tostring(regid))
	else
	return require(Munconfigstring)
	end
	else
	return nil
	end
end

function IRH:coregen(number, url, regid, statusid, wikivoyageid, munid)
	local munarray = {}
	local numarray = {}
	local munarmsid
	local munplaceid
	local numWVarray = {}
	local statusword
	local regidword
	local statusarms
	local regcatword
	local wikivoyageword
	if munid then
	if mw.ustring.sub(munid,1,1)=='{' and mw.ustring.sub(munid,-1)=='}' then
	munid = mw.ustring.sub(munid,2,-2)
	munid = string.gsub(munid, "%s+", "")
	munarray = mw.text.split(munid,',')	
	end
	end
	if self:tablecount(munarray)>0 then
	if self:tablecount(munarray)>2 then
	munarray={munarray[1], munarray[2]}
	else if self:tablecount(munarray)==1 then
	munid = munarray[1]
	munarray = {}
	end
	end
	end
	if munarray[1] then
	munarmsid = munarray[1]
	end
	if munarray[2] then
	munplaceid = munarray[2]
	end
	if munarmsid=='~0' then
	munarmsid=''
	end
	if munplaceid=='~0' then
	munplaceid=''
	end
	if not theregword then
	if IRHucfirst == true then
		theregword = 'Рег. №'
	else
		theregword = 'рег. №'
	end
	end
	if not theobjword then
	if IRHucfirst == true then
		theobjword = 'Объект № '
	else
		theobjword = 'объект № '
	end
	end
	wikivoyageword = ''
	if wikivoyageid then
		if (wikivoyageid~=nil) and (wikivoyageid~='') then
		if ((self.args['Код-памятника']) and (mw.ustring.sub(self.args['Код-памятника'],1,1) == '{')) and (mw.ustring.sub(self.args['Код-памятника'],-1) == '}') then
		wikivoyageid = mw.ustring.sub(wikivoyageid,2,-2)
		wikivoyageid = string.gsub(wikivoyageid, "%s+", "")
		numWVarray = mw.text.split(wikivoyageid,',')
		if (theobjword=='объект № ') or (theobjword=='Объект № ') then
		theobjword = mw.ustring.gsub(mw.ustring.gsub(theobjword,'№ ','№№ '),'ъект','ъекты')
		end
		wikivoyageword = theobjword..': '
		local indexoWV
		local wikivoyageido
		for i,v in ipairs(numWVarray) do
		if i==1 then
		indexoWV=''
		else
		indexoWV = wordseparator
		end
		wikivoyageword = wikivoyageword..indexoWV..'[https://ru.wikivoyage.org/w/index.php?search='..v..'+prefix%3AКультурное_наследие_России%2F&title=Служебная:Поиск&profile=advanced&fulltext=1&ns0=1'..' '..v..']'
		end
		else
		wikivoyageword = self.frame:preprocess('{{wikidata|p1483|'..self:returnnotnill(self.args['Код-памятника'])..'|title='..theobjword..'$1}}')
		end
		end
	end
	local namespacecheck = mw.ustring.len(self.frame:preprocess('{{NAMESPACE}}'))
	if number then
	if mw.ustring.sub(number,1,1)=='{' and mw.ustring.sub(number,-1)=='}' then
	number = mw.ustring.sub(number,2,-2)
	number = string.gsub(number, "%s+", "")
	numarray = mw.text.split(number,',')
	if (theregword=='рег. №') or (theregword=='Рег. №') then
	theregword = theregword..'№'
	end
	regidword = theregword..': '
	local indexo
	local numbero
	for i,v in ipairs(numarray) do
		if i==1 then
		indexo=''
		else
		indexo = wordseparator
		end
		numbero = v
		regidword = regidword..indexo..'[https://tools.wmflabs.org/ru_monuments/get_info.php?id='..numbero..' '..numbero..']'
	end
	else
	if not url then
		regidword = '[https://tools.wmflabs.org/ru_monuments/get_info.php?id='..number..' '..theregword..' '..number..']'
	else
		regidword = '[https://okn-mk.mkrf.ru/cultureObjects/viewMaps/'..url..' '..theregword..' '..number..']'

	end
	end
			
	else
		regidword = ''
	end
	local statusarray = self:genstatus(statusid, numarray[1] or number, numWVarray[1] or wikivoyageid)
	statusid = statusarray.statusid
	statusword = statusarray.statusword or ''
	regid = self:genreg(regid, numarray[1] or number, wikivoyageid)
	regcatword = ''
	if regid then
		if munid then
		Munconfig = self:getmunconfig(regid)
		end
	end
    statusarms = self:armsgen(regid, statusid, self:genmunicipality(munarmsid or munid))	
	if not self.args['nocat'] then
	if namespacecheck==0 then
	if not self.args['снят'] then
	if self:gencat(regid, statusid, number, wikivoyageid, self:genmunicipality(munplaceid or munid))~='' then
	regcatword='[[Категория:'..self:gencat(regid, statusid, number, wikivoyageid, self:genmunicipality(munplaceid or munid))..']]'
	end
	if number or (wikivoyageid and ((wikivoyageid ~='') and (wikivoyageid ~= nil))) then
	regcatword='[[Категория:Объекты культурного наследия России по алфавиту]]'..regcatword
	end
	end
	end
	end	
	return {['number']=number, ['regidword']=regidword, ['regcatword']=regcatword, ['statusword']=statusword, ['statusarms']=statusarms, ['wikivoyageword']=wikivoyageword,}
end

function IRH:rendercatWVonly()
	local WVwikidata
	WVwikidata=self.frame:preprocess('{{wikidata|p1483|'..self:returnnotnill(self.args['1'] or self.args['Код-памятника'])..'|plain=true}}')
	local region = self.args['Регион'] or self.args['регион']
	local status = self.args['Статус'] or self.args['статус']
	local municipality = self.args['Муниципалитет'] or self.args['МО'] or self.args['Район'] or self.args['Город']
	IRHucfirst = true
	local Coredata = self:coregen(nil, nil, region, status, WVwikidata, municipality)
	return self.frame:preprocess(Coredata.regcatword)
end

function IRH:render()
	local WVwikidata
	WVwikidata = self.frame:preprocess('{{wikidata|p1483|'..self:returnnotnill(self.args['Код-памятника'])..'|plain=true}}')
	local EGRNNum = self.args['рег_N'] or self.args['1']
	local URLnum = self.args['id_страницы'] or self.args ['2']
	local region = self.args['Регион'] or self.args['регион'] or self.args['3']
	local status = self.args['Статус'] or self.args['статус'] or self.args['4']
	local municipality = self.args['Муниципалитет'] or self.args['МО'] or self.args['Район'] or self.args['Город']
	local statuswordrender
	local regidrender
	local WVrender
	local firstword
	if self.args['мини'] then
	wordseparator = ', '
	if self.args['снят'] then 
		firstword = self.frame:preprocess('{{abbr|Бывший|снят с охраны|0}} [[Объект культурного наследия России|объект культурного наследия народов РФ]]')
	else
		firstword = '[[Объект культурного наследия России|Объект культурного наследия народов РФ]]'
	end	
	IRHucfirst = true
	local Coredata = self:coregen(EGRNNum, URLnum, region, status, WVwikidata, municipality)
	if self.args['NumOnly'] then statuswordrender = '' else
	if Coredata.statusword == '' then statuswordrender = '' else statuswordrender = ' '..Coredata.statusword end
	end
	local regdot
	if self.args['NumOnly'] then regdot = '' else regdot = '. ' end
	if Coredata.regidword~='' then
	if mw.ustring.sub(EGRNNum,1,1) == '{' then
	regidrender =regdot..Coredata.regidword..' ({{abbr|ЕГРОКН|Единый государственный реестр объектов культурного наследия|0}})'
	else
	regidrender =regdot..'{{nobr|1='..Coredata.regidword..'}} ({{abbr|ЕГРОКН|Единый государственный реестр объектов культурного наследия|0}})' end else regidrender = '' end
	local ArmstoRender
	if self.args['Без герба'] then
	ArmstoRender = '' else ArmstoRender = '[[Файл:'..Coredata.statusarms..'|20px|link=|Герб]] ' end
	if self.args['NumOnly'] then firstword = '' end
	if Coredata.wikivoyageword~='' then 
	if (self.args['NumOnly']) and (Coredata.regidword=='') then WVrender = '{{nobr|1='..Coredata.wikivoyageword..'}} (БД Викигида)' else WVrender = '. {{nobr|1='..Coredata.wikivoyageword..'}} (БД Викигида)' end else WVrender = '' end
	local stringtoreturn = self.frame:preprocess(ArmstoRender..'<span title="Объект культурного наследия народов РФ" style="margin-left: 0.2em; font-size: 85%;">'..(firstword or '[[Объект культурного наследия России|Объект культурного наследия народов&nbsp;РФ]]')..statuswordrender..regidrender.. WVrender..'</span>'..Coredata.regcatword)
    return stringtoreturn	
	else
	if self.args['снят'] then
	firstword = self.frame:preprocess('{{abbr|Утраченный|Исключён из Реестра, снят с государственного учёта и охраны|0}} [[объект культурного наследия России]]')
	else
	firstword = self.frame:preprocess('[[Объект культурного наследия России]]')
	end
	IRHucfirst = false
	wordseparator = '<br>'
	local Coredata = self:coregen(EGRNNum, URLnum, region, status, WVwikidata, municipality)
	if Coredata.statusword == '' then statuswordrender = '' else statuswordrender = ' '..Coredata.statusword
	end
	if Coredata.regidword~='' then
	regidrender = self.frame:preprocess('<br><small>'..Coredata.regidword..' ({{abbr|ЕГРОКН|Единый государственный реестр объектов культурного наследия|0}})</small>') else regidrender = '' end
	if Coredata.wikivoyageword~='' then
	WVrender = '<br><small>'..Coredata.wikivoyageword..' (БД Викигида)</small>' else WVrender = '' end
	local embwidth, embclass, embwidthcss, embbordercss, cellspa
	if not self.args['встраивать'] then
		embclass = 'infobox'
		embwidthcss = '280px'
		embwidth = nil
		embbordercss = nil
	else
		embclass = nil
		embwidthcss = nil		
		embwidth = '100%'
		embbordercss = '1px solid grey'
		if self.args['встраивать']=='UNESCO' then
		cellspa = '5'
		end
	end	
	local builder = mw.html.create()
	builder = builder:tag('table')
    	:attr('width', embwidth)
    	:attr('cellspacing', cellspa)
    	:addClass(embclass)
    	:css('width', embwidthcss)
    	:css('border', embbordercss)
    	:tag('tr')
    		:tag('td')
    			:cssText('vertical-align: middle; padding: 5px;')
    			:wikitext('[[Файл:'..Coredata.statusarms..'|45px|link=|Герб]]')
    			:done()
    		:tag('td')
    			:cssText('text-align:center; vertical-align:middle; background:{{цвет|Россия}}; width:100%')
    			:wikitext('<span style="white-space: normal !important; font-weight: bold;">'..(firstword or '[[Объект культурного наследия России]]')..statuswordrender..'</span>'..regidrender..WVrender..Coredata.regcatword)
    			:done()
    		:done()
    builder = builder:done()
	return builder 
	end
end

function IRH.new(frame, args)
	if not args then
		args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:Культурное наследие народов РФ', 'Template:Культурное наследие РФ', 'Template:Культурное наследие РФ 4'}})
		--return
	end
	local obj = {
		frame = frame,
		args = args
	}
	return setmetatable(obj, IRH)
end

local p = {}

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


function p.mainCatonly(frame)
	return IRH.new(frame):rendercatWVonly()
	
end

return p