Module:Wikidata Infobox

Documentation for this module may be created at Module:Wikidata Infobox/doc

local p = {}
require('strict')
local WikidataIB = require("Module:WikidataIB")

function p.getMID()
	return "M" .. mw.title.getCurrentTitle().id
end
function p.getFilename()
	return mw.title.getCurrentTitle().nsText .. ':' .. mw.title.getCurrentTitle().text
end

function p.getP180vals(frame)
	local mid = frame.args[1]
	local prefix = frame.args[2] or ''
	local postfix = frame.args[3] or ' '
	local text = ''
	local tablevals = mw.wikibase.getBestStatements( mid, 'P180')
	for i, v in ipairs(tablevals) do
		text = text .. prefix .. v.mainsnak.datavalue.value.id .. postfix
	end
	return text
end

-- Get a list of all properties in the current item
function p.preloadWikidataProperties(frame)
	local qid = frame.args[1] or ''
	local proplist = ''
	if mw.text.trim(qid or '') ~= '' then
		local entity = mw.wikibase.getEntity(qid)
		local properties = entity:getProperties()
		for i, v in ipairs(properties) do
			proplist = proplist .. v .. ", "
		end
	end
	if proplist == '' then
		proplist = 'None'
	end
	return proplist
end

-- check if it is on the list, fork of WikidataIB's checkBlacklist function
function p.checkProplist(frame)
	local proplist = frame.args.fetchwikidata or frame.args.fwd or ""
	local fieldname = frame.args.name or ""
	if proplist ~= "" and fieldname ~= "" then
		if proplist:find(fieldname .. ",") then
			return true
		else
			return ''
		end
	else
		-- one of the fields is missing: let's call that "on the list"
		return true
	end
end

function p.getCombinedWikidataTemplates(frame)
	local qid = frame.args[1] or ''
	local outputcode = ''
	if mw.text.trim(qid or '') ~= '' then
		local tablevals = mw.wikibase.getBestStatements( qid, 'P971')
		local count = 0
		local mapqid = 0
		for i, v in ipairs(tablevals) do
			count = count + 1
		end
		if count < 3 then
			for i, v in ipairs(tablevals) do
				local skip = 0
				-- Skip building interiors (Q30062422), maps (Q4006) and ship names (Q56351075), atlantic ocean (Q97)
				if v.mainsnak.datavalue.value.id == 'Q30062422' or v.mainsnak.datavalue.value.id == 'Q56351075' or v.mainsnak.datavalue.value.id == 'Q4006' or v.mainsnak.datavalue.value.id == 'Q97' then
					skip = 1
				else
					local p279check = mw.wikibase.getBestStatements( v.mainsnak.datavalue.value.id, 'P279')
					for j, w in ipairs(p279check) do
						skip = 1
					end
					local p31check = mw.wikibase.getBestStatements( v.mainsnak.datavalue.value.id, 'P31')
					for j, w in ipairs(p31check) do
						-- Skip countries (Q6256), continents (Q5107), sovereign states (Q3624078), oceans (Q9430)
						if w.mainsnak.datavalue.value.id == 'Q6256' or w.mainsnak.datavalue.value.id == 'Q5107' or  w.mainsnak.datavalue.value.id == 'Q3624078' or  w.mainsnak.datavalue.value.id == 'Q9430' then
							skip = 1
							mapqid = v.mainsnak.datavalue.value.id
						end
					end
				end

				if skip == 0 then
					local newframe = {}
					newframe.args = {}
					newframe.args[0] = ''
					newframe.args[1] = v.mainsnak.datavalue.value.id
					outputcode = outputcode .. frame:expandTemplate{ title = 'Wikidata Infobox/core', args = { qid=v.mainsnak.datavalue.value.id, embed='Yes', conf_authoritycontrol='yes', fwd=p.preloadWikidataProperties(newframe) } }
				end
			end
		end
		if mapqid ~= 0 then
			outputcode = outputcode .. frame:expandTemplate{ title = 'Wikidata Infobox/countrymap', args={qid=mapqid}}
		end	
	end
	return outputcode
end

