Moduł:Information
Z Nonsensopedii, polskiej encyklopedii humoru
Wersja z dnia 20:47, 13 sty 2021 autorstwa Ostrzyciel (dyskusja • edycje) (+jedna mała rzecz a cieszy)
Moduł generujący tabelkę w szablonie {{Information}}
i ustawiający odpowiednie własności semantyczne. Instrukcję korzystania znajdziesz na stronie Nonsensopedia:Opisywanie grafik.
Zobacz też: Moduł:InformationProvider, który pobiera informacje o plikach.
local tools = require('Moduł:Narzędzia')
local linki = require('Moduł:Linki')
local data
local props = {}
local rows = {}
-- funkcje lokalne
-- funkcja pomocnicza do scalania tabel atrybutów
local function appendProps(key, value)
props[key] = props[key] or {}
table.insert(props[key], value)
end
local function addRow(id, name, content, trid, tdstyle)
local row = '<tr style="vertical-align: top"'
if not content then content = '' end
if trid then
row = row .. '; id="' .. trid .. '">'
else
row = row .. '>'
end
row = row .. '<td id="' .. id .. '" style="background: #ccf; text-align: right; padding-right: 0.4em; width: 15%; font-weight:bold">'
row = row .. name .. '</td>'
if tdstyle then
row = row .. '<td style="' .. tdstyle .. '">' .. content .. '</td></tr>'
else
row = row .. '<td>' .. content .. '</td></tr>'
end
table.insert(rows, row)
end
local function getTable()
local s =
'<table class="information-template toccolours" style="width: 100%;" cellpadding="4">'
.. table.concat(rows)
.. '</table>'
return s
end
------------------------------------------------------------------------
local function processParts(frame, args)
local prows = {}
local function pPart(num)
local row = '<tr><td>' .. args['psource' .. num] .. '</td>'
row = row .. '<td>' .. (args['pauthor' .. num] or '') .. '</td>'
local plic = (args['plic' .. num] or 'nolic')
plic = frame:expandTemplate{ title=plic, args={ mini=1 } }
row = row .. '<td style="padding: 0;">' .. plic .. '</td></tr>'
table.insert(prows, row)
end
if args['psource'] ~= nil then pPart('') end
for i = 1, 50 do
if args['psource' .. i] ~= nil then pPart(i)
else break end
end
if #prows == 0 then return end
local s = [[<table class="info-inner"><tr>
<td style="background: #ccf; font-weight:bold">Źródło</td>
<td style="background: #ccf; font-weight:bold">Autor</td>
<td style="background: #ccf; font-weight:bold">Licencja</td>
</tr>]]
s = s .. table.concat(prows) .. '</table>'
addRow('fileinfotpl_parts', 'Składowe', s, 'fileinforow_parts', 'padding: 0')
end
local function processCaption(args, required)
-- caption
local captionLinksCount = 0
-- stosujemy podpis jako domyślny opis dla MMV, a w razie jego braku bierzemy pole description
local descriptionTag = 'fileinfotpl_desc'
if args['caption'] or demo then
appendProps('Ma podpis pliku', args['caption'])
local captionDisplay = args['caption']
descriptionTag = 'fileinfotpl_full_desc'
local captionLinks = linki.wLink(args['caption'] or '')
for k, v in pairs(captionLinks) do
appendProps('Linkuje w podpisie', k)
captionLinksCount = captionLinksCount + 1
end
if captionLinksCount == 0 and captionDisplay ~= nil then
captionDisplay = captionDisplay .. ' ' ..
mw.smw.info('W podpisie nie ma żadnego linku do artykułu. Rozważ wstawienie jakiegoś, by odnieść czytelnika do powiązanego artykułu.', 'warning')
end
addRow('fileinfotpl_desc', 'Podpis', captionDisplay)
else
appendProps('Nie ma podpisu pliku', true)
if required then
-- inne ID bo nie chcemy żeby pokazywało nam ten error w podglądach
addRow('fileinfotpl_desc_error', 'Podpis', "''Brak''")
end
end
appendProps('Liczba linków w podpisie', captionLinksCount)
return descriptionTag
end
-- zbuduj tabelkę dla plików z lokalnego repo
local function doLocal(frame, args)
appendProps('Pochodzi z repozytorium', 'Nonsensopedia')
local demo = args['demo'] ~= nil
-- caption
local descriptionTag = processCaption(args)
-- description
if args['description'] then
appendProps('Ma opis', args['description'])
addRow(descriptionTag, 'Opis', args['description'])
else
appendProps('Nie ma opisu', true)
addRow(descriptionTag, 'Opis', "''Brak''")
end
-- składowe
processParts(frame, args)
-- data
if args['date'] or demo then
if not data then data = require('Module:Data') end -- lazy
local dSMW, dClean = data.processToSMW(args['date'])
appendProps('Ma opis daty', dClean)
addRow('fileinfotpl_date', 'Data', dSMW)
else
appendProps('Nie ma daty', true)
end
-- źródło
if args['source'] then
local source = require('Module:Źródło')
local aprops, s = source.process(args['source'])
if not demo then mw.smw.set(aprops) end
addRow('fileinfotpl_src', 'Źródło', args['source'])
else
addRow('fileinfotpl_src', 'Źródło',
"'''Nie podano źródła.''' Uzupełnij <code>Source=</code> (''Praca własna'', adres URL strony lub pliku)")
if not demo then appendProps('Nie ma podanego źródła', true) end
end
-- author
if args['author'] or demo then
local autor = require('Module:Autor')
local aprops, s = autor.process(args['author'], true)
if not demo then mw.smw.set(aprops) end
addRow('fileinfotpl_aut', 'Autor', s)
end
-- permission
if args['permission'] or demo then
-- TODO: smw i te sprawy
addRow('fileinfotpl_perm', 'Licencja', args['permission'])
end
-- confirmation
if args['confirmation'] or demo then
appendProps('Ma potwierdzenie licencji', args['confirmation'])
addRow('fileinfotpl_confirmation', 'Potwierdzenie licencji', args['confirmation'])
end
-- other versions
local ov = args['other_versions']
if (ov and ov ~= '' and ov ~= '-' and ov ~= 'none') or demo then
local ovs = linki.wLink(ov or '')
for l, v in pairs(ovs) do
if mw.ustring.find(l, ':') == 1 then
appendProps('Ma inną wersję', mw.ustring.gsub(l, ';', '\\;') .. ';' .. mw.ustring.gsub(v, ';', '\\;'))
elseif #l > 0 then
appendProps('Ma inną wersję', mw.ustring.gsub(l, ';', '\\;'))
end
end
addRow('fileinfotpl_ver', 'Inne wersje', ov)
end
-- location
local loc = args['location']
if loc then
local locModule = require('Moduł:Lokalizacja')
local _, text, geoprops = locModule.parseLocation(frame, loc, true)
for key, val in pairs(geoprops) do
appendProps(key, val)
end
addRow('fileinfotpl_loc', 'Lokalizacja', text)
end
if not demo then mw.smw.set(props) end
return getTable()
end
-- zbuduj tabelkę dla pliku z Commons
local function doRemote(frame, args, title)
local scc = mw.ext.commonsClient.getData(title)
local remoteData = nil
for k, v in pairs(scc) do remoteData = v end
if remoteData == nil or not remoteData.found then
return doNoSuchFile(args, title)
end
local demo = args['demo'] ~= nil
appendProps('Pochodzi z repozytorium', 'Wikimedia Commons')
appendProps('Ma identyfikator Wikimedia Commons', remoteData.entityId)
processCaption(args, true)
local importInfo = {}
if remoteData.location then
table.insert(importInfo, 'lokalizacja')
appendProps('Ma lokalizację',
remoteData.location.latitude .. ', ' .. remoteData.location.longitude)
end
-- autor
local aType = nil
local a = remoteData.author
if a.isAnonymous then
appendProps('Ma autora', 'anonim')
aType = 'anonim'
elseif a.text or '' ~= '' then
appendProps('Ma autora', a.text)
local opis = a.text
if a.url then
opis = '[' .. a.url .. ' ' .. mw.ustring.gsub(a.text, '[%[%]]', '') .. ']'
if not a.wikimediaUsername then
appendProps('Ma zewnętrznego autora', a.url .. ';' .. mw.ustring.gsub(a.text, ';', '\\;'))
aType = 'link'
end
else
aType = 'tekst'
end
if a.wikimediaUsername then
opis = '[[commons:User:' .. a.wikimediaUsername .. '|' .. a.wikimediaUsername .. ']]'
appendProps('Ma autora z Wikimedia Commons', 'commons:User:' .. a.wikimediaUsername)
aType = 'użytkownik Commons'
end
if a.wikidataId then
appendProps('Ma autora z Wikidanych', a.wikidataId)
aType = 'Wikidane'
end
if a.wikipediaArticleTitle then
opis = '[[wikipedia:' .. a.wikipediaArticleLang .. ':' ..
a.wikipediaArticleTitle .. '|' .. a.wikipediaArticleTitle .. ']]'
end
appendProps('Ma opis autorstwa', opis)
end
if aType then
table.insert(importInfo, 'autor (' .. aType .. ')')
end
addRow('fileinfotpl_import_info', 'Importowane dane', table.concat(importInfo, ', '))
if not demo then mw.smw.set(props) end
return getTable()
end
-- zbuduj tabelkę dla nieistniejącego pliku
local function doNoSuchFile(args, title)
local demo = args['demo'] ~= nil
addRow('fileinfotpl_error', 'Błąd', 'Nie odnaleziono pliku "' .. title .. '" ani na Nonsensopedii, ani w Wikimedia Commons.')
appendProps('Pochodzi z repozytorium', 'nieznane')
if not demo then mw.smw.set(props) end
return getTable()
end
-- funkcje eksportowane
local p = {}
-- zrób cuda
function p.information(frame)
local args = tools.getArgs(frame)
local title = args['title'] or mw.title.getCurrentTitle().text
local repos = mw.ext.commonsClient.getFileRepo(title)
for k, v in pairs(repos) do
if v == 'wikimediacommons' then return doRemote(frame, args, title)
else return doLocal(frame, args) end
end
return doNoSuchFile(args, title)
end
return p