5 # Dieses Perl-Skript wendet die TeX-Trennmusterdatei $1 auf den Datenstrom
6 # an, wobei $2 als Translationsdatei benutzt wird (das ist diejenige Datei,
7 # die `patgen' als viertes Argument benötigt).
9 # Folgende Zeichen werden vor der Weiterverarbeitung aus der Eingabe
14 # Ist Option `-1' nicht gegeben, werden Trennungen direkt nach dem ersten
15 # und vor dem letzten Buchstaben in der Ausgabe entfernt, wie z.B. bei
16 # deutschen Trennungen erforderlich.
18 # Dieses Skript benützt patgen, nicht TeX! Die Trennmusterdatei darf daher
19 # keine TeX-Konstrukte (Makros u.ä.) enthalten.
21 # Aufruf: perl apply-pattern.pl trennmuster german.tr < eingabe > ausgabe
37 die "Aufruf: $prog [-1] trennmuster german.tr < eingabe > ausgabe\n" .
39 " `eingabe', `ausgabe' in UTF-8-Kodierung,\n" .
40 " `trennmuster', `german.tr' in ISO-8859-15-Kodierung\n" .
42 " Mit Option `-1' bleiben Trennungen nach dem ersten und\n" .
43 " vor dem letzten Buchstaben in der Ausgabe.\n";
46 my $trennmuster = File
::Spec
->rel2abs($ARGV[0]);
47 my $translation = File
::Spec
->rel2abs($ARGV[1]);
48 my $tempdir = File
::Temp
::tempdir
(CLEANUP
=> 1);
49 my $tempdatei = "pattern";
50 my $null = File
::Spec
->devnull();
54 || die "$prog: Kann nicht ins temporäre Verzeichnis `$tempdir' wechseln: $!\n";
58 open TEMP
, '>', $tempdatei
59 || die "$prog: Kann temporäre Datei `$tempdatei' nicht öffnen: $!\n";
61 binmode(STDIN
, ":encoding(utf8)"); # Eingabe (wortliste) in UTF-8
62 binmode(TEMP
, ":encoding(iso-8859-15)"); # patgen erwartet Latin-9
71 open TEMP
, '>', $stdin
72 || die "$prog: Kann temporäre Datei `$stdin' nicht öffnen: $!\n";
77 # Portables Umleiten von stdin, stdout und stderr ...
78 open STDOUT_ALT
, '>&', \
*STDOUT
79 || die "$prog: Kann STDOUT nicht duplizieren: $!\n";
80 open STDERR_ALT
, '>&', \
*STDERR
81 || die "$prog: Kann STDERR nicht duplizieren: $!\n";
82 open STDOUT
, '>', $null
83 || die "$prog: Kann STDOUT nicht zur Nullausgabe umleiten: $!\n";
84 open STDERR
, '>', $null
85 || die "$prog: Kann STDERR nicht zur Nullausgabe umleiten: $!\n";
87 || die "$prog: Kann `$stdin' nicht nach STDIN umleiten: $!\n";
89 my $status = system("patgen $tempdatei $trennmuster $null $translation");
92 open STDOUT
, '>&', \
*STDOUT_ALT
93 || die "$prog: Kann STDOUT nicht wieder herstellen: $!\n";
94 open STDERR
, '>&', \
*STDERR_ALT
95 || die "$prog: Kann STDERR nicht wieder herstellen: $!\n";
97 die "$prog: Aufruf von patgen fehlgeschlagen: $fehler\n" if $status;
100 my ($pattmp) = <pattmp
.*>;
102 || die "$prog: Kann von patgen erzeugte Datei `$pattmp' nicht öffnen: $!\n";
105 s/^(.)-/$1/ if not $opt_1;
106 s/-(.)$/$1/ if not $opt_1;
111 binmode(STDOUT
, ":encoding(utf8)"); # Ausgabe ist wieder UTF-8
114 my @vorlage = split(//, shift(@eingabe));
115 my @ergebnis = split(//, shift(@muster));
119 # letztes Zeichen ist immer \n, daher < und nicht <=
120 while ($i < $#vorlage) {
121 $j++ if ($ergebnis[$j] eq '-');
122 $ergebnis[$j++] = $vorlage[$i++];
128 chdir($ENV{HOME
}) || chdir('/');