Root/boom/dist/dk/dk-db.pl

1#!/usr/bin/perl
2
3sub rows
4{
5    local $s = $_[0];
6    my @res = ();
7
8    while ($s =~ m#.*?<tr>(.*?)</tr>#) {
9    push(@res, $1);
10    $s = $';
11    }
12    return @res;
13}
14
15
16sub cols
17{
18    local $s = $_[0];
19    my @res = ();
20
21    while ($s =~ m#.*?<td[^>]*>(.*?)</td>#) {
22    push(@res, $1);
23    $s = $';
24    }
25    return @res;
26}
27
28
29sub flush
30{
31    $cmd = "wget -nv -O - ".join(" ",
32      map
33      "http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail\\&name=$_",
34      @pn);
35    $q .= `$cmd`;
36    @pn = ();
37}
38
39
40sub usage
41{
42    print STDERR "usage: $0 (query [-i cache_file] | dsc | inv) [file ...]\n";
43    exit(1);
44}
45
46
47$mode = shift @ARGV;
48&usage unless $mode eq "query" || $mode eq "dsc" || $mode eq "inv";
49
50if ($mode eq "query") {
51    if ($ARGV[0] eq "-i") {
52    shift @ARGV;
53    $name = shift @ARGV;
54    open(OLD, $name) || die "$name: $!";
55    $q = join("", <OLD>);
56    ($old = $q) =~ tr/\r\n//d;
57    close OLD;
58    }
59
60    while (<>) {
61    chop;
62    s/#.*//;
63    next if /^\s*$/;
64    next if /^\s/;
65    s/\s.*//;
66
67    $n++;
68    print STDERR "$n\r" unless $n % 100;
69
70    next if $old =~ m#align=right>Digi-Key Part Number</th><td>$_</td#;
71    push(@pn, $_);
72    &flush if @pn > 1000;
73    }
74
75    &flush if 0+@pn;;
76
77    print $q;
78    exit;
79}
80
81
82$q = join("", <>);
83$q =~ tr/\r\n//d;
84
85print "#DSC\n" if $mode eq "dsc";
86print "#INV\n" if $mode eq "inv";
87print "# MACHINE-GENERATED. DO NOT EDIT !\n";
88print "# ", `date -u`;
89
90for (split(/<!DOCTYPE HTML/, $q)) {
91    next unless m#align=right>Digi-Key Part Number</th><td>([^<]+)</td#;
92    $pn = $1;
93    $qty = 0;
94    if (m#align=right>Quantity Available</th><td[^>]*>([0-9,]+)<#) {
95    ($qty = $1) =~ tr/,//d;
96    }
97    next unless m#align=right>Description</th><td>(.*?)</td#;
98    $dsc = $1;
99    next unless m#<table.*<th>Price Break<(.*?)</table>#;
100    if ($mode eq "dsc") {
101    print "DIGI-KEY $pn $dsc\n";
102    next;
103    }
104    print "DIGI-KEY $pn $qty USD";
105    for (&rows($1)) {
106    @c = &cols($_);
107    next unless $c[0] =~ /^[0-9,]+$/;
108    next unless $c[1] =~ /^[0-9.]+$/;
109    $c[0] =~ tr/,//d;
110    $c[1] =~ tr/,//d; # let's hope we don't need this one often :)
111    $c[1] =~ s/0+$// if $c[1] =~ /\./;
112    print " $c[0] $c[1]";
113    }
114    print "\n";
115}
116

Archive Download this file

Branches:
master



interactive