پرش به محتوا

پودمان:Ayat-Navigator

از ویکی شیعه
توضیحات پودمان[ایجاد] [پاکسازی]
require('strict')

local p = {}
local args = {}

local num_con = require('Module:Numeral converter').convert
local getArgs = require('Module:Arguments').getArgs
--local cfg = mw.loadData('Module:Ayat-Navigator/configs')

local function getData(sure, data_type)
	if (data_type=="len") then
		return require('Module:Ayat-Navigator/Sure-Lengths')
	end
	
	if (data_type=="joze_hezb") then
		return require('Module:Ayat-Navigator/Joze-Hezb')
	end
		
	if (data_type=="aye") then
		return require('Module:Ayat-Navigator/Q' .. sure)
	end
	
	if (data_type=="name_num") then
		return require('Module:Ayat-Navigator/nums-names')
	end

	local title = mw.title.new('Module:Ayat-Navigator/' .. sure)
		if not (title and title.exists) then return nil end
	return require('Module:Ayat-Navigator/' .. sure)
end

function p.get_aye(frame)
	args = getArgs(frame)
	
	local aye_num = tonumber(num_con("en", args["aye_num"]))
	local sure_num = tonumber(num_con("en", args["sure_num"]))
	local sure_name = args["sure_name"]

	if aye_num and sure_num and not sure_name then
		if getData(sure_num, "aye") then
			local data = getData(sure_num, "aye")
			return data.ayat[aye_num]
		end
	elseif aye_num and not sure_num and sure_name then
		if getData(sure_name, "name_num") then
			local suresnums = getData(sure_num, "name_num")
			if suresnums.names_nums[sure_name] then
				local surenum = suresnums.names_nums[sure_name]
				if getData(surenum, "aye") then
					local data = getData(surenum, "aye")
					return data.ayat[aye_num]
				end
			end
		end
	end
end

function p.next_aye(frame)
	args = getArgs(frame)
	
	local aye_num = tonumber(num_con("en", args["aye_num"]))
	local sure_num = tonumber(num_con("en", args["sure_num"]))
	local sure_name = args["sure_name"]
	
	local data_len = getData("", "len")
	local data_nn = getData("", "name_num")

	local sure_name_next
	
	if (sure_num < 113) then
		sure_name_next = data_nn.nums_names[sure_num+1]
	else
		return "آیه بعد"
	end
	
	local sure_len = data_len.lengths
	
	if (aye_num < sure_len[sure_num]) then
		return "[[آیه " .. num_con("fa", aye_num+1) .. " سوره " .. sure_name .."|آیه بعد]]"
	elseif (aye_num == sure_len[sure_num]) then
		return "[[آیه " .. num_con("fa", "1") .. " سوره " .. sure_name_next .."|آیه بعد]]"
	else
		return "آیه بعد"
	end
end

function p.prev_aye(frame)
	args = getArgs(frame)
	
	local aye_num = tonumber(num_con("en", args["aye_num"]))
	local sure_num = tonumber(num_con("en", args["sure_num"]))
	local sure_name = args["sure_name"]
	
	local data_nn = getData("", "name_num")
	local data_len = getData("", "len")
	local sure_len = data_len.lengths

	if ((aye_num > 1) and (sure_num == 1)) then
		return "[[آیه " .. num_con("fa", aye_num-1) .. " سوره " .. sure_name .."|آیه قبل]]"
	elseif ((aye_num > 1) and (sure_num > 1)) then
		return "[[آیه " .. num_con("fa", aye_num-1) .. " سوره " .. sure_name .."|آیه قبل]]"
	elseif ((aye_num == 1) and (sure_num > 1)) then
		local sure_name_prev = data_nn.nums_names[sure_num-1]
		return "[[آیه " .. num_con("fa", sure_len[sure_num-1]) .. " سوره " .. sure_name_prev .."|آیه قبل]]"
	else
		return "آیه قبل"
	end
end

function p.get_sure_len(frame)
	args = getArgs(frame)
	
	local sure_num = tonumber(num_con("en", args["sure_num"]))
	
	local data_len = getData("", "len")
	local sure_len = data_len.lengths
	
	return sure_len[sure_num]
end

function p.get_sure_name(frame)
	args = getArgs(frame)
	
	local sure_num = tonumber(num_con("en", args["sure_num"]))
	local data_nn = getData("", "name_num")

	if ((sure_num <= 114) and (sure_num >= 1)) then
		return data_nn.nums_names[sure_num]
	end
