an annual calendar somewhere?
zryip theSlug
zryip.theslug at gmail.com
Fri Feb 26 19:12:15 EST 2010
2010/2/26 Richard Gaskin <ambassador at fourthworld.com>:
> FWIW, here's a a function I pulled out of my archives which is a sort of
> variant of Cal in native RevTalk, making a single month from a date passed
> to it. I'll leave it as an exercise to the user to make a year out of it if
> needed.
>
> One of the nice things about RevTalk is that the weekDayNames and monthNames
> functions return values in the current system's local language, so this is
> localized without having to do anything.
I confess that I have missed these two valuables functions.
> Interestingly, without the overhead involved in going to shell it's about 20
> times faster on my machine than calling shell("cal").
It's instant on my machine. So with your script I could back in time? 8-)
However as far I have understood it seems that the property
useSystemDate set to true is necessary to obtain values according with
the local language.
Plus, a second difficulty exists: the week don't starts necessary a
Sunday but a Monday.
So I try to improve the Richard's solution like this:
function Cal pDate, pFirstDayWeek
set useSystemDate to true
-- Returns a plain-text calendar representation of
-- the month the date specified in pDate is in.
-- If no month is provided it uses the current
-- month. Month and day names use the user's current
-- system settings.
--
-- Use current date as default:
if pDate is empty then put the date into pDate
if pFirstDayWeek is empty then put "Sunday" into pFirstDayWeek
-- Verify date is valid:
convert pDate to dateitems
if the result is not empty then return "Error: "& the result
--
put empty into tCal
--
-- Make month/year header:
put item 1 of pDate into tYear
put item 2 of pDate into tMonthNumber
put line (tMonthNumber) of the monthNames into tMonth
put tMonth && tYear into tHeader
-- Center it:
repeat for ( (20 - len(tHeader)) div 2)
put " " after tCal
end repeat
put tHeader &cr after tCal
--
-- Make day names header:
put weekdayNamesList(pFirstDayWeek) into tWeekdayNames
repeat for each line tDay in tWeekdayNames
put char 1 to 2 of tDay &" " after tCal
end repeat
put cr after tCal
--
-- Pad beginning with empty days:
put createDate(tYear,tMonthNumber,1) into tStartDay -- create a
date in the system's local language
convert tStartDay to dateitems
if (pFirstDayWeek is "Monday") then
repeat for (last item of tStartDay - 2)
put " " after tCal
end repeat
else
repeat for (last item of tStartDay - 1)
put " " after tCal
end repeat
end if
put createDate(tYear,tMonthNumber,1) into tStartDay -- create a
date in the system's local language
-- Walk through 31 days, stopping when we reach a
-- number not valid for the month we're doing:
repeat with i = 1 to dayOf(addToDate(tStartDay,0,1,-1))
-- the end value is the number of days in the month. To
obtain the last date of a month, add 1 month and subtract one
-- day to the first day of a month
-- Get day number:
put createDate(tYear,tMonthNumber,i) into tDate
convert tDate to dateitems
if the result is not empty then exit repeat
put item 3 of tDate into tDayNum
--
-- Pad it and add it:
if len(i) = 1 then put " " before i
put i &" " after tCal
--
-- Go to next line if we're at the end of the week:
if last item of tDate = lastDayOfWeek(pFirstDayWeek) then put cr
after tCal
end repeat
--
-- Pad empty lines at end for uniform appearance
-- when using multiple calendars in a field:
repeat for (8-the number of lines of tCal)
put cr after tCal
end repeat
--
-- Send it to the caller:
return tCal
end Cal
function weekdayNamesList pFirstDay
set useSystemDate to true
put the abbr weekdayNames into tWeekdayNames
if pFirstDay is "Monday" then
put cr&first line of tWeekdayNames after tWeekdayNames
delete first line of tWeekdayNames
end if
return tWeekdayNames
end weekdayNamesList
function lastDayOfWeek pFirstDay
if pFirstDay is "Monday" then
return 1
else
return 7
end if
end lastDayOfWeek
function firstDayInMonth pStartDate
-- Return the first day in a month
set useSystemDate to true
convert pStartDate to dateitems
put 1 into item 3 of pStartDate
convert pStartDate to short date
return pStartDate
end firstDayInMonth
function createDate pTheYear,pTheMonth,pTheDay
local tDateItems
set useSystemDate to true
put pTheYear,pTheMonth,pTheDay,0,0,0,0 into tDateItems
convert tDateItems from dateItems to short date
return tDateItems
end createDate
function addToDate pStartDate,pAddToYear,pAddToMonth,pAddToDay
-- Allows you to manipulate a date in a single pass
set useSystemDate to true
convert pStartDate to dateitems
add pAddToYear to item 1 of pStartDate
add pAddToMonth to item 2 of pStartDate
add pAddToDay to item 3 of pStartDate
convert pStartDate to short date
return pStartDate
end addToDate
function dayOf pStartDate
set useSystemDate to true
convert pStartDate to dateitems
return item 3 of pStartDate
end dayOf
If some members of the list could validate this script in their own
language? 8-)
-> If your weeks starts a Monday call the function like this:
set useSystemDate to true
put cal(the date,"Monday") into fld "myField"
-> If your weeks starts a Sunday simply use:
set useSystemDate to true
put cal() into fld "myField"
Regards,
--
-Zryip TheSlug- wish you the best! 8)
http://www.aslugontheroad.co.cc
More information about the use-livecode
mailing list