
    i<                        d Z ddlm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 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r
dd
lmZmZm Z  ddgZ! G d de      Z"dZ#dZ$dZ%dZ&dZ' G d de"      Z(y)zr
Turtle RDF graph serializer for RDFLib.
See <http://www.w3.org/TeamSubmission/turtle/> for syntax specification.
    )annotations)defaultdict)
IOTYPE_CHECKINGAnyDefaultDictDictListMappingOptionalSequenceTuple)Error)Graph)RDFRDFS)
Serializer)BNodeLiteralNodeURIRef)_PredicateType_SubjectType_TripleTypeRecursiveSerializerTurtleSerializerc                       e Zd ZU ej                  gZej                  ej                  gZ	dZ
dZdZded<   d fdZddZddZdd	Zdd
ZddZddZddZ	 	 	 	 ddZ	 	 	 	 ddZddZdddZddZ xZS )r   
   z   zTuple[Any, ...]roundtrip_prefixesc                Z    t         t        |   |       d | _        | j	                          y N)superr   __init__streamresetselfstore	__class__s     PC:\Projects\mas-dev\.venv\Lib\site-packages\rdflib/plugins/serializers/turtle.pyr$   zRecursiveSerializer.__init__)   s#    !41%8+/

    c           	         || j                   v r3| j                   |   |k7  r!t        d|d|d| j                   |         || j                   |<   y )Nz$Trying to override namespace prefix z => z, but it's already bound to )
namespaces	Exception)r(   prefixuris      r+   addNamespacez RecursiveSerializer.addNamespace.   sP    T__$)@C)G3 79  #&r,   c                    | j                  |      sT|| j                  vsF|| j                  v r| j                  dkD  s)t	        |t
              r| j                  | j                  k\  ryy)z4Check to see if the subject should be serialized yet   FT)isDone	_subjects
_topLevelsdepth
isinstancer   maxDepthr(   subjects     r+   checkSubjectz RecursiveSerializer.checkSubject6   sQ     [[!t~~-DOO+$**q.7F+t}}1Lr,   c                    || j                   v S )z$Return true if subject is serialized_serializedr;   s     r+   r5   zRecursiveSerializer.isDoneA   s    $****r,   c           
     
   i }g }| j                   D ]q  }t        | j                  j                  t        j
                  |            }|j                          |j                  |       |D ]  }d| j                  |<   d||<    s | j                  D cg c]&  }||vr t        |t              | j                  |   |f( }}|j                          |j                  |D 	cg c]  \  }}	}|
 c}}	}       |S c c}w c c}}	}w )NT)
