"ഘടകം:Add to Calendar" എന്ന താളിന്റെ പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം

Schoolwiki സംരംഭത്തിൽ നിന്ന്
No edit summary
റ്റാഗ്: Manual revert
(ചെ.) (Jinoytommanjaly (സംവാദം) ചെയ്ത നാൾപ്പതിപ്പ് 2805339 നീക്കം ചെയ്യുന്നു)
 
വരി 1: വരി 1:
local function get_days_in_month (year, month)
local function get_days_in_month (year, month)
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
year = tonumber(year)
year = tonumber (year); -- force these to be numbers just in case
month = tonumber(month)
month = tonumber (month);


if (2 == month) then -- if February
if (month == 2) then
if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then -- is year a leap year?
if (year % 4 == 0 and (year % 100 ~= 0 or year % 400 == 0)) then
return 29; -- if leap year then 29 days in February
return 29
end
end
end
end
return days_in_month [month];
return days_in_month[month]
end
end


local function get_date (date)
local function get_date (date)
local year, month, day, hour, minute, second;
local year, month, day, hour, minute, second =
date:match('(%d%d%d%d)%-(%d%d?)%-(%d%d?)T(%d%d?):(%d%d?):(%d%d?)')


year, month, day, hour, minute, second = date:match ('(%d%d%d%d)%-(%d%d?)%-(%d%d?)T(%d%d?):(%d%d?):(%d%d?)');
if not year then
if not year then
year, month, day, hour, minute, second = date:match ('^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$');
year, month, day, hour, minute, second =
date:match('^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$')
if not year then
if not year then
return nil; -- test time did not match the specified patterns
return nil
end
end
end
end
local t = {['year'] = tonumber(year), ['month'] = tonumber(month), ['day'] = tonumber(day), ['hour'] = tonumber(hour), ['min'] = tonumber(minute), ['sec'] = tonumber(second) or 0};
   
    if t.hour < 0 or t.hour > 23 or t.min < 0 or t.min > 59 or t.sec < 0 or t.sec > 59 then
        return nil; -- Invalid time values
    end
   
    if t.month < 1 or t.month > 12 then
        return nil; -- Invalid month
    end


    if t.day < 1 or t.day > get_days_in_month(t.year, t.month) then
local t = {
        return nil; -- Invalid day for the month
year = tonumber(year),
    end
month = tonumber(month),
    return t; -- Return the table with valid date and time
day = tonumber(day),
hour = tonumber(hour),
min = tonumber(minute),
sec = tonumber(second) or 0
}
 
if t.hour < 0 or t.hour > 23 or t.min < 0 or t.min > 59 or t.sec < 0 or t.sec > 59 then return nil end
if t.month < 1 or t.month > 12 then return nil end
if t.day < 1 or t.day > get_days_in_month(t.year, t.month) then return nil end
return t
end
end


local function get_utc_offset (utc_offset)
local function get_utc_offset (utc_offset)
 
local h, m, sign
local h, m, sep, sign;
 
local patterns = {
local patterns = {
'^([%+%-±−]?)(%d%d?%.%d%d?)$', -- one or two fractional hour digits
'^([%+%-±−]?)(%d%d?%.%d%d?)$',
'^([%+%-±−]?)(%d%d?):(%d%d)$', -- two minute digits
'^([%+%-±−]?)(%d%d?):(%d%d)$',
'^([%+%-±−]?)(%d%d?)[%.:]?$', -- hours only; ignore trailing separator
'^([%+%-±−]?)(%d%d?)[%.:]?$',
}
}
for _, pattern in ipairs(patterns) do
for _, pattern in ipairs(patterns) do -- loop through the patterns
sign, h, m = mw.ustring.match(utc_offset, pattern)
sign, h, m = mw.ustring.match (utc_offset, pattern);
if h then break end
if h then
break; -- if h is set then pattern matched
end
end
 
if not h then
return nil; -- did not match a pattern
end
end
 
if not h then return nil end
    if '-' == sign then sign = -1; else sign = 1; end
if sign == '-' then sign = -1 else sign = 1 end
h = tonumber(h)
h = tonumber(h)
m = tonumber(m) or 0;
m = tonumber(m) or 0
return sign * ((h * 3600) + (m * 60));
return sign * ((h * 3600) + (m * 60))
end
end


വരി 70: വരി 60:
local getArgs = require('Module:Arguments with aliases').getArgs
local getArgs = require('Module:Arguments with aliases').getArgs
local arg_aliases = {
local arg_aliases = {
        text = { 'text', 'title' },
text = { 'text', 'title' },
        date = { 'date', 'start' },
date = { 'date', 'start' },
        end_date = { 'end_date', 'end' },
end_date = { 'end_date', 'end' },
        details = { 'details', 'description' },
details = { 'details', 'description' },
        location = { 'location', 'venue' },
location = { 'location', 'venue' },
        url_title = { 'url_title' },
url_title = { 'url_title' },
        timezone = { 'timezone', 'tz' }
timezone = { 'timezone', 'tz' }
    }
}
   
