def merge_styles_from(self, document): """Copy all the styles of a document into ourself. Styles with the same type and name will be replaced, so only unique styles will be preserved. """ styles = self.get_styles() content = self.get_content() for style in document.get_style_list(): tagname = style.get_tag() family = style.get_style_family() if family is None: family = _get_style_family(tagname) stylename = style.get_style_name() container = style.get_parent() container_name = container.get_tag() partname = container.get_parent().get_tag() # The destination part if partname == "office:document-styles": part = styles elif partname == "office:document-content": part = content else: raise NotImplementedError, partname # Implemented containers if container_name not in ('office:styles', 'office:automatic-styles', 'office:master-styles', 'office:font-face-decls'): raise NotImplementedError, container_name dest = part.get_element('//%s' % container_name) # Implemented style types if tagname not in registered_styles: raise NotImplementedError, tagname duplicate = part.get_style(family, stylename) if duplicate is not None: duplicate.delete() dest.append(style) # Copy images from the header/footer if tagname == 'style:master-page': manifest = self.get_manifest() document_manifest = document.get_manifest() query = 'descendant::draw:image' for image in style.get_element_list(query): full_path = image.get_attribute('xlink:href') data = document.get_part(full_path) media_type = document_manifest.get_media_type(full_path) # Manually add the part to keep the name self.set_part(full_path, data) manifest.add_full_path(full_path, media_type)
def merge_styles_from(self, document): """Copy all the styles of a document into ourself. Styles with the same type and name will be replaced, so only unique styles will be preserved. """ styles = self.get_styles() content = self.get_content() for style in document.get_style_list(): tagname = style.get_tagname() family = style.get_style_family() if family is None: family = _get_style_family(tagname) stylename = style.get_style_name() container = style.get_parent() container_name = container.get_tagname() partname = container.get_parent().get_tagname() # The destination part if partname == "office:document-styles": part = styles elif partname == "office:document-content": part = content else: raise NotImplementedError, partname # Implemented containers if container_name not in ('office:styles', 'office:automatic-styles', 'office:master-styles', 'office:font-face-decls'): raise NotImplementedError, container_name dest = part.get_element('//%s' % container_name) # Implemented style types if tagname not in ('style:default-style', 'style:style', 'style:style', 'style:page-layout', 'style:master-page', 'style:font-face', 'text:list-style', 'number:number-style', 'text:outline-style', 'number:date-style'): raise NotImplementedError, tagname duplicate = part.get_style(family, stylename) if duplicate is not None: duplicate.get_parent().delete_element(duplicate) dest.append_element(style)