topClasseslistr)   subjectsr   typesortextendr7   r6   r9   r   _references)
r(   seenrD   classURImembersmemberr<   
recursableisbnoderefss
             r+   orderSubjectsz!RecursiveSerializer.orderSubjectsE   s    )+')H4::..sxxBCGLLNOOG$!*.'#V " (  >>
)d" ')9)9')BGL) 	 
 	L%=gtWLM
 Ms   +C9!C>c                f    | j                   j                  d      D ]  }| j                  |        y )NNNN)r)   triplespreprocessTriple)r(   triples     r+   
preprocesszRecursiveSerializer.preprocess]   s*    jj(();<F!!&) =r,   c                \    |\  }}}| j                   |xx   dz  cc<   d| j                  |<   y )Nr4   T)rH   r6   )r(   spospos        r+   rT   z$RecursiveSerializer.preprocessTriplea   s1    1aq  qr,   c                   d| _         i | _        i | _        t        t              | _        i | _        i | _        i | _        | j                  rt        | j                  d      rD| j                  j                         D ]&  \  }}|| j                  v s| j                  ||       ( y | j                  j                         D ]  \  }}| j                  ||        y y )Nr   __iter__)r8   listsr.   r   intrH   r@   r6   r7   r    hasattrr)   r2   )r(   r0   nss      r+   r&   zRecursiveSerializer.resetf   s    
')
-/3>s3C573546""t..
;"&**"7"7"9JFB!8!88))&"5 #: #'**"7"7"9JFB%%fb1 #: #r,   c                    i }| j                   j                  |ddf      D ].  \  }}}|j                  |g       }|j                  |       |||<   0 |S )zb
        Build a hash key by predicate to a list of objects for the given
        subject
        N)r)   rS   getappend)r(   r<   
propertiesrY   rZ   r[   oLists          r+   buildPredicateHashz&RecursiveSerializer.buildPredicateHashy   s\     8:
zz))7D$*?@GAq!NN1b)ELLO!JqM A r,   c                V   |j                         D ]  \  }}|j                           g }i }| j                  D ]"  }||v s||vs|j                  |       d||<   $ t	        |j                               }|j                          |D ]  }||vs|j                  |       d||<    |S )zzTake a hash from predicate uris to lists of values.
        Sort the lists of values.  Return a sorted list of properties.T)itemsrF   predicateOrderrd   rC   keys)r(   re   propobjectspropListrI   propss          r+   sortPropertiesz"RecursiveSerializer.sortProperties   s     (--/MD'LLN 0 *,+-''D
"T)9%!T
 ( Z__&'

D4%!T
  r,   c                "    d| j                   |<   y)zMark a subject as done.TNr?   r;   s     r+   subjectDonezRecursiveSerializer.subjectDone   s    $(!r,   c                :    | j                   |z   | j                  z  S )z-Returns indent string multiplied by the depth)r8   indentString)r(   modifiers     r+   indentzRecursiveSerializer.indent   s    

X%):):::r,   c                n    | j                   j                  |j                  | j                  d             y)zWrite text in given encoding.replaceN)r%   writeencodeencoding)r(   texts     r+   ry   zRecursiveSerializer.write   s%     	$++dmmY?@r,   r)   r   )r0   strr1   r   returnNoner<   r   r   bool)r   zList[_SubjectType]r   r   )rX   r   r   r   )r<   r   r   #Mapping[_PredicateType, List[Node]])re   r   r   zList[_PredicateType])r<   r   r   r   )r   )ru   r_   r   r~   )r|   r~   r   r   )__name__
__module____qualname__r   ClassrB   r   rE   labelrj   r:   rt   r    __annotations__r$   r2   r=   r5   rP   rV   rT   r&   rg   rp   rr   rv   ry   __classcell__r*   s   @r+   r   r   "   s    **Jhh

