Модуль:AutoDescriptionLocality: различия между версиями

Материал из Викиновостей, свободного источника новостей
Содержимое удалено Содержимое добавлено
оформление
Нет описания правки
Строка 85: Строка 85:
if(entitiesArray.population ~= "") then description = description .. entitiesArray["P1082"] end
if(entitiesArray.population ~= "") then description = description .. entitiesArray["P1082"] end
if(entitiesArray["P2046"] ~= "") then description = description .. entitiesArray["P2046"] end
if(entitiesArray["P2046"] ~= "") then description = description .. entitiesArray["P2046"] end
if(entitiesArray.sisterTowns ~= "") then description = description .. " Братские города:" .. entitiesArray.sisterTowns:sub(1, #entitiesArray.sisterTowns - 1) .. "." end
if(entitiesArray.sisterTowns ~= "") then description = description .. " Города-побратимы:" .. entitiesArray.sisterTowns:sub(1, #entitiesArray.sisterTowns - 1) .. "." end
if (entitiesArray.country ~= "" ) then
if (entitiesArray.country ~= "" ) then

Версия от 05:58, 3 мая 2018

Документация
Страница документации: Модуль:AutoDescriptionLocality/doc.

Подмодуль модуля AutoDescription для заполнения населённых пунктов.

Инструкция по улучшению функционала модуля здесь.

Ошибки и предложения добавляйте на страницу обсуждения.

Использует


--[[
------------------------------------------
--             AutoDescriptionLocality
-- Модуль для заполнения населённых пунктов. 
------------------------------------------
--]]

local Declension = require("Module:Declension")
local Langs = require("Module:Langs")
local MathTonumber = require("Module:Math/tonumber")
local SerializeTable = require("Module:SerializeTable")

local AutoDescriptionLocality={}

-- Нам необходимо сформировать и вернуть три переменных
local description = "" -- уточнение (то, что в скобочках после имени, например, на языке оригинала, годы жизни и т.п.)
local details = "" -- строка описания
local categories = "[[Категория:Населённые пункты по алфавиту]]" -- категории

-- Промежуточный масив сущностей, в который помещаются результаты парсинга перед формированием описания
local entitiesArray = {typeOf = "", country = "", unitOfTime = "", inception = "", 
	centuary = "", headOf="", locatedITATE = "", langPr = "", nativeL = "", 
	population="", populationT = "", area = "", dimension = "", sisterTowns = "", 
	P421 = "", P131 = "", P6 = "", P1082 = "", P2046 = "", P190 = "", P1705 = ""}

-- Точка входа
function AutoDescriptionLocality.launch(entity)
 AutoDescriptionLocality.parsing(entity) -- парсим карточку викиданных
 AutoDescriptionLocality.forming() -- формируем переменные
 return details, description, categories
end	

-- Последовательно проходим свойства в карточке викиданных, для формирования массива сущностей entitiesArray
function AutoDescriptionLocality.parsing(entity)
 AutoDescriptionLocality.parseP17(entity)
 AutoDescriptionLocality.parseP31(entity)
 entitiesArray["P421"] = AutoDescriptionLocality.parseP421(entity)
 AutoDescriptionLocality.parseP571(entity)
 entitiesArray["P131"] = AutoDescriptionLocality.parseP131(entity)
 entitiesArray["P6"] = AutoDescriptionLocality.parseP6(entity)
 entitiesArray["P1082"] = AutoDescriptionLocality.parseP1082(entity)
 entitiesArray["P2046"] = AutoDescriptionLocality.parseP2046(entity)
 entitiesArray["P190"] = AutoDescriptionLocality.parseP190(entity)
 entitiesArray["P1705"] = AutoDescriptionLocality.parseP1705(entity)
end

function AutoDescriptionLocality.forming()
 if((entitiesArray.langPr ~= "") and entitiesArray.langPr ~= "ru")  then  details = details .. "(" .. Langs.launch(entitiesArray.langPr, entitiesArray.nativeL) .. ")" end
 
 if (entitiesArray.typeOf ~= "" ) then 
  do
   description = description .. "[[" .. entitiesArray.typeOf .. "]]" 
   if(entitiesArray.country == "") then description = description .. "." end
  end	
 end
 if (entitiesArray.country ~= "" ) then 
  do
   if(Declension.declineWord(entitiesArray.country, 6) ~= "Logical error Declension.declineWord(arg): word not found") then  description = description .. " в [[" .. entitiesArray.country .. "|" .. Declension.declineWord(entitiesArray.country, 6) .. "]]." 
    else description = description .. "." 
   end
  end	
 end
 if(entitiesArray.unitOfTime == "век") then 
  do 
   if(entitiesArray.typeOf == "город") then description = description .. " Основан в [[" .. entitiesArray.inception .. " " .. entitiesArray.centuary .. "]]" .. "e."
   elseif (entitiesArray.typeOf == "деревня") then description = description .. " Основана в [[" .. entitiesArray.inception .. " " .. entitiesArray.centuary .. "]]" .. "e." 
   elseif(entitiesArray.typeOf == "село") then description = description .. " Основано в [[" .. entitiesArray.inception .. " " .. entitiesArray.centuary .. "]]" .. "e."	end
  end 
 elseif( (unitOfTime == "января") or (unitOfTime == "февраля") or (unitOfTime == "марта") or (unitOfTime == "апреля") or (unitOfTime == "мая") or (unitOfTime == "июня") or (unitOfTime == "июля") or (unitOfTime == "августа") or (unitOfTime == "сентября") or (unitOfTime == "октября") or (unitOfTime == "ноября") or (unitOfTime == "декабря") ) then 
  do
   if(entitiesArray.typeOf == "город") then description = description .. " Основан [[" .. entitiesArray.inception .. " года]]." 
   elseif(entitiesArray.typeOf == "деревня") then description = description .. " Основана [[" .. entitiesArray.inception .. " года]]." 
   elseif(entitiesArray.typeOf == "село") then description = description .. " Основано [[" .. entitiesArray.inception .. " года]]." end
  end
 elseif (entitiesArray.inception ~= "") then
  do
   if(entitiesArray.typeOf == "город") then description = description .. " Основан в [[" .. entitiesArray.inception .. " год]]у." 
    elseif(entitiesArray.typeOf == "деревня") then description = description .. " Основана в [[" .. entitiesArray.inception .. " год]]у." 
    elseif(entitiesArray.typeOf == "село") then description = description .. " Основано в [[" .. entitiesArray.inception .. " год]]у." 
   end
  end	
 end
 if (entitiesArray.locatedITATE ~= "") then description = description .. entitiesArray["P131"] end
 if(entitiesArray.headOf ~= "") then description = description .. entitiesArray["P6"] end
 if(entitiesArray.population ~= "") then description = description .. entitiesArray["P1082"] end
 if(entitiesArray["P2046"] ~= "") then description = description .. entitiesArray["P2046"] end
 if(entitiesArray.sisterTowns ~= "") then description = description .. " Города-побратимы:" .. entitiesArray.sisterTowns:sub(1, #entitiesArray.sisterTowns - 1) .. "." end
 
 if (entitiesArray.country ~= "" ) then
  do
   if(Declension.declineWord(entitiesArray.country, 2) == "Logical error Declension.declineWord(arg): word not found") then categories = categories .. "[[Категория:Страны без склонения]]"
    else do 
     categories = categories .. " [[Категория:Населённые пункты " .. Declension.declineWord(entitiesArray.country, 2)  .. "]]" .. " [[Категория:" .. Declension.declineWord(entitiesArray.typeOf, 7) .. " " .. Declension.declineWord(entitiesArray.country, 2) .. "]]"
 	end	
   end
  end	
 end	
 categories = categories .. " [[Категория:" .. Declension.declineWord(entitiesArray.typeOf, 7) .. " по алфавиту]]"
 if(entitiesArray.unitOfTime == "век") then 
  do 
   if(entitiesArray.inception ~= "") then categories = categories .. " [[Категория:Населённые пункты, основанные в " .. entitiesArray.inception .. " веке]]" 
    elseif (entitiesArray.typeOf == "город") then categories = categories .. " [[Категория:Города, основанные в " .. entitiesArray.inception .. " веке]]"
    elseif(entitiesArray.typeOf == "деревня") then categories = categories .. " [[Категория:Деревни, основанные в " .. entitiesArray.inception .. " веке]]"	
   end
  end 
 elseif( (unitOfTime == "января") or (unitOfTime == "февраля") or (unitOfTime == "марта") or (unitOfTime == "апреля") 
 	    or (unitOfTime == "мая") or (unitOfTime == "июня") or (unitOfTime == "июля") or (unitOfTime == "августа") 
 	    or (unitOfTime == "сентября") or (unitOfTime == "октября") or (unitOfTime == "ноября") or (unitOfTime == "декабря") ) then 
  do
   categories = categories .. " [[Категория:Населённые пункты, основанные " .. entitiesArray.inception .. " года]]"
   if(entitiesArray.typeOf == "город") then categories = categories .. " [[Категория:Города, основанные " .. entitiesArray.inception .. " года]]"
    elseif(entitiesArray.typeOf == "деревня") then categories = categories .. " [[Категория:Деревни, основанные " .. entitiesArray.inception .. " года]]"
    elseif(entitiesArray.typeOf == "село") then categories = categories .. " [[Категория:Сёла, основанные " .. entitiesArray.inception .. " года]]" 
   end
  end
 elseif (entitiesArray.inception ~= "") then
  do
   categories = categories .. " [[Категория:Населённые пункты, основанные в " .. entitiesArray.inception .. " году]]"	
   if(entitiesArray.typeOf == "город") then categories = categories .. " [[Категория:Города, основанные в " .. entitiesArray.inception .. " году]]"
    elseif(entitiesArray.typeOf == "деревня") then categories = categories .. " [[Категория:Деревни, основанные в " .. entitiesArray.inception .. " году]]"
    elseif(entitiesArray.typeOf == "село") then categories = categories .. " [[Категория:Сёла, основанные в " .. entitiesArray.inception .. " году]]" 
   end
  end	
 end
end

function AutoDescriptionLocality.parseP17(entity)
 local p17Statements = entity:getAllStatements("P17")
 local countries = {Q28 = "Венгрия", Q29 = "Испания", Q30 = "Соединённые Штаты Америки", 
  Q34 = "Швеция", Q37 = "Литва", Q38 = "Италия", Q39 = "Швейцария", Q40 = "Австрия", 
  Q41 = "Греция", Q43 = "Турция", Q142 = "Франция", Q145 = "Великобритания", 
  Q148 = "Китайская Народная Республика", Q155 = "Бразилия", Q159 = "Россия", 
  Q183 = "Германия", Q184 = "Белоруссия", Q191 = "Эстония",
  Q211 = "Латвия", Q212 = "Украина", Q218 = "Румыния", Q219 = "Болгария", 
  Q222 = "Албания", Q227 = "Азербайджан", Q232 = "Казахстан", Q262 = "Алжир", Q298 = "Чили", 
  Q398 = "Бахрейн", Q408 = "Австралия", Q419 = "Перу", 
  Q739 = "Колумбия", Q796 = "Ирак", Q801 = "Израиль", Q805 = "Йемен", 
  Q858 = "Сирия", Q884 = "Республика Корея", Q965 = "Буркина-Фасо", 
  Q244165 = "Нагорно-Карабахская Республика"
 }
 for ki, vi in pairs (p17Statements) do
  for kj, vj in pairs (countries) do
   if (vi['mainsnak']['datavalue']['value']['id'] == kj) then
    if (vj == "Украина")  then entitiesArray.country = "Украина"
     elseif(vj == "Республика Корея")  then entitiesArray.country = "Южная Корея"
     elseif(vj == "Соединённые Штаты Америки")  then entitiesArray.country = "США"
     elseif(vj == "Нагорно-Карабахская Республика")  then entitiesArray.country = "Нагорный Карабах"
     elseif(vj == "Китайская Народная Республика")  then entitiesArray.country = "Китай"
     else entitiesArray.country = vj
    end	
   end	
  end 	
 end
 if(entitiesArray.country == "") then categories = categories .. "[[Категория:Страна не в таблице]]" end
end
  
function AutoDescriptionLocality.parseP31(entity)
 local p31Statements = entity:getAllStatements("P31")
 local towns = {Q515 = "город", Q532 = "село", Q5084 = "деревня", Q486972 = "населённый пункт", Q3744870 = "алевик", Q5123999 = "город областного значения Украины", Q12131624 = "город в Украине", Q747074 = "коммуна Италии", Q1637706 = "город-миллионер", 
 Q3957 = "малый город", Q3957 =  "город прямого подчинения Республики Корея", Q13539802 =  "городская община", Q262882 = "уставный город Австрии", Q667509 = "муниципалитет в Австрии", Q1906268 = "Общины Болгарии", Q50330360 = "второй по величине город", Q1549591 = "город с населением более 100 000 человек", Q12813115 = "населённый пункт Швеции", Q70208 = "община Швейцарии", Q14770218 = "столица швейцарского кантона", Q537250 = "федеральный город", Q1187811 = "университетский город", Q5119 = "столица", Q13218391 = "город хартии", Q317548 = "курортный город", Q484170 = "коммуна Франции", Q2989398 = "коммуна Алжира", Q25412763 = "город в Чили", Q15661340 = "древний город", Q2590631 = "муниципалитет Венгрии", Q21518270 = "столица штата либо островной территории США", Q12134916 = "областной центр", Q3184121 = "бразильский муниципалитет", Q15127838 = "город республиканского подчинения", Q51049922 = "деревня"}
 for ki, vi in pairs (p31Statements) do
  for kj, vj in pairs (towns) do
   if (vi['mainsnak']['datavalue']['value']['id'] == kj) then
    if( (vj == "город") or (vj == "село") or (vj == "деревня") or (vj == "населённый пункт") or (vj == "алевик") )   then entitiesArray.typeOf = vj
     elseif( (vj == "город областного значения Украины") or (vj == "город в Украине") or (vj == "город-миллионер") or (vj == "малый город") or (vj == "город прямого подчинения Республики Корея") or (vj == "уставный город Австрии" ) or (vj == "муниципалитет в Австрии") or (vj == "второй по величине город") or (vj == "город с населением более 100 000 человек") or (vj == "населённый пункт Швеции") or (vj == "столица швейцарского кантона") or (vj == "федеральный город") or (vj == "университетский город") or (vj == "город в Чили") or (vj == "древний город") or (vj == "столица штата либо островной территории США") or (vj == "областной центр") or (vj == "город республиканского подчинения")) then entitiesArray.typeOf = "город"
     elseif (vj == "коммуна Италии") then entitiesArray.typeOf = "коммуна"	
     elseif( (vj == "городская община") or (vj == "Общины Болгарии") or (vj == "община Швейцарии") or (vj == "коммуна Франции") or (vj == "коммуна Алжира"))then entitiesArray.typeOf = "община"		 		
     elseif (vj == "столица") then entitiesArray.typeOf = "город"	 	 		
     elseif (vj == "город хартии") then entitiesArray.typeOf = "город"	 	 		
     elseif (vj == "курортный город") then entitiesArray.typeOf = "город"	
     elseif( (vj == "муниципалитет Венгрии") or (vj == "бразильский муниципалитет") ) then entitiesArray.typeOf = "муниципалитет"
     else entitiesArray.typeOf = vi
    end
    if(entitiesArray.typeOf ~= "") then return "" end
   end	 
  end	
 end	
end	

function AutoDescriptionLocality.parseP1705(entity)
 local p1705Statements = entity:getAllStatements("P1705")
 for ki, vi in pairs (p1705Statements) do
  if (vi['mainsnak']['datavalue']['value']['language']) then entitiesArray.langPr=vi['mainsnak']['datavalue']['value']['language'] end
  if (vi['mainsnak']['datavalue']['value']['text']) then entitiesArray.nativeL=vi['mainsnak']['datavalue']['value']['text'] end
 end	
end
    
function AutoDescriptionLocality.parseP571(entity)
 local values=entity:formatPropertyValues("P571",mw.wikibase.entity.claimRanks).value
 entitiesArray.unitOfTime=string.gsub(values, '[^а-я]', '' ) 
 if(entitiesArray.unitOfTime == "век") then do
   entitiesArray.centuary = string.gsub(values, '[^а-я]', '' )
   entitiesArray.inception = string.gsub(values, '[^0-9]', '' )
   entitiesArray.P571 = "t"
  end
  elseif( (unitOfTime == "января") or (unitOfTime == "февраля") or (unitOfTime == "марта") or (unitOfTime == "апреля") 
       or (unitOfTime == "мая") or (unitOfTime == "июня") or (unitOfTime == "июля") or (unitOfTime == "августа") 
       or (unitOfTime == "сентября") or (unitOfTime == "октября") or (unitOfTime == "ноября") or (unitOfTime == "декабря") ) then do
   entitiesArray.inception=values
   entitiesArray.P571 = "t"
  end	
  elseif (values ~= "") then do
   entitiesArray.inception=values
   entitiesArray.P571 = "t"
  end	
  else return ""
 end
end  

function AutoDescriptionLocality.parseP1376(entity)
 local values=entity:formatPropertyValues("P1376",mw.wikibase.entity.claimRanks).value
 q={["capitalOf"]=" "}
 q["capitalOf"] = "(ст. " .. values .. " )" 
 return q["capitalOf"] 
end  

function AutoDescriptionLocality.parseP131(entity)
 local p131Statements = entity:getAllStatements("P131")
 local qLI = {Q167859 = "Волынская область", Q2347421 = "Ровненский район"}
 for ki, vi in pairs (p131Statements) do
  for kj, vj in pairs (qLI) do
   if (vi['mainsnak']['datavalue']['value']['id'] == kj) then
    if (vj == "Волынская область") then do
      categories = categories .. " [[Категория:Населённые пункты Волынской области]]" ..  " [[Категория:Города Волынской области]]" 
      return " Находится в [[Волынская область|Волынской области]]."
     end	
     elseif (vj == "Ровненский район")  then do
      categories = categories .. " [[Категория:Населённые пункты Ровненского района]]" ..  " [[Категория:Города Ровненского района]]" 
      return " Находится в [[Ровненский район|Ровненском районе]]." 
     end
    end
   end	
  end	
 end	
end  

function AutoDescriptionLocality.parseP6(entity)
	local valuesP=entity:formatPropertyValues("P6", { mw.wikibase.entity.claimRanks.RANK_PREFERRED }).value
    local valuesN=entity:formatPropertyValues("P6", { mw.wikibase.entity.claimRanks.RANK_NORMAL }).value
	entitiesArray.headOf=values
	if(valuesN ~= "") then do
		    if(valuesP ~= "") then entitiesArray.headOf=valuesP
		    else entitiesArray.headOf=valuesN end
			return " Глава — [["  .. entitiesArray.headOf .. "]]." 
	end
	else return ""	
	end	
end  

function AutoDescriptionLocality.parseP1082(entity)
	local p1082Statements = entity:getAllStatements("P1082")
	local rankMax="0"
	local pO=""
	for ki, vi in pairs (p1082Statements) do
	  rankMax=vi['mainsnak']['rank']
	  entitiesArray.population=string.gsub( vi['mainsnak']['datavalue']['value']['amount'], '+', '' )
	  --if(vi['qualifiers'] and vi['qualifiers']['P585']) then entitiesArray.populationT = MathTonumber.integerModule(vi['qualifiers']['P585'][1]['datavalue']['value']['time']) end
	  if(vi['qualifiers'] and vi['qualifiers']['P585']) then entitiesArray.populationT =  MathTonumber.integerModule(vi['qualifiers']['P585'][1]['datavalue']['value']['time']) 
	  elseif(vi['references'] and vi['references']['P813']) then entitiesArray.populationT = MathTonumber.integerModule(vi['references'][1]['snaks']['P813'][1]['datavalue']['value']['time']) 
	  end
	  	--return SerializeTable.go(vi['qualifiers']) 
	  --if (vi['qualifiers']['snaks']) then return SerializeTable.go(p1082Statements) end
	  --vi['qualifiers']['P585'][1]['datavalue']['value']['time']
	end	
	if(entitiesArray.population) then return " Население в [[" ..entitiesArray.populationT .. " год]]у составляло "  .. entitiesArray.population .. " человек."
	else return ""
	end	
end  

function AutoDescriptionLocality.parseP2046(entity)
 local values=entity:formatPropertyValues("P2046",mw.wikibase.entity.claimRanks).value
 entitiesArray.area =  string.gsub(values, '[^0-9]', '' )
 if(string.find(values, "квадратный километр" )) then entitiesArray.dimension =  "км²" end
 if(string.find(values, "квадратный метр" )) then entitiesArray.dimension =  "м²" end
 if(values ~= "") then return " Площадь: "  .. entitiesArray.area .. " " .. entitiesArray.dimension .."."
 else return ""
 end	
end  

function AutoDescriptionLocality.parseP421(entity)
	local values=entity:formatPropertyValues("P421",mw.wikibase.entity.claimRanks).value
	if(values ~= "") then return " ("  .. values .. ")" 
    else return ""
	end
end    

function AutoDescriptionLocality.parseP190(entity)
	local p190Statements = entity:getAllStatements("P190")
	local d="d"
	for ki, vi in pairs (p190Statements) do
		d=p
		entitiesArray.sisterTowns = entitiesArray.sisterTowns .. " [[" .. mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id']).. "]]," 
	end	
    if(d == "p") then 
      do
      	entitiesArray.sisterTowns=entitiesArray.sisterTowns:sub(1, #entitiesArray.sisterTowns - 1)
	 	return entitiesArray.sisterTowns .. "." 
      end
    else return "" end   	
end  

return AutoDescriptionLocality