ניתן ליצור תיעוד על היחידה הזאת בדף יחידה:Wikidata/תיעוד
-- module local variables local wiki = { langcode = mw.language.getContentLanguage().code } -- internationalisation local i18n = { ["errors"] = { ["property-not-found"] = "המאפיין לא נמצא.", ["entity-not-found"] = "היישות לא נמצאה", ["unknown-claim-type"] = "מאפיין לא מוכר", ["unknown-snak-type"] = "Unbekannter Snak-Typ.", ["unknown-datavalue-type"] = "סוג נתון לא ידוע", ["unknown-entity-type"] = "סוג יישות לא ידוע", ["qualifier-not-found"] = "המבחין לא נמצא.", ["site-not-found"] = "האתר לא נמצא.", }, ["somevalue"] = "Unbekannter Wert", ["novalue"] = "Kein Wert", ["datetime"] = { -- $1 is a placeholder for the actual number [0] = "$1 מיליארד שנים",-- precision: billion years [1] = "$100 מיליון שנים",-- precision: hundred million years [2] = "$10 מיליון שנים",-- precision: ten million years [3] = "$1 מיליון שנים",-- precision: million years [4] = "$100,000 שנים",-- precision: hundred thousand years [5] = "$10,000 שנים",-- precision: ten thousand years [6] = "המילוניום ה-$1", -- precision: millenium [7] = "המאה ה-$1",-- precision: century [8] = "$1er",-- precision: decade -- the following use the format of #time parser function [9] = "Y",-- precision: year, [10] = "F Y",-- precision: month [11] = "j xg Y",-- precision: day [12] = 'j xg Y, G "Uhr"',-- precision: hour [13] = "j xg Y G:i",-- precision: minute [14] = "j xg Y G:i:s",-- precision: second ["beforenow"] = "vor $1",-- how to format negative numbers for precisions 0 to 5 ["afternow"] = "in $1",-- how to format positive numbers for precisions 0 to 5 ["bc"] = '$1 לפנה"ס',-- how print negative years ["ad"] = "$1"-- how print positive years }, ["monolingualtext"] = '%text' } local p = { } local function printError(code) return ' .. i18n.errors[code] .. '[[קטגוריה:שגיאת קריאת ויקינתונים]]' end -- the "qualifiers" and "snaks" field have a respective "qualifiers-order" and "snaks-order" field -- use these as the second parameter and this function instead of the built-in "pairs" function -- to iterate over all qualifiers and snaks in the intended order. local function orderedpairs(array, order) if not order then return pairs(array) end -- return iterator function local i = 0 return function() i = i + 1 if order[i] then return order[i], array[order[i]] end end end function p.descriptionIn(frame) local langcode = frame.args[1] local id = frame.args[2]-- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration -- return description of a Wikidata entity in the given language or the default language of this Wikipedia site return mw.wikibase.getEntityObject(id).descriptions[langcode or wiki.langcode].value end function p.labelIn(frame) local langcode = frame.args[1] local id = frame.args[2]-- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration -- return label of a Wikidata entity in the given language or the default language of this Wikipedia site return mw.wikibase.getEntityObject(id).labels[langcode or wiki.langcode].value end local function printDatavalueCoordinate(data, parameter) -- data fields: latitude [double], longitude [double], altitude [double], precision [double], globe [wikidata URI, usually http://www.wikidata.org/entity/Q2 [earth]] if parameter then if parameter == "globe" then data.globe = mw.ustring.match(data.globe, "Q%d+") end -- extract entity id from the globe URI return data[parameter] else return data.latitude .. "/" .. data.longitude -- combine latitude and longitude, which can be decomposed using the #titleparts wiki function end end local function printDatavalueQuantity(data, parameter) -- data fields: amount [number], unit [string], upperBound [number], lowerBound [number] if parameter then return data[paramater] else return tonumber(data.amount) end end -- precision: 0 - billion years, 1 - hundred million years, ..., 6 - millenia, 7 - century, 8 - decade, 9 - year, 10 - month, 11 - day, 12 - hour, 13 - minute, 14 - second 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 function formatDate(date, precision, timezone) precision = precision or 11 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 millenia 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 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 - millenia, 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 printDatavalueEntity(data, parameter) -- data fields: entity-type [string], numeric-id [int, Wikidata id] local id = "Q" .. data["numeric-id"] if parameter then if parameter == "link" then return "[[" .. (mw.wikibase.sitelink(id) or (":d:" .. id)) .. "|" .. (mw.wikibase.label(id) or id) .. "]]" else return data[parameter] end else if data["entity-type"] == "item" then return mw.wikibase.label("Q" .. data["numeric-id"]) or mw.ustring.format('%s%s', id, '[[קטגוריה:ויקינתונים:ערכים_חסרי_תווית_בעברית]]') else printError("unknown-entity-type") end end end local function printDatavalueMonolingualText(data, parameter) -- data fields: language [string], text [string] if parameter then return data[parameter] else return mw.ustring.gsub(mw.ustring.gsub(i18n.monolingualtext, "%%language", data["language"]), "%%text", data["text"]) end end function findClaims(entity, property) if not property or not entity or not entity.claims then return end return entity:getAllStatements(property) end function getSnakValue(snak, parameter) -- snaks have three types: "novalue" for null/nil, "somevalue" for not null/not nil, or "value" for actual data if snak.snaktype == "novalue" then return i18n["novalue"] elseif snak.snaktype == "somevalue" then return i18n["somevalue"] elseif snak.snaktype ~= "value" then return nil, printError("unknown-snak-type") end -- call the respective snak parser if snak.datavalue.type == "string" then return snak.datavalue.value elseif snak.datavalue.type == "globecoordinate" then return printDatavalueCoordinate(snak.datavalue.value, parameter) elseif snak.datavalue.type == "quantity" then return printDatavalueQuantity(snak.datavalue.value, parameter) elseif snak.datavalue.type == "time" then return printDatavalueTime(snak.datavalue.value, parameter) elseif snak.datavalue.type == "wikibase-entityid" then return printDatavalueEntity(snak.datavalue.value, parameter) elseif snak.datavalue.type == "monolingualtext" then return printDatavalueMonolingualText(snak.datavalue.value, parameter) else return nil, printError("unknown-datavalue-type") end end function getQualifierSnak(claim, qualifierId, onlyHebrew) -- 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, -- as well as a list of attribute snaks and a list of references snaks if qualifierId then -- search the attribute snak with the given qualifier as key if claim.qualifiers then local qualifier = claim.qualifiers[qualifierId] if qualifier then -- only hebrew qualifiers for monolingualtext type if onlyHebrew and qualifier[1].datatype == 'monolingualtext' then for idx,eachForm in pairs(qualifier) do if eachForm.datavalue.value.language == 'he' then return qualifier[idx] end end else return qualifier[1] end end end return nil, printError("qualifier-not-found") else -- otherwise return the main snak return claim.mainsnak end end function getValueOfClaim(claim, qualifierId, parameter) local error local snak local onlyHebrew if qualifierId == 'P2096' then onlyHebrew = true end snak, error = getQualifierSnak(claim, qualifierId, onlyHebrew) if snak then return getSnakValue(snak, parameter) else return nil, error end end function getReferences(frame, claim) local result = "" -- traverse through all references for ref in pairs(claim.references or {}) do local refparts -- traverse through all parts of the current reference for snakkey, snakval in orderedpairs(claim.references[ref].snaks or {}, claim.references[ref]["snaks-order"]) do if refparts then refparts = refparts .. ", " else refparts = "" end -- output the label of the property of the reference part, e.g. "imported from" for P143 refparts = refparts .. tostring(mw.wikibase.label(snakkey)) .. ": " -- output all values of this reference part, e.g. "German Wiki Wikidata" and "English Wiki Wikidata" if the referenced claim was imported from both sites for snakidx = 1, #snakval do if snakidx > 1 then refparts = refparts .. ", " end refparts = refparts .. getSnakValue(snakval[snakidx]) end end if refparts then result = result .. frame:extensionTag("ref", refparts) end end return result end -- Check if the 'qualifierId' exists on the 'property' of given 'id' function p.isClaimExist(property, qualifierId, id) -- get wikidata entity local entity = mw.wikibase.getEntityObject(id or nil) if not entity then return false end -- fetch the first claim of satisfying the given property local claims = findClaims(entity, property) if not claims or not claims[1] then return false end -- get initial sort indices local sortindices = {} for idx in pairs(claims) do sortindices[#sortindices + 1] = idx end -- check if there is an element local claim = claims[sortindices[1]] result, error = getValueOfClaim(claim, qualifierId, parameter) return result ~= nil end function p.claim(frame) local property = frame.args[1] or "" local id = frame.args["id"]-- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration local qualifierId = frame.args["qualifier"] 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 claims = findClaims(entity, property) if not claims or not claims[1] then if showerrors then return printError("property-not-found") else return default end end -- get initial sort indices local sortindices = {} for idx in pairs(claims) do sortindices[#sortindices + 1] = idx end -- sort by claim rank local comparator = function(a, b) local rankmap = { deprecated = 2, normal = 1, preferred = 0 } local ranka = rankmap[claims[a].rank or "normal"] .. string.format("%08d", a) local rankb = rankmap[claims[b].rank or "normal"] .. string.format("%08d", b) return ranka < rankb end table.sort(sortindices, comparator) local result local error if list then local value -- iterate over all elements and return their value (if existing) result = {} for idx in pairs(claims) do local claim = claims[sortindices[idx]] value, error = getValueOfClaim(claim, qualifierId, parameter) if not value and showerrors then value = error end if value and references then value = value .. getReferences(frame, claim) end result[#result + 1] = 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 if showerrors then return error else return default end end end function p.getValue(frame) local param = frame.args[2] if param == "FETCH_WIKIDATA" then return p.claim(frame) else return param end end function p.pageId(frame) return mw.wikibase.getEntityIdForCurrentPage() end function p.labelOf(frame) local id = frame.args[1] -- returns the label of the given entity/property id -- if no id is given, the one from the entity associated with the calling Wikipedia article is used if not id then local entity = mw.wikibase.getEntityObject() if not entity then return printError("entity-not-found") end id = entity.id end return mw.wikibase.label(id) end function p.sitelinkOf(frame) local id = frame.args[1] -- returns the Wikipedia article name of the given entity -- if no id is given, the one from the entity associated with the calling Wikipedia article is used if not id then local entity = mw.wikibase.getEntityObject() if not entity then return printError("entity-not-found") end id = entity.id end return mw.wikibase.sitelink(id) end function p.badges(frame) local site = frame.args[1] local id = frame.args[2]-- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration if not site then return printError("site-not-found") end local entity = mw.wikibase.getEntityObject(id) if not entity then return printError("entity-not-found") end local badges = entity.sitelinks[site].badges if badges then local result for idx = 1, #badges do if result then result = result .. "/" .. badges[idx] else result = badges[idx] end end return result end end -- call this in cases of script errors within a function instead of {{#invoke:Wikidata||...}} call {{#invoke:Wikidata|debug||...}} function p.debug(frame) local func = frame.args[1] if func then -- create new parameter set, where the first parameter with the function name is removed local newargs = {} for key, val in pairs(frame.args) do if type(key) == "number" then if key > 1 then newargs[key - 1] = val end else newargs[key] = val end end frame.args = newargs local status, result = pcall(p[func], frame) if status then return result else return ' .. result .. '' end else return '' end end function printTable(data, level) level = tonumber(level) or 0 local result = "" local prefix = "" for idx = 1, level do prefix = prefix .. " " end if type(data) == "table" then for key, val in pairs(data) do result = result .. prefix .. key .. ": " if type(val) == "table" then result = result .. "\n" .. printTable(val, level + 1) else result = result .. tostring(val) .. "\n" end end else result = prefix .. tostring(data) end if level == 0 then result = ""
.. mw.text.encode(result) .. "
" end return result end -- look into entity object function p.ViewSomething(frame) local i = 1 local f = frame.args[1] and frame or frame:getParent() local data if f.args[1] =='claims' and f.args[2] then data = mw.wikibase.getAllStatements( mw.wikibase.getEntityIdForCurrentPage(), f.args[2] ) i=i+2 else data = mw.wikibase.getEntityObject() end if not data then return nil end while true do local index = f.args[i] if not index then if type(data) == "table" then return mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY) else return tostring(data) end end data = data[index] or data[tonumber(index)] if not data then return end i = i + 1 end end function p.printEntity(frame) local id = frame.args[1] -- "id" must be nil, as access to other Wikidata objects is disabled in Mediawiki configuration local entity = mw.wikibase.getEntityObject(id) return printTable(entity) end local function computeLinkToItem(entityId, capitalize, callFunction) local sitelink = mw.wikibase.sitelink(StringUtils._prependIfMissing({tostring(entityId), 'Q'})) local label = nil local object = mw.wikibase.getEntityObject(StringUtils._prependIfMissing({tostring(entityId), 'Q'})) if callFunction and type(callFunction) == 'function' then label = callFunction(object) end if label == nil then label = mw.wikibase.label(StringUtils._prependIfMissing({tostring(entityId), 'Q'})) end if label == nil and object ~= nil then label = object:getLabel('en') end if label == nil then label = StringUtils._prependIfMissing({tostring(entityId), 'Q'}) end if capitalize then label = lang:ucfirst(label) end if sitelink then return "[[:" .. sitelink .. "|" .. label .. "]]" else return "[[:d:" .. StringUtils._prependIfMissing({tostring(entityId), 'Q'}) .. "|" .. label .. "]][*]" end end p.findLinkToItem = function(entityId, capitalize, feminine, shortestAlias) if capitalize == nil then capitalize = false end local callFunction = nil if shortestAlias then callFunction = function(object) local returnedAlias = nil if object then if object.claims and object.claims['P1813'] then local shortNameEn = nil for shortNameIdx,shortNameClaim in pairs(object.claims['P1813']) do if shortNameClaim.mainsnak.datavalue.value.language == 'en' then shortNameEn = shortNameClaim.mainsnak.datavalue.value.text end if shortNameClaim.mainsnak.datavalue.value.language == 'ro' then returnedAlias = shortNameClaim.mainsnak.datavalue.value.text end end returnedAlias = returnedAlias or shortNameEn end end return returnedAlias end end if feminine then callFunction = function(object) if object then local feminineForms = object:getBestStatements('P2521') if feminineForms then for _idx, eachFForm in pairs(feminineForms) do if eachFForm.type == 'statement' and eachFForm.mainsnak.datatype == 'monolingualtext' and eachFForm.mainsnak.datavalue.type == 'monolingualtext' and eachFForm.mainsnak.datavalue.value and eachFForm.mainsnak.datavalue.value.language == 'he' then return eachFForm.mainsnak.datavalue.value.text end end end end end end return computeLinkToItem(entityId, capitalize, callFunction) end -- check whether entityId has a claim with propertyId referencing to claimedEntity p.hasClaim = function(entityId, propertyId, claimedEntity) if entityId==nil or propertyId==nil then return false end local propertyVals = mw.wikibase.getBestStatements(entityId, propertyId) if (not propertyVals) or (#propertyVals==0) then return false end for i, property in ipairs(propertyVals) do local propValue = property.mainsnak and property.mainsnak.datavalue if not propValue then return false end if propValue.value['id'] == claimedEntity then return true end end return false end p.getValueOfClaim = getValueOfClaim return p