وحدة:Countdown-0/ملعب
المظهر
هذه صفحة ملعب الوحدة لصفحة وحدة: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