Usuari:Albertvillanovadelmoral/Mòdul:Wikidata

De la Viquipèdia, l'enciclopèdia lliure

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