a
    Cg                     @   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   Z/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/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)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>_       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   r,   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   r,   z'Manifest.extensions.<locals>.<listcomp>)r   sorted)r   extsr   r   r   
extensionsb   s    zManifest.extensionsc                    sX   dd | j D }| jD ]&\}}||vrt||}| j | q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   r,   z$Manifest.to_tree.<locals>.<listcomp>xmlns)r   r9   r   appendsuperto_treesetr   )r   defaultsr6   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_typer:   r   r   r   __contains__z   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   rG   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
        NrE   rF   r   r   r   rJ      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   r0   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writestrr0   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.   Tr3   N)r/   r0   r1   r4   r5   r   r   r<   )r   r-   fnr6   rA   Zfer   r   r   rP      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   r#   Z	from_treer-   r   r    r   r   r   r<   )r   rT   nodeZmfr-   overrider   r   r   rO      s    


zManifest._write_vba)r   r   )r   r   r   r   r   r   r   r   r0   Z__elements__r   propertyr-   r9   r>   rH   rL   rJ   r<   rU   rP   rO   __classcell__r   r   rC   r   r#   G   s(     


		
		
r#   )__doc__r4   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   ,