+NHL*,,
&	+0*!
2&#	,=	0);Ar,   r4      Fc                       e Zd ZdZdZd fdZd fdZd fdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZd fdZ	dddZ
dd	Zdd
ZddZddZddZd d!dZd d"dZd#dZd d"dZd$dZd%dZd d&dZd d'dZd(dZ xZS ))r   turtlez    c                    i | _         t        t        |   |       t        j
                  di| _        | j                          d | _        t        | _
        y )Na)_ns_rewriter#   r   r$   r   rE   keywordsr&   r%   _SPACIOUS_OUTPUT	_spaciousr'   s     r+   r$   zTurtleSerializer.__init__   sA    +-.u5*-((C

)r,   c                H   |dkD  r|d   dk(  s| j                   j                  ||      |k7  r`|| j                  vr6d|z   }|| j                   v rd|z   }|| j                   v r|| j                  |<   | j                  j                  ||      }t        t        |   ||       |S )N r   _rZ   )r.   rc   r   r#   r   r2   )r(   r0   	namespacerZ   r*   s       r+   r2   zTurtleSerializer.addNamespace   s     RKF1I,1D1DI2
2 T---&L4??*aA 4??*+,  (%%))&&9F269Er,   c                T    t         t        |           i | _        d| _        i | _        y )NF)r#   r   r&   _shortNames_startedr   )r(   r*   s    r+   r&   zTurtleSerializer.reset   s(    +--/r,   c                   | j                          || _        ||| _        n1| j                  j                  | j                  j                  | _        ||| _        | j                          | j                         }| j                          d}|D ]>  }| j                  |      r|rd}| j                  |      s+|r.| j                  d       @ | j                          |j                  dj                  d             d | _        y )NTF
zlatin-1)r&   r%   baser)   r   rV   rP   startDocumentr5   	statementry   endDocumentrz   )	r(   r%   r   r{   spaciouskwargssubjects_list	firstTimer<   s	            r+   	serializezTurtleSerializer.serialize   s     	

DIZZ__(

DI%DN**,	$G{{7#!	~~g&y

4  % 	T[[+,	r,   c                   t         t        |   |       t        |      D ]v  \  }}|t        k(  r|| j
                  v r| j                  ||t        k(         t        |t              sI|j                  sV| j                  |j                  t               x |d   }t        |t              r| j                  |xx   dz  cc<   y y )N)
gen_prefixr4   )r#   r   rT   	enumerateVERBr   getQNamer9   r   datatype_GEN_QNAME_FOR_DTr   rH   )r(   rU   inoderZ   r*   s        r+   rT   z!TurtleSerializer.preprocessTriple  s    6v> (GAtDyTT]]2MM$AIM7$(T]]dmm8IJ ) 1IaQ1$  r,   c                   t        |t              sy d }	 | j                  j                  ||      }|\  }}}|j                  dd      j                  dd      }|j                  d      ry | j                  ||      }|d|S # t        $ r2 | j                  j                  j                  |      }|||df}nY y Y w xY w)	N)generater   (z\()z\).:)	r9   r   r)   compute_qnamer/   r0   rx   endswithr2   )r(   r1   r   partspfxr0   r   locals           r+   r   zTurtleSerializer.getQName  s    #v&
	JJ,,S:,FE $) 	5dE*224? >>#""695 %(()  	**""))#.Cc2  	s   B 6C ?C c           	     v   d| _         t        | j                  j                               }| j                  r/| j                  | j                         d| j                  z  z          |D ].  \  }}| j                  | j                         d|d|dz          0 |r| j                  r| j                  d       y y y )NTz@base <%s> .
z@prefix z: <z> .
r   )r   sortedr.   ri   r   ry   rv   r   )r(   ns_listr0   r1   s       r+   r   zTurtleSerializer.startDocument4  s    ..0199JJt{{}'7$))'CCD"KFCJJt{{}'MMN #t~~JJt &7r,   c                @    | j                   r| j                  d       y y )Nr   )r   ry   )r(   s    r+   r   zTurtleSerializer.endDocument?  s    >>JJt r,   c                l    | j                  |       | j                  |      xs | j                  |      S r"   )rr   	s_squared	s_defaultr;   s     r+   r   zTurtleSerializer.statementC  s-    !~~g&A$..*AAr,   c                    | j                  d| j                         z          | j                  |t               | j	                  |       | j                  d       y)Nr    .T)ry   rv   pathSUBJECTpredicateListr;   s     r+   r   zTurtleSerializer.s_defaultG  sD    

4$++-'(		'7#7#

4r,   c                    | j                   |   dkD  st        |t              sy| j                  d| j	                         z   dz          | j                  |       | j                  d       y)Nr   Fr   z[]r   T)rH   r9   r   ry   rv   r   r;   s     r+   r   zTurtleSerializer.s_squaredN  sZ    W%)*We2L

4$++-'$./7#

4r,   c                p    | j                  |||      s#| j                  |||      st        d|d      y y )NzCannot serialize node '')	p_squared	p_defaultr   r(   r   positionnewlines       r+   r   zTurtleSerializer.pathV  s:    NN473~~dHg6>?? 7 4r,   c                ~    |t         k7  r|s| j                  d       | j                  | j                  ||             y)N T)r   ry   r   r   s       r+   r   zTurtleSerializer.p_default]  s1    wwJJsO

4::dH-.r,   c                :    |t         j                  k(  ry|t        u r| j                  v r j                  |   S t	        |t
              r|j                  d fd      S  j                  |      } j                  ||t        k(        xs |j                         S )Nz()Tc                0    j                  | t              S r"   )r   r   )dtr(   s    r+   <lambda>z(TurtleSerializer.label.<locals>.<lambda>k  s    $--<M*Nr,   )	use_plainqname_callback)
r   nilr   r   r9   r   _literal_n3
relativizer   n3)r(   r   r   s   `  r+   r   zTurtleSerializer.labelc  s    377?t 5==&&dG$##N $  
 ??4(D==x4'78EDGGIEr,   c                   t        |t              r)|| j                  v s| j                  |   dkD  s	|t        k(  ry|s| j                  d       | j                  |      r^| j                  d       | xj                  dz  c_        | j                  |       | xj                  dz  c_        | j                  d       y
| j                  |       | xj                  dz  c_        | j                  d       | xj                  dz  c_        | j                  |d       | j                  d	       | xj                  dz  c_        y
)Nr4   Fr   r   z )r   [r   z ]T)r9   r   r@   rH   r   ry   isValidListr8   doListrr   r   r   s       r+   r   zTurtleSerializer.p_squaredr  s    4't'''%)7"JJsOD!JJsOJJ!OJKKJJ!OJJJt  T"JJ!OJJJsOJJ!OJtU3JJtJJ!OJr,   c                b   	 | j                   j                  |t        j                        y	 |rq|t        j
                  k7  r1t        t        | j                   j                  |                  dk7  ry| j                   j                  |t        j                        }|rqy# t        $ r Y yw xY w)zW
        Checks if l is a valid RDF list, i.e. no nodes have other properties.
        Fr   T)
