#!/usr/bin/env python # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os, time, glob from lxml import etree from sphinx.builders.epub import EpubBuilder class EPUBHelpBuilder(EpubBuilder): name = 'myepub' def add_cover(self, outdir, cover_fname): href = '_static/'+cover_fname opf = os.path.join(self.outdir, 'content.opf') cover = '''\ Cover '''%href self.files.append('epub_titlepage.html') open(os.path.join(outdir, self.files[-1]), 'wb').write(cover) raw = open(opf, 'rb').read() raw = raw.replace('', ('\n' '%s\n') % (href.replace('/', '_'), time.strftime('%Y-%m-%d'))) raw = raw.replace('', ('\n').\ format('epub_titlepage.html')) open(opf, 'wb').write(raw) def build_epub(self, outdir, *args, **kwargs): if self.config.kovid_epub_cover: self.add_cover(outdir, self.config.kovid_epub_cover) self.fix_duplication_bugs(outdir) EpubBuilder.build_epub(self, outdir, *args, **kwargs) def fix_duplication_bugs(self, outdir): opf = glob.glob(outdir+os.sep+'*.opf')[0] root = etree.fromstring(open(opf, 'rb').read()) seen = set() for x in root.xpath( '//*[local-name()="spine"]/*[local-name()="itemref"]'): idref = x.get('idref') if idref in seen: x.getparent().remove(x) else: seen.add(idref) with open(opf, 'wb') as f: f.write(etree.tostring(root, encoding='utf-8', xml_declaration=True)) ncx = glob.glob(outdir+os.sep+'*.ncx')[0] root = etree.fromstring(open(ncx, 'rb').read()) seen = set() for x in root.xpath( '//*[local-name()="navMap"]/*[local-name()="navPoint"]'): text = x.xpath('descendant::*[local-name()="text"]')[0] text = text.text if text in seen: x.getparent().remove(x) else: seen.add(text) with open(ncx, 'wb') as f: f.write(etree.tostring(root, encoding='utf-8', xml_declaration=True))