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/ü/ü/; $title =~ s/Ü/Ü/; $title =~ s/ö/ö/; $title =~ s/Ö/Ö/; $title =~ s/ä/ä/; $title =~ s/Ä/Ä/; $title =~ s/ß/ß/; 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]
