/* eslint-disable one-var, vars-on-top */
( function ( $, mw ) {
var IAUP = {
showTimeout: 400
};
var getIaIdFromUrl = function ( url ) {
var match;
if ( url.match( 'https?://archive\\.org/' ) ) {
var rx = /(details|manage|download)\/([^/]*)/;
match = rx.exec( url );
if ( match ) {
return match[ 2 ];
}
} else if ( url.match( /^https?:\/\/ia\d+\.[a-z]+\.archive\.org/ ) ) {
match = /\/items\/([^/]+)\//.exec( url );
if ( match ) {
return match[ 1 ];
}
}
return null;
};
var getIaMeta = function ( iaId ) {
var url = 'https://archive.org/metadata/' + iaId;
return $.get( url );
};
var getAuthor = function ( str ) {
// strip dates - these are nearly always not needed
str = str.replace( /(?:, )?(?:(?:ca\.|fl\.) )?(\(?\d+-\d+\)?).?$/, '' );
// strip birth date
str = str.replace( /(?:, )(?:b\.|d\.) +\d{3,4}$/, '' );
// strip initial expansions
str = str.replace( /(?:[A-Z]. ?)+ \((.*)\)/, '$1' );
str = str.replace( /, (Sir|Lord)$/, '' );
// Last, First -> First Last
str = str.replace( /^([^,]+), ([^,]+)$/, '$2 $1' );
// Fix initials without dots
str = str.replace( / ([A-Z]) /g, ' $1. ' );
return str;
};
var getAuthors = function ( strOrArr ) {
if ( !Array.isArray( strOrArr ) ) {
strOrArr = [ strOrArr ];
}
return strOrArr.map( function ( a ) {
return getAuthor( a );
} );
}
/*
* Converts text to title case.
*
* BOOK IV. THE INSTRUCTIONS OF I -> Book IV. The Instructions of I.
*
* Takes care of:
* - all-caps roman numerals
* - always title-cases the first words after .
* - otherwise title-cases words except a list of exceptions like 'a', 'of'
*/
var toTitleCase = function ( str ) {
var titler = function ( word ) {
if ( word.length === 0 ) {
return word;
}
return word.replace( word[ 0 ], word[ 0 ].toUpperCase() );
};
var allCapped = function ( word ) {
// check for roman numerals (and "I"), maybe followed by punct
return ( word.search( /^[ivxlcdm]+\b.$/ ) > -1 );
};
// if bookish title case, not all words are capped
var noCapWords = [ 'a', 'an', 'the', 'of', 'to', 'at', 'this', 'than',
'then', 'by', 'and'
];
var words = str.toLowerCase().split( ' ' );
var titled = [];
var newSentence = true;
for ( var i = 0; i < words.length; i++ ) {
if ( allCapped( words[ i ] ) ) {
// some words are all caps always
titled.push( words[ i ].toUpperCase() );
} else if ( newSentence || noCapWords.indexOf( words[ i ] ) === -1 ) {
// new sentences and most words get title casing
titled.push( titler( words[ i ] ) );
} else {
// lower
titled.push( words[ i ] );
}
newSentence = words[ i ].search( /\.$/ ) !== -1;
}
return titled.join( ' ' );
};
var getFileNameFromIa = function ( iaId ) {
var prom = getIaMeta( iaId )
.then( function ( meta ) {
var title = toTitleCase( meta.metadata.title );
if ( meta.metadata.creator ) {
var authors = getAuthors( meta.metadata.creator );
const getSurname = function( a ) {
return a.split( ' ' ).pop()
}
authors = authors.map( getSurname ).join( ', ' )
if ( authors ) {
title += ' - ' + authors
}
}
if ( meta.metadata.year ) {
title += ' - ' + meta.metadata.year;
}
return title;
} );
return prom;
};
var uploadToFilename = function ( iaId, filename ) {
// eslint-disable-next-line compat/compat
var iauUrl = new URL( 'https://ia-upload.toolforge.org' );
iauUrl.searchParams.append( 'iaId', iaId );
iauUrl.searchParams.append( 'commonsName', filename );
window.open( iauUrl.href );
};
var onlinkClick = function ( iaId, uploadFilename ) {
if ( uploadFilename ) {
uploadToFilename( iaId, uploadFilename );
} else {
getFileNameFromIa( iaId )
.then( function ( title ) {
uploadToFilename( iaId, title );
} );
}
};
var thePopup;
var onMouseover = function () {
var $iaLink = $( this );
var iaId = getIaIdFromUrl( $iaLink.attr( 'href' ) );
if ( !iaId ) {
return;
}
var uploadFilename = $iaLink.parent()
.data( 'upload-filename' );
var $uploadLink = $( '<a>' )
.append( 'Upload with IA-Upload' )
.on( 'click', function () {
onlinkClick( iaId, uploadFilename );
} );
if ( uploadFilename ) {
$uploadLink.append( ' to "' + uploadFilename + '"' );
}
var $popupContent = $( '<div>' )
.append( $uploadLink );
if ( !thePopup ) {
thePopup = new OO.ui.PopupWidget( {
$content: $popupContent,
padded: true,
width: 300,
$floatableContainer: $iaLink,
autoClose: true,
classes: [ 'iaUploadPopup-popup' ]
} );
$( document.body ).append( thePopup.$element );
} else {
thePopup.setFloatableContainer( $iaLink );
thePopup.$content = $popupContent;
}
thePopup.toggle( true );
};
$( function () {
// eslint-disable-next-line no-jquery/no-global-selector
$( 'a.external[href^="https://archive.org"]' )
.on( 'mouseover', function ( event ) {
var $hovered = $( this );
setTimeout( function () {
// popup if still hovering after 500ms
if ( $hovered.is( ':hover' ) ) {
onMouseover.call( $hovered, event );
}
}, IAUP.showTimeout );
} );
} );
// eslint-disable-next-line no-undef
}( jQuery, mediaWiki ) );