انتقل إلى المحتوى

وحدة:Countdown-0/ملعب

من ويكيبيديا، الموسوعة الحرة
--[[ Countdown
هذه الوحدة تعمل عبر قالب {{عد تنازلي}}
تم تعديل الوحدة لتعمل بتوقيت عالمي متناسق (UTC) وإصلاح الأخطاء المتعلقة بالتواريخ.
]]

local p = {}
string = mw.ustring

-- الثوابت
local lang = mw.language.getContentLanguage()
local getArgs = require('Module:Arguments').getArgs
local alltimeparts = {'years', 'weeks', 'days', 'hours', 'minutes', 'seconds'}
local timeFormat
local timeparts = 2
local color = '#F00'

-- تنسيق الرسالة وإضافة الألوان
local function formatMessage(text, secondsLeft)
	local maj = mw.ustring.find(text, '@مدة مجرورة@', 1, true) and true or false

	-- استخراج وحدات الوقت بناءً على المدخلات
    local function getTableKeys(table, limit)
        local keyset = {}
        local n = 0
        for _, v in pairs(alltimeparts) do
            if table[v] then
                n = n + 1
                keyset[n] = v
                if n >= limit then break end
            end
        end
        return keyset
    end

	-- تنسيق الوقت المتبقي بناءً على الوحدات الزمنية
    local mytimeformat = timeFormat or (timeparts and getTableKeys(lang:getDurationIntervals(secondsLeft, alltimeparts), timeparts)) or alltimeparts
    local timeLeft = lang:formatDuration(secondsLeft, mytimeformat)

	-- تلوين وتثقيل الأرقام
	timeLeft = string.gsub(timeLeft, '(%d+)', '<span style="color: ' .. color .. '; font-weight: bold;">%1</span>')
	
	-- معالجة النص العربي (تعديلات لغوية)
    if maj then
		timeLeft = string.gsub(timeLeft, 'ان و ', 'ين و')
		timeLeft = string.gsub(timeLeft, 'ان، ', 'ين و')
        if string.sub(timeLeft, -2) == 'ان' then
        	timeLeft = string.sub(timeLeft, 1, -3) .. 'ين'
    	end
    end
    
	timeLeft = string.gsub(timeLeft, '، ', ' و')
	timeLeft = string.gsub(timeLeft, '%(', '')
	timeLeft = string.gsub(timeLeft, '%)', '')

    -- استبدال النص placeholder بالمدة المتبقية
    if text and text ~= '' then
        timeLeft = string.gsub(text, maj and '@مدة مجرورة@' or '@مدة@', timeLeft)
    end
    
    return timeLeft
end

-- إدارة إعدادات التاريخ والوقت (التأكد من صحة القيم المدخلة)
local function process(args)
	local eventTime

    -- التحقق من وجود date1 أو السنة والشهر واليوم
    if type(args.date1) ~= 'nil' then
		-- التعامل مع تاريخ محدد بصيغة UTC
		eventTime = tonumber(lang:formatDate('U', args.date1))
		args.date1 = lang:formatDate('c', args.date1)
	elseif tonumber(args.year) and tonumber(args.month) and tonumber(args.day) then
		-- التحقق من وجود السنة والشهر واليوم
		eventTime = os.time({year=args.year, month=args.month, day=args.day, hour=args.hour, min=args.minute, sec=args.second, isdst=false})
		args.date1 = lang:formatDate('c', '@' .. eventTime)
	else
		-- إذا لم يتم العثور على date1 أو السنة والشهر واليوم، يتم إرجاع خطأ
		error('<strong class="error">خطأ: يجب تحديد تاريخ.</strong>')
	end
	
	-- التحقق من وجود eventTime
	if not eventTime then
		error('<strong class="error">خطأ: حدث مشكلة في تحديد الوقت.</strong>')
	end
	
	-- حساب الفرق الزمني لبداية الحدث
	local timeToStart = os.difftime(eventTime, os.time(os.date('!*t')))
	local timeToEnd = nil

	-- التحقق من وجود date2 أو duration
	if args.date2 then
		timeToEnd = tonumber(lang:formatDate('U', args.date2))
        args.date2 = lang:formatDate('c', '@' .. tostring(timeToEnd))
        timeToEnd = os.difftime(timeToEnd, os.time(os.date('!*t')))
	elseif tonumber(args.duration) and eventTime then
		timeToEnd = timeToStart + tonumber(args.duration)
		args.date2 = lang:formatDate('c', '@' .. tostring(eventTime + args.duration))
	end

	-- التحقق من وجود timeToStart أو timeToEnd
	if not timeToStart and not timeToEnd then
		error('<strong class="error">خطأ: يجب تحديد مدة أو نهاية.</strong>')
	elseif timeToEnd and not timeToStart then
		timeToStart = 0
	end

	return timeToStart, timeToEnd
