Module:Name item

Lua
CodeDiscussionLinksLink count SubpagesDocumentationTestsResultsSandboxLive code All modules

Documentation for this module may be created at Module:Name item/doc

Code

-- By User:Jura1, based on module:Property documentation

local p = {}
local d = require('Module:Wikidata')
local q = require('Module:Property navbox')
local ii = require('Module:Interwiki from P460')

--- Return 'native label' (P1705), otherwise the item's label (localized or fallback), otherwise the QID
function p.nl(data, qid, linking)
	local result = ''
	if data then
		if	data.claims
		and	data.claims.P1705 then -- 'native label' (P1705)
			result = {}
			for _, v in ipairs(data.claims.P1705) do
				if v.mainsnak.snaktype == 'value' then
					table.insert(result, '<bdi>' .. v.mainsnak.datavalue.value.text .. '</bdi>')
				end
			end
			result = table.concat(result, ', ')
		end
		if result == '' then
			result = d._getLabel(data, q.getLang(), 'id')
			result = result and ('<bdi>' .. result .. '</bdi>') or ''
		end
	end
	if result == '' then
		result = qid or ''
	end
	if result ~= '' and linking ~= '' then
		result  = '[[Talk:' .. (qid or '') .. '|' .. result .. ']]'
	end
	return result
end

-- Get 'pronunciation audio' (P443) value if qualifier 'language of work or name' (P407) set to the given audio language
function p.audiofiles(data, audiolangid)
	if	data
	and	data.claims
	and	data.claims.P443 then -- 'pronunciation audio' (P443)
		local propdata = mw.wikibase.getEntityObject('P443')
		local proplabel = d._getLabel(propdata) or ''
		local audiofiles = {}
		for _, v in ipairs(data.claims.P443) do
			if v.qualifiers and v.qualifiers.P407 then -- 'language of work or name' (P407)
				for _, vv in ipairs(v.qualifiers.P407) do
					if	vv.datavalue then
						local seeid = vv.datavalue.value.id
						if	seeid == audiolangid
						or	audiolangid == 'Q1860' -- 'English' (Q1860)
							and	(	seeid == 'Q7976' -- 'American English' (Q1860)
								or	seeid == 'Q7979' -- 'British English' (Q1860)
								or	seeid == 'Q44679' -- 'Australian English' (Q44679)
								)
						then
							local langlabel = d._getLabel(seeid) or ''
							table.insert(audiofiles, '[[File:Speaker Icon.svg|11px|' ..
								proplabel .. ' (' .. langlabel .. ')|link=File:' ..
								v.mainsnak.datavalue.value .. ']]')
						end
					end
				end
			end
		end
		if #audiofiles > 0 then
			return '&#x202F;' .. table.concat(audiofiles, '&#x202F;') .. '&#x202F;'
		end
	end
	return ''
end

function p.langs(data)
	if	data
	and	data.claims
	and data.claims.P407 then -- 'language of work or name' (P407)
		local langs = {}
		for _, v in ipairs(data.claims.P407) do
			if v.mainsnak.snaktype == 'value' then
				local langid = v.mainsnak.datavalue.value.id
				local langlabel = d._getLabel(langid) or ''
				table.insert(langs, '<bdi>' .. langlabel .. '</bdi>' .. (p.audiofiles(data, langid) or ''))
			end
		end
		if #langs > 0 then
			return ' <small>(' .. table.concat(langs, ', ') .. ')</small>'
		end
	end
	return ''
end

-- Return 'nickname' (P1449), preferably from 'statement is subject of' (P805) qualifiers (excepting diminutives)
function p.nicknames(data)
	if	data
	and	data.claims
	and	data.claims.P1449 then -- 'nickname' (P1449)
		local nicknames = {}
		for _, v in ipairs(data.claims.P1449) do
			if v.qualifiers and v.qualifiers.P805 then -- 'statement is subject of' (P805)
				for _, vq in ipairs(v.qualifiers.P805) do
					if vq.datavalue and vq.datavalue.value then
						local nicknameid = vq.datavalue.value.id
						if nicknameid
						and nicknameid ~= 'Q1130279' then -- ignore 'hypocorism' (Q1130279): diminutive, short nickname, pet name...
							local nicknamedata = mw.wikibase.getEntityObject(nicknameid)
							local nicknamelabel = d._getLabel(nicknameid) or ''
							table.insert(nicknames, p.nl(nicknamedata, nicknameid, 'yes') .. p.langs(nicknamedata))
						end
					end
				end
			end
			if	#nicknames == 0
			and	v.mainsnak.snaktype == 'value' then
				table.insert(nicknames, v.mainsnak.datavalue.value.text)
			end
		end
		return table.concat(nicknames, ', ')
	end
	return ''
