Modul:PropertyLink

Aus Android Wiki
Zur Navigation springen Zur Suche springen

This module can be used for advance linking, according to Wikidata. It includes the following functions:

  • property - get a link according to wikidata claim
    • 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

function getLinkLabel(propValue, frame)
	if propValue['type'] == 'wikibase-entityid' then
		local isWikipedia = false
        local linkTarget = mw.wikibase.sitelink( "Q" .. propValue.value['numeric-id'] )
        if not linkTarget then
        	local targetEntity = mw.wikibase.getEntity( "Q" .. propValue.value['numeric-id'] )
        	if targetEntity and targetEntity['sitelinks'] then
        		if targetEntity['sitelinks']['dewiki'] then
        			linkTarget = string.gsub('de:' .. targetEntity['sitelinks']['dewiki']['title'], ' ', '_')
        			isWikipedia = true
        		elseif targetEntity['sitelinks']['enwiki'] then
        			linkTarget = string.gsub(targetEntity['sitelinks']['enwiki']['title'], ' ', '_')
        			isWikipedia = true
    			end
			end
		end
        local linkTitle = mw.wikibase.label( "Q" ..propValue.value['numeric-id'] )
        
        if isWikipedia then
        	template = "{{WikipediaLink|%s|%s}}"
        end
        if linkTarget and linkTitle then
        	if isWikipedia then
        		return frame:expandTemplate{ title = 'WikipediaLink', args = { linkTarget, linkTitle } }
        	end
        	return mw.ustring.format( "[[%s|%s]]", linkTarget, linkTitle )
        else
            return linkTitle
        end
    elseif propValue and propValue['type'] == 'string' then
    	return propValue.value
    end
end

function getProperty(propertyName, frame)
    local entity = mw.wikibase.getEntityObject()
    if not entity or not entity.claims then return end--the entity doesnt exist or have no claims
    local property = entity.claims[propertyName]
    if not property then return end--no such property for this item
    property = property[1]
    local propValue = property.mainsnak and property.mainsnak.datavalue
    if not propValue then return end --property doesnt exist

	return getLinkLabel(propValue, frame)
end
 
function property( frame )
    return getProperty(string.upper(frame.args[1], frame))
end

function getLabel( propertyName )
    local entity = mw.wikibase.getEntity()
    if not entity or not entity.claims then return end--the entity doesnt exist or have no claims
    local property = entity.claims[propertyName]
    if not property then return end--no such property for this item
 
    property = property[0]
    local propValue = property.mainsnak.datavalue
    if not propValue then return '' end --property doesnt exist
 
    if propValue['type']=='wikibase-entityid' then
        return mw.wikibase.label( "Q" ..propValue.value['numeric-id'] )
    elseif propValue['type'] == 'string' then
        return propValue.value
    end
end

function getLinkLabels( frame )
	propertyName = frame.args[1]
    local entity = mw.wikibase.getEntityObject()
    if not entity or not entity.claims then return end--the entity doesnt exist or have no claims
    local properties = entity.claims[propertyName]
    if not properties then return end--no such property for this item
 
    local retVal = ''
    for propIndex in pairs(properties) do
    	local property = properties[propIndex]
		local propValue = property.mainsnak.datavalue
		if not propValue then return '' end --property doesnt exist

		local value = getLinkLabel(propValue, frame)
		if retVal == '' then
			retVal = value
		else
			retVal = retVal .. ', ' .. value
		end
	end
	
	return retVal
end

-- Return the label for property, or the label of the linked entiy of that property
function label( frame )
    return getLabel(string.lower(frame.args[1]))
end

function getImageLink( propName, width)
    local entity = mw.wikibase.getEntity()
    if not entity or not entity.claims then return end --the entity doesnt exist or have no claims
    local property = entity.claims[propName or "P4"]
    if property then
        local width = width or "220"
        return mw.ustring.format( '[[File:%s|%spx]]', property[1].mainsnak.datavalue.value, width )
    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]), frame.args["width"])
end
 
return {
    imageLink = imageLink,
    Image = imageLink,
    File = imageLink,
    label = label,
    Label = label,
    property = property,
    Property = property,
    getProperty = getProperty,
    getImageLink = getImageLink,
    getLabel = getLabel,
    getLinkLabels = getLinkLabels,
}