commit 6958518063ee9a442904c7c25893f44eb25a023f
parent 5ff4bd632696f0b57d3c14af177bbc7b1b2b2b98
Author: Avram Lyon <ajlyon@gmail.com>
Date: Thu, 27 Jan 2011 05:44:14 +0000
Trans: Change PubMed to support import
Diffstat:
1 file changed, 120 insertions(+), 89 deletions(-)
diff --git a/translators/NCBI PubMed.js b/translators/NCBI PubMed.js
@@ -1,14 +1,15 @@
{
"translatorID":"fcf41bed-0cbc-3704-85c7-8062a0068a7a",
- "translatorType":12,
+ "translatorType":13,
"label":"NCBI PubMed",
"creator":"Simon Kornblith, Michael Berkowitz, Avram Lyon, and Rintze Zelle",
"target":"https?://[^/]*(www|preview)\\.ncbi\\.nlm\\.nih\\.gov[^/]*/(pubmed|sites/pubmed|sites/entrez|entrez/query\\.fcgi\\?.*db=PubMed)",
"minVersion":"2.1b1",
"maxVersion":"",
"priority":100,
+ "configOptions":{"dataMode":"block"},
"inRepository":true,
- "lastUpdated":"2010-11-17 10:15:00"
+ "lastUpdated":"2011-01-27 10:15:00"
}
function detectWeb(doc, url) {
@@ -61,115 +62,145 @@ function detectSearch(item) {
function lookupPMIDs(ids, doc) {
+ var newUri = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=PubMed&tool=Zotero&retmode=xml&rettype=citation&id="+ids.join(",");
+ Zotero.debug(newUri);
+ Zotero.Utilities.HTTP.doGet(newUri, doImportFromText, function () {Zotero.done()});
Zotero.wait();
- var newUri = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=PubMed&retmode=xml&rettype=citation&id="+ids.join(",");
- Zotero.Utilities.HTTP.doGet(newUri, function(text) {
- // Remove xml parse instruction and doctype
- text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
+}
- var xml = new XML(text);
+function doImport() {
+ var text = "";
+ var line;
+ while((line = Zotero.read(4096)) !== false) {
+ text += line;
+ }
+ return doImportFromText(text);
+}
- for(var i=0; i<xml.PubmedArticle.length(); i++) {
- var newItem = new Zotero.Item("journalArticle");
+function detectImport() {
+ Zotero.debug("Detecting Pubmed content....");
+ var text = "";
+ var line;
+ while(line = Zotero.read(1000)) {
+ text += line;
+ // Look for the PubmedArticle tag in the first 1000 characters
+ if (text.match(/<PubmedArticle>/)) return "journalArticle";
+ else if (text.length > 1000) return false;
+ }
+ return false;
+}
- var citation = xml.PubmedArticle[i].MedlineCitation;
+function doImportFromText(text) {
+ // Remove xml parse instruction and doctype
+ text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
- var PMID = citation.PMID.text().toString();
- newItem.url = "http://www.ncbi.nlm.nih.gov/pubmed/" + PMID;
- newItem.extra = "PMID: "+PMID;
+ if (!text.substr(0,1000).match(/<PubmedArticleSet>/)) {
+ // Pubmed data in the wild, perhaps copied from the web site's search results,
+ // can be missing the <PubmedArticleSet> root tag. Let's add a pair!
+ Zotero.debug("No root <PubmedArticleSet> tag found, wrapping in a new root tag.");
+ text = "<PubmedArticleSet>" + text + "</PubmedArticleSet>";
+ }
- var article = citation.Article;
- if(article.ArticleTitle.length()) {
- var title = article.ArticleTitle.text().toString();
- if(title.substr(-1) == ".") {
- title = title.substring(0, title.length-1);
- }
- newItem.title = title;
+ var xml = new XML(text);
+
+ for(var i=0; i<xml.PubmedArticle.length(); i++) {
+ var newItem = new Zotero.Item("journalArticle");
+
+ var citation = xml.PubmedArticle[i].MedlineCitation;
+
+ var PMID = citation.PMID.text().toString();
+ newItem.url = "http://www.ncbi.nlm.nih.gov/pubmed/" + PMID;
+ newItem.extra = "PMID: "+PMID;
+
+ var article = citation.Article;
+ if(article.ArticleTitle.length()) {
+ var title = article.ArticleTitle.text().toString();
+ if(title.substr(-1) == ".") {
+ title = title.substring(0, title.length-1);
}
+ newItem.title = title;
+ }
- if (article.Pagination.MedlinePgn.length()){
- var fullPageRange = article.Pagination.MedlinePgn.text().toString();
- var pageRange = fullPageRange.match(/\d+-\d+/g);
- for (var j in pageRange) {
- var pageRangeStart = pageRange[j].match(/^\d+/)[0];
- var pageRangeEnd = pageRange[j].match(/\d+$/)[0];
- if (pageRangeStart.length > pageRangeEnd.length) {
- pageRangeEnd = pageRangeStart.substring(0,pageRangeStart.length-pageRangeEnd.length) + pageRangeEnd;
- fullPageRange = fullPageRange.replace(pageRange[j],pageRangeStart+"-"+pageRangeEnd);
- }
+ if (article.Pagination.MedlinePgn.length()){
+ var fullPageRange = article.Pagination.MedlinePgn.text().toString();
+ var pageRange = fullPageRange.match(/\d+-\d+/g);
+ for (var j in pageRange) {
+ var pageRangeStart = pageRange[j].match(/^\d+/)[0];
+ var pageRangeEnd = pageRange[j].match(/\d+$/)[0];
+ if (pageRangeStart.length > pageRangeEnd.length) {
+ pageRangeEnd = pageRangeStart.substring(0,pageRangeStart.length-pageRangeEnd.length) + pageRangeEnd;
+ fullPageRange = fullPageRange.replace(pageRange[j],pageRangeStart+"-"+pageRangeEnd);
}
- newItem.pages = fullPageRange;
}
+ newItem.pages = fullPageRange;
+ }
- if(article.Journal.length()) {
- var issn = article.Journal.ISSN.text().toString();
- if(issn) {
- newItem.ISSN = issn;
- }
-
- if(citation.Article.Journal.ISOAbbreviation.length()) {
- newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.Article.Journal.ISOAbbreviation.text().toString());
- } else if(citation.MedlineJournalInfo.MedlineTA.length()) {
- newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.MedlineJournalInfo.MedlineTA.text().toString());
- }
+ if(article.Journal.length()) {
+ var issn = article.Journal.ISSN.text().toString();
+ if(issn) {
+ newItem.ISSN = issn;
+ }
- if(article.Journal.Title.length()) {
- newItem.publicationTitle = Zotero.Utilities.superCleanString(article.Journal.Title.text().toString());
- } else if(newItem.journalAbbreviation.length()) {
- newItem.publicationTitle = newItem.journalAbbreviation;
- }
+ if(citation.Article.Journal.ISOAbbreviation.length()) {
+ newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.Article.Journal.ISOAbbreviation.text().toString());
+ } else if(citation.MedlineJournalInfo.MedlineTA.length()) {
+ newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.MedlineJournalInfo.MedlineTA.text().toString());
+ }
- if(article.Journal.JournalIssue.length()) {
- newItem.volume = article.Journal.JournalIssue.Volume.text().toString();
- newItem.issue = article.Journal.JournalIssue.Issue.text().toString();
- if(article.Journal.JournalIssue.PubDate.length()) { // try to get the date
- if(article.Journal.JournalIssue.PubDate.Day.text().toString() != "") {
- newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Day.text().toString()+", "+article.Journal.JournalIssue.PubDate.Year.text().toString();
- } else if(article.Journal.JournalIssue.PubDate.Month.text().toString() != "") {
- newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Year.text().toString();
- } else if(article.Journal.JournalIssue.PubDate.Year.text().toString() != "") {
- newItem.date = article.Journal.JournalIssue.PubDate.Year.text().toString();
- } else if(article.Journal.JournalIssue.PubDate.MedlineDate.text().toString() != "") {
- newItem.date = article.Journal.JournalIssue.PubDate.MedlineDate.text().toString();
- }
- }
- }
+ if(article.Journal.Title.length()) {
+ newItem.publicationTitle = Zotero.Utilities.superCleanString(article.Journal.Title.text().toString());
+ } else if(newItem.journalAbbreviation.length()) {
+ newItem.publicationTitle = newItem.journalAbbreviation;
}
- if(article.AuthorList.length() && article.AuthorList.Author.length()) {
- var authors = article.AuthorList.Author;
- for(var j=0; j<authors.length(); j++) {
- var lastName = authors[j].LastName.text().toString();
- var firstName = authors[j].FirstName.text().toString();
- if(firstName == "") {
- firstName = authors[j].ForeName.text().toString();
- }
- var suffix = authors[j].Suffix.text().toString();
- if(suffix && firstName != "") {
- firstName += ", " + authors[j].Suffix.text().toString();
- }
- if(firstName || lastName) {
- newItem.creators.push({lastName:lastName, firstName:firstName});
+ if(article.Journal.JournalIssue.length()) {
+ newItem.volume = article.Journal.JournalIssue.Volume.text().toString();
+ newItem.issue = article.Journal.JournalIssue.Issue.text().toString();
+ if(article.Journal.JournalIssue.PubDate.length()) { // try to get the date
+ if(article.Journal.JournalIssue.PubDate.Day.text().toString() != "") {
+ newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Day.text().toString()+", "+article.Journal.JournalIssue.PubDate.Year.text().toString();
+ } else if(article.Journal.JournalIssue.PubDate.Month.text().toString() != "") {
+ newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Year.text().toString();
+ } else if(article.Journal.JournalIssue.PubDate.Year.text().toString() != "") {
+ newItem.date = article.Journal.JournalIssue.PubDate.Year.text().toString();
+ } else if(article.Journal.JournalIssue.PubDate.MedlineDate.text().toString() != "") {
+ newItem.date = article.Journal.JournalIssue.PubDate.MedlineDate.text().toString();
}
}
}
-
-
- if (citation.MeshHeadingList && citation.MeshHeadingList.MeshHeading) {
- var keywords = citation.MeshHeadingList.MeshHeading;
- for (var k = 0 ; k < keywords.length() ; k++) {
- newItem.tags.push(keywords[k].DescriptorName.text().toString());
+ }
+
+ if(article.AuthorList.length() && article.AuthorList.Author.length()) {
+ var authors = article.AuthorList.Author;
+ for(var j=0; j<authors.length(); j++) {
+ var lastName = authors[j].LastName.text().toString();
+ var firstName = authors[j].FirstName.text().toString();
+ if(firstName == "") {
+ firstName = authors[j].ForeName.text().toString();
+ }
+ var suffix = authors[j].Suffix.text().toString();
+ if(suffix && firstName != "") {
+ firstName += ", " + authors[j].Suffix.text().toString();
+ }
+ if(firstName || lastName) {
+ newItem.creators.push({lastName:lastName, firstName:firstName});
}
}
- newItem.abstractNote = article.Abstract.AbstractText.toString()
-
- newItem.DOI = xml.PubmedArticle[i].PubmedData.ArticleIdList.ArticleId.(@IdType == "doi" ).text().toString();
- newItem.publicationTitle = Zotero.Utilities.capitalizeTitle(newItem.publicationTitle);
- newItem.complete();
}
- Zotero.done();
- });
+
+ if (citation.MeshHeadingList && citation.MeshHeadingList.MeshHeading) {
+ var keywords = citation.MeshHeadingList.MeshHeading;
+ for (var k = 0 ; k < keywords.length() ; k++) {
+ newItem.tags.push(keywords[k].DescriptorName.text().toString());
+ }
+ }
+ newItem.abstractNote = article.Abstract.AbstractText.toString()
+
+ newItem.DOI = xml.PubmedArticle[i].PubmedData.ArticleIdList.ArticleId.(@IdType == "doi" ).text().toString();
+ newItem.publicationTitle = Zotero.Utilities.capitalizeTitle(newItem.publicationTitle);
+ newItem.complete();
+ }
}
function doWeb(doc, url) {