Prijeđi na sadržaj

Modul:Rasprava o brisanju

Izvor: Wikipedija


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&nbsp;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 .. '&nbsp;<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