Adding Avram's Tatknigafun translator
This commit is contained in:
parent
4c73c7f5b4
commit
06c384be03
1 changed files with 111 additions and 0 deletions
111
translators/Tatknigafund.js
Normal file
111
translators/Tatknigafund.js
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
{
|
||||||
|
"translatorID":"f909cbda-2fac-4700-965f-6c0783b77eeb",
|
||||||
|
"translatorType":4,
|
||||||
|
"label":"Tatknigafund",
|
||||||
|
"creator":"Avram Lyon",
|
||||||
|
"target":"^https?://www.tatknigafund.ru/books/",
|
||||||
|
"minVersion":"1.0.0b4.r1",
|
||||||
|
"maxVersion":"",
|
||||||
|
"priority":100,
|
||||||
|
"inRepository":false,
|
||||||
|
"lastUpdated":"2009-12-31 16:20:00"
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This translator is designed for the Tatar Book Repository, http://www.tatknigafund.ru/ .
|
||||||
|
At present, it imports the limited metadata that the repository exposes about its books,
|
||||||
|
independent of interface language (Russian or Tatar).
|
||||||
|
|
||||||
|
It should be able to fetch bibliographic data even for non-logged-in users, although
|
||||||
|
to read the full-text of works in the repository, users will need to create a free account.
|
||||||
|
|
||||||
|
It works on URLs of the form http://www.tatknigafund.ru/books/XXXX/ , where XXXX is the
|
||||||
|
book ID assigned by the repository. One such URL is:
|
||||||
|
http://www.tatknigafund.ru/books/1037
|
||||||
|
Which should give the result:
|
||||||
|
Ф. Гыйбадуллина, Роман hәм милләт: Гаяз Исхакый иҗатында роман жанры (Татарстан китап нəшрияты, 2007),
|
||||||
|
http://www.tatknigafund.ru/books/1037?locale=tt.
|
||||||
|
It should also populate the abstract field.
|
||||||
|
|
||||||
|
It can also work on search results, of the form http://www.tatknigafund.ru/books/search?locale=ru&type=meta&query=XXXX
|
||||||
|
where XXXX is the query string. One such URL is:
|
||||||
|
http://www.tatknigafund.ru/books/search?locale=ru&type=meta&query=%D0%B8%D1%81%D1%85%D0%B0%D0%BA%D0%B8
|
||||||
|
Which at present gives six results.
|
||||||
|
|
||||||
|
When Zotero is able to assign languages to bibliographic data, the data obtained here would
|
||||||
|
be a good candidate, since all the author names, titles and abstracts are served in Russian
|
||||||
|
or Tatar, depending on the user's locale choice.
|
||||||
|
|
||||||
|
This translator draws heavily on the National Library of Australia translator for inspiration,
|
||||||
|
in lieu of up-to-date translator documentation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function detectWeb(doc, url) {
|
||||||
|
if (url.match("books/search?")) {
|
||||||
|
return "multiple";
|
||||||
|
} else
|
||||||
|
if (url.match("books") && !url.match("read")) {
|
||||||
|
return "book";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function doWeb(doc, url) {
|
||||||
|
var n = doc.documentElement.namespaceURI;
|
||||||
|
var ns = n ? function(prefix) {
|
||||||
|
if (prefix == 'x') return n; else return null;
|
||||||
|
} : null;
|
||||||
|
|
||||||
|
var books = new Array();
|
||||||
|
if (detectWeb(doc, url) == "multiple") {
|
||||||
|
var tablerow = doc.evaluate('//table[@class="books_list"]/tbody/tr', doc, ns, XPathResult.ANY_TYPE, null);
|
||||||
|
var items = new Array();
|
||||||
|
var row;
|
||||||
|
while(row = tablerow.iterateNext()) {
|
||||||
|
var link = doc.evaluate('./td/a[@class="book_title"]', row, ns, XPathResult.ANY_TYPE, null).iterateNext();
|
||||||
|
var title = link.textContent;
|
||||||
|
var url = link.href;
|
||||||
|
items[url] = title;
|
||||||
|
}
|
||||||
|
items = Zotero.selectItems(items);
|
||||||
|
if(!items) return true;
|
||||||
|
for (var i in items) {
|
||||||
|
books.push(i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
books = [url];
|
||||||
|
}
|
||||||
|
|
||||||
|
Zotero.Utilities.processDocuments(books, function(doc) {
|
||||||
|
item = new Zotero.Item("book");
|
||||||
|
item.title = Zotero.Utilities.trimInternal(
|
||||||
|
doc.evaluate('//div[@class="description"]/h1', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent
|
||||||
|
);
|
||||||
|
|
||||||
|
var author = doc.evaluate('//a[@class="author_link"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
|
||||||
|
// Authors here are Last Name, First initial(s) (ФИО)
|
||||||
|
var spaceIndex = author.lastIndexOf(" ");
|
||||||
|
var firstName = author.substring(spaceIndex+1);
|
||||||
|
var lastName = author.substring(0, spaceIndex);
|
||||||
|
item.creators.push({firstName:firstName, lastName:lastName, creatorType:"author"});
|
||||||
|
|
||||||
|
var info = doc.evaluate('//p[@class="summary"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
|
||||||
|
var pub = info.match(/(Нәшрият|Издательство): (.+)/);
|
||||||
|
var publisher = pub[2];
|
||||||
|
yr = info.match(/(Нәшрият|Издательство): (.+),\s+(\d+)\s(ел|г)\./);
|
||||||
|
var year = yr[3];
|
||||||
|
|
||||||
|
var pagematch = info.match(/(\d+) (бит|страница|страниц|страницы)/);
|
||||||
|
var pages = pagematch[1];
|
||||||
|
item.publisher = Zotero.Utilities.trimInternal(publisher);
|
||||||
|
item.date = Zotero.Utilities.trimInternal(year);
|
||||||
|
item.numPages = pages;
|
||||||
|
|
||||||
|
var description = doc.evaluate('//div[@class="description"]/p[2]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent;
|
||||||
|
item.abstractNote = description;
|
||||||
|
|
||||||
|
item.url = url;
|
||||||
|
|
||||||
|
item.complete();
|
||||||
|
}, function() {Zotero.done();});
|
||||||
|
Zotero.wait();
|
||||||
|
}
|
Loading…
Reference in a new issue