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