Pergi ke kandungan

Modul:Random portal component

Daripada Wikipedia, ensiklopedia bebas.
-- Modul ini melaksanakan [[Templat:Komponen portal rawak]]

local p = {}

local mRandom = require('Modul:Random')
local currentTitle = mw.title.getCurrentTitle()

-- Fungsi penjejakan ditambah oleh BHG 29/04/2019
-- Dipanggil sebagai subPageTrackingCategories(halaman, args.max)
local function subPageTrackingCategories(halaman, max, tajuk)
    local retval = "";
    local tajukHalamanIni = mw.title.getCurrentTitle().text

    -- Jangan jejaki DYK dll, hanya artikel terpilih/featured, biografi dll
    if ((string.find(tajuk, "/[sS]elected") == -1) and (string.find(tajuk, "/[fF]eatured") == -1)) then
        return retval
    end
    -- Tiada penjejakan kecuali dalam ruang nama Portal
    if (mw.title.getCurrentTitle().nsText ~= "Portal") then
        return ""
    end

    -- Tiada penjejakan jika ini halaman sub
    if ((mw.ustring.match(tajukHalamanIni, "/") ~= nil) and (tajukHalamanIni ~= "AC/DC")) then
        return retval
    end

    local maxNum = tonumber(max)
    local bilanganSubHalamanTersedia = maxNum

    -- Periksa subhalaman yang tiada di hujung julat nombor
    while bilanganSubHalamanTersedia > 0 and not mw.title.new(halaman.subpage .. '/' .. tostring(bilanganSubHalamanTersedia)).exists do
        bilanganSubHalamanTersedia = bilanganSubHalamanTersedia - 1
    end
    if bilanganSubHalamanTersedia < maxNum then 
        retval = retval .. "[[Kategori:Komponen portal rawak dengan subhalaman tersedia kurang daripada max yang dinyatakan]]"
    else
        -- Periksa subhalaman luar julat nombor
        while mw.title.new(halaman.subpage .. '/' .. tostring(bilanganSubHalamanTersedia + 1)).exists do
            bilanganSubHalamanTersedia = bilanganSubHalamanTersedia + 1
        end
        if bilanganSubHalamanTersedia > maxNum then 
            retval = retval .. "[[Kategori:Komponen portal rawak dengan subhalaman tersedia lebih daripada max yang dinyatakan]]"
        end
    end

    -- Sebelum mengkategorikan, periksa jenis subhalaman
    local jenisSubhalaman = "subhalaman" -- jenis generik
    local namaSubhalaman = halaman.subpage
    namaSubhalaman = mw.ustring.gsub(namaSubhalaman, "^[^/]*/", "")
    namaSubhalaman = mw.ustring.lower(namaSubhalaman)
    if ((mw.ustring.find(namaSubhalaman, "picture", 1, true) ~= nil) or
        (mw.ustring.find(namaSubhalaman, "image", 1, true) ~= nil) or
        (mw.ustring.find(namaSubhalaman, "panorama", 1, true) ~= nil)) then
        jenisSubhalaman = "subhalaman gambar"
    end
    if (bilanganSubHalamanTersedia < 2) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan kurang daripada 2 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 5) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 2–5 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 10) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 6–10 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 15) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 11–15 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 20) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 16–20 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 25) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 21–25 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 30) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 26–30 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 40) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 31–40 " .. jenisSubhalaman .. " tersedia]]"
    elseif (bilanganSubHalamanTersedia <= 50) then
        retval = retval .. "[[Kategori:Komponen portal rawak dengan 41–50 " .. jenisSubhalaman .. " tersedia]]"
    else
        retval = retval .. "[[Kategori:Komponen portal rawak dengan lebih 50 " .. jenisSubhalaman .. " tersedia]]"
    end
    return retval;
end

local function getRandomNumber(max)
    -- Dapatkan nombor rawak antara 1 dan max; default max=1
    return mRandom.number{max or 1}
end

local function expandArg(args, key)
    -- Meniru bagaimana parameter templat yang tidak dinyatakan muncul dalam wikiteks
    local val = args[key]
    if val then
        return val
    else
        return string.format('{{{%s}}}', key)
    end
end

local function getPages(args)
    local halaman = {}
    halaman.root = args.rootpage or currentTitle.prefixedText
    halaman.subpage = halaman.root .. '/' .. expandArg(args, 'subpage')
    local cubaan = 10
    repeat
        halaman.random = halaman.subpage .. '/' .. getRandomNumber(args.max)
        cubaan = cubaan - 1
    until cubaan < 1 or mw.title.new(halaman.random).exists
    halaman.footer = 'Templat:Box-footer'
    return halaman
end

local function tryExpandTemplate(frame, tajuk, args)
    local success, result = pcall(frame.expandTemplate, frame, {title = tajuk, args = args})
    if success then
        return result
    else
        local msg = string.format(
            '<strong class="error">Halaman "[[%s]]" tidak wujud.</strong>',
            tajuk
        )
        if mw.title.getCurrentTitle().namespace == 100 then -- dalam ruang nama Portal
            msg = msg .. '[[Kategori:Portal yang memerlukan perhatian]]'
        end
        return msg
    end
end

local function getHeader(frame, halaman, tajuk, templat)
    return tryExpandTemplate(
        frame,
        templat or halaman.root .. '/box-header',
        {tajuk, halaman.random}
    )
end

local function getRandomSubpageContent(frame, halaman)
    return tryExpandTemplate(
        frame,
        halaman.random
    )
end

local function getFooter(frame, halaman, pautan)
    return tryExpandTemplate(
        frame,
        halaman.footer,
        {pautan}
    )
end

function p._main(args, frame)
    frame = frame or mw.getCurrentFrame()
    local halaman = getPages(args)

    local ret = {}
    ret[#ret + 1] = getHeader(frame, halaman, args.header or 'subpage', args.headertemplate)
    ret[#ret + 1] = getRandomSubpageContent(frame, halaman)
    if not args.footer or not args.footer:find('%S') then
        ret[#ret + 1] = '<div style="clear:both;"></div></div>'
    else
        ret[#ret + 1] = getFooter(frame, halaman, string.format(
            '[[%s|%s]]',
            halaman.subpage,
            expandArg(args, 'footer')
        ))
    end

    return table.concat(ret, '\n') .. subPageTrackingCategories(halaman, args.max, args.header)
end

function p._nominate(args, frame)
    frame = frame or mw.getCurrentFrame()
    local halaman = getPages(args)
    
    local ret = {}
    ret[#ret + 1] = getHeader(frame, halaman, expandArg(args, 'header'), args.headertemplate)
    ret[#ret + 1] = getRandomSubpageContent(frame, halaman)
    ret[#ret + 1] = getFooter(frame, halaman, string.format(
        '[[/Nominate/%s|Cadangkan]] • [[%s|%s]] ',
        expandArg(args, 'subpage'),
        halaman.subpage,
        args.footer or 'Arkib'
    ))

    return table.concat(ret, '\n') .. subPageTrackingCategories(halaman, args.max, args.header)
end

local function makeInvokeFunction(func)
    return function (frame)
        local args = require('Modul:Arguments').getArgs(frame, {
            trim = false,
            removeBlanks = false,
            wrappers = {
                'Templat:Komponen portal rawak',
                'Templat:Komponen portal rawak/BHG-test',
                'Templat:Komponen portal rawak dengan nominasi'
            }
        })
        return func(args, frame)
    end
end

p.main = makeInvokeFunction(p._main)
p.nominate = makeInvokeFunction(p._nominate)

return p