Module:Dataframe

Lua
CodeDiscussionLinksLink count SubpagesDocumentationTestsResultsSandboxLive code All modules

Barack Obama (Q76) edit

Barack Obama (Kapiolani Medical Center for Women and Children, 4 August 1961 – ) is a American, Americans and Kenyan politician, lawyer, political writer, community organizer, statesperson, jurist, podcaster, academic, memoirist.

Biography edit

Barack Obama was born 4 August 1961 in Kapiolani Medical Center for Women and Children. they is the child of is the 4 August 1961 and Kapiolani Medical Center for Women and Children.


Jean-François Champollion (Q260) edit

Jean-François Champollion (Figeac, 23 December 1790Paris, 4 March 1832) is a French egyptologist.

Biography edit

Jean-François Champollion was born 23 December 1790 in Figeac. they is the child of is the 23 December 1790 and Figeac.

Code

-- Utility functions
function getBestStatementsValueStatements( item, property1, property2 )
	local values = {}
	for _,typeStatement in pairs(item:getBestStatements(property1)) do
		if typeStatement.mainsnak.datavalue ~= nil then
			local valueItemId = typeStatement.mainsnak.datavalue.value.id
			local valueItem = mw.wikibase.getEntity(valueItemId)
			if valueItem ~= nil then
				for _,value in pairs(valueItem:getBestStatements(property2)) do
					if value.mainsnak.datavalue ~= nil then
						if value.mainsnak.datavalue.type ~= 'monolingualtext' or
						   value.mainsnak.datavalue.value.language == mw.getContentLanguage():getCode() then
							value = mw.wikibase.formatValue(value.mainsnak)
							if value ~= '' then
								table.insert(values, value)
							end
						end
					end
				end
			end
		end
	end
	return mw.text.listToText(values)
end

local genderMapping = {
	Q6581097 = 'male',
	Q6581072 = 'female',
	Q1052281 = 'female',
	Q2449503 = 'male'
}
function getGender( item )
	for _,genderStatement in pairs(item:getBestStatements('P21')) do
		if genderStatement.mainsnak.datavalue ~= nil then
			local valueItemId = genderStatement.mainsnak.datavalue.value.id
			if genderMapping[valueItemId] ~= nil then
				return genderMapping[valueItemId]
			end
		end
	end
	return ''
end

-- Frame definitions

local framesDefinitions = {
	['person.intro'] = {
		en = '{{{subject}}} ({{{birthPlace}}}, {{{birthDate}}} – {{#if:{{{deathPlace|}}}{{{deathDate}}}| {{{deathPlace}}}, {{{deathDate}}}|}}) is a {{{demonym}}} {{{occupation}}}.',
		fr = '{{{subject}}} ({{{birthPlace}}}, {{{birthDate}}} – {{#if:{{{deathPlace|}}}{{{deathDate}}}| {{{deathPlace}}}, {{{deathDate}}}|}}) est un {{{occupation}}} {{{demonym}}}.',
		he = '{{{subject}}} ({{{birthPlace}}}, {{{birthDate}}} – {{#if:{{{deathPlace|}}}{{{deathDate}}}| {{{deathPlace}}}, {{{deathDate}}}|}}) {{GENDER:{{{gender}}}|הוא|היא}} {{{occupation}}} {{{demonym}}}.'
	},
	['person.bio.header'] = {
		en = '== Biography ==',
		fr = '== Biographie ==',
		he = '== קורות חיים =='
	},
	['person.bio.birth'] = {
		en = '{{{subject}}} was born {{{birthDate}}} in {{{birthPlace}}}.',
		fr = '{{{subject}}} est né le {{{birthDate}}} à  {{{birthDate}}}.',
		he = '{{{subject}}} {{GENDER:{{{gender}}}|נולד|נולדה}} ב־{{{birthDate}}} ב{{{birthPlace}}}.'
	},
	['person.bio.parents'] = {
		en = '{{GENDER:{{{gender}}}|he is the son|she is the daughter|they is the child}} of is the {{{father}}} and {{{mother}}}.',
		en = '{{GENDER:{{{gender}}}|he is the son|she is the daughter|they is the child}} of is the {{{father}}} and {{{mother}}}.',
		he = '{{GENDER:{{{gender}}}|הוא הבן|היא הבת}} של {{{father}}} ושל {{{mother}}}.'
	}
}

local templatesDefinitions = {
	['Q5'] = {
		{
			type = 'person.intro',
			subject = function(item) return item:getLabel() end,
			birthDate = function(item) return item:formatStatements('P569').value end,
			birthPlace = function(item) return item:formatStatements('P19').value end,
			deathDate = function(item) return item:formatStatements('P570').value end,
			deathPlace = function(item) return item:formatStatements('P20').value end,
			occupation = function(item) return item:formatStatements('P106').value end,
			demonym = function(item) return getBestStatementsValueStatements(item, 'P27', 'P1549') end,
		},
		{
			type = 'person.bio.header'
		},
		{
			type = 'person.bio.birth',
			subject = function(item) return item:getLabel() end,
			birthDate = function(item) return item:formatStatements('P569').value end,
			birthPlace = function(item) return item:formatStatements('P19').value end,
		},
		{
			type = 'person.bio.parents',
			gender = function(item) return getGender(item) end,
			father = function(item) return item:formatStatements('P569').value end,
			mother = function(item) return item:formatStatements('P19').value end,
		},
	}
}

function renderFrames(frames)
	local mwFrame = mw.getCurrentFrame()
	local language = mw.getContentLanguage():getCode()
	local wikitext = ''
	for _, frame in pairs(frames) do
		local childFrame = mwFrame:newChild{ args = frame }
		if framesDefinitions[frame['type']] ~= nil and framesDefinitions[frame['type']][language] ~= nil then
			wikitext = wikitext .. childFrame:preprocess(framesDefinitions[frame['type']][language]) .. '\n'
		end
	end
	return wikitext
end

function fillTemplate(template, item)
	local frames = {}
	for pos, frameTemplate in pairs(template) do
		frames[pos] = {}
		for k,v in pairs(frameTemplate) do
			if type(v) == 'function' then
				frames[pos][k] = v(item)
			else
				frames[pos][k] = v
			end
		end
	end
	return frames
end

local p = {}

function p.render(frame)
	local itemId = frame.args['item'] or mw.wikibase.getEntityIdForCurrentPage()
	item = mw.wikibase.getEntity(itemId)
	if item == nil then
		return 'Not found'
	end
	for _,typeStatement in pairs(item:getBestStatements('P31')) do
		itemType = typeStatement.mainsnak.datavalue.value.id
		if templatesDefinitions[itemType] ~= nil then
			return renderFrames(fillTemplate(templatesDefinitions[itemType], item))
		end
	end
end

return p