handle plural units, general cleanup
parent
6bfad61a04
commit
95cf8f5863
|
@ -3,61 +3,93 @@ package DDG::Goodie::Conversions;
|
||||||
|
|
||||||
use DDG::Goodie;
|
use DDG::Goodie;
|
||||||
use Scalar::Util qw(looks_like_number);
|
use Scalar::Util qw(looks_like_number);
|
||||||
use Math::Round;
|
|
||||||
|
|
||||||
# metric ton is base unit
|
# metric ton is base unit
|
||||||
# known SI units and aliases
|
# known SI units and aliases / plurals
|
||||||
my %units = (
|
my %units = (
|
||||||
# metric ton:
|
# metric ton:
|
||||||
'metric ton' => '1',
|
'metric ton' => '1',
|
||||||
'tonne' => '1',
|
'tonne' => '1',
|
||||||
't' => '1',
|
't' => '1',
|
||||||
'mt' => '1',
|
'mt' => '1',
|
||||||
'te' => '1',
|
'te' => '1',
|
||||||
|
'metric tons' => '1',
|
||||||
|
'tonnes' => '1',
|
||||||
|
'ts' => '1',
|
||||||
|
'mts' => '1',
|
||||||
|
'tes' => '1',
|
||||||
|
|
||||||
# kilogram:
|
# kilogram:
|
||||||
'kilogram' => '1000',
|
'kilogram' => '1000',
|
||||||
'kg' => '1000',
|
'kg' => '1000',
|
||||||
'kilo' => '1000',
|
'kilo' => '1000',
|
||||||
'kilogramme' => '1000',
|
'kilogramme' => '1000',
|
||||||
|
'kilograms' => '1000',
|
||||||
|
'kgs' => '1000',
|
||||||
|
'kilos' => '1000',
|
||||||
|
'kilogrammes' => '1000',
|
||||||
|
|
||||||
# gram:
|
# gram:
|
||||||
'gram' => '1000000',
|
'gram' => '1000000',
|
||||||
'g' => '1000000',
|
'g' => '1000000',
|
||||||
'gm' => '1000000',
|
'gm' => '1000000',
|
||||||
'gramme' => '1000000',
|
'gramme' => '1000000',
|
||||||
|
'grams' => '1000000',
|
||||||
|
'gs' => '1000000',
|
||||||
|
'gms' => '1000000',
|
||||||
|
'grammes' => '1000000',
|
||||||
|
|
||||||
# milligram:
|
# milligram:
|
||||||
'milligram' => '1000000000',
|
'milligram' => '1000000000',
|
||||||
'mg' => '1000000000',
|
'mg' => '1000000000',
|
||||||
|
'milligrams' => '1000000000',
|
||||||
|
'mgs' => '1000000000',
|
||||||
|
|
||||||
# microgram:
|
# microgram:
|
||||||
'microgram' => '1000000000',
|
'microgram' => '1000000000',
|
||||||
'mcg' => '1000000000',
|
'mcg' => '1000000000',
|
||||||
|
'micrograms' => '1000000000',
|
||||||
|
'mcgs' => '1000000000',
|
||||||
|
|
||||||
# long ton:
|
# long ton:
|
||||||
'long ton' => '0.984207',
|
'long ton' => '0.984207',
|
||||||
'weight ton' => '0.984207',
|
'weight ton' => '0.984207',
|
||||||
'imperial ton' => '0.984207',
|
'imperial ton' => '0.984207',
|
||||||
|
'long tons' => '0.984207',
|
||||||
|
'weight tons' => '0.984207',
|
||||||
|
'imperial tons' => '0.984207',
|
||||||
|
|
||||||
# short ton:
|
# short ton:
|
||||||
'short ton' => '1.10231',
|
'short ton' => '1.10231',
|
||||||
'ton' => '1.10231',
|
'ton' => '1.10231',
|
||||||
|
'short tons' => '1.10231',
|
||||||
|
'tons' => '1.10231',
|
||||||
|
|
||||||
# stone:
|
# stone:
|
||||||
'stone' => '157.473',
|
'stone' => '157.473',
|
||||||
'st' => '157.473',
|
'st' => '157.473',
|
||||||
|
'stones' => '157.473',
|
||||||
|
'sts' => '157.473',
|
||||||
|
|
||||||
# pound:
|
# pound:
|
||||||
'pound' => '2204.62',
|
'pound' => '2204.62',
|
||||||
'lb' => '2204.62',
|
'lb' => '2204.62',
|
||||||
'lbm' => '2204.62',
|
'lbm' => '2204.62',
|
||||||
'pound mass' => '2204.62',
|
'pound mass' => '2204.62',
|
||||||
|
'pounds' => '2204.62',
|
||||||
|
'lbs' => '2204.62',
|
||||||
|
'lbms' => '2204.62',
|
||||||
|
'pounds mass' => '2204.62',
|
||||||
|
|
||||||
# ounce:
|
# ounce:
|
||||||
'ounce' => '35274',
|
'ounce' => '35274',
|
||||||
'oz' => '35274',
|
'oz' => '35274',
|
||||||
|
'ounces' => '35274',
|
||||||
|
'ozs' => '35274',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# match longest possible key (some keys are sub-keys of other keys):
|
||||||
|
my $keys = join '|', reverse sort { length($a) <=> length($b) } keys %units;
|
||||||
|
|
||||||
# build triggers based on available conversion units:
|
# build triggers based on available conversion units:
|
||||||
triggers startend => keys %units;
|
triggers startend => keys %units;
|
||||||
|
@ -67,7 +99,7 @@ description 'convert between various weights and measures';
|
||||||
category 'calculations';
|
category 'calculations';
|
||||||
topics 'computing', 'math';
|
topics 'computing', 'math';
|
||||||
primary_example_queries 'convert 5 oz to grams';
|
primary_example_queries 'convert 5 oz to grams';
|
||||||
secondary_example_queries '5 ounces to g';
|
secondary_example_queries '5 ounces to g', 'metric ton stone';
|
||||||
code_url 'https://github.com/duckduckgo/zeroclickinfo-goodies/blob/master/lib/DDG/Goodie/Conversions.pm';
|
code_url 'https://github.com/duckduckgo/zeroclickinfo-goodies/blob/master/lib/DDG/Goodie/Conversions.pm';
|
||||||
attribution github => ['https://github.com/elohmrow', '/bda'],
|
attribution github => ['https://github.com/elohmrow', '/bda'],
|
||||||
email => ['bradley@pvnp.us'];
|
email => ['bradley@pvnp.us'];
|
||||||
|
@ -75,9 +107,7 @@ attribution github => ['https://github.com/elohmrow', '/bda'],
|
||||||
zci answer_type => 'conversions';
|
zci answer_type => 'conversions';
|
||||||
|
|
||||||
handle query => sub {
|
handle query => sub {
|
||||||
# match longest possible key (some keys are sub-keys of other keys):
|
my @matches = ($_ =~ /\b($keys)\b/gi);
|
||||||
my $keys = join '|', reverse sort { length($a) <=> length($b) } keys %units;
|
|
||||||
my @matches = ($_ =~ /\b($keys)s?\b/gi);
|
|
||||||
|
|
||||||
return unless scalar @matches == 2; # conversion requires two triggers
|
return unless scalar @matches == 2; # conversion requires two triggers
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,15 @@ ddg_goodie_test(
|
||||||
'convert 0.111 stone to pound' => test_zci('0.111 stone is 1.554 pound',),
|
'convert 0.111 stone to pound' => test_zci('0.111 stone is 1.554 pound',),
|
||||||
'mcg to mcg' => test_zci('1 mcg is 1.000 mcg',),
|
'mcg to mcg' => test_zci('1 mcg is 1.000 mcg',),
|
||||||
'3 kilogramme to pound' => test_zci('3 kilogramme is 6.614 pound',),
|
'3 kilogramme to pound' => test_zci('3 kilogramme is 6.614 pound',),
|
||||||
'1.3 tonnes to ton' => test_zci('1.3 tonne is 1.433 ton',),
|
'1.3 tonnes to ton' => test_zci('1.3 tonnes is 1.433 ton',),
|
||||||
'stone pound' => test_zci('1 stone is 14.000 pound',),
|
'stone pound' => test_zci('1 stone is 14.000 pound',),
|
||||||
'gram pound convert' => test_zci('1 gram is 0.002 pound',),
|
'gram pound convert' => test_zci('1 gram is 0.002 pound',),
|
||||||
"convert 1 ton to long ton" => test_zci('1 ton is 0.893 long ton',),
|
"convert 1 ton to long ton" => test_zci('1 ton is 0.893 long ton',),
|
||||||
'puff toke to kludge' => undef,
|
'puff toke to kludge' => undef,
|
||||||
|
'2 tons to kg' => test_zci('2 tons is 1814.372 kg',),
|
||||||
|
'1 ton to kilos' => test_zci('1 ton is 907.186 kilos',),
|
||||||
|
'3.9 oz g' => test_zci('3.9 oz is 110.563 g',),
|
||||||
|
'convert -9 g to ozs' => undef,
|
||||||
);
|
);
|
||||||
|
|
||||||
done_testing;
|
done_testing;
|
||||||
|
|
Loading…
Reference in New Issue