U
    ߦwh=                  	   @   s  d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZ ddlm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 dZdZdZ dZ!dZ"dZ#dZ$e%dej&Z'edZ(e(e(dddZ)e*ejdddZ+e)fede*eegef e
e	e*  dddZ,e*e*edge
e	e*  f ddd Z-e)fe*e*eegef edge
e	e  f d!d"d#Z.e*e*edge
eeef  f dd$d%Z/e)fe*e*ee*gef edge
e f d!d&d'Z0G d(d deeZ1dS ))z~
Anything related to Extensible Metadata Platform (XMP) metadata.

https://en.wikipedia.org/wiki/Extensible_Metadata_Platform
    N)AnyCallableDictIteratorListOptionalTypeVarUnion)DocumentparseString)Element)
ExpatError   )XmpInformationProtocol)
StreamTypedeprecate_no_replacement)PdfReadError)ContentStream	PdfObjectz+http://www.w3.org/1999/02/22-rdf-syntax-ns#z http://purl.org/dc/elements/1.1/zhttp://ns.adobe.com/xap/1.0/zhttp://ns.adobe.com/pdf/1.3/zhttp://ns.adobe.com/xap/1.0/mm/zhttp://ns.adobe.com/pdfx/1.3/zhttp://www.aiim.org/pdfa/ns/id/a{  
        (?P<year>[0-9]{4})
        (-
            (?P<month>[0-9]{2})
            (-
                (?P<day>[0-9]+)
                (T
                    (?P<hour>[0-9]{2}):
                    (?P<minute>[0-9]{2})
                    (:(?P<second>[0-9]{2}(.[0-9]+)?))?
                    (?P<tzd>Z|[-+][0-9]{2}:[0-9]{2})
                )?
            )?
        )?
        K)valuereturnc                 C   s   | S N )r   r   r   -/tmp/pip-unpacked-wheel-r8zeli8p/pypdf/xmp.py	_identityQ   s    r   c              	   C   s(  t | }|d kr td|  t|d}t|dp<d}t|dpNd}t|dp`d}t|dprd}t|d	pd}|tj}|| d
 }	t|}
t|	}|dpd}t		||||||
|}|dkr$dd |
dD \}}|d9 }|dk r|d9 }|t	j||d }|S )NzInvalid date format: yearmonth1dayhour0minutesecondi@B tzdZc                 s   s   | ]}t |V  qd S r   )int).0xr   r   r   	<genexpr>h   s     z"_converter_date.<locals>.<genexpr>:r   )hoursminutes)iso8601match
ValueErrorr&   groupdecimalDecimalto_integralROUND_FLOORdatetimesplit	timedelta)r   matchesr   r   r   r    r"   r#   Zseconds_decZmilliseconds_decsecondsZmillisecondsr$   dtZ	tzd_hoursZtzd_minutesr   r   r   _converter_dateU   s,    


r<   XmpInformation)elementself	list_type	converterr   c           	      C   sX   |  t|}g }t|rT|D ]2}| tdD ] }||}||}|| q,q|S d S )Nli)getElementsByTagNameNSRDF_NAMESPACElen	_get_textappend)	r>   r?   r@   rA   Z
containersretval	containeritemr   r   r   r   _generic_getp   s    
rK   )	namespacenamer   c                    s"   dt tt  d fdd}|S )Nr=   r?   r   c                    s   | j i  }|r|S g }| d D ]:}t|| dd }d k	rT|| q.| |}|| q.| j i }|| < |S )N Bagr@   cachegetget_elementrK   extendrF   rG   
setdefault)r?   cachedrH   r>   bagsr   ns_cacherM   rL   r   r   rT      s    
z_getter_bag.<locals>.get)r   r   strrL   rM   rT   r   r[   r   _getter_bag   s    r^   )rL   rM   rA   r   c                    s$   dt tt  d fdd}|S )Nr=   rN   c                    s   | j i }|r|S g }| dD ]b}t|| d d }d k	rV|| q.t|| dd }d k	rx|| q. | |}|| q.| j i }||< |S )NrO   ZSeq)r@   rA   rP   rQ   rR   )r?   rX   rH   r>   ZseqsrY   r   rZ   rA   rM   rL   r   r   rT      s    z_getter_seq.<locals>.get)r   r   r   rL   rM   rA   rT   r   r_   r   _getter_seq   s     ra   c                    s&   dt tttf  d fdd}|S )Nr=   rN   c           	         s   | j i  }|r|S i }| d D ]\}|td}t|r||D ].}|tdD ]}| |}|||d< qZqJq.| ||d< q.| j i }|| < |S )NrO   ZAltrB   zxml:langz	x-default)	rS   rT   rU   rC   rD   rE   rF   getAttributerW   )	r?   rX   rH   r>   ZaltsZaltrJ   r   rZ   r[   r   r   rT      s    
z_getter_langalt.<locals>.get)r   r   r   r]   r   r[   r   _getter_langalt   s    "rc   c                    s    dt t d fdd}|S )Nr=   rN   c                    s   | j i }|r|S d }| dD ]&}|j|jkrF|j}n
| |} qVq.|d k	rf |}| j i }||< |S NrO   )rS   rT   rU   nodeTypeATTRIBUTE_NODE	nodeValuerF   rW   )r?   rX   r   r>   rZ   r_   r   r   rT      s    
z_getter_single.<locals>.get)r   r   r`   r   r_   r   _getter_single   s    rh   c                   @   s
  e Zd ZdZeddddZd/eedee	f ddddZ
