Projekt: Hesla Jednoty bratrské/2018/hes18tex.pl
Tato stránka je součástí projektu: | |
Příslušnost: skupinová |
hes18tex.pl
editovatSkript pro sazbu Hesel v plain TeX. Verze pro Hesla na rok 2018.
#!/usr/bin/perl
# hes18tex.pl Transformuje hesla JB na rok 2018 z .pre do plain TeXu .tex
# (pro Slávu) Petr Heřman
# zkracuje názvy variantních čtení
# apostrof ' se nahrazuje \char39
# ę = \ogonek e
# Tagy na zacatku radek:
#
# # Komentar
# m> Heslo mesice
# @> Nedelni tyden
# $> Svatek
# +> Nedele
# x> vsedni den
# o> vyznam nedele
## 0> Heslo tydne
# 1> Prvni (SZ) heslo
# 2> Druhy (NZ) vers
# -> Odkaz do SZ (neexistuje odkaz do Bible (SZ-neni jeste udelano))
# => Odkaz do NZ (existuje odkaz do Bible (NZ-uz je hotovo))
## %> Vyznamny den, tyden (v nadpisu)
# _> Vyznacna udalost (v poznamce na konci)
# ?> Dale neurceny (podivny?) radek
# { Zacatek pisne
# } Konec pisne
# Kombinace (napr.):
# 1-> Prvni cteni s odkazem do SZ
# 1=> Prvni cteni s odkazem do NZ
# 2-> Druhe cteni s odkazem do SZ
# 2=> Druhe cteni s odkazem do NZ
# 3-> Treti cteni s odkazem do SZ
# 3=> Treti cteni s odkazem do NZ
#use utf8;
$rok = '18';
#$path = 'cz/jb/hesla/';
$sep = '§'; # separátor "\xa7"
@mesic_up = ('LEDEN', 'ÚNOR', 'BŘEZEN', 'DUBEN', 'KVĚTEN', 'ČERVEN',
'ČERVENEC', 'SRPEN', 'ZÁŘÍ', 'ŘÍJEN', 'LISTOPAD', 'PROSINEC');
@mesic_lo = ('leden', 'únor', 'březen', 'duben', 'květen', 'červen',
'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec');
@m_day=(31,29,31,30,31,30,31,31,30,31,30,31);
$hdr = <<'KONEC';
KONEC
######################### Subroutiny: ################################
sub var_zkr { # variantní čtení zkrať
my ($odk) = @_;
#print "[$n_mes-$den]";
if ($odk =~ /\//) {
if(!($n_mes==8 && $den-1==18)) {
$odk =~ s/1\.Paralipomenon/1Pa/;
$odk =~ s/2\.Paralipomenon/2Pa/;
$odk =~ s/Moudrost/Mdr/;
if(!($n_mes==9 && $den-1==8)) {
$odk =~ s/Sírachovec/Sír/;
}
}
}
$odk;
}
sub nbsp ### Udela nbsp (non-breakable space) v $_
{
s/ ([AIKOSUVZaikosuvz]) / $1~/g; # Aa ne na konec řádku
# s/ ([IKOSUVZikosuvz]) / $1~/g;
}
sub quotes
{
# local ($str, $i, $char, $up, $out);
# $str = $_;
# for($i=0;$i<length($str);$i++)
# {
# $char = substr($str, $i, 1);
# if($char eq '"')
# { if($up) {$out .= '\crqq';}
# else {$out .= '\clqq ';}
# $up = ++$up%2;
# }
# else
# {$out .= $char;}
# }
# $_ = $out;
# s/\\"/\\clqq /g;
s/\'/\\char39/g; #nahradí apostrofy
# s/\\"/"/g;
# s/\\'/'/g;
# s/"/\\crqq{}/g;
# s/<</{\\footnotesize /g;
# s/>>/}/g;
s/<</\\</g;
s/>>/>/g;
}
sub uprav
{
# s/ \-\-\-/~---/;
s/ \xe2\x80\x93/~--/g; # pomlčka utf-8
# s/ \- /~-- /g; #
# s/ \-\-/~--/g;
s/ę/\\ogonek e/g;
s/è/\\`e/g;
"es;
}
sub odkaz ### odkaz na predchazejici vers
{
local ($_) = @_;
/^[-=]> (.*)/;
$_ = $1;
s/ >.*$//; #anchor do NZ pryc
s/ /~/g;
# ‐
s/\-/--/g;
s/\|/nebo/g;
s/(\d)\.(.*)/$1.\\,$2/;
$_;
}
sub dash ### pomlčka mezi čísly s mezírkami \ds
{
if (s/([02345689])\-([045689])/$1\\ds--\\ds$2/g){;} # mezírky z obou stran
elsif (s/([02345689])\-/$1\\ds--/g){;} # jen zleva
elsif (s/\-([045689])/--\\ds$1/g){;} # jen zprava
else {s/\-/--/g;}
}
sub konec_vyznamu
{
if ($konec_vyznamu)
{
$konec_vyznamu = 0;
# if($ref) {print "\\meaningvrs{$meaning}{$ref}\n"; $ref='';}
# if($ref) {print "\\vysvetleni $meaning$sep \n\\zdroj $ref$sep\n"; $ref='';}
if($ref) {print "\\vysvetlenizdroj $meaning$sep$ref$sep\n"; $ref='';}
# else {print "\\meaning{$meaning}\n"}
else {print "\\vysvetleni $meaning$sep\n"}
$meaning='';
}
}
######################################################
foreach $filename (@ARGV)
{
open(INFILE, $filename) || do
{ print STDERR "Nemuzu otevrit soubor $filename: $!\n"; next; };
if($filename=~/hes$rok(\d\d)\.pre/ && $1<=12) # nazev souboru
{
$n_mes = $1;
$outfile = 'tex.utf8/'.'hes'.$rok.$n_mes.'.tex';
# $htmfile = 'hes'.$rok.$n_mes.'.htm';
}
else
{
print STDERR "Soubor \'$filename\' preskocen - nema tvar /hes${rok}[01..12].pre/\n";
next;
}
open(STDOUT, ">$outfile") || do
{ print STDERR "Nemuzu presmerovat STDOUT do $outfile: $!\n"; next; };
print STDERR "\tMakam na souboru $filename --> $outfile\n";
$tento_mesic=$mesic_up[$n_mes-1];
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
print "%% Hesla Jednoty bratrské 20$rok - $tento_mesic\n";
print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n";
print "%% Tento soubor pro plain TeX byl vytvoren skriptem hes${rok}tex.pl\n";
$mon++; $year+=1900;
if ($min < 10) {$min = "0$min";}
print "%% dne $mday.$mon.$year v $hour:$min.\n";
#print $hdr;
print "\\mesic $tento_mesic$sep\n\n";
$den=1;
$cteni=0;
$cteni1='';
$cteni2='';
$cteni3='';
$line=0; # počítadlo řádků
$cis_pisne = '';
while (<INFILE>) ##### pro kazdy radek ######
{
$line++;
if(/^\#/) ## komentar
{
next;
}
if (/^(\d)([-=]> .*)/) ### odkaz na cteni
{
if($1==1)
{
$cteni=1;
$cteni1 = &odkaz($2);
}
elsif($1==2)
{
$cteni=2;
my $odk = $2;
$odk = &var_zkr($odk); # variantní čtení zkrať
$cteni2 = &odkaz($odk);
}
elsif($1==3)
{
$cteni=3;
$cteni3 = &odkaz($2);
}
else
{
$cteni=0;
}
next;
}
elsif ($cteni) # konec cteni
{
if($cteni==2)
# {print "\n\\rdrd{$cteni1}{$cteni2}\n";}
{
print "\n";
print "\\cteni $cteni1$sep\n";
print "\\cteni $cteni2$sep\n";
}
elsif($cteni==3)
# {print "\n\\rdrdrd{$cteni1}{$cteni2}{$cteni3}\n";}
{
print "\n";
print "\\cteni $cteni1$sep\n";
print "\\cteni $cteni2$sep\n";
print "\\cteni $cteni3$sep\n";
}
$cteni=0;
$cteni1='';
$cteni2='';
$cteni3='';
}
if(/^\s*$/) ## prazdny radek
{
next;
}
# if(/^@>(\w+)> (.*)/) ### NEDELNI TYDEN ###
if(/^@>(\w*)> (.*)/) ### NEDELNI TYDEN - nepovinná zkratka ###
{
$_ = $2;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
print "\n\n\\svatek $_$sep\n\n";
$center = 1; # Centruje cely dalsi odstavec
}
# elsif(/^\$>(\w+)> (.*)/) ### SVATEK ###
elsif(/^\$>(\w*)> (.*)/) ### SVATEK - nepovinná zkratka ###
{
$_ = $2;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
print "\n\n\\svatek $_$sep\n\n";
$svatek = 1; # Nasledujici se uz neoddeli <HR>
}
elsif(/^%> (.*)/) ### VYZNAMNY DEN nebo TYDEN ###
{
$_ = $1;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
# print "\n\\important{$_}\n";
print "\n\n\\vyznamny $_$sep";
$svatek = 1; # Nasledujici se uz neoddeli <HR>
}
elsif (/^o> (.*)/) ### VYZNAM TYDNE NEBO SVATKU
{
$_ = $1;
#
#"es;
&uprav;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
$meaning = $_;
$konec_vyznamu = 2;
}
elsif (/^0> (.*)/) ### HESLO TYDNE NEBO SVATKU
{
&konec_vyznamu;
$_ = $1;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
#
#"es;
&uprav;
# print "\\weekww{$_}\n";
print "\\heslo $_$sep\n";
}
elsif (/^m> (.*)/) ### HESLO MESICE
{
$_ = $1;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
&uprav;
#
#"es;
# print "%% Heslo měsíce:\n";
print "\\heslo $_$sep\n";
}
elsif(/^\+> ((\d{1,2})\..*)/) ### NEDELE ###
{
if($den != $2)
{ print STDERR "\n!! pocitany den=$den != $2 = oznaceny den\n"; $den=$2;}
# print "\n\\sunday{$1}\n";
print "\n\n\\den $1$sep\n";
$den++;
# print "\n[$den]";
}
elsif(/^x> ((\d{1,2})\..*)/) ### VSEDNI DEN ###
{
if($den != $2)
{ print STDERR "\n!! pocitany den=$den != $2 = oznaceny den\n"; $den=$2;}
if ($svatek) { $svatek=0; }
# print "\n\\wrkday{$1}\n";
print "\n\n\\den $1$sep\n";
$den++;
## print "\n[$den]";
}
elsif (/^1> (.*)/) ### SZ HESLO
{
$_ = $1;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
#
#"es;
&uprav;
# print "\\otverse{$_}\n";
print "\\heslo $_$sep\n";
}
elsif (/^2> (.*)/) ### NZ VERS
{
$_ = $1;
# s/ \-\-\-/~---/;
s/ \- /~-- /g;
s/ \-\-/~--/g;
#
#"es;
&uprav;
print "\n"; # paragraph
# print "\\ntverse{$_}\n"; # odradkovat predem
print "\\heslo $_$sep\n"; # odradkovat predem
}
elsif (/^[-=]> .*/) ### odkaz na predchazejici vers
{
if($konec_vyznamu) {$ref=&odkaz($&);}
else { print "\\zdroj ";
print &odkaz($&);
print "$sep\n";
}
&konec_vyznamu;
if($vspace)
{
print "\\vspace*{\\fill}\n";
$vspace = 0;
}
}
elsif (/^\{\{(.*)/) ### Siles, citát
{
$cis_siles = $1;
$siles=1;
#
#"es;
&uprav;
# print "\n\\song{";
# print "\n\\citat ";
print "\n\\trojversi ";
}
elsif (/^}}/) ### Konec Siles
{
$siles=0;
#if ($1 eq '0,0') {print '!!';} # Zapomenuto v .PRE
#$_ = $1;
# #‐
# #print "}{$_}\n\n";
# print "\n\\autor $cis_siles$sep\n";
print "\n\\sbirka $cis_siles$sep\n";
#$cis_siles = '';
}
elsif ($siles) ### Prubeh Silesia
{
s/ *$//; # prebyvaji mezery na konci radku
chop;
# if($siles++ > 1)
# { print "\\\\\n";}
# { print "\n";}
# print "\\ind $_";
#
#"es;
&uprav;
s/ \-/~--/g;
s/^ +//;
# s/\n//;
#s/^-$/\\medskip/; # rozdělovník mezi slokami
print "$_$sep";
}
elsif (/^{ (.*)/) ### Pisen
{
$cis_pisne = $1;
$pisen=1;
#
#"es;
&uprav;
# print "\n\\song{";
print "\n\\pisen\n";
}
elsif (/^}\s*(.*)/) ### Konec pisne
{
$pisen=0;
if ($1 eq '0,0') {print '!!';} # Zapomenuto v .PRE
$_ = $1;
# ‐
# print "}{$_}\n\n";
print "\n\\cislopisne $cis_pisne$sep\n";
$cis_pisne = '';
}
elsif ($pisen) ### Prubeh pisne
{
s/ *$//; # prebyvaji mezery na konci radku
chop;
if($pisen++ > 1)
# { print "\\\\\n";}
{ print "\n";}
# print "\\ind $_";
#
#"es;
&uprav;
s/ \-/~--/g;
s/^-$/\\medskip/; # rozdělovník mezi slokami
&uprav;
print "$_";
}
elsif (/^%> (.*)/) ### vyznamny den, tyden
{
# print "\n\\important{$1}\n";
print "\n\n\\vyznamny $1$sep";
# print "\n\\anniversary{$1}\n\n";
}
elsif (/^_> (.*)/) ### vyroci
{
$_ = $1;
&uprav;
# print "\n\\anniversary{$1}\n\n";
print "\n\\vyroci $_$sep\n\n";
# print "\n\\important{$1}\n";
}
elsif (/^~> (.*)/) ### doslova tak, jak je
{
print "$1\n";
}
elsif (/^\?> (.*)/) ### nejaky jiny radek
{
print "\n\\quest $1$sep\n";
print STDERR "line $line ??: $_";
}
else ### COKOLIV JINEHO PODIVNEHO
{
print STDERR "line $line: $_";
}
}
### Paticka - kalendar: ###
#print "\n\\end{document}\n";
#print "\n\\bye\n";
print "\n";
close (STDOUT);
}