Moduł:Information/sandbox: Różnice pomiędzy wersjami

Z Nonsensopedii, polskiej encyklopedii humoru
M
M (ups, Eksekka nadpisałem)
Znacznik: anulowanie
 
Linia 1: Linia 1:
local autor = require('Moduł:Autor')
local tools = require('Moduł:Narzędzia')
local tools = require('Moduł:Narzędzia')
local licenseTools = require("Moduł:Narzędzia licencyjne")
local linki = require('Moduł:Linki')
local linki = require('Moduł:Linki')
local data
local data
Linia 7: Linia 7:


-- funkcje lokalne
-- funkcje lokalne

local function mergeTables(a, b)
if type(a) == "table" and type(b) == "table" then
for _, v in ipairs(b) do
a[#a + 1] = v
end
end
end


-- funkcja pomocnicza do scalania tabel atrybutów
-- funkcja pomocnicza do scalania tabel atrybutów
Linia 43: Linia 51:
return s
return s
end
end

------------------------------------------------------------------------


local function processParts(frame, args)
local function processParts(frame, args)
local prows = {}
local prows = {}
local partIndex = 1
-- generowanie wiersza tabelki
local function pRow(psource, pauthor, plic)
local function pPart(num)
local row = '<tr><td>' .. psource .. '</td>'
local plic = (args['plic' .. num] or 'nolic')
.. '<td>' .. pauthor .. '</td>'
local template, templateTable, templateCall = plic, {}, ""
.. '<td style="padding: 0;">' .. plic .. '</td></tr>'
if plic:find("<table") == nil then -- użytkownik przekazał tylko nazwę szablonu
table.insert(prows, row)
-- template = plic
end
templateCall = "{{" .. template .. "}}"
else
-- zawija minilicboxa w dodatkową tabelkę z bąbelkiem ostrzeżenia
templateTable = licenseTools.getTemplateFromCode(plic)
local function miniLicboxWithBubble(licbox, bubble)
mw.log("TemplateTable = ")
return '<table style="border-spacing: 0; margin: 0;"><tr><td style="width: 100%; padding: 0;">'
mw.logObject(templateTable)
.. licbox .. '</td><td>' .. bubble .. '</td></tr></table>'
templateCall = licenseTools.reconstructTemplateCall(templateTable)
end
end
-- robimy listę plików do ogarnięcia
-- dodatkowe argumenty, sterujące wyświetlaniem informacji o domniemaniu/copydownie
local partNums, partNames, partNumsToNames = {}, {}, {}
local modifierParams = ""
local function indexPart(num)
table.insert(partNums, num)
-- subobject dla SMW
local links = linki.wLink(args['psource' .. num])
local obj = {}
for k, _ in pairs(links) do

local targetName = mw.ustring.gsub(mw.text.trim(k), '^:?[Cc]ommons:', '')
-- wyciąganie wewnętrznego szablonu licencji i modyfikatorów typu domniemanie
local target = mw.title.new(targetName)
-- index po to, żeby w licboksie wyświetlały się według kolejności
local index = 1
if target.namespace == 6 then
while true do
table.insert(partNames, target.text)
if templateTable["name"] == nil then break end
partNumsToNames[num] = target.text
local name = templateTable.name
if name == "domniemanie" then
-- przechodzimy do argumentu lic
templateTable = templateTable.args["lic"]
obj["Ma domniemaną licencję"] = true
modifierParams = modifierParams .. "|domniemanie=" .. index
index = index + 1
elseif name == "copydown" then
obj["Ma licencję copydown"] = true
modifierParams = modifierParams .. "|copydown=" .. index
index = index + 1
if templateTable.args["lic"] ~= nil then
-- przechodzimy do argumentu lic
templateTable = templateTable.args["lic"]
else
-- przypadek copydowna bez licencji wewnętrznej, traktujemy jako licencję główną
template = templateTable.name
break
end
else
template = name
break
break
end
end
end
end
-- SMW
obj["Jest składową pliku"] = mw.title.getCurrentTitle().prefixedText
obj["Ma licencję"] = "Szablon:" .. template
local autor = require("Moduł:Autor")
local zrodlo = require("Moduł:Źródło")
local aprops, author = autor.process(args['pauthor' .. num])
for k, v in pairs(aprops) do
obj[k] = v
end
local sprops, source = zrodlo.process(args['psource' .. num])
for k, v in pairs(sprops) do
obj[k] = v
end
mw.smw.subobject(obj, "Licencja składowej nr " .. partIndex)
partIndex = partIndex + 1
-- ustawianie wszystkiego na podstawie źródła, gdy jest nim Nonsa
-- TODO: usuwanie artybutów SMW
local partFromNonsensopedia = sprops["Jest pracą własną"] ~= nil or sprops["Ma źródło"] == "Nonsensopedia"
if partFromNonsensopedia then
-- set author
-- set license
end
local row = '<tr><td>' .. source .. '</td>'
row = row .. '<td>' .. author .. '</td>'
row = row .. '<td style="padding: 0;">'
-- wywołanie szablonu dla JS
row = row .. '<div style="display: none" class="js-preview-call"><nowiki>' .. templateCall .. '</nowiki></div>'
-- expand template będzie na końcu
row = row .. "{{" .. template .. "|mini=1" .. modifierParams .. "}}</td></tr>"
table.insert(prows, row)
end
end
if args['psource'] then indexPart('') end
if args['psource'] ~= nil then pPart('') end
for i = 1, 50 do
for i = 1, 50 do
if args['psource' .. i] then indexPart(i)
if args['psource' .. i] ~= nil then pPart(i)
else break end
else break end
end
-- pobieramy informacje z Commons i Nonsy
local fileInfos = {}
if #partNames > 0 then
local infop = require('Moduł:InformationProvider')
fileInfos = infop.getData(partNames)
end
-- wypełniamy wiesze tabeli
for _, num in ipairs(partNums) do
local name = partNumsToNames[num]
if name then
local metadata = fileInfos[name]
if metadata == nil then
-- fallback: nie znaleziono pliku, wracamy do specyfikacji explicite
appendProps('Ma ostrzeżenie składowej', 'Nie znaleziono powiązanego pliku')
pRow(
args['psource' .. num] .. ' ' .. mw.smw.info('Podany plik nie został odnaleziony ani na Nonsensopedii, ani w Wikimedia Commons. Niedobrze.', 'error'),
(args['pauthor' .. num] or ''),
frame:expandTemplate{ title=(args['plic' .. num] or 'nolic'), args={ mini=1 } }
)
else
-- korzystamy z metadanych pobranych automatycznie
local psource = args['psource' .. num]
local pauthor = args['pauthor' .. num]
if pauthor and metadata.author then
appendProps('Ma ostrzeżenie składowej', 'Nadpisane pole autorstwa')
pauthor = pauthor .. ' ' .. mw.smw.info('Podany argument nadpisuje wartość pobraną z repozytorium: ' .. metadata.repo, 'warning')
elseif metadata.author then
pauthor = metadata.author .. ' ' .. mw.smw.info('Pobrano automatycznie z repozytorium: ' .. metadata.repo)
end
local plic = args['plic' .. num]
if plic and metadata.licenseShort then
appendProps('Ma ostrzeżenie składowej', 'Nadpisane pole licencji')
plic = miniLicboxWithBubble(
frame:expandTemplate{ title=plic, args={ mini=1 } },
mw.smw.info('Podany argument nadpisuje wartość pobraną z repozytorium: ' .. metadata.repo, 'warning')
)
elseif metadata.licenseShort then
plic = frame:expandTemplate{ title='licbox', args={
metadata.licenseShort,
'',
metadata.licenseLong or '',
typ=metadata.licenseType or 'gnu',
mini=1
} }
plic = miniLicboxWithBubble(plic, mw.smw.info('Pobrano automatycznie z repozytorium: ' .. metadata.repo))
else
local severity = 'warning'
if plic == nil then
appendProps('Ma ostrzeżenie składowej', 'Nie podano licencji')
severity = 'error'
end
plic = miniLicboxWithBubble(
frame:expandTemplate{ title=plic or 'nolic', args={ mini=1 } },
mw.smw.info('Nie udało się pobrać informacji o licencji. Póki co działa to tylko dla plików z Commons, te nonsowe musisz przeklepać ręcznie.', severity)
)
end
pRow(psource, pauthor, plic)
end
else
-- składowa podana explicite
pRow(
args['psource' .. num],
(args['pauthor' .. num] or ''),
frame:expandTemplate{ title=(args['plic' .. num] or 'nolic'), args={ mini=1 } }
)
end
end
end
Linia 167: Linia 163:
end
end


-- funkcje eksportowane
local function processCaption(args, required)
local p = {}

-- zrób cuda
-- p.information({args = {permission = "{{domniemanie|lic={{copydown|lic={{PD}}}}}}"}})
function p.information(frame)
local arguments = require("Moduł:Arguments")
local args = arguments.getArgs(frame)
local demo = args['demo'] ~= nil
-- caption
-- 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
if args['caption'] or demo then
appendProps('Ma podpis pliku', args['caption'])
appendProps('Ma podpis pliku', args['caption'])
local captionDisplay = args['caption']
addRow('fileinfotpl_caption', 'Podpis', 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
else
appendProps('Nie ma podpisu pliku', true)
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
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
-- description
if args['description'] then
if args['description'] then
appendProps('Ma opis', args['description'])
appendProps('Ma opis', args['description'])
addRow(descriptionTag, 'Opis', args['description'])
addRow('fileinfotpl_desc', 'Opis', args['description'])
else
else
appendProps('Nie ma opisu', true)
appendProps('Nie ma opisu', true)
addRow(descriptionTag, 'Opis', "''Brak''")
addRow('fileinfotpl_desc', 'Opis', "''Brak''")
end
end
Linia 236: Linia 208:
local aprops, s = source.process(args['source'])
local aprops, s = source.process(args['source'])
if not demo then mw.smw.set(aprops) end
if not demo then mw.smw.set(aprops) end
addRow('fileinfotpl_src', 'Źródło', args['source'])
addRow('fileinfotpl_source', 'Źródło', args['source'])
else
else
addRow('fileinfotpl_src', 'Źródło',
addRow('fileinfotpl_source', 'Źródło',
"'''Nie podano źródła.''' Uzupełnij <code>Source=</code> (''Praca własna'', adres URL strony lub pliku)")
"'''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
if not demo then appendProps('Nie ma podanego źródła', true) end
Linia 245: Linia 217:
-- author
-- author
if args['author'] or demo then
if args['author'] or demo then
local aprops, s = autor.process(args['author'], true)
local autor = require('Module:Autor')
local aprops, s = autor.process(args['author'])
if not demo then mw.smw.set(aprops) end
if not demo then mw.smw.set(aprops) end
addRow('fileinfotpl_aut', 'Autor', s)
addRow('fileinfotpl_author', 'Autor', s)
end
end
-- permission
-- permission
if args['permission'] or demo then
if args['permission'] or demo then
local permission = args["permission"]
-- TODO: smw i te sprawy
local nextParsePoint = 1
local i = 0
local templateCallTree, templateRecords = nil, {}
mw.log("args['permission'] = " .. permission)
local previousParseTextLength = 0
while nextParsePoint do
-- to jest potrzebne, bo funkcja dostaje kawalek kodu i zwraca nastepny punkt parsowania w tym kodzie, wiec trzeba dodac to co bylo przedtem
local prevParsePoint = nextParsePoint - 1
mw.logObject({iteration = i, position = nextParsePoint, parsedText = permission:sub(nextParsePoint, -1)})
templateCallTree, nextParsePoint = licenseTools.getTemplateFromCode(permission:sub(nextParsePoint, -1))
if nextParsePoint ~= nil then
nextParsePoint = nextParsePoint + prevParsePoint
end
mw.logObject(templateCallTree)
i = i + 1
if i == 10 then return end
if templateCallTree == nil then break end
-- zwraca listę występujących w tekście szablonów, z informacją czy występują modyfikatory licencji
local function parseTree(templateCallTree, domniemanie, copydown, sself)
if templateCallTree == nil then return nil end
local t = {}
if templateCallTree.name == "self" then
mw.log("Setting sself = true")
sself = true
for name, value in pairs(templateCallTree.args) do
mergeTables(t, parseTree(value, domniemanie, copydown, sself))
end
elseif templateCallTree.name == "copydown" then
mw.log("Setting copydown = true")
copydown = true
if templateCallTree.args["lic"] then
mergeTables(t, parseTree(templateCallTree.args["lic"], domniemanie, copydown, sself))
else -- traktujemy jako licencję główną
table.insert(t,
{
name = templateCallTree.name,
copydown = copydown,
domniemanie = domniemanie,
sself = sself
})
end
elseif templateCallTree.name == "domniemanie" then
mw.log("Setting domniemanie = true")
domniemanie = true
mergeTables(t, parseTree(templateCallTree.args["lic"], domniemanie, copydown, sself))
else -- license template
table.insert(t,
{
name = templateCallTree.name,
copydown = copydown,
domniemanie = domniemanie,
sself = sself
})
end
return t
end
local templateRecords2 = parseTree(templateCallTree, false, false, false)
if templateRecords2 ~= nil then
mergeTables(templateRecords, templateRecords2)
end
end
mw.logObject(templateRecords, "templateRecords = ")
local i = 1
for _, record in ipairs(templateRecords) do
local obj = {}
obj["Ma licencję"] = "Szablon:" .. record.name
if record.copydown then
obj["Ma licencję copydown"] = true
end
if record.domniemanie then
obj["Ma licencję domniemaną"] = true
end
if record.sself then
obj["Jest pracą własną"] = true
end
local res = mw.smw.subobject(obj, "Licencja nr " .. i)
if res ~= true then
mw.log(res.error)
end
i = i + 1
end
addRow('fileinfotpl_perm', 'Licencja', args['permission'])
addRow('fileinfotpl_perm', 'Licencja', args['permission'])
end
end
Linia 265: Linia 327:
local ov = args['other_versions']
local ov = args['other_versions']
if (ov and ov ~= '' and ov ~= '-' and ov ~= 'none') or demo then
if (ov and ov ~= '' and ov ~= '-' and ov ~= 'none') or demo then
local ovs = linki.wLink(ov or '')
local ovs = linki.wLink(ov)
for l, v in pairs(ovs) do
for l, v in pairs(ovs) do
if mw.ustring.find(l, ':') == 1 then
if mw.ustring.find(l, ':') == 1 then
Linia 291: Linia 353:
if not demo then mw.smw.set(props) end
if not demo then mw.smw.set(props) end
return getTable()
return frame:preprocess(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 = {}
-- lokalizacja
if remoteData.location then
table.insert(importInfo, 'lokalizacja')
appendProps('Ma lokalizację',
remoteData.location.latitude .. ', ' .. remoteData.location.longitude)
end
-- data
if remoteData.dateTime and mw.ustring.find(mw.ustring.lower(remoteData.dateTime), 'nieznan', 1, true) == nil then
appendProps('Ma datę', remoteData.dateTime)
appendProps('Ma opis daty', remoteData.dateTime)
table.insert(importInfo, 'data')
else
appendProps('Nie ma daty', true)
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)
if a.wikimediaUsername then
appendProps('Ma autora z Wikimedia Commons', 'commons:User:' .. a.wikimediaUsername)
aType = 'użytkownik Commons'
elseif a.url then
appendProps('Ma zewnętrznego autora', a.url .. ';' .. mw.ustring.gsub(a.text, ';', '\\;'))
aType = 'link'
else
aType = 'tekst'
end
if a.wikidataId then
appendProps('Ma autora z Wikidanych', a.wikidataId)
aType = 'Wikidane'
end
end
appendProps('Ma opis autorstwa', autor.getAuthorTextFromCommonsData(remoteData))
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
end



Aktualna wersja na dzień 09:09, 8 kwi 2021

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Information/sandbox/opis

local tools = require('Moduł:Narzędzia')
local licenseTools = require("Moduł:Narzędzia licencyjne")
local linki = require('Moduł:Linki')
local data
local props = {}
local rows = {}

-- funkcje lokalne

local function mergeTables(a, b)
	if type(a) == "table" and type(b) == "table" then
		for _, v in ipairs(b) do
			a[#a + 1] = v
		end
	end
end

-- 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 partIndex = 1
	local function pPart(num)
		local plic = (args['plic' .. num] or 'nolic')
		
		local template, templateTable, templateCall = plic, {}, ""
		if plic:find("<table") == nil then -- użytkownik przekazał tylko nazwę szablonu
			-- template = plic
			templateCall = "{{" .. template .. "}}"
		else
			templateTable = licenseTools.getTemplateFromCode(plic)
			mw.log("TemplateTable = ")
			mw.logObject(templateTable)
			templateCall = licenseTools.reconstructTemplateCall(templateTable)
		end
		
		-- dodatkowe argumenty, sterujące wyświetlaniem informacji o domniemaniu/copydownie
		local modifierParams = ""
		
		-- subobject dla SMW
		local obj = {}

		-- wyciąganie wewnętrznego szablonu licencji i modyfikatorów typu domniemanie
		-- index po to, żeby w licboksie wyświetlały się według kolejności
		local index = 1
		while true do
			if templateTable["name"] == nil then break end
			local name = templateTable.name
			if name == "domniemanie" then
				-- przechodzimy do argumentu lic
				templateTable = templateTable.args["lic"]
				
				obj["Ma domniemaną licencję"] = true
				modifierParams = modifierParams .. "|domniemanie=" .. index
				index = index + 1
			elseif name == "copydown" then
				obj["Ma licencję copydown"] = true
				modifierParams = modifierParams .. "|copydown=" .. index
				index = index + 1
				if templateTable.args["lic"] ~= nil then
					-- przechodzimy do argumentu lic
					templateTable = templateTable.args["lic"]
				else
					-- przypadek copydowna bez licencji wewnętrznej, traktujemy jako licencję główną
					template = templateTable.name
					break
				end
			else
				template = name
				break
			end
		end
		
		-- SMW
		obj["Jest składową pliku"] = mw.title.getCurrentTitle().prefixedText
		obj["Ma licencję"] = "Szablon:" .. template
		local autor = require("Moduł:Autor")
		local zrodlo = require("Moduł:Źródło")
		
		local aprops, author = autor.process(args['pauthor' .. num])
		for k, v in pairs(aprops) do
			obj[k] = v
		end
		local sprops, source = zrodlo.process(args['psource' .. num])
		for k, v in pairs(sprops) do
			obj[k] = v
		end
		mw.smw.subobject(obj, "Licencja składowej nr " .. partIndex)
		partIndex = partIndex + 1
		
		-- ustawianie wszystkiego na podstawie źródła, gdy jest nim Nonsa
		-- TODO: usuwanie artybutów SMW
		local partFromNonsensopedia = sprops["Jest pracą własną"] ~= nil or sprops["Ma źródło"] == "Nonsensopedia"
		if partFromNonsensopedia then
			-- set author
			-- set license
		end
		
		local row = '<tr><td>' .. source .. '</td>'
		row = row .. '<td>' .. author .. '</td>'
		
		row = row .. '<td style="padding: 0;">'
		
		-- wywołanie szablonu dla JS
		row = row .. '<div style="display: none" class="js-preview-call"><nowiki>' .. templateCall .. '</nowiki></div>'
		
		-- expand template będzie na końcu
		row = row ..  "{{" .. template .. "|mini=1" .. modifierParams .. "}}</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

-- funkcje eksportowane
local p = {}

-- zrób cuda
-- p.information({args = {permission = "{{domniemanie|lic={{copydown|lic={{PD}}}}}}"}})
function p.information(frame)
	local arguments = require("Moduł:Arguments")
	local args = arguments.getArgs(frame)
	local demo = args['demo'] ~= nil
	
	-- caption
	if args['caption'] or demo then
		appendProps('Ma podpis pliku', args['caption'])
		addRow('fileinfotpl_caption', 'Podpis', args['caption'])
	else
		appendProps('Nie ma podpisu pliku', true)
	end
	
	-- description
	if args['description'] then
		appendProps('Ma opis', args['description'])
		addRow('fileinfotpl_desc', 'Opis', args['description'])
	else
		appendProps('Nie ma opisu', true)
		addRow('fileinfotpl_desc', '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_source', 'Źródło', args['source'])
	else
		addRow('fileinfotpl_source', 'Ź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'])
		if not demo then mw.smw.set(aprops) end
		addRow('fileinfotpl_author', 'Autor', s)
	end
	
	-- permission
	if args['permission'] or demo then
		local permission = args["permission"]
		local nextParsePoint = 1
		local i = 0
		local templateCallTree, templateRecords = nil, {}
		mw.log("args['permission'] = " .. permission)
		local previousParseTextLength = 0
		while nextParsePoint do
			-- to jest potrzebne, bo funkcja dostaje kawalek kodu i zwraca nastepny punkt parsowania w tym kodzie, wiec trzeba dodac to co bylo przedtem
			local prevParsePoint = nextParsePoint - 1
			mw.logObject({iteration = i, position = nextParsePoint, parsedText = permission:sub(nextParsePoint, -1)})
			templateCallTree, nextParsePoint = licenseTools.getTemplateFromCode(permission:sub(nextParsePoint, -1))
			if nextParsePoint ~= nil then
				nextParsePoint = nextParsePoint + prevParsePoint
			end
			
			mw.logObject(templateCallTree)
			i = i + 1
			if i == 10 then return end
			
			if templateCallTree == nil then break end
			
			-- zwraca listę występujących w tekście szablonów, z informacją czy występują modyfikatory licencji
			local function parseTree(templateCallTree, domniemanie, copydown, sself)
				if templateCallTree == nil then return nil end
				local t = {}
				if templateCallTree.name == "self" then
					mw.log("Setting sself = true")
					sself = true
					for name, value in pairs(templateCallTree.args) do
						mergeTables(t, parseTree(value, domniemanie, copydown, sself))
					end
				elseif templateCallTree.name == "copydown" then
					mw.log("Setting copydown = true")
					copydown = true
					if templateCallTree.args["lic"] then
						mergeTables(t, parseTree(templateCallTree.args["lic"], domniemanie, copydown, sself))
					else -- traktujemy jako licencję główną
						table.insert(t, 
						{
							name = templateCallTree.name,
							copydown = copydown,
							domniemanie = domniemanie,
							sself = sself
						})
					end
				elseif templateCallTree.name == "domniemanie" then
					mw.log("Setting domniemanie = true")
					domniemanie = true
					mergeTables(t, parseTree(templateCallTree.args["lic"], domniemanie, copydown, sself))
				else -- license template
					table.insert(t, 
					{
						name = templateCallTree.name,
						copydown = copydown,
						domniemanie = domniemanie,
						sself = sself
					})
				end
				
				return t
			end
			
			local templateRecords2 = parseTree(templateCallTree, false, false, false)
			if templateRecords2 ~= nil then
				mergeTables(templateRecords, templateRecords2)
			end
		end
		
		mw.logObject(templateRecords, "templateRecords = ")
		local i = 1
		for _, record in ipairs(templateRecords) do
			local obj = {}
			obj["Ma licencję"] = "Szablon:" .. record.name
			if record.copydown then
				obj["Ma licencję copydown"] = true
			end
			if record.domniemanie then
				obj["Ma licencję domniemaną"] = true
			end
			if record.sself then
				obj["Jest pracą własną"] = true
			end
			
			local res = mw.smw.subobject(obj, "Licencja nr " .. i)
			if res ~= true then
				mw.log(res.error)
			end
			i = i + 1
		end
		
		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)
		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 frame:preprocess(getTable())
end

return p