Modul:Wikidata utilities: Unterschied zwischen den Versionen

+ module administration, getValuesWithQualifiers modified
(vereinfacht)
(+ module administration, getValuesWithQualifiers modified)
Zeile 4: Zeile 4:
local WikidataUtilities = {
local WikidataUtilities = {
suite  = 'WikidataUtilities',
suite  = 'WikidataUtilities',
serial = '2020-09-30',
serial = '2020-10-01',
item  = 65439025
item  = 65439025
}
}
Zeile 220: Zeile 220:
end
end


local function getValueFromDatavalue( datavalue )
local function analyzeDatavalue( datavalue )
local v = datavalue.value
local v = datavalue.value
local t = datavalue.type
local t = datavalue.type
Zeile 231: Zeile 231:
v = tonumber( v.amount ) or 1
v = tonumber( v.amount ) or 1
else
else
v = v.amount:gsub( '^+', '' ) .. ' ' .. v.unit
v.amount = v.amount:gsub( '^+', '' )
v.unit = v.unit:gsub( 'http://www.wikidata.org/entity/', '' )
end
end
elseif t == 'time' then
elseif t == 'time' then
Zeile 241: Zeile 242:


-- The following function is an experimental one, not for extensive use
-- The following function is an experimental one, not for extensive use
function wu.getValuesWithQualifiers( entity, p, qualifiers, count )
function wu.getValuesWithQualifiers( entity, p, qualifiers, count, labelFct, ... )
local result = {}
local array
local function toQualifierTable( key, qualTab )
local v
if not array[ key ] then
array[ key ] = {}
end
for _, qual in ipairs( qualTab ) do
if qual.snaktype == 'value' then
v, array[ key .. '-type' ] =
analyzeDatavalue( qual.datavalue )
table.insert( array[ key ], v )
end
end
if #array[ key ] == 0 then
array[ key ] = nil
array[ key .. '-type' ] = nil
else
wu.addProperty( key )
end
end
 
local results = {}
local statements = wu.getStatements( entity, p, count )
local statements = wu.getStatements( entity, p, count )
if #statements == 0 then
if #statements == 0 then
return result
return results
end
end


Zeile 252: Zeile 274:
end
end


local array
for _, statement in ipairs( statements ) do
for _, statement in ipairs( statements ) do
array = { value = getValueFromDatavalue( statement.mainsnak.datavalue ),
array = { value = analyzeDatavalue( statement.mainsnak.datavalue ),
[ 'value-type' ] = statement.mainsnak.datavalue.type }
[ 'value-type' ] = statement.mainsnak.datavalue.type }
if statement.qualifiers then
if statement.qualifiers then
if not qualifiers then -- all qualifier properties
if not qualifiers then -- all qualifier properties
for key, qualTab in pairs( statement.qualifiers ) do
for key, qualTab in pairs( statement.qualifiers ) do
for _, qual in ipairs( qualTab ) do
toQualifierTable( key, qualTab )
if qual.snaktype == 'value' then
array[ key ], array[ key .. '-type' ] =
getValueFromDatavalue( qual.datavalue )
break
end
end
end
end
else -- table of selected qualifier properties
else -- table of selected qualifier properties
for key, value in ipairs( qualifiers ) do
for _, key in ipairs( qualifiers ) do
if statement.qualifiers[ value ] then
if statement.qualifiers[ key ] then
for _, qual in ipairs( statement.qualifiers[ value ] ) do
toQualifierTable( key, statement.qualifiers[ key ] )
if qual.snaktype == 'value' then
array[ value ], array[ value .. '-type' ] =
getValueFromDatavalue( qual.datavalue )
break
end
end
end
end
end
end
end
end
end
end
table.insert( result, array )
table.insert( results, array )
end
 
-- clustering statements with identical value
local helper = {}
local sort1 = 0
for _, result in ipairs( results ) do
if helper[ result.value ] then
helper[ result.value ].sort2 = helper[ result.value ].sort2 + 1
else
sort1 = sort1 + 1
helper[ result.value ] = { sort1 = sort1, sort2 = 1 }
end
result.sort1 = helper[ result.value ].sort1
result.sort2 = helper[ result.value ].sort2
end
end
return result
if #results > 2 then
table.sort( results,
function( a, b )
return a.sort1 < b.sort1 or
( a.sort1 == b.sort1 and a.sort2 < b.sort2 )
end
)
end
 
return results
end
end


Zeile 319: Zeile 351:
end
end
return result
return result
end
function wu._failsafe( version, moduleInterface )
if type( moduleInterface ) ~= 'table' then
return false
end
local i, parent, v
-- check if version is a frame table
if type( version ) == 'table' and type( version.args ) == 'table' then
v = version.args[ 1 ]
if not v and type( version.getParent ) == 'function' then
parent = version:getParent()
if parent then
v = parent.args[ 1 ]
end
end
version = v
-- otherwise version should be a string
elseif type( version ) == 'string' then
-- check if empty string
version = mw.text.trim( version )
if version == '' then
version = nil
end
else
version = nil
end
-- getting version from Wikidata
if version == 'wikidata' then
version = nil
i = moduleInterface.item
if type( i ) == 'number' and i > 0 then
v = wu.getValue( 'Q' .. i, 'P348' )
if v ~= '' then
return v
end
end
end
if not moduleInterface.serial then
return false
elseif not version or version <= moduleInterface.serial then
return moduleInterface.serial
else
return false
end
end
-- module administration
function wu.getModuleInterface()
return WikidataUtilities
end
function wu.failsafe( version )
return wu._failsafe( version, WikidataUtilities ) or ''
end
end


return wu
return wu
Anonymer Benutzer