Moduł:Kalendarium
Moduł wspomagający automatyzację treści strony głównej Wikipedii i niektórych portali.
Raport
Funkcja do przygotowania podglądu z listą wszystkich dostępnych wydarzeń na zadany dzień.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
Rocznice
Funkcja generująca treść do sekcji Rocznice na stronie głównej.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
Imieniny
Funkcja generująca listę imion na zadany dzień.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
2 | Liczba losowanych imion | Np. 4 , domyślnie 3.
|
3 | Separator między imionami | Można nie wypełniać, domyślnie przecinek. |
4 | Separator przed ostatnim imieniem | Można nie wypełniać, domyślnie „i”. |
Święta
Funkcja generująca listę świąt na zadany dzień.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
2 | Separator między świętami | Najlepiej ;
|
3 | Separator przed ostatnim świętem | Najlepiej ; .
|
Wydarzenia
Funkcja generująca listę wydarzeń, których możliwie okrągła rocznica wypada z zadanym dniu.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
2 | Minimalna liczba wydarzeń | domyślnie 5 |
3 | Maksymalna liczba obrazków? (do sprawdzenia) | domyślnie 2. |
4 | Maksymalna liczba wydarzeń | domyślnie minimalna liczba wydarzeń |
Statystyka
Funkcja generująca statystykę dla dokumentacji modułu z listą wydarzeń dla konkretnego dnia.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
ministat
Funkcja generująca linię z ministatystyką dla wybranego dnia.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
leap
Funkcja generująca najbliższy rok przestępny względem podanego roku.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Rok. Jeśli jest przestępny to jest wynikiem funkcji. Jeśli nie jest przestępny to wynikiem jest najbliższy przyszły rok przestępny. | Np. 2024 .
|
Wybierz z listy
Implementacja {{Wybierz z listy}}.
Ilustracja na medal
Funkcja „losująca” ilustrację na medal używana w przypadku, gdy nie jest zdefiniowana zaplanowana ilustracja na zadany dzień.
Pole | Do czego służy? | Jak wypełnić? |
---|---|---|
1 | Data dzienna | Np. 2024-05-20 .
|
Ilustracje wybierane są z galerii Wikipedia:Ilustracje na Medal. Bardzo płaskie lub wysokie i wąskie obrazy należy oznaczyć komentarzem <-- PANORAMA szerokość_x_wysokość -->
, dzięki któremu pod lub obok ilustracji umieszczany jest pomocniczy pasek przewijania co pozwala na lepszą prezentację. Przykłady można obejrzeć w Wikipedia:Ilustracje na Medal/geografia.
Błędy
Błędy należy zgłaszać na stronie Wikipedia:Kawiarenka/Kwestie techniczne.
Zobacz też
Powyższy opis jest dołączany ze strony Moduł:Kalendarium/opis. (edytuj | historia)
Zobacz podstrony tego modułu. |
local function loadOffsetDay(offset)
if offset < -1 then
return string.format(" %d days", offset)
elseif offset == -1 then
return " -1 day"
elseif offset == 0 then
return ""
elseif offset == 1 then
return " +1 day"
else -- if offset > 1 then
return string.format(" +%d days", offset)
end
end
local function loadFeasts(params)
local lang = mw.getContentLanguage()
local feasts = mw.loadData( 'Module:Kalendarium/święta' )
local date = params.year.."-"..params.base
local romanEaster = false
local orthodoxEaster = false
local result = {}
for _, v in ipairs(feasts) do
if v.type == "fixed" then
local info = v[params.base]
if info then
for _, w in ipairs(info) do
table.insert(result, w)
end
end
elseif v.type == "other" then
-- standard fixed date
for _, w in ipairs(v) do
if w == date then
table.insert(result, v.info)
break
end
end
elseif (v.type == "easter") and (params.year >= 326) and (params.year <= 4099) then
local date1 = false
if v.info1 then
if not orthodoxEaster then
orthodoxEaster = require("Moduł:Wielkanoc").Wyznacz({args = { tostring(params.year), metoda = "wschodnia", format="nie", ["dzień"]=0, },})
end
date1 = lang:formatDate("Y-m-d", orthodoxEaster..loadOffsetDay(v.offset)) == date
end
local date2 = false
if v.info2 then
if not romanEaster then
romanEaster = require("Moduł:Wielkanoc").Wyznacz({args = { tostring(params.year), metoda = "zachodnia", format="nie", ["dzień"]=0, },})
end
date2 = lang:formatDate("Y-m-d", romanEaster..loadOffsetDay(v.offset)) == date
end
if date1 and date2 and v.info3 then
table.insert(result, v.info3)
else
if date1 then
table.insert(result, v.info1)
end
if date2 then
table.insert(result, v.info2)
end
end
else
-- type not supported
end
end
return #result > 0 and mw.text.listToText(result, params.feastSeparator, params.feastConjunction) or ""
end
local function prepareDataIndex(data, except)
-- prepare set of excluded values
local exceptions = {}
for _, v in ipairs(except or {}) do
exceptions[v] = true
end
local result = {}
for i, _ in ipairs(data or {}) do
if not exceptions[i] then
table.insert(result, i)
end
end
return result
end
local function selectRandomItems(index, count)
if #index <= count then
return index
end
local result = {}
while count > 0 do
local i = math.random(1, #index)
table.insert(result, index[i])
table.remove(index, i)
count = count - 1
end
return result
end
local function selectRandomData(data, count, except)
-- prepare source index
local fullIndex = prepareDataIndex(data, except)
local index = selectRandomItems(fullIndex, count)
table.sort(index)
-- prepare result
local result = {}
for _, i in ipairs(index) do
table.insert(result, data[i])
end
return result
end
local function loadDate(date)
local lang = mw.getContentLanguage()
-- minimize usage of #time function due to 6000 limit of output characters
local stamp = lang:formatDate("U", date, true)
local ymd = lang:formatDate("Ymd", date or ("@"..stamp), true)
return {
date = date,
seed = tonumber(stamp),
year = tonumber(string.sub(ymd, 1, 4)),
base = string.sub(ymd, 5, 6).."-"..string.sub(ymd, 7, 8)
}
end
local function chooseNames(params)
local data = mw.loadData("Module:Kalendarium/imieniny")
math.randomseed(params.seed)
local names = selectRandomData(data[params.base], params.namesCount)
return mw.text.listToText(names, params.namesSeparator, params.namesConjunction)
end
local function loadEvents(events, data, accept, maxImages, maxEvents)
local result = 0
local function loadYear(year)
if type(year) == "number" then
return ((year > 0) and (year <= 9999)) and year or false
elseif type(year) ~= "string" then
return false
end
local yearpne = string.match(year, "^(%d%d?%d?%d?) p%.n%.e%.$")
if not yearpne then
return false
end
return 1-tonumber(yearpne)
end
-- extract events that satisfy the selection rule
local candidates = {}
local imageIndex = {}
for _, v in ipairs(data) do
local event = {}
event.year = loadYear(v.rok)
event.priority = v.priorytet
if event.year and v.tekst and accept(event) then
table.insert(candidates, event)
local image, alt, info = mw.ustring.match(v.tekst, "{{([^|{}]+)|([^|{}]+)|([^{}]+)}}")
if not info then
event.text = v.tekst
else
event.text = mw.ustring.gsub(v.tekst, "{{[^{}]+}}", "{{}}", 1)
event.info = " <small>(''"..info.."'')</small>"
event.image = string.format("[[Plik:%s|100px|right|%s]]", image, alt)
table.insert(imageIndex, #candidates)
end
end
end
-- adjust number of required images and events
for _, v in ipairs(events) do
if v.image then
-- the image is already loaded
maxImages = maxImages - 1
end
maxEvents = maxEvents - 1
end
-- do not load more than required maximum elements
if maxImages > maxEvents then
maxImages = maxEvents
end
-- choose more images
local usedImagesIndex = {}
if maxImages > 0 then
local selectedImages = selectRandomData(imageIndex, maxImages)
for _, index in ipairs(selectedImages) do
table.insert(usedImagesIndex, index)
local item = candidates[index]
-- print picture description in the message
item.text = mw.ustring.gsub(item.text, "{{}}", item.info)
table.insert(events, item)
result = result + 1
maxEvents = maxEvents - 1
end
end
-- choose remaing events but drop image for rest
if maxEvents > 0 then
local selectedEvents = selectRandomData(candidates, maxEvents, usedImagesIndex)
for _, item in ipairs(selectedEvents) do
-- exclude picture from the message
item.text = mw.ustring.gsub(item.text, "{{}}", "")
item.image = nil
item.info = nil
table.insert(events, item)
result = result + 1
end
end
return result
end
local function chooseEvents(params)
local data = mw.loadData( 'Module:Kalendarium/'..params.base )
math.randomseed(params.seed)
local events = {}
local count10 = loadEvents(events, data, function(event) local delta = params.year - event.year return (delta > 0) and ((delta % 10) == 0) and event.priority end, params.maximumImages, params.maximumEvents)
local count5 = loadEvents(events, data, function(event) local delta = params.year - event.year return (delta > 0) and ((delta % 10) == 5) and event.priority end, params.maximumImages, params.maximumEvents)
local count1 = 0
if #events < params.minimumEvents then
count10 = count10 + loadEvents(events, data, function(event) local delta = params.year - event.year return (delta > 0) and ((delta % 10) == 0) and not event.priority end, params.maximumImages, params.maximumEvents)
end
if #events < params.minimumEvents then
count5 = count5 + loadEvents(events, data, function(event) local delta = params.year - event.year return (delta > 0) and ((delta % 10) == 5) and not event.priority end, params.maximumImages, params.maximumEvents)
end
if #events < params.minimumEvents then
count1 = loadEvents(events, data, function(event) local delta = params.year - event.year return (delta > 0) and ((delta % 5) ~= 0) end, params.maximumImages, params.maximumEvents)
end
local info = "Wybrane rocznice:"
if count1 > 0 then
elseif count5 > 0 then
info = "Okrągłe, pięcioletnie rocznice:"
elseif count10 > 0 then
info = "Okrągłe, dziesięcioletnie rocznice:"
end
-- sort events by year
table.sort(events, function(a,b) return a.year < b.year end)
-- convert years to text
for _, v in ipairs(events) do
v.year = v.year > 0 and tostring(v.year) or tostring(1-v.year).." p.n.e."
end
-- format output
local result = {}
if #events > 0 then
-- print header
table.insert(result, info)
-- print images
for i, v in ipairs(events) do
if v.image then
table.insert(result,"\n")
table.insert(result,v.image)
end
end
-- print events
local lastYear = nil
for i, v in ipairs(events) do
table.insert(result, "\n* ")
if v.year ~= lastYear then
table.insert(result, "[[")
end
table.insert(result, v.year)
if v.year ~= lastYear then
table.insert(result, "]]")
end
table.insert(result, " – ")
table.insert(result, v.text)
lastYear = v.year
end
end
return table.concat(result, "")
end
local function anniversaries(params)
params.namesSeparator = ", "
params.namesConjunction = " i "
params.feastSeparator = "; "
params.feastConjunction = "; "
-- format output
local result = {}
table.insert(result, "'''")
table.insert(result, mw.getContentLanguage():formatDate("j xg", params.year.."-"..params.base, true))
table.insert(result, "''': [[imieniny]] obchodzą ")
table.insert(result, chooseNames(params))
local feasts = loadFeasts(params)
if #feasts > 0 then
table.insert(result, params.feastSeparator)
table.insert(result, feasts)
end
local events = chooseEvents(params)
if #events > 0 then
table.insert(result, "<br/>")
table.insert(result, events)
end
table.insert(result, "<br style=\"clear:right;\" />")
return table.concat(result, "")
end
return {
["Raport"] = function(frame)
local params = loadDate(frame.args[1])
params.namesCount = 1e10
params.minimumEvents = 1e10
params.maximumImages = 1e10
params.maximumEvents = 1e10
mw.log(anniversaries(params))
return anniversaries(params)
end,
["Rocznice"] = function(frame)
local params = loadDate(frame.args[1])
params.namesCount = 3
params.minimumEvents = 6
params.maximumImages = 2
params.maximumEvents = 7
mw.log(anniversaries(params))
return anniversaries(params)
end,
["Imieniny"] = function(frame)
local params = loadDate(frame.args[1])
params.namesCount = tonumber(frame.args[2]) or 3
params.namesSeparator = frame.args[3]
params.namesConjunction = frame.args[4]
mw.log(chooseNames(params))
return chooseNames(params)
end,
["Święta"] = function(frame)
local params = loadDate(frame.args[1])
params.feastSeparator = frame.args[2]
params.feastConjunction = frame.args[3]
mw.log(loadFeasts(params))
return loadFeasts(params)
end,
["Wydarzenia"] = function(frame)
local params = loadDate(frame.args[1])
params.minimumEvents = tonumber(frame.args[2]) or 5
params.maximumImages = tonumber(frame.args[3]) or 2
params.maximumEvents = tonumber(frame.args[4]) or params.minimumEvents
mw.log(chooseEvents(params))
return chooseEvents(params)
end,
}