zotero/translators/RSC Publishing.js

438 lines
18 KiB
JavaScript

{
"translatorID":"1c34744d-690f-4cac-b31b-b7f0c90ac14d",
"translatorType":4,
"label":"RSC Publishing",
"creator":"Ramesh Srigiriraju",
"target":"http://(:?www\\.|google\\.)?rsc\\.org/",
"minVersion":"1.0.0b3.r1",
"maxVersion":"",
"priority":100,
"inRepository":true,
"lastUpdated":"2007-12-21 16:00:00"
}
function detectWeb(doc, url) {
var namespace=doc.documentElement.namespaceURI;
var nsResolver=namespace?function(prefix) {
return (prefix=="x")?namespace:null;
}:null;
var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
if(journalreg.test(url)) {
var browspath='//div/p/a[text()="Use advanced search"]';
if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "multiple";
var searchpath='//a[text()="Back to Search Form"]';
if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "multiple";
var singpath='//ul/li/a[text()="HTML Article" or text()="PDF"]';
if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "journalArticle";
}
var magpath='//div/h3[text()="Link to journal article"]';
if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "magazineArticle";
var magbrows='//div/h4[@class="newstitle"]/a';
if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "multiple";
var magsearch='//p[@class="more"]/strong/a[text()="Search RSC journals"]';
if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "multiple";
var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
if(bookreg.test(url)) {
var pagepath='//title/text()';
var page=doc.evaluate(pagepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
||(page=="Book Series"))
return "multiple";
var chappath='//dt/img[@alt="Chapter"]';
var singpath='//h3[text()="Table of Contents"]';
if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "bookSection";
else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "book";
}
var searchpath='//div/p[@class="title"][text()="Search Results"]';
if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
return "multiple";
}
function doChap(newItem, chaptext) {
var chapdata=chaptext.split("<br>");
for(var pos=chapdata.length-2; pos>=0; pos--) {
chapdata[pos]=Zotero.Utilities.cleanTags(chapdata[pos]);
if(chapdata[pos].indexOf("Editors")!=-1) {
var editors=chapdata[pos].split(",");
for(var i=0; i<=editors.length-1; i++) {
editors[i]=Zotero.Utilities.cleanString(editors[i]);
var names=editors[i].split(" ");
var creators=new Array();
if(i==0)
creators.firstName=names[1];
else
creators.firstName=names[0];
creators.lastName=names[names.length-1];
creators.creatorType="editor";
newItem.creators.push(creators);
}
}
if(chapdata[pos].indexOf("Authors")!=-1) {
var authors=chapdata[pos].split(",");
for(var i=0; i<=authors.length-1; i++) {
authors[i]=Zotero.Utilities.cleanString(authors[i]);
var names=authors[i].split(" ");
var creators=new Array();
if(i==0)
creators.firstName=names[1];
else
creators.firstName=names[0];
creators.lastName=names[names.length-1];
creators.creatorType="editor";
newItem.creators.push(creators);
}
}
if(chapdata[pos].indexOf("DOI")!=-1)
newItem.itemID=chapdata[pos].substring(chapdata[pos].indexOf("1"));
if(chapdata[pos].indexOf("Book")!=-1)
newItem.bookTitle=chapdata[pos].substring(chapdata[pos].indexOf(" ")+1);
}
}
function doBook(newItem, bookdata) {
var fields=bookdata.split("<br>");
for(var pos=fields.length-2; pos>=0; pos--) {
fields[pos]=Zotero.Utilities.cleanTags(fields[pos]);
if(fields[pos].indexOf("Volume")!=-1) {
var i=fields[pos].lastIndexOf(";");
var vol;
if(i!=-1)
vol=fields[pos].substring(i+1);
else
vol=fields[pos].substring(fields[pos].lastIndexOf(" "));
newItem.volume=Zotero.Utilities.cleanString(vol);
}
if(fields[pos].indexOf("Edition")!=-1) {
var i=fields[pos].lastIndexOf(";");
if(i!=-1)
ed=fields[pos].substring(i+1);
else
ed=fields[pos].substring(fields[pos].lastIndexOf(" "));
newItem.edition=Zotero.Utilities.cleanString(ed);
}
if(fields[pos].indexOf("Copyright")!=-1) {
var i=fields[pos].lastIndexOf(";");
var date;
if(i!=-1)
date=fields[pos].substring(i+1);
else
date=fields[pos].substring(fields[pos].indexOf(":")+2);
newItem.date=Zotero.Utilities.cleanString(date);
}
if(fields[pos].indexOf("ISBN")!=-1&&fields[pos].indexOf("print")!=-1) {
var i=fields[pos].lastIndexOf(";");
var isbn;
if(i!=-1)
isbn=fields[pos].substring(i+1);
else
isbn=fields[pos].substring(fields[pos].indexOf(":")+2);
newItem.ISBN=Zotero.Utilities.cleanString(isbn);
}
if(fields[pos].indexOf("Author")!=-1||fields[pos].indexOf("Editor")!=-1) {
var authors=fields[pos].split(",");
for(var i=0; i<=authors.length-1; i++) {
authors[i]=Zotero.Utilities.cleanString(authors[i]);
var names=authors[i].split(" ");
var creators=new Array();
creators.firstName=names[0];
creators.lastName=names[names.length-2];
if(names[names.length-1]=="(Editor)")
creators.creatorType="editor";
if(names[names.length-1]=="(Author)")
creators.creatorType="author";
newItem.creators.push(creators);
}
}
if(fields[pos].indexOf("DOI:")!=-1)
newItem.itemID=fields[pos].substring(fields[pos].indexOf("1"));
}
}
function doWeb(doc, url) {
var namespace=doc.documentElement.namespaceURI;
var nsResolver=namespace?function(prefix) {
return (prefix=="x")?namespace:null;
}:null;
var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
if(journalreg.test(url)) {
var browspath='//div/p/a[text()="Use advanced search"]';
if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var doipath='//p[strong/text()="DOI:"]/a/text()';
var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var titlpath='//p/strong/a';
var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var items=new Array();
var doi;
while(doi=dois.iterateNext())
items[doi.nodeValue]=Zotero.Utilities.cleanString(titles.iterateNext().textContent);
items=Zotero.selectItems(items);
var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
for(var codes in items) {
var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
Zotero.Utilities.HTTP.doGet(string, function(text) {
var trans=Zotero.loadTranslator("import");
trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
// fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
text = text.replace("Y1 - ", "Y1 - ");
trans.setString(text);
trans.translate();
Zotero.done();
});
}
}
var searchpath='//a[text()="Back to Search Form"]';
if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var doipath='//p[strong/text()="DOI:"]/a/text()';
var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var titlpath='//form/div/h5';
var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var title;
var items=new Array();
while(title=titles.iterateNext())
items[dois.iterateNext().nodeValue]=title.textContent;
items=Zotero.selectItems(items);
var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
for(var codes in items) {
var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
Zotero.Utilities.HTTP.doGet(string, function(text) {
var trans=Zotero.loadTranslator("import");
trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
// fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
text = text.replace("Y1 - ", "Y1 - ");
trans.setString(text);
trans.translate();
Zotero.done();
});
}
}
var singpath='//ul/li/a[text()="HTML Article" or text()="PDF"]';
if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var doipath='//div/p[strong/text()="DOI:"]';
var text=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
var doi=text.substring(text.indexOf("/")+1);
var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID="+doi;
string+="&type=refman";
Zotero.Utilities.HTTP.doGet(string, function(text) {
var trans=Zotero.loadTranslator("import");
trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
// fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
text = text.replace("Y1 - ", "Y1 - ");
trans.setString(text);
trans.setHandler("itemDone", function(obj, newItem) {
var url2=newItem.url;
var stringy;
var archpath='//div[h3/text()="Journals archive purchaser access"]';
if(doc.evaluate(archpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var stringy="http://www.rsc.org/ejarchive/";
stringy+=url2.substring(url2.lastIndexOf("/")+1)+".pdf";
newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
}
else {
var stringy="http://www.rsc.org/delivery/_ArticleLinking/DisplayArticleForFree.cfm?doi=";
stringy+=url2.substring(url2.lastIndexOf("/")+1);
newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
}
newItem.complete();
});
trans.translate();
Zotero.done();
});
}
}
var magpath='//div/h3[text()="Link to journal article"]';
if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var newItem=new Zotero.Item("magazineArticle");
var titlpath='//div/h2/div[@class="header"]/text()';
newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
var authpath='//em/text()';
var auth=doc.evaluate(authpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
var authors=auth.split(",");
if(newItem.title.indexOf("Interview")==-1)
for(var i=0; i<=authors.length-1; i++) {
authors[i]=Zotero.Utilities.cleanString(authors[i]);
var names=authors[i].split(" ");
var creator=new Array();
creator.firstName=names[0];
creator.lastName=names[names.length-1];
newItem.creators.push(creator);
}
var textpath='//div[@id="content"]//text()';
var text=doc.evaluate(textpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var temp;
while(temp=text.iterateNext())
if(temp.nodeValue==newItem.title) {
newItem.date=text.iterateNext().nodeValue;
break;
}
var datapath= '//div[@id="breadcrumbs"]/ul/li/a/text()';
var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var prev;
while(temp=data.iterateNext()) {
if(temp.nodeValue.indexOf("Chemi")!=-1)
newItem.publication=temp.nodeValue;
prev=temp;
}
newItem.issue=prev.nodeValue;
newItem.complete();
}
var magbrows='//div/h4[@class="newstitle"]/a';
if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var titlpath='//h4[@class="newstitle"]/a';
var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var title;
var items=new Array();
while(title=titles.iterateNext())
items[title.href]=title.textContent;
items=Zotero.selectItems(items);
for(var linx in items) {
var newItem=new Zotero.Item("magazineArticle");
newItem.url=linx;
newItem.title=items[linx];
var datepath='//div[h4/a/text()="'+items[linx]+'"]/h4[@class="datetext"]/text()';
newItem.date=doc.evaluate(datepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
var datapath= '//div[@id="breadcrumbs"]/ul/li/a/text()';
var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var prev;
var temp;
while(temp=data.iterateNext()) {
if(temp.nodeValue.indexOf("Chemi")!=-1)
newItem.publication=temp.nodeValue;
prev=temp;
}
if(prev.nodeValue!=newItem.publication)
newItem.issue=prev.nodeValue;
newItem.complete();
}
}
var magsearch='//p[@class="more"]/strong/a[text()="Search RSC journals"]';
if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var titlpath='//div/p/a';
var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
titlpath='//blockquote/p/a[span/@class="l"]';
var titles2=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null)
var title;
var items=new Array();
while(title=titles.iterateNext())
items[title.href]=title.textContent;
while(title=titles2.iterateNext())
items[title.href]=title.textContent;
items=Zotero.selectItems(items);
for(var linx in items) {
var newItem=new Zotero.Item("magazineArticle");
newItem.url=linx;
newItem.title=items[linx];
newItem.complete();
}
}
var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
if(bookreg.test(url)) {
var browspath='//title/text()';
var page=doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
||(page=="Book Series")) {
var doipath='//dd/p/a/text()';
var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var items=new Array();
var title;
while(title=dois.iterateNext()) {
var doi=dois.iterateNext().nodeValue;
items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
}
items=Zotero.selectItems(items);
for(var codes in items) {
var newItem=new Zotero.Item("book");
newItem.itemID=codes;
newItem.title=items[codes];
var itempath='//dd/p[contains(a[2]/text(), "'+codes+'")]';
var itempath2='//dd/p[contains(a/text(), "'+codes+'")]';
var data;
if(data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
data=data.innerHTML;
else if(data=doc.evaluate(itempath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
data=data.innerHTML;
doBook(newItem, data);
newItem.complete();
}
}
var chappath='//dt/img[@alt="Chapter"]';
var singpath='//h3[text()="Table of Contents"]';
if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var newItem=new Zotero.Item("bookSection");
var titlpath='//span/h3/text()';
var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
newItem.title=titles.iterateNext().nodeValue;
newItem.bookTitle=titles.iterateNext().nodeValue;
var datapath='//dd/p';
var entries=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var chaptext=entries.iterateNext().innerHTML;
doChap(newItem, chaptext);
var bookdata=entries.iterateNext().innerHTML;
doBook(newItem, bookdata);
var linkpath='//td[1][@class="td1"]/a[1]';
var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var pdflink;
while(pdflink=linx.iterateNext())
newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
newItem.complete();
}
else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var newItem=new Zotero.Item("book");
var itempath='//dd/p';
var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
doBook(newItem, data);
var titlpath='//div/h2/text()';
newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
var linkpath='//td[1][@class="td1"]/a[1]';
var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var pdflink;
while(pdflink=linx.iterateNext())
newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
newItem.complete();
}
}
var searchpath='//div/p[@class="title"][text()="Search Results"]';
if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
var doipath='//dd/p/a/text()';
var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
var title;
var items=new Array();
while(title=dois.iterateNext()) {
var doi=dois.iterateNext().nodeValue;
items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
}
items=Zotero.selectItems(items);
for(var codes in items) {
var itempath='//dd/p[contains(a/text(), "'+codes+'")]';
var newpath='//dd[contains(p[2]/a/text(), "'+codes+'")]/p[1]/strong/text()';
var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
if(data.indexOf("Book:")!=-1) {
var newItem=new Zotero.Item("bookSection");
newItem.itemID=codes;
newItem.title=items[codes];
doChap(newItem, data);
newItem.complete();
}
else {
var newItem=new Zotero.Item("book");
var newdata=doc.evaluate(newpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
if(newdata.indexOf("Volume")!=-1)
newItem.volume=newdata.substring(newdata.lastIndexOf(" ")+1);
else
newItem.series=newdata;
newItem.itemID=codes;
newItem.title=items[codes];
doBook(newItem, data);
newItem.complete();
}
}
}
Zotero.wait();
}