calendar
Закрепим наше знакомство с text функциями.
Пример 1
Создать календарь в виде HTML файла на указанный пользователем год.Вещь полезная, так что приступим. Главную функцию возьмем из предыдущего примера и сделаем небольшие изменения, а именно запросим год на который создавать календарь.
congetstr( "Enter a year: ", year )
out @ calendar( uint( year ))
out.write( "calendar.htm" )
shell( "calendar.htm" )
В text функции calendar описываем переменную типа datetime и устанавливаем ей дату 1 января указанного года. Далее выводим заголовок HTML файла и приступаем к формированию календаря.
text calendar( uint year )
\{ datetime stime
stime.setdate( 1, 1, year )
}<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Calendar for year \(stime.year)</TITLE>
<STYLE TYPE="text/css">
<!--
BODY {background: #FFF; font-family: Verdana;}
H1 {text-align: center; margin: 5px;}
TABLE {border: 0; border-spacing: 7px;}
TD {padding: 3px; border: 1px solid; text-align: center;}
#copy {font-size: smaller; text-align: center;}
-->
</STYLE>
</HEAD>
<BODY><H1>\(stime.year)</H1>
<TABLE ALIGN=CENTER>
Календарь разделим на три столбца и четыре строки. Переменная firstday будет хранить номер первого дня недели для текущего пользователя. dayofweek будет содержать номер дня недели для текущей даты. Названия месяцев на языке пользователя получим с помощью функции nameofmonth.
firstday = firstdayofweek()
dayofweek = stime.dayofweek
fornum i = 0, 4
{
@"\l<TR>"
fornum j = 1, 4
{
month = i * 3 + j
@"\l<TD>\(nameofmonth( stemp, month ))
<PRE>"
...
}
}
Для получения сокращенных названий дней недели воспользуемся функцией abbrnameofday. Так как для календаря используем вывод с одинаковой шириной всех символов, то нам необходимо добавлять недостающие пробелы. На каждый день отведем ширину в четыре символа.
fornum k = firstday, firstday + 7
{
@" \( abbrnameofday( stemp, k ).setlen( 2 ))"
}
@" \l"
@" ".repeat( ( 7 + dayofweek - firstday ) % 7 )
При выводе дней месяца выделяем красным воскресные дни - это когда dayofweek равен 0. Также следим за переносом строки после вывода последнего дня недели и в переменной lines сохраняем количество выведенных строк.
uint day = 1
uint lines
while day <= daysinmonth( year, month )
{
if !dayofweek : @"<FONT COLOR=red>"
@str( day++ ).fillspacel( 4 )
if !dayofweek : @"</FONT>"
dayofweek = ( dayofweek + 1 ) % 7
if dayofweek == firstday
{
@" \l"
lines++
}
}
В заключении последнюю строку дополняем пробелами и выводим недостающие строки для того, чтобы все месяцы у нас имели одинаковую высоту.
@" ".repeat( ( 7 + firstday - dayofweek ) % 7 )
while lines++ < 7 : @" \l"
@"</PRE>"
Пример вышел немного трудноватым для понимания из-за большого количества текста на языке HTML и дополнительного форматирования. С другой стороны, результат программы получился вполне приемлемый.