Modul:Rasprava o brisanju
Izgled
Koristi Lua modul: |
Modul služi kao dopuna predlošcima za brisanje i osporavanje brisanja.
Modul pruža nekoliko izvanjskih metoda:
- – Popis se automatski ažurira ovisno o podstranici na kojoj se nalazimo; mjesec na trenutačnoj stranici uvijek je u sredini, a sa svake njegove strane nalaze se još tri kronološki poredana mjeseca.
- – Broj mjeseci prije sadašnjeg regulira se varijablom
MIN
- – Broj nakon sadašnjeg regulira se varijablom
MAX
- – Tekst između mjeseci regulira se varijablom
separator
- pretraziArhivu(naslov, datum) - u pozadini na stranici za osporavanja za pruženi mjesec i godinu predlaganja (parametar datum) traži podnaslov koji nosi ime pruženog članka (parametar naslov). : – Ovisno o uspjehu metoda vraća neku od sljedećih brojki:
- ako podnaslov nije pronađen vraća 0.
- ako je podnaslov pronađen, unutar idućih 50 znakova traži se zaključak rasprave:
- ako rasprava nije zaključena vraća 11
- ako je rasprava zaključena vraća 22
- Ako nije unesen parametar "datum" (mjesec predlaganja) ili ako stranica za osporavanje u pojedinom mjesecu nije stvorena, vraća -1.
- postojiRasprava – koristi se u pojedinačnom predlošku za brisanje ako je naveden mjesec prijedloga. Poziva metodu pretraziArhivu s nazivom stranice na kojoj je pozvan predložak za brisanje i unesenog datuma. Ako je rezultat pretrage pozitivan, predložak za brisanje umjesto gumba "ospori ovo brisanje" prikazuje poveznicu na raspravu.
- pretraziSveArhive(naslov) - poziva pretraziArhivu u svim kombinacijama mjeseca i godina, i popisuje sve arhive u kojima je prisutna rasprava o članku imena naslov. Ovu metodu koristi predložak {{Razgovor zaglavlje/1}} za prikaz poveznica na rasprave o brisanjima na SZR svih članaka koji su ikada bili predloženi, neovisno o zaključku rasprave.
- - ako rasprava u nekoj kombinaciji mjeseca i godine nije otvorena (pretpostavljeno idući mjesec u trenutnoj godini) pretraga staje i vraća se dotad izgrađeni popis.
- sortirajKategoriju – predložak {{Rasprava o brisanju}} koristi se tom metodom za stvaranje kategorijskog ključa za podstranice rasprava.
- – Stranice u kategorijama sortiraju se po brojčanoj vrijednosti godine i mjeseca rasprave umjesto po tekstu podstranice. Primjerice, podstranica "Travanj 2023." sortirat će se kao 202304.
local p = {}
local MIN = -3
local MAX = 3
local MIN_GOD = -2
local MAX_GOD = 2
local separator = " · "
local now = os.date("*t")
function mapNumberToText(mjesecNumber)
local mjesec = "00"
if mjesecNumber == 1 then mjesec = "siječanj"
elseif mjesecNumber == 2 then mjesec = "veljača"
elseif mjesecNumber == 3 then mjesec = "ožujak"
elseif mjesecNumber == 4 then mjesec = "travanj"
elseif mjesecNumber == 5 then mjesec = "svibanj"
elseif mjesecNumber == 6 then mjesec = "lipanj"
elseif mjesecNumber == 7 then mjesec = "srpanj"
elseif mjesecNumber == 8 then mjesec = "kolovoz"
elseif mjesecNumber == 9 then mjesec = "rujan"
elseif mjesecNumber == 10 then mjesec = "listopad"
elseif mjesecNumber == 11 then mjesec = "studeni"
elseif mjesecNumber == 12 then mjesec = "prosinac"
end
return mw.language.getContentLanguage():ucfirst(mjesec)
end
function mapTextToNumber(mjesecTextInit)
local mjesecText = mjesecTextInit:lower()
local mjesec = "00"
if mjesecText == "siječanj" then mjesec = "01"
elseif mjesecText == "veljača" then mjesec = "02"
elseif mjesecText == "ožujak" then mjesec = "03"
elseif mjesecText == "travanj" then mjesec = "04"
elseif mjesecText == "svibanj" then mjesec = "05"
elseif mjesecText == "lipanj" then mjesec = "06"
elseif mjesecText == "srpanj" then mjesec = "07"
elseif mjesecText == "kolovoz" then mjesec = "08"
elseif mjesecText == "rujan" then mjesec = "09"
elseif mjesecText == "listopad" then mjesec = "10"
elseif mjesecText == "studeni" then mjesec = "11"
elseif mjesecText == "prosinac" then mjesec = "12"
end
return mjesec
end
function ispisiMjesec(mjesec, godina, i, godinaOnly, frame)
local vrijeme = os.date( "*t", os.time({year=godina, month=mjesec, day="15"}) )
local datum = mapNumberToText(vrijeme.month) .. " " .. vrijeme.year .. "."
local tekst = datum
-- Calculate the difference in months
local year_diff = now.year - vrijeme.year
local month_diff = now.month - vrijeme.month
local total_month_diff = year_diff * 12 + month_diff
-- Check if the difference is more than a month
local plaintext = math.abs(total_month_diff) > 1
if godinaOnly == true then tekst = vrijeme.year .. "." end
local link = ''
if mw.title.new("Rasprava o brisanju/Rasprave/" .. datum, 'Wikipedija').exists then
link = "[[Wikipedija:Rasprava o brisanju/Rasprave/" .. datum .. "|" .. tekst .. "]]"
count = izbrojiAktivneRaspraveUMjesecu(datum)
if count > 0 then
link = link .. ' ('..count..')'
end
else
if plaintext == false and (vrijeme.year > 2021 or (vrijeme.year == 2021 and vrijeme.month == 12)) then
-- zapriječi otvaranje novih rasprava za više od mjesec dana unaprijed ili prije uvođenja WP:ROB (pros. 2021)
link = mw.getCurrentFrame():preprocess('<span class="plainlinks rasprava-o-brisanju-novo">['
.. '{{fullurl:Wikipedija:Rasprava o brisanju/Rasprave/{{urlencode:' .. datum..'|WIKI}}'
.. '|action=edit'
.. '&preload=Wikipedija:Rasprava_o_brisanju/Rasprave/bazna'
.. '&summary={{urlencode:Otvaranje rasprave u novom mjesecu}}}}<span style="color:#ba0000;">'.. tekst .. '</span>]</span>')
else link = tekst
end
end
-- zadnji mjesec nema povlaku
if i == MAX and godinaOnly == false then return link
elseif i ==MAX_GOD and godinaOnly == true then return link
else return link .. separator
end
end
-- WP:ROB/Zaglavlje
function p.zaglavlje(frame)
local naslov = mw.ustring.lower(mw.title.getCurrentTitle().subpageText)
local mjesecNominativ, godina = naslov:match("([A-ž]*) (%d%d%d%d)%.")
if mjesecNominativ == nil then
return ''
else
local mjesec = mapTextToNumber(mjesecNominativ)
ret = ''
for i=MIN_GOD,MAX_GOD,1 do
ret = ret .. ispisiMjesec(mjesec, godina+i, i, true)
end
ret = ret .. '<br>'
for i=MIN,MAX,1 do
ret = ret .. ispisiMjesec(mjesec+i, godina, i, false)
end
return ret
end
end
----- Traženje sekcije gdje je brisanje osporeno -----
function p.postojiRasprava()
local frame = mw.getCurrentFrame():getParent()
local datumBrisanja = frame.args['datum']
if datumBrisanja == nil then
return ''
end
local stranicaKojuTrazimo = ''
if mw.title.getCurrentTitle().nsText == '' then
stranicaKojuTrazimo = mw.title.getCurrentTitle().text
else
stranicaKojuTrazimo = mw.title.getCurrentTitle().nsText .. ":" .. mw.title.getCurrentTitle().text
end
mw.log("stranica", stranicaKojuTrazimo)
return p.pretraziArhivu(stranicaKojuTrazimo, datumBrisanja)
end
function p.sortirajKategoriju()
local naslov = mw.ustring.lower(mw.title.getCurrentTitle().subpageText)
local mjesecNominativ, godina = naslov:match("([A-ž]*) (%d%d%d%d)%.")
local mjesec = mapTextToNumber(mjesecNominativ) or "00"
if mjesecNominativ == nil then
return ''
else
return godina .. mjesec
end
end
function p.pretraziArhivu(naslov, datum)
local sadrzaj = mw.title.new('Rasprava o brisanju/Rasprave/'.. datum, 'Wikipedija')
local retval = -5
if not sadrzaj.exists then
return -1 -- stranica za traženi datum ne postoji
end
local textContent = mw.text.decode(sadrzaj:getContent(), true)
-- Escape special characters in 'naslov' for pattern matching
naslov = naslov:gsub("([()-])", "%%%1")
-- Find the section for 'naslov' using pattern matching
local match_start, match_end = string.find(textContent, "==% *%[%[%:?"..naslov)
if not match_start then
return 0 -- rasprava nije pronađena
end
-- Extract the substring after the match to check if it's closed
local after_match = string.sub(textContent, match_end + 1, match_end + 50):lower()
-- Check if the discussion is closed
if after_match:find("zadrzan") or after_match:find("zadržan") or after_match:find("obrisan") or after_match:find("nacrt") then
retval = 22 -- rasprava pronađena, zatvorena
else
retval = 11 -- rasprava pronađena, otvorena
end
mw.log("pretraziArhivu: " .. retval)
return retval
end
function p.pretraziSveArhive(frame)
local ret = ''
local count = 0;
local naslov = frame.args[1]:gsub("^%s*(.-)%s*$", "%1") --remove staring and ending spaces
local excludeMonth = frame.args[2] or nil
local samoIzbroji = frame.args[3] or nil
local rob = require('Modul:Rasprava o brisanju/data')
if rob[naslov] then
mw.log('naslov found in /data')
for k, v in ipairs(rob[naslov]) do
if v.mjesec ~= excludeMonth then
if count == 0 then
ret = ret .. '[[Wikipedija:Rasprava o brisanju/Rasprave/' .. v.mjesec .. '#' .. naslov .. '|' .. v.mjesec ..']] (' .. v.status .. ')'
count=count+1
else
ret = ret .. '; [[Wikipedija:Rasprava o brisanju/Rasprave/' .. v.mjesec .. '#' .. naslov .. '|' .. v.mjesec ..']] (' .. v.status .. ')'
count=count+1
end
end
end
else
mw.log('naslov not found in /data, searching manually')
count = 0
break_condition = false
-- backup ako lista nije ažurna
local sm, sy = rob['@UPDATED@']:match("(%d+)%s+(%d+)")
local startMonth = tonumber(sm)
local startYear = tonumber(sy)
-- ne oslanjaj se na listu za zadnji mjesec
-- (ako su rasprave dodane nakon zadnjeg ažuriranja)
for year = startYear, 2050 do
local beginMonth = 1
if year == startYear then
beginMonth = startMonth
end
for month = beginMonth, 12 do
mw.log('Manual search: ' .. month .. ' - ' .. year)
datum = mapNumberToText(month) .. ' ' .. year .. '.'
local arhiva = p.pretraziArhivu(naslov, datum)
if tonumber(arhiva) > 10 then
if datum ~= excludeMonth then
if count == 0 then
ret = ret .. '[[Wikipedija:Rasprava o brisanju/Rasprave/' .. datum .. '#' .. naslov .. '|' .. datum ..']]'
count=count+1
else
ret = ret .. '; [[Wikipedija:Rasprava o brisanju/Rasprave/' .. datum .. '#' .. naslov .. '|' .. datum ..']]'
count=count+1
end
end
elseif arhiva == -1 then
break_condition = true
mw.log('stop', datum) -- rasprava za datum nije otvorena, stani s pretragom
break
end
if break_condition then
break
end
end -- for month do
if break_condition then
break
end
end -- for year do
end -- if rob-naslov else
if samoIzbroji then
return count
else
return ret
end
end
function p.printDataSubpage(frame)
local rob = require('Module:Rasprava o brisanju/data')
local ret = mw.html.create('table')
ret:addClass('wikitable'):addClass('sortable')
:addClass('mw-collapsible'):addClass('mw-collapsed')
ret:tag('caption'):wikitext('Popis stranica'):done()
-- Add table headers
local headerRow = ret:tag('tr')
headerRow:tag('th'):wikitext('Naslov'):done()
headerRow:tag('th'):wikitext('Predloženo'):done()
headerRow:tag('th'):wikitext('Broj'):done()
-- Initialize counters and list for failed parses
local countAll = 0
local countDeleted = 0
local countPreserved = 0
local countDraft = 0
local countParseFail = 0
local countNew = 0
local failedParses = {} -- To store titles of failed parses
-- Add table rows
for k, v in pairs(rob) do
if k ~= '@UPDATED@' then
local row = ret:tag('tr')
row:tag('td'):wikitext('[[:'..k..']]'):done()
local content = ""
local sortKey = ""
local countRepeats = 0
if type(v) == 'table' then
countRepeats = #v
for _, vv in ipairs(v) do
content = content .. '[[Wikipedija:Rasprava o brisanju/Rasprave/' .. vv['mjesec'] .. '#' .. k .. '|' .. vv['mjesec'] ..']]' .. ' (' .. vv['status'] .. ')<br>'
countAll = countAll + 1
local statusLower = vv['status']:lower()
-- Increment appropriate counters based on status
if string.find(statusLower, "zadržan") then
countPreserved = countPreserved + 1
elseif string.find(statusLower, "obrisan") then
countDeleted = countDeleted + 1
elseif string.find(statusLower, "nacrt") then
countDraft = countDraft + 1
elseif string.find(statusLower, "novo") then
countNew = countNew + 1
else
countParseFail = countParseFail + 1
table.insert(failedParses,
{
title=k,
month=vv['mjesec']
}) -- Store title of the failed parse
end
-- Extract month and year, declare as local
local mm, yy = vv['mjesec']:match("([A-ž]*) (%d%d%d%d)%.")
if mm and yy then
sortKey = yy .. '-' .. mapTextToNumber(mm)
else
sortKey = "0000-00" -- Default fallback for missing/invalid data
end
end
end
row:tag('td'):attr('data-sort-value', sortKey):wikitext(content):done()
row:tag('td'):wikitext(countRepeats):done()
end
end
-- Calculate percentages
local percentKept = (countPreserved / countAll) * 100
local percentDeleted = (countDeleted / countAll) * 100
local percentDraft = (countDraft / countAll) * 100
-- Add a summary after the table
ret:tag('div'):wikitext('Ukupan broj rasprava: ' .. countAll):done()
ret:tag('div'):wikitext('Ukupan broj nacrta: ' .. countDraft):done()
ret:tag('div'):wikitext('Ukupan broj zadržanih: ' .. countPreserved):done()
ret:tag('div'):wikitext('Ukupan broj obrisanih: ' .. countDeleted):done()
ret:tag('div'):wikitext('Ukupan broj aktivnih rasprava: ' .. countNew):done() -- Display 'novo' count
ret:tag('div'):wikitext(string.format('Postotak zadržanih: %.2f%%', percentKept)):done()
ret:tag('div'):wikitext(string.format('Postotak obrisanih: %.2f%%', percentDeleted)):done()
ret:tag('div'):wikitext(string.format('Postotak premještenih u Nacrt: %.2f%%', percentDraft)):done()
-- Print titles of all failed parses
if #failedParses > 0 then
ret:tag('div'):wikitext('Ukupan broj grešaka pri obradi statusa: ' .. countParseFail):done()
for _, v in ipairs(failedParses) do
ret:tag('div'):wikitext('* [[:' .. v.title .. ']]'
..' ([[Wikipedija:Rasprava o brisanju/Rasprave/' .. v.month .. '#' .. v.title .. '|' .. v.month ..']])'):done() -- Print each failed title as a link
end
end
-- Return the final HTML
return tostring(ret)
end
-- metoda se koristi u Kafiću
function p.popisiAktivneRasprave(frame)
local rob = require('Module:Rasprava o brisanju/data')
local samoIzbroji = frame.args[1] or nil
local countOpen = 0
local openDiscussions = {} -- To store titles and sort keys of open discussions
for k, v in pairs(rob) do
if k ~= '@UPDATED@' then
if type(v) == 'table' then
for _, vv in ipairs(v) do
if not (string.find(vv['status']:lower(), "zadržan")
or string.find(vv['status']:lower(), "obrisan")
or string.find(vv['status']:lower(), "nacrt")) then
-- Extract month and year
local mm, yy = vv['mjesec']:match("([A-ž]*) (%d%d%d%d)%.")
local sortKey
if mm and yy then
sortKey = yy .. '-' .. mapTextToNumber(mm) -- Create a sortable key
else
sortKey = "0000-00" -- Fallback for missing/invalid data
end
local pageLink = '[[Wikipedija:Rasprava o brisanju/Rasprave/' .. vv['mjesec'] .. '#' .. k .. '|' .. k ..']]'
if not mw.title.new(k).exists then
pageLink = pageLink .. ' <abbr style="color:red; font-weight: 700;" title="Članak ne postoji (nezatvorena rasprava?)">?</abbr>'
end
-- Store the discussion with its sort key
table.insert(openDiscussions, {
title = pageLink,
sortKey = sortKey..'-'..k,
mjesec = vv['mjesec']
})
countOpen = countOpen + 1
end
end
end
end
end
-- Sort the open discussions by the sortKey (which is 'yyyy-mm-title')
table.sort(openDiscussions, function(a, b) return a.sortKey < b.sortKey end)
local ret = ''
-- Print titles
if #openDiscussions > 0 then
ret = ret .. 'Ukupno otvorenih rasprava: ' .. countOpen
ret = ret .. '<div style="-webkit-column-count: 3; -moz-column-count: 3; column-count: 3;">'
local lastMjesec = nil -- Variable to store the previous mjesec
for _, discussion in ipairs(openDiscussions) do
if discussion.mjesec ~= lastMjesec then -- Check if mjesec has changed
ret = ret .. '<div><b>' .. discussion.mjesec .. '</b></div>' -- Print the new mjesec
lastMjesec = discussion.mjesec -- Update lastMjesec to the current one
end
ret = ret .. '<div style="border-left: 15px solid transparent;">' .. discussion.title .. '</div>'
end
ret = ret .. '</div>'
end
if samoIzbroji then
return countOpen
else
return ret
end
end
function izbrojiAktivneRaspraveUMjesecu(mjesec)
local rob = require('Module:Rasprava o brisanju/data')
local countOpen = 0
for k, v in pairs(rob) do
if k ~= '@UPDATED@' then
if type(v) == 'table' then
for _, vv in ipairs(v) do
if vv['mjesec'] == mjesec then
if not (string.find(vv['status']:lower(), "zadržan")
or string.find(vv['status']:lower(), "obrisan")
or string.find(vv['status']:lower(), "nacrt")) then
countOpen = countOpen + 1
end
end
end
end
end
end
return countOpen
end
return p