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
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 **/ |