274 lines
No EOL
9.3 KiB
JavaScript
274 lines
No EOL
9.3 KiB
JavaScript
{
|
|
"translatorID":"5278b20c-7c2c-4599-a785-12198ea648bf",
|
|
"translatorType":4,
|
|
"label":"ARTstor",
|
|
"creator":"Ameer Ahmed and Michael Berkowitz",
|
|
"target":"http://[^/]artstor.org[^/]*",
|
|
"minVersion":"1.0.0b4.r5",
|
|
"maxVersion":"",
|
|
"priority":100,
|
|
"inRepository":true,
|
|
"lastUpdated":"2009-11-13 07:10:00"
|
|
}
|
|
|
|
function detectWeb(doc, url) {
|
|
if (url.match(/(S|s)earch/) && (doc.evaluate('//div[@id="thumbContentWrap"]/div', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\w+/))) return "multiple"
|
|
}
|
|
|
|
function doWeb(doc, url) {
|
|
if (url.indexOf("|")!=-1){
|
|
scrape(doc, url);
|
|
}
|
|
}
|
|
|
|
// TODO: Remove this when we drop support for Fx3
|
|
if (!JSON) {
|
|
var JSON = new function() {
|
|
this.parse = function (arg) {
|
|
var j;
|
|
if (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(arg.
|
|
replace(/\\./g, '@').
|
|
replace(/"[^"\\\n\r]*"/g, ''))) {
|
|
// Friendly AMO reviewer: This is the official json.org library and is safe.
|
|
j = eval('(' + arg + ')');
|
|
return j;
|
|
}
|
|
throw new SyntaxError('parseJSON');
|
|
}
|
|
}
|
|
}
|
|
|
|
function scrape(doc, url){
|
|
var savedItems = new Array();
|
|
var saved = 0;
|
|
var urlstub = url.substring(url.indexOf('.org/')+5,url.length);
|
|
urlstub = url.substring(0,url.indexOf('.org/')+5) + urlstub.substring(0, urlstub.indexOf('/')+1)
|
|
var suburl = url.substring(url.indexOf('|')+1, url.length);
|
|
var groupname = suburl.substring(0, suburl.indexOf("|"));
|
|
var searchterm = '//*[@id="thumbSubTitle"]';
|
|
var stt = doc.evaluate(searchterm, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
|
|
var st = stt.firstChild.nodeValue;
|
|
var pageNn = '//*[@id="pageNo"]';
|
|
var stt = doc.evaluate(pageNn, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
|
|
var pg;
|
|
if (stt.value==1){
|
|
pg = 1;
|
|
} else if (stt.value==2){
|
|
pg = 25;
|
|
} else {
|
|
pg = ((stt.value-1) * 24) + 1;
|
|
}
|
|
var groupid;
|
|
//check if user is on search page if not construct the query using the 2nd pattern
|
|
if (groupname.indexOf("search")!=-1){
|
|
groupid = "1/" + pg + "/24/0?tn=1&name=&id=all&kw=" +st + "&type=1";
|
|
}else {
|
|
groupid = suburl.substring(suburl.indexOf('|')+1, suburl.indexOf('||')) + "//thumbnails/" + pg + "/24/0";
|
|
}
|
|
// Initial query to get results from the service - primary purpose is to get objectids. which in turn are required for the 2nd service call, which exposes the actual metadata
|
|
Zotero.Utilities.HTTP.doGet(urlstub + "secure/" + groupname + "//" + groupid, function(text) {
|
|
var json = JSON.parse(text);
|
|
items = new Object();
|
|
for(var i=0; i<json.thumbnails.length; i++) {
|
|
child = json.thumbnails[i];
|
|
var tmpUrl = urlstub + "secure/metadata/" + child.objectId + "?_method=Infolder";
|
|
//here we are saving the url service call to get each objects metadata
|
|
savedItems[saved] = tmpUrl;
|
|
items[tmpUrl]=child.objectId;
|
|
saved++;
|
|
}
|
|
// GET VALUES FROM THE WEB
|
|
var xpath = '//div[@id="thumbContentWrap"]';
|
|
var elmts = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext();
|
|
var webitems = new Object();
|
|
var selectedNums = new Array();
|
|
var si=0;
|
|
var c = elmts.getElementsByTagName('*');
|
|
var title = "";
|
|
for(var i=0; i<c.length; i++) {
|
|
var child = c[i];
|
|
if (child.id.indexOf("_imageHolder")!=-1){
|
|
var csss = child.style;
|
|
var glow = csss.getPropertyValue('border');
|
|
}
|
|
if (child.id.indexOf("_thumb1")!=-1){
|
|
title = child.title;
|
|
}
|
|
if (child.id.indexOf("_thumb2")!=-1){
|
|
title+= " :: " + child.title;
|
|
}
|
|
if (child.id.indexOf("_thumb3")!=-1){
|
|
var childtitle = child.title;
|
|
var dialogTitle = title;
|
|
if (childtitle.length>1) {
|
|
dialogTitle+=" " + childtitle;
|
|
}
|
|
var sitem = child.id.substring(6,child.id.indexOf("_"));
|
|
webitems[sitem-1] = dialogTitle;
|
|
if (glow.indexOf(75)!=-1){
|
|
selectedNums[si]=sitem-1;
|
|
si++;
|
|
}
|
|
title = null;
|
|
}
|
|
}
|
|
// GET VALUES FROM THE WEB
|
|
var tcount=0;
|
|
var newitems = null;
|
|
if (selectedNums.length>0){
|
|
newitems = new Object();
|
|
for (j=0; j<selectedNums.length;j++){
|
|
var numnum = selectedNums[j];
|
|
for (var x in items){
|
|
if (numnum==tcount){
|
|
newitems[x] = webitems[tcount];
|
|
tcount=0;
|
|
break;
|
|
} else {
|
|
tcount++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
tcount = 0;
|
|
for (var x in items){
|
|
items[x] = webitems[tcount];
|
|
tcount++;
|
|
}
|
|
}
|
|
if (newitems!=null){
|
|
items = newitems;
|
|
}
|
|
//show dialogbox
|
|
var items = Zotero.selectItems(items);
|
|
if(!items) {
|
|
return true;
|
|
}
|
|
var urls = new Array();
|
|
for(var i in items) {
|
|
urls.push(i);
|
|
}
|
|
//this gets called when an object is selected in the dialog box, fires off a get on the service url
|
|
Zotero.Utilities.HTTP.doGet(urls, function(text) {
|
|
var json = JSON.parse(text);
|
|
var newArticle = new Zotero.Item('artwork');
|
|
for (var i=0; i<json.metaData.length; i++) {
|
|
child = json.metaData[i];
|
|
// MISSING CULTURE!!!
|
|
if (child.fieldName.indexOf("Title")!=-1){
|
|
if (newArticle.title!=null){
|
|
newArticle.title+= ";" + child.fieldValue;
|
|
} else {
|
|
newArticle.title = child.fieldValue;
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Creator")!=-1){
|
|
if (child.fieldValue != "") {
|
|
if (child.fieldValue.match(/,/)) {
|
|
var aut = child.fieldValue.match(/^([^,]+),\s+(.*)$/);
|
|
if (aut[1].match(/\s/)) {
|
|
newArticle.notes.push({note:"Artist information: " + aut[2]});
|
|
newArticle.creators.push(Zotero.Utilities.cleanAuthor(aut[1], "artist"));
|
|
} else {
|
|
var extras = aut[2].match(/^([^,]+),\s+(.*)$/);
|
|
newArticle.creators.push({firstName:extras[1], lastName:aut[1], creatorType:"author"});
|
|
newArticle.notes.push({note:"Artist information: " + extras[2]});
|
|
}
|
|
} else {
|
|
newArticle.creators.push(Zotero.Utilities.cleanAuthor(child.fieldValue, "artist"));
|
|
}
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Culture")!=-1){
|
|
newArticle.creators.push(Zotero.Utilities.cleanAuthor(child.fieldValue, "producer", true));
|
|
}
|
|
if (child.fieldName.indexOf("Rights")!=-1){
|
|
if (newArticle.rights!=null){
|
|
newArticle.rights+= ";" + child.fieldValue.replace(/<wbr\/>/g, "");
|
|
} else {
|
|
newArticle.rights = child.fieldValue.replace(/<wbr\/>/g, "");
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Subject")!=-1){
|
|
newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
|
|
}
|
|
if (child.fieldName.indexOf("Location")!=-1){
|
|
newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
|
|
}
|
|
if (child.fieldName.indexOf("Style Period")!=-1){
|
|
newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
|
|
}
|
|
if (child.fieldName.indexOf("Work Type")!=-1){
|
|
newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue));
|
|
}
|
|
if (child.fieldName.indexOf("Material")!=-1 || child.fieldName.indexOf("Technique")!=-1 ){
|
|
if (newArticle.artworkMedium!=null){
|
|
newArticle.artworkMedium+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
|
|
} else {
|
|
newArticle.artworkMedium = Zotero.Utilities.trimInternal(child.fieldValue);
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Measurements")!=-1){
|
|
if (newArticle.artworkSize!=null){
|
|
newArticle.artworkSize+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
|
|
} else {
|
|
newArticle.artworkSize = Zotero.Utilities.trimInternal(child.fieldValue);
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Date")!=-1){
|
|
if (newArticle.date!=null){
|
|
newArticle.date+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
|
|
} else {
|
|
//bug here!! when date parser fails, entire object is not saved in Zotero - works in Scaffold, fails in Zotero! to patch remove all occurrences of B.C
|
|
newArticle.date = Zotero.Utilities.trimInternal(child.fieldValue.replace(/B.C./i, ""));
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Repository")!=-1){
|
|
if (newArticle.repository!=null){
|
|
newArticle.repository+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
|
|
} else {
|
|
newArticle.repository = Zotero.Utilities.trimInternal(child.fieldValue);
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Source")!=-1){
|
|
if (newArticle.archiveLocation!=null){
|
|
newArticle.archiveLocation+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
|
|
} else {
|
|
newArticle.archiveLocation = Zotero.Utilities.trimInternal(child.fieldValue);
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Description")!=-1){
|
|
if (newArticle.abstractNote!=null){
|
|
newArticle.abstractNote+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
|
|
} else {
|
|
newArticle.abstractNote = Zotero.Utilities.trimInternal(child.fieldValue);
|
|
}
|
|
}
|
|
if (child.fieldName.indexOf("Collection")!=-1){
|
|
if (newArticle.extra!=null){
|
|
newArticle.extra+= ";" + Zotero.Utilities.trimInternal(child.fieldValue);
|
|
} else {
|
|
newArticle.extra = Zotero.Utilities.trimInternal(child.fieldValue);
|
|
}
|
|
}
|
|
}
|
|
var objectId = json.objectId;
|
|
//this is called to get the url stub for the ARTstor viewer
|
|
Zotero.Utilities.HTTP.doGet(urlstub + "secure/metadata/" + objectId + "?_method=FpHtml", function(dom) {
|
|
var testurl = dom.substring(dom.lastIndexOf('<td class="data">')+21,dom.lastIndexOf('</td>'));
|
|
var t2 = "http://www.artstor.org";
|
|
var tmp2 = testurl.replace(/<wbr\/>/g, "");
|
|
tmp2 = tmp2.substring(0, tmp2.indexOf("&userId"));
|
|
//build ARTstorImageURL
|
|
artstorimgurl = t2+tmp2;
|
|
newArticle.url = artstorimgurl;
|
|
newArticle.callNumber = objectId;
|
|
newArticle.complete();
|
|
Zotero.done();
|
|
});
|
|
Zotero.wait();
|
|
});
|
|
Zotero.wait();
|
|
});
|
|
Zotero.wait();
|
|
} |