|
|
@@ -0,0 +1,105 @@ |
|
|
|
// import { readFile } from 'fs/promises'; |
|
|
|
import archiver from 'archiver'; |
|
|
|
import {createWriteStream} from 'fs'; |
|
|
|
import {readdir} from 'fs/promises'; |
|
|
|
import assert from 'assert'; |
|
|
|
|
|
|
|
// const act = <T extends (...args: any[]) => any>(fn: T) => { |
|
|
|
// return async (...args: Parameters<T>) => { |
|
|
|
// let r; |
|
|
|
// try { |
|
|
|
// r = await fn(...args); |
|
|
|
// } catch { |
|
|
|
// // noop |
|
|
|
// } |
|
|
|
// return r; |
|
|
|
// } |
|
|
|
// }; |
|
|
|
|
|
|
|
const main = async () => { |
|
|
|
|
|
|
|
// await act(cp)('dist', 'book', {recursive: true}); |
|
|
|
// await act(rm)('dist', {recursive: true, force: true}); |
|
|
|
// await act(mkdir)('dist'); |
|
|
|
// await act(cp)('book', 'dist/book', {recursive: true}); |
|
|
|
|
|
|
|
const { default: astroConfig } = await import('../astro.config.mjs'); |
|
|
|
const { outDir = 'dist/', output = 'static', build, compressHTML = false } = astroConfig; |
|
|
|
assert(output === 'static'); |
|
|
|
assert(build?.format === 'file'); |
|
|
|
assert(!compressHTML) |
|
|
|
const distFiles = await readdir(outDir); |
|
|
|
// TODO get all assets and declare to manifest |
|
|
|
console.log(distFiles); |
|
|
|
|
|
|
|
return new Promise<number>((resolve, reject) => { |
|
|
|
const output = createWriteStream('book.epub'); |
|
|
|
const archive = archiver('zip', { |
|
|
|
zlib: { |
|
|
|
level: 9, |
|
|
|
}, |
|
|
|
}); |
|
|
|
|
|
|
|
output.on('close', () => { |
|
|
|
resolve(archive.pointer()); |
|
|
|
}); |
|
|
|
|
|
|
|
archive.on('error', (err) => { |
|
|
|
reject(err); |
|
|
|
}); |
|
|
|
|
|
|
|
archive.pipe(output); |
|
|
|
|
|
|
|
archive.append('application/epub+zip', { name: 'mimetype' }); |
|
|
|
archive.append(`<?xml version="1.0"?> |
|
|
|
<container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0"> |
|
|
|
<rootfiles> |
|
|
|
<rootfile full-path="content.opf" media-type="application/oebps-package+xml"/> |
|
|
|
</rootfiles> |
|
|
|
</container> |
|
|
|
`, { name: 'META-INF/container.xml' }); |
|
|
|
archive.append(`<?xml version="1.0"?> |
|
|
|
<package xmlns="http://www.idpf.org/2007/opf" xmlns:opf="http://www.idpf.org/2007/opf" version="3.0" unique-identifier="BookID"> |
|
|
|
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/"> |
|
|
|
<dc:identifier id="BookID" opf:scheme="isbn">978-3-86680-192-9</dc:identifier> |
|
|
|
<dc:identifier>3b622266-b838-4003-bcb8-b126ee6ae1a2</dc:identifier> |
|
|
|
<dc:title>The title</dc:title> |
|
|
|
<dc:language>fr</dc:language> |
|
|
|
<dc:publisher>The publisher</dc:publisher> |
|
|
|
<dc:creator>The author</dc:creator> |
|
|
|
<dc:contributor>A contributor</dc:contributor> |
|
|
|
<dc:description>A description</dc:description> |
|
|
|
<dc:subject>A subject of the publication</dc:subject> |
|
|
|
<dc:subject>Another subject of the publication</dc:subject> |
|
|
|
<dc:rights>© copyright notice</dc:rights> |
|
|
|
<meta property="dcterms:modified">2020-01-01T01:01:01Z</meta> |
|
|
|
</metadata> |
|
|
|
<manifest> |
|
|
|
<item id="coverimage" href="OEBPS/cover.jpg" media-type="image/jpeg" properties="cover-image"/> |
|
|
|
<item id="cover" href="OEBPS/index.xhtml" media-type="application/xhtml+xml"/> |
|
|
|
<item id="toc" href="toc.html" media-type="application/xhtml+xml" properties="nav"/> |
|
|
|
|
|
|
|
<item id="chapter-1" href="Text/chapter-1.xhtml" media-type="application/xhtml+xml"/> |
|
|
|
<item id="chapter-2" href="Text/chapter-2.xhtml" media-type="application/xhtml+xml"/> |
|
|
|
|
|
|
|
<item id="css" href="Styles/publication.css" media-type="text/css"/> |
|
|
|
|
|
|
|
<item id="font1" href="Fonts/Andada-Italic.otf" media-type="application/vnd.ms-opentype"/> |
|
|
|
<item id="font2" href="Fonts/Andada-Regular.otf" media-type="application/vnd.ms-opentype"/> |
|
|
|
<item id="glyph" href="Images/glyph.png" media-type="image/png"/> |
|
|
|
</manifest> |
|
|
|
<spine> |
|
|
|
<itemref idref="cover"/> |
|
|
|
<itemref idref="toc"/> |
|
|
|
<itemref idref="chapter-1"/> |
|
|
|
<itemref idref="chapter-2"/> |
|
|
|
</spine> |
|
|
|
</package> |
|
|
|
`, { name: 'content.opf' }); |
|
|
|
archive.directory(outDir, 'OEBPS'); |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
main().then((bytes) => { |
|
|
|
console.log(`${bytes} written.`); |
|
|
|
}); |