Source code for yael.ncxtocnode
#!/usr/bin/env python
# coding=utf-8
"""
A node in a NCX TOC tree.
"""
from yael.element import Element
from yael.jsonable import JSONAble
from yael.namespace import Namespace
import yael.util
__author__ = "Alberto Pettarin"
__copyright__ = "Copyright 2015, Alberto Pettarin (www.albertopettarin.it)"
__license__ = "MIT"
__version__ = "0.0.6"
__email__ = "alberto@albertopettarin.it"
__status__ = "Development"
[docs]class NCXTocNode(Element):
"""
Build a node in a NCX TOC tree or
parse it from `obj` or `string`.
"""
A_ID = "id"
A_PLAYORDER = "playOrder"
A_SRC = "src"
E_CONTENT = "content"
E_NAVLABEL = "navLabel"
E_NAVPOINT = "navPoint"
E_TEXT = "text"
def __init__(self, internal_path=None, obj=None, string=None):
self.v_id = None
self.v_play_order = None
self.v_src = None
self.v_text = None
self.children = []
Element.__init__(
self,
internal_path=internal_path,
obj=obj,
string=string)
def json_object(self, recursive=True):
obj = {
"id": self.v_id,
"playorder": self.v_play_order,
"src": self.v_src,
"text": self.v_text,
"children": len(self.children),
}
if recursive:
obj["children"] = JSONAble.safe(self.children)
return obj
def parse_object(self, obj):
# set id and play_order attributes
self.v_id = obj.get(NCXTocNode.A_ID)
self.v_play_order = obj.get(NCXTocNode.A_PLAYORDER)
# set text (if any)
text_arr = yael.util.query_xpath(
obj=obj,
query="{0}:{1}/{0}:{2}",
args=['n', NCXTocNode.E_NAVLABEL, NCXTocNode.E_TEXT],
nsp={'n': Namespace.NCX},
required=None)
if len(text_arr) > 0:
self.v_text = yael.util.safe_strip(text_arr[0].text)
# set src (if any)
content_arr = yael.util.query_xpath(
obj=obj,
query="{0}:{1}",
args=['n', NCXTocNode.E_CONTENT],
nsp={'n': Namespace.NCX},
required=None)
if len(content_arr) > 0:
self.v_src = content_arr[0].get(NCXTocNode.A_SRC)
# locate children `<navPoint>` elements (if any)
nav_points_arr = yael.util.query_xpath(
obj=obj,
query="{0}:{1}",
args=['n', NCXTocNode.E_NAVPOINT],
nsp={'n': Namespace.NCX},
required=None)
for nav_point in nav_points_arr:
nav_point_parsed = None
try:
nav_point_parsed = NCXTocNode(obj=nav_point)
except:
pass
if nav_point_parsed != None:
self.children.append(nav_point_parsed)
[docs] def add_child(self, child):
"""
Add the given child to this node.
:param child: the node child to be added
:type child: :class:`yael.ncxtocnode.NCXTocNode`
"""
self.children.append(child)
@property
def v_id(self):
"""
The value of the `id` attribute.
:rtype: str
"""
return self.__v_id
@v_id.setter
def v_id(self, v_id):
self.__v_id = v_id
@property
def v_src(self):
"""
The value of the `src` attribute.
:rtype: str
"""
return self.__v_src
@v_src.setter
def v_src(self, v_src):
self.__v_src = v_src
@property
def v_text(self):
"""
The value of the `text` attribute.
:rtype: str
"""
return self.__v_text
@v_text.setter
def v_text(self, v_text):
self.__v_text = v_text
@property
def v_play_order(self):
"""
The value of the `playOrder` attribute.
:rtype: str
"""
return self.__v_play_order
@v_play_order.setter
def v_play_order(self, v_play_order):
self.__v_play_order = v_play_order
@property
def children(self):
"""
The children elements of this node.
:rtype: list of :class:`yael.ncxtocnode.NCXTocNode` objects
"""
return self.__children
@children.setter
def children(self, children):
self.__children = children