Module:Properties

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Documentation icon Τεκμηρίωση module[δημιουργία]
-- this module gives solutions to get the Pnumber of a property by its name


-- could be automatized, but for now just defining a muanual mapping

local p = {
	p_from_name = {
		["country"] = 17 ;
		["gender"] = 21 ;

		["instance of"] = 31 ;
		
		["field"] = 101 ; 
		["occupation"] = 106 ;
		
		["genre"] = 136 ;
		
		["named after"] = 138 ;
		
		
		["preceded by"] = 155;
		["succeeded by"] = 156;
		["collection"] = 195;	
		["subclass of"] = 279 ;

		["category's topic"] = 301;

		["list of"] = 360 ; 
		["part of"] = 361 ;

		["commons category"] = 373;
		
		["terminus"] = 559;
		["direction"] = 560;
		
		["start date"] = 580 ;
		["begin date"] = 580 ;
		
		["end date"] = 582 ;
		
		["date"] = 585 ;
		
		["of"] = 642 ;
		
		["participant"] = 710 ;
		
		["edition"] = 747 ;
		["edition of"] = 629 ;
		
		['key event'] = 793 ;
		['significant event'] = 793 ;
		
		["topic's category"] = 910;
		["subject"] = 921; -- work subject
		["inspired by"] = 941 ;	
		
		["fictional analog of"] = 1074 ;

		["statement disputed by"] = 1310 ;
		["disputed by"] = 1310 ;
		
		["of"] = 642 ;
		
		["history"] = 2184 ;
		
		["property for this type"] = 1963 ;
        ["metasubclass of"] = 2445 ;
        
		["number"] = 1114 ;
		
		["union of"] = 2737;
		["disjoint union of"] = 2738;
		
		["has part of the type"] = 2670 ;
	}
}


local function string_to_propnumber(label)
	local res = p.p_from_name[label] ;
	if res ~= nil then
		return tostring( res) ;
	else
		res = mw.wikibase.resolvePropertyId(label)
		if res then
			return string.sub(res, 2)
		else
			return nil
		end
    end
end

p.numberFromPropertylabel = function(frame)  
	local label = frame.args[1] ;
	mw.log(label)
	return string_to_propnumber(label)
end;

-- returns a pid of the form "Pnnn..." where n is a character in "123456789"
--from either 
--* a number representing a property wikidata number
--* a string number representing a property wikidata number
--* a pid of the form "Pnnn"
--* a "property name" corresponding to a property, where the names are listed in the array p.p_from_name
-- or "nil" if the id does not match to any of the cases above
p.normalize = function(input_pid)
	local input_pid = tostring(input_pid)
	if mw.ustring.match(input_pid, "P%d+") then
		return input_pid
	elseif mw.ustring.match(input_pid, "%d+") then
		return "P" .. input_pid
	else
		return "P" .. tostring(string_to_propnumber(input_pid))
	end
end

-- function that takes a string with a set of pids and returns an array of properties
p.expandPropList = function(plist)
	local props = mw.text.split(plist,",")
	for ind, val in ipairs(props) do
		props[ind] = p.normalize(val)
	end
	return props
end

function p.datatype(property)
	if type(property) ~= "table" then
		property = mw.wikibase.getEntityObject(p.normalize(property))
	end
	return property.datatype
end

---------------------------------------------------------------
-- wikitemplate interface
---------------------------------------------------------------

p.Pid = function(frame)  
	local label = frame.args[1] ;
	return p.normalize(label)
end;

p.Pdatatype = function(frame)
	return p.datatype(frame.args[1])
end;


p.of = p.normalize("of")
p.union_of = p.normalize("union of")
p.disjoint_union_of = p.normalize("disjoint union of")

return p;