Moduł:InformationProvider

Z Nonsensopedii, polskiej encyklopedii humoru

Moduł pobierający informacje semantyczne o innych plikach, czy to w lokalnym repozytorium, czy na Wikimedia Commons.

Zobacz też: Moduł:Information, który ustawia te informacje.


local autor = require('Module:Autor')
local p = {}

-- Pobiera informacje semantyczne o plikach. Zwraca tyle informacji, ile jest potrzebne do wyświetlenia w Information.
-- Argumenty:
--   files: tablica tytułów plików, w stringach, bylejakie przedrostki i w ogóle
-- Zwracana jest tablica indeksowana tytułami plików bez przedrostka
function p.getData(files)
	-- Ustalamy źródła grafik i dzielimy na dwie kupki
	local fileRepos = mw.ext.commonsClient.getFileRepo(files)
	local result, todoLocal, todoCommons = {}, {}, {}
	for k, v in pairs(fileRepos) do
		if v == 'local' then table.insert(todoLocal, k)
		else table.insert(todoCommons, k) end
	end
	
	-- Najpierw commonsowe, używamy SemanticCommonsClient
	if #todoCommons > 0 then
		local resCommons = mw.ext.commonsClient.getData(todoCommons)
		for k, v in pairs(resCommons) do
			if v.found then
				local _, author = autor.getAuthorFromCommonsData(v.author)
				
				local f = {
					repo = 'Wikimedia Commons',
					entityId = v.entityId,
					author = author,
					licenseShort = v.license.shortName or v.license.spdxId,
					licenseLong = v.license.longName,
					licenseUrl = v.license.url
				}
				
				-- Ponieważ nie ma jeszcze działającego systemu licencji semantycznych, wrzućmy teksty
				-- w jakąś heurę do zgadywania jaki kolor licboxa temu nadać.
				local lShort = mw.ustring.lower(v.license.shortName or '')
				local lLong = mw.ustring.lower(v.license.longName or '')
				
				-- najpierw CC żeby poprawnie łapało lickę CC0
				if mw.ustring.find(lShort, 'cc') or mw.ustring.find(lLong, 'creative commons') then
					f.licenseType = 'cc'
				-- różne domenopublicznawe
				elseif v.license.isPublicDomain or 
					mw.ustring.find(lShort .. lLong, 'public domain') or
					mw.ustring.find(lShort, 'no restrictions')
				then
					f.licenseShort = 'domena publiczna'
					f.licenseType = 'pd'
				-- a to nie wiadomo, załóżmy GNU
				else
					f.licenseType = 'gnu'
				end
				result[mw.ustring.sub(k, 6)] = f
			end
		end
	end
	
	-- A teraz lokalne, przez Ask
	if #todoLocal == 0 then return result end
	local resLocal = mw.smw.getQueryResult{
		'[[Plik:' .. table.concat(todoLocal, '||Plik:') .. ']]',
		'?Ma opis autorstwa=author',
		-- tu powinna być jeszcze licka, ale to nie działa na razie :(
		-- tak, z Commons jest łatwiej to wyciągnąć niż z Nonsy.
		limit = #todoLocal,
		link = 'none'
	}
	for _, v in ipairs(resLocal.results or {}) do
		if v.printouts then
			result[mw.ustring.sub(v.fulltext, 6)] = {
				repo = 'Nonsensopedia',
				author = (v.printouts.author or {})[1]
			}
		end
	end
	
	return result
end

function p.test(files)
	mw.logObject(p.getData({
		'File:Uncyclopedia_logo_notext.svg',
		'Mojżesz z iPadem.jpg',
		'Plik:Drzewo murowane.jpg',
		'Alfred Dedreux - Pug Dog in an Armchair.jpg',
		'commons:file:Gillie helping to jam the printer (467241015).jpg',
		'Margaret Thatcher (1983).jpg',
		'nieistnieje'
	}))
end

return p