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- | serial = '2020-10-01', | ||
item = 65439025 | item = 65439025 | ||
} | } | ||
Zeile 220: | Zeile 220: | ||
end | end | ||
local function | 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.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 | 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 | return results | ||
end | end | ||
Zeile 252: | Zeile 274: | ||
end | end | ||
for _, statement in ipairs( statements ) do | for _, statement in ipairs( statements ) do | ||
array = { value = | 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 | ||
toQualifierTable( key, qualTab ) | |||
end | end | ||
else -- table of selected qualifier properties | else -- table of selected qualifier properties | ||
for key | for _, key in ipairs( qualifiers ) do | ||
if statement.qualifiers[ | if statement.qualifiers[ key ] then | ||
toQualifierTable( key, statement.qualifiers[ key ] ) | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
table.insert( | 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 | 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 |