Modul:Random portal component
Penampilan
-- 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