Permalink
Join GitHub today
GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.
Sign up
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; | |
} |