U
    c2                     @   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 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Z/G dXd dZ0ej1G dYd dej2Z3eG dZd dZ4d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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.   r1   r2   r3   r5   )	r   r,   r-   r.   listr1   r2   r3   r5   )selfr8    r;   D/tmp/pip-unpacked-wheel-0kb_yl26/pyhanko/pdf_utils/metadata/model.py	view_overn   s    




zDocumentMetadata.view_over)__name__
__module____qualname____doc__r,   r   __annotations__r-   r.   r   r9   r1   r   strr2   r3   r
   r   r5   r6   r7   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/# )rF   endswithrG   )r:   rF   sepr;   r;   r<   __str__   s    zExpandedName.__str__c                 C   s   t | S N)rC   r:   r;   r;   r<   __repr__   s    zExpandedName.__repr__N)r>   r?   r@   rA   rC   rB   rM   rP   r;   r;   r;   r<   r   z   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xrQ   langrF   rG   rR   ZRDFSeqBagAltlivalueresourceZaboutZ	parseTypeDescriptionrV   ZxmpmetaZxmptkrT   r,   r2   descriptionrU   r1   ZProducerrS   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 rN   )ra   r   
isinstancer]   rC   	TypeErrorrb   KeyError)r:   rc   rW   r;   r;   r<   __init__  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>1  s      z!Qualifiers.of.<locals>.<dictcomp>)r   clsri   r;   r;   r<   of'  s    
zQualifiers.of)rW   rj   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   rb   )rq   rW   rc   r;   r;   r<   lang_as_qual3  s    zQualifiers.lang_as_qualc                 C   s
   | j | S rN   )ra   r:   itemr;   r;   r<   __getitem__C  s    zQualifiers.__getitem__T)	with_langrj   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)ra   itemsrb   r   r   )r:   rw   r;   r;   r<   
iter_qualsF  s    	zQualifiers.iter_qualsrj   c                 C   s   | j S )z:
        Retrieve the language qualifier, if any.
        )rb   rO   r;   r;   r<   rW   S  s    zQualifiers.langc                 C   s
   t | jS )zA
        Check if there are any non-language qualifiers.
        )rD   ra   rO   r;   r;   r<   has_non_lang_qualsZ  s    zQualifiers.has_non_lang_qualsc                 C   s   t | jp| jS rN   )rD   ra   rb   rO   r;   r;   r<   __bool__a  s    zQualifiers.__bool__c                 C   s&   t | j}| jr| j|d< d|dS )NrW   zQualifiers())dictra   rb   )r:   qr;   r;   r<   rP   d  s    

zQualifiers.__repr__c                 C   s"   t |to | j|jko | j|jkS rN   )rd   r   rb   ra   r:   otherr;   r;   r<   __eq__j  s
    


zQualifiers.__eq__N)T)r>   r?   r@   rA   r   r   rB   r   rC   rg   classmethodr	   rr   rs   rv   rD   r   ry   propertyrW   r{   r|   rP   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 rN   )r]   rO   r;   r;   r<   rM   x  s    zXmpUri.__str__N)r>   r?   r@   rA   rC   rB   rM   r;   r;   r;   r<   r   p  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]   r/   
qualifiersN)r>   r?   r@   rA   r
   r   rC   rB   r   r   rr   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 rN   _fields)r:   r   r;   r;   r<   rg     s    zXmpStructure.__init__rh   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;   rk   r;   r;   r<   ro     s      z#XmpStructure.of.<locals>.<dictcomp>r;   rp   r;   r;   r<   rr     s    
zXmpStructure.ofc                 C   s
   | j | S rN   r   rt   r;   r;   r<   rv     s    zXmpStructure.__getitem__rz   c                 c   s   | j  E d H  d S rN   )r   rx   rO   r;   r;   r<   __iter__  s    zXmpStructure.__iter__c                 C   s   d| j dS )NzXmpStructure(r}   r   rO   r;   r;   r<   rP     s    zXmpStructure.__repr__c                 C   s   t |to| j|jkS rN   )rd   r   r   r   r;   r;   r<   r     s    

zXmpStructure.__eq__N)r>   r?   r@   rA   r   r   rg   r   r	   rr   rv   r   r   rP   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.
    rY   rZ   r[   rz   c                 C   s   t td t| jdS )z1
        Render the type as an XML name.
        rR   rX   )r   r   rC   r]   rO   r;   r;   r<   as_rdf  s    zXmpArrayType.as_rdfN)	r>   r?   r@   rA   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entriesrh   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   r9   rp   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   r9   rp   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   r9   rp   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 rN   r   rl   erO   r;   r<   	<genexpr>
  s     z"XmpArray.__eq__.<locals>.<genexpr>c                 3   s   | ]}| j kV  qd S rN   r   r   )r   r;   r<   r     s     )rd   r   r   r   r   allr   r   r;   )r   r:   r<   r     s    

zXmpArray.__eq__N)r>   r?   r@   rA   r   rB   r   r   r   r   r   r   r   r   r;   r;   r;   r<   r     s   
)5rA   enumZdataclassesr   r   r   typingr   r   r   r   r	   r
   Zpyhankor   Zpyhanko.pdf_utils.miscr   __all__r   rC   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`(