Moduł:Wikidane/format/P39
< Moduł:Wikidane | format
Zobacz podstrony tego modułu.
|
local moduleData = mw.loadData("Moduł:Wikidane/data")
local infobox = mw.loadData("Moduł:Infobox/resources")
local resources = {
timeLabel = "Okres",
timeStart = "od ",
timeEnd = "do ",
timeSep = "<br />",
prevLabel = "Poprzednik",
nextLabel = "Następca",
titleOptions = {
linkItem = true,
separator = moduleData.defaultSeparator,
lastSeparator = moduleData.defaultSeparator,
},
nextPrevOptions = {
linkItem = true,
novalue = "—",
separator = moduleData.defaultSeparator,
lastSeparator = moduleData.defaultSeparator,
},
timeOptions = {
linkDate = true,
},
nakedOptions = {
naked = true,
},
}
local function formatSimple(props, options)
if #props <= 0 then
return
end
local formatSnak = require("Moduł:Wikidane/format/snak").format
local items = {}
for k, v in ipairs(props) do
if (v.type == "statement") and ((v.rank == "normal") or (v.rank == "preferred")) then
if v.mainsnak and (v.mainsnak.snaktype == "value") then
table.insert(items, formatSnak(v.mainsnak, resources.titleOptions))
end
end
end
if #items <= 0 then
return
end
return mw.text.listToText(items, options.separator, options.lastSeparator)
end
local function formatInfobox(props, options)
if #props <= 0 then
return
end
local formatSnak = require("Moduł:Wikidane/format/snak").format
local formatQualifiers = require("Moduł:Wikidane/format/qualifiers")
local items = {}
for k, v in ipairs(props) do
local item = {}
if (v.type == "statement") and ((v.rank == "normal") or (v.rank == "preferred")) then
if v.mainsnak and (v.mainsnak.snaktype == "value") then
local title = formatSnak(v.mainsnak, resources.titleOptions)
item.title = formatSnak(v.mainsnak, resources.titleOptions)
if item.title then
local of = formatQualifiers.AND(v, "", "P642")
if of then
item.title = of.."<br />"..item.title
end
table.insert(items, item)
local no = formatQualifiers.AND(v, resources.titleOptions, "P1545")
if no and mw.ustring.match(no,"^%d+$") then
item.title = no..". "..item.title
end
item.prev = formatQualifiers.AND(v, resources.nextPrevOptions, "P1365")
item.next = formatQualifiers.AND(v, resources.nextPrevOptions, "P1366")
item.s = formatQualifiers.MINTIME(v, resources.nakedOptions, "P580")
item.stime = item.s and (item.s.snaktype == "value") and item.s.datavalue.value.time
item.stext = item.s and formatSnak(item.s, resources.timeOptions)
item.e = formatQualifiers.MAXTIME(v, resources.nakedOptions, "P582")
item.etime = item.e and (item.e.snaktype == "value") and item.e.datavalue.value.time
item.etext = item.e and formatSnak(item.e, resources.timeOptions)
end
end
end
end
if #items <= 0 then
return
end
if #items > 1 then
local function compare(a, b)
if a and b and a.stime and b.stime then return a.stime > b.stime end
if a and b and a.etime and b.etime then return a.etime > b.etime end
if a and b and a.s and not b.s then return true end
if a and b and a.e and not b.e then return true end
return false
end
table.sort(items, compare)
end
local result = {}
for _, v in ipairs(items) do
table.insert(result, '|-class="')
table.insert(result, infobox.classSpanHeader)
table.insert(result, '"\n!colspan="2"|')
table.insert(result, v.title)
table.insert(result, "\n")
if v.stext or v.etext then
table.insert(result, '|-\n!class="')
table.insert(result, infobox.classRowHeader)
table.insert(result, '"|')
table.insert(result, resources.timeLabel)
table.insert(result, "\n|")
if v.stext == v.etext then
table.insert(result, v.stext)
else
if v.stext then
table.insert(result, resources.timeStart)
table.insert(result, v.stext)
end
if v.stext and v.etext then
table.insert(result, resources.timeSep)
end
if v.etext then
table.insert(result, resources.timeEnd)
table.insert(result, v.etext)
end
end
table.insert(result, "\n")
end
if v.prev then
table.insert(result, '|-\n!class="')
table.insert(result, infobox.classRowHeader)
table.insert(result, '"|')
table.insert(result, resources.prevLabel)
table.insert(result, "\n|")
table.insert(result, v.prev)
table.insert(result, "\n")
end
if v.next then
table.insert(result, '|-\n!class="')
table.insert(result, infobox.classRowHeader)
table.insert(result, '"|')
table.insert(result, resources.nextLabel)
table.insert(result, "\n|")
table.insert(result, v.next)
table.insert(result, "\n")
end
end
table.insert(result, "|-")
return table.concat(result)
end
return {
scope = "props",
format = function(props, options)
return options.format == "infobox" and formatInfobox(props, options) or formatSimple(props, options)
end,
}