o
    ˷e                     @   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(   R/var/www/ideatree/venv/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   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"   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)   rA   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)   rA      rB   z$Manifest.to_tree.<locals>.<listcomp>xmlns)	r"   rO   r!   appendsuperr7   to_treesetr   )r'   defaultsrL   mimetree	__class__r(   r)   rT   |   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_typerP   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
        Nr[   r\   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   rF   	mime_typerR   )r'   objctr(   r(   r)   rR      s   zManifest.appendc                 C   s>   |  | | | | j| d || jt|   dS )z/
        Write manifest to the archive
        )rC   N)rR   
_write_vba_register_mimetypesnamelistwritestrrF   r    rT   )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
        rD   TrI   N)rE   rF   rG   rJ   rK   r!   r"   rR   )r'   rC   fnrL   rW   fer(   r(   r)   rg      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   r7   	from_treerC   r1   r3   r   r   r   rR   )r'   rk   nodemfrC   overrider(   r(   r)   rf      s   


zManifest._write_vba)r(   r(   )r,   r-   r.   r/   r   r!   r"   r1   rF   __elements__r*   propertyrC   rO   rT   r^   rb   r`   rR   rl   rg   rf   __classcell__r(   r(   rY   r)   r7   W   s*    


		
		
r7   )-__doc__rJ   r   os.pathrE   !openpyxl.descriptors.serialisabler   openpyxl.descriptorsr   r   openpyxl.xml.functionsr   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   r;   r<   r7   r(   r(   r(   r)   <module>   s2   l