diff --git a/fon/fon.pl b/fon/fon.pl index 2931cf3..68322a3 100755 --- a/fon/fon.pl +++ b/fon/fon.pl @@ -4,9 +4,14 @@ use MIME::Base64; use Encode; use utf8; +use Getopt::Long; +use POSIX qw(strftime); +use File::Temp qw(tempdir); binmode( STDOUT, ":utf8" ); +our %options; + my %multichar; my %escapechar; @@ -16,6 +21,8 @@ my %O; my %M; +GetOptions( 'pdf=s' => \$options{pdf}, ) or die; + my $SRCH = shift || '.'; get_ldap_addressbook( \%L ); @@ -26,21 +33,25 @@ } } -my @order = ( 'name', 'room', 'fone', 'mail' ); +if ( $options{pdf} ) { + phonebook_pdf( $options{pdf} ); +} +else { + my @order = ( 'name', 'room', 'fone', 'mail' ); -exit unless exists( $O{name} ); + exit unless exists( $O{name} ); -my $e = scalar( @{ $O{name} } ) - 1; + my $e = scalar( @{ $O{name} } ) - 1; -for my $i ( 0 .. $e ) { + for my $i ( 0 .. $e ) { - for my $k (@order) { - printf "%-*s ", $O{ $k . '_l' }, $O{$k}[$i]; - } - printf "\n"; + for my $k (@order) { + printf "%-*s ", $O{ $k . '_l' }, $O{$k}[$i]; + } + printf "\n"; + } } - exit; sub match_entry { @@ -73,6 +84,8 @@ sub push_entry { push @{ $O{name} }, $t; $l > ( $O{name_l} || 0 ) and $O{name_l} = $l; + push @{ $O{abk} }, substr( $e->{sn}[0], 0, 1 ) . " " . substr( $e->{givenName}[0], 0, 1 ); + $t = join( '/', map { s/\(.*?\)|Betriebsarztraum|\s+//g; $_ } @{ $e->{roomNumber} } ); $l = len($t); push @{ $O{room} }, $t; @@ -90,9 +103,9 @@ sub push_entry { } sub exec_ldapsearch { - my (@args) = @_; # eg 'ldapsearch' + my (@args) = @_; # eg 'ldapsearch' my $command = '/package/ldap/openldap/bin/ldapsearch'; - my @ARGS = ( '-x', '-H', 'ldap://ldap.molgen.mpg.de/', '-ZZ', '-o', 'ldif-wrap=no' ); + my @ARGS = ( '-x', '-H', 'ldap://ldap.molgen.mpg.de/', '-ZZ', '-o', 'ldif-wrap=no' ); exec $command, @ARGS, @args; die "exec failed: $!\n"; } @@ -107,7 +120,7 @@ sub get_ldap_addressbook { my $pid = open P, '-|'; defined $pid or die "$!\n"; - $pid or exec_ldapsearch( '-b', 'dc=addressbook,dc=apps,dc=molgen,dc=mpg,dc=de' ); + $pid or exec_ldapsearch( '-b', 'dc=addressbook,dc=apps,dc=molgen,dc=mpg,dc=de' ); binmode P, ':utf8'; while (
) { @@ -146,6 +159,94 @@ sub get_ldap_addressbook { return; } +sub stime { + my $fmt = shift; + my $time = shift; + return strftime( $fmt, localtime($time) ); +} + +sub texfoncut { + my $f = shift; + if ( $f eq 'n/a' ) { + return '---'; + } + if ( length($f) > 5 ) { + $f =~ s/(\d\d\d\d\d)(?=\d)/$1\\-/g; + $f =~ s{/}{ }g; + $f = '\scriptsize{' . $f . '}'; + } + return $f; +} + +sub phonebook_pdf { + + my $OUTFILE = shift; + + if ( -e $OUTFILE ) { + die "file already exists: $OUTFILE."; + } + + my $TEXTEMPLATE; + + while () { + $TEXTEMPLATE .= $_; + } + + # my $tmpdir = '/scratch/local/fon-1'; + # system('mkdir -v -p -m 700 '.$tmpdir); + + my $tmpdir = tempdir( '/scratch/local/fon-XXXXXXXX', CLEANUP => 1 ); + + my $texsrc = "$tmpdir/fon"; + + my @order = ( 'name', 'room', 'fone', 'mail' ); + + my $e = scalar( @{ $O{name} } ) - 1; + + my $row = ''; + + for my $i ( 0 .. $e ) { + next if ( $O{room}[$i] . $O{fone}[$i] eq '--' ); + $row .= $O{abk}[$i] . " & "; + my $pt = ''; + for my $k (@order) { + my $a = $O{$k}[$i]; + if ( $k eq 'mail' ) { + $a = '\verb|' . $a . '|'; + } + if ( $k eq 'fone' ) { + $a = texfoncut($a); + } + $row .= $pt . $a; + $pt = ' & '; + } + $row .= "\\\\\n"; + } + + my $TEX = $TEXTEMPLATE; + + my $TITLE = 'Telefonliste'; + $TEX =~ s/::TITLE::/$TITLE/g; + + my $today = stime( '%A', time() ); + $TEX =~ s/::TODAY::/$today/g; + + my $now = stime( '%d.%m.%Y %H:%M', time() ); + $TEX =~ s/::NOW::/$now/g; + + $TEX =~ s/::ROW::/$row/g; + + open T, '>', "$texsrc.tex" or die "cannot write $texsrc.tex:$!"; + + binmode( T, ":utf8" ); + print T $TEX; + close T; + system("cd $tmpdir && ( pdflatex $texsrc && pdflatex $texsrc )