local p = {}
local Formatriraj = require('Module:Formatiraj datum')
local function inMainspace()
return mw.title.getCurrentTitle().namespace == 0
end
local wikidataDatesCategory = "[[Kategorija:Datumi televizijskog prikazivanja s Wikipodataka]]"
local kategorija = {
format = function(frame)
if not inMainspace() then return '' end
return "[[Kategorija:Televizijski infookviri bez formatiranih datuma]]"
end,
utijeku = function(frame)
if not inMainspace() or (frame.args.decat or '') == 'y' then
return ''
end
return "[[Kategorija:Televizijski program u tijeku]]"
end,
nadolazeci = function(frame)
if not inMainspace() or (frame.args.decat or '') == 'y' then
return ''
end
return "[[Kategorija:Nadolazeći televizijski program]]"
end,
wikidataDates = function()
if not inMainspace() then return '' end
return wikidataDatesCategory
end
}
local skriveniFinale = {
['sakrij'] = true,
['premijera'] = true,
['objava'] = true,
['objavljeno'] = true,
['prikazano'] = true,
['dostupno'] = true,
['najavljeno'] = true,
['najavljena'] = true
}
local function getSakrijText(s)
local match = mw.ustring.match(s or '', '^%s*sakrij:%s*(.+)$')
return match
end
local function josTraje()
local frame = mw.getCurrentFrame()
local cat = kategorija.utijeku(frame)
return "još traje " .. cat
end
local function getEditAtWikidataIcon(propertyID)
local frame = mw.getCurrentFrame()
local editIcon = frame:expandTemplate{
title = 'EditAtWikidata',
args = { '', pid = propertyID }
}
return editIcon
end
local function formatiraniDatum(dateString, class, isWikidata, propertyID)
local frame = mw.getCurrentFrame()
local result = Formatriraj.televizija{ args = { dateString, class } }
if not result then
result = ''
end
local hasMicroformat = false
if class == "dtstart" then
if string.find(result, 'class="[^"]*dtstart') then
hasMicroformat = true
end
elseif class == "dtend" then
if string.find(result, 'class="[^"]*dtend') then
hasMicroformat = true
end
end
if not hasMicroformat then
local cat = kategorija.format(frame)
return dateString .. " " .. cat
end
if isWikidata and propertyID then
result = result .. getEditAtWikidataIcon(propertyID)
end
return result
end
local function extractYearStrict(s)
local iso = Formatriraj.dohvatiISO(s)
if iso and #iso >= 4 then
return mw.ustring.sub(iso, 1, 4)
end
local y = mw.ustring.match(s, '%f[%d](19%d%d)%f[%D]') or mw.ustring.match(s, '%f[%d](20%d%d)%f[%D]')
return y
end
local function stripVisibleYearFor(s, year)
s = mw.ustring.gsub(s, '%[%[%s*' .. year .. '%.?%s*%]%]', '')
s = mw.ustring.gsub(s, '%f[%d]' .. year .. '%f[%D]%.?', '')
s = mw.ustring.gsub(s, '%s%s+', ' ')
s = mw.ustring.gsub(s, '%s+([%.,;:%)])', '%1')
s = mw.text.trim(s)
return s
end
local function hideYearIfSame(premOutput, premijera, finale)
local yPrem = extractYearStrict(premijera)
local yFin = extractYearStrict(finale)
if not (yPrem and yFin and yPrem == yFin) then
return premOutput
end
local isoPrem = Formatriraj.dohvatiISO(premijera) or ''
local isoFin = Formatriraj.dohvatiISO(finale) or ''
local premNoDay = mw.ustring.match(isoPrem, '^%d%d%d%d$') or mw.ustring.match(isoPrem, '^%d%d%d%d%-%d%d$')
local finNoDay = mw.ustring.match(isoFin, '^%d%d%d%d$') or mw.ustring.match(isoFin, '^%d%d%d%d%-%d%d$')
if premNoDay and finNoDay then
return premOutput
end
local span, tail = mw.ustring.match(premOutput, '^(<span[^>]-class="[^"]*dtstart[^"]*"[^>]*>.-</span>%s*)(.*)$')
if span then
tail = stripVisibleYearFor(tail, yPrem)
return span .. tail
else
return stripVisibleYearFor(premOutput, yPrem)
end
end
local function getISO(premArg, premOutput)
local iso = Formatriraj.dohvatiISO(premArg)
if iso and iso ~= '' then
return iso
end
iso = mw.ustring.match(premOutput, '(%d%d%d%d%-%d%d%-%d%d)') or
mw.ustring.match(premOutput, '(%d%d%d%d%-%d%d)') or
mw.ustring.match(premOutput, '(%d%d%d%d)')
return iso
end
local function isFutureISO(iso)
if not iso or iso == '' then return false end
local today = mw.language.getContentLanguage():formatDate('Y-m-d')
if mw.ustring.match(iso, '^%d%d%d%d%-%d%d%-%d%d$') then
return iso > today
elseif mw.ustring.match(iso, '^%d%d%d%d%-%d%d$') then
return (iso .. '-01') > today
elseif mw.ustring.match(iso, '^%d%d%d%d$') then
local currentYear = mw.language.getContentLanguage():formatDate('Y')
return tonumber(iso) >= tonumber(currentYear)
end
return false
end
local function getWikidataDate(property)
local frame = mw.getCurrentFrame()
local result = frame:callParserFunction('#property', property)
if result and result ~= '' then
if not mw.ustring.match(result, '%.$') then
result = result .. "."
end
return result
end
return nil
end
function p.datum(frame)
local args = frame.args
local premijera = args.premijera or ''
local finale = args.finale or ''
local useWikidata = (args.wikidata or '') == 'y'
local premijeraFromWikidata = false
local finaleFromWikidata = false
local wikidataCategoryAdded = false
if premijera == '' and useWikidata then
local wikidataPremijera = getWikidataDate('P580')
if wikidataPremijera then
local iso = Formatriraj.dohvatiISO(wikidataPremijera)
if iso and iso ~= '' then
premijera = wikidataPremijera
premijeraFromWikidata = true
wikidataCategoryAdded = true
end
end
end
if finale == '' and useWikidata then
local wikidataFinale = getWikidataDate('P582')
if wikidataFinale then
local iso = Formatriraj.dohvatiISO(wikidataFinale)
if iso and iso ~= '' then
finale = wikidataFinale
finaleFromWikidata = true
wikidataCategoryAdded = true
end
end
end
if premijera == '' then
return ''
end
local premOutput = formatiraniDatum(premijera, "dtstart", premijeraFromWikidata, premijeraFromWikidata and "P580" or nil)
local finale_raw = finale or ''
local finale_clean = mw.text.trim(finale_raw):lower()
local hideFinale = skriveniFinale[finale_clean] or false
local sakrijText = getSakrijText(finale_raw)
local isoPrem = getISO(premijera, premOutput)
local frameObj = mw.getCurrentFrame()
local futureCat = ''
if not hideFinale and not sakrijText and isFutureISO(isoPrem) then
futureCat = kategorija.nadolazeci(frameObj)
end
local wikidataCat = wikidataCategoryAdded and kategorija.wikidataDates() or ''
if hideFinale then
return premOutput .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
end
if sakrijText then
return premOutput .. (futureCat ~= '' and (" " .. futureCat) or "") .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
end
if finale ~= '' then
local finaleOutput = formatiraniDatum(finale, "dtend", finaleFromWikidata, finaleFromWikidata and "P582" or nil)
premOutput = hideYearIfSame(premOutput, premijera, finale)
return premOutput .. " – <br> " .. finaleOutput .. futureCat .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
else
if isoPrem and isoPrem ~= '' and isFutureISO(isoPrem) then
return premOutput .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
elseif futureCat ~= '' then
return premOutput .. " " .. futureCat .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
else
return premOutput .. " – <br> " .. josTraje() .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
end
end
end
function p.prikazivanje(frame)
local args = frame.args or {}
local useWikidata = (args.wikidata or '') == 'y'
local premArg = args.premijera or ''
local finale_raw = args.finale or ''
local finale_clean = mw.text.trim(finale_raw):lower()
local premijeraFromWikidata = false
local wikidataCategoryAdded = false
if premArg == '' and useWikidata then
local wikidataPremijera = getWikidataDate('P580')
if wikidataPremijera then
local iso = Formatriraj.dohvatiISO(wikidataPremijera)
if iso and iso ~= '' then
premArg = wikidataPremijera
premijeraFromWikidata = true
wikidataCategoryAdded = true
end
end
end
local premOutput = formatiraniDatum(premArg, "dtstart", premijeraFromWikidata, premijeraFromWikidata and "P580" or nil)
local isoPrem = getISO(premArg, premOutput)
local wikidataCat = wikidataCategoryAdded and kategorija.wikidataDates() or ''
local sakrijText = getSakrijText(finale_raw)
if sakrijText then
return sakrijText .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
end
local function nadolazeciCat()
return kategorija.nadolazeci(frame)
end
if isoPrem and isoPrem ~= '' and isFutureISO(isoPrem) then
if mw.ustring.match(isoPrem, '^%d%d%d%d%-%d%d%-%d%d$') then
return 'Najavljena<br>premijera' .. " " .. nadolazeciCat() .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
else
return 'Najavljeno<br>prikazivanje' .. " " .. nadolazeciCat() .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
end
end
if finale_clean == 'najavljena' then
return 'Najavljena<br>premijera' .. " " .. nadolazeciCat() .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
elseif finale_clean == 'najavljeno' then
return 'Najavljeno<br>prikazivanje' .. " " .. nadolazeciCat() .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
elseif finale_clean == 'objava' or finale_clean == 'objavljeno' then
return 'Objavljeno' .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
elseif finale_clean == 'dostupno' then
return 'Dostupno od' .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
elseif finale_clean == 'prikazano' then
return 'Prikazano' .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
else
return 'Prikazivanje' .. (wikidataCat ~= '' and (" " .. wikidataCat) or "")
end
end
return p