Skip to content

Commit d32bde7

Browse files
author
symac
committed
Adding CCFR Translator
1 parent 2c1ac00 commit d32bde7

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed

CCfr (BnF).js

+162
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
{
2+
"translatorID": "899d10f5-3f35-40e6-8dfb-f8ee2dfb1849",
3+
"label": "CCfr (BnF)",
4+
"creator": "Sylvain Machefert, Aurimas Vinckevicius",
5+
"target": "^https?://ccfr\\.bnf\\.fr/portailccfr/.*\\b(?:action=search|menu=menu_view_grappage|search\\.jsp)\\b",
6+
"minVersion": "3.0",
7+
"maxVersion": "",
8+
"priority": 100,
9+
"inRepository": true,
10+
"translatorType": 4,
11+
"browserSupport": "g",
12+
"lastUpdated": "2014-09-18 14:08:05"
13+
}
14+
15+
function detectWeb(doc, url) {
16+
if (getSearchResults(doc))
17+
{
18+
return "multiple";
19+
}
20+
else if (url.indexOf("menu=menu_view_grappage") != -1) {
21+
return CCFRTypeDoc(doc);
22+
}
23+
}
24+
25+
function doWeb(doc, url)
26+
{
27+
var items = getSearchResults(doc);
28+
if (items)
29+
{
30+
Z.selectItems(items, function(selectedItems) {
31+
if(!selectedItems) return true;
32+
33+
var links = new Array();
34+
for(var i in selectedItems) {
35+
links.push(getMarcUrl(i));
36+
}
37+
ZU.processDocuments(links, scrape);
38+
});
39+
} else {
40+
// Looking for ID
41+
var memRecordId = ZU.xpathText(doc, '(//input[@id="memRecordId"])[1]/@value');
42+
var urlMarc = getMarcUrl(memRecordId);
43+
if (urlMarc)
44+
{
45+
ZU.processDocuments(urlMarc, scrape);
46+
}
47+
}
48+
}
49+
50+
function getMarcUrl(memRecordId)
51+
{
52+
if (match = memRecordId.match(/^([^:]*):(.*)$/))
53+
{
54+
var url = '/portailccfr/jsp/ccfr/view/';
55+
if (memRecordId.indexOf('oai') == 0)
56+
{
57+
url = url + "oai/";
58+
}
59+
url = url + encodeURIComponent(match[1]) + '_pro.jsp?recordId=' + encodeURIComponent(memRecordId);
60+
return url;
61+
}
62+
else
63+
{
64+
return false;
65+
}
66+
}
67+
68+
function scrape(newDoc, uri)
69+
{
70+
var translator = Zotero.loadTranslator("import");
71+
translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
72+
translator.getTranslatorObject(function (marc) {
73+
74+
var record = new marc.record();
75+
76+
var xpath = '//table/tbody/tr';
77+
var elmts = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null);
78+
while (elmt = elmts.iterateNext()) {
79+
var field = newDoc.evaluate('./th[1]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
80+
var ind = newDoc.evaluate('./td[1]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
81+
ind = ZU.trimInternal(ind);
82+
var value = newDoc.evaluate('./td[2]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
83+
value = ZU.trimInternal(value);
84+
value = value.replace(/\$/g, marc.subfieldDelimiter);
85+
86+
if (field == "LABEL")
87+
{
88+
record.leader = value;
89+
}
90+
else
91+
{
92+
record.addField(field, ind, value);
93+
}
94+
}
95+
var newItem = new Zotero.Item();
96+
record.translate(newItem);
97+
newItem.complete();
98+
});
99+
}
100+
101+
function CCFRTypeDoc(doc)
102+
{
103+
if ( (ZU.xpathText(doc, "//div[@class='notice-contenu']")) && (ZU.xpathText(doc, "//div[@id='vueCourante']/table/tbody/tr")) )
104+
{
105+
var xpath = "//div[@id='vueCourante']/table/tbody/tr";
106+
var rows = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
107+
while (row = rows.iterateNext())
108+
{
109+
var label = ZU.trimInternal(doc.evaluate("./th[@class='view-field-label-ccfr']", row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
110+
111+
if (label == "Type document")
112+
{
113+
var value = doc.evaluate("./td[@class='view-field-value-ccfr']", row, null, XPathResult.ANY_TYPE, null).iterateNext();
114+
var valueTxt = ZU.trimInternal(value.textContent);
115+
116+
switch (valueTxt) {
117+
case "Livre":
118+
return "book";
119+
break;
120+
case "Document électronique":
121+
return "book";
122+
break;
123+
case "Document sonore":
124+
return "audioRecording";
125+
break;
126+
case "Images Animées":
127+
return "film";
128+
case "Carte":
129+
return "map";
130+
default:
131+
Zotero.debug("Unmanaged doc type : " + valueTxt);
132+
return "book";
133+
}
134+
}
135+
}
136+
}
137+
else
138+
{
139+
return null;
140+
}
141+
}
142+
143+
function getSearchResults(doc) {
144+
var items = {},
145+
rec = doc.getElementsByName('record');
146+
if (!doc.getElementById('sourceResultsPane')) return false;
147+
148+
var xpath = "//form[@name='frmSearchResult']/table";
149+
var rows = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
150+
var row;
151+
152+
var found = false;
153+
154+
while (row = rows.iterateNext())
155+
{
156+
found = true;
157+
var id = doc.evaluate(".//td[@class='ident-check']/input[@type='checkbox']", row, null, XPathResult.ANY_TYPE, null).iterateNext().value;
158+
var title = ZU.trimInternal(doc.evaluate(".//td[@class='Ident']/span/a[@title='Voir la Notice']", row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
159+
items[id] = title;
160+
}
161+
return found ? items : false;
162+
}

0 commit comments

Comments
 (0)