User: markomlm
Date: 05/08/28 04:52:22

Added:
 /de/www/dev/
  makemap.pl

Log:
 Perl-Script zur Generierung der Sitemap von M. Kirchner.
 Überarbeitet von Marko Moeller
 - zuerst checkout für www ausfuehren!
 - site.data muss in site-root liegen
 - Script muss dann lokal unter dev gestartet werden
 - in der site-root werden map_all.html etc generiert und muessen anschliessend
 commited werden.
 Marko Moeller

File Changes:

Directory: /de/www/dev/
=======================

File [added]: makemap.pl
Url: 
http://de.openoffice.org/source/browse/de/www/dev/makemap.pl?rev=1.1&content-type=text/vnd.viewcvs-markup
Added lines: 365
----------------
# Auf neue Navtabs angepasst, Navigationshilfe und w3c eingepflegt M. Moeller 
08.2005
 use File::Find;
 require HTML::HeadParser;
 use POSIX qw(strftime);
 POSIX::setlocale(LC_TIME, "De");



 use warnings;
 $outfile = 'woistwas.html';     # Dateiname des Ausgabefile
 $datafile = 'site.data';        # Dateiname der Flattext Datenbank
 $unsorted = 'Nicht zugeordnet'; # Gruppe, mit noch nicht zugeordneten Elementen
 $noshow = 'Nicht anzeigen';     # Gruppe, mit nicht anzuzeigenden Elementen
 $urlmatch = qr/^\./;            # Wird in der Ausgabe
 $urlreplace = '.';              # in jedem relativen Link ersetzt
 $newdir = '..';                 #Zielverzeichnis fuer Start
 #$position = 'Position';       # Einstellung der Position der Gruppe
 $Version = '0.4a';



my @files;    # Enthaelt die gefundenen *.html/*.htm Dateinamen mit Pfad von ./
my @datafiles;# Enthaelt die Dateinamen im datafile ./
my %settings; # Enthaelt alle Eintraege von $datafile, die mit _ anfangen
my %data;     # Enthaelt alle restlichen Eintraege von $datafile, jeweils
              #  pfad+datei, gruppe, position in gruppe und text.
my %groups;   # alle Gruppen mit einem Array, der zugeordneten pfad+dateien



sub wanted {
# Wird fuer die Suche mit file::find benoetigt und gibt die gewuenschten 
Dateien an.
if (/\.html?$/) {push @files, $File::Find::name};
}


#Zielverzeichnis zum aktuellen Verzeichnis machen
chdir ($newdir);
# sucht im aktuellen Verzeichnis und darunter nach Dateien, fuer jede wird 
Wanted
# aufgerufen
find(\&wanted, '.');


