;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Jun 2001
;;;;
-;;;; $Id: pubmed.lisp,v 1.4 2002/10/31 20:53:03 kevin Exp $
+;;;; $Id: pubmed.lisp,v 1.7 2002/11/06 19:36:53 kevin Exp $
;;;;
;;;; This file, part of cl-pubmed, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
;; Conditions
#:pubmed-condition
+ #:pubmed-query-error
#:pubmed-server-error
;; Query functions
(format stream "A PubMed server error occurred.")
(awhen (pubmed-server-error-response c)
(format stream " The server response was:~&~S" it)))))
+
+(define-condition pubmed-query-error (error pubmed-condition)
+ ((response :initarg :response
+ :initform nil
+ :reader pubmed-query-error-response))
+ (:report (lambda (c stream)
+ (format stream "A PubMed server error occurred.")
+ (awhen (pubmed-query-error-response c)
+ (format stream " The server response was:~&~S" it)))))
;;; Article-Set and Article Classes
"Display an article set to specified stream in specified format"
(dotimes (i (articles-count artset))
(print-article (nth i (articles artset)) :os os :format format
- :complete complete :print-link print-link)))
+ :complete complete :print-link print-link))
+ artset)
(defmethod print-article ((art pm-article) &key (os *standard-output*) (format :text)
(complete nil) (print-link t))
"Display an article"
- (if (eql format :text)
- (format os "~a~%~a~%~a~a ~a~%~a~%"
- (article-title art)
- (list-to-delimited-string (article-authors art) ", ")
- (aif (article-affiliation art)
- (format nil "~a~%" it) "")
- (article-journal art) (article-ref art)
- (aif (article-abstract art)
+ (ecase format
+ (:text
+ (format os "~a~%~a~%~a~a ~a~%~a~%"
+ (article-title art)
+ (list-to-delimited-string (article-authors art) ", ")
+ (aif (article-affiliation art)
+ (format nil "~a~%" it) "")
+ (article-journal art) (article-ref art)
+ (aif (article-abstract art)
(if complete
it
"Abstract available")
- "No abstract available")
- (when complete
- (format os "~a~%" (article-mesh-headings art))))
-
- (let ((has-link (or (article-abstract art) (article-mesh-headings art))))
- (when (and print-link has-link)
- (format os "<a href=\"~a?key=~a\">" (make-url "print-article") (article-pmid art)))
- (format os "<div class=\"article-title\">~a</div>~%" (article-title art))
- (when (and print-link has-link)
- (format os "</a>"))
- (format os "<div class=\"article-authors\">~a</div>~%"
- (list-to-delimited-string (article-authors art) ", "))
- (format os "<div class=\"article-reference\">~a ~a</div>~%"
- (article-journal art) (article-ref art))
- (when (and complete (article-abstract art))
- (format os "<div class=\"article-abstract\">~a</div>~%"
- (article-abstract art)))
- (when (and complete (article-mesh-headings art))
- (format os "<div class=\"mesh-heading-title\">Mesh Headings:</div>")
- (dolist (mh (article-mesh-headings art))
- (format os "<div class=\"mesh-heading\">~a</div>~%" mh)))
- (format os "<p/>~%"))))
+ "No abstract available")
+ (when complete
+ (format os "~a~%" (article-mesh-headings art)))))
+ (:html
+ (let ((has-link (or (article-abstract art) (article-mesh-headings art))))
+ (when (and print-link has-link)
+ (format os "<a href=\"~a?key=~a\">" (make-url "print-article") (article-pmid art)))
+ (format os "<div class=\"article-title\">~a</div>~%" (article-title art))
+ (when (and print-link has-link)
+ (format os "</a>"))
+ (format os "<div class=\"article-authors\">~a</div>~%"
+ (list-to-delimited-string (article-authors art) ", "))
+ (format os "<div class=\"article-reference\">~a ~a</div>~%"
+ (article-journal art) (article-ref art))
+ (when (and complete (article-abstract art))
+ (format os "<div class=\"article-abstract\">~a</div>~%"
+ (article-abstract art)))
+ (when (and complete (article-mesh-headings art))
+ (format os "<div class=\"mesh-heading-title\">Mesh Headings:</div>")
+ (dolist (mh (article-mesh-headings art))
+ (format os "<div class=\"mesh-heading\">~a</div>~%" mh)))
+ (format os "<p/>~%"))))
+ art)
;;; PubMed Query Functions
(defun extract-pmid-list (results)
"Returns list of PubMed ID's from XML result string"
- (if (or (search "<ERROR>" results)
- (search "<H1>Server Error</H1>" results))
- (error 'pubmed-server-error :response results)
+ (cond
+ ((search "<ERROR>" results)
+ (error 'pubmed-query-error :response results))
+ ((search "<H1>Server Error</H1>" results)
+ (error 'pubmed-server-error :response results))
+ (t
(awhen (xml-tag-contents "Id" results)
- (delimited-string-to-list it #\space))))
+ (delimited-string-to-list it #\space)))))