local args = getArgs(frame, { aliases = arg_aliases })
    local args = getArgs(frame, {
 
        aliases = arg_aliases,
    })
   
    local date_txt = ''
local tz_offest = (args.timezone and get_utc_offset(args.timezone)) or 0
local tz_offest = (args.timezone and get_utc_offset(args.timezone)) or 0
local date_t = args.date and get_date(args.date) or nil
    local date_t = args.date and get_date(args.date) or nil
local end_date_t = args.end_date and get_date(args.end_date) or nil
    local end_date_t = args.end_date and get_date(args.end_date) or nil
 
   
if not date_t then
   
return error('Invalid date format. Please use YYYY-MM-DDThh:mm:ss or YYYYMMDDhhmmss.')
    if not date_t then
end
        return error('Invalid date format. Please use YYYY-MM-DDThh:mm:ss or YYYYMMDDhhmmss.');
 
    end
local date_u = os.time(date_t) + tz_offest
   
local end_date_u = date_u
    local date_u = os.time(date_t) + tz_offest
if end_date_t then
    local end_date_u = date_u
end_date_u = os.time(end_date_t) + tz_offest
if end_date_u < date_u then
return error('End date cannot be before start date.')
end
end
 
local date_txt = os.date('%Y%m%dT%H%M%SZ', date_u) .. '/' .. os.date('%Y%m%dT%H%M%SZ', end_date_u)
 
-- Google Calendar
local google_link = '[https://calendar.google.com/calendar/render?action=TEMPLATE' ..
'&text=' .. mw.uri.encode(args.text or '') ..
'&dates=' .. date_txt ..
'&details=' .. mw.uri.encode(args.details or '') ..
'&location=' .. mw.uri.encode(args.location or '') ..
' Google]'


    if end_date_t then
-- Outlook.com / Office 365
        end_date_u = os.time(end_date_t) + tz_offest
local outlook_link = '[https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose' ..
        if end_date_u < date_u then
'&rru=addevent' ..
            return error('End date cannot be before start date.');
'&subject=' .. mw.uri.encode(args.text or '') ..
        end
'&startdt=' .. os.date('!%Y-%m-%dT%H:%M:%SZ', date_u) ..
    end
'&enddt=' .. os.date('!%Y-%m-%dT%H:%M:%SZ', end_date_u) ..
    date_txt = os.date('%Y%m%dT%H%M%SZ', date_u) .. '/' .. os.date('%Y%m%dT%H%M%SZ', end_date_u);
'&body=' .. mw.uri.encode(args.details or '') ..
'&location=' .. mw.uri.encode(args.location or '') ..
' Outlook]'


-- Yahoo Calendar
local yahoo_link = '[https://calendar.yahoo.com/?v=60' ..
'&TITLE=' .. mw.uri.encode(args.text or '') ..
'&ST=' .. os.date('!%Y%m%dT%H%M%SZ', date_u) ..
'&ET=' .. os.date('!%Y%m%dT%H%M%SZ', end_date_u) ..
'&DESC=' .. mw.uri.encode(args.details or '') ..
'&in_loc=' .. mw.uri.encode(args.location or '') ..
' Yahoo]'


    return '<span class="add-to-calendar">' ..
return '<span class="add-to-calendar">' ..
        '[https://calendar.google.com/calendar/render?action=TEMPLATE' ..
google_link .. ' ' ..
        '&text=' .. mw.uri.encode(args.text or '') ..
outlook_link .. ' ' ..
        '&dates=' .. date_txt ..
yahoo_link ..
        '&details=' .. mw.uri.encode(args.details or '') ..
'</span>'
        '&location=' .. mw.uri.encode(args.location or '') ..
        -- '&ctz=' .. mw.uri.encode(args.timezone or 'UTC') ..
        ' ' .. (args.url_title or 'Add to calendar') .. ']' ..
        '</span>';
end
end


return {
return { main = main }
main = main
}

21:19, 14 ഓഗസ്റ്റ് 2025-നു നിലവിലുള്ള രൂപം

ഈ ഘടകത്തിന്റെ വിവരണം ഘടകം:Add to Calendar/വിവരണം എന്ന താളിൽ നിർമ്മിക്കാവുന്നതാണ്

local function get_days_in_month (year, month)
	local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	year = tonumber(year)
	month = tonumber(month)

	if (month == 2) then
		if (year % 4 == 0 and (year % 100 ~= 0 or year % 400 == 0)) then
			return 29
		end
	end
	return days_in_month[month]
