Article View: comp.lang.postscript
Article #8408Pscal
From: Stephen Mann
Date: Fri, 12 May 1989 03:02
Date: Fri, 12 May 1989 03:02
371 lines
8008 bytes
8008 bytes
Here's a version of Pscal that has holidays hacked in. The program
is a Unix C-shell script that sends PostScript directly to a printer.
Documentation appears in the header comments of the script.
Steve
--------
#!/bin/csh -f
#+
#
# NAME:
# pscal
#
# SYNOPSIS:
# pscal [-Pprinter] [other printer flags] month year
#
# DESCRIPTION:
# `Pscal' is a PostScript program to print calendars.
#
# The file $home/.holiday is read and used to print short messages
# on specified days. The .holiday file should consist of lines of
# the form
# month:day:message string
# Messages should be 20 characters or less, with no more than 4
# messages per day. No spaces should appear from the beginning
# of a line until after the second colon.
# Month and day should be numbers in the obvious ranges.
#
# OPTIONS:
# Any argument whose first character is '-' is passed on to lpr.
#
# AUTHOR:
# Patrick Wood
# Copyright (C) 1987 by Pipeline Associates, Inc.
# Permission is granted to modify and distribute this free of charge.
#
# HISTORY:
# @Original From: patwood@unirot.UUCP (Patrick Wood)
# @Shell stuff added 3/9/87 by King Ables
# @Made pretty by tjt 1988
# @Holiday and printer flag passing hacks added Dec 1988
# @ by smann@june.cs.washington.edu
#
# BUGS:
# `Pscal' doesn't work for months before 1753 (weird stuff happened
# in September, 1752).
#
# A better format for the dates of holidays would be nice.
# An escape to allow holiday messages to be raw PostScript would
# also be nice.
# The holiday messages should be handled more intelligently (ie,
# the messages should be clipped to the day).
#
set printer="-Pps" # set default printer
set flags
top:
if ($#argv > 0) then
switch ("$argv[1]")
case -P*:
set printer="$argv[1]"
shift argv
goto top
case -*:
set flags = ($flags $argv[1])
shift argv
goto top
case *:
if ($?month) then
set year="$argv[1]"
else if ($?year) then
echo "usage: $0 [-Pprinter] month year"
exit 1
else
set month="$argv[1]"
endif
shift argv
goto top
endsw
endif
if ($?year) then
else
echo "usage: $0 [-Pprinter] [-flag1 -flag2 ...] month year"
exit 1
endif
if ( -e $home/.holiday ) then
set noglob
set holidays = \
( \[ `grep ^$month\: $home/.holiday | awk -F: '{print $2,"(",$3,")" }'` ] )
else
set noglob
set holidays = (\[ ] )
endif
lpr $printer $flags <<END-OF-CALENDAR
%!
% PostScript program to draw calendar
% Copyright (C) 1987 by Pipeline Associates, Inc.
% Permission is granted to modify and distribute this free of charge.
% /month should be set to a number from 1 to 12
% /year should be set to the year you want
% you can change the title and date fonts, if you want
% we figure out the rest
% won't produce valid calendars before 1800 (weird stuff happened
% in September of 1752)
/month $month def
/year $year def
/titlefont /Times-Bold def
/dayfont /Helvetica-Bold def
/eventfont /Times-Roman def
/holidays $holidays def
/month_names [ (January) (February) (March) (April) (May) (June) (July)
(August) (September) (October) (November) (December) ] def
/prtnum { 3 string cvs show} def
/drawgrid { % draw calendar boxes
dayfont findfont 10 scalefont setfont
0 1 6 {
dup dup 100 mul 40 moveto
[ (Sunday) (Monday) (Tuesday) (Wednesday) (Thursday) (Friday) (Saturday) ] exch get
100 center
100 mul 35 moveto
1.0 setlinewidth
0 1 5 {
gsave
100 0 rlineto
0 -80 rlineto
-100 0 rlineto
closepath stroke
grestore
0 -80 rmoveto
} for
} for
} def
/drawnums { % place day numbers on calendar
dayfont findfont 30 scalefont setfont
/start startday def
/days ndays def
start 100 mul 5 add 10 rmoveto
1 1 days {
/day exch def
gsave
day start add 7 mod 0 eq
{
submonth 0 eq
{
.8 setgray
} if
} if
day start add 7 mod 1 eq
{
submonth 0 eq
{
.8 setgray
} if
} if
day prtnum
grestore
day start add 7 mod 0 eq
{
currentpoint exch pop 80 sub 5 exch moveto
}
{
100 0 rmoveto
} ifelse
} for
} def
/drawfill { % place fill squares on calendar
/start startday def
/days ndays def
0 35 rmoveto
1.0 setlinewidth
0 1 start 1 sub {
gsave
.9 setgray
100 0 rlineto
0 -80 rlineto
-100 0 rlineto
closepath fill
grestore
100 0 rmoveto
} for
submonth 1 eq
{
/lastday 42 def
600 -365 moveto
}
{
/lastday 40 def
400 -365 moveto
} ifelse
lastday -1 ndays start 1 add add
{
/day exch def
gsave
.9 setgray
100 0 rlineto
0 -80 rlineto
-100 0 rlineto
closepath fill
grestore
day 7 mod 1 eq
{
600 -365 80 add moveto
}
{
-100 0 rmoveto
} ifelse
} for
} def
/isleap { % is this a leap year?
year 4 mod 0 eq % multiple of 4
year 100 mod 0 ne % not century
year 1000 mod 0 eq or and % unless it's a millenia
} def
/days_month [ 31 28 31 30 31 30 31 31 30 31 30 31 ] def
/ndays { % number of days in this month
days_month month 1 sub get
month 2 eq % Feb
isleap and
{
1 add
} if
} def
/startday { % starting day-of-week for this month
/off year 2000 sub def % offset from start of "epoch"
off
off 4 idiv add % number of leap years
off 100 idiv sub % number of centuries
off 1000 idiv add % number of millenia
6 add 7 mod 7 add % offset from Jan 1 2000
/off exch def
1 1 month 1 sub {
/idx exch def
days_month idx 1 sub get
idx 2 eq
isleap and
{
1 add
} if
/off exch off add def
} for
off 7 mod % 0--Sunday, 1--monday, etc.
} def
/prtevent { % event-string day prtevent
% print out an event
/day 2 1 roll def
day start add 1 sub 7 mod 100 mul
day start add 1 sub 7 div truncate -80 mul
-5
numevents day start add get -10 mul add
numevents
day start add
numevents day start add get 1 add
put
add moveto
show
} def
/drawevents { % read in a file full of events; print
% the events for this month
/numevents
[0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0] def
eventfont findfont 9 scalefont setfont
0 2 holidays length 2 sub {
dup
1 add holidays 2 1 roll get
2 1 roll holidays 2 1 roll get
prtevent
} for
} def
/center { % center string in given width
/width exch def
/str exch def width str
stringwidth pop sub 2 div 0 rmoveto str show
} def
/calendar
{
titlefont findfont 48 scalefont setfont
0 60 moveto
/month_name month_names month 1 sub get def
month_name show
/yearstring year 10 string cvs def
700 yearstring stringwidth pop sub 60 moveto
yearstring show
0 0 moveto
drawnums
0 0 moveto
drawfill
eventflag {
0 0 moveto
drawevents
} if
0 0 moveto
drawgrid
} def
/eventflag true def
90 rotate
50 -120 translate
/submonth 0 def
calendar
/eventflag false def
month 1 sub 0 eq
{
/lmonth 12 def
/lyear year 1 sub def
}
{
/lmonth month 1 sub def
/lyear year def
} ifelse
month 1 add 13 eq
{
/nmonth 1 def
/nyear year 1 add def
}
{
/nmonth month 1 add def
/nyear year def
} ifelse
/submonth 1 def
/year lyear def
/month lmonth def
500 -365 translate
gsave
.138 .138 scale
10 -120 translate
calendar
grestore
/submonth 1 def
/year nyear def
/month nmonth def
100 0 translate
gsave
.138 .138 scale
10 -120 translate
calendar
grestore
showpage
END-OF-CALENDAR
Technical Details
Message-ID:
<8193@june.cs.washington.edu>Path:
arc1-ca.pugleaf.net!utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!cornell!uw-beaver!uw-june!smannShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!cornell!uw-beaver!uw-june!smann From: smann@june.cs.washington.edu (Stephen Mann) Newsgroups: comp.lang.postscript Subject: Pscal Keywords: holidays Message-ID: <8193@june.cs.washington.edu> Date: 12 May 89 03:02:10 GMT Distribution: na Organization: U of Washington, Computer Science, Seattle Lines: 371