1#!/usr/bin/env python 2#coding:utf-8 3# Purpose: ODF META-INF/manifest.xml management 4# Created: 27.12.2010 5# Copyright (C) 2010, Manfred Moitzi 6# License: MIT license 7from __future__ import unicode_literals, print_function, division 8__author__ = "mozman <mozman@gmx.at>" 9 10from .xmlns import XMLMixin, etree, CN 11from .const import MANIFEST_NSMAP 12 13IGNORE_LIST = frozenset(['META-INF/manifest.xml']) 14 15class Manifest(XMLMixin): 16 def __init__(self, content=None): 17 if content is None: 18 self.xmlnode = etree.Element(CN('manifest:manifest'), nsmap=MANIFEST_NSMAP) 19 else: 20 self.xmlnode = etree.XML(content) 21 22 def add(self, full_path, media_type="", version=None): 23 def create_new_file_entry(): 24 file_entry = etree.SubElement(self.xmlnode, CN('manifest:file-entry')) 25 file_entry.set(CN('manifest:full-path'), full_path) 26 return file_entry 27 28 def get_file_entry_or_create_new(): 29 file_entry = self.find(full_path) 30 return create_new_file_entry() if file_entry is None else file_entry 31 32 def set_media_type_and_version(file_entry): 33 file_entry.set(CN('manifest:media-type'), media_type) 34 if version is not None: 35 file_entry.set(CN('manifest:version'), version) 36 37 if full_path in IGNORE_LIST: 38 return 39 file_entry = get_file_entry_or_create_new() 40 set_media_type_and_version(file_entry) 41 42 def remove(self, full_path): 43 file_entry = self.find(full_path) 44 if file_entry is not None: 45 self.xmlnode.remove(file_entry) 46 47 def find(self, full_path): 48 for node in self.xmlnode: 49 if node.get(CN('manifest:full-path')) == full_path: 50 return node 51 return None 52