function p.ifThenShow(frame)
	if mw.text.trim(frame.args[1] or '') ~= '' then
		return (frame.args[3] or '') .. (frame.args[1] or '') .. (frame.args[4] or '')
	else
		return (frame.args[2] or '')
	end
end

--  Given an input area, return a map zoom level to use with mw:Extension:Kartographer in {{Wikidata Infobox}}. Defaults to mapzoom=15. 
function p.autoMapZoom(frame)
	local sizestr,null = frame.args[1]:gsub("%D+%.?%D+", ""):gsub(",","")
	local size = tonumber(sizestr) or 0
	local LUT = { 5000000, 1000000, 100000, 50000, 10000, 2000, 150, 50, 19, 14, 5, 1, 0.5 } 
	for zoom, scale in ipairs(LUT) do
		if size > scale then
			return zoom+1
		end
	end
	return 15
end

function p.formatLine(frame)
	local part2 = mw.text.trim(frame.args[2] or '')
	local returnstr = ''
	if part2 ~= '' then
		returnstr = '<tr '
		if (frame.args.mobile or 'n') == 'y' then
			returnstr = returnstr .. 'class="wdinfo_nomobile"'
		end
		local newframe = {}
		newframe.args = {}
		newframe.args.qid = frame.args[1]
		returnstr = returnstr .. '><th class="wikidatainfobox-lcell">' .. mw.getContentLanguage():ucfirst(WikidataIB.getLabel(newframe))
		returnstr = returnstr .. '</th><td '
		if (frame.args.wrap or 'n') == 'y' then
			returnstr = returnstr .. 'style="white-space: nowrap"'
		end
		returnstr = returnstr .. '>' .. part2 .. '</td></tr>'
	end
	return returnstr
end

function p.hasValue (tab, val)
    for index, value in ipairs(tab) do
        if value == val then
            return true
        end
    end

    return false
end

-- baseLang is a utility function that returns the base language in use
-- so for example, both English (en) and British English (en-gb) return 'en'
-- from https://commons.wikimedia.org/wiki/Module:Wikidata2
function p.baseLang(frame)
	local txtlang = frame:callParserFunction( "int", "lang" ) or ""
	-- This deals with specific exceptions: be-tarask -> be_x_old
	if txtlang == "be-tarask" then
		return "be_x_old"
	end
	local pos = txtlang:find("-")
	local ret = ""
	if pos then
		ret = txtlang:sub(1, pos-1)
	else
		ret = txtlang
	end
	return ret
end

function p.langDirection(frame)
	local lang = mw.text.trim(frame.args[1] or '') 
	if (not mw.language.isSupportedLanguage(lang)) then 
		lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language
	end
	return mw.getLanguage(lang):getDir()
end

--[[
convertChar returns the non-diacritic version of the supplied character.
stripDiacrits replaces words with diacritical characters with their non-diacritic equivalent.
strip_diacrits is available for export to other modules.
stringIsLike tests two words, returning true if they only differ in diacritics, false otherwise.
stringIs_like is available for export to other modules.
--]]

local function characterMap()
	-- table with characters with diacrits and their equivalent basic latin characters
	local charMap_from, charMap_to
	charMap_from =  'ÁÀÂÄǍĂĀÃÅĄƏĆĊĈČÇĎĐḌÐÉÈĖÊËĚĔĒẼĘẸĠĜĞĢĤĦḤİÍÌÎÏǏĬĪĨĮỊĴĶĹĿĽĻŁḶḸṂŃŇÑŅṆŊÓÒÔÖǑŎŌÕǪỌŐØŔŘŖṚṜŚŜŠŞȘṢŤŢȚṬÚÙÛÜǓŬŪŨŮŲỤŰǗǛǙǕŴÝŶŸỸȲŹŻŽ'..
					'áàâäǎăāãåąəćċĉčçďđḍðéèėêëěĕēẽęẹġĝğģĥħḥıíìîïǐĭīĩįịĵķĺŀľļłḷḹṃńňñņṇŋóòôöǒŏōõǫọőøŕřŗṛṝśŝšşșṣťţțṭúùûüǔŭūũůųụűǘǜǚǖŵýŷÿỹȳźżž'
	charMap_to   =  'AAAAAAAAAAACCCCCDDDDEEEEEEEEEEEGGGGHHHIIIIIIIIIIIJKLLLLLLLMNNNNNNOOOOOOOOOOOORRRRRSSSSSSTTTTUUUUUUUUUUUUUUUUWYYYYYZZZ'..
					'aaaaaaaaaaacccccddddeeeeeeeeeeegggghhhiiiiiiiiiiijklllllllmnnnnnnoooooooooooorrrrrssssssttttuuuuuuuuuuuuuuuuwyyyyyzzz'
	local charMap = {}
	for i = 1,mw.ustring.len(charMap_from) do
		charMap[mw.ustring.sub(charMap_from, i, i)] = mw.ustring.sub(charMap_to, i, i)
	end
	charMap['ß'] = 'ss'
	return charMap
