214 lines
6.4 KiB
JavaScript
214 lines
6.4 KiB
JavaScript
|
{
|
||
|
"translatorID":"6773a9af-5375-3224-d148-d32793884dec",
|
||
|
"translatorType":4,
|
||
|
"label":"InfoTrac",
|
||
|
"creator":"Simon Kornblith",
|
||
|
"target":"^https?://[^/]+/itw/infomark/",
|
||
|
"minVersion":"1.0.0b3.r1",
|
||
|
"maxVersion":"",
|
||
|
"priority":100,
|
||
|
"inRepository":true,
|
||
|
"lastUpdated":"2006-12-18 06:00:45"
|
||
|
}
|
||
|
|
||
|
function detectWeb(doc, url) {
|
||
|
var namespace = doc.documentElement.namespaceURI;
|
||
|
var nsResolver = namespace ? function(prefix) {
|
||
|
if (prefix == 'x') return namespace; else return null;
|
||
|
} : null;
|
||
|
|
||
|
// ensure that there is an InfoTrac logo
|
||
|
if(!doc.evaluate('//img[substring(@alt, 1, 8) = "InfoTrac"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) return false;
|
||
|
|
||
|
if(doc.title.substring(0, 8) == "Article ") {
|
||
|
var genre = doc.evaluate('//comment()[substring(., 1, 6) = " Genre"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
|
||
|
|
||
|
if(genre) {
|
||
|
var value = Zotero.Utilities.cleanString(genre.nodeValue.substr(7));
|
||
|
if(value == "article") {
|
||
|
return "journalArticle";
|
||
|
} else if(value == "book") {
|
||
|
return "book";
|
||
|
} else if(value == "dissertation") {
|
||
|
return "thesis";
|
||
|
} else if(value == "bookitem") {
|
||
|
return "bookSection";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return "magazineArticle";
|
||
|
} else if(doc.title.substring(0, 10) == "Citations ") {
|
||
|
return "multiple";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function extractCitation(url, elmts, title, doc) {
|
||
|
var newItem = new Zotero.Item();
|
||
|
newItem.url = url;
|
||
|
|
||
|
if(title) {
|
||
|
newItem.title = Zotero.Utilities.superCleanString(title);
|
||
|
}
|
||
|
while(elmt = elmts.iterateNext()) {
|
||
|
var colon = elmt.nodeValue.indexOf(":");
|
||
|
var field = elmt.nodeValue.substring(1, colon).toLowerCase();
|
||
|
var value = elmt.nodeValue.substring(colon+1, elmt.nodeValue.length-1);
|
||
|
if(field == "title") {
|
||
|
newItem.title = Zotero.Utilities.superCleanString(value);
|
||
|
} else if(field == "journal") {
|
||
|
newItem.publicationTitle = value;
|
||
|
} else if(field == "pi") {
|
||
|
parts = value.split(" ");
|
||
|
var date = "";
|
||
|
var field = null;
|
||
|
for(j in parts) {
|
||
|
firstChar = parts[j].substring(0, 1);
|
||
|
|
||
|
if(firstChar == "v") {
|
||
|
newItem.itemType = "journalArticle";
|
||
|
field = "volume";
|
||
|
} else if(firstChar == "i") {
|
||
|
field = "issue";
|
||
|
} else if(firstChar == "p") {
|
||
|
field = "pages";
|
||
|
|
||
|
var pagesRegexp = /p(\w+)\((\w+)\)/; // weird looking page range
|
||
|
var match = pagesRegexp.exec(parts[j]);
|
||
|
if(match) { // yup, it's weird
|
||
|
var finalPage = parseInt(match[1])+parseInt(match[2])
|
||
|
parts[j] = "p"+match[1]+"-"+finalPage.toString();
|
||
|
} else if(!newItem.itemType) { // no, it's normal
|
||
|
// check to see if it's numeric, bc newspaper pages aren't
|
||
|
var justPageNumber = parts[j].substr(1);
|
||
|
if(parseInt(justPageNumber).toString() != justPageNumber) {
|
||
|
newItem.itemType = "newspaperArticle";
|
||
|
}
|
||
|
}
|
||
|
} else if(!field) { // date parts at the beginning, before
|
||
|
// anything else
|
||
|
date += " "+parts[j];
|
||
|
}
|
||
|
|
||
|
if(field) {
|
||
|
isDate = false;
|
||
|
|
||
|
if(parts[j] != "pNA") { // make sure it's not an invalid
|
||
|
// page number
|
||
|
// chop of letter
|
||
|
newItem[field] = parts[j].substring(1);
|
||
|
} else if(!newItem.itemType) { // only newspapers are missing
|
||
|
// page numbers on infotrac
|
||
|
newItem.itemType = "newspaperArticle";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Set type
|
||
|
if(!newItem.itemType) {
|
||
|
newItem.itemType = "magazineArticle";
|
||
|
}
|
||
|
|
||
|
if(date != "") {
|
||
|
newItem.date = date.substring(1);
|
||
|
}
|
||
|
} else if(field == "author") {
|
||
|
var author = Zotero.Utilities.cleanAuthor(value, "author", true);
|
||
|
|
||
|
// ensure author is not already there
|
||
|
var add = true;
|
||
|
for each(var existingAuthor in newItem.creators) {
|
||
|
if(existingAuthor.firstName == author.firstName && existingAuthor.lastName == author.lastName) {
|
||
|
add = false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if(add) newItem.creators.push(author);
|
||
|
} else if(field == "issue") {
|
||
|
newItem.issue = value;
|
||
|
} else if(field == "volume") {
|
||
|
newItem.volume = value;
|
||
|
} else if(field == "issn") {
|
||
|
newItem.ISSN = value;
|
||
|
} else if(field == "gjd") {
|
||
|
var m = value.match(/\(([0-9]{4}[^\)]*)\)(?:, pp\. ([0-9\-]+))?/);
|
||
|
if(m) {
|
||
|
newItem.date = m[1];
|
||
|
newItem.pages = m[2];
|
||
|
}
|
||
|
} else if(field == "BookTitle") {
|
||
|
newItem.publicationTitle = value;
|
||
|
} else if(field == "genre") {
|
||
|
value = value.toLowerCase();
|
||
|
if(value == "article") {
|
||
|
newItem.itemType = "journalArticle";
|
||
|
} else if(value == "book") {
|
||
|
newItem.itemType = "book";
|
||
|
} else if(value == "dissertation") {
|
||
|
newItem.itemType = "thesis";
|
||
|
} else if(value == "bookitem") {
|
||
|
newItem.itemType = "bookSection";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(doc) {
|
||
|
newItem.attachments.push({document:doc, title:"InfoTrac Snapshot"});
|
||
|
} else {
|
||
|
newItem.attachments.push({url:url, title:"InfoTrac Snapshot",
|
||
|
mimeType:"text/html"});
|
||
|
}
|
||
|
|
||
|
newItem.complete();
|
||
|
}
|
||
|
|
||
|
function doWeb(doc, url) {
|
||
|
var namespace = doc.documentElement.namespaceURI;
|
||
|
var nsResolver = namespace ? function(prefix) {
|
||
|
if (prefix == 'x') return namespace; else return null;
|
||
|
} : null;
|
||
|
|
||
|
var uri = doc.location.href;
|
||
|
if(doc.title.substring(0, 8) == "Article ") { // article
|
||
|
var xpath = '/html/body//comment()';
|
||
|
var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
extractCitation(uri, elmts);
|
||
|
} else { // search results
|
||
|
var items = new Array();
|
||
|
var uris = new Array();
|
||
|
var elmts = new Array();
|
||
|
|
||
|
var host = doc.location.href.match(/^https?:\/\/[^\/]+/)[0];
|
||
|
|
||
|
var tableRows = doc.evaluate('/html/body//table/tbody/tr/td[a/b]', doc, nsResolver,
|
||
|
XPathResult.ANY_TYPE, null);
|
||
|
var tableRow;
|
||
|
var javaScriptRe = /'([^']*)' *, *'([^']*)'/
|
||
|
var i = 0;
|
||
|
// Go through table rows
|
||
|
while(tableRow = tableRows.iterateNext()) {
|
||
|
var link = doc.evaluate('./a', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
|
||
|
var m = javaScriptRe.exec(link.href);
|
||
|
if(m) {
|
||
|
uris[i] = host+"/itw/infomark/192/215/90714844w6"+m[1]+"?sw_aep=olr_wad"+m[2];
|
||
|
}
|
||
|
var article = doc.evaluate('./b/text()', link, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
|
||
|
items[i] = article.nodeValue;
|
||
|
// Chop off final period
|
||
|
if(items[i].substr(items[i].length-1) == ".") {
|
||
|
items[i] = items[i].substr(0, items[i].length-1);
|
||
|
}
|
||
|
elmts[i] = doc.evaluate(".//comment()", tableRow, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
items = Zotero.selectItems(items);
|
||
|
|
||
|
if(!items) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
for(var i in items) {
|
||
|
extractCitation(uris[i], elmts[i], items[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|