【epub.js|翻譯|原創】開源中間件epub.js的使用及其中文文檔

来源:http://www.cnblogs.com/xiaozhaoqi/archive/2017/11/11/7819086.html
-Advertisement-
Play Games

小組項目 “基於JavaScript的讀書平臺” 正在開發中,預計年底上線。 由於之前有Flask框架的web開發經驗,產品的第一個版本我負責了web平臺搭建,技術選型: 伺服器端:nodejs-express 前端:React、Ant Design 資料庫:Mysql 之前Flask框架下的前端技 ...


小組項目 “基於JavaScript的讀書平臺” 正在開發中,預計年底上線。

由於之前有Flask框架的web開發經驗,產品的第一個版本我負責了web平臺搭建,技術選型:

伺服器端:nodejs-express

前端:React、Ant Design

資料庫:Mysql

之前Flask框架下的前端技術使用的是基礎的HTML+CSS,和一小部分JQuery效果,因為一直對前端比較感興趣,這次大膽的用上學的不那麼扎實(或者說更流行)的React,實踐指導理論。


“讀書平臺”打造的是一個:能夠線上讀書、即時分享、方便批註筆記的高度定製化、個性化書庫。

回到題目上,epub是最流行的電子書規範之一,網路上對於Java Web有不少合適的方法來解析和呈現epub文件,但在JavaScript特別是瀏覽器端渲染的中間件則只有epub.js一家。

網路上關於epub.js的介紹比較少(儘管github上已經2K星了),更多的是概念性的內容,如:

epub.js是支持跨多個設備的,在瀏覽器端渲染EPUB文件的JavaScript庫,提供通用的電子書功能界面(如渲染、持久和分頁)不需要開發專用的應用程式或插件。

具體用法因人而異,在此我介紹結合React使用的案例:

如圖是使用React和AntD構建的後臺管理系統,對於文件的上傳下載刪除功能已經做好,epub.js解決的是對於epub規格的文件如何解析和呈現。

點擊“閱讀本書”操作:

這就是epub.js結合React提供的基礎單頁閱覽頁面了,epub.js中間件封裝瞭解析epub文件的過程。左右兩側的翻頁鍵都可以按需定製,甚至用AntD的組件來替代也不是問題。

簡單用法在官方文檔寫的很容易理解:https://github.com/futurepress/epub.js 

有多種解析模式可以選擇,單頁閱覽是預設模式。

但對於一個專業的讀書平臺來說,簡單呈現圖書內容是遠遠不夠的,epub.js提供了更多的介面:

https://github.com/futurepress/epub.js/blob/master/documentation/README.md


 

方法:

ePub(bookPath, options) 

創建EPUB圖書實例:

bookPath可選參數,指定epub文件路徑,可以是網路資源,也可以是本地資源。

var Book = ePub("url/to/book/"); // With default options
var Book = ePub({ restore: true }); 
Book.open("url/to/book/"); // Books can be opened later 

Options可選參數,配置解析參數

{
  bookPath : null,
  version: 1, // Changing will cause stored Book information to be reloaded
  restore: false, // Skips parsing epub contents, loading from localstorage instead
  storage: false, // true (auto) or false (none) | override: 'ram', 'websqldatabase', 'indexeddb', 'filesystem'
  spreads: true, // Displays two columns
  fixedLayout : false, //-- Will turn off pagination
  styles : {}, // Styles to be applied to epub
  width : false, //width和height可以設置圖書內容的寬和高,預設值是不設置,此時會填滿父視窗。
  height: false, 
}

解析圖書的更多方法:

Book.open(bookPath) 打開指定路徑的圖書,和構造函數的作用類似,只是將配置和解析的過程分開

var Book = ePub({ restore: true }); 
Book.open("url/to/book/"); // Books can be opened later 

也可以帶擴展名:

Book.open("url/to/book.epub");

Book.renderTo(element) 將解析好的圖書追加到某個HTML結點並渲染,此時epub圖書內容在HTML中呈現。(使用的是iframe標簽)

var Book = ePub("url/to/book/", { restore: true });

var $el = document.getElementById("div-id");
Book.renderTo($el);

參數也可以是字元串表示:

var Book = ePub("url/to/book/");
Book.renderTo("div-id");

Book.nextPage()

Book.prevPage()

在閱讀頁面中的翻頁控制函數,添加到按鈕事件函數:

<div onclick="Book.prevPage();">‹</div>
<div onclick="Book.nextPage();">›</div>

必須在渲染之後,才會響應翻頁。

Book.displayChapter(chap, end)   顯示指定章節:

載入指定的章節到頁面上,載入的是這一章的第一頁:

Book.displayChapter('/6/4[chap01ref]!/4[body01]/10');

第二個參數設置為true,將載入這一章的最後一頁:

Book.displayChapter(3, true);

Book.goto(url)跳轉到指定章節:

載入指定的章節(需要有pageMap)

var skip = Book.goto("chapter_001.xhtml");
skip.then(function(){
    console.log("On Chapter 1");
})

