Jump to content

Module:IMDb

Di Wikipedia, e ensiklopedia liber

Documentation for this module may be created at Module:IMDb/doc

local p = {}

local paths = {
    tt="title/$1/",
    nm="name/$1/",
    co="company/$1/",
    ev="event/$1",
    ni="news/$1/",
}

-- creates an external link from a single IMDb ID
-- suffix, label, and variante are optional
local function linkId(prefix, id, suffix, label, variante)
    if not label then
        if variante == 'c' then
            label = "IMDb-profil"
        else
            label = "IMDb-profiel"
        end
    end
    path = mw.ustring.gsub(paths[prefix], "$1", id)
    if suffix then
        path = path .. suffix
    end
    return "[https://www.imdb.com/" .. path .. " " .. label .. "]"
end

-- creates a sequence of external links from one or more IMDb IDs
local function linkIds(prefix, ids, variante)
    local r
    for i=1, #ids do
        link = linkId(prefix, ids[i], nil, nil, variante)
        if r then
            r = r .. ", " .. link
        else
            r = link
        end
    end
    return r
end

-- fetches an array of IMDb IDs from Wikidata
-- returns nil if no entity found
-- if a prefix is provided, only matching IDs are returned
local function fetchWd(prefix)
    local entity = mw.wikibase.getEntity()
    if not entity then
        return nil
    end
    local r = {}
    local i = 1
    for _, s in pairs(entity:getBestStatements('P345')) do
        if s.mainsnak.snaktype == "value" then
            local datavalue = s.mainsnak.datavalue
            if datavalue then
                local imdbId = datavalue.value
                if not prefix or prefix == mw.ustring.sub(imdbId, 1, 2) then
                    if r then
                        r[i] = imdbId
                        i = i + 1
                    end
                end
            end
        end
    end
    return r
end

local function tracking(sortKey)
    if mw.title.getCurrentTitle().namespace ~= 0 then
        return ''
    end
    local r = "[[Categorie:Wikipedia:IMDb-code niet op Wikidata"
    if sortKey then
        r = r .. "|" .. sortKey
    end
    return r .. "]]"
end

local function einval(frame, msg)
    return frame:expandTemplate{ title='Error', args={"Fout: " .. msg} }
end

-- arg 1: required ID prefix, tt/nm/co/ev/ni
-- arg 2: optional ID number, numeric
-- arg 3: optional variante
function p.infoboxLink(frame)
    local prefix
    if frame.args[1] and #frame.args[1] > 0 then
        prefix = frame.args[1]
        if not #prefix == 2 then
            return einval(frame, "ongeldige prefix: " .. prefix)
        end
    else
        return einval(frame, "prefix ontbreekt")
    end
    local suffix
    if frame.args[2] and #frame.args[2] > 0 then
        suffix = frame.args[2]
        if not string.find(suffix, '^%d+$') then
            return einval(frame, "niet een nummer: " .. suffix)
        end
    end

    local variante = frame.args[3]

    local r, idFromArgs, p345
    if suffix then
        idFromArgs = prefix .. suffix
        r = frame:expandTemplate{ title='en', args={} } .. 
            linkId(prefix, idFromArgs, nil, nil, variante)
    end
    p345 = fetchWd(prefix)
    if not suffix then
        if p345 and #p345 > 0 then
            r = frame:expandTemplate{ title='en', args={} } .. 
                linkIds(prefix, p345, variante)
        else
            r = ''
        end
    end
    if p345 and idFromArgs then
        local sortKey
        if #p345 == 0 then
            sortKey = idFromArgs
        elseif #p345 > 1 then
            sortKey = '#'
        elseif #p345 == 1 and idFromArgs ~= p345[1] then
            sortKey = '≠'
        end
        if sortKey then
            r = r .. tracking(sortKey)
        end
    end
    return r
end

local function illustratedLink(frame, prefix, idnum, suffix, label, variante)
    if prefix == 'tt' and not suffix then
        label = "''" .. label .. "''"
    end
    return frame:expandTemplate{ title='en', args={} } .. 
        ' [[File:Comicsfilm.png|15px|class=noviewer|Pictogram film]] ' ..
        linkId(prefix, idnum, suffix, label, variante) ..
        ' in de [[Internet Movie Database]]'
end

local function externalLink(frame, prefix)
    local idnum
    local suffix    -- e.g. "bio"
    local args = frame:getParent().args
    if args['id'] and #args['id'] > 0 then
        idnum = args['id']
        if not string.find(idnum, '^%d+$') then
            return einval(frame, "niet een nummer: " .. idnum)
        end
    end
    if args[1] and #args[1] > 0 then
        suffix = args[1]
    end

    local labelFromArgs, label
    labelFromArgs = args['label']        -- optional
    if labelFromArgs == '' then
        labelFromArgs = nil
    end
    label = labelFromArgs or 
            mw.wikibase.getLabel(qid) or 
            frame:expandTemplate{ title='PAGENAMEBASE', args={} }
    local r, idFromArgs, p345
    local variante = args['variante']
    if idnum then
        idFromArgs = prefix .. idnum
        r = illustratedLink(frame, prefix, idFromArgs, suffix, label, variante)
    end
    p345 = fetchWd(prefix)
    if not idnum then
        if p345 and #p345 > 0 then
            r = illustratedLink(frame, prefix, p345[1], suffix, label, variante)
        else
            r = einval(frame, "geen id gevonden")
            local parent = frame:getParent()
            if parent then
                r = r .. " voor [[:" .. parent:getTitle() .. "]]"
            end
        end
    end
    if p345 and not labelFromArgs then
        local sortKey
        if #p345 > 1 then
            sortKey = '#'
        elseif idFromArgs then
            if #p345 == 0 then
                sortKey = idFromArgs
            elseif #p345 == 1 and idFromArgs ~= p345[1] and 
                    (mw.ustring.sub(idFromArgs, 1, 2) ==
                     mw.ustring.sub(p345[1],    1, 2)) then
                sortKey = '≠'
            end
        end
        if sortKey then
            r = r .. tracking(sortKey)
        end
    end
    return r
end

function p.link_naam(frame)
    return externalLink(frame, 'nm')
end

function p.link_titel(frame)
    return externalLink(frame, 'tt')
end

function p.link_bedrijf(frame)
    return externalLink(frame, 'co')
end

return p