[Koha-patches] [PATCH] bug_6624: Added Open Library Search and Read API to openlibrary.js
Srdjan
srdjan at catalyst.net.nz
Wed Jan 6 01:40:38 CET 2016
---
koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js | 180 +++++++++++++++++++++++-
1 file changed, 175 insertions(+), 5 deletions(-)
diff --git a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js
index 995cb6b..318576a 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js
+++ b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js
@@ -5,8 +5,7 @@ if (typeof KOHA == "undefined" || !KOHA) {
/**
* A namespace for OpenLibrary related functions.
*/
-KOHA.OpenLibrary = {
-
+KOHA.OpenLibrary = new function() {
/**
* Search all:
@@ -17,7 +16,7 @@ KOHA.OpenLibrary = {
* The result is asynchronously returned by OpenLibrary and catched by
* olCallBack().
*/
- GetCoverFromIsbn: function() {
+ this.GetCoverFromIsbn = function() {
var bibkeys = [];
$("[id^=openlibrary-thumbnail]").each(function(i) {
bibkeys.push("ISBN:" + $(this).attr("class")); // id=isbn
@@ -30,13 +29,13 @@ KOHA.OpenLibrary = {
"&callback=KOHA.OpenLibrary.olCallBack&jscmd=data");
scriptElement.setAttribute("type", "text/javascript");
document.documentElement.firstChild.appendChild(scriptElement);
- },
+ }
/**
* Add cover pages <div
* and link to preview if div id is gbs-thumbnail-preview
*/
- olCallBack: function(booksInfo) {
+ this.olCallBack = function(booksInfo) {
for (id in booksInfo) {
var book = booksInfo[id];
var isbn = id.substring(5);
@@ -64,4 +63,175 @@ KOHA.OpenLibrary = {
});
}
}
+
+ var search_url = 'https://openlibrary.org/search?';
+ this.searchUrl = function( q ) {
+ var params = {q: q};
+ return search_url + $.param(params);
+ };
+
+ var search_url_json = 'https://openlibrary.org/search.json';
+ this.search = function( q, page_no, callback ) {
+ var params = {q: q};
+ if (page_no) {
+ params.page = page_no;
+ }
+ $.ajax( {
+ type: 'GET',
+ url: search_url_json,
+ dataType: 'json',
+ data: params,
+ error: function( xhr, error ) {
+ try {
+ callback( JSON.parse( xhr.responseText ));
+ } catch ( e ) {
+ callback( {error: xhr.responseText || true} );
+ }
+ },
+ success: callback
+ } );
+ };
+};
+/* readapi_automator.js */
+
+/*
+This script helps to put readable links to Open Library books into
+online book catalogs.
+When loaded, it searches the DOM for <div> elements with class
+"ol_readapi_book", extracts book identifiers from them (e.g. isbn,
+lccn, etc.) and puts those into an asynchronous call to the Read API.
+When the call returns, the results are used to add clickable links
+to the "ol_readapi_book" elements found earlier.
+A demonstration use of this script is available here:
+http://internetarchive.github.com/read_api_extras/readapi_demo.html
+*/
+
+var ol_readapi_automator =
+(function () { // open anonymous scope for tidiness
+
+// 'constants'
+var readapi_bibids = ['isbn', 'lccn', 'oclc', 'olid', 'iaid', 'bibkeys'];
+var magic_classname = 'ol_readapi_book';
+
+// added to book divs to correlate with API results
+var magic_bookid = 'ol_bookid';
+var ol_button_classname = 'ol_readapi_button';
+
+// Find all book divs and concatenate ids from them to create a read
+// API query url
+function create_query() {
+ var q = 'http://openlibrary.org/api/volumes/brief/json/';
+
+ function add_el(i, el) {
+ // tag with number found so it's easy to discover later
+ // (necessary? just go by index?)
+ // (choose better name?)
+ $(el).attr(magic_bookid, i);
+
+ if (i > 0) {
+ q += '|';
+ }
+ q += 'id:' + i;
+
+ for (bi in readapi_bibids) {
+ bibid = readapi_bibids[bi];
+ if ($(el).attr(bibid)) {
+ q += ';' + bibid + ':' + $(el).attr(bibid);
+ }
+ }
+ }
+
+ $('.' + magic_classname).each(add_el);
+ return q;
+}
+
+function make_read_button(bookdata) {
+ buttons = {
+ 'full access':
+ "http://openlibrary.org/images/button-read-open-library.png",
+ 'lendable':
+ "http://openlibrary.org/images/button-borrow-open-library.png",
+ 'checked out':
+ "http://openlibrary.org/images/button-checked-out-open-library.png"
+ };
+ if (bookdata.items.length == 0) {
+ return false;
+ }
+ first = bookdata.items[0];
+ if (!(first.status in buttons)) {
+ return false;
+ }
+ result = '<a href="' + first.itemURL + '">' +
+ '<img class="' + ol_button_classname +
+ '" src="' + buttons[first.status] + '"/></a>';
+ return result;
+}
+
+// Default function for decorating document elements with read API data
+function default_decorate_el_fn(el, bookdata) {
+ // Note that 'bookdata' may be undefined, if the Read API call
+ // didn't return results for this book
+ if (!bookdata) {
+ decoration = 'Not found';
+ } else {
+ decoration = make_read_button(bookdata);
+ }
+ if (decoration) {
+ el.innerHTML += decoration;
+ }
+}
+
+function do_query(q, decorate_el_fn) {
+ if (!decorate_el_fn) {
+ decorate_el_fn = default_decorate_el_fn;
+ }
+ var starttime = (new Date()).getTime();
+
+ // Call a function on each <div class="ol_readapi_book"> element
+ // with the target element and the data found for that element.
+ // Use decorate_el_fn if supplied, falling back to
+ // default_decorate_el_fn, above.
+ function query_callback(data, textStatus, jqXHR) {
+ var endtime = (new Date()).getTime();
+ var duration = (endtime - starttime) / 1000;
+ // console.log('took ' + duration + ' seconds');
+
+ $('.' + magic_classname).each(function(i, el) {
+ var bookid = $(el).attr(magic_bookid);
+ if (bookid && bookid in data) {
+ decorate_el_fn(el, data[bookid]);
+ } else {
+ decorate_el_fn(el);
+ }
+ });
+ }
+
+ // console.log('calling ' + q);
+ $.ajax({ url: q,
+ data: { 'show_all_items': 'true' },
+ dataType: 'jsonp',
+ success: query_callback
+ });
+}
+
+// Do stuff
+var q = create_query();
+do_query(q);
+
+result = {
+ do_query: do_query,
+ create_query: create_query,
+ make_read_button: make_read_button
};
+
+return result;
+})(); // close anonymous scope
+
+/*
+Possible futures:
+* Support alternate query targets, e.g. Hathi
+* show_all_items
+* show_inlibrary
+* ezproxy prefix (implies show_inlibrary?)
+* console debug output? (check all console.log)
+*/
--
1.9.1
More information about the Koha-patches
mailing list