# Einlesen der Datenbank
open (DATAFILE, $datafile) or die "Kann $datafile nicht oeffnen";
BASE: while (<DATAFILE>) {
# Wenn es eine Kommentarzeile ist
if (/^\s*#/) {
        push @Lines, $_;
        next BASE;
}
$adata = {};

# Es sind entweder Eintraege, wo Dateien zu Gruppen geordnet werden
if (/^([^#].*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)$/) {
        $adata->{'Gruppe'}=$1;
        if ($2 eq '' or $2 == 0 ) { $adata->{'Level'}='99' }
        else { $adata->{'Level'}=$2 ; }
        $adata->{'Stil'}=$3;
        $adata->{'Text'}=$4;
        $adata->{'Link'}=$5;
        $adata->{'Beschreibung'}=$6;
        $adata->{'Position'}=$.;
        @{$adata->{'Kommentar'[EMAIL PROTECTED];
        @Lines = ();
        push @{$data{$1}}, $adata;
        if ( not $adata->{'Link'} =~ /^http/i  ) {
                push @{$datafiles{$5}{'Ref'}} , $adata };
        }
}
close DATAFILE;


# Der Index Groups wird aufgebaut, um die Ausgabe vorzubereiten
foreach $file (@files) {
# Wenn die Datein in der Datenbank schon bekannt war,
# wird sie ihr eintrag in den datafiles geloescht
if (exists $datafiles{$file} ) {
        $datafiles{$file}{'Nochda'} = 1;
}
# neue Dateien werden in die Gruppe $unsorted genommen
# und ein Datenbankeintrag angelegt
# Spaeter sollte dies interaktiv erfolgen
else {
        $adata = {};
        $adata->{'Gruppe'}=$unsorted;
        $adata->{'Level'}='99';
        $adata->{'Stil'}='';
        $adata->{'Text'}='';
        $adata->{'Link'}=$file;
        $adata->{'Beschreibung'}='';
        push @{$data{$unsorted}}, $adata;
        push @{$datafiles{$file}{'Ref'}} , $adata ;
} #else exists
} # foreach file

# Jetzt koennte geprueft werden, ob in $datafiles noch links
# zu Dateien, die nicht mehr existieren, ueberiggeblieben sind.
# => spaeter implementieren


# Die Datenbank wird neu geschrieben, jetzt mit den neuen, nicht zugeordneten 
Dateien
open (DATAFILE, '>'.$datafile) or die "Kann $datafile nicht oeffnen";

foreach $agroup (sort {
        (exists($data{$a}[0]->{'Position'}) ? $data{$a}[0]->{'Position'} : 
999999)
                        <=>
        (exists($data{$b}[0]->{'Position'}) ? $data{$b}[0]->{'Position'} : 
999999)
                        ||
                $a  cmp  $b
        }
        keys %data) {
        foreach $adata (@{$data{$agroup}}){

                foreach (@{$adata->{'Kommentar'}}) {print DATAFILE};

                printf DATAFILE "%s\t%s\t%s\t%s\t%s\t%s\n",
                        $adata->{'Gruppe'},
                        $adata->{'Level'},
                        $adata->{'Stil'},
                        $adata->{'Text'},
                        $adata->{'Link'},
                        $adata->{'Beschreibung'}
                        ;
        } # foreach adata
} # foreach group

foreach $agroup (keys %data) {
        foreach $adata (@{$data{$agroup}}){
                if ( not $adata->{'Link'} =~ /^http/i  ) {
                        $adata->{'Link'} =~ s/$urlmatch/$urlreplace/  ;
                }
        } # foreach adata
} # foreach group


close DATAFILE;

# Jede Datei wird geprueft, wenn schon ein Text vorliegt
# wird er verwendet, sonst schaut man nach dem Titel der html-datei.
# und in den <Meta name="title" content="XXXX"> eintrag im Header
# All das funktioniert nicht gut, weil gemischt vorhandene Elemente
# nicht geprueft werden und fuer die neuen Dateien keine Infos
# aufgenommen werden
foreach $file (@files) {
        if ( (exists ($datafiles{$file}))) {
                $p = HTML::HeadParser->new;
                $p->parse_file($file);
                $title = $p->header('Title');
                if (not defined $title) {$title = $p->header('X-Meta-title') }
                if (not defined $title) {$title = "" }
                $title =~ s/ü/&uuml;/;
                $title =~ s/Ü/&Uuml;/;
                $title =~ s/ö/&ouml;/;
                $title =~ s/Ö/&Ouml;/;
                $title =~ s/ä/&auml;/;
                $title =~ s/Ä/&Auml;/;
                $title =~ s/ß/&szlig;/;

                foreach $adata (@{$datafiles{$file}{'Ref'}}){
                        if ( not exists($adata->{'Text'})
                                        or ($adata->{'Text'} eq "" )) {
                                $adata->{'Text'} = $title;
                        }
                } # foreach adata


        }
} # foreach file



# Nun werden die Ausgabe-html Dateien geschrieben.

foreach $atype (@{$data{'perl-sitemap'}}) {
        $outfile = $atype->{'Text'};
        #$sitemapstil = $atype->{'Stil'};
        $sitemaplevel = $atype->{'Level'};
        $sitemaptitle = $atype->{'Beschreibung'};
        $kato = $atype->{'Link'};
        open (OUTFILE, '>'.$outfile) or die "Kann $outfile nicht oeffnen";
        $Datum = strftime "%A, %d. %B %Y %H:%M:%S", localtime( time);

        $sitemapkopf = <<EOT;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
<html lang="de">
<head>
        <title>$sitemaptitle</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <meta name="version" content="$outfile,V$Version $Datum 
$ENV{'USERNAME'}" />
        <meta name="author" content="$ENV{'USERNAME'}" />
        <style type="text/css">
                /*<![CDATA[*/
                <!--
                [EMAIL PROTECTED] 
url("http://www.openoffice.org/branding/css/tigris.css";);
                [EMAIL PROTECTED] 
url("http://de.openoffice.org/styles/inst_de.css";);
                -->
                /*]]>*/
        </style>
     <link rel="stylesheet" type="text/css" 
href="http://www.openoffice.org/branding/css/print.css"; media="print" />
     <link rel="shortcut icon" href="http://www.openoffice.org/favicon.ico"; />

        <meta name="keywords" content="OpenOffice.org, Open Office, OpenOffice, 
openoffice, StarOffice, Star Office, OOo, ooo, xml, open source, developer, 
UNO" />
        <meta name="description" content="de.OpenOffice.org: Sitemap" />




</head>
<body>

<a name="Top"></a>
<div id="body2">

<table id="main2" summary="body2">
<tr>

<td id="body2td">

<div id="body2col">


<p class="nonscreen"><a name="content">start:</a></p>

<div id="toptabs2">

EOT

$sitemapfuss = <<EOT;


<p>
    <a href="http://validator.w3.org/check?uri=referer";><img
        src="http://www.w3.org/Icons/valid-xhtml10";
        alt="Valid XHTML 1.0 Transitional" height="31" width="88" /></a>
</p>
</div>
</body>
</html>
EOT

        print OUTFILE $sitemapkopf;
        # ueber alle Gruppen in der Kategorie
        # Eine Linkliste zu den Gruppen steht am Anfang.
        print OUTFILE "\n<ul>";
        foreach $agroup (@{$data{$kato}}) {
                if ($agroup->{'Level'}<=$sitemaplevel){
                        printf OUTFILE "\n<li><a href=\"#%s\">%s</a></li>",
                                        $agroup->{'Link'},
                                        $agroup->{'Text'};
                }
        }
        print OUTFILE '</ul></div><br /><br /><hr noshade="noshade" size="1" 
/></div></td></tr></table>';
        print OUTFILE "\n<h1>$sitemaptitle</h1>\n";
        # Jetzt wird Gruppenweise geschrieben
        # wobei jeder Gruppe von einer Zeile mit der
        # Richtigen Kategorie referenziert wird
        foreach $agroup (@{$data{$kato}}) {
                # Fuer jede Gruppe eine Ueberschrift
                if ($agroup->{'Level'}<=$sitemaplevel){
                        printf OUTFILE "\n<a name=\"%s\"></a>\n<h2>%s <a 
href='#Top'>^</a></h2>",
                                        $agroup->{'Link'},
                                        $agroup->{'Text'};
                        printf OUTFILE "<p>%s</p>\n",
                                        $agroup->{'Beschreibung'};

                        print OUTFILE "<ul>\n";
                }

                foreach $adata (@{$data{$agroup->{'Link'}}}){
                        if ($adata->{'Level'}<=$sitemaplevel){
                        if ($adata->{'Link'} eq "") {
                        if ($adata->{'Beschreibung'} ne $noshow) {
                                printf OUTFILE "</ul>\n %s \n<ul>\n",
                                # wenn kein Text definiert ist, wird eine 
Leerzelle verwendet
                                ($adata->{'Beschreibung'} ne "")?
                                                        
$adata->{'Beschreibung'}:" ";
                        }
                        }
                        else {
                                printf OUTFILE "<li> <a href=\"%s\"> %s 
</a>\n\t%s </li>\n",
                                $adata->{'Link'},
                                # wenn kein Text definiert ist, wird Pfad+Datei 
verwendet
                                ($adata->{'Text'} ne "")? 
$adata->{'Text'}:$adata->{'Link'},
                                ($adata->{'Beschreibung'} ne "")?
                                                        
$adata->{'Beschreibung'}:" ";
                        }
                        }
                } # foreach adata

                if ($agroup->{'Level'}<=$sitemaplevel){
                        printf OUTFILE "</ul>";
                }
        } # katogorie

        print OUTFILE $sitemapfuss;
        close OUTFILE;
} # foreach perl-sitemap


foreach $atype (@{$data{'perl-navbar'}}) {

        $outfile = $atype->{'Text'};
        $navbarstil = $atype->{'Stil'};
        $navbarlevel = $atype->{'Level'};
        $navbartitle = $atype->{'Beschreibung'};
        $kato = $atype->{'Link'};
        open (OUTFILE, '>'.$outfile) or die "Kann $outfile nicht oeffnen";
        $Datum = strftime "%A, %d. %B %Y %H:%M:%S", localtime( time);
$navbarkopf = <<EOT;
<table id="$navbarstil" summary="$navbartitle" border="0" cellspacing="0" 
cellpadding="0">
        <!-- >
        Kommentare zur Seite
        $outfile,V $Version $Datum $ENV{'USERNAME'}
        < -->
EOT

$navbarfuss = <<EOT;
</table>
EOT

        print OUTFILE $navbarkopf;

        # Jetzt wird Gruppenweise geschrieben
        # wobei jeder Gruppe von einer Zeile mit der
        # Richtigen Kategorie referenziert wird
        foreach $agroup (@{$data{$kato}}) {
                if ($agroup->{'Level'}<=$navbarlevel){
                        # Fuer jede Gruppe eine Ueberschrift
                        printf OUTFILE "\n<tr><th>%s</th></tr>\n", 
$agroup->{'Text'};
                }

                foreach $adata (@{$data{$agroup->{'Link'}}}){
                        if ($adata->{'Level'}<=$navbarlevel){
                                        # wenn kein link angegeben ist, ist es 
eine Ueberschrift
                        if ($adata->{'Link'} eq "") {
                                printf OUTFILE
                                "    <tr><td> %s </td></tr>\n",
                                # wenn kein Text definiert ist, wird eine 
Freizelle verwendet
                                ($adata->{'Text'} ne "")? $adata->{'Text'}:'';
                        }
                        else {
                                printf OUTFILE
                                "    <tr><td> <a href=\"%s\" title=\"%s\"> %s 
</a></td></tr>\n",
                                $adata->{'Link'},
                                ($adata->{'Beschreibung'} ne "")?  
$adata->{'Beschreibung'}:" ",
                                # wenn kein Text definiert ist, wird Ein Dummy 
verwendet
                                ($adata->{'Text'} ne "")? 
$adata->{'Text'}:'Dummy';
                        }
                        }
                } # foreach adata
        } # katogorie

        print OUTFILE $navbarfuss;
        close OUTFILE;
} # foreach perl-navbar











---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Antwort per Email an