Merged new caliblur theme

Fix for new users created
Fix for options to the calibre-converter
Only the first 300 chars are logged for the emailbody (spamming of logfile is prevented)
Added class to "Random" header
This commit is contained in:
Ozzieisaacs 2018-12-27 10:53:19 +01:00
parent 677264950d
commit d0fd1a4601
12 changed files with 1170 additions and 284 deletions

1
cps/static/css/caliBlur.min.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

782
cps/static/js/caliBlur.js Normal file
View File

@ -0,0 +1,782 @@
/***
* Copyright 2012, Digital Fusion
* Licensed under the MIT license.
* http://teamdf.com/jquery-plugins/license/
*
* @author Sam Sehnert
* @desc A small plugin that checks whether elements are within
* the user visible viewport of a web browser.
* can accounts for vertical position, horizontal, or both
*/
!function(t){var i=t(window);t.fn.visible=function(t,e,o){if(!(this.length<1)){var r=this.length>1?this.eq(0):this,n=r.get(0),f=i.width(),h=i.height(),o=o?o:"both",l=e===!0?n.offsetWidth*n.offsetHeight:!0;if("function"==typeof n.getBoundingClientRect){var g=n.getBoundingClientRect(),u=g.top>=0&&g.top<h,s=g.bottom>0&&g.bottom<=h,c=g.left>=0&&g.left<f,a=g.right>0&&g.right<=f,v=t?u||s:u&&s,b=t?c||a:c&&a;if("both"===o)return l&&v&&b;if("vertical"===o)return l&&v;if("horizontal"===o)return l&&b}else{var d=i.scrollTop(),p=d+h,w=i.scrollLeft(),m=w+f,y=r.offset(),z=y.top,B=z+r.height(),C=y.left,R=C+r.width(),j=t===!0?B:z,q=t===!0?z:B,H=t===!0?R:C,L=t===!0?C:R;if("both"===o)return!!l&&p>=q&&j>=d&&m>=L&&H>=w;if("vertical"===o)return!!l&&p>=q&&j>=d;if("horizontal"===o)return!!l&&m>=L&&H>=w}}}}(jQuery);
// Move advanced search to side-menu
$( 'a[href*="advanced"]' ).parent().insertAfter( '#nav_new' );
$( 'body' ).addClass('blur');
// Back button
curHref = window.location.href.split('/');
prevHref = document.referrer.split('/');
$( '.navbar-form.navbar-left' )
.before( '<div class="plexBack"><a href="' + document.referrer + '"></a></div>' );
if ( history.length === 1 ||
curHref[0] +
curHref[1] +
curHref[2] !=
prevHref[0] +
prevHref[1] +
prevHref[2] ||
$( 'body.root' )>length > 0 ) {
$( '.plexBack' ).addClass( 'noBack' );
}
//Weird missing a after pressing back from edit.
setTimeout(function() {
if ( $( '.plexBack a').length < 1 ) {
$( '.plexBack' ).append('<a href="' + document.referrer + '"></a>');
}
},10);
// Home button
$( '.plexBack' ).before( '<div class="home-btn"></div>' );
$( 'a.navbar-brand' ).clone().appendTo( '.home-btn' ).empty().removeClass('navbar-brand');
/////////////////////////////////
// Start of Book Details Work //
///////////////////////////////
// Wrap book description in div container
if ( $( 'body.book' ).length > 0 ) {
/* description = $( 'h3:contains("Description:")' ).nextUntil( '.morestuff' ).slice(0,-1);
bookInfo = $( '.author' ).nextUntil( 'h3:contains("Description:")');
$( 'h3:contains("Description:")' ).hide();
$( description ).detach();
$( bookInfo ).wrapAll( '<div class="bookinfo"></div>' );
$( 'h3:contains("Description:")' ).after( '<div class="description"></div>' );
$( '.languages' ).appendTo( '.bookinfo' );
$('.hr').detach();
if ( $( '.identifiers ').length > 0 ) {
console.log(".identifiers length " + $( '.identifiers ').length );
$( '.identifiers' ).before( '<div class="hr"></div>' );
} else {
if ( $( '.bookinfo > p:first-child' ).length > 0 ) {
console.log(".bookinfo > p:first-child length " + $( '.bookinfo > p' ).length );
$( '.bookinfo > p:first-child' ).first().after( '<div class="hr"></div>' );
} else{
if ( $( '.bookinfo a[href*="/series/"]' ).length > 0 ) {
console.log( 'series text found; placing hr below series' );
$( '.bookinfo a[href*="/series/"]' ).parent().after( '<div class="hr"></div>' );
} else {
console.log("prepending hr div to top of .bookinfo");
$( '.bookinfo' ).prepend( '<div class="hr"></div>' );
}
}
}
$( '.rating' ).insertBefore( '.hr' );
$( 'div.description' ).hide();
$( '#remove-from-shelves' ).insertAfter( '.hr' );
/* if book description is not in html format, Remove extra line breaks
Remove blank lines/unnecessary spaces, split by line break to array
Push array into .description div. If there is still a wall of text,
find sentences and split wall into groups of three sentence paragraphs.
If the book format is in html format, Keep html, but strip away inline
styles and empty elements */
/*
// If text is sitting in div as text node
if ( description[0] === undefined ) {
textValue = $( '.book-meta' )
.contents()
.filter(function() {
return this.nodeType == Node.TEXT_NODE;
}).text();
description = $.makeArray(
textValue.replace(/(?:(?:\r\n|\r|\n)\s*){2}/gm, "")
);
$( '.book-meta' ).contents().filter(function() {
return this.nodeType === 3;
}).remove();
}
if ( description[1] === undefined ) {
newdesc = description.toString()
.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split(/\n/);
$.each(newdesc, function(i, val) {
$( 'div.description' ).append( '<p>' + newdesc[i] + '</p>' );
});
$( '.description' ).fadeIn(100);
//If still a wall of text create 3 sentence paragraphs.
if( $( '.description p' ).length === 1 ) {
if ( description.context != undefined ) {
newdesc = description.text()
.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split(/\n/);
}
else {
newdesc = description.toString();
}
doc = nlp ( newdesc.toString() );
sentences = doc.map((m)=> m.out( 'text' ));
$( '.description p' ).remove();
let size = 3; let sentenceChunks = [];
for (var i=0; i<sentences.length; i+=size) {
sentenceChunks.push(sentences.slice(i,i+size));
}
let output = '';
$.each(sentenceChunks, function(i, val) {
let preOutput = '';
$.each(val, function(i, val) {
preOutput += val;
});
output += '<p>' + preOutput + '</p>';
});
$( 'div.description' ).append( output );
}
} else {
$.each(description, function(i, val) {
$( description[i].outerHTML ).appendTo( '.description' );
$( 'div.description :empty' ).remove();
$( 'div.description ').attr( 'style', '' );
});
$( 'div.description' ).fadeIn( 100 );
}*/
description = $( '.comments' );
bookInfo = $( '.author' ).nextUntil( 'h3:contains("Description:")');
$( 'h3:contains("Description:")' ).detach();
$( '.comments' ).detach();
$( bookInfo ).wrapAll( '<div class="bookinfo"></div>' );
// $( 'h3:contains("Description:")' ).after( '<div class="description"></div>' );
$( '.languages' ).appendTo( '.bookinfo' );
$('.hr').detach();
if ( $( '.identifiers ').length > 0 ) {
console.log(".identifiers length " + $( '.identifiers ').length );
$( '.identifiers' ).before( '<div class="hr"></div>' );
} else {
if ( $( '.bookinfo > p:first-child' ).length > 0 ) {
console.log(".bookinfo > p:first-child length " + $( '.bookinfo > p' ).length );
$( '.bookinfo > p:first-child' ).first().after( '<div class="hr"></div>' );
} else{
if ( $( '.bookinfo a[href*="/series/"]' ).length > 0 ) {
console.log( 'series text found; placing hr below series' );
$( '.bookinfo a[href*="/series/"]' ).parent().after( '<div class="hr"></div>' );
} else {
console.log("prepending hr div to top of .bookinfo");
$( '.bookinfo' ).prepend( '<div class="hr"></div>' );
}
}
}
$( '.rating' ).insertBefore( '.hr' );
$( '#remove-from-shelves' ).insertAfter( '.hr' );
$( description ).appendTo('.bookinfo')
/* if book description is not in html format, Remove extra line breaks
Remove blank lines/unnecessary spaces, split by line break to array
Push array into .description div. If there is still a wall of text,
find sentences and split wall into groups of three sentence paragraphs.
If the book format is in html format, Keep html, but strip away inline
styles and empty elements */
// If text is sitting in div as text node
if ( $('.comments:has(p)' ).length === 0 ) {
newdesc = description.text()
.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split(/\n/);
$('.comments' ).empty();
$.each(newdesc, function(i, val) {
$( 'div.comments' ).append( '<p>' + newdesc[i] + '</p>' );
});
$( '.comments' ).fadeIn(100);
} //If still a wall of text create 3 sentence paragraphs.
if( $( '.comments p' ).length === 1 ) {
if ( description.context != undefined ) {
newdesc = description.text()
.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split(/\n/);
}
else {
newdesc = description.toString();
}
doc = nlp ( newdesc.toString() );
sentences = doc.map((m)=> m.out( 'text' ));
sentences[0] = sentences[0].replace(",","");
$( '.comments p' ).remove();
let size = 3; let sentenceChunks = [];
for (var i=0; i<sentences.length; i+=size) {
sentenceChunks.push(sentences.slice(i,i+size));
}
let output = '';
$.each(sentenceChunks, function(i, val) {
let preOutput = '';
$.each(val, function(i, val) {
preOutput += val;
});
output += '<p>' + preOutput + '</p>';
});
$( 'div.comments' ).append( output );
}
else {
$.each(description, function(i, val) {
// $( description[i].outerHTML ).appendTo( '.comments' );
$( 'div.comments :empty' ).remove();
$( 'div.comments ').attr( 'style', '' );
});
$( 'div.comments' ).fadeIn( 100 );
}
// Sexy blurred backgrounds
cover = $( '.cover img' ).attr( 'src' );
$( '#loader + .container-fluid' )
.prepend( '<div class="blur-wrapper"></div' );
$( '.blur-wrapper' )
.prepend( '<div><img class="bg-blur" src="' + cover + '"></div>' );
// Fix-up book detail headings
publisher = $( '.publishers p span' ).text().split( ': ' );
$( '.publishers p span' ).remove();
$.each(publisher, function(i, val) {
$( '.publishers' ).append( '<span>' + publisher[i] + '</span>' );
});
published = $( '.book-meta p:contains("Publishing date")' )
.text().split(': ');
$( '.book-meta p:contains("Publishing date")' )
.before( '<div class="published-date"></div>' );
$( '.book-meta p:contains("Publishing date")' ).remove();
$.each(published, function(i, val) {
$( '.published-date' ).append( '<span>' + published[i] + '</span>' );
});
languages = $( '.languages p span' ).text().split( ': ' );
$( '.languages p span' ).remove();
$.each(languages, function(i, val) {
$( '.languages' ).append( '<span>' + languages[i] + '</span>' );
});
$( '.book-meta h2:first' ).clone()
.prependTo( '.book-meta > .btn-toolbar:first' );
// If only one download type exists still put the items into a drop-drown list.
downloads = $( 'a[id^=btnGroupDrop]' ).get();
if ( $( downloads ).length === 1 ) {
$( '<button id="btnGroupDrop1" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-download"></span>Download :<span class="caret"></span></button><ul class="dropdown-menu leramslist aria-labelledby="btnGroupDrop1"></ul>' ).insertBefore( downloads[downloads.length-1] );
$( downloads ).detach();
$.each(downloads, function(i, val) {
$( '<li>' + downloads[i].outerHTML + '</li>' ).appendTo( '.leramslist' );
});
$( '.leramslist' ).find( 'span' ).remove();
$( '.leramslist a' ).removeClass( 'btn btn-primary' ).removeAttr( 'role' );
}
// Add classes to buttons
$( '#sendbtn' ).parent().addClass( 'sendBtn' );
$( '[id*=btnGroupDrop]' ).parent().addClass( 'downloadBtn' );
$( 'read-in-browser' ).parent().addClass( 'readBtn' );
$( '.downloadBtn button:first' ).addClass( 'download-text' );
// Move all options in book details page to the same group
$( '[aria-label*="Delete book"]' )
.prependTo( '[aria-label^="Download, send"]' )
.children().removeClass( 'btn-sm' );
$( '.custom_columns' )
.addClass(' btn-group' )
.attr('role', 'group' )
.removeClass( 'custom_columns' )
.prependTo( '[aria-label^="Download, send"]' );
$( '#have_read_cb' )
.after( '<label class="block-label readLbl" for="#have_read_cb"></label>' );
$( '#shelf-actions' ).prependTo( '[aria-label^="Download, send"]' );
// Move dropdown lists higher in dom, replace bootstrap toggle with own toggle.
$( 'ul[aria-labelledby="read-in-browser"]' ).insertBefore( '.blur-wrapper' ).addClass('readinbrowser-drop');
$( '.leramslist' ).insertBefore( '.blur-wrapper' );
$( 'ul[aria-labelledby="btnGroupDrop1"]' ).insertBefore( '.blur-wrapper' ).addClass('leramslist');
$( '#add-to-shelves' ).insertBefore( '.blur-wrapper' );
$( '#read-in-browser' ).click( function() {
$( '.readinbrowser-drop' ).toggle();
});
$('.downloadBtn' ).click( function() {
$( '.leramslist' ).toggle();
});
$('div[aria-label="Add to shelves"]' ).click( function() {
$( '#add-to-shelves' ).toggle();
});
// Fix formatting error on book detail languages
if ( !$( '.book-meta > .bookinfo > .languages > span:last-of-type' ).text().startsWith(" ") ) {
$( '.book-meta > .bookinfo > .languages > span:last-of-type' ).prepend(" ");
}
//Work to reposition dropdowns. Does not currently solve for
//screen resizing
function dropdownToggle() {
topPos = $( '.book-meta > .btn-toolbar:first' ).offset().top
if ( $( '#read-in-browser' ).length > 0 ) {
position = $( '#read-in-browser' ).offset().left
if ( position + $( '.readinbrowser-drop' ).width() > $( window ).width() ) {
positionOff = position + $( '.readinbrowser-drop' ).width() - $( window ).width();
ribPosition = position - positionOff - 5
$( '.readinbrowser-drop' ).attr("style", "left: " + ribPosition + "px !important; right: auto; top: " + topPos + "px");
} else {
$( '.readinbrowser-drop' ).attr("style", "left: " + position + "px !important; right: auto; top: " + topPos + "px");
}
}
if ( $( '.downloadBtn' ).length > 0 ) {
position = $( '#btnGroupDrop1' ).offset().left
if ( position + $( '.leramslist' ).width() > $( window ).width() ) {
positionOff = position + $( '.leramslist' ).width() - $( window ).width();
dlPosition = position - positionOff - 5
$( '.leramslist' ).attr("style", "left: " + dlPosition + "px !important; right: auto; top: " + topPos + "px");
} else {
$( '.leramslist' ).attr("style", "left: " + position + "px !important; right: auto; top: " + topPos + "px");
}
}
if ( $( 'div[aria-label="Add to shelves"]' ).length > 0 ) {
position = $( 'div[aria-label="Add to shelves"]' ).offset().left
if ( position + $( '#add-to-shelves' ).width() > $( window ).width() ) {
positionOff = position + $( '#add-to-shelves' ).width() - $( window ).width();
adsPosition = position - positionOff - 5
$( '#add-to-shelves' ).attr("style", "left: " + adsPosition + "px !important; right: auto; top: " + topPos + "px");
} else {
$( '#add-to-shelves' ).attr("style", "left: " + position + "px !important; right: auto; top: " + topPos + "px");
}
}
}
dropdownToggle();
$( window ).on( 'resize', function() {
dropdownToggle();
});
// Clone book rating for mobile view.
$( '.book-meta > .bookinfo > .rating' ).clone().insertBefore( '.book-meta > .description' ).addClass('rating-mobile');
}
///////////////////////////////
// End of Book Details Work //
/////////////////////////////
/////////////////////////////////
// Start of Global Work //
///////////////////////////////
// Hide dropdown and collapse menus on click-off
$(document).mouseup(function (e) {
var container = new Array();
container.push($('ul[aria-labelledby="read-in-browser"]'));
container.push($('.leramslist'));
container.push($('#add-to-shelves'));
container.push($('.navbar-collapse.collapse.in'));
$.each(container, function(key, value) {
if (!$(value).is(e.target) // if the target of the click isn't the container...
&& $(value).has(e.target).length === 0) // ... nor a descendant of the container
{
if ( $(value).hasClass('dropdown-menu') )
{
$(value).hide();
} else
{
if ( $(value).hasClass('collapse') )
{
$(value).collapse('toggle');
}
}
}
});
});
// Split path name to array and remove blanks
url = window.location.pathname
.split( "/" ).filter( function(v){return v!==''} );
// Add classes to some body elements that don't have it
if ( jQuery.inArray( 'epub', url ) != -1 ) {
$( 'body' ).addClass( url[3] );
} else {
$( 'body' ).addClass( url[1] );
}
if ( $( 'body.shelf' ).length > 0 ) {
$( 'a[href*= "'+url[1]+"/"+url[2]+'"]' )
.parent()
.addClass( 'active' );
}
// Move create shelf
$( '#nav_createshelf' ).prependTo( 'li:contains("Your Shelves")' );
// Create drop-down for profile and move elements to it
$( '#main-nav' )
.prepend( '<li class="dropdown"><a href="#" class="dropdown-toggle profileDrop" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-user"></span></a><ul class="dropdown-menu profileDropli"></ul></li>' );
$( '#top_user' ).parent().addClass( 'dropdown' ).appendTo( '.profileDropli' );
$( '#nav_about' ).addClass( 'dropdown' ).appendTo( '.profileDropli' );
$( '#register' ).parent().addClass( 'dropdown' ).appendTo( '.profileDropli' );
$( '#logout' ).parent().addClass( 'dropdown' ).appendTo( '.profileDropli' );
// Remove the modals except from some areas where they are needed
bodyClass = $( 'body' ).attr( 'class' ).split(' ');
modalWanted = ['admin', 'editbook', 'config', 'uiconfig'];
if ( $.inArray( bodyClass[0], modalWanted) != -1 ) {
} else {
$(' a:not(.dropdown-toggle) ')
.removeAttr( 'data-toggle', 'data-target', 'data-remote' );
}
// Add classes to global buttons
$( '#top_tasks' ).parent().addClass( 'top_tasks' );
$( '#top_admin' ).parent().addClass( 'top_admin' );
$( '#form-upload' ).parent().addClass( 'form-upload' );
// Search button work
$( 'input#query' ).focus(function() {
$( 'form[role="search"]' ).addClass( 'search-focus' );
});
$( 'input#query' ).focusout(function() {
setTimeout(function() {
$( 'form[role="search"]' ).removeClass( 'search-focus' );
}, 100);
});
// Add class to random book discover
// ToDo: done
$( 'h2:contains("Discover (Random Books")' )
.parent()
.addClass( 'random-books' );
// Check if dropdown goes out of viewport and add class
$(document).on('click','.dropdown-toggle',function() {
// Add .offscreen if part of container not visible
$('.dropdown-menu:visible').filter(function(){
return $(this).visible() === false;
}).each(function(){
$(this).addClass('offscreen');
});
});
// Fade out content on page unload
// delegate all clicks on "a" tag (links)
$(document).on("click", "a:not(.btn-toolbar a, a[href*='shelf/remove'], .identifiers a, .bookinfo , .btn-group > a, #add-to-shelves a, #book-list a, .stat.blur.stats a )", function () {
// get the href attribute
var newUrl = $(this).attr("href");
// veryfy if the new url exists or is a hash
if (!newUrl || newUrl[0] === "#") {
// set that hash
location.hash = newUrl;
return;
}
// now, fadeout the html (whole page)
$( '.blur-wrapper' ).fadeOut(250);
$(".row-fluid .col-sm-10").fadeOut(500,function () {
// when the animation is complete, set the new location
location = newUrl;
});
// prevent the default browser behavior.
return false;
});
// Collapse long text into read-more
$( 'div.comments' ).readmore( {
collapsedHeight: 134,
heightMargin: 45,
speed: 300,
moreLink: '<a href="#">READ MORE</a>',
lessLink: '<a href="#">READ LESS</a>',
});
/////////////////////////////////
// End of Global Work //
///////////////////////////////
// Author Page Background Blur
if ( $( 'body.author' ).length >0 ) {
cover = $( '.author-bio img' ).attr( 'src' );
$( '#loader + .container-fluid' )
.prepend( '<div class="blur-wrapper"></div>' );
$( '.blur-wrapper' ).prepend( '<img class="bg-blur" src="' + cover + '">' );
// Place undefined cover images inside container
if ( $( '.bg-blur[src="undefined"]' ).length > 0 ) {
$( '.bg-blur' ).before( '<div class="bg-blur undefined-img"></div>' );
$( 'img.bg-blur' ).appendTo( '.undefined-img' );
}
}
// Ereader Page - add class to iframe body on ereader page after it loads.
backurl = '../../book/' + url[2]
$( 'body.epub #title-controls' )
.append('<div class="epub-back"><input action="action" onclick="location.href=backurl; return false;" type="button" value="Back" /></div>')
$( 'body.stats .col-sm-10 p:first' ).insertAfter( '#libs' );
// Check if link is external and force _blank attribute
$(function(){ // document ready
$( 'a' ).filter(function () {
return this.hostname && this.hostname !== location.hostname;
}).each(function () {
$(this).addClass("external").attr( 'target', '_blank' );
});
});
// Check if lists are empty and add class to buttons
if ( $.trim( $('#add-to-shelves').html() ).length === 0 ) {
$( '#add-to-shelf' ).addClass( 'empty-ul' );
}
shelfLength = $('#add-to-shelves li').length
emptyLength = 0
$('#add-to-shelves').on('click','li a',function(){
console.log('#remove-from-shelves change registered' );
emptyLength++
setTimeout(function() {
if ( emptyLength >= shelfLength ) {
console.log('list is empty; adding empty-ul class' );
$( '#add-to-shelf' ).addClass( 'empty-ul' );
} else {
console.log('list is not empty; removing empty-ul class' );
$( '#add-to-shelf' ).removeClass( 'empty-ul' );
}
},100);
});
if ( $.trim( $( 'ul[aria-labelledby="read-in-browser"] li' ).html() ).length === 0 ) {
$('#read-in-browser').addClass('empty-ul');
}
// Shelf Buttons and Tooltips
if ( $( 'body.shelf' ).length > 0 ) {
$( 'div[data-target="#DeleteShelfDialog"]' )
.before( '<div class=".btn-group shelf-btn-group"></div>' )
.appendTo( '.shelf-btn-group' )
.addClass( 'delete-shelf-btn' );
$( 'a[href*="edit"]' )
.appendTo( '.shelf-btn-group' )
.addClass( 'edit-shelf-btn' );
$( 'a[href*="order"]' )
.appendTo( '.shelf-btn-group' )
.addClass( 'order-shelf-btn' );
$( '.delete-shelf-btn' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Delete Shelf',
'data-placement': 'bottom' })
.addClass('delete-btn-tooltip');
$( '.edit-shelf-btn' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Edit Shelf',
'data-placement': 'bottom' })
.addClass('edit-btn-tooltip');
$( '.order-shelf-btn' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Reorder Shelf',
'data-placement': 'bottom' })
.addClass('order-btn-tooltip');
}
// Rest of Tooltips
$( '.home-btn > a' ).attr({
'data-toggle': 'tooltip',
'title': 'Home',
'data-placement': 'bottom' })
.addClass('home-btn-tooltip');
$( '.plexBack > a' ).attr({
'data-toggle': 'tooltip',
'title': 'Back',
'data-placement': 'bottom' })
.addClass('back-btn-tooltip');
$( '#top_tasks' ).attr({
'data-toggle': 'tooltip',
'title': 'Tasks',
'data-placement': 'bottom',
'data-viewport': '#main-nav' })
.addClass('tasks-btn-tooltip');
$( '#top_admin' ).attr({
'data-toggle': 'tooltip',
'title': 'Settings',
'data-placement': 'bottom',
'data-viewport': '#main-nav' })
.addClass('admin-btn-tooltip');
$( '.profileDrop' ).attr({
'title': 'Account',
'data-placement': 'bottom',
'data-toggle-two': 'tooltip',
'data-viewport': '#main-nav' })
.addClass('send-btn-tooltip dropdown');
$( '#btn-upload' ).attr({
'data-toggle': 'tooltip',
'title': 'Upload',
'data-placement': 'bottom',
'data-viewport': '#main-nav' })
.addClass('upload-btn-tooltip');
$( '#add-to-shelf' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Add to Shelf',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('addtoshelf-btn-tooltip');
$( '#have_read_cb' ).attr({
'data-toggle': 'tooltip',
'title': 'Mark As Read',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('readunread-btn-tooltip');
$( '#have_read_cb:checked' ).attr({
'data-toggle': 'tooltip',
'title': 'Mark As Unread',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('readunread-btn-tooltip');
$( 'button#delete' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Delete',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('delete-book-btn-tooltip');
$( '#have_read_cb' ).click(function() {
if ( $( '#have_read_cb:checked' ).length > 0 ) {
$( this ).attr('data-original-title', 'Mark as Unread');
} else {
$( this).attr('data-original-title', 'Mark as Read');
}
});
$( '.btn-group[aria-label="Edit/Delete book"] a' ).attr({
'data-toggle': 'tooltip',
'title': 'Edit',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('edit-btn-tooltip');
$( '#sendbtn' ).attr({
'data-toggle': 'tooltip',
'title': 'Send to Kindle',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' })
.addClass('send-btn-tooltip');
$( '#read-in-browser' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Read',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar'})
.addClass('send-btn-tooltip');
$( '#btnGroupDrop1' ).attr({
'data-toggle-two': 'tooltip',
'title': 'Download',
'data-placement': 'bottom',
'data-viewport': '.btn-toolbar' });
if ( $( 'body.epub').length === 0 ) {
$(document).ready(function(){
$('[data-toggle="tooltip"]').tooltip({container: 'body', trigger: 'hover'});
$('[data-toggle-two="tooltip"]').tooltip({container: 'body', trigger: 'hover'});
$( '#btn-upload' ).attr('title', " ");
});
$( '[data-toggle-two="tooltip"]' ).click(function(){
$('[data-toggle-two="tooltip"]').tooltip('hide');
});
$( '[data-toggle="tooltip"]' ).click(function(){
$('[data-toggle="tooltip"]').tooltip('hide');
});
}
$( '#read-in-browser a' ).attr('target',"");
if ( $( '.edit-shelf-btn').length > 1 ) {
$( '.edit-shelf-btn:first').remove();
}
if ( $( '.order-shelf-btn').length > 1 ) {
$( '.order-shelf-btn:first').remove();
}
$( '#top_user > span.hidden-sm' ).clone().insertBefore( '.profileDropli' );
$( '.navbar-collapse.collapse.in').before('<div class="sidebar-backdrop"></div>');
// Get rid of leading white space
recentlyAdded = $( '#nav_new a:contains("Recently")' ).text().trim();
$('#nav_new a:contains("Recently")').contents().filter(function() {
return this.nodeType == 3
}).each(function(){
this.textContent = this.textContent.replace(' Recently Added',recentlyAdded);
});
// Change shelf textValue
shelfText = $( '.shelf .discover h2:first' ).text().replace(':',' —').replace(/\'/g,'');
$( '.shelf .discover h2:first' ).text(shelfText);
shelfText = $( '.shelforder .col-sm-10 .col-sm-6.col-lg-6.col-xs-6 h2:first' ).text().replace(':',' —').replace(/\'/g,'');
$( '.shelforder .col-sm-10 .col-sm-6.col-lg-6.col-xs-6 h2:first' ).text(shelfText);
function mobileSupport() {
if ( $( window ).width() <= 768 ) {
//Move menu to collapse
$( '.row-fluid > .col-sm-2:first' ).appendTo( '.navbar-collapse.collapse:first');
if ( $( '.sidebar-backdrop' ).length < 1 ) {
$( '.navbar-collapse.collapse:first' ).after( '<div class="sidebar-backdrop"></div>' );
}
} else {
//Move menu out of collapse
$( '.col-sm-2:first' ).insertBefore( '.col-sm-10:first');
$( '.sidebar-backdrop' ).remove();
}
}
// LayerCake plug
if ( $(' .stat.blur.stats p').length > 0 ) {
$(' .stat.blur.stats p').append(" and <a href='https://github.com/leram84/layer.Cake/tree/master/caliBlur' target='_blank'>layer.Cake</a>");
str = $(' .stat.blur.stats p').html().replace("</a>.","</a>");
$(' .stat.blur.stats p').html(str);
}
// Collect delete buttons in editbook to single dropdown
$( '.editbook .text-center.more-stuff' ).prepend( '<button id="deleteButton" type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-remove"></span>Delete Format<span class="caret"></span></button><ul class="dropdown-menu delete-dropdown"></ul>' );
deleteButtons = $( '.editbook .text-center.more-stuff a' ).removeClass('btn btn-danger' ).attr( 'type', '').get();
$( deleteButtons ).detach();
$( '.editbook .text-center.more-stuff h4' ).remove();
$.each(deleteButtons, function(i, val) {
$( '<li>' + deleteButtons[i].outerHTML + '</li>' ).appendTo( '.delete-dropdown' );
});
// Turn off bootstrap animations
$(function() { $.support.transition = false; })
mobileSupport();
// Only call function once resize is complete
//var id;
$( window ).on('resize',function() {
// clearTimeout(id);
// id = setTimeout(mobileSupport, 500);
mobileSupport();
});

6
cps/static/js/libs/compromise.min.js vendored Normal file

File diff suppressed because one or more lines are too long

11
cps/static/js/libs/readmore.min.js vendored Normal file
View File

@ -0,0 +1,11 @@
/*!
* @preserve
*
* Readmore.js jQuery plugin
* Author: @jed_foster
* Project home: http://jedfoster.github.io/Readmore.js
* Licensed under the MIT license
*
* Debounce function from http://davidwalsh.name/javascript-debounce-function
*/
!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports?module.exports=t(require("jquery")):t(jQuery)}(function(t){"use strict";function e(t,e,i){var o;return function(){var n=this,a=arguments,s=function(){o=null,i||t.apply(n,a)},r=i&&!o;clearTimeout(o),o=setTimeout(s,e),r&&t.apply(n,a)}}function i(t){var e=++h;return String(null==t?"rmjs-":t)+e}function o(t){var e=t.clone().css({height:"auto",width:t.width(),maxHeight:"none",overflow:"hidden"}).insertAfter(t),i=e.outerHeight(),o=parseInt(e.css({maxHeight:""}).css("max-height").replace(/[^-\d\.]/g,""),10),n=t.data("defaultHeight");e.remove();var a=o||t.data("collapsedHeight")||n;t.data({expandedHeight:i,maxHeight:o,collapsedHeight:a}).css({maxHeight:"none"})}function n(t){if(!d[t.selector]){var e=" ";t.embedCSS&&""!==t.blockCSS&&(e+=t.selector+" + [data-readmore-toggle], "+t.selector+"[data-readmore]{"+t.blockCSS+"}"),e+=t.selector+"[data-readmore]{transition: height "+t.speed+"ms;overflow: hidden;}",function(t,e){var i=t.createElement("style");i.type="text/css",i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),t.getElementsByTagName("head")[0].appendChild(i)}(document,e),d[t.selector]=!0}}function a(e,i){this.element=e,this.options=t.extend({},r,i),n(this.options),this._defaults=r,this._name=s,this.init(),window.addEventListener?(window.addEventListener("load",c),window.addEventListener("resize",c)):(window.attachEvent("load",c),window.attachEvent("resize",c))}var s="readmore",r={speed:100,collapsedHeight:200,heightMargin:16,moreLink:'<a href="#">Read More</a>',lessLink:'<a href="#">Close</a>',embedCSS:!0,blockCSS:"display: block; width: 100%;",startOpen:!1,blockProcessed:function(){},beforeToggle:function(){},afterToggle:function(){}},d={},h=0,c=e(function(){t("[data-readmore]").each(function(){var e=t(this),i="true"===e.attr("aria-expanded");o(e),e.css({height:e.data(i?"expandedHeight":"collapsedHeight")})})},100);a.prototype={init:function(){var e=t(this.element);e.data({defaultHeight:this.options.collapsedHeight,heightMargin:this.options.heightMargin}),o(e);var n=e.data("collapsedHeight"),a=e.data("heightMargin");if(e.outerHeight(!0)<=n+a)return this.options.blockProcessed&&"function"==typeof this.options.blockProcessed&&this.options.blockProcessed(e,!1),!0;var s=e.attr("id")||i(),r=this.options.startOpen?this.options.lessLink:this.options.moreLink;e.attr({"data-readmore":"","aria-expanded":this.options.startOpen,id:s}),e.after(t(r).on("click",function(t){return function(i){t.toggle(this,e[0],i)}}(this)).attr({"data-readmore-toggle":s,"aria-controls":s})),this.options.startOpen||e.css({height:n}),this.options.blockProcessed&&"function"==typeof this.options.blockProcessed&&this.options.blockProcessed(e,!0)},toggle:function(e,i,o){o&&o.preventDefault(),e||(e=t('[aria-controls="'+this.element.id+'"]')[0]),i||(i=this.element);var n=t(i),a="",s="",r=!1,d=n.data("collapsedHeight");n.height()<=d?(a=n.data("expandedHeight")+"px",s="lessLink",r=!0):(a=d,s="moreLink"),this.options.beforeToggle&&"function"==typeof this.options.beforeToggle&&this.options.beforeToggle(e,n,!r),n.css({height:a}),n.on("transitionend",function(i){return function(){i.options.afterToggle&&"function"==typeof i.options.afterToggle&&i.options.afterToggle(e,n,r),t(this).attr({"aria-expanded":r}).off("transitionend")}}(this)),t(e).replaceWith(t(this.options[s]).on("click",function(t){return function(e){t.toggle(this,i,e)}}(this)).attr({"data-readmore-toggle":n.attr("id"),"aria-controls":n.attr("id")}))},destroy:function(){t(this.element).each(function(){var e=t(this);e.attr({"data-readmore":null,"aria-expanded":null}).css({maxHeight:"",height:""}).next("[data-readmore-toggle]").remove(),e.removeData()})}},t.fn.readmore=function(e){var i=arguments,o=this.selector;return e=e||{},"object"==typeof e?this.each(function(){if(t.data(this,"plugin_"+s)){var i=t.data(this,"plugin_"+s);i.destroy.apply(i)}e.selector=o,t.data(this,"plugin_"+s,new a(this,e))}):"string"==typeof e&&"_"!==e[0]&&"init"!==e?this.each(function(){var o=t.data(this,"plugin_"+s);o instanceof a&&"function"==typeof o[e]&&o[e].apply(o,Array.prototype.slice.call(i,1))}):void 0}});

View File

@ -2,7 +2,7 @@
{% block body %} {% block body %}
{% if g.user.show_detail_random() %} {% if g.user.show_detail_random() %}
<div class="discover"> <div class="discover">
<h2>{{_('Discover (Random Books)')}}</h2> <h2 class="random-books">{{_('Discover (Random Books)')}}</h2>
<div class="row"> <div class="row">
{% for entry in random %} {% for entry in random %}

View File

@ -13,7 +13,7 @@
<link href="{{ url_for('static', filename='css/libs/bootstrap.min.css') }}" rel="stylesheet" media="screen"> <link href="{{ url_for('static', filename='css/libs/bootstrap.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen"> <link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen">
{% if g.user.get_theme == 1 %} {% if g.user.get_theme == 1 %}
<link href="{{ url_for('static', filename='css/caliBlur-style.css') }}" rel="stylesheet" media="screen"> <link href="{{ url_for('static', filename='css/caliBlur.min.css') }}" rel="stylesheet" media="screen">
{% endif %} {% endif %}
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
@ -67,7 +67,7 @@
</li> </li>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if g.user.role_admin() %} {% if not g.user.is_anonymous %}
<li><a id="top_tasks" href="{{url_for('get_tasks_status')}}"><span class="glyphicon glyphicon-tasks"></span><span class="hidden-sm"> {{_('Tasks')}}</span></a></li> <li><a id="top_tasks" href="{{url_for('get_tasks_status')}}"><span class="glyphicon glyphicon-tasks"></span><span class="hidden-sm"> {{_('Tasks')}}</span></a></li>
{% endif %} {% endif %}
{% if g.user.role_admin() %} {% if g.user.role_admin() %}
@ -240,6 +240,11 @@
<script src="{{ url_for('static', filename='js/libs/plugins.js') }}"></script> <script src="{{ url_for('static', filename='js/libs/plugins.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/jquery.form.js') }}"></script> <script src="{{ url_for('static', filename='js/libs/jquery.form.js') }}"></script>
<script src="{{ url_for('static', filename='js/main.js') }}"></script> <script src="{{ url_for('static', filename='js/main.js') }}"></script>
{% if g.user.get_theme == 1 %}
<!--script src="{{ url_for('static', filename='js/libs/compromise.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/readmore.min.js') }}"></script-->
<script src="{{ url_for('static', filename='js/caliBlur.js') }}"></script>
{% endif %}
<script type="text/javascript"> <script type="text/javascript">
$(function () { $(function () {
$("#btn-upload").change(function () { $("#btn-upload").change(function () {

View File

@ -113,7 +113,7 @@ current_milli_time = lambda: int(round(time.time() * 1000))
gdrive_watch_callback_token = 'target=calibreweb-watch_files' gdrive_watch_callback_token = 'target=calibreweb-watch_files'
EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx',
'fb2', 'html', 'rtf', 'odt'} 'fb2', 'html', 'rtf', 'odt'}
EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'html', 'rtf', 'odt'} EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'htmlz'}
# Main code # Main code
@ -3186,9 +3186,9 @@ def new_user():
if "upload_role" in to_save: if "upload_role" in to_save:
content.role = content.role + ub.ROLE_UPLOAD content.role = content.role + ub.ROLE_UPLOAD
if "edit_role" in to_save: if "edit_role" in to_save:
content.role = content.role + ub.ROLE_DELETE_BOOKS
if "delete_role" in to_save:
content.role = content.role + ub.ROLE_EDIT content.role = content.role + ub.ROLE_EDIT
if "delete_role" in to_save:
content.role = content.role + ub.ROLE_DELETE_BOOKS
if "passwd_role" in to_save: if "passwd_role" in to_save:
content.role = content.role + ub.ROLE_PASSWD content.role = content.role + ub.ROLE_PASSWD
if "edit_shelf_role" in to_save: if "edit_shelf_role" in to_save:
@ -3236,7 +3236,6 @@ def edit_mailsettings():
content.mail_use_ssl = int(to_save["mail_use_ssl"]) content.mail_use_ssl = int(to_save["mail_use_ssl"])
try: try:
ub.session.commit() ub.session.commit()
flash(_(u"E-mail server settings updated"), category="success")
except Exception as e: except Exception as e:
flash(e, category="error") flash(e, category="error")
if "test" in to_save and to_save["test"]: if "test" in to_save and to_save["test"]:

View File

@ -99,7 +99,7 @@ class emailbase():
def send(self, strg): def send(self, strg):
"""Send `strg' to the server.""" """Send `strg' to the server."""
if self.debuglevel > 0: if self.debuglevel > 0:
print('send:', repr(strg), file=sys.stderr) print('send:', repr(strg[:300]), file=sys.stderr)
if hasattr(self, 'sock') and self.sock: if hasattr(self, 'sock') and self.sock:
try: try:
if self.transferSize: if self.transferSize:
@ -278,7 +278,9 @@ class WorkerThread(threading.Thread):
command = [web.ub.config.config_converterpath, (file_path + format_old_ext), command = [web.ub.config.config_converterpath, (file_path + format_old_ext),
(file_path + format_new_ext)] (file_path + format_new_ext)]
if web.ub.config.config_calibre: if web.ub.config.config_calibre:
command.append(web.ub.config.config_calibre) parameters = web.ub.config.config_calibre.split(" ")
for param in parameters:
command.append(param)
if sys.version_info < (3, 0): if sys.version_info < (3, 0):
command = [x.encode(sys.getfilesystemencoding()) for x in command] command = [x.encode(sys.getfilesystemencoding()) for x in command]

View File

@ -32,15 +32,15 @@
<div id='header_parameters' class='row text-center report-parameters'> <div id='header_parameters' class='row text-center report-parameters'>
<div class="col-xs-6 col-md-4"> <div class="col-xs-6 col-md-4">
<p class='text-justify attribute'><strong>Start Time:</strong> 2018-11-25 12:57:57.569980</p> <p class='text-justify attribute'><strong>Start Time:</strong> 2018-12-23 15:44:21.732315</p>
</div> </div>
<div class="col-xs-6 col-md-4"> <div class="col-xs-6 col-md-4">
<p class='text-justify attribute'><strong>Stop Time:</strong> 2018-11-25 13:16:06.314449</p> <p class='text-justify attribute'><strong>Stop Time:</strong> 2018-12-23 16:05:34.967181</p>
</div> </div>
<div class="col-xs-6 col-md-4"> <div class="col-xs-6 col-md-4">
<p class='text-justify attribute'><strong>Duration:</strong> 0:18:08.744469</p> <p class='text-justify attribute'><strong>Duration:</strong> 0:21:13.234866</p>
</div> </div>
</div> </div>
@ -1556,86 +1556,70 @@ AssertionError: 'The camicdemo' != '\n '</pre>
</tr> </tr>
<tr class='skipClass'> <tr class='skipClass'>
<td>test_ebook_convert.test_ebook_convert</td> <td>test_ebook_convert.test_ebook_convert</td>
<td class="text-center">12</td>
<td class="text-center">1</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">11</td> <td class="text-center">11</td>
<td class="text-center">7</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">4</td>
<td class="text-center"> <td class="text-center">
<a onclick="showClassDetail('c8', 12)">Detail</a> <a onclick="showClassDetail('c8', 11)">Detail</a>
</td> </td>
</tr> </tr>
<tr id='st8.1' class='none bg-warning'> <tr id='pt8.1' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_SSL_smtp_setup_error</div> <div class='testcase'>test_SSL_smtp_setup_error</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st8.1')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_pt8.1')">PASS</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st8.1' class="popup_window test_output" style="display:none;"> <div id='div_pt8.1' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st8.1').style.display='none'"><span onclick="document.getElementById('div_pt8.1').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st8.1').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_pt8.1').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st8.1: Not Implemented</pre> <pre class="text-left">pt8.1: Received: EHLO
Received: AUTH
User: name@host.com, Password: 1234</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st8.2' class='none bg-warning'> <tr id='pt8.2' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_STARTTLS_smtp_setup_error</div> <div class='testcase'>test_STARTTLS_smtp_setup_error</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st8.2')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_pt8.2')">PASS</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st8.2' class="popup_window test_output" style="display:none;"> <div id='div_pt8.2' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st8.2').style.display='none'"><span onclick="document.getElementById('div_pt8.2').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st8.2').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_pt8.2').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st8.2: Not Implemented</pre> <pre class="text-left">pt8.2: Received: EHLO</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st8.3' class='none bg-warning'> <tr id='pt8.3' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_convert_deactivate</div> <div class='testcase'>test_convert_deactivate</div>
</td> </td>
<td colspan='6'> <td colspan='6' align='center'>PASS</td>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st8.3')">SKIP</a>
</div>
<!--css div popup start-->
<div id='div_st8.3' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st8.3').style.display='none'"><span
aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st8.3').style.display='none'">[x]</a>-->
</div>
<div class="text-left pull-left">
<pre class="text-left">st8.3: Not Implemented</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr> </tr>
<tr id='st8.4' class='none bg-warning'> <tr id='st8.4' class='none bg-warning'>
<td> <td>
@ -1685,29 +1669,11 @@ AssertionError: 'The camicdemo' != '\n '</pre>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st8.6' class='none bg-warning'> <tr id='pt8.6' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_convert_only</div> <div class='testcase'>test_convert_only</div>
</td> </td>
<td colspan='6'> <td colspan='6' align='center'>PASS</td>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st8.6')">SKIP</a>
</div>
<!--css div popup start-->
<div id='div_st8.6' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st8.6').style.display='none'"><span
aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st8.6').style.display='none'">[x]</a>-->
</div>
<div class="text-left pull-left">
<pre class="text-left">st8.6: Not Implemented</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr> </tr>
<tr id='st8.7' class='none bg-warning'> <tr id='st8.7' class='none bg-warning'>
<td> <td>
@ -1739,48 +1705,69 @@ AssertionError: 'The camicdemo' != '\n '</pre>
</td> </td>
<td colspan='6' align='center'>PASS</td> <td colspan='6' align='center'>PASS</td>
</tr> </tr>
<tr id='st8.9' class='none bg-warning'> <tr id='pt8.9' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_email_failed</div> <div class='testcase'>test_email_failed</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st8.9')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_pt8.9')">PASS</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st8.9' class="popup_window test_output" style="display:none;"> <div id='div_pt8.9' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st8.9').style.display='none'"><span onclick="document.getElementById('div_pt8.9').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st8.9').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_pt8.9').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st8.9: Not Implemented</pre> <pre class="text-left">pt8.9: Received: EHLO</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st8.10' class='none bg-warning'> <tr id='pt8.10' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_email_only</div> <div class='testcase'>test_email_only</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st8.10')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_pt8.10')">PASS</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st8.10' class="popup_window test_output" style="display:none;"> <div id='div_pt8.10' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st8.10').style.display='none'"><span onclick="document.getElementById('div_pt8.10').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st8.10').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_pt8.10').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st8.10: Not Implemented</pre> <pre class="text-left">pt8.10: Received: EHLO
Received: AUTH
User: name@host.com, Password: 10234
Received: MAIL
Received: RCPT
Received: DATA
('Receiving message from:', ('127.0.0.1', 44494))
('Message addressed from:', '&lt;name@host.com&gt; size=506')
('Message addressed to :', ['a1@b.com'])
('Message length :', 505)
Received: QUIT
Received: EHLO
Received: AUTH
User: name@host.com, Password: 10234
Received: MAIL
Received: RCPT
Received: DATA
('Receiving message from:', ('127.0.0.1', 44496))
('Message addressed from:', '&lt;name@host.com&gt; size=30782')
('Message addressed to :', ['a1@b.com'])
('Message length :', 30781)
Received: QUIT</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
@ -1811,93 +1798,186 @@ AssertionError: 'The camicdemo' != '\n '</pre>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st8.12' class='none bg-warning'> <tr class='passClass'>
<td>test_email_ssl.test_SSL</td>
<td class="text-center">3</td>
<td class="text-center">3</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c9', 3)">Detail</a>
</td>
</tr>
<tr id='pt9.1' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_smtp_setup_error</div> <div class='testcase'>test_SSL_None_setup_error</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st8.12')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_pt9.1')">PASS</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st8.12' class="popup_window test_output" style="display:none;"> <div id='div_pt9.1' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st8.12').style.display='none'"><span onclick="document.getElementById('div_pt9.1').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st8.12').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_pt9.1').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st8.12: Not Implemented</pre> <pre class="text-left">pt9.1: Received: EHLO
Received: AUTH
User: name@host.com, Password: 10234
Received: MAIL
Received: RCPT
Received: DATA
('Receiving message from:', ('127.0.0.1', 40336))
('Message addressed from:', '&lt;name@host.com&gt; size=506')
('Message addressed to :', ['a1@b.com'])
('Message length :', 505)
Received: QUIT</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr class='failClass'>
<td>test_login.test_login</td>
<td class="text-center">6</td>
<td class="text-center">5</td>
<td class="text-center">1</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c9', 6)">Detail</a>
</td>
</tr>
<tr id='pt9.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_login_capital_letters_user_unicode_password_passwort</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt9.2' class='hiddenRow bg-success'> <tr id='pt9.2' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_login_delete_admin</div> <div class='testcase'>test_SSL_STARTTLS_setup_error</div>
</td> </td>
<td colspan='6' align='center'>PASS</td> <td colspan='6' align='center'>PASS</td>
</tr> </tr>
<tr id='pt9.3' class='hiddenRow bg-success'> <tr id='pt9.3' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_login_empty_password</div> <div class='testcase'>test_SSL_only</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='ft9.4' class='none bg-danger'>
<td>
<div class='testcase'>test_login_protected</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_ft9.4')">FAIL</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_pt9.3')">PASS</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_ft9.4' class="popup_window test_output" style="display:none;"> <div id='div_pt9.3' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_ft9.4').style.display='none'"><span onclick="document.getElementById('div_pt9.3').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_ft9.4').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_pt9.3').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">ft9.4: Traceback (most recent call last): <pre class="text-left">pt9.3: Received: EHLO
File "/home/matthias/Entwicklung/calibre-web-test/test/test_login.py", line 81, in test_login_protected Received: AUTH
self.assertTrue(self.fail_access_page("http://127.0.0.1:8083/config")) User: name@host.com, Password: 10234
AssertionError: False is not true</pre> Received: MAIL
Received: RCPT
Received: DATA
('Receiving message from:', ('127.0.0.1', 40346))
('Message addressed from:', '&lt;name@host.com&gt; size=30377')
('Message addressed to :', ['a1@b.com'])
('Message length :', 30376)
Received: QUIT</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='pt9.5' class='hiddenRow bg-success'> <tr class='passClass'>
<td>test_email_STARTTLS.test_STARTTLS</td>
<td class="text-center">2</td>
<td class="text-center">2</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c10', 2)">Detail</a>
</td>
</tr>
<tr id='pt10.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_STARTTLS</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_pt10.1')">PASS</a>
</div>
<!--css div popup start-->
<div id='div_pt10.1' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_pt10.1').style.display='none'"><span
aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_pt10.1').style.display='none'">[x]</a>-->
</div>
<div class="text-left pull-left">
<pre class="text-left">pt10.1: Received: EHLO
Received: STARTTLS
Received: EHLO
Received: AUTH
User: name@host.com, Password: 10234
Received: MAIL
Received: RCPT
Received: DATA
('Receiving message from:', ('127.0.0.1', 59880))
('Message addressed from:', '&lt;name@host.com&gt; size=30377')
('Message addressed to :', ['a1@b.com'])
('Message length :', 30376)
Received: QUIT</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt10.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_STARTTLS_SSL_setup_error</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr class='passClass'>
<td>test_login.test_login</td>
<td class="text-center">6</td>
<td class="text-center">6</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c11', 6)">Detail</a>
</td>
</tr>
<tr id='pt11.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_login_capital_letters_user_unicode_password_passwort</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_login_delete_admin</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_login_empty_password</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_login_protected</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt11.5' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_login_unicode_user_space_end_passwort</div> <div class='testcase'>test_login_unicode_user_space_end_passwort</div>
</td> </td>
<td colspan='6' align='center'>PASS</td> <td colspan='6' align='center'>PASS</td>
</tr> </tr>
<tr id='pt9.6' class='hiddenRow bg-success'> <tr id='pt11.6' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_login_user_with_space_passwort_end_space</div> <div class='testcase'>test_login_user_with_space_passwort_end_space</div>
</td> </td>
@ -1911,27 +1991,27 @@ AssertionError: False is not true</pre>
<td class="text-center">0</td> <td class="text-center">0</td>
<td class="text-center">1</td> <td class="text-center">1</td>
<td class="text-center"> <td class="text-center">
<a onclick="showClassDetail('c10', 1)">Detail</a> <a onclick="showClassDetail('c12', 1)">Detail</a>
</td> </td>
</tr> </tr>
<tr id='st10.1' class='none bg-warning'> <tr id='st12.1' class='none bg-warning'>
<td> <td>
<div class='testcase'>test_opds</div> <div class='testcase'>test_opds</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st10.1')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st12.1')">SKIP</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st10.1' class="popup_window test_output" style="display:none;"> <div id='div_st12.1' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st10.1').style.display='none'"><span onclick="document.getElementById('div_st12.1').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st10.1').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_st12.1').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st10.1: Not Implemented</pre> <pre class="text-left">st12.1: Not Implemented</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
@ -1946,136 +2026,12 @@ AssertionError: False is not true</pre>
<td class="text-center">0</td> <td class="text-center">0</td>
<td class="text-center">1</td> <td class="text-center">1</td>
<td class="text-center"> <td class="text-center">
<a onclick="showClassDetail('c11', 1)">Detail</a> <a onclick="showClassDetail('c13', 1)">Detail</a>
</td>
</tr>
<tr id='st11.1' class='none bg-warning'>
<td>
<div class='testcase'>test_updater</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st11.1')">SKIP</a>
</div>
<!--css div popup start-->
<div id='div_st11.1' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st11.1').style.display='none'"><span
aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st11.1').style.display='none'">[x]</a>-->
</div>
<div class="text-left pull-left">
<pre class="text-left">st11.1: Not Implemented</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr>
<tr class='passClass'>
<td>test_helper.calibre_helper</td>
<td class="text-center">13</td>
<td class="text-center">13</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c12', 13)">Detail</a>
</td>
</tr>
<tr id='pt12.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_comma</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_junior</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_oneword</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_roman</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_Limit_Length</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_char_replacement</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_chinese_Characters</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_degEUR_replacement</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_doubleS</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.11' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_finish_Dot</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.12' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_high23</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt12.13' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_umlauts</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr class='skipClass'>
<td>test_register.test_register</td>
<td class="text-center">4</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">4</td>
<td class="text-center">
<a onclick="showClassDetail('c13', 4)">Detail</a>
</td> </td>
</tr> </tr>
<tr id='st13.1' class='none bg-warning'> <tr id='st13.1' class='none bg-warning'>
<td> <td>
<div class='testcase'>test_login_with_password</div> <div class='testcase'>test_updater</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
@ -2097,72 +2053,196 @@ AssertionError: False is not true</pre>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st13.2' class='none bg-warning'> <tr class='passClass'>
<td>test_helper.calibre_helper</td>
<td class="text-center">13</td>
<td class="text-center">13</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">
<a onclick="showClassDetail('c14', 13)">Detail</a>
</td>
</tr>
<tr id='pt14.1' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.2' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_comma</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.3' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_junior</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.4' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_oneword</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.5' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_author_sort_roman</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.6' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_Limit_Length</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.7' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_char_replacement</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.8' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_chinese_Characters</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.9' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_degEUR_replacement</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.10' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_doubleS</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.11' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_finish_Dot</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.12' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_high23</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr id='pt14.13' class='hiddenRow bg-success'>
<td>
<div class='testcase'>test_check_umlauts</div>
</td>
<td colspan='6' align='center'>PASS</td>
</tr>
<tr class='skipClass'>
<td>test_register.test_register</td>
<td class="text-center">4</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">0</td>
<td class="text-center">4</td>
<td class="text-center">
<a onclick="showClassDetail('c15', 4)">Detail</a>
</td>
</tr>
<tr id='st15.1' class='none bg-warning'>
<td>
<div class='testcase'>test_login_with_password</div>
</td>
<td colspan='6'>
<div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st15.1')">SKIP</a>
</div>
<!--css div popup start-->
<div id='div_st15.1' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st15.1').style.display='none'"><span
aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st15.1').style.display='none'">[x]</a>-->
</div>
<div class="text-left pull-left">
<pre class="text-left">st15.1: Not Implemented</pre>
</div>
<div class="clearfix"></div>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='st15.2' class='none bg-warning'>
<td> <td>
<div class='testcase'>test_registering_user</div> <div class='testcase'>test_registering_user</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st13.2')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st15.2')">SKIP</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st13.2' class="popup_window test_output" style="display:none;"> <div id='div_st15.2' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st13.2').style.display='none'"><span onclick="document.getElementById('div_st15.2').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st13.2').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_st15.2').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st13.2: Not Implemented</pre> <pre class="text-left">st15.2: Not Implemented</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st13.3' class='none bg-warning'> <tr id='st15.3' class='none bg-warning'>
<td> <td>
<div class='testcase'>test_registering_user_fail</div> <div class='testcase'>test_registering_user_fail</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st13.3')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st15.3')">SKIP</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st13.3' class="popup_window test_output" style="display:none;"> <div id='div_st15.3' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st13.3').style.display='none'"><span onclick="document.getElementById('div_st15.3').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st13.3').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_st15.3').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st13.3: Not Implemented</pre> <pre class="text-left">st15.3: Not Implemented</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
<!--css div popup end--> <!--css div popup end-->
</td> </td>
</tr> </tr>
<tr id='st13.4' class='none bg-warning'> <tr id='st15.4' class='none bg-warning'>
<td> <td>
<div class='testcase'>test_resend_password</div> <div class='testcase'>test_resend_password</div>
</td> </td>
<td colspan='6'> <td colspan='6'>
<div class="text-center"> <div class="text-center">
<a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st13.4')">SKIP</a> <a class="popup_link text-center" onfocus='blur()' onclick="showTestDetail('div_st15.4')">SKIP</a>
</div> </div>
<!--css div popup start--> <!--css div popup start-->
<div id='div_st13.4' class="popup_window test_output" style="display:none;"> <div id='div_st15.4' class="popup_window test_output" style="display:none;">
<div class='close_button pull-right'> <div class='close_button pull-right'>
<button type="button" class="close" aria-label="Close" onfocus='this.blur();' <button type="button" class="close" aria-label="Close" onfocus='this.blur();'
onclick="document.getElementById('div_st13.4').style.display='none'"><span onclick="document.getElementById('div_st15.4').style.display='none'"><span
aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<!--<a onfocus='this.blur();' onclick="document.getElementById('div_st13.4').style.display='none'">[x]</a>--> <!--<a onfocus='this.blur();' onclick="document.getElementById('div_st15.4').style.display='none'">[x]</a>-->
</div> </div>
<div class="text-left pull-left"> <div class="text-left pull-left">
<pre class="text-left">st13.4: Not Implemented</pre> <pre class="text-left">st15.4: Not Implemented</pre>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
@ -2177,28 +2257,28 @@ AssertionError: False is not true</pre>
<td class="text-center">0</td> <td class="text-center">0</td>
<td class="text-center">0</td> <td class="text-center">0</td>
<td class="text-center"> <td class="text-center">
<a onclick="showClassDetail('c14', 4)">Detail</a> <a onclick="showClassDetail('c16', 4)">Detail</a>
</td> </td>
</tr> </tr>
<tr id='pt14.1' class='hiddenRow bg-success'> <tr id='pt16.1' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_cli_SSL_files</div> <div class='testcase'>test_cli_SSL_files</div>
</td> </td>
<td colspan='6' align='center'>PASS</td> <td colspan='6' align='center'>PASS</td>
</tr> </tr>
<tr id='pt14.2' class='hiddenRow bg-success'> <tr id='pt16.2' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_cli_different_folder</div> <div class='testcase'>test_cli_different_folder</div>
</td> </td>
<td colspan='6' align='center'>PASS</td> <td colspan='6' align='center'>PASS</td>
</tr> </tr>
<tr id='pt14.3' class='hiddenRow bg-success'> <tr id='pt16.3' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_cli_different_settings_database</div> <div class='testcase'>test_cli_different_settings_database</div>
</td> </td>
<td colspan='6' align='center'>PASS</td> <td colspan='6' align='center'>PASS</td>
</tr> </tr>
<tr id='pt14.4' class='hiddenRow bg-success'> <tr id='pt16.4' class='hiddenRow bg-success'>
<td> <td>
<div class='testcase'>test_environ_port_setting</div> <div class='testcase'>test_environ_port_setting</div>
</td> </td>
@ -2207,17 +2287,17 @@ AssertionError: False is not true</pre>
<tr id='total_row' class="text-center bg-grey"> <tr id='total_row' class="text-center bg-grey">
<td>Total</td> <td>Total</td>
<td>129</td> <td>133</td>
<td>64</td> <td>76</td>
<td>5</td> <td>4</td>
<td>0</td> <td>0</td>
<td>60</td> <td>53</td>
<td>&nbsp;</td> <td>&nbsp;</td>
</tr> </tr>
</table> </table>
<script> <script>
drawCircle(64, 5, 0, 60); drawCircle(76, 4, 0, 53);
</script> </script>
</div> </div>