zotero/translators/Cambridge Scientific Abstracts.js

209 lines
6.8 KiB
JavaScript

{
"translatorID":"82174f4f-8c13-403b-99b2-affc7bc7769b",
"translatorType":4,
"label":"Cambridge Scientific Abstracts",
"creator":"Simon Kornblith and Michael Berkowitz",
"target":"https?://[^/]+/ids70/(?:results.php|view_record.php)",
"minVersion":"1.0.0b3.r1",
"maxVersion":"",
"priority":100,
"inRepository":true,
"lastUpdated":"2011-06-14 04:31:00"
}
/* Provides support for databases of Cambridge Scientific Abstracts
Tested with CSA Illumina, http://www.csa.com/
CSA does not provide stable URLs
*/
function detectWeb(doc, url) {
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
if (prefix == 'x') return namespace; else return null;
} : null;
if(url.indexOf("/results.php") != -1) {
var type = doc.evaluate('//td[@class="rt_tab_on"]', doc, nsResolver, XPathResult.ANY_TYPE,
null).iterateNext().textContent;
if(type.substr(0, 15) == "Published Works") {
return "multiple";
}
} else {
// default to journal
var itemType = "journalArticle";
var type = doc.evaluate('//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]',
doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if(type) {
type = Zotero.Utilities.trimInternal(type.textContent);
if(type == "Book Chapter") {
return "bookSection";
} else if(type.substr(0, 4) == "Book") {
return "book";
} else if(type.substr(0, 12) == "Dissertation") {
return "thesis";
} else if(type == "Catalog") {
return "magazineArticle";
}
}
return "journalArticle";
}
return false;
}
function scrape(doc) {
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
if (prefix == 'x') return namespace; else return null;
} : null;
var itemType = "journalArticle";
var type = doc.evaluate('//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]',
doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if(type) {
type = Zotero.Utilities.trimInternal(type.textContent);
if(type == "Book Chapter") {
itemType = "bookSection";
} else if(type.substr(0, 4) == "Book") {
itemType = "book";
} else if(type.substr(0, 12) == "Dissertation") {
itemType = "thesis";
} else if(type == "Catalog") {
itemType = "magazineArticle";
}
}
var newItem = new Zotero.Item(itemType);
newItem.attachments = [{document:doc, title:"Cambridge Scientific Abstracts Snapshot"}];
newItem.title = Zotero.Utilities.trimInternal(doc.evaluate('//tr/td[3][@class="data_emphasis"]', doc, nsResolver,
XPathResult.ANY_TYPE, null).iterateNext().textContent);
var dataRows = doc.evaluate('//tr[td[3][@class="data_content"]]', doc, nsResolver,
XPathResult.ANY_TYPE, null);
var dataRow;
while(dataRow = dataRows.iterateNext()) {
var tds = dataRow.getElementsByTagName("td");
var heading = Zotero.Utilities.trimInternal(tds[0].textContent).toLowerCase();
var content = Zotero.Utilities.trimInternal(tds[2].textContent);
if(heading == "database") {
newItem.repository = "Cambridge Scientific Abstracts ("+content+")";
} else if(heading == "author") {
var authors = content.split("; ");
for each(var author in authors) {
newItem.creators.push(Zotero.Utilities.cleanAuthor(author.replace(/\d+/g, ""), "author", true));
}
} else if(heading == "source") {
if(itemType == "journalArticle") {
var parts = content.split(/(,|;)/);
newItem.publicationTitle = parts.shift();
for each (var i in parts) {
if (i.match(/\d+/)) {
if (i.match(/v(ol)?/)) {
newItem.volume = i.match(/\d+/)[0];
} else if (i.match(/pp/)) {
newItem.pages = i.match(/[\d\-]+/)[0];
} else if (i.match(/no?/)) {
newItem.issue = i.match(/\d+/)[0];
} else if (i.match(/\d{4}/)) {
newItem.date = Zotero.Utilities.trimInternal(i);
}
}
}
} else if(itemType == "book") {
var m = content.match(/^([^:]+): ([^,0-9]+)/);
if(m) {
newItem.place = m[1];
newItem.publisher = m[2];
}
} else if(itemType == "bookSection") {
var untitled = !newItem.publicationTitle;
if(untitled || (content.length > newItem.publicationTitle.length
&& content.substr(0, newItem.publicationTitle.length) == newItem.publicationTitle)
|| content.indexOf(newItem.publicationTitle)) {
if (content.indexOf(newItem.publicationTitle) > 4) {
// This means we probably have a book author or editor first
var m = content.match(/^([^\.]+)\./);
if (m) newItem.creators.push(
Zotero.Utilities.cleanAuthor(m[1], "bookAuthor", true));
}
var m = content.match(/\)\. ([^:()]+): ([^,0-9]+)/);
if(m) {
if (untitled) {
var n = content.match(/\([0-9]{4}\)([^(]*)/);
if (n) newItem.publicationTitle = n[1];
}
newItem.place = m[1];
newItem.publisher = m[2];
}
m = content.match(/\(pp. ([\-0-9]+)\)/);
if(m) newItem.pages = m[1];
}
}
} else if(heading == "monograph title") {
newItem.publicationTitle = content;
} else if(heading == "series title") {
newItem.series = content;
} else if(heading == "issn") {
newItem.ISSN = content;
} else if(heading == "isbn") {
newItem.ISBN = content;
} else if(heading == "abstract") {
newItem.abstractNote = content;
} else if(heading == "notes") {
newItem.extra = content;
} else if(heading == "publication year") {
if(!newItem.date) newItem.date = content;
} else if(heading == "information provider") {
if(content.substr(0, 19) == "http://dx.doi.org/") {
newItem.DOI = content.substr(19);
}
} else if(heading == "journal volume") {
newItem.volume = content;
} else if(heading == "journal pages") {
newItem.pages = content;
} else if(heading == "journal issue") {
newItem.issue = content;
} else if(heading == "affiliation") {
if(newItem.itemType == "thesis") {
newItem.publisher = content;
}
} else if(heading == "pages") { // This is for book sections
newItem.pages = content;
} else if(heading == "language") {
newItem.language = content;
}
}
var terms = doc.evaluate('//input[substring(@name, 1, 4) = "term"]', doc, nsResolver,
XPathResult.ANY_TYPE, null);
var term;
while(term = terms.iterateNext()) {
newItem.tags.push(term.value.replace(/ [0-9]{3,}$/, ""));
}
newItem.complete();
}
function doWeb(doc, url) {
if(url.indexOf("/results.php") != -1) {
var items = Zotero.Utilities.getItemArray(doc, doc, '/view_record\.php\?', '^(?:View Record|More\.{3})$');
items = Zotero.selectItems(items);
if(!items) return true;
var urls = new Array();
for(var url in items) {
urls.push(url);
}
Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done() })
Zotero.wait();
} else {
scrape(doc);
}
}