end

local function get_date (date)
	local year, month, day, hour, minute, second =
		date:match('(%d%d%d%d)%-(%d%d?)%-(%d%d?)T(%d%d?):(%d%d?):(%d%d?)')

	if not year then
		year, month, day, hour, minute, second =
			date:match('^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$')
		if not year then
			return nil
		end
	end

	local t = {
		year = tonumber(year),
		month = tonumber(month),
		day = tonumber(day),
		hour = tonumber(hour),
		min = tonumber(minute),
		sec = tonumber(second) or 0
	}

	if t.hour < 0 or t.hour > 23 or t.min < 0 or t.min > 59 or t.sec < 0 or t.sec > 59 then return nil end
	if t.month < 1 or t.month > 12 then return nil end
	if t.day < 1 or t.day > get_days_in_month(t.year, t.month) then return nil end
	return t
end

local function get_utc_offset (utc_offset)
	local h, m, sign
	local patterns = {
		'^([%+%-±−]?)(%d%d?%.%d%d?)$',
		'^([%+%-±−]?)(%d%d?):(%d%d)$',
		'^([%+%-±−]?)(%d%d?)[%.:]?$',
	}
	for _, pattern in ipairs(patterns) do
		sign, h, m = mw.ustring.match(utc_offset, pattern)
		if h then break end
	end
	if not h then return nil end
	if sign == '-' then sign = -1 else sign = 1 end
	h = tonumber(h)
	m = tonumber(m) or 0
	return sign * ((h * 3600) + (m * 60))
end

local function main(frame)
	local getArgs = require('Module:Arguments with aliases').getArgs
	local arg_aliases = {
		text = { 'text', 'title' },
		date = { 'date', 'start' },
		end_date = { 'end_date', 'end' },
		details = { 'details', 'description' },
		location = { 'location', 'venue' },
		url_title = { 'url_title' },
		timezone = { 'timezone', 'tz' }
	}
	local args = getArgs(frame, { aliases = arg_aliases })

	local tz_offest = (args.timezone and get_utc_offset(args.timezone)) or 0
	local date_t = args.date and get_date(args.date) or nil
	local end_date_t = args.end_date and get_date(args.end_date) or nil

	if not date_t then
		return error('Invalid date format. Please use YYYY-MM-DDThh:mm:ss or YYYYMMDDhhmmss.')
	end

	local date_u = os.time(date_t) + tz_offest
	local end_date_u = date_u
	if end_date_t then
		end_date_u = os.time(end_date_t) + tz_offest
		if end_date_u < date_u then
			return error('End date cannot be before start date.')
		end
	end

	local date_txt = os.date('%Y%m%dT%H%M%SZ', date_u) .. '/' .. os.date('%Y%m%dT%H%M%SZ', end_date_u)

	-- Google Calendar
	local google_link = '[https://calendar.google.com/calendar/render?action=TEMPLATE' ..
		'&text=' .. mw.uri.encode(args.text or '') ..
		'&dates=' .. date_txt ..
		'&details=' .. mw.uri.encode(args.details or '') ..
		'&location=' .. mw.uri.encode(args.location or '') ..
		' Google]'

	-- Outlook.com / Office 365
	local outlook_link = '[https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose' ..
		'&rru=addevent' ..
		'&subject=' .. mw.uri.encode(args.text or '') ..
		'&startdt=' .. os.date('!%Y-%m-%dT%H:%M:%SZ', date_u) ..
		'&enddt=' .. os.date('!%Y-%m-%dT%H:%M:%SZ', end_date_u) ..
		'&body=' .. mw.uri.encode(args.details or '') ..
		'&location=' .. mw.uri.encode(args.location or '') ..
		' Outlook]'

	-- Yahoo Calendar
	local yahoo_link = '[https://calendar.yahoo.com/?v=60' ..
		'&TITLE=' .. mw.uri.encode(args.text or '') ..
		'&ST=' .. os.date('!%Y%m%dT%H%M%SZ', date_u) ..
		'&ET=' .. os.date('!%Y%m%dT%H%M%SZ', end_date_u) ..
		'&DESC=' .. mw.uri.encode(args.details or '') ..
		'&in_loc=' .. mw.uri.encode(args.location or '') ..
		' Yahoo]'

	return '<span class="add-to-calendar">' ..
		google_link .. ' • ' ..
		outlook_link .. ' • ' ..
		yahoo_link ..
		'</span>'
end

return { main = main }
"https://schoolwiki.in/index.php?title=ഘടകം:Add_to_Calendar&oldid=2805351" എന്ന താളിൽനിന്ന് ശേഖരിച്ചത്