Usuari:Albertvillanovadelmoral/Mòdul:Wikidata
local i18n = {
["errors"] = { ["property-param-not-provided"] = "Falta el paràmetre de la propietat.", ["entity-not-found"] = "Entitat no trobada.", ["unknown-claim-type"] = "Tipus d'afirmació (claim) desconegut.", ["unknown-snak-type"] = "Tipus de connector (snak) desconegut.", ["unknown-datavalue-type"] = "Tipus de valor (datavalue) desconegut.", ["unknown-entity-type"] = "Tipus d'entitat desconegut.", ["unknown-value-module"] = "You must set both value-module and value-function parameters.", ["value-module-not-found"] = "The module pointed by value-module not found.", ["value-function-not-found"] = "The function pointed by value-function not found." }, ["somevalue"] = "valor desconegut", ["novalue"] = "cap valor aplicable"
}
function getEntityFromId( id )
return mw.wikibase.getEntity() --TODO support for getting other entities
end
function getClaims( args ) -- returns a table of the claims (TODO: matching some conditions given in args)
if not args.property then return formatError( 'property-param-not-provided' ) end --Get entity local entity = nil local property = string.lower(args.property) if args.entity and type( args.entity ) == "table" then entity = args.entity else entity = getEntityFromId( args.entityId ) end if not entity or not entity.claims or not entity.claims[property] then return nil end
return entity.claims[property] end
function numOfClaims( claims ) if type(claims) ~= "table" then return 0 elseif claims == {} then return 0 elseif claims[0] then -- taula Wikibase no modificada amb una clau 0 return #claims + 1 else return #claims end end
function getDatavalue(snak, formatting) if snak.snaktype ~= 'value' then return nil end datatype = snak.datavalue.type
if datatype == 'wikibase-entityid' then if formatting == 'raw' then return "Q" .. tostring(snak.datavalue.value['numeric-id']) else return formatEntityId("Q" .. tostring(snak.datavalue.value['numeric-id'])) end
elseif datatype == 'string' then local astring = snak.datavalue.value if formatting == 'weblink' then return '[' .. astring .. ' ' .. mw.text.split( astring, '//' )[2] .. ']' elseif mw.ustring.find( (formatting or ), '$1', 1, true ) then -- formatting = a pattern return mw.ustring.gsub( formatting, '$1', astring ) .. --Hack to get only the first result of the function else return astring end
elseif datatype == 'time' then -- format example: +00000002013-02-15T00:00:00Z local d = snak.datavalue.value.time local lang = mw.getContentLanguage() return lang:formatDate("j F Y", string.sub(d, 9, 18)) -- format dd mes aaaa
elseif datatype == 'globecoordinate' then local coord = snak.datavalue.value local globetable = { Q2 = 'earth', Q111 = 'mars', Q405 = 'moon'} coord.globe = globetable[mw.text.split( snak.datavalue.value.globe, 'wiki/' )[2]] -- http://www.wikidata.org/wiki/Q2 if coord.globe == or coord.globe == nil then coord.globe = 'earth' end if formatting == 'latitude' then return coord.latitude elseif formatting == 'longitude' then return coord.longitude elseif formatting == 'dimension' then return coord.dimension else return coord.globe end
else return formatError( 'unknown-datavalue-type' ) end end
function getEntityIdFromValue( value )
if value['entity-type'] == 'item' then return 'q' .. value['numeric-id'] elseif value['entity-type'] == 'property' then return 'p' .. value['numeric-id'] else return formatError( 'unknown-entity-type' ) end
end
function formatError( key )
return '' .. i18n.errors[key] .. ''
end
function formatStatement( statement, options )
if not statement.type or statement.type ~= 'statement' then return formatError( 'unknown-claim-type' ) end return formatSnak( statement.mainsnak, options ) --TODO reference and qualifiers
end
function formatSnak( snak, options )
if snak.snaktype == 'somevalue' then return i18n['somevalue'] elseif snak.snaktype == 'novalue' then return i18n['novalue'] elseif snak.snaktype == 'value' then return getDatavalue( snak, options.formatting ) else return formatError( 'unknown-snak-type' ) end
end
function formatEntityId( entityId ) local label = mw.wikibase.label( entityId ) local link = mw.wikibase.sitelink( entityId ) if link then if label then return '' .. label .. '' else return '' .. link .. '' end else return '' .. (label or entityId) .. '' end end
local p = {}
function p.formatStatements( frame ) -- Format statement and concat them cleanly local args = frame.args
--If a value is already set, use it if args.value and args.value ~= then return args.value end
local rawStatements = getClaims( args ) if not rawStatements or numOfClaims(rawStatements) == 0 then return nil end
--Format statement and concat them cleanly local sortedLabels = {} -- l'índex 0 passa a ser 1, necessari per deixar-ho ordenat for i, statement in pairs( rawStatements ) do sortedLabels[i+1] = statement end local formattedStatements = {} for i, statement in pairs( sortedLabels ) do if args.rank == 'one' then return formatStatement( statement, args ) --Output only one value else table.insert( formattedStatements, formatStatement( statement, args ) ) end end
return mw.text.listToText( formattedStatements, args.separator, args.conjunction ) 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.sitelink( id )
end
return p