end

-- الوظيفة الرئيسية لمعالجة العد التنازلي
local function _Main(args)
	local timeToStart, timeToEnd = process(args)
	local text

	if timeToStart > 0 then
		-- الحدث لم يبدأ بعد
		text = formatMessage(args.eventbefore or args.event and ('بقي @مدة@ على بداية «' .. args.event  .. "».") or '', timeToStart)
	elseif timeToEnd then
		if timeToEnd > 0 then
			-- الحدث جاري الآن
			text = formatMessage(args.eventstart2 or args.event and ("بداية «" .. args.event .. "» وستنتهي بعد @مدة مجرورة@") or '', timeToEnd)
		else
			-- الحدث انتهى
			text = args.eventend or args.event and ("انتهاء «" .. args.event .. "».") or ''
		end
	else
		-- الحدث قد بدأ
		text = args.eventstart or args.event and ("بداية «" .. args.event .. '».') or ''
	end

	-- رابط التحديث
	local refreshLink
	if not args.refresh or args.refresh == 'no' or args.refresh == 'لا' then
		refreshLink = ''
	else
		refreshLink = mw.title.getCurrentTitle():fullUrl({action = 'purge'})
		refreshLink = string.format('<span class="plainlinks cdt-refreshLink"><small>([%s تحديث])</small></span>', refreshLink)
	end

	return '<span class="countdown-timer">' .. text .. refreshLink .. '</span>'
end

function p.main(frame)
	local args = getArgs(frame)
	
	-- إعدادات التوقيت والوحدات الزمنية
	if type(args.timeFormat) == 'string' then
		timeFormat = formatDurationList(args.timeFormat)
	end
	
	timeparts = tonumber(args.timeparts) or tonumber(args['أجزاء الوقت']) or timeparts
    color = args.color or args['لون'] or args['اللون'] or color

	local args2 = {
		date1 = args.date1 or args['بداية'] or args['البداية'],
		date2 = args.date2 or args['نهاية'] or args['النهاية'],
		year = args.year or args['سنة'] or args['السنة'],
		month = args.month or args['شهر'] or args['الشهر'],
		day = args.day or args['يوم'] or args['اليوم'],
		hour = args.hour or args['ساعة'] or args['الساعة'],
		min = args.minute or args['دقيقة'] or args['الدقيقة'],
		sec = args.second or args['ثانية'] or args['الثانية'],
		duration = args.duration or args['مدة'] or args['المدة'],
		['duration unit'] = args['duration unit'],
		event = args.event or args['حدث'] or args['الحدث'],
		eventbefore = args.eventbefore or args['قبل الحدث'],
		eventstart = args.eventstart or args['بداية الحدث'],
		eventstart2 = args.eventstart2 or args['بداية الحدث 2'],
		eventend = args.eventend or args['نهاية الحدث'],
		refresh = args.refresh or args['تحديث'] or args['التحديث']
	}

	return _Main(args2)
end

return p