end

function p.convertChar(frame)
	local ch = frame.args.char or mw.text.trim(frame.args[1]) or ""
	local charMap = characterMap()
	return charMap[ch] or ch
end

function p.strip_diacrits(wrd)
	if wrd then 
		local charMap = characterMap()
		wrd = string.gsub(wrd, "[^\128-\191][\128-\191]*", charMap )
	end
	return wrd
end

function p.stripDiacrits(frame)
	return p.strip_diacrits(frame.args.word or mw.text.trim(frame.args[1]))
end

function p.stringIs_like(wrd1, wrd2)
	return p.strip_diacrits(wrd1) == p.strip_diacrits(wrd2)
end

function p.stringIsLike(frame)
	local wrd1 = frame.args.word1 or frame.args[1]
	local wrd2 = frame.args.word2 or frame.args[2]
	if p.strip_diacrits(wrd1) == p.strip_diacrits(wrd2) then
		return true
	else
		return nil
	end
end

function p.expandhiero(frame, hiero)
	-- added by Jura1
	-- for string values in Wikihiero syntax
	-- inline recommended by https://meta.wikimedia.org/wiki/Help_talk:WikiHiero_syntax#Unwanted_newlines https://en.wikipedia.org/wiki/Help:WikiHiero_syntax
	-- maybe not needed in all contexts
	return 	frame:preprocess('<div style="text-align:center;display:inline"> <hiero> ' .. hiero .. ' </hiero> </div>')
end

local function format2rowline(cell1, cell2)
	-- added by Jura1
	local tr = ""
	tr = '<tr><th class="wikidatainfobox-lcell" style="text-align: left; vertical-align: text-top;" colspan="2">' .. cell1 .. '</th></tr>'
	tr = tr .. '<tr><td valign="top" colspan="2">' .. cell2 .. '</td></tr>' 
	return tr 							
end

local function format1rowline(trqid, cell1, cell2)
	-- added by Jura1
	local tr = ""
	tr = '<tr id="' .. trqid .. '"><th class="wikidatainfobox-lcell" style="vertical-align: top">' .. cell1 .. '</th>'
    tr = tr .. '<td valign="top" style="vertical-align: top">' .. cell2 .. '</td></tr>'							
	return tr 							
end

function p.hieroP7383(frame)
-- added by Jura1
-- expand P7383 value in <hiero></hiero> tags	
	local qid = mw.text.trim(frame.args.qid or "")
	local rows = ""
	local checkentry = mw.wikibase.isValidEntityId(qid)
	if not checkentry then
		return ''
	end
	local entity = mw.wikibase.getEntityObject(qid)
	if not entity then
		return ''
	end
	local mylang = frame:preprocess('{{int:lang}}')
	if entity.claims and entity.claims.P7383 then
			for _, v in ipairs(entity.claims.P7383) do
				local idv = v.mainsnak.datavalue.value 
				if v.qualifiers and v.qualifiers.P3831 then
					for _, w in ipairs(v.qualifiers.P3831) do
						if w.snaktype == "value" then
							local qualid = w.datavalue.value["id"]
							local encod = mw.wikibase.getEntityObject(qualid)
                   			rows = rows .. format2rowline(encod:getLabel(mylang), p.expandhiero(frame, idv)) 
						end
					end
				else 
					rows = rows .. format2rowline("Name", p.expandhiero(frame, idv)) 
				end
			end
	end	
	return 	rows	
