יחידה:PropertyLink
דעם דאזיקן מאדול קען מען ניצן פאר פאראויסלינקען, לויט וויקידאטן. ער שליסט איין די פאלגנדע פונקציעס:
- אייגנשאפט אדער property - באקומען א לינק לויט א וויקידאטן טענה
- פאראמעטערס: נאמען פון אייגנשאפט (property) המתאים (בצורה של P123). למשל בערך דמויי כלב:
- Parameters: property (e.g p123)
- Example: in Lion {{#invoke:PropertyLink|property|p171}} - will give Panthera. It is better to use this function and not [[{{#property:p171}}]] as the property gives the label in Wikidata, while this function will use the correct sitelink.
- label: gives the label in wikidata (no [[link]])
- Parameters: property (e.g p123)
- imageLink: Get a related file to be used in the article
- Parameters:
- 1 param (optional) - Property to get commons link. If not specified it uses d:Property:p18 (a generic property for image in wikidata)
- width - default 220px
- Parameters:
local FEMALE_FORM_PROPERTY = 'P2521'
local Date = require('Module:תאריך')
--[[
Fetch the "as of date" property of a associated with a property
]]
function asOfDateQualifier(claim)
local AS_OF_PROPERTY = 'P585'
local wikidataModule = require('Module:Wikidata')
local value
local error
value, error = wikidataModule.getValueOfClaim(claim, AS_OF_PROPERTY, nil)
if value then
return ' (אין '..value ..')'
end
return ''
end
local function formatQuantity(property)
local propValue = property.mainsnak and property.mainsnak.datavalue
local lang = mw.getContentLanguage()
local langCode = lang:getCode()
local asOfDate = asOfDateQualifier(property)
local localAmount = lang:formatNum( tonumber(propValue.value.amount) )
local unit = ''
if propValue.value.unit and string.match( propValue.value.unit, 'http://www.wikidata.org/entity/' ) then
local unitEntityId = string.gsub( propValue.value.unit, 'http://www.wikidata.org/entity/', '' )
if unitEntityId and #unitEntityId>0 then
-- name from label
unit = mw.wikibase.label( unitEntityId ) or ''
local unitSymbol = mw.wikibase.getBestStatements(unitEntityId, 'P5061')
-- name from properties
if unitSymbol then
local writingSystemElementId = 'Q33513' -- hebrew writing system
local langElementId = 'Q8641' -- yiddish
local labelFilter = 'P5061[language:'..langCode..'], P5061[P282:' .. writingSystemElementId .. ', P407:' .. langElementId .. ']'
local WDS = require( 'Module:WikidataSelectors' )
local labelClaims = WDS.filter( {['P5061']=unitSymbol }, labelFilter )
for r, claim in pairs( labelClaims ) do
if claim.mainsnak and claim.mainsnak.datavalue.type == 'monolingualtext' and claim.mainsnak.datavalue.value.text then
unit = claim.mainsnak.datavalue.value.text
break;
elseif claim.mainsnak and claim.mainsnak.datavalue and claim.mainsnak.datavalue.type == 'string' and claim.mainsnak.datavalue.value ~= '' then
unit = claim.mainsnak.datavalue.value
break;
end
end
end
unit = ' ' .. unit
end
end
return localAmount .. unit .. asOfDate
end
function getPropertyQualifier(property, qualifier)
local wikidataModule = require('Module:Wikidata')
local entity = mw.wikibase.getEntityIdForCurrentPage()
if not entity then return end --the entity doesnt exist or have no claims
local propertyVals = mw.wikibase.getAllStatements( entity, property )
if not propertyVals or not propertyVals[1] then return end --no such property for this item
value, error = wikidataModule.getValueOfClaim(propertyVals[1], qualifier, nil)
return value
end
local function missingLabelCategory(propertyName)
return '[[קאטעגאריע:וויקידאטן עטיקעט פעלט אין יידיש: ' .. (mw.wikibase.label( propertyName) or propertyName) .. ']][[קאטעגאריע:וויקידאטן עטיקעט פעלט אין יידיש]]'
end
local function getFemaleLabelForEntityId( entityId )
local WDS = require('Module:WikidataSelectors')
local femaleForm = mw.wikibase.getBestStatements(entityId, FEMALE_FORM_PROPERTY)
if not femaleForm then return nil, false end
local femLabels = WDS.filterByLanguage( femaleForm, 'he' )
if femLabels ~= nil and
femLabels[1] and
femLabels[1].mainsnak and
femLabels[1].mainsnak.datavalue and
femLabels[1].mainsnak.datavalue.value and
femLabels[1].mainsnak.datavalue.value.text then
return femLabels[1].mainsnak.datavalue.value.text
end
return nil, #femaleForm > 0
end
--[[
Get a link to specific entity. E.g sitelink|label.
* Missing label => use sitelink as fallback
* Missing sitelink => just show label
* Mssing gender form: adds category of missing gender label
@param {string} entityId - id of entity to link to (e.g Q42)
@param {string} genderAwareEntity - entity from which to fetch gender for gender form
@returns {string, bool} formattedValue, missingTranslation - the formatted value along with indicator of missing translation
]]
function formatEntity(entityId, genderAwareEntity)
local linkTarget = mw.wikibase.sitelink( entityId )
local localLabel, langLabel, missingFemaleForm
local formattedValue
local missingTranslation = false
if genderAwareEntity then
local gender = mw.wikibase.getBestStatements(genderAwareEntity, 'P21') -- P21 - gender
local isFemale = gender and
gender[1] and
gender[1].mainsnak and
gender[1].mainsnak.datavalue and
gender[1].mainsnak.datavalue.value and
(gender[1].mainsnak.datavalue.value["numeric-id"] == 6581072 or gender[1].mainsnak.datavalue.value["numeric-id"] == 1052281)
if isFemale then
localLabel, missingFemaleForm = getFemaleLabelForEntityId( entityId )
langLabel = 'he'
end
-- if we dont have/need female form label, use regular label
if localLabel == nil then
localLabel, langLabel = mw.wikibase.getLabelWithLang( entityId )
end
else
-- use Hebrew label
localLabel, langLabel = mw.wikibase.getLabelWithLang( entityId )
end
local isLocalLabel = langLabel=='yi'
-- fallback if there is target but no label, use target as label
if linkTarget and not isLocalLabel then
localLabel = linkTarget
isLocalLabel = true
end
if localLabel and isLocalLabel then
if linkTarget and localLabel and linkTarget == localLabel then
formattedValue = mw.ustring.format( "[[%s]]", linkTarget )
else
formattedValue = linkTarget and localLabel and mw.ustring.format( "[[%s|%s]]", linkTarget, localLabel ) or localLabel
end
if missingFemaleForm then
mw.log(mw.ustring.format('חסרה צורת הנקבה ל"%s" (%s)', formattedValue, entityId))
formattedValue = formattedValue .. missingLabelCategory( FEMALE_FORM_PROPERTY )
end
else
missingTranslation = true
-- in that case we would unfourtanly can show only the entity id which is meaningless for users
formattedValue = mw.ustring.format( "[[:d:%s|%s]]", entityId, entityId )
end
return formattedValue, missingTranslation
end
function formatOptionalQualifiers(property, qualifiers, qualifiersSep)
if (qualifiers==nil) or (#qualifiers == 0) or (not property.qualifiers) then return '' end
qualifiersSep = qualifiersSep or ', '
local formmatedQualifiers = {}
local warnings = ''
for _, optionalQualifier in pairs( qualifiers ) do
if optionalQualifier and property.qualifiers[optionalQualifier] then
local optionalQualifierVal = mw.wikibase.formatValues(property.qualifiers[optionalQualifier])
local isQualLocalLabel = true
if optionalQualifierVal and property.qualifiers[optionalQualifier][1] and property.qualifiers[optionalQualifier][1]['datatype']=='wikibase-item' then
for i, optionalQValues in ipairs(property.qualifiers[optionalQualifier]) do
local qualLabel, qualLang = mw.wikibase.getLabelWithLang( optionalQValues['datavalue']['value']['id'] )
isQualLocalLabel = isQualLocalLabel and (qualLang=='yi')
end
end
if optionalQualifierVal then
if isQualLocalLabel then
local formattedValue = '<span title="'.. mw.wikibase.label(optionalQualifier)..'" class="propertylink-wikidata-qualifier">'..mw.wikibase.formatValues(property.qualifiers[optionalQualifier]) ..'</span>'
table.insert(formmatedQualifiers, formattedValue)
else
warnings = missingLabelCategory(optionalQualifier)
end
end
end
end
local res = table.concat( formmatedQualifiers, qualifiersSep)
if #formmatedQualifiers > 0 then
res = mw.ustring.format('<span style="font-size:0.9em;"> (%s)</span>', res)
end
return res .. warnings
end
--[[
Fetch property from wikidata and format it:
* if the entity or the claim doesn't exist - nil
* Formating rules:
- for entity reference - returns link to entity (using sitelink) with label as text, otherwise wikidata label as text
- for string - returns the string
- for quantity - returns the amount
- for time - returns the time as string
- for image - returns image inclusion with 250px size
* Multivalues:
Multivalue is supported with allowMulti. seperator between values defined by multiSeperator
@param {string} propertyName - name of property (e.g P123)
@param {bool} allowMulti - whether only first statement should be fetched are all statements.
@param {bool} allowNA - whether if is valid to fetch somevalue snaks: Default: nil/false
@param {string} entityId - Qid of the entity for which we fetch the data. Default: nil (page entity)
@param {string} multiSeperator - seperator between multiple values. Default: ,
@param {string} optionalQualifier - Property id of optional extra qualifier (e.g P123). will be formatted as propertyName (optionalQualifier)
@param {bool} genderAware - Fetch gender form instead of regular label
]]
function getProperty( propertyName, allowMulti, allowNA, entityId, multiSeperator, optionalQualifier, genderAware )
if propertyName==nil or #propertyName==0 then return end -- no property specified
entityId = entityId or mw.wikibase.getEntityIdForCurrentPage()
if entityId == nil then return end -- entity doesnt exist
options = {
['allowMulti'] = allowMulti,
['allowNA'] = allowNA,
['seperator'] = multiSeperator or ', ',
['qualifier'] = optionalQualifier,
['entity-gender-aware'] = genderAware
}
if optionalQualifier then
options['qualifiers'] = {optionalQualifier}
end
return getPropertyByOptions(propertyName, entityId, options)
end
function property( frame )
return getProperty(string.upper(frame.args[1]), (frame.args[2] and string.len(frame.args[2])>0) or false, true, frame.args['entity'])
end
function propertyWithGender(frame)
return getProperty(string.upper(frame.args[1]), (frame.args[2] and string.len(frame.args[2])>0) or false, true, frame.args['entity'], ', ', '', true)
end
-- formatted reference for statement. Only for non imported statements
function refStatement(statement)
if not statement.references or #statement.references == 0 then return '' end -- no reference
local formattedReferences = {}
local frame = mw.getCurrentFrame()
for j, curRef in ipairs(statement.references) do
local isImportedRef = curRef.snaks and (curRef.snaks['P143'] or curRef.snaks['P4656'])
if not isImportedRef then
if curRef.snaks['P854'] then
table.insert(formattedReferences, frame:extensionTag{ name = 'ref', content = mw.wikibase.renderSnak(curRef.snaks['P854'][1])})
elseif curRef.snaks['P2699'] then
table.insert(formattedReferences, frame:extensionTag{ name = 'ref', content = mw.wikibase.renderSnak(curRef.snaks['P2699'][1])})
else
table.insert(formattedReferences, frame:extensionTag{ name = 'ref', content = mw.wikibase.formatValues(curRef.snaks)})
end
end
end
return table.concat(formattedReferences, '')
end
--[[
Fetch property from specified entity.
@param {string} propertyName - name of property (e.g P123)
@param {string} entityId - Qid of the entity for which we fetch the data. Default: nil (page entity)
@param {table} options - table with following supported parameters:
- seperator - seperator between multiple values. Default: ,
- allowMulti - whether only first statement should be fetched are all statements.
- allowNA - whether if is valid to fetch somevalue snaks: Default: nil/false
- entity-gender-aware - Fetch gender form instead of regular label
- qualifiers - list of optional qualifers to append to property value (Example {'P1', 'P2'))
- qualifiers-sep - seperator between optional qualifiers
- img-width - width of image
]]
function getPropertyByOptions( propertyName, entityId, options )
-- verify entity exists
if entityId == nil then entityId = mw.wikibase.getEntityIdForCurrentPage() end
if entityId==nil then return end
-- defaults
options = options or {}
options['seperator'] = options['seperator'] or ', '
options['allowMulti'] = options['allowMulti'] or false
options['allowNA'] = options['allowNA'] or false
options['entity-gender-aware'] = options['entity-gender-aware'] or false -- Fetch gender form instead of regular label
options['qualifiers'] = options['qualifiers'] or {} -- fetch optional qualifiers
options['qualifiers-sep'] = options['qualifiers-sep'] or ', '
options['img-width'] = options['img-width'] or '250px'
options['source'] = options['source'] or false
local propertyVals = mw.wikibase.getBestStatements(entityId, propertyName)
if (not propertyVals) or (#propertyVals==0) then return end --no such property for this item
local resTable = {}
local missingTranslation = false
for i, property in ipairs(propertyVals) do
local propValue = property.mainsnak and property.mainsnak.datavalue
if not propValue then
if options['allowNA'] and (property.mainsnak and property.mainsnak.snaktype)=='somevalue' then
return 'לא ידוע'
else
--property doesnt exist
return
end
end
local isImage = (property.mainsnak.datatype == 'commonsMedia')
if propValue['type'] == 'wikibase-entityid' then
local formattedValue, valueMissingTranslation = formatEntity("Q" .. propValue.value['numeric-id'], options['entity-gender-aware'] and entityId)
if not valueMissingTranslation then
if formattedValue then
formattedValue = formattedValue .. formatOptionalQualifiers(property, options['qualifiers'], options['qualifiers-sep'])
end
table.insert(resTable, formattedValue)
else
missingTranslation = true
end
elseif propValue['type'] == 'string' then
if isImage then
table.insert(resTable, mw.ustring.format( '[[File:%s|%s]]', propValue.value, options['img-width'] ))
else
local formattedValue = propValue.value
if formattedValue then
formattedValue = formattedValue .. formatOptionalQualifiers(property, options['qualifiers'], options['qualifiers-sep'])
end
table.insert(resTable, formattedValue)
end
elseif propValue['type'] == 'monolingualtext' then
-- for monolingualtext print the language as title
local formattedValue = mw.ustring.format('<span lang="%s" title="%s">%s</span>', propValue.value.language,
mw.language.fetchLanguageName( propValue.value.language , 'yi'), propValue.value.text)
table.insert(resTable, formattedValue)
elseif propValue['type'] == 'quantity' then
local formattedValue = formatQuantity(property)
if options['source'] and property.references then
formattedValue = formattedValue.. refStatement(property)
end
if formattedValue then
formattedValue = formattedValue .. formatOptionalQualifiers(property, options['qualifiers'], options['qualifiers-sep'])
end
table.insert(resTable, formattedValue)
elseif propValue['type'] == 'time' then
local timeValue = Date.newFromWikidataValue( property.mainsnak.datavalue.value ):toHebrewString()
--local timeValue = mw.wikibase.renderSnak( property.mainsnak )
timeValue = mw.ustring.gsub(timeValue, '^(%d+ %a+) (%d+)$', '[[%1]] [[%2]]')
table.insert(resTable, timeValue)
elseif propValue['type'] == 'globecoordinate' then
local frame = mw.getCurrentFrame()
local formattedValue
local globe = propValue.value.globe
if globe == 'http://www.wikidata.org/entity/Q2' then globe = nil
else
local globeMapping = require('Module:Wikidata/Globes')
if globeMapping[globe] then
globe = 'globe:' .. globeMapping[globe]
else
globe = nil
end
end
if globe then
formattedValue = frame:expandTemplate{ title = 'Coord', args = { propValue.value.latitude, propValue.value.longitude, globe, display = options['coord-display'] or 'inline' } }
else
formattedValue = frame:expandTemplate{ title = 'Coord', args = { propValue.value.latitude, propValue.value.longitude, display = options['coord-display'] or 'inline' } }
end
table.insert(resTable, formattedValue)
else
table.insert(resTable, mw.wikibase.formatValue( property.mainsnak ))
end
if not options['allowMulti'] then
break
end
end
if missingTranslation then return missingLabelCategory( propertyName ) end
-- bidi isolation - properly show mix or RTL and LTR statements
if #resTable>1 then
local isolateValues = {}
local needIsolation = false
for k,v in pairs(resTable) do
needIsolation = needIsolation or string.find( v, '[a-zA-Z]')
table.insert(isolateValues, mw.ustring.format('<span style="unicode-bidi:isolate">%s</span>', v))
end
if needIsolation then resTable = isolateValues end
end
-- special case * - listify
if options['seperator'] == '*' and #resTable>1 then
return '*' .. table.concat( resTable, '\n*' )
else
return table.concat( resTable, options['seperator'] )
end
end
function getLabel( propertyName, entityId )
local entity = entityId or mw.wikibase.getEntityIdForCurrentPage()
if not entity then return end--the entity doesnt exist or have no claims
local property = mw.wikibase.getBestStatements(entity, propertyName)
if not property or not property[1] then return end --no such property for this item
property = property[1]
local propValue = property.mainsnak.datavalue
if not propValue then return '' end --property doesnt exist
if propValue['type'] == 'wikibase-entityid' then
local label, lang = mw.wikibase.label( "Q" ..propValue.value['numeric-id'] )
return label
elseif propValue['type'] == 'string' then
return propValue.value
end
end
-- Return the label for property, or the label of the linked entiy of that property
function label( frame )
return getLabel( string.upper(frame.args[1] ))
end
function getImageLink( propName, width, align, description, border)
local entityId = mw.wikibase.getEntityIdForCurrentPage()
if not entityId then return end --the entity doesnt exist or have no claims
local property = mw.wikibase.getBestStatements(entityId, propName or 'P18')
if property and property[1] then
if property[1].mainsnak and property[1].mainsnak.snaktype=='novalue' then
return '[[d:'..mw.wikibase.getEntityIdForCurrentPage()..'#'..(propName or "P18")..'|' ..'לא ידוע]]'
end
local width = width or "220"
local extraParameters = width..'px'
if align then extraParameters = extraParameters .. '|' .. align end
if description then extraParameters = extraParameters .. '|' .. description end
if border and (#border > 0) then extraParameters =extraParameters..'|' ..'border' end
return mw.ustring.format( '[[File:%s|%s]]', property[1].mainsnak.datavalue.value, extraParameters )
end
end
--use this function to get associated image to be used in the article
function imageLink( frame )
return getImageLink(string.upper(frame.args[1] or 'P18'), frame.args["width"], frame.args["align"], frame.args["description"], frame.args["גבול"])
end
-- returns "1" if the page has an associated wikidata entry, "" otherwise
function hasEntry()
local entity = mw.wikibase.getEntityIdForCurrentPage()
--if not entity or not entity.claims then return end --the entity doesnt exist or have no claims
if not entity then return end --the entity doesnt exist or have no claims
return 1
end
return {
imageLink = imageLink,
['תמונה'] = imageLink,
label = label,
['תווית'] = label,
formatEntity = formatEntity,
property = property,
propertyWithGender = propertyWithGender,
['מאפיין'] = property,
['אייגנשאפט'] = property,
getProperty = getProperty,
getPropertyByOptions = getPropertyByOptions,
getPropertyQualifier = getPropertyQualifier,
getImageLink = getImageLink,
getLabel = getLabel,
hasEntry = hasEntry,
['יש פריט'] = hasEntry
}