U
    \$d                     @   s.  d Z ddlmZ ddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZ ddl
mZ e Zed	d
 edd edd edd edd G dd deZG dd deZeddedd	gZede eede eeddeddgZG dd deZdS ) z
File manifest
    )	MimeTypesN)Serialisable)StringSequence)
fromstring)	ARC_CONTENT_TYPES	ARC_THEME	ARC_STYLE
THEME_TYPESTYLES_TYPECONTYPES_NSACTIVEXCTRLVBA)tostringzapplication/xmlz.xmlz8application/vnd.openxmlformats-package.relationships+xmlz.relsz$application/vnd.ms-office.vbaProjectz.binz8application/vnd.openxmlformats-officedocument.vmlDrawingz.vmlzimage/x-emfz.emfc                   @   s$   e Zd ZdZe Ze Zdd ZdS )FileExtensionDefaultc                 C   s   || _ || _d S N)	ExtensionContentType)selfr   r    r   ?/tmp/pip-unpacked-wheel-dtxbr_v9/openpyxl/packaging/manifest.py__init__)   s    zFileExtension.__init__N)__name__
__module____qualname__tagnamer   r   r   r   r   r   r   r   r   "   s   r   c                   @   s$   e Zd Zd Ze Ze Zdd ZdS )Overridec                 C   s   || _ || _d S r   PartNamer   )r   r    r   r   r   r   r   5   s    zOverride.__init__N)r   r   r   r   r   r    r   r   r   r   r   r   r   .   s   r   Zrelsxml/z/docProps/core.xmlz:application/vnd.openxmlformats-package.core-properties+xmlz/docProps/app.xmlzEapplication/vnd.openxmlformats-officedocument.extended-properties+xmlc                       s   e Zd ZdZeeddZeeddZdZdZ	dddZ
ed	d
 Zedd Z fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )ManifestZTypesT)Zexpected_typeuniquez[Content_Types].xml)r   r   r   c                 C   s    |st }|| _|st}|| _d S r   )DEFAULT_TYPESr   DEFAULT_OVERRIDEr   )r   r   r   r   r   r   r   Q   s    zManifest.__init__c                 C   s   dd | j D S )Nc                 S   s   g | ]
}|j qS r   )r    .0partr   r   r   
<listcomp>_   s     z&Manifest.filenames.<locals>.<listcomp>)r   )r   r   r   r   	filenames]   s    zManifest.filenamesc                 C   s"   dd | j D }dd t|D S )z\
        Map content types to file extensions
        Skip parts without extensions
        c                 S   s   h | ]}t j|jd  qS ))ospathsplitextr    r'   r   r   r   	<setcomp>h   s     z&Manifest.extensions.<locals>.<setcomp>c                 S   s*   g | ]"}|r|d d t jd | fqS )   NT)	mimetypes	types_map)r(   extr   r   r   r*   i   s      z'Manifest.extensions.<locals>.<listcomp>)r   sorted)r   extsr   r   r   
extensionsb   s    zManifest.extensionsc                    s\   dd | j D }| jD ]&\}}||krt||}| j | qtt|  }|dt |S )zR
        Custom serialisation method to allow setting a default namespace
        c                 S   s   g | ]
}|j qS r   )r   )r(   tr   r   r   r*   p   s     z$Manifest.to_tree.<locals>.<listcomp>xmlns)	r   r7   r   appendsuperr#   to_treesetr   )r   defaultsr4   mimetree	__class__r   r   r<   l   s    
zManifest.to_treec                 C   s    | j D ]}|j|kr dS qdS )zF
        Check whether a particular content type is contained
        TNr   r   r   content_typer8   r   r   r   __contains__z   s    

zManifest.__contains__c                 C   s,   zt | |W S  tk
r&   Y dS X dS )z,
        Find specific content-type
        N)nextfindallStopIteration)r   rE   r   r   r   find   s    zManifest.findc                 c   s    | j D ]}|j|kr|V  qdS )z>
        Find all elements of a specific content-type
        NrC   rD   r   r   r   rH      s    

zManifest.findallc                 C   s    t |j|jd}| j | dS )zZ
        Add content object to the package manifest
        # needs a contract...
        r   N)r   r.   Z	mime_typer:   )r   objctr   r   r   r:      s    zManifest.appendc                 C   s>   |  | | | | j| d || jt|   dS )z/
        Write manifest to the archive
        )r+   N)r:   
_write_vba_register_mimetypesnamelistwritestrr.   r   r<   )r   archiveworkbookr   r   r   _write   s    

zManifest._writec                 C   sP   |D ]F}t j|d }|sqtjd | }t|dd |}| j| qdS )zT
        Make sure that the mime type for all file extensions is registered
        r,   Tr1   N)r-   r.   r/   r2   r3   r   r   r:   )r   r+   fnr4   r?   Zfer   r   r   rN      s    zManifest._register_mimetypesc                 C   s^   |j rZt|j t}t|}| j}|jD ],}|jt	t
tfkrBq,|j|kr,| j| q,dS )zI
        Add content types from cached workbook when keeping VBA
        N)Zvba_archiver   readr   r#   Z	from_treer+   r   r    r   r   r   r:   )r   rR   nodeZmfr+   overrider   r   r   rM      s    


zManifest._write_vba)r   r   )r   r   r   r   r   r   r   r   r.   Z__elements__r   propertyr+   r7   r<   rF   rJ   rH   r:   rS   rN   rM   __classcell__r   r   rA   r   r#   G   s(     


		
		
r#   )__doc__r2   r   os.pathr-   Z!openpyxl.descriptors.serialisabler   Zopenpyxl.descriptorsr   r   Zopenpyxl.xml.functionsr   Zopenpyxl.xml.constantsr   r   r	   r
   r   r   r   r   r   r   add_typer   r   r%   r&   r#   r   r   r   r   <module>   s0   ,