Hallo Philip,
also ich habe das Problem definitiv erschlagen, mit einer für mich etwas überraschenden Logik. Aber ich hab's ausgiebig getestet, und es funktioniert zuverlässig. Herzlichen Dank nochmal für Deinen Zuspruch.
Georg
Auszug:
my $lex = "StPO";
my $pfad = "...";
open(ein, "<$pfad/$lex.xml");
my @zeilen = <ein>;
close(ein);
my %leges = (
"Abgabenordnung" => AO,
"Artikel 10-Gesetz" => G10,
usw ... );
open(aus, ">$pfad/$lex-1.xml");
my @leges = keys(%leges);
foreach(@zeilen){
$zl = $_;
# Zeilenumbruch nach Gesetzesangabe
foreach(@leges){
$zl =~ s/($_[^< ]*)/\1\n/g;
}
print aus "$zl";
}
close(aus);
###############################################################
Datei neu einlesen
open(ein, "<$pfad/$lex-1.xml");
my @zeilen = <ein>;
close(ein);
open(aus, ">$pfad/$lex-1.xml");
my $zl = ""; # Zeileninhalt
my @i; # Input-Array
my $ist = 0; # Inputstatus
my $klex; # Gesetzeskürzel
my $llex; # Gesetzesangabe lang
foreach(@zeilen){
$zl = $_;
$llex = "irgendwas";
$klex = $lex;
# teste alle Gesetze und ermittle $llex und $klex
foreach(@leges){
if($zl =~ "$_"){
$llex = $_; # Gesetzesbezeichung lang
$klex = $leges{$_}; # Gesetzeskürzel
}
}
# erschlage Aufzählungen von Paragraohen
if($zl =~ "[^>]§§ "){
@i = split(/ /, $zl); # Zerlege die aktuelle Zeile ($zl).
$zl = ""; # Lösche (alten) Zeileninhalt.
$sti = 0; # Statusschalter für Input
foreach(@i){
if($_ =~ "[(]?§§"){
$sti = 1; # Schalte Input-Status ein.
}
if($_ =~ "[A-Z].*"){
$sti = 0; # Schalte Input-Status aus (Aufzählungsende).
}
if($sti == 1){ # Verlinke (ggf.) Paragraphenangaben)
# Der Linkzauber.
$_ =~ s/([0-9]+[a-z]*)(.*)/<link url="../$klex/$klex\1.html">\1</link>\2/;
}
}
$zl = join(" ", @i); # Setze die Zeile ($zl) wieder zusammen.
@i = ""; # Setze @i zurück.
}
# Einfacher Paragraph
# Wenn ein Satzende (. [A-Z]) vor der Gesetzesangabe steht, gehört § nicht dazu.
$zl =~ s/([^>§])§ ([0-9a-z]+)(.*. [A-Z].*$llex)/\1§ <link url="$lex\2.html">\2</link>\3/g;
# Wenn die Gesetzesangabe eingeklammert isch, gehört § nicht mit dazu
$zl =~ s/([^>§])§ ([0-9a-z]+)(.*(§.*$llex[a-z]*))/\1§ <link url="$lex\2.html">\2</link>\3/g;
# ich versteh nit, wieso, aber wenn die Zeile fehlt, gibt es Fehler
$zl =~ s/([^>§])§ ([0-9a-z]+) (.*(§.*$llex[a-z]*))/\1§ <link url="$lex\2.html">\2</link> \3/g;
# Sonst ist es einfacher
$zl =~ s/([^>§])§ ([0-9a-z]+)/\1§ <link url="../$klex/$klex\2.html">\2</link>/g;
# Gesetz
$zl =~ s/ ($llex[a-z]*)/ <link url="../$klex/$klex.html">\1</link>/;
$zln = $zln+1; # Zeilennummer
print aus "$zl";
print "$zln\n";
}
system("lex2html.pl");
#####################################################################