Source code for yael.opfguide
#!/usr/bin/env python
# coding=utf-8
"""
An OPF `<guide>` element.
"""
from yael.element import Element
from yael.jsonable import JSONAble
from yael.namespace import Namespace
from yael.opfreference import OPFReference
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 OPFGuide(Element):
"""
Build an OPF `<guide>` element or
parse it from `obj` or `string`.
"""
A_ID = "id"
E_REFERENCE = "reference"
def __init__(self, internal_path=None, obj=None, string=None):
self.v_id = None
self.references = []
Element.__init__(
self,
internal_path=internal_path,
obj=obj,
string=string)
def parse_object(self, obj):
# get attributes
self.v_id = obj.get(OPFGuide.A_ID)
# locate `<reference>` elements
reference_arr = yael.util.query_xpath(
obj=obj,
query="{0}:{1}",
args=["o", OPFGuide.E_REFERENCE],
nsp={"o": Namespace.OPF, "x": Namespace.XML},
required=None)
for reference in reference_arr:
reference_parsed = None
try:
reference_parsed = OPFReference(obj=reference)
except:
pass
if reference_parsed != None:
self.add_reference(reference_parsed)
def json_object(self, recursive=True):
obj = {
"id": self.v_id,
"references": len(self.references),
}
if recursive:
obj["references"] = JSONAble.safe(self.references)
return obj
def __len__(self):
return len(self.references)
[docs] def add_reference(self, reference):
"""
Add the given `<reference>` (OPFReference) to the guide.
:param reference: the `<reference>` (OPFReference) to be added
:type reference: :class:`yael.opfreference.OPFReference`
"""
self.references.append(reference)
[docs] def reference_by_type(self, v_type):
"""
Return the `<reference>` child with given `type`.
:param v_type: the desired `type`
:type v_type: str
:returns: the child with given type, or None if not found
:rtype: :class:`yael.opfreference.OPFReference`
"""
lis = list(e for e in self.references if e.v_type == v_type)
return yael.util.safe_first(lis)
[docs] def reference_by_id(self, v_id):
"""
Return the `<reference>` child with given `id`.
:param v_id: the desired `id`
:type v_id: str
:returns: the child with given id, or None if not found
:rtype: :class:`yael.opfreference.OPFReference`
"""
lis = list(e for e in self.references if e.v_id == v_id)
return yael.util.safe_first(lis)
@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 references(self):
"""
The children elements in this guide.
:rtype: list of :class:`yael.opfreference.OPFReference` objects
"""
return self.__references
@references.setter
def references(self, references):
self.__references = references