www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

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:
Mtranslators/NCBI PubMed.js | 209+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
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) {