Permalink
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
translators/CCfr (BnF).js
Find file
Copy path
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "899d10f5-3f35-40e6-8dfb-f8ee2dfb1849", | |
"label": "CCfr (BnF)", | |
"creator": "Sylvain Machefert, Aurimas Vinckevicius", | |
"target": "^https?://ccfr\\.bnf\\.fr/portailccfr/.*\\b(action=search|menu=menu_view_grappage|search\\.jsp)\\b", | |
"minVersion": "3.0", | |
"maxVersion": "", | |
"priority": 100, | |
"inRepository": true, | |
"translatorType": 4, | |
"browserSupport": "g", | |
"lastUpdated": "2014-09-18 14:08:05" | |
} | |
function detectWeb(doc, url) { | |
if (getSearchResults(doc)) | |
{ | |
return "multiple"; | |
} | |
else if (url.indexOf("menu=menu_view_grappage") != -1) { | |
return CCFRTypeDoc(doc); | |
} | |
} | |
function doWeb(doc, url) | |
{ | |
var items = getSearchResults(doc); | |
if (items) | |
{ | |
Z.selectItems(items, function(selectedItems) { | |
if (!selectedItems) return true; | |
var links = new Array(); | |
for (var i in selectedItems) { | |
links.push(getMarcUrl(i)); | |
} | |
ZU.processDocuments(links, scrape); | |
}); | |
} else { | |
// Looking for ID | |
var memRecordId = ZU.xpathText(doc, '(//input[@id="memRecordId"])[1]/@value'); | |
var urlMarc = getMarcUrl(memRecordId); | |
if (urlMarc) | |
{ | |
ZU.processDocuments(urlMarc, scrape); | |
} | |
} | |
} | |
function getMarcUrl(memRecordId) | |
{ | |
if (match = memRecordId.match(/^([^:]*):(.*)$/)) | |
{ | |
var url = '/portailccfr/jsp/ccfr/view/'; | |
if (memRecordId.indexOf('oai') == 0) | |
{ | |
url = url + "oai/"; | |
} | |
url = url + encodeURIComponent(match[1]) + '_pro.jsp?recordId=' + encodeURIComponent(memRecordId); | |
return url; | |
} | |
else | |
{ | |
return false; | |
} | |
} | |
function scrape(newDoc, uri) | |
{ | |
var translator = Zotero.loadTranslator("import"); | |
translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); | |
translator.getTranslatorObject(function (marc) { | |
var record = new marc.record(); | |
var xpath = '//table/tbody/tr'; | |
var elmts = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null); | |
while (elmt = elmts.iterateNext()) { | |
var field = newDoc.evaluate('./th[1]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; | |
var ind = newDoc.evaluate('./td[1]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; | |
ind = ZU.trimInternal(ind); | |
var value = newDoc.evaluate('./td[2]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; | |
value = ZU.trimInternal(value); | |
value = value.replace(/\$/g, marc.subfieldDelimiter); | |
if (field == "LABEL") | |
{ | |
record.leader = value; | |
} | |
else | |
{ | |
record.addField(field, ind, value); | |
} | |
} | |
var newItem = new Zotero.Item(); | |
record.translate(newItem); | |
newItem.complete(); | |
}); | |
} | |
function CCFRTypeDoc(doc) | |
{ | |
if ( (ZU.xpathText(doc, "//div[@class='notice-contenu']")) && (ZU.xpathText(doc, "//div[@id='vueCourante']/table/tbody/tr")) ) | |
{ | |
var xpath = "//div[@id='vueCourante']/table/tbody/tr"; | |
var rows = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); | |
while (row = rows.iterateNext()) | |
{ | |
var label = ZU.trimInternal(doc.evaluate("./th[@class='view-field-label-ccfr']", row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); | |
if (label == "Type document") | |
{ | |
var value = doc.evaluate("./td[@class='view-field-value-ccfr']", row, null, XPathResult.ANY_TYPE, null).iterateNext(); | |
var valueTxt = ZU.trimInternal(value.textContent); | |
switch (valueTxt) { | |
case "Livre": | |
return "book"; | |
break; | |
case "Document électronique": | |
return "book"; | |
break; | |
case "Document sonore": | |
return "audioRecording"; | |
break; | |
case "Images Animées": | |
return "film"; | |
case "Carte": | |
return "map"; | |
default: | |
Zotero.debug("Unmanaged doc type : " + valueTxt); | |
return "book"; | |
} | |
} | |
} | |
} | |
else | |
{ | |
return null; | |
} | |
} | |
function getSearchResults(doc) { | |
var items = {}, | |
rec = doc.getElementsByName('record'); | |
if (!doc.getElementById('sourceResultsPane')) return false; | |
var xpath = "//form[@name='frmSearchResult']/table"; | |
var rows = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); | |
var row; | |
var found = false; | |
while (row = rows.iterateNext()) | |
{ | |
found = true; | |
var id = doc.evaluate(".//td[@class='ident-check']/input[@type='checkbox']", row, null, XPathResult.ANY_TYPE, null).iterateNext().value; | |
var title = ZU.trimInternal(doc.evaluate(".//td[@class='Ident']/span/a[@title='Voir la Notice']", row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); | |
items[id] = title; | |
} | |
return found ? items : false; | |
} |