This is a software component used by the Readium Chrome extension and the "cloud reader" ( https://github.com/readium/readium-js-viewer ).
Please see https://github.com/readium/readium-shared-js for more information about the underlying rendering engine.
You can try Readium here:
- Online "cloud reader" demo: https://readium.firebaseapp.com
- Chrome extension (can be used offline): https://chrome.google.com/webstore/detail/readium/fepbnnnkkadjhjahcafoaglimekefifl
BSD-3-Clause ( http://opensource.org/licenses/BSD-3-Clause )
- A decent terminal. On Windows, GitShell works great ( http://git-scm.com ), GitBash works too ( https://msysgit.github.io ), and Cygwin adds useful commands ( https://www.cygwin.com ).
- NodeJS ( https://nodejs.org ) v4+ (Note that NodeJS v6+ and NPM v3+ are now supported, including NodeJS v7+ and NPM v4+)
- Optionally: Yarn ( https://yarnpkg.com ) v0.23+
git submodule update --init --recursiveto ensure that the readium-js chain of dependencies is initialised (readium-shared-js and readium-cfi-js)
git checkout BRANCH_NAME && git submodule foreach --recursive "git checkout BRANCH_NAME"to switch to the desired BRANCH_NAME
npm run prepare:all(to perform required preliminary tasks, like patching code before building)
yarn run prepare:yarn:all(to use Yarn instead of NPM for node_module management)
Note that in some cases, administrator rights may be needed in order to install dependencies, because of NPM-related file access permissions (the console log would clearly show the error). Should this be the case, running
sudo npm run prepare:all usually solves this.
Note that the above command executes the following:
npm install(to download dependencies defined in
package.json... note that the
--productionoption can be used to avoid downloading development dependencies, for example when testing only the pre-built
npm update(to make sure that the dependency tree is up to date)
No RequireJS optimization:
npm run http(to launch an http server. This automatically opens a web browser instance to the HTML files in the
index_RequireJS_no-optimize.html, or the
*LITE.htmlvariant which do include only the reader view, not the ebook library view)
- Hack away! (e.g. source code in the
- Press F5 (refresh / reload) in the web browser
npm run build(to update the RequireJS bundles in the build output folder)
npm run http:watch(to launch an http server. This automatically opens a web browser instance to the HTML files in the
index_RequireJS_multiple-bundles.html, or the
*LITE.htmlvariants which do include only the reader view, not the ebook library view)
npm run http(same as above, but without watching for file changes (no automatic rebuild))
When invoking the
npm run build command, the generated
build-output folder contains RequireJS module bundles that include the default plugins specified in
readium-js-shared/plugins/plugins.cson (see the
readium-js-shared/PLUGINS.md documentation). Developers can override the default plugins configuration by using an additional file called
plugins-override.cson. This file is git-ignored (not persistent in the Git repository), which means that Readium's default plugins configuration is never at risk of being mistakenly overridden by developers, whilst giving developers the possibility of creating custom builds on their local machines.
For example, the
annotations plugin can be activated by adding it to the
include section in
This way, after invoking
npm run http, the
./dev/index*.html demo apps can be used to create / remove highlighted selections in the web browser.
NPM (Node Package Manager)
All packages "owned" and maintained by the Readium Foundation are listed here: https://www.npmjs.com/~readium
Note that although Node and NPM natively use the CommonJS format, Readium modules are currently only defined as AMD (RequireJS). This explains why Browserify ( http://browserify.org ) is not used by this Readium project. More information at http://requirejs.org/docs/commonjs.html and http://requirejs.org/docs/node.html
- Make sure
npm install readium-jscompletes successfully ( https://www.npmjs.com/package/readium-js )
npm run http, which opens a web browser to a basic RequireJS bootstrapper located in the
devfolder (this is not a fully-functioning application!)
- To see an actual application that uses this "readium-js" component, try "readium-js-viewer" ( https://www.npmjs.com/package/readium-js-viewer )
--dev option after
npm install readium-js can be used to force the download of development dependencies,
but this is kind of pointless as the code source and RequireJS build configuration files are missing.
See below if you need to hack the code.
How to use (RequireJS bundles / AMD modules)
build-output directory contains common CSS styles, as well as two distinct folders:
_single-bundle folder contains
readium-js_all.js (and its associated source-map file, as well as a RequireJS bundle index file (which isn't actually needed at runtime, so here just as a reference)),
which aggregates all the required code (external library dependencies included, such as Underscore, jQuery, etc.),
as well as the "Almond" lightweight AMD loader ( https://github.com/jrburke/almond ).
This means that the full RequireJS library ( http://requirejs.org ) is not actually needed to bootstrap the AMD modules at runtime,
as demonstrated by the HTML file in the
dev folder (trimmed for brevity):
<!-- main code bundle, which includes its own Almond AMD loader (no need for the full RequireJS library) --><!-- index.js calls into the above library -->
readium-external-libs.js: aggregated library dependencies (e.g. Underscore, jQuery, etc.)
readium-shared-js.js: shared Readium code (basically, equivalent to the
jsfolder of the "readium-shared-js" submodule)
readium-cfi-js.js: Readium CFI library (basically, equivalent to the
jsfolder of the readium-cfi-js submodule)
readium-js.js: this Readium code (see the
jsfolder, which includes epub-fetch and epub-model source code)
readium-plugin-example.js: simple plugin demo
readium-plugin-annotations.js: the annotation plugin (DOM selection + highlight), which bundle actually contains the "Backbone" library, as this dependency is not already included in the "external libs" bundle. )
Usage is demonstrated by the HTML file in the
dev folder (trimmed for brevity):
<!-- full RequireJS library --><!-- individual bundles: --><!-- readium CFI library --><!-- external libraries --><!-- readium itself --><!-- simple example plugin --><!-- annotations plugin --><!-- readium js --><!-- index.js calls into the above libraries -->
Note how the "external libs" set of AMD modules can be explicitly described using the
bundles RequireJS configuration directive
(this eliminates the apparent opacity of such as large container of library dependencies):
CSON vs. JSON (package.json)
CSON = CoffeeScript-Object-Notation ( https://github.com/bevry/cson )
Running the command
npm run cson2json will re-generate the
package.json JSON file.
For more information, see comments in the master
package.cson CSON file.
Why CSON? Because it is a lot more readable than JSON, and therefore easier to maintain. The syntax is not only less verbose (separators, etc.), more importantly it allows comments and line breaking!
Although these benefits are not so critical for basic "package" definitions,
package.cson/json declares relatively intricate
script tasks that are used in the development workflow.
npm run SCRIPT_NAME offers a lightweight technique to handle most build tasks,
as NPM CLI utilities are available to perform cross-platform operations (agnostic to the actual command line interface / shell).
For more complex build processes, Grunt / Gulp can be used, but these build systems do not necessarily offer the most readable / maintainable options.
Downside: DO NOT invoke
npm init or
npm install --save
as this would overwrite / update the JSON, not the master CSON!
See separate API doc.