o
    vh 3                     @   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 g d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ddddd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 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 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- d/dZ'	 eed- d0dZ(	 eed1 d2dZ)	 eed1 d3dZ*	 eed4 d5dZ+	 eed4 d6dZ,	 eed4 d7dZ-	 G d8d9 d9Z.eddG d:d; d;Z/eG d<d= d=Z0G d>d? d?Z1ej2G d@dA dAej3Z4eG dBdC dCZ5dS )Dz
.. 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)StringWithLanguage)__version__)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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p|j| jp!|j| jdS )N)r-   r.   r/   r2   r3   r4   r6   )	r   r-   r.   r/   listr2   r3   r4   r6   )selfr9    r<   ^/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/pyhanko/pdf_utils/metadata/model.py	view_over   s   




zDocumentMetadata.view_over)r9   r   )__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*   
 r   T)frozenc                   @   s6   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   
 r   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pdfpdfaidpdfuaid
pdfaSchemapdfaExtensionpdfaPropertyxrR   langrG   rH   rS   RDFSeqBagAltlivalueresourceabout	parseTypeDescriptionr\   xmpmetaxmptkrU   r-   r3   descriptionrV   r2   ProducerrT   CreatorTool
CreateDate
ModifyDatec                   @   s   e Zd ZU dZeedf ed< ee ed< deedf fddZ	e
deedf d	d fd
dZe
dee d	d fddZdd Z	d ded	eeedf  fddZed	ee fddZed	ef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   sN   || _ z|t }|t= t|jtst|j| _W d S  ty&   d | _Y d S w rO   )rp   r   
isinstancerd   rD   	TypeErrorrq   KeyError)r;   rr   r]   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      i | ]\}}||qS r<   r<   .0kvr<   r<   r=   
<dictcomp>E      z!Qualifiers.of.<locals>.<dictcomp>)r   clsrw   r<   r<   r=   of;     
zQualifiers.ofr]   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   rq   )r   r]   rr   r<   r<   r=   lang_as_qualG  s   zQualifiers.lang_as_qualc                 C   
   | j | S rO   )rp   r;   itemr<   r<   r=   __getitem__W     
zQualifiers.__getitem__T	with_langc                 c   s<    | j  E dH  |r| jdurtt| jfV  dS dS dS )z
        Iterate over all qualifiers.

        :param with_lang:
            Include the language qualifier.
        :return:
        N)rp   itemsrq   r   r   )r;   r   r<   r<   r=   
iter_qualsZ  s
   
zQualifiers.iter_qualsc                 C      | j S )z:
        Retrieve the language qualifier, if any.
        )rq   rP   r<   r<   r=   r]   h  s   zQualifiers.langc                 C   s
   t | jS )zA
        Check if there are any non-language qualifiers.
        )rE   rp   rP   r<   r<   r=   has_non_lang_qualso  s   
zQualifiers.has_non_lang_qualsc                 C   s   t | jp| jS rO   )rE   rp   rq   rP   r<   r<   r=   __bool__v  s   zQualifiers.__bool__c                 C   s&   t | j}| jr| j|d< d|dS )Nr]   zQualifiers())dictrp   rq   )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   )rs   r   rq   rp   r;   otherr<   r<   r=   __eq__  s
   


zQualifiers.__eq__N)T)r?   r@   rA   rB   r   r   rC   r	   rD   rv   classmethodr
   r   r   r   rE   r   r   propertyr]   r   r   rQ   r   r<   r<   r<   r=   r   $  s.   
 
r   c                   @   s"   e Zd ZU dZeed< dd ZdS )XmpUriz
    An XMP URI value.
    rd   c                 C   r   rO   )rd   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   rd   r0   
qualifiersN)r?   r@   rA   rB   r   r   rD   rC   r   r   r   r   r<   r<   r<   r=   r     s   
 r   c                   @   sv   e Zd ZdZdeedf fddZedeedf dd fdd	Z	d
d Z
deeedf  f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.
    fieldsr   c                 C   s
   || _ d S rO   _fields)r;   r   r<   r<   r=   rv     r   zXmpStructure.__init__rw   rx   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   ry   r<   r<   rz   r<   r<   r=   r~     r   z#XmpStructure.of.<locals>.<dictcomp>r<   r   r<   r<   r=   r     r   zXmpStructure.ofc                 C   r   rO   r   r   r<   r<   r=   r     r   zXmpStructure.__getitem__c                 c   s    | j  E d H  d S rO   )r   r   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   )rs   r   r   r   r<   r<   r=   r     s   zXmpStructure.__eq__N)r?   r@   rA   rB   r   r   rv   r   r
   r   r   r   r   rQ   r   r<   r<   r<   r=   r     s    
r   c                   @   s0   e Zd ZdZdZ	 dZ	 dZ	 defddZdS )	r   z
    XMP array types.
    r`   ra   rb   rx   c                 C   s   t td t| jdS )z1
        Render the type as an XML name.
        rS   r^   )r   r   rD   rd   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    r   c                   @   s   e Zd ZU dZeed< 	 ee ed< 	 ede	e dd fddZ
ede	e dd fdd	Zede	e dd fd
dZdd ZdS )r   z
    An XMP array.
    
array_typeentriesrw   rx   c                 C      | 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:   r   r<   r<   r=   ordered     
zXmpArray.orderedc                 C   r   )z
        Convert a list to an unordered XMP array.

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

        :param lst:
            An iterable of XMP values.
        :return:
            An alternative :class:`.XmpArray`.
        )r   r   r:   r   r<   r<   r=   alternative  r   zXmpArray.alternativec                    sb   t  trj jkrdS jtjkr+tfdd jD o*t fddjD S j jkS )NFc                 3       | ]}| j v V  qd S rO   r   r{   erP   r<   r=   	<genexpr>"  s    z"XmpArray.__eq__.<locals>.<genexpr>c                 3   r   rO   r   r   )r   r<   r=   r   "  s    

)rs   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   
 r   )6rB   enumdataclassesr   r   r   typingr   r   r   r   r	   r
   r   pyhanko.pdf_utils.miscr   pyhanko.versionr   __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'