o
    miF                     @  s  d Z ddlmZ ddlZddl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 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m Z m!Z! ede"dZ#e	rjddlm$Z$m%Z%m&Z& ddgZ'G dd deZ(dZ)dZ*dZ+dZ,dZ-G dd de(Z.dS )zr
Turtle RDF graph serializer for RDFLib.
See <http://www.w3.org/TeamSubmission/turtle/> for syntax specification.
    )annotationsN)defaultdict)IOTYPE_CHECKINGAnyDefaultDictDictListMappingOptionalSequenceTupleTypeVarUnion)Error)Graph)RDFRDFS)
Serializer)BNodeLiteralNodeURIRef_StrT)bound)_PredicateType_SubjectType_TripleTypeRecursiveSerializerTurtleSerializerc                      s   e Zd ZU dZejgZejej	gZ
dZdZdZded< edZd; fd
dZd<ddZd=ddZd=ddZd>ddZd?ddZd@d"d#Zd?d$d%ZdAd'd(ZdBd+d,ZdCd-d.ZdDdEd2d3ZdFd5d6ZdGd9d:Z  Z S )Hr   z%Base class for recursive serializers.
   z   zTuple[Any, ...]roundtrip_prefixes%(?![0-9A-Fa-f]{2})storer   c                   s"   t t| | d | _|   d S N)superr   __init__streamresetselfr$   	__class__r!   [/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/serializers/turtle.pyr'   4   s   zRecursiveSerializer.__init__prefixstrurir   returnNonec                 C  s>   || j v r| j | |krtd||| j | f || j |< d S )NzJTrying to override namespace prefix %s => %s, but it's already bound to %s)
namespaces	Exception)r+   r/   r1   r!   r!   r.   addNamespace9   s   z RecursiveSerializer.addNamespacesubjectr   boolc                 C  sF   |  |s|| jvs|| jv r| jdkst|tr!| j| jkr!dS dS )z4Check to see if the subject should be serialized yet   FT)isDone	_subjects
_topLevelsdepth
isinstancer   maxDepthr+   r7   r!   r!   r.   checkSubjectA   s   
z RecursiveSerializer.checkSubjectc                 C  s
   || j v S )z$Return true if subject is serialized_serializedr@   r!   r!   r.   r:   L   s   
zRecursiveSerializer.isDoneList[_SubjectType]c                   s   i  g }j D ]#}tjtj|}|  || |D ]}dj|< d |< qq fddj	D }|  |dd |D  |S )NTc                   s*   g | ]}| vrt |tj| |fqS r!   )r>   r   _references).0r7   seenr+   r!   r.   
<listcomp>^   s
    z5RecursiveSerializer.orderSubjects.<locals>.<listcomp>c                 S  s   g | ]\}}}|qS r!   r!   )rF   Zisbnoderefsr7   r!   r!   r.   rI   e   s    )

topClasseslistr$   subjectsr   typesortextendr<   r;   )r+   rM   ZclassURImembersmemberZ
recursabler!   rG   r.   orderSubjectsP   s    



z!RecursiveSerializer.orderSubjectsc                 C  s    | j dD ]}| | qd S )NNNN)r$   triplespreprocessTriple)r+   tripler!   r!   r.   
preprocessi   s   zRecursiveSerializer.preprocessspor   c                 C  s*   |\}}}| j |  d7  < d| j|< d S )Nr9   T)rE   r;   )r+   rY   spor!   r!   r.   rV   m   s   
z$RecursiveSerializer.preprocessTriplec                 C  s   d| _ i | _i | _tt| _i | _i | _i | _| j	rGt
| j	dr7| j D ]\}}|| j	v r4| || q%d S | j D ]\}}| || q<d S d S )Nr   __iter__)r=   listsr4   r   intrE   rC   r;   r<   r"   hasattrr$   r6   )r+   r/   nsr!   r!   r.   r)   r   s$   

zRecursiveSerializer.reset#Mapping[_PredicateType, List[Node]]c                 C  sD   i }| j |ddfD ]\}}}||g }|| |||< q|S )zb
        Build a hash key by predicate to a list of objects for the given
        subject
        N)r$   rU   getappend)r+   r7   
propertiesrZ   r[   r\   ZoListr!   r!   r.   buildPredicateHash   s   

z&RecursiveSerializer.buildPredicateHashre   List[_PredicateType]c                 C  s   |  D ]\}}|  qg }i }| jD ]}||v r'||vr'|| d||< qt| }|  |D ]}||vrC|| d||< q4|S )zzTake a hash from predicate uris to lists of values.
        Sort the lists of values.  Return a sorted list of properties.T)itemsrO   predicateOrderrd   rL   keys)r+   re   propobjectspropListrH   propsr!   r!   r.   sortProperties   s"   



