Bruger:Fnielsen/Modul:Wikidata

local i18n = {

   ["errors"] = {
       ["property-param-not-provided"] = "Property parameter not provided.",
       ["entity-not-found"] = "Entity not found.",
       ["unknown-claim-type"] = "Unknown claim type.",
       ["unknown-snak-type"] = "Unknown snak type.",
       ["unknown-datavalue-type"] = "Unknown datavalue type.",
       ["unknown-entity-type"] = "Unknown entity type.",
       ["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"] = "unknown value",
   ["novalue"] = "no value"

}

function getEntityFromId( id )

   return mw.wikibase.getEntityObject() --TODO support for getting other entities

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 formatStatements( options )

   if not options.property then
       return formatError( 'property-param-not-provided' )
   end
   --Get entity
   local entity = nil
   if options.entity and type( options.entity ) == "table" then
       entity = options.entity
   else
       entity = getEntityFromId( options.entityId )
   end
   if not entity then
       return  --TODO error?
   end
   if not entity.claims or not entity.claims[options.property] then
       return  --TODO error?
   end
   --Format statement and concat them cleanly
   local formattedStatements = {}
   for i, statement in pairs( entity.claims[options.property] ) do
       if options.rank == 'one' then
           return formatStatement( statement, options ) --Output only one value
       else
           table.insert( formattedStatements, formatStatement( statement, options ) )
       end
   end
   return mw.text.listToText( formattedStatements, options.separator, options.conjunction )

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 formatDatavalue( snak.datavalue, options )
   else
       return formatError( 'unknown-snak-type' )
   end

end

function formatDatavalue( datavalue, options )

   --Use the customize handler if provided
   if options['value-module'] or options['value-function'] then
       if not options['value-module'] or not options['value-function'] then
           return formatError( 'unknown-value-module' )
       end
       local formatter = require ('Module:' .. options['value-module'])
       if not formatter then
           return formatError( 'value-module-not-found' )
       end
       local fun = formatter[options['value-function']]
       if not fun then
           return formatError( 'value-function-not-found' )
       end
       return fun( datavalue.value, options )
   end
   --Default formatters
   if options.property == 'latitud' then --Para las coordenadas
       return datavalue.value['latitude']
   elseif options.property == 'longitud' then
       return datavalue.value['longitude']
   elseif datavalue.type == 'wikibase-entityid' then
       return formatEntityId( getEntityIdFromValue( datavalue.value ), options )
   elseif datavalue.type == 'string' then
       if options.pattern and options.pattern ~=  then
           return formatFromPattern( datavalue.value, options )
       else
           return datavalue.value
       end
   elseif datavalue.type == 'time' then
       local Time = require 'Module:Time'
       return Time.newFromWikidataValue( datavalue.value ):toHtml()
   elseif  datavalue.value['latitude']  and datavalue.value['longitude'] then 
       return  marco:preprocess('{{#coordinates:}}: ugyldig breddegrad')
   else
       return formatError( 'unknown-datavalue-type' )
   end

end

function formatEntityId( entityId, options )

   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 --TODO what if no links and label + fallback language?
   end

end

function formatFromPattern( str, options )

   return mw.ustring.gsub( options.pattern, '$1', str ) ..  --Hack to get only the first result of the function

end

local p = {}

function p.formatStatements( frame ) marco = frame

   local args = frame.args
   --If a value if already set, use it
   if args.value and args.value ~=  then
       return args.value
   end
   return formatStatements( frame.args )

end

function p.formatStatementsFromLua( options )

   --If a value if already set, use it
   if options.value and options.value ~=  then
       return options.value
   end
   return formatStatements( options )

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.getEntityObject()
       if not entity then return nil end
           id = entity.id
   else
       id = frame.args[1]
   end

   return mw.wikibase.sitelink( id )

end

return p


-- look into entity object function p.ViewSomething(frame) local f = (frame.args[1] or frame.args.id) and frame or frame:getParent() local id = f.args.id if id and (#id == 0) then id = nil end local data = mw.wikibase.getEntityObject(id) if not data then return nil end

local i = 1 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