-- -- Adds holidays to Rainlendar. They events are not stored permanently -- so they are added every time Rainlendar is refreshed. -- function WeekHolidays_CreateHolidays() WeekHolidays_CreateWeekEvent(42, 10) end function WeekHolidays_CreateWeekEvent(weekNumber, count) year = tonumber(os.date("%Y")) for i = 1,count do WeekHolidays_CreateWeekEventFromYear(weekNumber, year) year = year + 1 end end function WeekHolidays_CreateWeekEventFromYear(weekNumber, year) date = WeekHolidays_CalculateFirstDayOfWeekN(weekNumber, year) strEvent = "BEGIN:VEVENT\n" strEvent = strEvent .. "UID:Week" .. weekNumber .. "-Year" .. year .. "\n" strEvent = strEvent .. "SUMMARY:Week " .. weekNumber .. " of Year " .. year .. "\n" strEvent = strEvent .. "DTSTART;VALUE=DATE:" .. string.format("%04i%02i%02i", date[1], date[2], date[3]) .. "\n" strEvent = strEvent .. "DTEND;VALUE=DATE:" .. string.format("%04i%02i%02i", date[1], date[2], date[3] + 7) .. "\n" strEvent = strEvent .. "CATEGORIES:Holidays\n" strEvent = strEvent .. "END:VEVENT" Rainlendar_CreateComponent(strEvent) end -- -- Calculates the first days of the week WW -- function WeekHolidays_CalculateFirstDayOfWeekN(weekNumber, year) weekday7 = tonumber(os.date("%w", os.time{year=year, month=1, day=7})) if (weekday7 > 3) then firstThursday = 11 - weekday7 else firstThursday = 4 - weekday7 end firstDayOfWeekN = firstThursday + (weekNumber - 1) * 7 - 3 date = WeekHolidays_ConvertDOYToDate(firstDayOfWeekN, year) return {year, date[1], date[2]} end function WeekHolidays_ConvertDOYToDate(day, year) MonthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} MonthDaysL = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} month = 1 if WeekHolidays_IsLeapYear(year) then while (day > MonthDaysL[month]) do day = day - MonthDaysL[month] month = month + 1 end else while (day > MonthDays[month]) do day = day - MonthDays[month] month = month + 1 end end return {month, day} end function WeekHolidays_IsLeapYear(year) if (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0) then return true else return false end end -- -- This gets executed when the script is read (i.e. on every refresh) -- WeekHolidays_CreateHolidays()