Перейти к содержанию

Модуль:SortedCategory

Материал из Викиновостей, свободного источника новостей
Документация
--[[
------------------------------------------
--              SortedCategory
-- Модуль для сортированного заполнения категорий.
------------------------------------------
--]]

local SortedCategory = {}

local GetArticleDate = require("Module:GetArticleDate")
local SerializeTable = require("Module:SerializeTable")
local StringDates2Need = require("Module:StringDates2Need")

function SortedCategory.launch(frame)
	local newsDate = GetArticleDate.launchCurrentPage(frame)
	local key
	local categories = ""
	if newsDate == nil or newsDate == "" then 
		key = " " 
	    categories = categories .. "[[Категория:Дата не распарсилась]]"   
	else 
		key = SortedCategory.KeySort(newsDate)
		if key == nil then
			key = " " 
		    categories = categories .. "[[Категория:Дата не распарсилась" .. frame.args[index] .. "]]"   
		end
	end
	
	index = 1
	while frame.args[index] ~= nil do
		if (frame.args[index] ~= " " and frame.args[index] ~= "" and string.find(frame.args[index], "{{{") == nil) then 
			if key ~= " " and key ~= nil  then categories = categories .. "[[Категория:" .. frame.args[index] .. "| " .. key .. "]]" --добавляет датой ключ, если распарсилась
			else categories = categories .. "[[Категория:" .. frame.args[index] .. "]]"  end
		end
		index = index + 1
	end
	
	return categories  
end

function SortedCategory.KeySort(newsDate)  --Year, month, day
	local s = newsDate
	
	if (s == nil or s == '') then return 0 end
	
	local dd = ""
	local mm = ""
	local yy = ""
	
	for i=1, #s do 
		local c = s:sub(i,i)
		if c == ' ' then break 
		elseif c < '0' or c > '9' then return nil
		else dd = dd .. c end
	end
	if #dd == 1 then dd = "0" .. dd	end
	
	if string.find(s, "января") or string.find(s, "январь") then mm = "01"
	elseif string.find(s, "февраля") or string.find(s, "февраль") then mm = "02" 
	elseif string.find(s, "марта") or string.find(s, "март") then mm = "03" 
	elseif string.find(s, "апреля") or string.find(s, "апрель") then mm = "04" 
	elseif string.find(s, "мая") or string.find(s, "май") then mm = "05" 
	elseif string.find(s, "июня") or string.find(s, "июнь") then mm = "06" 
	elseif string.find(s, "июля") or string.find(s, "июль") then mm = "07" 
	elseif string.find(s, "августа") or string.find(s, "август") then mm = "08" 
	elseif string.find(s, "сентября") or string.find(s, "сентябрь") then mm = "09" 
	elseif string.find(s, "октября") or string.find(s, "октябрь") then mm = "10" 
	elseif string.find(s, "ноября") or string.find(s, "ноябрь") then mm = "11" 
	elseif string.find(s, "декабря") or string.find(s, "декабрь") then mm = "12" 
	else return nil
	end
	
	for i=#s-1, 1, -1 do
		local c = s:sub(i,i)
		if c == ' ' then break
		elseif c < '0' or c > '9' then return nil
		else yy = c .. yy end
	end
	if #yy == 1 then yy = "000" .. yy
	elseif #yy == 2 then yy = "00" .. yy
	elseif #yy == 3 then yy = "0" .. yy
	end
	
	local ISO = yy .. mm .. dd
	local sum = string.match(ISO, "%d+%.?%d*") 
	local key = tostring(1000000000 - sum)
	
	return key
	--return tonumber(yy)
	--local answer = tonumber(yy) + tonumber(mm) + tonumber(dd)
	--return answer

end

return SortedCategory