epub3
Version:
Create Epub3 Files. Also includes a Scarfolding tool
123 lines (116 loc) • 3.86 kB
JavaScript
/**
* Created by epublica on 16/08/2014.
*/
var mkdirp = require("mkdirp"),
admzip = require("adm-zip"),
sax = require("sax"),
fs = require("fs"),
path = require("path"),
uuid = require("node-uuid"),
structureObject = {
"META-INF": ['container.xml'],
"OEPBS": ['coverImg.png', 'coverPage.html'],
"css":[],
"js":[],
"content.opf": "content.opf",
"encryption.xml": "encryption.xml",
"manifest.xml": "manifest.xml",
"metadata.xml": "metadata.xml",
"rights.xml": "rights.xml",
"signatures.xml": "signatures.xml",
"mimetype": "mimetype",
"assets": {
"images": [],
"fonts": []
}
}
var createContentFile = function(inputDir, name){
var stream = fs.createWriteStream(inputDir + "/" + name);
stream.once('open', function (fd) {
stream.write("<?xml version='1.0' encoding='utf-8'?>\n");
stream.write("" +
"<package xmlns='http://www.idpf.org/2007/opf' " +
"xmlns:dc='http://purl.org/dc/elements/1.1/' " +
"unique-identifier='bookid' " +
"version='2.0'></package>\n");
stream.end();
});
}
var createMimetypeFile = function(inputDir, name){
var stream = fs.createWriteStream(inputDir + "/" + name);
stream.once('open', function (fd) {
stream.write("application/epub+zip");
stream.end();
});
}
var createOrdinaryFile = function(inputDir, name){
var stream = fs.createWriteStream(inputDir + "/" + name);
stream.once('open', function (fd) {
stream.write("");
stream.end();
});
}
var createFile = function(inputDir, name){
console.log("created file: "+ name);
//since we are creating various file type with different basic content lets have this in a switch
switch(name){
case "mimetype":
createMimetypeFile(inputDir,name);
break;
case "content.opf":
createContentFile(inputDir,name);
break;
default:
createOrdinaryFile(inputDir,name);
break;
}
};
var createFolder = function(inputDir, name){
mkdirp(inputDir + "/" + name, function (err) {
if(err) throw err
console.log("created folder: "+name);
})
}
//using the above JSON configuration, create a folder structure for an epub package
var createStructure = function (parent, structObj) {
for (var prop in structObj){
if(structObj[prop] instanceof Array || structObj[prop] instanceof Object){
//console.log(prop+" is array, creating folder...")
createFolder(parent ,prop)
createStructure(parent+"/"+prop , structObj[prop]);
}
else if(typeof structObj[prop] === 'string'){
//console.log(structObj[prop]+" is string, creating file")
createFile(parent ,structObj[prop]);
}
else{
//console.log("dont know what to do with "+structObj[prop]);
}
}
}
var scarfold = function(inputDir,pubId) {
//workspace + user's email + publication ID
var inputDir = inputDir + "/" + pubId;
console.log("scarfolded called");
console.log(inputDir);
//create parent directory
mkdirp(inputDir, function (err) {
if(err) throw err
fs.exists(inputDir,function(exists){
if(exists){
createStructure(inputDir, structureObject)
}
process.exit();
});
process.send('scarfolding:done');
})
}
process.on('message', function (message) {
switch(message.msgType) {
case 'scarfold':
scarfold (message.inputDir, uuid.v1()); //time based uuid generation. Used as publication ID
break;
default:
console.log('this is default');
}
});