Jump to content

Module:Databox/categories

Daga Wikipedia, Insakulofidiya ta kyauta.

Documentation for this module may be created at Module:Databox/categories/doc

local human_ids = {	
	'Q5' -- human 
}
local language_ids = {
	'Q34770', -- language 
	'Q33742' -- natural language 
}
local lanfamily_ids = { 
	'Q25295' -- language family
}
local taxon_ids = { 
	'Q16521', -- taxon 
	'Q713623', -- clade 
	'Q23038290', -- fossil taxon
	'Q310890' -- Q310890
}
local country_ids = { 
	'Q6256', -- country 
	'Q3624078' --  sovereign state
}
local city_ids = { 
	'Q5119', -- capital 
	'Q515', -- city  
	'Q2264924', -- port city
	'Q2989398', -- municipality of Algeria
	'Q484170', -- commune of France
	'Q1549591', -- big city 
	'Q1093829', -- city of the United States
	'Q15253706', -- like a city
	'Q3327870', -- municipal corporation in the United States 
	'Q21518270', -- state or insular area capital in the United States 
	'Q174844', -- megacity 
	'Q200250', -- metropolis 
	'Q41067667', -- Q41067667
	'Q3327862', -- urban commune of Morocco
	'Q2989470', -- commune of Mauritania  
	'Q17318027' -- rural commune of Morocco
}

local categories = {
	human_ids = human_ids,
	language_ids = language_ids,
	lanfamily_ids = lanfamily_ids,
	taxon_ids = taxon_ids,
	country_ids = country_ids,
	city_ids = city_ids,
}

local p = {}
local lualinq = require "Module:LuaLinq"

function belongsTo(item_ids, category_ids)
	return lualinq.main(category_ids):any(function(x) return lualinq.main(item_ids):any(function(y) return x == y; end) end)
end

function findCategoryName(item_ids)
	for k, v in pairs(categories) do
		if belongsTo(item_ids, v) then return k end
    end
    return "generic"
end

function p.find(frame)
	local args = frame:getParent().args
    local itemId = nil
    if args.item then
        itemId = args.item
    end
    local item = mw.wikibase.getEntity(itemId)
    
    if item == nil or item.claims == nil then
        return nil
    end
    
    local ids = lualinq.main(item.claims["P31"]):select(function(c) return c.mainsnak.datavalue.value['id']; end)
    
    if not lualinq.main(ids):any() then
        return nil
    end
    
    local name = findCategoryName(ids)
    
    if name == "generic" then --try once more with parent
         name = findCategoryName(lualinq.main(mw.wikibase.getEntity(lualinq.main(ids):first()).claims["P279"]):select(function(c) return c.mainsnak.datavalue.value['id']; end):toArray())
    end
    
    return name
end

return p