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