111 lines
3.8 KiB
JavaScript
111 lines
3.8 KiB
JavaScript
{
|
|
"translatorID":"3e684d82-73a3-9a34-095f-19b112d88bbf",
|
|
"translatorType":4,
|
|
"label":"Google Books",
|
|
"creator":"Simon Kornblith and Michael Berkowitz",
|
|
"target":"^http://books\\.google\\.[a-z]+(\\.[a-z]+)?/books\\?(.*id=.*|.*q=.*)",
|
|
"minVersion":"1.0.0b3.r1",
|
|
"maxVersion":"",
|
|
"priority":100,
|
|
"inRepository":true,
|
|
"lastUpdated":"2008-09-02 11:15:00"
|
|
}
|
|
|
|
function detectWeb(doc, url) {
|
|
var re = new RegExp('^http://books\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)', 'i');
|
|
if(re.test(doc.location.href)) {
|
|
return "book";
|
|
} else {
|
|
return "multiple";
|
|
}
|
|
}
|
|
|
|
function doWeb(doc, url) {
|
|
// get local domain suffix
|
|
var suffixRe = new RegExp("https?://books\.google\.([^/]+)/");
|
|
var suffixMatch = suffixRe.exec(url);
|
|
var suffix = suffixMatch[1];
|
|
var uri = doc.location.href;
|
|
var newUris = new Array();
|
|
|
|
var re = new RegExp('^http://books\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)', 'i');
|
|
var m = re.exec(uri);
|
|
if(m) {
|
|
newUris.push('http://books.google.'+suffix+'/books?id='+m[2]);
|
|
} else {
|
|
var items = Zotero.Utilities.getItemArray(doc, doc, 'http://books\\.google\\.' + suffix + '/books\\?id=([^&]+)', '^(?:All matching pages|About this Book|Table of Contents|Index)');
|
|
// Drop " - Page" thing
|
|
for(var i in items) {
|
|
items[i] = items[i].replace(/- Page [0-9]+\s*$/, "");
|
|
}
|
|
items = Zotero.selectItems(items);
|
|
|
|
if(!items) {
|
|
return true;
|
|
}
|
|
|
|
for(var i in items) {
|
|
var m = re.exec(i);
|
|
newUris.push('http://books.google.'+suffix+'/books?id='+m[2]);
|
|
}
|
|
}
|
|
Zotero.debug(newUris);
|
|
Zotero.Utilities.processDocuments(newUris, function(newDoc) {
|
|
var newItem = new Zotero.Item("book");
|
|
newItem.extra = "";
|
|
|
|
var namespace = newDoc.documentElement.namespaceURI;
|
|
var nsResolver = namespace ? function(prefix) {
|
|
if (prefix == 'x') return namespace; else return null;
|
|
} : null;
|
|
|
|
var xpath = '//h2[@class="title"]'
|
|
var elmt;
|
|
if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver,
|
|
XPathResult.ANY_TYPE, null).iterateNext()){
|
|
var title = Zotero.Utilities.superCleanString(elmt.textContent);
|
|
newItem.title = title;
|
|
Zotero.debug("title: " + title);
|
|
}
|
|
xpath = '//div[@class="titlewrap"]/span[@class="addmd"]'
|
|
if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver,
|
|
XPathResult.ANY_TYPE, null).iterateNext()){
|
|
var authors = Zotero.Utilities.superCleanString(elmt.textContent);
|
|
if (authors.substring(0, 3) == "By "){
|
|
authors = authors.substring(3);
|
|
}
|
|
authors = authors.split(", ");
|
|
for(j in authors) {
|
|
newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author"));
|
|
}
|
|
}
|
|
|
|
xpath = '//td[2][@id="bookinfo"]/div[@class="bookinfo_sectionwrap"]/div';
|
|
var elmts = newDoc.evaluate(xpath, newDoc, nsResolver,
|
|
XPathResult.ANY_TYPE, null);
|
|
while(elmt = elmts.iterateNext()) {
|
|
var fieldelmt = newDoc.evaluate('.//text()', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
|
|
if(fieldelmt) {
|
|
field = Zotero.Utilities.superCleanString(fieldelmt.nodeValue);
|
|
Zotero.debug("output: " + field);
|
|
if(field.substring(0,10) == "Published ") {
|
|
newItem.date = field.substring(field.length-4);
|
|
var publisher = newDoc.evaluate('..//a', fieldelmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
|
|
if (publisher){
|
|
publisher = Zotero.Utilities.superCleanString(publisher.textContent);
|
|
newItem.publisher = publisher;
|
|
}
|
|
} else if(field.substring(0,5) == "ISBN ") {
|
|
newItem.ISBN = field.substring(5);
|
|
} else if(field.substring(field.length-6) == " pages") {
|
|
newItem.pages = field.substring(0, field.length-6);
|
|
} else if(field.substring(0,12) == "Contributor ") {
|
|
newItem.creators.push(Zotero.Utilities.cleanAuthor(field.substring(12), "contributor"));
|
|
}
|
|
}
|
|
}
|
|
newItem.complete();
|
|
}, function() { Zotero.done(); }, null);
|
|
|
|
Zotero.wait();
|
|
} |