def _parse_ncx(self, data): tree = parse_string(data) tree_root = tree.getroot() nav_map = tree_root.find('{%s}navMap' % NAMESPACES['DAISY']) def _get_children(elems, n, nid): label, content = '', '' children = [] _id = '' for a in elems.getchildren(): if a.tag == '{%s}navLabel' % NAMESPACES['DAISY']: label = a.getchildren()[0].text if a.tag == '{%s}content' % NAMESPACES['DAISY']: content = a.get('src', '') if a.tag == '{%s}navPoint' % NAMESPACES['DAISY']: children.append(_get_children(a, n + 1, a.get('id', ''))) if len(children) > 0: if n == 0: return children return (Section(label, href=content), children) else: return (Link(content, label, nid)) self.book.toc = _get_children(nav_map, 0, '')
def _parse_ncx(self, data): tree = parse_string(data) tree_root = tree.getroot() nav_map = tree_root.find("{%s}navMap" % NAMESPACES["DAISY"]) def _get_children(elems, n, nid): label, content = "", "" children = [] _id = "" for a in elems.getchildren(): if a.tag == "{%s}navLabel" % NAMESPACES["DAISY"]: label = a.getchildren()[0].text if a.tag == "{%s}content" % NAMESPACES["DAISY"]: content = a.get("src") if a.tag == "{%s}navPoint" % NAMESPACES["DAISY"]: children.append(_get_children(a, n + 1, a.get("id", ""))) if len(children) > 0: if n == 0: return children return (Section(label), children) else: return Link(content, label, nid) self.book.toc = _get_children(nav_map, 0, "")
def _parse_ncx(self, data): tree = parse_string(data); tree_root = tree.getroot() nav_map = tree_root.find('{%s}navMap' % NAMESPACES['DAISY']) def _get_children(elems, n, nid): label, content = '', '' children = [] _id = '' for a in elems.getchildren(): if a.tag == '{%s}navLabel' % NAMESPACES['DAISY']: label = a.getchildren()[0].text if a.tag == '{%s}content' % NAMESPACES['DAISY']: content = a.get('src') if a.tag == '{%s}navPoint' % NAMESPACES['DAISY']: children.append(_get_children(a, n+1, a.get('id', ''))) if len(children) > 0: if n == 0: return children return (Section(label), children) else: return (Link(content, label, nid)) self.book.toc = _get_children(nav_map, 0, '')
def _load_container(self): meta_inf = self.read_file("META-INF/container.xml") tree = parse_string(meta_inf) for root_file in tree.findall("//xmlns:rootfile[@media-type]", namespaces={"xmlns": NAMESPACES["CONTAINERNS"]}): if root_file.get("media-type") == "application/oebps-package+xml": self.opf_file = root_file.get("full-path") self.opf_dir = zip_path.dirname(self.opf_file)
def _load_container(self): meta_inf = self.read_file('META-INF/container.xml') tree = parse_string(meta_inf) for root_file in tree.findall('//xmlns:rootfile[@media-type]', namespaces = {'xmlns': NAMESPACES['CONTAINERNS']}): if root_file.get('media-type') == "application/oebps-package+xml": self.opf_file = root_file.get('full-path') self.opf_dir = os.path.dirname(self.opf_file)
def _load_container(self): meta_inf = self.read_file('META-INF/container.xml') tree = parse_string(meta_inf) for root_file in tree.findall('//xmlns:rootfile[@media-type]', namespaces={'xmlns': NAMESPACES['CONTAINERNS']}): if root_file.get('media-type') == "application/oebps-package+xml": self.opf_file = root_file.get('full-path') self.opf_dir = zip_path.dirname(self.opf_file)
def get_content(self, default=None): tree = parse_string(self.book.get_template(self._template_name)) tree_root = tree.getroot() tree_root.set("lang", self.lang or self.book.language) tree_root.attrib["{%s}lang" % NAMESPACES["XML"]] = self.lang or self.book.language # add to the head also # <meta charset="utf-8" /> try: html_tree = parse_html_string(self.content) except: return "" html_root = html_tree.getroottree() # create and populate head _head = etree.SubElement(tree_root, "head") if self.title != "": _title = etree.SubElement(_head, "title") _title.text = self.title if hasattr(self, "img_width") and hasattr(self, "img_height"): opts = {"name": "viewport", "content": "width=%d, height=%d" % (self.img_width, self.img_height)} _meta = etree.SubElement(_head, "meta", opts) for lnk in self.links: if lnk.get("type") == "text/javascript": _lnk = etree.SubElement(_head, "script", lnk) # force <script></script> _lnk.text = "" else: _lnk = etree.SubElement(_head, "link", lnk) # this should not be like this # head = html_root.find('head') # if head is not None: # for i in head.getchildren(): # if i.tag == 'title' and self.title != '': # continue # _head.append(i) # create and populate body _body = etree.SubElement(tree_root, "body") body = html_tree.find("body") if body is not None: for i in body.getchildren(): _body.append(i) tree_str = etree.tostring(tree, pretty_print=True, encoding="utf-8", xml_declaration=True) return tree_str
def get_content(self, default=None): tree = parse_string(self.book.get_template(self._template_name)) tree_root = tree.getroot() tree_root.set('lang', self.lang or self.book.language) tree_root.attrib['{%s}lang' % NAMESPACES['XML']] = self.lang or self.book.language # add to the head also # <meta charset="utf-8" /> try: html_tree = parse_html_string(self.content) except: return '' html_root = html_tree.getroottree() # create and populate head _head = etree.SubElement(tree_root, 'head') if self.title != '': _title = etree.SubElement(_head, 'title') _title.text = self.title for lnk in self.links: if lnk.get("type") == "text/javascript": _lnk = etree.SubElement(_head, 'script', lnk) # force <script></script> _lnk.text = '' else: _lnk = etree.SubElement(_head, 'link', lnk) # this should not be like this # head = html_root.find('head') # if head is not None: # for i in head.getchildren(): # if i.tag == 'title' and self.title != '': # continue # _head.append(i) # create and populate body _body = etree.SubElement(tree_root, 'body') body = html_tree.find('body') if body is not None: for i in body.getchildren(): _body.append(i) tree_str = etree.tostring(tree, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def get_content(self, default=None): tree = parse_string(self.book.get_template(self._template_name)) tree_root = tree.getroot() tree_root.set('lang', self.lang or self.book.language) tree_root.attrib['{%s}lang' % NAMESPACES['XML']] = self.lang or self.book.language # add to the head also # <meta charset="utf-8" /> try: html_tree = parse_html_string(self.content) except: return '' html_root = html_tree.getroottree() # create and populate head _head = etree.SubElement(tree_root, 'head') if self.title != '': _title = etree.SubElement(_head, 'title') _title.text = self.title for lnk in self.links: if lnk.get("type") == "text/javascript": _lnk = etree.SubElement(_head, 'script', lnk) # force <script></script> _lnk.text = '' else: _lnk = etree.SubElement(_head, 'link', lnk) # this should not be like this head = html_root.find('head') if head is not None: for i in head.getchildren(): if i.tag == 'title' and self.title != '': continue _head.append(i) # create and populate body _body = etree.SubElement(tree_root, 'body') body = html_tree.find('body') if body is not None: for i in body.getchildren(): _body.append(i) tree_str = etree.tostring(tree, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def get_content(self): self.content = self.book.get_template('cover') tree = parse_string(super(EpubCoverHtml, self).get_content()) tree_root = tree.getroot() images = tree_root.xpath('//xhtml:img', namespaces={'xhtml': NAMESPACES['XHTML']}) images[0].set('src', self.image_name) images[0].set('alt', self.title) tree_str = etree.tostring(tree, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def get_content(self): self.content = self.book.get_template("cover") tree = parse_string(super(EpubCoverHtml, self).get_content()) tree_root = tree.getroot() images = tree_root.xpath("//xhtml:img", namespaces={"xhtml": NAMESPACES["XHTML"]}) images[0].set("src", self.image_name) images[0].set("alt", self.title) tree_str = etree.tostring(tree, pretty_print=True, encoding="utf-8", xml_declaration=True) return tree_str
def _get_nav(self, item): # just a basic navigation for now ncx = parse_string(self.book.get_template('nav')) root = ncx.getroot() root.set('lang', self.book.language) root.attrib['{%s}lang' % NAMESPACES['XML']] = self.book.language nav_dir_name = os.path.dirname(item.file_name) head = etree.SubElement(root, 'head') title = etree.SubElement(head, 'title') title.text = self.book.title # for now this just handles css files and ignores others for _link in item.links: _lnk = etree.SubElement(head, 'link', {"href": _link.get('href', ''), "rel": "stylesheet", "type": "text/css"}) body = etree.SubElement(root, 'body') nav = etree.SubElement(body, 'nav', {'{%s}type' % NAMESPACES['EPUB']: 'toc', 'id': 'id'}) content_title = etree.SubElement(nav, 'h2') content_title.text = self.book.title def _create_section(itm, items): ol = etree.SubElement(itm, 'ol') for item in items: if isinstance(item, tuple) or isinstance(item, list): li = etree.SubElement(ol, 'li') if isinstance(item[0], EpubHtml): a = etree.SubElement(li, 'a', {'href': os.path.relpath(item[0].file_name, nav_dir_name)}) elif isinstance(item[0], Section) and item[0].href != '': a = etree.SubElement(li, 'a', {'href': os.path.relpath(item[0].href, nav_dir_name)}) elif isinstance(item[0], Link): a = etree.SubElement(li, 'a', {'href': os.path.relpath(item[0].href, nav_dir_name)}) else: a = etree.SubElement(li, 'span') a.text = item[0].title _create_section(li, item[1]) elif isinstance(item, Link): li = etree.SubElement(ol, 'li') a = etree.SubElement(li, 'a', {'href': os.path.relpath(item.href, nav_dir_name)}) a.text = item.title elif isinstance(item, EpubHtml): li = etree.SubElement(ol, 'li')
def _load_opf_file(self): try: s = self.read_file(self.opf_file) except KeyError: raise EpubError(-1, 'Can not find container file') self.container = parse_string(s) self._load_metadata() self._load_manifest() self._load_spine() self._load_guide() # read nav file if found # if not self.book.toc: nav_item = next((item for item in self.book.items if isinstance(item, EpubNav)), None) if nav_item: self._parse_nav(nav_item.content, zip_path.dirname(nav_item.file_name))
def _load_opf_file(self): try: s = self.read_file(self.opf_file) except KeyError: raise EpubError(-1, 'Can not find container file') self.container = parse_string(s) self._load_metadata() self._load_manifest() self._load_spine() self._load_guide() # read nav file if found # if not self.book.toc: nav_item = next((item for item in self.book.items if isinstance(item, EpubNav)), None) if nav_item: self._parse_nav(nav_item.content, os.path.dirname(nav_item.file_name))
def get_content(self): """ Returns content for cover page as HTML string. Content will be of type 'str' (Python 2) or 'bytes' (Python 3). :Returns: Returns content of this document. """ self.content = self.book.get_template('cover') tree = parse_string(super(EpubCoverHtml, self).get_content()) tree_root = tree.getroot() images = tree_root.xpath('//xhtml:img', namespaces={'xhtml': NAMESPACES['XHTML']}) images[0].set('src', self.image_name) images[0].set('alt', self.title) tree_str = etree.tostring(tree, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def _get_ncx(self): # we should be able to setup language for NCX as also ncx = parse_string(self.book.get_template('ncx')) root = ncx.getroot() head = etree.SubElement(root, 'head') # get this id uid = etree.SubElement(head, 'meta', {'content': self.book.uid, 'name': 'dtb:uid'}) uid = etree.SubElement(head, 'meta', {'content': '0', 'name': 'dtb:depth'}) uid = etree.SubElement(head, 'meta', {'content': '0', 'name': 'dtb:totalPageCount'}) uid = etree.SubElement(head, 'meta', {'content': '0', 'name': 'dtb:maxPageNumber'}) doc_title = etree.SubElement(root, 'docTitle') title = etree.SubElement(doc_title, 'text') title.text = self.book.title # doc_author = etree.SubElement(root, 'docAuthor') # author = etree.SubElement(doc_author, 'text') # author.text = 'Name of the person' # For now just make a very simple navMap nav_map = etree.SubElement(root, 'navMap') def _create_section(itm, items, uid): for item in items: if isinstance(item, tuple) or isinstance(item, list): section, subsection = item[0], item[1] np = etree.SubElement(itm, 'navPoint', {'id': 'sep_%d' % uid}) nl = etree.SubElement(np, 'navLabel') nt = etree.SubElement(nl, 'text') nt.text = section.title # CAN NOT HAVE EMPTY SRC HERE nc = etree.SubElement(np, 'content', {'src': ''}) #uid += 1 uid = _create_section(np, subsection, uid+1) elif isinstance(item, Link): _parent = itm _content = _parent.find('content') if _content != None: if _content.get('src') == '': _content.set('src', item.href) np = etree.SubElement(itm, 'navPoint', {'id': item.uid}) nl = etree.SubElement(np, 'navLabel') nt = etree.SubElement(nl, 'text') nt.text = item.title nc = etree.SubElement(np, 'content', {'src': item.href}) elif isinstance(item, EpubHtml): _parent = itm _content = _parent.find('content') if _content != None: if _content.get('src') == '': _content.set('src', item.file_name) np = etree.SubElement(itm, 'navPoint', {'id': item.get_id()}) nl = etree.SubElement(np, 'navLabel') nt = etree.SubElement(nl, 'text') nt.text = item.title nc = etree.SubElement(np, 'content', {'src': item.file_name}) return uid _create_section(nav_map, self.book.toc, 0) tree_str = etree.tostring(root, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def _get_ncx(self): # we should be able to setup language for NCX as also ncx = parse_string(self.book.get_template('ncx')) root = ncx.getroot() head = etree.SubElement(root, 'head') # get this id uid = etree.SubElement(head, 'meta', {'content': self.book.uid, 'name': 'dtb:uid'}) uid = etree.SubElement(head, 'meta', {'content': '0', 'name': 'dtb:depth'}) uid = etree.SubElement(head, 'meta', {'content': '0', 'name': 'dtb:totalPageCount'}) uid = etree.SubElement(head, 'meta', {'content': '0', 'name': 'dtb:maxPageNumber'}) doc_title = etree.SubElement(root, 'docTitle') title = etree.SubElement(doc_title, 'text') title.text = self.book.title # doc_author = etree.SubElement(root, 'docAuthor') # author = etree.SubElement(doc_author, 'text') # author.text = 'Name of the person' # For now just make a very simple navMap nav_map = etree.SubElement(root, 'navMap') def _create_section(itm, items, uid): for item in items: if isinstance(item, tuple) or isinstance(item, list): section, subsection = item[0], item[1] np = etree.SubElement(itm, 'navPoint', {'id': section.get_id() if isinstance(section, EpubHtml) else 'sep_%d' % uid}) nl = etree.SubElement(np, 'navLabel') nt = etree.SubElement(nl, 'text') nt.text = section.title # CAN NOT HAVE EMPTY SRC HERE href = '' if isinstance(section, EpubHtml): href = section.file_name elif isinstance(section, Section) and section.href != '': href = section.href elif isinstance(section, Link): href = section.href nc = etree.SubElement(np, 'content', {'src': href}) uid = _create_section(np, subsection, uid + 1) elif isinstance(item, Link): _parent = itm _content = _parent.find('content') if _content != None: if _content.get('src') == '': _content.set('src', item.href) np = etree.SubElement(itm, 'navPoint', {'id': item.uid}) nl = etree.SubElement(np, 'navLabel') nt = etree.SubElement(nl, 'text') nt.text = item.title nc = etree.SubElement(np, 'content', {'src': item.href}) elif isinstance(item, EpubHtml): _parent = itm _content = _parent.find('content') if _content != None: if _content.get('src') == '': _content.set('src', item.file_name) np = etree.SubElement(itm, 'navPoint', {'id': item.get_id()}) nl = etree.SubElement(np, 'navLabel') nt = etree.SubElement(nl, 'text') nt.text = item.title nc = etree.SubElement(np, 'content', {'src': item.file_name}) return uid _create_section(nav_map, self.book.toc, 0) tree_str = etree.tostring(root, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def _get_nav(self, item): # just a basic navigation for now ncx = parse_string(self.book.get_template('nav')) root = ncx.getroot() root.set('lang', self.book.language) root.attrib['{%s}lang' % NAMESPACES['XML']] = self.book.language nav_dir_name = os.path.dirname(item.file_name) head = etree.SubElement(root, 'head') title = etree.SubElement(head, 'title') title.text = self.book.title # for now this just handles css files and ignores others for _link in item.links: _lnk = etree.SubElement(head, 'link', {"href": _link.get('href', ''), "rel": "stylesheet", "type": "text/css"}) body = etree.SubElement(root, 'body') nav = etree.SubElement(body, 'nav', {'{%s}type' % NAMESPACES['EPUB']: 'toc', 'id': 'id'}) content_title = etree.SubElement(nav, 'h2') content_title.text = self.book.title def _create_section(itm, items): ol = etree.SubElement(itm, 'ol') for item in items: if isinstance(item, tuple) or isinstance(item, list): li = etree.SubElement(ol, 'li') if isinstance(item[0], EpubHtml): a = etree.SubElement(li, 'a', {'href': os.path.relpath(item[0].file_name, nav_dir_name)}) elif isinstance(item[0], Section) and item[0].href != '': a = etree.SubElement(li, 'a', {'href': os.path.relpath(item[0].href, nav_dir_name)}) elif isinstance(item[0], Link): a = etree.SubElement(li, 'a', {'href': os.path.relpath(item[0].href, nav_dir_name)}) else: a = etree.SubElement(li, 'span') a.text = item[0].title _create_section(li, item[1]) elif isinstance(item, Link): li = etree.SubElement(ol, 'li') a = etree.SubElement(li, 'a', {'href': os.path.relpath(item.href, nav_dir_name)}) a.text = item.title elif isinstance(item, EpubHtml): li = etree.SubElement(ol, 'li') a = etree.SubElement(li, 'a', {'href': os.path.relpath(item.file_name, nav_dir_name)}) a.text = item.title _create_section(nav, self.book.toc) # LANDMARKS / GUIDE # - http://www.idpf.org/epub/30/spec/epub30-contentdocs.html#sec-xhtml-nav-def-types-landmarks if len(self.book.guide) > 0 and self.options.get('epub3_landmark'): # Epub2 guide types do not map completely to epub3 landmark types. guide_to_landscape_map = { 'notes': 'rearnotes', 'text': 'bodymatter' } guide_nav = etree.SubElement(body, 'nav', {'{%s}type' % NAMESPACES['EPUB']: 'landmarks'}) guide_content_title = etree.SubElement(guide_nav, 'h2') guide_content_title.text = self.options.get('landmark_title', 'Guide') guild_ol = etree.SubElement(guide_nav, 'ol') for elem in self.book.guide: li_item = etree.SubElement(guild_ol, 'li') if 'item' in elem: chap = elem.get('item', None) if chap: _href = chap.file_name _title = chap.title else: _href = elem.get('href', '') _title = elem.get('title', '') guide_type = elem.get('type', '') a_item = etree.SubElement(li_item, 'a', {'{%s}type' % NAMESPACES['EPUB']: guide_to_landscape_map.get(guide_type, guide_type), 'href': os.path.relpath(_href, nav_dir_name)}) a_item.text = _title tree_str = etree.tostring(root, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def get_content(self, default=None): """ Returns content for this document as HTML string. Content will be of type 'str' (Python 2) or 'bytes' (Python 3). :Args: - default: Default value for the content if it is not defined. :Returns: Returns content of this document. """ tree = parse_string(self.book.get_template(self._template_name)) tree_root = tree.getroot() tree_root.set('lang', self.lang or self.book.language) tree_root.attrib['{%s}lang' % NAMESPACES['XML']] = self.lang or self.book.language # add to the head also # <meta charset="utf-8" /> try: html_tree = parse_html_string(self.content) except: return '' html_root = html_tree.getroottree() # create and populate head _head = etree.SubElement(tree_root, 'head') if self.title != '': _title = etree.SubElement(_head, 'title') _title.text = self.title for lnk in self.links: if lnk.get("type") == "text/javascript": _lnk = etree.SubElement(_head, 'script', lnk) # force <script></script> _lnk.text = '' else: _lnk = etree.SubElement(_head, 'link', lnk) # this should not be like this # head = html_root.find('head') # if head is not None: # for i in head.getchildren(): # if i.tag == 'title' and self.title != '': # continue # _head.append(i) # create and populate body _body = etree.SubElement(tree_root, 'body') if self.direction: _body.set('dir', self.direction) body = html_tree.find('body') if body is not None: for i in body.getchildren(): _body.append(i) tree_str = etree.tostring(tree, pretty_print=True, encoding='utf-8', xml_declaration=True) return tree_str
def _get_nav(self, item): # just a basic navigation for now ncx = parse_string(self.book.get_template('nav')) root = ncx.getroot() root.set('lang', self.book.language) root.attrib['{%s}lang' % NAMESPACES['XML']] = self.book.language nav_dir_name = os.path.dirname(item.file_name) head = etree.SubElement(root, 'head') title = etree.SubElement(head, 'title') title.text = self.book.title # for now this just handles css files and ignores others for _link in item.links: _lnk = etree.SubElement( head, 'link', { "href": _link.get('href', ''), "rel": "stylesheet", "type": "text/css" }) body = etree.SubElement(root, 'body') nav = etree.SubElement(body, 'div', {'id': 'id'}) content_title = etree.SubElement(nav, 'h2') content_title.text = self.book.title def _create_section(itm, items): ol = etree.SubElement(itm, 'ol') for item in items: if isinstance(item, tuple) or isinstance(item, list): li = etree.SubElement(ol, 'li') if isinstance(item[0], EpubHtml): a = etree.SubElement( li, 'a', { 'href': os.path.relpath(item[0].file_name, nav_dir_name) }) elif isinstance(item[0], Section) and item[0].href != '': a = etree.SubElement(li, 'a', { 'href': os.path.relpath(item[0].href, nav_dir_name) }) elif isinstance(item[0], Link): a = etree.SubElement(li, 'a', { 'href': os.path.relpath(item[0].href, nav_dir_name) }) else: a = etree.SubElement(li, 'span') a.text = item[0].title _create_section(li, item[1]) elif isinstance(item, Link): li = etree.SubElement(ol, 'li') a = etree.SubElement( li, 'a', {'href': os.path.relpath(item.href, nav_dir_name)}) a.text = item.title elif isinstance(item, EpubHtml): li = etree.SubElement(ol, 'li') a = etree.SubElement(li, 'a', { 'href': os.path.relpath(item.file_name, nav_dir_name) }) a.text = item.title _create_section(nav, self.book.toc) # LANDMARKS / GUIDE # - http://www.idpf.org/epub/30/spec/epub30-contentdocs.html#sec-xhtml-nav-def-types-landmarks if len(self.book.guide) > 0 and self.options.get('epub3_landmark'): # Epub2 guide types do not map completely to epub3 landmark types. guide_to_landscape_map = { 'notes': 'rearnotes', 'text': 'bodymatter' } guide_nav = etree.SubElement( body, 'nav', {'{%s}type' % NAMESPACES['EPUB']: 'landmarks'}) guide_content_title = etree.SubElement(guide_nav, 'h2') guide_content_title.text = self.options.get( 'landmark_title', 'Guide') guild_ol = etree.SubElement(guide_nav, 'ol') for elem in self.book.guide: li_item = etree.SubElement(guild_ol, 'li') _href = elem.get('href', '') _title = elem.get('title', '') if 'item' in elem: chap = elem.get('item', None) if chap: _href = chap.file_name _title = chap.title guide_type = elem.get('type', '') a_item = etree.SubElement( li_item, 'a', { '{%s}type' % NAMESPACES['EPUB']: guide_to_landscape_map.get(guide_type, guide_type), 'href': os.path.relpath(_href, nav_dir_name) }) a_item.text = _title tree_str = etree.tostring(ncx, pretty_print=True, encoding='utf-8', xml_declaration=True) return self._fix_nav_css_links(tree_str)
def _get_ncx(self): # we should be able to setup language for NCX as also ncx = parse_string(self.book.get_template("ncx")) root = ncx.getroot() head = etree.SubElement(root, "head") # get this id uid = etree.SubElement(head, "meta", {"content": self.book.uid, "name": "dtb:uid"}) uid = etree.SubElement(head, "meta", {"content": "0", "name": "dtb:depth"}) uid = etree.SubElement(head, "meta", {"content": "0", "name": "dtb:totalPageCount"}) uid = etree.SubElement(head, "meta", {"content": "0", "name": "dtb:maxPageNumber"}) doc_title = etree.SubElement(root, "docTitle") title = etree.SubElement(doc_title, "text") title.text = self.book.title # doc_author = etree.SubElement(root, 'docAuthor') # author = etree.SubElement(doc_author, 'text') # author.text = 'Name of the person' # For now just make a very simple navMap nav_map = etree.SubElement(root, "navMap") def _gen_navPoint_uid(id): # 驗證工具認為:Error while parsing file 'The "id" attribute does not have a unique value'. return id + ".%04d" % (random.randint(1, 9999)) def _create_section(itm, items, uid): for item in items: if isinstance(item, tuple) or isinstance(item, list): section, subsection = item[0], item[1] np = etree.SubElement( itm, "navPoint", { "id": _gen_navPoint_uid(section.get_id()) if isinstance(section, EpubHtml) else _gen_navPoint_uid("sep_%d" % uid) }, ) nl = etree.SubElement(np, "navLabel") nt = etree.SubElement(nl, "text") nt.text = self._get_toc_title(section) # CAN NOT HAVE EMPTY SRC HERE nc = etree.SubElement( np, "content", {"src": section.file_name if isinstance(section, EpubHtml) else ""} ) # uid += 1 uid = _create_section(np, subsection, uid + 1) elif isinstance(item, Link): _parent = itm _content = _parent.find("content") if _content != None: if _content.get("src") == "": _content.set("src", item.href) np = etree.SubElement(itm, "navPoint", {"id": _gen_navPoint_uid(item.uid)}) nl = etree.SubElement(np, "navLabel") nt = etree.SubElement(nl, "text") nt.text = self._get_toc_title(item) nc = etree.SubElement(np, "content", {"src": item.href}) elif isinstance(item, EpubHtml): _parent = itm _content = _parent.find("content") if _content != None: if _content.get("src") == "": _content.set("src", item.file_name) np = etree.SubElement(itm, "navPoint", {"id": _gen_navPoint_uid(item.get_id())}) nl = etree.SubElement(np, "navLabel") nt = etree.SubElement(nl, "text") nt.text = self._get_toc_title(item) nc = etree.SubElement(np, "content", {"src": item.file_name}) return uid _create_section(nav_map, self.book.toc, 0) tree_str = etree.tostring(root, pretty_print=True, encoding="utf-8", xml_declaration=True) return tree_str
def _get_nav(self, item): # just a basic navigation for now ncx = parse_string(self.book.get_template("nav")) root = ncx.getroot() root.set("lang", self.book.language) root.attrib["{%s}lang" % NAMESPACES["XML"]] = self.book.language head = etree.SubElement(root, "head") title = etree.SubElement(head, "title") title.text = self.book.title # for now this just handles css files and ignores others for _link in item.links: _lnk = etree.SubElement( head, "link", {"href": _link.get("href", ""), "rel": "stylesheet", "type": "text/css"} ) body = etree.SubElement(root, "body") nav = etree.SubElement(body, "nav", {"{%s}type" % NAMESPACES["EPUB"]: "toc", "id": "id"}) content_title = etree.SubElement(nav, "h2") content_title.text = self.book.title def _create_section(itm, items): ol = etree.SubElement(itm, "ol") for item in items: if isinstance(item, tuple) or isinstance(item, list): li = etree.SubElement(ol, "li") if isinstance(item[0], EpubHtml): a = etree.SubElement(li, "a", {"href": item[0].file_name}) else: a = etree.SubElement(li, "span") a.text = self._get_toc_title(item[0]) _create_section(li, item[1]) elif isinstance(item, Link): li = etree.SubElement(ol, "li") a = etree.SubElement(li, "a", {"href": item.href}) a.text = self._get_toc_title(item) elif isinstance(item, EpubHtml): li = etree.SubElement(ol, "li") a = etree.SubElement(li, "a", {"href": item.file_name}) a.text = self._get_toc_title(item) _create_section(nav, self.book.toc) # LANDMARKS / GUIDE # - http://www.idpf.org/epub/30/spec/epub30-contentdocs.html#sec-xhtml-nav-def-types-landmarks if len(self.book.guide) > 0 and self.options.get("epub3_landmark"): # Epub2 guide types do not map completely to epub3 landmark types. guide_to_landscape_map = {"notes": "rearnotes", "text": "bodymatter"} guide_nav = etree.SubElement(body, "nav", {"{%s}type" % NAMESPACES["EPUB"]: "landmarks"}) guide_content_title = etree.SubElement(guide_nav, "h2") guide_content_title.text = self.options.get("landmark_title", "Guide") guild_ol = etree.SubElement(guide_nav, "ol") for elem in self.book.guide: li_item = etree.SubElement(guild_ol, "li") if "item" in elem: chap = elem.get("item", None) if chap: _href = chap.file_name _title = chap.title else: _href = elem.get("href", "") _title = elem.get("title", "") guide_type = elem.get("type", "") a_item = etree.SubElement( li_item, "a", { "{%s}type" % NAMESPACES["EPUB"]: guide_to_landscape_map.get(guide_type, guide_type), "href": _href, }, ) a_item.text = _title tree_str = etree.tostring(root, pretty_print=True, encoding="utf-8", xml_declaration=True) return tree_str