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/Pleade.js
Find file
Copy path
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "ce68b0ed-3137-4e38-b691-f3bc49bc1497", | |
"label": "Pleade", | |
"creator": "DIA Modou", | |
"target": "(list-results|results|ead)\\.html\\?.*(base=ead|mode=|id=)", | |
"minVersion": "1.0", | |
"maxVersion": "", | |
"priority": 100, | |
"inRepository": true, | |
"translatorType": 4, | |
"browserSupport": "gcsbv", | |
"lastUpdated": "2015-01-30 15:32:05" | |
} | |
/* | |
Pleade: Publishing Tool for finding, authority records | |
and a series of digitized images. | |
Copyright (C) 2003-2011 AJLSM | |
AJLSM | |
17, rue Vital Carles | |
33000 Bordeaux, France | |
info@ajlsm.com | |
This program is free software; you can redistribute it and/or | |
modify it under the terms of the GNU General Public License | |
as published by the Free Software Foundation; either version 2 | |
of the License, or (at your option) any later version. | |
This program 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 General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with this program; if not, write to the | |
Free Software Foundation, Inc. | |
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
or connect to: | |
http://www.fsf.org/copyleft/gpl.html | |
*/ | |
/* Example URLs: | |
- http://jubilotheque.upmc.fr/results.html?base=ead&champ1=fulltext&op1=AND&search_type=simple&query1=pau&ssearch-submit-npt.x=0&ssearch-submit-npt.y=0 | |
- http://jubilotheque.upmc.fr/ead.html?id=BG_000007_002#!{%22content%22:[%22BG_000007_002_e0000002%22,true,%22%22]} | |
- http://jubilotheque.upmc.fr/list-results.html?mode=subset&champ1=subsetall&query1=physique&cop1=AND | |
*/ | |
/** | |
* Function provided by zotero. It permit to detect web page which are compatible with this translator | |
*/ | |
function detectWeb(doc, url) { | |
if (url.match("id=") && url.match("ead.html")) { | |
return "book"; | |
} | |
else if (url.match("base=ead") && url.match("results.html")) { | |
return "multiple"; | |
} | |
/** //The original method this used to work with - by getting a qId from the search page - doesn't work anymore. | |
//It's probably possible to fix this otherwise, but I'm not sure if that'd work across pleade implementations | |
else if (url.match("list-results.html") && url.match("mode=")) { | |
return "multiple"; | |
} */ | |
} | |
/** | |
* Function find-replace | |
* @param expr : string to check | |
* @param a : string to find | |
* @param b : string to use for replacing @a | |
*/ | |
function Remplace(expr,a,b) { | |
var i=0; | |
while (i!=-1) { | |
i=expr.indexOf(a,i); | |
if (i>=0) { | |
expr=expr.substring(0,i)+b+expr.substring(i+a.length); | |
i+=b.length; | |
} | |
} | |
return expr; | |
} | |
/** | |
* Get an author from Pleade and decide if it can be published in zotero or not. | |
* This function permit to resolv lot of bug in zotero beacuse some "string author" | |
* in pleade was not normalized. | |
* @param newItem : zotero variable which contain field to publish | |
* @param author : "string author" | |
* @param managed : this field is provided by Pleade and permit to now if the @author is normalized | |
*/ | |
//We're currrently not using this - leaving this here in case problems come up | |
function getAuthors(newItem, author, managed) { | |
if (managed=="true") newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); | |
} | |
/** | |
* This function take raw data from pleade and it extract field "Tags" for zotero | |
* @param newItem : zotero variable which contain field to publish | |
* @param book : raw data; actualy a xml tree | |
*/ | |
function getTag(newItem, book) { | |
var Tags = new Array(); | |
for (var i=0; i<book.subject.length(); i++) { | |
Tags.push(Zotero.Utilities.superCleanString(book.subject[i].text().toString())); | |
} | |
newItem.abstractNote = Tags; | |
} | |
/** | |
* If a web web page that describe book is matched, this function call Pleade for getting metadatas. And then | |
* it scrape them to zotero. | |
* @param url : the url to give to pleade for getting metadatas. | |
*/ | |
function scrape(url) { | |
// Debug mode | |
Zotero.debug("Getting a term : " + url); | |
Zotero.Utilities.HTTP.doGet(url, function(text) { | |
text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); | |
text = text.replace(/(<[^!>][^>]*>)/g, function replacer(str, p1, p2, offset, s) {return str.replace(/-/gm, "");}); | |
text = text.replace(/(<[^!>][^>]*>)/g, function replacer(str, p1, p2, offset, s) {return str.replace(/:/gm, "");}); | |
text = Zotero.Utilities.trim(text); | |
//Z.debug(text) | |
var parser = new DOMParser(); | |
var doc = parser.parseFromString(text, "text/xml"); | |
var books = ZU.xpath(doc, '//book'); | |
for (var i in books) { | |
var newItem = new Zotero.Item("book"); | |
var book = books[i]; | |
var authors = ZU.xpath(book, './author'); | |
for (j in authors){ | |
newItem.creators.push(ZU.cleanAuthor(authors[j].textContent, "author")) | |
} | |
var note = ZU.xpathText(book, './bookNote'); | |
newItem.url = ZU.xpathText(book, './link'); | |
newItem.title = ZU.xpathText(book, './title'); | |
newItem.seriesNumber = ZU.xpathText(book, './num'); | |
newItem.date = ZU.xpathText(book, './date'); | |
newItem.publisher = ZU.xpathText(book, './publisher'); | |
newItem.place = ZU.xpathText(book, './publisherAddr'); | |
//sometimes the place is in the publisher after a period. We assume it's the last period in the string | |
if (!newItem.place && newItem.publisher.indexOf(".")!=-1){ | |
newItem.place = newItem.publisher.match(/\.\s*([^\.]+)$/)[1]; | |
newItem.publisher = newItem.publisher.match(/(.+)\./)[1]; | |
} | |
newItem.language = ZU.xpathText(book, './lang'); | |
newItem.rights = ZU.xpathText(book, './rights'); | |
newItem.archiveLocation = ZU.xpathText(book, './archLoc'); | |
newItem.libraryCatalog = ZU.xpathText(book, './serverName'); | |
newItem.callNumber = ZU.xpathText(book, './cote'); | |
if (note) newItem.notes.push(note); | |
newItem.complete(); | |
} | |
}) | |
} | |
/** | |
* If a web page that describe multiple is matched, this function give the number of different field. | |
* @param text : variable provided by Pleade wich describe the actual page | |
*/ | |
function getNbrTerms(text) | |
{ | |
var temp1 = text.substr(text.indexOf | |
("nb")+4,10); | |
var nbr = temp1.substring(0,temp1.indexOf("\"")); | |
return parseInt(nbr); | |
} | |
/** | |
* If a web page that describe multiple is matched, this function call Pleade for getting the terms in that page. And then, it call the | |
* zotero.selectItem function and finaly it scrape the selected items in zotero. | |
* @param doc : the javascript doc var | |
* @param url : url to give to Pleade for getting informations in that page. | |
*/ | |
function getMultipleQid(doc,url) | |
{ | |
var qId; | |
Zotero.Utilities.HTTP.doGet(url, function(text) { | |
text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); | |
text = Zotero.Utilities.trim(text); | |
var temp1; | |
if (url.match("base=ead") && url.match("results.html")) { | |
temp1 = text.substr(text.indexOf("var oid")+11,30); | |
qId = temp1.substring(0,temp1.indexOf("\"")); | |
} | |
else if (url.match("list-results.html") && url.match("mode=")) { | |
temp1 = text.substr(text.indexOf("id=")+12,30); | |
Z.debug(temp1) | |
qId = temp1.substring(0,temp1.indexOf("\"")); | |
//qId = temp1; | |
} | |
Zotero.debug("qId : " + qId); | |
var newURL = url.substring(url.indexOf("http"), url.indexOf("results.html"))+"functions/zotero/results/"+qId; | |
Zotero.debug("Getting terms : " + newURL); | |
// Getting field.title | |
Zotero.Utilities.HTTP.doGet(newURL, function(text2) { | |
text2 = text2.replace(/(<[^!>][^>]*>)/g, function replacer(str, p1, p2, offset, s) {return str.replace(/-/gm, "");}); | |
text2 = text2.replace(/(<[^!>][^>]*>)/g, function replacer(str, p1, p2, offset, s) {return str.replace(/:/gm, "");}); | |
text2 = Zotero.Utilities.trim(text2); | |
var temp = text2.substring(text2.indexOf("\<title\>"),text2.lastIndexOf("\<\/pleadeId\>")+11); | |
var pids = {}; | |
var max=text2.substring(text2.indexOf("nbrresult\>")+20, text2.lastIndexOf("\<nbrresult")); | |
max=parseInt(max.substring(max.indexOf("\>")+1, max.lastIndexOf("\<"))); | |
//this loop get fields from Pleade | |
for (var i=0; i< max; i++) | |
{ | |
var title = temp.substring(temp.indexOf("\<title\>")+7,temp.indexOf("\<\/title\>")); | |
var pleadeId = temp.substring(temp.indexOf("\<pleadeId\>")+10,temp.indexOf("\<\/pleadeId\>")); | |
temp = temp.substring(temp.indexOf("\<result\>")+8,temp.lastIndexOf("\<\/pleadeId\>")+11); | |
pids[pleadeId] = title; | |
} | |
var newURL2 = url.substring(url.indexOf("http"), url.indexOf("results.html"))+"functions/zotero/"; | |
Zotero.selectItems(pids, function (tpids) { | |
for (var i in tpids) { | |
scrape(newURL2+i+".xml?fragment=null"); | |
} | |
}); | |
}) | |
}) | |
} | |
/** | |
* Function provided by zotero | |
*/ | |
function doWeb(doc, url) { | |
var pleadeId; | |
var fragmentId; | |
var text; | |
if (detectWeb(doc, url) == "multiple") { | |
getMultipleQid(doc,url); | |
} | |
else if (detectWeb(doc, url) == "book") { | |
// Building the Pleade id of the actual document | |
if (url.indexOf("&") != -1) pleadeId = url.substring(url.indexOf("id=")+3,url.indexOf("&")); | |
else if (url.indexOf("#") != -1) pleadeId = url.substring(url.indexOf("id=")+3,url.indexOf("#")); | |
else pleadeId = url.substring(url.indexOf("id=")+3,url.length); | |
// Building the Pleade fragment id of the actual document | |
var temp1 = url.substring(url.indexOf("#"),url.length); | |
var temp2 = temp1.substring(temp1.indexOf(pleadeId), temp1.length); | |
fragmentId = temp2.substring(0,temp2.indexOf("%")); | |
scrape(url.substring(url.indexOf("http"), url.indexOf("ead.html"))+"functions/zotero/"+pleadeId+".xml?fragment="+fragmentId); | |
} | |
} | |
/** BEGIN TEST CASES **/ | |
var testCases = [ | |
{ | |
"type": "web", | |
"url": "http://gael.gironde.fr/ead.html?id=FRAD033_IR_11AV#!{%22content%22:%5B%22FRAD033_IR_11AV_e0000023%22,true,%22%22%5D}", | |
"items": [ | |
{ | |
"itemType": "book", | |
"title": "Archives sonores et audiovisuelles de l'association Gric de Prat", | |
"creators": [], | |
"date": "2010", | |
"callNumber": "11 AV 1-14", | |
"language": "français", | |
"place": "Bordeaux", | |
"publisher": "Archives départementales de la Gironde", | |
"url": "http://gael.gironde.fr/ead.html?id=FRAD033_IR_11AV", | |
"attachments": [], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://jubilotheque.upmc.fr/ead.html?id=GM_000001_014&c=GM_000001_014_page24&qid=sdx_q13#!{%22content%22:%5B%22GM_000001_014_page24%22,false,%22sdx_q13%22%5D}", | |
"items": [ | |
{ | |
"itemType": "book", | |
"title": "Journal d'un voyage géologique fait à travers toute la chaîne des Carpathes, en Bukowine, en Transylvanie et dans le Marmarosch / par feu M. Lill de Lilienbach. Observations remises en ordre et accompagnées de notes par M.A. Boué", | |
"creators": [ | |
{ | |
"firstName": "Ami", | |
"lastName": "Boué", | |
"creatorType": "author" | |
} | |
], | |
"date": "1834", | |
"language": "fre", | |
"place": "Paris ; Strasbourg", | |
"publisher": "F.-G. Levrault", | |
"rights": "Utilisation libre dans le cadre d'un usage non commercial, en mentionnant la source et sans dénaturer l'oeuvre Free use for non-commercial purposes with mandatory acknowledgement of the source and without adulterating the work", | |
"seriesNumber": "1", | |
"url": "http://jubilotheque.upmc.fr/ead.html?id=GM_000001_014", | |
"attachments": [], | |
"tags": [], | |
"notes": [ | |
"Note : 80 p : 3 pl. en noir et en coul ; 31 cm. (Mémoires de la Société Géologique de France, 1ère série, tome I, mémoire n° 13)." | |
], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://jubilotheque.upmc.fr/results.html?base=ead&champ1=fulltext&op1=AND&search_type=simple&query1=tatar&ssearch-submit-npt.x=0&ssearch-submit-npt.y=0", | |
"items": "multiple" | |
} | |
] | |
/** END TEST CASES **/ |