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.
- 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:
- 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.
- 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.
- 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.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.