praetor: Aufzählungen von Begriffen

Beitrag lesen

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");

#####################################################################