U
    rÎ·h  ã                   @   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-49e_hfpc/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   ,þü