// 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 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))
});
// });
}
}() );