U
    g2                     @   s  d Z ddl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 ddlmZ ddlmZ dd	d
dddddddddddddddddddddd d!d"d#d$d%d&gZd'e Zeeedf ZeG d(d dZed)d*G d+d dZd,d-d.d/d0d1d2d3d4d5d6d7Zeed8 d9d:Zeed; d<d:Zeed; d=d:Zeed; d>d:Zeed; d?d:Zeed; d@d:Zeed; dAd:Zeed; dBd:Z eed; dCd:Z!eed; dDd:Z"eed; dEd:Z#eedF dGd:Z$eedF dHd:Z%eedI dJd:Z&eedI dKd:Z'eedI dLd:Z(eedM dNd:Z)eedM dOd:Z*eedP dQd:Z+eedP dRd:Z,eedP dSd:Z-G dTd dZ.ed)d*G dUdV dVZ/eG dWd dZ0G dXd dZ1ej2G dYd dej3Z4eG dZd dZ5dS )[z
.. versionadded:: 0.14.0

This module contains the XMP data model classes and namespace registry,
in addition to a simplified document metadata model used for automated
metadata management.
    N)	dataclassfield)datetime)DictIterableIteratorListOptionalTupleUnion)__version__)StringWithLanguageDocumentMetadataVENDOR
MetaStringExpandedName
QualifiersXmpValueXmpStructureXmpArrayTypeXmpArrayNSXML_LANGRDF_RDFRDF_SEQRDF_BAGRDF_ALTRDF_LI	RDF_VALUERDF_RESOURCERDF_PARSE_TYPE	RDF_ABOUTRDF_DESCRIPTIONDC_TITLE
DC_CREATORDC_DESCRIPTIONPDF_PRODUCERPDF_KEYWORDS	X_XMPMETAX_XMPTKXMP_CREATORTOOLXMP_CREATEDATEXMP_MODDATEzpyHanko c                   @   s   e Zd ZU dZdZeed< dZeed< dZeed< e	e
dZee ed< dZeed< dZeeedf ed	< d
Zeeedf ed< e	e
dZed ed< dZeed< d dddZdS )r   zO
    Simple representation of document metadata. All entries are optional.
    Ntitleauthorsubjectdefault_factorykeywordscreatorcreatednowlast_modifiedr   	xmp_extraFxmp_unmanaged)basec              	   C   sL   t | jp|j| jp|j| jp |jt| jp,|j| jp8|j| jpB|j| jdS )N)r-   r.   r/   r2   r3   r4   r6   )	r   r-   r.   r/   listr2   r3   r4   r6   )selfr9    r<   D/tmp/pip-unpacked-wheel-owvgwkas/pyhanko/pdf_utils/metadata/model.py	view_over   s    




zDocumentMetadata.view_over)__name__
__module____qualname____doc__r-   r   __annotations__r.   r/   r   r:   r2   r   strr3   r4   r   r   r6   r7   r8   boolr>   r<   r<   r<   r=   r   >   s   
	T)frozenc                   @   s2   e Zd ZU dZeed< eed< dd Zdd ZdS )	r   z
    An expanded XML name.
    ns
local_namec                 C   s4   | j }|ds|drdnd}| | | j S )N/# )rG   endswithrH   )r;   rG   sepr<   r<   r=   __str__   s    zExpandedName.__str__c                 C   s   t | S N)rD   r;   r<   r<   r=   __repr__   s    zExpandedName.__repr__N)r?   r@   rA   rB   rD   rC   rN   rQ   r<   r<   r<   r=   r      s
   