z"RecursiveSerializer.sortPropertiesc                 C  s   d| j |< dS )zMark a subject as done.TNrB   r@   r!   r!   r.   subjectDone   s   zRecursiveSerializer.subjectDoner   modifierr_   c                 C  s   | j | | j S )z-Returns indent string multiplied by the depth)r=   indentString)r+   rq   r!   r!   r.   indent   s   zRecursiveSerializer.indenttextc                 C  s   | j || jd dS )zWrite text in given encoding.replaceN)r(   writeencodeencoding)r+   rt   r!   r!   r.   rv      s   zRecursiveSerializer.writer   Union[_StrT, URIRef]c                 C  sN   | j }|d ur%||r%d||dvr%d||dvr%t||dd}|S )N# /r9   )base
startswithru   r   )r+   r1   r}   r!   r!   r.   
relativize   s   zRecursiveSerializer.relativizer$   r   )r/   r0   r1   r   r2   r3   r7   r   r2   r8   )r2   rD   r2   r3   )rY   r   r2   r3   )r7   r   r2   rb   )re   rb   r2   rg   )r7   r   r2   r3   )r   )rq   r_   r2   r0   )rt   r0   r2   r3   )r1   r   r2   ry   )!__name__
__module____qualname____doc__r   ClassrK   r   rN   labelri   r?   rr   r"   __annotations__recompile2LOCALNAME_PECRENT_CHARACTER_REQUIRING_ESCAPE_REGEXr'   r6   rA   r:   rS   rX   rV   r)   rf   ro   rp   rs   rv   r   __classcell__r!   r!   r,   r.   r   (   s0   
 










r9      Fc                      s  e Zd ZdZdZdZedZdR fddZ	dS fddZ
dT fddZ			dUdVddZdW fd!d"ZdXdYd(d)ZdXdYd*d+ZdTd,d-ZdTd.d/ZdZd2d3ZdZd4d5ZdZd6d7Zd[d\d=d>Zd[d]d?d@Zd^dAdBZd[d]dCdDZd_dFdGZd`dHdIZd[dadJdKZd[dbdLdMZdcdPdQZ  ZS )dr   zTurtle RDF graph serializer.turtlez    r#   r$   r   c                   s:   i | _ tt| | tjdi| _|   d | _t	| _
d S )Na)_ns_rewriter&   r   r'   r   rN   keywordsr)   r(   _SPACIOUS_OUTPUT	_spaciousr*   r,   r!   r.   r'      s   
zTurtleSerializer.__init__r/   r0   	namespacer   r2   c                   s   |dkr
|d dks| j |||kr6|| jvr/d| }|| j v r*d| }|| j v s!|| j|< | j||}tt| || |S )Nr{   r   _r[   )r4   rc   r   r&   r   r6   )r+   r/   r   r[   r,   r!   r.   r6      s   




zTurtleSerializer.addNamespacer3   c                   s$   t t|   i | _d| _i | _d S )NF)r&   r   r)   Z_shortNames_startedr   r+   r,   r!   r.   r)      s   
zTurtleSerializer.resetNr(   	IO[bytes]r}   Optional[str]rx   spaciousOptional[bool]kwargsr   c           	      K  s   |    || _|d ur|| _n| jjd ur| jj| _|d ur!|| _|   |  }|   d}|D ]}| |r9q1|r=d}| 	|rI|sI| 
d q1|   |
dd d | _d S )NTF
zlatin-1)r)   r(   r}   r$   r   rX   rS   startDocumentr:   	statementrv   endDocumentrw   )	r+   r(   r}   rx   r   r   Zsubjects_listZ	firstTimer7   r!   r!   r.   	serialize   s.   



zTurtleSerializer.serializerW   r   c                   s   t t| | t|D ]J\}}|tkr=|| jv rq| jd ur=t|tr=|	| jr=d|
| jdvr=d|
| jdvr=q| j||tkd t|trV|jrV| j|jtd q|d }t|trk| j|  d7  < d S d S )Nrz   r{   r|   )
gen_prefixr9   )r&   r   rV   	enumerateVERBr   r}   r>   r   r~   ru   	get_pnamer   datatype_GEN_QNAME_FOR_DTr   rE   )r+   rW   inoder[   r,   r!   r.   rV   &  s*   



z!TurtleSerializer.preprocessTripleTr1   r   r   r8   c                 C  s   t |tsd S d }z
| jj||d}W n ty0   | jj|}|d ur+||df}nY d S Y nw |\}}}|dddd}| jd|}|	drNd S | 
||}d	||f S )
N)generater{   (z\()z\)z\%.z%s:%s)r>   r   r$   Zcompute_qnamer5   r/   ru   r   subendswithr6   )r+   r1   r   partspfxr/   r   localr!   r!   r.   r   ?  s*   