end

function p.related(data)
	if 	data
	and	data.claims
	and	data.claims.P460 then -- 'said to be the same as' (P460)
		local related = {}
		for _, v in ipairs(data.claims.P460) do
			if v.mainsnak.snaktype == 'value' then
				local relatedid = v.mainsnak.datavalue.value.id
				local relateddata = mw.wikibase.getEntityObject(relatedid)
				if relateddata then
					table.insert(related, p.nl(relateddata, relatedid, 'yes') .. p.langs(relateddata))
				end
			end
		end
		return table.concat(related, ', ')
	end
	return ''
end

function p.ogender(data)
	if	data
	and	data.claims
	and	data.claims.P1560 then -- 'given name version for other gender' (P1560)
		local ogenders = {}
		for _, v in ipairs(data5.claims.P1560) do
			if v.mainsnak.snaktype == 'value' then
				local ogenderid = v.mainsnak.datavalue.value.id
				local ogenderdata = mw.wikibase.getEntityObject(ogenderid)
				if seedata2 then
					table.add(ogenders, p.nl(ogenderdata, ogenderid, 'yes') .. p.langs(ogenderdata))
					table.add(ogenders, p.related(ogenderdata))
				end
			end
		end
		return table.concat(ogenders, ', ')
	end
	return ''
end

-- Get 'URL' (P2699) qualifiers of 'described by' (P1343) statements set to 'Wiktionnary' (Q151)
function p.wikt(data)
	if	data
	and	data.claims
	and	data.claims.P1343 then -- 'described by' (P1343)
		local result = {}
		for _, v in ipairs(data.claims.P1343) do
			if	v.mainsnak.datavalue
			and	v.mainsnak.datavalue.value.id == 'Q151' then -- 'Wiktionnary' (Q151)
				if	v.qualifiers
				and	v.qualifiers.P2699 then -- 'URL' (P2699)
					for _, vv in ipairs(v.qualifiers.P2699) do
						if	vv.datavalue
						and	vv.datavalue.value then
							table.insert(result, '[' .. vv.datavalue.value .. ' Wiktionnary]')
						end
					end
				end
			end
		end
		return table.concat(result, ', ')
	end
	return ''
end

function p.view(frame)
	local qid = frame.args.id or frame:preprocess('{{PAGENAME}}')
    if	qid ~= 'None' then
		local data = mw.wikibase.getEntityObject(qid)
		if	data
		and	data.claims then
			local result = ''

			local mylabel = p.nl(data, qid, '')
			if mylabel ~= '' then
				result = '<b><bdi>' .. mylabel .. '</bdi></b>'
			end
		
			local description = d._getDescription(data, q.getLang()) or ''
			if description ~= '' then
				result = result .. ': ' .. '<bdi>' .. description .. '</bdi>' .. p.langs(data)
			end
		
			local script = d.formatStatementsE { item = qid, property = 'P282', displayformat = '' } or ''
			if script ~= '' then
				result = result .. ' <small>(<bdi>' .. script .. '</bdi>)</small>'
			end
		
			local names

			local namestable = {}
		
			names = d.formatStatementsE { item = qid, property = 'P2440', displayformat = '' } or ''
			if names ~= '' then
				table.insert(namestable, '[[' .. qid .. '#P2440|transliteration]]</td><td>' .. names)
			end

			names = p.nicknames(data)	
			if names ~= '' then
				table.insert(namestable, '[[' .. qid .. '#P1449|nicknames]]</td><td>' .. names)
			end

			names = p.related(data)
			if names ~= '' then
				table.insert(namestable, '[[' .. qid .. '#P460|related]]</td><td>' .. names)
			end

			names = p.ogender(data)
			if names  ~= ''then
				table.insert(namestable, '[[' .. qid .. '#P1560|other gender]]</td><td>' .. names)
			end

			-- TODO: add other props

			names = p.wikt(data)
			if names ~= '' then
				table.insert(namestable, 'Wiktionnary</td><td>' .. names)
			end

			names = ii.InterwikiNameTalk(qid) or ''
			if names ~= '' then
				table.insert(namestable, 'Wikimedia</td><td>' .. names)
			end

			if #namestable > 0 then
				result = result .. '<table><tr valign="top"><td>' ..
					table.concat(namestable, '</td></tr><tr valign="top"><td>') ..
					'</td></tr></table>'
			end
			return result
		end
	end
	return ''
end

return p