update epub.js
7989
epub.js/epub.js
12
epub.js/epub.min.js
vendored
318
epub.js/hooks.js
|
@ -1,318 +0,0 @@
|
||||||
EPUBJS.Hooks.register("beforeChapterDisplay").endnotes = function(callback, renderer){
|
|
||||||
|
|
||||||
var notes = renderer.contents.querySelectorAll('a[href]'),
|
|
||||||
items = Array.prototype.slice.call(notes), //[].slice.call()
|
|
||||||
attr = "epub:type",
|
|
||||||
type = "noteref",
|
|
||||||
folder = EPUBJS.core.folder(location.pathname),
|
|
||||||
cssPath = (folder + EPUBJS.cssPath) || folder,
|
|
||||||
popups = {};
|
|
||||||
|
|
||||||
EPUBJS.core.addCss(EPUBJS.cssPath + "popup.css", false, renderer.render.document.head);
|
|
||||||
|
|
||||||
|
|
||||||
items.forEach(function(item){
|
|
||||||
var epubType = item.getAttribute(attr),
|
|
||||||
href,
|
|
||||||
id,
|
|
||||||
el,
|
|
||||||
pop,
|
|
||||||
pos,
|
|
||||||
left,
|
|
||||||
top,
|
|
||||||
txt;
|
|
||||||
|
|
||||||
if(epubType != type) return;
|
|
||||||
|
|
||||||
href = item.getAttribute("href");
|
|
||||||
id = href.replace("#", '');
|
|
||||||
el = renderer.render.document.getElementById(id);
|
|
||||||
|
|
||||||
|
|
||||||
item.addEventListener("mouseover", showPop, false);
|
|
||||||
item.addEventListener("mouseout", hidePop, false);
|
|
||||||
|
|
||||||
function showPop(){
|
|
||||||
var poppos,
|
|
||||||
iheight = renderer.height,
|
|
||||||
iwidth = renderer.width,
|
|
||||||
tip,
|
|
||||||
pop,
|
|
||||||
maxHeight = 225,
|
|
||||||
itemRect;
|
|
||||||
|
|
||||||
if(!txt) {
|
|
||||||
pop = el.cloneNode(true);
|
|
||||||
txt = pop.querySelector("p");
|
|
||||||
}
|
|
||||||
|
|
||||||
// chapter.replaceLinks.bind(this) //TODO:Fred - update?
|
|
||||||
//-- create a popup with endnote inside of it
|
|
||||||
if(!popups[id]) {
|
|
||||||
popups[id] = document.createElement("div");
|
|
||||||
popups[id].setAttribute("class", "popup");
|
|
||||||
|
|
||||||
pop_content = document.createElement("div");
|
|
||||||
|
|
||||||
popups[id].appendChild(pop_content);
|
|
||||||
|
|
||||||
pop_content.appendChild(txt);
|
|
||||||
pop_content.setAttribute("class", "pop_content");
|
|
||||||
|
|
||||||
renderer.render.document.body.appendChild(popups[id]);
|
|
||||||
|
|
||||||
//-- TODO: will these leak memory? - Fred
|
|
||||||
popups[id].addEventListener("mouseover", onPop, false);
|
|
||||||
popups[id].addEventListener("mouseout", offPop, false);
|
|
||||||
|
|
||||||
//-- Add hide on page change
|
|
||||||
// chapter.book.listenUntil("book:pageChanged", "book:chapterDestroy", hidePop);
|
|
||||||
// chapter.book.listenUntil("book:pageChanged", "book:chapterDestroy", offPop);
|
|
||||||
renderer.on("renderer:pageChanged", hidePop, this);
|
|
||||||
renderer.on("renderer:pageChanged", offPop, this);
|
|
||||||
// chapter.book.on("renderer:chapterDestroy", hidePop, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
pop = popups[id];
|
|
||||||
|
|
||||||
|
|
||||||
//-- get location of item
|
|
||||||
itemRect = item.getBoundingClientRect();
|
|
||||||
left = itemRect.left;
|
|
||||||
top = itemRect.top;
|
|
||||||
|
|
||||||
//-- show the popup
|
|
||||||
pop.classList.add("show");
|
|
||||||
|
|
||||||
//-- locations of popup
|
|
||||||
popRect = pop.getBoundingClientRect();
|
|
||||||
|
|
||||||
//-- position the popup
|
|
||||||
pop.style.left = left - popRect.width / 2 + "px";
|
|
||||||
pop.style.top = top + "px";
|
|
||||||
|
|
||||||
|
|
||||||
//-- Adjust max height
|
|
||||||
if(maxHeight > iheight / 2.5) {
|
|
||||||
maxHeight = iheight / 2.5;
|
|
||||||
pop_content.style.maxHeight = maxHeight + "px";
|
|
||||||
}
|
|
||||||
|
|
||||||
//-- switch above / below
|
|
||||||
if(popRect.height + top >= iheight - 25) {
|
|
||||||
pop.style.top = top - popRect.height + "px";
|
|
||||||
pop.classList.add("above");
|
|
||||||
}else{
|
|
||||||
pop.classList.remove("above");
|
|
||||||
}
|
|
||||||
|
|
||||||
//-- switch left
|
|
||||||
if(left - popRect.width <= 0) {
|
|
||||||
pop.style.left = left + "px";
|
|
||||||
pop.classList.add("left");
|
|
||||||
}else{
|
|
||||||
pop.classList.remove("left");
|
|
||||||
}
|
|
||||||
|
|
||||||
//-- switch right
|
|
||||||
if(left + popRect.width / 2 >= iwidth) {
|
|
||||||
//-- TEMP MOVE: 300
|
|
||||||
pop.style.left = left - 300 + "px";
|
|
||||||
|
|
||||||
popRect = pop.getBoundingClientRect();
|
|
||||||
pop.style.left = left - popRect.width + "px";
|
|
||||||
//-- switch above / below again
|
|
||||||
if(popRect.height + top >= iheight - 25) {
|
|
||||||
pop.style.top = top - popRect.height + "px";
|
|
||||||
pop.classList.add("above");
|
|
||||||
}else{
|
|
||||||
pop.classList.remove("above");
|
|
||||||
}
|
|
||||||
|
|
||||||
pop.classList.add("right");
|
|
||||||
}else{
|
|
||||||
pop.classList.remove("right");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function onPop(){
|
|
||||||
popups[id].classList.add("on");
|
|
||||||
}
|
|
||||||
|
|
||||||
function offPop(){
|
|
||||||
popups[id].classList.remove("on");
|
|
||||||
}
|
|
||||||
|
|
||||||
function hidePop(){
|
|
||||||
setTimeout(function(){
|
|
||||||
popups[id].classList.remove("show");
|
|
||||||
}, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
if(callback) callback();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
EPUBJS.Hooks.register("beforeChapterDisplay").mathml = function(callback, renderer){
|
|
||||||
|
|
||||||
// check of currentChapter properties contains 'mathml'
|
|
||||||
if(renderer.currentChapter.manifestProperties.indexOf("mathml") !== -1 ){
|
|
||||||
|
|
||||||
// Assign callback to be inside iframe window
|
|
||||||
renderer.render.iframe.contentWindow.mathmlCallback = callback;
|
|
||||||
|
|
||||||
// add MathJax config script tag to the renderer body
|
|
||||||
var s = document.createElement("script");
|
|
||||||
s.type = 'text/x-mathjax-config';
|
|
||||||
s.innerHTML = '\
|
|
||||||
MathJax.Hub.Register.StartupHook("End",function () { \
|
|
||||||
window.mathmlCallback(); \
|
|
||||||
});\
|
|
||||||
MathJax.Hub.Config({jax: ["input/TeX","input/MathML","output/SVG"],extensions: ["tex2jax.js","mml2jax.js","MathEvents.js"],TeX: {extensions: ["noErrors.js","noUndefined.js","autoload-all.js"]},MathMenu: {showRenderer: false},menuSettings: {zoom: "Click"},messageStyle: "none"}); \
|
|
||||||
';
|
|
||||||
renderer.doc.body.appendChild(s);
|
|
||||||
// add MathJax.js to renderer head
|
|
||||||
EPUBJS.core.addScript("http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML", null, renderer.doc.head);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if(callback) callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EPUBJS.Hooks.register("beforeChapterDisplay").smartimages = function(callback, renderer){
|
|
||||||
var images = renderer.contents.querySelectorAll('img'),
|
|
||||||
items = Array.prototype.slice.call(images),
|
|
||||||
iheight = renderer.height,//chapter.bodyEl.clientHeight,//chapter.doc.body.getBoundingClientRect().height,
|
|
||||||
oheight;
|
|
||||||
|
|
||||||
if(renderer.layoutSettings.layout != "reflowable") {
|
|
||||||
callback();
|
|
||||||
return; //-- Only adjust images for reflowable text
|
|
||||||
}
|
|
||||||
|
|
||||||
items.forEach(function(item){
|
|
||||||
|
|
||||||
function size() {
|
|
||||||
var itemRect = item.getBoundingClientRect(),
|
|
||||||
rectHeight = itemRect.height,
|
|
||||||
top = itemRect.top,
|
|
||||||
oHeight = item.getAttribute('data-height'),
|
|
||||||
height = oHeight || rectHeight,
|
|
||||||
newHeight,
|
|
||||||
fontSize = Number(getComputedStyle(item, "").fontSize.match(/(\d*(\.\d*)?)px/)[1]),
|
|
||||||
fontAdjust = fontSize ? fontSize / 2 : 0;
|
|
||||||
|
|
||||||
iheight = renderer.contents.clientHeight;
|
|
||||||
if(top < 0) top = 0;
|
|
||||||
|
|
||||||
if(height + top >= iheight) {
|
|
||||||
|
|
||||||
if(top < iheight/2) {
|
|
||||||
// Remove top and half font-size from height to keep container from overflowing
|
|
||||||
newHeight = iheight - top - fontAdjust;
|
|
||||||
item.style.maxHeight = newHeight + "px";
|
|
||||||
item.style.width= "auto";
|
|
||||||
}else{
|
|
||||||
if(height > iheight) {
|
|
||||||
item.style.maxHeight = iheight + "px";
|
|
||||||
item.style.width= "auto";
|
|
||||||
itemRect = item.getBoundingClientRect();
|
|
||||||
height = itemRect.height;
|
|
||||||
}
|
|
||||||
item.style.display = "block";
|
|
||||||
item.style["WebkitColumnBreakBefore"] = "always";
|
|
||||||
item.style["breakBefore"] = "column";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
item.setAttribute('data-height', newHeight);
|
|
||||||
|
|
||||||
}else{
|
|
||||||
item.style.removeProperty('max-height');
|
|
||||||
item.style.removeProperty('margin-top');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item.addEventListener('load', size, false);
|
|
||||||
|
|
||||||
renderer.on("renderer:resized", size);
|
|
||||||
|
|
||||||
renderer.on("renderer:chapterUnloaded", function(){
|
|
||||||
item.removeEventListener('load', size);
|
|
||||||
renderer.off("renderer:resized", size);
|
|
||||||
});
|
|
||||||
|
|
||||||
size();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
if(callback) callback();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
EPUBJS.Hooks.register("beforeChapterDisplay").transculsions = function(callback, renderer){
|
|
||||||
/*
|
|
||||||
<aside ref="http://www.youtube.com/embed/DUL6MBVKVLI?html5=1" transclusion="video" width="560" height="315">
|
|
||||||
<a href="http://www.youtube.com/embed/DUL6MBVKVLI"> Watch the National Geographic: The Last Roll of Kodachrome</a>
|
|
||||||
</aside>
|
|
||||||
*/
|
|
||||||
|
|
||||||
var trans = renderer.contents.querySelectorAll('[transclusion]'),
|
|
||||||
items = Array.prototype.slice.call(trans);
|
|
||||||
|
|
||||||
items.forEach(function(item){
|
|
||||||
var src = item.getAttribute("ref"),
|
|
||||||
iframe = document.createElement('iframe'),
|
|
||||||
orginal_width = item.getAttribute("width"),
|
|
||||||
orginal_height = item.getAttribute("height"),
|
|
||||||
parent = item.parentNode,
|
|
||||||
width = orginal_width,
|
|
||||||
height = orginal_height,
|
|
||||||
ratio;
|
|
||||||
|
|
||||||
|
|
||||||
function size() {
|
|
||||||
width = orginal_width;
|
|
||||||
height = orginal_height;
|
|
||||||
|
|
||||||
if(width > chapter.colWidth){
|
|
||||||
ratio = chapter.colWidth / width;
|
|
||||||
|
|
||||||
width = chapter.colWidth;
|
|
||||||
height = height * ratio;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe.width = width;
|
|
||||||
iframe.height = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
size();
|
|
||||||
|
|
||||||
//-- resize event
|
|
||||||
|
|
||||||
|
|
||||||
renderer.listenUntil("renderer:resized", "renderer:chapterUnloaded", size);
|
|
||||||
|
|
||||||
iframe.src = src;
|
|
||||||
|
|
||||||
//<iframe width="560" height="315" src="http://www.youtube.com/embed/DUL6MBVKVLI" frameborder="0" allowfullscreen="true"></iframe>
|
|
||||||
parent.replaceChild(iframe, item);
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(callback) callback();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//# sourceMappingURL=hooks.js.map
|
|
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"version": 3,
|
|
||||||
"file": "hooks.js",
|
|
||||||
"sources": [
|
|
||||||
"hooks/default/endnotes.js",
|
|
||||||
"hooks/default/mathml.js",
|
|
||||||
"hooks/default/smartimages.js",
|
|
||||||
"hooks/default/transculsions.js"
|
|
||||||
],
|
|
||||||
"names": [],
|
|
||||||
"mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A"
|
|
||||||
}
|
|
2
epub.js/hooks.min.js
vendored
|
@ -1,2 +0,0 @@
|
||||||
EPUBJS.Hooks.register("beforeChapterDisplay").endnotes=function(a,b){var c=b.contents.querySelectorAll("a[href]"),d=Array.prototype.slice.call(c),e="epub:type",f="noteref",g=EPUBJS.core.folder(location.pathname),h=(g+EPUBJS.cssPath||g,{});EPUBJS.core.addCss(EPUBJS.cssPath+"popup.css",!1,b.render.document.head),d.forEach(function(a){function c(){var c,e,f=b.height,j=b.width,p=225;o||(c=l.cloneNode(!0),o=c.querySelector("p")),h[k]||(h[k]=document.createElement("div"),h[k].setAttribute("class","popup"),pop_content=document.createElement("div"),h[k].appendChild(pop_content),pop_content.appendChild(o),pop_content.setAttribute("class","pop_content"),b.render.document.body.appendChild(h[k]),h[k].addEventListener("mouseover",d,!1),h[k].addEventListener("mouseout",g,!1),b.on("renderer:pageChanged",i,this),b.on("renderer:pageChanged",g,this)),c=h[k],e=a.getBoundingClientRect(),m=e.left,n=e.top,c.classList.add("show"),popRect=c.getBoundingClientRect(),c.style.left=m-popRect.width/2+"px",c.style.top=n+"px",p>f/2.5&&(p=f/2.5,pop_content.style.maxHeight=p+"px"),popRect.height+n>=f-25?(c.style.top=n-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),m-popRect.width<=0?(c.style.left=m+"px",c.classList.add("left")):c.classList.remove("left"),m+popRect.width/2>=j?(c.style.left=m-300+"px",popRect=c.getBoundingClientRect(),c.style.left=m-popRect.width+"px",popRect.height+n>=f-25?(c.style.top=n-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),c.classList.add("right")):c.classList.remove("right")}function d(){h[k].classList.add("on")}function g(){h[k].classList.remove("on")}function i(){setTimeout(function(){h[k].classList.remove("show")},100)}var j,k,l,m,n,o,p=a.getAttribute(e);p==f&&(j=a.getAttribute("href"),k=j.replace("#",""),l=b.render.document.getElementById(k),a.addEventListener("mouseover",c,!1),a.addEventListener("mouseout",i,!1))}),a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").mathml=function(a,b){if(-1!==b.currentChapter.manifestProperties.indexOf("mathml")){b.render.iframe.contentWindow.mathmlCallback=a;var c=document.createElement("script");c.type="text/x-mathjax-config",c.innerHTML=' MathJax.Hub.Register.StartupHook("End",function () { window.mathmlCallback(); }); MathJax.Hub.Config({jax: ["input/TeX","input/MathML","output/SVG"],extensions: ["tex2jax.js","mml2jax.js","MathEvents.js"],TeX: {extensions: ["noErrors.js","noUndefined.js","autoload-all.js"]},MathMenu: {showRenderer: false},menuSettings: {zoom: "Click"},messageStyle: "none"}); ',b.doc.body.appendChild(c),EPUBJS.core.addScript("http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML",null,b.doc.head)}else a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").smartimages=function(a,b){var c=b.contents.querySelectorAll("img"),d=Array.prototype.slice.call(c),e=b.height;return"reflowable"!=b.layoutSettings.layout?void a():(d.forEach(function(a){function c(){var c,d=a.getBoundingClientRect(),f=d.height,g=d.top,h=a.getAttribute("data-height"),i=h||f,j=Number(getComputedStyle(a,"").fontSize.match(/(\d*(\.\d*)?)px/)[1]),k=j?j/2:0;e=b.contents.clientHeight,0>g&&(g=0),i+g>=e?(e/2>g?(c=e-g-k,a.style.maxHeight=c+"px",a.style.width="auto"):(i>e&&(a.style.maxHeight=e+"px",a.style.width="auto",d=a.getBoundingClientRect(),i=d.height),a.style.display="block",a.style.WebkitColumnBreakBefore="always",a.style.breakBefore="column"),a.setAttribute("data-height",c)):(a.style.removeProperty("max-height"),a.style.removeProperty("margin-top"))}a.addEventListener("load",c,!1),b.on("renderer:resized",c),b.on("renderer:chapterUnloaded",function(){a.removeEventListener("load",c),b.off("renderer:resized",c)}),c()}),void(a&&a()))},EPUBJS.Hooks.register("beforeChapterDisplay").transculsions=function(a,b){var c=b.contents.querySelectorAll("[transclusion]"),d=Array.prototype.slice.call(c);d.forEach(function(a){function c(){j=g,k=h,j>chapter.colWidth&&(d=chapter.colWidth/j,j=chapter.colWidth,k*=d),f.width=j,f.height=k}var d,e=a.getAttribute("ref"),f=document.createElement("iframe"),g=a.getAttribute("width"),h=a.getAttribute("height"),i=a.parentNode,j=g,k=h;c(),b.listenUntil("renderer:resized","renderer:chapterUnloaded",c),f.src=e,i.replaceChild(f,a)}),a&&a()};
|
|
||||||
//# sourceMappingURL=hooks.min.map
|
|
15
epub.js/humans.txt
Executable file
|
@ -0,0 +1,15 @@
|
||||||
|
# humanstxt.org/
|
||||||
|
# The humans responsible & technology colophon
|
||||||
|
|
||||||
|
# TEAM
|
||||||
|
|
||||||
|
<name> -- <role> -- <twitter>
|
||||||
|
|
||||||
|
# THANKS
|
||||||
|
|
||||||
|
<name>
|
||||||
|
|
||||||
|
# TECHNOLOGY COLOPHON
|
||||||
|
|
||||||
|
HTML5, CSS3
|
||||||
|
jQuery, Modernizr
|
0
epub.js/img/.gitignore
vendored
Executable file
BIN
epub.js/img/annotator-glyph-sprite.png
Normal file
After Width: | Height: | Size: 5 KiB |
BIN
epub.js/img/annotator-icon-sprite.png
Normal file
After Width: | Height: | Size: 7 KiB |
BIN
epub.js/img/apple-touch-icon.png
Executable file
After Width: | Height: | Size: 1.3 KiB |
BIN
epub.js/img/cancelfullscreen.png
Normal file
After Width: | Height: | Size: 246 B |
BIN
epub.js/img/close.png
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
epub.js/img/fullscreen.png
Normal file
After Width: | Height: | Size: 220 B |
BIN
epub.js/img/menu-icon.png
Normal file
After Width: | Height: | Size: 947 B |
BIN
epub.js/img/save.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
epub.js/img/saved.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
epub.js/img/settings-s.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
epub.js/img/settings.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
epub.js/img/star.png
Normal file
After Width: | Height: | Size: 278 B |
117
epub.js/index.html
Executable file
|
@ -0,0 +1,117 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<title></title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, user-scalable=no">
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="css/normalize.css">
|
||||||
|
<link rel="stylesheet" href="css/main.css">
|
||||||
|
<link rel="stylesheet" href="css/popup.css">
|
||||||
|
|
||||||
|
<script src="js/libs/jquery.min.js"></script>
|
||||||
|
|
||||||
|
<script src="js/libs/zip.min.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
document.onreadystatechange = function () {
|
||||||
|
if (document.readyState == "complete") {
|
||||||
|
window.reader = ePubReader("https://s3.amazonaws.com/moby-dick/", {
|
||||||
|
restore: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- File Storage -->
|
||||||
|
<!-- <script src="js/libs/localforage.min.js"></script> -->
|
||||||
|
|
||||||
|
<!-- Full Screen -->
|
||||||
|
<script src="js/libs/screenfull.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Render -->
|
||||||
|
<script src="js/epub.js"></script>
|
||||||
|
|
||||||
|
<!-- Reader -->
|
||||||
|
<script src="js/reader.js"></script>
|
||||||
|
|
||||||
|
<!-- Plugins -->
|
||||||
|
<!-- <script src="js/plugins/search.js"></script> -->
|
||||||
|
|
||||||
|
<!-- Highlights -->
|
||||||
|
<!-- <script src="js/libs/jquery.highlight.js"></script> -->
|
||||||
|
<!-- <script src="js/hooks/extensions/highlight.js"></script> -->
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="sidebar">
|
||||||
|
<div id="panels">
|
||||||
|
<!-- <input id="searchBox" placeholder="search" type="search"> -->
|
||||||
|
|
||||||
|
<!-- <a id="show-Search" class="show_view icon-search" data-view="Search">Search</a> -->
|
||||||
|
<a id="show-Toc" class="show_view icon-list-1 active" data-view="Toc">TOC</a>
|
||||||
|
<a id="show-Bookmarks" class="show_view icon-bookmark" data-view="Bookmarks">Bookmarks</a>
|
||||||
|
<!-- <a id="show-Notes" class="show_view icon-edit" data-view="Notes">Notes</a> -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div id="tocView" class="view">
|
||||||
|
</div>
|
||||||
|
<div id="searchView" class="view">
|
||||||
|
<ul id="searchResults"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="bookmarksView" class="view">
|
||||||
|
<ul id="bookmarks"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="notesView" class="view">
|
||||||
|
<div id="new-note">
|
||||||
|
<textarea id="note-text"></textarea>
|
||||||
|
<button id="note-anchor">Anchor</button>
|
||||||
|
</div>
|
||||||
|
<ol id="notes"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
|
||||||
|
<div id="titlebar">
|
||||||
|
<div id="opener">
|
||||||
|
<a id="slider" class="icon-menu">Menu</a>
|
||||||
|
</div>
|
||||||
|
<div id="metainfo">
|
||||||
|
<span id="book-title"></span>
|
||||||
|
<span id="title-seperator"> – </span>
|
||||||
|
<span id="chapter-title"></span>
|
||||||
|
</div>
|
||||||
|
<div id="title-controls">
|
||||||
|
<a id="bookmark" class="icon-bookmark-empty">Bookmark</a>
|
||||||
|
<a id="setting" class="icon-cog">Settings</a>
|
||||||
|
<a id="fullscreen" class="icon-resize-full">Fullscreen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="divider"></div>
|
||||||
|
<div id="prev" class="arrow">‹</div>
|
||||||
|
<div id="viewer"></div>
|
||||||
|
<div id="next" class="arrow">›</div>
|
||||||
|
|
||||||
|
<div id="loader"><img src="img/loader.gif"></div>
|
||||||
|
</div>
|
||||||
|
<div class="modal md-effect-1" id="settings-modal">
|
||||||
|
<div class="md-content">
|
||||||
|
<h3>Settings</h3>
|
||||||
|
<div>
|
||||||
|
<p>
|
||||||
|
<input type="checkbox" id="sidebarReflow" name="sidebarReflow">Reflow text when sidebars are open.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="closer icon-cancel-circled"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
16780
epub.js/js/epub.js
Normal file
1
epub.js/js/epub.min.map
Normal file
1
epub.js/js/hooks.min.map
Normal file
145
epub.js/js/libs/screenfull.js
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
/*!
|
||||||
|
* screenfull
|
||||||
|
* v2.0.0 - 2014-12-22
|
||||||
|
* (c) Sindre Sorhus; MIT License
|
||||||
|
*/
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var isCommonjs = typeof module !== 'undefined' && module.exports;
|
||||||
|
var keyboardAllowed = typeof Element !== 'undefined' && 'ALLOW_KEYBOARD_INPUT' in Element;
|
||||||
|
|
||||||
|
var fn = (function () {
|
||||||
|
var val;
|
||||||
|
var valLength;
|
||||||
|
|
||||||
|
var fnMap = [
|
||||||
|
[
|
||||||
|
'requestFullscreen',
|
||||||
|
'exitFullscreen',
|
||||||
|
'fullscreenElement',
|
||||||
|
'fullscreenEnabled',
|
||||||
|
'fullscreenchange',
|
||||||
|
'fullscreenerror'
|
||||||
|
],
|
||||||
|
// new WebKit
|
||||||
|
[
|
||||||
|
'webkitRequestFullscreen',
|
||||||
|
'webkitExitFullscreen',
|
||||||
|
'webkitFullscreenElement',
|
||||||
|
'webkitFullscreenEnabled',
|
||||||
|
'webkitfullscreenchange',
|
||||||
|
'webkitfullscreenerror'
|
||||||
|
|
||||||
|
],
|
||||||
|
// old WebKit (Safari 5.1)
|
||||||
|
[
|
||||||
|
'webkitRequestFullScreen',
|
||||||
|
'webkitCancelFullScreen',
|
||||||
|
'webkitCurrentFullScreenElement',
|
||||||
|
'webkitCancelFullScreen',
|
||||||
|
'webkitfullscreenchange',
|
||||||
|
'webkitfullscreenerror'
|
||||||
|
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'mozRequestFullScreen',
|
||||||
|
'mozCancelFullScreen',
|
||||||
|
'mozFullScreenElement',
|
||||||
|
'mozFullScreenEnabled',
|
||||||
|
'mozfullscreenchange',
|
||||||
|
'mozfullscreenerror'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'msRequestFullscreen',
|
||||||
|
'msExitFullscreen',
|
||||||
|
'msFullscreenElement',
|
||||||
|
'msFullscreenEnabled',
|
||||||
|
'MSFullscreenChange',
|
||||||
|
'MSFullscreenError'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
var l = fnMap.length;
|
||||||
|
var ret = {};
|
||||||
|
|
||||||
|
for (; i < l; i++) {
|
||||||
|
val = fnMap[i];
|
||||||
|
if (val && val[1] in document) {
|
||||||
|
for (i = 0, valLength = val.length; i < valLength; i++) {
|
||||||
|
ret[fnMap[0][i]] = val[i];
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
})();
|
||||||
|
|
||||||
|
var screenfull = {
|
||||||
|
request: function (elem) {
|
||||||
|
var request = fn.requestFullscreen;
|
||||||
|
|
||||||
|
elem = elem || document.documentElement;
|
||||||
|
|
||||||
|
// Work around Safari 5.1 bug: reports support for
|
||||||
|
// keyboard in fullscreen even though it doesn't.
|
||||||
|
// Browser sniffing, since the alternative with
|
||||||
|
// setTimeout is even worse.
|
||||||
|
if (/5\.1[\.\d]* Safari/.test(navigator.userAgent)) {
|
||||||
|
elem[request]();
|
||||||
|
} else {
|
||||||
|
elem[request](keyboardAllowed && Element.ALLOW_KEYBOARD_INPUT);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
exit: function () {
|
||||||
|
document[fn.exitFullscreen]();
|
||||||
|
},
|
||||||
|
toggle: function (elem) {
|
||||||
|
if (this.isFullscreen) {
|
||||||
|
this.exit();
|
||||||
|
} else {
|
||||||
|
this.request(elem);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
raw: fn
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!fn) {
|
||||||
|
if (isCommonjs) {
|
||||||
|
module.exports = false;
|
||||||
|
} else {
|
||||||
|
window.screenfull = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.defineProperties(screenfull, {
|
||||||
|
isFullscreen: {
|
||||||
|
get: function () {
|
||||||
|
return !!document[fn.fullscreenElement];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
element: {
|
||||||
|
enumerable: true,
|
||||||
|
get: function () {
|
||||||
|
return document[fn.fullscreenElement];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
enabled: {
|
||||||
|
enumerable: true,
|
||||||
|
get: function () {
|
||||||
|
// Coerce to boolean in case of old WebKit
|
||||||
|
return !!document[fn.fullscreenEnabled];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isCommonjs) {
|
||||||
|
module.exports = screenfull;
|
||||||
|
} else {
|
||||||
|
window.screenfull = screenfull;
|
||||||
|
}
|
||||||
|
})();
|
4372
epub.js/js/reader.js
Normal file
89
epub.js/js/reader.js.map
Normal file
1
epub.js/js/reader.min.map
Normal file
3
epub.js/libs/fileStorage.min.js
vendored
4
epub.js/libs/jquery-2.1.0.min.js
vendored
|
@ -1,108 +0,0 @@
|
||||||
/*
|
|
||||||
* jQuery Highlight plugin
|
|
||||||
*
|
|
||||||
* Based on highlight v3 by Johann Burkard
|
|
||||||
* http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
|
|
||||||
*
|
|
||||||
* Code a little bit refactored and cleaned (in my humble opinion).
|
|
||||||
* Most important changes:
|
|
||||||
* - has an option to highlight only entire words (wordsOnly - false by default),
|
|
||||||
* - has an option to be case sensitive (caseSensitive - false by default)
|
|
||||||
* - highlight element tag and class names can be specified in options
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
* // wrap every occurrance of text 'lorem' in content
|
|
||||||
* // with <span class='highlight'> (default options)
|
|
||||||
* $('#content').highlight('lorem');
|
|
||||||
*
|
|
||||||
* // search for and highlight more terms at once
|
|
||||||
* // so you can save some time on traversing DOM
|
|
||||||
* $('#content').highlight(['lorem', 'ipsum']);
|
|
||||||
* $('#content').highlight('lorem ipsum');
|
|
||||||
*
|
|
||||||
* // search only for entire word 'lorem'
|
|
||||||
* $('#content').highlight('lorem', { wordsOnly: true });
|
|
||||||
*
|
|
||||||
* // don't ignore case during search of term 'lorem'
|
|
||||||
* $('#content').highlight('lorem', { caseSensitive: true });
|
|
||||||
*
|
|
||||||
* // wrap every occurrance of term 'ipsum' in content
|
|
||||||
* // with <em class='important'>
|
|
||||||
* $('#content').highlight('ipsum', { element: 'em', className: 'important' });
|
|
||||||
*
|
|
||||||
* // remove default highlight
|
|
||||||
* $('#content').unhighlight();
|
|
||||||
*
|
|
||||||
* // remove custom highlight
|
|
||||||
* $('#content').unhighlight({ element: 'em', className: 'important' });
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright (c) 2009 Bartek Szopka
|
|
||||||
*
|
|
||||||
* Licensed under MIT license.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
jQuery.extend({
|
|
||||||
highlight: function (node, re, nodeName, className) {
|
|
||||||
if (node.nodeType === 3) {
|
|
||||||
var match = node.data.match(re);
|
|
||||||
if (match) {
|
|
||||||
var highlight = document.createElement(nodeName || 'span');
|
|
||||||
highlight.className = className || 'highlight';
|
|
||||||
var wordNode = node.splitText(match.index);
|
|
||||||
wordNode.splitText(match[0].length);
|
|
||||||
var wordClone = wordNode.cloneNode(true);
|
|
||||||
highlight.appendChild(wordClone);
|
|
||||||
wordNode.parentNode.replaceChild(highlight, wordNode);
|
|
||||||
return 1; //skip added node in parent
|
|
||||||
}
|
|
||||||
} else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children
|
|
||||||
!/(script|style)/i.test(node.tagName) && // ignore script and style nodes
|
|
||||||
!(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted
|
|
||||||
for (var i = 0; i < node.childNodes.length; i++) {
|
|
||||||
i += jQuery.highlight(node.childNodes[i], re, nodeName, className);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
jQuery.fn.unhighlight = function (options) {
|
|
||||||
var settings = { className: 'highlight', element: 'span' };
|
|
||||||
jQuery.extend(settings, options);
|
|
||||||
|
|
||||||
return this.find(settings.element + "." + settings.className).each(function () {
|
|
||||||
var parent = this.parentNode;
|
|
||||||
parent.replaceChild(this.firstChild, this);
|
|
||||||
parent.normalize();
|
|
||||||
}).end();
|
|
||||||
};
|
|
||||||
|
|
||||||
jQuery.fn.highlight = function (words, options) {
|
|
||||||
var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false };
|
|
||||||
jQuery.extend(settings, options);
|
|
||||||
|
|
||||||
if (words.constructor === String) {
|
|
||||||
words = [words];
|
|
||||||
}
|
|
||||||
words = jQuery.grep(words, function(word, i){
|
|
||||||
return word != '';
|
|
||||||
});
|
|
||||||
words = jQuery.map(words, function(word, i) {
|
|
||||||
return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
||||||
});
|
|
||||||
if (words.length == 0) { return this; };
|
|
||||||
|
|
||||||
var flag = settings.caseSensitive ? "" : "i";
|
|
||||||
var pattern = "(" + words.join("|") + ")";
|
|
||||||
if (settings.wordsOnly) {
|
|
||||||
pattern = "\\b" + pattern + "\\b";
|
|
||||||
}
|
|
||||||
var re = new RegExp(pattern, flag);
|
|
||||||
|
|
||||||
return this.each(function () {
|
|
||||||
jQuery.highlight(this, re, settings.element, settings.className);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
3
epub.js/libs/loader_filesystem.min.js
vendored
|
@ -1,3 +0,0 @@
|
||||||
/*! fileStorage - v0.1.0 - 2013-06-04 */var fileStorage = fileStorage || {};
|
|
||||||
var _requestFileSystem=self.requestFileSystem||self.webkitRequestFileSystem;const DBSIZE=5242880,DBTYPE=TEMPORARY;self.onmessage=function(e){var t=e.data;self.request(t,function(e){self.save(t,e,function(){self.postMessage(t)})})},self.openFs=function(e){if(self._fs){e&&e(self._fs);return}_requestFileSystem(DBTYPE,DBSIZE,function(t){self._fs=t,e&&e(t)},self.failure)},self.request=function(e,t){var n=new self.loadFile(e);n.succeeded=function(e){t&&t(e)},n.failed=function(e){self.postMessage("failed: "+e.toString())},n.start()},self.save=function(e,t,n){self.openFs(function(r){var i=e.split("/").slice(0,-1);self.createDir(r.root,i),r.root.getFile(e,{create:!0},function(r){r.createWriter(function(r){r.onwriteend=function(e){n(e)},r.onerror=function(t){self.postMessage("write error:"+self.errorHandler(err)+" path="+e)},r.write(t)})},self.failure)})},self.createDir=function(e,t){if(t[0]=="."||t[0]=="")t=t.slice(1);e.getDirectory(t[0],{create:!0},function(e){t.length&&createDir(e,t.slice(1))},self.failure)},self.failure=function(e){self.postMessage("failed: "+self.errorHandler(e))},self.errorHandler=function(e){switch(e.code){case FileError.QUOTA_EXCEEDED_ERR:return"QUOTA_EXCEEDED_ERR";case FileError.NOT_FOUND_ERR:return"NOT_FOUND_ERR";case FileError.SECURITY_ERR:return"SECURITY_ERR";case FileError.INVALID_MODIFICATION_ERR:return"INVALID_MODIFICATION_ERR";case FileError.INVALID_STATE_ERR:return"INVALID_STATE_ERR";default:return"Unknown Error"}},self.loadFile=function(e,t){var n=new XMLHttpRequest;return this.succeeded=function(e){t&&t(e)},this.failed=function(e){console.log("Error:",e)},this.start=function(){var t=this;n.open("GET",e,!0),n.responseType="blob",n.onload=function(e){this.status==200&&t.succeeded(this.response)},n.onerror=function(e){t.failed(this.status)},n.send()},{start:this.start,succeeded:this.succeeded,failed:this.failed}},self.openFs();
|
|
||||||
//# sourceMappingURL=loader_filesystem.min.js.map
|
|
7
epub.js/libs/screenfull.min.js
vendored
|
@ -1,7 +0,0 @@
|
||||||
/*!
|
|
||||||
* screenfull
|
|
||||||
* v1.1.0 - 2013-09-06
|
|
||||||
* https://github.com/sindresorhus/screenfull.js
|
|
||||||
* (c) Sindre Sorhus; MIT License
|
|
||||||
*/
|
|
||||||
!function(a,b){"use strict";var c="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,d=function(){for(var a,c,d=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenchange","MSFullscreenerror"]],e=0,f=d.length,g={};f>e;e++)if(a=d[e],a&&a[1]in b){for(e=0,c=a.length;c>e;e++)g[d[0][e]]=a[e];return g}return!1}(),e={request:function(a){var e=d.requestFullscreen;a=a||b.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[e]():a[e](c&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){b[d.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:d};return d?(Object.defineProperties(e,{isFullscreen:{get:function(){return!!b[d.fullscreenElement]}},element:{enumerable:!0,get:function(){return b[d.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!b[d.fullscreenEnabled]}}}),b.addEventListener(d.fullscreenchange,function(a){e.onchange.call(e,a)}),b.addEventListener(d.fullscreenerror,function(a){e.onerror.call(e,a)}),a.screenfull=e,void 0):(a.screenfull=!1,void 0)}(window,document);
|
|
14
epub.js/libs/zip.min.js
vendored
1147
epub.js/reader.js
2
epub.js/reader.min.js
vendored
3
epub.js/robots.txt
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
# robotstxt.org/
|
||||||
|
|
||||||
|
User-agent: *
|
|
@ -1,7 +1,2 @@
|
||||||
base=/src/epub.js
|
base=/src/epubjs-reader
|
||||||
cp $base/build/* .
|
rsync -av $base/reader/ ./
|
||||||
cp $base/build/libs/* ./libs/
|
|
||||||
cp $base/reader/js/hooks/extensions/*.js ./hooks/extensions/
|
|
||||||
cp $base/reader/js/plugins/*.js ./plugins/
|
|
||||||
cp $base/reader/img/loader.gif img/loader.gif
|
|
||||||
cp $base/reader/css/*.css css/
|
|
||||||
|
|