U
    wh                     @   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   c/var/www/dating/data/www/fatepal.com/env/lib/python3.8/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>_   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                    sX   dd | j D }| jD ]&\}}||k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   s     z$Manifest.to_tree.<locals>.<listcomp>Zxmlns)r   r8   r   appendsuperto_treesetr   )r   defaultsr5   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_typer9   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-   Tr2   N)r.   r/   r0   r3   r4   r   r   r:   )r   r,   fnr5   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   node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,   r8   r<   rF   rJ   rH   r:   rS   rN   rM   __classcell__r   r   rA   r   r#   G   s(     


		
		
r#   )__doc__r3   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   ,