o
    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      || _ || _d S N)	ExtensionContentType)selfr%   r&    r(   Z/var/www/secure340b-portal/env/lib/python3.10/site-packages/openpyxl/packaging/manifest.py__init__9      
zFileExtension.__init__N)__name__
__module____qualname__tagnamer   r%   r&   r*   r(   r(   r(   r)   r!   2   
    r!   c                   @   s$   e Zd Zd Ze Ze Zdd ZdS )Overridec                 C   r#   r$   PartNamer&   )r'   r3   r&   r(   r(   r)   r*   E   r+   zOverride.__init__N)r,   r-   r.   r/   r   r3   r&   r*   r(   r(   r(   r)   r1   >   r0   r1   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"   r1   r(   c                 C   s    |st }|| _|st}|| _d S r$   )DEFAULT_TYPESr"   DEFAULT_OVERRIDEr1   )r'   r"   r1   r(   r(   r)   r*   a   s   
zManifest.__init__c                 C   s   dd | j D S )Nc                 S      g | ]}|j qS r(   )r3   .0partr(   r(   r)   
<listcomp>o       z&Manifest.filenames.<locals>.<listcomp>)r1   )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splitextr3   r<   r(   r(   r)   	<setcomp>x   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?   y   s   * z'Manifest.extensions.<locals>.<listcomp>)r1   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   r;   r(   )r%   )r=   tr(   r(   r)   r?      r@   z$Manifest.to_tree.<locals>.<listcomp>xmlns)	r"   rM   r!   appendsuperr6   to_treesetr   )r'   defaultsrJ   mimetree	__class__r(   r)   rR   |   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r1   r&   r'   content_typerN   r(   r(   r)   __contains__   s
   

zManifest.__contains__c                 C   s&   zt | |W S  ty   Y dS w )z,
        Find specific content-type
        N)nextfindallStopIteration)r'   r[   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
        NrY   rZ   r(   r(   r)   r^      s   

zManifest.findallc                 C   s    t |j|jd}| j | dS )zZ
        Add content object to the package manifest
        # needs a contract...
        r2   N)r1   rD   Z	mime_typerP   )r'   objctr(   r(   r)   rP      s   zManifest.appendc                 C   s>   |  | | | | j| d || jt|   dS )z/
        Write manifest to the archive
        )rA   N)rP   
_write_vba_register_mimetypesnamelistwritestrrD   r    rR   )r'   archiveworkbookr(   r(   r)   _write   s   

zManifest._writec                 C   sP   |D ]#}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
        rB   TrG   N)rC   rD   rE   rH   rI   r!   r"   rP   )r'   rA   fnrJ   rU   Zfer(   r(   r)   rd      s   zManifest._register_mimetypesc                 C   sb   |j r-t|j t}t|}| j}|jD ]}|jt	t
tfvr!q|j|vr,| j| qdS dS )zI
        Add content types from cached workbook when keeping VBA
        N)Zvba_archiver   readr   r6   Z	from_treerA   r1   r3   r   r   r   rP   )r'   rh   nodemfrA   overrider(   r(   r)   rc      s   


zManifest._write_vba)r(   r(   )r,   r-   r.   r/   r   r!   r"   r1   rD   Z__elements__r*   propertyrA   rM   rR   r\   r`   r^   rP   ri   rd   rc   __classcell__r(   r(   rW   r)   r6   W   s*    


		
		
r6   )-__doc__rH   r   os.pathrC   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!   r1   r9   r:   r6   r(   r(   r(   r)   <module>   s2   l