eeeee d	d
dZeeee dddZeedddZeeedZeeedZeeedZeeedeZeeedZeeedZeeedZeeedZeeedZ eeedZ!eeedZ"eeedZ#eeedZ$eeedZ%eeed Z&eee'd!Z(eee'd"Z)eee'd#Z*eee+d$eZ,eee+d%eZ-eee+d&eZ.eee+d'Z/eee0d(Z1eee0d)Z2eee3d*Z4eee3d+Z5ee6eef d,d-d.Z7dS )0r=   z
    An object that represents Extensible Metadata Platform (XMP) metadata.
    Usually accessed by :py:attr:`xmp_metadata()<pypdf.PdfReader.xmp_metadata>`.

    Raises:
      PdfReadError: if XML is invalid

    N)streamr   c              
   C   sn   || _ z| j  }t|}W n4 ttfk
rP } ztd| W 5 d }~X Y nX |tdd | _i | _	d S )Nz#XML in XmpInformation was invalid: ZRDFr   )
ri   get_datar   AttributeErrorr   r   rC   rD   rdf_rootrS   )r?   ri   dataZdoc_rooter   r   r   __init__   s    
  zXmpInformation.__init__)ri   encryption_keyr   c                 C   s"   |d k	rt dd | j| d S )Nz/the encryption_key parameter of write_to_streamz5.0.0)r   ri   write_to_stream)r?   ri   rp   r   r   r   rq      s     zXmpInformation.write_to_stream)	about_urirL   rM   r   c                 c   sT   | j tdD ]@}|td|kr|||}|d k	r<|V  |||E d H  qd S NDescriptionZabout)rl   rC   rD   getAttributeNSZgetAttributeNodeNS)r?   rr   rL   rM   descattrr   r   r   rU      s    zXmpInformation.get_element)rr   rL   r   c                 c   sv   | j tdD ]b}|td|krt|jjD ]$}|j|}|r.|j|kr.|V  q.|j	D ]}|j|krZ|V  qZqd S rs   )
rl   rC   rD   ru   range
attributeslengthrJ   ZnamespaceURI
childNodes)r?   rr   rL   rv   irw   childr   r   r   get_nodes_in_namespace  s    

z%XmpInformation.get_nodes_in_namespace)r>   r   c                 C   s*   d}|j D ]}|j|jkr
||j7 }q
|S rd   )r{   re   Z	TEXT_NODErm   )r?   r>   textr}   r   r   r   rF     s
    
zXmpInformation._get_textZcontributorZcoverageZcreatordatedescriptionformat
identifierlanguageZ	publisherZrelationZrightssourcesubjecttitletypeZKeywordsZ
PDFVersionZProducerZ
CreateDateZ
ModifyDateZMetadataDateZCreatorToolZ
DocumentIDZ
InstanceIDpartZconformance)r   c                 C   s   t | dsi | _| dtD ]}|j}|d}|dkr:qx|d| tt||d |d  dd	 ||d d  }q&|j|j	kr|j
}n
| |}|| j|< q| jS )
z
        Retrieve custom metadata properties defined in the undocumented pdfx
        metadata schema.

        Returns:
            A dictionary of key/value items for custom metadata properties.

        _custom_propertiesrO   u   ↂr+   Nr         )base)hasattrr   r~   PDFX_NAMESPACEZ	localNamefindchrr&   re   rf   rg   rF   )r?   nodekeyidxr   r   r   r   custom_properties  s$    




z XmpInformation.custom_properties)N)8__name__
__module____qualname____doc__r   ro   r   r	   r\   bytesrq   r   r   rU   r~   
XmlElementrF   propertyr^   DC_NAMESPACEZdc_contributorrh   Zdc_coveragera   Z
dc_creatorr<   Zdc_daterc   Zdc_descriptionZ	dc_formatZdc_identifierZdc_languageZdc_publisherZdc_relationZ	dc_rightsZ	dc_sourceZ
dc_subjectZdc_titleZdc_typePDF_NAMESPACEZpdf_keywordsZpdf_pdfversionZpdf_producerXMP_NAMESPACEZxmp_create_dateZxmp_modify_dateZxmp_metadata_dateZxmp_creator_toolXMPMM_NAMESPACEZxmpmm_document_idZxmpmm_instance_idPDFAID_NAMESPACEZpdfaid_partZpdfaid_conformancer   r   r   r   r   r   r=      sZ   	  	
	
	
	)2r   r6   r2   retypingr   r   r   r   r   r   r   r	   Zxml.dom.minidomr
   r   r   r   xml.parsers.expatr   Z
_protocolsr   _utilsr   r   errorsr   Zgenericr   r   rD   r   r   r   r   r   r   compileVERBOSEr.   r   r   r\   r<   rK   r^   ra   rc   rh   r=   r   r   r   r   <module>   sp   (
   
      