Projekt: Hesla Jednoty bratrské/2010/los10pre.pl
los10pre.pl
#!/usr/bin/perl -w
# Version 09-01
# odkazy: druhý besonderstag už není neděle ale svátek
# vyhází na začátku {...} a prázdné řádky
# Užití:
# perl losung.pl -s los09-04.txt > los09-04.pre
#use Getopt::Long;
#my $result = GetOptions();
#print "result='$result'\n";
use Getopt::Std;
if ($main::opt_s) {}; # Jen abych se vyhnul warningu:
# Name "main::opt_s" used only once: possible typo
if (!getopts('s')) {
die "Chybné parametry příkazové řádky!\n".
"-s swap: přehodí písně, čtení atd. u nedělí a svátků na konec dne\n";
}
#if ($main::opt_s) { die "swap OK"};
$year = '2010';
@days = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$month = 0;
$day = 0; # day of month
$dow = 4; # day of week (sunday = 0, monday = 1, ...) = kterym_zacina_rok - 1; 1.1.2010 = pátek
$doy = 0; # day of year
$sonntag = 0; # poběží neděle
$inputline = '';
$linenumber = '0';
$besontail = ''; # odkazy v Besonderstagu
$if_besontail = 0; # jestli ten den je besontail
$style = ''; # styl pro danou řádku, vycucnutý z .odt souboru
$src_template = '(([1-5]\. )?[A-ZÄÖÜ][a-zäöüß]+ ([0-9abc.,;\-]+))';
#o: $src_template = ' (([1-5]\.)?[A-ZÄÖÜ][a-zäöüß]+ ([0-9abc.,;\-]+))';
@dny_tydny = qw(
Weltgebetswoche
Beginn
Weltgebetstag
Weltgebetswoche
Gebetstag
);
sub err {
my ($errormeldung) = @_;
printf "\n!!%d: %02d.%02d. %s!!\n>>>%s<<<\n", $linenumber, $day, $month, $errormeldung, $_;
die;
}
sub doy_dow { # Day of year and Day of week
$doy++;
$dow++;
$dow %= 7;
if(! $dow) { $sonntag = 1;}
my $d=0;
for (my $m=1; $m<$month; $m++) { $d += $days[$m]; }
$d += $day;
if($d != $doy) { err "ERR1: den v roce počítaný = $doy != dle data = $d";}
}
##### main #####
# Strategie:
# Každá subroutina:
# - vstupní řádku má v $imputline, ale může si číst i další pomocí &readline
# - zkouší, zda na ni dotyčný řádekl pasuje
# -- jestli ano: zapíše výstup, vrátí 1
# -- jestli ne: vrátí 0
while ( &readline ) {
if( &month ) { next; }
if( &date ) { next; }
if( &besonderstag ) { next; }
if( &tag ) { next; }
if( &pozn) { next; }
if( &week ) { next; }
print "?> $inputline";
# err ("ERR2: Co to je?");
}
##### subroutines #####
sub readline {
while (1) {
$linenumber++;
$_ = <>;
if(!$_) {die "KONEC!\n";}
s/^{(.*)}//; # vyhodí {styl} na začátku řádky, zatím je sice k ničemu, ale třeba se bude někdy na něco hodit
$style = $1;
if (!(/^$/)) { last;} # prázdné řádky přeskoč
}
$inputline = $_;
}
sub nextline { # zatim nepoužitá subroutina
if( ! &readline ) { return 0; }
if( &besonderstag ) { return 0; }
if( &month ) { return 0; }
if( &date ) { return 0; }
return $inputline;
}
sub source {
my ($src) = @_;
if ( $src =~ /^$src_template$/) {
print "-> $src\n"
}
else {
err "ERR3: chybný/chybí odkaz";
}
}
sub verse_print {
($tag, $verse) = @_; # tag: 'm', '0', '1', '2' etc.>
$verse =~ s/\s+$//;
if($tag ne '1') {
my $verse2 = $verse;
$verse2 =~ s/(.*?(spricht|sprach|sagte|schrie|schreibt|betete).*?:)(.*)/<<$1>>$3/;
if ($1) {
if (length($1) < 50) { $verse = $verse2;}
}
}
# print "$tag> ***$verse***\n";
print "$tag> $verse\n";
}
sub verse {
($tag, $_) = @_; # tag: 'm', '0', '1', '2' etc.>
# print "sub verse: *****$_*****\n";
if (/--/) { return 0;} # Keine Losung
my $spricht = '';
if (/^(.* (spricht|sprach|sagte|schrie|schreibt|betete).*:) ?$/) {
$spricht = "$1 ";
&readline;
}
if (/^(.*) $src_template$/) { # auf eine Reihe
# print "--\n";
my $verse = $spricht.$1;
my $src = $2;
&verse_print($tag, $verse);
&source($src);
}
else { # source auf andere Reihe
&verse_print ($tag, $spricht.$_);
&readline;
chomp;
if (/^$src_template$/) {
#chomp;
&source($_);
}
else {
err "ERR4: chybný/chybí odkaz";
}
}
}
sub month {
my @month_de = qw(Januar Februar März April Mai Juni
Juli August September Oktober November Dezember);
my @month_cz = qw(Leden Únor Březen Duben Květen Červen
Červenec Srpen Září Říjen Listopad Prosinec);
$_ = $inputline;
if (!/^([A-Za-zÄÖÜäöüß]*)$/) { return 0;}
# print;
my $m = 0;
for my $month_de( @month_de ) {
$m++;
if ($1 eq $month_de) { goto OK;}
}
return 0;
OK: $month = $m;
# $day = '1'; &doy_dow; # v pripade, ze nejsou uvadena data 1.v mesici
# print;
print "\n# $month_de[$m-1]\n";
&readline;
# print "sub month: *****$_*****\n";
if (! s/^Monatsspruch: //) { &err("ERR5: Fehlt Monatspruch!");}
&readline;
&verse ('m', $_);
printf ("\n# %02d.%02d.%4d (%d)\n", $day, $month, $year, $dow);
}
sub week { # jedno slovo
$_ = $inputline;
if (/^([A-Za-zÄÖÜäöüß]*)$/) { print "\n%> $_"; return 1;}
# if (!/Weltgebetswoche/) { return 0;}
foreach my $template (@dny_tydny) {
# print "$template\n";
if(/$template/) { print "\n%> $_"; return 1;}
}
# err"ERR6: WELT";
return 0;
}
sub pozn {
$_ = $inputline;
if (/^(\d){1,2}\. (März|Mai|Juni|Juli|August|September|November)/)
{ print "_> $_"; return 1;} # začíná datumem
return 0;
}
sub date {
$_ = $inputline;
if (!/^(\d{2})\.(\d{2})\.$year/) { return 0;}
$day = $1;
$month = $2;
&doy_dow;
chomp;
print "\n# $_ ($dow)\n";
if($besontail) { err "ERR7: Nevyprázdněný besontail:\n$besontail";}
if($if_besontail) { err "ERR8: \$if_besontail hängt!";}
return 1;
}
sub oprav { # opraví/upraví odkaz na kanonický tvar
my ($odk) = @_;
$odk =~ s/ -/-/g;
$odk =~ s/- /-/g;
$odk =~ s/, /,/g;
$odk =~ s/; /;/g;
$odk =~ s/oder/|/;
return $odk;
}
sub besonderstag {
$_ = $inputline;
# Lied,Wochenlied,Psalm,Wochenpsalm,Evangelium,Epistel,Psalm,Dritte Lesen,Predigt
my ($ld, $wl, $ps, $wp, $ev, $ep, $dl, $pr);
if (!/^____________/) { return 0;}
&readline;
print $sonntag ? "\n\@>> " : "\n\$>> " ; # Sonntag : Fest
if(! $sonntag) { # všední den
print "$_";
}
else { # Sonntag
if(/^(.*) \((.*)\)/) {
print "$1\n";
my $o = $_ = $2; # význam neděle
if ( / $src_template/) { # s biblickým odkazem
print "o> $`\n";
print "-> $1\n";
}
else {
print "o> $o\n";
}
}
else { print "$_";}
}
&readline;
if (! /::/) { # ještě nejsou odkazy, bude to verš
&verse ('0', $inputline);
&readline; # Lied :: Psalm für Fest
#print '>>',$_.'<<';
if (s/^Lied: (.*) :: //) {
$ld = $1; $ld=~ s/ oder /|/g;
# print "*Ld> $ld\n";
$besontail .= "Ld> $ld\n";
}
elsif (s/^Wochenlied: (.*) :: //) {
$wl = $1; $wl=~ s/ oder /|/g;
# print "*WL> $wl\n";
$besontail .= "WL> $wl\n";
}
else { err ("ERR9: (Wochen)Lied"); }
if (/^Psalm:? (.*)$/) {
$ps = $1;
# print "*PF> Psalm $ps\n";
$besontail .= "PF> Psalm $ps\n";
}
elsif (/^Wochenpsalm:? (.*)$/) {
$wp = $1;
# print "*WP> Psalm $wp\n";
$besontail .= "WP> Psalm $wp\n";
}
else { err ("ERR10: (Wochen)Psalm"); }
&readline;
}
# s/^\(Pr.\) //; # 2009 je evangelium zároveň jako Predigt; 2010 epištola jako Predigt
if (/^(.*) :: (.*) :: (.*)$/) { # Ev :: Ep :: Ps | DL
$ev = &oprav($1);
# print "Ev> $ev\n";
$besontail .= "Ev> $ev\n";
$ep = &oprav($2);
# print "Ep> $ep\n";
$besontail .= "Ep> $ep\n";
$dl = $3; # Dritte Lesen (für Fest)
if ($dl =~ /^Psalm (.*)/) {
$dl = '';
$ps = $1;
# print "Ps> Psalm $ps\n";
$besontail .= "Ps> Psalm $ps\n";
}
else {
# print "DL> $dl\n";
$besontail .= "DL> $dl\n";
}
}
else { print $besontail; err ("ERR11: Lesen"); }
&readline; # Predigt
if (/^Predigt: (.*)/) { # 2009 není žádný zvláštní Predigt, 2010 zase je
$pr = &oprav($1);
print "Pr> $pr\n";
$besontail .= "Pr> $pr\n";
&readline; # _____
}
# else { print $besontail; err ("ERR12: Predigt");} # takže to není chyba
if (! /^____________/) { print $besontail; err ("ERR13: Ještě něco na konci Besonderstagu"); }
$if_besontail = 1;
if(!$main::opt_s) {
print $besontail;
$besontail = '';
}
$sonntag = 0;
return 1;
}
sub drittetext { # Precte a analyzuje treti text
&readline;
# if(/(.*) {3,}(.*)/ || /(.*) ?(\*)/) { # Autor tretiho textu na stejne radce (rok 2009)
if(/(.*\.) ([^.,;!?]{5,})$/ || /(.*) ?(\*)/) { # Autor tretiho textu na stejne radce (rok 2010)
print "DT> $1\n"; # Der dritte Text
print "DA> $2\n"; # Der dritte Text - Author
}
else { # Autor tretiho textu na dalsi radce
print "DT> $_"; # Der dritte Text
&readline;
print "DA> $_"; # Der dritte Text - Author
}
}
sub tag {
$_ = $inputline;
if(! /^(\d{1,2})\. ([MDFS][a-z]+)$/) { return 0;}
my @tage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
my ($l1, $l2); # 1.Lesen, 2.Lesen
if($1 != $day) { err "ERR14: den počítaný $day != udaný $1";}
if($2 ne $tage[$dow]) { err "ERR15: den v týdnu počítaný $dow != udaný $2";}
if($dow) { # Wochentag
print "\nx> $_";
&readline; # Losung aus Altes Testament
&verse ('1', $inputline);
&readline; # Verse aus Neues Testament
&verse ('2', $inputline);
&drittetext;
if($if_besontail) {
if($main::opt_s) {
# err "ERR16: swap OK";
print $besontail;
$besontail = '';
}
$if_besontail = 0;
}
else {
&readline;
if (/^(.*) :: (.*)$/) { # Lesen 1> :: 2>
$l1 = &oprav($1);
print "1-> $l1\n";
$l2 = &oprav($2);
print "2-> $l2\n";
}
else { err ("ERR17: Wochentag Lesen"); }
}
}
else { # Sonntag
print "\n\+> $_";
&readline; # Losung aus Altes Testament
&verse ('1', $inputline);
&readline; # Verse aus Neues Testament
&verse ('2', $inputline);
&drittetext;
if($if_besontail) {
if($main::opt_s) {
# err "ERR18: swap OK";
print $besontail;
$besontail = '';
}
$if_besontail = 0;
}
else { err "ERR19: \$if_besontail fählt!"; }
}
return 1;
}
@pozn = (
'1. März 1457',
'3. Mai 1728',
'17. Juni 1722',
'6. Juli 1415',
'13. August 1727',
'21. August 1732',
'16. September 1741',
'13. November 1741'
);