if not modules then modules = { } end modules ['mtx-epub'] = { version = 1.001, comment = "companion to mtxrun.lua", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } -- The epub specification is far from beautiful. Especially the id related -- part is messy and devices/programs react differently on them (so an id is not -- really an id but has some special property). Then there is this ncx suffix -- thing. Somehow it give the impression of a reversed engineered application -- format so it will probably take a few cycles to let it become a real -- clean standard. Thanks to Adam Reviczky for helping to figure out all these -- puzzling details. -- This is preliminary code. At some point we will deal with images as well but -- first we need a decent strategy to export them. More information will be -- available on the wiki. local format = string.format local concat = table.concat local helpinfo = [[ --make create epub zip file example: mtxrun --script epub --make mydocument ]] local application = logs.application { name = "mtx-epub", banner = "ConTeXt EPUB Helpers 0.11", helpinfo = helpinfo, } -- script code scripts = scripts or { } scripts.epub = scripts.epub or { } local mimetype = "application/epub+zip" local container = [[ ]] local package = [[ My Title en MySelf %s ]] -- We need to figure out what is permitted; numbers only seem to give -- problems is some applications as do names with dashes. local function dumbid(filename) -- return (string.gsub(os.uuid(),"%-%","")) -- to be tested return file.nameonly(filename) end local mimetypes = { xhtml = "application/xhtml+xml", css = "text/css", -- default = "text/plain", } local idmakers = { ncx = function(filename) return "ncx" end, -- css = function(filename) return "stylesheet" end, default = function(filename) return dubmid(filename) end, } -- specification = { -- name = "document", -- identifier = "123", -- root = "a.xhtml", -- files = { -- "a.xhtml", -- "b.css", -- "c.png", -- } -- } function scripts.epub.make() local filename = environment.files[1] if filename and filename ~= "" then filename = file.basename(filename) local specfile = file.replacesuffix(filename,"specification") local specification = lfs.isfile(specfile) and dofile(specfile) or { } -- inspect(specification) local name = specification.name or file.removesuffix(filename) local identifier = specification.identifier or os.uuid() local files = specification.files or { file.addsuffix(filename,"xhtml") } local root = specification.root or files[1] local epubname = name local epubpath = file.replacesuffix(name,"tree") local epubfile = file.replacesuffix(name,"epub") local epubroot = file.replacesuffix(name,"opf") lfs.mkdir(epubpath) lfs.mkdir(file.join(epubpath,"META-INF")) lfs.mkdir(file.join(epubpath,"OPS")) local used = { } for i=1,#files do local filename = files[i] local suffix = file.suffix(filename) local mime = mimetypes[suffix] if mime then local idmaker = idmakers[suffix] or idmakers.default file.copy(filename,file.join(epubpath,"OPS",filename)) used[#used+1] = format("",idmaker(filename),filename,mime) end end container = format(container,epubroot) package = format(package,identifier,identifier,concat(used,"\n"),file.removesuffix(root)) io.savedata(file.join(epubpath,"mimetype"),mimetype) io.savedata(file.join(epubpath,"META-INF","container.xml"),container) io.savedata(file.join(epubpath,"OPS",epubroot),package) lfs.chdir(epubpath) os.remove(epubfile) os.execute(format("zip %s -0 %s",epubfile,"mimetype")) os.execute(format("zip %s -r %s",epubfile,"META-INF")) os.execute(format("zip %s -r %s",epubfile,"OPS")) lfs.chdir("..") application.report("epub archive: %s",file.join(epubpath,epubfile)) end end -- if environment.argument("make") then scripts.epub.make() else application.help() end