Модуль:AutoDescriptionMetro

Документация
--[[
------------------------------------------
--             AutoDescriptionMetro 
-- Модуль для заполнения станций метрополитена. 
------------------------------------------
--]]

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

local AutoDescriptionMetro={}

-- Формируем и возвращаем три переменных
local description = "" -- строка описания
local details = "" -- уточнение
local categories = "[[Категория:Станции метрополитена по алфавиту]]" -- категории
-- Промежуточный массив сущностей, в который помещаются результаты парсинга перед формированием описания

local entitiesArray = {administrativeT={}, instanceOf={}}
local entitiesArrayP = {P16="", P31="", P81="", P131="", P361="", P1619="", P2043=""}
--P16:транспортная сеть (тоже что и P361 - например, Московский метрополитен)
--P31:instance of / является частью понятия
--P81:железнодорожная линия
--P361:part of / часть от (например, Московский метрополитен)
--P131:located in the administrative territorial entity / административно-территориальная единица (например, район N)
--P1619:дата официального открытия
--P2043:length / длина
local propertyFull = {P131=""} --Какие поля заполнены в категории

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

-- Последовательно проходим свойства в карточке викиданных, для формирования массива сущностей entitiesArray
function AutoDescriptionMetro.parsing(entity)
	entitiesArrayP["P16"] = AutoDescriptionMetro.parseP16(entity)
	entitiesArrayP["P31"] = AutoDescriptionMetro.parseP31(entity)
	entitiesArrayP["P81"] = AutoDescriptionMetro.parseP81(entity)
	entitiesArrayP["P131"] = AutoDescriptionMetro.parseP131(entity)
	entitiesArrayP["P361"] = AutoDescriptionMetro.parseP361(entity)
	entitiesArrayP["P1619"] = AutoDescriptionMetro.parseP1619(entity)
	entitiesArrayP["P2043"] = AutoDescriptionMetro.parseP2043(entity)
end

