UNPKG

epubjs

Version:
251 lines (200 loc) 5.53 kB
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>EPUB.js Pagination Example</title> <script src="../dist/epub.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.1/jszip.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/rangy/1.3.0/rangy-core.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/rangy/1.3.0/rangy-classapplier.js"></script> <style type="text/css"> body { margin: 0; background: #fafafa; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; color: #333; position: absolute; height: 100%; width: 100%; } #viewer { width: 900px; /*width: 80%;*/ height: 600px; background: white; box-shadow: 0 0 4px #ccc; border-radius: 5px; padding: 20px 40px; position: relative; margin: 40px auto; } #frame { position: relative; } #viewer iframe { background: white; } #prev { left: 40px; } #next { right: 40px; } .arrow { position: absolute; top: 50%; margin-top: -32px; font-size: 64px; color: #E2E2E2; font-family: arial, sans-serif; font-weight: bold; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .arrow:hover { color: #777; } .arrow:active { color: #000; } #toc { display: block; margin: 10px auto; } ::selection { background: yellow; } #extras { width: 600px; margin: 40px auto; } #highlights { list-style: none; margin-left: 0; padding: 0; } #highlights li { list-style: none; margin-bottom: 20px; border-top: 1px solid #E2E2E2; padding: 10px; } #highlights a { display: block; } @media (min-width: 1000px) { #viewer:after { position: absolute; width: 1px; border-right: 1px #000 solid; height: 90%; z-index: 1; left: 50%; margin-left: -1px; top: 5%; opacity: .15; box-shadow: -2px 0 15px rgba(0, 0, 0, 1); content: ""; } } </style> </head> <body> <div id="frame"> <div id="viewer"></div> <div id="prev" class="arrow"></div> <div id="next" class="arrow"></div> </div> <div id="extras"> <ul id="highlights"></ul> </div> <script> // Load the opf var book = ePub("https://s3.amazonaws.com/moby-dick/OPS/package.opf"); var rendition = book.renderTo("viewer", { width: "100%", height: 600, ignoreClass: 'annotator-hl' }); var displayed = rendition.display(6); // Navigation loaded book.loaded.navigation.then(function(toc){ // console.log(toc); }); var next = document.getElementById("next"); next.addEventListener("click", function(){ rendition.next(); }, false); var prev = document.getElementById("prev"); prev.addEventListener("click", function(){ rendition.prev(); }, false); var keyListener = function(e){ // Left Key if ((e.keyCode || e.which) == 37) { rendition.prev(); } // Right Key if ((e.keyCode || e.which) == 39) { rendition.next(); } }; rendition.on("keyup", keyListener); document.addEventListener("keyup", keyListener, false); rendition.on("locationChanged", function(location){ // console.log(location); }); var applier; displayed.then(function(renderer){ // wait till something has been rendered to add applier applier = rangy.createClassApplier("annotator-hl"); }); // Apply a class to selected text rendition.on("selected", function(cfiRange) { // Get the dom range of the selected text var range = rendition.range(cfiRange); // Create an empty Rangy range var rr = rangy.createRange(); // Set that range to equal the dom range rr.setStart(range.startContainer, range.startOffset); rr.setEnd(range.endContainer, range.endOffset); // Add the class to that range applier.applyToRange(rr); // Clear the selection window.getSelection().removeAllRanges(); }); // Add a yellow background to text with our highlight class rendition.hooks.render.register(function (view) { var highlightColor = [ ['.annotator-hl', ['background-color', 'yellow']] ]; view.addStylesheetRules(highlightColor); }) // Illustration of how to get text from a saved cfiRange var highlights = document.getElementById('highlights'); rendition.on("selected", function(cfiRange) { book.range(cfiRange).then(function (range) { var text; var li = document.createElement('li'); var a = document.createElement('a'); var textNode; if (range) { text = range.toString(); textNode = document.createTextNode(text); a.textContent = cfiRange; a.href = "#" + cfiRange; a.onclick = function () { rendition.display(cfiRange); }; li.appendChild(a); li.appendChild(textNode); highlights.appendChild(li); } }) }); </script> </body> </html>