Skip to content

Instantly share code, notes, and snippets.

@wizardforcel
Last active July 5, 2017 13:36
Show Gist options
  • Save wizardforcel/3eba4b49aca84b20e87a68369d5a471a to your computer and use it in GitHub Desktop.
Save wizardforcel/3eba4b49aca84b20e87a68369d5a471a to your computer and use it in GitHub Desktop.
make epub
<?xml version="1.0" encoding="utf-8" ?>
<package unique-identifier="BookId" version="2.0" xmlns="http://www.idpf.org/2007/opf">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
<dc:identifier id="BookId" opf:scheme="UUID">urn:uuid:<%- uuid %></dc:identifier>
<meta content="1.0.0" name="jianhelper"/>
<dc:language>zh-CN</dc:language>
<dc:date opf:event="modification" xmlns:opf="http://www.idpf.org/2007/opf"><%- date %></dc:date>
</metadata>
<manifest>
<item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml"/>
<% for(var i = 0; i < toc.length; i++) {%>
<item href="Text/<%- toc[i].file %>" id="<%- toc[i].file %>" media-type="application/xhtml+xml"/>
<% } %>
</manifest>
<spine toc="ncx">
<% for(var i = 0; i < toc.length; i++) {%>
<itemref idref="<%- toc[i].file %>"/>
<% } %>
</spine>
<guide>
</guide>
</package>
var fs = require('fs');
var uuidGenerator = require('uuid');
var ejs = require('ejs');
var dirname = process.argv[2];
if(!dirname)
{
console.log('请指定路径。');
process.exit(0);
}
var dir = fs.readdirSync(dirname);
var toc = [];
for(var filename of dir) {
if(!filename.endsWith('.html'))
continue;
var co = fs.readFileSync(dirname + '/' + filename, 'utf-8');
var title = /<h1>(.+?)<\/h1>/.exec(co)[1];
toc.push({file: filename, title: title});
var header = '<html>\r\n<head>\r\n<title></title>\r\n' +
'<link href="../Styles/Style.css" type="text/css" rel="stylesheet"/>' +
'</head>\r\n<body>\r\n';
var footer = '\r\n</body>\r\n</html>';
fs.writeFileSync(dirname + '/' + filename, header + co + footer);
}
toc.sort((a, b) => a.file.replace('.html', '') - b.file.replace('.html', ''));
var uuid = uuidGenerator.uuid();
fs.writeFileSync(dirname + '/content.opf', getContentOpf(toc, uuid));
fs.writeFileSync(dirname + '/toc.ncx', getTocNcx(toc, uuid));
console.log('done..');
function getContentOpf(toc, uuid)
{
var date = new Date();
var dateStr
= date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
return ejs.render(fs.readFileSync('assets/content.ejs', 'utf-8'), {
date: dateStr,
toc: toc,
uuid: uuid
});
}
function getTocNcx(toc, uuid)
{
return ejs.render(fs.readFileSync('assets/toc.ejs', 'utf-8'), {
toc: toc,
uuid: uuid
});
}
var fs = require('fs');
var dir = process.argv[2];
var list = fs.readdirSync(dir);
for(var file of list) {
if(!file.endsWith('.jpg'))
continue;
var co = fs.readFileSync(dir + '/' + file);
/*if(co[0] == 0xff && co[1] == 0xd8 && co[2] == 0xff) {
//jpg
continue;
}*/
if(co[0] == 0x89 && co[1] == 0x50 && co[2] == 0x4e && co[3] == 0x47)
fs.renameSync(dir + '/' + file, dir + '/' + file.replace('.jpg', '.png'));
else if(co[0] == 0x47 && co[1] == 0x49 && co[2] == 0x46 && co[3] == 0x38)
fs.renameSync(dir + '/' + file, dir + '/' + file.replace('.jpg', '.gif'))
else if(co[0] == 0x49 && co[1] == 0x49 && co[2] == 0x2a && co[3] == 0x00)
fs.renameSync(dir + '/' + file, dir + '/' + file.replace('.jpg', '.tiff'))
else if(co[0] == 0x42 && co[1] == 0x4d)
fs.renameSync(dir + '/' + file, dir + '/' + file.replace('.jpg', '.bmp'))
}
var fs = require('fs');
var dir = process.argv[2];
var list = fs.readdirSync(dir);
var typeMap = {
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.gif': 'image/gif',
'.png': 'image/png',
'.bmp': 'image/bmp',
'.tiff': 'image/tiff'
}
function getPicType(file) {
for(var k in typeMap) {
if(file.endsWith(k))
return [k, typeMap[k]];
}
return null;
}
for(var file of list) {
var tp = getPicType(file);
if(!tp) continue;
console.log(' <item href="Images/' + file + '" id="' + file + '" media-type="'+ tp[1] + '"/>');
}
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"
"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"><ncx version="2005-1" xmlns="http://www.daisy.org/z3986/2005/ncx/">
<head>
<meta content="urn:uuid:<%- uuid %>" name="dtb:uid"/>
<meta content="1" name="dtb:depth"/>
<meta content="0" name="dtb:totalPageCount"/>
<meta content="0" name="dtb:maxPageNumber"/>
</head>
<docTitle>
<text>Unknown</text>
</docTitle>
<navMap>
<% for(var i = 0; i < toc.length; i++) {%>
<navPoint id="navPoint-<%- i+1 %>" playOrder="<%- i+1 %>">
<navLabel>
<text><%- toc[i].title %></text>
</navLabel>
<content src="Text/<%- toc[i].file %>"/>
</navPoint>
<% } %>
</navMap>
</ncx>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment