Modul:TV datum

Izvor: Hrvatska internetska enciklopedija
Prijeđi na navigaciju Prijeđi na pretraživanje
Dokumentacija modula

Modul TV datum uređuje prikaz datuma emitiranja u televizijskim infookvirima {{infookvir TV serija}}, {{infookvir TV emisija}}, {{infookvir TV sezona}} i {{infookvir reality TV sezona}}.

Upotreba

Primjer postavljanja u {{infookvir TV serija}}:

...
| param26          = {{#invoke:TV datum|prikazivanje|premijera={{{početak_serije|}}}|finale={{{kraj_serije|}}}}}
| vrijednost26     = {{#invoke:TV datum|datum|premijera={{{početak_serije|}}}|finale={{{kraj_serije|}}}}}
...

Primjer prikaza u infookviru:

Unos u infookvir
{{Infookvir TV serija
| početak_serije = 1. rujna 2019.
| kraj_serije     =
}}
Prikaz
Primjer
Emitiranje1. rujna 2019.
Unos u infookvir
{{Infookvir TV serija
| početak_serije  = 1. rujna 2019.
| kraj_serije     = premijera
}}
Prikaz
Primjer
Emitiranje1. rujna 2019. –
premijera
Unos u infookvir
{{Infookvir TV serija
| početak_serije  = 1. rujna 2019.
| kraj_serije     = objava
}}
Prikaz
Primjer
Emitiranje1. rujna 2019. –
objava
Unos u infookvir
{{Infookvir TV serija
| početak_serije  = 1. rujna 2019.
| kraj_serije     = 2. rujna 2019.
}}
Prikaz
Primjer
Emitiranje1. rujna 2019. –
2. rujna 2019.
Unos u infookvir
{{Infookvir TV serija
| početak_serije  = 1. rujna 2035.
| kraj_serije     =
}}
Prikaz
Primjer
Emitiranje1. rujna 2035. –
sakrij
Unos u infookvir
{{Infookvir TV serija
| početak_serije  = 1. rujna 2019.
| kraj_serije     = sakrij:Pilot epizoda
}}
Prikaz
Primjer
Emitiranje1. rujna 2019. –
sakrij:Pilot epizoda

Funkcije

datum
uz pomoć modula za formatiranje datuma sprema uneseni datum u HTML kôd stranice u formatu ISO 8601, što omogućava lakšu strojnu čitljivost
dodaje kategoriju za praćenje nepravilno unesenih datuma
automatski dodaje tekst još traje za televizijske infookvire koji nemaju ispunjen parametar za finalno emitiranje te dodaje kategoriju za praćenje televizijskih programa u tijeku
određuje datume emitiranja u budućnosti te dodaje kategoriju za praćenje nadolazećih televizijskih programa
skriva godinu kod datuma premijere ako je jednaka godini u datumu finala
prikazivanje
Uređuje tekst parametra 'Prikazivanje'
automatski prikazuje 'Najavljeno prikazivanje' (ako postoji samo godina) ili 'Najavljena premijera' (ako postoji cjeloviti datum) za datume u budućnosti
mijenja tekst 'Prikazivanje' ili skriva tekst još traje prema unosima u parametre za finale:
sakrij ili premijera → skriva tekst još traje
sakrij: [tekst]→ Prikazuje proizvoljan tekst unesen nakon sakrij: (npr. sakrij:Pilot epizoda)
objava → Objavljeno
dostupno → Dostupno od
najavljena → Najavljena premijera
najavljeno → Najavljeno prikazivanje

Katgorije za praćenje


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