a
    b                     @   sn  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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 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_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'   k/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/openpyxl/packaging/manifest.py__init__9   s    zFileExtension.__init__N)__name__
__module____qualname__tagnamer   r$   r%   r)   r'   r'   r'   r(   r!   2   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&   r0   r%   r'   r'   r(   r)   E   s    zOverride.__init__N)r*   r+   r,   r-   r   r0   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)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)   a   s    zManifest.__init__c                 C   s   dd | j D S )Nc                 S   s   g | ]
}|j qS r'   )r0   .0partr'   r'   r(   
<listcomp>o       z&Manifest.filenames.<locals>.<listcomp>)r.   )r&   r'   r'   r(   	filenamesm   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splitextr0   r8   r'   r'   r(   	<setcomp>x   r<   z&Manifest.extensions.<locals>.<setcomp>c                 S   s*   g | ]"}|r|d d t jd | fqS )   NT)	mimetypes	types_map)r9   extr'   r'   r(   r;   y   r<   z'Manifest.extensions.<locals>.<listcomp>)r.   sorted)r&   extsr'   r'   r(   
extensionsr   s    zManifest.extensionsc                    s\   dd | j D }| jD ]&\}}||v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$   )r9   tr'   r'   r(   r;      r<   z$Manifest.to_tree.<locals>.<listcomp>xmlns)	r"   rI   r!   appendsuperr3   to_treesetr   )r&   defaultsrF   mimetree	__class__r'   r(   rN   |   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_typerJ   r'   r'   r(   __contains__   s    

zManifest.__contains__c                 C   s*   zt | |W S  ty$   Y dS 0 dS )z,
        Find specific content-type
        N)nextfindallStopIteration)r&   rW   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
        NrU   rV   r'   r'   r(   rZ      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_typerL   )r&   objctr'   r'   r(   rL      s    zManifest.appendc                 C   s>   |  | | | | j| d || jt|   dS )z/
        Write manifest to the archive
        )r=   N)rL   
_write_vba_register_mimetypesnamelistwritestrr@   r    rN   )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>   TrC   N)r?   r@   rA   rD   rE   r!   r"   rL   )r&   r=   fnrF   rQ   Zfer'   r'   r(   r`      s    zManifest._register_mimetypesc                 C   s^   |j rZt|j t}t|}| j}|jD ],}|jt	t
tfvrBq,|j|vr,| j| q,dS )zI
        Add content types from cached workbook when keeping VBA
        N)Zvba_archiver   readr   r3   Z	from_treer=   r.   r0   r   r   r   rL   )r&   rd   nodeZmfr=   overrider'   r'   r(   r_      s    


zManifest._write_vba)r'   r'   )r*   r+   r,   r-   r   r!   r"   r.   r@   Z__elements__r)   propertyr=   rI   rN   rX   r\   rZ   rL   re   r`   r_   __classcell__r'   r'   rS   r(   r3   W   s(     


		
		
r3   )-__doc__rD   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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    add_typer!   r.   r6   r7   r3   r'   r'   r'   r(   <module>   s0   l