zeroclickinfo-goodies/lib/DDG/Goodie/IndependenceDay.pm

89 lines
2.6 KiB
Perl

package DDG::Goodie::IndependenceDay;
# ABSTRACT: Goodie answer for different countries' national independence days
use strict;
use DDG::Goodie;
use JSON;
use utf8;
zci answer_type => "independence_day";
zci is_cached => 1;
name "independence day";
description "Gives the date of when a nation assumed independence";
primary_example_queries "what is the independence day of norway", "independence day, papua new guinea";
category "dates";
topics "trivia";
code_url "https://github.com/duckduckgo/zeroclickinfo-goodies/blob/master/lib/DDG/Goodie/IndependenceDay.pm";
attribution github => ["jarmokivekas", "Jarmo Kivekäs"],
web => ["http://guttula.com", "Jarmo Kivekäs"],
github => ["YouriAckx", "Youri Ackx"],
twitter => ["YouriAckx", "Youri Ackx"];
# Triggers
triggers any => "independence day", "day of independence";
# uses https://en.wikipedia.org/wiki/List_of_national_independence_days as data source
my $data = share('independence_days.json')->slurp;
$data = decode_json($data);
# define aliases for some countries to improve hit rate
my $alias_lookup = share('country_aliases.json')->slurp;
$alias_lookup = decode_json($alias_lookup);
# Handle statement
handle query_clean => sub {
# delete noise from query string
s/(national|independence of|independence|day of|day|when|what|is the|for|)//g;
# delete the whitespace left from query noise (spaces between words)
s/^\s*|\s*$//g;
# only the name of the country should be left in the string at this point
# convert a possible alias into the proper name
my $country_key = $alias_lookup->{$_} || $_;
# return if the string is not one of the countries
return unless $data->{$country_key};
# Format the country name properly for display
my $country = $country_key;
# Title Case The Country Name
$country =~ s/(\w\S*)/\u\L$1/g;
# lowercase the words 'of', 'the' and 'and'
$country =~ s/\sThe\s/ the /;
$country =~ s/\sOf\s/ of /;
$country =~ s/\sAnd\s/ and /;
# ouput string formatting
my $prolog = 'Independence Day of ' . $country;
# date and year of independence
my $date_str = $data->{$country_key}[0]{'date'} . ', ' . $data->{$country_key}[0]{'year'};
# Some coutries have two dates, add it to the answer if a second one exists.
if ($data->{$country_key}[1]){
$date_str .= ' and ' . $data->{$country_key}[1]{'date'} . ', ' . $data->{$country_key}[1]{'year'};
}
my $text = $prolog . ' ' . $date_str;
return $text,
structured_answer => {
input => [],
operation => $prolog,
result => $date_str
};
};
1;