#!/usr/bin/perl -w # file KLEIDER/web/src/favourites/sums.pl # aufgeschlüsselte Summen der Besuche # 2017-06-21 Herbert Schiemann # GPL Version 2 oder neuer use Cwd qw(realpath) ; use Herbaer::Readargs ; use Herbaer::XMLDataWriter ; use utf8; binmode (STDIN, ":utf8") ; binmode (STDOUT, ":utf8") ; binmode (STDERR, ":utf8") ; my $basedir = realpath($0); $basedir =~ s/\/src\/favourites\/sums\.pl//; # Hash der Kommandozeilen-Argumente my $args = { "[cnt]verbose" => 1, }; # gibt die Version nach STDOUT aus sub version { print <<'VERSION' ; KLEIDER/web/src/favourites/sums.pl aufgeschlüsselte Summen der Zahlen der Besuche 2017 Herbert Schiemann VERSION } $args -> {"[sr]version"} = sub { version (); exit 0; }; $args -> {"[sr]help"} = sub { version (); print_message_with_values (<<'HELP', $args); sums.pl [Optionen] --[no_]verbose Umfang der Meldungen ${[cnt]verbose} HELP exit 0; }; my $data = { # Anzahl der Besuche je Sprache "numvisits" => {}, # Besuche je Stories und Sprache "numstories" => {}, # Besuche je Bild und Sprache "numimages" => {}, # Bilder je Story und Sprache "imgsl" => {}, # Bilder je Sprache "imgl" => {}, # Stories je Sprache "stol" => {}, }; my $xml_options = { '%numstories' => ["numstories", "bylang", '@story'], '%numimages' => ["numimages", "bylang", '@image'], '%numvisits' => ["numvisits", "bylang", '@lang'], '%bylang' => ["", "num", '@lang'], '$bylang' => ["num"], '%favstories' => ["", "favstories", '@lang'], '@favstories' => ["favstories", "favstory" ], '%favimages' => ["", "favimages", '@lang'], '@favimages' => ["favimages", "favimage" ], '@favlang' => ["favlangs", "favlang"], }; read_args ($args); read_nums ($args, $data); find_favourites ($args, $data); clear_data ($args, $data); write_data ($args, $data); sub read_nums { my ($args, $data) = @_; my $verb = $args -> {"[cnt]verbose"}; my $l; my $h = {}; my $id; my $lg; my $n; print STDERR "lese Daten\n" if $verb; while ($l = ) { if ( $l =~ /^IMG\s+(\S+)\s+(\S+)\s+(\d+)\s*$/ ) { $id = $1; $lg = $2; $n = $3; $h -> {$id} -> {$lg} += $n; if ( $id =~ /^([^\/]*)\// ) { $data -> {"imgsl"} -> {$1} -> {$lg} += $n; $data -> {"imgl" } -> {$lg} += $n; } } elsif ( $l =~ /^STO\s+(\S+)\s+(\S+)\s+(\d+)\s*$/ ) { $h -> {$1} -> {$2} += $3; $data -> {"stol"} -> {$2} += $3; } elsif ( $l =~ /^LANG\s+(\S+)\s+(\d+)\s*$/ ) { $h -> {$1} += $2; } elsif ( $l =~ /^STORIES$/ ) { $h = $data -> {"numstories"}; } elsif ( $l =~ /^IMAGES$/ ) { $h = $data -> {"numimages"}; } elsif ( $l =~ /^VISITS$/ ) { $h = $data -> {"numvisits"}; } elsif ( $l =~ /^LAST\s+(\S+)\s*$/ ) { if (! $data -> {"last_time"} || $data -> {"last_time"} lt $1) { $data -> {"last_time"} = $1; } } else { print STDERR "Kann Eingabezeile nicht verstehen:\n$l\n" if $verb; } } } # read_nums my $i; my $d; sub compare { for ( $i = 1; $i < @$a; ++$i) { $d = $b->[$i] - $a->[$i]; last if $d; } return $d; } sub find_favourites { my ($args, $data) = @_; my $verb = $args -> {"[cnt]verbose"}; # beliebte Sprachen print STDERR "beliebte Sprachen\n" if $verb; my $ar; my $li; my $id; my $stories = [ keys %{$data -> {"numstories"}} ]; my $langs = [ keys %{$data -> {"numvisits"}} ]; my $images = [ keys %{$data -> {"numimages"}} ]; $ar = [ map {[ $_ ];} @$langs ]; for $li ( @$ar ) { $id = $li -> [0]; push ( @$li, $data -> {"numvisits"} -> {$id} || 0, $data -> {"stol"} -> {$id} || 0, $data -> {"imgl"} -> {$id} || 0, ); } $ar = [ sort compare @$ar ]; $data -> {"favlang"} = [ map { { "lang" => $_->[0], "visits" => $_->[1], "stories" => $_->[2], "images" => $_->[3], } } @$ar ]; # beliebte Bildergeschichten print STDERR "beliebte Bildergeschichten\n" if $verb; my $lg; # Sprach-Kennung for $lg (@$langs) { $ar = [ map {[ $_ ];} @$stories ]; for $li ( @$ar ) { $id = $li -> [0]; push ( @$li, $data -> {"numstories"} -> {$id} -> {$lg} || 0, $data -> {"imgsl"} -> {$id} -> {$lg} || 0, $data -> {"numstories"} -> {$id} -> {"total"} || 0, $data -> {"imgsl"} -> {$id} -> {"total"} || 0, ); } $ar = [ sort compare @$ar ]; $data -> {"favstories"} -> {$lg} = [ map { { "story" => $_->[0], "visits" => $_->[1], "stoimg" => $_->[2], "total" => $_->[3], "sitot" => $_->[4], } } @$ar ]; } # beliebte Bilder print STDERR "beliebte Bilder\n" if $verb; my $st; # story-ID for $lg (@$langs) { $ar = [ map {[ $_ ];} @$images ]; for $li ( @$ar ) { $id = $li -> [0]; if ( $id =~ /^([^\/]+)\// ) { $sid = $1; } else { $sid = "error"; } push ( @$li, $data -> {"numimages"} -> {$id} -> {$lg} || 0, $data -> {"imgsl"} -> {$sid} -> {$lg} || 0, $data -> {"numstories"} -> {$sid} -> {$lg} || 0, $data -> {"numimages"} -> {$id} -> {"total"} || 0, $data -> {"imgsl"} -> {$sid} -> {"total"} || 0, $data -> {"numstories"} -> {$sid} -> {"total"} || 0, ); } $ar = [ sort compare @$ar ]; $data -> {"favimages"} -> {$lg} = [ map { { "imgid" => $_->[0], "visits" => $_->[1], "stoimg" => $_->[2], "story" => $_->[3], "total" => $_->[4], "sitot" => $_->[5], "stotot" => $_->[6], } } @$ar ]; } } # find_favourites sub clear_data { my ($args, $data) = @_; print STDERR "lösche Zwischendaten\n" if $args -> {"[cnt]verbose"}; $data -> {"imgsl"} = undef; $data -> {"imgl"} = undef; $data -> {"stol"} = undef; } # clear_data sub write_data { my ($args, $data) = @_; print STDERR "gebe Daten aus\n" if $args -> {"[cnt]verbose"}; my $xmlwriter = new Herbaer::XMLDataWriter ( $xml_options, "utf-8", "http://herbaer.de/xmlns/20170605/visits/" ); $xmlwriter -> write ("visits", {}, $data); } # write_data # end of file KLEIDER/web/src/favourites/sums.pl