diff --git a/app/MetaGer.php b/app/MetaGer.php index 9f7534d2195780e393a812f0b38dd5317a4ee032..6e772025d4e41254cf486c1887b75ee3d4fbacfe 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -157,6 +157,10 @@ class MetaGer // combine $combinedResults = $this->combineResults($engines); + + # Wir bestimmen die Sprache eines jeden Suchergebnisses + $this->results = $this->addLangCodes($this->results); + // sort //$sortedResults = $this->sortResults($engines); // filter @@ -260,6 +264,47 @@ class MetaGer } + private function addLangCodes($results) + { + # Bei der Spracheinstellung "all" wird nicht gefiltert + if ($this->getLang() === "all") { + return $results; + } else { + # Ansonsten müssen wir jedem Result einen Sprachcode hinzufügen + $id = 0; + $langStrings = []; + foreach ($results as $result) { + # Wir geben jedem Ergebnis eine ID um später die Sprachcodes zuordnen zu können + $result->id = $id; + + $langStrings["result_" . $id] = utf8_encode($result->getLangString()); + + $id++; + } + # Wir schreiben die Strings in eine temporäre JSON-Datei, + # Da das Array unter umständen zu groß ist für eine direkte Übergabe an das Skript + $filename = "/tmp/" . getmypid(); + file_put_contents($filename, json_encode($langStrings)); + $langDetectorPath = app_path() . "/Models/lang.pl"; + $lang = exec("echo '$filename' | $langDetectorPath"); + $lang = json_decode($lang, true); + + # Wir haben nun die Sprachcodes der einzelnen Ergebnisse. + # Diese müssen wir nur noch korrekt zuordnen, dann sind wir fertig. + foreach ($lang as $key => $langCode) { + # Prefix vom Key entfernen: + $id = intval(str_replace("result_", "", $key)); + foreach ($this->results as $result) { + if ($result->id === $id) { + $result->langCode = $langCode; + break; + } + } + } + return $results; + } + } + public function combineResults($engines) { foreach ($engines as $engine) { diff --git a/app/Models/Result.php b/app/Models/Result.php index 73d0579f2c9d967be4f5563c7f09b40402c67425..e38c5facaab1fc9aafeb2a58a2a59cff13acb104 100644 --- a/app/Models/Result.php +++ b/app/Models/Result.php @@ -189,12 +189,8 @@ class Result } # Eventueller Sprachfilter - if ($metager->getLang() !== "all") { - $text = $this->titel . " " . $this->descr; - $path = app_path() . "/Models/lang.pl"; - $lang = exec("echo '$text' | $path"); - - if ($metager->getLang() !== $lang) { + if ($metager->getLang() !== "all" && isset($this->langCode)) { + if ($metager->getLang() !== $this->langCode) { return false; } @@ -310,4 +306,14 @@ class Result { return $this->rank; } + + public function getLangString() + { + $string = ""; + + $string .= $this->titel; + $string .= $this->descr; + + return $string; + } } diff --git a/app/Models/lang.pl b/app/Models/lang.pl index fe071d8a46ced99f3f45a8b641e17d05c014f687..63b62fab4a3bf7f0348c581b25b8b7ebe271a7e4 100755 --- a/app/Models/lang.pl +++ b/app/Models/lang.pl @@ -1,10 +1,32 @@ #!/usr/bin/perl use Lingua::Identify qw(:language_identification); +use JSON; +use warnings; +use strict; +binmode STDOUT, ":utf8"; +binmode STDIN, ":utf8"; +use utf8; -$text = <STDIN>; +chomp(my $filename = <STDIN>); -$a = langof($text); +# Lets open the given file: +open(my $fh, "<", $filename) + or die "Can't open < $filename: $!"; +my $json = <$fh>; +close $fh; -print $a; +# Decode the JSON String +my $data = decode_json($json); +# Wir durchlaufen den Hash: +foreach my $key (keys %{$data}){ + $data->{$key} = langof($data->{$key}); +} + +$data = encode_json($data); + +# Nur noch die temporäre Datei löschen: +unlink($filename); + +print $data; diff --git a/readme.md b/readme.md index 2350b7163e0e0843bc40bd5865ea0f39710bc954..033e1313d3cb90b47667991b1122a4b1ed5d10d3 100644 --- a/readme.md +++ b/readme.md @@ -13,7 +13,9 @@ * php7.0-zip * sqlite3 * redis-server -* Das Perl-Paket: Lingua::Identify (http://search.cpan.org/~ambs/Lingua-Identify-0.56/lib/Lingua/Identify.pm) +* Die Perl-Pakete + * Lingua::Identify (http://search.cpan.org/~ambs/Lingua-Identify-0.56/lib/Lingua/Identify.pm) + * JSON (http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm) ## Offizielle Dokumentation