Modul:Wikidata

Dobrý den, přišli jste sem a hledáte význam slova Modul:Wikidata. V DICTIOUS najdete nejen všechny slovníkové významy slova Modul:Wikidata, ale dozvíte se také o jeho etymologii, charakteristice a o tom, jak se říká Modul:Wikidata v jednotném a množném čísle. Vše, co potřebujete vědět o slově Modul:Wikidata, najdete zde. Definice slova Modul:Wikidata vám pomůže být přesnější a správnější při mluvení nebo psaní textů. Znalost definiceModul:Wikidata, stejně jako definice dalších slov, obohacuje vaši slovní zásobu a poskytuje vám více a lepších jazykových zdrojů.

Dokumentaci tohoto modulu lze vytvořit na stránce Nápověda:Modul:Wikidata

p = {}

-- #############
-- # Utilities #
-- #############

-- Checks whether the values in two tables are identical,
-- ignoring their order
-- @param t1 table: The first table to compare
-- @param t2 table: The second table to compare
-- @return boolean: True if the values are identical, false otherwise
local function tableValuesEqual(t1, t2)
	if #t1 ~= #t2 then return false end
	local t1Counts = {}
	for _, v in pairs(t1) do
		t1Counts = (t1Counts or 0) + 1
	end
	local t2Counts = {}
	for _, v in pairs(t2) do
		t2Counts = (t2Counts or 0) + 1
	end
	for k, v in pairs(t1Counts) do
		if v ~= t2Counts then return false end
	end
	return true
end

-- Maps a function over a table
-- @param t table: The input table
-- @param f function: The function to be applied to the elements
-- @return table: The table with the mapped values
local function map(t, f)
    local r = {}
    for k, v in pairs(t) do
        r = f(v)
    end
    return r
end

-- Drops n elements from a table and returns the rest
-- @param t table: The table to drop the values from
-- @param n number: The number of values to drop
-- @return table: The table with the dropped values and a reset index
local function drop(t, n)
	local r = {}
	for i=n+1, #t do
		r = t
	end
	return r
end

-- Retrieves the numbered arguments from the invokation frame in an array-like form
-- @param frame: The frame from #invoke
-- @return table: The numbered arguments table
local function getNumberedArgs(frame)
	local a = {}
	local i = 1
	while frame.args ~= nil do
		a = frame.args
		i = i + 1
	end
	return a
end

-- ##################
-- # Mapping tables #
-- ##################

local flexionCategories = {
	s = "Q110786",
	p = "Q146786",
	
	nom = "Q131105",
	gen = "Q146233",
	dat = "Q145599",
	acc = "Q146078",
	voc = "Q185077",
	loc = "Q202142",
	ins = "Q192997",
	
	poz = "Q3482678",
	komp = "Q14169499",
	sup = "Q1817208",
}

local properties = {
	style = "P6191",
	ipa = "P898",
	hyphenation = "P5279",
}

-- #########################
-- # Lexemes API Functions #
-- #########################

-- Attempts to retrieve target entity IDs for a given source entity and property ID
-- @param sourceEntity any: The source Wikidata entity
-- @param propertyId string: The ID of the property for which the target values should be retrieved
-- @return : List of QIDs of the target entities
function p.getTargetValuesForProperty(sourceEntity, propertyId)
	local targetValues = {}
	
	if sourceEntity.claims == nil then return {} end
	
	for _, claim in pairs(sourceEntity.claims) do
		local datavalue = claim.mainsnak.datavalue
		if datavalue.type == "wikibase-entityid" and datavalue.value.id ~= nil then
			table.insert(targetValues, datavalue.value.id)
		elseif datavalue.type == "monolingualtext" and datavalue.value.text ~= nil then
			table.insert(targetValues, datavalue.value.text)
		else
			table.insert(targetValues, datavalue.value)
		end
	end
	return targetValues
end

-- Attempts to retrieve the representations for forms along with their language
-- styles for the specified lexeme, grammatical features and language
-- @param lexemeId string: The ID of the considered lexeme, including the L prefix
-- @param repFeatures : The QIDs of the grammatical features
-- @param language string: The Wikidata code for the language
-- @return )]: The retrieved list of matching representations and the Q-items for their language styles
function p.getFormRepresentations(lexemeId, repFeatures, language)
	local representations = {}
	
	local lexeme = mw.wikibase.getEntity(lexemeId)
	local forms = lexeme:getForms()
	for _, form in pairs(forms) do
		local representation, _ = form:getRepresentation(language)
		local grammaticalFeatures = form:getGrammaticalFeatures()
		if representation ~= nil and tableValuesEqual(repFeatures, grammaticalFeatures) then
			local repData = {representation, p.getTargetValuesForProperty(form, properties.style)}
			table.insert(representations, repData)
		end
	end
	return representations
end

function p.form(frame)
	local args = getNumberedArgs(frame)
	local lexemeId = args
	local language = args
	local formFeatures = drop(args, 2)
	formFeatures = map(formFeatures, function (ff) return flexionCategories end)
	
	local representations = p.getFormRepresentations(
		lexemeId, formFeatures, language
	)
	if #representations > 0 then
		return representations
	end
	return ""
end

return p