aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoelle Maslak <jmaslak@antelope.net>2019-07-27 21:16:09 -0600
committerJoelle Maslak <jmaslak@antelope.net>2019-07-27 21:16:09 -0600
commitfd4db1e412aa438c7930e14737d88f6d7c795952 (patch)
tree7bb06df6503ccd20616401b3fef91b03ce9ef468
parent09c939971bda04e5ce794ffc500779115ce60f42 (diff)
downloadperlweeklychallenge-club-fd4db1e412aa438c7930e14737d88f6d7c795952.tar.gz
perlweeklychallenge-club-fd4db1e412aa438c7930e14737d88f6d7c795952.tar.bz2
perlweeklychallenge-club-fd4db1e412aa438c7930e14737d88f6d7c795952.zip
Solutions for 18.3 in P6 and P5
-rwxr-xr-xchallenge-018/joelle-maslak/perl5/ch-3.pl105
-rwxr-xr-xchallenge-018/joelle-maslak/perl6/ch-3.p6102
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>";
+ }
+ }
+}
+