end

function p.urn(frame)
	local qid = mw.text.trim(frame.args.qid or "")
	local mylang = frame:preprocess('{{int:lang}}')
	local entity = mw.wikibase.getEntityObject(qid)
	if not entity then
		return ''
	end
	local urn = ""
	return urn
	--- return "<div style='display:none'>" .. urn .. "</span>"
end

function p.numberInfo(frame)
		-- from additions by Jura1
		-- tests at  Category:987_(number)   Category:8_(number)
		local qid = mw.text.trim(frame.args.qid or "")
		local mylang = frame:preprocess('{{int:lang}}')
		local rows = ""
		local checkentry = mw.wikibase.isValidEntityId(qid)
		if not checkentry then
			return ''
		end
		local entity = mw.wikibase.getEntityObject(qid)
		if not entity then
			return ''
		end
		if entity.claims.P487 then
			for _, v in ipairs(entity.claims.P487) do
				local idv = v.mainsnak.datavalue.value 
				if v.qualifiers and v.qualifiers.P3831 then
					for _, w in ipairs(v.qualifiers.P3831) do
						if w.snaktype == "value" then
							local qualid = w.datavalue.value["id"]
							local encod = mw.wikibase.getEntityObject(qualid)
							rows = rows .. format1rowline(qualid,  encod:getLabel(mylang) , idv)
						end
					end
				end
			end
		end
		-- use code/encoding and render as encoding/code
		if entity.claims.P3295 then
			for _, v in ipairs(entity.claims.P3295) do
				local idv = v.mainsnak.datavalue.value
				local commonsc = ""
				if v.qualifiers and v.qualifiers.P805 then
					for _, t in ipairs(v.qualifiers.P805) do
						if t.snaktype == "value" then
							local subjectframe = {}
							subjectframe.args = {}
							subjectframe.args.qid = t.datavalue.value["id"]
							commonsc = WikidataIB.getCommonsLink( subjectframe )
						end
					end
				end
				if v.qualifiers and v.qualifiers.P3294 then
					for _, w in ipairs(v.qualifiers.P3294) do
						if w.snaktype == "value" then
							local qualid = w.datavalue.value["id"]
							local encod = mw.wikibase.getEntityObject(qualid)
							local encodeframe = {}
							local encodecommons = ""
							encodeframe.args = {}
							encodeframe.args.qid = qualid
							encodecommons = WikidataIB.getCommonsLink( encodeframe ) or ""
                   			if encodecommons == "" then
                   				encodecommons = encod:getLabel(mylang)
                   			else 
                   				encodecommons = "[[:" .. encodecommons .. "|" .. encod:getLabel(mylang) .. "]]"
                   			end

							if qualid == "Q68101340" then
								idv = p.expandhiero(frame, idv)
							elseif commonsc ~= "" then
								idv = "[[:" .. commonsc .. "|" .. idv .. "]]"
							end
							rows = rows .. format1rowline(qualid,  encodecommons , idv)
						end
					end
				end
			end
		end
		if entity.claims.P7415 then
			for _, v in ipairs(entity.claims.P7415) do
				local idv = v.mainsnak.datavalue.value
				if v.qualifiers and v.qualifiers.P3294 then
					for _, w in ipairs(v.qualifiers.P3294) do
						if w.snaktype == "value" then
							local qualid = w.datavalue.value["id"]
							local encod = mw.wikibase.getEntityObject(qualid)
							rows = rows .. format1rowline(qualid,  encod:getLabel(mylang) , '[[File:' .. idv .. '|none|35px|'.. entity:getLabel(mylang) .. ' (' .. encod:getLabel(mylang) ..')]]')
						end
					end
				end
			end
		end		
		return rows
		-- return '<table class="wikitable"><tr><th>Encoding </th><td>code</td></tr>' .. rows ..'</table>'
	end


return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.