r)   valuer   firstr/   r   lenrC   predicate_objectsrest)r(   l_s     r+   r   zTurtleSerializer.isValidList  s    	zzCII.6 7 SWW}T$***F*Fr*J%K!LPQ!Q!!"chh/B	 
   		s   *B" "	B.-B.c                
   |r| j                   j                  |t        j                        }|'| j	                  |t
               | j                  |       | j                   j                  |t        j                        }|ry y r"   )r)   r   r   r   r   OBJECTrr   r   )r(   r   items      r+   r   zTurtleSerializer.doList  s`    ::##B		2D		$'  $!!"chh/B r,   c                h   | j                  |      }| j                  |      }t        |      dk(  ry | j                  |d   |       | j	                  ||d             |dd  D ]L  }| j                  d| j                  d      z          | j                  |d       | j	                  ||          N y )Nr   r   r4   z ;
T)rg   rp   r   verb
objectListry   rv   )r(   r<   r   re   rn   	predicates         r+   r   zTurtleSerializer.predicateList  s    ,,W5
&&z2x=A		(1+w	/
8A;/0!!"IJJvA./IIiI.OOJy12 &r,   c                2    | j                  |t        |       y r"   )r   r   )r(   r   r   s      r+   r   zTurtleSerializer.verb  s    		$g&r,   c                P   t        |      }|dk(  ry |dk(  xr dxs d}| xj                  |z  c_        | j                  |d   t               |dd  D ]=  }| j	                  d| j                  d      z          | j                  |t        d       ? | xj                  |z  c_        y )Nr   r4   z,
Tr   )r   r8   r   r   ry   rv   )r(   rm   countdepthmodobjs        r+   r   zTurtleSerializer.objectList  s    GA:QJ%A*

h
		'!*f%12;CJJut{{1~-.IIc64I0  	

h
r,   r}   )r0   r~   r   r   r   r~   r   rR   )r%   z	IO[bytes]r   Optional[str]r{   r   r   zOptional[bool]r   r   r   r   )rU   r   r   r   )T)r1   r   r   r   r   r   r   )F)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   r   )r<   r   r   r   r   r   )r   r   r   r   r   r   )rm   zSequence[Node]r   r   )r   r   r   
short_namert   r$   r2   r&   r   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r+   r   r      s    JL*0 #"&#'$$ $  	$
 !$ $ 
$L%)<	B@FB 0
3'
r,   N))__doc__
__future__r   collectionsr   typingr   r   r   r   r	   r
   r   r   r   r   rdflib.exceptionsr   rdflib.graphr   rdflib.namespacer   r   rdflib.serializerr   rdflib.termr   r   r   r   r   r   r   __all__r   r   r   r   r   r   r   r   r,   r+   <module>r      s   
 # #   $  & ( 4 4FF "4
5HA* HAV 	
  P* Pr,   