z$http://www.w3.org/XML/1998/namespacez+http://www.w3.org/1999/02/22-rdf-syntax-ns#zhttp://ns.adobe.com/xap/1.0/z http://purl.org/dc/elements/1.1/zhttp://ns.adobe.com/pdf/1.3/zhttp://www.aiim.org/pdfa/ns/id/z http://www.aiim.org/pdfua/ns/id/z#http://www.aiim.org/pdfa/ns/schema#z&http://www.aiim.org/pdfa/ns/extension/z%http://www.aiim.org/pdfa/ns/property#zadobe:ns:meta/)xmlrdfxmpdcpdfZpdfaidZpdfuaidZ
pdfaSchemaZpdfaExtensionZpdfaPropertyxrR   langrG   rH   rS   ZRDFSeqBagAltlivalueresourceZaboutZ	parseTypeDescriptionrW   ZxmpmetaZxmptkrU   r-   r3   descriptionrV   r2   ZProducerrT   ZCreatorToolZ
CreateDateZ
ModifyDatec                   @   s   e Zd ZU dZeedf ed< ee ed< eedf dddZ	e
eedf d dd	d
Ze
ee d dddZdd Zd eeeedf  dddZeee dddZeedddZdd Zdd Zdd ZdS )!r   z
    XMP value qualifiers wrapper. Implements ``__getitem__``.
    Note that ``xml:lang`` gets special treatment.

    :param quals:
        The qualifiers to model.
    r   _quals_lang)qualsc                 C   sP   || _ z*|t }|t= t|jts&t|j| _W n tk
rJ   d | _Y nX d S rO   )rb   r   
isinstancer^   rD   	TypeErrorrc   KeyError)r;   rd   rX   r<   r<   r=   __init__0  s    zQualifiers.__init__lstreturnc                 G   s   t dd |D S )z
        Construct a :class:`.Qualifiers` object from a list of name-value pairs.

        :param lst:
            A list of name-value pairs.
        :return:
            A :class:`.Qualifiers` object.
        c                 S   s   i | ]\}}||qS r<   r<   .0kvr<   r<   r=   
<dictcomp>E  s      z!Qualifiers.of.<locals>.<dictcomp>)r   clsrj   r<   r<   r=   of;  s    
zQualifiers.of)rX   rk   c                 C   s   t i }|r||_|S )z
        Construct a :class:`.Qualifiers` object that only wraps a language
        qualifier.

        :param lang:
            A language code.
        :return:
            A :class:`.Qualifiers` object.
        )r   rc   )rr   rX   rd   r<   r<   r=   lang_as_qualG  s    zQualifiers.lang_as_qualc                 C   s
   | j | S rO   )rb   r;   itemr<   r<   r=   __getitem__W  s    zQualifiers.__getitem__T)	with_langrk   c                 c   s2   | j  E dH  |r.| jdk	r.tt| jfV  dS )z
        Iterate over all qualifiers.

        :param with_lang:
            Include the language qualifier.
        :return:
        N)rb   itemsrc   r   r   )r;   rx   r<   r<   r=   
iter_qualsZ  s    
zQualifiers.iter_qualsrk   c                 C   s   | j S )z:
        Retrieve the language qualifier, if any.
        )rc   rP   r<   r<   r=   rX   h  s    zQualifiers.langc                 C   s
   t | jS )zA
        Check if there are any non-language qualifiers.
        )rE   rb   rP   r<   r<   r=   has_non_lang_qualso  s    zQualifiers.has_non_lang_qualsc                 C   s   t | jp| jS rO   )rE   rb   rc   rP   r<   r<   r=   __bool__v  s    zQualifiers.__bool__c                 C   s&   t | j}| jr| j|d< d|dS )NrX   zQualifiers())dictrb   rc   )r;   qr<   r<   r=   rQ   y  s    

zQualifiers.__repr__c                 C   s"   t |to | j|jko | j|jkS rO   )re   r   rc   rb   r;   otherr<   r<   r=   __eq__  s
    


zQualifiers.__eq__N)T)r?   r@   rA   rB   r   r   rC   r	   rD   rh   classmethodr
   rs   rt   rw   rE   r   rz   propertyrX   r|   r}   rQ   r   r<   r<   r<   r=   r   $  s*   
 c                   @   s"   e Zd ZU dZeed< dd ZdS )XmpUriz
    An XMP URI value.
    r^   c                 C   s   | j S rO   )r^   rP   r<   r<   r=   rN     s    zXmpUri.__str__N)r?   r@   rA   rB   rD   rC   rN   r<   r<   r<   r=   r     s   
r   c                   @   s:   e Zd ZU dZeddeef ed< ee	j
dZe	ed< dS )r   z;
    A general XMP value, potentially with qualifiers.
    r   r   r^   r0   
