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

65 lines
1.9 KiB
Perl
Raw Normal View History

2013-11-14 07:00:38 -08:00
package DDG::Goodie::BloodDonor;
# ABSTRACT: Returns available donors for a blood type
use DDG::Goodie;
triggers start => 'donor', 'donors for', 'blood donor', 'blood donors for';
2013-11-14 07:00:38 -08:00
zci answer_type => "blood_donor";
primary_example_queries 'donor O+';
2013-11-14 07:00:38 -08:00
secondary_example_queries 'donor AB+';
description 'Donor types for a given blood type';
2013-11-14 07:00:38 -08:00
name 'BloodDonor';
code_url 'https://github.com/duckduckgo/zeroclickinfo-goodies/blob/master/lib/DDG/Goodie/BloodDonor.pm';
2013-11-14 07:00:38 -08:00
category 'special';
topics 'everyday';
attribution github => ['https://github.com/faraday', 'faraday'];
my %typeMap = (
'A' => 'A,O',
'O' => 'O',
'AB' => 'AB,A,B,O',
'B' => 'B,O',
);
sub table_data {
my ($label, $value) = @_;
return '<tr><td>' . $label . '&nbsp;&nbsp;&nbsp;</td><td>' . $value . "</td></tr>";
}
2013-11-14 07:00:38 -08:00
handle remainder => sub {
if ($_ =~ /^(O|A|B|AB)(\-|\+)$/i) {
2013-11-14 07:00:38 -08:00
my $type = $1;
my $rh = $2;
my @idealResults = ();
my @criticalResults = ();
# ideally same Rh
foreach our $donorType (split(",",$typeMap{$type})) {
push(@idealResults, $donorType . $rh);
if($rh eq '+') {
# only when access to same Rh is impossible
push(@criticalResults, $donorType . '-');
}
}
my $output = '';
my $html = '<table>';
my $idealStr = join(' or ', @idealResults);
my $criticalStr = join(' or ', @criticalResults);
$output .= "Ideal donor: " . $_ . "\n";
$output .= "Other donors: " . $idealStr . "\n";
$html .= table_data("Ideal donor:", $_);
$html .= table_data("Other donors:", $idealStr);
2013-11-14 07:00:38 -08:00
if($rh eq '+') {
$output .= "Only if no Rh(+) found: " . $criticalStr . "\n";
$html .= table_data("<b>Only if</b> no Rh(+) found:", $criticalStr);
2013-11-14 07:00:38 -08:00
}
$html .= '</table>';
return $output, html => $html, heading => "Donors for blood type $_";
}
return;
};
1;