diff options
| -rwxr-xr-x | challenge-018/joelle-maslak/perl5/ch-3.pl | 105 | ||||
| -rwxr-xr-x | challenge-018/joelle-maslak/perl6/ch-3.p6 | 102 |
2 files changed, 207 insertions, 0 deletions
diff --git a/challenge-018/joelle-maslak/perl5/ch-3.pl b/challenge-018/joelle-maslak/perl5/ch-3.pl new file mode 100755 index 0000000000..6b4b232482 --- /dev/null +++ b/challenge-018/joelle-maslak/perl5/ch-3.pl @@ -0,0 +1,105 @@ +#!/usr/bin/env perl +use v5.26; +use strict; +use warnings; + +# Not having details of which part of the API to implement, this script +# looks up all the glosses for a given word (in the same language as the +# word itself) + +# Turn on method signatures +use feature 'signatures'; +no warnings 'experimental::signatures'; + +use autodie; +use Getopt::Long; +use Mojo::UserAgent; +use Mojo::Util qw(url_escape); +use Path::Tiny; +use Perl6::Slurp; + +MAIN: { + binmode STDOUT, ':utf8'; + + my $configfile = path( $ENV{HOME} // "", ".babelnet" )->stringify(); + my $baseurl = 'https://babelnet.io/'; + my $language = 'EN'; + GetOptions( + "base-url=s" => \$baseurl, + "config-file=s" => \$configfile, + "language=s" => \$language, + ); + die "Must provide word to look up" if @ARGV < 1; + my $word = shift(@ARGV); + + if ( @ARGV != 0 ) { die("Unknown parameter"); } + + my $secret = get_client_secret($configfile); + my (@synsets) = get_synsets( $secret, $word, $language, $baseurl ); + say "No results for word" unless @synsets; + + for my $i ( 0 .. ( @synsets - 1 ) ) { + say "" if $i; + say "Result # " . ( $i + 1 ); + + my $json = get_info( $secret, $synsets[$i]->{id}, $language, $baseurl ); + if ( $json->{glosses}->@* ) { + say " * " . join( "\n * ", map { $_->{gloss} } $json->{glosses}->@* ); + } else { + say " No glosses found"; + } + } +} + +sub get_client_secret($configfile) { + my (@lines) = grep { length($_) } slurp($configfile); + die "Config-file ($configfile) must consist of one line" if @lines != 1; + chomp $lines[0]; + return $lines[0]; +} + +sub get_synsets ( $secret, $word, $language, $baseurl ) { + my $ua = Mojo::UserAgent->new(); + $ua->max_redirects(16); + + my $tx = $ua->get( + "${baseurl}v5/getSynsetIds?lemma=" + . url_escape($word) + . "&searchLang=" + . url_escape($language) . "&key=" + . url_escape($secret), + ); + + if ( ( $tx->result->code >= 200 ) && ( $tx->result->code <= 299 ) ) { + my $json = $tx->result->json; + if ( ref($json) eq 'ARRAY' ) { + return $json->@*; + } else { + die "Error from API endpoint " . $json->{message}; + } + } + + my $body = $tx->result->json; + die "Error from API endpoint: " . $body->{message}; +} + +sub get_info ( $secret, $synset, $language, $baseurl ) { + my $ua = Mojo::UserAgent->new(); + $ua->max_redirects(16); + + my $tx = $ua->get( + "${baseurl}v5/getSynset?id=" + . url_escape($synset) + . "&targetLang=" + . url_escape($language) . "&key=" + . url_escape($secret), + ); + + if ( ( $tx->result->code >= 200 ) && ( $tx->result->code <= 299 ) ) { + return $tx->result->json; + } + + my $body = $tx->result->json; + die "Error from API endpoint: " . $body->{message}; +} + diff --git a/challenge-018/joelle-maslak/perl6/ch-3.p6 b/challenge-018/joelle-maslak/perl6/ch-3.p6 new file mode 100755 index 0000000000..37fcb1c357 --- /dev/null +++ b/challenge-018/joelle-maslak/perl6/ch-3.p6 @@ -0,0 +1,102 @@ +#!/usr/bin/env perl6 +use v6; + +# Not having details of whcih part of the API to implement, this script +# looks up all the glosses for a given word (in the same language as the +# word itself) + +use Cro::HTTP::Client; +use URI::Encode; + +sub MAIN( + Str:D $word, + Str:D :$language? = 'EN', + Str:D :$config-file? = $*HOME.add(".babelnet").Str, + Str:D :$base-url = 'https://babelnet.io/', +) { + my @synsets = get-synsets(:$config-file, :$base-url, :$word, :$language).flat.map( { $_<id> } ); + say "No results for word" unless @synsets.elems; + + for ^(@synsets.elems) -> $i { + say "" if $i; + say "Result # {$i.succ}"; + + my $json = get-info(:$config-file, :$base-url, :$language, :synset( @synsets[$i] )); + if $json<glosses>.elems { + say " * " ~ $json<glosses>.map( { $_<gloss> } ).join("\n * "); + } else { + say " No glosses found"; + } + } +} + +sub get-client-secret(Str:D $config-file -->Str:D) { + my @lines = $config-file.IO.lines().grep( *.chars > 0 ); + die "Config-file ($config-file) must consist of one line" if @lines.elems ≠ 1; + + return @lines[0]; +} + +sub get-synsets( + Str:D :$word, + Str:D :$language, + Str:D :$base-url, + Str:D :$config-file, +) { + my $secret = get-client-secret($config-file); + + my $client = Cro::HTTP::Client.new( + base-uri => $base-url, + :!persistent, + ); + + my $resp = await $client.get( + "v5/getSynsetIds?lemma={ uri_encode_component($word) }" ~ + "&searchLang={ uri_encode_component($language) }" ~ + "&key={ uri_encode_component($secret) }", + ); + my $json = await $resp.body; + + if $json ~~ Array { + return $json; + } else { + die "Error from API endpoint: $json<message>"; + } + + CATCH { + when X::Cro::HTTP::Error { + my $body = await .response.body; + die "Error from API endpoint: $body<message>"; + } + } +} + +sub get-info( + Str:D :$synset, + Str:D :$language, + Str:D :$base-url, + Str:D :$config-file, +) { + my $secret = get-client-secret($config-file); + + my $client = Cro::HTTP::Client.new( + base-uri => $base-url, + :!persistent, + ); + + my $resp = await $client.get( + "v5/getSynset?id={ uri_encode_component($synset) }" ~ + "&targetLang={ uri_encode_component($language) }" ~ + "&key={ uri_encode_component($secret) }", + ); + my $json = await $resp.body; + return $json; + + CATCH { + when X::Cro::HTTP::Error { + my $body = await .response.body; + die "Error from API endpoint: $body<message>"; + } + } +} + |
