Initial Commit
This commit is contained in:
249
translators/Library Catalog (BiblioCommons).js
Normal file
249
translators/Library Catalog (BiblioCommons).js
Normal file
@@ -0,0 +1,249 @@
|
||||
{
|
||||
"translatorID": "5d506fe3-dbde-4424-90e8-d219c63faf72",
|
||||
"label": "Library Catalog (BiblioCommons)",
|
||||
"creator": "Avram Lyon and Abe Jellinek",
|
||||
"target": "^https?://[^/]+\\.bibliocommons\\.com/",
|
||||
"minVersion": "2.1",
|
||||
"maxVersion": "",
|
||||
"priority": 250,
|
||||
"inRepository": true,
|
||||
"translatorType": 4,
|
||||
"browserSupport": "gcsibv",
|
||||
"lastUpdated": "2021-05-19 21:14:05"
|
||||
}
|
||||
|
||||
/*
|
||||
***** BEGIN LICENSE BLOCK *****
|
||||
|
||||
BiblioCommons Translator
|
||||
Copyright © 2021 Avram Lyon <ajlyon@gmail.com> and Abe Jellinek
|
||||
|
||||
This file is part of Zotero.
|
||||
|
||||
Zotero is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Zotero is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
***** END LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
function detectWeb(doc, url) {
|
||||
if (url.match(/\/v2\/record\//)) {
|
||||
return "book";
|
||||
}
|
||||
if (url.match(/\/v2\/search\?[^/]*query=/)) {
|
||||
return "multiple";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getSearchResults(doc, checkOnly) {
|
||||
var items = {};
|
||||
var found = false;
|
||||
var rows = doc.querySelectorAll('h2.cp-title > a[href*="/item/show"]');
|
||||
for (let row of rows) {
|
||||
let href = row.href;
|
||||
let title = ZU.trimInternal(text(row, '.title-content'));
|
||||
if (!href || !title) continue;
|
||||
if (checkOnly) return true;
|
||||
found = true;
|
||||
items[href] = title;
|
||||
}
|
||||
return found ? items : false;
|
||||
}
|
||||
|
||||
function doWeb(doc, url) {
|
||||
if (detectWeb(doc, url) == "multiple") {
|
||||
Zotero.selectItems(getSearchResults(doc, false), function (items) {
|
||||
if (items) ZU.processDocuments(Object.keys(items), scrape);
|
||||
});
|
||||
}
|
||||
else {
|
||||
scrape(doc, url);
|
||||
}
|
||||
}
|
||||
|
||||
function scrape(doc, url) {
|
||||
let item = new Zotero.Item();
|
||||
item.libraryCatalog = attr(doc, 'meta[property="og:site_name"]', 'content');
|
||||
|
||||
let recordUrl = url.endsWith('/originalrecord') ? url : url + '/originalrecord';
|
||||
ZU.processDocuments(recordUrl, function (marcDoc) {
|
||||
if (!marcDoc.querySelector('.bib-item-row')) {
|
||||
// a small number of items don't have MARC data
|
||||
// in that case, we just do our best
|
||||
Z.debug("No MARC data");
|
||||
|
||||
item.itemType = 'book';
|
||||
item.title = text(doc, '.cp-bib-title span[aria-hidden]');
|
||||
let subtitle = text(doc, '.cp-bib-subtitle');
|
||||
if (subtitle) {
|
||||
item.title += ": " + subtitle;
|
||||
}
|
||||
let authors = doc.querySelectorAll('.main-info .cp-bib-authors span[aria-hidden]');
|
||||
for (let author of authors) {
|
||||
item.creators.push(ZU.cleanAuthor(author.innerText, "author", true));
|
||||
}
|
||||
let bibFields = doc.querySelectorAll('.cp-bib-field');
|
||||
for (let bibField of bibFields) {
|
||||
if (text(bibField, '.cp-bib-field-label').includes("Publication")) {
|
||||
let value = text(bibField, '.main-content').split(', ');
|
||||
item.publisher = value[0];
|
||||
item.date = value[1];
|
||||
}
|
||||
}
|
||||
|
||||
let isbnMatches = text(doc, 'script[data-iso-key="_0"]')
|
||||
.match(/"values":\["([0-9]{10}|[0-9]{13})"\]/);
|
||||
let isbn = isbnMatches && isbnMatches[1];
|
||||
if (isbn) {
|
||||
item.ISBN = ZU.cleanISBN(isbn);
|
||||
}
|
||||
item.complete();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Load MARC
|
||||
let translator = Z.loadTranslator("import");
|
||||
translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
|
||||
|
||||
translator.getTranslatorObject(function (marc) {
|
||||
let record = new marc.record();
|
||||
for (let row of marcDoc.querySelectorAll('.bib-item-row')) {
|
||||
record.addField(text(row, '.tag'), text(row, '.indicator'), row.lastChild.innerText.replace(/\$/g, '\x1F'));
|
||||
}
|
||||
record.translate(item);
|
||||
item.complete();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/** BEGIN TEST CASES **/
|
||||
var testCases = [
|
||||
{
|
||||
"type": "web",
|
||||
"url": "https://bostonpl.bibliocommons.com/v2/record/S75C2051015",
|
||||
"items": [
|
||||
{
|
||||
"itemType": "book",
|
||||
"title": "Labor",
|
||||
"creators": [
|
||||
{
|
||||
"firstName": "Marcia McKenna",
|
||||
"lastName": "Biddle",
|
||||
"creatorType": "author"
|
||||
}
|
||||
],
|
||||
"date": "1979",
|
||||
"ISBN": "9780875181677",
|
||||
"abstractNote": "Brief biographies of five women prominently involved in the labor movement in the United States: Mother Jones, Mary Heaton Vorse, Frances Perkins, Addie Wyatt, and Dolores Huerta. Also includes 11 other women who have made outstanding contributions",
|
||||
"callNumber": "HD6079.2.U5 B52",
|
||||
"libraryCatalog": "Boston Public Library",
|
||||
"numPages": "126",
|
||||
"place": "Minneapolis",
|
||||
"publisher": "Dillon Press",
|
||||
"series": "Contributions of women",
|
||||
"attachments": [],
|
||||
"tags": [
|
||||
{
|
||||
"tag": "Biography Juvenile literature"
|
||||
},
|
||||
{
|
||||
"tag": "Biography Juvenile literature"
|
||||
},
|
||||
{
|
||||
"tag": "Juvenile biography"
|
||||
},
|
||||
{
|
||||
"tag": "Juvenile literature"
|
||||
},
|
||||
{
|
||||
"tag": "United States"
|
||||
},
|
||||
{
|
||||
"tag": "United States"
|
||||
},
|
||||
{
|
||||
"tag": "Women"
|
||||
},
|
||||
{
|
||||
"tag": "Women labor union members"
|
||||
},
|
||||
{
|
||||
"tag": "Women labor union members"
|
||||
},
|
||||
{
|
||||
"tag": "Working class"
|
||||
}
|
||||
],
|
||||
"notes": [],
|
||||
"seeAlso": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "web",
|
||||
"url": "https://bostonpl.bibliocommons.com/v2/search?query=labor&searchType=smart",
|
||||
"items": "multiple"
|
||||
},
|
||||
{
|
||||
"type": "web",
|
||||
"url": "https://markham.bibliocommons.com/v2/record/S34C297846",
|
||||
"items": [
|
||||
{
|
||||
"itemType": "book",
|
||||
"title": "The raven",
|
||||
"creators": [
|
||||
{
|
||||
"firstName": "Edgar Allan",
|
||||
"lastName": "Poe",
|
||||
"creatorType": "author"
|
||||
},
|
||||
{
|
||||
"firstName": "Ryan",
|
||||
"lastName": "Price",
|
||||
"creatorType": "author"
|
||||
}
|
||||
],
|
||||
"date": "2006",
|
||||
"ISBN": "9781553374732",
|
||||
"abstractNote": "An illustrated version of Edgar Allan Poe's poem",
|
||||
"callNumber": "J 811.3 Poe 9254tc",
|
||||
"libraryCatalog": "Markham Public Library",
|
||||
"numPages": "1",
|
||||
"place": "Toronto",
|
||||
"publisher": "Kids Can Press",
|
||||
"series": "Visions in poetry",
|
||||
"attachments": [],
|
||||
"tags": [
|
||||
{
|
||||
"tag": "Fantasy poetry, American"
|
||||
},
|
||||
{
|
||||
"tag": "Poetry"
|
||||
},
|
||||
{
|
||||
"tag": "Ravens"
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
{
|
||||
"note": "\"KCP Poetry.\""
|
||||
}
|
||||
],
|
||||
"seeAlso": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
/** END TEST CASES **/
|
||||
Reference in New Issue
Block a user