User:Reinischmax/IABooks.js

// This script adds buttons next to isbns on wikipedia pages that will redirect // the user to a readable digital copy of the referenced book.

// ( function {	function addBookIcon(id, metadata, page){	  var toolTip = createBookWindow(metadata, id, page)	  return $('')		.text(" [Read on Archive.org]")		.attr({ 'href': metadata.link, 'target': '_blank', 'title' : metadata.title })		.addClass('archive_tooltip')	}	function addDonateIcon(isbn){		var toolTip = createDonateWindow(isbn)		return $('')		.text(" [Donate book to Archive.org]")		.attr({ 'href': 'https://archive.org/donate/', 'target': '_blank', 'title' : 'If you have a copy of this book please mail it to 300 Funston, San Francisco, CA 94118 so we can digitize it' })		.addClass('archive_tooltip')	}	function createBookWindow (metadata, id, page) {	 var link = 'https://archive.org/details/' + id	  if(page){	  	link = link + '/page/' + page	  }	  return $('')	  .attr({'href': link, 'target':'_blank', 'class': 'popup_box'})	  .append( $(' ')	 		.attr({ 'class': 'text_elements_read' }) .append(	   		$(' ').append($(' ').text(metadata.title)),	    		$(' ').text(metadata.author)			), $(' ')	 		.attr({'class': 'bottom_details_read'}) .append(	   		metadata.image ? $(' ').attr({'src': metadata.image, 'class': 'cover_img_read' }) : null,	    		$(' ').text('Click To Read Now')	    	) )[0].outerHTML	}	function createDonateWindow(isbn){		var donation = 50		//var username = mw.config.get('wgUserName')		return $(' ')			.attr({'class': 'popup_box'})			.append( $(' ')					.attr({'class':'text_elements_donate' }) .append(						$('')						.attr({'target':'_blank', 'href': 'https://www.archive.org/donate?isbn=' + isbn + '&donation=' + donation})						.append( $(' ').text("Please donate $50 and we will try to purchase and digitize the book for you.") )					), 				$(' ')					.attr({'class':'bottom_details_donate'}) .append(						$(' ').text("Or if you have a copy of this book please mail it to: "),				   	$(' ').text('300 Funston, San Francisco, CA 94118'),				    	$(' ').text('so we can digitize it.')					) )[0].outerHTML	}	function createArchiveAnchor (id, tt) {		if(id){			var popupButton = new OO.ui.PopupButtonWidget( { label: '📖 Read Now', target: '_blank', framed: false, classes: ['btn-archive-book'], popup: { $content: $(tt), padded: false, align: 'forwards', classes: 'popup-archive', width:180 }			} );		}else{			var popupButton = new OO.ui.PopupButtonWidget( { label: '📚 Donate', target: '_blank', framed: false, classes: ['btn-archive-donate'], popup: { $content: $(tt), padded: false, align: 'forwards', classes: 'popup-archive', width:180 }			} );		}		return popupButton	}	function getIdentifier (book) {	 // identifier can be found as metadata.identifier or ocaid	  if (book) {	    var id = 	    if (book.metadata) {	      id = book.metadata.identifier	    } else {	      id = book.ocaid	    }	    if (id) {	      return id	    }	  }	  return null	}	function getISBNFromCitation (citation) {	  // Takes in HTMLElement and returns isbn number or null if isbn not found	  var rawISBN = citation.text	  var isbn = rawISBN.replace(/-/g, )	  return isbn	}	function getPageFromCitation(book){		var raw = book.parentElement.innerText		var re = /p{1,2}\.\s(\d+)-?\d*/g		var result = re.exec(raw)		if(result){			return result[1]		}		return result	}	// Get all books on wikipedia page through	// https://archive.org/services/context/books?url=...	function getWikipediaBooks (url) {	  return $.ajax({ dataType: "json", crossDomain: true, url: 'https://archive.org/services/context/books?url=' + url, beforeSend: function(jqXHR, settings) { jqXHR.url = settings.url; },	   timeout: 10000 })	}

function getMetadata (book) { const MAX_TITLE_LEN = 300 if (book) { if (book.metadata) { return { 'title': book.metadata.title.length > MAX_TITLE_LEN ? book.metadata.title.slice(0, MAX_TITLE_LEN) + '...' : book.metadata.title, 'author': book.metadata.creator, 'image': 'https://archive.org/services/img/' + book.metadata.identifier, 'link': book.metadata['identifier-access'], 'button_text': 'Read Now', 'button_class': 'btn btn-success resize_fit_center', 'readable': true }	   }	  }	  return false }	/**	 * Customizes error handling * @param status {string} * @return {string} */	function getErrorMessage(req){ return "The requested service " + req.url + " failed: " + req.status + ", " + req.statusText }	function addStyles{ css = { '.cover_img_read': 'align-self: center; border: 1px solid black;  border-radius: 3px;  display:block;  height:168px;  margin:10px auto;  width: 120px;', '.text_elements_read' : 'max-width: 100%; margin: auto; padding: 5px;', '.popup_box': 'text-align: center;', '.bottom_details_read': ' background-color: #eee;  max-width: 100%;  padding: 5px;  margin: auto;', '.text_elements_donate' : 'color:black;max-width: 100%; margin: auto; padding: 5px;', '.bottom_details_donate': 'background-color: #eee; color: black; max-width: 100%;  padding: 5px;  margin: auto;', '.btn-archive-book': 'background-color: lightblue; border-radius: 3px; box-shadow:2px 2px 1px darkgrey; color: white; margin: 0 4px 1px; padding:0 2px 0;', '.btn-archive-donate': 'background-color:lightgreen; border-radius: 3px; box-shadow: 2px 2px 1px darkgrey; color: white; margin: 0 4px 1px; padding: 0 2px 0;', '.popup-archive' : 'position: absolute' }		Object.keys(css).forEach(function(key){			$(key).attr({'style': css[key]})		}) }	if( mw.config.get( "wgNamespaceNumber" ) === 0 ) { // $.when( mw.loader.using( [ 'oojs-ui-core' ] ), $.ready ).done( function {			getWikipediaBooks(location.href).done(function(data) { var books = $("a[title^='Special:BookSources']") for (var book of books) { var isbn = getISBNFromCitation(book) var pageNumber = getPageFromCitation(book) var id = getIdentifier(data[isbn]) var metadata = getMetadata(data[isbn]) var icon if (id) { icon = addBookIcon(id, metadata, pageNumber) }else{ icon = addDonateIcon(isbn) }			     console.log(jQuery.fn.jquery) book.parentElement.append(icon[0]) }			   addStyles // $('archive_tooltip').tooltip }).fail( function( xhr, status ) { console.log(getErrorMessage(xhr)) });		// });	} } );