268 lines
8.0 KiB
JavaScript
268 lines
8.0 KiB
JavaScript
|
{
|
||
|
"translatorID": "330f283f-12e9-4421-aa59-e17ec5f4aa37",
|
||
|
"label": "Glenbow Library",
|
||
|
"creator": "Adam Crymble",
|
||
|
"target": "^https?://ww2\\.glenbow\\.org/",
|
||
|
"minVersion": "1.0.0b4.r5",
|
||
|
"maxVersion": "",
|
||
|
"priority": 100,
|
||
|
"inRepository": true,
|
||
|
"translatorType": 4,
|
||
|
"browserSupport": "gcsibv",
|
||
|
"lastUpdated": "2012-03-12 01:00:30"
|
||
|
}
|
||
|
|
||
|
function detectWeb(doc, url) {
|
||
|
|
||
|
if (doc.title.match("Library Main Catalogue Search Results") && doc.location.href.match("GET_RECORD")) {
|
||
|
return "book";
|
||
|
} else if
|
||
|
(doc.title.match("Library Map Collection Search Results") && doc.location.href.match("GET_RECORD")) {
|
||
|
return "map";
|
||
|
|
||
|
} else if
|
||
|
(doc.title.match("Library Main Catalogue Search Results") && !(doc.location.href.match("GET_RECORD"))) {
|
||
|
return "multiple";
|
||
|
} else if
|
||
|
(doc.title.match("Map Collection Search Results") && !(doc.location.href.match("GET_RECORD"))) {
|
||
|
return "multiple";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Translator for the Glenbow Museum Collection. Code by Adam Crymble
|
||
|
//Only works for Library Main Catalogue and Map Collection. The other categories do not have stable URLs for individual entries.
|
||
|
|
||
|
|
||
|
function associateContent (newItem, dataTags, field, zoteroField) {
|
||
|
if (dataTags[field]) {
|
||
|
newItem[zoteroField] = dataTags[field];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function scrape (doc, url) {
|
||
|
var namespace = doc.documentElement.namespaceURI;
|
||
|
var nsResolver = namespace ? function(prefix) {
|
||
|
} : null;
|
||
|
|
||
|
var fieldTitle = new Array();
|
||
|
var tagsContent = new Array();
|
||
|
|
||
|
if (detectWeb(doc, url) == "book") {
|
||
|
|
||
|
newItem = new Zotero.Item("book");
|
||
|
authorType= "author";
|
||
|
|
||
|
} else if (detectWeb(doc, url) == "map") {
|
||
|
|
||
|
newItem = new Zotero.Item("map");
|
||
|
authorType= "cartographer";
|
||
|
}
|
||
|
|
||
|
var dataTags= new Object();
|
||
|
var authorType;
|
||
|
var organizeName;
|
||
|
|
||
|
if (doc.evaluate('//tr/td/p', doc, nsResolver, XPathResult.ANY_TYPE, null)) {
|
||
|
var xPathContent = doc.evaluate('//tr/td/p', doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
var xPathCount = doc.evaluate('count (//tr/td/p)', doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
|
||
|
for (var i = 0; i < xPathCount.numberValue; i++) {
|
||
|
|
||
|
fieldTitle= xPathContent.iterateNext().textContent;
|
||
|
|
||
|
var separate = fieldTitle.indexOf(":");
|
||
|
var fieldTitle1 = fieldTitle.substr(0, separate);
|
||
|
fieldTitle1 = fieldTitle1.replace(/\s+/g, '');
|
||
|
|
||
|
var fieldContent = fieldTitle.substr(separate + 2);
|
||
|
|
||
|
dataTags[fieldTitle1] = (fieldContent);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//names start
|
||
|
if (dataTags["Names"]) {
|
||
|
|
||
|
//if there are multiple authors:
|
||
|
if (dataTags["Names"].match("\n")) {
|
||
|
var multipleNames = dataTags["Names"].split("\n");
|
||
|
|
||
|
for (j = 0; j < multipleNames.length; j++) {
|
||
|
if (detectWeb(doc, url) == "book") {
|
||
|
multipleNames[j] = multipleNames[j].substr(3);
|
||
|
|
||
|
} else if (detectWeb(doc, url) == "map") {
|
||
|
multipleNames[j] = multipleNames[j];
|
||
|
}
|
||
|
|
||
|
if (multipleNames[j].match(/\,/)) {
|
||
|
|
||
|
organizeName = multipleNames[j].split(",");
|
||
|
organizeName = (organizeName[1] + (" ") + organizeName[0]);
|
||
|
newItem.creators.push(Zotero.Utilities.cleanAuthor(organizeName, authorType));
|
||
|
|
||
|
} else {
|
||
|
newItem.creators.push({lastName: multipleNames[j], creatorType: authorType});
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//if there is 1 human author
|
||
|
} else if (dataTags["Names"].match(/\,/)) {
|
||
|
if (detectWeb(doc, url) == "book") {
|
||
|
var organizeName = dataTags["Names"].substr(3).split(",");
|
||
|
|
||
|
} else if (detectWeb(doc, url) == "map") {
|
||
|
var organizeName = dataTags["Names"].split(",");
|
||
|
}
|
||
|
|
||
|
organizeName = (organizeName[1] + (" ") + organizeName[0]);
|
||
|
newItem.creators.push(Zotero.Utilities.cleanAuthor(organizeName,authorType));
|
||
|
|
||
|
//if there is 1 corporate author
|
||
|
} else {
|
||
|
if (detectWeb(doc, url) == "book") {
|
||
|
newItem.creators.push({lastName: dataTags["Names"].substr(3), creatorType: authorType});
|
||
|
|
||
|
} else if (detectWeb(doc, url) == "map") {
|
||
|
newItem.creators.push({lastName: dataTags["Names"], creatorType: authorType});
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//tags start
|
||
|
if (dataTags["Subjects"]) {
|
||
|
if (dataTags["Subjects"].match("\n")) {
|
||
|
var multipleSubjects= dataTags["Subjects"].split("\n");
|
||
|
|
||
|
for (j = 0; j < multipleSubjects.length; j++) {
|
||
|
multipleSubjects[j] = multipleSubjects[j].substr(3);
|
||
|
tagsContent.push(Zotero.Utilities.cleanTags(multipleSubjects[j]));
|
||
|
}
|
||
|
} else {
|
||
|
dataTags["Subjects"] = dataTags["Subjects"].substr(3);
|
||
|
tagsContent.push(Zotero.Utilities.cleanTags(dataTags["Subjects"]));
|
||
|
}
|
||
|
|
||
|
for (var y = 0; y < tagsContent.length; y++) {
|
||
|
newItem.tags[y] = tagsContent[y];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//book publisher info start
|
||
|
if (dataTags["PublishingInformation"]) {
|
||
|
dataTags["PublishingInformation"] = dataTags["PublishingInformation"].replace(/\[|\]*/g, '');
|
||
|
|
||
|
var pubLoc= dataTags["PublishingInformation"].split(":");
|
||
|
if (pubLoc[1]) {
|
||
|
dataTags["Place"] = pubLoc[0];
|
||
|
|
||
|
var pubAndDate = pubLoc[1].split(",");
|
||
|
dataTags["Publisher"] = pubAndDate[0];
|
||
|
dataTags["Date"] = pubAndDate[1];
|
||
|
} else {
|
||
|
associateContent (newItem, dataTags, "PublishingInformation", "date");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//accession number start
|
||
|
if (dataTags["Accessionnumber"]) {
|
||
|
|
||
|
dataTags["Accessionnumber"] = ("Accession number: " + dataTags["Accessionnumber"]);
|
||
|
}
|
||
|
|
||
|
if (dataTags["CallNumber"]) {
|
||
|
if (dataTags["CallNumber"] == ' ') {
|
||
|
dataTags["CallNumber"] = "None";
|
||
|
Zotero.debug(dataTags["CallNumber"]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
associateContent (newItem, dataTags, "CallNumber", "callNumber");
|
||
|
associateContent (newItem, dataTags, "Title", "title");
|
||
|
associateContent (newItem, dataTags, "Place", "place");
|
||
|
associateContent (newItem, dataTags, "Publisher", "publisher");
|
||
|
associateContent (newItem, dataTags, "Date", "date");
|
||
|
associateContent (newItem, dataTags, "Description", "pages");
|
||
|
associateContent (newItem, dataTags, "Edition", "edition");
|
||
|
associateContent (newItem, dataTags, "Notes", "abstractNote");
|
||
|
associateContent (newItem, dataTags, "Accessionnumber", "extra");
|
||
|
associateContent (newItem, dataTags, "Scale", "scale");
|
||
|
|
||
|
newItem.url = doc.location.href;
|
||
|
if (!newItem.title) newItem.title = "New Search Terms Suggested"
|
||
|
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 articles = new Array();
|
||
|
var dataTags = new Object();
|
||
|
var titleList = new Array();
|
||
|
var uris = new Array();
|
||
|
var next_title= new Array();
|
||
|
|
||
|
if (detectWeb(doc, url) == "multiple") {
|
||
|
|
||
|
//checks multiple entries for a link to a single entry page.
|
||
|
if (doc.evaluate('//td/div[@class="floatRight"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null)) {
|
||
|
|
||
|
var items = new Object();
|
||
|
var titles = doc.evaluate('//td/p', doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
|
||
|
var xPathMultiCount = doc.evaluate('count (//td/p)', doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
|
||
|
|
||
|
for (var i = 0; i < xPathMultiCount.numberValue; i++) {
|
||
|
|
||
|
articles= titles.iterateNext().textContent;
|
||
|
|
||
|
var separateMulti = articles.indexOf(":");
|
||
|
var articles1 = articles.substr(0, separateMulti);
|
||
|
articles1 = articles1.replace(/\s+/g, '');
|
||
|
|
||
|
var multiContent = articles.substr(separateMulti + 2);
|
||
|
|
||
|
dataTags[articles1] = (multiContent);
|
||
|
|
||
|
if (articles1 == "Title") {
|
||
|
titleList.push(dataTags["Title"]);
|
||
|
}
|
||
|
if (articles1 == "See") {
|
||
|
titleList.push("skip");
|
||
|
}
|
||
|
}
|
||
|
var links = doc.evaluate('//td/div[@class="floatRight"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
var xPathLinksCount = doc.evaluate('count (//td/div[@class="floatRight"]/a)', doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||
|
|
||
|
for (i=0; i<xPathLinksCount.numberValue; i++) {
|
||
|
next_title.push(links.iterateNext().href);
|
||
|
if (titleList[i] != "skip") {
|
||
|
items[next_title] = titleList[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
items = Zotero.selectItems(items);
|
||
|
|
||
|
for (var i in items) {
|
||
|
uris.push(i);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//code if single entry only.
|
||
|
} else {
|
||
|
uris = [url];
|
||
|
}
|
||
|
|
||
|
Zotero.Utilities.processDocuments(uris, scrape, function() {Zotero.done();});
|
||
|
Zotero.wait();
|
||
|
}
|
||
|
//Session time-out --> no tests
|