use strict;
use Win32::OLE;

# encoding wandelt den DOS-Zeichensatz der 
# Registerdatei in den ANSI-Zeichensatz um

sub encoding {
  my $str = shift;

  $str =~ tr/\x02\x04/\x82\x84/;  # Da sind die 8. Bits verschwunden...
  $str =~ tr/\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF/\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xF8\xA3\xD8\xD7\x83\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\xAE\xAC\xBD\xBC\xA1\xAB\xBB\xA6\xA6\xA6\xA6\xA6\xC1\xC2\xC0\xA9\xA6\xA6\x2B\x2B\xA2\xA5\x2B\x2B\x2D\x2D\x2B\x2D\x2B\xE3\xC3\x2B\x2B\x2D\x2D\xA6\x2D\x2B\xA4\xF0\xD0\xCA\xCB\xC8\x69\xCD\xCE\xCF\x2B\x2B\xA6\x5F\xA6\xCC\xAF\xD3\xDF\xD4\xD2\xF5\xD5\xB5\xFE\xDE\xDA\xDB\xD9\xFD\xDD\xAF\xB4\xAD\xB1\x3D\xBE\xB6\xA7\xF7\xB8\xB0\xA8\xB7\xB9\xB3\xB2\xA6\xA0/;

  return $str;
}

# ein leeres DOMDocument anlegen
# und den Wurzelknoten erzeugen

my $xmldoc = Win32::OLE->new('Msxml2.DOMDocument') or die "Kann DOMDocument nicht anlegen.\n";

my $pi = $xmldoc->createProcessingInstruction('xml', 'version="1.0" encoding="ISO-8859-1"');
$xmldoc->appendChild( $pi );

my $xmlregister = $xmldoc->createElement('register');
$xmldoc->appendChild( $xmlregister );

my $id=0;

# Datensaetze aus der Registerdatei einlesen
# Zeichensatz konvertieren 
# bei numerischen Angaben Leerzeichen wegwerfen.

open( INHALT, '<INHALT.FRM') or die 'Kann INHALT.FRM nicht oeffnen.';

while ( my $titel = <INHALT> ) {
                               chomp( $titel      ); $titel      = encoding( $titel      );  
    my $untertitel = <INHALT>; chomp( $untertitel ); $untertitel = encoding( $untertitel );  
    my $autor      = <INHALT>; chomp( $autor      ); $autor      = encoding( $autor      );  
    <INHALT>;   # Redakteur
    my $seite      = <INHALT>; chomp( $seite      ); $seite      *= 1;  
    my $ausgabe    = <INHALT>; chomp( $ausgabe    ); $ausgabe    *= 1;  
    my $jahrgang   = <INHALT>; chomp( $jahrgang   ); $jahrgang   = encoding( $jahrgang   );  
    <INHALT>;   # Querverweise
    my $schlagwort = <INHALT>; chomp( $schlagwort ); $schlagwort = encoding( $schlagwort );  

    my ($zeitschrift,$jahr) = ( $jahrgang =~ /^(.)(\d+)/ );

    # nachschauen, ob das Heft bereits eingetragen ist

    my $xmlausgabe = $xmlregister->selectSingleNode("jahrgang[\@jahr='$jahr' and \@zeitschrift='$zeitschrift']/heft[\@nr='$ausgabe']");
    if ( !$xmlausgabe ) {

        # Ein neues Heft hat begonnen. Neuen ausgabe-Knoten mit Attributen einfuegen
        # ggf. neuen Jahrgang anlegen.
        print "$zeitschrift$jahr/$ausgabe\n";

        my $xmljahrgang = $xmlregister->selectSingleNode("jahrgang[\@jahr='$jahr' and \@zeitschrift='$zeitschrift']");
        if ( !$xmljahrgang ) {
            # einen neuen Jahrgang anlegen
            $xmljahrgang = $xmldoc->createElement('jahrgang');
            $xmljahrgang->SetAttribute( 'jahr', $jahr );
            $xmljahrgang->SetAttribute( 'zeitschrift', $zeitschrift );
            $xmlregister->appendChild( $xmljahrgang );
        }

        $xmlausgabe = $xmldoc->createElement('heft');
        $xmlausgabe->SetAttribute( 'nr', $ausgabe );
        $xmljahrgang->appendChild( $xmlausgabe );
    }

    # nun den artikel-Knoten aufbauen
    my ($xmlartikel,$xmltext,$xmltextnode);
    
    $xmlartikel = $xmldoc->createElement('artikel');
    $xmlartikel->SetAttribute( 'id', $id++ );
    $xmlausgabe->appendChild( $xmlartikel );

    $xmltext = $xmldoc->createElement('titel');
    $xmlartikel->appendChild( $xmltext );
    $xmltextnode = $xmldoc->createTextNode( $titel );
    $xmltext->appendChild( $xmltextnode );

    $xmltext = $xmldoc->createElement('untertitel');
    $xmlartikel->appendChild( $xmltext );
    $xmltextnode = $xmldoc->createTextNode( $untertitel );
    $xmltext->appendChild( $xmltextnode );

    $xmltext = $xmldoc->createElement('autor');
    $xmlartikel->appendChild( $xmltext );
    $xmltextnode = $xmldoc->createTextNode( $autor );
    $xmltext->appendChild( $xmltextnode );

    $xmltext = $xmldoc->createElement('seite');
    $xmlartikel->appendChild( $xmltext );
    $xmltextnode = $xmldoc->createTextNode( $seite );
    $xmltext->appendChild( $xmltextnode );

    $xmltext = $xmldoc->createElement('schlagwort');
    $xmlartikel->appendChild( $xmltext );
    $xmltextnode = $xmldoc->createTextNode( $schlagwort );
    $xmltext->appendChild( $xmltextnode );

    # ein Zeilenvorschub, damit XML-Datei im Editor lesbar ist
    $xmltextnode = $xmldoc->createTextNode( "\n" );
    $xmlausgabe->appendChild( $xmltextnode );

}

# und das DOMDocument auf Platte schreiben

$xmldoc->save('inhalt.xml');
