def iter_valid_rels(): """Filter out broken relationships such as those pointing to NULL.""" for rel_elm in xml_rels.relationship_lst: # --- Occasionally a PowerPoint plugin or other client will "remove" # --- a relationship simply by "voiding" its Target value, like making # --- it "/ppt/slides/NULL". Skip any relationships linking to a # --- partname that is not present in the package. if rel_elm.targetMode == RTM.INTERNAL: partname = PackURI.from_rel_ref(base_uri, rel_elm.target_ref) if partname not in parts: continue yield _Relationship.from_xml(base_uri, rel_elm, parts)
def load_rels(source_partname, rels): """Populate `xml_rels` dict by traversing relationships depth-first.""" xml_rels[source_partname] = rels visited_partnames.add(source_partname) base_uri = source_partname.baseURI # --- recursion stops when there are no unvisited partnames in rels --- for rel in rels: if rel.targetMode == RTM.EXTERNAL: continue target_partname = PackURI.from_rel_ref(base_uri, rel.target_ref) if target_partname in visited_partnames: continue load_rels(target_partname, self._xml_rels_for(target_partname))
def from_xml(cls, base_uri, rel, parts): """Return |_Relationship| object based on CT_Relationship element `rel`.""" target = (rel.target_ref if rel.targetMode == RTM.EXTERNAL else parts[PackURI.from_rel_ref(base_uri, rel.target_ref)]) return cls(base_uri, rel.rId, rel.reltype, rel.targetMode, target)
def it_can_construct_from_relative_ref(self): baseURI = '/ppt/slides' relative_ref = '../slideLayouts/slideLayout1.xml' pack_uri = PackURI.from_rel_ref(baseURI, relative_ref) assert pack_uri == '/ppt/slideLayouts/slideLayout1.xml'
def it_can_construct_from_relative_ref(self): pack_uri = PackURI.from_rel_ref( "/ppt/slides", "../slideLayouts/slideLayout1.xml" ) assert pack_uri == "/ppt/slideLayouts/slideLayout1.xml"