通常用來顯示一些帶有指定章節鏈接的表格

Book.setStyle(style, val, prefixed)設置圖書內容的樣式:

Book.setStyle("font-size", "1.2em");

Book.removeStyle(style)移除設置的樣式。

Book.destroy()刪除iframe和事件函數。

Promises

Book.getMetadata()在回調函數中獲取meta數據:

Book.getMetadata().then(function(meta){
    document.title = meta.bookTitle+""+meta.creator;
});

返回一個對象:

{
  "bookTitle": "The title of the book",
  "creator": "Book Author",
  "description": "The description/synopsis of the book",
  "pubdate": "",
  "publisher": "The Publisher",
  "identifier": "The ISBN",
  "language": "en-US",
  "rights": "Copyright text",
  "modified_date": "",
  "layout": "",
  "orientation": "",
  "spread": "",
  "direction": null
}

Book.getToc()在回調函數中獲取toc,是一個包含目錄結構的數組對象。

Book.getToc().then(function(toc){
    console.log(toc);
});

Book.generatePagination()進行分頁,可選參數為頁面大小:

book.generatePagination().then(function(toc){
    console.log("Pagination generated");
});
book.generatePagination(pageWidth, pageHeight).then(function(toc){
    console.log("Pagination generated");
});

可響應的事件:

book:ready 

book:stored

book:online

book:offline

book:linkClicked

book.on('book:linkClicked', function(href) {
    console.log(href);
});

book:pageChanged

{
  anchorPage: 2
  percentage: 0.5
  pageRange: [1, 2, 3]
}

pageChanged事件響應當前頁數,前提是必須有一個頁碼表

book.on('book:pageChanged', function(location){
    console.log(location.anchorPage, location.pageRange)
});

renderer:resized

renderer:chapterDisplayed

renderer:chapterUnloaded

renderer:locationChanged

  "epubcfi(...)"

locationChanged事件響應當前位置信息,可以用來做進度條等效果。

book.on('renderer:locationChanged', function(locationCfi){
    console.log(locationCfi)
});

renderer:visibleRangeChanged

 

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近面試拿了很多公司的實習offer,只要是面試的都通過了,但其實目標是BTA或者到一個公司的核心技術部,無奈將這些公司一一拒絕。 接下來就分析下麵試題,也能給自己一個提升吧,以便後續的面試更輕車熟路些,題目沒什麼順序,想起什麼寫什麼,還有我面試過程中的一些小套路。 估計要寫好多,每天寫幾道題,而且 ...
  • 前言 深入瞭解一下表格的一些特性。 一、案例需求 首先寫一個表格,然後讓表格隔行換色,具體的效果如下所示: 那麼要怎麼實現呢? 二、實例分析 首先我們需要知道,之前我們學習過表格相關的標簽,但是那時候學習的,只有<table></table>、<tr></tr>、<td></td>等標簽,但是表格的 ...
  • 說起來, 面向切麵編程(AOP)自從誕生之日起,一直都是電腦科學領域十分熱門的話題,但是很奇怪的是,在前端圈子裡,探討AOP的文章似乎並不是多,而且多數拘泥在給出理論,然後實現個片段的定式)難免陷入了形而上學的尷尬境地,本文列舉了兩個生產環境的實際例子論述webpack和AOP預編譯處理的結合,意 ...
  • 前言 當我們進行JavaScript的開發的時候,很經常出現錯誤,但是一行代碼一行代碼的尋找會極大地增加我們的工作量。於是這時候,如果有一個像Eclipse的斷點這樣的功能能夠讓我們快速找到bug的原因的話,那一定能夠節省很多的工作量了。 所以今天這篇博文就來介紹一下關於每個瀏覽器都有的功能:開發者 ...
  • 本文作為小白入門級,相對基礎,是寫給現在想瞭解一點前端知識的設計師同行們,今天這章用設計師熟悉的PS來解釋前端相關的術語,通俗易懂幽默風趣,絕對是小白入門的好教程! 一、樣式大集合 之前介紹了“嵌入樣式”及“內聯樣式”,前者只對自己所在的標簽起作用,後者對當前頁面所有通過了class引用了該樣式的標 ...
  • 1、先準備一個div onchange觸發事件 <input type="file" onchange="preview(this)" ></span> <div id="preview"></div> 2、寫JS代碼 //上傳圖片之前預覽圖片function preview(file){ if ( ...
  • 作為一個初學者,經常會遇到在獲取某一元素的寬度(高度、top值...)時,到底是用 style.width還是offsetWidth的疑惑。 1. 當樣式寫在行內的時候,如 <div id="box" style="width:100px">時,用 style.width或者offsetWidth都 ...
  • 代碼: 正則表達式: 1. 匹配空:^$ 2. 匹配手機號:^(((\+86)|(86))?1[34578]\d{9})$ 3. 控制提示信息的顯示:ng-show="myForm.phone.$dirty && myForm.phone.$invalid" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...