end

function p.get_named_ayeh(frame)
	args = getArgs(frame)
	
	local ayeh_name = args["ayeh_name"]
	local next = args["next"]
	local previous = args["previous"]
	local sure_num = 0
	local surenums = {2, 3, 4, 5, 7, 8, 9, 13, 15, 16,
					  17, 18, 19, 21, 23, 24, 26, 27,
					  28, 30, 33, 42, 43, 48, 49, 52,
					  58, 59, 60, 62, 65, 66, 68, 70,
					  76, 89, 98}

	
	local current_sure = 0
	local current_ayat = {}
	local found = 0
	
	for i, v in ipairs(surenums) do
		local data = getData(v, "")

		for item_i, item_v in ipairs(data.ayat_namdar) do
			if ((data.ayat_namdar[item_i][2] == ayeh_name) and
				(found == 0)) then
				current_sure = v
				current_ayat = data.ayat_namdar[item_i][1]
				table.sort(current_ayat)
				found = 1
			end
		end
	end
	
	local sorted_ayat = {}
	
	if (found == 1) then
		sorted_ayat = p.sorting_ayat(current_sure)
		--local test = ''
		--test = #sorted_ayat
		--return test
		
		for i, v in ipairs(sorted_ayat) do
			if (v[2] == ayeh_name) then
				if (next == "1") then
					if (sorted_ayat[i+1]) then
						return sorted_ayat[i+1][2]
					else
						local nns = p.next_named_sure(current_sure)
						local data = getData(nns, "")
						sorted_ayat = p.sorting_ayat(nns)
						local ttt = ''

						return sorted_ayat[1][2]
					end
				else
					if (i-1 > 0) then
						return sorted_ayat[i-1][2]
					else
						local pns = p.prev_named_sure(current_sure)
						local data = getData(pns, "")
						sorted_ayat = p.sorting_ayat(pns)
						return sorted_ayat[#sorted_ayat][2]
					end
				end
			end
		end
	end
	
	--return ''
end

function p.sorting_ayat(current_sure)
	local data = getData(current_sure, "")
	local ind = 1
	local mins = {}
	
	for item_i, item_v in ipairs(data.ayat_namdar) do
		local min = 1000
		
		for i, v in ipairs(item_v[1]) do
			min = math.min(min, v)
		end
		
		mins[ind] = {min, item_v[2]}
		
		ind = ind + 1
	end
	
	local sorted_mins = {}
	
	local mins_len = #mins
	
	local function sortByKey(key)
	    return function(a, b)
	        return a[key] < b[key]
	    end
	end
	
	table.sort(mins, sortByKey(1))
	
	return mins
end

function p.next_named_sure(current_sure)
	local surenums = {2, 3, 4, 5, 7, 8, 9, 13, 15, 16,
					  17, 18, 19, 21, 23, 24, 26, 27,
					  28, 30, 33, 42, 43, 48, 49, 52,
					  58, 59, 60, 62, 65, 66, 68, 70,
					  76, 89, 98}

	for i, v in ipairs(surenums) do
		if (v == current_sure) then
			if (v < 98) then
				return surenums[i+1]
			else
				return 2
			end
		end
	end
end

function p.prev_named_sure(current_sure)
	local surenums = {2, 3, 4, 5, 7, 8, 9, 13, 15, 16,
					  17, 18, 19, 21, 23, 24, 26, 27,
					  28, 30, 33, 42, 43, 48, 49, 52,
					  58, 59, 60, 62, 65, 66, 68, 70,
					  76, 89, 98}

	for i, v in ipairs(surenums) do
		if (v == current_sure) then
			if (v > 2) then
				return surenums[i-1]
			else
				return 98
			end
		end
	end
end

function p.is_named_ayeh(frame)
	local surenums = {2, 3, 4, 5, 7, 8, 9, 13, 15, 16,
					  17, 18, 19, 21, 23, 24, 26, 27,
					  28, 30, 33, 42, 43, 48, 49, 52,
					  58, 59, 60, 62, 65, 66, 68, 70,
					  76, 89, 98}
	local ayeh_name = args["ayeh_name"]
	
	for x in surenums do
		local data = getData(x, "")
		
		for i, v in ipairs(data.ayat_namdar) do
			if  (v[2] == ayeh_name) then
				return 1
			end
		end
	end
end

return p