zTurtleSerializer.get_pnamec                 C  s   t jdtdd | ||S )NzPTurtleSerializer.getQName is deprecated, use TurtleSerializer.get_pname instead.r   )
stacklevel)warningswarnDeprecationWarningr   )r+   r1   r   r!   r!   r.   getQNamec  s   zTurtleSerializer.getQNamec                 C  sz   d| _ t| j }| jr| |  d| j   |D ]\}}| |  d||f   q|r9| jr;| d d S d S d S )NTz@base <%s> .
z@prefix %s: <%s> .
r   )r   sortedr4   rh   r}   rv   rs   r   )r+   Zns_listr/   r1   r!   r!   r.   r   k  s   
zTurtleSerializer.startDocumentc                 C  s   | j r
| d d S d S )Nr   )r   rv   r   r!   r!   r.   r   v  s   zTurtleSerializer.endDocumentr7   r   c                 C  s   |  | | |p| |S r%   )rp   	s_squared	s_defaultr@   r!   r!   r.   r   z  s   
zTurtleSerializer.statementc                 C  s6   |  d|    | |t | | |  d dS )Nr    .T)rv   rs   pathSUBJECTpredicateListr@   r!   r!   r.   r   ~  s
   

zTurtleSerializer.s_defaultc                 C  sJ   | j | dkst|tsdS | d|   d  | | | d dS )Nr   Fr   z[]r   T)rE   r>   r   rv   rs   r   r@   r!   r!   r.   r     s   

zTurtleSerializer.s_squaredFr   positionr_   newlinec                 C  s2   |  |||s| |||std|f d S d S )NzCannot serialize node '%s')	p_squared	p_defaultr   r+   r   r   r   r!   r!   r.   r     s   zTurtleSerializer.pathc                 C  s,   |t kr|s| d | | || dS )N T)r   rv   r   r   r!   r!   r.   r     s   
zTurtleSerializer.p_defaultc                   sl   |t jkrdS |tu r| jv r j| S t|tr%|jd fdddS  |} ||tkp5|	 S )Nz()Tc                   s     | tS r%   )r   r   )dtr   r!   r.   <lambda>  s    z(TurtleSerializer.label.<locals>.<lambda>)Z	use_plainZqname_callback)
r   nilr   r   r>   r   Z_literal_n3r   r   Zn3)r+   r   r   r!   r   r.   r     s   




zTurtleSerializer.labelc                 C  s   t |tr|| jv s| j| dks|tkrdS |s| d | |rB| d |  jd7  _| | |  jd8  _| d d
S | 	| |  jd7  _| d |  jd8  _| j
|dd | d	 |  jd8  _d
S )Nr9   Fr   r   z )r   [r   z ]T)r>   r   rC   rE   r   rv   isValidListr=   doListrp   r   r   r!   r!   r.   r     s.   








zTurtleSerializer.p_squaredl_c                 C  sv   z| j |tjdu rW dS W n
 ty   Y dS w |r9|tjkr/tt| j |dkr/dS | j |tj	}|sdS )zW
        Checks if l is a valid RDF list, i.e. no nodes have other properties.
        NFr   T)
r$   valuer   firstr5   r   lenrL   Zpredicate_objectsrest)r+   r   r!   r!   r.   r     s   "zTurtleSerializer.isValidListc                 C  sN   |r%| j |tj}|d ur| |t | | | j |tj}|sd S d S r%   )r$   r   r   r   r   OBJECTrp   r   )r+   r   itemr!   r!   r.   r     s   
zTurtleSerializer.doListc                 C  s   |  |}| |}t|dkrd S | j|d |d | ||d   |dd  D ]}| d| d  | j|dd | ||  q*d S )Nr   r   r9   z ;
T)rf   ro   r   verb
objectListrv   rs   )r+   r7   r   re   rm   	predicater!   r!   r.   r     s   

zTurtleSerializer.predicateListc                 C  s   |  |t| d S r%   )r   r   )r+   r   r   r!   r!   r.   r     s   zTurtleSerializer.verbrl   Sequence[Node]c                 C  s   t |}|dkr
d S |dkrdpd}|  j|7  _| |d t |dd  D ]}| d| d  | j|tdd q'|  j|8  _d S )Nr   r9   z,
Tr   )r   r=   r   r   rv   rs   )r+   rl   countZdepthmodobjr!   r!   r.   r     s   zTurtleSerializer.objectListr   )r/   r0   r   r   r2   r0   r   rT   )r(   r   r}   r   rx   r   r   r   r   r   r2   r3   )rW   r   r2   r3   )T)r1   r   r   r8   r2   r   r   )F)r   r   r   r_   r   r8   r2   r3   )r   r   r   r_   r   r8   r2   r8   )r   r   r   r_   r2   r0   )r   r   r2   r8   )r   r   r2   r3   )r7   r   r   r8   r2   r3   )r   r   r   r8   r2   r3   )rl   r   r2   r3   )r   r   r   r   Z
short_namerr   r   r   r   r'   r6   r)   r   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r,   r.   r      s>    	
&$






!
	)/r   
__future__r   r   r   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   Zrdflib.exceptionsr   Zrdflib.graphr   Zrdflib.namespacer   r   Zrdflib.serializerr   Zrdflib.termr   r   r   r   r0   r   r   r   r   __all__r   r   r   r   r   r   r   r!   r!   r!   r.   <module>   s.    8  