#!/bin/sh
# vim: filetype=perl
################################################################################
# ausgabe eines taschenkalenders mit feier- und geburtstagen
# (c) dr. ingo rohlfs, 1993-2004, www.dr-rohlfs.de
# Lizenz: BSD
#
# aufruf: $0 [jahr [helligkeit der grauwerte] ]
#
# benoetigte Module
# Date::Calc		(FreeBSD: devel/p5-Date-Calc)
# Date::Holidays::DE	(bsdpan-Date-Holidays-DE-0.6)
################################################################################

# zuerst shell-glue:
perl -wx "$0" "$@" > kalender.tex
latex kalender
dvips -o  kalender.ps kalender.dvi
rm -f kalender.log kalender.aux kalender.dvi kalender.tex
exit
################################################################################
# in einer optionalen datei 'termine.txt' koennen geburtstage angegeben werden
# format kompatibel zu gcal:
# 
# geburtstag von rautgunde am 31.1.:
################################################################################
00000131	rautgunde

#!perl
### jetzt kommt der perl-code ###
use strict;
use warnings;
my $jahr = $ARGV[0] || 2004;		# welches jahr
my $helligkeit = $ARGV[1] || 0.8;	# grautoenung der feiertage

use Date::Calc qw(:all);
################################################################################
# ausgabe der daten eines tages
sub tag_ausgabe {
################################################################################
  my %feiertag = %{$_[0]};		# referenz auf feiertag-hash
  my %termin = %{$_[1]};
  my @datum = @_[2..4];			# jahr, monat, tag

  $datum[$_] = sprintf "%02d", $datum[$_] for 1..2;
  my $datum = join '-', @datum;		# hash-key feiertag
  my $dow = Day_of_Week(@datum);	# wochentag
  ### jetzt die tageszeilen ausgeben ###
  print 				# gegen print interpr. as a funktion
    $feiertag{$datum}|| 6 == $dow || 7 == $dow ?
      "\\rowcolor[gray]{$helligkeit}" :	# feiertagsgrau
      " " x 20,				# platzhalter
    $datum[2], " ", 			# tagesnummer im monat
    substr (Day_of_Week_Abbreviation ($dow), 0, 2),
    '\quad\textsf{\scriptsize ',
      $termin{$datum} || '', 		# leer wenn nicht definiert
    '}& ', 				# mittlere tabellenspalte 
    # sommerzeit anfang/ende
    $datum[2] > 24 && 7 == $dow && (3 == $datum[1] || 10 == $datum[1]) ?
      '\textbf{Sommerzeit}' : "",
    '\quad ',
    $feiertag{$datum} || '', 		# leer wenn nicht definiert
    1 == $dow ? " & ". Week_Number(@datum) : " &   ",	# wochenummer
    "     \\\\\\hline\n";
}


################################################################################
# geburtstagstermine einlesen
################################################################################
my %termin;
if (open inF, "<termine.txt") {
  while (<inF>) {
    next unless /^0/;			# kommentare entfernen
    my ($monat, $tag, $wer) = /^....(..)(..)\s+(.*?)\s*$/;
    my $datum = join '-', $jahr, $monat, $tag;	# zur verwendung beim debuggen
    $termin{$datum} = $wer;		# hash mit den terminen fuellen
  }
}
else {
  warn "termine.txt: $!\n";
}

################################################################################
# latex-kopf ausgeben
################################################################################
print << 'EOF';
\documentclass[a4paper,twocolumn]{article}
%\usepackage{times}
\usepackage[latin1]{inputenc}
\usepackage{array,german,t1enc,color,colortbl,vmargin}
\pagestyle{empty}

\setpapersize{A4}
\setmarginsrb{9mm}{15mm}{7mm}{15mm}{0mm}{0mm}{0mm}{0mm}
\setlength{\columnsep}{4.5mm}
\setlength{\tabcolsep}{0.8ex}
\setlength{\parindent}{0pt}
\setlength{\fboxsep}{0pt}%
\begin{document}\hbadness=10000 \vbadness=10000
EOF

# Assign full names to the internal aliases from Date::Holidays::DE
# See the manpage for a list of all aliases.
use Date::Holidays::DE qw(holidays);
my %feiertagsnamen = (
                'neuj' => 'Neujahr',
                'hl3k' => 'Hl. 3 Könige',
                'romo' => 'Rosenmontag',
                'fadi' => 'Faschingsdienstag',
                'karf' => 'Karfreitag',
                'osts' => 'Ostern',
                'ostm' => 'Ostern',
                'pfis' => 'Pfingsten',
                'pfim' => 'Pfingsten',
                'himm' => 'Himmelfahrt',
                'fron' => 'Fronleichnam',
                '1mai' => 'Maifeiertag',
                'mari' => 'Mariä Himmelfahrt',
                #'3okt' => 'Tag der deutschen Einheit',
                '3okt' => 'Einheitstag',	# so passt es besser rein
                'refo' => 'Reformationstag',
                'alhe' => 'Allerheiligen',
                'buss' => 'Buß- und Bettag',
                'heil' => 'Heiligabend',
                'wei1' => '1. Weihnachtstag',
                'wei2' => '2. Weihnachtstag',
                'silv' => 'Silvester'
);

# Get the list of holidays for $jahr
my %feiertag;
for (@{holidays( WHERE  => ['common', 'bw'],
                            FORMAT => "%#:%Y-%m-%d",
                            YEAR   => $jahr
)}) {
  # Split name and date
  my ($name, $datum) = split /:/;
  $feiertag{$datum} = $feiertagsnamen{$name};
}

################################################################################
### jetzt alle monate und tage durchgehen
################################################################################
Language(Decode_Language("Deutsch"));   # deutsch for Date::Calc

for my $monat (1..12) {			# januar bis dezember
  ## monatskopf ausgeben
  my $titel = '\multicolumn{3}{c}{\textbf{\textsc{'.
    Month_to_Text($monat) . "}\\quad $jahr}}\\\\\n";
  print 
    "\\begin{tabular}",
    "{|>{\\tt}p{41mm}>{\\hfill\\scriptsize}p{41mm}",
    ">{\\hfill\\scriptsize}p{4mm}|}\n",
    $titel, "\\hline\n";
  for my $tag (0..Days_in_Month($jahr, $monat)-1) {
    my @datum = Add_Delta_Days($jahr, $monat, 1, $tag);
    ## jeden tag eine ausgabezeile
    tag_ausgabe(\%feiertag, \%termin, @datum);	# eintrag fuer jeden tag berechnen
  }
  ## monatsabschluss ausgeben
  print $titel, "\\end{tabular} ",	# mbox gegen verschlucktes leer
}
## latex-abschluss ausgeben
print "\\end{document}";
