o
    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      || _ || _d S N)	ExtensionContentType)selfr   r    r   U/var/www/html/api-tag/env/lib/python3.10/site-packages/openpyxl/packaging/manifest.py__init__)      
zFileExtension.__init__N)__name__
__module____qualname__tagnamer   r   r   r   r   r   r   r   r   "   
    r   c                   @   s$   e Zd Zd Ze Ze Zdd ZdS )Overridec                 C   r   r   PartNamer   )r   r#   r   r   r   r   r   5   r   zOverride.__init__N)r   r   r   r   r   r#   r   r   r   r   r   r   r!   .   r    r!   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 )Manifest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      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   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   r1   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 ]\}}||vrt||}| j | qt  }|dt |S )zR
        Custom serialisation method to allow setting a default namespace
        c                 S   r-   r   )r   )r/   tr   r   r   r1   p   r2   z$Manifest.to_tree.<locals>.<listcomp>xmlns)r   r?   r   appendsuperto_treesetr   )r   defaultsr<   mimetree	__class__r   r   rD   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 w )z,
        Find specific content-type
        N)nextfindallStopIteration)r   rM   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
        NrK   rL   r   r   r   rP      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!   r6   	mime_typerB   )r   objctr   r   r   rB      s   zManifest.appendc                 C   s>   |  | | | | j| d || jt|   dS )z/
        Write manifest to the archive
        )r3   N)rB   
_write_vba_register_mimetypesnamelistwritestrr6   r   rD   )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
        r4   Tr9   N)r5   r6   r7   r:   r;   r   r   rB   )r   r3   fnr<   rG   fer   r   r   rW      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)vba_archiver   readr   r'   	from_treer3   r!   r#   r   r   r   rB   )r   r[   nodemfr3   overrider   r   r   rV      s   


zManifest._write_vba)r   r   )r   r   r   r   r   r   r   r!   r6   __elements__r   propertyr3   r?   rD   rN   rR   rP   rB   r\   rW   rV   __classcell__r   r   rI   r   r'   G   s*    


		
		
r'   )__doc__r:   r   os.pathr5   !openpyxl.descriptors.serialisabler   openpyxl.descriptorsr   r   openpyxl.xml.functionsr   openpyxl.xml.constantsr   r   r	   r
   r   r   r   r   r   r   add_typer   r!   r+   r,   r'   r   r   r   r   <module>   s2   ,