Modhul:Wikidata: Béda antara owahan

Konten dihapus Konten ditambahkan
anyari
Tenger: Dibalèkaké
c Besutané Bennylin (rembugan) dipulihaké ing révisi pungkasan garapané Amir Sarabadani (WMDE)
Tenger: Pambalèkan Dibalèkaké
Larik 1:
-- vim: set noexpandtab ft=lua ts=4 sw=4:
-- version 20190319 from master @cawiki
require('Module:No globals')
 
local p = {}
local debug = false
 
 
-----------------------------------------------------------------------------
------------------------------------------------------------------------------
-- internationalisation at [[Module:Wikidata/i18n]]
-- module local i18nvariables =and {functions
 
["errors"] = {
local wiki =
{
langcode = mw.language.getContentLanguage().code
}
 
-- internationalisation
local i18n =
{
["errors"] =
{
["property-not-found"] = "Property not found.",
["entity-not-found"] = "Wikidata entity not found.",
Baris 14 ⟶ 26:
["site-not-found"] = "Wikimedia project not found.",
["unknown-datetime-format"] = "Unknown datetime format.",
["local-article-not-found"] = "Article is not yet available in this wiki.",
['not-from-content-page'] = "Do not invoke from content page. Use a template or use a module subpage like /sandbox for testing ."
},
["datetime"] =
Baris 24 ⟶ 35:
[2] = "$10 million years", -- precision: ten million years
[3] = "$1 million years", -- precision: million years
[4] = "$100000100,000 years", -- precision: hundred thousand years; thousand separators added afterwards
[5] = "$1000010,000 years", -- precision: ten thousand years; thousand separators added afterwards
[6] = "$1 millennium", -- precision: millennium
[7] = "$1 century", -- precision: century
[8] = "$1s", -- precision: decade
-- the following use the format of #time parser function
[9] = "Y", -- precision: year,
[10] = "F Y", -- precision: month
[11] = "F j, Y", -- precision: day
Baris 36 ⟶ 47:
[13] = "F j, Y g:ia", -- precision: minute
[14] = "F j, Y g:i:sa", -- precision: second
["beforenow"] = "$1 BCE", -- how to format negative numbers for precisions 0 to 5
["afternow"] = "$1 CE", -- how to format positive numbers for precisions 0 to 5
["bc"] = '$1 "BCE"', -- how print negative years
["ad"] = "$1", -- how print positive years
-- the following are for function getDateValue() and getQualifierDateValue()
["bc-addon"] = " BC", -- suffix for negative dates
["addefault-addonformat"] = "dmy" , -- suffixdefault value forof 1stthe century#3 AD(getDateValue) datesor
-- #4 (getQualifierDateValue) argument
["default-addon"] = "BC", -- default value of the #4 (getDateValue) or
-- #5 (getQualifierDateValue) argument
["prefix-addon"] = false, -- set to true for languages put "BC" in front of the
-- datetime string; or the addon will be suffixed
["addon-sep"] = " ", -- separator between datetime string and addon (or inverse)
["format"] = -- options of the 3rd argument
{
["mdy"] = "F j, Y",
["my"] = "F Y",
["y"] = "Y",
["dmy"] = "j F Y",
["ymd"] = "Y-m-d",
["ym"] = "Y-m"
}
},
["monolingualtext"] = '<span lang="%language">%text</span>',
["warnDump"] = "[[Category:Called function 'Dump' from module Wikidata]]",
["ordinal"] =
["cite"] = { -- Cite web parameters
{
["url"] = "url",
["title"1] = "titlest",
["website"2] = "websitend",
["access-date"3] = "access-daterd",
["archive-urldefault"] = "archive-urlth",
["archive-date"] = "archive-date",
["author"] = "author",
["publisher"] = "publisher",
["quote"] = "quote",
["language"] = "language",
["date"] = "date",
["pages"] = "pages"
}
}
 
local cases = {} -- functions for local grammatical cases defined at [[Module:Wikidata/i18n]]
 
local wiki =
{
langcode = mw.language.getContentLanguage().code,
module_title = "Module:Wikidata",
module_planetsData = "Module:Mapa cos celeste/dades" -- data for astronomical objects, maps for non Earth globes
}
 
----------------------------------------------------------------------------
-- module local functions
 
-- Credit to http://stackoverflow.com/a/1283608/2644759
Baris 92 ⟶ 98:
 
local function loadI18n()
local exist, res = pcall(require, wiki.module_title .. "Module:Wikidata/i18n")
if exist and next(res) ~= nil then
tableMerge(i18n, res.i18n)
cases = res.cases
end
end
Baris 101 ⟶ 106:
loadI18n()
 
-- this function needs to be internationalised along with the above:
local function case(word, localcase, lang)
-- takes cardinal numer as a numeric and returns the ordinal as a string
if word == nil or word == '' or cases[localcase] == nil then
-- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc.
return word
local function makeOrdinal (cardinal)
local ordsuffix = i18n.ordinal.default
if cardinal % 10 == 1 then
ordsuffix = i18n.ordinal[1]
elseif cardinal % 10 == 2 then
ordsuffix = i18n.ordinal[2]
elseif cardinal % 10 == 3 then
ordsuffix = i18n.ordinal[3]
end
-- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th'
-- similarly for 12 and 13, etc.
return cases[localcase](word, lang)
if (cardinal % 100 == 11) or (cardinal % 100 == 12) or (cardinal % 100 == 13) then
end
ordsuffix = i18n.ordinal.default
 
local function findLang(langcode)
if langcode == nil or langcode == "" or mw.language.isKnownLanguageTag(langcode) == false then
local myframe = mw.getCurrentFrame()
langcode = myframe.args.lang
if langcode == nil or langcode == "" or mw.language.isKnownLanguageTag(langcode) == false then
langcode = myframe:getParent().args.lang
if langcode == nil or langcode == "" or mw.language.isKnownLanguageTag(langcode) == false then
if not mw.title.getCurrentTitle().isContentPage then
langcode = myframe:preprocess( '{{int:lang}}' )
end
if langcode == nil or langcode == "" or mw.language.isKnownLanguageTag(langcode) == false then
langcode = wiki.langcode
end
end
end
end
return tostring(cardinal) .. ordsuffix
local languages = mw.language.getFallbacksFor(langcode)
table.insert(languages, 1, langcode)
return languages
end
 
local function printError(code)
-- mw.wikibase.getLabelWithLang or getLabelByLang with a table of languages
return '<span class="error">' .. (i18n.errors[code] or code) .. '</span>'
local function getLabelByLangs(id, languages)
local label
local lang = languages[1]
if lang == wiki.langcode then
-- using getLabelWithLang when possible instead of getLabelByLang
label, lang = mw.wikibase.getLabelWithLang(id)
else
for _, l in ipairs(languages) do
label = mw.wikibase.getLabelByLang(id, l)
lang = l
if label then
break
end
end
end
return label, lang
end
 
local function parseDateValue(timestamp, date_format, date_addon)
-- Is gender femenine? true or false
local prefix_addon = i18n["datetime"]["prefix-addon"]
local function feminineGender(id)
local addon_sep = i18n["datetime"]["addon-sep"]
local claims = mw.wikibase.getBestStatements(id or mw.wikibase.getEntityIdForCurrentPage(),'P21')
iflocal #claimsaddon == 0 then""
return false
else
local genderId = claims[1].mainsnak.datavalue.value.id
if genderId == "Q6581072" or genderId == "Q1052281" or genderId == "Q43445" then -- female, transgender female, female organism
return true
end
end
return false
end
 
-- check for negative date
-- Fetch female form of label
if string.sub(timestamp, 1, 1) == '-' then
local function feminineForm(id, lang)
timestamp = '+' .. string.sub(timestamp, 2)
local feminine_claims = mw.wikibase.getBestStatements(id, 'P2521') -- female form of label
addon = date_addon
for _, feminine_claim in ipairs(feminine_claims) do
if feminine_claim.mainsnak.datavalue.value.language == lang then
return feminine_claim.mainsnak.datavalue.value.text
end
end
local function d(f)
end
local year_suffix
 
local tstr = ""
-- Fetch unit symbol
local lang_obj = mw.language.new(wiki.langcode)
local function unitSymbol(id, lang)
local claimsf_parts = findClaims(mw.wikibasetext.getEntitysplit(id)f, 'P5061Y', true)
for idx, f_part in pairs(f_parts) do
local langclaims = {}
year_suffix = ''
if claims then
if string.match(f_part, "x[mijkot]$") then
for _, snak in ipairs(claims) do
-- for non-Gregorian year
if snak.mainsnak and snak.mainsnak.datavalue and snak.mainsnak.datavalue.value and
f_part = f_part .. 'Y'
not langclaims[snak.mainsnak.datavalue.value.language] -- just the first one by language
elseif idx < #f_parts then
-- supress leading zeros in year
langclaims[snak.mainsnak.datavalue.value.language] = snak.mainsnak.datavalue.value.text
year_suffix = lang_obj:formatDate('Y', timestamp)
year_suffix = string.gsub(year_suffix, '^0+', '', 1)
end
tstr = tstr .. lang_obj:formatDate(f_part, timestamp) .. year_suffix
end
if addon ~= "" and prefix_addon then
for _, l in ipairs(lang) do
return addon .. addon_sep .. tstr
if langclaims[l] then
elseif addon ~= "" then
return langclaims[l]
return tstr .. addon_sep .. addon
end
end
end
return langclaims["mul"] -- last try
end
 
-- Add a small pencil as icon for edit on Wikidata
local function addEditIcon(id, lang, uselang, icon)
if icon and lang ~= uselang then
return " [[File:Arbcom ru editing.svg|12px|" .. mw.message.new('Translate-taction-translate'):inLanguage(uselang):plain() .. "|link=d:" .. id .. "]]"
end
return ''
end
 
local function urlEscapes(text)
-- escape URL escapes to avoid Lua captures
return mw.ustring.gsub(text, "(%%%d)", "%%%1")
end
 
local function expandBraces(text, formatting)
if text == nil or formatting == nil then return text end
-- only expand braces if provided in argument, not included in value as in Q1164668
if mw.ustring.find(formatting, '{{', 1, true) == nil then return text end
if type(text) ~= "string" then
text = tostring(text)
end
for braces in mw.ustring.gmatch(text, "{{(.-)}}") do
local parts = mw.text.split(braces, "|")
local title_part = parts[1]
local parameters = {}
for i = 2, #parts do
if mw.ustring.find(parts[i], "=") then
local subparts = mw.text.split(parts[i], "=")
parameters[subparts[1]] = subparts[2]
else
table.insert(parameters, parts[i])
end
end
local braces_expanded
if mw.ustring.find(title_part, ":")
and mw.text.split(title_part, ":")[1] ~= mw.site.namespaces[10].name -- not a prefix Template:
then
braces_expanded = mw.getCurrentFrame():callParserFunction{name=title_part, args=parameters}
else
return tstr
braces_expanded = mw.getCurrentFrame():expandTemplate{title=title_part, args=parameters}
end
braces = mw.ustring.gsub(braces, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1") -- escape magic characters
braces_expanded = urlEscapes(braces_expanded)
text = mw.ustring.gsub(text, "{{" .. braces .. "}}", braces_expanded)
end
local _date_format = i18n["datetime"]["format"][date_format]
if _date_format ~= nil then
return text
return d(_date_format)
end
 
local function printDatatypeMath(data)
return mw.getCurrentFrame():callParserFunction('#tag:math', data)
end
 
local function printDatavalueString(data, parameters)
if parameters.formatting == 'weblink' then
return '[' .. data .. ' ' .. mw.text.split(data, '//' )[2] .. ']'
elseif mw.ustring.find((parameters.formatting or ''), '$1', 1, true) then -- formatting = a pattern
--local escaped_data = mw.ustring.gsub(data, "%%", "%%%") -- escape % character, normally used in url, avoiding invalid capture in gsub
-- done in expandBraces
return expandBraces(mw.ustring.gsub(parameters.formatting, '$1', data), parameters.formatting)
elseif parameters.case then
return case(data, parameters.case, parameters.lang[1])
else
return printError("unknown-datetime-format")
return data
end
end
 
-- This local function combines the year/month/day/BC/BCE handling of parseDateValue{}
local function printDatavalueUrl(data, parameters)
-- with the millennium/century/decade handling of formatDate()
-- escape URL escapes to avoid Lua captures
local function parseDateFull(timestamp, precision, date_format, date_addon)
return printDatavalueString(urlEscapes(data), parameters)
local prefix_addon = i18n["datetime"]["prefix-addon"]
end
local addon_sep = i18n["datetime"]["addon-sep"]
local addon = ""
local function printDatavalueCoordinate(data, parameter)
if parameter == 'latitude' then
return data.latitude
elseif parameter == 'longitude' then
return data.longitude
elseif parameter == 'dimension' then
return data.dimension
else --default formatting='globe'
if data.globe == '' or data.globe == nil or data.globe == 'http://www.wikidata.org/entity/Q2' then
return 'earth'
else
local globenum = mw.text.split(data.globe, 'entity/')[2] -- http://www.wikidata.org/wiki/Q2
if pcall(require, wiki.module_planetsData) then
local globetable = mw.loadData(wiki.module_planetsData)
for _, globe in pairs(globetable.maps) do
if globe.wikidata == globenum then
return globe.coord_globe
end
end
end
return globenum
end
end
end
 
-- check for negative date
local function printDatavalueQuantity(data, parameters)
-- exemples: 277±1 Centímetre, 1,94 metre
local amount = data.amount
amount = mw.ustring.gsub(amount, "%+", "")
local sortkey = string.format("%09d", amount)
amount = mw.language.new(parameters.lang[1]):formatNum(tonumber(amount))
-- This is used to get the unit name for a numeric value
local suffix = ""
if parameters.formatting == "unit" or parameters.formatting == "unitcode" then
-- get the url for the unit entry on Wikidata:
local unitID = data.unit
-- and just return the last bit from "Q" to the end (which is the QID):
unitID = mw.ustring.sub(unitID, mw.ustring.find(unitID, "Q"), -1)
if mw.ustring.sub(unitID, 1, 1) == "Q" then
if parameters.formatting == "unitcode" then
local unit_symbol = ''
if parameters.lang[1] == wiki.langcode and pcall(require, wiki.module_title .. "/Units") then
unit_symbol = require(wiki.module_title .. "/Units").getUnit(amount, '', unitID, true, '')
end
if unit_symbol == '' then
unit_symbol = unitSymbol(unitID, parameters.lang)
if not unit_symbol then
local unit_label, lang = getLabelByLangs(unitID, parameters.lang)
unit_symbol = unit_label .. addEditIcon(unitID, lang, parameters.lang[1], parameters.editicon)
end
end
suffix = " " .. unit_symbol
else
local unit_label, lang = getLabelByLangs(unitID, parameters.lang)
if lang == wiki.langcode and pcall(require, wiki.module_title .. "/Units") then
suffix = " " .. require(wiki.module_title .. "/Units").getUnit(amount, unit_label, unitID, false, '')
else
suffix = " " .. (unit_label or unitID) .. addEditIcon(unitID, lang, parameters.lang[1], parameters.editicon)
end
end
end
end
return amount .. suffix, sortkey
end
 
local function printDatavalueTime(data, parameters)
-- Dates and times are stored in ISO 8601 format
local timestamp = data.time
local sortkey = timestamp
local addon = ""
local calendar_add = ""
-- check for negative date, ex. "-0027-01-16T00:00:00Z"
if string.sub(timestamp, 1, 1) == '-' then
timestamp = '+' .. string.sub(timestamp, 2)
addon = i18n.datetime["bc-addon"]date_addon
elseif string.sub(timestamp, 2, 3) == '00' then
addon = i18n.datetime["ad-addon"]
else
-- calendar model
local calendar_model = {["Q12138"] = "gregorian", ["Q1985727"] = "gregorian", ["Q11184"] = "julian", ["Q1985786"] = "julian"}
local calendar_id = mw.text.split(data.calendarmodel, 'entity/')[2]
if (timestamp < "+1582-10-15T00:00:00Z" and calendar_model[calendar_id] == "gregorian")
or (timestamp > "+1582-10-04T00:00:00Z" and calendar_model[calendar_id] == "julian")
then
calendar_add = " <sup>(" .. mw.message.new('Wikibase-time-calendar-' .. calendar_model[calendar_id]):inLanguage(parameters.lang[1]):plain() .. ")</sup>"
end
end
 
local function d(f, t)
-- get the next four characters after the + (should be the year now in all cases)
local ts = t or timestamp
-- ok, so this is dirty, but let's get it working first
local form = type(f) == "function" and f(ts) or f -- function in i18n.datetime[precision]
local intyear = tonumber(string.sub(timestamp, 2, 5))
return mw.language.new(parameters.lang[1]):formatDate(form, ts) .. addon .. calendar_add
if intyear == 0 and precision <= 9 then
return ""
end
 
local precision = data.precision or 11
local intyear = tonumber(mw.ustring.match(timestamp, "^\+?%d+"))
local ret = ""
-- precision is 10000 years or more
if precision <= 5 then
Baris 369 ⟶ 198:
local y2 = math.ceil(math.abs(intyear) / factor)
local relative = mw.ustring.gsub(i18n.datetime[precision], "$1", tostring(y2))
if addon =~= i18n.datetime["bc-addon"] then
-- negative date
retrelative = mw.ustring.gsub(i18n.datetime.beforenow, "$1", relative)
else
retrelative = mw.ustring.gsub(i18n.datetime.afternow, "$1", relative)
end
return relative
local ret_number = string.match(ret, "%d+")
if ret_number ~= nil then
ret = mw.ustring.gsub(ret, ret_number, mw.language.new(parameters.lang[1]):formatNum(tonumber(ret_number)))
end
-- precision is millennia, centuries or decades
elseif precision == 6 then
local card = math.floor((intyear - 1) / 1000) + 1
if mw.ustring.find(i18n.datetime[6], "$1") then
ret = mw.ustring.gsub(i18n.datetime[6], "$1", tostring(card)) .. addon .. calendar_add
else
ret = d(i18n.datetime[6], string.format("%04d", tostring(card)))
end
elseif precision == 7 then
local card = math.floor((math.abs(intyear) - 1) / 100) + 1
if mw.ustring.find(i18n.datetime[7], "$1") then
ret = mw.ustring.gsub(i18n.datetime[7], "$1", tostring(card)) .. addon .. calendar_add
else
ret = d(i18n.datetime[7], string.format("%04d", tostring(card)))
end
elseif precision == 8 then
local card = math.floor(math.abs(intyear) / 10) * 10
ret = mw.ustring.gsub(i18n.datetime[8], "$1", tostring(card)) .. addon .. calendar_add
-- precision is year
elseif parameters.formatting == 'Y' or precision == 9 then
ret = tostring(intyear) .. addon .. calendar_add
-- precision is month
elseif precision == 10 then
timestamp = timestamp .. " + 1 day" -- formatDate yyyy-mm-00 returns the previous month
ret, _ = string.gsub(d(i18n.datetime[10]), " 0+", " ") -- supress leading zeros in year
elseif parameters.formatting then
ret, _ = string.gsub(d(parameters.formatting), "([ %[])0+", "%1") -- supress leading zeros in year optionally linked
else
ret, _ = string.gsub(d(i18n.datetime[11]), " 0+", " ")
end
return ret, sortkey
end
 
-- precision is decades (8), centuries (7) and millennia (6)
local function printDatavalueEntity(data, parameters)
local entityIdera, = data['id']card
if precision == 6 then
local entityIdPreffix = data['entity-type'] == 'property' and "Property:" .. entityId or entityId
card = math.floor((intyear - 1) / 1000) + 1
if parameters.formatting == 'raw' then
era = mw.ustring.gsub(i18n.datetime[6], "$1", makeOrdinal(card))
return entityId, entityId
end
if precision == 7 then
local label, lang = getLabelByLangs(entityId, parameters.lang)
card = math.floor((intyear - 1) / 100) + 1
local sitelink = mw.wikibase.getSitelink(entityId)
era = mw.ustring.gsub(i18n.datetime[7], "$1", makeOrdinal(card))
local parameter = parameters.formatting
local labelcase = label or sitelink
if parameters.gender == 'feminineform' and lang ~= nil then -- case gender and item is female
labelcase = feminineForm(entityId, lang) or labelcase
end
if parameters.caseprecision == 8 then
era = mw.ustring.gsub(i18n.datetime[8], "$1", tostring(math.floor(math.abs(intyear) / 10) * 10))
labelcase = case(labelcase, parameters.case, lang)
end
if era then
local ret1, ret2
if parameteraddon =~= 'label'"" then
era = mw.ustring.gsub(mw.ustring.gsub(i18n.datetime.bc, '"', ""), "$1", era)
ret1 = (labelcase or entityId)
else
ret2 = labelcase or entityId
era = mw.ustring.gsub(mw.ustring.gsub(i18n.datetime.ad, '"', ""), "$1", era)
elseif parameter == 'sitelink' then
end
ret1 = (sitelink or 'wikidata:' .. entityIdPreffix)
return era
ret2 = sitelink or entityId
end
elseif mw.ustring.find((parameter or ''), '$1', 1, true) then -- formatting = a pattern
 
ret1 = mw.ustring.gsub(parameter, '$1', labelcase or entityId)
local _date_format = i18n["datetime"]["format"][date_format]
ret1 = expandBraces(ret1, parameter)
if _date_format ~= nil then
ret2 = labelcase or entityId
-- check for precision is year and override supplied date_format
else
if parameterprecision == "ucfirst" or parameter == "ucinternallink"9 then
_date_format = i18n["datetime"][9]
labelcase = labelcase and mw.language.new(lang):ucfirst(labelcase)
end
-- only first of a list, reset formatting for next ones
local year_suffix
if parameter == "ucinterlanllink" then
local tstr = ""
parameters.formatting = 'internallink'
local lang_obj = mw.language.new(wiki.langcode)
else
local f_parts = mw.text.split(_date_format, 'Y', true)
parameters.formatting = nil -- default format
for idx, f_part in pairs(f_parts) do
year_suffix = ''
if string.match(f_part, "x[mijkot]$") then
-- for non-Gregorian year
f_part = f_part .. 'Y'
elseif idx < #f_parts then
-- supress leading zeros in year
year_suffix = lang_obj:formatDate('Y', timestamp)
year_suffix = string.gsub(year_suffix, '^0+', '', 1)
end
tstr = tstr .. lang_obj:formatDate(f_part, timestamp) .. year_suffix
end
local fdate
if sitelinkaddon ~= "" and prefix_addon then
ret1fdate = '[['addon .. sitelinkaddon_sep .. '|' .. labelcase .. ']]'tstr
elseif addon ~= "" then
ret2 = labelcase
fdate = tstr .. addon_sep .. addon
elseif label and (parameter == 'internallink' or parameter == 'ucinternallink') then
ret1 = '[[' .. label .. '|' .. labelcase .. ']]'
ret2 = labelcase
else
fdate = tstr
ret1 = '[[wikidata:' .. entityIdPreffix .. '|' .. (labelcase or entityId) .. ']]'
ret2 = labelcase or entityId
end
end
return ret1 .. addEditIcon(entityIdPreffix, lang, parameters.lang[1], parameters.editicon), ret2
end
 
return fdate
local function printDatavalueMonolingualText(data, parameters)
else
-- data fields: language [string], text [string]
return printError("unknown-datetime-format")
if parameters.list == "lang" and data["language"] ~= parameters.lang[1] then
return
elseif parameters.formatting == "language" or parameters.formatting == "text" then
return data[parameters.formatting]
end
local result = data["text"]
if data["language"] ~= wiki.langcode then
result = mw.ustring.gsub(mw.ustring.gsub(i18n.monolingualtext, "%%language", data["language"]), "%%text", data["text"])
end
if mw.ustring.find((parameters.formatting or ''), '$', 1, true) then
-- output format defined with $text, $language
result = mw.ustring.gsub(parameters.formatting, '$text', result)
result = mw.ustring.gsub(result, '$language', data["language"])
end
return result
end
 
local function printError(key)
return '<span class="error">' .. i18n.errors[key] .. '</span>'
end
 
Baris 505 ⟶ 282:
end
 
-- precision: 0 - billion years, 1 - hundred million years, ..., 6 - millennia, 7 - century, 8 - decade, 9 - year, 10 - month, 11 - day, 12 - hour, 13 - minute, 14 - second
function findClaims(entity, property)
local function normalizeDate(date)
date = mw.text.trim(date, "+")
-- extract year
local yearstr = mw.ustring.match(date, "^\-?%d+")
local year = tonumber(yearstr)
-- remove leading zeros of year
return year .. mw.ustring.sub(date, #yearstr + 1), year
end
 
local function formatDate(date, precision, timezone)
precision = precision or 11
local date, year = normalizeDate(date)
if year == 0 and precision <= 9 then return "" end
 
-- precision is 10000 years or more
if precision <= 5 then
local factor = 10 ^ ((5 - precision) + 4)
local y2 = math.ceil(math.abs(year) / factor)
local relative = mw.ustring.gsub(i18n.datetime[precision], "$1", tostring(y2))
if year < 0 then
relative = mw.ustring.gsub(i18n.datetime.beforenow, "$1", relative)
else
relative = mw.ustring.gsub(i18n.datetime.afternow, "$1", relative)
end
return relative
end
 
-- precision is decades, centuries and millennia
local era
if precision == 6 then era = mw.ustring.gsub(i18n.datetime[6], "$1", tostring(math.floor((math.abs(year) - 1) / 1000) + 1)) end
if precision == 7 then era = mw.ustring.gsub(i18n.datetime[7], "$1", tostring(math.floor((math.abs(year) - 1) / 100) + 1)) end
if precision == 8 then era = mw.ustring.gsub(i18n.datetime[8], "$1", tostring(math.floor(math.abs(year) / 10) * 10)) end
if era then
if year < 0 then era = mw.ustring.gsub(mw.ustring.gsub(i18n.datetime.bc, '"', ""), "$1", era)
elseif year > 0 then era = mw.ustring.gsub(mw.ustring.gsub(i18n.datetime.ad, '"', ""), "$1", era) end
return era
end
 
-- precision is year
if precision == 9 then
return year
end
 
-- precision is less than years
if precision > 9 then
--[[ the following code replaces the UTC suffix with the given negated timezone to convert the global time to the given local time
timezone = tonumber(timezone)
if timezone and timezone ~= 0 then
timezone = -timezone
timezone = string.format("%.2d%.2d", timezone / 60, timezone % 60)
if timezone[1] ~= '-' then timezone = "+" .. timezone end
date = mw.text.trim(date, "Z") .. " " .. timezone
end
]]--
 
local formatstr = i18n.datetime[precision]
if year == 0 then formatstr = mw.ustring.gsub(formatstr, i18n.datetime[9], "")
elseif year < 0 then
-- Mediawiki formatDate doesn't support negative years
date = mw.ustring.sub(date, 2)
formatstr = mw.ustring.gsub(formatstr, i18n.datetime[9], mw.ustring.gsub(i18n.datetime.bc, "$1", i18n.datetime[9]))
elseif year > 0 and i18n.datetime.ad ~= "$1" then
formatstr = mw.ustring.gsub(formatstr, i18n.datetime[9], mw.ustring.gsub(i18n.datetime.ad, "$1", i18n.datetime[9]))
end
return mw.language.new(wiki.langcode):formatDate(formatstr, date)
end
end
 
local function printDatavalueEntity(data, parameter)
-- data fields: entity-type [string], numeric-id [int, Wikidata id]
local id
 
if data["entity-type"] == "item" then id = "Q" .. data["numeric-id"]
elseif data["entity-type"] == "property" then id = "P" .. data["numeric-id"]
else return printError("unknown-entity-type")
end
 
if parameter then
if parameter == "link" then
local linkTarget = mw.wikibase.sitelink(id)
local linkName = mw.wikibase.label(id)
if linkTarget then
-- if there is a local Wikipedia article link to it using the label or the article title
return "[[" .. linkTarget .. "|" .. (linkName or linkTarget) .. "]]"
else
-- if there is no local Wikipedia article output the label or link to the Wikidata object to let the user input a proper label
if linkName then return linkName else return "[[:d:" .. id .. "|" .. id .. "]]" end
end
else
return data[parameter]
end
else
return mw.wikibase.label(id) or id
end
end
 
local function printDatavalueTime(data, parameter)
-- data fields: time [ISO 8601 time], timezone [int in minutes], before [int], after [int], precision [int], calendarmodel [wikidata URI]
-- precision: 0 - billion years, 1 - hundred million years, ..., 6 - millennia, 7 - century, 8 - decade, 9 - year, 10 - month, 11 - day, 12 - hour, 13 - minute, 14 - second
-- calendarmodel: e.g. http://www.wikidata.org/entity/Q1985727 for the proleptic Gregorian calendar or http://www.wikidata.org/wiki/Q11184 for the Julian calendar]
if parameter then
if parameter == "calendarmodel" then data.calendarmodel = mw.ustring.match(data.calendarmodel, "Q%d+") -- extract entity id from the calendar model URI
elseif parameter == "time" then data.time = normalizeDate(data.time) end
return data[parameter]
else
return formatDate(data.time, data.precision, data.timezone)
end
end
 
local function printDatavalueMonolingualText(data, parameter)
-- data fields: language [string], text [string]
if parameter then
return data[parameter]
else
local result = mw.ustring.gsub(mw.ustring.gsub(i18n.monolingualtext, "%%language", data["language"]), "%%text", data["text"])
return result
end
end
 
local function findClaims(entity, property)
if not property or not entity or not entity.claims then return end
 
if not mw.ustring.match(property, "^P%d+$") then
-- getif the property is given by an id for(P..) access the givenclaim labellist by this id
return entity.claims[property]
else
property = mw.wikibase.resolvePropertyId(property)
if not property then return end
 
return entity.claims[property]
end
return entity.claims[property]
end
 
local function getSnakValue(snak, parametersparameter)
if snak.snaktype == '"value'" then
-- call the respective snak parser
if snak.datatypedatavalue.type == 'math'"string" then return snak.datavalue.value
elseif snak.datavalue.type == "globecoordinate" then return printDatatypeMathprintDatavalueCoordinate(snak.datavalue.value, parameter)
elseif snak.datatypedatavalue.type == "urlquantity" then return printDatavalueQuantity(snak.datavalue.value, parameter)
elseif snak.datavalue.type == "time" then return printDatavalueUrlprintDatavalueTime(snak.datavalue.value, parametersparameter)
elseif snak.datavalue.type == "stringwikibase-entityid" then return printDatavalueEntity(snak.datavalue.value, parameter)
elseif snak.datavalue.type == "monolingualtext" then return printDatavalueStringprintDatavalueMonolingualText(snak.datavalue.value, parametersparameter)
elseif snak.datavalue.type == "globecoordinate" then
return printDatavalueCoordinate(snak.datavalue.value, parameters.formatting)
elseif snak.datavalue.type == "quantity" then
return printDatavalueQuantity(snak.datavalue.value, parameters)
elseif snak.datavalue.type == "time" then
return printDatavalueTime(snak.datavalue.value, parameters)
elseif snak.datavalue.type == 'wikibase-entityid' then
return printDatavalueEntity(snak.datavalue.value, parameters)
elseif snak.datavalue.type == 'monolingualtext' then
return printDatavalueMonolingualText(snak.datavalue.value, parameters)
end
elseif snak.snaktype == 'novalue' then
return mw.message.new('Wikibase-snakview-snaktypeselector-novalue'):inLanguage(parameters.lang[1]):plain()
elseif snak.snaktype == 'somevalue' then
return mw.message.new('Wikibase-snakview-snaktypeselector-somevalue'):inLanguage(parameters.lang[1]):plain()
end
return mw.wikibase.renderSnak(snak)
end
 
local function getQualifierSnak(claim, qualifierId, parameters)
-- a "snak" is Wikidata terminology for a typed key/value pair
-- a claim consists of a main snak holding the main information of this claim,
Baris 553 ⟶ 438:
if claim.qualifiers then
local qualifier = claim.qualifiers[qualifierId]
if qualifier then return qualifier[1] end
if qualifier[1].datatype == "monolingualtext" then
-- iterate over monolingualtext qualifiers to get local language
for idx in pairs(qualifier) do
if qualifier[idx].datavalue.value and qualifier[idx].datavalue.value.language == parameters.lang[1] then
return qualifier[idx]
end
end
elseif parameters.list then
return qualifier
else
return qualifier[1]
end
end
end
return nil, printError("qualifier-not-found")
Baris 575 ⟶ 447:
end
 
local function getValueOfClaim(claim, qualifierId, parametersparameter)
local error
local snak
snak, error = getQualifierSnak(claim, qualifierId, parameters)
if not snak then
return nilgetSnakValue(snak, nil, errorparameter)
elseif snak[1] then -- a multi qualifier
local result = {}
local sortkey = {}
for idx in pairs(snak) do
result[#result + 1], sortkey[#sortkey + 1] = getSnakValue(snak[idx], parameters)
end
return mw.text.listToText(result, parameters.qseparator, parameters.qconjunction), sortkey[1]
else -- a property or a qualifier
return getSnakValue(snak, parameters)
end
end
 
local function getValueOfParentClaim(claim, qualifierId, parameters)
local qids = mw.text.split(qualifierId, '/', true)
local valueraw, parent_claims, value, sortkey
if qids[1] == parameters.property then
valueraw, _, _ = getValueOfClaim(claim, nil, {["formatting"]="raw", ["lang"]=parameters.lang})
else
return nil, error
valueraw, _, _ = getValueOfClaim(claim, qids[1], {["formatting"]="raw", ["lang"]=parameters.lang})
end
if string.sub(valueraw or '', 1, 1) == "Q" then -- protection for 'no value'
parent_claims = mw.wikibase.getBestStatements(valueraw, qids[2])
if parent_claims[1] ~= nil then
value, sortkey, _ = getValueOfClaim(parent_claims[1], nil, parameters)
-- raw parent value needed fot while/black lists, lang for avoiding an error on types other than entity
valueraw, _, _ = getValueOfClaim(parent_claims[1], nil, {["formatting"]="raw", ["lang"]=parameters.lang})
end
end
return value, sortkey, valueraw
end
 
local function getReferences(frame, claim)
local refaliases = {
citeWeb = "Q5637226",
author = "P50",
publisher = "P123",
importedFrom = "P143",
statedIn = "P248",
pages = "P304",
publicationDate = "P577",
startTime = "P580",
endTime = "P582",
chapter = "P792",
retrieved = "P813",
referenceURL = "P854",
archiveURL = "P1065",
title = "P1476",
quote = "P1683",
shortName = "P1813",
language = "P2439",
archiveDate = "P2960"
}
local result = ""
-- traverse through all references
for ref in pairs(claim.references or {}) do
local refparts
local refs = {}
-- traverse through all parts of the current reference
for snakkey, snakval in pairsorderedpairs(claim.references[ref].snaks or {}, claim.references[ref]["snaks-order"]) do
if refparts then refparts = refparts .. ", " else refparts = "" end
if snakkey ~= refaliases.importedFrom then -- "imported from" is not a proper reference
-- output the label of the property of the reference part, e.g. "imported from" for P143
for snakidx = 1, #snakval do
if snakidx > 1 then refparts = refparts .. ",tostring(mw.wikibase.label(snakkey)) .. ": end"
-- output all values of this reference part, e.g. "German Wikipedia" and "English Wikipedia" if the referenced claim was imported from both sites
refparts = refparts or '' .. getSnakValue(snakval[snakidx], {lang={wiki.langcode}})
for snakidx = 1, #snakval do
end
refs[snakkey]if snakidx > 1 then refparts = refparts .. ", " end
refparts = nilrefparts .. getSnakValue(snakval[snakidx])
end
end
if refparts then result = result .. frame:extensionTag("ref", refparts) end
-- get title of general template for citing web references
local template = mw.wikibase.getSitelink(refaliases.citeWeb) or ""
template = mw.text.split(template, ":")[2] -- split off namespace from front
-- (1) if both "reference URL" and "title" are present, then use the general template for citing web references
if refs[refaliases.referenceURL] and (refs[refaliases.title] or refs[refaliases.statedIn]) and template then
local citeParams = {}
citeParams[i18n['cite']['url']] = refs[refaliases.referenceURL]
citeParams[i18n['cite']['title']] = refs[refaliases.title] or refs[refaliases.statedIn]:match("^%[%[.-|(.-)%]%]")
citeParams[i18n['cite']['website']] = refs[refaliases.statedIn]
citeParams[i18n['cite']['language']] = refs[refaliases.language]
citeParams[i18n['cite']['date']] = refs[refaliases.publicationDate]
citeParams[i18n['cite']['access-date']] = refs[refaliases.retrieved]
citeParams[i18n['cite']['archive-url']] = refs[refaliases.archiveURL]
citeParams[i18n['cite']['archive-date']] = refs[refaliases.archiveDate]
citeParams[i18n['cite']['publisher']] = refs[refaliases.publisher]
citeParams[i18n['cite']['quote']] = refs[refaliases.quote]
citeParams[i18n['cite']['pages']] = refs[refaliases.pages]
citeParams[i18n['cite']['author']] = refs[refaliases.author]
refparts = mw.getCurrentFrame():expandTemplate{title=template, args=citeParams}
else
-- raw ouput
for k, v in orderedpairs(refs or {}, claim.references[ref]["snaks-order"]) do
if k and v then
if refparts then refparts = refparts .. ", " else refparts = "" end
refparts = refparts .. tostring(mw.wikibase.getLabel(k)) .. ": "
refparts = refparts .. v
end
end
end
if refparts then result = result .. mw.getCurrentFrame():extensionTag("ref", refparts) end
end
return result
end
 
-- Return the site link (for the current site) for a given data item.
function p.getSiteLink(frame)
if frame.args[1] == nil then
entity = mw.wikibase.getEntity()
if not entity then
return nil
end
id = entity.id
else
id = frame.args[1]
end
return mw.wikibase.getSitelink(id)
end
 
------------------------------------------------------------------------------
-- Set whitelist or blacklist values
-- module global functions
local function setWhiteOrBlackList(type_list, num_qual, args)
 
local i = 0
if debug then
local listed = false
function p.inspectI18n(frame)
local list = {}
local val = i18n
while i <= num_qual do
for _, key in pairs(frame.args) do
if args[type_list .. i] and args[type_list .. i] ~= '' then
listedkey = truemw.text.trim(key)
val = val[key]
list[tostring(i)] = {}
local values = mw.text.split(args[type_list .. i], "/", true)
for _, v in ipairs(values) do
list[tostring(i)][v] = true
end
end
return val
i = i + 1
end
return list, listed
end
 
function p.descriptionIn(frame)
-- returns the page id (Q...) of the current page or nothing of the page is not connected to Wikidata
local langcode = frame.args[1]
function p.pageId(frame)
local id = frame.args[2] -- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration
local entity = mw.wikibase.getEntityObject()
-- return description of a Wikidata entity in the given language or the default language of this Wikipedia site
if not entity then return nil else return entity.id end
return mw.wikibase.getEntityObject(id).descriptions[langcode or wiki.langcode].value
end
 
function p.claimlabelIn(frame)
local langcode = frame.args[1]
if mw.title.new(frame:getParent():getTitle()).isContentPage then
local id = frame.args[2] -- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration
if not mw.title.new(frame:getTitle()).isSubpage then
-- return label of a Wikidata entity in the given language or the default language of this Wikipedia site
-- invoked from a content page and not invoking a module subpage
return mw.wikibase.getEntityObject(id).labels[langcode or wiki.langcode].value
return printError("not-from-content-page")
end
 
-- This is used to get a value, or a comma separated list of them if multiple values exist
p.getValue = function(frame)
local propertyID = mw.text.trim(frame.args[1] or "")
local input_parm = mw.text.trim(frame.args[2] or "")
local delim = mw.text.trim(frame.args.delimiter or ", ")
local qid = frame.args.qid
if qid and (#qid == 0) then qid = nil end
if input_parm == "FETCH_WIKIDATA" then
local entity = mw.wikibase.getEntityObject(qid)
local claims
if entity and entity.claims then
claims = entity.claims[propertyID]
end
if claims then
-- if wiki-linked value output as link if possible
if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
local out = {}
for k, v in pairs(claims) do
local sitelink = mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])
local label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
if label == nil then label = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end
 
if sitelink then
out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
else
out[#out + 1] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]<abbr title='" .. i18n["errors"]["local-article-not-found"] .. "'>[*]</abbr>"
end
end
return table.concat(out, delim)
else
-- just return best values
return entity:formatPropertyValues(propertyID).value
end
else
return ""
end
else
return input_parm
end
return p._main(frame.args, frame:getParent().args)
end
 
-- Same as above, but uses the short name property for label if available.
-- Entry point from other modules or debugging, with a list of arguments.
p.getValueShortName = function(frame)
-- From other modules use: require("Module:Wikidata")._main({item="Q...", property="P...", ...})
local propertyID = mw.text.trim(frame.args[1] or "")
-- On debug console use: =p._main({item="Q...", lang="xx", property="P...", ...})
local input_parm = mw.text.trim(frame.args[2] or "")
function p._main(args, pargs)
if input_parm == "FETCH_WIKIDATA" then
--If a value is already set, use it
local entity = mw.wikibase.getEntityObject()
if args.value and args.value ~= '' then
local claims
return args.value
if entity and entity.claims then
end
claims = entity.claims[propertyID]
end
-- arguments
if claims then
local id = args.item or (pargs and pargs.item)
-- if wiki-linked value output as link if possible
if id == nil or id == "" then
if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
id = mw.wikibase.getEntityIdForCurrentPage()
local out = {}
end
for k, v in pairs(claims) do
local languages = findLang(args.lang)
local sitelink = mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])
local itemgender = args["itemgender"]
local idgenderlabel
local claimEntity = mw.wikibase.getEntity("Q" .. v.mainsnak.datavalue.value["numeric-id"])
if itemgender then
if string.match(itemgender,claimEntity "^P%d+$")~= nil then
if claimEntity.claims.P1813 then
local snak = mw.wikibase.getBestStatements(id, itemgender)[1]
for k2, v2 in pairs(claimEntity.claims.P1813) do
if snak and snak.mainsnak and snak.mainsnak.datavalue and snak.mainsnak.datavalue.value then
idgender if = snakv2.mainsnak.datavalue.value.idlanguage == "en" then
label = v2.mainsnak.datavalue.value.text
end
end
end
end
if label == nil or label == "" then label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"]) end
if label == nil then label = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end
 
if sitelink then
out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
else
out[#out + 1] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]<abbr title='" .. i18n["errors"]["local-article-not-found"] .. "'>[*]</abbr>"
end
end
return table.concat(out, ", ")
else
-- just return best vakues
return entity:formatPropertyValues(propertyID).value
end
else
elseif string.match(itemgender, "^Q%d+$") then
return ""
idgender = itemgender
end
else
return input_parm
end
end
local property = string.upper(args["property"] or "")
 
local qualifierId = {}
-- This is used to get a value, or a comma separated list of them if multiple values exist
qualifierId[1] = args["qualifier"] and string.upper(args["qualifier"]) or nil
-- from an arbitrary entry by using its QID.
local i = 2
-- Use : {{#invoke:Wikidata|getValueFromID|<ID>|<Property>|FETCH_WIKIDATA}}
while args["qualifier" .. i] do
-- E.g.: {{#invoke:Wikidata|getValueFromID|Q151973|P26|FETCH_WIKIDATA}} - to fetch value of 'spouse' (P26) from 'Richard Burton' (Q151973)
qualifierId[i] = string.upper(args["qualifier" .. i])
-- Please use sparingly - this is an *expensive call*.
i = i + 1
p.getValueFromID = function(frame)
end
local parameteritemID = mw.text.trim(frame.args["formatting"1] or ''; if parameter == "" then parameter = nil end)
local propertyID = mw.text.trim(frame.args[2] or "")
local case = args.case
local input_parm = mw.text.trim(frame.args[3] or "")
local list = args["list"] or true; if (list == "false" or list == "no") then list = false end
if input_parm == "FETCH_WIKIDATA" then
local sorting_col = args.tablesort
local entity = mw.wikibase.getEntity(itemID)
local sorting_up = (args.sorting or "") ~= "-1"
local claims
local separator = args.separator
if entity and entity.claims then
local conjunction = args.conjunction or args.separator
claims = entity.claims[propertyID]
local rowformat = args.rowformat
end
local references = args["references"]
if claims then
local showerrors = args["showerrors"]
-- if wiki-linked value output as link if possible
local default = args["default"]
if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
local editicon = not (args.editicon == "false" or args.editicon == "no")
local out = {}
for k, v in pairs(claims) do
local parameters = {["property"] = property, ["formatting"] = parameter, ["list"] = list, ["case"] = case,
local sitelink = mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])
["lang"] = languages, ["editicon"] = editicon,
local label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
["separator"] = separator, ["conjunction"] = conjunction, ["qseparator"] = separator, ["qconjunction"] = conjunction}
if label == nil then label = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end
 
-- defaults for table
if sitelink then
local preformat, postformat = "", ""
out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
local whitelisted, blacklisted = false, false
else
local whitelist, blacklist = {}, {}
out[#out + 1] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]<abbr title='" .. i18n["errors"]["local-article-not-found"] .. "'>[*]</abbr>"
if parameters.formatting == "table" then
end
parameters.separator = parameters.separator or "<br />"
end
parameters.conjunction = parameters.conjunction or "<br />"
return table.concat(out, ", ")
parameters.qseparator = ", "
parameters.qconjunction = ", "
if not rowformat then
rowformat = "$0 ($1"
i = 2
while qualifierId[i] do
rowformat = rowformat .. ", $" .. i
i = i + 1
end
rowformat = rowformat .. ")"
elseif mw.ustring.find(rowformat, "^[*#]") then
parameters.separator = "</li><li>"
parameters.conjunction = "</li><li>"
if mw.ustring.match(rowformat, "^[*#]") == "*" then
preformat = "<ul><li>"
postformat = "</li></ul>"
else
return entity:formatPropertyValues(propertyID).value
preformat = "<ol><li>"
postformat = "</li></ol>"
end
else
rowformat = mw.ustring.gsub(rowformat, "^[*#] ?", "")
return ""
end
else
return input_parm
-- set whitelist and blacklist values
whitelist, whitelisted = setWhiteOrBlackList("whitelist", #qualifierId, args)
blacklist, blacklisted = setWhiteOrBlackList("blacklist", #qualifierId, args)
end
end
if default then showerrors = nil end
 
p.getQualifierValue = function(frame)
-- get wikidata entity
local entitypropertyID = mw.wikibasetext.getEntitytrim(idframe.args[1] or "")
local qualifierID = mw.text.trim(frame.args[2] or "")
if not entity then
local input_parm = mw.text.trim(frame.args[3] or "")
if showerrors then return printError("entity-not-found") else return default end
if input_parm == "FETCH_WIKIDATA" then
end
local entity = mw.wikibase.getEntityObject()
-- fetch the first claim of satisfying the given property
if entity.claims[propertyID] ~= nil then
local claims = findClaims(entity, property)
local out = {}
if not claims or not claims[1] then
for k, v in pairs(entity.claims[propertyID]) do
if showerrors then return printError("property-not-found") else return default end
for k2, v2 in pairs(v.qualifiers[qualifierID]) do
end
if v2.snaktype == 'value' then
if (mw.wikibase.sitelink("Q" .. v2.datavalue.value["numeric-id"])) then
-- set feminine case if gender is requested
out[#out + 1] = "[[" .. mw.wikibase.sitelink("Q" .. v2.datavalue.value["numeric-id"]) .. "]]"
local genderCase
else
local genderRequested = false
out[#out + 1] = "[[:d:Q" .. v2.datavalue.value["numeric-id"] .. "|" .. mw.wikibase.label("Q" .. v2.datavalue.value["numeric-id"]) .. "]]<abbr title='" .. i18n["errors"]["local-article-not-found"] .. "'>[*]</abbr>"
if parameters.case == "gender" or idgender then
end
genderRequested = true
end
elseif parameters.formatting == "table" then
if args["case0"] and args["case0"] == "gender" then
genderRequested = true
else
for i, qual in ipairs(qualifierId) do
if args["case" .. i] and args["case" .. i] == "gender" then
genderRequested = true
break
end
end
return table.concat(out, ", ")
else
return ""
end
else
return input_parm
end
end
if genderRequested then
 
if feminineGender(idgender or id) then
-- This is used to get a value like 'male' (for property p21) which won't be linked and numbers without the thousand separators
genderCase = "feminineform"
p.getRawValue = function(frame)
if parameters.case == "gender" or idgender then
local propertyID = mw.text.trim(frame.args[1] or "")
parameters.gender = genderCase
local input_parm = mw.text.trim(frame.args[2] or "")
if input_parm == "FETCH_WIKIDATA" then
local entity = mw.wikibase.getEntityObject()
local claims
if entity and entity.claims then claims = entity.claims[propertyID] end
if claims then
local result = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).value
 
-- if number type: remove thousand separators, bounds and units
if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "quantity") then
result = mw.ustring.gsub(result, "(%d),(%d)", "%1%2")
result = mw.ustring.gsub(result, "(%d)±.*", "%1")
end
return result
else
return ""
end
else
return input_parm
end
end
 
-- get initial sort indices
-- This is used to get the unit name for the numeric value returned by getRawValue
local sortindices = {}
p.getUnits = function(frame)
for idx in pairs(claims) do
local propertyID = mw.text.trim(frame.args[1] or "")
sortindices[#sortindices + 1] = idx
local input_parm = mw.text.trim(frame.args[2] or "")
local qid = frame.args.qid
if qid and (#qid == 0) then qid = nil end
if input_parm == "FETCH_WIKIDATA" then
local entity = mw.wikibase.getEntityObject(qid)
local claims
if entity and entity.claims then claims = entity.claims[propertyID] end
if claims then
local result = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).value
if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "quantity") then
result = mw.ustring.sub(result, mw.ustring.find(result, " ")+1, -1)
end
return result
else
return ""
end
else
return input_parm
end
end
-- sort by claim rank
 
local comparator = function(a, b)
-- This is used to get the unit's QID to use with the numeric value returned by getRawValue
local rankmap = { deprecated = 2, normal = 1, preferred = 0 }
p.getUnitID = function(frame)
local ranka = rankmap[claims[a].rank or "normal"] .. string.format("%08d", a)
local propertyID = mw.text.trim(frame.args[1] or "")
local rankb = rankmap[claims[b].rank or "normal"] .. string.format("%08d", b)
local input_parm = mw.text.trim(frame.args[2] or "")
return ranka < rankb
if input_parm == "FETCH_WIKIDATA" then
end
local entity = mw.wikibase.getEntityObject()
table.sort(sortindices, comparator)
local claims
if entity and entity.claims then claims = entity.claims[propertyID] end
local result
if claims then
local error
local result
if parameters.list or parameters.formatting == "table" then
if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "quantity") then
-- convert LF to line feed, <br /> may not work on some cases
-- get the url for the unit entry on Wikidata:
parameters.separator = parameters.separator == "LF" and "\010" or parameters.separator
result = claims[1].mainsnak.datavalue.value.unit
parameters.conjunction = parameters.conjunction == "LF" and "\010" or parameters.conjunction
-- and just reurn the last bit from "Q" to the end (which is the QID):
-- i18n separators
result = mw.ustring.sub(result, mw.ustring.find(result, "Q"), -1)
parameters.separator = parameters.separator or mw.message.new('Comma-separator'):inLanguage(parameters.lang[1]):plain()
parameters.conjunction = parameters.conjunction or (mw.message.new('And'):inLanguage(parameters.lang[1]):plain() .. mw.message.new('Word-separator'):inLanguage(parameters.lang[1]):plain())
-- iterate over all elements and return their value (if existing)
local value, valueq
local sortkey, sortkeyq
local values = {}
local sortkeys = {}
local refs = {}
local firstrank = parameters.list == "firstrank" and claims[sortindices[1]].rank or ''
local rowlist = {} -- rows to list with whitelist or blacklist
for idx in pairs(claims) do
local claim = claims[sortindices[idx]]
local reference={}
if not whitelisted then rowlist[idx] = true end
if firstrank ~= '' and firstrank ~= claim.rank then
break
end
return result
if parameters.formatting == "table" then
else
local params = mw.clone(parameters)
return ""
params.formatting = args["colformat0"]; if params.formatting == "" then params.formatting = nil end
end
if args["case0"] then
else
if args["case0"] == "gender" then
return input_parm
params.gender = genderCase
end
else
end
params.case = args["case0"]
 
end
p.getRawQualifierValue = function(frame)
end
local propertyID = mw.text.trim(frame.args[1] or "")
value, sortkey, error = getValueOfClaim(claim, nil, params)
local qualifierID = mw.text.trim(frame.args[2] or "")
if value then
local input_parm = mw.text.trim(frame.args[3] or "")
values[#values + 1] = {}
if input_parm == "FETCH_WIKIDATA" then
sortkeys[#sortkeys + 1] = {}
local entity = mw.wikibase.getEntityObject()
refs[#refs + 1] = {}
if whitelistentity.claims["0"propertyID] or~= blacklist["0"]nil then
local out = {}
local valueraw, _, _ = getValueOfClaim(claim, nil, {["formatting"]="raw", ["lang"]=params.lang})
for k, v in pairs(entity.claims[propertyID]) do
if whitelist["0"] and whitelist["0"][valueraw or ""] then
for k2, v2 in pairs(v.qualifiers[qualifierID]) do
rowlist[#values] = true
if v2.snaktype == 'value' then
elseif blacklist["0"] and blacklist["0"][valueraw or ""] then
if v2.datavalue.value["numeric-id"] then
rowlist[#values] = false
out[#out + 1] = mw.wikibase.label("Q" .. v2.datavalue.value["numeric-id"])
end
end
for i, qual in ipairs(qualifierId) do
local j = tostring(i)
params.formatting = args["colformat" .. j]; if params.formatting == "" then params.formatting = nil end
params.case = parameters.case
params.gender = parameters.gender
if args["case" .. j] then
if args["case" .. j] == "gender" then
params.gender = genderCase
else
params.case = args["case" .. j]
end
end
local valueq, sortkeyq, valueraw
if qual == property then -- hack for getting the property with another formatting, i.e. colformat1=raw
valueq, sortkeyq, _ = getValueOfClaim(claim, nil, params)
else
out[#out + 1] = v2.datavalue.value
for q in mw.text.gsplit(qual, '%s*OR%s*') do
if string.find(q, ".+/.+") then
valueq, sortkeyq, valueraw = getValueOfParentClaim(claim, q, params)
elseif string.find(q, "^/.+") then
local claim2 = findClaims(entity, string.sub(q, 2))
if claim2 then
valueq, sortkeyq, _ = getValueOfClaim(claim2[1], nil, params)
end
else
valueq, sortkeyq, _ = getValueOfClaim(claim, q, params)
end
if valueq then break end
end
end
values[#values]["col" .. j] = valueq
sortkeys[#sortkeys]["col" .. j] = sortkeyq or valueq
if whitelist[j] or blacklist[j] then
valueq = valueraw or getValueOfClaim(claim, qual, {["formatting"]="raw", ["lang"]=params.lang})
if whitelist[j] and whitelist[j][valueq or ""] then
rowlist[#values] = true
elseif blacklist[j] and blacklist[j][valueq or ""] then
rowlist[#values] = false
end
end
end
end
else
value, sortkey, error = getValueOfClaim(claim, qualifierId[1], parameters)
values[#values + 1] = {}
sortkeys[#sortkeys + 1] = {}
refs[#refs + 1] = {}
end
if not value and showerrors then value = error end
if value then
if references and claim.references then reference=claim.references end
refs[#refs]["col0"] =reference
values[#values]["col0"] = value
sortkeys[#sortkeys]["col0"] = sortkey or value
end
local ret = table.concat(out, ", ")
return string.upper(string.sub(ret, 1, 1)) .. string.sub(ret, 2)
else
return ""
end
else
-- sort and format results
return input_parm
sortindices = {}
end
for idx in pairs(values) do
end
sortindices[#sortindices + 1] = idx
 
end
-- This is used to get a date value for date_of_birth (P569), etc. which won't be linked
if sorting_col then
-- Dates and times are stored in ISO 8601 format (sort of).
local sorting_table = mw.text.split(sorting_col, '/', true)
-- At present the local formatDate(date, precision, timezone) function doesn't handle timezone
local comparator = function(a, b)
-- So I'll just supply "Z" in the call to formatDate below:
local valuea, valueb
p.getDateValue = function(frame)
local i = 1
local propertyID = mw.text.trim(frame.args[1] or "")
while valuea == valueb and i <= #sorting_table do
local input_parm = mw.text.trim(frame.args[2] or "")
valuea = sortkeys[a]["col" .. sorting_table[i]] or ''
local date_format = mw.text.trim(frame.args[3] or i18n["datetime"]["default-format"])
valueb = sortkeys[b]["col" .. sorting_table[i]] or ''
local date_addon = mw.text.trim(frame.args[4] or i18n["datetime"]["default-addon"])
i = i + 1
if input_parm == "FETCH_WIKIDATA" then
end
local entity = mw.wikibase.getEntityObject()
if sorting_upentity.claims[propertyID] ~= nil then
returnlocal valuebout >= valuea{}
for k, v in pairs(entity.claims[propertyID]) do
if v.mainsnak.datavalue.type == 'time' then
local timestamp = v.mainsnak.datavalue.value.time
local dateprecision = v.mainsnak.datavalue.value.precision
-- A year can be stored like this: "+1872-00-00T00:00:00Z",
-- which is processed here as if it were the day before "+1872-01-01T00:00:00Z",
-- and that's the last day of 1871, so the year is wrong.
-- So fix the month 0, day 0 timestamp to become 1 January instead:
timestamp = timestamp:gsub("%-00%-00T", "-01-01T")
out[#out + 1] = parseDateFull(timestamp, dateprecision, date_format, date_addon)
end
return valueb < valuea
end
return table.sortconcat(sortindicesout, ", comparator")
else
return ""
end
else
result = {}
return input_parm
for idx in pairs(values) do
end
local valuerow = values[sortindices[idx]]
end
local reference = getReferences({["references"] = refs[sortindices[idx]]["col0"]})
 
p.getQualifierDateValue = function(frame)
value = valuerow["col0"]
local propertyID = mw.text.trim(frame.args[1] or "")
if parameters.formatting == "table" then
local qualifierID = mw.text.trim(frame.args[2] or "")
if not rowlist[sortindices[idx]] then
local input_parm = mw.text.trim(frame.args[3] or "")
value = nil
local date_format = mw.text.trim(frame.args[4] or i18n["datetime"]["default-format"])
else
local date_addon = mw.text.trim(frame.args[5] or i18n["datetime"]["default-addon"])
value = mw.ustring.gsub(rowformat .. "$", "$0", value) -- fake end character added for easy gsub
if input_parm == "FETCH_WIKIDATA" then
value = mw.ustring.gsub(value, "$R0", reference) -- add reference
local rowformattingentity = rowformat mw.wikibase. "$"getEntityObject()
if entity.claims[propertyID] ~= nil then
for i, _ in ipairs(qualifierId) do
local valueqout = valuerow["col" .. i]{}
for k, v in pairs(entity.claims[propertyID]) do
if args["rowsubformat" .. i] and valueq then
for k2, v2 in pairs(v.qualifiers[qualifierID]) do
-- add fake end character $
if v2.snaktype == 'value' then
-- gsub $i not followed by a number so $1 doesn't match $10, $11...
local timestamp = v2.datavalue.value.time
-- remove fake end character
out[#out + 1] = parseDateValue(timestamp, date_format, date_addon)
valueq = mw.ustring.gsub(args["rowsubformat" .. i] .. "$", "$" .. i .. "(%D)", valueq .. "%1")
valueq = string.sub(valueq, 1, -2)
rowformatting = mw.ustring.gsub(rowformatting, "$" .. i .. "(%D)", args["rowsubformat" .. i] .. "%1")
end
valueq = valueq and urlEscapes(valueq) or ''
value = mw.ustring.gsub(value, "$" .. i .. "(%D)", valueq .. "%1")
end
value = string.sub(value, 1, -2) -- remove fake end character
value = expandBraces(value, rowformatting)
end
end
return table.concat(out, ", ")
else
return ""
end
else
return input_parm
end
end
 
-- This is used to fetch all of the images with a particular property, e.g. image (P18), Gene Atlas Image (P692), etc.
-- Parameters are | propertyID | value / FETCH_WIKIDATA / nil | separator (default=space) | size (default=frameless)
-- It will return a standard wiki-markup [[File:Filename | size]] for each image with a selectable size and separator (which may be html)
-- e.g. {{#invoke:Wikidata|getImages|P18|FETCH_WIKIDATA}}
-- e.g. {{#invoke:Wikidata|getImages|P18|FETCH_WIKIDATA|<br>|250px}}
-- If a property is chosen that is not of type "commonsMedia", it will return empty text.
p.getImages = function(frame)
local propertyID = mw.text.trim(frame.args[1] or "")
local input_parm = mw.text.trim(frame.args[2] or "")
local sep = mw.text.trim(frame.args[3] or " ")
local imgsize = mw.text.trim(frame.args[4] or "frameless")
if input_parm == "FETCH_WIKIDATA" then
local entity = mw.wikibase.getEntityObject()
local claims
if entity and entity.claims then
claims = entity.claims[propertyID]
end
if claims then
if (claims[1] and claims[1].mainsnak.datatype == "commonsMedia") then
local out = {}
for k, v in pairs(claims) do
local filename = v.mainsnak.datavalue.value
out[#out + 1] = "[[File:" .. filename .. "|" .. imgsize .. "]]"
end
return table.concat(out, sep)
else
return ""
value = expandBraces(value, parameters.formatting)
end
result[#result + 1] = value
if not parameters.list then
break
end
else
return ""
end
result = preformat .. mw.text.listToText(result, parameters.separator, parameters.conjunction) .. postformat
else
-- return first elementinput_parm
local claim = claims[sortindices[1]]
result, _, error = getValueOfClaim(claim, qualifierId[1], parameters)
if result and references then result = result .. getReferences(claim) end
end
if result then return result else
if showerrors then return error else return default end
end
end
Baris 1.055 ⟶ 873:
-- formatPropertyValues returns a table with the P1323 values concatenated with ", " so we have to split them out into a table in order to construct the return string
p.getTAValue = function(frame)
local ent = mw.wikibase.getEntitygetEntityObject()
local props = ent:formatPropertyValues('P1323')
local out = {}
local t = {}
for k, v in pairs(props) do
if k == 'value' then
t = mw.text.split( v, ", ")
for k2, v2 in pairs(t) do
out[#out + 1] = "[http://www.unifr.ch/ifaa/Public/EntryPage/TA98%20Tree/Entity%20TA98%20EN/" .. string.sub(v2, 2) .. "%20Entity%20TA98%20EN.htm " .. v2 .. "]"
end
end
end
end
local ret = table.concat(out, "<br> ")
if #ret == 0 then
ret = "Invalid TA"
end
return ret
end
 
--[[
-- debugging functions, see module ../debug.
This is used to return an image legend from Wikidata
function p.ViewSomething(frame)
image is property P18
return require(wiki.module_title .. "/debug").ViewSomething(frame)
image legend is property P2096
end
 
Call as {{#invoke:Wikidata |getImageLegend | <PARAMETER> | lang=<ISO-639code> |id=<QID>}}
function p.Dump(frame)
Returns PARAMETER, unless it is equal to "FETCH_WIKIDATA", from Item QID (expensive call)
return require(wiki.module_title .. "/debug").Dump(frame)
If QID is omitted or blank, the current article is used (not an expensive call)
end
If lang is omitted, it uses the local wiki language, otherwise it uses the provided ISO-639 language code
ISO-639: https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html#wp1252447
 
Ranks are: 'preferred' > 'normal'
function p.getEntityFromTree(frame)
This returns the label from the first image with 'preferred' rank
return require(wiki.module_title .. "/debug").getEntityFromTree(frame)
Or the label from the first image with 'normal' rank if preferred returns nothing
end
Ranks: https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua
]]
 
p.getImageLegend = function(frame)
-- getParentValues: returns a property value with its instance label fetching a recursive tree
-- look for named parameter id; if it's blank make it nil
local id = frame.args.id
if id and (#id == 0) then
id = nil
end
 
-- look for named parameter lang
local function uc_first(word)
-- it should contain a two-character ISO-639 language code
return mw.ustring.upper(mw.ustring.sub(word, 1, 1)) .. mw.ustring.sub(word, 2)
-- if it's blank fetch the language of the local wiki
end
local lang = frame.args.lang
if (not lang) or (#lang < 2) then
lang = mw.language.getContentLanguage().code
end
 
-- first unnamed parameter is the local parameter, if supplied
local function getPropertyValue(id, property, parameter, langs, editicon)
local snaksinput_parm = mw.wikibasetext.getBestStatementstrim(id,frame.args[1] or property"")
if input_parm == "FETCH_WIKIDATA" then
local mysnak
local ent = mw.wikibase.getEntityObject(id)
if snaks and snaks[1] and snaks[1].mainsnak then
local imgs
mysnak = snaks[1].mainsnak
if ent and ent.claims then
imgs = ent.claims.P18
end
local imglbl
if imgs then
-- look for an image with 'preferred' rank
for k1, v1 in pairs(imgs) do
if v1.rank == "preferred" and v1.qualifiers and v1.qualifiers.P2096 then
local imglbls = v1.qualifiers.P2096
for k2, v2 in pairs(imglbls) do
if v2.datavalue.value.language == lang then
imglbl = v2.datavalue.value.text
break
end
end
end
end
-- if we don't find one, look for an image with 'normal' rank
if (not imglbl) then
for k1, v1 in pairs(imgs) do
if v1.rank == "normal" and v1.qualifiers and v1.qualifiers.P2096 then
local imglbls = v1.qualifiers.P2096
for k2, v2 in pairs(imglbls) do
if v2.datavalue.value.language == lang then
imglbl = v2.datavalue.value.text
break
end
end
end
end
end
end
return imglbl
else
return input_parm
end
local entityId
local result = '-' -- default for 'no value'
if mysnak.datavalue then
entityId = "Q" .. tostring(mysnak.datavalue.value['numeric-id'])
result, _ = getSnakValue(mysnak, {formatting=parameter, lang=langs, editicon=editicon})
end
return entityId, result
end
 
-- This is used to get the QIDs of all of the values of a property, as a comma separated list if multiple values exist
function p.getParentValues(frame)
-- Usage: {{#invoke:Wikidata |getPropertyIDs |<PropertyID> |FETCH_WIKIDATA}}
local args = frame.args
-- Usage: {{#invoke:Wikidata |getPropertyIDs |<PropertyID> |<InputParameter> |qid=<QID>}}
local id = args.item or frame:getParent().args.item
 
if id == "" or id == nil then
p.getPropertyIDs = function(frame)
id = mw.wikibase.getEntityIdForCurrentPage()
local propertyID = mw.text.trim(frame.args[1] or "")
if id == nil then return end
local input_parm = mw.text.trim(frame.args[2] or "")
end
-- can take a named parameter |qid which is the Wikidata ID for the article. This will not normally be used.
local languages = findLang(args.lang)
local qid = frame.args.qid
local propertySup = args["property"]; if (propertySup == nil or propertySup == "") then propertySup = "P131" end --administrative entity
if qid and (#qid == 0) then qid = nil end
local propertyLabel = args["label"]; if (propertyLabel == nil or propertyLabel == "") then propertyLabel = "P31" end --instance
if input_parm == "FETCH_WIKIDATA" then
local propertyLink = args["valuetext"]; if propertyLink == "" then propertyLink = nil end --internallink
local entity = mw.wikibase.getEntityObject(qid)
local upto = args["upto"]; if upto == "" then upto = nil end
local propclaims
local labelShow = args["labelshow"]; if labelShow == "" then labelShow = nil end
if entity and entity.claims then
local rowformat = args["rowformat"]; if (rowformat == nil or rowformat == "") then rowformat = "$0 = $1" end
propclaims = entity.claims[propertyID]
local separator = args["separator"]; if (separator == nil or separator == "") then separator = "<br />" end
local sorting = args["sorting"]; if sorting == "" then sorting = nil end
local editicon = not (args.editicon == "false" or args.editicon == "no")
local lastlabel = uc_first(upto or '')
local maxloop = tonumber(upto) or (lastlabel == '' and 10 or 50)
local labelFilter = {}
if labelShow then
for i, v in ipairs(mw.text.split(labelShow, "/")) do
labelFilter[uc_first(v)] = true
end
if propclaims then
end
-- if wiki-linked value collect the QID in a table
if (propclaims[1] and propclaims[1].mainsnak.snaktype == "value" and propclaims[1].mainsnak.datavalue.type == "wikibase-entityid") then
local result = {}
local label,out link,= linktext{}
for k, v in pairs(propclaims) do
out[#out + 1] = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
for iter = 1, maxloop do
local label, link
id, link = getPropertyValue(id, propertySup, args.formatting, languages, editicon)
if id then
_, label = getPropertyValue(id, propertyLabel, "label", languages)
if label and link then
if propertyLink then
_, linktext = getPropertyValue(id, propertyLink, "label", languages)
if linktext then
link = mw.ustring.gsub(link, "%[%[(.*)%|(.+)%]%]", "[[%2|" .. linktext .. "]] [[%1|·]]")
end
end
label = case(label, "infoboxlabel", languages[1])
if labelShow == nil or labelFilter[label] then
result[#result + 1] = {label, link}
labelFilter[label] = nil -- only first label found
end
if label == lastlabel then
break
end
return table.concat(out, ", ")
else
-- not a wikibase-entityid, so return empty
break
return ""
end
else
-- no claim, so return empty
break
return ""
end
else
return input_parm
end
end
local ret = {}
local first = 1
local last = #result
local iter = 1
if sorting == "-1" then first = #result; last = 1; iter = -1 end
 
-- returns the page id (Q...) of the current page or nothing of the page is not connected to Wikidata
for i = first, last, iter do
function p.pageId(frame)
local rowtext = mw.ustring.gsub(rowformat, "$[01]", {["$0"] = result[i][1], ["$1"] = result[i][2]})
local entity = mw.wikibase.getEntityObject()
ret[#ret +1] = expandBraces(rowtext, rowformat)
if not entity then return nil else return entity.id end
end
return mw.text.listToText(ret, separator, separator)
end
 
function p.linkWithParentLabelclaim(frame)
local argsproperty = {}frame.args[1] or ""
local id = frame.args["id"] -- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration
for k, v in pairs(frame.args) do -- metatable
local qualifierId = frame.args["qualifier"]
args[k] = v
local parameter = frame.args["parameter"]
local list = frame.args["list"]
local references = frame.args["references"]
local showerrors = frame.args["showerrors"]
local default = frame.args["default"]
if default then showerrors = nil end
 
-- get wikidata entity
local entity = mw.wikibase.getEntityObject(id)
if not entity then
if showerrors then return printError("entity-not-found") else return default end
end
-- fetch the first claim of satisfying the given property
--local getclaims internal= link offindClaims(entity, property/qualifier)
if not claims or not claims[1] then
args.list = "true"
if showerrors then return printError("property-not-found") else return default end
args.formatting = "internallink"
args.separator = "/·/"
local pargs = frame:getParent().args
local link_list = p._main(args, pargs)
if link_list == nil or link_list == "" then
return
end
 
local link_table = mw.text.split(link_list, "/·/", true)
-- get initial sort indices
local sortindices = {}
-- get id value of property/qualifier
for idx in pairs(claims) do
args.formatting = "raw"
sortindices[#sortindices + 1] = idx
local items_list = p._main(args, pargs)
local items_table = mw.text.split(items_list, "/·/", true)
-- get label of parent property
args.property = args.parent
args.qualifier = nil
local parent_claims = findClaims(mw.wikibase.getEntity(items_table[1]), args.parent)
if parent_claims and parent_claims[1].mainsnak.datatype == 'monolingualtext' then
args.formatting = nil
args.list = 'lang'
else
args.formatting = "label"
args.list = "false"
end
-- sort by claim rank
for i, v in ipairs(items_table) do
local comparator = function(a, b)
args.item = v
local rankmap = { deprecated = 2, normal = 1, preferred = 0 }
local link_label = p._main(args, pargs)
local ranka = rankmap[claims[a].rank or "normal"] .. string.format("%08d", a)
if link_label and link_label ~= '' then
local rankb = rankmap[claims[b].rank or "normal"] .. string.format("%08d", b)
link_table[i] = mw.ustring.gsub(link_table[i] or '', "%[%[(.*)%|.+%]%]", "[[%1|" .. link_label .. "]]")
return ranka < rankb
end
end
table.sort(sortindices, comparator)
return mw.text.listToText(link_table)
end
 
local result
function p.years_old(frame)
local args = frame.argserror
if list then
local id = args.item
local value
if id == '' or id == nil then
-- iterate over all elements and return their value (if existing)
id = mw.wikibase.getEntityIdForCurrentPage()
result = {}
end
for idx in pairs(claims) do
local lang = mw.language.new('en')
local claim = claims[sortindices[idx]]
value, error = getValueOfClaim(claim, qualifierId, parameter)
local function getBestValue(id, prop)
if not value and showerrors then value = error end
local snak = mw.wikibase.getBestStatements(id, prop)[1]
if value and references then value = value .. getReferences(frame, claim) end
if snak and snak.mainsnak and snak.mainsnak.datavalue and snak.mainsnak.datavalue.value then
result[#result + 1] = value
return snak.mainsnak.datavalue.value
end
result = table.concat(result, list)
else
-- return first element
local claim = claims[sortindices[1]]
result, error = getValueOfClaim(claim, qualifierId, parameter)
if result and references then result = result .. getReferences(frame, claim) end
end
 
if result then return result else
local birth = getBestValue(id, 'P569')
if showerrors then return error else return default end
if type(birth) ~= 'table' or birth.time == nil or birth.precision == nil or birth.precision < 8 then
return
end
end
local death = getBestValue(id, 'P570')
 
if type(death) ~= 'table' or death.time == nil or death.precision == nil then
-- look into entity object
death = {['time'] = lang:formatDate('c'), ['precision'] = 11} -- current date
function p.ViewSomething(frame)
elseif death.precision < 8 then
local f = (frame.args[1] or frame.args.id) and frame or frame:getParent()
return
local id = f.args.id
if id and (#id == 0) then
id = nil
end
local data = mw.wikibase.getEntityObject(id)
if not data then
local dates = {}
return nil
dates[1] = {['min'] = {}, ['max'] = {}, ['precision'] = birth.precision}
end
dates[1].min.year = tonumber(mw.ustring.match(birth.time, "^[+-]?%d+"))
 
dates[1].min.month = tonumber(mw.ustring.match(birth.time, "\-(%d%d)\-"))
local i = 1
dates[1].min.day = tonumber(mw.ustring.match(birth.time, "\-(%d%d)T"))
while true do
dates[1].max = mw.clone(dates[1].min)
local index = f.args[i]
dates[2] = {['min'] = {}, ['max'] = {}, ['precision'] = death.precision}
if not index then
dates[2].min.year = tonumber(mw.ustring.match(death.time, "^[+-]?%d+"))
if type(data) == "table" then
dates[2].min.month = tonumber(mw.ustring.match(death.time, "\-(%d%d)\-"))
return mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)
dates[2].min.day = tonumber(mw.ustring.match(death.time, "\-(%d%d)T"))
else
dates[2].max = mw.clone(dates[2].min)
return tostring(data)
for i, d in ipairs(dates) do
if d.precision == 10 then -- month
d.min.day = 1
local timestamp = string.format("%04d", tostring(math.abs(d.max.year)))
.. string.format("%02d", tostring(d.max.month))
.. "01"
d.max.day = tonumber(lang:formatDate("j", timestamp .. " + 1 month - 1 day"))
elseif d.precision < 10 then -- year or decade
d.min.day = 1
d.min.month = 1
d.max.day = 31
d.max.month = 12
if d.precision == 8 then -- decade
d.max.year = d.max.year + 9
end
end
 
end
data = data[index] or data[tonumber(index)]
if not data then
local function age(d1, d2)
return
local years = d2.year - d1.year
if d2.month < d1.month or (d2.month == d1.month and d2.day < d1.day) then
years = years - 1
end
 
if d2.year > 0 and d1.year < 0 then
yearsi = yearsi -+ 1 -- no year 0
end
return years
end
local old_min = age(dates[1].max, dates[2].min)
local old_max = age(dates[1].min, dates[2].max)
local old = old_min == old_max and old_min or old_min .. "/" .. old_max
if args.formatting then
old = expandBraces(mw.ustring.gsub(args.formatting, '$1', old), args.formatting)
end
return old
end
 
-- getting sitelink of a given wiki
-- Gets a label in a given language (content language by default) or its fallbacks, optionnally linked.
function p.getLabelgetSiteLink(frame)
local argsf = frame.args or frame -- via invoke or require[1]
local identity = mw.textwikibase.trimgetEntity(args[1] or "")
if idnot == ""entity then return end
return
local editicon = not (args.editicon == "false" or args.editicon == "no")
local pencil = ''
local label, lang
if args.label then
label = args.label
else
local languages = findLang(args.lang)
if languages[1] == wiki.langcode then
-- exceptions or labels fixed
local exist, labels = pcall(require, wiki.module_title .. "/labels")
if exist and next(labels.infoboxLabelsFromId) ~= nil then
label = labels.infoboxLabelsFromId[id]
end
end
if label == nil then
label, lang = getLabelByLangs(id, languages)
if label then
if args.itemgender and feminineGender(args.itemgender) then
label = feminineForm(id, lang) or label
end
label = mw.language.new(lang):ucfirst(mw.text.nowiki(label)) -- sanitize
end
pencil = addEditIcon(id, lang, languages[1], editicon)
end
end
local link = entity:getSitelink( f )
if not link then
local linked = args.linked
return
if linked and linked ~= "" and linked ~= "no" then
local article = mw.wikibase.getSitelink(id) or ("d:" .. id)
return "[[" .. article .. "|" .. (label or id) .. "]]" .. pencil
else
return (label or id) .. pencil
end
return link
end
 
function p.Dump(frame)
-- Return default language used
local f = (frame.args[1] or frame.args.id) and frame or frame:getParent()
function p.lang(frame)
local data = mw.wikibase.getEntityObject(f.args.id)
return findLang(frame.args[1])[1]
if not data then
return i18n.warnDump
end
 
local i = 1
while true do
local index = f.args[i]
if not index then
return "<pre>"..mw.dumpObject(data).."</pre>".. i18n.warnDump
end
 
data = data[index] or data[tonumber(index)]
if not data then
return i18n.warnDump
end
 
i = i + 1
end
end