Modul:AutoRelated: Perbedaan antara revisi
Tampilan
Wikisporta (bicara | kontrib) Tidak ada ringkasan suntingan |
Wikisporta (bicara | kontrib) Tidak ada ringkasan suntingan |
||
| Baris 10: | Baris 10: | ||
-- Cari semua pola wikilink [[Judul Artikel]] di dalam wikitext | -- Cari semua pola wikilink [[Judul Artikel]] di dalam wikitext | ||
for link in wikitext:gmatch("%[%[([^%]|#]+)%|?.-%]%]") do | for link in wikitext:gmatch("%[%[([^%]|#]+)%|?.-%]%]") do | ||
link = mw.text.trim(link) | link = mw.text.trim(link) | ||
if link ~= title.text and not link:find(":") then | if link ~= title.text and not link:find(":") then | ||
local targetTitle = mw.title.new(link) | local targetTitle = mw.title.new(link) | ||
-- Validasi ketat: | -- Validasi ketat: Halaman ada, bukan redirect, dan belum pernah dimasukkan | ||
if targetTitle and targetTitle.exists and not targetTitle.isRedirect and not seen[link] then | if targetTitle and targetTitle.exists and not targetTitle.isRedirect and not seen[link] then | ||
seen[link] = true | seen[link] = true | ||
table.insert(validLinks, link) | table.insert(validLinks, link) | ||
-- OPTIMASI UTAMA: Berhenti mencari jika sudah terkumpul 10 link valid. | |||
-- Ini mencegah error "too many expensive function calls" pada artikel panjang. | |||
if #validLinks >= 5 then | |||
break | |||
end | |||
end | end | ||
end | end | ||
Revisi terkini sejak 27 Oktober 2026 14.31
Dokumentasi untuk modul ini dapat dibuat di Modul:AutoRelated/doc
local p = {}
function p.main(frame)
local title = mw.title.getCurrentTitle()
local wikitext = title:getContent() or ""
local validLinks = {}
local seen = {}
-- Cari semua pola wikilink [[Judul Artikel]] di dalam wikitext
for link in wikitext:gmatch("%[%[([^%]|#]+)%|?.-%]%]") do
link = mw.text.trim(link)
if link ~= title.text and not link:find(":") then
local targetTitle = mw.title.new(link)
-- Validasi ketat: Halaman ada, bukan redirect, dan belum pernah dimasukkan
if targetTitle and targetTitle.exists and not targetTitle.isRedirect and not seen[link] then
seen[link] = true
table.insert(validLinks, link)
-- OPTIMASI UTAMA: Berhenti mencari jika sudah terkumpul 10 link valid.
-- Ini mencegah error "too many expensive function calls" pada artikel panjang.
if #validLinks >= 5 then
break
end
end
end
end
-- Jika tidak ada link valid, kembalikan kosong
if #validLinks == 0 then
return ""
end
-- Acak (shuffle) array secara stabil berdasarkan ID halaman
math.randomseed(os.time() + title.id)
for i = #validLinks, 2, -1 do
local j = math.random(i)
validLinks[i], validLinks[j] = validLinks[j], validLinks[i]
end
-- Ambil maksimal 3 link
local result = ""
local count = math.min(3, #validLinks)
for i = 1, count do
result = result .. "{{#related:" .. validLinks[i] .. "}}\n"
end
return frame:preprocess(result)
end
return p