mirror of
https://github.com/futurepress/epub.js.git
synced 2025-10-03 14:59:18 +02:00
180 lines
5.2 KiB
JavaScript
180 lines
5.2 KiB
JavaScript
EPUBJS.Layout = EPUBJS.Layout || {};
|
|
|
|
EPUBJS.Layout.Reflowable = function(view){
|
|
// this.documentElement = null;
|
|
this.view = view;
|
|
this.spreadWidth = null;
|
|
};
|
|
|
|
EPUBJS.Layout.Reflowable.prototype.format = function(documentElement, _width, _height, _gap){
|
|
// Get the prefixed CSS commands
|
|
var columnAxis = EPUBJS.core.prefixed('columnAxis');
|
|
var columnGap = EPUBJS.core.prefixed('columnGap');
|
|
var columnWidth = EPUBJS.core.prefixed('columnWidth');
|
|
var columnFill = EPUBJS.core.prefixed('columnFill');
|
|
|
|
//-- Check the width and create even width columns
|
|
var width = Math.floor(_width);
|
|
// var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 0; // Not needed for single
|
|
var section = Math.floor(width / 8);
|
|
var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1);
|
|
this.documentElement = documentElement;
|
|
//-- Single Page
|
|
this.spreadWidth = (width + gap);
|
|
|
|
|
|
documentElement.style.overflow = "hidden";
|
|
|
|
// Must be set to the new calculated width or the columns will be off
|
|
documentElement.style.width = width + "px";
|
|
|
|
//-- Adjust height
|
|
documentElement.style.height = _height + "px";
|
|
|
|
//-- Add columns
|
|
documentElement.style[columnAxis] = "horizontal";
|
|
documentElement.style[columnFill] = "auto";
|
|
documentElement.style[columnWidth] = width+"px";
|
|
documentElement.style[columnGap] = gap+"px";
|
|
this.colWidth = width;
|
|
this.gap = gap;
|
|
|
|
return {
|
|
pageWidth : this.spreadWidth,
|
|
pageHeight : _height
|
|
};
|
|
};
|
|
|
|
EPUBJS.Layout.Reflowable.prototype.calculatePages = function() {
|
|
var totalWidth, displayedPages;
|
|
this.documentElement.style.width = "auto"; //-- reset width for calculations
|
|
totalWidth = this.documentElement.scrollWidth;
|
|
displayedPages = Math.ceil(totalWidth / this.spreadWidth);
|
|
|
|
return {
|
|
displayedPages : displayedPages,
|
|
pageCount : displayedPages
|
|
};
|
|
};
|
|
|
|
EPUBJS.Layout.ReflowableSpreads = function(view){
|
|
this.view = view;
|
|
this.documentElement = view.document.documentElement;
|
|
this.spreadWidth = null;
|
|
};
|
|
|
|
EPUBJS.Layout.ReflowableSpreads.prototype.format = function(_width, _height, _gap){
|
|
var columnAxis = EPUBJS.core.prefixed('columnAxis');
|
|
var columnGap = EPUBJS.core.prefixed('columnGap');
|
|
var columnWidth = EPUBJS.core.prefixed('columnWidth');
|
|
var columnFill = EPUBJS.core.prefixed('columnFill');
|
|
|
|
var divisor = 2,
|
|
cutoff = 800;
|
|
|
|
//-- Check the width and create even width columns
|
|
var fullWidth = Math.floor(_width);
|
|
var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 1;
|
|
|
|
var section = Math.floor(width / 8);
|
|
var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1);
|
|
|
|
//-- Double Page
|
|
var colWidth = Math.floor((width - gap) / divisor);
|
|
|
|
this.spreadWidth = (colWidth + gap) * divisor;
|
|
|
|
|
|
this.view.document.documentElement.style.overflow = "hidden";
|
|
|
|
// Must be set to the new calculated width or the columns will be off
|
|
this.view.document.body.style.width = width + "px";
|
|
|
|
//-- Adjust height
|
|
this.view.document.body.style.height = _height + "px";
|
|
|
|
//-- Add columns
|
|
this.view.document.body.style[columnAxis] = "horizontal";
|
|
this.view.document.body.style[columnFill] = "auto";
|
|
this.view.document.body.style[columnGap] = gap+"px";
|
|
this.view.document.body.style[columnWidth] = colWidth+"px";
|
|
|
|
this.colWidth = colWidth;
|
|
this.gap = gap;
|
|
|
|
this.view.document.body.style.paddingRight = gap + "px";
|
|
// view.iframe.style.width = this.spreadWidth+"px";
|
|
// this.view.element.style.paddingRight = gap+"px";
|
|
// view.iframe.style.paddingLeft = gap+"px";
|
|
|
|
return {
|
|
pageWidth : this.spreadWidth,
|
|
pageHeight : _height
|
|
};
|
|
};
|
|
|
|
EPUBJS.Layout.ReflowableSpreads.prototype.calculatePages = function(view) {
|
|
var totalWidth = this.documentElement.scrollWidth;
|
|
var displayedPages = Math.ceil(totalWidth / this.spreadWidth);
|
|
|
|
//-- Add a page to the width of the document to account an for odd number of pages
|
|
// this.documentElement.style.width = totalWidth + this.spreadWidth + "px";
|
|
return {
|
|
displayedPages : displayedPages,
|
|
pageCount : displayedPages * 2
|
|
};
|
|
};
|
|
|
|
EPUBJS.Layout.Fixed = function(){
|
|
this.documentElement = null;
|
|
};
|
|
|
|
EPUBJS.Layout.Fixed = function(documentElement, _width, _height, _gap){
|
|
var columnWidth = EPUBJS.core.prefixed('columnWidth');
|
|
var viewport = documentElement.querySelector("[name=viewport");
|
|
var content;
|
|
var contents;
|
|
var width, height;
|
|
|
|
this.documentElement = documentElement;
|
|
/**
|
|
* check for the viewport size
|
|
* <meta name="viewport" content="width=1024,height=697" />
|
|
*/
|
|
if(viewport && viewport.hasAttribute("content")) {
|
|
content = viewport.getAttribute("content");
|
|
contents = content.split(',');
|
|
if(contents[0]){
|
|
width = contents[0].replace("width=", '');
|
|
}
|
|
if(contents[1]){
|
|
height = contents[1].replace("height=", '');
|
|
}
|
|
}
|
|
|
|
//-- Adjust width and height
|
|
documentElement.style.width = width + "px" || "auto";
|
|
documentElement.style.height = height + "px" || "auto";
|
|
|
|
//-- Remove columns
|
|
documentElement.style[columnWidth] = "auto";
|
|
|
|
//-- Scroll
|
|
documentElement.style.overflow = "auto";
|
|
|
|
this.colWidth = width;
|
|
this.gap = 0;
|
|
|
|
return {
|
|
pageWidth : width,
|
|
pageHeight : height
|
|
};
|
|
|
|
};
|
|
|
|
EPUBJS.Layout.Fixed.prototype.calculatePages = function(){
|
|
return {
|
|
displayedPages : 1,
|
|
pageCount : 1
|
|
};
|
|
};
|