function AutoDescriptionMetro.forming()
	
	--Станция метрополитена?
	if(entitiesArrayP["P31"] == "станция метрополитена") 
	then description = description .. "[[Станция метрополитена|станция]]." 
	else 
		description = description .. "станция." 
	end	 
	
	--Какого именно метропоолитена
	if(entitiesArrayP["P16"] ~= "") then 
		description = description:sub(1, -2) --удалил точку 
		if(entitiesArrayP["P16"] == "full") then
     		for k, v in pairs (entitiesArray.administrativeT) do
     			if(v ~= " ") then 
					local dec2 = Declension.declineWord(v, 2)
					if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
     					if(propertyFull["P16"] ~= "YES") then description = description .. " в " end
						description = description .. "[[" .. v .. "|" .. dec2 .. "]], "
						categories = categories .. "[[Категория:Станции " .. dec2  .."]]"
					else
     					if(propertyFull["P16"] ~= "YES") then description = description .. " в " end
						description = description .. "([[" .. v .. "]]), " 
					end
					propertyFull["P16"] = "YES" --P16 для категории заполнена
     			end	
     		end
        	description = description:sub(1, #description - 2)
		else
			local dec2 = Declension.declineWord(entitiesArrayP.P16, 2)
			if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
				description = description .. " [[" .. entitiesArrayP.P16 .. "|" .. dec2 .. "]]"
				categories = categories .. "[[Категория:Станции " .. dec2  .."]]"
				propertyFull["P16"] = "YES" --P16 для категории заполнена
			end
		end
		description = description .. "." 
	end
	
	--Какого именно метропоолитена № 2
	if(entitiesArrayP["P361"] ~= "") then 
		description = description:sub(1, -2) --удалил точку 
		if(entitiesArrayP["P361"] == "full") then
     		for k, v in pairs (entitiesArray.administrativeT) do
     			if(v ~= " ") then 
					local dec2 = Declension.declineWord(v, 2)
					if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
     					if(propertyFull["P361"] ~= "YES") then description = description .. " в " end
						description = description .. "[[" .. v .. "|" .. dec2 .. "]], "
						categories = categories .. "[[Категория:Станции " .. dec2  .."]]"
					else
     					if(propertyFull["P361"] ~= "YES") then description = description .. " в " end
						description = description .. "([[" .. v .. "]]), " 
					end
					propertyFull["P361"] = "YES" --P361 для категории заполнена
     			end	
     		end
        	description = description:sub(1, #description - 2)
		else
			local dec2 = Declension.declineWord(entitiesArrayP.P361, 2)
			if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
				description = description .. " [[" .. entitiesArrayP.P361 .. "|" .. dec2 .. "]]"
				categories = categories .. "[[Категория:Станции " .. dec2  .."]]"
				propertyFull["P361"] = "YES" --P361 для категории заполнена
			end
		end
		description = description .. "." 
	end

	--На какой линии (P81)
	if(entitiesArrayP["P81"] ~= "") then 
		description = description:sub(1, -2) --удалил точку 
		if(entitiesArrayP["P81"] == "full") then
     		for k, v in pairs (entitiesArray.administrativeT) do
     			if(v ~= " ") then 
					local dec2 = Declension.declineWord(v, 2)
					if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
     					if(propertyFull["P81"] ~= "YES") then description = description .. " в " end
						description = description .. "на [[" .. v .. "|" .. dec2 .. "]], "
						categories = categories .. "[[Категория:" .. v .."]]"
					else
     					if(propertyFull["P81"] ~= "YES") then description = description .. " в " end
						description = description .. "([[" .. v .. "]]), " 
					end
					propertyFull["P81"] = "YES" --P81 для категории заполнена
     			end	
     		end
        	description = description:sub(1, #description - 2)
		else
			local dec2 = Declension.declineWord(entitiesArrayP.P81, 2)
			if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
				description = description .. " на [[" .. entitiesArrayP.P81 .. "|" .. dec2 .. "]]"
				propertyFull["P81"] = "YES" --P81 для категории заполнена
			end
		end
		description = description .. "." 
	end
	
end

--Какая транспортная сеть
function AutoDescriptionMetro.parseP16(entity)
 local value = entity:formatPropertyValues("P16", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end	  

function AutoDescriptionMetro.parseP31(entity)
 local p31Statements=mw.wikibase.getAllStatements(entity:getId(), 'P31' ) 
 local i=0
 if(p31Statements ~= "") then
 	for ki, vi in pairs (p31Statements) do
 		if((vi['mainsnak'] ~= nil)) then 
 			local state=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id'])
 			if (state ~= "") then
 				i=i+1
 				entitiesArray.instanceOf[i]=state
 			end	
 		end
 	end	
 	if(i>0) then return "full"
 	else return "станция метрополитена" end	
 end
end	

function AutoDescriptionMetro.parseP81(entity)
 local value = entity:formatPropertyValues("P81", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end	  

function AutoDescriptionMetro.parseP131(entity)
 local p131Statements=mw.wikibase.getAllStatements(entity:getId(), 'P131' ) 
 local i=0
 if(p131Statements ~= "") then
 	for ki, vi in pairs (p131Statements) do
 		if((vi['mainsnak'] ~= nil)) then 
 			local state=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id'])
 			if (state ~= "") then
 				i=i+1
 				entitiesArray.administrativeT[i]=state
 			end	
 		end
 	end	
 	if(i>0) then return "full"
 	else 
 		value = entity:formatPropertyValues("P131", mw.wikibase.entity.claimRanks).value
 		if(value ~= "") then return value
 		else return value end
 	end	
 else return "" end
end	  

--Какая линия
function AutoDescriptionMetro.parseP361(entity)
 local value = entity:formatPropertyValues("P361", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end	  

function AutoDescriptionMetro.parseP1619(entity)
 local value = entity:formatPropertyValues("P1619", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end

function AutoDescriptionMetro.parseP2043(entity)
 local value = entity:formatPropertyValues("P2043", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end	  

return AutoDescriptionMetro