From 7aef13b7e3d50a533ff03ac67cc4c56e7c68a946 Mon Sep 17 00:00:00 2001 From: Joe Walnes Date: Sat, 10 Nov 2012 20:03:41 -0600 Subject: [PATCH] Resistor colors: Show additional tolerance band. It always shows one extra color (gold = 5%). This is the most common value and showing this makes it a lot more obvious how the colors match up with a real resistor. --- lib/DDG/Goodie/ResistorColors.pm | 66 ++++++++++++++--------- t/ResistorColors.t | 89 +++++++++++++++++--------------- 2 files changed, 88 insertions(+), 67 deletions(-) diff --git a/lib/DDG/Goodie/ResistorColors.pm b/lib/DDG/Goodie/ResistorColors.pm index 0424c8c2b..456c6c6b3 100644 --- a/lib/DDG/Goodie/ResistorColors.pm +++ b/lib/DDG/Goodie/ResistorColors.pm @@ -33,26 +33,29 @@ attribution twitter => 'joewalnes', # These hex codes came from # http://en.wikipedia.org/wiki/Electronic_color_code my %digits_to_colors = ( - -2 => { hex => '#c0c0c0', label => '#000', name => 'silver', multiplier => '0.01'}, - -1 => { hex => '#cfb53b', label => '#000', name => 'gold' , multiplier => '0.1'}, - 0 => { hex => '#000000', label => '#fff', name => 'black' , multiplier => '1'}, - 1 => { hex => '#964b00', label => '#fff', name => 'brown' , multiplier => '10'}, - 2 => { hex => '#ff0000', label => '#fff', name => 'red' , multiplier => '100'}, - 3 => { hex => '#ffa500', label => '#000', name => 'orange', multiplier => '1K'}, - 4 => { hex => '#ffff00', label => '#000', name => 'yellow', multiplier => '10K'}, - 5 => { hex => '#9acd32', label => '#000', name => 'green' , multiplier => '100K'}, - 6 => { hex => '#6495ed', label => '#000', name => 'blue' , multiplier => '1M'}, - 7 => { hex => '#ee82ee', label => '#000', name => 'purple', multiplier => '10M'}, - 8 => { hex => '#a0a0a0', label => '#000', name => 'gray' , multiplier => '100M'}, - 9 => { hex => '#ffffff', label => '#000', name => 'white' , multiplier => '1000M'}, + -2 => { hex => '#c0c0c0', label => '#000', name => 'silver', multiplier => '0.01' , tolerance => '10%' }, + -1 => { hex => '#cfb53b', label => '#000', name => 'gold' , multiplier => '0.1' , tolerance => '5%' }, + 0 => { hex => '#000000', label => '#fff', name => 'black' , multiplier => '1' , tolerance => undef }, + 1 => { hex => '#964b00', label => '#fff', name => 'brown' , multiplier => '10' , tolerance => '1%' }, + 2 => { hex => '#ff0000', label => '#fff', name => 'red' , multiplier => '100' , tolerance => '2%' }, + 3 => { hex => '#ffa500', label => '#000', name => 'orange', multiplier => '1K' , tolerance => undef }, + 4 => { hex => '#ffff00', label => '#000', name => 'yellow', multiplier => '10K' , tolerance => undef }, + 5 => { hex => '#9acd32', label => '#000', name => 'green' , multiplier => '100K' , tolerance => '0.5%' }, + 6 => { hex => '#6495ed', label => '#000', name => 'blue' , multiplier => '1M' , tolerance => '0.25%' }, + 7 => { hex => '#ee82ee', label => '#000', name => 'purple', multiplier => '10M' , tolerance => '0.1%' }, + 8 => { hex => '#a0a0a0', label => '#000', name => 'gray' , multiplier => '100M' , tolerance => '0.05%' }, + 9 => { hex => '#ffffff', label => '#000', name => 'white' , multiplier => '1000M', tolerance => undef }, ); +my $default_tolerance = -1; # 5% / gold + handle matches => sub { my $input = shift; my $value = parse_value($input); if (defined $value && ($value == 0 || ($value <= 99900000000 && $value >= 1))) { $value = round_to_significant_places($value, 2); - my @digits = number_to_color_digits($value); + my $tolerance = $default_tolerance; # Currently always 5%. + my @digits = number_to_color_digits($value, $tolerance); return render($value, \@digits); } return; @@ -93,16 +96,17 @@ sub round_to_significant_places { return nearest(pow(10, int(floor(log10(abs($value))) - ($significant - 1))), $value); } -# Given ohm rating as integer (e.g. 470000), return -# array of color digits (e.g. 4, 7, 0, 3). See %digits_to_colors. +# Given ohm rating as integer, and tolerance digit (e.g. 470000, -1), return +# array of color digits (e.g. 4, 7, 0, 3, -1). See %digits_to_colors. sub number_to_color_digits { - my $value = shift; - return (0, 0, 0) if $value == 0; # special case + my ($value, $tolerance) = @_; + return (0, 0, 0, $tolerance) if $value == 0; # special case my @value_digits = split(//, $value * 100); return ( $value_digits[0] || 0, $value_digits[1] || 0, - scalar(@value_digits) - 4); + scalar(@value_digits) - 4, + $tolerance); }; # Given a numeric value, format it like '3.2M' etc. @@ -134,14 +138,28 @@ sub render { my $style = "display:inline-block;background-color:$hex;color:$label;" . "border:1px solid #c8c8c8;margin-top:-1px;padding:0px 4px;" . "border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px;"; - if ($index == scalar(@$digits) - 1) { - my $multiplier = $digits_to_colors{$digit}{multiplier}; - $text .= " $name (\x{00D7}$multiplier)"; - $html .= " $name (×$multiplier)"; + my ($text_prefix, $html_prefix, $display_digit); + if ($index == scalar(@$digits) - 2) { + # multiplier digit + $text_prefix = "\x{00D7}"; + $html_prefix = '×'; + $display_digit = $digits_to_colors{$digit}{multiplier}; + } elsif ($index == scalar(@$digits) - 1) { + # tolerance digit + $text_prefix = "\x{00B1}"; + $html_prefix = '±'; + $display_digit = $digits_to_colors{$digit}{tolerance}; } else { - $text .= " $name ($digit),"; - $html .= " $name ($digit)"; + # numeric digits + $text_prefix = ''; + $html_prefix = ''; + $display_digit = $digit; } + $text .= " $name ($text_prefix$display_digit)"; + if ($index != scalar(@$digits - 1)) { + $text .= ','; # Comma delimit all but last + } + $html .= " $name ($html_prefix$display_digit)"; } else { return; } diff --git a/t/ResistorColors.t b/t/ResistorColors.t index 38367e724..4615fa1fb 100644 --- a/t/ResistorColors.t +++ b/t/ResistorColors.t @@ -14,62 +14,62 @@ ddg_goodie_test( )], # Check trigger kicks in. - "330 ohms" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10)", html => qr/./), - "330 ohm" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10)", html => qr/./), - "330 \x{2126}" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10)", html => qr/./), - "330ohms" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10)", html => qr/./), - "330ohm" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10)", html => qr/./), - "330\x{2126}" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10)", html => qr/./), + "330 ohms" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), + "330 ohm" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), + "330 \x{2126}" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), + "330ohms" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), + "330ohm" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), + "330\x{2126}" => test_zci("330\x{2126} (ohms) resistor colors: orange (3), orange (3), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), # Various multipliers - "472000 ohms" => test_zci("470K\x{2126} (ohms) resistor colors: yellow (4), purple (7), yellow (\x{00D7}10K)", html => qr/./), - "400000 ohms" => test_zci("400K\x{2126} (ohms) resistor colors: yellow (4), black (0), yellow (\x{00D7}10K)", html => qr/./), - "12300 ohms" => test_zci("12K\x{2126} (ohms) resistor colors: brown (1), red (2), orange (\x{00D7}1K)", html => qr/./), + "472000 ohms" => test_zci("470K\x{2126} (ohms) resistor colors: yellow (4), purple (7), yellow (\x{00D7}10K), gold (\x{00B1}5%)", html => qr/./), + "400000 ohms" => test_zci("400K\x{2126} (ohms) resistor colors: yellow (4), black (0), yellow (\x{00D7}10K), gold (\x{00B1}5%)", html => qr/./), + "12300 ohms" => test_zci("12K\x{2126} (ohms) resistor colors: brown (1), red (2), orange (\x{00D7}1K), gold (\x{00B1}5%)", html => qr/./), # Rounding - "1.2345 ohms" => test_zci("1.2\x{2126} (ohms) resistor colors: brown (1), red (2), gold (\x{00D7}0.1)", html => qr/./), - "1.2555 ohms" => test_zci("1.3\x{2126} (ohms) resistor colors: brown (1), orange (3), gold (\x{00D7}0.1)", html => qr/./), - "12.345 ohms" => test_zci("12\x{2126} (ohms) resistor colors: brown (1), red (2), black (\x{00D7}1)", html => qr/./), - "12.555 ohms" => test_zci("13\x{2126} (ohms) resistor colors: brown (1), orange (3), black (\x{00D7}1)", html => qr/./), - "123.45 ohms" => test_zci("120\x{2126} (ohms) resistor colors: brown (1), red (2), brown (\x{00D7}10)", html => qr/./), - "125.55 ohms" => test_zci("130\x{2126} (ohms) resistor colors: brown (1), orange (3), brown (\x{00D7}10)", html => qr/./), - "1234.5 ohms" => test_zci("1.2K\x{2126} (ohms) resistor colors: brown (1), red (2), red (\x{00D7}100)", html => qr/./), - "1255.5 ohms" => test_zci("1.3K\x{2126} (ohms) resistor colors: brown (1), orange (3), red (\x{00D7}100)", html => qr/./), - "12345 ohms" => test_zci("12K\x{2126} (ohms) resistor colors: brown (1), red (2), orange (\x{00D7}1K)", html => qr/./), - "12555 ohms" => test_zci("13K\x{2126} (ohms) resistor colors: brown (1), orange (3), orange (\x{00D7}1K)", html => qr/./), - "123450 ohms" => test_zci("120K\x{2126} (ohms) resistor colors: brown (1), red (2), yellow (\x{00D7}10K)", html => qr/./), - "125550 ohms" => test_zci("130K\x{2126} (ohms) resistor colors: brown (1), orange (3), yellow (\x{00D7}10K)", html => qr/./), - "1234500 ohms" => test_zci("1.2M\x{2126} (ohms) resistor colors: brown (1), red (2), green (\x{00D7}100K)", html => qr/./), - "1255500 ohms" => test_zci("1.3M\x{2126} (ohms) resistor colors: brown (1), orange (3), green (\x{00D7}100K)", html => qr/./), - "12345000 ohms" => test_zci("12M\x{2126} (ohms) resistor colors: brown (1), red (2), blue (\x{00D7}1M)", html => qr/./), - "12555000 ohms" => test_zci("13M\x{2126} (ohms) resistor colors: brown (1), orange (3), blue (\x{00D7}1M)", html => qr/./), - "123450000 ohms" => test_zci("120M\x{2126} (ohms) resistor colors: brown (1), red (2), purple (\x{00D7}10M)", html => qr/./), - "125550000 ohms" => test_zci("130M\x{2126} (ohms) resistor colors: brown (1), orange (3), purple (\x{00D7}10M)", html => qr/./), - "1234500000 ohms" => test_zci("1200M\x{2126} (ohms) resistor colors: brown (1), red (2), gray (\x{00D7}100M)", html => qr/./), - "1255500000 ohms" => test_zci("1300M\x{2126} (ohms) resistor colors: brown (1), orange (3), gray (\x{00D7}100M)", html => qr/./), + "1.2345 ohms" => test_zci("1.2\x{2126} (ohms) resistor colors: brown (1), red (2), gold (\x{00D7}0.1), gold (\x{00B1}5%)", html => qr/./), + "1.2555 ohms" => test_zci("1.3\x{2126} (ohms) resistor colors: brown (1), orange (3), gold (\x{00D7}0.1), gold (\x{00B1}5%)", html => qr/./), + "12.345 ohms" => test_zci("12\x{2126} (ohms) resistor colors: brown (1), red (2), black (\x{00D7}1), gold (\x{00B1}5%)", html => qr/./), + "12.555 ohms" => test_zci("13\x{2126} (ohms) resistor colors: brown (1), orange (3), black (\x{00D7}1), gold (\x{00B1}5%)", html => qr/./), + "123.45 ohms" => test_zci("120\x{2126} (ohms) resistor colors: brown (1), red (2), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), + "125.55 ohms" => test_zci("130\x{2126} (ohms) resistor colors: brown (1), orange (3), brown (\x{00D7}10), gold (\x{00B1}5%)", html => qr/./), + "1234.5 ohms" => test_zci("1.2K\x{2126} (ohms) resistor colors: brown (1), red (2), red (\x{00D7}100), gold (\x{00B1}5%)", html => qr/./), + "1255.5 ohms" => test_zci("1.3K\x{2126} (ohms) resistor colors: brown (1), orange (3), red (\x{00D7}100), gold (\x{00B1}5%)", html => qr/./), + "12345 ohms" => test_zci("12K\x{2126} (ohms) resistor colors: brown (1), red (2), orange (\x{00D7}1K), gold (\x{00B1}5%)", html => qr/./), + "12555 ohms" => test_zci("13K\x{2126} (ohms) resistor colors: brown (1), orange (3), orange (\x{00D7}1K), gold (\x{00B1}5%)", html => qr/./), + "123450 ohms" => test_zci("120K\x{2126} (ohms) resistor colors: brown (1), red (2), yellow (\x{00D7}10K), gold (\x{00B1}5%)", html => qr/./), + "125550 ohms" => test_zci("130K\x{2126} (ohms) resistor colors: brown (1), orange (3), yellow (\x{00D7}10K), gold (\x{00B1}5%)", html => qr/./), + "1234500 ohms" => test_zci("1.2M\x{2126} (ohms) resistor colors: brown (1), red (2), green (\x{00D7}100K), gold (\x{00B1}5%)", html => qr/./), + "1255500 ohms" => test_zci("1.3M\x{2126} (ohms) resistor colors: brown (1), orange (3), green (\x{00D7}100K), gold (\x{00B1}5%)", html => qr/./), + "12345000 ohms" => test_zci("12M\x{2126} (ohms) resistor colors: brown (1), red (2), blue (\x{00D7}1M), gold (\x{00B1}5%)", html => qr/./), + "12555000 ohms" => test_zci("13M\x{2126} (ohms) resistor colors: brown (1), orange (3), blue (\x{00D7}1M), gold (\x{00B1}5%)", html => qr/./), + "123450000 ohms" => test_zci("120M\x{2126} (ohms) resistor colors: brown (1), red (2), purple (\x{00D7}10M), gold (\x{00B1}5%)", html => qr/./), + "125550000 ohms" => test_zci("130M\x{2126} (ohms) resistor colors: brown (1), orange (3), purple (\x{00D7}10M), gold (\x{00B1}5%)", html => qr/./), + "1234500000 ohms" => test_zci("1200M\x{2126} (ohms) resistor colors: brown (1), red (2), gray (\x{00D7}100M), gold (\x{00B1}5%)", html => qr/./), + "1255500000 ohms" => test_zci("1300M\x{2126} (ohms) resistor colors: brown (1), orange (3), gray (\x{00D7}100M), gold (\x{00B1}5%)", html => qr/./), # kilo and mega multipliers - "27kohm" => test_zci("27K\x{2126} (ohms) resistor colors: red (2), purple (7), orange (\x{00D7}1K)", html => qr/./), - "27Kohm" => test_zci("27K\x{2126} (ohms) resistor colors: red (2), purple (7), orange (\x{00D7}1K)", html => qr/./), - "27 K ohm" => test_zci("27K\x{2126} (ohms) resistor colors: red (2), purple (7), orange (\x{00D7}1K)", html => qr/./), - "4K2 ohm" => test_zci("4.2K\x{2126} (ohms) resistor colors: yellow (4), red (2), red (\x{00D7}100)", html => qr/./), - "4.2K ohm" => test_zci("4.2K\x{2126} (ohms) resistor colors: yellow (4), red (2), red (\x{00D7}100)", html => qr/./), + "27kohm" => test_zci("27K\x{2126} (ohms) resistor colors: red (2), purple (7), orange (\x{00D7}1K), gold (\x{00B1}5%)", html => qr/./), + "27Kohm" => test_zci("27K\x{2126} (ohms) resistor colors: red (2), purple (7), orange (\x{00D7}1K), gold (\x{00B1}5%)", html => qr/./), + "27 K ohm" => test_zci("27K\x{2126} (ohms) resistor colors: red (2), purple (7), orange (\x{00D7}1K), gold (\x{00B1}5%)", html => qr/./), + "4K2 ohm" => test_zci("4.2K\x{2126} (ohms) resistor colors: yellow (4), red (2), red (\x{00D7}100), gold (\x{00B1}5%)", html => qr/./), + "4.2K ohm" => test_zci("4.2K\x{2126} (ohms) resistor colors: yellow (4), red (2), red (\x{00D7}100), gold (\x{00B1}5%)", html => qr/./), # Decimal points - "2.9ohm" => test_zci("2.9\x{2126} (ohms) resistor colors: red (2), white (9), gold (\x{00D7}0.1)", html => qr/./), + "2.9ohm" => test_zci("2.9\x{2126} (ohms) resistor colors: red (2), white (9), gold (\x{00D7}0.1), gold (\x{00B1}5%)", html => qr/./), # Negative multipliers - "1 ohm" => test_zci("1\x{2126} (ohm) resistor colors: brown (1), black (0), gold (\x{00D7}0.1)", html => qr/./), - "29 ohms" => test_zci("29\x{2126} (ohms) resistor colors: red (2), white (9), black (\x{00D7}1)", html => qr/./), + "1 ohm" => test_zci("1\x{2126} (ohm) resistor colors: brown (1), black (0), gold (\x{00D7}0.1), gold (\x{00B1}5%)", html => qr/./), + "29 ohms" => test_zci("29\x{2126} (ohms) resistor colors: red (2), white (9), black (\x{00D7}1), gold (\x{00B1}5%)", html => qr/./), # Zero special case - "0 ohms" => test_zci("0\x{2126} (ohms) resistor colors: black (0), black (0), black (\x{00D7}1)", html => qr/./), + "0 ohms" => test_zci("0\x{2126} (ohms) resistor colors: black (0), black (0), black (\x{00D7}1), gold (\x{00B1}5%)", html => qr/./), # Range - "99000M ohms" => test_zci("99000M\x{2126} (ohms) resistor colors: white (9), white (9), white (\x{00D7}1000M)", html => qr/./), + "99000M ohms" => test_zci("99000M\x{2126} (ohms) resistor colors: white (9), white (9), white (\x{00D7}1000M), gold (\x{00B1}5%)", html => qr/./), "99500M ohms" => undef, - "1.1 ohms" => test_zci("1.1\x{2126} (ohms) resistor colors: brown (1), brown (1), gold (\x{00D7}0.1)", html => qr/./), - "1 ohms" => test_zci("1\x{2126} (ohm) resistor colors: brown (1), black (0), gold (\x{00D7}0.1)", html => qr/./), + "1.1 ohms" => test_zci("1.1\x{2126} (ohms) resistor colors: brown (1), brown (1), gold (\x{00D7}0.1), gold (\x{00B1}5%)", html => qr/./), + "1 ohms" => test_zci("1\x{2126} (ohm) resistor colors: brown (1), black (0), gold (\x{00D7}0.1), gold (\x{00B1}5%)", html => qr/./), "0.9 ohms" => undef, "-10 ohms" => undef, @@ -80,7 +80,7 @@ ddg_goodie_test( "ohm ma darling" => undef, # Check the HTML. Just once. - "1.5m ohm" => test_zci("1.5M\x{2126} (ohms) resistor colors: brown (1), green (5), green (\x{00D7}100K)", html => + "1.5m ohm" => test_zci("1.5M\x{2126} (ohms) resistor colors: brown (1), green (5), green (\x{00D7}100K), gold (\x{00B1}5%)", html => "1.5MΩ (ohms) resistor colors: " . "green (5) " . "green (×100K)" + . "-webkit-border-radius:4px;-moz-border-radius:4px;'>green (×100K) " + . "gold (±5%)" . "
More at resisto.rs"), );