עריכת הדף "
יחידה:Wikidata
"
קפיצה לניווט
קפיצה לחיפוש
אזהרה:
אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם
תיכנסו לחשבון
או
תיצרו חשבון
, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.
בדיקת אנטי־ספאם.
אין
למלא שדה זה!
-- 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"] = '<span lang="%language">%text</span>' } local p = { } local function printError(code) return '<span class="error">' .. i18n.errors[code] .. '</span>[[קטגוריה:שגיאת קריאת ויקינתונים]]' 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 Wikipedia" and "English Wikipedia" 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|<method>|...}} call {{#invoke:Wikidata|debug|<method>|...}} 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 '<span class="error">' .. result .. '</span>' end else return '<span class="error">invalid parameters</span>' 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 = "<pre>" .. mw.text.encode(result) .. "</pre>" 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 .. "]]<abbr title='הערך אינו קיים בחב"דפדיה'>[*]</abbr>" 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
תקציר:
לתשומת ליבך: תרומתך לאתר חב"דציטוט תפורסם לפי תנאי הרישיון רישיון חופשי למסמכים של גנו גרסה 1.3 או חדשה יותר (אפשר לעיין בדף
חב"דציטוט:זכויות יוצרים
לפרטים נוספים). אם אינך רוצה שעבודתך תהיה זמינה לעריכה על־ידי אחרים, שתופץ לעיני כול, ושאחרים יוכלו להעתיק ממנה תוך ציון המקור – אין לפרסם אותה פה.
כמו־כן, שמירת העריכה משמעה הבטחה שכתבת את הטקסט הזה בעצמך או העתקת אותו ממקור בנחלת הכלל (שאינו מוגבל בזכויות יוצרים) או מקור חופשי דומה.
אין לשלוח חומר מוגבל בזכויות יוצרים ללא רשות!
ביטול
עזרה בעריכה
(נפתח בחלון חדש)
תבנית המופיעה בדף זה:
יחידה:Wikidata/תיעוד
(
עריכה
)
תפריט ניווט
כלים אישיים
לא בחשבון
שיחה
תרומות
יצירת חשבון
כניסה לחשבון
מרחבי שם
יחידה
שיחה
English
צפיות
קריאה
עריכת קוד מקור
גרסאות קודמות
עוד
ניווט
עמוד ראשי
שינויים אחרונים
אולם דיונים
דף ציטוט אקראי
אתרים נוספים
חב"דפדיה העברית
חב"דטקסט
כלים
דפים המקושרים לכאן
שינויים בדפים המקושרים
דפים מיוחדים
מידע על הדף