diff --git a/lib/DDG/Goodie/TwelveOclock.pm b/lib/DDG/Goodie/TwelveOclock.pm new file mode 100644 index 000000000..6883bac41 --- /dev/null +++ b/lib/DDG/Goodie/TwelveOclock.pm @@ -0,0 +1,63 @@ +package DDG::Goodie::TwelveOclock; +# ABSTRACT: Determine whether 12:00 is midnight or noon. + +use DDG::Goodie; + +zci answer_type => "twelve_oclock"; +zci is_cached => 1; + +primary_example_queries "is 12:00am noon?", "is 1200pm midnight?"; +secondary_example_queries "when is noon?", "when is midnight?"; +description "Succinct explanation of what this instant answer does"; +name "TwelveOclock"; +code_url "https://github.com/duckduckgo/zeroclickinfo-spice/blob/master/lib/DDG/Spice/TwelveOclock.pm"; +category "reference"; +topics "everyday"; +attribution github => ['https://github.com/duckduckgo', 'duckduckgo']; + +# Triggers +triggers any => "midnight", "noon"; + +# 12am; 12:00PM; when is noon?; when is midnight +my $question_re = qr/(?:\b12(?:00|:00)?\s?(?[ap]m)\b|^when is (?noon|midnight)\??$)/; +my %answers = ( + am => 'midnight', + pm => 'noon', +); +%answers = (%answers, reverse %answers); # Point both ways to answer either direction. + +# Handle statement +handle query => sub { + my $query = lc shift; + + $query =~ s/\.//g; # Strip any dots. + return unless ($query =~ $question_re); + my $included_mer = $+{'mer'}; + my $meridian = $included_mer || $answers{$+{'q'}}; # No included meridian implies straight-forward question. + my $to_show = $answers{$meridian}; + return unless $to_show; + + my $guess_result = ''; + if ($included_mer) { + # If they included a meridian with their 12 o'clock, we need to figure out if they were guessing. + my $noon = ($query =~ qr/\bnoon\b/); + my $midnight = ($query =~ qr/\bmidnight\b/); + + # It's only a guess if they mention only one or the other. + my $guess = ($noon && !$midnight) ? 'noon' : ($midnight && !$noon) ? 'midnight' : ''; + # If they guessed, we need to answer the question they asked. + $guess_result = (!$guess) ? '' : ($guess eq $to_show) ? 'Yes, ' : 'No, '; + } + my $answer = $guess_result . '12:00' . $meridian . ' is ' . $to_show . '.'; + + return $answer, html => format_html($answer); +}; + + +sub format_html { + my ($answer) = @_; + + return "
" . $answer . "
"; +} + +1; diff --git a/share/goodie/twelve_oclock/twelve_oclock.css b/share/goodie/twelve_oclock/twelve_oclock.css new file mode 100644 index 000000000..196b1058b --- /dev/null +++ b/share/goodie/twelve_oclock/twelve_oclock.css @@ -0,0 +1,6 @@ +.zci--answer .zci--twelveoclock { + font-size: 1.5em; + font-weight: 300; + padding-top: .25em; + padding-bottom: .25em; +} diff --git a/t/TwelveOclock.t b/t/TwelveOclock.t new file mode 100644 index 000000000..bb2b61eb6 --- /dev/null +++ b/t/TwelveOclock.t @@ -0,0 +1,41 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Test::More; +use DDG::Test::Goodie; + +zci answer_type => "twelve_oclock"; +zci is_cached => 1; + +my @noon = ('12:00pm is noon.', html => qr/12:00pm is noon./); +my @correct_noon = ('Yes, 12:00pm is noon.', html => qr/Yes, 12:00pm is noon./); +my @wrong_noon = ('No, 12:00pm is noon.', html => qr/No, 12:00pm is noon./); +my @midnight = ('12:00am is midnight.', html => qr/12:00am is midnight./); +my @correct_midnight = ('Yes, 12:00am is midnight.', html => qr/Yes, 12:00am is midnight./); +my @wrong_midnight = ('No, 12:00am is midnight.', html => qr/No, 12:00am is midnight./); + +ddg_goodie_test([qw( + DDG::Goodie::TwelveOclock + ) + ], + 'is 1200a.m. noon' => test_zci(@wrong_midnight), + 'is 1200pm noon?' => test_zci(@correct_noon), + 'is 12:00 am midnight' => test_zci(@correct_midnight), + 'is 12:00 pm midnight?' => test_zci(@wrong_noon), + 'is 12:00 p.m. midnight?' => test_zci(@wrong_noon), + 'is 12:00 AM midnight?' => test_zci(@correct_midnight), + 'noon is 12:00 p.m.' => test_zci(@correct_noon), + 'midnight is 12 AM' => test_zci(@correct_midnight), + 'is 12:00P.M. midnight or noon?' => test_zci(@noon), + 'is 12am noon or midnight' => test_zci(@midnight), + 'when is midnight' => test_zci(@midnight), + 'when is noon?' => test_zci(@noon), + 'threat level midnight' => undef, + '12 midnight' => undef, + 'midnight movies' => undef, + 'when is the midnight showing?' => undef, + 'when is noon in Jakarta?' => undef, +); + +done_testing;