qualifiersN)r?   r@   rA   rB   r   r   rD   rC   r   r   rs   r   r<   r<   r<   r=   r     s   
c                   @   st   e Zd ZdZeedf dddZeeedf d dddZ	d	d
 Z
eeedf  dddZdd Zdd ZdS )r   z
    A generic XMP structure value. Implements ``__getitem__`` for field access.

    :param fields:
        The structure's fields.
    r   )fieldsc                 C   s
   || _ d S rO   _fields)r;   r   r<   r<   r=   rh     s    zXmpStructure.__init__ri   c                 G   s   | dd |D S )z
        Construct an :class:`.XmpStructure` from a list of name-value pairs.

        :param lst:
            A list of name-value pairs.
        :return:
            An an :class:`.XmpStructure`.
        c                 S   s   i | ]\}}||qS r<   r<   rl   r<   r<   r=   rp     s      z#XmpStructure.of.<locals>.<dictcomp>r<   rq   r<   r<   r=   rs     s    
zXmpStructure.ofc                 C   s
   | j | S rO   r   ru   r<   r<   r=   rw     s    zXmpStructure.__getitem__r{   c                 c   s   | j  E d H  d S rO   )r   ry   rP   r<   r<   r=   __iter__  s    zXmpStructure.__iter__c                 C   s   d| j dS )NzXmpStructure(r~   r   rP   r<   r<   r=   rQ     s    zXmpStructure.__repr__c                 C   s   t |to| j|jkS rO   )re   r   r   r   r<   r<   r=   r     s    zXmpStructure.__eq__N)r?   r@   rA   rB   r   r   rh   r   r
   rs   rw   r   r   rQ   r   r<   r<   r<   r=   r     s   
c                   @   s*   e Zd ZdZdZdZdZedddZdS )	r   z
    XMP array types.
    rZ   r[   r\   r{   c                 C   s   t td t| jdS )z1
        Render the type as an XML name.
        rS   rY   )r   r   rD   r^   rP   r<   r<   r=   as_rdf  s    zXmpArrayType.as_rdfN)	r?   r@   rA   rB   ORDERED	UNORDEREDALTERNATIVEr   r   r<   r<   r<   r=   r     s
   c                   @   sv   e Zd ZU dZeed< ee ed< ee	e d dddZ
ee	e d dddZee	e d dd	d
Zdd ZdS )r   z
    An XMP array.
    
array_typeentriesri   c                 C   s   | t jt|S )z
        Convert a list to an ordered XMP array.

        :param lst:
            An iterable of XMP values.
        :return:
            An ordered :class:`.XmpArray`.
        )r   r   r:   rq   r<   r<   r=   ordered  s    
zXmpArray.orderedc                 C   s   | t jt|S )z
        Convert a list to an unordered XMP array.

        :param lst:
            An iterable of XMP values.
        :return:
            An unordered :class:`.XmpArray`.
        )r   r   r:   rq   r<   r<   r=   	unordered  s    
zXmpArray.unorderedc                 C   s   | t jt|S )z
        Convert a list to an alternative XMP array.

        :param lst:
            An iterable of XMP values.
        :return:
            An alternative :class:`.XmpArray`.
        )r   r   r:   rq   r<   r<   r=   alternative  s    
zXmpArray.alternativec                    sf   t  trj jkrdS jtjkrVtfdd jD oTt fddjD S j jkS d S )NFc                 3   s   | ]}| j kV  qd S rO   r   rm   erP   r<   r=   	<genexpr>"  s     z"XmpArray.__eq__.<locals>.<genexpr>c                 3   s   | ]}| j kV  qd S rO   r   r   )r   r<   r=   r   "  s    )re   r   r   r   r   allr   r   r<   )r   r;   r=   r     s    
$zXmpArray.__eq__N)r?   r@   rA   rB   r   rC   r   r   r   r   r   r   r   r   r<   r<   r<   r=   r     s   
)6rB   enumZdataclassesr   r   r   typingr   r   r   r   r	   r
   r   Zpyhankor   Zpyhanko.pdf_utils.miscr   __all__r   rD   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,   r   r   r   r   uniqueEnumr   r   r<   r<   r<   r=   <module>   s   $"Oc'