B
    P\2                 @   sz  d dl mZ d dl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mZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl
m&Z& ej'se(  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 )    )absolute_importN)Serialisable)StringSequence)
fromstring)ARC_COREARC_CONTENT_TYPESARC_WORKBOOKARC_APP	ARC_THEME	ARC_STYLEARC_SHARED_STRINGSEXTERNAL_LINK
THEME_TYPESTYLES_TYPEXLSXXLSMXLTMXLTXWORKSHEET_TYPECOMMENTS_TYPESHARED_STRINGSDRAWING_TYPE
CHART_TYPECHARTSHAPE_TYPECHARTSHEET_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&   :lib/python3.7/site-packages/openpyxl/packaging/manifest.py__init__;   s    zFileExtension.__init__N)__name__
__module____qualname__tagnamer   r#   r$   r(   r&   r&   r&   r'   r!   4   s   r!   c               @   s$   e Zd Zd Ze Ze Zdd ZdS )Overridec             C   s   || _ || _d S )N)PartNamer$   )r%   r.   r$   r&   r&   r'   r(   G   s    zOverride.__init__N)r)   r*   r+   r,   r   r.   r$   r(   r&   r&   r&   r'   r-   @   s   r-   ZrelsZ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 )N)DEFAULT_TYPESr"   DEFAULT_OVERRIDEr-   )r%   r"   r-   r&   r&   r'   r(   c   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>q   s    z&Manifest.filenames.<locals>.<listcomp>)r-   )r%   r&   r&   r'   	filenameso   s    zManifest.filenamesc             C   s&   t dd | jD }dd t|D S )z\
        Map content types to file extensions
        Skip parts without extensions
        c             S   s   g | ]}t j|jd  qS ))ospathsplitextr.   )r4   r5   r&   r&   r'   r6   z   s    z'Manifest.extensions.<locals>.<listcomp>c             S   s&   g | ]}|r|d d t j| fqS )   N)	mimetypes	types_map)r4   extr&   r&   r'   r6   {   s    )setr-   sorted)r%   Zextsr&   r&   r'   
extensionst   s    zManifest.extensionsc                s`   dd | j D }x0| jD ]&\}}||krt||}| j | qW tt|  }|dt |S )zR
        Custom serialisation method to allow setting a default namespace
        c             S   s   g | ]
}|j qS r&   )r#   )r4   tr&   r&   r'   r6      s    z$Manifest.to_tree.<locals>.<listcomp>Zxmlns)	r"   rB   r!   appendsuperr0   to_treer@   r   )r%   defaultsr?   mimeZtree)	__class__r&   r'   rF   ~   s    
zManifest.to_treec             C   s"   x| j D ]}|j|krdS qW dS )zF
        Check whether a particular content type is contained
        TN)r-   r$   )r%   content_typerC   r&   r&   r'   __contains__   s    
zManifest.__contains__c             C   s(   yt | |S  tk
r"   dS X dS )z,
        Find specific content-type
        N)nextfindallStopIteration)r%   rJ   r&   r&   r'   find   s    zManifest.findc             c   s$   x| j D ]}|j|kr|V  qW dS )z>
        Find all elements of a specific content-type
        N)r-   r$   )r%   rJ   rC   r&   r&   r'   rM      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.   r$   N)r-   r:   Z	mime_typerD   )r%   objZctr&   r&   r'   rD      s    zManifest.appendc             C   s>   |  | | | | j| d || jt|   dS )z/
        Write manifest to the archive
        )r7   N)rD   
_write_vba_register_mimetypesZnamelistZwritestrr:   r    rF   )r%   archiveworkbookr&   r&   r'   _write   s    

zManifest._writec             C   sP   xJ|D ]B}t j|d }|s qtj| }t|dd |}| j| qW dS )zT
        Make sure that the mime type for all file extensions is registered
        r8   r<   N)r9   r:   r;   r=   r>   r!   r"   rD   )r%   r7   fnr?   rH   Zfer&   r&   r'   rR      s    

zManifest._register_mimetypesc             C   sb   |j r^t|j t}t|}| j}x6|jD ],}|jt	t
tfkrDq.|j|kr.| j| q.W dS )zI
        Add content types from cached workbook when keeping VBA
        N)Zvba_archiver   readr   r0   Z	from_treer7   r-   r.   r   r   r   rD   )r%   rT   ZnodeZmfr7   overrider&   r&   r'   rQ      s    

zManifest._write_vba)r&   r&   )r)   r*   r+   r,   r   r!   r"   r-   r:   Z__elements__r(   propertyr7   rB   rF   rK   rO   rM   rD   rU   rR   rQ   __classcell__r&   r&   )rI   r'   r0   Y   s"    


	
		
r0   )/Z
__future__r   r=   os.pathr9   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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    ZinitedZinitZadd_typer!   r-   r2   r3   r0   r&   r&   r&   r'   <module>   s.   l