From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

// This script adds buttons next to isbns on wikipedia pages that will redirect

// the user to a readable digital copy of the referenced book.



// <nowiki>

( function () {

	function addBookIcon(id, metadata, page){

	  var toolTip = createBookWindow(metadata, id, page)

	  return $('<a>')

		.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 $('<a>')

		.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 $('<a>')

	  .attr({'href': link , 'target':'_blank', 'class': 'popup_box'})

	  .append(

	  	$('<div>')

	  		.attr({ 'class': 'text_elements_read' })

	  		.append(

	    		$('<p>').append($('<strong>').text(metadata.title)),

	    		$('<p>').text(metadata.author)

			), 

	  	$('<div>')

	  		.attr({'class': 'bottom_details_read'})

	  		.append(

	    		metadata.image ? $('<img>').attr({'src': metadata.image, 'class': 'cover_img_read' }) : null,

	    		$('<p>').text('Click To Read Now')

	    	)

	    )[0].outerHTML

	}

	

	function createDonateWindow(isbn){

		var donation = 50

		//var username = mw.config.get('wgUserName')

		return $('<div>')

			.attr({'class': 'popup_box'})

			.append(

				$('<div>')

					.attr({'class':'text_elements_donate' })

					.append(

						$('<a>')

						.attr({'target':'_blank', 'href': 'https://www.archive.org/donate?isbn=' + isbn + '&donation=' + donation})

						.append(

							$('<strong>').text("Please donate $50 and we will try to purchase and digitize the book for you.")

						)

					), 

				$('<div>')

					.attr({'class':'bottom_details_donate'})

					.append(

						$('<p>').text("Or if you have a copy of this book please mail it to: "),

				    	$('<p>').text('300 Funston, San Francisco, CA 94118'),

				    	$('<p>').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 result1

		}

		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': csskey]})

		})

	}

	

	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(dataisbn])

			      var metadata = getMetadata(dataisbn])

			      var icon

			      if (id) {

			        icon = addBookIcon(id, metadata, pageNumber)

			      }else{

			      	icon = addDonateIcon(isbn)

			      }

			      console.log(jQuery.fn.jquery)

			      book.parentElement.append(icon0])

			    }

			    addStyles()

			    // $('archive_tooltip').tooltip()

			}).fail( function( xhr, status ) {

			    console.log(getErrorMessage(xhr))

			});

		// });

	}

}() );