]> git.donarmstrong.com Git - bin.git/blobdiff - pubmed_search
add reset usb bus command
[bin.git] / pubmed_search
index b5272e32005b5de7df5a37b260b9987901972532..acd327d594710f5d04876de5aba39213a55a379a 100755 (executable)
@@ -1,9 +1,9 @@
 #! /usr/bin/perl
-# , and is released
+# pubmed_search searches for articles on pubmed, and is released
 # under the terms of the GPL version 2, or any later version, at your
 # option. See the file README and COPYING for more information.
-# Copyright 2011 by Don Armstrong <don@donarmstrong.com>.
-# $Id: perl_script 1825 2011-01-02 01:53:43Z don $
+# Copyright 2011,2017 by Don Armstrong <don@donarmstrong.com>.
+
 
 
 use warnings;
@@ -21,7 +21,7 @@ use Text::Wrap;
 
 =head1 NAME
 
-pubmed_search - 
+pubmed_search - Search for articles on pubmed
 
 =head1 SYNOPSIS
 
@@ -59,12 +59,19 @@ Display this manual.
 use vars qw($DEBUG);
 
 my %options = (debug           => 0,
-              help            => 0,
-              man             => 0,
-              );
+               help            => 0,
+               man             => 0,
+               color           => 1,
+               org_mode        => 0,
+               abstract        => 1,
+              );
 
 GetOptions(\%options,
-          'debug|d+','help|h|?','man|m');
+           'color|c!',
+           'org_mode|org-mode',
+           'pmid_only|pmid-only',
+           'abstract|abstracts|a!',
+           'debug|d+','help|h|?','man|m');
 
 pod2usage() if $options{help};
 pod2usage({verbose=>2}) if $options{man};
@@ -79,41 +86,73 @@ if (not @ARGV) {
 pod2usage(join("\n",@USAGE_ERRORS)) if @USAGE_ERRORS;
 
 
-my $search = Bio::DB::EUtilities->new(-eutil => 'esearch',
-                                      -email => 'don@donarmstrong.com',
-                                      -db    => 'pubmed',
-                                      -term => join(' ',@ARGV),
-                                      -retmax => 1000,
-                                     );
-my @ids = $search->get_ids();
+my $result =
+    Bio::DB::EUtilities->new(-email => 'don@donarmstrong.com',
+                             -db    => 'pubmed',
+                             -term => join(' ',@ARGV),
+                             -retmax => 1000,
+                             -eutil  => 'esearch',
+                            );
+my @ids;
+eval {
+    # this warns for everything, so hide the warning.
+    local $SIG{__WARN__} = sub {};
+    @ids = $result->get_ids('pubmed')
+};
+if (not @ids) {
+    print "No results\n";
+    exit;
+}
+if (@ids > 0 and ref($ids[0])) {
+    @ids = @{$ids[0]};
+}
+if ($options{org_mode}) {
+    print "* Pubmed search results for ".join(' ',@ARGV)." (".scalar(@ids).")\n";
+    print "  + ";
+} elsif ($options{pmid_only}) {
+    print map{qq($_\n)} @ids;
+    exit 0;
+}
 print scalar(@ids)." results:\n";
-my $esummary = Bio::DB::EUtilities->new(-eutil => 'efetch',
-                                       -email => 'don@donarmstrong.com',
-                                       -db    => 'pubmed',
-                                       -id  => \@ids
-                                      );
+exit 0 unless @ids;
+my $raw_xml = Bio::DB::EUtilities->new(-email => 'don@donarmstrong.com',
+                                       -db    => 'pubmed',
+                                       -id  => \@ids,
+                                       -eutil => 'efetch',
+                                      );
 use XML::LibXML;
-my $xml = XML::LibXML->load_xml(string => $esummary->get_Response()->content());
-for my $article ($xml->findnodes('PubmedArticleSet/PubmedArticle/MedlineCitation')) {
-    # print $article->toString;
-    my ($pmid) = $article->findnodes('./PMID');
-    my ($title) = $article->findnodes('./Article/ArticleTitle');
-    my ($abstract) = $article->findnodes('./Article/Abstract');
-    print BOLD GREEN;
+my $xml = XML::LibXML->load_xml(string => $raw_xml->get_Response->content);
+print STDERR $xml->toString if $DEBUG;
+for my $article ($xml->findnodes(q{//*[local-name()='MedlineCitation']})) {
+    print STDERR $article->toString if $DEBUG;
+    my ($pmid) = $article->findnodes(q{./*[local-name()='PMID']});
+    my ($title) = $article->findnodes(q{./*[local-name()='Article']}.
+                                      q{/*[local-name()='ArticleTitle']});
+    my ($abstract) = $article->findnodes(q{./*[local-name()='Article']}.
+                                         q{/*[local-name()='Abstract']});
+    if ($options{org_mode}) {
+        print "** PMID: ";
+    }
+    print BOLD GREEN if $options{color};
     print $pmid->textContent();
     print ": ";
-    print RESET;
-    print BOLD CYAN;
-    print $title->textContent()."\n";
-    print RESET;
-    print BOLD MAGENTA;
-    $abstract = $abstract->textContent();
-    $abstract =~ s/^\s*//mg;
-    $abstract =~ s/(.{,80})\s/$1\n/g;
-    $abstract = encode_utf8($abstract);
-    print wrap('','',$abstract);
-    print "\n\n";
-    print RESET;
+    print RESET if $options{color};
+    print BOLD CYAN if $options{color};
+    print encode_utf8($title->textContent())."\n";
+    print RESET if $options{color};
+    if (defined $abstract and $options{abstract}) {
+        print BOLD MAGENTA if $options{color};
+        if ($options{org_mode}) {
+            print "*** Abstract\n";
+        }
+        $abstract = $abstract->textContent();
+        $abstract =~ s/^\s*//mg;
+        $abstract =~ s/(.{,80})\s/$1\n/g;
+        $abstract = encode_utf8($abstract);
+        print wrap('','',$abstract);
+        print "\n\n";
+        print RESET if $options{color};
+    }
 }
 
 __END__