Projekt: Hesla Jednoty bratrské/2018/hes18tex.pl

Z Wikiverzity
Jump to navigation Jump to search
Jak používat klasifikační nálepkuTato stránka je součástí projektu:
Příslušnost: skupinová

hes18tex.pl[editovat]

Skript 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;
  	&nbsp;
	&quotes;
  }


sub odkaz		### odkaz na predchazejici vers
  {
    local ($_) = @_;
    /^[-=]> (.*)/;
    $_ = $1;
    s/ >.*$//;    #anchor do NZ pryc
    s/ /~/g;
#    &dash;
    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;
	#&nbsp;
	#&quotes;
	&uprav;
#	s/ \-\-\-/~---/;
	s/ \- /~-- /g;
	s/ \-\-/~--/g;
	$meaning = $_;
	$konec_vyznamu = 2;
      }

    elsif (/^0> (.*)/)			### HESLO TYDNE NEBO SVATKU
      {
	&konec_vyznamu;
	$_ = $1;
#	s/ \-\-\-/~---/;
	s/ \- /~-- /g;
	s/ \-\-/~--/g;
	#&nbsp;
	#&quotes;
	&uprav;
#	print "\\weekww{$_}\n";
	print "\\heslo $_$sep\n";
      }

    elsif (/^m> (.*)/)			### HESLO MESICE
      {
	$_ = $1;
#	s/ \-\-\-/~---/;
	s/ \- /~-- /g;
	s/ \-\-/~--/g;
	&uprav;
	#&nbsp;
	#&quotes;
#	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;
	#&nbsp;
	#&quotes;
	&uprav;
#	print "\\otverse{$_}\n";
	print "\\heslo $_$sep\n";
      }

    elsif (/^2> (.*)/)			### NZ VERS
      {
	$_ = $1;
#	s/ \-\-\-/~---/;
	s/ \- /~-- /g;
	s/ \-\-/~--/g;
	#&nbsp;
	#&quotes;
	&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;
	#&nbsp;
	#&quotes;
	&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;
#	#&dash;
#	#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 $_";
	#&nbsp;
	#&quotes;
	&uprav;
	s/ \-/~--/g;
	s/^ +//;
#	s/\n//;
	#s/^-$/\\medskip/;	# rozdělovník mezi slokami
	print "$_$sep";
      }

    elsif (/^{ (.*)/)			### Pisen
      {
        $cis_pisne = $1;
	$pisen=1;
	#&nbsp;
	#&quotes;
	&uprav;
#	print "\n\\song{";
	print "\n\\pisen\n";
      }

    elsif (/^}\s*(.*)/)			### Konec pisne
      {
	$pisen=0;
	if ($1 eq '0,0') {print '!!';}	# Zapomenuto v .PRE
	$_ = $1;
#	&dash;
#	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 $_";
	#&nbsp;
	#&quotes;
	&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);
}