1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
import xml.etree.ElementTree as etree
from gi.repository import Gtk
import logging
class NavPoint(object):
def __init__(self, label, contentsrc, children=[]):
self._label = label
self._contentsrc = contentsrc
self._children = children
def get_label(self):
return self._label
def get_contentsrc(self):
return self._contentsrc
def get_children(self):
return self._children
class NavMap(object):
def __init__(self, opffile, ncxfile, basepath):
self._basepath = basepath
self._opffile = opffile
self._tree = etree.parse(ncxfile)
self._root = self._tree.getroot()
self._gtktreestore = Gtk.TreeStore(str, str)
self._flattoc = []
self._populate_flattoc()
self._populate_toc()
def _populate_flattoc(self):
tree = etree.parse(self._opffile)
root = tree.getroot()
itemmap = {}
manifest = root.find('.//{http://www.idpf.org/2007/opf}manifest')
for element in manifest.iterfind('{http://www.idpf.org/2007/opf}item'):
itemmap[element.get('id')] = element
spine = root.find('.//{http://www.idpf.org/2007/opf}spine')
for element in spine.iterfind('{http://www.idpf.org/2007/opf}itemref'):
idref = element.get('idref')
href = itemmap[idref].get('href')
self._flattoc.append(self._basepath + href)
self._opffile.close()
def _populate_toc(self):
navmap = self._root.find(
'{http://www.daisy.org/z3986/2005/ncx/}navMap')
for navpoint in navmap.iterfind(
'./{http://www.daisy.org/z3986/2005/ncx/}navPoint'):
self._process_navpoint(navpoint)
def _gettitle(self, navpoint):
text = navpoint.find('./{http://www.daisy.org/z3986/2005/ncx/}' +
'navLabel/{http://www.daisy.org/z3986/2005/ncx/}text')
return text.text
def _getcontent(self, navpoint):
text = navpoint.find(
'./{http://www.daisy.org/z3986/2005/ncx/}content')
if text is not None:
return self._basepath + text.get('src')
else:
return ""
def _process_navpoint(self, navpoint, parent=None):
title = self._gettitle(navpoint)
content = self._getcontent(navpoint)
#print title, content
iter = self._gtktreestore.append(parent, [title, content])
#self._flattoc.append((title, content))
childnavpointlist = list(navpoint.iterfind(
'./{http://www.daisy.org/z3986/2005/ncx/}navPoint'))
if len(childnavpointlist):
for childnavpoint in childnavpointlist:
self._process_navpoint(childnavpoint, parent=iter)
else:
return
def get_gtktreestore(self):
'''
Returns a GtkTreeModel representation of the
Epub table of contents
'''
return self._gtktreestore
def get_flattoc(self):
'''
Returns a flat (linear) list of files to be
rendered.
'''
return self._flattoc
#t = TocParser('/home/sayamindu/Desktop/Test/OPS/fb.ncx')
|