Zum Inhalt springen

Modul:FBMVerlagTable

aus Wikipedia, der freien Enzyklopädie

Die Dokumentation für dieses Modul kann unter Modul:FBMVerlagTable/Doku erstellt werden

-- Modul:FBMVerlagTable
-- Kompakte Arbeitsübersicht für WP:FBM-Verlagsseiten
-- Verwendung:
-- {{#invoke:FBMVerlagTable|table|Q16009958|Q42298814|Q1379034}}

local p = {}

local coreLangs = { 'de', 'en', 'fr', 'es' }

local langIcons = {
de = '[[Datei:Germany-orb.png|15px]]<br />de',
en = '[[Datei:United-Kingdom-orb.png|15px]]<br />en',
fr = '[[Datei:France-orb.png|15px]]<br />fr',
es = '[[Datei:Spain-orb.png|15px]]<br />es'
}

local function yes()
return '<span style="color:green; font-weight:bold;" title="vorhanden">✓</span>'
end

local function no()
return '<span style="color:#b00020; font-weight:bold;" title="nicht vorhanden">✗</span>'
end

local function dash()
return '<span style="color:#777;">–</span>'
end

local function hasClaim(entity, prop)
if entity and entity.claims and entity.claims[prop] then
return true
end
return false
end

local function getFirstStatementValue(entity, prop)
if not entity or not entity.claims or not entity.claims[prop] then
return nil
end

local statement = entity.claims[prop][1]
if not statement or not statement.mainsnak or statement.mainsnak.snaktype ~= 'value' then
	return nil
end

if not statement.mainsnak.datavalue then
	return nil
end

return statement.mainsnak.datavalue.value

end

local function getYear(entity, prop)
local value = getFirstStatementValue(entity, prop)
if not value or not value.time then
return nil
end

local year = value.time:match('^%+?(%d%d%d%d)')
if year then
	return year
end

return nil

end

local function isHuman(entity)
local value = getFirstStatementValue(entity, 'P31')
if value and value['numeric-id'] == 5 then
return true
end
return false
end

local function getLifeDates(entity)
if not isHuman(entity) then
return ''
end

local birth = getYear(entity, 'P569')
local death = getYear(entity, 'P570')

if birth and death then
	return '<br /><span style="font-size:smaller;">(' .. birth .. '–' .. death .. ')</span>'
elseif birth then
	return '<br /><span style="font-size:smaller;">(geb. ' .. birth .. ')</span>'
elseif death then
	return '<br /><span style="font-size:smaller;">(gest. ' .. death .. ')</span>'
end

return '<br /><span style="font-size:smaller;">(Lebensdaten prüfen)</span>'

end

local function getLabel(entity, id)
local label = entity:getLabel('de') or entity:getLabel('en')
if label and label ~= '' then
return label
end

local deSitelink = entity:getSitelink('dewiki')
if deSitelink then
	return deSitelink
end

local enSitelink = entity:getSitelink('enwiki')
if enSitelink then
	return enSitelink
end

return id

end

local function getDescription(entity)
local description = entity:getDescription('de') or entity:getDescription('en')
if description and description ~= '' then
return description
end

return '<span style="color:#777;">Beschreibung fehlt</span>'

end

local function getImageCell(entity)
local image = entity:formatPropertyValues('P18').value
if image and image ~= '' then
return '[[Datei:' .. image .. '|center|90px]]'
end

return dash()

end

local function makeArticleLink(entity, label, id)
local deSitelink = entity:getSitelink('dewiki')
if deSitelink then
return '[[' .. deSitelink .. '|' .. label .. ']]'
end

local enSitelink = entity:getSitelink('enwiki')
if enSitelink then
	return '[[:en:' .. enSitelink .. '|' .. label .. ']]'
end

local frSitelink = entity:getSitelink('frwiki')
if frSitelink then
	return '[[:fr:' .. frSitelink .. '|' .. label .. ']]'
end

local esSitelink = entity:getSitelink('eswiki')
if esSitelink then
	return '[[:es:' .. esSitelink .. '|' .. label .. ']]'
end

return '[[d:' .. id .. '|' .. label .. ']]'

end

local function makeLangCell(entity, lang)
local sitelink = entity:getSitelink(lang .. 'wiki')
if sitelink then
return '| style="background:#cfc; text-align:center;" | [[:' .. lang .. ':' .. sitelink .. '|+]]'
end

return '| style="text-align:center;" | –'

end

local function countWikipediaSitelinks(entity)
local count = 0
if not entity or not entity.sitelinks then
return 0
end

for key, _ in pairs(entity.sitelinks) do
	if key:match('wiki$') and key ~= 'commonswiki' then
		count = count + 1
	end
end

return count

end

local function countWdStatements(entity)
local count = 0

if not entity or not entity.claims then
	return 0
end

for _, statements in pairs(entity.claims) do
	if statements and statements[1] and statements[1].mainsnak then
		if statements[1].mainsnak.datatype ~= 'external-id' then
			count = count + 1
		end
	end
end

return count

end

local function getCommonsCell(entity)
local hasImage = hasClaim(entity, 'P18')
local hasCommonsCategory = hasClaim(entity, 'P373')
local hasCommonsSitelink = entity:getSitelink('commonswiki')

if hasImage and (hasCommonsCategory or hasCommonsSitelink) then
	return 'Bild ' .. yes() .. '<br />Kat. ' .. yes()
elseif hasImage then
	return 'Bild ' .. yes() .. '<br />Kat. ' .. no()
elseif hasCommonsCategory or hasCommonsSitelink then
	return 'Bild ' .. no() .. '<br />Kat. ' .. yes()
end

return 'Bild ' .. no() .. '<br />Kat. ' .. no()

end

local function normLine(entity, label, prop)
if hasClaim(entity, prop) then
return label .. ' ' .. yes()
end

return label .. ' ' .. no()

end

local function getNormdataCell(entity)
local parts = {}

table.insert(parts, normLine(entity, 'GND', 'P227'))
table.insert(parts, normLine(entity, 'VIAF', 'P214'))
table.insert(parts, normLine(entity, 'ORCID', 'P496'))
table.insert(parts, normLine(entity, 'ISNI', 'P213'))

return table.concat(parts, '<br />')

end

local function hasAllCoreNormdata(entity)
return hasClaim(entity, 'P227')
and hasClaim(entity, 'P214')
and hasClaim(entity, 'P496')
and hasClaim(entity, 'P213')
end

local function getTodoCell(entity)
local todos = {}

if not entity:getSitelink('dewiki') then
	table.insert(todos, 'dewiki prüfen')
end

if not hasClaim(entity, 'P18') then
	table.insert(todos, 'Bild prüfen')
end

if not hasClaim(entity, 'P373') and not entity:getSitelink('commonswiki') then
	table.insert(todos, 'Commons-Kat. prüfen')
end

if not hasAllCoreNormdata(entity) then
	table.insert(todos, 'Normdaten prüfen')
end

local deDescription = entity:getDescription('de')
if not deDescription or deDescription == '' then
	table.insert(todos, 'Beschreibung ergänzen')
end

if #todos == 0 then
	return dash()
end

return table.concat(todos, '<br />')

end

local function getClaimCount(entity, prop)
	if not entity or not entity.claims or not entity.claims[prop] then
		return 0
	end

	return #entity.claims[prop]
end

local function makeWorksQueryLink(id)
	local query =
		'SELECT ?work ?workLabel ?date WHERE {\n' ..
		'  ?work wdt:P50 wd:' .. id .. ' .\n' ..
		'  OPTIONAL { ?work wdt:P577 ?date . }\n' ..
		'  SERVICE wikibase:label { bd:serviceParam wikibase:language "de,en,fr,es". }\n' ..
		'}\n' ..
		'ORDER BY ?date ?workLabel'

	return '[https://query.wikidata.org/#' .. mw.uri.encode(query, 'PATH') .. ' Werke ↗]'
end

local function getWorksCell(entity, id)
	local p800Count = getClaimCount(entity, 'P800')
	local p800Status

	if p800Count > 0 then
		p800Status = 'P800 ' .. yes()
	else
		p800Status = 'P800 ' .. no()
	end

	return p800Status .. '<br />' .. makeWorksQueryLink(id)
end

function p.table(frame)
local result = {}

table.insert(result, '{| class="wikitable sortable" style="width:100%;"')
table.insert(result, '|-')
table.insert(result, '! Nr.')
table.insert(result, '! style="width:95px;" | Bild')
table.insert(result, '! Autorin / Autor')
table.insert(result, '! Kurzbeschreibung')

for _, lang in ipairs(coreLangs) do
	table.insert(result, '! class="unsortable" | ' .. langIcons[lang])
end

table.insert(result, '! <span title="Anzahl der vorhandenen Wikipedia-Sprachversionen">Σ</span>')
table.insert(result, '! Wikidata')
table.insert(result, '! <span title="Anzahl der Wikidata-Aussagen ohne externe Identifikatoren">WD-Items</span>')
table.insert(result, '! Commons')
table.insert(result, '! Normdaten')
table.insert(result, '! Werkdaten')
table.insert(result, '! Hinweis / To-do')

local index = 1

while frame.args[index] do
	local id = mw.text.trim(frame.args[index])
	local entity = mw.wikibase.getEntityObject(id)

	if entity then
		local label = getLabel(entity, id)
		local articleLink = makeArticleLink(entity, label, id)
		local description = getDescription(entity)
		local lifeDates = getLifeDates(entity)
		local languageCount = countWikipediaSitelinks(entity)
		local statementCount = countWdStatements(entity)

		table.insert(result, '|-')
		table.insert(result, '| style="text-align:right;" | ' .. index)
		table.insert(result, '| ' .. getImageCell(entity))
		table.insert(result, '| ' .. articleLink .. lifeDates)
		table.insert(result, '| ' .. description)

		for _, lang in ipairs(coreLangs) do
			table.insert(result, makeLangCell(entity, lang))
		end

		table.insert(result, '| style="text-align:right;" | ' .. languageCount)
		table.insert(result, '| data-sort-value="' .. string.sub(id, 2) .. '" | [[d:' .. id .. '|' .. id .. ']]')
		table.insert(result, '| style="text-align:right;" | ' .. statementCount)
        table.insert(result, '| ' .. getCommonsCell(entity))
        table.insert(result, '| ' .. getNormdataCell(entity))
        table.insert(result, '| ' .. getWorksCell(entity, id))
        table.insert(result, '| ' .. getTodoCell(entity))
	else
		table.insert(result, '|-')
		table.insert(result, '| style="text-align:right;" | ' .. index)
		table.insert(result, '| colspan="13" | <span style="color:red;">Wikidata-Objekt nicht gefunden: ' .. id .. '</span>')
	end

	index = index + 1
end

table.insert(result, '|}')

return table.concat(result, '\n')

end

return p